C程序设计复习题集 目 录
一、C语言程序设计复习题
⒈ 单项选择题 ??????????????????? 41 ⒉ 填 空 题 ??????????????????? 45 ⒊ 写输出结果题 ??????????????????? 46 ⒋ 程序填空题 ??????????????????? 53 ⒌ 编 程 题 ???????????????????? 61 三、C语言程序设计复习题答案
⒈ 单项选择题 ???????????????????? 62 ⒉ 填 空 题 ???????????????????? 63 ⒊ 写输出结果题 ???????????????????? 63 ⒋ 程序填空题 ???????????????????? 64 ⒌ 编程题(参考) ???????????????????? 65
C程序设计习题集 1
C语言程序设计复习题
1 单项选择题
在每小题的四个备选答案中选出一个正确的,并将正确答案号码填在题后括号内。 1. 用C语言编写的源文件经过编译,若没有产生编译错误,则系统将( )。 A、生成可执行目标文件 B、生成目标文件 C、输出运行结果 D、自动保存源文件
2. 在C集成环境执行菜单命令“运行”,若运行结束且没有系统提示信息,说明( )。 A、源程序有语法错误 B、源程序正确无误
C、源程序有运行错误 D、源程序无编译、运行错误,但仅此无法确定其正确性 3. 程序运行输出了错误的结果,可以排除下列哪一个因素( )。
A、算法错误 B、运行时输入数据错误 C、未通过编译 D、系统资源配置不当 4. 下列各个错误中,属于编译错误的是( )。
A、数组下标超界 B、“==”误写为“!=” C、死循环 D、括号不配对 5. 若int类型数据字长为4,其最大值为( )。
A、2 B、2-1 C、2-1 D、2 6. 常数的书写格式决定了常数的类型和值,03322是( )。 A、16进制int类型常数 B、8进制int类型常数 C、10进制int类型常数 D、10进制long int类型常数 7.“e2”是( )。
A、实型常数100 B、值为100的整型常数 C、非法标识符 D、合法标识符 8. 要为字符型变量a赋初值,下列语句中哪一个是正确的( )。
A、char a='3'; B、char a=\、char a=%; D、char a=*; 9. 要为float类型变量x、y、z赋同一初值3.14,下列说明语句哪一个是正确的( )。 A、float x,y,z=3.14; B、float x,y,z=3*3.14; C、float x=3.14,y=3.14,z=3.14; D、float x=y=z=3.14; 10. 语句“float pi=3.1415926535;”将( )。
A、导致编译错误 B、说明pi为初值3.1415926535的单精度实型常数 C、导致运行时的溢出错误 D、说明pi为初值3.141593的单精度实型常数 11. 算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为( )。 A、算术运算、赋值运算、关系运算 B、算术运算、关系运算、赋值运算 C、关系运算、赋值运算、算术运算 D、关系运算、算术运算、赋值运算 12. 关系运算符中优先级最低的运算符是( )。
A、“>=”和“<=” B、“>”和“<” C、“==”和“!=” D、“<=”和“<” 13. 逻辑运算符中,运算优先级按从高到低依次为( )。
A、&&,!,|| B、||,&&,! C、&&,||,! D、 !,&&,|| 14. 对C程序在作逻辑运算时判断操作数真、假的表述,下列哪一个是正确的( )。 A、0为假非0为真 B、只有1为真 C、-1为假1为真 D、0为真非0为假 15. 表达式 x==0&&y!=0||x!=0&&y=0等效于( )。
31
31
32
32
2 C程序设计习题集
A、x*y==0&&x+y!=0 B、x*y==0&&(x+y==0) C、x==0||y==0 D、x*y=0||x+y=0 16. 表达式!x||a==b等效于( )。
A、!((x||a)==b) B、!(x||y)==b C、!(x||(a==b)) D、(!x)||(a==b) 17. 下列格式符中,哪一个可以用于以8进制形式输出整数( )。 A、%d B、? C、%o D、%ld 18. 下列格式符中,哪一个可以用于以16进制形式输出整数( )。 A、d B、%8x C、?6 D、%d
19. a是int类型变量,c是字符变量。下列输入语句中哪一个是错误的( )。 A、scanf(\、scanf(\ C、scanf(\、scanf(\
20. 字符变量ch='A',int类型变量K=25,语句printf(\输出( )。 A、65,253 B、65 253 C、65,25 D、A 25 21. 下列各语句序列中,能够且仅输出整型变量a、b中最大值的是( )。 A、if(a>b) printf(\ B、printf(\ C、if(a>b) printf(\ D、if(a
22. 下列各语句序列中,能够将变量u、s中最大值赋值到变量t中的是( )。 A、if(u>s)t=u; t=s; B、t=s; if(u>s)t=u; C、if(u>s)t=s; else t=u; D、t=u; if(u>s)t=s; 23. 下列各语句中,能够输出整型变量a、b中最大值的是( )。
A、printf(\、(a>b)? printf(\ C、printf(\、printf(\24. 下列语句应将小写字母转换为大写字母,其中正确的是( )。
A、if(ch>='a'&ch<='z') ch=ch-32; B、if(ch>='a'&&ch<='z')ch=ch-32; C、ch=(ch>='a'&&ch<='z')?ch-32:''; D、ch=(ch>'a'&&ch<'z')?ch-32:ch; 25. 求整数1至10的和并存入变量s,下列语句中错误的是( )。
A、s=0;for(i=1;i<=10;i++) s+=i; B、s=0;i=1;for(;i<=10;i++) s=s+i; C、for(i=1,s=0;i<=10;s+=i,i=i+1); D、for(i=1;s=0;i<=10;i++) s=s+i; 26. 若sizeof(int)为2,计算1至10的乘积,下列语句序列中正确的是( )。 A、int jc=1; for(int i=2;i<=10;i++) jc*=i; B、for(float jc=1,int i=2;i<=10;i++,jc*=i); C、float jc=1; for(int i=2;i<=10;jc*=i,i=i+1); D、for(float jc=1;i=2;i<=10;i++) jc*=i;
27. 下列语句中,哪一个可以输出26个大写英文字母( )。
A、for(a='A';a<='Z';printf(\、for(a='A';a<'Z';a++)printf(\ C、for(a='A';a<='Z';printf(\、for(a='A';a<'Z';printf(\28. 与语句 while(i>=0&&i<=10) { if(i++==5)continue; printf(\ 功能相同的是( )。
A、for(;i>=0&&i<=10;i++) if(i!=5) printf(\
C程序设计习题集 3
B、for(;i>=0&&i<=10;i++) if(i==5) printf(\
C、for(;i>=0&&i<=10;i++) if(i!=5) printf(\ D、for(;i<=0&&i>=10;i++) if(i!=5) printf(\
29. 下列语句中与语句 while(1){if(i>=100)break;s+=i;i++;} 功能相同的是( )。 A、for(;i<100;i++) s=s+i; B、for(;i<100;i++;s=s+i); C、for(;i<=100;i++) s+=i; D、for(;i>=100;i++;s=s+i); 30. 下列各语句定义了数组,其中哪一个是不正确的( )。
A、char a[3][10]={\、int x[2][2]={1,2,3,4}; C、float x[2][]={1,2,4,6,8,10}; D、int m[][3]={1,2,3,4,5,6}; 31. 下列各语句定义了数组,其中哪一个是正确的( )。
A、char a[10],*p=a[0] B、int d[2][]={1,2,3,4,5,6}; C、float x[][3]={1,2,4,6,8,10}; D、int m[][]={\32. 数组定义为 int a[3][2]={1,2,3,4,5,6},下列表述中正确的是( )。 A、数组元素a[3][2]的值为6 B、数组元素a[6]的值为6 C、数组元素a[0]的值为1 D、a[0]不是int类型的数组元素 33. 用宏名定义一个字符串,下列表述中哪一个是正确的( )。 A、#define pi=3.14159; B、define pi=3.14159 C、#define pi \、#define pi(3.14159);
34. 定义带参数的宏计算两式乘积(如x+3·x-5与x-6),下列定义中哪个是正确的( )。 A、#define muit(u,v) u*v B、#define muit(u,v) u*v; C、#define muit(u,v) (u)*(v) D、#define muit(u,v)=(u)*(v) 35. 宏定义 #define div(a,b) a/b 的引用 div(x+5,y-5) 替换展开后是( )。 A、x+5/y-5 B、x+5/y-5; C、(x+5)/(y-5) D、(x+5)/(y-5); 36. 定义带参数的宏“#define jh(a,b,t) t=a;a=b;b=t”,使两个参数a、b的值交换,下 列表述中哪个是正确的( )。
A、不定义参数a和b将导致编译错误 B、不定义参数a、b、t将导致编译错误 B、不定义参数t将导致运行错误 D、不必定义参数a、b、t类型 37. 下列语句定义p为指向float类型变量d的指针,其中哪一个是正确的( )。 A、float d,*p=d; B、float d,*p=&d; C、float *p=&d,d; D、float d,p=d; 38. 对语句“int a[10],*p=a;”,下列表述中哪一个是正确的( )。
A、*p被赋初值为a数组的首地址 B、*p被赋初值为数组元素a[0]的地址 C、p被赋初值为数组元素a[1]的地址 D、p被赋初值为数组元素a[0]的地址 39. p1指向某个整型变量,要使指针p2也指向同一变量,哪一个语句是正确的( )。 A、p2=*&p1; B、p2=**p1; C、p2=&p1; D、p2=*p1; 40. 假如指针p已经指向变量x,则&*p相当于( )。
A、x B、*p C、&x D、**p 41. 假如指针p已经指向某个整型变量x,则(*p)++相当于( )。 A、p++ B、x++ C、*(p++) D、&x++ 42. 数组定义为“int a[4][5];”,引用“a+3”表示( )。
A、a数组第4列的首地址 B、a数组第1行第4列元素的值
2
4 C程序设计习题集
C、a数组第4行的首地址 D、a数组第1列第4行元素的值 43. 数组定义为“int a[4][5];”,引用“a[1]+3”表示( )。
A、a数组第2行第4列元素的地址 B、a数组第2行第4列元素的值 C、a数组第4行的首地址 D、a数组第1行第4列的首地址 44. 数组定义为“int a[4][5];”,引用“*(*a+1)+2”表示( )。 A、a[1][0]+2 B、a数组第1行第2列元素的地址 C、a[0][1]+2 D、a数组第1行第2列元素的值 45. 数组定义为“int a[4][5];”,下列哪一个引用是错误的( )。 A、*a B、*(*(a+2)+3) C、&a[2][3] D、++a
46. 共用体定义为“union data {char ch;int x;} a;”,下列哪一个是正确的( )。 A、a.ch='x';a=10; B、a='x',10; C、a.x=10;a.ch='x'; D、a='x'; 47. 共用体定义为“union data {char ch;int x;} a;”,下列哪一个是不正确的( )。 A、a={'x',10}; B、a.x=10;a.x++; C、a.ch='x';a.ch++; D、a.x=10;a.ch='x'; 48. 按位与运算:int a=7,b=12,c=a&b; 变量c的值是( )。 A、19 B、4 C、5 D、9 49. 按位或运算:int a=6,b=8,c=a|b; 变量c的值是( )。 A、2 B、14 C、48 D、-2 50. 按位异或运算:int a=14,b=15,c=a^b; 变量c的值是( )。 A、1 B、15 C、-1 D、29 51. 按位取反运算:int a=16,c=~a;,变量c的值是( )。 A、17 B、7 C、84 D、-17 52. 左移运算:int a=16,c=a<<2; 变量c的值是( )。 A、67 B、4 C、1 D、64 53. 右移运算:int a=16,c>>2; 变量c的值是( )。 A、8 B、1 C、4 D、64
54. 以“只读”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(\、fp=fopen(\ C、fp=fopen(\、fp=fopen(\55. 以“追加”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(\、fp=fopen(\ C、fp=fopen(\、fp=fopen(\56. 为读写建立一个新的文本文件a:\\aa.dat,下列语句中哪一个是正确的( )。 A、fp=fopen(\、fp=fopen(\ C、fp=fopen(\、fp=fopen(\
C程序设计习题集 5
2 填空题
1. 设float x=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 的值为 。 2. 设 int x=17,y=5; 执行语句 x+=--x%--y 后x的值为 。 3. 设 int x=17,y=5; 执行语句 x%=x++/--y 后x的值为 。
4. 设 int a=7,b=6,c=5;,表达式 (a+b)>(c*c)&&b==c||c>b 的值为 。 5.设 int a=3,b=5,c=7;,表达式a>c||c>b!=0&&c==b+a 的值为 。 6.已知三角形边长a、b、c和s=(a+b+c)/2,计算其面积的算术表达式为 。 7. 方程ax+bx+c=0系数a、b、c且存在两个实根,计算其中一个实根的算术表达式为 。
8. p为本金,r为1年期存款年利率,计算存款p元5年到期时本金、利息总和(计复利)的算术表达式为 。
9.将数学式 (x+1)e 写作算术表达式为 。 10.ch是字符变量,判断ch为大写英文字母的逻辑表达式为 。 11. 判断int类型变量n是否为两位整数的逻辑表达式为 。 12. 判断变量a、b的值均不为0的逻辑表达式为 。 13. 判断变量a、b是否绝对值相等而符号相反的逻辑表达式为 。 14. 判断变量a、b中必有且只有一个为0的逻辑表达式为 。 15. m是值为两位数的整型变量,判断其个位是奇数而十位数是偶数的逻辑表达式为 。 16. 求解赋值表达式 a=5+(c=6)后表达式值、a、c的值依次为 。 17. 求解赋值表达式 a=(b=10)%(c=6),表达式值、a、b、c的值依次为 。 18. 求解逗号表达式 x=a=3,6*a后,表达式值、x、a的值依次为 。 19. 求解逗号表达式 (a=15,a*4),a+5,表达式值、a的值依次为 。 20. 求变量a、b中最大值的条件表达式为 。
21. 若 a=13、b=25、c=-17,条件表达式 ((y=(a='a'&&s<='z')?s-32:s; 字符变量s的值为 。 23. 整型变量x的值为25,语句\的输出结果为 。 24. 整型变量m的值为27,语句 printf(\的输出结果为 。 25. 语句printf(\的输出结果为 。
26. 若int k=10, 循环语句while (k=0) k=k-1; 执行 次。
27.若int k=2, 循环语句while (k!=0) { printf(\执行 次。 28. 若int i=10,s=0;,执行语句while(s+=i--,--i);后s、i值分别为 。 29. 语句for(int s,i=1;i<=100;s+=i,i++); 能否计算1~100的和?原因是 。 30. 若int类型变量字长为2,程序段 int jc=1; for(int i=2;i<10;i++)jc*=i; 能否计算10的阶乘? 原因是 。
31. 定义a为共有10个元素的静态存储int类型数组的语句为 。 32. 定义a为长度为10的字符串、同时为字符串赋初值\的语句为 。 33. 定义a为共有5个元素的一维整型数组、同时定义p为指向a数组首地址的指针变量的语句为 。
34. 定义a为4行5列的整型数组、同时定义p为指向a数组首地址的指针变量的语句为 。 35. 如定义语句为“char a[]=\”,
2x
2
6 C程序设计习题集
语句\的输出结果为 。 36. 定义语句为 char a[15],b[]=\,则语句 printf(\ 的输出结果为 。
37. 定义 char a[]=\,语句 printf(\输出 。 38. 定义 char a[10]=\,语句\输出结果为 。 39. 定义 char a[]=\,语句 printf(\输出 。 40. 定义 char a[]=\,
执行for(int i=0;*p!='\\0';p++,i++); 后i的值为 。
41. 宏定义 #define f(x,y) printf(x,y) 的引用 f(\置换展开后为 。 42. 宏定义 #define f(x,y) fopen(x,y) 的引用 f(\置换展开后为 。 43. 宏定义 #define f(c) c>='A'&&c<='Z' 的引用 f(x[i]) 置换展开后为 。 44.表达式 3&5、3|5、3||5 的值分别为 、 、 。
45.设 int x=707,表达式 x^x、x|x、~x^x 的值分别为 、 、 。
46.设 int x=0707,表达式 ~x&&x、!x&&x、x>>3&~0的值分别为 、 、 。 47. 函数的参数为int类型时,虚参与实参结合的传递为 。 48. 函数的参数为float类型时,虚参与实参结合的传递为 。 49. 函数的参数为char* 类型时,虚参与实参结合的传递为 。 50. 函数的实参为常量时,虚参与实参结合的传递为 。 51.对下列递归函数,函数调用f(3)的返回值是 。 int f(int n) { return((n==0)?1:f(n-1)+2);}
52.函数f定义如下,调用f(\的返回值为 。 int f(char *s) { int k=0; while(*s) k+=*s++-'0'; return k;}
53. 函数change定义如下,a=10、b=5,执行 change(a,b)后a、b的值分别为 。 void change(int a,int b) { int t=0; t=a; a=b; b=t;}
54. 开辟一个存储n个int数据的内存区、并将内存区首地址送入p(指向int类型的指针变量)的语句为 。
55.释放由p所指向的内存区的语句为 。
56.fp为文件位置指针,将fp移到离当前位置25个字节处的语句为 。
C程序设计习题集 7
3 写输出结果题
1. #include
{ char ch; int k=0;
for(ch='A';ch<'H';ch++,k++) if(k%2==0) printf(\ printf(\
} 输出结果: 2. #include
switch (c++) {
case 'A': k++; break; case 'B': k--;
case 'C': k+=2; break; case 'D': k=k%2; break; case 'E': k=k*10; break; default: k=k/3; } k++;
} while(c<'G');
printf(\
} 输出结果: 3. #include
{ int a[6]={12,4,17,25,27,16},b[6]={27,13,4,25,23,16},i,j; for(i=0;i<6;i++) {
for(j=0;j<6;j++) if(a[i]==b[j])break; if(j<6) printf(\ }
printf(\
} 输出结果:
4. #include
{ int a[8]={1,0,1,0,1,0,1,0},i;
for(i=2;i<8;i++) a[i]+=a[i-1]+a[i-2]; for(i=0;i<8;i++) printf(\ printf(\
} 输出结果: 5. #include
8 C程序设计习题集
void main()
{ int s=1,t=1,a,n; scanf(\ for(int i=1;i t=t*10+1; s=s+t; 输入数据:2,4 } s*=a; printf(\输出结果: } 6. #include #define PR(x,y) printf(\ void main( ) { int x=3,y=2,z=1; 输出结果: PR(\ PR(\ PR(\ } 7. #include { int a[5]={2,4,6,9,12},b[6]={2,3,4,6,8,9}; for(int i=0;i<5;i++) for(int j=0;j<6;j++) if(*(a+i)==*(b+j)) printf(\ printf(\ } 输出结果: 8. #include void main() 输出结果: { char str1[]=\ for(int i=0;i<4;i++) { printf(\ str1[i]=' '; str1[strlen(str1)-1]='\\0'; } } 9. #include { char a[5][8]; 输出结果: for(int i=0;i<5;i++) for(int j=0;j<8;j++) if(i==0||i==4) a[i][j]='-'; else a[i][j]=' '; for(i=1;i<4;i++){ a[i][0]='|'; a[i][5]='|'; } for(i=0;i<5;i++) a[i][6]='\\0'; for(i=0;i<5;i++) printf(\ } C程序设计习题集 9 10. #include { char a[8],temp; int i,j; 输出结果: for(i=0;i<7;i++) a[i]='a'+i; for(i=0;i<3;i++) { temp=a[0]; for(j=1;j<7;j++) a[j-1]=a[j]; a[6]=temp;a[7]='\\0'; printf(\ } } 11. #include void main() 输出结果: { int i,j,n; for(i=0;i<4;i++) { for(j=1;j<=i;j++) printf(\ n=7-2*i; for(j=1;j<=n;j++) printf(\ printf(\ } } 12. #include { char a[8],temp; int j,k; for(j=0;j<7;j++) a[j]='a'+j; 输出结果: a[7]='\\0'; for(j=0;j<3;j++) { temp=a[6]; for(k=6;k>0;k--) a[k]=a[k-1]; a[0]=temp; printf(\ } } 13. #include void main() { print(3,'*',1); print(2,'*',3); print(1,'*',5); print(2,'#',3); print(2,'#',3); } void print(int begin,char pzf,int n) { char a[50]; for(int i=0;i 10 C程序设计习题集 a[begin+i]='\\0'; printf(\ } 14. #include void main() 运行时输入: 5 –7 3 { int a,b,c,find(int,int,int); scanf(\ printf(\输出结果: } int find(int a,int b,int c) { int u,s,t; u=((u=(a>b)?a:b)>c)? u:c; t=((t=(a 15. #include void fun1(int n,int a[][3]) 输出结果: { for(int i=0;i for(int j=0;j } void main() { int a[3][3]={{6,4,2},{8,6,4},{9,6,3}}; fun1(3,a); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) printf(\ printf(\ } } 16. #include if(m==2||m==3) return 1; 输出结果: if(m<2||m%2==0) return 0; for(i=3;i void main() { int n; for(n=1;n<10;n++) if(fun3(n)==1) printf(\ } C程序设计习题集 11 17. #include void sub(int *a,int *b,int *c,m,n) { int i,j; 输出结果: for(i=0;i for(j=0;j void main() { int i,x[5]={1,5,3,8,4},y[3]={9,-4,6},z[8]; sub(x,y,z,5,3); for(i=0;i<8;i++) printf(\ printf(\ } 18. #include void sort(char *a[],int n) 输出结果: { int i,j,l; char *temp; for(i=0;i if(strcmp(a[j],a[l])<0) l=j; if(l!=i){ temp=a[i]; a[i]=a[l]; a[l]=temp; } } } void main() { char *name[4]; int k; char ch[4][15]={\ for(k=0;k<4;k++) name[k]=ch[k]; sort(name,4); for(k=0;k<4;k++) printf(\ } 19. #include \ void pline(char *a,char c,int l,int n) { int i; for(i=1;i { char a[80]; int i; void (*pf)(char*,char,int,int); pf=pline; for(i=1;i<5;i++){ (*pf)(a,'$',5-i,2*i-1); puts(a); } } 12 C程序设计习题集 20. #include \ int binary(int x,int a[],int n) 输出结果: { int low=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2; if(x>a[mid]) high=mid-1; else if(x return -1; } void main( ) { static int a[]={4,0,2,3,1}; int i,t,j; for(i=1;i<5;i++) { t=a[i]; j=i-1; while(j>=0 && t>a[j]) { a[j+1]=a[j]; j--; } a[j+1]=t; } printf (\ } 21. #include #include { double f(double,int); printf(\ } double f(double x,int n) { double t; if(n==1) t=x; else { if(n/2*2==n)t=x*f(x,n/2); else t=x*pow(f(x,n/2),2.0); } return t; } 22. #include double x,u,v 输出结果: double t(double a,double(*f)(double)) { return(*f)(a*a); } double f(double x) { return 2.0*x; } double g(double x) { return 2.0+x; } void main() C程序设计习题集 13 { x=4.0;u=t(x,f);v=t(x,g); printf(\ } 23. #include { static struct s1{ char c[4],*s; }; s1={\ static struct s2{char *cp; struct s1 ss1;} s2={\ printf(\输出结果: printf(\ printf(\ printf (\ } 24. #include struct s1{ char *s; int i; struct s1 *s1p; }; void main() { static s1 a[]={{\ int i; for(i=0;i<2;i++) { 输出结果: printf(\ printf(\ } } 14 C程序设计习题集 4 程序填空题 1. 输入2个整数,输出它们的最小公倍数和最大公约数。 #include { int m,n,gbs,gys; scanf( ⑴ ); for(gbs=m; ⑵ ; gbs=gbs+m); gys= ⑶ ⑷ } 2. 输入N个实数,输出其中的最大值、最小值。 #include { float no1,nmax,nmin; ⑴ scanf(\ nmax=no1; ⑵ for(i=2;i<=n;i++) { scanf(\⑶ ); if(nox>nmax) nmax=nox; ⑷ } printf(\ } 3. 输入20个数,输出它们的平均值,输出与平均值之差的绝对值为最小的数组元素。 #include { float a[20],pjz=0,s,t; int i,k; ⑵ for(i=0;i<20;i++) pjz+=a[i]; ⑶ s=fabs(a[0]-pjz); for(i=1;i<20;i++) if(fabs(a[i]-pjz) 4. 输入若干字符,分别统计数字字符个数、英文字母个数,输入换行符时输出统计结果。 #include C程序设计习题集 15 { char ch; ⑴ while(( ⑵ )!='\\n') { if(ch>='0'&&ch<='9') s1++; if(ch>='a'&&ch<='z' ⑶ ) s2++; } ⑷ } 5. 输入m,求n使 n!<=m<=(n+1)!,例如输入726,应输出n=6。 ⑴ void main() { int ⑵ ; scanf( ⑶ ); for(n=2;jc<=m;n++) jc=jc*n; printf(\⑷ ); } 6. 下列程序计算并输出方程 X+Y+Z=1989 的所有整数解。 #include { ⑴ for(i1=-45;i1<=45;i1++) for( ⑵ ) for(i3=-45;i3<=45;i3++) if( ⑶ ) printf( ⑷ ,i1,i2,i3); } 7. 下列程序求n(n的值由运行时确定)个正整数的最小公倍数。 #include { int *p,i,n,gbs; ⑴ p= ⑵ ; for(i=0;i l1: for(i=1;i 8. 调用find函数求实参数组中最大值,再调用find函数求实参数组中最小值。 #include { float s,a[7]={2,6,3,8,3,12,9},find(float*,int,int); s=find(a,7,1); ⑴ 2 2 2 16 C程序设计习题集 ⑵ printf(\ } float find(float *p,int n,int flag) { int i; float t,fh; if(flag>=0) fh=1; else fh=-1; ⑶ for(i=1;i 9. 对数组按值从大到小的顺序排序后输出。 #include { float a[7]={2,6,3,8,3,12,9}; void sort(float*,int); ⑴ for(int i=0;i<7;i++) printf(\ printf(\ } void sort( ⑵ ) { int i,j,k; float t; for(i=0;i k=i; for(j=i+1;j 10. 下列程序读入时间将其加1秒后输出,格式为 hh: mm: ss,当小时等于24小时置为0。 #include struct { int hour, minute, second; } time; void main(void) { scanf(\⑴ ); time.second++; if( ⑵ ==60) { ⑶ time.second=0; if(time.minute==60) { time.hour++; time.minute=0; if( ⑷ ) time.hour=0; } } printf (\ } 11. 将编号从⑴到⑾的同学围成一圈,按下列顺序贺卡:⑴、⑶、⑹、⑻、⑾、⑵、⑸、⑺、⑽、⑴、⑷、??,计算至少发到第几张时,每位同学发到的贺卡数同样多。 #include C程序设计习题集 17 { int num=1,jg=2,ip=1,i,m[12]; for(i=1;i<12;i++) m[i]=0; while(1) { m[ip]++; num++; ip+=jg; if(ip>11) ⑴ if(jg==3) jg=2; else ⑵ for(i=2;i<=11;i++) if( ⑶ ) break; if( ⑷ ) break; } printf (\发到第%d张时每人手中贺卡数一样多\\n\⑸ ); } 12. 下列函数可以对一维数组按值从大到小或从小到大排序。 void sort(float *p,int n,int swich) { int fh,i,j,l; ⑴ if(swich==0) fh=-1; ⑵ ; for(i=0;i for(j=i+1; ⑶ ;j++) if(*(p+j)*fh> ⑷ ) l=j; t=*(p+i); *(p+i)=*(p+l); *(p+l)=t; } } 13. 下列函数用矩形公式求f(x)在[a,b]的定积分: 先M等份积分区间求得积分近似值,再2M等份求得积分近似值,再4M等份求得积分近似值,??,当两次积分近似值之差的绝对值小于eps时返回计算结果。 float sum(float a,float b,int m,float eps) { float h,s1=0,s2,x; ⑴ while(flag) { s2=0; x=a; h=(b-a)/m for(i=1;i<=m;i++) { s2+=(f(x)+f(x+h))*h/2; x=x+h; } ⑵ s1=s2; m=m*2; } ⑶ } 14. 下列函数输出一行字符:先输出kb个空格,再输出n个指定字符(由实参指定)。 #include void print( ⑴ ) { int i; for(i=1;i<=kb;i++) ⑵ 18 C程序设计习题集 for( ⑶ ) printf(\ ⑷ } 15. 下列函数求任意阶多项式 a0+a1X+a2X+...+anX 的值并返回多项式的值。 float sum( ⑴ ) { float y,t=1; ⑵ y=*a; for(i=1;i<=n;i++){ ⑶ y+=*(a+i)*t; } ⑷ } 16. 下列函数在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 #include void find( ⑴ ) { int k; ⑵ *max=*p; ⑶ for(k=1;k if( ⑷ ) *max=t; if(t<*min) *min=t; } } 17. 下列函数用于将任意方阵(行数等于列数的二维数组)转置。 void mt( ⑴ ) 如数组 1 11 -3 -2 { int i,j; float t; 2 3 4 5 for(i=0;i (a+i*n+j)=*(a+j*n+i); 1 2 7 4 ⑶ 11 3 -4 5 } -3 4 4 6 } -2 5 2 7 18.下列程序读入六个字符串,排序后输出。 #include void sort(char *a[],int n) { int i,j,l; char *temp; for(i=0;i 2 n C程序设计习题集 19 l=i; for(j=i+1;j void main() { char *name[6],ch[6][30]; int k; for(k=0;k<6;k++) ⑵ for(k=0;k<6;k++) gets(name[k]); ⑶ for(k=0;k<6;k++) puts(name[k]); } 19.输入若干个学生的姓名、学号、数学、英语、计算机成绩到文件中student.dat。 #include { ⑴ char name[8],numb[8]; ⑵ scanf(\⑶ for(i=1;i<=n;i++) { scanf(\ fprintf(fp,\ } ⑷ ; } 20 C程序设计习题集 5 编程题 1. 编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。 2.一个数如恰好等于它的因子之和,这个数就称为“完数”。编程序找出1000以内的所有完数,并输出其因子(6是一个\完数\,它的因子是1,2,3)。 3. 输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。 4. 输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素(如a[5]={2,3,4,5,6},b[6]={3,5,7,9,10,-1},则输出3、5)。 5. 编写函数,处理n行、n列的二维数组:将每一行的元素同除以该行上绝对值最大的元素。 6. 编写函数,求m行、n列的二维数组全体元素中负数的个数。 7. 编写函数,返回在一个整数组中出现次数最多的数及其出现次数。 8. 编写函数,在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 9. 编写函数,统计m行n列二维数组中有多少正数、多少个负数,多少个零,并返回统计结果。 10. 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。 11. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。 12. 编程,把文本文件d1.dat复制到d2.dat(其中大写英文字母要转换为小写字母)。 13. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。 14.已知顺序文件C.DAT 存放着程序设计基础的考试成绩,每个记录包含学号(8位字符)和成绩(三位整数)两个数据。编程,从文件中读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件SCORE60.DAT保存在A盘上,并显示出学生总人数(少于1000)、平均成绩和及格人数。 C程序设计习题集 21 C语言程序设计复习题答案 1 单项选择题 1. B 2. D 3. C 4. D 5. B 6. B 7. D 8. A 9. C 10. D 11. B 12. C 13. D 14. A 15. A 16. D 17. C 18. B 19. B 20. A 21. C 22. B 23. D 24. B 25. D 26. C 27. C 28. A 29. A 30. C 31. C 32. D 33. C 34. C 35. A 36. D 37. B 38. D 39. A 40. C 41. B 42. C 43. A 44. C 45. D 46. C 47. A 48. B 49. B 50. A 51. D 52. D 53. C 54. D 55. B 56. B 2 填空题 1. 2.5 2. 16 3. 2 4. 0 5.0 6.sqrt(s*(s-a)*(s-b)*(s-c)) 7. (-b+sqrt(b*b-4*a*c))/2/a 8. p*pow(1+r,5) 9.(x+1)*exp(2*x) 10.ch>='A'&&ch<='Z' 11. abs(n)>9&&abs(n)<100 12. a!=0&&b!=0 13. a==-b 14. a==0&&b!=0||b==0&&a!=0 15. m%2==1&&m/10%2==0 16. 11、11、6 17. 4、4、10、6 18. 18、3、3 19. 20、15 20. (a>b)?a:b 21. –17 22. 'D' 23. 31 24. m=1b 25. small 26. 0 27.2 28. 30、0 29. s未定义初值0 30. jc存放10!字长不够 31. static int a[10]; 32. char a[10]=\34. int a[4][5],*p=a[0]; 35. windows 95 36. windows 95 37. 5 38. 7 39. windows 40. 8 41. printf(\44.1、7、1 45.0、707、-1 46.1、0、56 47. 值传递 48. 值传递 49. 地址传递 50. 值传递 51.7 52.17 53. 10、5 54. p=(int*)malloc(n*sizeof(int)); 55.free(p); 56.fseek(fp,25l,1); 3 写输出结果题 1. A C E G 2. K=8 3. 4 25 27 16 4. 1 0 2 2 5 7 13 20 5. SUM=2468 6. x|y&z=3 、x^y&~z=1、x&y&z=0、!x|x=1、~x|x=-1 22 C程序设计习题集 7. 2 4 6 9 20. 1 21. 256.000000 22. U=32.000v=18.000 23.a,d 24. 0 abc,def e ghi,mno 1 hi,no i 4 程序填空题 1. ⑴ \⑵ gbs%n!=0 ⑶ m*n/gbs; ⑷ printf(\ 2. ⑴ int i,n; float nox; ⑵ nmin=no1; ⑶ &nox ⑷ else if(nox ⑶ ||ch>='A'&&ch<='Z' ⑷ prnitf(\ 5. ⑴ #include 8. ⑴ printf(\⑵ s=find(a,7,-1); \也可以改为其它负数 ⑶ t=*p; ⑷ return t; 9. ⑴ sort(a,7); ⑵ float *p,int n ⑶ *(p+j)>*(p+k) ⑷ t=*(p+i); 10. ⑴ &time.hour,&time.minute,&time.second ⑵ time.second ⑶ time.minute++; ⑷ time.hour==24 11. ⑴ ip-=11; ⑵ jg=3; ⑶ m[i]!=m[1] ⑷ i==12 ⑸ num-1 12. ⑴ float t; ⑵ else fh=1 ⑶ j C程序设计习题集 23 13. ⑴ int i,flag=1; ⑵ if(fabs(s1-s2) 15. ⑴ flaot *a,int n,float x ⑵ int i; ⑶ t=t*x; ⑷ return y; 16. ⑴ float *p,float *max, float *min, int n ⑵ float t; ⑶ *min=*p; ⑷ t>*max 17. ⑴ flaot *a,int n ⑵ j=i+1;j 19. ⑴ FILE *fp; ⑵ int m,e,c,i,n; ⑶ fp=fopen(\⑷ fclose(fp); 5 编程题参考答案 1.编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。 #include \ #define N 50 void main() { float x; unsigned int s1,s2,s3,i; s1=s2=s3=0; for(i=1;i<=N;i++) { scanf(\ } printf(\负数%u个,零%u个,正数%u个\\n\ } 2..编程,找出1000以内的所有完数,并输出其因子。 #include \ void main() { int i,j,s=1; for(i=1;i<=1000;i++,s=1) { for(j=2;j<=i/2;j++) if(i%j==0) s+=j; // 求 i的因子和 if(s==i) { printf(\如果i 是完数则输出其各因子 for(j=2;j<=i/2;j++) if(i%j==0) printf(\ printf(\ } } } 3. 输入一个正整数,输出它的所有质数因子。 #include \ void main() { int m,i=2; 24 C程序设计习题集 printf(\请输入一个整数:\ while(m!=1) if(m%i==0){ printf(\ printf(\ } 4. 输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。 #include \ #define N 20 void main() { int a[N],i,j; for(i=0;i if(a[i]%a[j]==0&&i!=j) { printf(\ } 5. 输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素。 #include \ #define NA 6 #define NB 8 void main() { float a[NA],b[NB]; int i,j; for(i=0;i if(a[i]==b[j]) { printf(\ } 6. 编写函数,处理n行n列维数组:将每一行的元素同除以该行上绝对值最大的元素。 #include \ #include \ void div(float** a,int n) { int i,j; float x; for(i=0;i for(j=1;j return; } void main() // 函数引用示例 { float b[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int i,j; float* c[3]; for(i=0;i<3;i++) c[i]=b[i]; div(c,3); for(i=0;i<3;i++) { C程序设计习题集 25 for(j=0;j<3;j++) printf(\ } } 7. 编写函数,求m行、n列的二维数组全体元素中负数的个数。 #include int sum(float **a,int m,int n) { int i,j; int y=0; for(i=0;i void main() // 函数引用示例 { float b[2][3]={{-1,2,-3},{4,-5,-6}}; int i; float* c[2]; for(i=0;i<2;i++) c[i]=b[i]; printf(\ } 8. 编写函数,返回在一个整数组中出现次数最多的数及其出现次数。 #include void fun(float *a,int n,int *k,float *x) { int i,j,y; *k=0; for(i=0;i for(j=0;j return; } void main() // 函数引用示例 { float c[10]={0,4,2,4,3,2,4,-3,1.5,7.6},t; int m; fun(c,10,&m,&t); // 若说明float *t; int *m; printf(\元素%f出现次数为%d\\n\引用为 fun(c,10,m,t) 将 } // 产生悬挂指针的错误,即t、m不只指向确定的存储单元。 9. 编写函数,在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。 #include void num(float *b,int n,float *max,float *min) { *max=*b; *min=*b; for(int i=1;i if(*(b+i)>*max) *max=*(b+i); if(*(b+i)<*min) *min=*(b+i); } return; } void main() // 函数引用示例 { float a[10]={1,3,4,2,6,7,12,5,9,8},x,y; 26 C程序设计习题集 num(a,10,&x,&y); printf(\最大值为%f,最小值为%f。\\n\ } 10. 编写一个函数,统计m行n列二维数组中有多少个正数、多少负数,多少个零,并返回统计结果。 #include void sub(float** a,int m,int n,int *fs,int *lin,int *zs) { int i,j; *fs=*lin=*zs=0; for(i=0;i else if(*(*(a+i)+j)==0) (*lin)++; else (*zs)++; return; } void main() // 函数引用示例 { float b[5][3]={{-1,5,2},{3,0,-2},{0,-3,5},{4,7,-8},{3,4,5}},*c[5]; int i,k1,k2,k3; for(i=0;i<5;i++) c[i]=b[i]; sub(c,5,3,&k1,&k2,&k3); printf(\负数%d个,零%d个,正数%d个。\\n\ } 11. 编写函数print,打印一个学生的成绩数组,该数组中有若干个学生的数据记录,每个记录包括num,name,score[3]。 #include struct student { char num[7],name[9];int score[3]; }; // 尾部分号不得遗漏 void print(struct student* s,int n) { int i; // 运算符'*'、'&'的优先级均低于运算符'.' for(i=0;i printf(\ (*(s+i)).score[0],(*(s+i)).score[1],(*(s+i)).score[2]); return; } void main() { struct student t[4]; int i; for(i=0;i<4;i++) scanf(\ &t[i].score[1],&t[i].score[2]); print(t,4); } 12. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。 #include { FILE *fpd1,*fpd2; char ch; C程序设计习题集 27 fpd1=fopen(\ while(fscanf(fpd1,\ if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') fprintf(fpd2,\ fclose(fpd1); fclose(fpd2); } 13. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。 #include { FILE *fp; int i,j,k=2; fp=fopen(\ for(i=5;i<100;i=i+2) { for(j=3;j<=sqrt(i);j=j+2) if(i%j==0) break; if(j>sqrt(i)) { fprintf(fp,\ } fclose(fp); } 14.顺序文件C.DAT每个记录包含学号(8位字符)和成绩(三位整数)两个数据项。从文件读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件SCORE60.DAT保存在A盘上,并显示出学生总人数、平均成绩和及格人数。 #include { FILE *fp1,*fp2; char s[9]; int x,zrs=0,pjcj=0,jgrs=0; fp1=fopen(\ fscanf(fp1,\ do { zrs++; pjcj+=x; if(x>=60) { jgrs++; fprintf(fp2,\ fscanf(fp1,\ } while(!feof(fp1)); printf(\总人数:%d 平均成绩:%d 及格人数:%d\\n\ fclose(fp1); fclose(fp2); }