仔细理解
一、C语言
1、数据类型表达式练习题
-
表达式 (3== x ==3) 的值恒为0。(T)
-
函数的声明包括函数首部和函数体两部分。(F)
-
C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。(T)
-
下列叙述中正确的是( D )
A.每个C程序文件中都必须要有一个main()函数
B.在C程序中main()函数的位置是固定的
C.C程序中所有函数之间都可以相互调用,与函数所在位置无关
D.在C程序的函数中不能定义另一个函数 -
下列选项中用于判断ch是否是字符的表达式是( D )。 (2分)
A.( ‘a’ <= ch <= ‘z’ ) || ( ‘A’ <= ch <= ‘Z’ )
B.( ‘a’ <= ch <= ‘z’ ) && ( ‘A’ <= ch <= ‘Z’ )
C.( ch >= ‘a’ && ch <= ‘z’ ) && ( ch >= ‘A’ && ch <= ‘Z’ )
D.( ch >= ‘a’ && ch <= ‘z’ ) || ( ch >= ‘A’ && ch <= ‘Z’ ) -
逻辑运算符两侧运算对象的数据类型( D )。 (2分)
A.只能是 0 或 1
B.只能是 0 或非 0 正数
C.只能是整型或字符型的数据
D.可以是任何类型的数据 -
假定x和y为 double型,则表达式x=2,y=x+3/2的值是( C )。 (2分)
A.3.500000
B.3
C.3.000000
D.2.000000 -
有以下程序
注意符号优先级
#include<stdio.h>
void main()
{ int x, y, z;
x=y=1;
z=x++,y++,++y;
printf(“%d,%d,%d\n”,x,y,z);}
程序运行后的输出结果是( C )。
A. 2,3,3 B. 2,3,2 C. 2,3,1 D. 2,2,1 -
若变量已正确定义并赋值,下面符合C语言语法的是 ( B )
C重复定义了
A.int a=int(i) B. a=b=c+2 C. int a=b=3; D. a=a+7=c+b
2、选择练习
-
if(a=5) 是允许的。(T)
-
break语句只能用于循环语句中。 (F)可用在switch选择结构中
-
如果变量已经正确定义,则执行以下程序段后,x的值不变。(F)
x = 4; if (x < 0){ y = -1; }else if (x = 0){ y = 0; }else{ y = 1; }
-
下列程序段的输出结果是( C )。 (2分)
else总是与离它最近的if配对int main(void) { int a = 2, b = -1, c = 2; if(a < b) if(b < 0) c = 0; else c++; printf("%d\n",c); return 0; }
A.0 B.1 C.2 D.3
-
下列程序段输出结果为 ( B )。
注意选择语句或者循环语句后面的;(分号)int x = -3, y = 2; if(x>y); x = -x; if(x<y) y = -y; printf("x=%d,y=%d\n", x, y);
A.x=3,y=-2
B.x=3,y=2
C.x=-3,y=2
x=-3,y=-2 -
若a、b、c1、c2、x、y均是整型变量,以下正确的switch语句是 ( D )
A.
()后面有分号switch(a+b); { case 1: y=a+b; break; case 0:y=a-b; break;}
B.
switch(a*a+b*b) { case 3: case 1: y=a+b; break; case 3: y=b-a, break;}
C.
switch a { case c1: y=a-b; break; case c2: x=a*b; break; default: x=a+b; }
D.
switch(a-b) { default: y=a*b; break; case 3: case 4: x=a+b; break; case 10: case 11: y=a-b; break; }
-
以下程序统计输入的一行字符中字母、数字、空格、其它字符的个数(行末以换行符结束,最后的换行符不统计在内)。例如,输入的一行字符为aB 3*则字母有2个,数字有1个,空格有1个,其它字符有1个。
提示:1、填写的代码要确保程序可以正确编译、运行得出结果;2、空格之后的括号里注明了分数,该括号不属于代码部分。#include <stdio.h> int main(){ int letters, digits, spaces, others; (2分); char ch;//(ch=getchar())!=’\n’ putchar(ch)!=’\n’ while( (2分) ){ if( (2分) ) letters++; else if( (2分) ) digits++; else if( (2分) ) spaces++; else others++; } printf("字母、数字、空格、其它字符分别有:%d %d %d %d 个\n",letters,digits,spaces,others); } letters=0;digits=0;spaces=0;others=0 (ch=getchar())!=’\n’ (ch>'a'&&ch<'z')||(ch>'A'&&ch<'Z') ch>=0&&ch<=9 ch==' '
-
列程序段将输出__
*2*#*3*#
_。
注意case 1:后面没有break;所以要执行下面的代码包括defaultunsigned char x=255,y='\1'; switch(!!x) { case 0: printf("*0*#");break; case 1: switch(y) { case 0: printf("*1*#");break; case 1: printf("*2*#");break; } default: printf("*3*#"); }
3、循环练习
-
要提前结束循环的执行,可以使用 break 语句。
-
在多层循环中, 一个break语句只向外跳一层。(T)
-
只能在循环体内和switch语句体内使用break语句。(T)
-
第一段用for语句实现的循环,一定等价于第二段用while语句实现的循环(两个循环中省略的代码相同)。(F)
注意当省略的代码中有continue时,while循环中的i++会失效,而for循环中的i++仍然执行for(i=0;i<100;i++) /** 此处省略代码若干行 **/ int i=0; while(i<100){ /** 此处省略代码若干行 **/ i++; }
-
执行以下程序段,sum的值是55。(F)
注意sum没有初始化,是一个随机数int i, sum; for (i = 1; i <= 10; i++){ sum = sum + i; }
-
以下程序段的功能是计算20的阶乘。(F)
product = 0int i; double product; product = 0; for (i = 1; i <= 20; i++){ product = product * i; }
-
若变量已正确定义,以下while循环结束时,i的值为11。(F)
注意本函数中没有i++i = 1; while (i <= 10){ printf("%d\n", i); }
-
do - while语句的一般形式如下,第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do - while的下一条语句。(T)
do{ 循环体语句 }while(表达式);
-
执行以下程序段,将出现死循环。
注意两个循环中的i相互影响for(i = 11; i <= 20; i++){ for(i = 1; i <= 10; i++){ printf( "%4d", i ); } printf("\n"); }
-
以下两个程序段等价,其功能是计算 s=1+2+…+10。(T)
/* 程序段A*/ s = 0; i = 1; while(i <= 10){ s = s + i; i++; } /* 程序段B */ s = 0; i = 1; while(1){ if(i > 10){ break; } s = s + i; i++; }
-
以下两个程序段等价,其功能是计算 s=1+3+5+7+9。(T)
/* 程序段A*/ s = 0; i = 0; while(i < 10){ i++; if(i % 2 == 0){ continue; } s = s + i; } /* 程序段B */ s = 0; i = 0; while(i < 10){ i++; if(i % 2 != 0){ s = s + i; } }
4、数组练习
-
调用strcmp函数比较字符串大小时,通常较长的字符串会较大。 ( F )
字符串比较规则是:将两个字符串自左至右逐个字符相比(按照ASCII码值大小比较,小写字母比大写字母大),直到出现不同字符或遇到’\0’为止 -
以下定义语句中不正确的是_D_。 (2分)
注意:可以定义实型数组
A.double x[5]={2.0, 4.0, 6.0, 8.0, 10.0};
B.char c2[]={‘\x10’, ‘\xa’, ‘\x8’};
C.char c1[]={‘1’, ‘2’, ‘3’, ‘4’, ‘5’};
D.int y[5]={0,1,3,5,7,9}; -
有两个字符数组a,b,则以下正确的输入语句是。( B )
A.gets(a,b);
B.scanf(“%s%s”,a,b);
C.scanf(“%s%s”,&a,&b);
D.gets(“a”),gets(“b”); -
删除字符串中的空格(使用1个数组)。
以下程序段的功能是:将字符串str中的所有空格都删除。int i, j char str[81]; i = j = 0; while (str[i] != '\0') { if(1分){ str[j] = str[i]; (1分) } i++; } (1分) str[i]!=' ' j++ str[j]='\0';
5、指针练习
-
执行语句int *p=1000;后,指针变量p指向地址为1000的变量。 ( F )
-
调用printf函数,%s的格式输出字符串时,字符数组名、字符指针和字符串常量都可以作为输出参数。 ( T )
-
下面程序的输出结果是( D )。
注意:区分形参x,y和实参x,y#include<stdio.h> void fun (int *x, int y){ printf("%d%d", *x, y);// &2 1 *x=3; y=4; //x=3 y=1 } int main(void){ int x=1,y=2; // x=1 y=3 fun(&y, x);// printf("%d%d", x, y); return 0; }
A.1 2 3 4
B.1 2 2 1
C.2 1 3 1
D.2 1 1 3 -
以下程序的运行结果是( D )。
#include <stdio.h> void sub(int x, int y, int *z) { *z = y-x; } int main() { int a,b,c; sub(10, 5, &a);//-5 sub(7, a, &b);// -12 sub(a, b, &c);//-17 printf(“%d,%d,%d\n”, a,b,c); return 0; }
A.5,2,3
B.-5,-12,-7
C.-5,-12,-17
D.5,-2,-7 -
以下程序运行后输入“3,abcde<回车>”,则输出结果是。cedba
注意调用move函数的次数是3#include <stdio.h> #include <string.h> void move(char* str, int n) { char temp; int i; temp = str[n - 1]; //temp=str[4]=e for (i = n - 1; i > 0; i--) //i=4 str[i] = str[i - 1];//str[4]=str[3] str[0] = temp; // eabcd deabc cdeab } int main() { char s[50]; int n, i, z; scanf("%d,%s", &n, s); //n=3 s=abcde z = strlen(s); //z=5 for (i = 1; i <= n; i++) //1 2 3 move(s, z); //abcde 5 printf("%s\n", s); return 0; }
-
写出下列程序的执行结果 (1分) 4 6
注意在for循环中不满足循环条件时,i的大小#include <stdio.h> int main(void) { int a[10], b[10], *pa, *pb, i; pa = a; pb = b; for( i=0; i<3; i++, pa++, pb++) { *pa = i;//pa[0]=0 pa[1]=1 pa[2]=2 *pb = 2*i;//pb[0]=0 pb[1]=2 pb[2]=4 } pa = &a[0];//0 1 2 pb = &b[0];//0 2 4 for ( i=0; i<3; i++,pa++,pb++)//此时pa pb已经+了3次 { *pa = *pa + i;//0 2 4 *pb = *pb + i;//0 4 6 } printf("%d %d\n", *--pa, *--pb); return 0; }
-
下面程序段的运行结果是 (2分) 。6 6 7
++*p == >*p=*p+1 所以 *p的值也会改变int i,j,k=5, *p; p= &k; i= ++(*p);//6 相当于*p=*p+1 p指向k的值已经改变 j=(*p)++;//6 printf("%d %d %d",i,j,k) ;