C语言编程题精选-.pdf
1 参考答案1、编程实现对键盘输入的英文名句子进行加密。用加密方法为,当内容为英文字母时其在26 字母中的其后三个字母代替该字母,若为其它字符时不变。#include main()char c;printf(please input a string:);while(c=getchar()!=n)if(c=A&c=a&c=X&c=x&c=z)c=(c+3)-26;printf(%c,c);printf(n);return 0;2、编程实现将任意的十进制整数转换成R 进制数(R 在 2-16 之间)。#include#include void main()int n,R,i=0,a16=0;char str16=0123456789ABCDEF;clrscr();printf(please input an integer number:n);scanf(%d,&n);printf(please input R:n);scanf(%d,&R);if(n0)printf(%c,strai);getche();3、从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量,要求显示100 元、50 元、10元、5 元、2 元、1 元、1 角、5 分、1 分各多少张。#include main()int a1,a2,a3,a4,a5,a6,a7,a8,a9;float f;a1=a2=a3=a4=a5=a6=a7=a8=a9=0;printf(please input a float number:);scanf(%f,&f);while(f100.0)f=f-100.0;a1+;while(f50.0)f=f-50.0;3 a2+;while(f10.0)f=f-10.0;a3+;while(f5.0)f=f-5.0;a4+;while(f1.0)f=f-1.0;a5+;while(f0.5)f=f-0.5;a6+;while(f0.1)f=f-0.1;a7+;while(f0.05)f=f-0.05;a8+;while(f0.01)f=f-0.01;4 a9+;printf(a1=%d,a2=%d,a3=%d,a4=%d,a5=%d,a6=%d,a7=%d,a8=%d,a9=%dn,a1,a2,a3,a4,a5,a6,a7,a8,a9);return 0;4、随机产生 20 个10,50 的正整数存放到数组中,并求数组中的所有元素最大值、最小值、平均值及各元素之和。#include#include void main()int a21,i,ran,max,min,sum,average;clrscr();for(i=1;i=20;i+)while(ran=random(51)/10=0)/ensure ran between 20 and 50;ai=ran;max=min=a1;/initialize here sum=0;for(i=1;i=20;i+)printf(a%d=%dn,i,ai);sum+=ai;if(maxai)min=ai;5 average=sum/20;printf(nsum=%d,max=%d,min=%d,average=%d n,sum,max,min,average);puts(nany key to exit!);getche();5、编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。#include#include void main()char string80,*p;int i=0,max=0;clrscr();printf(please input a string:n);gets(string);/printf(n%sn,string);p=string;while(*p!=0)if(*p=)if(max=i)max=i;i=0;else 6 i+;p+;if(max=i)max=i;printf(nmax_length of the string is:%d n,max);getche();1、模拟 n 个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D 表示,当选某候选人时直接输入其编号(编号由计算机随机产生),若输入的不是 A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。#include#include#include#include void main()int i,n,A,B,C,D,abandon,ran;/abandon stand for the ones who abandon clrscr();A=B=C=D=abandon=0;printf(Enter the number of persons:);scanf(%d,&n);/n persons to select from candidate a,b,c and d.randomize();for(i=1;i=B&A=C&A=D&A!=-1)printf(A=%d,A);A=-1;if(B=A&B=C&B=D&B!=-1)printf(B=%d,B);B=-1;if(C=A&C=B&C=D&C!=-1)printf(C=%d,C);C=-1;8 if(D=A&D=B&D=C&D!=-1)printf(D=%d,D);D=-1;printf(abandon=%d,nn,abandon);getch();8、已知 abc+cba=1333,其中 a,b,c 均为一位数,编程求出满足条件的 a,b,c 所有组合。#include#include void main()int num,a,b,c;clrscr();printf(Press any key to calculate!nn);getch();for(num=101;num1000;num+)a=num/100;b=num%100/10;c=num%10;if(num+c*100+b*10+a=1333)printf(n%d+%d=1333n,num,c*100+b*10+a);while(!kbhit();9 2、编制一个完成两个数的四则运算程序。如:用户输入34+56则输出结果 90.00。要求运算结果保留两位小数,用户输入时一次将两个数和操作符输入。#include#include void main()float num1,num2;char s;clrscr();printf(Enter a statement please:);scanf(%f%c%f,&num1,&s,&num2);switch(s)case+:printf(%.2f%c%.2f=%.2f,num1,s,num2,num1+num2);break;case-:printf(%.2f%c%.2f=%.2f,num1,s,num2,num1-num2);break;case*:printf(%.2f%c%.2f=%.2f,num1,s,num2,num1*num2);break;case/:printf(%.2f%c%.2f=%.2f,num1,s,num2,num1/num2);break;default:printf(Input Error!);getch();3、输入一个五位以内的正整数,(1)判断它是一个几位数;(2)请按序输出其各位数字;(3)逆序输出其各位数字。如输入:56439,输出:5 位数10 5,6,4,3,9 9,3,4,6,5#include#include long power(int n)int i;long result=1;for(i=1;i1)j=power(count);printf(%d,n/j);11 n=n%j;printf(%dn,n);n=num;while(tmpcount-1)/statement A printf(%d,n%10);n=n/10;printf(%dn,n);getch();4、编写子函数:(1)用冒泡法将一个数组排成升序的函数-SUB1;(2)在升序数组中插入一个数,并且保持该数组仍为升序数组的函数-SUB2。主函数:输入任意 10 个正整数给数组;调用 SUB1 对数组进行排序;从键盘输入一个正整数,调用SUB2将其插入该数组。#include#include void main()int i,k,a12=0;/a0 for no use void sub1(int b),sub2(int b,int k);clrscr();printf(Please input 10 numbers:);for(i=1;i=10;i+)scanf(%d,&ai);getchar();sub1(a);12 for(i=1;i=10;i+)printf(na%d=%dn,i,ai);printf(nnplease input a number to be inserted into the array:);scanf(%d,&k);sub2(a,k);for(i=1;i=11;i+)printf(na%d=%dn,i,ai);puts(nAny key to exit!);getch();void sub1(b)int b;int i,j,t;for(i=1;i10;i+)/the first one is always the smallest for(j=i;jbj)t=bi;bi=bj;bj=t;void sub2(int b,int k)int i;for(i=10;i=1;i-)13 if(kbi)bi+1=bi;else bi+1=k;break;5、编写函数:(1)用选择法将数组排成降序的函数-SUB1;(2)用折半查找法查找某数是否在给定的数组当中的函数-SUB2。主函数:输入任意 10 个正整数给数组,调用 SUB1对数组进行排序,从键盘输入一个正整数,调用SUB2 在数组中进行查找,找到后输出“OK”,没有找到则输出“NO FOUND!”。#include#include void main()int i,key,a11=0,sub1(),sub2();printf(please input 10 number:);for(i=1;i=10;i+)scanf(%d,&ai);getchar();sub1(a);for(i=0;i=10;i+)printf(a%d=%d,i,ai);printf(n please input a key number:);scanf(%d,&key);sub2(a,key,1,10);14 getch();int sub1(int b)int t,i,j,post;for(i=1;i10;i+)post=i;for(j=i+1;jbj)post=j;if(post!=i)t=bi;bi=bpost;bpost=t;return 0;int sub2(int c,int k,int n0,int n1)int i=n0,j=n1,m;m=(i+j)/2;while(i=j)if(kcm)15 i=m+1;if(k=cm)break;m=(i+j)/2;if(k=cm)printf(OK!n);else printf(NO FOUND!n);return 0;6、编写一个程序,输入两个包含5 个元素的数组,先将两个数组升序排列,然后将这两个数组合并成一个升序数组。#include#include void main()int i,j,k,a6=0,b6=0,c11=0,sub1();clrscr();printf(nplease input 5 int numbers to array1:);for(i=1;i=5;i+)/a0 for no use scanf(%d,&ai);getchar();sub1(a,5);printf(nplease input 5 int numbers to array2:);for(i=1;i=5;i+)/b0 for no use scanf(%d,&bi);getchar();sub1(b,5);16 printf(nthe sorted array a is:nn);for(i=1;i=5;i+)printf(a%d=%d,i,ai);printf(n);printf(nthe sorted array b is:nn);for(i=1;i=5;i+)printf(b%d=%d,i,bi);k=i=j=1;while(i=5&j=5)if(aibj)ck+=ai+;/c0 for no use else ck+=bj+;if(ij)/appending the rest ones in array a for(;i=5;i+)ck+=ai;else/appending the rest ones in array b for(;j=5;j+)ck+=bj;printf(nn);printf(nthe merged array c is:nn);for(k=1;k=10;k+)if(k=6)printf(n);printf(c%d=%d,k,ck);while(!kbhit();17 int sub1(int b,int n)int t,i,j,post;for(i=1;in;i+)post=i;for(j=i+1;jbj)post=j;if(post!=i)j j t=bi;bi=bpost;bpost=t;return 0;7、耶稣有 13 个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13 人围坐一圈,从第一个开始报号:1,2,3,1,2,3,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。/*/approach one#define N 13#include#include struct person 18 int number;/its order in the original circle int nextp;/record its next person;struct person linkN+1;/link0 for no use void main()int i,count,next;/count for 12 persons,and/next for the person not out of circle yet clrscr();for(i=1;i=N;i+)linki.number=i;/numbering each person if(i=N)linki.nextp=1;else linki.nextp=i+1;/numbering each next person printf(nThe sequence out of the circle is:n);for(next=1,count=1;countN;count+)/count until 12 persons i=1;while(i!=3)/i counts 1,2,3 do/skip the ones whose numbers are zero next=linknext.nextp;while(linknext.number=0);/end of do i+;19 printf(%3d,linknext.number);linknext.number=0;/indicate out of circle already do/start from the ones whose numbers are not zero next time next=linknext.nextp;while(linknext.number=0);printf(nnThe betrayer of them is:);for(i=1;i=N;i+)if(linki.number)printf(%3dn,linki.number);getch();*/approach two using cyclic list#define N 13#define LEN sizeof(struct person)#include#include#include#include/struct person/permit struct placed here/int number;/struct person*next;/;void main()20 int i,count;struct person/or permit struct placed here also/int number;struct person*next;struct person*head,*p1,*p2;clrscr();head=p2=NULL;for(i=1;inumber=i;if(head=NULL)head=p1;else p2-next=p1;p2=p1;p2-next=head;printf(nthe sequence out of the circle is:n);for(count=1;countnext;21 i+;p2=head;printf(%3d,p2-number);p1-next=head=p2-next;free(p2);printf(nThe betrayer of them is:n%3d,head-number);getch();15、按如下图形打印杨辉三角形的前10 行。其特点是两个腰上的数都为 1,其它位置上的每一个数是它上一行相邻两个整数之和。1 11 12 1 13 3 1 14 6 4 1#include#include#define N 10 void main()int i,j,k,aNN;clrscr();for(i=0;iN;i+)/initialize aNN ai0=1;aii=1;for(i=2;iN;i+)/calculate 22 for(j=1;ji;j+)aij=ai-1j-1+ai-1j;for(i=0;iN;i+)/output for(k=0;k=3*(N-i);k+)printf();for(j=0;j=i;j+)printf(%6d,aij);printf(nn);getch();16、某班有 5 个学生,三门课。分别编写3 个函数实现以下要求:(1)求各门课的平均分;(2)找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;(3)找出三门课平均成绩在85-90 分的学生,并输出其学号和姓名主程序输入 5 个学生的成绩,然后调用上述函数输出结果。#define SNUM 5/*student number*/#define CNUM 3/*course number*/#include#include/*disp student info*/void DispScore(char num6,char name20,float scoreCNUM)int i,j;printf(nnStudent Info and Score:n);23 for(i=0;iSNUM;i+)printf(%s,numi);printf(%s,namei);for(j=0;jCNUM;j+)printf(%8.2f,scoreij);printf(nn);/*calculate all student average score*/void CalAver(float scoreCNUM)float sum,aver;int i,j;for(i=0;iCNUM;i+)sum=0;for(j=0;jSNUM;j+)sum=sum+scoreji;aver=sum/SNUM;printf(Average score of course%d is%8.2fn,i+1,aver);/*Find student:two courses no pass*/void FindNoPass(char num6,float scoreCNUM)int i,j,n;printf(nTwo Course No Pass Students:n);24 for(i=0;iSNUM;i+)n=0;for(j=0;jCNUM;j+)if(scoreij=2)printf(%s,numi);for(j=0;jCNUM;j+)if(scoreij60)printf(%8.2f,scoreij);printf(n);/*Find student:three courses 85-90*/void FindGoodStud(char num6,char name20,float scoreCNUM)int i,j,n;printf(nScore of three courses between 85 and 90:n);for(i=0;iSNUM;i+)n=0;for(j=0;j=85&scoreij=90)n+;25 if(n=3)printf(%s%sn,numi,namei);/*input student info*/void main()char numSNUM6,nameSNUM20;/array num refers to student number float scoreSNUMCNUM;/and its length is 6 int i,j;clrscr();printf(nPlease input student num and score:n);for(i=0;i SNUM;i+)printf(nnStudent%d number:,i+1);scanf(%s,numi);printf(nStudent%d name:,i+1);scanf(%s,namei);printf(nStudent%d three scores:,i+1);for(j=0;jCNUM;j+)scanf(%f,&scoreij);DispScore(num,name,score);CalAver(score);FindNoPass(num,score);FindGoodStud(num,name,score);26 getch();17、编写一人个求 X的 Y次幂的递归函数,X为 double 型,y 为 int型,要求从主函数输入x,y 的值,调用函数求其幂。#include#include double fact(double x,int y)if(y=1)return x;else return x*fact(x,y-1);void main()double x;int y;clrscr();printf(nPlease x,y:);scanf(%lf%d,&x,&y);printf(nxy=%.2lf,fact(x,y);getch();18、打印魔方阵。所谓魔方阵是指这样的的方阵:它的每一行、每一列和对角线之和均相等。输入 n,要求打印由自然数1 到 n2 的自然数构成的魔方阵(n 为奇数)。例如,当 n=3 时,魔方阵为:8 1 6 3 5 7 4 9 2 27 魔方阵中各数排列规律为:将“1”放在第一行的中间一列;从“2”开始直到 nn 为止的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数同样加 1;如果上一数的行数为1,则下一个数的行数为n(最下一行),如在 33 方阵中,1 在第 1 行,则 2 应放在第 3 行第 3 列。当上一个数的列数为n 时,下一个数的列数应为1,行数减 1。如 2 在第 3 行第 3 列,3 应在第 2 行第 1 列。如果按上面规则确定的位置上已有数,或上一个数是第1 行第 n列时,则把下一个数放在上一个数的下面。如按上面的规定,4 应放在第 1 行第 2 列,但该位置已被1 占据,所以 4 就放在 3 的下面。由于 6 是第 1 行第 3 列(即最后一列),故7 放在 6 下面。#include#include#define Max 15 void main()int i,row,col,odd;int mMaxMax;clrscr();printf(nPlease input an odd:);scanf(%d,&odd);if(odd=0|odd%2=0)printf(nInput Error!n);getch();return 0;printf(nodd=%dnn,odd);row=0;col=odd/2;/1 placed in the middle of the first row 28 for(i=1;i=odd*odd;i+)mrowcol=i;if(i%odd=0)/to the last col if(row=odd-1)/to the last row row=0;else row+;else/outmost else if(row=0)row=odd-1;else row-;if(col=odd-1)col=0;else col+;/end of outmost else /end of for for(row=0;rowodd;row+)for(col=0;colodd;col+)printf(%4d,mrowcol);printf(nn);getch();return 0;29 19、找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没有“鞍点”),打印出有关信息。#define N 20#define M 20#include#include void main()int aNM;/int a;not allowed here int i,j,k,row,col,n,m,find=0;clrscr();printf(nEnter n&m:nn);scanf(%d%d,&n,&m);printf(nEnter a00-a%d%dnn,n-1,m-1);for(i=0;in;i+)for(j=0;jm;j+)scanf(%d,&aij);printf(nnThe array you have just entered is:n);for(i=0;in;i+)for(j=0;jm;j+)printf(%5d,aij);printf(nn);/find the point for(i=0;in;i+)for(col=0,j=1;jm;j+)if(aicolaij)/find col,select sort according to col col=j;30 for(row=0,k=1;kakcol)/find row,select sort according to row row=k;if(i=row)find=1;printf(The point is a%d%d.n,row,col);if(!find)printf(nNo solution.n);getch();20、马克思在数学手稿 中提出如下问题:有 30 个人(包括男人、女人和小孩)在一家饭店吃饭共花50 先令,其中每个男人花3 先令,每个女人花 2 先令,每个小孩花 1 先令,问男人、女人、小孩各有多少人?#include#include void main()int man,woman,child,money=50,count=30;int i,j,k;clrscr();printf(They consist of:nn);for(i=0;i=count;i+)for(j=0;j=count;j+)for(k=0;k=count;k+)if(i+j+k=count&3*i+2*j+k=money)31 printf(man=%2d woman=%2d child=%2dn,i,j,k);printf(n);getch();21、定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days 函数,计算后将日子传递回主函数输出。#include#include struct ymd int day;int month;int year;int dayof13=0,31,28,31,30,31,30,31,31,30,31,30,31;int days(struct ymd*p)int i,d;if(p-year%4=0&p-year%100!=0|p-year%400=0)dayof2=29;d=p-day;for(i=1;imonth;i+)d=d+dayofi;return(d);32 void main()struct ymd date;int d;clrscr();for(;)printf(n-nn);printf(date(yyyy/mm/dd)=?(yyyy=0-Exit)nn);scanf(%d/%d/%d,&date.year,&date.month,&date.day);if(date.year=0)break;d=days(&date);printf(nThe day of the year is%d!nn,d);22、建立一个链表,每个结点包括:学号、姓名、性别、年龄,输入一个学号,如果链表中的结点包括该学号,则输出该结点内容后,并将其结点删去。#define LEN sizeof(struct stud_node)#include#include#include struct stud_record char StudNo6;char StudName10;char StudSex;/*M-Male F-Female*/33 int StudAge;struct stud_node struct stud_record stud_mem;struct stud_node*next;/*Create Student Linear table*/struct stud_node*create()struct stud_node*head,*p,*q;char vno6,vname10,vsex;int vage;head=NULL;while(1)printf(nPlease input a student recordnnNotNametSextAgenn);scanf(%s,vno);getchar();if(strcmp(vno,0)=0)/when vno=0 to exit break;scanf(%s,vname);getchar();scanf(%c%d,&vsex,&vage);getchar();p=(struct stud_node*)malloc(LEN);/allocate space to node p strcpy(p-stud_mem.StudNo,vno);34 strcpy(p-stud_mem.StudName,vname);p-stud_mem.StudSex=vsex;p-stud_mem.StudAge=vage;if(head=NULL)head=p;else q-next=p;/q is the previous node of p q=p;if(head!=NULL)q-next=NULL;/the last node has no child return head;/*Find a student and If Found then Delete the node*/struct stud_node*delete(struct stud_node*head,char no6)struct stud_node*p,*q;p=head;q=p;while(p)if(strcmp(p-stud_mem.StudNo,no)=0)/*Delete the node*/if(p=head)/delete the first node head=p-next;else if(p-next!=NULL)/delete the middle node q-next=p-next;35 else/delete the last node q-next=NULL;printf(ntt%st%st%ct%dn,p-stud_mem.StudNo,p-stud_mem.StudName,p-stud_mem.StudSex,p-stud_mem.StudAge);free(p);break;q=p;p=p-next;return head;/*Disp linear table content*/void prn(struct stud_node*head)struct stud_node*p;int i=1;p=head;printf(nRecordtNotNametSextAgen);while(p)printf(%3dt%st%st%ct%dn,i,p-stud_mem.StudNo,p-stud_mem.StudName,p-stud_mem.StudSex,p-stud_mem.StudAge);p=p-next;i+;36 /*main program here*/void main()struct stud_node*head;char no6;clrscr();head=create();prn(head);getch();printf(nPlease input a studno to Find:);gets(no);head=delete(head,no);prn(head);getch();23、给定一个日期,求出该日为星期几(已知 2002-3-28为星期四)。#include#include struct ymd int year;int month;int day;/*if a year is a leap one*/int yn_rn(int year)37 if(year%4=0&year%100!=0|year%400=0)return 1;else return 0;/*return which day in the year*/int d_of_day(struct ymd dayof)int days13=0,31,28,31,30,31,30,31,31,30,31,30,31;int i,d=0;if(yn_rn(dayof.year)days2=29;for(i=1;iday2,or negative days if day1day2.year)for(i=day2.year;iday1.year;i+)if(yn_rn(i)38 diff=diff+366;else diff=diff+365;else for(i=day1.year;iday2.year;i+)if(yn_rn(i)diff=diff-366;else diff=diff-365;return diff+d1-d2;void main()struct ymd oldday,day;int oldweek,week,diff;char*rq7=Sun,Mon,Tue,Wen,Thu,Fri,Sat;clrscr();/*2003-4-3:Thursday*/oldday.year=2003;oldday.month=4;oldday.day=3;oldweek=4;printf(nPlease input day(YYYY-MM-DD):);scanf(%d-%d-%d,&day.year,&day.month,&day.day);diff=day_diff(day,oldday);39 week=(diff%7+oldweek)%7;printf(n%d*%d-%d:%sn,day.year,day.month,day.day,rqweek);getch();24、用递归法将一个