资源描述
本学期《程序设计基础》课程实行上机考核,现将考核有关事项通知如下:
(1) 考核时间:本学期最后一次上机时间为机试。
(2) 考核内容:C++面向过程部分,主要是算法设计与实现。考题来自本学期布置的作业、部分例题及一些补充的题目。
(3) 考试形式:机试前进入机房时,每人随机抽取一道题(同一个班的同学保证不抽到同一题),然后上机编程,调试通过后报告监考人员审核,审核通过后将源程序拷贝到监考人员U盘上,然后可以离开机房。源程序文件明必须是“学号姓名.cpp”,如“2012211532刘天.cpp”。
(4) 考试要求:机试时考试规则同课堂考试一致,不允许带书、纸张等。不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的U盘、磁盘或计算器) ,不能携带任何类型的通讯工具,包括无线电接收器、移动电话。
(5) 考试成绩:本次机试成绩将在《程序设计基础》课程成绩中占25%的比重。
(6) 其它有关事项由主考教师与监考人员负责处理。
附:考试题集
1. 利用异或运算对输入的文本进行加密解密输出,用户输入一个文本(字符串,设不超过20个字符),然后输入作为密钥的字符,程序输入加密及解密的字符串。
2. 编写一个程序,用户输入年份及月份两个数据,程序输出该月份的天数。(提示:对2月要考虑是否闰年,闰年年份要么能被4整除且不能被100整除,要么能被400整除,除次之外都不是闰年)。
3. 某大桥按不同型号征收车辆过桥费:自行车免费,摩托车2元,小汽车5元,大客车与货车8元,货柜车12元。编写一个程序,按车辆的不同型号计算通过该大桥应征的过桥费。(提示:可以用整数对不同型号的车辆进行编码)
4. 输入一位同学的考试成绩,若是90~100分,输出“Excellent”,80~89输出“Very good”,70~79输出“Good”,60~69输出“Pass”,60分以下输出“No Pass”。
5. 旅行社的订票量小于10张时,航空公司给予10%的折扣;订票量大于或等于10张且小于20张时,航空公司给予15%的折扣;订票量大于或等于20张且小于30张时,航空公司给予30%的折扣;订票量大于或等于30张时,航空公司给予最高的45%的折扣。编程输入订票张数及单张机票票价,程序输出折扣率及应付款额。
6. 用户输入一个整数流(输入1000表示数据输入结束),如
4 1 13 0 6 -5 1 -1 7 -12 19 0 100
编写程序统计输入流中-1、0与+1的个数。
7. 编写一个程序,求一个自然数中含有多少个2的因子。如,6含1个2的因子,8含3个2的因子,11不含2的因子。(提示,程序应检查用户输入的合法性)。
8. 编写一个程序解决爱因斯坦台阶问题:有人走以台阶,若以每步走2级则最后剩1级;若每步走3级则最后剩2级;若以每步走4级则最后剩3级;若以每步走5级则最后剩4级;若以每步走6级则最后剩5级;若以每步走7级则最后刚好不剩。问台阶共有几级?
9. 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?
10. 编程实现解决下述问题的算法:一位顾客在购物时,如果买4个苹果剩下4角钱.如果买5个苹果则缺5角钱,请问,该顾客带了多少钱?多少钱可以头一个苹果?
11. 编写程序.计算100之内可以被13整除的自然数之与。
12. 键盘输入m与n(10<m<n≤32000),求出m~n间所有素数且按每行8个数形式输出。
13. 编写程序打印乘法口诀表。
14. 编程实现求解最大公约数的欧几里德算法,用户输入两个任意正整数,程序输出他们的最大公约数。算法如下:
步骤1: 如果p < q,则交换p与q。
步骤2: 令r是p / q 的余数。
步骤3: 如果r = 0,则令g = q并终止;
否则令p = q, q = r并转向步骤2
15. 求不超过正整数n的2的最大幂值,如输入17,程序应输出4(24=16<17)。
16. 有关专家十分关注珠江渔业资源的问题。目前珠江中大约有8000万条鱼,平均每年以3.5%的速度减少。请编写一个程序,计算在多少年之后鱼的数目下降到目前的一半?多少年后下降到目前的十分之一?(提示注意整数类型的取值范围)。
17. 编程求解一元二次方程ax2+bx+c=0的根。要求:设计完备的测试数据集,考虑a, b, c各种取值对根的影响。
18. 编写一个程序,输入全班同学某门课考试成绩,计算平均成绩并找出其中最高分与最低分。(提示:批量数据通常不事先规定输入的数据数量,而是以一个特殊的标志作为输入结束。程序根据结束标志统计人数)
19. 编一程序模拟整数加、减、乘、除四则运算。当你在键盘上输入
5+6
后,程序将输出=11,当你在键盘上输入11*7后,程序将输出=77。
20. 把一张1元钞票换成1分、2分与5分的硬币,每种至少有1枚,问有多少种换法?
21. 求自然对数底(e)的近似值。e的近似值计算公式为:
当余项rn<ε时停止计算。设ε=1e-8
22. S==1!+2!+…+7!
23. S=1×2+3×4+5×6+…+39×40
24. Y=X-+-+…+(-1)n+1+…的值,精确到10-6。
25. 编制一个程序,读入一个正整数,并反向输出。例如,读入123,输出是321。
26. 水仙花数问题:水仙花数是一种三位数,它的值等于每个数字的立方与。例如,153=13+53+33。编程输出小于999的水仙花数。
27. 求一整数的等差数列,该数列满足下述条件:头4项数的与值为26,积值为880。(提示:该数列公差为正整数,否则数列将出现负数;该数列的首项必须小于5,且其公差也小于5,否则头四项数的与将大于26。)
28. 完数问题:若有一数,其值等于它的因子之与,则该数称为完数。例如,6的因子为1、2、3,而6=1+2+3,故6是完数。编程输出1000之内的所有完数及其因子。
29. 100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马2匹驮1担。试编程计算大、中、小马的数目。
30. 编程产生出1到10以内的所有数对<i,j>并输出,其中i>j。
31. 编程求出1000以内的所有符合如下条件的数:其高位数字小于低位数字。如12,238等。但21,548不符合条件。
32. 求任一整数N的标准分解式,即素数因子之积。例如16=2*2*2*2, 15=3*5。
33. 斐波那契(Fibonacci)数列问题:Fibonacci数列递归定义为:
x0=0,
x1=1,
xi+1=xi+xi-1, i=2,3,…
即从第二项开始,数列中的每一个元素等于前面两个元素之与。编程输出前20项Fibonacci数。(提示可以用递归或迭代两种方式编程)
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
35. 打印如下图形
A B C D E
B C D E A
C D E A B
D E A B C
E A B C D
36. 正读与反读都一样的数称为回文数。编写程序输入一个整数max_num,输出从0到max_num中用二进制表示与十进制表示都是回文数的整数。定义一个函数is_circle_num()判断一个数(number)在某个进制(radius)下是否为回文数。例如,整数313就是该程序输出的一个数,因为它的二进制表示为10011001。
37. 编写一个递归函数:将一个整数转换为响应的字符串并输出,函数原型可声明为:void int2str(int number)。
38. 用函数实现将一个以字符串形式表示的十六进制数转换为一个十进制整数。例如,输入”A2”转换为162。
39. 编写一个将十进制整数转换为十六进制字符串的函数。
40. 编写出判断一个整数是否为素数的函数,并求出在2000以内的有十个以上的所有连续的非素数组。
41. 编制一个程序,统计从标准输入设备上输入的字符流(以?结束)中每个英文字母(大小写不分开计)出现的次数。
42. 编程实现“冒泡排序算法”,将输入的若干整数由小到大(升序)排序输出。要求定义一个排序函数,其原型是void bubble(int data[], int length)。
43. 给定含有m+n个元素的整型数组A(其中m>0, n>0),它分为两个互不重叠的,长度分别为m与n的子数组段,写出交换这两个子数组段的程序,要求不引入数组A以外的数组,但可引入若干中间变量。
44. 用数组存储数据,实现筛选法求素数问题的求解。要求求出2到1000之间的所有素数。
筛选法求出2~N间的所有素数的方法是:首先将这些数全部放入一个数组中,然后重复下面的操作直到数组为空为止:
a.找出其中的最小数K,则K一定是一个素数,因此可输出。
b.从数组中删除K及其所有倍数。
45. 编程实现二分查找算法。二分(折半)查找(搜索)算法如下:
数组 a 中的 n 个数从大到小(降序)的顺序排列,要检索一个数 x 是否在 a 中,折半查找算法的思路是:
设查找区间为[lower, upper],初值lower=0, upper=n-1; 算法步骤:
(1)输入数组 a 的元素及 x;
(2)x 是否为 a 的第一或最后一个元素。若是其中之一,算法结束;
(3)将区间两等分为[lower, mid]与[mid, upper],mid为区间中点,每次取出中间项进行检查,若 x=a[mid],x 被检索到,算法结束;若 x<a[mid],则在后半区间 [mid, upper] 内重复折半检索;若 x>a[mid],则在前半区间 [lower, mid] 内重复折半检索。反复执行上述步骤,使 lower 与 upper相等或相差 1(表示未检索到 x),或 a[mid]=x。
46. 编程实现查找矩阵中最大元素的位置。要求输入一个矩阵中所有元素,输出该矩阵,并输出矩阵中最大数所在的行、列号及该元素的值。
47. 编写程序找出二维整形数组中所有这样的元素及其位置:它在所在的行上是最大的,在所在的列上也是最大的。设数组中的元素各不相同。(提示:先在第i行中寻找此行最大值元素,记下其行与列,然后在其所在的列判断它是否也是最大的,若是则输出结果。可以引入标志变量表示找到这个元素。)
48. 编程产生下列数组,并输出。
1 2 3 4 5 6
2 3 4 5 6 0
3 4 5 6 0 1
4 5 6 0 1 2
5 6 0 1 2 3
6 0 1 2 3 4
49. 编程产生下列数组,并输出
1 2 3 4 5 6
2 1 2 3 4 5
3 2 1 2 3 4
4 3 2 1 2 3
5 4 3 2 1 2
6 5 4 3 2 1
50. 编程产生下列数组,并输出。
1 2 3 .....n-1 0
2 3 4 ..... 0 1
3 4 5 ..... 1 2
................
n-1 0 1 .....n-3 n-2
0 1 2 .....n-2 n-1
1.
//加密字符串
#include<iostream.h>
void main()
{
char a[21],b,key;
cout<<"请输入字符串与密钥:";
cin>>a>>b;
for(int i=0;a[i]!=0;i++){
a[i]=a[i]^b;
}
cout<<"加密后:";
for(int k=0;a[k]!=0;k++){
cout<<a[k];
}
cout<<endl<<"请输入密码:";
cin>>key;
for(int j=0;a[j]!=0;j++){
a[j]=a[j]^key;
}
for(int g=0;a[g]!=0;g++){
cout<<a[g];
}
cout<<endl;
}
2.
#include<iostream.h>
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";
}elseif(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";
}
return0;
}
3.
//收过桥费
#include<iostream.h>
main()
{
intkind;
cout<<"1.自行车\n";
cout<<"2.摩托车\n";
cout<<"3.小汽车\n";
cout<<"4.大货车或客车\n";
cout<<"5.货柜车\n";
cout<<"请输入汽车种类:";
cin>>kind;
switch(kind){
case 1: cout<<"the fee is:0 yuanonce."<<endl;break;
case 2: cout<<"the fee is:2 yuanonce."<<endl;break;
case 3: cout<<"the fee is:5 yuan once."<<endl;break;
case 4: cout<<"the fee is:8 yuanonce."<<endl;break;
case 5: cout<<"the fee is:12 yuanonce."<<endl;break;
default:cout<<"Error!"<<endl;
}
}
4.
#include<iostream.h>
main()
{
int marks;
cout<<"输入考试成绩:";
cin>>marks;
switch(marks/10){
case 10:case 9:
cout<<"Excellent\n";break;
case 8:
cout<<"VeryGood\n";break;
case 7:
cout<<"Good\n";break;
case 6:
cout<<"Pass\n";break;
default : cout<<"NoPass\n";
}
return0;
}
5.
//旅行社折扣
#include<iostream.h>
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;
default: discount=0.3;
}
total_price=num*price*(1-discount);
cout<<"总价格为:"<<total_price<<endl;
return0;
}
6.
//输入数流
#include<iostream.h>
main()
{
int a[100],i,j,x=0,y=0,z=0;
cout<<"输入数流(以1000结束):";
for(i=0;;i++){
cin>>a[i];
if(a[i]==1000) break;
}
for(j=0;a[j]!=1000;j++){
if(a[j]==-1) x++;
if(a[j]==0) y++;
if(a[j]==1) z++;
}
cout<<"该数流中含-1:"<<x<<"项\n";
cout<<"该数流中含0:"<<y<<"项\n";
cout<<"该数流中含1:"<<z<<"项\n";
return0;
}
7.
//求2因子
#include<iostream.h>
main()
{
int x,i,n;
cout<<"输入整数:";
l: cin>>x;
if(x<0){
cout<<"输入有误!请重新输入:";
goto l;
}
n=x;
for(i=0;n%2==0;i++){
n/=2;
}
cout<<"整数"<<x<<"含有"<<i<<"个2因子"<<endl;
return0;
}
8.
#include<iostream.h>
main()
{
int i,n;
for(i=7;!(i%2==1&&i%3==2&&i%4==3&&i%5==4&&i%6==5);i+=7){
n=i;
}
cout<<"最小可能值是:"<<n+7<<endl;
return0;
}
9.
//百元买百鸡
#include<iostream.h>
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<<endl;
}
}
return0;
}
10.
#include<iostream.h>
main()
{
int money,i,m,n;
for(i=1;;i++){
if(4+4*i==5*i-5){
cout<<"money="<<4+4*i<<""<<"price="<<i<<endl;
break;
}
else continue;
}
return0;
}
11.
#include<iostream.h>
main()
{
int n,i,j,s=0;
for(i=1;i<=100;i++){
if(i%13==0) s+=i;
else continue;
}
cout<<"100以内可以被13整除的自然数之与为:"<<s<<endl;
return0;
}
12.
//求m到n的素数
#include<iostream.h>
#include<math.h>
intf(int n)
{
int a,x,i,b;
x=sqrt(n);
if(n==2||n==3) b=1;
else for(i=2;i<=x;i++){
if(n%i==0){
b=0;
break;
}
else if(i==x) b=1;
else continue;
}
return b;
}
main()
{
int m,n,x,i,j;
static int k=0;
l: cout<<"输入m,n (其中10<m<n≤32000):";
cin>>m>>n;
if(m<=10||m>=n||n>32000){
cout<<"输入数据有误!请再";
goto l;
}
for(i=m;i<=n;i++){
if(f(i)){
cout<<i<<"";
k++;
if(k%8==0)cout<<endl;
}
}
cout<<endl;
return0;
}
13.
//打印乘法口诀表
#include<iostream.h>
main()
{
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++)cout<<i<<'*'<<j<<'='<<i*j<<" ";
cout<<endl;
}
return0;
}
14.
//求最大公约数
#include<iostream.h>
main()
{
int m,n,temp;
cout<<"输入两个整数:";
cin>>m>>n;
temp=m<n?m:n;
m=m<n?n:m;
n=temp;
for(;;){
temp=m%n;
if(temp){
m=n;
n=temp;
}
else{
cout<<"最大公约数是:"<<n<<endl;
break;
}
}
return0;
}
15.
//求不超过正整数n的2的最大幂值
#include<iostream.h>
#include<math.h>
main()
{
int n,i;
cout<<"请输入正整数n:";
cin>>n;
for(i=0;pow(2,i)<=n;i++){}
cout<<"满足条件的值为:"<<i-1<<endl;
return0;
}
16.
#include<iostream.h>
#include<math.h>
void main()
{
const double fishnum=800000000;
double fnum=fishnum;
int n=1;
while(fnum>=fishnum/2){
fnum=fnum*(1-0.035);
n++;
}
cout<<"当鱼的数目等于原来的一半时,需要"<<n<<"年\n";
n=1;
fnum=fishnum;
while(fnum>=fishnum/10){
fnum=fnum*(1-0.035);
n++;
}
cout<<"当鱼的数目等于原来的十分之一时,需要"<<n<<"年\n";
}
17.
//二次方程求解
#include<iostream.h>
#include<math.h>
main()
{
float a,b,c;
cout<<"请输入a,b,c:";
cin>>a>>b>>c;
float t=b*b-4*a*c;
if(a==0)if(b==0)if(c==0)cout<<"方程根为一切实数"<<endl;
else cout<<"方程无根"<<endl;
else cout<<"根是:"<<-c/b<<endl;
else if(t>0) cout<<"根x1="<<(-b+sqrt(b))/(-2*a)<<endl<<"根x2="<<(-b-sqrt(b))/(-2*a)<<endl;
else if(t==0) cout<<"根x1=x2="<<(-b+sqrt(b))/(-2*a)<<endl;
else cout<<"根x1="<<(-b)/(-2*a)<<"+"<<"("<<(sqrt(-t))/(-2*a)<<")i"<<endl<<"根x2="<<(-b)/(-2*a)<<"-"<<"("<<(sqrt(-t))/(-2*a)<<")i"<<endl;
return0;
}
18.
//班级分数
#include<iostream.h>
main()
{
int a[100],i,j,max,min,s=0;
cout<<"输入同学成绩(以1000结束):";
for(i=0;;i++){
cin>>a[i];
if(a[i]==1000) break;
if(i==0){
max=a[0];
min=a[0];
}
max=max>a[i]?max:a[i];
min=min<a[i]?min:a[i];
s+=a[i];
}
cout<<"该班同学成绩中最高分为:"<<max<<"\n"<<"最低分为"<<min<<"\n"<<"平均分为"<<s/i<<"\n";
return0;
}
19.
//模拟四则运算
#include<iostream.h>
main()
{
int 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<<"="<<(float)a/b<<endl;
elsecout<<"error!!!"<<endl;
return0;
}
20.
//兑钱
#include<iostream.h>
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";
return0;
}
21.
//求e
#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.
//求1!+2!~~+7!
#include<iostream.h>
intf(int x)
{
int r;
if(x==0) r=1;
else r=x*f(x-1);
return r;
}
main()
{
int i,s=0;
for(i=1;i<=7;i++) {
s+=f(i);
}
cout<<"结果是:"<<s<<endl;
return0;
}
23.
//求1×2+3×4+5×6+…+39×40
#include<iostream.h>
main()
{
int i,s=0;
for(i=1;i<=39;i+=2){
s+=i*(i+1);
}
cout<<"结果是:"<<s<<endl;
return0;
}
24.
//求值,精确到10e-6
#include<iostream.h>
#include<math.h>
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;
return0;
}
25.
//反向输出
#include<iostream.h>
#include<math.h>
main()
{
int x,i,j;
cout<<"输入整数x:";
cin>>x;
for(i=0;;i++) if(x/(int)pow(10,i)==0)break;
int a[100];
for(j=0;j<i;j++){
a[j]=(x%(int)pow(10,j+1))/((int)pow(10,j));
}
cout<<"反向输出为:";
for(int b=0;b<i;b++)cout<<a[b];
cout<<endl;
return0;
}
26.
//水仙花数
#include<io
展开阅读全文