《C++上机题目及答案1演示教学.doc》由会员分享,可在线阅读,更多相关《C++上机题目及答案1演示教学.doc(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。C+上机题目及答案1-第一周上机题1. 以下语句描述了包含数学成绩的学生信息结构体及其数组a:structstudentcharname20;floatmath;studenta10=张三,90,李四,85,王五,73;intcount=3;/数组中包含的学生数编写两个函数分别实现在a数组中添加和删除学生信息。要求:1)原数组已按数学成绩排序(降序),添加和删除学生信息后数组应仍为降序;2)以下数据用于添加:赵二,96,钱六,65,孙七,803)注意:添加,删除后count数据要相应变化。#includ
2、e#includestructstudentcharname20;floatmath;intcount=3;voidadd(studenta10);voiddele(studenta10);voidprint(studenta);voidmain()studenta10=张三,90,李四,85,王五,73;intn=0;docout.学生信息处理系统.n1-删除n2-增加n3-结束nn;if(n=1)dele(a);elseif(n=2)add(a);elsecout谢谢使用本系统!n;while(n!=3);voidadd(studenta10)studentstu;inti=0,n=cou
3、nt;coutstu.namestu.math;while(stu.mathai.mathⅈn-)an=an-1;/腾位置ai=stu;/插入count+;print(a);voiddele(studenta10)charname20;inti=0,n=count;print(a);coutname;while(strcmp(name,ai.name)!=0&i=n)cout查无此人!n;elsefor(;in-1;i+)ai=ai+1;/删除count-;print(a);voidprint(studenta)coutn最新学生信息:n;for(inti=0;icount;i+)cou
4、tai.nametai.mathn;2. 定义描述三维坐标点(x,y,z)的结构体类型变量,完成坐标点的输入和输出,并求两坐标点之间的距离。要求:编写函数求两坐标点之间的距离。#include#includestructpointdoublex,y,z;doubledistance(pointa,pointb);voidmain()pointa,b;couta.xa.ya.z;cinb.xb.yb.z;couta点的坐标:a.x,a.y,a.zn;coutb点的坐标:b.x,b.y,b.zn;couta,b两点的距离是:distance(a,b)endl;doubledistance(poin
5、ta,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.40zhang:96979898100979697.20zhou:
6、95100999697969797.00以下语句描述了包含数学成绩的学生信息结构体及其数组a:structcharplayer_name20;doublescore7,aver;PERSON3;#includestructPcharname20;doublescore7,aver;PERSON3;doubledelmaxmin(doublea7)doubleaver=0,sum=0,max,min;max=min=a0;for(inti=0;imax)max=ai;if(aimin)min=ai;aver+=ai;aver-=max+min;returnaver/5;voidsort(Pp3)
7、inti,j;Pa;for(i=0;i3;i+)for(j=i+1;j3;j+)/原程序:for(j=0;j3;j+)if(pi.averpj.aver)/原程序:if(pi.averpi+1.aver)a=pi,pi=pj,pj=a;voidmain()inti,j;cout请输入比赛选手的比赛数据:endl;for(i=0;iPERSONi.name;for(j=0;jPERSONi.scorej;for(i=0;i3;i+)PERSONi.aver=delmaxmin(PERSONi.score);sort(PERSON);cout比赛成绩如下endl;for(i=0;i3;i+)cou
8、tPERSONi.namet;for(j=0;j7;j+)coutPERSONi.scorejt;coutPERSONi.averendl;25个人围成一个圈,从第1个人开始顺序报号(1,2,3),凡报号为3和3的倍数者退出圈子,找出最后留在圈子中的人原来的序号。要求:函数voidseek(int*a,intn,int*pn)按上述要求在a数组,找出最后留在圈子中的人原来的序号并返回。主函数是:voidmain()intn=3;intnum;inta25,*p=a;for(inti=0;i25;i+)pi=i+1;seek(a,n,&num);cout”最后留在圈子中的人原来的序号是:”num
9、endl;*/#include#defineNUM10#includevoidseek(int*a,intn,int*pn);voidmain()intn=3;intnum;intaNUM,*p=a;for(inti=0;iNUM;i+)pi=i+1;for(i=0;iNUM;i+)coutsetw(3)ai;seek(a,n,&num);coutn最后留在圈子中的人序号是:num+1endl;voidseek(int*a,intn,int*pn)intnum=NUM;intk=1;inti;cout1)for(i=0;iNUM;i+)if(ai=0)continue;if(k+%3=0)ai
10、=0;num-;else*pn=i;for(i=0;iNUM;i+)if(ai!=0)coutsetw(3)ai;coutendl;1 编程要求1) 编写函数intfind(char*a,char*b),函数被调用时,a指向的数组中已存储一个字符串,该字符串是一个包含了多个单词的英语句子。函数的功能找出字符数组a中字符串中最长的单词并存入b所指向的数组中,函数返回最长单词在字符串的起迭位置下标。2) 编写main函数,接受键盘输入的一个英文句子。调用find函数找到该句子中最长的单词,将最长单词及其在字符串中的起始位置下标输出到屏幕。#include#includeintfind(char*a
11、,char*b);voidmain()chara80,b80;intn;cout请输入的一个英文句子:;cin.getline(a,80);coutbn起始下标是:find(a,b)max)max=p1-p2;p3=p2;p2=p1;strncpy(b,p3,max);*(b+max)=0;return(p3-a);附加题2 重新排列一维数组元素的顺序,使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。【测试数据与运行结果】数组原始数据为:17151014161719181312输出结果:18161412101315171719要求:1) 编写函数
12、voidresort(int*x,intn),使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。(可根据编程需要增加函数)2) 编写main函数,接受键盘输入数据,调用resort函数完成上述功能,并输出结果。#include#includevoidresort(int*x,intn);voidsort(int*a,intn);voidmain()inta10=0;cout请输入十个数据:;for(inti=0;iai;cout数组原始数据为:;for(i=0;i10;i+)coutsetw(4)ai;resort(a,10);coutn输出结果:
13、;for(i=0;i10;i+)coutsetw(4)ai;coutendl;voidresort(int*x,intn)inta10,*i,*j,*pa=a,*px=x;while(pxx+10)*pa+=*px+;sort(a,10);i=x,j=x+9;for(pa=a;paa+10;)if(*pa%2=0)*i+=*pa+;else*j-=*pa+;voidsort(int*a,intn)int*i,*j,temp;for(i=a;ia+n-1;i+)for(j=i+1;ja+n;j+)if(*i*j)temp=*i,*i=*j,*j=temp;1 编写一个求积分的函数,该函数的原型如
14、下:floatIntegral(inta,intb,float(*fun)(float);该函数返回值为积分结果,形参a,b分别为积分上下限,fun是被积函数。要求:1)积分算法:将积分区域划分为若干个小区间,求出所有小区间中被积函数下的面积之和即为函数在积分区域内的积分值;小区间面积可用梯形近似;2) 用积分函数分别求解y=x2和y=2x+1两个函数在0,1区域内的积分值。*/#includefloatf1(floatx)returnx*x;floatf2(floatx)return(2*x+1);floatIntegral(inta,intb,float(*fun)(float);void
15、main()cout第一个积分值:Integral(0,1,f1)endl;cout第二个积分值:Integral(0,1,f2)endl;floatIntegral(inta,intb,float(*fun)(float)floath,y;inti;y=(fun(a)+fun(b)/2;h=(b-a)/1000.0;for(i=1;i1000;i+)y+=fun(h*i);return(y*h);2 编程题(20分)【编程要求】1) 编写函数intfun(long*x),找出所有满足以下特性的六位整数:它是一个完全平方数(完全平方数是指该数是某个整数的平方);该数同时也是回文数(回文数是指该
16、数等于它的反序数)。例如,698896是836的平方并且698896是回文数,因此698896是满足所给条件的六位整数。将所有满足上述条件的六位整数存入x指向的数组中,函数返回x指向的数组中整数的个数。2) 编写main函数,声明result数组,调用fun函数将所有满足条件的六位整数存入result数组中,将result数组中的数据输出到屏幕。【测试数据与运行结果】运行结果:698896#include#includeintfun(long*x);voidmain()longresort10;intn=fun(resort);cout六位整数中完全平方数有:endl;for(inti=0;i
17、n;i+)coutresortiendl;intfun(long*x)longn,n1,n2,n3=0;long*px=x;for(n2=n=100000;n0)n3=n3*10+n2%10;n2/=10;if(n3=n)*px+=n;returnpx-x;3 改错题【程序功能】对于s数组中保存的五个字符串,删除其中不符合下列组成规则的字符串,输出s数组中剩余的字符串。字符串组成规则:由字母、数字、下划线组成,首字符非数字。【测试数据与运行结果】s数组中五个字符串:a%1,_a12,aaa,$ss,1sss输出:_a12,aaa【含有错误的源程序】#include#include#define
18、M20#defineN10intisident(charsN,intn)inti,j,k,flag;for(j=0;jn;j+)flag=0;if(sj0!=_|-(sj0)=0)flag=1;elsefor(i=1;sji!=0;i+)if(sji!=_&!isalpha(sji)&!isdigit(sji)flag=1;if(flag=1)for(k=0;kn-1;k+)strcpy(sk,sk+1);n-;j-;returnn;voidmain()charsM=a%1,_a12,aaa,$ss,1sss;inti,n=5;n=isident(s,n);coutThecorrectCide
19、ntifiersis:n;for(i=0;in;i+)coutsiendl;1) 根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2) 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。#include#include#include#defineM20#defineN10intisident(charsN,intn)inti,j,k,flag;for(j=0;jn;j+)flag=0;if(sj0!=_&!isalpha(sj0)/if(sj0!=_|-(sj0)=0)flag=1;elsefor(i=
20、1;sji!=0;i+)if(sji!=_&!isalpha(sji)&!isdigit(sji)/#includeflag=1;if(flag=1)for(k=j;kn-1;k+)/for(k=0;kn-1;k+)strcpy(sk,sk+1);n-;j-;returnn;voidmain()charsMN=a%1,_a12,aaa,$ss,1sss;/sMNinti,n=5;n=isident(s,n);coutThecorrectCidentifiersis:n;for(i=0;in;i+)coutsiendl;第六周上机题目一、 编程题1. 编写函数intprime_m(intn,in
21、tx,longy),在2n范围内查找同时符合以下条件的整数m:2m-1是素数、2m-1的反序数是奇数、2m-1的十进制表示中包含数字1。将2n范围内符合上述条件的所有整数m依次保存到x指向的数组中,将与m对应的整数2m-1依次保存到y指向的数组中。函数返回x数组中保存的整数个数。2. 编写main函数,接收键盘输入的n值,调用prime_m函数找到2n范围内所有符合给定条件的整数m及整数2m-1并将它们分别保存在两个一维数组中.3. 【测试数据与运行结果】测试数据:n=20输出结果:531712717131071#include#includeintprime_m(intn,intx,long
22、y);voidmain()intn1,n,x10,*px=x;longy10,*py=y;coutn;n1=prime_m(n,x,y);cout0)cout*px+t*py+n;intprime_m(intn,intx,longy)intm,p=0,n1,*px=x;longk=2,*py=y;for(m=2;mn;m+)k*=2;for(inti=2;i=sqrt(k-1);i+)/判断k是不是素数if(k-1)%i=0)break;if(i10)n1/=10;if(n1%2=0)continue;n1=k-1;/判断k中有无数字1while(n1%10)!=1&n110)n1/=10;i
23、f(n1%10!=1)continue;*px+=m,*py+=k-1;returnpx-x;二、 编程题接收从键盘输入的若干个字符串,为每一个字符串动态申请一块存储区,将字符串复制到该存储区并将存储区的首地址依次保存到指针数组lineptr中,再以字典序输出所有的字符串(输入时以回车作为字符串之间的分隔符,以空串作为输入结束标记,输入的字符串总数不超过10个)。函数voidsort(char*vp,intn)的功能是根据指针数组vp前n个元素指向的字符串,按字典序对指针数组排序。函数voidoutline(char*vp,intn)的功能是输出指针数组vp前n个元素指向的字符串。【测试数据与
24、运行结果】输入:输出(排序后):NoNoWellPracticeYouWellPracticeYou(空串)#include#includevoidsort(char*vp,intn);voidoutline(char*vp,intn);voidmain()char*lineptr10,s1100;inti=0;docin.getline(s1,100);lineptri=newcharstrlen(s1)+1;strcpy(lineptri+,s1);while(strcmp(s1,0);sort(lineptr,i-1);outline(lineptr,i-1);voidsort(char
25、*vp,intn)inti,j;char*temp;for(i=0;in-1;i+)for(j=i+1;j0)temp=vpi,vpi=vpj,vpj=temp;voidoutline(char*vp,intn)cout输出:n;for(inti=0;in;i+)coutvpiendl;附加题:一、 编程题建立一条无序链表,并输出这条链表上个节点的值。设计一个函数,将这条链表构成一条新的逆序链表,即将链表头当尾,链表尾当头。输出这条新链表上节点的值。用以下一组数据测试程序的正确性:学号C+成绩英语成绩389890459080497563二、 508649改错题【程序功能】为了测试学生对英文单词
26、的掌握程度,以下程序在给出的五个单词中随机抽取一个单词,用“*”替换该单词中的两个随机位置上的字母并显示替换后的单词,再将被测学生输入的单词与正确单词比较,显示对错信息。提示:库函数srand()初始化随机数生成器,库函数rand()%n随机产生0(n-1)之间的一个整数并返回,这两个函数的原型包含在stdlib.h中。【测试数据与运行结果】程序运行结果是随机的,即每次运行结果可能不同。一次运行结果如下:显示:Thewordis:bea*tifu*,Pleaseinputcorrectword:输入:beautiful显示:Right.另一次运行结果如下:显示:Thewordis:s*ude*
27、t,Pleaseinputcorrectword:输入:studemt显示:Wrong!Thewordis:student【含有错误的源程序】#include#include#includeintfuntest(char*cp,inti)intix=0,iy=0,ik=0;charca20=0,cb20=0;strcpy(ca,cp);ik=strlen(ca);ix=rand()%ik;iy=rand()%ik;while(iy=ix)iy=rand()%ik;caix=*;caiy=*;coutThewordis:ca;cout”Pleaseinputcorrectword:;gets(c
28、b);if(cb=cpi)return1;elsereturn0;voidmain()charcs520=beautiful,student,China,function,include;inti,ik=0;unsignedn;coutn;srand()i=rand()%5;ik=funtest(cs,i);if(ik)coutRight!n;elsecoutWrong!Thewordis:%sncs;实验七一、 编程题N个人围成一圈,他们的序号依次为1n,从第一个人开始顺序报数1、2、3、m,报到m者退出圈子,并输出退出圈子的人的序号。用一个结点的环形链表模拟围成一圈的人。假定有10个人围城
29、一圈,凡报到5者退出圈子,则退出圈子的人的序号依次为5、10、6、2、9、8、1、4、7,最后留在圈中的人是3号。是单向环形链表的结构,其中head指向第一个人。structNodeintx;Node*next;要求:1. 函数Node*creat(intn)用来创建一个有n个节点的环形链表,他们的序号依次为1n,函数返回头结点;2. 函数voiddel(Node*h,intm)实现从第一个人开始顺序报数1、2、3、m,报到m者退出圈子,并输出退出圈子的人的序号。接着再顺序报数,直到圈子中留下一个人为止。3. 主函数要求从键盘输入m,n的值,并调用函数creat函数完成建立环形链表,和del函
30、数依次输出退出圈子的人的序号,找出圈子中留下的最后一个人。#includestructnodeintx;node*next;node*creat(intn)node*p1,*p2,*head=0;cout建立环形链表:n;for(inti=1;ix=i;if(head=0)head=p1;p2=p1;elsep2-next=p1;p2=p1;if(head)p2-next=head;return(head);voidprint(constnode*head)constnode*p;p=head;cout输出链表上的各结点:n;for(inti=1;i=10;i+)coutxnext;coutn
31、ext;i+;if(i%5=0)q+;cout第q个退出圈子的是序号为:x的人next=p-next;deletep;p=h-next;i+;a-;if(a=1)cout最后留在圈中的是序号为:x的人n;deletep;voidmain()intm,n;node*head;cout请输入游戏的人数:n;head=creat(n);print(head);cout顺序报数退出队列的m数为:m;del(head,m);二、 编程题用函数函数Node*creat(intn)建立两个有序的同结构的单向链表(结点包含一个整型数和一个指向本结点的类型的指针);用函数merge(Node*h1,Node*h
32、2)合并这两个链表;用函数voidprin(Node*h)输出结果,主函数如下。用下列数据测试程序的正确性。链表1:5,9,21,36,58,79,81链表2:3,4,8,16,34,78,90,100,101voidmain()list*h1,*h2,*h3;h1=creat();h2=creat();print(h1);print(h2);h3=merge(h1,h2);print(h3);del(h1);del(h2);del(h3);#includestructNodeintdate;Node*next;Node*creat(intn);Node*merge(Node*h1,Node*
33、h2);Node*insert(Node*h,Node*p);voidprint(Node*);voiddel(Node*h);voidmain()Node*h1,*h2,*h3;intn;coutn;h1=creat(n);coutn;h2=creat(n);print(h1);print(h2);h3=merge(h1,h2);print(h3);del(h1);del(h2);del(h3);Node*creat(intn)Node*h=0,*p1,*p2;cout0)p1=newNode;/建cinp1-date;/录if(h=0)h=p2=p1;elsep2-next=p1;/链p2
34、=p1;/移p2-next=0;returnh;Node*merge(Node*h1,Node*h2)Node*h3=0,*p1,*p2,*p3;p1=h1,p2=h2;while(p1!=0&p2!=0)if(p1-datedate)h3=insert(h3,p1);p1=p1-next;p3=p2;elseh3=insert(h3,p2);p2=p2-next;p3=p1;while(p3!=0)h3=insert(h3,p3);p3=p3-next;returnh3;Node*insert(Node*h,Node*p)Node*p1=h;if(h=0)h=newNode;h-date=p
35、-date;h-next=0;elsewhile(p1-next!=0)p1=p1-next;p1-next=newNode;p1=p1-next;p1-date=p-date;p1-next=0;returnh;voidprint(Node*h)Node*p=h;while(p!=0)coutdatenext;coutnext;deletep;第八周上机题目1. 编写一个类CNums,实现如下功能:某数列的第一项是0,第二项是1,从第三项起,凡奇数项是其前两项之和,偶数项是其前两项之差(前项减后项),生成数列的100项存入数组,统计共有多少个-1,0,1;1) 类定义的要求如下:私有数据成员l