C50题规范标准答案.doc
-*本学期程序设计基础课程实行上机考核,现将考核有关事项通知如下:(1) 考核时间:本学期最后一次上机时间为机试。(2) 考核内容:C+面向过程部分,主要是算法设计与实现。考题来自本学期布置的作业、部分例题及一些补充的题目。(3) 考试形式:机试前进入机房时,每人随机抽取一道题(同一个班的同学保证不抽到同一题),然后上机编程,调试通过后报告监考人员审核,审核通过后将源程序拷贝到监考人员U盘上,然后可以离开机房。源程序文件明必须是“学号姓名.cpp”,如“2012211532刘天.cpp”。(4) 考试要求:机试时考试规则同课堂考试一致,不允许带书、纸张等。不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的U盘、磁盘或计算器) ,不能携带任何类型的通讯工具,包括无线电接收器、移动电话。(5) 考试成绩:本次机试成绩将在程序设计基础课程成绩中占25%的比重。(6) 其它有关事项由主考教师和监考人员负责处理。附:考试题集1. 利用异或运算对输入的文本进行加密解密输出,用户输入一个文本(字符串,设不超过20个字符),然后输入作为密钥的字符,程序输入加密及解密的字符串。/加密字符串#include<iostream.h>void main() char a21,b,key; int i; cout<<"请输入字符串:" cin>>a; cout<<"请输入密匙:" cin>>b; for(i=0;ai!=0;i+) ai=aib; cout<<"加密后:" for(i=0;ai!=0;i+) cout<<ai; cout<<endl<<"请输入密码:" cin>>key; for(i=0;ai!=0;i+) ai=aikey; for(i=0;ai!=0;i+) cout<<ai; cout<<endl; 已阅,请放心食用2. 编写一个程序,用户输入年份及月份两个数据,程序输出该月份的天数。(提示:对2月要考虑是否闰年,闰年年份要么能被4整除且不能被100整除,要么能被400整除,除次之外都不是闰年)。#include<iostream.h>void main() int year,month,days; cout<<"请输入年份,月份:" cin>>year>>month; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) days=31; cout<<year<<"年"<<month<<"月有"<<days<<"天n" else if(month=4|month=6|month=9|month=11) days=30; cout<<year<<"年"<<month<<"月有"<<days<<"天n" else if(year%4=0&&year%100!=0)|year%400=0) days=29; cout<<year<<"年"<<month<<"月有"<<days<<"天n" else days=28; cout<<year<<"年"<<month<<"月有"<<days<<"天n" 已阅,请放心食用 3. 某大桥按不同型号征收车辆过桥费:自行车免费,摩托车2元,小汽车5元,大客车与货车8元,货柜车12元。编写一个程序,按车辆的不同型号计算通过该大桥应征的过桥费。(提示:可以用整数对不同型号的车辆进行编码)/收过桥费#include<iostream.h>void main() int kind; cout<<"1.自行车n" cout<<"2.摩托车n" cout<<"3.小汽车n" cout<<"4.大货车或客车n" cout<<"5.货柜车n" cout<<"请输入汽车种类:" cin>>kind; switch(kind) case 1: cout<<"费用:0元"<<endl; break; case 2: cout<<"费用:2元"<<endl; break; case 3: cout<<"费用:5元"<<endl; break; case 4: cout<<"费用:8元"<<endl; break; case 5: cout<<"费用:12元"<<endl; break; default: cout<<"错误!"<<endl; 已阅,请放心食用4. 输入一位同学的考试成绩,若是90100分,输出“Excellent”,8089输出“Very good”,7079输出“Good”,6069输出“Pass”,60分以下输出“No Pass”。#include<iostream.h>void main() int marks; cout<<"输入考试成绩:" cin>>marks; switch(marks/10) case 10:case 9: cout<<"Excellentn" break; case 8: cout<<"Very Goodn" break; case 7: cout<<"Goodn" break; case 6: cout<<"Passn" break; default : cout<<"No Passn" 已阅,请放心食用5. 旅行社的订票量小于10张时,航空公司给予10%的折扣;订票量大于或等于10张且小于20张时,航空公司给予15%的折扣;订票量大于或等于20张且小于30张时,航空公司给予30%的折扣;订票量大于或等于30张时,航空公司给予最高的45%的折扣。编程输入订票张数及单张机票票价,程序输出折扣率及应付款额。/旅行社折扣#include<iostream.h>void main() int num,price; float discount,total_price; cout<<"输入购买张数和单价:" cin>>num>>price; switch(num/10) case 0: discount=0.1; break; case 1: discount=0.15; break; case 2: discount=0.3; break; default: discount=0.45; total_price=num*price*(1-discount); cout<<"总价格为:"<<total_price<<endl;已阅,请放心食用6. 用户输入一个整数流(输入1000表示数据输入结束),如4 1 13 0 6 -5 1 -1 7 -12 19 0 100 编写程序统计输入流中-1、0和+1的个数。/输入数流#include<iostream.h>void main() int a100,i,j,x=0,y=0,z=0; cout<<"输入数流(以1000结束):" for(i=0;i+) cin>>ai; if(ai=1000) break; for(j=0;aj!=1000;j+) if(aj=-1) x+; if(aj=0) y+; if(aj=1) z+; cout<<"该数流中含-1:"<<x<<"项n" cout<<"该数流中含 0:"<<y<<"项n" cout<<"该数流中含 1:"<<z<<"项n"已阅,请放心食用7. 编写一个程序,求一个自然数中含有多少个2的因子。如,6含1个2的因子,8含3个2的因子,11不含2的因子。(提示,程序应检查用户输入的合法性)。/求2因子#include<iostream.h>void main() int x,i,n;docout<<"输入整数:" cin>>x; while(x<=0); n=x; for(i=0;n%2=0;i+) n/=2; cout<<"整数"<<x<<"含有"<<i<<"个2因子"<<endl;已阅,请放心食用8. 编写一个程序解决爱因斯坦台阶问题:有人走以台阶,若以每步走2级则最后剩1级;若每步走3级则最后剩2级;若以每步走4级则最后剩3级;若以每步走5级则最后剩4级;若以每步走6级则最后剩5级;若以每步走7级则最后刚好不剩。问台阶共有几级?#include<iostream.h>void main() int i; for(i=0;i+) if(i%2=1&&i%3=2&&i%4=3&&i%5=4&&i%6=5&&i%7=0)break; cout<<"最小可能值是:"<<i<<endl;已阅,请放心食用9. 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?/百元买百鸡#include<iostream.h>void main() int cock,hen,chicken,price; for(cock=0;cock<=20;cock+) for(hen=0;hen<=33;hen+) chicken=100-cock-hen; if(chicken%3=0&&5*cock+3*hen+chicken/3=100) cout<<"公鸡"<<cock<<""<<"只,母鸡"<<hen<<""<<"只,小鸡"<<chicken<<"只n" 已阅,请放心食用10. 编程实现解决下述问题的算法:一位顾客在购物时,如果买4个苹果剩下4角钱如果买5个苹果则缺5角钱,请问,该顾客带了多少钱?多少钱可以头一个苹果?#include<iostream.h>void main() int money,money1,money2,i,m,n; for(i=1;i+) if(4+4*i=5*i-5) money=4+4*i; money1=money/10; money2=money-10*money1; cout<<"顾客带了"<<money1<<"元"<<money2<<"角,苹果价格为每个"<<i<<"角n" break; 已阅,请放心食用11. 编写程序计算100之内可以被13整除的自然数之和。#include<iostream.h>void main() int i,sum=0; for(i=1;i<=100;i+) if(i%13=0) sum+=i; cout<<"100以内可以被13整除的自然数之和为:"<<sum<<endl;已阅,请放心食用12. 键盘输入m和n(10<m<n32000),求出mn间所有素数且按每行8个数形式输出。/求m到n的素数#include<iostream.h>#include<iomanip.h>int f(int i)int l;for(l=2;l<i;l+)if(i%l=0)return 0;return 1;void main()int m,n,x,i,j;int k=0;docout<<"输入m,n (其中10<m<n32000):"cin>>m>>n;while(m<=10|m>=n|n>32000);for(i=m;i<=n;i+)if(f(i)cout<<setw(6)<<i;k+;if(k%8=0)cout<<endl;cout<<endl;已阅,请放心食用13. 编写程序打印乘法口诀表。/打印乘法口诀表#include<iostream.h>void main() int a,b,t; for(i=1;i<=9;i+) for(j=1;j<=i;j+) cout<<i<<*<<j<<=<<i*j<<"t" cout<<endl; 已阅,请放心食用14. 编程实现求解最大公约数的欧几里德算法,用户输入两个任意正整数,程序输出他们的最大公约数。算法如下:步骤1:如果p < q,则交换p和q。步骤2:令r是p / q 的余数。步骤3:如果r = 0,则令g = q并终止;否则令p = q, q = r并转向步骤2 14./求最大公约数#include<iostream.h>void main()int p,q,r;cout<<"输入两个整数:" cin>>p>>q;if(p<q)r=q;q=p;p=r;r=p%q;while(r!=0)p=q;q=r;r=p%q;cout<<"最大公约数是:"<<q<<endl;已阅,请放心食用15. 求不超过正整数n的2的最大幂值,如输入17,程序应输出4(24=16<17)。#include<iostream.h>void main() int n,t=1,i; cout<<"请输入正整数n:" cin>>n; for(i=0;i+,t*=2) if(t>n) cout<<i-1<<"n" break; 已阅,请放心食用16. 有关专家十分关注珠江渔业资源的问题。目前珠江中大约有8000万条鱼,平均每年以3.5%的速度减少。请编写一个程序,计算在多少年之后鱼的数目下降到目前的一半?多少年后下降到目前的十分之一?(提示注意整数类型的取值范围)。#include<iostream.h>void main() double fishnum=8e7,fish; int year; for(year=0,fish=fishnum;year+,fish*=0.965) if(fish<=4e7) cout<<"当鱼的数目等于原来的一半时,需要"<<year<<"年n" break; for(year=0,fish=fishnum;year+,fish*=0.965) if(fish<=8e6) cout<<"当鱼的数目等于原来的十分之一时,需要"<<year<<"年n" break; 已阅,请放心食用17. 编程求解一元二次方程ax2+bx+c=0的根。要求:设计完备的测试数据集,考虑a, b, c各种取值对根的影响/二次方程求解#include<iostream.h>#include<math.h>void main()float a,b,c,x1,x2,t; cout<<"请输入a,b,c:" cin>>a>>b>>c; t=b*b-4*a*c;if(a=0&&b=0)cout<<"根为一切实数n"else if(a=0)cout<<"根为"<<-c/b<<n;else if(t<0)cout<<"无根n"else if(t=0)cout<<"根为"<<-b/(2*a)<<n;else if(t>0)cout<<"根为"<<(-b+sqrt(t)/(2*a)<<"和"<<(-b-sqrt(t)/(2*a)<<n;已阅,请放心食用18. 编写一个程序,输入全班同学某门课考试成绩,计算平均成绩并找出其中最高分与最低分。(提示:批量数据通常不事先规定输入的数据数量,而是以一个特殊的标志作为输入结束。程序根据结束标志统计人数)/班级分数#include<iostream.h>void main() int a100,i,max,min,s=0; cout<<"输入同学成绩(以1000结束):" for(i=0;i+) cin>>ai; if(ai=1000)break; if(i=0) max=a0; min=a0; max=max>ai?max:ai; min=min<ai?min:ai; s+=ai; cout<<"该班同学成绩中最高分为:"<<max<<"n"<<"最低分为"<<min<<"n"<<"平均分为"<<s/i<<"n"已阅,请放心食用19. 编一程序模拟整数加、减、乘、除四则运算。当你在键盘上输入5+6后,程序将输出=11,当你在键盘上输入11*7后,程序将输出=77。/模拟四则运算#include<iostream.h>void main() float a,b; char x; cout<<"请输入算式:"<<endl; cin>>a>>x>>b; if(x=+) cout<<"="<<a+b<<endl; else if(x=-) cout<<"="<<a-b<<endl; else if(x=*) cout<<"="<<a*b<<endl; else if(x=/) cout<<"="<<a/b<<endl; else cout<<"error!"<<endl;已阅,请放心食用20. 把一张1元钞票换成1分、2分和5分的硬币,每种至少有1枚,问有多少种换法?#include<iostream.h>void main()int i,j,k,m=0; for(i=1;i<=20;i+)for(j=1;j<=50;j+)k=100-5*i-2*j;if(k>=1) m+=1; cout<<"i="<<i<<" "<<"j="<<j<<" "<<"k="<<k<<endl; cout<<"共有"<<m<<"种结果n"已阅,请放心食用21. 求自然对数底(e)的近似值。e的近似值计算公式为:当余项rn<时停止计算。设=1e-8#include<iostream.h>#include<iomanip.h>main() int i; double temp=1,sum=0; for(i=1;temp>=1e-8;i+) sum+=temp; temp/=i; cout<<"e=1+1/1!+1/2!+1/3!+.="<<setprecision(9)<<sum<<endl; (控制输出流显示浮点数的有效数字个数)已阅,请放心食用22. !#include<iostream.h>void main()int sum=0,n=1,i;for(i=1;i<=7;i+)n*=i;sum+=n;cout<<sum<<endl;已阅,请放心食用23. /求#include<iostream.h>void main()int i,s=0; for(i=1;i<=39;i+=2)s+=i*(i+1);cout<<"结果是:"<<s<<endl;已阅,请放心食用24. Y=X(-1)n+1的值,精确到10-6。/求值,精确到10e-6#include<iostream.h>#include<math.h>void main()int i,x; cout<<"输入整数x:" cin>>x; double temp=x,s=0; for(i=1;fabs(temp)>=1e-6;i+=2)s+=temp; temp=temp*(-x*x)/(float)(i+1)*(i+2);cout<<"结果是:"<<s<<endl;已阅,请放心食用25. 编制一个程序,读入一个正整数,并反向输出。例如,读入123,输出是321。25./反向输出#include<iostream.h>#include<math.h>void main() int x,i,j; cout<<"输入整数x:" cin>>x; for(i=0;i+) if(x/(int)pow(10,i)=0)break; int a100; for(j=0;j<i;j+) aj=(x%(int)pow(10,j+1)/(int)pow(10,j); cout<<"反向输出为:" for(int b=0;b<i;b+)cout<<ab; cout<<endl;/*#include<iostream.h>void main()int i;char x100;cout<<"输入整数:"cin>>x;for(i=0;xi;)i+;cout<<"反向输出为:"for(i-=1;i>=0;i-)cout<<int(xi-48);cout<<n;*/已阅,请放心食用26. 水仙花数问题:水仙花数是一种三位数,它的值等于每个数字的立方和。例如,153=13+53+33。编程输出小于999的水仙花数。/水仙花数#include<iostream.h>void main()int i,a,b,c; for(i=100;i<=999;i+)a=i/100;b=(i-100*a)/10;c=i-100*a-10*b;if(i=a*a*a+b*b*b+c*c*c)cout<<i<<endl;已阅,请放心食用27. 求一整数的等差数列,该数列满足下述条件:头4项数的和值为26,积值为880。(提示:该数列公差为正整数,否则数列将出现负数;该数列的首项必须小于5,且其公差也小于5,否则头四项数的和将大于26。)/等差数列#include<iostream.h>void main()int k=1,d,a1,a2,a3,a4; bool b=false; for(k=1;k+)for(d=0;d<k;d+)a1=k-d; a2=2*k-d; a3=3*k-d; a4=4*k-d;if(a1+a2+a3+a4=26&&a1*a2*a3*a4=880)cout<<"该数列通项为:an="<<k<<"n-"<<d<<endl;b=true;break;if(b) break;已阅,请放心食用28. 完数问题:若有一数,其值等于它的因子之和,则该数称为完数。例如,6的因子为1、2、3,而6=1+2+3,故6是完数。编程输出1000之内的所有完数及其因子。/完数问题#include<iostream.h>void main()int i,s,j; for(i=1;i<=1000;i+)s=1;for(j=2;j<i;j+)if(i%j)=0) s=s+j;if(i=s)cout<<i<<n;已阅,请放心食用29. 100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马2匹驮1担。试编程计算大、中、小马的数目。#include<iostream.h>void main() int a,b,c; for(a=0;a<=100;a+=2) for(b=0;b<=100;b+) c=100-a-b; if(3*c+2*b+c/2)=100&&c>0) cout<<"大马"<<c<<"匹,中马"<<b<<"匹,小马"<<a<<"匹n" 已阅,请放心食用30. 编程产生出1到10以内的所有数对<i,j>并输出,其中i>j。/输出数对#include<iostream.h>void main()int i,j;for(i=1;i<10;i+)for(j=1;j<10;j+)if(i>j)cout<<<<<i<<,<<j<<><<" "cout<<n;已阅,请放心食用31. 编程求出1000以内的所有符合如下条件的数:其高位数字小于低位数字。如12,238等。但21,548不符合条件。/输出数#include<iostream.h>void main()int i,a,b,c;for(i=1;i<1000;i+)a=i/100;b=i/10-a*10;c=i-a*100-b*10;if(a=0&&b<c&&b!=0)cout<<i<<" "else if(a!=0&&a<b&&b<c)cout<<i<<" "cout<<n;已阅,请放心食用32. 求任一整数N的标准分解式,即素数因子之积。例如16=2*2*2*2, 15=3*5。#include<iostream.h>void main()int N,i; cout<<"输入N: " cin>>N; cout<<N<<"=" for(i=2;i<=N;)if(N%i=0) cout<<i<<"*"N/=i;else i+;cout<<N<<endl;已阅,请放心食用33. 斐波那契(Fibonacci)数列问题:Fibonacci数列递归定义为:x0=0,x1=1,xi+1=xi+xi-1, i=2,3,即从第二项开始,数列中的每一个元素等于前面两个元素之和。编程输出前20项Fibonacci数。(提示可以用递归或迭代两种方式编程)/斐波那契(Fibonacci)数列问题#include<iostream.h>int f(int i)int r;if(i=0|i=1) r=1;else r=f(i-1)+f(i-2);return r;void main()int n,r,m=0;for(n=0;n<20;n+)r=f(n); cout<<r<<" "已阅,请放心食用34. 打印下面图形。 1 1 3 1 1 3 5 3 1 1 3 5 7 5 3 1 1 3 5 7 9 7 5 3 1 1 3 21 3 1 #include<iostream.h>#include<iomanip.h> void main() int x,y,z,i; for(x=1;x<=11;x+)for(i=1;i<=(11-x)*3;i+)/打印空格(每个数字占2格,数字与数字之间1格)cout<<" "for(y=1;y<=(2*x-1);y+=2)/打印杨辉三角左侧 cout<<setw(2)<<y<<" "for(z=(2*x-3);z>0;z-=2)/打印杨辉三角右侧 cout<<setw(2)<<z<<" "cout<<"n"已阅,请放心食用35. 打印如下图形A B C D EB C D E AC D E A BD E A B CE A B C D#include<iostream.h>void main()char a5=A,B,C,D,E,i,j,x;for(i=0;i<=4;i+)for(j=i;j<=4;j+)cout<<aj<<" "for(x=0;x<i;x+)cout<<ax<<" "cout<<endl;已阅,请放心食用36. 正读和反读都一样的数称为回文数。编写程序输入一个整数max_num,输出从0到max_num中用二进制表示和十进制表示都是回文数的整数。定义一个函数is_circle_num()判断一个数(number)在某个进制(radius)下是否为回文数。例如,整数313就是该程序输出的一个数,因为它的二进制表示为10011001。#include<iostream.h>#include<iomanip.h>static int is_circle_num(int number,int radius);int main()int num,max_num;cout<<"