C++程序设计实验指导书.docx
C+ 程序设计试验指导书答案(文档可以直接使用,也可依据实际需要修改使用,可编辑 欢送下载C+操作题答案试验一(1) 设计一个C+程序,输出以下信息:*Hello!*(2) 设计一个C+程序,输入三个职工的工资,求工资总额。试验数据:1500,2023,2500(3) 设计一个程序,从键盘输入一个矩形的长与宽,求其周长和面积。试验数据:50,40(4) 设计一个程序,输入一个华氏温度值,要求输出其对应的摄氏温度值。温度转换公式为:c=(f-32)*5/9。试验数据:33(5) 从键盘输入一个四位整数 n=abcd,从左到右用 a、b、c、d 表示各位的数字,现要求依次输出从右到左的各位数字,即输出另一个三位数m=dcba,试设计程序。试验数据:12344解答参考(1) 建工程为myproject1,建 c+源程序,文件名为myfile1.cpp,输入以下内容: # include <iostream.h>void maincout<<“ *“<<”n”; cout<<“Hello!“<<”n”; cout<<“ *“<<”n”;运行结果:* Hello!*(2) 算法分析提示:存放每个职工的工资变量应当是一个实型数,故工资总额变量也应当是实型数。程序如下。# include <iostream.h> void mainint sa1,sa2,sa3,sum;cout<<“请输入三个职工的工资:“; cin>>sa1>>sa2>>sa3; sum=sa1+sa2+sa3;cout<<“n 工资总额是:“<<sum<<”n”;运行结果:请输入三个职工的工资:1500 2023 2500 工资总额是:6000(3) 程序如下:# include <iostream.h>void main float a,b ,L,S;cout<<“请输入一个矩形的长与宽:“<<endl; cin>>a>>b;L=(a+b)*2;S=a*b;cout<<“矩形的长与宽: “ <<a<<和<<b<<endl;cout<<“矩形的周长: “ <<L<<endl; cout<<“矩形的面积: “ <<S<<endl;运行结果:请输入一个矩形的长与宽: 8 12矩形的长与宽:8 和 12 矩形的周长: 40矩形的面积: 96(4) 程序如下:# include <iostream.h> void mainfloat c,f;cout<<“请输入华氏温度:“; cin>>f;c=(f-32)*5/9;cout<<“摄氏温度是: “<<c<<”n”;运行结果:请输入华氏温度:95 摄氏温度是: 35.0(5) 算法分析提示:一个四位数如 1234,它的千位数 a 是 1,求解的方法是 1234/1000,由于两个整数相除结果是取整了,所以可求出千位,而它的个位 d 是 4,求解的方法是 1234%10,余数恰好是结果,至于百位数 b 和十位数c 承受的方法是多样的,见程序。输出值为 d*1000+c*100+b*10+a程序如下:# include <iostream.h> # include <math.h> void mainint a,b,c,d,n,m;cout<<“请输入四位十进制整数: “; cin>>n;a=n/1000; b=n%1000/100; c=n%100/10; d=n%10;m=d*1000+c*100+b*10+a;cout<<“m=“<<m<<”n”;运行结果:请输入四位十进制整数: 1234 m=4321试验二1(1) 演示单步执行程序的方法;(2) 设计一个程序,推断从键盘输入的整数的正负性和奇偶性。试验数据:-3 与 5(3) 有以下函数:x+3.5(x<5)y=203.5(x+3)2(5x<10)2x 3.5+sin(x)(x10)设计一个程序,从键盘输入x 的值,输出y 的值。试验数据:6 与 11(4) 奖金税率如下:a 代表奖金,r 代表税率a<100(元)r=0%100a<200200a<400400a<800r=2% r=4% r=8%a800r=10%输入一个奖金数,求税率、应交税款及实得奖金数。试验数据:400 与 9004.解答参考(2) 算法分析提示:首先推断一个数是否是正数,在此根底上推断它是否是偶数。算法描述如下:定义一个整数变量x。输入该整数x。假设x>0,连续推断假设x%2=0,这时说明该数是一个正偶数,否则是一个正奇数。否则说明是一个负数,再连续推断假设x%2=0,说明该数是一个负偶数,否则是一个负奇数。# include <iostream.h> void maininti;cout<<“请输入一个整数:“; cin>>i;if (i>0)if(i%2=0)cout<<i<<“ is positive even number“<<endl; elsecout<<i<<“ is positive odd number“<<endl;elseif(i%2=0)cout<<i<<“ is negative even number“<<endl; elsecout<<i<<“ is negative odd number“<<endl;运行结果:请输入一个整数:-6-6 is negative even number开头完毕(3) 流程图如图 3.1 所示。程序如下: #include <iostream.h>#include <math.h> void mainfloat x,y;cout<<“Input x:“;输入 xcin>>x;真if (x>=5)x5if (x>=10)y=x/2-3.5+sin(x);y=-x+3.5假x10真else假y=20-3.5*(x+3)*(x+3);y=20-3.5 (x+3)2y=x/2-3.5+sin(x)elsey=-x+3.5;cout<<“y=“<<y<<endl;输出 y运行结果:Input x: -3 y=6.5图 3.1 分段函数流程图(4) 算法分析提示:由于推断的条件比较多,所以考虑用switch 语句。依据奖金额有被 100 除的特点,可以给变量b=a/100,不同的状况下税率不同。算法描述如下: 定义四个变量a,b,r 分别表示奖金额,状况变量,税率。 输入奖金额a。 假设a>=800 则 r=10。 否则 b=a/100。 依据b 的值,得到r。 输出时输出税率r,应交税款 a*r/100,实得奖金额a*(1-float(r)/100)。# include <iostream.h>void mainint a,b,r;cout<<“please Input prize :“; cin>>a;if (a>=800)r=10;elseb=a/100; switch (b)case 0:r=0;break; case 1:r=2;break;case 2:case 3:r=4;break;case 4:case 5:case 6:case 7:r=8;break;default :cout<<“Input error!“;cout<<“Tax rate:“<<r<<“%“<<endl; cout<<“Tax :“<<a*r/100<<endl; cout<<“Prise:“<<a*(1-float(r)/100)<<endl;运行结果:please Input prize :400 Tax rate: 8%Tax: 32Prise: 368 运行结果:please Input prize :900 Tax rate: 10%Tax: 90Prise: 810试验三3. 试验内容(1) 输入一行字符,分别统计出其中英文字母、空格、数字字符和其它字符的个数。 提示:用 cin.get(c)函数从键盘上输入一个字符给变量c,直到输入回车换行字符”n”为止。(2) 设有一个数列,它的前四项为0、0、2、5,以后每项分别是其前四项之和,编程求此数列的前 20 项。(3) 求近似值的公式为:p= 2 ´ 2 ´ 4 ´ 4 ´ L2 n´2 nL213352 n - 12 n + 1其中,n=1、2、3设计一个程序,求出当n=1000 时的的近似值。(4) 求出 1599 中能被 3 整除,且至少有一位数字为5 的全部整数。如15、51、513均是满足条件的整数。提示:将 1599 中三位整数i 分解成个位、十位、百位,分别存放在变量a、b、c 中。然后推断a、b、c 中是否有 5。将三位整数i (设 i=513)分解成个位、十位、百位的方法是:c=i%10;/c= i%10=513%10=3a=i/10;/a= i/10=51 b=a%10;/b=a%10=51%10=1a=a/10;/a=a%10=51/10=5 4解答参考(1) # include <iostream.h>void main(void)charc;int i,letter=0,number=0,blank=0,other=0; cout<<“请输入字符串:“;cin.get(c);/get(c)函数用于从键盘上提取一个字符while(c!=”n”)if (”a”<=c && c<=”z” | ”A”<=c && c<=”Z”) letter+; else if (”0”<=c &&c<=”9”)number+;else if (c=” ”)blank+; else other+;cin.get(c);cout<<“letter=“<<letter<<endl; cout<<“number=“<<number<<endl; cout<<“blank=“<<blank<<endl; cout<<“other=“<<other<<endl;运行结果:请输入字符串:I am Student 1234letter=10 number=4 blank=3 other=0(2) 数列前四项值存放在变量 f1=0、f2=0、f3=2、f4=5 中第 5 项的值用f1 表示,则f1= f1+f2+f3+f4;第 6 项的值用f2 表示,则f2= f2+f3+f4+f1; 第 7 项的值用f3 表示,则f3= f3+f4+f1+f2; 第 8 项的值用f4 表示,则f4= f4+f1+f2+f3; 共进展 5 次,即可求出此数列的前 20 项。# include <iostream.h>void main(void) long f1,f2,f3,f4,i;f1=0; f2=0; f3=2; f4=5;for (i=1;i<=5;i+)cout<<f1<<”t”<<f2<<”t”<<f3<<”t”<<f4<<”t”<<endl;f1=f1+f2+f3+f4; f2=f2+f3+f4+f1; f3=f3+f4+f1+f2; f4=f4+f1+f2+f3;运行结果:0025714285410319938474014262749529910214196883795073151141003(3) # include <iostream.h> void main(void)long m,n; double pi=1;cout<<“Please Input m:“; cin>>m; for(n=1;n<=m;n+)pi=pi*(2.0*n/(2.0*n-1)*2.0*n/(2.0*n+1);cout<<“pi=“<<2*pi<<endl;运行结果:Please Input m:1000pi=3.14081运行结果:Please Input m:10000pi=3.14151(4) # include <iostream.h> void mainint i,a,b,c,j=1;for (i=1;i<=599;i+) if (i%3=0)a=i/100; b=i%100/10; c=i%100%10;if (a=5) | (b=5) | (c=5)cout<<i<<”t”;if (j%5=0) cout<<endl; j+;cout<<endl;试验四(1) 某班第 1 组有 10 个学生,进展了C+考试,编写程序将考试成绩输入一维数组, 并求出 C+的平均成绩及优90100、良8089、中7079、及格6069与不及格059学生的人数。试验数据:90、85、80、75、70、65、60、55、50、45(2) 某班第 1 组有 10 个学生,进展了C+考试,编写程序将考试成绩输入一维数组, 并将C+成绩用冒泡法、选择法两种排序算法,由低到高的挨次排序后输出。试验数据:90、85、80、75、70、65、60、55、50、45(3) 输入一个 5 行 5 列的二维数组,编程实现: 求出其中的最大值和最小值及其对应的行列位置; 求出对角线上各元素之和。1234523456345674567856789试验数据:(4) 设A、B、C 为 m 行 n 列矩阵。设计矩阵加法程序,能完成C=A+B 的操作。并输出 C 的元素值。m 与 n 用define 定义为常量,取值 3、3。A、B 矩阵的元素值如下:123A=456789321B=6549874. 解答参考1#include <iostream.h> #include <iomanip.h> #define N 10void main(void) float sum=0.0;int i,b=0,0,0,0,0,aN;cout<<“Input 10 score:n“; for (i=0;i<=N-1;i+)cin>>ai;for (i=0;i<=N-1;i+)sum=sum+ai; switch (ai/10) case 10:case 9: b0+;break;case 8: b1+;break;case 7: b2+;break;case 6: b3+;break; default: b4+;cout<<“优:“<<b0<<”n”;cout<<“良:“<<b1<<”n”;cout<<“中:“<<b2<<”n”;cout<<“及格:“<<b3<<”n”;cout<<“不及格: “<<b4<<”n”; cout<<“平均分: “<<sum/N; cout<<endl;运行结果:Input 10 score:9085 80 75 70 65 60 5550 45优:1良:2中:2及格:2不及格: 3平均分: 67.52算法分析:排序是指将一组无序的数据按从小到大升序或从大到小降序 的次序重排列。下面算法承受的是冒泡法排序。fori=0toN-1输入 ai fori=1toN-1forj=0toN-i-1真aj>aj+1假aj与 aj+1交换fori=0toN-1输出 ai#include <iostream.h> #include <iomanip.h> #define N 10void main(void) float aN,temp; int i,j;cout<<“Input score:“; for (i=0;i<=N-1;i+)cin>>ai;for (i=1;i<=N-1;i+)for (j=0;j<=N-i-1;j+) if (aj>aj+1)temp=aj;aj =aj+1; aj+1=temp;图 5.1冒泡法排序流程图for (i=0;i<=N-1;i+) cout<<setw(7)<<ai;cout<<endl;下面算法承受的是选择法排序。#include <iostream.h> #include <iomanip.h> #define N 10void main(void) float aN,temp; int i,j;cout<<“Input score:“; for (i=0;i<=N-1;i+)cin>>ai; for(i=0;i<N-1;i+) for(j=i+1; j<N;j+) if(ai<aj) temp=ai; ai=aj; aj=temp;for (i=0;i<=N-1;i+) cout<<setw(7)<<ai;cout<<endl;运行结果:Input score:90 78 68 96 88 75 67 85 92 8468 75 78 84 85 88 90 92 963#include <iostream.h> #include <iomanip.h> #define N 5void main(void)float aNN,max,min,sum; int i,j,r1=0,r2=0,c1=0,c2=0; cout<<“Input a55:“<<endl; for(i=0; i<N;i+)for(j=0; j<N;j+) cin>>aij;max=min=a00; sum=0;for(i=0; i<N;i+) for(j=0; j<N;j+) if (aij>max)max= aij; r1=i;c1=j;else if (aij<min)min= aij; r2=i;c2=j;if (i=j | i+j=N-1) sum+=aij;cout<<“max=“<<max<<”t”<<“row1=“<<r1<<”t”<<“col1=“<<c1<<endl; cout<<“min=“<<min<<”t”<<“row2=“<<r2<<”t”<<“col2=“<<c2<<endl; cout<<“sum=“<<sum<<endl;运行结果: Input a55:1 2 3 4 52 3 4 5 63 4 5 6 74 5 6 7 85 6 7 8 9max=9row1=4col1=4min=1row2=0col2=0sum=454#include <iostream> #include <iomanip.h> #define M 3#define N 3 void main(void)intaMN,bMN,cMN,i,j;cout<<“Input aMN:“<<endl; for (i=0;i<M;i+)for (j=0;j<N;j+) cin>>aij;cout<<“Input bMN:“<<endl; for (i=0;i<M;i+)for (j=0;j<N;j+) cin>>bij;for (i=0;i<M;i+) for (j=0;j<N;j+)cij= aij+bij; for (i=0;i<M;i+)for (j=0;j<N;j+)cout<<setw(4)<<cij; cout<<endl;运行结果: Input aMN: 1 2 34 5 67 8 9Input bMN:3 2 16 5 49 8 744410101016 16 16试验五(1) 已有一按从小到大次序排序好的数组,现输入一数,要求用折半查找法找出该数在数组中的位置。试验数据:数组值为:10,12,14,16,18,20,22,24,26,28 输入数: 16(2) 编写程序,实现 str=str1+str2 的操作,此处运算符“+”表示将两个字符串 str1 、 str2 连接成一个字符串str。用键盘将两个字符串输入字符数组str1 与str2 中,连接后的字符串存放在字符数组str 中,并输出连接后的字符串str。1) 用C+供给的字符串处理函数完成上述要求。2) 不用C+供给的字符串处理函数完成上述要求。试验数据:abcdefghij(3) 设计一个程序,按习题 4.12 的要求打印杨辉三角形。(4) 在表 4.4 中求每个学生的平均成绩及每门课的最高分与最低分,对学生成绩表用擂台法按平均成绩降序排序后输出。表 4.4学生成绩状况表学 号数 学语 文外 语平均成绩10019080851002707580100365707510048550601005809070最高分最低分4解答参考1分析:对已排好序的数,折半查找法总是将要找的数与中间的元素比较,假设大于它,则到后半局部去找,否则到前半局部去找。#include <iostream.h> #define N 10void main(void)float b,aN;int low,high,i,mid;cout<<“Input sort array a10:“<<endl;/输入 10 个有序数for(i=0;i<N;i+)cin>>ai;cout<<“Input number b:“;/输入要查找的数cin>>b;low=0;/设置查找的区间,开头时是全部high=i-1;mid=(low+high)/2;while(amid!=b&&low<high)/将查找的数与区间内的中间数进展比较if (b>amid)low=mid+1 ;/重设置查找区间为原区间的后半部elsehigh=mid-1;/重设置查找区间为原区间的前半部mid=(low+high)/2;/设置中间的比较元素if (b=amid)/找到cout<<b<<“ is on “<<mid<<endl;else/没找到cout<<“no find !“<<endl;运行结果:Input sort array a10:10 12 14 16 18 20 22 24 26 28Input number b: 1616 is on 32解:解法一#include <iostream.h> #include <string.h> #define N 30void main(void)char str1N,str2N,str2*N; cout<<“Inputfirst String“<<endl; cin>>str1;cout<<“InputsecondString“<<endl; cin>>str2;strcpy(str,str1); strcat(str,str2); cout<<“str=“<<str<<endl;解法二#include <iostream.h> #define N 30void main(void)char str1N,str2N,str2*N;int i,j;cout<<“Inputfirst String“<<endl; cin>>str1;cout<<“InputsecondString“<<endl; cin>>str2;i=0;while(str1i!=0)stri=str1i; i+; j=0;while(str2j!=0)stri=str2j; i+;j+;stri=0; cout<<“str=“<<str<<endl;运行结果:Input first String abcdeInput second String fghijstr=abcdefghij(3)#include <iostream.h> #include <iomanip.h> #define N 11void main(void) int cNN,m,n,k,m1,n1,nm1; for(n=1;n<N;n+) cnn=1;cn1=1;for(n=3; n<N;n+) for(m=2; m<=n-1;m+)cnm=cn-1m-1+cn-1m;/数组元素赋值for(n=1; n<N;n+)ifn%2=0cout<<” ;/调整数字对齐for (m=0;m<(N-n)/2;m+)/输出空格cout<<setw(6)<< ; for(m=1;m<=n;m+)cout<<setw(6)<<cnm;cout<<endl;(4)#include <iostream.h> #include <iomanip.h> #define M 7#define N 5 void main(void) float sMN,sum,ave,temp,max,min; int i,j,k;cout<<“Input data:n“; for (i=0;i<M-2;i+) for (j=0;j<N-1;j+)cin>>sij;/输入数据/输入 5 个学生的学号与 3 门课成绩for (i=0;i<M-2;i+)sum=0.0;for (j=1;j<N-1;j+) sum=sum+sij;siN-1=sum;/处理数据/计算每个学生的总成绩/计算每个学生的总分for (j=1;j<N;j+)max=min=s0j; for (i=0;i<M-2;i+)if (max<sij)max=sij;if (min>sij)min=sij;/处理数据/处理计算每门课程sM-1j=min;/计算每门课程的最低分sM-2j=max;/计算每门课程的最高分for (i=0;i<M-2;i+)/按总成绩排序k=i;for(j=i+1;j<M-2;j+)if (skN-1<sjN-1) k=j;if (k!=i)for (j=0;j<N;j+)temp=sij;sij=skj;skj=temp;cout<<setw(5)<<“ Num. “<<“ Math.Chin.Engl.Sum.“<<endl; cout<<“n“;/输出数据for (i=0;i<M;i+)for (j=0;j<N;j+)/输出学号、3 门课程的成绩与总分if (i=M-2 && j=0) cout<<setw(4)<<“最高分“; else if (i=M-1 && j=0) cout<<setw(4)<<“最低分“;else cout<<setw(6)<<sij; cout<<endl;cout<<“n“;运行结果:Input data:10019080851002707580100365707510048550601005809070Num.Math.Chin.Engl.Sum.10019080852551005809070240100270758022510036570752101004855060195最高分909085255最低分655060195试验六(1) 分别用冒泡法升序、选择法降序、擂台法升序编写三个对一维数组进 行排序的函数,函数名为 sort1、sort2、sort3。再定义一个输出数组元素值的函数print。在主函数中定义一维整型数组aNN=10,用键盘输入 10 个整数给 aN数组。依次调用 sort1、print、sort2、print、sort3、print,进展升序、降序、升序的操作,并输出每 次排序后的结果。输入十个试验数据:10,25,90,80,70,35,65,40,55,5(2) 编写一个函数px(float x,int n)用递归的方法求以下级数前n 项的和s。s = x - x 2 + x3 - x 4 + x5 - x6 + (-1)n-1 xn在主函数中定义变量x 与n,用键盘输入 x 与n 的值,调用 px函数计算并返回级数前n 项和s。最终输出s 的值。输入试验数据:x=1.2 n=10(3) 编写一个字符串连接函数str_cat(char s,char s1,char s2),完成s=s1+s2 的字符串连接工作。具体要求为,先将字符串s1 复制到s 中,然后再将字符串s2 连接到s 后面。在主函数中定义三个字符串数组str80、str140、str240,将两个字符串输入到 str1 与 str2中,调用字符串连接函数 str_cat,将 str1 与 str2 连接到 str 中,最终输出连接后的字符串str。要求用两种方法编写 str_cat函数。方法一,用字符串复制与连接函数。方法二,用 while 语句编程实现。输入试验数据:str1=”I am student” str2=”And You are student too”(4) 编写一个计算sin(x)的函数,在主函数中输入x,调用 sin(x)函数计算并输出yxx3x5x7值。y=sin x =-+-+(-1)n+1x(2n-1)13!5!7!(2n -1)!要求:在 sin(x)函数内,将级数中各项值累加到和变量 s 中去,直到最终一项确定值小于 0.00001 为止。输入试验数据:x=3.14159(5) 编写计算组合数的函数cmn(int n,int m),实现如下杨辉三角形的输出。1111211331146411510105116152015614解答参考(1)#include <iostream.h> #include <iomanip.h> #define N 10void print(int a) int i; for(i=0;i<N;i+)cout<<setw(5)<<ai; cout<<endl;void sort1( int a ) int i,j,temp; for(i=0;i<N-1;i+)for(j=0;j<=N-1-i;j+) if(aj>aj+1)temp=aj;aj=aj+1; aj+1=temp;void sort2( int a ) int i,j,temp; for(i=0;i<N-1;i+)for(j=i+1; j<N;j+) if(ai<aj)temp=ai;ai=aj; aj=temp;void sort3( int a )int i,j,k,temp; for(i=0;i<N-1;i+) k=i;for(j=i+1; j<N;j+)if(ak