• 牛客网-《刷C语言百题》第三期


    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
    📃个人主页:@rivencode的个人主页
    🔥系列专栏:《C语言入门必刷百题》
    💬保持学习、保持热爱、认真分享、一起进步!!

    一.选择题

    试题1:
    da在这里插入图片描述

    答案:C
    解析:该题主要考察了操作符的优先级,首先+号比+=、-=操作符优先级要高,因为像=、/= 、+=、-=优先级比赋值=优先级都要低,所以表达式等价于a += a -= (a + a);先算加法,第二个考察的点就是操作符的结合性,像=、/= 、+=、-= 这些操作符的结合性都是从右往左计算,也就是等价于 a += (a -= (a + a));**
    在这里插入图片描述

    在这里插入图片描述

    知识点详情参考:C语言操作符详解

    试题2:
    在这里插入图片描述

    答案:D

    解析:
    ABC选项:数组的下标下限为0
    D选项:定义了两个字符变量c1、c2,一个字符指针变量c3,一个字符数组c4。

    试题3:
    在这里插入图片描述

    答案:D

    解析:
    ~:按位取反
    ^:异或:相同为0,相异为1

    在这里插入图片描述

    求反运算~
    求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

    在这里插入图片描述
    注意:符号位照样取反

    按位异或运算 ^
    按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进制位相异或,当两对应的二进制位相异时结果为1,相同结果为0,

    在这里插入图片描述

    按为异或的特点:
    最好能记住解题块的很
    性质:
    1.交换律 a^ b = b^a
    2.结合律 a^ b ^ c = a^ (b^c)
    3.任何数后零异或都是它本身
    4. 自身与自身异或为0

    其实上面的特点很好证明只要记住:相同为0,相异为1

    知识点详情参考:C语言操作符详解

    试题4:
    在这里插入图片描述

    答案:C
    解析:
    1."A’与’A’是不相同的,一个是字符串一个是字符,其实"A"字符串后面还隐藏了一个\0字符代表字符串的结束标志。
    在这里插入图片描述

    2.他们都是常量,常量可以是任何的基本数据类型,比如单独一个10或者单独一个3.14都是常量。

    试题5:
    在这里插入图片描述

    答案:B

    解析:
    a,b都是整形,则a/b结果必定是整数,得出的结果是小数怎么办?,只能是取整,而取整的方式有三种:
    1.向负无穷取整
    2.向整无穷取整
    3.向零取整
    C语言中默认是向零取整,这里只讲向零取整,其他看下面的知识点详情。
    什么是向零取整

    在这里插入图片描述
    其实C语言中的默认取整方式是向零取整
    c=a/b+0.4
    首先a/b直接就取整为1了,1+0.4取整为1,则c=1
    在这里插入图片描述

    知识点详情参考:深度理解取余取模运算

    试题6:

    在这里插入图片描述
    答案:D

    解析:
    题目中创建了一个a数组,p指针变量初始化等于a,a为数组名,数组名一般情况下都表示为数组首元素的地址,
    有两种特殊情况:
    1.sizeof(数组名):表示求整个数组的大小(单位为字节)
    2.&数组名:表示整个数组地址,&数组名+1跳过整个数组
    则在这里p整个指针变量就保存了数组首元素2的地址。

    a[i]=*p++;//++操作符的优先级比 *解引用操作高,但是这里的++是后置++则先a[i]=*p然后再p++,则其实数组的内容并没有发生变化。

    程序等价于下图:
    在这里插入图片描述

    试题7:
    在这里插入图片描述

    答案:C

    解析:
    这个题得好好讲讲,总有人分不清下面两句代码的区别。
    在这里插入图片描述

    看下图就明白了:

    在这里插入图片描述
    这里来解决几个疑问:
    1.char* s1 = “Hello world” 是代表什么意思?
    我们都知道s1是一个char 类型的指针变量,要存储一个字符的地址,而 “Hello world” 就是代表首元素’H’字符的地址,相当于s1指向了’H’这个字符,则就可以通过s1这个指针变量来找到这个字符串。
    2."Hello world"是一个常量的字符串只不过我们用栈区定义的一个指针变量s1来指向这个字符串的首元素’H’的地址,是常量该字符串不能被修改。

    3.s1[i]等价于(s1+i)
    在这里插入图片描述
    知识点详情参考:字符串与内存操作函数详解与模拟实现

    试题8:
    在这里插入图片描述

    答案:B
    解析:
    首先是三目运算符:
    在这里插入图片描述
    是不是会感觉有点奇怪,a=1,b=-3,为啥a+b会是正数呢,原因就在于存在算术转化:请看下图
    在这里插入图片描述
    (无符号)unsigned int 的排名要比 (有符号)signed int要高,则a+b的结果的类型是无符号数,我们知道无符号数一定为正数,其实a+b的结果是一个很大的正数。
    在这里插入图片描述
    如果你觉得上图是正常的,那你看看下图:
    在这里插入图片描述
    怎么用%d打印又是负数呢?
    其实啊在计算机中我们存储的所有东西包括字符,汉字,数字,统统会转化为对应的二进制序列,不同类型的数据像整形,字符型,浮点型…,在计算机中都是以二进制的形式进行存储,则同样一段二进制序列用不同的类型去解释就会得到不同结果,则在本题中,a+b的计算结果存储在CPU的某个寄存器中(结果也是二进制,不过它的类型是无符号整形)),但是我们硬要用%d进行打印,也就是说以有符号的整形进行打印则这段二进制(在计算机中存储的整数都是以补码的形式),就会被解释成有符号的整数。

    知识点详情参考:C语言深度解剖之数据到底在内存中如何存储

    试题9:
    在这里插入图片描述

    答案:A
    解析:
    在这里插入图片描述
    总结:continue:while,do while 跳转到条件判定,for转到到i++然后再判定,在本题中,3的倍数会被跳过不打印。

    试题10:
    在这里插入图片描述

    答案:C
    解析:
    这题主要考察了结构体内存对齐的知识:

    先看内存对齐规则:
    这里的大小都是以字节为单位

    1. 第一个成员在相对于结构体变量地址偏移量为0的地址处。
    2. 其他成员变量要对齐到某个数字(成员变量的对齐数)的整数倍的地址处。成员变量的对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
    3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数,)是成员变量的最大对齐数的整数倍。
    4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
      在这里插入图片描述

    在这里插入图片描述
    此外:像char a[10] ,不过只是10个char类型的变量堆叠而成,本质对齐数还是1,short c[3]同理。
    知识点详情参考:结构体详解-内存对齐

    二.编程题

    点击题目即可跳转刷题

    1.BC11成绩输入输出

    1.题目描述
    在这里插入图片描述
    2.解题思路
    题目很简单,主要是要按照题目给的格式进行打印

    3.代码实现

    #include 
    
    int main() 
    {
        int a;
        int b;
        int c;
        //
        scanf("%d %d %d",&a,&b,&c);
        printf("score1=%d,score2=%d,score3=%d",a,b,c);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.相关知识点
    在这里插入图片描述
    在这里插入图片描述

    2.BC12学生基本信息输入输出

    1.题目描述
    在这里插入图片描述
    2.解题思路
    1.按照格式进行输入输出,格式的话一直复制题目给的就好了(以免出错)。
    2.保留两位小数

    C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。
    float采用%f占位符。
    double采用%lf占位符。测试结果证明,double不可以用%f输入,但可以用%f输出,但是不建议采用%f,因为不同的编译器可能会有差别。

    printf("%.nlf",value); /* 表示保留n位小数 */
    printf("%m.nlf",value); /* 表示控制宽度为m,保留n为小数,右对齐 */
    printf("%-m.nlf",value); /* 表示控制宽度为m,保留n为小数,m前面的-表示左对齐 */
    
    • 1
    • 2
    • 3

    3.代码实现

    int main()
     {
        int id=0;
        float C=0.0;
        float math=0.0;
        float english=0.0;
        scanf("%d;%f,%f,%f",&id,&C,&math,&english);
        printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",id,C,math,english);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.相关知识点
    C语言中%5d %05d %-5d %.5d 的区别:
    在这里插入图片描述
    总结:
    如果d前面的是正数则右对齐,其余往左补零或空格
    如果d前面的是负数则右对齐,其余往右补零或空格
    超过的这个数,全取就好了

    浮点数的格式也差不多,只不过中间用.分隔。

    printf("%.nlf",value); /* 表示保留n位小数 */
    printf("%m.nlf",value); /* 表示控制宽度为m,保留n为小数,右对齐 */
    printf("%-m.nlf",value); /* 表示控制宽度为m,保留n为小数,m前面的-表示左对齐 
    
    • 1
    • 2
    • 3

    其实这些格式还是很有用的,尤其是输出到屏幕上的格式。
    输出到屏幕上其实都是字符:这个字符包括数字,英文,汉字等其他国家的语言。
    就拿汉字来说,我们用字符串可以存储汉字,但如何存储呢?
    我们都知道计算机只能存储二进制序列,像ASCLL码一样,'A’用65表示,其实汉字也是一样只不过汉字比英文26个字母多的多,可能一个汉字需要几个字节来表示,当然也有不同的汉字编码。

    详情参考:液晶显示中英文

    3.BC13出生日期输入输出

    1.题目描述

    在这里插入图片描述

    2.解题思路
    看上题知识点讲解这题当练手了
    3.代码实现

    int main()
    {
        int a,b,c;
         scanf("%4d %2d %2d",&a,&b,&c);
         printf("year=%d\n",a);
         printf("month=%02d\n",b);
         printf("date=%02d\n",c);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.BC14按照格式输入并交换输出

    1.题目描述
    在这里插入图片描述

    2.解题思路
    与上题一样主要考察的就是按照已给格式进行输入输出,当然简单的交换两个元素(通过一个临时变量来实现交换)。
    3.代码实现

    int main() {
        int a;
        int b;
        int tmp;
        scanf("a=%d,b=%d",&a,&b);
        tmp=a;
        a=b;
        b=tmp;
        printf("a=%d,b=%d",a,b);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    5.BC15大小写转换

    1.题目描述
    在这里插入图片描述
    2.解题思路
    题目中多组输入,指的是会可能输入1组也可能输入3组,所以我们需要搞个循环,输入一个字符可以用ch=getchar()函数,也可以使用scanf(“%c”,&ch )的形式,输出一个字符可以用putchar(ch),也可以使用printf(“%c”,ch )的形式,对于大小写字母转化,其实对应的大写字母与小写字符它们的ASCll值相差32。
    大写转小写:大写字母+32
    小写转大写:大写字母-32

    这些字符都是以ASCll值(十进制)对应的二进制序列存储在内存中。
    在这里插入图片描述

    3.代码实现

    int main() 
    {
    	char ch;
        //EOF本质为-1,作为文本的结束标志,字符的取值范围为0~255不可能出现负数
    	while ((ch = getchar()) != EOF)
    	{
            //读取输入缓存区\n字符,防止被ch读取
    		getchar();
            //大写转小写
    		if (ch>= 'A' && ch <= 'Z')
    			printf("%c\n", ch + 32);
            //小写转大写
    		else if (ch >= 'a' && ch <= 'z')
    			printf("%c\n", ch - 32);
    		else
    			printf("输入错误\n");
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    请添加图片描述
    当我敲一个A字符然后需要敲一个回车,其实A字符与\n字符一起被放在输入缓冲区,ch=getchar()只会取出一个字符A,\n回车还在输入缓冲区中,则需要用getchar()将\n读取走,防止下次ch=getchar(),ch读取到\n。

    三.如何高效刷题

    如何刷题:
    1.如果你是基础不太好,可以先按照题解,跟着手打代码,重点理解题目思路,将题目所用到的知识点,解题技巧提炼出来(锻炼代码能力,解题思路)。在这里插入图片描述
    2.当有一定的代码能力之后,但是看题还是没有思路,可以先看解题思路理解它,然后尝试用代码去实现它。(主要锻炼代码能力,进一步锻炼解题思维)

    3.拿到一个题目自己先尝试解题,最好是能将解题思路用画图的方式体现出来,这样更能加深印象,然后用代码实现,实现之后再看看题解,或者别人的解题方法,进行对比,找到最优解题思路
    在这里插入图片描述
    最后:在解题过程中,碰到问题如下图(题目提交后通不过,报错(代码可能有bug),尽量独立思考,可以先尝试用它的测试用例,一步一步走读代码,看看问题出现在那个地方,如果实在是没有看出来,可以将该函数拷贝到VS中进行调试代码,一定能找出来。(锻炼自己的代码调试能力)

  • 相关阅读:
    公务员备考(三十六) 行测 数资强化
    红队专题-新型webshell的研究
    【C#】跨平台UI库Avalonia的学习笔记
    pdf格式的简历中的照片太小,如何修改图片的大小
    永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现(二)
    09:STM32-------USART串口通信+串口数据包
    九、蜂鸣器
    Asp.net Core系列学习(1)
    重磅!Grafana 9 正式发布,更强大、更易用了!
    C语言 switch分支结构
  • 原文地址:https://blog.csdn.net/k666499436/article/details/127665550