语言编程题经典40题附解答11.ppt

上传人:sccc 文档编号:5669423 上传时间:2023-08-07 格式:PPT 页数:62 大小:868.04KB
返回 下载 相关 举报
语言编程题经典40题附解答11.ppt_第1页
第1页 / 共62页
语言编程题经典40题附解答11.ppt_第2页
第2页 / 共62页
语言编程题经典40题附解答11.ppt_第3页
第3页 / 共62页
语言编程题经典40题附解答11.ppt_第4页
第4页 / 共62页
语言编程题经典40题附解答11.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《语言编程题经典40题附解答11.ppt》由会员分享,可在线阅读,更多相关《语言编程题经典40题附解答11.ppt(62页珍藏版)》请在三一办公上搜索。

1、1、定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的参数。输出已交换后的两个值。,#define EXCHANGE(A,B,X)X=A;A=B;B=X main()int a,b,x;printf(“input a and b:”);scanf(“%d,%d”,2、编写程序,输入两个整数,求它们相除的余数。用带参的宏来实现。,#define R(A,B)A%B,main()int a,b;printf(“input a and b:”);scanf(“%d,%d”,3、分别用函数和带参的宏,从3个数中找出最大值。,int max(int a,int b,int c)i

2、nt x;x=(a b)?a:b;x=(x c)?x:c;return(x);,main()int x,y,z,m;printf(“input x,y,z”);scanf(“%d,%d,%d”,#define MAX(A,B,C,M)(M=A B?A:B)C?M:C,4、求和:S1-(1/2)+(1/3)-(1/4)+(1/n),其中 n=10。,方法1:,void main()int i,n=10;float s=0;for(i=1;i=n;i+)s=s+(i%2=1)?(1.0/i):(-1)*(1.0/i);printf(“s=%fn”,s);,方法2:求 s1-(1/2)+(1/3)-

3、(1/4)+(1/n)其中 n=10,void main()int i,n=10,f=-1;float s=0;for(i=1;i=n;i+)f=-f;s+=f*(1.0/i);printf(“s=%fn”,s);,5、编写程序,求sum1-3+5-7+-99+101,方法1:,void main()int i;float sum=0;for(i=1;i=101;i+=4)sum+=i;for(i=3;i=99;i+=4)sum-=i;printf(“sum=%fn”,sum);,方法2:求 sum1-3+5-7+-99+101,void main()int i,f=-1;float sum=

4、0;for(i=1;i=101;i+=2)f=-f;sum+=f*i;printf(“sum=%fn”,sum);,6、打印如下数字三角形:,1 121 12321 1234321 12345678987654321,void main()int i,j;for(i=1;i0;j-)printf(“%d”,j);printf(“n”);,7、编写程序,输出左下三角的九九口诀表。,1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12

5、3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,输出左下三角的九九口诀表的程序如下:,void main()int i,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%4d*%d=%2d”,i,j,i*j);printf(“n”

6、);,8、铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤加收0.10元。编一程序实现自动计费功能。,double money(double w)if(w=50)return 0.15*w;else return 0.75+0.1*(w-50);,void main()int w;double f;do printf(“请输入行李重量:”);scanf(“%d”,9、编写函数,将两个递增有序的表,合并成一个递增有序的表。,#define N 50#define SeqList struct seqlistSeqList int dataN;

7、int length;,合并函数如下:,SeqList*mergelist(a,b)SeqList a,b;SeqList c;int i=0,j=0,k=0;while(ia.length),10、冒泡排序(Bubble Sorting)李丽娟教材p156题7.37,两两比较相邻元素,若反序则交换,直到无反序的记录为止。,(1)冒泡排序的基本思想,在冒泡排序的过程中,各元素不断接近自己的位置。如果一趟比较下来没有进行过交换,就说明记录序列已经有序,不需继续排序下去。因此设置一个标志变量exchange,在每趟排序开始前,首先假设该趟不会有数据交换,置exchange为0;以后一旦发生数据交换

8、,就对exchange置1。若一趟排序结束,exchange仍然为0,则说明该趟排序过程中已无反序记录。因此,没有必要再进行下一趟排序。,例如,n=6,数组R的6个关键字分别为:14,20,25,17,3,9冒泡排序算法的执行过程如下图所示。,四,三,二,一,9,17,25,20,14,3,i,j,(2)冒泡排序算法,void Bubblesort(int R,int n)/*对数组R0.n-1按递增序进行冒泡排序*/int i,j,temp,exchange;for(i=0;i i;j-)if(RjRj-1)/*若反序则交换,将较小的元素往上调*/temp=Rj;Rj=Rj-1;Rj-1=t

9、emp;exchange=1;if(exchange=0)return;/*本趟排序未发生数据交换,提前返回*/,11、将一个数插入到有序的数列中去,要求插入后,仍然保持数列的有序性。李丽娟教材p156题7.38,1、方法与步骤,(1)读入n个数到数组aN中(要求Nn)。(2)对an按递增序进行排序。(3)输出插入前的有序序列。(4)读入要插入的数x。(5)设置游标i从表尾开始搜索插入位置,若ai大于x则将ai移到ai+1位置。(6)一旦出现ai小于x,则将x插入到i+1位置。(7)输出插入后的有序序列。,(3)完整的程序如下,#include“stdio.h”#define N 10main

10、()int i,j,x,n,aN;/*数字a的最大容量为N*/printf(“请输入数组的实际元素个数n:n”);scanf(“%d”,/*排序*/output(a,n);/*输出插入前的序列*/,scanf(“%d”,/*插入元素x*/,output(a,n);/*输出插入后的序列*/,直接选择排序函数如下:,void selectsort(int b,int n)int i,j,k,temp;for(i=0;i=n-2;i+)k=i;/*假设 i 位置上就是最小的*/for(j=i+1;j=n-1;j+)if(bjbk)k=j;if(k!=i)temp=bi;bi=bk;bk=temp;,

11、输出一维数组的函数如下:,void output(int b,int n)int i;printf(“n”);for(i=0;in;i+)printf(“%5d”,bi);printf(“n”);,12、猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上,将剩下的桃子吃掉一半又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个;到第10天早上就只剩下一个桃子了。编写程序,求第一天共摘了多少个桃子?,分析:设第一天的桃子数为x1,第二天的桃子数为x2;则有:x2x1-x1/2-1 即:x12*(x2+1)亦即:前一天的桃子数是后一天桃子数加1后的2倍。由此得知,第9天的

12、桃子数是第10天桃子数加1后的2倍。第8天的桃子数是第9天桃子数加1后的2倍。第1天的桃子数是第2天桃子数加1后的2倍。,程序如下:,void main()int day,x1,x2;day=9;x2=1;while(day0)x1=(x2+1)*2;x2=x1;day-;printf(“第一天的桃子数为:”,x1);,13、分别用递归和非递归的方法将一个整数转换成字符串。李丽娟教材p126题6.46:,非递归方法的基本思想,对于给定的整数n,从低位向高位逐位截取每一位上的数字,并保存到数组a的从0号位置开始的相应位置上。然后,从数组a中反向逐位取出相应位置上的数字并转换为相应的字符输出。,#

13、include void convert(int n)int i,j,a5;i=0;while(n!=0)ai+=n%10;/*截取n的最低位上的数字保存到ai位置上*/n=n/10;/*将n缩小10倍*/,非递归函数:,j=i-1;while(j=0)putchar(aj+0);/*将aj位置上的数字转换为对应的字符*/j=j-1;,#include void convert(int n)int k;if(k=n/10)!=0)convert(k);/*截取n的最低位上的数字保存到栈中,并使 n 缩小10倍*/putchar(n%10+0);/*逐次弹出栈顶数字,并将其转换为对应的字符输出*

14、/,递归函数:,void main()int num;printf(“input a integer number:”);scanf(“%d”,主函数:,14、用递归的方法求 1+2+3+n。李丽娟教材p126题6.43:,假设输入 5 n,3.执行过程:,main()y=add(5);,add(4)s=4+add(3);return s;,add(3)s=3+add(2);return s;,n=4,n=3,add=6,add(2)s=2+add(1);return s;,add(1)s=1;return s;,n=1,add=1,n=2,add=3,add=10,add(5)s=5+add

15、(4);return s;,add=15,n=5,int add(int n),int s;,if(n=1),else s=n+add(n 1);,return(s);,s=1;,main(),int n,y;,scanf(%d,y=add(n);,printf(“%d的累加和=%d,n,y);,15、编写递归函数reverse,将字符串s颠倒过来输出。,void reverse(char s,int i)/*第一次调用时,i为0*/if(si+1!=0)reverse(s,i+1);putchar(si);,16、任意输入一个整数,将其各位数字反序输出(例如,输入1234,输出4321)。,

16、int reverse(int n)int num;for(num=0;n0;n/=10)num=num*10+n%10;return num;,17、将一个长度不超过4的数字字符串转换成一个整数。例如,字符串为“3248”,则转换成整数3248。,int atoi(char*nst)int i,num=0;for(i=0;sti!=0;i+)num=num*10+nsti-0;return num;,18、编写程序,将任意一个字符串从第一个字符开始间隔地输出该串。例如,字符串为:abcdef,输出:ace。,#define N 20,void main()int i;char strN;pr

17、intf(“please enter a string:”);scanf(“%s”,str);output(str);,void output(char str)int i;printf(“n”);for(i=0;sti!=0;i+)if(i%2=0)putchar(stri);,19、输入一串字符以结束,如果它是大写字母,则转换为小写字母输出,如果是小写字母,则转换为大写字母输出,如果不是字母,则照直输出。,while(ch=getchar()!=#)if(ch=A,20、编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值,并输出复制结果,在被

18、调函数中完成复制。,#define MAX 80 void copystr(char*str1,char*str2,int n)int i=0;while(str2m!=0)str1i+=str2m+;str1i=0;,void main()int m;char st1MAX,st2MAX;printf(“please enter a string:”);scanf(“%s”,st2);printf(“please enter a number:”);scanf(“%d”,21、编写函数,求一个字符串的长度。(不能调用strlen函数),int strlenth(char*st)int i=0

19、;while(sti!=0)i+;return i;,22、编写程序,将两个字符串连接起来。(要求不用strcat函数),#define MAX 100char*stcat(char*str1,char*str2)char strMAX;int i=0,j=0,k=0;while(str1i!=0)strk+=str i+);while(str2j!=0)strk+=str j+);strk=0;return str;,23、编写程序,输入一行字符,分别统计出其中英文字母、空格(含n、t)、数字和其它字符的个数。,void main()int c,i,nchar=0,ndigit=0,nwhi

20、te=0,nother=0;while(c=getchar()!=EOF)if(c=a,24、编写程序,统计从键盘输入的字符个数和行数。,void main()int c,nc=0,nl=0;while(c=getchar()!=EOF)if(c=n)+nl;+nc;printf(“lines:%d.n chars:%d.n”,nl,nc);,25、编写一个译码函数,把一个英语句子译成数字代码。译码规则是:以数字1代替字母a,数字2代替字母b,数字26代替字母z;以数字27代替字母A,数字28代替字母B,数字52代替字母Z;以空格符代替星号*。英文句子以.结束。,void tran(char*

21、st)int i;for(i=0;sti!=.;i+)if(sti=a,*26、用结构体存放下表中的数据,然后输出每人的姓名和实发工资数(基本工资+浮动工资 支出)。,【分析及解答】显然,该结构体应有四个成员:姓名、基本工资、浮动工资和支出,实发数为后三个成员之和差运算。在输出时,要注意输出格式的控制,特别是对实发工资应定义其小数位数。本题也可定义指向结构体的指针,请同学们自已完成。程序如下:,#include struct worker char name10;float base,flow,out;a3=zhao,240,400,75,qian,360,120,50,sun,560,0,8

22、0;,main()int i;for(i=0;i3;i+)printf(name:%s”,ai.name);printf(salary:%10.2f,ai.base+ai.flow-ai.out);,*27、编一个程序,输入10个员工的序号、姓名、基本工资、职务工资;求出其中“基本工资职务工资”最少的员工姓名并输出。,【分析及解答】本题要定义有四个成员的结构体数组,并在该结构体数组中求最小值。程序中,用变量flag存放最少工资员工的序号,其初值为0。同样可使用结构体指针来完成。程序如下:,#include struct worker int no;char name10;float base,

23、rank;a10;,main()int i,flag=0;for(i=0;i10;i+)scanf(%s,ai.name);scanf(%d,&ai.no);scanf(%f%f,&ai.base,&ai.rank);for(i=1;i10;i+)if(ai.base+ai.rank aflag.base+aflag.rank)flag=i;printf(name:%s,aflag.name);,28、编一个程序,输出10个学生的学号、姓名、门课程的成绩,求出总分最高的学生姓名并输出。(此题与李丽娟教材p231题9.38相似),【分析及解答】本题与上题类似,只是将求最小值改为求最大值而已。同样

24、是用变量flag存放最大值即最高分学生的序号,其初值也为0。程序如下:,#include struct student int no;char name10;float chinese,math,eng;a10;,void main()int i,sum1,sum2,flag=0;for(i=0;i sum1)flag=i;printf(name:%s,aflag.name);,29、编一个程序,输出下列学生成绩表中的数据,并用结构体数组存放。然后输出三门课程的名称和平均分数。,【分析及解答】本题解法与以上几题相似,只是增加了求平均值的运算。另外,在输出时,注意换行控制。,程序如下:,#inc

25、lude,struct student char name16;float score3;a4=Zhao,97.5,89,78,Qian,90,93,87.5,Sun,75,79.5,68.5,Li,82.5,69.5,54;,char cases310=VF,VB,VC;,/*cases0、cases1、cases2用来存放课程名称*/,void main()int i,j;float sum;for(i=0;i3;i+)printf(n Case:%st,casesi);sum=0;for(j=0;j4;j+)sum+=aj.scorei;sum/=4;printf(Avg score:%

26、fn,sum);,30、某专业本学期开设课程有:数学(math)、英语(english)、程序设计(program),根据你所在班的实际人数,设计5个函数:(1)从键盘输入每一个同学的学号(num)、姓名(name)及各门课程的成绩(score);(2)求出每个同学的总成绩。(3)从屏幕输出总分最高的学生的学号、姓名、各单科成绩及总成绩。(4)从屏幕输出某门课程、某个分数段的学生的学号、姓名和该门课程的成绩。(5)按平均分从高到低顺序,输出全班同学的学号、姓名和平均分。再编写一个主函数进行测试。,31、编一个程序,从键盘输入200个字符,存入名为“f1.t”的磁盘文件中。,【分析及解答】,因为

27、有文件操作,所以程序头部必须有一条语句:#include stdio.h”,程序先创建文件f1.t,然后从键盘每键入一个字符就往文件中写一个字符,直至完成。,程序主函数中定义了一个局部变量int n,用做计数器,键盘读取用库函数int getchar()。,它定义了数据类型FILE和文件操作库函数的说明。,#include stdio.hmain()FILE*fp;int n;if(fp=fopen(f1.t,w)=NULL)printf(Cannot open file!n);exit(1);for(n=0;n200;n+)fputc(getchar(),fp);fclose(fp);,程序

28、如下:,32、从上一题中建立的名为 f1.t 的磁盘文件中读取120个字符,并显示在屏幕上。,【分析及解答】程序先打开文件f1.t,然后读一字符显示一个字符。程序主函数中定义了一个局部变量int n,用于计数,从文件中读取字符用库函数int fgetc(FILE*fp),显示字符用库函数int putchar(int ch)。,#include stdio.h main()FILE*fp;int n;if(fp=fopen(f1.t”,r)=NULL)printf(Cannot open file!n);exit(1);for(n=0;n120;n+)putchar(fgetc(fp);fcl

29、ose(fp);,33、输入100个学生的信息(含学号、姓名、年龄、7科成绩、总分),统计所有学生的总分,并存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分最高的学生并输出该生的所有信息。,【分析及解答】,用一个结构体student来表示学生信息。先创建二进制文件 student.dat,在输入学生信息后就计算总分,然后写入文件。重复100次,完成学生信息存入。设置整型变量m存放最高总分值,整型变量n记录最高总分者的编号。寻找结束后,用库函数fseek定位至最高总分的学生所在的位置,读出后显示。,#include stdio.hstruct student long

30、num;char name10;int age;int subj7;int scoret;s1;,main()FILE*f1;int m,n,j;if(f1=fopen(student.dat,wb)=NULL)printf(Cannot open file!n);exit(0);/*以上先创建二进制文件,作好写准备*/*以下为输入学生信息,计算总分,并写入文件*/,for(m=1;m=100;m+)printf(nNumber:);scanf(%ld,/*以上先关闭文件,再以读的方式打开。下面是查找总分最高者,m存放最高总分,n存放最高总分学生的编号。*/,m=0;for(j=0;jm)/*

31、当前学生总分更高,则更新m,n的值*/m=s1.scoret;n=j;fseek(f1,(long)n*sizeof(struct student),0);fread(,34、编程序对名为CCW.TXT的磁盘文件中“”之前的所有字符加密,加密方法是每个字节的内容减10。,【分析及解答】,程序要求打开的文件是可读又可写,所以文件打开模式字符串是:“r+“。文件指针f1读取”明文”字符后,将文件读写指针用库函数fseek(f1,-1L,1)退回一格。将加密后的字符写到该字符原来的位置。判断原明文字符是否为结束标志,是则结束处理,否则继续处理,直至结束。程序中将结束标志字符也加密,避免密文中出现结束

32、标志字符,导致解密错误。库函数 fseek(f1,-1L,1)参数的第一项表示对应的文件,第二项表示移动的长度,是长整型量。第三项表示参照位置:0表示从文件头,1表示从当前位置,2 表示从文件尾。程序如下:,#include stdio.h main()FILE*f1;char c;if(f1=fopen(ccw.txt,r+)=NULL)printf(Cannot open file!n);exit(0);while(!feof(f1)c=fgetc(f1);fseek(f1,-1L,1);/*将文件读写指针退回一格*/fputc(c-10,f1);/*将加密后的字符写入到该字符本身的位置*

33、/if(c=)exit(0);fclose(f1);,35.分别编写三个程序打印下列三个图形。,36.按每行5个数打印输出100300之间的所有素数。算法思想: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 123,所以,6是完数。),38.求出10至1000之内能同时被2、3、7整除的数,并输出。,39.输入两个正整数,输出它们的最大公约数。【提示】求最大公约数有两种基本算法,其一:找出两整数中的最小的一个,最大公约数必在1与最小整数的范围内。然后从大到小,一一测试,即可找到。其二:辗转相除法(设ab,r为余数)。求a/b的余数r;若r=0,则b为最大公约数,若r0,执行第步;将b的值放在a中,将r的值放在b中;执行第步。,40.计算e=1+的值并输出(设n=20)。,41.生成Fibonacci数列的前20项并输出。Fibonacci数列为:1,1,2,3,5,8,13,21,34,,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号