C++程序设计实验指导书_第1页
C++程序设计实验指导书_第2页
C++程序设计实验指导书_第3页
C++程序设计实验指导书_第4页
C++程序设计实验指导书_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

C++程序设计试验指导书答案(文档可以直接使用,也可依据实际需要修改使用,可编辑欢送下载〕试验一设计一个C++程序,输出以下信息:***************Hello!***************设计一个C++程序,输入三个职工的工资,求工资总额。试验数据:1500,2023,2500设计一个程序,从键盘输入一个矩形的长与宽,求其周长和面积。试验数据:50,40设计一个程序,输入一个华氏温度值,要求输出其对应的摄氏温度值。温度转换公式为:c=(f-32)*5/9。试验数据:33n=abcd,从左到右用a、b、c、d表示各位的数字,现要求依次输出从右到左的各位数字,即输出另一个三位数m=dcba,试设计程序。试验数据:12344.解答参考建工程为myproject1,建c++源程序,文件名为myfile1.cpp,输入以下内容:#include<iostream.h>voidmain{ cout<<“***************“<<”\n”;cout<<“ Hello!“<<”\n”;cout<<“***************“<<”\n”;}运行结果:***************Hello!***************算法分析提示:存放每个职工的工资变量应当是一个实型数,故工资总额变量也应当是实型数。程序如下。#include<iostream.h>voidmain{ intsa1,sa2,sa3,sum;cout<<“请输入三个职工的工资:“;cin>>sa1>>sa2>>sa3;sum=sa1+sa2+sa3;cout<<“\n工资总额是:“<<sum<<”\n”;}运行结果:请输入三个职工的工资:150020232500工资总额是:6000程序如下:#include<iostream.h>voidmain{floata,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;}运行结果:请输入一个矩形的长与宽:812矩形的长与宽:812矩形的周长:40矩形的面积:96程序如下:#include<iostream.h>voidmain{ floatc,f;cout<<“请输入华氏温度:“;cin>>f;c=(f-32)*5/9;cout<<“摄氏温度是:“<<c<<”\n”;}运行结果:请输入华氏温度:95摄氏温度是:35.0算法分析提示:1234a11234/1000,由于两个整数相除d41234%10,余数恰好是结b和十位数cd*1000+c*100+b*10+a程序如下:#include<iostream.h>#include<math.h>voidmain{ inta,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”;}运行结果:请输入四位十进制整数:1234m=4321试验二1演示单步执行程序的方法;设计一个程序,推断从键盘输入的整数的正负性和奇偶性。试验数据:-3与5有以下函数:-x+3.5 (x<5)y= 20-3.5(x+3)2 (5≤x<10)2x-3.5+sin(x) (x≥10)2设计一个程序,从键盘输入x的值,输出y的值。试验数据:6与11〔ar代表税率〕a<100(元) r=0%100≤a<200200≤a<400400≤a<800

r=2%r=4%r=8%a≥800 r=10%输入一个奖金数,求税率、应交税款及实得奖金数。试验数据:400与9004.解答参考算法分析提示:首先推断一个数是否是正数,在此根底上推断它是否是偶数。算法描述如下:①定义一个整数变量x。②输入该整数x。③假设x>0,连续推断假设x%2=0,这时说明该数是一个正偶数,否则是一个正奇数。④否则说明是一个负数,再连续推断假设x%2=0,说明该数是一个负偶数,否则是一个负奇数。#include<iostream.h>voidmain{ int i;cout<<“请输入一个整数:“;cin>>i;if(i>0)if(i%2==0)cout<<i<<“ispositiveevennumber“<<endl;elsecout<<i<<“ispositiveoddnumber“<<endl;else}

if(i%2==0)cout<<i<<“isnegativeevennumber“<<endl;elsecout<<i<<“isnegativeoddnumber“<<endl;运行结果:请输入一个整数:-6-6isnegativeevennumber开头完毕3.1所示。程序如下:#include开头完毕#include<math.h>voidmain{floatx,y;cout<<“Inputx:“;xcin>>x;真if(x>=5)x≥5if(x>=10)y=x/2-3.5+sin(x);y=-x+3.5假x≥10真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}运行结果:Inputx:-3y=6.5

3.1分段函数流程图算法分析提示:由于推断的条件比较多,所以考虑用switch语句。依据奖金额有100除的特点,可以给变量b=a/100,不同的状况下税率不同。算法描述如下:①定义四个变量a,b,r②输入奖金额a。③假设a>=800r=10。④否则b=a/100。⑤依据br。⑥输出时输出税率r,应交税款a*r/100,实得奖金额a*(1-float(r)/100)。#include<iostream.h>voidmain{ inta,b,r;cout<<“pleaseInputprize:“;cin>>a;if(a>=800)r=10;else{ b=a/100;switch(b){ case0: r=0;break;case1: r=2;break;case2:case3: r=4;break;case4:case5:case6:case7: r=8;break;default:cout<<“Inputerror!“;}}cout<<“Taxrate:“<<r<<“%“<<endl;cout<<“Tax:“<<a*r/100<<endl;cout<<“Prise:“<<a*(1-float(r)/100)<<endl;}运行结果:pleaseInputprize:400Taxrate:8%Tax:32Prise:368运行结果:pleaseInputprize:900Taxrate:10%Tax:90Prise:810试验三试验内容输入一行字符,分别统计出其中英文字母、空格、数字字符和其它字符的个数。cin.get(c函数从键盘上输入一个字符给变量”\n设有一个数列,它的前四项为0、0、2、5,以后每项分别是其前四项之和,编程20求π近似值的公式为: 2244 2n 2n 2 1 3 3 5 2n1 2n1其中,n=1、2、3…设计一个程序,求出当n=1000时的π的近似值。1~5993整除,且至少有一位数字为5的全部整数。如15、51、513均是满足条件的整数。1~599中三位整数i分解成个位、十位、百位,分别存放在变量a、b、c中。然后推断a、b、c5。将三位整数i(i=513)分解成个位、十位、百位的方法是:c=i%10; //c=i%10=513%10=3a=i/10; //a=i/10=51b=a%10; //b=a%10=51%10=1a=a/10; //a=a%10=51/10=54.解答参考#include<iostream.h>voidmain(void){ char c;inti,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++;elseif(”0”<=c&& c<=”9”) number++;elseif(c==””) blank++;elseother++;cin.get(c);}cout<<“letter=“<<letter<<endl;cout<<“number=“<<number<<endl;cout<<“blank=“<<blank<<endl;cout<<“other=“<<other<<endl;}运行结果:请输入字符串:IamStudent1234letter=10number=4blank=3other=0数列前四项值存放在变量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;520项。#include<iostream.h>voidmain(void){longf1,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;}}运行结果:0 0 2 57 14 28 54103 199 384 7401426 2749 5299 1021419688 37950 73151 141003#include<iostream.h>voidmain(void){ longm,n;doublepi=1;cout<<“PleaseInputm:“;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;}运行结果:PleaseInputm:1000pi=3.14081运行结果:PleaseInputm:10000pi=3.14151#include<iostream.h>voidmain{ inti,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;}试验四110个学生,进展了C++考试,编写程序将考试成绩输入一维数组,并求出C++的平均成绩及优90~10、良〔80~8、中70~7、及格〔60~6〕与不及格〔0~59〕学生的人数。试验数据:90、85、80、75、70、65、60、55、50、45110个学生,进展了C++考试,编写程序将考试成绩输入一维数组,并将C++成绩用冒泡法、选择法两种排序算法,由低到高的挨次排序后输出。试验数据:90、85、80、75、70、65、60、55、50、4555列的二维数组,编程实现:求出其中的最大值和最小值及其对应的行列位置;求出对角线上各元素之和。12341234523456345674567856789设A、B、Cmn列矩阵。设计矩阵加法程序,能完成C=A+B的操作。并输C的元素值。mn用define3、3。A、B矩阵的元素值如下:1 2 3A= 4 5 67 8 91 2 3A= 4 5 67 8 93 2 1B= 6 5 49 8 7〔1〕#include<iostream.h>#include<iomanip.h>#defineN10voidmain(void){floatsum=0.0;inti,b[]={0,0,0,0,0},a[N];cout<<“Input10score:\n“;for(i=0;i<=N-1;i++)cin>>a[i];for(i=0;i<=N-1;i++){ sum=sum+a[i];switch(a[i]/10){case10:case9:b[0]++;break;case8:b[1]++;break;case7:b[2]++;break;case6:b[3]++;break;default:b[4]++;}}cout<<“优: “<<b[0]<<”\n”;cout<<“良: “<<b[1]<<”\n”;cout<<“中: “<<b[2]<<”\n”;cout<<“及格: “<<b[3]<<”\n”;cout<<“不及格:“<<b[4]<<”\n”;cout<<“平均分:“<<sum/N;cout<<endl;}运行结果:Input10score:90858075706560555045优:1良:2中:2及格:2不及格:3平均分:67.5〔2〕算法分析:排序是指将一组无序的数据按从小到大〔升序〕或从大到小〔降序〕的次序重排列。下面算法承受的是冒泡法排序。for i=0 to N-1输入a[i]for i=1 to for j=0 to N-i-1真a[j]>a[j+1]假for i=0 to N-1输入a[i]for i=1 to for j=0 to N-i-1真a[j]>a[j+1]假a[j]a[j+1]交换for i=0 to N-1a[i]voidmain(void){floata[N],temp;inti,j;cout<<“Inputscore:“;for(i=0;i<=N-1;i++)cin>>a[i];for(i=1;i<=N-1;i++)for(j=0;j<=N-i-1;j++)if(a[j]>a[j+1]){ temp=a[j];a[j]=a[j+1];a[j+1]=temp;

图5.1 冒泡法排序流程图}for(i=0;i<=N-1;i++)cout<<setw(7)<<a[i];cout<<endl;}下面算法承受的是选择法排序。#include<iostream.h>#include<iomanip.h>#defineN10voidmain(void){floata[N],temp;inti,j;cout<<“Inputscore:“;for(i=0;i<=N-1;i++)cin>>a[i];for(i=0;i<N-1;i++){for(j=i+1;j<N;j++)if (a[i]<a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}for(i=0;i<=N-1;i++)cout<<setw(7)<<a[i];cout<<endl;}运行结果:Inputscore:90786896887567859284687578848588909296〔3〕#include<iostream.h>#include<iomanip.h>#defineN5voidmain(void){ floata[N][N],max,min,sum;inti,j,r1=0,r2=0,c1=0,c2=0;cout<<“Inputa[5][5]:“<<endl;for(i=0;i<N;i++)for(j=0;j<N;j++)cin>>a[i][j];max=min=a[0][0];sum=0;for(i=0;i<N;i++)for(j=0;j<N;j++){if(a[i][j]>max){ max=a[i][j];r1=i;c1=j;}elseif(a[i][j]<min){ min=a[i][j];r2=i;c2=j;}if(i==j||i+j==N-1)sum+=a[i][j];}cout<<“max=“<<max<<”\t”<<“row1=“<<r1<<”\t”<<“col1=“<<c1<<endl;cout<<“min=“<<min<<”\t”<<“row2=“<<r2<<”\t”<<“col2=“<<c2<<endl;cout<<“sum=“<<sum<<endl;}运行结果:Inputa[5][5]:1234523456345674567856789max=9row1=4col1=4min=1row2=0col2=0sum=45〔4〕#include<iostream>#include<iomanip.h>#defineM3#defineN3voidmain(void){ int a[M][N],b[M][N],c[M][N],i,j;cout<<“Inputa[M][N]:“<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++)cin>>a[i][j];cout<<“Inputb[M][N]:“<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++)cin>>b[i][j];for(i=0;i<M;i++)for(j=0;j<N;j++)c[i][j]=a[i][j]+b[i][j];for(i=0;i<M;i++){ for(j=0;j<N;j++)cout<<setw(4)<<c[i][j];cout<<endl;}}运行结果:Inputa[M][N]:123456789Inputb[M][N]:3216549874 4 410 10 10161616试验五已有一按从小到大次序排序好的数组,现输入一数,要求用折半查找法找出该数在数组中的位置。试验数据:数组值为:10,12,14,16,18,20,22,24,26,28输入数:16str=str1+str2str1、str2连接成一个字符串strstr1与str2的字符串存放在字符数组strstr。用C++供给的字符串处理函数完成上述要求。不用C++供给的字符串处理函数完成上述要求。试验数据:abcdefghij4.12的要求打印杨辉三角形。在表4.4中求每个学生的平均成绩及每门课的最高分与最低分,对学生成绩表用擂台法按平均成绩降序排序后输出。表4.4 学生成绩状况表学号数学语文外语平均成绩10019080851002707580100365707510048550601005809070最高分最低分4.解答参考〔1〕分析:对已排好序的数,折半查找法总是将要找的数与中间的元素比较,假设大于它,则到后半局部去找,否则到前半局部去找。#include<iostream.h>#defineN10voidmain(void){ floatb,a[N];intlow,high,i,mid;cout<<“Inputsortarraya[10]:“<<endl; //10个有序数for(i=0;i<N;i++)cin>>a[i];cout<<“Inputnumberb:“; //输入要查找的数cin>>b;low=0; //设置查找的区间,开头时是全部high=i-1;mid=(low+high)/2;while(a[mid]!=b&&low<high) //将查找的数与区间内的中间数进展比较{ if(b>a[mid]) low=mid+1; //重设置查找区间为原区间的后半部else high=mid-1; //重设置查找区间为原区间的前半部mid=(low+high)/2; //设置中间的比较元素}if(b==a[mid]) //找到cout<<b<<“ison“<<mid<<endl;else //没找到cout<<“nofind!“<<endl;}运行结果:Inputsortarraya[10]:10121416182022242628Inputnumberb:1616ison3〔2〕解:解法一#include<iostream.h>#include<string.h>#defineN30voidmain(void){ charstr1[N],str2[N],str[2*N];cout<<“Input firstString“<<endl;cin>>str1;cout<<“Input second String“<<endl;cin>>str2;strcpy(str,str1);strcat(str,str2);cout<<“str=“<<str<<endl;}解法二#include<iostream.h>#defineN30voidmain(void){ charstr1[N],str2[N],str[2*N];inti,j;cout<<“Input firstString“<<endl;cin>>str1;cout<<“Input second String“<<endl;cin>>str2;i=0;while(str1[i]!=0){ str[i]=str1[i];i++;}j=0;while(str2[j]!=0){ str[i]=str2[j];i++;j++;}str[i]=0;cout<<“str=“<<str<<endl;}运行结果:InputfirstStringabcdeInputsecondStringfghijstr=abcdefghij(3)#include<iostream.h>#include<iomanip.h>#defineN11voidmain(void){intc[N][N],m,n,k,m1,n1,nm1;for(n=1;n<N;n++){c[n][n]=1;c[n][1]=1;}for(n=3;n<N;n++)for(m=2;m<=n-1;m++)c[n][m]=c[n-1][m-1]+c[n-1][m]; //数组元素赋值for(n=1;n<N;n++){ if〔n%2==0〕cout<<” ”; //调整数字对齐for(m=0;m<(N-n)/2;m++) //输出空格cout<<setw(6)<<‘‘;for(m=1;m<=n;m++)cout<<setw(6)<<c[n][m];cout<<endl;}}(4)#include<iostream.h>#include<iomanip.h>#defineM7#defineN5voidmain(void){floats[M][N],sum,ave,temp,max,min;inti,j,k;cout<<“Inputdata:\n“;for(i=0;i<M-2;i++){for(j=0;j<N-1;j++)cin>>s[i][j];

//输入数据//53}for(i=0;i<M-2;i++){ sum=0.0;for(j=1;j<N-1;j++)sum=sum+s[i][j];s[i][N-1]=sum;

//处理数据//计算每个学生的总成绩//计算每个学生的总分}for(j=1;j<N;j++){ max=min=s[0][j];for(i=0;i<M-2;i++){ if(max<s[i][j])max=s[i][j];if(min>s[i][j])min=s[i][j];

//处理数据//处理计算每门课程}s[M-1][j]=min;

//计算每门课程的最低分s[M-2][j]=max; //计算每门课程的最高分}for(i=0;i<M-2;i++) //按总成绩排序{ k=i;for(j=i+1;j<M-2;j++)if(s[k][N-1]<s[j][N-1])k=j;if(k!=i)for(j=0;j<N;j++){ temp=s[i][j];s[i][j]=s[k][j];s[k][j]=temp;}}cout<<setw(5)<<“Num.“<<“Math. Chin. Engl. Sum.“<<endl;cout<<“ \n“;

//输出数据for(i=0;i<M;i++){ for(j=0;j<N;j++) //输出学号、3if(i==M-2&&j==0)cout<<setw(4)<<“最高分“;elseif(i==M-1&&j==0)cout<<setw(4)<<“最低分“;elsecout<<setw(6)<<s[i][j];cout<<endl;}cout<<“ \n“;}运行结果:Inputdata:10019080851002707580100365707510048550601005809070Num.Math.Chin.Engl.Sum.10019080852551005809070240100270758022510036570752101004855060195最高分909085255最低分655060195试验六分别用冒泡法〔升序、选择法〔降序、擂台法〔升序〕编写三个对一维数组进sort1sort2sort3print。在主函数中定义一维整型数组a[NN=1,用键盘输入10个整数给a[N数组。依次调用sort1、print、sort2、print、sort3、print,进展升序、降序、升序的操作,并输出每次排序后的结果。输入十个试验数据:10,25,90,80,70,35,65,40,55,5编写一个函数px(floatx,intn)用递归的方法求以下级数前n项的和s。sxx2x3x4x5x6 (1)n1xn在主函数中定义变量x与nx与npx函数计算并返回级数前ns。最终输出s输入试验数据:x=1.2n=10编写一个字符串连接函数str_cat(chars[],chars1[],chars2[]),完成s=s1+s2的字符串连接工作。具体要求为,先将字符串s1复制到s中,然后再将字符串s2连接到s后面。在主函数中定义三个字符串数组str[80]、str1[40]、str2[40]str1str2str_catstr1str2str中,最终输出连接后的字符串strstr_catwhile语句编程实现。输入试验数据:str1=”Iamstudent”str2=”AndYouarestudenttoo”编写一个计算sin(x)的函数,在主函数中输入x,调用sin(x)函数计算并输出yx x3 x5 x7值。 y=sinx (1)n1

x(2n1)1 3! 5! 7! (2n1)!要求:在sin(xs中去,直到最终一项确定值0.00001输入试验数据:x=3.14159编写计算组合数的函数cmn(intn,intm),实现如下杨辉三角形的输出。1111211331146411510105116152015614.解答参考(1)#include<iostream.h>#include<iomanip.h>#defineN10voidprint(inta[]){inti;for(i=0;i<N;i++)cout<<setw(5)<<a[i];cout<<endl;}voidsort1(inta[]){inti,j,temp;for(i=0;i<N-1;i++)for(j=0;j<=N-1-i;j++)if (a[j]>a[j+1]){ temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}voidsort2(inta[]){inti,j,temp;for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if (a[i]<a[j]){ temp=a[i];a[i]=a[j];a[j]=temp;}}voidsort3(inta[]){inti,j,k,temp;for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if (a[k]>a[j])k=j;if(k>i){temp=a[i];a[i]=a[k];a[k]=temp;}}}voidmain(void){inti;intb[10];cout<<“10个数:“<<endl;for(i=0;i<10;i++)cin>>b[i];sort1(b);cout<<“10个数:“<<endl;print(b);sort2(b);cout<<“10个数:“<<endl;print(b);sort3(b);cout<<“10个数:“<<endl;print(b);}程序运行结果:10269115612532221419102 5 6 9 10 11 14 22 25 321032 25 22 14 11 10 9 6 5 2102 5 6 9 10 11 14 22 25 32(2)①递归公式为:px(n)=

x ;n=1px(n-1)+(-1)n-1xn ;n>1②递归完毕条件:n=1③递归约束条件:n>1#include<iostream.h>#include<math.h>voidmain(void){ floatx;intn;floatpx(float,int);cout<<“pleaseinputx,n:“;cin>>x>>n;cout<<“px=“<<px(x,n)<<endl;}floatpx(floatx,intn){ floatp;if(n==1)p=x;elsep=px(x,n-1)-pow(-1,n)*pow(x,n);returnp;}程序运行结果:pleaseinputx,n:24px=-10方法一,用字符串复制与连接函数。#include<iostream.h>#include<string.h>#defineN110#defineN210#defineN20voidstr_cat(chars1[],chars2[],chars[]){strcpy(s,s1);strcat(s,s2);}voidmain(void){ charstr[N],str1[N1],str2[N2];cout<<“PleaseinputString1:“;cin.getline(str1,80);cout<<“PleaseinputString2:“;cin.getline(str2,80);str_cat(str1,str2,str);cout<<str<<endl;}方法二,用while语句编程实现。#include<iostream.h>#include<string.h>#defineN110#defineN210#defineN20voidstr_cat(chars1[],chars2[],chars[]){ inti=0,j=0;while(s1[i]){ s[i]=s1[i];i++;}while(s2[j]){ s[i]=s2[j];i++;j++;}s[i]=”\0”;}voidmain(void){ charstr[N],str1[N1],str2[N2];cout<<“PleaseinputString1:“;cin.getline(str1,80);cout<<“PleaseinputString2:“;cin.getline(str2,80);str_cat(str1,str2,str);cout<<str<<endl;}程序运行结果:PleaseinputString1:IamstudentPleaseinputString2:AndYouarestudenttooIamstudentAndYouarestudenttoo(4)#include<iostream.h>#include<iomanip.h>#include<math.h>#defineN11floatzsin(floaty){ inti;floats=0,p=1.0,t;p=y;

//K阶乘的函数facfor(t=1,i=1;fabs(1.0/t)>=0.00001;i+=2){ s=s+p/t;p=p*y*y;t=-t*(i+1)*(i+2);}return(s);}voidmain(void){floatx,sn;cout<<“inputx: “;cin>>x;sn=zsin(x);cout<<endl<<“sin(x)=“<<sn<<endl;}程序运行结果:inputx: 3.14159sin(x)=-0.0752174(5)#include<iostream.h>#include<iomanip.h>#defineN11floatfac(intk){inti;floatt=1.0;for(i=1;i<=k;i++)t=t*i;return(t);

//K阶乘的函数fac}floatcmn(intm1,intn1){ floatp;p=fac(m1)/(fac(n1)*fac(m1-n1));return(p);

//定义计算组合数的函数cmn//调用求阶乘函数fac}voidmain(void){ intc[N][N],m,n;for(n=0;n<N;n++)for(m=0;m<=n;m++){//调用cmn函数c[n][m]=cmn(n,m);}for(n=0;n<N;n++){ for(m=0;m<=n;m++)cout<<setw(6)<<c[n][m];cout<<endl;}}试验七4种方式求整型一维数组a[10]的平均值。44种不同的数组元素表达方式。试验数据:10,20,30,40,50,60,70,80,90,100编写程序,用表7.1a[3][3]两条对角线元素之和。试验数据:10,25,90,80,70,35,65,40,55用指针变量编写以下字符串处理函数:字符串拼接函数,voidstr_cat(char*p1,char*p2){函数体}字符串比较函数,intstr_cmp(char*p1,*char*p2){函数体}取字符串长度函数,intstr_len(char*p){函数体}字符串进展拼接,输出拼接后的字符串及其长度。试验数据:“VisualC++“,“VisualBasic“a[10]进行降序排序。函数的实参为数组名,形参为数组。函数的实参为数组名,形参为指针变量函数的实参为指针变量,形参为数组。函数的实参为指针变量,形参为指针变量。试验数据:10,25,90,80,70,35,65,40,55,54.解答参考〔1〕方法一〔指针方式,转变p,用*p访问元素〕#include<iostream.h>#defineN10voidmain(void){ floata[N],sum,*p;cout<<“Inputdata:“;for(p=a;p<a+N;p++)cin>>*p;for(p=a,sum=0;p<a+N;p++)sum=sum+*p;cout<<“average=“<<sum/N<<endl;}方法二(指针方式,首地址+位移,用*〔p+i〕访问元素)#include<iostream.h>#defineN10voidmain(void){ floata[N],sum,*p=a;inti;cout<<“Inputintegers:“;for(i=0;i<N;i++)cin>>*(p+i);sum=0;for(i=0;i<N;i++)sum=sum+*(p+i);cout<<“average=“<<sum/N<<endl;}方法三(数组方式,指针变量的数组形式,用p[i]访问元素)#include<iostream.h>#defineN10voidmain(void){ floata[N],sum,*p=a;inti;cout<<“Inputdata:“;for(i=0;i<N;i++)cin>>p[i];sum=0;for(i=0;i<N;i++)sum=sum+p[i];cout<<“average=“<<sum/N<<endl;}方法四(指针方式,数组名+位移,用*〔a+i〕访问元素)#include<iostream.h>#defineN10voidmain(void){ floata[N],sum;inti;cout<<“Inputdata:“;for(i=0;i<N;i++)cin>>*(a+i);sum=0;for(i=0;i<N;i++)sum=sum+*(a+i);cout<<“average=“<<sum/N<<endl;}程序运行结果:Inputdata:102030405060708090100average=55(2)#include<iostream.h>voidmain(void){ floata[3][3],sum=0;inti,j;cout<<“InputData:\n“;for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>*(a[i]+j); //用行首地址+位移,a[i]+jfor(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j||i+j==2)sum+=*(a[i]+j);cout<<“sum=“<<sum<<”\n”;}程序运行结果:InputData:102590807035654055sum=290(3)#include<iostream.h>intstr_cmp(char*p1,char*p2){ while(*p1==*p2){p1++;p2++;}if(*p1>*p2)return1;elseif(*p1==*p2)return0;else}

return-1;voidstr_cat(char*p1,char*p2)//p2所指的字符串连接到p1所指的字符串串末尾{ while(*p1++);p1--;while(*p2!=0)*p1++=*p2++;*p1=0;}intstr_len(char*p){ intlength=0;while(*p!=0){ p++;length++;}returnlength;}voidmain(void){ chars1[20],s2[40];cout<<“InputString1:\n“;cin>>s1;cout<<“InputString2:\n“;cin>>s2;if(str_cmp(s1,s2)==1)cout<<“String1>String2“<<endl;elseif(str_cmp(s1,s2)==-1)cout<<“String2<String1“<<endl;elsecout<<“String1=String2“<<endl;str_cat(s1,s2);cout<<“String1+String2=“<<s1<<endl;cout<<“String1Length=“<<str_len(s1)<<endl;}程序运行结果:InputString1:VisualC++InputString2:VisualBasicString1>String2String1+String2=VisualC++VisualBasicString1Length=23#include<iostream.h>#include<iomanip.h>voidsort1(inta[],intn){inti,j,k,temp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(a[k]<a[j])k=j;if(k!=i)

//形参为数组名{temp=a[i];a[i]=a[k];a[k]=temp;}}}voidsort2(int*p,intn) //形参为指针{ inti,j,k,temp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if (*(p+k)<*(p+j))k=j;if(k!=i){temp=*(p+i);*(p+i)=*(p+k);*(p+k)=temp;}}}voidsort3(inta[],intn){ inti,j,k,temp;for(i=0;i<n-1;i++){ k=i;for(j=i+1;j<n;j++)if (*(a+k)<*(a+j))k=j;if(k!=i)

//形参为数组名{temp=*(a+i);*(a+i)=*(a+k);*(a+k)=temp;}}}voidsort4(int*p,intn){ inti,j,k,temp;for(i=0;i<n-1;i++){ k=i;for(j=i+1;j<n;j++)if (p[k]<p[j])k=j;if(k!=i)

//形参为指针{temp=p[i];p[i]=p[k];p[k]=temp;}}}voidmain(void){ inta1[10]={1,3,2,5,4,6,7,8,9,10},a2[10],a3[10],a4[10],*pi,i;cout<<“input10number:\n“;for(i=0;i<10;i++){ cin>>a1[i];a2[i]=a3[i]=a4[i]=a1[i];}sort1(a1,10);sort2(a2,10);pi=a3;

//实参为数组名,形参为数组//实参为数组名,形参为指针变量sort3(pi,10); //实参为指针变量,形参为数组pi=a4;sort4(pi,10); //实参为指针变量,形参指针变量cout<<“a1[0~9]={“;for(i=0;i<10;i++)cout<<setw(4)<<a1[i];cout<<“}“<<endl;cout<<“a2[0~9]={“;for(i=0;i<10;i++)cout<<setw(4)<<a2[i];cout<<“}“<<endl;cout<<“a3[0~9]={“;for(i=0;i<10;i++)cout<<setw(4)<<a3[i];cout<<“}“<<endl;cout<<“a4[0~9]={“;for(i=0;i<10;i++)cout<<setw(4)<<a4[i];cout<<“}“<<endl;}程序运行结果:input10number:1025908070356540555a1[0~9]={9080706555403525105}a2[0~9]={9080706555403525105}a3[0~9]={9080706555403525105}a4[0~9]={9080706555403525105}试验八试验目的初步学会指针数组的定义与使用方法。了解指向一维数组的指针变量的概念,能用指向一维数组的指针变量按行处理二维数组的问题。理解返回指针值函数的概念、定义格式,学会用返回指针值函数处理字符串问题。理解函数指针与函数指针变量的概念,学会用函数指针变量处理不同函数数学计算问题。试验要求编写试验程序在VC++运行环境中,输入源程序;编译运行源程序;输入测试数据进展程序测试;写出试验输入数据与运行结果。试验内容s[3][80]p[3]cin.getline(s[i],80)3个字符串到二维数组3行中,然后用指针数组p对字符串进展降序排列〔要求用擂台法用指针数组p输出排序后的结果,用字符数组s输出排序前的三个字符串。试验数据:“VisualC++“,“VisualBasic“,“Delphi“输入一个二维数组a[3][3],设计一个函数,用指向一维数组的指针变量和二维数组的行数作为函数的参数,求出平均值、最大值和最小值,并输出。试验数据:10,25,90,80,70,35,65,40,55设计程序,用函数指针变量完成两个操作数的加、减、乘、除、取余运算。试验数据:10+2010- 510* 1510 / 210 % 3设计一个用梯形法求定积分的通用函数,被积函数的指针、积分的上限、积分的下限和积分的区间等分数作为函数的参数。分别求出以下定积分的值。121ln(x)x3dx14s2( 4

)dx1s33

1x2xex dx1sin(x)x21解答参考(1)#include<iostream.h>#include<string.h>voidmain(void){ chars[3][80];char*p[3]={s[0],s[1],s[2]};char *pc;inti,j,k;cout<<“Input3String:“<<endl;for(i=0;i<3;i++)cin>>p[i];for(i=0;i<2;i++){ k=i;for(j=i+1;j<3;j++)if(strcmp(p[i],p[j])<0)k=j;if (k!=i){ pc=p[i];p[i]=p[k];p[k]=pc;}}for(i=0;i<3;i++)cout<<p[i]<<endl;for(i=0;i<3;i++)cout<<s[i]<<endl;}程序运行结果:Input3String:VisualBasicVisualC++DelphiVisualC++VisualBasicDelphiVisualBasicVisualC++Delphi(3)解:#include<iostream.h>intadd(intx,inty){ returnx+y;}intsub(intx,inty){ returnx-y;}intmul(intx,inty){ returnx*y;}intdiv(intx,inty){ returnx/y;}intres(intx,inty){ returnx%y;}voidmain(void){ intx,y;charoperate;int(*f)(int,int);cout<<“inputthree0end“<<endl;cout<<“Inputxoperatey=“<<endl;while(1){cin>>x>>operate>>y;switch(operate){case”+”:f=add;break;case”-”: f=sub;break;case”*”: f=mul;break;case”/”: f=div;break;case”%”: f=res;break;default:return;}cout<<x<<operate<<y<<“=“<<(*f)(x,y)<<endl;}}程序运行结果:inputthree0endInputxoperatey=10+2010+20=3010-510-5=510*1510*15=15010/210/2=510%310%3=1000(3)方法一:用指向一维数组的指针变量和二维数组的行数作为函数的参数#include<iostream.h>floatave(float(*p)[3],float*max,float*min){ floatsum=0;inti,j;for(i=0;i<3;i++){ for(j=0;j<3;j++){ sum+=(*p)[j];if(*max<(*p)[j])*max=(*p)[j];if(*min>(*p)[j])*min=(*p)[j];}p++;}returnsum/9;}voidmain(void){ floata[3][3],max,min,average;inti,j;cout<<“InputData:“;for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>a[i][j];max=min=a[0][0];average=ave(a+0,&max,&min);cout<<“ave=“<<average<<”\n”;cout<<“max=“<<max<<”\n”;cout<<“min=“<<min<<”\n”;}大值和最小值,并输出。解:#include<iostream.h>voidfun(floata[3][3]){ floatmax,min,sum=0,(*p)[3];inti,j;max=min=a[0][0];for(i=0;i<3;i++){ p=a+i;for(j=0;j<3;j++){ sum+=(*p)[j];if(max<(*p)[j])max=(*p)[j];if(min>(*p)[j])min=(*p)[j];}}cout<<“ave=“<<sum/9<<”\n”<<“max=“<<max<<”\n”<<“min=“<<min<<endl;}voidmain(void){ floatb[3][3];inti,j;cout<<“InputData:“;for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>b[i][j];fun(b);}程序运行结果:InputData:102590807035654055ave=52.2222max=90min=10(4)b分析:由高等数学可知,f(x)dx的定积分值等于由曲线y=f(x)x=ax=by=0a所围曲边梯形的面积s,如以以下图所示。现将曲边梯形划分成n个小曲边梯形△s0、△s1、△yy=f(x)yn-1y2 y1yyy=f(x)yn-1y2 y1y0△s0△s1△s2…△sn-1x=ax=bx0x1x2x3xn-1xnx图用梯形法求定积分面积△s0=y0*h△s1=y1*h…△sn-1=yn-1*hs=△s0+△s1+△s2+…+△sn-1=(y0+y1+y2+…+yn-1)*h=((f(x0)+(f(x1)+f(x2)+…+f(xn-1))*h∵x0=a,xn=b,xi=a+i*h∴用梯形法求定积分面积的公式为:s[in1f(aih)]hi0其中:a、b分别为积分的下、上限,n为积分区间的分隔数,h=(b-a)/n,h为积分步长;f(x)为被积函数。程序编写如下:#include<math.h>#include<iostream.h>floatf1(floatx){ return(1+log(x)+x*x*x);}floatf2(floatx){ return(1/(1+x*x));}floatf3(floatx){ return(x+exp(x))/(1+sin(x)+x*x);}floatintegral(float(*f)(float),floata,floatb,intn){floaty,h;inti;y=0;h=(b-a)/n;for(i=0;i<n;i++)y+=f(a+i*h);return(y*h);}voidmain(void){cout<<“s1=“<<integral(f1,1,2,1000)<<endl;cout<<“s2=“<<integral(f2,-1,4,1000)<<endl;cout<<“s3=“<<integral(f3,1,3,1000)<<endl;}程序运行结果:s1=5.13245s2=2.11232s3=3.31222试验目的

试验九初步学会用枚举类型变量处理有限元素组成的集合问题。把握构造体类型、构造体变量、构造体数组的定义格式。学会使用构造体变量与构造体数组处理如职工档案、职工工资等问题。试验要求编写试验程序;在VC++运行环境中,输入源程序;编译运行源程序;输入测试数据进展程序测试;写出运行结果。试验内容从A、B、C、D3个不同的字母,共有多少种取法?编写程序,输出全部取法中字母排列。(num)、姓名(name)、根本工资(base_salary)、岗位工资(post_salary)、医疗住房基金(fund)、税金(tax)与实发工资(fact_salary)员内容,然后输出职工工资内容。试验数据:1001,张明,1200,1800,300,100,2600用试验〔2〕函数分别用于:①输入全车间职工的工号、姓名、根本工资、岗位工资、医疗住房基金与税金。②计算每一个职工实发工资,计算公式:实发工资=根本工资+岗位工资-医疗住房基金-税金。③按实发工资降序排序。④输出全车间职工的工号、姓名、根本工资、岗位工资、医疗住房基金、税金与实发工资。作。试验数据:1001,张明,1200,1800,300,1001002,周明,1300,2023,310,1101003,李明,1400,2200,320,1201004,陈明,1500,2400,330,1301005,赵明,1600,2600,340,140ComplexAdd完成两个复数的加法运sum与数组c[5]c5个元素输入复Addsum=c[0]+c[1]+c[2]+c[3]+c[4]c5个复数值,及其复数sum的值。试验数据:c[0]=10+10i,c[1]=20+20i,c[2]=30+30i,c[3]=40+40i,c[4]=50+50i定义描述矩形的构造体类型,该构造体类型的数据成员为矩形的左上角坐标(x1,y1),矩形的长length与宽widthArea计算出矩形的周长与面积。在主函数Area计算出矩形的周长与面积,并输出矩形的左上角坐标、周长与面积。试验数据:100,100,200,50解答参考(1)#include<iostream.h>enumletter{A,B,C,D};voidshow(letterc){switch(c){caseA:cout<<“A“;break;caseB:cout<<“B“;break;caseC:cout<<“C“;break;caseD:cout<<“D“;break;}cout<<”\t”;}voidmain(void){ letterc1,c2,c3;for(c1=A;c1<=D;c1=letter(int(c1)+1))for(c2=A;c2<=D;c2=letter(int(c2)+1))for(c3=A;c3<=D;c3=letter(int(c3)+1)){if(c1!=c2&&c1!=c3&&c2!=c3){ show(c1);show(c2);show(c3);cout<<”\n”;}}cout<<“共有“<<n<<“种取法!“<<endl;}程序运行结果:ABCABDACBACDADBADCBACBADBCABCDBDABDCCABCADCBACBDCDACDBDABDACDBADBCDCADCB共有24种取法!(2)#include<iostream.h>structemployee{ intnum;charname[8];floatbase_salary,post_salary,fund,tax,fact_salary;};voidmain(void){ employeew={1001,“张明“,1200,1800,300,100,2600};cout<<“工号:“<<w.num<<”\n”;cout<<“姓名:“<<<<”\n”;cout<<“根本工资:“<<w.base_salary<<”\n”;cout<<“岗位工资:“<<w.post_salary<<”\n”;cout<<“医疗住房基金:“<<w.fund<<”\n”;cout<<“税金:“<<w.tax<<”\n”;cout<<“实发工资:“<<w.fact_salary<<”\n”;}程序运行结果:工号:1001姓名:张明根本工资:1200岗位工资:1800医疗住房基金:300税金:100实发工资:2600(3)#include<iostream.h>#include<iomanip.h>#defineN5structemployee{intnum;charname[8];floatbase_salary,post_salary,fund,tax,fact_salary;};voidinput(employees[],intn){ inti;cout<<“Inputemployeedata:“<<endl;for(i=0;i<n;i++)cin>>s[i].num>>s[i].name>>s[i].base_salary>>s[i].post_salary>>s[i].fund>>s[i].tax;}voidcalcu(employees[],intn){ inti;for(i=0;i<n;i++)s[i].fact_salary=s[i].base_salary+s[i].post_salary-s[i].fund-s[i].tax;}voidsort(employees[],intn){ inti,j,k;employeetemp;for(i=0;i<n-1;i++){ k=i;for(j=i+1;j<n;j++)if(s[k].fact_salar<s[j].fact_salar)k=j;if(k!=i){temp=s[i];s[i]=s[k];s[k]=temp;}}}voidoutput(employees[],intn){inti;cout<<setw(6)<<“Num“<<setw(8)<<“Name“<<setw(12)<<“Base_salary“<<setw(12)<<“Post_salary“<<setw(8)<<“Fund“<<setw(8)<<“Tax“<<setw(12)<<“Fact_salary“<<”\n”;for(i=0;i<n;i++)cout<<setw(6)<<s[i].num<<setw(8)<<s[i].name<<setw(12)<<s[i].base_salary<<setw(12)<<s[i].post_salary<<setw(8)<<s[i].fund<<setw(8)<<s[i].tax<<setw(12)<<s[i].fact_salary<<”\n”;}voidmain(void){ employeew[N];input(w,N);calcu(w,N);sort(w,N);output(w,N);}程序运行结果:Inputemployeedata:1001张明120018003001001002周明130020233101101003李明140022003201201004陈明150024003301301005赵明16002600340140Num NameBase_salaryPost_salary Fund Tax Fact_salary1005赵明1600260034014037201004陈明1500240033013034401003李明1400220032012031601002周明1300202331011028801001张明120018003001002600(4)算法分析提示:定义描述复数类型的构造体变量,描述复数的成员有两个:描述复数实部的real,描述复数虚部的image;实现复数加法函数add,函数的实参确定是c1和c2。形参是复数类型的任何两个变量如x,y,实现复数加时假设有第三变量z,即:z.real=x.real-y.real;z.image=x.image-y.image;函数返回为第三变量z;在主函数中定义复数类型变量sumc[5]。用循环语句给数组c5个元素输入复数值,并调用add函数完成sum=c[0]+c[1]+c[2]+c[3]+c[4]操作,最终输出数组c5个复数值,及其复数sum的值。最终输出c3、c4复数值。#include<iostream.h>#include<iomanip.h>structcomplex{floatreal;floatimage;};complexadd(complexc1,complexc2){ complexz;z.real=c1.real+c2.real;z.image=c1.image+c2.image;returnz;}voidmain(void){ complexc[5],sum={0,0};inti;cout<<“input5complexdata:“<<endl;for(i=0;i<5;i++)cin>>c[i].real>>c[i].image;for(i=0;i<5;i++)sum=add(sum,c[i]);for(i=0;i<5;i++)cout<<“c[“<<i<<“]=“<<c[i].real<<“+(“<<c[i].image<<“)i“<<”\n”;cout<<“sum=“<<sum.real<<“+(“<<sum.image<<“)i“<<”\n”;}程序运行结果:input5complexdata:10102020303040405050c[0]=10+10ic[1]=20+20ic[2]=30+30ic[3]=40+40ic[4]=50+50isum=150+150i(5)#include<iostream.h>#include<math.h>structRectangle{ floatx1,y1;floatlength,width;};voidArea(Rectanglea){ floatwlength,area;wlength=(a.length+a.width)*2;area=a.length*a.width;cout<<“Rectangleleft-toppoint:“<<a.x1<<”\t”<<a.y1<<endl;cout<<“wholelength=“<<wlength<<endl;cout<<“Area=“<<area<<en

温馨提示

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

评论

0/150

提交评论