1、C 上机题目期末复习资料剖析一些算法的程序,有的是上机题的答案,各位同学可根据自己的时间安排进行复习。打印三角形:#include void Rect(int line)/打印矩形 int i, j ; for (i=0; iline; i+) /矩形共line行 for(j=1; j=line; j+) cout *; coutendl; void TriangA(int line)/打印上三角 int i,j; for (i=0; iline; i+) /三角形共line行 for(j=0; jline-i; j+) cout ; /输出前方空格 for(j=1; j=2*i+1; j+)
2、 cout *; coutendl; void TriangB(int line)/打印下三角 int i, j ; for (i=0; iline; i+) /三角形共line行 for(j=0; j=i; j+) cout ; /输出前方空格 for(j=1; j=2*(line-1-i)+1; j+) cout *; cout0 & ch5) coutn1_输入整数n 2_矩形 3_上三角 4_下三角 5_结束: ; coutch; /输入选择项号码 switch(ch) case 1: coutn; /输入函数参数 break;case 2: cout打印n行矩形:endl; Rect
3、(n); break; case 3: cout打印上三角:endl; TriangA(n); break; case 4: cout打印下三角:endl; TriangB(n); break; case 5: break; /switch /while设计两个函数,分别求两个数的最大公约数和最小公倍数。 #include MaxCommonDevisor(int n,int m) for(int i=n;i=1;i-) if(n%i=0 & m%i=0) break; return i;MinCommonMultiple(int n,int m) for(int i=n;i=n*m;i+)
4、if(i%n=0 & i%m=0) break; return i; void main() int i,j; cout请输入两个整数:ij; cout最小公约数:MaxCommonDevisor(i,j)t最大公倍数:MinCommonMultiple(i,j)endl;验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。例如:4=2+2 6=3+3 8=3+5 50=3+47将450之间的所有偶数用两个素数之和表示。要求判断一个整数是否为素数用函数完成。bool prime(int m) /判断整数m是否为素数 if(m=1|m=0) return false; if(m=2)
5、 return true; /是素数 int k=(int)sqrt(m); for(int i=2;ik) return true; /是素数 else return false; /不是素数void main() for(int n=4;n=50;n+=2) for(int i=2;i=n/2;i+) if(prime(i) & prime(n-i) coutn=i+n-iendl;/列出所有可能组合 输出PASCAL三角的前12行PASCAL三角是形状如下的三角矩阵:1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1在三角中的每个数是一个组合C(n,
6、k):C(n, k)=( (n/1)(n-1)/2(n-2)/3) (n-k+2)/(k-1)(n-k+1)/k式中交替使用乘法和除法,每次乘以一个递减值,再除以一个递增值。#include #include using namespace std;long zrf_comb(int n, int k) if (n 0 | k n) return 0; long c = 1; for (int i=1; i=k; i+, n-) c = c*n/i; return c;int main() const m = 13; int j; for (int i = 0; i m; i+) for (j
7、 = 1; j m-i; j+) cout setw(2) ; for (j = 0; j = i; j+) cout setw(4) zrf_comb(i,j); cout endl; return 0;筛法求3100间的所有素数void main() int prime49,i,j=3; for (i=0;i49;i+) /将3100间的所有奇数放入筛(数组)中 primei=j; j=j+2; for(i=0;i48;i+) /用每一个当前位置上的数去“试筛”后面的其他数 if (primei) /如果该数字不为0 for(j=i+1;j49;j+) /对于当前“筛孔”后面的每一个数 i
8、f (primej&(primej%primei=0) primej=0; /如果是“筛孔”数的倍数就将其筛掉j=0; for(i=0;i49;i+) /循环输出各素数 if (primei) /如果该位置上的数没有被筛掉 coutprimeit; /输出该素数 j+; /j统计着素数个数 if (j%5=0) coutn; /一行5个素数 coutn; cout素数的个数为:jn;在具有20个元素的数组中,用产生随机数的方法为其元素赋值,并用顺序查找法在数组中查找指定的元素。#include#include#include#define N 20void research( int y ,
9、int z ) /顺序查找函数 for(int i=0;iN;i+) if(yi=z) cout在第i位置上找到“zendl; return; if(i=N) cout没有找到zendl; return;void main() int aN,i; srand(unsigned(time(0); /产生一个随机种子 for(i=0;iN;i+) ai=rand(); /ai的值取自随机数 coutait; couti; cout”nn”; research(a,i); /调用函数research查找i在具有15个元素的数组中,用二分查找法在数组中查找指定的元素。int BSearch(int a
10、,int x) /二分查找函数 int left=0,right=N,mid; /left为左端点,right为右端点,mid为中点 while(left=right) mid =(left+right)/2; /计算中点 coutmidx) right= mid-1; /要查找的数在左半区间,收缩右端点 else if(amidright) return -1; /查找失败 else return mid;void main() int x,pos,dataN=1,5,8,12,14,18,20,25,35,40; coutx; pos = BSearch(data,x); if(pos=0
11、) cout“ ”x”在数组中的位置:” posendl; else cout” 数组中无此元素!”endl;打印杨辉三角形 -计算二项式系数11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1#include#define N 6void main(void) int aNN,i,j; for(i=0;iN;i+) aii=1; /对角线元素为1 ai0=1; /最左一列元素为1 for(i=1;iN;i+) for(j=1;ji;j+) /主对角线以下元素计算 aij=ai-1j-1+ai-1j; for(i=0;iN;i+) /输出杨辉三角形 for(j=0;j=
12、i;j+) coutaijt; coutendl; 有两个数据系列分别为: a:48,435,232,666,264,1323,456 b: 186,90,152,122,82,243,312求:第三、四个数据系列c和d,要求c中数据是a、b中对应数的最大公约数。d中数据是a、b中对应数的最小公倍数。int a7= 48,435,232,666,264,1323,456; int b7=186, 90,152,122, 82, 243,312; c7= 6, 15, 8, 2 , 2 , 27, 24d7=1488,2610,4408,40626,10824,11907,5928/求最大公约数
13、int ojld(int m,int n) /形参不能是数组元素 int r; while(r=m%n) m=n; n=r; return n;/最小公倍数int gbs(int m,int n,int k) return m*n/k;void main(void) int a7=48,435,232,666,264,13231,456; int b7=186,90,152,122,82,243,312; int c7,d7; for(int i=0;i7;i+) ci=ojld(ai,bi); di=gbs(ai,bi,ci); for(i=0;i7;i+) coutcit; coutend
14、l; for(i=0;i7;i+) coutdit; coutendl;编写一个程序,将整数数组中的最大数与第0个元素交换,将最小数与最后一个元素交换。求最大(小)数用一个函数实现。#define N 10int maxin(int x ,int flag) int j=0,i; /j为最大(小)数的位置 for(i=0;ixj)j=i; /j标记最大数位置 else if(xixj)j=i; /j标记最小数位置 return j;void main() int aN=21,12,33,64,56,6,87,78,99,10, t, m; m=maxin(a,1); /求最大数,第一个实参为数
15、组名 if(m!=0) t=am,am=a0,a0=t; /交换最大数和第0个元素 m=maxin(a,0); /求最小数 if(m!=N-1) t=am, am=aN-1, aN-1=t; /交换最小数和最后元素编写一个程序,将十进制整数n转换成二进制数。void trans(int a ,int n) / n转二进制,a 为数组 int i=0; /假设i20 while(n!=0) ai+=n%2; n=n/2;void main() int b20=0,n,i=19; coutn; /输入待转换的十进制数n,n0 trans(b,n); /调用函数trans转换,数组名b作实参 cou
16、t=0; i-) /从高位到低位输出二进制数 coutbi; coutn;编写一个程序,处理某班学生3门课程(语文、数学和英语)的成绩。先输入学生人数(最多为50个人);再调用一个函数按编号从小到大的顺序依次输入学生成绩;然后调用函数统计每门课程全班的总成绩和平均成绩以及每个学生课程的总成绩和平均成绩;最后调用函数输出学生的成绩。void input(int a 5 , int n) /n是数组a第1维的大小,由调用函数指定 cout请输入n个同学成绩n; for(int i=0;iai0ai1ai2;void print(int a 5 ,int n) /形参是二维数组,第2维必须指定大小
17、cout”高数 英语 C+ 总分 平均分n”; for(int i=0;in;i+) coutsetw(4)ai0setw(6)ai1 setw(5)ai2setw(6) ; coutai3setw(8)ai4n; void cut(int a5,int n) for(int i=0;in;i+) ai3=ai0+ai1+ai2; /计算总分 ai4=ai3/3; /平均分不计小数 void main() int score505,n; coutn; input(score,n);/输入n个学生3门课的成绩 cut(score,n); /计算学生的总成绩和平均成绩 print(score,n)
18、; /输出n个学生的成绩有一行字符,现要求从其中删去某个指定字符(如输入n,表示要从此行文字中删去所有是n的字符),要求该行文字和待删的字符均由键盘输入。#define N 50void main() char strN,nstrN,ch; int i=0,j=0; cout“请输入文字:; cin.getline(str,N); /输入一行字符 coutch; /输入待删除的字符 while(stri!=0) if(stri!=ch) nstrj+=stri;/复制一个字符 i+; nstrj=0; cout新串:nstrendl;编写一个程序,将字符串s1中所有出现在字 符串s2中的字符删
19、去。int in(char ch,char str ) /判断ch是否在串str中 int i=0; while(stri!=0) if(stri+=ch)return 1; return 0;void del(char str ,int k) /删除k位置的一个字符 while(strk!=0) strk+=strk+1;void sdel(char s1 ,char s2 ) /从s1中删除所有的s2 int i=0,k=0; while(s1i!=0) if(in(s1i,s2)=1)del(s1,i); i+; void main() char str150,str210; cout请
20、输入字符串:; cin.getline(str1,50); cout请输入要删除的字串:; cin.getline(str2,10); sdel(str1,str2); coutstr1endl;编写一个程序,实现两个长整数相加的过程。void nsort(char str );void add(char s1 ,char s2 ,char sum );void main() char s140=0, s240=0, sum50=0; couts1; /输入被加数 couts2; /输入加数 nsort(s1); nsort(s2); /加数和被加数反转 add(s1,s2,sum); /相加
21、 nsort(sum); /和反转 cout相加结果:suml2?l1:l2; /len为位数大者 while(ilen) j=s1i+s2i-96+jw; /计算第i位的和 if(j9) /有进位 sumi=j+38,jw=1; else /无进位 sumi=j+48,jw=0; i+; if(jw) sumi=1; /处理最高位的进位 else sumi=0; sumi+1=0; /设置和的字符串结束符void nsort(char str ) int i=0, j=strlen(str)-1; char t; while(ij) t=stri; stri=strj; strj=t; i+
22、; j-; 已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中void main(void) int a8=1,2,4,8,32,64,128, x; for(int i=0;i7;i+) coutait; coutendl; i-; coutx; while(aix)ai+1=ai-; ai+1=x; for(i=0;i8;i+) coutait; coutendl;矩阵乘积void main() int aNK,bKM,cNM; int i,j,l; /-输入a数组 cout请输入a数组:n; for(i=0;iN;i+) for(j=0;jaij;/-输入b数组 cout请输入b数组:n; for(i=0;iK;i+) for(j=0;jbij; /-计算乘积 for(i=0;iN;i+) for(j=0;jM;j+) cij=0; for(l=0;lK;l+) cij+=ail*blj; /-输出乘积结果 for(i=0;iN;i+) for(j=0;jM;j+) coutcijt; coutn;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1