第一题
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
getchar这个函数,是用来在读我们键盘输入的字符的。
所以题中说不包含回车符,循环的条件就是当我们getchar取到的字符不是回车;
那么ABC都可以;
D选项是把getchar取到的字符给ch,for循环初始化的语句只会执行一次,所以无法统计出一行输入的字符个数的,是一个死循环;
第二题
2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
int main() { int m, n; printf("Enter m,n;"); scanf("%d%d", &m,&n); while (m!=n) //1 { while(m>n) { m=m-n; //2 } while(n>m) { n=n-m; //3 } } printf("m=%d\n",m); return 0; }
A: 3
B: 2
C: 1
D: 0
答案及解析 C
这个就是挨个算,细心就行。
第三题
3、若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )
#include <stdio.h> int main() { char c; int v0 = 0; int v1 = 0, int 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
这里考察的就是我们对getchar函数,switch语句和do-while语句的认识,do-while语句的循环条件在后面,所以是比正常结束循环多执行一次,也就是说当getchar取到回车字符的时候,do-while会执行,最后判断。
switch语句中的case和default语句,如果我们在每个case语句和default后面没有break语句,就会继续执行,直到switch执行结束或者遇到break语句才停下来。
所以答案是D
第四题
4、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
int gcd(char x,char y) { int min = x < y ? x : y; for (min = 0; min > 0; min--) { if (x % min = 0 && y % min = 0) return min; } }
A: 参数类型不对
B: 循环变量min初值不对
C: 判断等于的符号不对
D: 返回类型不对
答案及解析 ABC
问题一:我们要求两个int数字的最大公约数,所以形参的类型必须是int类型,参数类型错误;
问题二:程序是定义了局部变量min,找的是x和y之间小的那个,之后让min--,看他们是否都可以整除min,所以for循环的初始值应该是min本身,如果是0,就找不到最大公约数了;
问题三:if语句中判断相等应该用==,不是=。‘ = ’是赋值语句,语句恒为真,无法判断;
其实还有个问题就是只有在if语句成立才有返回值,不成立的话就没有返回值,这里看编译器自身,但是建议大家可以在没有最大公约数的时候,添加个返回值return -1;
第五题
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
这里我们找规律就OK了;第一次循环执行了n次,第二次n-1,......最后一次是1;
这个是等差数列:n+(n-1)+ ....+ 1;
等差数列的和就是语句三的执行次数;