天津大学C上机考试复习题_第1页
天津大学C上机考试复习题_第2页
天津大学C上机考试复习题_第3页
天津大学C上机考试复习题_第4页
天津大学C上机考试复习题_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、上机考试复习题1212 34 38 20 82 1730 18 25 13 56 2145 39 15 24 19 3211 76 40 41 64 431. 定义一个二维数组a并用下列数据初始化。编写一个直接插入排序函数void insert(int x, int n)对每一行元素排序。并对每行元素最大值进行排序。要求:在main函数中输出原数组、排序后的数组、及排序后的最大值。(提示:把每行最大值存到一个一维数组max中)/利用同一个函数对二维数组的每行及最大值数组进行排序#include<iostream.h>void insert(int x, int n);/形参为一维数

2、组,因只处理一维数组,故只需传递列数(每行元素的个数)void main() int a46=12,34,38,20,82,17,30,18,25,13,56,21,45,39,15,24,19,32,11,76,40,41,64,43; int i, j, max4; for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<" " cout<<endl; cout<<endl; for(i=0; i<4; i+)/调用排序函数, 每次调用传递一行, 实参ai是行元素,

3、第i行的名字(地址), insert(ai, 6);/这种方法简单、明确,但因循环调用效率不高。 maxi=ai5;/为数组max赋值 for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<" " cout<<endl; cout<<endl;insert(max, 4); for(i=0; i<4; i+) cout<<maxi<<" " cout<<endl;void insert(int x, int n)/

4、一维数组的直接插入排序函数 int i, j, k; for(i=1; i<n; i+) k=xi; j=i;/把待排序元素存入中间变量,设置插入指针j while(k<xj-1&&j>0) xj=xj-1;/后移 j-; xj=k;/插入 2. 定义一个二维数组a并用下列数据初始化。输入一个数,在数组中进行顺序查找,找到时输出该数的下标,否则输出“没有找到”(用查找函数int seqsearch(int a6, int x, int &m, int &n)完成)。编写一个直接选择排序函数void select(int x, int m, in

5、t n)对每一行元素排序,输出排序后的数组。12 34 38 20 82 1730 18 25 13 56 2145 39 15 24 19 3211 76 40 41 64 43/两种传递二维数组的方式#include<iostream.h>int seqsearch(int a6, int x, int &m, int &n);/顺序查找函数,二维数组作形参,6不可省略!void select(int x, int m, int n);/直接选择排序。一维数组作形参,因需处理二维数组,故要传递行列数 m nvoid main() int a46= 12,34,3

6、8,20,82,17, 30,18,25,13,56,21, 45,39,15,24,19,32, 11,76,40,41,64,43, ; int i, j, x, m, n; for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<" " cout<<endl; cout<<endl; cout<<"输入需查找的数:" cin>>x; if(seqsearch(a,x,m,n) cout<<"(i,j)=&q

7、uot;<<m<<", "<<n<<endl<<endl;/注意:形参是二维数组,须用数组名a作实参 else cout<<"没有找到nn" select(a0, 4, 6);/调用排序函数,降阶处理:采用一维形式处理二维数组。(因此须用一维数组名a0作实参) /由于一次性传递整个数组,故效率高,是处理二维数组更为普遍的方式。要求对数组有较深入的了解。 for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<&

8、quot; " cout<<endl; cout<<endl;void select(int x, int m, int n) int h, i, j, k, t; for(h=0; h<m; h+)/ h 为需处理的行数(把数组x看作一行一行一字排开一维数组) for(i=0; i<n-1; i+)/直接选择排序算法,对一行(n个数)排序 k=i;/设置交换指针k for(j=i+1; j<n; j+) if(xj<xk) k=j;/记录最小值元素的下标 t=xi; xi= xk; xk=t; /与待排序元素xi交换x+=n;/降阶处

9、理的要点:由于数组名 x 是指针(变量),使它指向下一行。 int seqsearch(int a6, int x, int &m, int &n)/顺序查找函数(挨个比较),找到返回1,否则返回0,下标由引用返回 int i, j, ok=0; for(i=0; i<4&&!ok; i+)/双重循环条件:找到一个即停止循环,否则一直找到底for(j=0; j<6; j+) if(aij=x)ok=1; m=i; n=j;break;/找到!置ok为1,并记录下标。注意:函数中的m n 是主函数中m n 的引用(在不同函数中可以同名) return

10、ok;/如没找到,ok保持为012 34 38 20 82 1730 18 25 13 56 2145 39 15 24 19 3211 76 40 41 64 433. 定义一个二维数组a并用下列数据初始化。编写冒泡排序函数 void bubble(int x, int n,float& av)对每一行元素排序,并计算每行元素的平均值。要求:在main函数中输出原数组、按行输出排序后的数组及平均值。(提示:把平均值存到一个一维数组aver中)#include<iostream.h>void bubble(int x, int n, float& av);void

11、main() int a46=12,34,38,20,82,17,30,18,25,13,56,21,45,39,15,24,19,32,11,76,40,41,64,43; int i, j; float aver4=0; for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<" " cout<<endl; cout<<endl; for(i=0; i<4; i+) bubble(ai, 6, averi);/注意3个实参:ai,6 是数组名和长度,传递二维数组的一行

12、,/averi是数组元素(相当于简单变量),地址传给引用形参av for(i=0; i<4; i+) for(j=0; j<6; j+) cout<<aij<<" " cout<<averi<<endl; cout<<endl;void bubble(int x, int n, float & av)/一维数组冒泡排序函数 int i=0, j, k=1, t; while(k)/冒泡算法 k=0;/设置逆序标志 k(同时也是循环条件,1 为有逆序,0 为无逆序) for(j=0; j<n

13、-1-i; j+) if(xj>xj+1)/出现逆序 k=1; t=xj; xj= xj+1; xj+1=t;/重置 k ,交换逆序数对 i+; for(i=0; i<n; i+) av+=xi;/同时计算每行的平均值并由av回传 av=av/n;4. 定义一个二维数组int a4=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16。定义函数int lsum(int x, int n, int &sum)返回每行元素之和并求所有元素之和,要求该函数中使用静态局部变量s存储二维数组总和。按行输出数组及每行之和,最后输出总和。定义数组void exch

14、(int x4, int n)其功能是转置该数组并作如上操作。#include<iostream.h>#include<iomanip.h>int lsum(int x, int, int& );/求和函数,返回每行之和。void exch(int x4, int);/转置函数void main() int a4=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16; int i, j, sum; sum=0; for(i=0; i<4; i+)for(j=0; j<4; j+) cout<<setw(3)<

15、<aij;cout<<setw(7)<<lsum(ai, 4, sum);cout<<endl; cout<<"total: "<<sum<<endl<<endl; exch(a,4); sum=0;/这句必须吗? for(i=0; i<4; i+)for(j=0; j<4; j+) cout<<setw(3)<<aij;cout<<setw(7)<<lsum(ai, 4, sum);cout<<endl; cou

16、t<<"total: "<<sum<<endl;int lsum(int x, int n, int &sum) int i, t=0; static s;/静态变量记录总和 if(!sum) s=0;/等价于sum=0,去掉这句行吗? for(i=0; i<n; i+)t+=xi; s+=xi; sum=s;/ 总和由引用sum返回 return t;void exch(int x4, int n) int i,j,t; for(i=0; i<n; i+)for(j=i; j<n; j+) if(i=j) co

17、ntinue;else t=xij; xij=xji; xji=t;5. 编写求组合的程序,在主函数中输入任意两个正整数n,m求其组合。要求:使用递归函数求阶乘。#include<iostream.h>long fact(int x);void main() int c, m, n, t; cin>>m>>n; if(m<n) t=m; m=n; n=t; c=fact(m)/fact(n)/fact(m-n); cout<<"Comb("<<m<<","<<n&l

18、t;<")="<<c<<endl;long fact(int x) long f; if(x=0) f=1; else f=x*fact(x-1); return f;6. 定义一个整型数组a=11,27,19,23,15,27,19,11,13,13,13,17,并且定义一个函数,int del(int x,int &m),该函数的功能为删除数组中所有重复的元素,并返回所删除元素的个数。要求:输出原数组,和删除后的数组,分别用一行四位宽度输出,并输出所删除元素的个数c。#include<iostream.h>#includ

19、e<iomanip.h>int del(int x, int &m);void main() int a=11,27,19,23,15,27,19,11,13,13,13,17; int i,n=12,c=0; for(i=0; i<n; i+) cout<<setw(4)<<ai; cout<<endl; c=del(a,n); cout<<c<<" elements deleted.nn" for(i=0; i<n; i+) cout<<setw(4)<<

20、ai; cout<<endl;int del(int x, int &m)/删除相同元素函数,返回删除个数,由于有元素的删除,所以数组长度 m 要相应改变,并回传 int i, j, k, c=0;/算法:用xi与后面的元素逐个比较xj,有相同元素,则由 j 开始将后面的元素逐个前移(删除xj) for(i=0; i<m-1; i+) for(j=i+1; j<m; j+) if(xi=xj) cout<<xj<<endl;/显示删除的元素 for(k=j; k<m; k+) xk=xk+1;/数组长m度减1,比较指针j减1(因为循

21、环语句中j+)使之指在原处,计数器c加1 m-; j-; c+; return c;7. 在一个有序整型数组2,4,6,8,10,12,14,16,18中,输入一个数k,如果是奇数,则插入,插入后数组仍保持有序。编写二分查找函数int bisearch(int a, int n, int b)返回一个任意输入整数a的下标。要求输出原数组,插入后的数组,分别用一行四位宽度输出。并输出所查找数的下标,若没找到则输出“该数不存在”。#include<iostream.h>#include<iomanip.h>int bisearch(int a, int n, int b);

22、void main() int x20=2,4,6,8,10,12,14,16,18;/因为要插入数据,数组定义要比实际数据大 int n=9, i, j, k, a; for(i=0; i<n; i+) cout<<setw(4)<<xi; cout<<endl; do cout<<"请输入一个数: " cin>>k; while(k%2=0); i=n; while(k<xi-1 && i>0)/插入方法:k 从最后一个数开始比较,小则把数组元素后移 xi=xi-1; i-;/

23、i为插入指针(下标) xi=k; n+;/插入,不要忘记数组长度增加! for(i=0; i<n; i+) cout<<setw(4)<<xi; cout<<endl; cout<<"输入待查找的整数:" cin>>a; if(j=bisearch(x, n, a)>=0) cout<<"该数下标为: "<<j<<endl; else cout<<"该数不存在!"<<endl;int bisearch(i

24、nt a, int n, int b)/二分查找函数:要求待查序列必须是排序好的! int l=0, h=n-1, m; while(l<=h)/循环条件:低边界小于等于高边界 m=(l+h)/2;/二分 if(am=b) break; else if(b<am) h=m-1;/待查数据在低区,左移高边界 else l=m+1;/待查数据在高区,右移低边界 if(l>h) return -1;/没找到,返回-1(不存在的下标) else return m;/找到,返回该数下标8. 在主函数中定义一个字符串“We are learning C+ language. C+ is

25、useful.”并显示。输入一个字符串(如“Fortran 95”)替换句中的“C+”。定义函数 void exch(char*)将其倒序。输出替换及倒序后的字符串。要求:使用指针操作完成倒序运算。/字符串的操作练习,并熟悉常用字符串函数的用法#include<iostream.h>#include<string.h>void exch( char *);void main() char s080="We are learning C+ language. C+ is useful." char st80, s120, *sp; int n, i;

26、cout<<s0<<endl; cout<<"输入一个字符串: " cin.getline(s1,20);/输入字符串的方式(可含空格) n=strlen(s1);/测定输入字符串的长度(字符数) for(i=0,sp=s0; *sp; i+,sp+)/工作指针sp指向初始字符串 s0 逐个字符查找 "C+"(子字符串) if(strncmp(sp, "C+", 3)=0)/找到,(sp所指字串前3个字符为"C+") strcpy(st,sp+3);/把"C+"

27、;后面的内容复制到数组 st (保护起来) strcpy(sp,s1);/用输入的字符串 s1 替换 "C+" 及其以后的内容,sp也可写为s0+i sp+=n-1; i+=n-1; /把指针以及下标值置于替换后字符串尾部 strcat(sp,st);/把保存在 st 中原字符串的其余部分再复制回来,完成一次替换。继续如上过程替换后面的"C+" cout<<s0<<endl; exch(s0); cout<<s0<<endl;void exch(char* str)/倒序函数 char *p, *q, c;

28、 p=str; q=p+strlen(str)-1;/工作指针 p 指向字符串 str 首字符,q 指向尾字符 while(p<q) c=*p; *p=*q; *q=c; p+; q-; 9. 定义一个字符串常量,并判断该字符串是否为“回文”。要求:定义一个顺序栈char st,编写入栈、出栈函数(void push(char *st,char c, int &top),char pop(char *st, int &top),利用栈结构的性质完成该判断。/堆栈:一种数据结构,规定只能在一端进行插入和删除数据(类似子弹夹),最后入栈的元素最先出栈#include<i

29、ostream.h>void push(char *st, char c, int &top);char pop(char *st, int &top);void main() char *p="madam", *q=p, s20; int t=-1;/设置空栈指针(数组下标) while(*q)/把指针 q 所指字符逐个压入堆栈 s 中 push(s, *q, t); q+; q=p;/重要!重置指针 q cout<<q; while(t>=0 && *q=pop(s,t) q+;/正向 *q,逆向 pop(s,t) 逐个字符比较字符串,若完全相同(至 t<0 )则为回文 if(t<0) cout<<" 是回文!n" else cout<<" 不是回文!n"void push(char *st, char c, int &top)/入栈函数 top+;/栈顶指针(栈顶元素的下标)上移 sttop=c;/将字符 c 压入栈中(入栈一个元素)char pop(char *st, int &top)/出栈函数,返回栈顶元素 char c=stt

温馨提示

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

评论

0/150

提交评论