一、选择题
1.以下叙述中错误的是( A )。
A.使用三种基本结构构成的程序只能解决简单问题 (P28) B.结构化程序由顺序、分支、循环三种基本结构组成(P26) C.C语言是一种结构化程序设计语言
D.结构化程序设计提倡模块化的设计方法(P34) 2.以下叙述正确的是( A )。
A.C语言函数可以嵌套调用,例如:fun(fun(x))
B.C语言程序是由过程和函数组成的(P10 C语言程序是由函数组成的) C.C语言函数不可以单独编译
D.C语言中除了main函数,其他函数不可作为单独文件形式存在 3.有以下程序
#include
{ int a=0, b=0; /* 给a赋值 a=10;
b=20; 给b赋值 */ printf(\输出计算结果 */ }
程序运行后的输出结果是( B )。 A.出错
B.a+b=0
C.a+b=10
D.a+b=30
4.以下叙述中正确的是( A )。
A.每个后缀为.C的C语言源程序都可以单独进行编译
B.每个后缀为.C的C语言源程序都应该包含一个main函数(若在一个项目中,后缀为.C的C语言源可以不包含main)
C.在C语言程序中,main函数必须放在其他函数的最前面 D.在C语言程序中,只有main函数才可单独进行编译
5.按照C语言规定的用户标识符命名规则,不能出现在标识符中的是( D )。 A.大写字母
B.下划线
C.数字字符
D.连接符
6.以下选项中能表示合法常量的是( D )。(p39)
A.1,200 7.有以下程序
B.1.5E2.0 C.0118 D.\
#include
int sum, pad, pAd; sum = pad = 4;
pAd = ++sum, pAd++, ++pad; printf(\ }
程序的输出结果是( B )。 A.4
8.有以下程序 #include
a = (int)(-1.65*3); printf(\}
程序的运行结果是( B )。(直接取整数部分) A.-3
B.-4
C.-5
D.结果不确定
B.5
C.6
D.7
9.关于\条件表达式)循环体\,以下叙述正确的是( B )。 A.循环体的执行次数总是比条件表达式的执行次数多一次 B.条件表达式的执行次数总是比循环体的执行次数多一次 C.条件表达式的执行次数与循环体的执行次数一样 D.条件表达式的执行次数与循环体的执行次数无关
10.若有定义语句:int year=2009, *p=&year ;以下不能使变量year中的值增至2010的语句是( B )。 A.(*p)++; 11.有以下程序
#include
B.*p++;
C.++(*p);
D. *p+=1;
int fun( int a, int b) { return a+b; } main()
{ int x=6, y=7, z=8, r ; r = fun ( fun(x,y), z-- ); printf (\ }
程序运行后的输出结果是( A )。 A. 21
B. 15
C. 20
D. 31
12.在以下给出的表达式中,与while(E)中的(E)不等价的表达式是( B )。 A. (E>0||E<0)
B. (E==0)
C. (! E==0)
D. (E!=0)
13. 由以下while构成的循环,循环体执行的次数是( D )。 int k=1;
while ( k=2 ) k++;//请注意:若改为while ( k==2 ),则如何?(B) A. 有语法错,不能执行 C. 执行一次 14. 若有以下定义 int x[10], *pt=x;
则对x数组元素的正确引用是( D )。(p236) A. pt+3 15. 有以下程序
#include
{ int c[6]={10,20,30,40,50,60}, *p,*s; p = c; s = &c[5]; printf(\ }
程序运行后的输出结果是( A )。 A. 5
B. 4
C. 20
D. 16
B. *&x[10]
C. *(pt+10)
D. *(x+3)
B. 一次也不执行 D. 无限次
16. 以下叙述中正确的是( B )。 A.一条语句只能定义一个数组
B.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元 C.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式 D.在引用数组元素时,下标表达式可以使用浮点数(整型) 17. 以下叙述中正确的是( D )。 A.数组下标的下限是1(0)
B.数组下标的下限由数组中第一个非零元素的位置决定 C.数组下标的下限由数组中第一个被赋值元素的位置决定 D.char c1, c2, *c3, c4[40];是合法的变量定义语句 18. 有如下程序 #include
char name[10] = {'S', 'T', 'R', 'I', 'N', 'G'}; name[3] = 'E'; name[5] = 0; printf(\}
程序运行后的输出结果是( A )。 A. STREN
B. STRIEG
C. STRENG
19. 下列定义数组的语句中,正确的是( A )。 A. #define N 10
B. int N=10;int x[N]; int x[N]; C. int x[0..10]; D. int x[ ];
20. 设有定义
double a[10] ,*s=a;
以下能够代表数组元素a[3]的是( B )。 A. (*s)[3] B. *(s+3)
C. *s[3]
21. 有以下程序 #include
{ char str[12] = { 's','t' , 'r' , 'i' , 'n' , 'g'} ;
D. STREN0
D. *s+3
printf(\}
程序运行后的输出结果是( D )。 A. 12
B. 11
C. 7
D.6
22.设有函数定义:void sub(int k,char ch){ ? } 则以下对函数sub的调用语句中,正确的是 ( A )。 A. sub(1,97);
B. sub(2,'97');
C. n=sub(3,'a');
D. sub(4,\
23.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( A )。 A.函数的形参和实参分别占用不同的存储单元 B.形参只是形式上的存在,不占用具体存储单元 C.同名的实参和形参占同一存储单元
D.函数的实参和其对应的形参共占同一存储单元 24.以下叙述中错误的是( D )。 A.C程序必须由一个或一个以上的函数组成 B.函数调用可以作为一个独立的语句存在 C.若函数有返回值,必须通过return语句返回 D.函数形参的值也可以传回给对应的实参
25.以下关于C语言函数参数传递方式的叙述正确的是( A )。 A.数据只能从实参单向传递给形参 B.数据可以在实参和形参之间双向传递
C.数据只能从形参单向传递给实参(实参可以传递形参但形参不可以传递实参)
D.C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用
26.以下关于函数的叙述中正确的是( A )。 A.函数形参的类型与返回值的类型无关 B.函数必须要有形参 C.函数必须要有返回值 D.函数调用必须传递实参
27..若有说明和语句:char str[]=\*p; p=str;,则此时*(p+5)中的值为( A )。 A. '\\0'
B. 'o'
C. 'o'的地址
D. 不确定的值
28.以下选项中的编译预处理命令行,正确的是( A )。
A. #define PI 3.14 C. #DEFINE TRUE 29.若程序中有宏定义行: #define N 100
则以下叙述中正确的是( B )。
B. ##define eps 0.001 D. #define int INT
A. 宏定义行中定义了标识符N的值为整数100
B. 在编译程序对C源程序进行预处理时用100替换标识符N C. 上述宏定义行实现将100赋给标示符N D. 在运行时用100替换标识符N 30.设有定义: struct complex
{int real,unreal;} data1={1,8},data2; 则以下赋值语句中错误的是( A )。 A. data2=(2,6); B. data2=data1; C. data2.real=data1.real;
D. data2.real=data1.unreal;
31.下面结构体的定义语句中,错误的是( A )。
A. struct ord {int x;int y;int z;} struct ord a; B. struct ord {int x;int y;int z;}; struct ord a; C. struct ord {int x;int y;int z;} a; D. struct {int x;int y;int z;} a;
32.设有定义:struct { int n; float x;} s[2],m[2]={{10,2.8},{0,0.0}}; 则以下赋值语句中正确的是( A )。 A. s[0]=m[1];
B. s=m;
C. s.n=m.n;
D. s[2].x=m[2].x;
33.下列关系表达式中,结果为\假\的是( D )。 A. 3 <= 4 4”为真为1)
34.若变量已正确定义,以下选项中非法的表达式是( D )。 A. a!=4||'b'
B. 'A' + 32
C. 'a' % 4
D. 'a'=1/2*(x=y=20,x*3)
B. (3 < 4) == 1
C. (3 + 4) > 6
D. (3 != 4) > 2 (“3 !=
34.若a是数值类型,则逻辑表达式 (a==1)||(a!=1)的值是( A )。 A. 1 确定
B. 0
C. 2
D. 不知道a的值,不能
35.下关于逻辑运算符两侧运算对象的叙述中正确的是( A )。 A) 可以是任意合法的表达式 B) 只能是整数0或非0整数 C) 可以是结构体类型的数据 D) 只能是整数0或1 36.有以下程序 #include
c= 13&5; d=10&&5; printf(\}
程序的运行结果是( A )。 A) 5,1 B) 1,1
C) 18,1
37.有以下程序
#include
{ int x=35, B; char z='B' ; B = (( x ) && ( z <'b' )); printf(\ }
程序运行后的输出结果是( A )。 A) 1 B) 0
C) 35
37.有以下程序
#include
{ int a[ ]={ 10,20,30,40 }, *p=a, i ; for( i=0; i<=3; i++ ) { a[i] = *p; p++; } printf(\ }
程序运行后的输出结果是( C )
D) 13,1
D) 66
A. 10 38.有以下程序 #include
B. 20 C. 30 D. 40
int a[10] = { 11,12,13,14,15,16,17,18,19,20 },*p=a,i=9 ; printf( \}
程序运行后的输出结果是( A )。 A. 11,20,20 B. 12,20,20
39.有以下程序 #include
int *p, x=100; p=&x; x=*p+10; printf(\}
程序运行后的输出结果是( A )。 A. 110 B. 120
40.有如下程序 #include
int a = 0, *ptr; ptr = &a; *ptr = 3; a = (*ptr) ++;
printf(\}
程序运行后的输出结果是( A )。
C. 11,19,19
C. 100
D. 12,19,20
D. 90
A. 4,4 B. 0,1 C. 1,4 D. 0,4
41. 以下叙述中正确的是 C ___ 。 A) break语句只能用于switch 语句中
B) continue语句的作用是:使程序的执行流程跳出包含它的所有循环 C) break语句只能用在循环体内和switch语句体内 D) 在循环体内使用break语句和continue 语句的作用相同
42. 若有说明int a[][3]={1,2,3,4,5,6,7}; 则a数组第一维的大小是 B ___ 。 A) 2 B) 3 C) 4
D) 无确定值
43. 有如下程序, 该程序段的输出结果是 B ___ 。 void main(void) { int n=5; while(n>2)
{
n--;
printf(“%d”,n); }
} A) 543 B)432 C)4321 D)5432
44.下列四种数组定义,合法的数组定义是 A ___ 。 A) char a[ ]=\
C) char a=\
45.若已定义x和y为实型变量,则表达式x=1, y=x+3/2的值是( D )。
A) 1
B) 2
C) 2.0 D) 2.5
46.下列语句中,正确的是 D ___ 。
A) #define PI=3.14159 B) include “stdio.h” C) define M 3 D) #define PI 3.14159 47.判断字符型变量 ch是否为大写英文字母的表达式为 B ___ 。
A) ‘A’<=ch<=‘Z’
B) ch>=‘A’&& ch<=‘Z’
C) ch>‘a’&& ch<=‘z’ D) ch>=‘A’|| ch<=‘Z’
48.设x为整型变量, p是指向整型的指针变量, 则下列赋值表达式正确的是 A ___。
A) p=&x B) p=x C) *p=&x D) *p=*x
49.设有定义:int k=3,*p=&k; 则表达式 *p的值是 ____D____。
A)1 B) 0 C) 2 D) 3
50. 要将字符串str2复制到字符串str1中,应使用的函数是 A ___ 。
A) strcpy(str1,str2); C) strcat(str1,str2); 51. 以下叙述错误的是 B D ___ 。
A) 一个C源程序可由一个或多个函数组成 B) 一个C源程序必须包含一个main函数 C) C程序的基本组成单位是函数
D) 在C程序中,注释说明只能位于一条语句的后面
52.函数调用语句func ((exp1,exp2),(exp3,exp4,exp5));中,实参的个数为 B___ 。
A) 1
B) 2
C) 4
D) 5
B) strcpy(str2,str1); D) strcmp(str2,str1);
53.下面字符数组初始化语句正确且与语句char c[]=\;等价的是 B_ ___ 。
A) char c[]={'s','t','r’,'i’,'n','g'}; B) char c[]={'s','t','r’,'i’,'n','g','\\0'}; C) char c[]={'string'}; D) char c[]='string';
54.运行下面程序段后,i的值是 C___ 。
int i=10; while(i--); printf(\,i); A) 0
B) 1
C) -1
D) 10
55.设 int i=4;则表达式(i= =2)?i:i-1的值为 C ___ 。
A) 1
B) 2
C) 3
D) 4
56.下面不正确的字符串常量是 A ___ 。
A) 'ABC'
B) \
C) \
D) \
57.若定义int d, c=1;则执行下面的语句后,d的值为 A ___ 。
switch(--c)
{ case 0:d=0;break; case 1: case 2:d=1; case 3:
case 4:d=2;break; default:d=3;}
A) 0 B) 1 C) 2 D) 3
58.以下能正确定义变量a,b和c并为它们赋值的语句是 D ___ 。
A) int a=5; b=5; c=5; C) a=5,b=5,c=5;
B) int a,b,c=5;
D) int a=5, b=5, c=5;
59.当定义一个结构体变量时,系统为它分配的内存空间是 D ___ 。
A) 结构中一个成员所需的内存容量 B) 结构中第一个成员所需的内存容量 C) 结构体中占内存容量最大者所需的容量 D) 结构中各成员所需内存容量之和 60.有下列程序段落:
int i,a[5]; for(i=0;i<5;i++)
scanf(“%d”,&a[i]);
若要使数组元素的值分别为1,2,3,4,5,应从键盘输入 _____B____。 A) 1,2,3,4,5↙ B) 1 2 3 4 5↙ C) 12345↙ D) 1;2;3;4;5↙
二、填空题
1.算法是 为解决一个问题而采取的方法和步骤 。
2.C语言的数据类型分为 基本数据类型 和构造类型两大类。 3.程序的三种控制结构是:顺序结构、 选择结构 和循环结构。
4.在循环语句中,break语句的作用是 提前结束循环语句的执行 。 5.C语言规定,函数返回值的类型是由 所定义函数的类型决定的。 6.若用数组名作为函数调用的实参,则传递给形参的是数组的 首地址。 7.按照作用范围可以把变量分为局部变量和 全局变量 。
8.在C语言中,实参和与其对应的形参 各占独立的存储单元 9. 某函数直接或间接调用自身称为该函数的 递归调用 。
10.表达式(int)((double)9/2)-9%2的值是____3____________。//后有详解
11.C语言规定,二维数组元素在内存中是按 行优先 的顺序存储的。
12.设x为int型变量,请写出一个关系表达式 x%7==0&&x%3==0 ,用以判断x同时为3和7的倍数时,关系表达式的值为真。
13.设y为int型变量,请写出描述”y是奇数”的表达式y%2!=0。
14.若定义 int b[7],*p=b; 则p+3表示 &b[3] 。 15.计算机能直接执行的程序是 机器语言程序 。 16.C语言主要是借助 函数 来实现程序模块化
17.C语言的函数由两部分构成,分别是 函数首部 和函数体。
18.C语言本身不提供输入输出语句,输入和输出操作是由 库函数 来完成的。
19.按照C语言规定的用户标识符命名规则,构成C标识符的字符只能是 字母,数字,下划线 三类字符。
20.C语言规定,标识符的第一个字符只能 字母开头 。
21.按照作用范围,可以把C语言的变量分为 全局变量 和局部变量。
22.编译时分配存储单元,作用范围结束后还占据原来存储单元的变量,是用关F键字 static 定义的。
23.C语言规定,二维数组元素在内存中是按照__ 先行后列 (或称为行优先)的顺序存储的。
24.若有定义int a[2][3]={{2},{3}};则值为3的数组元素是 a[1][0] 。 25.若有定义语句:int x=5;,则表达式x+=x-=x*x的值为 -40 。//后有详解
?b?b2?4ac26.将数学表达式写成C语言表达式,为 (-b+sqrt(b*b-4*a*c))/(2*a) 。
2a27.存放其他变量地址的变量称为 指针变量 。
28.若有说明int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[2];,则*(p+4)的值是 7 。//后有详解
29.如果函数先被调用,后被定义,应该在调用之前进行 原型声明 。 30.C语言中,按变量地址访问变量的方式称为 直接访问 。
31.C语言中,按照指针变量访问其他变量的方式称为 间接访问 。
32.函数调用语句:fun( ( exp1, exp2 ), ( exp1, exp2, exp3) ); 含有的实参个数是 2 。 //后有详解
33.若定义函数时未指定返回值的数据类型,则C语言规定:函数返回值的类型为 int 。
34.若要求从键盘读入含有空格字符的字符串,应使用函数 gets() 。 35.C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,称为 结构体类型 ,在其他一些高级语言中称为“记录”。
36.使几个不同的变量共享同一段内存的结构称为 共用体 结构。 37.若有联合数据类型定义如下: union { int a;
int b; }x,y;
执行语句 x.a=5;x.b=x.b+3;y.a=x.a*5;后,则y.b的值为 40 。
38.设文件指针fp已定义,执行语句fp=fopen(\后,对文本文件file操作是 只写 。
39.在C语言中调用 fopen() 就可把程序中要读、写的文件与磁盘上实际的数据文件联系起来。
40.当程序中对fp指针指向的文件的所有写操作完成之后,必须调用 fcolse() 函数关闭文件。
41.若程序中使用了函数sqrt(),则必须包含的头文件名为_____math.h______。 42.C语言源程序中主函数名由系统规定为 main ,程序员是不能改变的。 43.若定义 int b[5],*p=b; 则p++表示 &b[0] 。
44.按照作用范围可以把变量分为全局变量和 局部变量 。
45.按照存储类别可以把变量分为自动存储类别的变量和 静态,外部,寄存器四种存储类别。
46.程序的三种控制结构是: 顺序结构 、 选择结构 和 循环结构 。 47.若用数组名作为函数调用的实参,则传递给形参的是数组的 首地址 。 48.一个函数直接或间接调用自身称为 递归调用 。 49.在C语言中,用零来表示逻辑“假”,用 非零 来表示逻辑“真”。 50.循环的嵌套是指 一个循环语句中又包含另一个完整循环语句 。 51.C语言规定,程序中用到的变量必须“ 先说明,后使用 ”。 52. C语言规定,函数返回值的类型是由 定义函数声明类型 决定的。 53.若定义 int b[7],*p=b; 则p+3表示 数组b中第四个函数的地址 。 54.指针变量是 存放其他变量地址的变量 。
55.调用函数时,在函数名后面列出的参数称为 实参 。
56.定义函数时,在函数名后面的圆括号中出现的参数称为 形参 。 57.C源程序中,凡是行首以#标识的控制行都是 编译预处理指令 。
三、读程序写结果 //后有详解
1.以下程序运行后,如果输入的是1 2 3 4 5 0<回车>,输出结果为: 24689 #include
scanf(“%d”,&s);
while(s>0) {switch(s)
{default :printf(“%d”,s+4);break;
case 1:printf(“%d”,s+1); break; case 2:printf(“%d”,s+2);break; case 3:printf(“%d”,s+3); }
scanf(“%d”,&s); } }
2. 写出下列程序结果: n=9
#include
char s[]=\int i,n=0;
for(i=0;s[i]!=’\\0’;i++) if(s[i]>='0'&&s[i]<='9') n++; printf(\}
3.有以下程序程序的执行结果是: CdEfGh
#include
{ char b,c; int i;
b='C';c='c'; for(i=0;i<6;i++) {if(!(i%2)) putchar(i+b); else
putchar(i+c);} printf(\
}
4.以下程序执行后输出结果是: k=11,s=16
#include
for(k=2, s=1; k<20; k+=3)
if (s>k) break ; else s+=k;
printf(\}
5.运行下面的程序段,输出结果是 d56def 。 int i=0;
char s1[10]=\; strcat(s1,s2); while (s1[i++]!='\\0') s2[i]=s1[i]; puts(s2);
6.运行下面的程序段,输出结果是 2, 3, 1 。 #include
{int x, y, z; x=y=1;
z=x++,y++,++y;
printf(\,%d,%d\\n\,x,y,z); }
7.运行下面的程序段,输出结果是 1,0,0,1 。 #include
{ int a=0,b=0,c=0,d=0; (a++ && b++) ? c++ : d++; printf(\}
8.运行下面的程序段,输出结果是 0,-1 。 #include
{ int a=-1, b=-1; while(++a) ++b;
printf(\}
9.运行下面的程序段,输出结果是 -1 。 #include
printf(\ }
程序执行后的输出结果是( A ) A. y=-1 B. y=0
C. y=1
D. while构成无限循环
10.运行下面的程序段,输出结果是 7.5 。 #include
printf(\ return 0; }
11.运行下面的程序段,输出结果是 6,6,1 。 #include
{ int a=6, b=0, c=0; for ( ;a&&(b==0); )
{ b += a; a -= c++; } printf(\ }
则程序的输出结果是 A) 5,6,0
B) 6,0,0
C) 6,6,1
D) 5,6,1
12.运行下面的程序段,输出结果是 1,3,3 。 #include
{ int a=1,b=2,c=3,d=0; if (a==1 && b++==2) if (b!=2||c--!=3)
printf(\
else printf(\ else printf(\}
13.运行下面的程序段,输出结果是 2,2,2,4 。 #include
{ int a=1,b=2,c=3,d=4; if ((a=2) || (b=1)) c=2; if ((c==3) && (d=-1)) a=5; printf(\ }
14.运行下面的程序段,输出结果是 5,1,2,-1 。 #include
{ int a=1,b=2,c=3,d=4; if ((a=2) && (b=1)) c=2; if ((c==3) || (d=-1)) a=5; printf(\
}
15.以下程序运行后的输出结果是: 817 。
func(a,b) int a,b;
{ static int m=0,i =2; i+=m+1;m=i+a+b;return(m); } main()
{ int k=4,m=1,p;
p=func(k,m); printf(“%d”,p); p=func(k,m); printf(“%d\\n”,p); }
16. 设从键盘上输入 Hello World! 下面程序的运行结果为 hello world ! 。
#include
for( i=0; ss[i]!='\\0'; i++)
if( ss[i]>='A' && ss[i]<='Z') ss[i] = ss[i]+32 ; puts(ss);
} 17.下面程序的运行结果为 6, 45
2, 98
#include
{ int a[10]={78,89,98,66,54,76,45,82,62,95 }; int ka, ki, j; ka = ki = 0; for(j=1; j<10; j++) {
if ( a[ki]>a[j] ) ki=j ; if (a[ka] } printf(“%d, %d\\n %d, %d\\n”, ki, a[ki], ka, a[ka] ); } 18. 下列程序段的输出是 (*#*#) 。 main(){ int k; for(k=1; k<5; k++) { if(k % 2) printf(\; else continue; printf(\; } } 四、程序填空 1.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘了多少个桃子 #include (1) peach=1 ;//存放桃子数的变量赋初值 (2) day=9 ;//存放天数的变量赋初值 while(day>0) (3){ peach=2*(peach+1 ) ;//计算桃子数 (4) day-- ;//天数变化 } printf(“total peaches= %d\\n”,peach); } 2. 求1!+2!+3!+4!+?+20! #include (5){float s=0 ,t=1; //定义存放和的变量并赋初值 int n; for(n=1;n<21;n++) { t=t*n; (6) s=s+t ;//求除乘之和 } printf(“1!+2!+3!+4!+?+20!=%e\\n”,s); 3.输出圆面积,面积大于100时停止。 #include (7) int r ;//定义整型变量r for(r=1;r<=10;r++) {area=PI*r*r; (8) if(area>100)break; ;}//如果面积超过100则提前结束循环 printf(\} 4.斐波那契数列的第1项和第2项都是1。下面的程序用来计算并输出斐波那契数列1,1,2,3,5,8,13,21,...第9项的值,请选择正确答案填入程序空白处。 1,i??2?斐波那契数列的构成规律:f(i)?? f(i?1)?f(i?2),i?2? #include (9) long fib( int g ) //函数的整型形参声明 {switch(g) {case 0: return 0; case 1: (10) case 2: return 1 ; //数列的1、2项*/ } (11) return ( fib(g-1) +fib(g-2) ) //数列的其余各项 } main() {long int k; (12) k= fib(9) ; //数列的第9项 printf(\,k); } 5.下面的程序的功能是输出300~500之间所有素数。本程序中利用自定义函数prime()判断一个整数是否为素数(如果整数x不能被2~x-1之间的任意一个数所整除,则x是素数)。要 求每行输出11个素数。 #include (13) int prime(int m); //函数的原型声明 void main() {int k, s=0; (14)for(k=300;k<=500;k++) //判断300~500之间的每一个素数 if (prime(k)) { printf(\ s++; (15) if( s= =0 ) //每行输出11个素数 printf(\ } printf(\} int prime(int m) {int i; for(i=2;m%i!=0;i++); (16)return( m==i );} //返回函数的值 6. 斐波那契数列的第1项和第2项都是1。下面的程序用来计算并输出斐波那契数列1,1,2,3,5,8,13,21,...等20项的值,请将正确答案填入程序空白处。 #include int fib[20]= {1,1} ; //初始化前两项 for (i=2;i<20;i++) fib[i] = fib[i-1] + fib[i-2] ; // 第i项的值 for (i=0;i<20;i++) { if ( (i+1)%5= =0&&i!=0 ) //每行五个元素,然后换行 printfr(‘\\n’); printf(″d″,fib[i]) } /*for循环结束*/ } /*程序结束*/ 7. 下面的程序的功能是求出任意两个数的和,并输出。本程序中利用自定义函数add()进行两个数和的求解。 # include float add(float x, float y); /*对被调用函数add的声明*/ void main() { float a,b,c; scanf(“%f %f”, &a, &b) ; // 输入两个数,并保存在变量a和b中 c=float add(a,b) ; // 调用add函数,并将结果保存在c中 printf("sum is %f \\n",c); } float add(float x,float y) /*函数首部*/ { float z; /*函数体*/ z=x+y; return z ; //函数值的返回 } 五、判断题 1.C语言中主函数的名字不一定用main表示。× 2.C语言是一种典型的解释型高级程序设计语言。√ 3.enum a {one=9,two=-1,three};是正确的枚举类型定义。× 4.若int x,y;,则执行以下语句:x+=y; y=x-y; x-=y;的功能是交换变量x和y的值。√ 5.若有声明int (*func1)(int,int);则func1是指向返回值为整型且有两个整型形参的函数的指针。√ 6.C语言可以使用字符数组或字符指针处理字符串。√ 7.在一个C源程序文件中,若要定义一个允许其他源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是static。× 8.静态局部变量离开所在函数,其占用的存储空间将释放。×。所在函数的模块没有被释放掉的情况下,这个静态变量为上次调用的值。 9.如果函数的形参与实参的类型不一致,以实参类型为准。×,同于形参=实参,按左边的为准 10.完成编译预处理的工作是在编译前完成的。√ 11.C程序中用到的所有数值型数据都是精确表示的。× 12.C程序中的静态存储类别变量和外部变量的初始化是在编译阶段完成的。√ 13.C语言中所有的逻辑运算符优先级都是相同的。×,逻辑运算符分三种优先级 14.若有定义int a[7]={2,3,5,7};则数组元素a[5]的值为0。√ 15.在C语言中,将按变量地址存取变量值的方式称为“直接访问”方式。√ 16.按函数在程序中出现的位置来分,可以有三种函数调用方式,分别是函数语句、函数表达式和函数参数。√ 17.如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。√ 18.若字符数组a[20]中存放着一个字符串,且a[10]=’\\0’,函数strlen(a)的值为10。× Strlen()并不包含\\0,并且遇到\\0就返回长度值,所以应该返回9 19.若有变量定义char x;short int y;,则表达式x+y的值为double。×int型 20.设a、b和h分别是梯形的上、下底和高,有定义double a,b,h;利用公式(1/2)*(a+b)*h不能正确计算出此梯形的面积。× 21. C语言中,%运算符要求参加运算的运算对象必须为整数。√ 22. C语言优先级最低的运算符是逗号运算符。√ 23. 若定义int n=10; 则用int a[n]; 定义一维数组是合法的。×//数组下表只能是表达式和常量 24. C语言中,函数既可以嵌套定义,又可以嵌套调用。×,不可以嵌套调用 25. 用数组元素作函数实参时,是将实参的值传递给形参,采用“值传递”方式。√ 26. 在局部变量的作用范围内,如果全局变量与局部变量同名,则全局变量有效,局部变量被屏蔽。×,全局变量无效 27. C语言中的寄存器变量,用关键字register声明。√ 28.全局变量的作用域是从变量的定义处开始,到本程序文件的末尾。√ 29. 加static声明的外部变量存放在静态存储区,不加static声明的外部变量存放在动态存储区。×无论是加static的外部变量还是不加static的外部变量都是存放在静态存储区 30. 数组名不代表整个数组,只代表数组首元素的地址。√ 六、编写程序 1.计算数列 2358,,,?的前20项和,并输出运算结果。 12352.采用do??while语句实现计算并输出s=1+2+3+??+100 3. 求100?200间的全部素数。要求编写一个判断一个整数是否为素数的函数,并在main函数中调用该函数,每个数占5列宽度,每行输出7个素数。 4.已知百分制成绩(由键盘输入),要求计算并输出五分制成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80?89分为‘B’,70?79分为‘C’、‘60?69分为D’、60分以下为‘E’(请用if语句实现)。 5. 已知百分制成绩(由键盘输入),要求计算并输出五分制成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80?89分为‘B’,70?79分为‘C’、‘60?69分为D’、60分以下为‘E’(请用switch语句实现)。 6.请编写程序,其功能是:计算并输出S?1?1?2?3?5??的前20项之和 23587.编写程序,其的功能是:计算并输出下列级数的和。其中,变量n的值由键盘输入。 S?1111?????1*22*33*4n(n?1) 例如,当n=10时,函数值为0.909091。 8.请编写函数fun,其功能是:计算并输出下列多项式值: 11111S?(1?)?(?)???(?)2342n?12n 9. 编程序应用选择法实现对17个整数按照从大至小的顺序排序。 10. 编程序,应用冒泡法对通过键盘输入17个整数按照从大到小的顺序排序,并输出排序前后的数据。 11. 编程实现计算分段函数的值。 x?7x??5??x2?5x?2?5?x?2?y??32x?3x?52?x?10?43?x?10x?7x?3x?10 ? 填空题详解: 第10题:表达式(int)((double)9/2)-9!.(double)9 强制转化为双精度 的值是____3____ 2. (double)9 / 2 为小数除以整数,结果为小数,为4.5 3. (int) ( (double)9/2 ) 即(int) (4.5),强制转化为整型,结果为 4 4. (9)%2 取余数,结果为1 5. 4 -1 结果为3 第25题:25.若有定义语句:int x=5;,则表达式x+=x-=x*x的值为 -40 。 先计算x*x = 5*5 =25,存入临时变量 x还是5 再执行 -= 操作, x-= 25, 执行 x= 5-25 = -20 再执行+= 操作, x+=-20, 执行 x=-20-20 = -40 结果 x 变为 -40 32.函数调用语句:fun( ( exp1, exp2 ), ( exp1, exp2, exp3) ); 含有的实参个数是 2 。 :分别是exp2和exp3. 逗号表达式,它将以逗号为界,从左到右计算每个表达式的值,最后返回最右边的表达式的值 3.1 #include 1 scanf(“%d”,&s); ○ while(s>0) {switch(s) 9○10 {default :printf(“%d”,s+4);break; ○ 3 case 1:printf(“%d”,s+1); break; ○5 case 2:printf(“%d”,s+2);break;○7 case 3:printf(“%d”,s+3); ○ } 2○4○6○8○9 scanf(“%d”,&s); ○ } } 1输入1 2 3 4 5 0 ○ 2读入s=1,s>0 ○3输出s+1;即2 ○ 4读入s=2;s>0 ○5输出s+2;即4 ○ 6读入s=3;s>0 ○7输出s+3;即6 ○ 8读入s=4;s>0 ○9输出s+4;即8 ○ 9读入s=5;s>0 ○10输出s+4;即9 ○ 3.2 #include char s[]=\int i,n=0; for(i=0;s[i]!=’\\0’;i++) //用以计算字符串中数字的个数, if(s[i]>='0'&&s[i]<='9') n++; //字符串中一共有9个数字,即n=9; printf(\} 3.3 #include { char b,c; int i; b='C';c='c'; for(i=0;i<6;i++) {if(!(i%2)) //当i等于偶数时执行输出i+b putchar(i+b); else //反之,输出i+c; putchar(i+c); } printf(\} 3.4 #include 3○5○7 for(k=2, s=1; k<20; k+=3) ○ 8 if (s>k) break ; ○2○4○6 else s+=k; ○ printf(\} 1k=2,s=1 ○2s+=2,即s=3 ○ 3k=2<20;k+=3,即k=5 ○4s+=5,即s=8 ○ 5k=5<20;k+=3,即k=8 ○6s+=8,即s=16 ○ 7k=8<20;k+=3,即k=13 ○8 s>k break结束循环 ○ 输出结果 结果 k=11,s=16 3.5 int i=0; char s1[10]=\; 1 strcat(s1,s2); ○ 2○4○6○8○10○12○14 while (s1[i++]!='\\0') ○3○5○7○9○11○13 s2[i]=s1[i]; ○ puts(s2); 1将s2加到s1末尾,即s1:“456def” ○ 2s1[0]=4,s1[0]!='\\0'成立,i=1 ○3 s2[1]=s1[1],s2[1]=5,即s2:“d5f” ○ 4s1[1]=5,s1[1]!='\\0'成立,i=2 ○5 s2[2]=s1[2],s2[2]=6 即s2:“d56” ○ 6s1[2]=6,s1[2]!='\\0'成立,i=3 ○7 s2[3]=s1[3],s2[3]=d 即s2:“d56d” ○ 8s1[3]=d,s1[3]!='\\0'成立,i=4 ○9 s2[4]=s1[4],s2[4]=e 即s2:“d56de” ○ 10s1[4]=e,s1[4]!='\\0'成立,i=5 ○11 s2[5]=s1[5],s2[5]=f 即s2:“d56def” ○ 12s1[5]=f,s1[5]!='\\0'成立,i=6 ○13 s2[6]=s1[6],s2[6]=’\\0’ 即s2:“d56def\\0” ○ 14s1[6]=’\\0’,s1[6]!='\\0'不成立; ○ 输出字符串s2:“d56def\\0” 3.6 #include {int x, y, z; x=y=1; z=x++,y++,++y; //逗号运算符运行级别最低,按从左到右执行。z=x++=1,x=2,y=3 printf(\,%d,%d\\n\,x,y,z); } 3.7 #include { int a=0,b=0,c=0,d=0; (a++ && b++) ? c++ : d++; /* a++表达式值为0造成&&短路,b++不执行,a=1 (a++ && b++)表达式为假,执行d++,d=1 */ printf(\} 3.8 #include { int a=-1, b=-1; while(++a) //++a表达式值为0,不进行循环,a=0 ++b; printf(\} 3.9 #include ; //此处循环为空循环,当y--表达式为0时,跳出循环;y=-1. printf(\ } 3.10 #include printf(\ return 0; } 3.11 #include { int a=6, b=0, c=0; 1○4 for ( ;a&&(b==0); ) ○ //将a+b替代x再计算3.5*a+b*a+b = 7.5 { 2 b += a; ○3 a -= c++;○ } printf(\ } 16&&(0==0)为真,进入循环. ○ 2b=0+6=6 ○3a=6-c++=6-0=6, c=1 ○ 46&&(6==0)为假,跳出循环,输出结果。 ○ 3.11 #include main() { int a=1,b=2,c=3,d=0; 1(1==1 && 2==2) 成立,b=3,执行语句 ○2 if (a==1 && b++==2) //○ 23!=2 表达式为真,造成||短路,执行语句○3. if (b!=2||c--!=3) ○ printf(\ else 3 printf(\○ else printf(\ } 3.12 #include { int a=1,b=2,c=3,d=4; if ((a=2) || (b=1)) //a=2表达式为真,造成||短路,即不对b赋值1。 c=2; if ((c==3) && (d=-1) //2==3假.造成&&短路,即不对d赋值-1. a=5; printf(\ } 3.13 #include { int a=1,b=2,c=3,d=4; 1 if ((a=2) && (b=1)) //a=2真,b=1真,执行语句○ 1 c=2; ○ 2 if ((c==3) || (d=-1)) //2==3假 d=-1 真,执行语句○ 2 a=5; ○ printf(\ } 3.14 func(a,b) int a,b; { static int m=0,i =2; 2○5 i+=m+1;○3 m=i+a+b;○ return(m); } main() 1 { int k=4,m=1,p;○ 4 p=func(k,m); ○ printf(“%d”,p); 6 p=func(k,m); ○ printf(“%d\\n”,p); } 1k=4,m=1 ○2i=i+m+1=2+0+1=3 ○3m=3+4+1=8 ○4p=8,输出 ○ 5i=i+m+1=3+8+1=12 ,m=12+4+1=17○6p=17,输出. ○ 3.16 #include gets(ss); for( i=0; ss[i]!='\\0'; i++) if( ss[i]>='A' && ss[i]<='Z') //将大写字母替换为对应的小写字母 ss[i] = ss[i]+32 ; puts(ss); } 3.17 #include { int a[10]={78,89,98,66,54,76,45,82,62,95 }; int ka, ki, j; ka = ki = 0; for(j=1; j<10; j++) { if ( a[ki]>a[j] ) ki=j ; // a[ki]存储的是最小值 if (a[ka] printf(“%d, %d\\n %d, %d\\n”, ki, a[ki], ka, a[ka] );//2,98,6,45 } 6.1 # include 6.2 /* 2.采用do??while语句实现计算并输出s=1+2+3+??+100 */ # include int i,s; i=100; s=0; } do{ s+=i; }while(i--); printf(\结果为%d\\n\return 0; 6.3 /* 3. 求100?200间的全部素数。要求编写一个判断一个整数是否为素数的函数,并在main函数中调用该函数,每个数占5列宽度,每行输出7个素数。 */ # include int i, s=0; for( i = 100; i <= 200; i++) if( prime(i) ) { } printf(\s++; if(s % 7 == 0) printf(\ return 0; int prime(int n) { } 6.4 /* 4.已知百分制成绩(由键盘输入),要求计算并输出五分制成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为‘A’,80~89分为‘B’,70~79分为‘C’、‘60~69分为D’、60分以下为‘E’(请用if语句实现)。 */ # include int main(void) { float score; printf(\请输入分数: \scanf(\ if( score >=90 ) printf(\int i; for( i=2; n % i != 0; i++) ; //空循环 return ( n == i ); else if (score >= 80) printf(\ } else if (score >= 70) printf(\ else if (score >= 60) printf(\ else printf(\ return 0; 6.5 /* 5. 已知百分制成绩(由键盘输入),要求计算并输出五分制成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为‘A’,80?89分为‘B’,70?79分为‘C’、‘60?69分为D’、60分以下为‘E’(请用switch语句实现)。 */ # include int main(void) { float score; printf(\请输入分数: \scanf(\ switch( (int)score / 10 ) { case 10: case 9: printf(\ } } case 8: printf(\ case 7: printf(\ case 6: printf(\ default: printf(\ return 0; 6.6 # include int i; float temp, a, b, s; a = 2; b = 1; s = 1; for(i=0; i<20; i++) { } s += b / a; temp = a; a += b; b = temp; printf(\结果为%.4f\\n\ return 0; } 6.7 # include printf(\请输入变量n: \ scanf(\ s = 0; for( i=1; i <= n; i++) { s += 1 / ( (i + 1) * (float)i ); // } printf(\结果为%f\\n\ return 0; } 6.8 # include int main(void) 强制转换 { } double fun(int n) { } 6.9 #include printf(\请输入原始数据:\\n\ for(i=0;i {printf(\ printf(\排序前的数据如下所示:\\n\ for(i=0;i double s; int i; s=0.0; for(i=1; i<=n; i++) { } return s; s +=1.0 /(2*i-1) - 1.0 /(2*i) ; int n; double sum; printf(\请输入变量n: \scanf(\sum = fun(n); printf(\结果为: %f\ for(i=0;i for(j=i+1;j } printf(\排序后的数据如下所示:\\n\ for(i=0;i 10.编程序,应用冒泡法对通过键盘输入17个整数 按照从大到小的顺序排序,并输出排序前后的数据 */ # include void maxtomin(int [], int n); int main(void) { int a[N]; int i,j,temp; printf(\输入%d个整数,空格隔开:\\n\ return 0; } for( i=0; i scanf(\ for( i=0; i for( j=0; j if( a[j] < a[j+1] ) { } temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; printf(\结果为:\\n\for(i=0; i printf(\ return 0; 6.11 # include int fun(int); int main(void) { } int fun(int x) int x; printf(\输入x的值: \scanf(\ printf(\结果为: %d\\n\ { } 1○2○3○4○5○6○7○8○9○10○11○12○13○14 ○int sum; if(x<= -5) sum = x + 7; else if(x<=2) sum = x * x + 5 * x - 2; else if(x<=10) sum = x * x * x + 3 * x * x - 5; else return sum; sum = x * x * x * x - 10 * x * x * x + 7 * x + 3;