资源描述
1.若变量已正确定义并赋值,以下不能构成C语句的选项是
A) B++;
B) A=a+b;
C) a=a+b
D) A?a:b;
参考答案:C
【解析】C语言规定,C语句必须以分号";"结束。C选项中没有结束符号,所以错误。
2.以下叙述中正确的是
A) 复合语句在语法上包含多条语句,其中不能定义局部变量
B) 花括号对{}只能用来表示函数的开头和结尾,不能用于其他目的
C) 空语句就是指程序中的空行
D) 当用scanf从键盘输入数据时,每行数据在没按下回车键(Enter键) 前,可以任意修改
参考答案:D
【解析】复合语句可以包含多条语句,在其中可以定义局部变量,所以A错误。花括号对{}不仅用来表示函数的开头和结尾,也可以用于表示复合语句,所以B错误。C语言中的语句必须以分号";"结束,所以空语句表示为";",不是空行,所以C错误。
3.以下叙述中正确的是
A) 在scanf函数的格式串中,必须有与输入项一一对应的格式转换说明符
B) 只能在printf函数中指定输入数据的宽度,而不能在scanf函数中指定输入数据占的宽度
C) scanf函数中的字符串,是提示程序员的,输入数据时不必管它
D) 复合语句也被称为语句块,它至少要包含两条语句
参考答案:A
【解析】在printf和scanf函数中都可以指定数据的宽度,所以B错误。scanf()的格式控制串可以使用其他非空白字符,如逗号,但在输入时必须输入这些字符,以保证匹配,所以C错误。复合语句可以由任意多条语句构成,可以使一条也可以没有,所以D错误。
4.以下选项中正确的定义语句是
A) double, a, b;
B) double a=b=7;
C) double a; b;
D) double a=7, b=7;
参考答案:D
【解析】A选项中变量类型符double后面不能有逗号。B选项中变量b不能先使用再定义,应该写成选项D中的格式。C选项中变量a后面应该是逗号而不是分号。
5.有以下程序
#include <stdio.h>
char fun( char *c )
{
if ( *c<='Z' && *c>='A' )
*c -= 'A'-'a';
return *c;
}
main()
{
char s[81], *p=s;
gets( s );
while( *p )
{
*p =fun( p );
putchar( *p );
p++;
}
printf( "\n");
}
若运行时从键盘上输入OPEN THE DOOR<回车>,程序的输出结果是
A) OPEN THE DOOR
B) oPEN tHE dOOR
C) open the door
D) Open The Door
参考答案:C
【解析】字符串输入函数gets的功能是从标准输入设备键盘上输入一个字符串。首先使指针变量p指向字符串的首字母,while循环语句中对字符串的每个字符进行fun函数操作。fun函数的功能是,将字符串中的大写字母变小写字母。将处理结果返回主函数,主函数通过putchar()字符输出函数进行输出。因此C选项正确。
黄底为输入函数scanf函数的用法
6.有以下程序
#include <stdio.h>
main()
{
char c1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c", &c1,&c2,&c3,&c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf("%c%c\n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是
A) 1245
B) 1256
C) 1278
D) 1267
参考答案:A
【解析】Scanf按照格式字符进行输入,所以123与回车的值分别送入了c1、c2、c3、c4变量的存储空间。getchar()函数的功能是从键盘输入的字符串中读入一个字符,所以4送入了变量c5的存储空间,5送入了变量c6的存储空间。所以打印时结果为1245。
7.若有以下程序
#include <stdio.h>
char f(char x)
{ return x*x+'a'; }
main()
{ char a, b=0;
for ( a=0; a<4; a+=1 )
{ b = f(a); putchar(b); }
}
则程序的输出结果是
A) abcd
B) ABEJ
C) abej
D) ABCD
参考答案:C
【解析】该题目首先初始化变量a和b,通过for循环语句使a取值为0、1、2、3,f函数的功能是将a*a+'a'的值返回给b,即b为a、b、e、j。最后通过字符输出函数putchar()将b输出。因此C选项正确。
9.有以下程序:
#include <stdio.h>
main()
{ char a,b,c,d;
scanf("%c%c",&a, &b);
c=getchar(); d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第1列开始,<CR>代表回车,注意:回车也是一个字符)
12<CR>
34<CR>
则输出结果是( )。
A) 12
34
B) 12
C) 1234
D) 12
3
参考答案:D
【解析】按照从键盘输入的数据可以判断字符1给了变量a,字符2给了变量b,字符<CR>即回车给了变量c,字符3给了变量d。所以打印输出的结果为D)选项。
33.若变量已正确定义为int型,要通过语句
scanf("%d,%d,%d",&a,&b,&c);
给a赋值1、给b赋值2、给 c赋值3,以下输入形式中错误的是(注:□代表一个空格符)
A) 1,2,3<回车>
B) □□□1,2,3 <回车>
C) 1,□□□2,□□□3<回车>
D) 1□2□3<回车>
参考答案:D
【解析】scanf()的格式控制串可以使用其他非空白字符,如本题中的逗号,但在输入时必须输入这些字符,以保证匹配。所以逗号必须输入。
34.设变量均已正确定义,若要通过
scanf("%d%c%d%c",&a1,&c1,&a2,&c2);
语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)
A) 10□X<回车>
20□Y<回车>
B) 10□X20□Y<回车>
C) 10X<回车>
20Y<回车>
D) 10□X□20□Y<回车>
参考答案:C
【解析】输入数据的格式必须与scanf()的格式控制串完全匹配,如果A、B、C选项中在数字10后面均输入了空格,则会将空格赋给变量c1,而不是把X赋给c1,所以选择C选项。
35.若有定义:
int a,b;
通过语句
scanf("%d;%d",&a,&b);
能把整数3赋给变量a,5赋给变量b的输入数据是(C)
A) 3 5
B) 3,5
C) 3;5
D) 35
30.有以下程序:
#include <stdio.h>
main()
{ int a1,a2; char c1,c2;
scanf("%d%c%d%c",&a1,&c1,&a2,&c2);
printf("%d,%c,%d,%c",a1,c1,a2,c2);
}
若想通过键盘输入,使得a1的值为12,a2的值为34,c1的值为字符a,c2的值为字符b,程序输出结果是:12,a,34,b 则正确的输入格式是(以下代表空格,<CR>代表回车)( )。
A) 12a34 b<CR>
B) 12 a 34] b<CR>
C) 12,a,34,b<CR>
D) 12a34b<CR>
参考答案:D
【解析】在输入多个数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。所以应按选项D)的顺序输入数据。
32.设有定义:
double a,b,c;
若要求通过输入分别给a、b、c输入1、2、3,输入形式如下(注:此处□代表一个空格)
□□1.0□□2.0□□3.0<回车>
则能进行正确输入的语句是
A) scanf("%lf%lf%lf",a,b,c);
B) scanf("%lf%lf%lf",&a,&b,&c);
C) scanf("%f%f%f",&a,&b,&c);
D) scanf("%5.1lf%5.1lf%5.1lf",&a,&b,&c);
参考答案:B
【解析】scanf函数的一般形式为scanf(格式控制,变量1地址,变量2地址,…),其中,格式字符串要与数据类型保持一致,所以格式字符串中应为%lf,后面应该为变量地址,所以需要加上符号"&",所以选择B。
字符参与计算
7.若有以下程序
#include <stdio.h>
char f(char x)
{ return x*x%10 + '0'; }
main()
{ char a; int b=0;
for ( a=0; a<5; a+=1 )
{ b = f(a); putchar(b); }
}
则程序的输出结果是
A) 014916
B) 01234
C) 01496
D) 00000
参考答案:C
【解析】该题目中x*x%10即x和x相乘后,结果再对10求余操作。主函数中通过for语句使变量a从0到4进行取值;当a=0时,调用函数f后,返回值为0赋给b,并且进行字符输出;当a=1时,返回值为1赋给b,并且进行字符输出;当a=2时,返回值为4赋给b,并且进行字符输出;当a=3时,返回值为9赋给b,并且进行字符输出;当a=4时,返回值为6赋给b,并且进行字符输出。因此C选项正确。
8.有以下程序
#include <stdio.h>
int f( int x );
main()
{ int a, b=0;
for ( a=0; a<3; a+=1 )
{ b += f(a); putchar('A'+b); }
}
int f( int x )
{ return x*x+1; }
程序运行后输出结果是
A) ABE
B) BCD
C) BDI
D) BCF
参考答案:C
【解析】在函数main()中,第一次执行for 循环时,b的值等于1,此时输出字母B;第二次执行for循环时,b的值等于3,此时输出字母D;第三次执行for循环时,b的值等于8,此时输出字母I。因此C选项正确。
13.以下不能输出字符A的语句是(注:字符A的ASCII码值为65,字符a的ASCII码值为97)
A) printf ("%c \n", 'a'-32);
B) printf ("%d \n", 'A');
C) printf ("%c \n", 65);
D) printf ("%c \n", 'B'-1);
参考答案:B
【解析】B选项输出的格式为%d,即为整型格式,所以输出字符A的ASCII码值65,而不是字符A。由于大写字母和其对应的小写字母的ASCII码值小32,所以A正确。字符A的ASCII码值就是65,所以以%c格式输出可以输出字符A,所以C正确。由于字符A的ASCII码值比字符B的小1,所以D正确。
14.已知字符'A'的ASCII代码值是65,字符变量c1的值是'A',c2的值是'D'。则执行语句
printf("%d,%d", c1, c2-2 );
的输出结果是
A) 65,68
B) A,68
C) A,B
D) 65,66
参考答案:D
【解析】打印时以%d整型格式打印输出,所以字符标量c1的值打印出来就是65,从c2-2的值打印出来就是68-2,即66。所以选择D。
18.若有以下程序
#include <stdio.h>
main()
{ char c1, c2;
c1='C'+'8'-'3'; c2='9'-'0';
printf("%c %d\n", c1, c2);
}
则程序的输出结果是
A) H '9'
B) H 9
C) F '9'
D) 表达式不合法输出无定值
参考答案:B
【解析】本题考察字符变量以及printf()函数相关知识,字符变量c1被赋值为'C'+'8'-'3',即ASSCII码的运算,67+54-49=72,即H;字符变量c2被赋值为'9'-'0',但输出时,需要注意的是c1以字符变量输出,而c2是以十进制整型变量输出。因此B选项正确。
28.有以下程序:
#include <stdio.h>
main()
{ char c1,c2;
c1='A'+'8'-'4';
c2='A'+'8'-'5';
printf( "%c,%d\n",c1,c2);
}
已知字母A的ASCII码为65,程序运行后的输出结果是( )。
A) E,68
B) D,69
C) E,D
D) 输出无定值
参考答案:A
【解析】本题目中字符变量c1是字符'A'的ASCII码加上4,即69所对应的字符'E'。 字符变量c2是字符'A'的ASCII码加上3,即68所对应的字符'D'。但是打印输出时,c1以%c的格式输出,所以是E,c2以%d的格式输出,所以是68。
10.以下叙述中错误的是
A) gets函数用于从终端读入字符串
B) getchar函数用于从磁盘文件读入字符
C) fputs函数用于把字符串输出到文件
D) fwrite函数用于以二进制形式输出数据到文件
参考答案:B
【解析】本题考查字符处理函数和文件做操函数,属于基础知识,其中B选项getchar是用于从终端读入字符。
11.要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,以下正确的程序段是
A) while(ch=getchar() ='N') printf("%c ",ch);
B) while((ch=getchar())!='N') printf("%c ",ch);
C) while(ch=getchar()=='N') printf("%c ",ch);
D) while((ch=getchar())=='N') printf("%c ",ch);
参考答案:B
【解析】在C语言中等于号用"= ="表示,一个"="表示赋值,所以A错误。C、D 选项的含义都是如果输入的字符为 "N",则打印输出,所以正好和题意相反。
12.若要求从键盘读入含有空格字符的字符串,应使用函数
A) getchar()
B) getc()
C) gets()
D) scanf()
参考答案:C
【解析】scanf ( )语句中用"空格"间隔不同的字符串,空格将被全部忽略掉,所以用scanf()函数不能输入空格;getchar()函数用于输入字符,其调用格式为:ch=getchar(),getchar()函数从终端读入一个字符作为函数值,把读入的字符赋给变量ch。在输入时,空格、回车符都将作为字符读入,而且只有在用户敲入回车键时,读入才开始执行。gets()函数的调用形式为:gets(str_adr),其中str_adr是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。getc()函数的调用形式为:ch=getc(pf)其中pf是文件指针,函数的功能是从pf指定的文件中读入一个字符,并把它作为函数值返回。因此C选项正确。
输出%
15.以下叙述中正确的是
A) 在scanf函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上
B) 在使用scanf函数输入整数或实数时,输入数据之间只能用空格来分隔
C) 在printf函数中,各个输出项只能是变量
D) 使用printf函数无法输出百分号%
参考答案:A
【解析】scanf函数中的格式控制字符串是为了输入数据用的,无论其中有什么字符,也不会输出到屏幕上,所以A正确。scanf()的格式控制串可以使用其他非空白字符,如逗号,但在输入时必须输入这些字符,以保证匹配就可以,所以B错误。Printf函数可以输出常量也可以输出变量,所以C错误。Prinf函数可以用"\%"来输出百分号%,所以D错误。
16.有以下程序
#include <stdio.h>
main()
{
int a=2, c=5;
printf( "a=%%d,b=%%d\n", a,c );
}
程序的输出结果是
A) a=2,b=5
B) a=%2,b=%5
C) a=%d,b=%d
D) a=%%d,b=%%d
参考答案:C
【解析】C语言中用"%%"打印输出字符"%",所以%%d,输出为%d两个普通字符,而不是格式控制符"%d"的含义,所以打印结果为C。
17.有以下程序
#include <stdio.h>
main()
{ int a=0, b=0;
/* 给a赋值 a=10;
b=20; 给b赋值 */
printf("a+b=%d\n",a+b); /* 输出计算结果 */
}
程序运行后的输出结果是
A) 出错
B) a+b=30
C) a+b=10
D) a+b=0
参考答案:D
【解析】注释语句可以在一行也可以在多行,用/*……*/或//表示,。它不参与程序的运行,所以a与b的值仍然为0,所以打印的结果为a+b=0。
19.以下叙述中正确的是
A) 由printf输出的数据都隐含左对齐
B) scanf和printf是C语言提供的输入和输出语句
C) 赋值语句是一种执行语句,必须放在函数的可执行部分
D) 由printf输出的数据的实际精度是由格式控制中的域宽和小数的域宽来完全决定的
参考答案:C
【解析】scanf和printf是C语言提供的输入输出函数,所以B错误。由printf输出的数据都隐含右对齐,所以A错误。Printf输出数据所占的宽度由系统决定,所以D错误。
20.有以下程序
#include <stdio.h>
main()
{
int x;
for( x=3; x<6; x++ )
printf( (x%2 ) ? ("*%d") :("#%d"),x);
printf("\n");
}
程序的输出结果是
A) *3#4*5
B) #3*4#5
C) *3*4#5
D) *3#4#5
参考答案:A
【解析】条件运算符组成条件表达式的一般形式为:表达式1? 表达式2: 表达式3其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。本题中语句printf((x%2)?("*%d"):("#%d"),x);含义为变量x对2求余,如果结果为真,则按照"*%d"格式输出,否则按照#%d输出。因此A选项正确。
21.若有以下程序
#include <stdio.h>
main()
{ int i, j=0;
char a[]="How are you!", b[10];
for ( i=0; a[i]; i++ )
if (a[i] == ' ') b[j++]=a[i+1];
b[j]='\0';
printf("%s\n",b);
}
则程序的输出结果是
A) Howareyou!
B) Howareyou
C) Hay!
D) ay
参考答案:D
【解析】程序首先初始化字符数组a[ ]为"How are you!"。语句if (a[i] = = ' ') b[j++]=a[i+1];条件是判断字符数组a[ ]中是否是空格字符,如果是空格的话,将空格后的字符赋给数组b。并将b输出。因此D选项正确。
22.有以下程序
#include <stdio.h>
main()
{ int x=1, y=0,a=0,b=0;
switch( x )
{ case 1: switch ( y )
{ case 0: a++; break;
case 1: b++; break;
}
case 2: a++; b++; break;
}
printf("a=%d,b=%d\n",a,b );
}
程序运行后的输出结果是
A) a=1,b=0
B) a=1,b=1
C) a=2,b=1
D) a=2,b=2
参考答案:C
【解析】本题重点考察switch语句,switch语句中case分支后面如果没有break,那么就会顺序执行下面的case,直到遇到break跳出。由于变量a和变量b均赋初值为0,当程序执行完语句case 0: a++; break;后,a的值为1,继续执行语句case 2: a++; b++; break;a的值为2,b的值为1。因此C选项正确。
23.有以下程序
#include <stdio.h>
main()
{ int k, j, s;
for( k=2; k<6; k++,k++ )
{ s=1;
for (j=k; j<6; j++ ) s+=j;
}
printf("%d\n" , s );
}
程序运行后的输出结果是
A) 6
B) 10
C) 24
D) 40
参考答案:B
【解析】本题重点考察for语句循环嵌套,首先k=2,进行一次循环后,k自增两次,变成4,这时s为1。即当k=4的时候,s=1,j=4,执行内层循环,s=1+4,j自增1后等于5,s=5+5, j再自增1后即为6,跳出内层循环。k自增两次后等于6,不成立,跳出外层循环。最后输出s的值,即为10。因此B选项正确。
24.有以下程序:
#include <stdio.h>
main()
{ int a=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2*b);
A) 1,2
B) 1,0
C) 3,2
D) 0,0
参考答案:A
【解析】首先打印b=a+b=1+0=1的值1,此时已给b赋值为1。然后打印a=2*b=2*1=2的值2。所以结果是1,2.
25.有以下程序
#include <stdio.h>
main()
{ int i, sum;
for( i=1; i<6; i++ ) sum+=i;
printf("%d\n", sum);
}
程序运行后的输出结果是
A) 随机值
B) 0
C) 15
D) 16
参考答案:A
【解析】本题重点考察for语句,变量没有初始化的情况下,默认值与编译器有关系,不同的编译器有不同的值。因此A选项正确。
26.有以下程序
#include <stdio.h>
main()
{ int a = 3;
do
{ printf("%d,", a-=2 ); }
while( ! (--a) );
printf("\n");
}
程序运行后的输出结果是
A) 1
B) 1, -2,
C) 3,0,
D) 1,0
参考答案:B
【解析】本题重点考察do……while语句,该循环语句的特点是,先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。变量a赋初值为3,每循环一次需执行语句a-=2一次,同时循环条件使变量a自减1,所以第一次循环后变量a变为1,第2次循环后变量a变为-2。因此A选项正确。
27.有以下程序
#include <stdio.h>
main()
{ double x=2.0, y;
if( x<0.0 ) y=0.0;
else if( (x<5.0) && (!x) ) y=1.0 / ( x+2.0 );
else if( x<10.0 ) y=1.0 / x;
else y=10.0;
printf(" %f\n ", y );
}
程序运行后的输出结果是
A) 0.000000
B) 0.250000
C) 0.500000
D) 1.000000
参考答案:C
【解析】本题重点考察if语句,变量x和y均为double类型,由于变量x赋值为2.0,因此执行if((x<5.0)&&(!x)),即条件为0,继续执行if( x<10.0 ),条件为1,即执行y=1.0 / x;。依据printf()函数输出类型中f是以小数形式输出单、双精度实数。因此C选项正确。
29.有如下程序段:
int x=12;
double y=3.141593;
printf("%d%8.6f", x, y);
其输出结果是
A) 123.141593
B) 12 3.141593
C) 12, 3.141593
D) 123.1415930
参考答案:A
【解析】printf函数中格式字符"%8.6"的含义是:变量y的输出宽度为8(包括小数点),小数点后面保留6位小数,且右对齐。所以选择A。
31.若有以下程序段
double x=5.16894;
printf("%f\n", (int)(x*1000+0.5)/(double)1000 );
则程序段的输出结果是
A) 5.170000
B) 5.175000
C) 5.169000
D) 5.168000
参考答案:C
【解析】%f的输出格式是以带小数点的数学形式输出浮点数。首先计算x*1000,结果为5168.94然后+0.5,结果为5169.44,然后进行强制类型转换,转换成整型为5169,然后除以双精度数据1000,结果也为双精度数据5.169,输出时按照%f的格式输出,所以输出结果为5.169000。
展开阅读全文