1、1C 语言程序设计习题集第 1 章 C 语言概述11 c 语言程序的总体结构是怎样的。解:一个完整的 c 语言程序,是由一个、且只能由一个 main()函数(又称主函数)和若干个其他函数结合而成的,或仅由一个 main()函数构成。12 c 语言程序的基本单位是什么?它的结构又如何?解:函数是 c 语言程序的基本模块单元。任何函数(包括主函数 main()都是由函数说明和函数体两部分组成。其一般结构如下:函数类型 函数名(函数参数表) 说明语句部分; 执行语句部分; 13 主函数 main()在程序中的地位如何。程序总是从哪个函数开始执行,到哪个函数执行完后结束?解:main()函数的作用相当
2、于其他高级语言中的主程序;其他函数的作用相当于子程序。一个 c 语言程序,总是从 main()函数开始执行,而不论其在程序中的位置。当主函数执行完毕时,亦即程序执行完毕。习惯上,将主函数 main()放在最前头。14 c 语言的语句分为哪几类?解:按照语句功能或构成的不同,可将 c 语言的语句分为五类。控制语句、函数调用语句、表达式语句、空语句和复合语句。15 执行一个 c 语言程序的一般过程是什么?解:运行一个 c 语言程序的一般过程,如下图所示。启动 TC 编辑或修改源程序 连接编译 运行 退出 TC(结束)语法错误逻辑错误1)启动 Tc,进入 Tc 集成环境。2)编辑(或修改)源程序。3
3、)编译。如果编译成功,则可进行下一步操作;否则,返回 2)修改源程序,再重新编译,直至编译成功。4)连接。如果连接成功,则可进行下一步操作;否则,根据系统的错误提示进行相应修改,再重新连接,直至连接成功。5)运行。通过观察程序运行结果,验证程序的正确性。6)退出 Tc 集成环境,结束本次程序运行。16 在 Tc 集成环境下,下列操作的快捷键分别是什么解:存盘:F2;编译与连接:F9;运行:nF9;查看运行结果:Alt+F5。第 2 章 数据类型、运算符与表达式2.1 指出下列变量名中,哪些是合法的,哪些是非法的。如果非法,为什么?Int,char,345,ABdf,clong int u=51
4、274,n=128765;float x=1.2,y=2.4,z=3.6;char c1=a,c2=b;printf(“a=%2d b=%2d c=%2dn“,a,b,c);printf(“x=%f,y=%f,z=%fn“,x,y,z);printf(“x+y=%5.2f y+z=%5.2f z+x=%5.2fn“,x+y,y+z,z+x);printf(“u=%6ld n=%9ldn“,u,n);printf(“%s %s %d%sn“,“c1=a“,“or“,c1,“(ASCII)“);printf(“%s %s %d%sn“,“c2=a“,“or“,c2,“(ASCII)“);3.2 用
5、 scanf 下面的函数输入数据,使 a=3,b=7,x=8.5,y=71.82, c1=A,c2=a,问在键盘上如何输入? main()int a,b;float x,y;char c1c2;scanf(“a=%d_b=%d“,scanf(“%f,%f“,C1=2*3.14*r;Sa=3.14*r*r;Sb=4*Sa;Va=4*3.14*r*r*r/3;Vb=Sa*h;printf(“C1=%.2fn“,C1);printf(“Sa=%.2fnSb=%.2fnVa=%.2fnVb=%.2fn“,Sa,Sb,Va,Vb);3.3 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/
6、9,输出要求有文字说明,取位 2 小数。参考源程序如下:main()float F,c;scanf(“%f“,c=5*(F-32)/9;printf(“输入的华氏温度为:%.2f,则摄氏温度为%.2f“,f,c);3.4 已知三角形的三边长,求其面积。解:假设输入的三边能构成三角形,三角形的面积公式为:Area= )()(csbas其中 S=(a+b+c)/2。参考源程序如下:#include “math.h”Main()Float a,b,c,s,area;Printf(“请输入三角形的三边:”);Scanf(“%f,%f,%f”,S=(a+b+c)/2.0;Area=sqrt(s*(s-a
7、)*(s-b)*(s-c);Printf(“三角形的三边为:%7.2f, %7.2f, %7.2fn”,a,b,c);Prinft(“三角形的面积为:%7.2fn”,area);第 4 章 选择结构程序设计4.1 写出下面表达式的值(设 a=1,b=2,c=3,x=4,y=3)4(1)a+bcscanf(“%d %d %d“,if(ab)if(ac) t=a;else t=c;else if(bc) t=b;else t=c;printf(“%dn“,t);4.3 给出一百分制成绩,要求输出成绩等级A、B、C、D、E。90 分以上为A,8089 分为B,7079 分为C,6069 分为D, 6
8、0 分以下为E。参考源程序:main()int number,md;char c1;scanf(“%d“,md=number/10;switch(md)case 10: case 9: c1=A;break;case 8: c1=B;break;case 7: c1=C;break;case 6: c1=D;break;case 5:case 4:case 3:case 2:case 1:case 0: c1=E;break;printf(“%cn“,c1);4.4 给一个不多于 5 位的正整数,要求:求出它是几位数;分别打印出每一位数字;按逆顺序打印出各5位数字,例如原来为 321,应输出
9、123。参考源程序:main()int a,b,c,d,e,n;long m;scanf(“%ld“,a=0.0001*m;b=10*(0.0001*m-a);c=100*(0.0001*m-a-0.1*b);d=1000*(0.0001*m-a-0.1*b-0.01*c);e=m-10000*a-1000*b-100*c-10*d;if(a!=0)n=5,printf(“%d%d,%d,%d,%d,%d%d%d%d%d%dn“,n,a,b,c,d,e,e,d,c,b,a);else if(b!=0) n=4,printf(“%d %d,%d,%d,%d %d%d%d%dn“,n,b,c,d,
10、e,e,d,c,b);else if(c!=0) n=3,printf(“%d %d,%d,%d %d%d%dn“,n,c,d,e,e,d,c);else if(d!=0) n=2,printf(“%d %d,%d %d%dn“,n,d,e,e,d);else n=1,printf(“%d %d %dn“,n,e,e);4.5 企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元的,奖金可提 10%;利润高于 10 万元,低 20万元(10000010000000 时,超过 100 万元的部分按 1%提成。从键盘输入当月利润 I,求应发奖金总数。要求:用 if 语句编程序;用 swit
11、ch 语句编程序。用 if 语句编程序:main()int a,b,c,d,e;float d1=0.01,d2=0.015,d3=0.03,d4=0.05,d5=0.075,d6=0.10;double jj,k;long i;scanf(“%ld“,k=0.00001*i;a=k-10;b=k-6;c=k-4;d=k-2;e=k-0;if(a1) h=0;else h=10;printf(“%dn“,h);第 5 章 循环结构程序设计5.1 求n!(n=1-20), (即求 1!+2!+3!+4!+5!+20!)参考源程序:main() int n,i=1;long sum=0,s=1;s
12、canf(“%d“,while(i=n) j=m;else j=n;for(;!(j%m=0j+);printf(“s=%ld,j=%ldn“,s,j);5.3 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。参考源程序:#include“stdio.h“main()char c;int i=0,j=0,k=0,l=0;while(c=getchar()!=n)if(c=65printf(“%.3fn“,x1);5.11 用二分法求方程在(-10,10)之间的根2x3-4x2+3x-6=0参考源程序:main()double x1,x2,y1,y2;x1=-10;x2=10;
13、doy1=2*x1*x1*x1-4*x1*x1+3*x1-6;x1=x1-y1/(6*x1*x1-8*x1+3);while(y1!=0);doy2=2*x2*x2*x2-4*x2*x2+3*x2-6;10x2=x2-y2/(6*x2*x2-8*x2+3);while(y2!=0);printf(“x1=%.3f,x2=%.3fn“,x1,x2);5.12 打印以下图案*参考源程序:#include“math.h“main()int i=1,k,l,m;for(;i=k+1) printf(“%5d“,ai);printf(“n“);6.2 求一个矩阵对角线元素之和。解:以 3*3 矩阵为例,
14、参考源程序如下:main()int i=0,j=0,a33,s1,s2;for(i=0;i0;i-)if(ai-1;i-)printf(“%5d“,bi);printf(“n“);6.5 打印出以下杨辉三角形(要求打印出 10 行) 。11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 112 参考源程序:main()static int m,n,k,b1515;b01=1;for(m=1;mmax) max=aij;maxj=j;for(k=0,flag1=1;kakmaxjj)/*判断行中的最大值是否也是列中的是大值*/flag1=0;if(flag1) printf
15、(“n 第%d 行第%d 列的%d 是鞍点n”,j,maxj,max);flag2=0;if(!flag2) printf(“n 无鞍点!n”); 6.7 从键盘上输入多个字符,编程统计其中字母、空格、数字及其他字符的个数。参考源程序:#include “stdio.h”Main()char str40;int alphabet=0,digit=0,space=0,other=0,i=0;printf(“请输入一串字符:n”);gets(str);while(stri!=o)if(A=0)+digit;else +other;Printf(“其中有%d 个字母,%d 个空格,%d 个数字,%d
16、 个其他字符!”,alphabet,space,digit,other);6.8 有 n 个学生,学习 m 门课程,已知所有学生全部课程的成绩,要求输出每门课程最高分的学生学号、课程代号和成绩。参考源程序:#define N 50#define m 20main()char aN10;14float scoreNM,max_score;int n,m,i,j,studid;/*输入学生的学号和各门课程的成绩*/printf(“请输入学生数 n 和课程数 m;”);scanf(“%d,%d”,for(i=1;i max_score) max_score=scoreij;studid=i;Prin
17、tf(“第%d 门课程最高分的学生学号是:%s,成绩为:%.2fn”,j,astudid,max_score);第 7 章 函数7.1 写出函数定义的一般形式,并说明各部分的意义。解:(略)7.2 函数调用有哪几种形式,各自有什么特点?解:在 C 语言中,可以用以下几种方式调用函数:(1) 函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。(2) 函数语句。C 语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用作为一各独立的语句。(3) 函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传
18、送,因此要求该函数必须是有返回值的。7.3 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。解:参考源程序:int maxyueshu(int m,int n)int m,n;int i=1,t;for(;i=n) j=m;else j=n;for(;!(j%m=0j+);return j;main()int a,b,max,min;printf(“enter two number is: “);scanf(“%d,%d“,max=maxyueshu(a,b);min=minbeishu(a,b);printf(“max=%d,min=
19、%dn“,max,min);7.4 求方程 ax2+bx+c=0 的根,用三个函数分别求当 b2-4ac0、b 2-4ac=0 和 b2-4ac0 时的根*/float yishigen(float m,float n,float k) float m,n,k;float x1,x2;x1=(-n+sqrt(k)/(2*m);x2=(-n-sqrt(k)/(2*m);printf(“two shigen is x1=%.3f and x2=%.3fn“,x1,x2);/* 求 b2-4ac=0 时的根*/float denggen(float m,folat n) float m,n;floa
20、t x;x1=x2=-n/(2*m);printf(“denggen is x=%.3fn“,x);/* 求 b2-4ac0) yishigen(a,b,q);else if(q=0) denggen(a,b);else xugen(a,b,q);7.5 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。解:参考源程序:/*是素数返回 1,否则返回 0*/int sushuis(int m) int m;int i=2,t;for(;i#include #define N 8117fun(char *s) int i=0,t,n=strlen(s);for(;s+i#inclu
21、devoid fun(char p1,char p2) int i,j;for(i=0;p1i;i+)for(j=0;p2j;j+)p1i+=p2j;p1i=0;main() char s180,s280;clrscr();printf(“Enter s1 and s2:n“);scanf(“%s%s“,s1,s2);printf(“s1=%sn“,s1);printf(“s2=%sn“,s2);printf(“Invoke fun(s1,s2):n“);fun(s1,s2);printf(“After invoking:n“);printf(“%sn“,s1);187.8 自定义函数求 3*
22、3 矩阵的转置矩阵。解:程序分析这题的关键在于进行行列下标转换的算法,由矩阵的对称性我们不难看出在进行行列互换时 aj在好是与 aji互换,因而只要我位让程序走完矩阵的左上角即可(用 for(i=0;iint fun(int array33) int i,j,t;for(i=0;ifloat solut(float a,float b,float c,float d) float x=1,x0,f,f1;dox0=x;f=(a*x0+b)*x0+c)*x0+d;f1=(3*a*x0+2*b)*x0+c;x=x0-f/f1;while(fabs(x-x0)=1e-5);return(x);19m
23、ain() float a,b,c,d;printf(“请输入一元三次方程的系数 a,b,c,c:n”);scanf(“%f,%f,%f,%f”,printf(“一元三次方程为:%5.2fx3+%5.2fx2+%5.2fx+%5.2f=0n”,a,b,c,d);printf(“该方程的根为:x=%7.2fn”,solut(a,b,c,d);第 8 章 编译预处理8.1 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。解:参考源程序:#define CHANGE(a,b,t) t=a;a=b;b=amain()int c,d,s;scanf(
24、“%d,%d“,CHANGE(c,d,s);printf(“c=%d,d=%dn“,c,d);8.2 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。#define Q(a,b) a%bmain()int c,d,t;scanf(“%d %d“,t=Q(c,d);printf(“t=%dn“,t);8.3 三角形面积为:三角形的面积公式为:Area= )()(csbas其中 S=(a+b+c)/2。定义两个带参的宏 S,一个用来求 area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积 area。#include“math.h“#define SSS(m,n,k) (m+n
25、+k)/2#define AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k)main() float a,b,c,s,area;scanf(“%f %f %f“,s=SSS(a,b,c);area=AQRT(a,b,c);printf(“s=%.3f area=%.3fn“,s,area);208.4 给年份 year 定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为 LEAP_YEAR,形参为 y。解:参考源程序:#define LEAPYEAR(y) y%4=0scanf(“%d“,if(L
26、EAPYEAR(y) printf(“%d is a not leap yearn“,y);else printf(“%d is a lear yearn“,y);第 9 章 指针9.1 输入三个整数,按由小到大的顺序输出。解:参考源程序:main()int a,b,c,*p1,*p2,*p3,t;scanf(“%d,%d,%d“,p1=p2=p3=if(*p1*p2) t=p1;p1=p2;p2=t;if(*p1*p3) t=p1;p1=p3;p3=t;if(*p2*p3) t=p2;p2=p3;p3=t;printf(“%d,%d,%dn“,*p1,*p2,*p3);或main()int
27、a,b,c,*p1,*p2,*p3,t;scanf(“%d,%d,%d“,p1=p2=p3=if(ab) t=*p1;*p1=*p2;*p2=t;if(ac) t=*p1;*p1=*p3;*p3=t;if(bc) t=*p2;*p2=*p3;*p3=t;printf(“%d,%d,%dn“,a,b,c);9.2 输入三个字符串,按由小到大的顺序输出#define N 3#define M 20main()char str0NM,str1M,*p,*q;int i,l,m,n;q=str0;for(;p0) strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1
28、);m=strcmp(q,q+2);if(m0) strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);n=strcmp(q+1,q+2);if(n0) strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);for(p=q;pi) i=xy;p0=else if(xy(a+N) p=a+1;if(*p!=0) i+;if(i-3)=0) *p=0;i=0;k-;22p+;for(i=1;i=1/*输出结果*/Printf(“%d 年 %d 月%d 日是%d 年的第%d 天” ,data.year,data.month
29、,data.day,data.year,sum);10.2 某学习小组有 5 个人,每个人的信息包括:学号、姓名和成绩。要求从键盘上输入他们的信息,并求出平均成绩以及最高成绩者的信息。解:参考源程序:#define NUM 5#include “conio.h”/*定义学生信息结构类型*/struct students char no7,name9;int score;/*主函数*/main() struct student stuNUM;int count,max=0,sum=0;/*输入学生信息*/for(count=0;countstumax.score)max=count;/*输出平均
30、成绩和最高成绩学生的信息*/printf(“naverage=%.2fn”,(float)sum/NUM);printf(“最高成绩者信息:n” );printf(“学号:%sn”,stumax.no);printf(“姓名:%sn”,stumax.name);24printf(“分数:%sn”,stumax.score);getch();10.3 编写一个程序,使用单链表作数据结构,解决 Josephus 问题。Josephus 问题描述如下:设有 n 个人围坐一圈,现从第 s 个人开始报数,数到 m 的人出列,然后从出列的下一个人重新开始报数,数到 m 的人出列,如此反复,直至所有的人都出
31、列。Josephus 问题是:对于任意给定的 n、s 和 m(sno);if(new-no=-1) free(new);break;count+;/*2.将新结点插入到链表尾,并设置新的尾指针*/new-next=NULL;if(count=1) head=new;/*是第一个结点则置头指针*/else tail-next=new;tail=new;return(head);/*求出列顺序,返回出列单链表的头指针。*/struct node *josephus(struct node *head,int n,int s,int m) struct node *p,*prior,*head_ou
32、t,*tail_out;int count,num=0;/*查找开始位置*/p=head;prior=NULL;for(count=1;countnext;/*报数出列*/while(numnext=NULL) prior=NULL;p=head;else prior=p;p=p-next;/*出列处理*/prior-next=p-next;num+;/*将出列结点插入到出列链表中*/if(num=1)hea_out=tail_out=p;else tail_out-next=p;tail_out=p;if(p=head) head=head-next;if(p-next=NULL) p=he
33、ad; else p=p-next;/*将最后出列的结点插入到出列链表中*/tail_out-next=p;p-next=NULL;return(head_out);void main()struct node *head,*head_out;head=create();head_out=josphus(head,7,2,5);printf(“out of the queue:n”);while(head_out!=NULL) printf(“%d”,head_out-no);head_out=head_out-next;getch();第 11 章 文件11.1 从键盘输入一个字符串,将小写
34、字母全部转换成大写字母,然后输出到一个磁盘文件“test” 中保存。输入的字符串以!结束。 1.程序分析:2.程序源代码:#include “stdio.h“main()FILE *fp;char str100,filename10;int i=0;if(fp=fopen(“test“,“w“)=NULL) printf(“cannot open the filen“);exit(0);printf(“please input a string:n“);gets(str);while(stri!=!)26 if(stri=afputc(stri,fp);i+;fclose(fp);fp=fop
35、en(“test“,“r“);fgets(str,strlen(str)+1,fp);printf(“%sn“,str);fclose(fp);有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩) ,计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件“stud“中。1.程序分析:2.程序源代码:#include “stdio.h“struct student char num6;char name8;int score3;float avr; stu5;main()int i,j,sum;FILE *fp;/*input*/for(i=0;i5;i+) printf(“n please input No. %d score:n“,i);printf(“stuNo:“);scanf(“%s“,stui.num);printf(“name:“);scanf(“%s“,stui.name);sum=0;for(j=0;j3;j+) printf(“score %d.“,j+1);scanf(“%d“,sum+=stui.scorej;stui.avr=sum/3.0;fp=fopen(“stud“,“w“);for(i=0;i5;i+)if(fwrite(fclose(fp);27