C++上机题目及答案1Word文档格式.docx
《C++上机题目及答案1Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++上机题目及答案1Word文档格式.docx(44页珍藏版)》请在冰豆网上搜索。
\n3-结束\n"
\n请选择:
"
;
cin>
>
n;
if(n==1)dele(a);
elseif(n==2)add(a);
elsecout<
谢谢使用本系统!
\n"
}while(n!
=3);
}
voidadd(studenta[10]){
studentstu;
inti=0,n=count;
cout<
请输入需增加的学生信息(姓名,成绩):
cin>
stu.name>
stu.math;
while(stu.math<
a[i].math&
&
i<
n)i++;
//找插入的位置
for(;
n>
i;
n--)a[n]=a[n-1];
//腾位置
a[i]=stu;
//插入
count++;
print(a);
voiddele(studenta[10]){
请输入需删除学生的姓名:
name;
while(strcmp(name,a[i].name)!
=0&
//找人
if(i>
=n)cout<
查无此人!
else{
for(;
i<
n-1;
i++)a[i]=a[i+1];
//删除
count--;
print(a);
}
voidprint(studenta[]){
\n最新学生信息:
\n"
for(inti=0;
count;
i++)
a[i].name<
'
\t'
a[i].math<
\n'
2.定义描述三维坐标点(x,y,z)的结构体类型变量,完成坐标点的输入和输出,并求两坐标点之间的距离。
编写函数求两坐标点之间的距离。
math.h>
structpoint{
doublex,y,z;
doubledistance(pointa,pointb);
pointa,b;
请分别输入两个点的坐标(x,y,z):
a.x>
a.y>
a.z;
b.x>
b.y>
b.z;
a点的坐标:
a.x<
'
a.y<
a.z<
b点的坐标:
b.x<
b.y<
b.z<
a,b两点的距离是:
distance(a,b)<
endl;
doubledistance(pointa,pointb){
doubled;
d=sqrt((a.x-b.x)*(a.x-b.x)
+(a.y-b.y)*(a.y-b.y)
+(a.z-b.z)*(a.z-b.z));
returnd;
3.某市青年歌手大赛聘请7名评委打分,下列程序协助进行评分统计。
函数delmaxmin的功能是对一个选手的得分做以下计算:
去掉一个最高分,去掉一个最低分,然后对剩余得分求平均分并保存。
函数sort完成对n名选手的得分按平均分从高到低排序。
【测试数据与运行结果】
测试数据:
程序中给定的初始化测试数据
运行结果:
li:
94979896100999797.40
zhang:
96979898100979697.20
zhou:
95100999697969797.00
以下语句描述了包含数学成绩的学生信息结构体及其数组a:
struct{charplayer_name[20];
doublescore[7],aver;
}PERSON[3];
structP{
}PERSON[3];
doubledelmaxmin(doublea[7]){
doubleaver=0,sum=0,max,min;
max=min=a[0];
7;
i++){
if(a[i]>
max)max=a[i];
if(a[i]<
min)min=a[i];
aver+=a[i];
aver-=max+min;
returnaver/5;
voidsort(Pp[3]){
inti,j;
Pa;
for(i=0;
3;
for(j=i+1;
j<
j++)//原程序:
for(j=0;
j++)
if(p[i].aver<
p[j].aver)///原程序:
if(p[i].aver<
p[i+1].aver)
a=p[i],p[i]=p[j],p[j]=a;
请输入比赛选手的比赛数据:
PERSON[i].name;
for(j=0;
cin>
PERSON[i].score[j];
PERSON[i].aver=delmaxmin(PERSON[i].score);
sort(PERSON);
比赛成绩如下"
PERSON[i].name<
cout<
PERSON[i].score[j]<
PERSON[i].aver<
第二周上机题
1.查找并输出同时出现在两个一维数组中的整数,每个一维数组中的元素均按升序排列,并且每个数组中的元素没有重复值。
函数intcoincidence_count(int*a,int*b;
int*c)按上述要求在a数组和b数组上查找,将找到的数据保存到c所指向的的数组中。
a数组中的数据:
1,2,4,8,10,12,13,14,16,18
b数组中的数据:
3,4,7,8,9,10,12,13,16,19
intcoincidence_count(int*a,int*b,int*c);
voidprint(int*d,intn);
inta[]={1,2,4,8,10,12,13,14,16,18};
intb[]={3,4,7,8,9,10,12,13,16,19},c[10];
intk=coincidence_count(a,b,c);
原始数据:
\n数组a:
print(a,10);
\n数组b:
print(b,10);
\n结果显示:
\n数组c:
print(c,k);
intcoincidence_count(int*a,int*b,int*c){
int*pa=a,*pb=b,*pc=c;
while(pa<
a+10&
pb<
b+10){
if(*pa<
*pb)pa++;
elseif(*pb<
*pa)pb++;
else*pc++=*pa++;
return(pc-c);
voidprint(int*d,intn){
int*pd=d;
while(pd<
d+n){
*pd++<
2.从键盘任意输入10个整数,用函数void(int*pa,int*pb)编程实现找出最大值和最小值,并通过指针pa,pb返回它们所在数组中的位置。
主函数并通过屏幕输出结果(最大值,最大值在数组中的位置,最小值,最小值在数组中的位置,)。
voidmax_min(int*a,int*pa,int*pb);
inta[10],max,min;
max=min=0;
int*pa=a;
a+10)cin>
*pa++;
max_min(a,&
max,&
min);
max="
a[max]
<
在数组中位置是:
max<
min="
a[min]
min<
voidmax_min(int*a,int*pa,int*pb){
intmax,min;
max=min=*(a+0);
10;
i++,a++){
if(*a>
max){max=*a,*pa=i;
elseif(*a<
min){min=*a,*pb=i;
附加题:
3.25个人围成一个圈,从第1个人开始顺序报号(1,2,3……),凡报号为3和3的倍数者退出圈子,找出最后留在圈子中的人原来的序号。
函数voidseek(int*a,intn,int*pn)按上述要求在a数组,找出最后留在圈子中的人原来的序号并返回。
主函数是:
voidmain(){
intn=3;
intnum;
inta[25],*p=a;
for(inti=0;
25;
i++)p[i]=i+1;
seek(a,n,&
num);
cout<
”最后留在圈子中的人原来的序号是:
”<
num<
*/
#defineNUM10
iomanip.h>
voidseek(int*a,intn,int*pn);
inta[NUM],*p=a;
NUM;
for(i=0;
i++)cout<
setw(3)<
a[i];
\n最后留在圈子中的人序号是:
num+1<
voidseek(int*a,intn,int*pn){
intnum=NUM;
intk=1;
inti;
\n游戏中.......\n"
while(num>
1){
for(i=0;
if(a[i]==0)continue;
if(k++%3==0){
a[i]=0;
num--;
}
else*pn=i;
}
if(a[i]!
=0)cout<
第三周上机题目
题目:
1.从一个整型数组中删除所有小于数组元素平均值并且不是素数的那些整数。
【编程要求】
1)编写函数intdel(intr[],intn),计算r数组中前n个整数的平均值,删除数组中所有小于该平均值并且不是素数的那些数,函数返回r数组中剩余整数的个数。
2)编写main函数,声明数组resource并用测试数据初始化,调用del函数处理数组resource中的数据,将resource数组中剩余的整数输出到屏幕。
数组初始数据为:
175618828
1751828
intdel(intr[],intn);
intsh(intn);
intresource[]={17,5,6,18,8,28},n;
6;
resource[i]<
n=del(resource,6);
\n运行结果:
intdel(intr[],intn){
int*p1=r,*p2=r,i=0;
floatavr=0;
while(p1<
r+n)avr+=*p1++;
avr/=6;
p1=r;
r+n){
if(*p1<
avr&
sh(*p1)==0){
p1++;
continue;
*p2++=*p1++;
return(p2-r);
intsh(intn){
intj;
j=sqrt(n);
for(inti=2;
=j;
if(n%i==0)break;
if(i<
(j+1))return0;
return1;
2.编程要求
1)编写函数intfind(char*a,char*b),函数被调用时,a指向的数组中已存储一个字符串,该字符串是一个包含了多个单词的英语句子。
函数的功能找出字符数组a中字符串中最长的单词并存入b所指向的数组中,函数返回最长单词在字符串的起迭位置下标。
2)编写main函数,接受键盘输入的一个英文句子。
调用find函数找到该句子中最长的单词,将最长单词及其在字符串中的起始位置下标输出到屏幕。
intfind(char*a,char*b);
chara[80],b[80];
intn;
请输入的一个英文句子:
cin.getline(a,80);
b<
\n起始下标是:
find(a,b)<
intfind(char*a,char*b){
char*p1,*p2,*p3;
p1=p2=p3=a;
intmax=0;
while(*p1!
=0){
while(*p1=='
'
)p1++,p2++;
while(*p1!
='
&
*p1!
=0)p1++;
if(p1-p2>
max){
max=p1-p2;
p3=p2;
p2=p1;
strncpy(b,p3,max);
*(b+max)='
\0'
return(p3-a);
附加题
3.重新排列一维数组元素的顺序,使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。
数组原始数据为:
17151014161719181312
输出结果:
18161412101315171719
1)编写函数voidresort(int*x,intn),使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。
(可根据编程需要增加函数)
2)编写main函数,接受键盘输入数据,调用resort函数完成上述功能,并输出结果。
voidresort(int*x,intn);
voidsort(int*a,intn);
inta[10]={0};
请输入十个数据:
i++)cin>
i++)cout<
setw(4)<
resort(a,10);
\n输出结果:
voidresort(int*x,intn){
inta[10],*i,*j,*pa=a,*px=x;
while(px<
x+10)*pa++=*px++;
sort(a,10);
i=x,j=x+9;
for(pa=a;
pa<
a+10;
){
if(*pa%2==0)*i++=*pa++;
else*j--=*pa++;
voidsort(int*a,intn){
int*i,*j,temp;
for(i=a;
a+n-1;
a+n;
if(*i<
*j)
temp=*i,*i=*j,*j=temp;
4.【程序功能】
生成一个n阶螺旋方阵,将其存放到一个二维数组中并输出。
当n为5时,输出如下螺旋方阵:
1)编写函数voidrot(intmat[N][N],intn)生成一个n阶螺旋方阵,并存放到一个二维数组mat中;
2)编写主函数,由主函数调用rot函数完成上述功能,并按行输出结果。
#defineN7
voidrot(intmat[N][N],intn);
inta[N][N]={0},k=1;
rot(a,N);
int*p=a[0];
intn=1;
p<
=&
a[N-1][N-1];
p++){
setw(6)<
*p;
if(k++%N==0)cout<
voidrot(intmat[N][N],intn){
inti,j,num=1,x=-N,y=-1,z;
int*p1=mat[0];
while(n>
0){
for(i=1;
=4&
n>
0;
if(i%2==1){x=-x;
z=x;
}//(上下移动)向下-指针每次移动N位向上-指针每次移动-N位向左指针每次移动-1位
else{n--;
y=-y;
z=y;
}//(左右移动)向右-指针每次移动+1位,向左-指针每次移动-1位
for(j=0;
j++,p1+=z)
*p1=num++;
p1-=z;
if(i%2==1){p1-=y;
}//调整起点位置
else{p1-=x;
第五周上机题目
1.编写一个求积分的函数,该函数的原型如下:
floatIntegral(inta,intb,float(*fun)(float));
该函数返回值为积分结果,形参a,b分别为积分上下限,fun是被积函数。
1)积分算法:
将积分区域划分为若干个小区间,求出所有小区间中被积函数下的面积之和即为函数在积分区域内的积分值;
小区间面积可用梯形近似;
2)用积分函数分别求解y=x2和y=2x+1两个函数在[0,1]区域内的积分值。
floatf1(floatx){
returnx*x;
floatf2(floatx){
return(2*x+1);
floatIntegral(inta,intb,float(*fun)(float));
第一个积分值:
Integral(0,1,f1)<
第二个积分值:
Integral(0,1,f2)<
floatIntegral(inta,intb,float(*fun)(float)){
floath,y;
y=(fun(a)+fun(b))/2;
h=(b-a)/1000.0;
for(i=1;
1000;
i++)y+=fun(h*i);
return(y*h);
2.编程题(20分)
1)编写函数intfun(long*x),找出所有满足以下特性的六位整数:
它是一个完全平方数(完全平方数是指该数是某个整数的平方);
该数同时也是回文数(回文数是指该数等于它的反序数)。
例如,是836的平方并且是回文数,因此是满足所给条件的六位整数。
将所有满足上述条件的六位整数存入x指向的数组中,函数返回x指向的数组中整数的个数。
2)编写main函数,声明result数组,调用fun函数将所有满足条件的六位整数存入result数组中,将result数组中的数据