前言:将在做题过程中的一些思路进行分享,也对一些错题进行回顾。如果有哪些地方我写错了,欢迎批评指正,愿与诸位携手共同拿下C语言。
目录
1.选择题
1.1 下面代码输出的结果是()
A. 程序有问题,不能编译
B.输出1
C.输出10
D.输出0
#include <stdio.h>
int num = 10;
int main()
{
int num = 1;
printf("num= %d\n", num);
return 0;
}
解析:1.在同一个作用域中,不允许存在多个相同名称的变量
2.在不同的作用域中,允许存在1多个相同名称的变量。在使用时,局部变量优先于全局变量。
在这个题目中。num=10 是全局变量,num=1 是局部变量。所以打印出来是 num=1。选择 B
1.2下面代码执行的结果是()
A.1 2 3 4 5 6 7 8 9 10
B.5 5 5 5 5 5 5 5 5 5
C.死循环的打印5
D.0 1 2 3 4 5 6 7 8 9
#include <stdio.h>
int main()
{
int i = 0;
for (i = 0; i<10; i++)
{
if (i = 5)
printf("%d ", i);
}
return 0;
}
解析:如果if的表达式里面是 i==5 ,就是说如果当 i 等于 5时,执行打印 i 的动作。但是题目中if 的表达式是 i=5 ,到了这里总是给 i 赋值一个 5,也就是说 if 判断条件恒成立。所以选择 C
1.3 在这段代码中,func(1) = ( )
A.30
B.20
C.16
D.0
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
解析:在 switch 语句中,如果 case 没有 break ,就会继续执行,所以这段代码,执行到最后的 default ,b=0。选择D。
1.4下面代码的执行结果是什么( )
A.secondthird
B.hello
C.firstsecond
D.hellothird
#include <stdio.h>
int main() {
int x = 3;
int y = 3;
switch (x % 2) {
case 1:
switch (y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default: printf("hello");
}
case 2:
printf("third");
}
return 0;
}
解析:x%2 的结果是1,所以进入 case 1:里面的 switch 语句中没有表达式中相应的 case ,于是执行 default ;内层的 switch 语句执行结束后,外层的 switch 语句中的 case 1 没有 break ,于是继续执行 case 2.。最后打印出 “hellothird”,选择D。
1.5判断下面代码的结果是()
A.a = 8 b = 23 c = 8
B.a = 9 b= 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a=%d b=%d c=%d\n", a, b, c);
return 0;
}
解析:
c = ++a;
这行代码使用了前置++,先让 a 自增1,得到 a=6,然后将 a 的值赋予 c ,得到c=6
b = ++c , c++ , ++a , a++;
//看作下面的格式
b=++c;
c++;
++a;
a++;
这行代码可以注释下面的这四行代码。先将 c 进行自增1,得到 c=7,然后将 c 的值赋给 b,得到b=7。c++ 、 ++a 、a++ 都是对本身进行自增1,计算过程:c=8、a=7、a=8。所以最后得到 c=8 ,a=8.
b += a++ + c;
//将简写转为正常的格式 b += ===》 b = b +
b = b + ( a++ + c );
//看作
b = b + (a + c);
a++;
这行代码可以看作第二个注释下面的这两行代码。先计算整个表达式的值,再对 a 进行自增1。计算过程:在b = b + (a + c)带入值,b = 7 +( 8 + 8 ),之后在对 a 进行自增1,得到 b=23 ,a=9
所以最后打印得到 a=9,b=23,c=8。选择 B
2.实操题
2.1 计算带余除法
题目:给定两个整数a和b,多组输入,计算a除以b的整数商和余数。
分析:根据题目,我们可以想到,输入数字需要用到 scanf 函数,求商需要用到 / 计算符,求余数需要用 % 计算符。还需要使用 if 函数来进行判断除数 b 是否为 0,使用 while 循坏来实现多组输入,对求商和余数的过程进行循环。
使用while循环,表达式中,当 scanf 能够读到输入的值,读到2个值就为2。在C语言中,0为假,非零为真,所以 scanf 函数能够一直成功读到数值的话,循环的条件就一直成立。
2.2 编程判断
题目:据说智商140以上者称为天才,请写一个编程判断。输入一个整数表示一个人的智商,如果大于等于140,则表明他是一个天才,输出“天才”。要求多组输入,每行输入包括一个整数表示的智商。
分析:在题目中,140是一个分界线,当输入的数字大于等于140时,输出天才,反之则不是。我们可以使用 if 语句来对输入的数字进行判断。需要实现多组输入,那就需要对判断过程进行循环。
使用while循环,表达式中,当 scanf 能够读到输入的值,读到1个值就为1。在C语言中,0为假,非零为真,所以 scanf 函数能够一直成功读到数值的话,循环的条件就一直成立。
2.3 判断2个数的大小
题目:判断从键盘输入的两个整数的大小关系,要求多组输入,请编程实现
分析:需要输入2个整数,就需要使用到 scnaf 函数;实现多组输入,就需要实现比较两个数的循环,一般使用 while 循环。使用 if 进行分支循环时,需要考虑到 a>b ,a=b, a<b这些情况。
使用while循环,表达式中,当 scanf 能够读到输入的值,读到2个值就为2。在C语言中,0为假,非零为真,所以 scanf 函数能够一直成功读到数值的话,循环的条件就一直成立。
2.4 写代码将三个整数数按从大到小输出
题目:写代码将三个整数数按从大到小输出。
分析:三个数的大小判断,也可以使用 if ……else if……else 这样的语句进行判断,但是需要包含多种情况,容易遗漏或者写错。
可以使用置换的方式,给变量 a , b , c 输入三个整数,然后两两进行比较判断。以 a<b 为例,使用变量 tmp 对数值小的 a 的值 进行存储,将大的数值 b的值赋值给数值小的那个变量 a ,再将用于存储的变量 tmp 中的值,赋值给数值大的那个变量 b 。如此一来,通过两两比较判断,就可以将数值大的 b的值,赋值给了位置靠前的变量 a ;将数值小的a 的值,赋值给了位置靠后的 b 。最后输出 除变量 a , b , c 时,就是从大到小的顺序了。
2.5 被5整除问题
题目:请写一串代码,多组输入判断整数是否能5整除
分析:判断能否被5整除,就需要用5除后使用 % 进行取余。使用 if 分支来打印能否被5整除。
2.6 线段图案
题目:多组输入一个整数,打印相应数量的“ * ”组成的线段图案。。
分析:使用 scanf 函数输入整数。使用 while 循环对输入数字和打印 * 进行循环。 使用 a 来输入想要输入 * 的数量,再使用 b 来进行for循环打印相应数量的 * 。
使用两个while循环也能达到相应的效果
使用 do while 进行打印也可以,但是由于 do while 先进行动作再进行判断,所以要使用 if
分支对当输入的数字为 0 时进行判断,否则输入0时,也会打印一个 * 。
2.7 打印1-100之间3的倍数
题目:写一个代码打印1-100之间所有3的倍数的数字
分析:可以通过使用循环来过一遍1-100的数字,在循环中使用 if 来进行判断。
这里给出两种写法供读者参考。
1.while循环 if分支
2.for 循环 if 分支