C++上机题目期末复习资料.docx
- 文档编号:4993779
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:16
- 大小:20.55KB
C++上机题目期末复习资料.docx
《C++上机题目期末复习资料.docx》由会员分享,可在线阅读,更多相关《C++上机题目期末复习资料.docx(16页珍藏版)》请在冰豆网上搜索。
C++上机题目期末复习资料
一些算法的程序,有的是上机题的答案,各位同学可根据自己的时间安排进行复习。
打印三角形:
#include
voidRect(intline){//打印矩形
inti,j;
for(i=0;i { for(j=1;j<=line;j++) cout<<''<<'*'; cout< } } voidTriangA(intline){//打印上三角 inti,j; for(i=0;i { for(j=0;j cout<<"";//输出前方空格 for(j=1;j<=2*i+1;j++) cout<<''<<'*'; cout< } } voidTriangB(intline){//打印下三角 inti,j; for(i=0;i { for(j=0;j<=i;j++) cout<<"";//输出前方空格 for(j=1;j<=2*(line-1-i)+1;j++) cout<<''<<'*'; cout< } } voidmain(){ intch=1; intn; while(ch>0&&ch<5){ cout<<"\n1_输入整数n2_矩形3_上三角4_下三角5_结束: "; cout<<"\n请输入菜单项序号: "; cin>>ch;//输入选择项号码 switch(ch){ case1: cout<<"\n请输入一个整数n="; cin>>n;//输入函数参数 break; case2: cout<<"打印n行矩形: "< Rect(n); break; case3: cout<<"打印上三角: "< TriangA(n); break; case4: cout<<"打印下三角: "< TriangB(n); break; case5: break; }//switch }//while } 设计两个函数,分别求两个数的最大公约数和最小公倍数。 #include MaxCommonDevisor(intn,intm){ for(inti=n;i>=1;i--) if(n%i==0&&m%i==0)break; returni; } MinCommonMultiple(intn,intm){ for(inti=n;i<=n*m;i++) if(i%n==0&&i%m==0)break; returni; } voidmain(){ inti,j; cout<<"请输入两个整数: "< cin>>i>>j; cout<<"最小公约数: "< "< } 验证歌德巴赫猜想: 任何一个充分大的偶数都可以表示为两个素数之和。 例如: 4=2+26=3+38=3+5……50=3+47 将450之间的所有偶数用两个素数之和表示。 要求判断一个整数是否为素数用函数完成。 boolprime(intm){//判断整数m是否为素数 if(m==1||m==0)returnfalse; if(m==2)returntrue;//是素数 intk=(int)sqrt(m); for(inti=2;i<=k;i++)//穷举法 if(m%i==0)break; if(i>k)returntrue;//是素数 elsereturnfalse;//不是素数 } voidmain(){ for(intn=4;n<=50;n+=2){ for(inti=2;i<=n/2;i++) if(prime(i)&&prime(n-i))cout< //列出所有可能组合 } } 输出PASCAL三角的前12行 PASCAL三角是形状如下的三角矩阵: 1 11 121 1331 14641 15101051 在三角中的每个数是一个组合C(n,k): C(n,k)=((((((((n/1)(n-1))/2(n-2))/3)… (n-k+2))/(k-1))(n-k+1))/k 式中交替使用乘法和除法,每次乘以一个递减值,再除以一个递增值。 #include #include usingnamespacestd; longzrf_comb(intn,intk) {if(n<0||k<0||k>n)return0; longc=1; for(inti=1;i<=k;i++,n--) c=c*n/i; returnc; } intmain() {constm=13; intj; for(inti=0;i {for(j=1;j cout< (2)<<""; for(j=0;j<=i;j++) cout< cout< } return0; } 筛法求3~100间的所有素数 voidmain() {intprime[49],i,j=3; for(i=0;i<49;i++) //将3~100间的所有奇数放入筛(数组)中 {prime[i]=j;j=j+2;} for(i=0;i<48;i++) //用每一个当前位置上的数去“试筛”后面的其他数 if(prime[i])//如果该数字不为0 for(j=i+1;j<49;j++) //对于当前“筛孔”后面的每一个数 if(prime[j]&&(prime[j]%prime[i]==0)) prime[j]=0; //如果是“筛孔”数的倍数就将其筛掉 j=0; for(i=0;i<49;i++)//循环输出各素数 if(prime[i])//如果该位置上的数没有被筛掉 {cout< j++;//j统计着素数个数 if(j%5==0)cout<<‘\n’;//一行5个素数 } cout<<'\n'; cout<<"素数的个数为: "< } 在具有20个元素的数组中,用产生随机数的方法为其元素赋值,并用顺序查找法在数组中查找指定的元素。 #include #include #include #defineN20 voidresearch(inty[],intz)//顺序查找函数 {for(inti=0;i if(y[i]==z) {cout<<"在第"< return; } if(i==N)cout<<"没有找到"< return; } voidmain() {inta[N],i; srand(unsigned(time(0)));//产生一个随机种子 for(i=0;i {a[i]=rand();//a[i]的值取自随机数 cout< } cout<<”\n请输入要查找的数: ”; cin>>i; cout<<”\n\n”; research(a,i);//调用函数research查找i } 在具有15个元素的数组中,用二分查找法在数组中查找指定的元素。 intBSearch(inta[],intx)//二分查找函数 {intleft=0,right=N,mid; //left为左端点,right为右端点,mid为中点 while(left<=right) {mid=(left+right)/2;//计算中点 cout< if(a[mid]>x)right=mid-1; //要查找的数在左半区间,收缩右端点 elseif(a[mid] //要查找的数在右半区间,收缩左端点 elsereturnmid;//查找成功 } if(left>right)return-1;//查找失败 elsereturnmid; } voidmain() {intx,pos,data[N]={1,5,8,12,14,18,20,25,35,40}; cout<<”请输入要查找的数: ”; cin>>x; pos=BSearch(data,x); if(pos>=0) cout<<“”< ” < else cout<<”数组中无此元素! ”< } 打印杨辉三角形 ---计算二项式系数 1 11 121 1331 14641 15101051 #include #defineN6 voidmain(void) { inta[N][N],i,j; for(i=0;i a[i][i]=1; //对角线元素为1 a[i][0]=1; //最左一列元素为1 } for(i=1;i for(j=1;j a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i { for(j=0;j<=i;j++) cout< cout< } } 有两个数据系列分别为: a: 48,435,232,666,264,1323,456 b: 186,90,152,122,82,243,312 求: 第三、四个数据系列c和d,要求c中数据是a、b中对应数的最大公约数。 d中数据是a、b中对应数的最小公倍数。 inta[7]={48,435,232,666,264,1323,456}; intb[7]={186,90,152,122,82,243,312}; c[7]={6,15,8,2,2,27,24} d[7]={1488,2610,4408,40626,10824,11907,5928} //求最大公约数 intojld(intm,intn)//形参不能是数组元素 {intr; while(r=m%n){m=n;n=r;} returnn; } //最小公倍数 intgbs(intm,intn,intk) {returnm*n/k;} voidmain(void) {inta[7]={48,435,232,666,264,13231,456}; intb[7]={186,90,152,122,82,243,312}; intc[7],d[7]; for(inti=0;i<7;i++) {c[i]=ojld(a[i],b[i]); d[i]=gbs(a[i],b[i],c[i]); } for(i=0;i<7;i++)cout< cout< for(i=0;i<7;i++)cout< cout< } 编写一个程序,将整数数组中的最大数与第0个元素交换,将最小数与最后一个元素交换。 求最大(小)数用一个函数实现。 #defineN10 intmaxin(intx[],intflag) {intj=0,i;//j为最大(小)数的位置 for(i=0;i if(flag)//flag为1时求最大值为0时求最小值 {if(x[i]>x[j])j=i;}//j标记最大数位置 else {if(x[i] returnj; } voidmain() {inta[N]={21,12,33,64,56,6,87,78,99,10},t,m; m=maxin(a,1);//求最大数,第一个实参为数组名 if(m! =0)t=a[m],a[m]=a[0],a[0]=t; //交换最大数和第0个元素 m=maxin(a,0);//求最小数 if(m! =N-1)t=a[m],a[m]=a[N-1],a[N-1]=t; //交换最小数和最后元素 } 编写一个程序,将十进制整数n转换成二进制数。 voidtrans(inta[],intn)//n转二进制,a[]为数组 {inti=0;//假设i<20 while(n! =0){a[i++]=n%2;n=n/2;} } voidmain() {intb[20]={0},n,i=19; cout<<”n=”; cin>>n;//输入待转换的十进制数n,n>0 trans(b,n);//调用函数trans转换,数组名b作实参 cout<<”二进制数为: ”; while(b[i]==0)i--;//排除没存放二进制数的元素 for(;i>=0;i--)//从高位到低位输出二进制数 cout< cout<<’\n’; } 编写一个程序,处理某班学生3门课程(语文、数学和英语)的成绩。 先输入学生人数(最多为50个人);再调用一个函数按编号从小到大的顺序依次输入学生成绩;然后调用函数统计每门课程全班的总成绩和平均成绩以及每个学生课程的总成绩和平均成绩;最后调用函数输出学生的成绩。 voidinput(inta[][5],intn) //n是数组a第1维的大小,由调用函数指定 {cout<<"请输入"< for(inti=0;i cin>>a[i][0]>>a[i][1]>>a[i][2]; } voidprint(inta[][5],intn) //形参是二维数组,第2维必须指定大小 {cout<<”高数英语C++总分平均分\n”; for(inti=0;i {cout< < cout< } voidcut(inta[][5],intn) {for(inti=0;i {a[i][3]=a[i][0]+a[i][1]+a[i][2];//计算总分 a[i][4]=a[i][3]/3;//平均分不计小数 } } voidmain() {intscore[50][5],n; cout<<"请输入学生人数: ”; cin>>n; input(score,n);//输入n个学生3门课的成绩 cut(score,n);//计算学生的总成绩和平均成绩 print(score,n);//输出n个学生的成绩 } 有一行字符,现要求从其中删去某个指定字符(如输入n,表示要从此行文字中删去所有是n的字符),要求该行文字和待删的字符均由键盘输入。 #defineN50 voidmain() {charstr[N],nstr[N],ch; inti=0,j=0; cout<<“请输入文字: "; cin.getline(str,N);//输入一行字符 cout<<"字符: "; cin>>ch;//输入待删除的字符 while(str[i]! ='\0'){ if(str[i]! =ch)nstr[j++]=str[i];//复制一个字符 i++; } nstr[j]='\0'; cout<<"新串: "< } 编写一个程序,将字符串s1中所有出现在字 符串s2中的字符删去。 intin(charch,charstr[])//判断ch是否在串str中 {inti=0; while(str[i]! ='\0') if(str[i++]==ch)return1; return0; } voiddel(charstr[],intk)//删除k位置的一个字符 {while(str[k]! ='\0') str[k++]=str[k+1]; } voidsdel(chars1[],chars2[])//从s1中删除所有的s2 {inti=0,k=0; while(s1[i]! ='\0') {if(in(s1[i],s2)==1)del(s1,i); i++;} } voidmain() {charstr1[50],str2[10]; cout<<"请输入字符串: "; cin.getline(str1,50); cout<<"请输入要删除的字串: "; cin.getline(str2,10); sdel(str1,str2); cout< } 编写一个程序,实现两个长整数相加的过程。 voidnsort(charstr[]); voidadd(chars1[],chars2[],charsum[]); voidmain(){ chars1[40]={"\0"},s2[40]={"\0"},sum[50]={'0'}; cout<<"被加数: ";cin>>s1;//输入被加数 cout<<"加数: ";cin>>s2;//输入加数 nsort(s1);nsort(s2);//加数和被加数反转 add(s1,s2,sum);//相加 nsort(sum);//和反转 cout<<"相加结果: "< } voidadd(chars1[],chars2[],charsum[]) {intjw=0,i=0,j,l1,l2,len;//jw为进位 l1=strlen(s1);l2=strlen(s2);//求数字位数 len=l1>l2? l1: l2;//len为位数大者 while(i {j=s1[i]+s2[i]-96+jw;//计算第i位的和 if(j<0)j+=48;//防止s1或s2中的某位为\0 if(j>9)//有进位 sum[i]=j+38,jw=1; else//无进位 sum[i]=j+48,jw=0; i++; } if(jw)sum[i]='1';//处理最高位的进位 elsesum[i]='\0'; sum[i+1]='\0';//设置和的字符串结束符 } voidnsort(charstr[]) {inti=0,j=strlen(str)-1; chart; while(i {t=str[i];str[i]=str[j];str[j]=t; i++;j--; } } 已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中 voidmain(void) {inta[8]={1,2,4,8,32,64,128},x; for(inti=0;i<7;i++) cout< cout< i--; cout<<“输入一个整数x: "; cin>>x; while(a[i]>x)a[i+1]=a[i--]; a[i+1]=x; for(i=0;i<8;i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 上机 题目 期末 复习资料
![提示](https://static.bdocx.com/images/bang_tan.gif)