天津大学C++上机考试复习题.docx

上传人:b****6 文档编号:5664349 上传时间:2022-12-30 格式:DOCX 页数:14 大小:31.22KB
下载 相关 举报
天津大学C++上机考试复习题.docx_第1页
第1页 / 共14页
天津大学C++上机考试复习题.docx_第2页
第2页 / 共14页
天津大学C++上机考试复习题.docx_第3页
第3页 / 共14页
天津大学C++上机考试复习题.docx_第4页
第4页 / 共14页
天津大学C++上机考试复习题.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

天津大学C++上机考试复习题.docx

《天津大学C++上机考试复习题.docx》由会员分享,可在线阅读,更多相关《天津大学C++上机考试复习题.docx(14页珍藏版)》请在冰豆网上搜索。

天津大学C++上机考试复习题.docx

天津大学C++上机考试复习题

上机考试复习题12

1.定义一个二维数组a并用下列数据初始化。

编写一个直接插入排序函数voidinsert(intx[],intn)对每一行元素排序。

并对每行元素最大值进行排序。

要求:

在main函数中输出原数组、排序后的数组、及排序后的最大值。

(提示:

把每行最大值存到一个一维数组max中)

 

//利用同一个函数对二维数组的每行及最大值数组进行排序

#include

voidinsert(intx[],intn);//形参为一维数组,因只处理一维数组,故只需传递列数(每行元素的个数)

voidmain(){

inta[4][6]={{12,34,38,20,82,17},{30,18,25,13,56,21},{45,39,15,24,19,32},{11,76,40,41,64,43}};

inti,j,max[4];

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

for(i=0;i<4;i++){//调用排序函数,每次调用传递一行,实参a[i]是行元素,第i行的名字(地址),

insert(a[i],6);//这种方法简单、明确,但因循环调用效率不高。

max[i]=a[i][5];//为数组max赋值

}

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

insert(max,4);

for(i=0;i<4;i++)cout<

cout<

}

voidinsert(intx[],intn){//一维数组的直接插入排序函数

inti,j,k;

for(i=1;i

k=x[i];j=i;//把待排序元素存入中间变量,设置插入指针j

while(k0){

x[j]=x[j-1];//后移

j--;

}

x[j]=k;//插入

}

}

2.定义一个二维数组a并用下列数据初始化。

输入一个数,在数组中进行顺序查找,找到时输出该数的下标,否则输出“没有找到”(用查找函数intseqsearch(inta[][6],intx,int&m,int&n)完成)。

编写一个直接选择排序函数voidselect(intx[],intm,intn)对每一行元素排序,输出排序后的数组。

 

//两种传递二维数组的方式

#include

intseqsearch(inta[][6],intx,int&m,int&n);//顺序查找函数,二维数组作形参,6不可省略!

voidselect(intx[],intm,intn);//直接选择排序。

一维数组作形参,因需处理二维数组,故要传递行列数mn

voidmain(){

inta[4][6]={{12,34,38,20,82,17},

{30,18,25,13,56,21},

{45,39,15,24,19,32},

{11,76,40,41,64,43},

};

inti,j,x,m,n;

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

cout<<"输入需查找的数:

";cin>>x;

if(seqsearch(a,x,m,n))cout<<"(i,j)="<

形参是二维数组,须用数组名a作实参

elsecout<<"没有找到\n\n";

select(a[0],4,6);//调用排序函数,降阶处理:

采用一维形式处理二维数组。

(因此须用一维数组名a[0]作实参)

//由于一次性传递整个数组,故效率高,是处理二维数组更为普遍的方式。

要求对数组有较深入的了解。

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

}

voidselect(intx[],intm,intn){

inth,i,j,k,t;

for(h=0;h

for(i=0;i

k=i;//设置交换指针k

for(j=i+1;j

if(x[j]

t=x[i];x[i]=x[k];x[k]=t;//与待排序元素x[i]交换

}

x+=n;//降阶处理的要点:

由于数组名x是指针(变量),使它指向下一行。

}

}

intseqsearch(inta[][6],intx,int&m,int&n){//顺序查找函数(挨个比较),找到返回1,否则返回0,下标由引用返回

inti,j,ok=0;

for(i=0;i<4&&!

ok;i++)//双重循环条件:

找到一个即停止循环,否则一直找到底

for(j=0;j<6;j++)

if(a[i][j]==x){

ok=1;m=i;n=j;break;//找到!

置ok为1,并记录下标。

注意:

函数中的mn是主函数中mn的引用(在不同函数中可以同名)

}

returnok;//如没找到,ok保持为0

}

3.定义一个二维数组a并用下列数据初始化。

编写冒泡排序函数voidbubble(intx[],intn,float&av)对每一行元素排序,并计算每行元素的平均值。

要求:

在main函数中输出原数组、按行输出排序后的数组及平均值。

(提示:

把平均值存到一个一维数组aver中)

 

#include

voidbubble(intx[],intn,float&av);

voidmain(){

inta[4][6]={{12,34,38,20,82,17},{30,18,25,13,56,21},{45,39,15,24,19,32},{11,76,40,41,64,43}};

inti,j;floataver[4]={0};

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

for(i=0;i<4;i++)bubble(a[i],6,aver[i]);//注意3个实参:

a[i],6是数组名和长度,传递二维数组的一行,

//aver[i]是数组元素(相当于简单变量),地址传给引用形参av

for(i=0;i<4;i++){

for(j=0;j<6;j++)cout<

cout<

}

cout<

}

voidbubble(intx[],intn,float&av){//一维数组冒泡排序函数

inti=0,j,k=1,t;

while(k){//冒泡算法

k=0;//设置逆序标志k(同时也是循环条件,1为有逆序,0为无逆序)

for(j=0;j

if(x[j]>x[j+1]){//出现逆序

k=1;t=x[j];x[j]=x[j+1];x[j+1]=t;//重置k,交换逆序数对

}

i++;

}

for(i=0;i

av=av/n;

}

4.定义一个二维数组inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}。

定义函数intlsum(intx[],intn,int&sum)返回每行元素之和并求所有元素之和,要求该函数中使用静态局部变量s存储二维数组总和。

按行输出数组及每行之和,最后输出总和。

定义数组voidexch(intx[][4],intn)其功能是转置该数组并作如上操作。

#include

#include

intlsum(intx[],int,int&);//求和函数,返回每行之和。

voidexch(intx[][4],int);//转置函数

voidmain(){

inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

inti,j,sum;

sum=0;

for(i=0;i<4;i++){

for(j=0;j<4;j++)cout<

cout<

cout<

}

cout<<"total:

"<

exch(a,4);

sum=0;//这句必须吗?

for(i=0;i<4;i++){

for(j=0;j<4;j++)cout<

cout<

cout<

}

cout<<"total:

"<

}

intlsum(intx[],intn,int&sum){

inti,t=0;statics;//静态变量记录总和

if(!

sum)s=0;//等价于sum==0,去掉这句行吗?

for(i=0;i

t+=x[i];s+=x[i];

}

sum=s;//总和由引用sum返回

returnt;

}

voidexch(intx[][4],intn){

inti,j,t;

for(i=0;i

for(j=i;j

else{

t=x[i][j];x[i][j]=x[j][i];x[j][i]=t;

}

}

5.编写求组合的程序,在主函数中输入任意两个正整数n,m求其组合。

要求:

使用递归函数求阶乘。

#include

longfact(intx);

voidmain(){

intc,m,n,t;

cin>>m>>n;

if(m

t=m;m=n;n=t;

}

c=fact(m)/fact(n)/fact(m-n);

cout<<"Comb("<

}

longfact(intx){

longf;

if(x==0)f=1;

elsef=x*fact(x-1);

returnf;

}

6.定义一个整型数组a[]={11,27,19,23,15,27,19,11,13,13,13,17},并且定义一个函数,intdel(intx[],int&m),该函数的功能为删除数组中所有重复的元素,并返回所删除元素的个数。

要求:

输出原数组,和删除后的数组,分别用一行四位宽度输出,并输出所删除元素的个数c。

#include

#include

intdel(intx[],int&m);

voidmain(){

inta[]={11,27,19,23,15,27,19,11,13,13,13,17};

inti,n=12,c=0;

for(i=0;i

cout<

c=del(a,n);

cout<

for(i=0;i

cout<

}

intdel(intx[],int&m){//删除相同元素函数,返回删除个数,由于有元素的删除,所以数组长度m要相应改变,并回传

inti,j,k,c=0;//算法:

用x[i]与后面的元素逐个比较x[j],有相同元素,则由j开始将后面的元素逐个前移(删除x[j])

for(i=0;i

for(j=i+1;j

if(x[i]==x[j]){

cout<

for(k=j;k

m--;j--;c++;

}

returnc;

}

7.在一个有序整型数组{2,4,6,8,10,12,14,16,18}中,输入一个数k,如果是奇数,则插入,插入后数组仍保持有序。

编写二分查找函数intbisearch(inta[],intn,intb)返回一个任意输入整数a的下标。

要求输出原数组,插入后的数组,分别用一行四位宽度输出。

并输出所查找数的下标,若没找到则输出“该数不存在”。

#include

#include

intbisearch(inta[],intn,intb);

voidmain(){

intx[20]={2,4,6,8,10,12,14,16,18};//因为要插入数据,数组定义要比实际数据大

intn=9,i,j,k,a;

for(i=0;i

cout<

do{

cout<<"请输入一个数:

";

cin>>k;

}while(k%2==0);

i=n;

while(k0){//插入方法:

k从最后一个数开始比较,小则把数组元素后移

x[i]=x[i-1];

i--;//i为插入指针(下标)

}

x[i]=k;n++;//插入,不要忘记数组长度增加!

for(i=0;i

cout<

cout<<"输入待查找的整数:

";cin>>a;

if((j=bisearch(x,n,a))>=0)cout<<"该数下标为:

"<

elsecout<<"该数不存在!

"<

}

intbisearch(inta[],intn,intb){//二分查找函数:

要求待查序列必须是排序好的!

intl=0,h=n-1,m;

while(l<=h){//循环条件:

低边界小于等于高边界

m=(l+h)/2;//二分

if(a[m]==b)break;

elseif(b

elsel=m+1;//待查数据在高区,右移低边界

}

if(l>h)return-1;//没找到,返回-1(不存在的下标)

elsereturnm;//找到,返回该数下标

}

8.在主函数中定义一个字符串“WearelearningC++language.C++isuseful.”并显示。

输入一个字符串(如“Fortran95”)替换句中的“C++”。

定义函数voidexch(char*)将其倒序。

输出替换及倒序后的字符串。

要求:

使用指针操作完成倒序运算。

//字符串的操作练习,并熟悉常用字符串函数的用法

#include

#include

voidexch(char*);

voidmain(){

chars0[80]="WearelearningC++language.C++isuseful.";

charst[80],s1[20],*sp;

intn,i;

cout<

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++"后面的内容复制到数组st(保护起来)

strcpy(sp,s1);//用输入的字符串s1替换"C++"及其以后的内容,sp也可写为s0+i

sp+=n-1;i+=n-1;//把指针以及下标值置于替换后字符串尾部

strcat(sp,st);//把保存在st中原字符串的其余部分再复制回来,完成一次替换。

继续如上过程替换后面的"C++"

}

cout<

exch(s0);

cout<

}

voidexch(char*str){//倒序函数

char*p,*q,c;

p=str;q=p+strlen(str)-1;//工作指针p指向字符串str首字符,q指向尾字符

while(p

c=*p;*p=*q;*q=c;

p++;q--;

}

}

9.定义一个字符串常量,并判断该字符串是否为“回文”。

要求:

定义一个顺序栈charst[],编写入栈、出栈函数(voidpush(char*st,charc,int&top),charpop(char*st,int&top),利用栈结构的性质完成该判断。

//堆栈:

一种数据结构,规定只能在一端进行插入和删除数据(类似子弹夹),最后入栈的元素最先出栈

#include

voidpush(char*st,charc,int&top);

charpop(char*st,int&top);

voidmain(){

char*p="madam",*q=p,s[20];

intt=-1;//设置空栈指针(数组下标)

while(*q){//把指针q所指字符逐个压入堆栈s中

push(s,*q,t);

q++;

}

q=p;//重要!

重置指针q

cout<

while(t>=0&&*q==pop(s,t))q++;//正向*q,逆向pop(s,t)逐个字符比较字符串,若完全相同(至t<0)则为回文

if(t<0)cout<<"是回文!

\n";

elsecout<<"不是回文!

\n";

}

voidpush(char*st,charc,int&top){//入栈函数

top++;//栈顶指针(栈顶元素的下标)上移

st[top]=c;//将字符c压入栈中(入栈一个元素)

}

charpop(char*st,int&top){//出栈函数,返回栈顶元素

charc=st[top];//栈顶元素初始化c

top--;//栈顶指针下移,(出栈一个元素)

returnc;

}

10.输出1900–2100的所有闰年,要求每年7位宽度(每行10年)。

输入一个日期:

年(1900–2100)、月、日,求该日期为本年的第几天。

要求:

编写返回每月天数的函数,并对输入的年、月、日进行合理性检测。

#include

#include

intmd(int,int);

inlineintly(intyear){return(year%400==0||year%4==0&&year%100!

=0);}

voidmain(){

inty,m,d,yd,i,k=1;

for(i=1900;i<=2100;i++)

if(ly(i)){

cout<

if(k++%10==0)cout<

}

cout<

do{

cout<<"\n请输入年、月、日(yyyymmdd):

";

cin>>y>>m>>d;

}while(!

(y>=1900&&y<=2100&&m>0&&m<13&&d>0&&d<=md(y,m)));//输入合法性检测

yd=d;//当月的天数

for(i=1;i

cout<<"是"<

}

intmd(intyear,intmonth){//返回任意一个月份的天数

intn;

switch(month){

case4:

case6:

case9:

case11:

n=30;break;

case2:

if(ly(year))n=29;

elsen=28;

break;

default:

n=31;

}

returnn;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1