C语言经典习题与解答.doc_第1页
C语言经典习题与解答.doc_第2页
C语言经典习题与解答.doc_第3页
C语言经典习题与解答.doc_第4页
C语言经典习题与解答.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本学期程序设计基础课程实行上机考核,现将考核有关事项通知如下:(1) 考核时间:本学期最后一次上机时间为机试。(2) 考核内容:主要是算法设计与实现。考题来自本学期布置的作业、例题及一些补充的题目。(3) 考试形式:机试前进入机房时,每人随机抽取一道题(同一个组的同学保证不抽到同一题),然后上机编程,调试通过后报告监考人员审核,审核通过后将源程序拷贝到监考人员U盘上,然后可以离开机房。源程序文件明必须是“学号姓名.cpp”,如“2012216827王梓丞.cpp”。(4) 考试要求:机试时考试规则同课堂考试一致,不允许带书、纸张等。不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的U盘、磁盘或计算器) ,不能携带任何类型的通讯工具,包括无线电接收器、移动电话。(5) 考试成绩:本次机试成绩将在程序设计基础课程成绩中占25%的比重。(6) 其它有关事项由主考教师和监考人员负责处理。附:考试题集1. 学校曾经组织一次“程序设计大奖赛”,规定本学期序设计”课程的成绩可以因为在大奖赛上获奖而加5分,总分不超过100分。编程序“程,输入某同学的考试成绩,回答是否在竞赛中获奖,计算并输出该某同学的程序设计课成绩 。#includestdio.hint mark;char m;void main()printf(请输入卷面成绩:,mark);scanf(%d,&mark);getchar();printf(请输入是否获奖,是y,否n:);m=getchar(); if(m=y) mark=mark+5; if(mark100) mark=100;printf(你的最后成绩:%dn,mark);2. 编写一个程序,用户输入年份及月份两个数据,程序输出该月份的天数。(提示:对2月要考虑是否闰年,闰年年份要么能被4整除且不能被100整除,要么能被400整除,除此之外都不是闰年)。#includestdio.hint year,month;int days(int year,int month)int k;if(year%4=0)&(year%100!=0)|(year%400=0) if(month=2) k=1; if(month=4|month=6|month=9|month=11) k=2;if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) k=3;else if(month=2) k=4; if(month=4|month=6|month=9|month=11) k=5; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) k=6;switch(k) case 1:printf(29daysn);break; case 2:printf(30daysn);break; case 3:printf(31daysn);break; case 4:printf(28daysn);break; case 5:printf(30daysn);break; case 6:printf(31daysn);break;return 0;void main()printf(please input the year and month:,year,month);scanf(%d%d,&year,&month);days(year,month);3. 求一元二次方程ax2+bx+c=0的根。(要考虑a、b、c三个系数不同的取值)#include #include void main()float a,b,c,delta;printf(input the three coefficients of the equation(A,B,C): );scanf(%f%f%f,&a,&b,&c);if(a!=0) delta=b*b-4*a*c;if(delta0) printf(x1=%f ,x2=%fn,(-b+sqrt(delta)/(2*a),(-b-sqrt(delta)/(2*a);elseif(delta=0) printf(x1=x2=%fn,-b/(2*a);else printf(x1=%f+%fi , x2=%f-%fin,-b/(2*a),sqrt(-delta)/(2*a),-b/(2*a),sqrt(-delta)/(2*a) );elseif(b!=0) printf(x=%fn,-c/b);elseif(c=0) printf(0=0!n);else printf(%f=0n,c);getchar();getchar();4. 学校曾经组织一次“程序设计大奖赛”,规定本学期“程序设计”课程的成绩可以根据大奖赛的成绩适度加分。加分规则是:参赛者加5分,三等奖加15分,二等奖加20分,一等奖加30分,总分不超过100分。编程序,输入某同学的考试成绩,回答在竞赛中获奖等级,计算并输出该某同学的程序设计课成绩 。#include int win;int mark;void main(void)printf(输入你的考试成绩:);scanf(%d,&mark);printf(请选择你参加程序设计大奖赛情况n);printf(0:未参赛,1:参赛,2:三等奖,3:二等奖,4:一等奖):);scanf(%d,&win);switch ( win ) case 0 :break ;case 1 :mark=mark+5;break ;case 2 :mark=mark+15;break ;case 3 :mark=mark+20;break ; case 4 :mark=mark+30;break ;if ( mark100 )mark = 100 ;printf(你的最后成绩是:%dn,mark);getchar();getchar();5. 高速公路每公里的收费标准按不同种类汽车如下: 小汽车( car ) 0.50 元 卡车( truck ) 1.00 元 大客车( bus ) 1.50 元编程序,为某高速公路收费站计算各种车辆的收费额。#include stdio.henum tsort car , truck , bus sort ; int i ; float mileage, price ;void main ( ) printf ( please choose ( 0.car 1.truck 2.bus ): ) ; scanf (%d, & i ) ; switch ( i ) case 0 : sort = car ; break ; case 1 : sort = truck ; break ; case 2 : sort = bus; printf ( please input mileage : ) ; scanf ( %f,&mileage ) ; switch ( sort ) case car : price = 0.50 ; break ; case truck : price = 1.00 ; break ; case bus : price = 1.50; printf( cost= %.2fn, price*mileage ); getchar();getchar(); 6. 设计一个模拟单步计算器的程序,设该计算器只能作加、减、乘、除运算。用户输入形如 m#n的算式,其中m、n为运算数,#为运算符。(需考虑运算符不合法,及除数为0的情况)#include stdio.hvoid main()float a,b;char w;printf(pleace input e#e:);scanf(%f,&a);scanf(%c,&w);scanf(%f,&b);switch(w)case +: a=a+b; break;case -: a=a-b; break;case *: a=a*b; break;case /: a=a/b;printf(%.2f n,a);getchar();getchar();7. 编写程序,输入一个4位自然数n,判断n是否是降序数。降序数是指对于n=d1d2dk有: d1d2dk#include stdio.hvoid main()int number,a,b,c,d;printf(please input a number:,number);scanf(%d,&number);a=number/1000;b=(number/100)%10;c=(number%100)/10;d=number%10;if(a=b)&(b=c)&(c=d) printf(这个数是降序数);else printf(这个数不是降序数);getchar();getchar();8. 编写程序,输入一个5位自然数n,判断n是否对称数。对称数是指正序和反序读都相等的整数,如96769为对称数。#includestdio.hbool judge(int number) int i,j; j=0; while(numberj+1!=0) j+; i=0; while(ij) if(numberi!=numberj) return false; i+;j-; return true;main()int i,number5;bool flag;printf(please a number:);for(i=0;i=4;i+)scanf(%d,&numberi);flag=judge(number);if(flag=true) printf(y);else printf(n);getchar();getchar();9. 编写程序,判断给定的3位数是否为Armstrong数。Armstrong数是指其值等于它每位数字立方和的数,如153就是一个Armstrong数。#includestdio.h#includemath.hint number,a,b,c;void main() printf(请输入一个三位数:); scanf(%d,&number); c=number%10; b=(number/10)%10; a=number/100; if(number=a*a*a+b*b*b+c*c*c) printf(这个数是Armstrong数!); else printf(这个数不是Armstrong数!);10. 编写程序,输入一个整数,判断它能否被3、5、7整数,并输出如下信息。(1) 能同时被3、5、7整数。(2) 能同时被两个数整数,并指明是被哪两个数整除。(3) 能被一个数整数,并指明这是哪个数。(4) 不能被所有3个数整除。#includestdio.h#includemath.hint number,i;void main() printf(请输入一个整数:); scanf(%d,&number); if(number%105=0) i=1;goto state; if(number%3!=0&number%35=0) i=2;goto state; if(number%5!=0&number%21=0) i=3;goto state; if(number%7!=0&number%15=0) i=4;goto state; if(number%3=0&number%35!=0) i=5;goto state; if(number%5=0&number%21!=0) i=6;goto state; if(number%7=0&number%15!=0) i=7;goto state; if(number%105!=0) i=8;goto state; state: i; switch(i) case 1:printf(这个数可以同时被3,5,7整除!);break; case 2:printf(这个数只可以被5,7整除!);break; case 3:printf(这个数只可以被3,7整除!);break; case 4:printf(这个数只可以被3,5整除!);break; case 5:printf(这个数只可以被3整除!);break; case 6:printf(这个数只可以被5整除!);break; case 7:printf(这个数只可以被7整除!);break; case 8:printf(这个数不可以被3,5,7整除!);break; 11. 邮局寄包裹的费用是根据包裹的重量来收取的。一个重量为2kg或低于2kg的包裹收取3.25元。高于2kg的包裹,超出部分每千克收取1.05元,超出部分不足1kg按1kg计算。因此如果发件人发送重达5.63kg的包裹,就需要缴纳7.45元。编写程序,输入包裹的重量,计算并输出发件人须缴纳的费用。#includestdio.h#includemath.hfloat money,kilo;void main()printf(请输入邮寄包裹的重量(单位:千克):);scanf(%f,&kilo); if(kilo=2.0)money=3.25; else money=3.25+(int)(kilo-2.0)+1.0)*1.05);printf(需要邮费money=%fn,money);12. 一个临时照顾孩子的人的收费标准是:18:00到21:30间每小时2元,21:30到午夜间每小时4元,18:00以前和午夜以后不照顾孩子。编写程序,输入开始时间和结束时间,计算并输出某一个雇工的薪酬。程序应检查无效的开始和结束时间。#includestdio.h#includemath.hint a,b,c,d;char m,n;float money;void main()printf(请输入开始时间starttime(时间在18:30和24:00之间)=);scanf(%d%c%d,&a,&m,&b);getchar();printf(请输入结束时间endtime(时间在18:30和24:00之间)=);scanf(%d%c%d,&c,&n,&d);getchar();if(a21&c=21&d=b) money=(c-a)+(float)(d-b)/60.0)*2.0; else money=(c-1-a)+(float)(d+60.0-b)/60.0)*2.0;elseif(a21) money=(20-a)+(float)(90-b)/60.0)*2.0+(c-21)+(float)(d+60-30)/60.0)*4.0; elsemoney=(c-1-a)+(float)(d+60-b)/60.0)*4.0;printf(money=%fn,money);13. 编写程序,按下述公式求自然对数底e的近似值。14. 编写程序,统计以100位结束符的整数输入流中-1、0、1的出现次数并将其输出。#include#define n 100void main()int i,j,k,num;i=0;j=0;k=0;printf(please input an integer:);scanf(%d,&num);while(num!=n)switch(num)case -1:i+;break;case 0:j+;break;case 1:k+;printf(please input an integer:);scanf(%d,&num);printf(number of -1:%dn,i);printf(number of 0:%dn,j);printf(number of 1:%dn,k);15. 编写程序,打印“99乘法表”1 12 2 43 3 6 94 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81* 1 2 3 4 5 6 7 8 9#include stdio.hvoid main() int i,j; for(i=1;i10;i+) printf(%4d,i); for(j=1;j=i;j+) printf(%4d,i*j); printf(n); printf(%4c,*); for(i=1;i10;i+) printf(%4d,i); getchar();16. 编写程序,打印200以内的素数,要求每行输出10个数。#include stdio.hvoid main( ) int i ,j ;bool flag;for ( i = 2 ;i = 2 ; j- )if ( i % j = 0 )flag=false ;if ( flag )printf(%5dt , i ) ;getchar();17. 编写程序,输出如下序列的前50项,此序列的第一项为0;第二项为1;以后的奇数项为其前两项之和;偶数项为其前两项之差。要求每行输出10个数。#include stdio.h#includemath.hvoid main()int number50=0,1;int i=3;do if(i%2=1) numberi=numberi-1+numberi-2; else numberi=numberi-1-numberi-2; i+; while(i=50);for(i=1;i=1;k-) n=n*k; return n;void main()int number,sum=0,i,j,k;printf(请输入一个整数:,number);scanf(%d,&number);j=number;do i=j%10; k=j/10; j=k; sum=sum+jiecheng(i);while(k!=0);printf(%dn,sum);19. 完数问题:若有一数,其值等于它的因子之和,则该数称为完数。例如,6的因子为、2、31,而6=1+2+3,故6是完数。编程输出1000之内的所有完数及其因子。20. 把一张1元钞票换成1分、2分和5分的硬币,每种至少有1枚,问有多少种换法?#includestdio.h#includemath.hint i,j,k;void main()for(i=1;i=100;i+)for(j=1;j=50;j+)for(k=1;k=20;k+) if(i+2*j+5*k=100) printf(一分的:%d 两分的:%d 五分的: %dn,i,j,k); 21. 斐波那契(Fibonacci)数列问题:Fibonacci数列递归定义为:x0=0,x1=1,xi+1=xi+xi-1, i=2,3,即从第二项开始,数列中的每一个元素等于前面两个元素之和。编程输出前20项Fibonacci数。(提示可以用递归或迭代两种方式编程)#includestdio.h#includemath.hint i,fibonacci20=1,1;void main()for(i=2;i=19;i+) fibonaccii=fibonaccii-1+fibonaccii-2; for(i=0;i=19;i+) printf(%5dt,fibonaccii);22. 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?#includestdio.h#includemath.hint i,j,k;void main()for(i=1;i=20;i+)for(j=1;j=33;j+)for(k=3;k=100;k=k+3)if(i+j+k=100)&(5*i+3*j+k/3=100) printf(公鸡:%d 母鸡:%d 小鸡:%dn,i,j,k);23. 编写程序,用循环语句控制打印如图所示的字符图形。 A B C D E F G H IB C D E F G H I AC D E F G H I A BD E F G H I A B CE F G H I A B C DD E F G H I A B CC D E F G H I A BB C D E F G H I AA B C D E F G H I#include stdio.hchar x , y ;int i ;void main( ) for ( x=A;x=F;x+) for ( y=x; y=I;y+)printf ( %c, y); for ( y=A; y=A;x-)for ( y=x; y=I;y+)printf ( %c, y);for ( y=A; y=x-1;y+)printf ( %c, y);printf ( n); getchar();24. 编写程序,打印如下图所示的图形 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 11 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 1#includestdio.h#includemath.hvoid main()int i,j,k,x;for(i=1;i=9;i+)for(j=1;j=2*(10-i);j+) printf( ); for(k=1;k=1;x-) printf( %d,x);printf(n);for(i=10;i=10;i+)for(j=1;j=2*(10-i);j+) printf( ); for(k=1;k=1;x-) printf( %d,x); printf(n);25. 验证哥德巴赫猜想:任意一个大偶数都可以分解为两个素数之和。用户输入一个大于6的偶数,程序计算并输出分解结果。#include stdio.h#includemath.hint sushu(int i) int j;int a=1;for(j=2;ji;j+)if(i%j=0) a=0; if(a=0|i=1) return 0; else return 1;void main ()int n,k,t;printf(请输入你想要分解的偶数:);scanf(%d,&n);for(k=2;kn;k+)t=n-k;if(sushu(k)&sushu(t)printf(%d+%d=%d,k,t,n);printf( 两素数分别是:%d,%dn,k,t);26. 编写一个程序解决爱因斯坦台阶问题:有人走以台阶,若以每步走2级则最后剩1级;若每步走3级则最后剩2级;若以每步走4级则最后剩3级;若以每步走5级则最后剩4级;若以每步走6级则最后剩5级;若以每步走7级则最后刚好不剩。问台阶共有几级?#include stdio.hint number,k=1;void main() for(number=7*k;(7*k+1)%30!=0;number=7*k) k+; printf(number=%dn,number);27. 编写程序,输出所有小于100的可以被11整除的自然数,以及这些数之和。#include stdio.hint number,sum;void main() for(number=0;number=1;i-) n=n*i; return n;int main()int x,y,k;printf(please input x,y:);scanf(%d%d,&x,&y);k=jiecheng(x)/(jiecheng(x-y)*jiecheng(y);printf(%dn,k);32. 下面是一个有效的计算xn的方法。初始化:answer=1; power=x; m=n;当m!=0时,重复计算:若m是奇数,则令 answer=answer*power; m=m-1;否则,令 power=power*power; m=m/2;重复计算至m=0结果为answer编写函数power(float x, int n)实现上述算法,主函数读入x和n,调用函数得到返回值输出。33. 编写函数,以两个正整数位参数,如果这两个数是友好的,返回true,否则返回false。如果这两个整数的约数之和(除了它本身之外)等于对方,就称这对数是友好的。例如,1184和12101184的约数之和为1+2+4+8+16+32+74+148+296+592=12101210的约束之和为1+5+10+11+22+55+110+121+242+605=1184#includestdio.hint yssum(int n) int sum=0,i; for(i=1;in;i+) if(n%i=0) sum=sum+i; return sum;char yh(int p,int q) char flag=F;if(yssum(p)=q&yssum(q)=p)flag=T; return flag;void main()char w;int x,y;printf(please input x,y:);scanf(%d%d,&x,&y);w=yh(x,y);printf(%cn,w);34. 编写程序计算调和级数的前N项和。要求结果是一个准确的分数A/B形式。 35. 编写程序,输入n个整数,用“主元排序”法,将其升序排序(从小到大)输出。#includestdio.h#includestring.hint n;char d;char a64;void main()printf(请输入一行字符:);scanf(%s,&a);n=strlen(a);for (int b = 1; b n; b+) for (int c = 0; c ac + 1) d = ac; ac = ac + 1; ac + 1 = d; printf(排序后的数字:%sn,a); 36. 编写一个程序,输入全班同学某门课考试成绩,计算平均成绩并统计大于等于平均成绩的人数。(提示:批量数据通常不事先规定输入的数据数量,而是以一个特殊的标志作为输入结束。程序根据结束标志统计人数)37. 打印杨辉三角形的前10行 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 #include stdio.h#define n 10#define wideword 6void main()int an+1,bn+1,i,j;for(i=0;in;i+)for(j=1;ji;j+) aj=bj-1+bj;ai=1;for(j=0;j=i;j+) bj=aj;for(j=0;j=40-i*(wideword/2);j+) printf(%c, );for(j=0;j=i;j+) printf(%6d,aj);printf(n);getchar();38. 编写程序,输入n个整数,用“冒泡排序”法,将其升序排序(从小到大)输出。#include stdio.h#define L 10void sort(int a,int n)int i,r;int flag=1;while(flag)flag=0;for(i=0;iai+1)r=ai;ai=ai+1;ai+1=r;flag=1;for(i=0;in;i+)printf(%3d,ai);printf(n);void main()int aL;int i;printf(please input the vector10:n);for(i=0;iL;i+)scanf(%d,&ai);sort(a,L);printf(after sort:n);for(i=0;iL;i+)printf(%4d,ai);printf(n);getchar();getchar();39. 编写程序,输入n个整数,用“逐步增加递增子序列”法(或称插入排序),将其升序排序(从小到大)输出。#include stdio.h#define L 10int aL;void sort(int s,int a)int i,j,k,r;for(i=1;iai)&(j=0)j=j-1;r=ai;for(k=i-1;k=j+1;k-)ak+1=ak;aj+1=r;for(int n=0;nL;n+)printf(%3d,an);printf(n);void main()int i;printf(please input the vector10:n);for(i=0;iL;i+)scanf(%d,&ai);sort(L,a);printf(after sort:n);for(i=0;iL;i+)printf(%4d,ai);printf(n);getchar();getchar();40. 编程实现二分查找算法。设数组以按升序排序,“对半检索”亦称“两分法检索”。在检索过程中用到三个变量:lower : 记录检索区间下界,初值是0 ;upper : 记录检索区间上界,初值是n-1 ;j: 标记当前检索位置。检索思想令j=(lower+upper)/2n key=aj: 找到,位置为;函数search返回j n keyaj: key在aj与aupper之间, 检索区间缩小一半,lower=j+1重复上述过程。重复的终止条件为 upper-lower 0)j=(low+upper)/2;if(key=aj)return j;elseif(keyaj)low=j+1;elseupper=j-1;return -1;void sort() int i,j,k,r;for(i=0;iL;i+)j=i;for(k=i+1;kL;k+)if(a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论