c语言编程题_经典40题(附解答)

c语言编程题_经典40题(附解答)

ID:5507722

大小:404.00 KB

页数:62页

时间:2017-11-12

上传者:U-2494
c语言编程题_经典40题(附解答)_第1页
c语言编程题_经典40题(附解答)_第2页
c语言编程题_经典40题(附解答)_第3页
c语言编程题_经典40题(附解答)_第4页
c语言编程题_经典40题(附解答)_第5页
资源描述:

《c语言编程题_经典40题(附解答)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的参数。输出已交换后的两个值。#defineEXCHANGE(A,B,X)X=A;A=B;B=Xmain(){inta,b,x;printf(“inputaandb:”);scanf(“%d,%d”,&a,&b);EXCHANGE(a,b,x);printf(“a=%d b=%d ”,a,b);} 2、编写程序,输入两个整数,求它们相除的余数。用带参的宏来实现。#defineR(A,B)A%Bmain(){inta,b;printf(“inputaandb:”);scanf(“%d,%d”,&a,&b);printf(“%dmod%d=%d ”,a,b,R(a,b));} 3、分别用函数和带参的宏,从3个数中找出最大值。intmax(inta,intb,intc){intx;x=(a>b)?a:b;x=(x>c)?x:c;return(x);}main(){intx,y,z,m;printf(“inputx,y,z”);scanf(“%d,%d,%d”,&x,&y,&z);printf(“MAX=%d ”,MAX(x,y,z,m));printf(“max=%d ”,max(x,y,z));}宏展开为:(m=x>y?x:y)>z?m:z#defineMAX(A,B,C,M)(M=A>B?A:B)>C?M:C 4、求和:S=1-(1/2)+(1/3)-(1/4)+……+(1/n),其中n=10。方法1:voidmain(){inti,n=10;floats=0;for(i=1;i<=n;i++)s=s+((i%2==1)?(1.0/i):(-1)*(1.0/i);printf(“s=%f ”,s);} 方法2:求s=1-(1/2)+(1/3)-(1/4)+……+(1/n)其中n=10voidmain(){inti,n=10,f=-1;floats=0;for(i=1;i<=n;i++){f=-f;s+=f*(1.0/i);}printf(“s=%f ”,s);} 5、编写程序,求sum=1-3+5-7+……-99+101方法1:voidmain(){inti;floatsum=0;for(i=1;i<=101;i+=4)sum+=i;for(i=3;i<=99;i+=4)sum-=i;printf(“sum=%f ”,sum);} 方法2:求sum=1-3+5-7+……-99+101voidmain(){inti,f=-1;floatsum=0;for(i=1;i<=101;i+=2){f=-f;sum+=f*i;}printf(“sum=%f ”,sum);} 6、打印如下数字三角形:1121123211234321………………12345678987654321voidmain(){inti,j;for(i=1;i<10;i++){for(j=1;j<10-i;j++)printf(“”);/*输出9-i个空格*/for(j=1;j<=i;j++)printf(“%d”,j);for(j=i-1;j>0;j--)printf(“%d”,j);printf(“ ”);} 7、编写程序,输出左下三角的九九口诀表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81 输出左下三角的九九口诀表的程序如下:voidmain(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf(“%4d*%d=%2d”,i,j,i*j);printf(“ ”);}} 8、铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤加收0.10元。编一程序实现自动计费功能。doublemoney(doublew){if(w<=50)return0.15*w;elsereturn0.75+0.1*(w-50);}voidmain(){intw;doublef;do{printf(“请输入行李重量:”);scanf(“%d”,&w);if(w>0){f=money(w);printf(“ weight=%d,freight=%f”,w,f);}}while(w==0);} 9、编写函数,将两个递增有序的表,合并成一个递增有序的表。#defineN50#defineSeqListstructseqlistSeqList{intdata[N];intlength;}; 合并函数如下:SeqList*mergelist(a,b)SeqLista,b;{SeqListc;inti=0,j=0,k=0;while((ii;j--)if(R[j]n)。(2)对a[n]按递增序进行排序。(3)输出插入前的有序序列。(4)读入要插入的数x。(5)设置游标i从表尾开始搜索插入位置,若a[i]大于x则将a[i]移到a[i+1]位置。(6)一旦出现a[i]小于x,则将x插入到i+1位置。(7)输出插入后的有序序列。 (3)完整的程序如下#include“stdio.h”#defineN10main(){inti,j,x,n,a[N];/*数字a的最大容量为N*/printf(“请输入数组的实际元素个数n: ”);scanf(“%d”,&n);/*要求实际元素个数n小于N*/printf(“请输入%d个整数: ”,n);for(i=0;i=0)&&(x0){x1=(x2+1)*2;x2=x1;day--;}printf(“第一天的桃子数为:”,x1);} 13、分别用递归和非递归的方法将一个整数转换成字符串。李丽娟教材p126题6.46:非递归方法的基本思想对于给定的整数n,从低位向高位逐位截取每一位上的数字,并保存到数组a的从0号位置开始的相应位置上。然后,从数组a中反向逐位取出相应位置上的数字并转换为相应的字符输出。 #includevoidconvert(intn){inti,j,a[5];i=0;while(n!=0){a[i++]=n%10;/*截取n的最低位上的数字保存到a[i]位置上*/n=n/10;/*将n缩小10倍*/}非递归函数:1234n1234aj=i-1;while(j>=0){putchar(a[j]+’0’);/*将a[j]位置上的数字转换为对应的字符*/j=j-1;}} #include①voidconvert(intn){intk;②if((k=n/10)!=0)③convert(k);/*截取n的最低位上的数字保存到栈中,并使n缩小10倍*/④putchar(n%10+’0’);/*逐次弹出栈顶数字,并将其转换为对应的字符输出*/⑤}递归函数: voidmain(){intnum;printf(“inputaintegernumber:”);scanf(“%d”,&num);printf(“ output:”);if(num<0){putchar(“-”);num=-num;}convert(num);printf(“ ”);}主函数: 14、用递归的方法求1+2+3+…+n。李丽娟教材p126题6.43: 假设输入5→n3.执行过程:main(){…y=add(5);…}add(4){…s=4+add(3);…returns;}add(3){…s=3+add(2);…returns;}n=4n=3add=6add(2){…s=2+add(1);…returns;}add(1){…s=1;…returns;}n=1add=1n=2add=3add=10add(5){…s=5+add(4);…returns;}add=15n=5intadd(intn){ints;if(n==1)elses=n+add(n–1);return(s);}s=1;main(){intn,y;scanf("%d",&n);y=add(n);printf(“%d的累加和=%d",n,y);} 15、编写递归函数reverse,将字符串s颠倒过来输出。①voidreverse(chars[],inti)/*第一次调用时,i为0*/{②if(s[i+1]!=‘’)③reverse(s,i+1);④putchar(s[i]);⑤} 16、任意输入一个整数,将其各位数字反序输出(例如,输入1234,输出4321)。intreverse(intn){intnum;for(num=0;n>0;n/=10)num=num*10+n%10;returnnum;} 17、将一个长度不超过4的数字字符串转换成一个整数。例如,字符串为“3248”,则转换成整数3248。intatoi(char*nst){inti,num=0;for(i=0;st[i]!=‘’;i++)num=num*10+nst[i]-’0’;returnnum;} 18、编写程序,将任意一个字符串从第一个字符开始间隔地输出该串。例如,字符串为:abcdef,输出:ace。#defineN20voidmain(){inti;charstr[N];printf(“pleaseenterastring:”);scanf(“%s”,str);output(str);}voidoutput(charstr[]){inti;printf(“ ”);for(i=0;st[i]!=‘’;i++)if(i%2==0)putchar(str[i]);} 19、输入一串字符以‘#’结束,如果它是大写字母,则转换为小写字母输出,如果是小写字母,则转换为大写字母输出,如果不是字母,则照直输出。while((ch=getchar())!=‘#’){if(ch>=‘A’&&ch<=‘Z’)ch=ch-‘A’+‘a’;elseif(ch>=‘a’&&ch<=‘z’)ch=ch-‘a’+‘A’;putchar(ch);} 20、编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值,并输出复制结果,在被调函数中完成复制。#defineMAX80voidcopystr(char*str1,char*str2,intn){inti=0;while(str2[m]!=‘’)str1[i++]=str2[m++];str1[i]=‘’;}voidmain(){intm;charst1[MAX],st2[MAX];printf(“pleaseenterastring:”);scanf(“%s”,st2);printf(“pleaseenteranumber:”);scanf(“%d”,&m);copystr(st1,st2,--m);printf(“%s ”,st1);} 21、编写函数,求一个字符串的长度。(不能调用strlen函数)intstrlenth(char*st){inti=0;while(st[i]!=‘’)i++;returni;} 22、编写程序,将两个字符串连接起来。(要求不用strcat函数)#defineMAX100char*stcat(char*str1,char*str2){charstr[MAX];inti=0,j=0,k=0;while(str1[i]!=‘’)str[k++]=str[i++]);while(str2[j]!=‘’)str[k++]=str[j++]);;str[k]=‘’;returnstr;} 23、编写程序,输入一行字符,分别统计出其中英文字母、空格(含‘ ’、‘t’)、数字和其它字符的个数。voidmain(){intc,i,nchar=0,ndigit=0,nwhite=0,nother=0;while((c=getchar())!=EOF)if((c>=‘a’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’))++nchar;elseif(c>=0&&c<=9)++ndiget;elseif(c==‘’||c==‘ ’||c==‘t’)++nwhite;else++norther;printf(“nchar=%d ndigit=%d ”,nchar,ndiget);printf(“nwhite=%d nother=%d ”,nwhite,nother);} 24、编写程序,统计从键盘输入的字符个数和行数。voidmain(){intc,nc=0,nl=0;while((c=getchar())!=EOF){if(c==‘ ’)++nl;++nc;}printf(“lines:%d. chars:%d. ”,nl,nc);} 25、编写一个译码函数,把一个英语句子译成数字代码。译码规则是:以数字1代替字母a,数字2代替字母b,……,数字26代替字母z;以数字27代替字母A,数字28代替字母B,……,数字52代替字母Z;以空格符代替星号‘*’。英文句子以‘.’结束。voidtran(char*st){inti;for(i=0;st[i]!=‘.’;i++)if(st[i]>=‘a’&&st[i]<=‘z’)st[i]=st[i]-‘a’+1;elseif(st[i]>=‘A’&&st[i]<=‘Z’)st[i]=st[i]-‘A’+27;elseif(st[i]==‘’)st[i]=‘*’;} *26、用结构体存放下表中的数据,然后输出每人的姓名和实发工资数(基本工资+浮动工资–支出)。姓名基本工资浮动工资支出zhaoqiansun240.00360.00560.00400.00120.000.0075.0050.0080.00【分析及解答】显然,该结构体应有四个成员:姓名、基本工资、浮动工资和支出,实发数为后三个成员之和差运算。在输出时,要注意输出格式的控制,特别是对实发工资应定义其小数位数。本题也可定义指向结构体的指针,请同学们自已完成。程序如下: #includestructworker{charname[10];floatbase,flow,out;}a[3]={{"zhao",240,400,75},{"qian",360,120,50},{"sun",560,0,80}};main(){inti;for(i=0;i<3;i++){printf("name:%s”,a[i].name);printf("salary:%10.2f",,a[i].base+a[i].flow-a[i].out);}} *27、编一个程序,输入10个员工的序号、姓名、基本工资、职务工资;求出其中“基本工资 +职务工资”最少的员工姓名并输出。【分析及解答】本题要定义有四个成员的结构体数组,并在该结构体数组中求最小值。程序中,用变量flag存放最少工资员工的序号,其初值为0。同样可使用结构体指针来完成。程序如下:#includestructworker{intno;charname[10];floatbase,rank;}a[10]; main(){inti,flag=0;for(i=0;i<10;i++){scanf("%s",a[i].name);scanf("%d",&a[i].no);scanf("%f%f",&a[i].base,&a[i].rank);}for(i=1;i<10;i++)if(a[i].base+a[i].rankstructstudent{intno;charname[10];floatchinese,math,eng;}a[10]; voidmain(){inti,sum1,sum2,flag=0;for(i=0;i<10;i++){scanf("%s",a[i].name);scanf("%d",&a[i].no);scanf("%f%f%f",&a[i].chinese,&a[i].math,&a[i].eng);}for(i=1;i<10;i++){sum1=a[flag].chinese+a[flag].math+a[flag].eng;sum2=a[i].chinese+a[i].math+a[i].eng;if(sum2>sum1)flag=i;}printf("name:%s",a[flag].name);} 29、编一个程序,输出下列学生成绩表中的数据,并用结构体数组存放。然后输出三门课程的名称和平均分数。nameVFVBVCZhao97.589.078.0Qian90.093.087.5Sun75.079.568.5Li82.569.554.0【分析及解答】本题解法与以上几题相似,只是增加了求平均值的运算。另外,在输出时,注意换行控制。 程序如下:#includestructstudent{charname[16];floatscore[3];}a[4]={{"Zhao",97.5,89,78},{"Qian",90,93,87.5},{"Sun",75,79.5,68.5},{"Li",82.5,69.5,54}};charcases[3][10]={"VF","VB","VC"};/*cases[0]、cases[1]、cases[2]用来存放课程名称*/ voidmain(){inti,j;floatsum;for(i=0;i<3;i++){printf(" Case:%st",cases[i]);sum=0;for(j=0;j<4;j++)sum+=a[j].score[i];sum/=4;printf("Avgscore:%f ",sum);}} 30、某专业本学期开设课程有:数学(math)、英语(english)、程序设计(program),根据你所在班的实际人数,设计5个函数:(1)从键盘输入每一个同学的学号(num)、姓名(name)及各门课程的成绩(score);(2)求出每个同学的总成绩。(3)从屏幕输出总分最高的学生的学号、姓名、各单科成绩及总成绩。(4)从屏幕输出某门课程、某个分数段的学生的学号、姓名和该门课程的成绩。(5)按平均分从高到低顺序,输出全班同学的学号、姓名和平均分。再编写一个主函数进行测试。 31、编一个程序,从键盘输入200个字符,存入名为“f1.t”的磁盘文件中。【分析及解答】因为有文件操作,所以程序头部必须有一条语句:#include"stdio.h”程序先创建文件f1.t,然后从键盘每键入一个字符就往文件中写一个字符,直至完成。程序主函数中定义了一个局部变量intn,用做计数器,键盘读取用库函数intgetchar()。它定义了数据类型FILE和文件操作库函数的说明。 #include"stdio.h"main(){FILE*fp;intn;if((fp=fopen("f1.t","w"))==NULL){printf("Cannotopenfile! ");exit(1);}for(n=0;n<200;n++)fputc(getchar(),fp);fclose(fp);}程序如下: 32、从上一题中建立的名为f1.t的磁盘文件中读取120个字符,并显示在屏幕上。【分析及解答】程序先打开文件f1.t,然后读一字符显示一个字符。程序主函数中定义了一个局部变量intn,用于计数,从文件中读取字符用库函数intfgetc(FILE*fp),显示字符用库函数intputchar(intch)。#include"stdio.h"main(){FILE*fp;intn;if((fp=fopen("f1.t”,"r"))==NULL){printf("Cannotopenfile! ");exit(1);}for(n=0;n<120;n++)putchar(fgetc(fp));fclose(fp);} 33、输入100个学生的信息(含学号、姓名、年龄、7科成绩、总分),统计所有学生的总分,并存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分最高的学生并输出该生的所有信息。【分析及解答】用一个结构体student来表示学生信息。先创建二进制文件student.dat,在输入学生信息后就计算总分,然后写入文件。重复100次,完成学生信息存入。设置整型变量m存放最高总分值,整型变量n记录最高总分者的编号。寻找结束后,用库函数fseek定位至最高总分的学生所在的位置,读出后显示。 #include"stdio.h"structstudent{longnum;charname[10];intage;intsubj[7];intscoret;}s1;main(){FILE*f1;intm,n,j;if((f1=fopen("student.dat","wb"))==NULL){printf("Cannotopenfile! ");exit(0);}/*以上先创建二进制文件,作好写准备*//*以下为输入学生信息,计算总分,并写入文件*/ for(m=1;m<=100;m++){printf(" Number:");scanf("%ld",&s1.num);printf(" Name:");scanf("%s",s1.name);printf(" SevenSubjectScore:");s1.scoret=0;for(j=0;j<7;j++){scanf("%d",&s1.subj[j]);s1.scoret+=s1.subj[j];}fwrite(&s1,sizeof(structstudent),1,f1);}/*以上输入学生信息,循环100次*/fclose(f1);if((f1=fopen("student.dat","rb"))==NULL){printf("Cannotopenfile! ");exit(0);}/*以上先关闭文件,再以读的方式打开。下面是查找总分最高者,m存放最高总分,n存放最高总分学生的编号。*/ m=0;for(j=0;j<100;j++){fread(&s1,sizeof(structstudent),1,f1);if(s1.scoret>m)/*当前学生总分更高,则更新m,n的值*/{m=s1.scoret;n=j;}}fseek(f1,(long)n*sizeof(structstudent),0);fread(&s1,sizeof(structstudent),1,f1);/*以上寻找完成,定位到总分最高的学生位置,读出信息。以下完成显示并关闭文件。*/printf(" TopstudentNumber:%ld",s1.num);printf(" Name:%s",s1.name);printf(" SevenSubjectScore:");for(j=0;j<7;j++)printf("%d",s1.subj[j]);printf(" totalscore:%d",s1.scoret);fclose(f1);} 34、编程序对名为CCW.TXT的磁盘文件中“@”之前的所有字符加密,加密方法是每个字节的内容减10。【分析及解答】程序要求打开的文件是可读又可写,所以文件打开模式字符串是:“r+“。文件指针f1读取”明文”字符后,将文件读写指针用库函数fseek(f1,-1L,1)退回一格。将加密后的字符写到该字符原来的位置。判断原明文字符是否为结束标志,是则结束处理,否则继续处理,直至结束。程序中将结束标志字符也加密,避免密文中出现结束标志字符,导致解密错误。库函数fseek(f1,-1L,1)参数的第一项表示对应的文件,第二项表示移动的长度,是长整型量。第三项表示参照位置:0表示从文件头,1表示从当前位置,2表示从文件尾。程序如下: #include"stdio.h"main(){FILE*f1;charc;if((f1=fopen("ccw.txt","r+"))==NULL){printf("Cannotopenfile! ");exit(0);}while(!feof(f1)){c=fgetc(f1);fseek(f1,-1L,1);/*将文件读写指针退回一格*/fputc(c-10,f1);/*将加密后的字符写入到该字符本身的位置*/if(c==’@’)exit(0);}fclose(f1);} ***************************************************图(a)图(b)图(c)35.分别编写三个程序打印下列三个图形。 36.按每行5个数打印输出100—300之间的所有素数。算法思想:i从101到299之间取奇数值,对于i的每一个取值,用2~sqrt(i)之间的整数j去试除i。设置标志变量b首先取值1,表示i是素数;以后一旦发现有某一个j能整除i,则马上对b赋值0,表示i不是素数。设置计数器k,用以统计所输出的素数的个数。37.求100之内的所有完数(一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1、2、3,而6=1+2+3,所以,6是完数。) 38.求出10至1000之内能同时被2、3、7整除的数,并输出。39.输入两个正整数,输出它们的最大公约数。【提示】求最大公约数有两种基本算法,其一:找出两整数中的最小的一个,最大公约数必在1与最小整数的范围内。然后从大到小,一一测试,即可找到。其二:辗转相除法(设a>b,r为余数)。①求a/b的余数r;②若r=0,则b为最大公约数,若r≠0,执行第③步;③将b的值放在a中,将r的值放在b中;④执行第①步。 40.计算e=1+的值并输出(设n=20)。41.生成Fibonacci数列的前20项并输出。Fibonacci数列为:1,1,2,3,5,8,13,21,34,…

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭