1、 . . . . 本学期程序设计基础课程实行上机考核,现将考核有关事项通知如下:(1) 考核时间:本学期最后一次上机时间为机试。(2) 考核容:主要是算法设计与实现。考题来自本学期布置的作业、例题与一些补充的题目。(3) 考试形式:机试前进入机房时,每人随机抽取一道题(同一个组的同学保证不抽到同一题),然后上机编程,调试通过后报告监考人员审核,审核通过后将源程序拷贝到监考人员U盘上,然后可以离开机房。源程序文件明必须是“学号.cpp”,如“2012216827王梓丞.cpp”。(4) 考试要求:机试时考试规则同课堂考试一致,不允许带书、纸等。不能携带任何可用计算机处理的软件或数据(不允许任何私
2、人携带的U盘、磁盘或计算器) ,不能携带任何类型的通讯工具,包括无线电接收器、移动。(5) 考试成绩:本次机试成绩将在程序设计基础课程成绩中占25%的比重。(6) 其它有关事项由主考教师和监考人员负责处理。附:考试题集1. 学校曾经组织一次“程序设计大奖赛”,规定本学期“程序设计”课程的成绩可以因为在大奖赛上获奖而加5分,总分不超过100分。编程序,输入某同学的考试成绩,回答是否在竞赛中获奖,计算并输出该某同学的程序设计课成绩。#includevoid main()int m,n;printf(请输入考试成绩:n);scanf(%d,&m);printf(请选择获奖情况:1 获奖;2 未获奖n
3、);scanf(%d,&n);switch (n)case 1: m=m+5;break;case 2: m;if(m100)m=100;printf(你的最终成绩为:%dn,m);2. 编写一个程序,用户输入年份与月份两个数据,程序输出该月份的天数。(提示:对2月要考虑是否闰年,闰年年份要么能被4整除且不能被100整除,要么能被400整除,除此之外都不是闰年)。#includeint year,a;void main()printf(请输入年份 月份:);scanf(%d%d,&year,&a);if(a=1|a=3|a=5|a=7|a=8|a=10|a=12)printf(这个月有31天n
4、);elseif(a=2)if(year%4=0)&(year%100!=0)|(year%400=0)printf(这个月有29天n);elseprintf(这个月有28天n);elseprintf(这个月有30天n);3. 求一元二次方程ax2+bx+c=0的根。(要考虑a、b、c三个系数不同的取值)#include#includevoid main()float a,b,c,d;printf(请输入一元二次方程的三个系数a,b,c:n);scanf(%f%f%f,&a,&b,&c);if(a!=0)d=b*b-4*a*c;if(d0)printf(x1=%f,x2=%f,(-b+sqrt
5、(d)/2*a,(-b-sqrt(d)/2*a);elseif(d=0)printf(x1=x2=%f,(-b)/2*a);elseprintf(x1=%f+%fi,x2=%f-%fi,-b/2*a,sqrt(-d)/2*a,-b/2*a,sqrt(-d)/2*a);elseif(b!=0)printf(x=%fn,-c/b);elseif(c=0)printf(0=0!n);elseprintf(%f=0矛盾n,c);4. 学校曾经组织一次“程序设计大奖赛”,规定本学期“程序设计”课程的成绩可以根据大奖赛的成绩适度加分。加分规则是:参赛者加5分,三等奖加15分,二等奖加20分,一等奖加30分
6、,总分不超过100分。编程序,输入某同学的考试成绩,回答在竞赛中获奖等级,计算并输出该某同学的程序设计课成绩。#includevoid main()int a,b;printf(请输入你的考试成绩:n);scanf(%d,&a);printf(请选择你程序设计情况:0 未参加 1 参赛 2 三等奖 3 二等奖 4 一等奖n);scanf(%d,&b);switch(b)case 0:break;case 1:a=a+5;break;case 2:a=a+15;break;case 3:a=a+20;break;case 4:a=a+30;if(a100)a=100;printf(你的最终成绩为
7、:%d,a);5. 高速公路每公里的收费标准按不同种类汽车如下:小汽车( car ) 0.50 元卡车( truck ) 1.00 元大客车( bus ) 1.50 元编程序,为某高速公路收费站计算各种车辆的收费额。#includevoid main()float a,c;int b;printf(请选择车辆类型:1 小汽车;2 卡车; 3 大客车n);scanf(%d,&b);printf(请输入车辆行驶的公里数:n);scanf(%f,&a);switch(b)case 1:c=0.5*a;break;case 2:c=1.0*a;break;case 3:c=1.5*a;printf(收
8、费额为:%3f元,c);6. 设计一个模拟单步计算器的程序,设该计算器只能作加、减、乘、除运算。用户输入形如 m#n的算式,其中m、n为运算数,#为运算符。(需考虑运算符不合法,与除数为0的情况)#includevoid main()float m,n;char ch;printf(请输入运算式:m#nn);scanf(%f%c%f,&m,&ch,&n);if(ch!=+)&(ch!=-)&(ch!=*)&(ch!=/)printf(您输入的运算符不合法!n);elseswitch(ch)case +:printf(%2f,m+n);break;case -:printf(%2f,m-n);b
9、reak;case *:printf(%2f,m*n);break;case /:if(n!=0) printf(%2f,m/n);elseprintf(分母为0无意义!n);7. 编写程序,输入一个4位自然数n,判断n是否是降序数。降序数是指对于n=d1d2dk有: d1d2dk#includevoid main()int n,a,b,c,d;printf(请输入一个四位自然数:n);scanf(%d,&n);a=n/1000;b=n%1000/100;c=n%100/10;d=n%10;if(ab&bc&cd)printf(该四位数为降序数!n);elseprintf(该四位数不是降序数!
10、n);8. 编写程序,输入一个5位自然数n,判断n是否对称数。对称数是指正序和反序读都相等的整数,如96769为对称数。#includevoid main()int n,a,b,c,d,e;printf(请输入一个五位数:n);scanf(%d,&n);a=n/10000;b=n%10000/1000;c=n%1000/100;d=n%100/10;e=n%10;if(a=e)&(b=d)printf(该五位数为对称数);elseprintf(该五位数不是对称数);9. 编写程序,判断给定的3位数是否为Armstrong数。Armstrong数是指其值等于它每位数字立方和的数,如153就是一个
11、Armstrong数。#includevoid main()int n,a,b,c;printf(请输入一个三位数:n);scanf(%d,&n);a=n/100;b=n%100/10;c=n%10;if(n=a*a*a+b*b*b+c*c*c)printf(该三位数为armstrong数);elseprintf(该三位数不是armstrong数);10. 编写程序,输入一个整数,判断它能否被3、5、7整数,并输出如下信息。(1) 能同时被3、5、7整数。(2) 能同时被两个数整数,并指明是被哪两个数整除。(3) 能被一个数整数,并指明这是哪个数。(4) 不能被所有3个数整除。#include
12、void main()int x;printf(请输入一个整数x:);scanf(%d,&x);if(x%3=0)&(x%5=0)&(x%7=0)printf(%d能同时被3、5、7整数n,x);if(x%3!=0)&(x%5=0)&(x%7=0)printf(%d能同时被5、7整数n,x);if(x%3=0)&(x%5!=0)&(x%7=0)printf(%d能同时被3、7整数n,x);if(x%3=0)&(x%5=0)&(x%7!=0)printf(%d能同时被3、5整数n,x);if(x%3!=0)&(x%5!=0)&(x%7=0)printf(%d能被7整数n,x);if(x%3=0)
13、&(x%5!=0)&(x%7!=0)printf(%d能被3整数n,x);if(x%3!=0)&(x%5=0)&(x%7!=0)printf(%d能被5整数n,x);if(x%3!=0)&(x%5!=0)&(x%7!=0)printf(%d不能被3、5、7整除n,x);11. 邮局寄包裹的费用是根据包裹的重量来收取的。一个重量为2kg或低于2kg的包裹收取3.25元。高于2kg的包裹,超出部分每千克收取1.05元,超出部分不足1kg按1kg计算。因此如果发件人发送重达5.63kg的包裹,就需要缴纳7.45元。编写程序,输入包裹的重量,计算并输出发件人须缴纳的费用。(笔记本调试不成功)#incl
14、udevoid main()float m,n;int a;printf(请输入包裹的重量:n);scanf(%f,&m);if(m=2)n=3.25;elsea=m/1;if(m-a=0)n=3.25+(a-2)*1.05;elsen=3.25+(a-1)*1.05;printf(您需缴纳的费用为:%f元,n);12. 一个临时照顾孩子的人的收费标准是:18:00到21:30间每小时2元,21:30到午夜间每小时4元,18:00以前和午夜以后不照顾孩子。编写程序,输入开始时间和完毕时间,计算并输出某一个雇工的薪酬。程序应检查无效的开始和完毕时间。#includevoid main()floa
15、t m,n,j;printf(请输入工作的起止时间:n);scanf(%f%f,&m,&n);if(n24|m24)printf(输入的时间无效!n);elseif(m=18&n=21.5)j=(n-m)*2;elseif(m21.5)j=(21.5-m)*2+(n-21.5)*4;elsej=(n-m)*4;printf(您获得的钱数为%f元n,j);13. 编写程序,按下述公式求自然对数底e的近似值。#include#define eps 1e-5void main()int n;float e,r;e=1.0;n=1;r=1.0;while(reps)e=e+r;n=n+1;r=r/n;
16、printf(e=%fn,e);14. 编写程序,统计以100位完毕符的整数输入流中-1、0、1的出现次数并将其输出。#includevoid main()int n,i,j,k;i=0;j=0;k=0;printf(请输入一个整数:n);scanf(%d,&n);while (n!=100)if(n=1) i+;if(n=0) j+;if(n=-1) k+;printf(请输入一个整数:n);scanf(%d,&n);printf(整数流中出现1 %d次n,i);printf(整数流中出现0 %d次n,j);printf(整数流中出现-1 %d次n,k);15. 编写程序,打印“99乘法表”
17、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#includevoid 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;i=9;i+)printf(%4d,i);16. 编写程序,打
18、印200以的素数,要求每行输出10个数。#includevoid main()int i,j,k=0;bool flag;for(i=2;i=2;j-)if(i%j=0)flag=false; if(flag)printf(% d,i);k+;if(k%10=0)printf(n);17. 编写程序,输出如下序列的前50项,此序列的第一项为0;第二项为1;以后的奇数项为其前两项之和;偶数项为其前两项之差。要求每行输出10个数。#includevoid main()int u,v,w,k;u=0;v=1;printf(%5d%5d,u,v);for(k=3;k=50;k+)if(k%2=0)w=
19、v-u;elsew=u+v;printf(%7d,w);if(k%10=0)printf(n);u=v;v=w;18. 编写程序,输入正整数N,计算r1!+r2!+rn!并输出。其中N=r1r2rn。#includevoid main()int n,s,p,u,r;printf(请输入正整数:n);scanf(%d,&n);s=0;while(n!=0)r=n%10;n=n/10;p=1;u=1;while(u=r)p=p*u;u=u+1;s=s+p;printf(%d,s);19. 完数问题:若有一数,其值等于它的因子之和,则该数称为完数。例如,6的因子为1、2、3,而6=1+2+3,故6是
20、完数。编程输出1000之的所有完数与其因子。#includevoid main()int i,j,k,l;for(i=2;i=1;j-)if(i%j=0)k=k+j;if(k=i)printf( %d,k); printf(因子为:);for(l=1;l=k/2;l+)if(k%l=0)printf( %d,l);printf(n);20. 把一1元钞票换成1分、2分和5分的硬币,每种至少有1枚,问有多少种换法?#includevoid main()int i,j,k,l=0;for(i=1;i=10;i+)for(j=1;j=5;j+)for(k=1;k=2;k+)if(i+2*j+5*k=
21、10)l+;printf(%dn,l);21. 斐波那契(Fibonacci)数列问题:Fibonacci数列递归定义为:x0=0,x1=1,xi+1=xi+xi-1, i=2,3,即从第二项开始,数列中的每一个元素等于前面两个元素之和。编程输出前20项Fibonacci数。(提示可以用递归或迭代两种方式编程)答案:#includevoid main()int i,a20;printf( 0);printf( 1);for(i=2;i=20;i+) a0=0; a1=1;ai=ai-2+ai-1; printf(% d,ai);另解:#include stdio.h#include math.
22、hvoid main()int f1,f2,f3,i;f1=0,f2=1; printf(%dn,f1);printf(%dn,f2);for(i=1;i=18;i+)f3=f1+f2; f1=f2;f2=f3;printf(%dn,f3);printf(n);22. 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?#includevoid main()int x,y,z;for(x=1;x=20;x+)for(y=1;y=33;y+)for(z=3;z=99;z=z+3)if(x+y+z=100&5*x+3*y+z/3=100)printf(
23、公鸡 %d ;母鸡 %d ;小鸡 %dn,x,y,z);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#includevoid main()char x,y;for(x=A;x=E;x+)for(y=x;y=I;y+)printf(% c,y);for(y=A;y=A;x-)for(y
24、=x;y=I;y+)printf(% c,y);for(y=A;y=x-1;y+)printf(% c,y);printf(n);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 1 1 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 1#includevoid ma
25、in()int i,j,k,l,m,n;for(i=1;i=i;j-)printf( );for(k=1;k=1;l-)printf( %d,l);printf(n);for(m=1;m=1;n-)printf( %d,n);25. 验证哥德巴赫猜想:任意一个大偶数都可以分解为两个素数之和。用户输入一个大于6的偶数,程序计算并输出分解结果。26. 编写一个程序解决爱因斯坦台阶问题:有人走以台阶,若以每步走2级则最后剩1级;若每步走3级则最后剩2级;若以每步走4级则最后剩3级;若以每步走5级则最后剩4级;若以每步走6级则最后剩5级;若以每步走7级则最后刚好不剩。问台阶共有几级?27. 编写程序,
26、输出所有小于100的可以被11整除的自然数,以与这些数之和。#includevoid main()int n,m;n=0;for(m=1;m100;m+)if(m%11=0)printf( %d,m); n=n+m;printf(和为:%dn,n);28. 一辆汽车装满油料可以行驶300km。从存放有n车油料的油库出发,通过在途中建立加油站的方法,它可以行驶千米。编写程序,给定L以计算n。29. 编写函数,判定它的4个整型参数中是否有两个数的值相等。主函数读入4个数,调用该函数,输出判定结果。#includeint y(int a,int b,int c,int d)if(a=b|a=c|a=
27、d|b=c|b=d|c=d)printf(存在俩个参数相等n);else printf(不存在俩个参数相等n);return 0;int main()int a,b,c,d;printf(请输入四个参数:n);scanf(%d%d%d%d,&a,&b,&c,&d);y(a,b,c,d);30. 编写以一个函数reverse(int n),求任意4位整数的逆序数。如n=2637时,函数返回值是7362。主函数读入一个整数,判断其合法性,调用函数得到结果输出。#includeint reverse(int n)int a,b,c,d,s;a=n/1000;b=n%1000/100;c=n%100/
28、10;d=n%10;s=d*1000+c*100+b*10+a;return s;void main()int i,j;printf(请输入一个四位数:n);scanf(%d,&i);if(i9999)printf(您输入的数据有误!n);elsej=reverse(i);printf(逆序数为:%d,j);31. 编写程序,输入m、n的值计算并输出要求编写一函数f(int num)求正整数num的阶乘。#includeint f(int num)int i,j;j=1;for(i=1;i=num;i+)j=j*i;return j;void main()int m,n,a,b,c,s;pri
29、ntf(请输入m,n的值:n);scanf(%d%d,&m,&n);a=f(m);b=f(m-n);c=f(n);s=a/(b*c);printf(%dn,s);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,调用函数得到返回值输出。#includefloat power(float
30、 x,int n)float answer,power;int m;answer=1;power=x;m=n;while(m!=0)if(m%2!=0)answer=answer*power;m=m-1;elsepower=power*power;m=m/2; return answer;void main()float a,s;int b;printf(请输入x,n:n);scanf(%f%d,&a,&b);s=power(a,b);printf(%f,s);33. 编写函数,以两个正整数位参数,如果这两个数是友好的,返回true,否则返回false。如果这两个整数的约数之和(除了它本身之外
31、)等于对方,就称这对数是友好的。例如,1184和12101184的约数之和为1+2+4+8+16+32+74+148+296+592=12101210的约束之和为1+5+10+11+22+55+110+121+242+605=1184(答案不正确,需修改,问题可能出在true,false 上)#includeint f(int m,int n)int i,j,k,q;j=0;k=0;for(i=1;im/2;i+)if(m%i=0)j=j+i;for(q=1;q=n/2;q+)if(n%q=0)k=k+q;if(j=n&k=m)return true;elsereturn false;void
32、 main()int a,b;bool flag;printf(请输入两个正整数:n);scanf(%d%d,&a,&b);flag=f(a,b);if(flag)printf(这两个数是友好的);elseprintf(这两个数不是友好的);34. 编写程序计算调和级数的前N项和。要求结果是一个准确的分数A/B形式。#includeint f(int n)int a=1,b=1,c=0,i,e,f;doa=a*b; c=c*b+a/b; b+;while(b=n);e=c;f=a;while(i!=0)i=e%f;e=f;f=i;c=c/e;a=a/e;printf(%d/%d,c,a);re
33、turn 0;void main()int n;printf(please input n:n);scanf(%d,&n);f(n); 35. 编写程序,输入n个整数,用“主元排序”法,将其升序排序(从小到大)输出。#include#define n 10void main()int i,j,k,r,an;printf(请输入十个数据:n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;i9;i+)j=i;for(k=i+1;k10;k+)if(akaj)j=k;r=ai;ai=aj;aj=r;printf(answer:n);for(i=0;i10;i+)if(i%
34、10=0)printf(n);printf(%4d,ai);36. 编写一个程序,输入全班同学某门课考试成绩,计算平均成绩并统计大于等于平均成绩的人数。(提示:批量数据通常不事先规定输入的数据数量,而是以一个特殊的标志作为输入完毕。程序根据完毕标志统计人数)37. 打印辉三角形的前10行 1 1 11 2 11 3 3 1 1 4 6 4 1 1 5 10 10 5 1#include#define n 10#define w 6void main()int a11,i,j;for(i=0;i0;j-)aj=aj-1+aj;for(j=0;j=40-i*(w/2);j+)printf(%c,
35、);for(j=0;j=i;j+)printf(%6d,aj);printf(n);另解:#include #define n 10#define w 6void main()int a11,b11,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*(w/2);j+)printf(%c, );for(j=0;j=i;j+)printf(%6d,aj);printf(n);38. 编写程序,输入n个整数,用“冒泡排序”法,将其升序排序(从小到大)输出。#include#defin
36、e n 10void main()int an;int i,j,t;printf(请输入全部数据:n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;in-1;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;printf(顺序为:n);for(i=0;in;i+)printf( %d,ai);39. 编写程序,输入n个整数,用“逐步增加递增子序列”法(或称插入排序),将其升序排序(从小到大)输出。#includevoid sort(int n,int a)int i,j,k,r;for (i=1;iai)&(j=0)j=j-1;r=ai;fo
37、r(k=i-1;k=j+1;k-)ak+1=ak;ak+1=r;void main()int a10,i;for(i=0;i10;i+)scanf(%d,&(ai);sort(10,a);for(i=0;i10;i+)printf(%4d,ai);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