“欲买桂花同载酒,终不似少年游!”不惧岁月不惧风,心之所向素履以往。愿你出走半生,归来仍是少年。青春没结束,我们永远风华正茂。

Day04

  • 选择题

选择题

1.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )
A: n=0;while(ch=getchar()!=‘\n’)n++; B: n=0;while(getchar()!=‘\n’)n++;
C: for(n=0;getchar()!=‘\n’;n++); D: n=0;for(ch=getchar();ch!=‘\n’;n++);

答案:D
答题思路:对于for循环,第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就不会再取字符了。所以这里我们需要了解for循环的执行流程。

2.运行以下程序后,如果从键盘上输入 65 14 ,则输出结果为( )

#define _CRT_SECURE_NO_WARNINGS 1#include int main(){int m, n;printf("Enter m,n:");scanf("%d%d", &m, &n);while (m != n){while (m > n)m = m - n;while (n > m)n = n - m;}printf("m=%d\n", m);return 0;}

A: 3 B: 2 C: 1D: 0

答案:C
答题思路:本题的解题流程如下:
✅ 运行结果如下:

3.若运行以下程序时,从键盘输入 ADescriptor ,则下面程序的运行结果是( )

#include int main(){char c;int v0 = 0, v1 = 0, v2 = 0;do{switch (c = getchar()){case'a':case'A':case'e':case'E':case'i':case'I':case'o':case'O':case'u':case'U':v1 += 1;default:v0 += 1; v2 += 1;}} while (c != '\n');printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);return 0;}

A: v0=7,v1=4,v2=7 B: v0=8,v1=4,V2=8 C: v0=11,v1=4,v2=11 D: v0=12,v1=4,v2=12

答案:D
答题思路:代码 switch 语句中没有 break ,则每次找到入口进入后,顺序执行到代码块结束为止。例如当 c 为 'A' 时,从 case 'A' 进入,先后执行v1+=1;v0+=1;v2+=1; ,而当 c 为 'p' 时,从 default 进入,先后执行 v0+=1;v2+=1; ,容易看出最终 v0 和 v2 是相等的
本题的解题流程如下:

✅运行结果如下:

4.如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )

int gcd(char x,char y){int min = x < y " />: y;for (min = 0; min > 0; min--)if (x % min = 0 && y % min = 0)return min;}

A: 参数类型不对 B: 循环变量min初值不对 C: 判断等于的符号不对 D: 返回类型不对

答案:ABC
答题思路:
1.函数实参是int,形参用char不对,会发生截断丢失数据;
2.minfor循环开始时更新为0,不再是两个形参中的较小值;
3.判断是否整除的时候误将==写成=赋值运算符
4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。

5.执行下面的程序段,语句3的执行次数为( )

for(i = 0; i <= n-1; i++) // (1)for(j = n; j > i; j--) // (2)state; // (3)

A: n(n+2)/2 B: (n-1)(n+2)/2 C: n(n+1)/2 D: (n-1)(n+2)

答案:C
答题思路:外循环有n次,当i=0,内循环为n次,当i=1,内循环为n-1次,当i=2时,内循环为n-2次,以此类推,总次数为n+(n-1)+(n-2)+......+2+1,就是个等差数列,等于n(n+1)/2.

好啦,第四天的练习到这里就结束啦!今天少了两题编程,明天补上!后期会继续更新C语言的小练笔,欢迎大家持续关注、点赞和评论!❤️❤️❤️