1、C语言程序设计复习题题型:填空、选择、读程序写结果(参看实验教程)、编程题编程题如下:1.输出1001000以内的所有3位水仙花数。所谓水仙花数是指所有位的数字的立方和等于该数。例如153=1+5+3(实验教程P25)解:#includevoid main()int i;int w1,w2,w3;for(i=100;i999;i+)w1=i%10;w2=i/10%10;w1=i/100%10;if(i=w1*w1*w1+w2*w2*w2+w3*w3*w3) /*判断是否是水仙花数*/printf(“%d”,i);2.使用冒泡法对从键盘上输入的10个数进行排序(由大到小)。(实验教程P33)解:
2、#includevoid main()int i,j,temp;int a10;printf(“Input 10 numbers:n”);for(j=0;j10;i+)scanf(“%d”,&aj);printf(“n”);for(i=1;i10;i+)for(j=0;j10-I;j+)if(ajaj+1)temp=aj;aj=aj+1;aj+1=temp;Printf(“The sorted numbers is:n”);for(j=0;j10;j+)printf(“%5d”,aj);printf(“n”);3.设计一个实用程序,为比赛选手评分。要求:从十名评委的评分中扣除一个最高分,扣除一
3、个最低分,然后统计总分,并除以8,最后得到这个选手的最后得分(打分采用百分制)。(实验教程P37)解:分析:定义一个一维数组用来存放10名评委为选手所给的成绩,从键盘上输入10名评委所给的成绩,计算成绩的总和,然后减掉最高分和最低分,再除以8,就可以得到选手的最后得分。程序清单:#includevoid main()int score10; /*定义数组存放10个评委的成绩*/float mark;int i;int max=0; /*最高分*/int min=0; /*最低分*/int sum=0; /*10评委的总和*/for(i=0;i10;i+) /*输入10个评委的成绩*/print
4、f(“Please Enter the Score of No.%d:”,i+1);scanf(“%d”,&scorei);sum=sum+scorei; /*将10个成绩求和*/for(i=0;imax)max=scorei;for(i=0;i10;i+) /*查找最低分*/if(scoreimin)min=scorei;mark=(sum-max-min)/8.0; /*计算平均成绩*/printf(“The mark of the player is %.2fn”,mark); 4.在主函数中输2100之间的整数,调用函数判断其是否为素数,在主函数中输出这些素数。(实验教程P60) 提示
5、:在第四章中的4.4.5中第2题给出了判断素数的方法。还有一种方法就是:如果一个整数能被小于它的某一个整数出尽,该数一定不是素数。解:#includevoid main()int i;for(i=2;ia;i+)if(a% i =0)return(0);return(1);void main()int j;for(j=2;j100;j+)if(is_ prime(j)printf(“n”);5.使用递归方法,利用碾转相除法,求两个正整数的最大公约数,并在主函数调用该函数,输出计算结果。(实验教程P64)解:#includeInt gcd(int a,int b)if(a% b=0)return
6、 b;elsereturn gcd(b,a% b); /*递归调用*/void main()int x,y,t;printf(“Please input 2 number(x,y):n”);scanf(“%d%d”,&x,&y);while(x0|y1)解:#includefloat fun(int n,int x); /*定义递归函数*/int t;if(n=0) /*如果n=0返回1*/return(1);else if(n=1) /*如果n=1返回x*/return(x);else /*否则递归计算*/return(2*n-1)*x*fun(n-1),x)-(n-1)*fun(n-2),
7、x)/n;void main()int x,n;printf(“Please input n and x:n”);scanf(“%d%d”,&n,&x);printf(“The result is:%fn”,fun(n,x);7编写程序,利用子函数实现计算字符串的长度。(实验教程P92)解:程序代码如下:#includeint length(char*s);void main()char a100;int i;printf(“Please input the string:n”);gets(a);i=length(a);printf(“nThe length of string is %d”,
8、i);int length(char*s)char*p=s;while(*p)p+;return(p-s);8编写程序,利用字符串实现两个字符串的合并。(实验教程P93)解:程序代码如下:#include“stdio.h”char *link(char*p1,char*p2);void main()char str1100,str2100;printf(“Please input the first string:n”);gets(str1);printf(“nPlease input the second string:n”);gets(str2);link(str1,str2);print
9、f(“nThe linked result is:n”);puts(str1);char*link(char*p1,char*p2)char*p;p=p1;while(*p1)pl+;while(*p2)*p1=*p2;P1+;P2+;*p1=0;return(p);9.将一个整数字符串转换为一个整数,如“-1234”转换为-1234。(实验教程P98)解:#include#includeint chnum(char*p);void main()char s6;int n;gets(s);if(*s=-)n= -chnum(s+1);printf(“%dn”,n);chnum(char*p)i
10、nt num=0,k,len,j;len=strlen(p);for(;*p!=0;p+)k=*p-0;j=(- -len);while(j-0)k=k*10;num=num+k;Return(num);10.编写计算个人所得税的程序输入一个纳税人的个人月收入,计算应纳的个人所得税。(程序设计教程P65)纳税是每个公民的义务。我国的个人所得税税率表如下表所示:级数应纳税金额(月收入-1600)税率%1不超过500元52500元2000元10320015000元154500120000元2052000140000元25640001元60000元30760001元80000元35880001元10
11、0000元409超过100000元45解:源程序清单如下:#include”stdio.h”void main()double salary,s,tax;printf(“please input your salary one month:”);scanf(“%lf”,&salary);s=salary-1600;if(s=500)tax=s*0.05;else if(s=2000)tax=(s-500)*0.1+500*0.05;else if(s=5000)tax=(s-2000)*0.15+1500*0.1+500*0.05;else if(s=20000)tax=(s-5000)*0.
12、2+3000*0.15+1500*0.1+500*0.05;else if(s=40000)tax=(s-20000)*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;else if(s=60000)tax=(s-40000)*0.3+20000*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;else if(s=80000)tax=(s-60000)*0.35+20000*0.3+20000*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;else if(s=100000)tax
13、=(s-80000)*0.4+20000*0.35+20000*0.3+20000*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;else if(s=100000)tax=(s-100000)*0.45+20000*0.4+20000*0.35+20000*0.3+20000*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;printf(“tax is %10.2fn”,tax);程序说明:1)变量salary中存放的是月收入;s存放月收入中应纳税的金额,月收入减去减免税金额,即月收入减去1600元;tax是计算出来
14、的纳税额。2)公式中的“”是换行符,由于写不下,用“”符号标识下一行是本行的续行。3)本例要处理多种情况,最适合使用else if形式。因为很难找到月收入中应纳税的金额与一个常量之间的关系,因此不适合使用switch语句。11求出斐波那契数列的前20项,存在数组中,并将他们输出。(程序设计教程P73)说明:【斐波那契数列是一递推数列,满足下面关系:fib(0)=1,fib(1)=1,fib(n)=fib(n-1)+fib(n-2)(n2)】 对于这个问题,可以定义一个整形数组,用于存放20个整数,先将fib(0)和fib(1)赋初值,然后建立一个循环,每次取出两个数进行递推求值,并将其存入数组
15、中,每输出5项数据换行,直到前20项都被计算出来为止。解:源程序清单如下: #include void main()int i,fib20=1,1; /*初始化*/printf(”n”);for(i=2;i20;i+) /*计算后18项斐波那契数列中的数据并存入数组*/fibi=fibi-2+fibi-1;for(i=0;i20;i+) /*输出数组*/if(i%5=0) /*每输出5个数据换行*/printf(“n”);printf(“%10d”,fibi);printf(“n”)注:数组fib采用部分初始化法,将fib(0)和fib(1)初始化为1,其他各元素默认为0,用于存储后18项结果
16、。使用for循环语句从数组的第3个元素开始递推计算后18项数据,并存储在数组fib中(从数组的第3位开始)。接下来又使用循环语句输出数据的全部元素,每输出5个数据就换行12.编写一函数,求x的m次方的值,其中m是整数。(程序设计教程P102)求任意m个x的乘积,可把x和m作为函数的参数,数据从主调函数里传递,增强了函数的灵活性。使用循环结构设计该算法,最后将计算所得的值返回解:#includedouble mul(double x,int m)int i=0;double p=1.0;for(;im;i+)p=-p*x;return(p);void main()double x,y;int m
17、;printf(“Input the numbers(x,m):n”);scanf(“%lf%d”,&x,&m);y=mul(x,m); /*函数调用*/printf(“The result is:%6.5lfn”,y);说明:在程序中定义了mul()函数,其类型为double型,形参表中有两个形参x、m。由于函数定义在主调函数之前,在主调函数中就可以不对其进行函数声明。使用用户自定义函数时,要分清形参如何设定,包括其类型、个数及顺序,以便在发生函数调用时,准确地将实参值传递给实参,这样才不会出项错误。x、y定义为double类型,它的格式控制符为%lf,不能写成%f,以免出错。函数调用结束后
18、,将计算结果输出。13在主调函数调用函数计算5!的值。(程序设计教程P120)解:源程序清单如下:#includeint fun(int n) /*定义函数计算阶乘值*/int i;static int f=1; /*定义静态局部变量*/for(i=1;i=n;i+) /*循环计算n!乘值*/f=f*i;return(f); /*返回函数值*/void main()int n;printf(“Input the number:n”); /*输入数据*/scanf(“%d”,&n);printf(“%d!=%dn”,n,fun(n); /*调用函数*/说明:在自定义函数fun()中,程序定义了静
19、态局部变量f,用来存放每一次调用此函数计算后的值,该值在每次调用后保留其值并在下一次调用时继续使用,所以输出值为累乘的结果。14求一个数组中所有元素的最大值和最小值,并将其放入数组的最前面的两个元素的位置。(程序设计教程P143)解:#include void maxmin(int *p,int length);void main()int a10=2,5,7,1,10,4,6,33,20,9;maxmin(a,10);printf(“max=%d,min%d”,a0,a1);void maxmin(int *p,int length)int k,max=0,min=0;for(k=1;kpm
20、ax)max=k;else if(pkpmin)min=k;p0=pmax;p1=pmin;说明:在子函数中实现了对数组中元素的最大值和最小值的求值,并把最大值和最小值放到了数组的最前面的两个元素中。因为函数传递的参数是数组的首地址,因此在子函数中对数组的全部操作,就是对主函数中数组的操作。15编写一个程序,将一个字符串写入文件“E:test.txt”后,再从该文件中读出该字符串。(程序设计教程P198)解:#include “stdio.h”void main()FILE*fp;char ch=”C language”,*str;int x;fp=fopen(“E:test.txt”,”w”
21、);if(fp=NULL)printf(“n Cant open the file!”);return;x=fputs(ch,fp); /*测试函数的返回值*/printf(”x=%d”,x);printf(“n Character input finished!n”);fclose(fp);fp=fopen(“E:test.txt”,”r”);if(fp=NULL)printf(“n Cant open the file!”);return;puts(fgets(str,20,fp);fclose(fp);程序说明:首先,程序以只写的方式打开E盘根下的文本文件test.txt,向文件中一次性写入字符串“C Lauguage”后,返回最后一个字符的ASCII值。最后一个字符是“e”,因此返回“e”的ASCII值,“x=101”。显示写入完成,并关闭文件。重新以只读的方式打开该文件,从文件中读出刚才写入的内容,最后关闭文件。