3175372659C++上机题目及答案1.doc
第一周上机题1. 以下语句描述了包含数学成绩的学生信息结构体及其数组a:struct student char name20; float math; ;student a10 = "张三", 90,"李四",85,"王五",73;int count=3; / 数组中包含的学生数编写两个函数分别实现在a数组中添加和删除学生信息。要求:1) 原数组已按数学成绩排序(降序),添加和删除学生信息后数组应仍为降序;2)以下数据用于添加:"赵二", 96, "钱六",65,"孙七",803) 注意:添加,删除后count数据要相应变化。#include<iostream.h>#include<string.h>struct student char name20; float math; ;int count=3;void add(student a10);void dele(student a10);void print(student a);void main()student a10 = "张三", 90,"李四",85,"王五",73;int n=0;docout<<".学生信息处理系统."<<"n 1-删除"<<"n 2-增加"<<"n 3-结束n"<<"n请选择: "cin>>n;if(n=1) dele(a);else if(n=2) add(a) ;else cout<<"谢谢使用本系统!n"while(n!=3);void add(student a10)student stu;int i=0,n=count;cout<<"请输入需增加的学生信息(姓名,成绩): "cin>>stu.name>>stu.math;while(stu.math<ai.math && i<n) i+;/找插入的位置for(;n>i;n-) an=an-1; /腾位置ai=stu; /插入count+;print(a);void dele(student a10)char name20;int i=0,n=count;print(a);cout<<"请输入需删除学生的姓名: "cin>>name;while(strcmp(name,ai.name)!=0 && i<n) i+;/找人if(i>=n) cout<<"查无此人!n"else for(;i<n-1;i+) ai=ai+1; /删除count-;print(a);void print(student a)cout<<"n最新学生信息: n"for(int i=0;i<count;i+)cout<<ai.name<<'t'<<ai.math<<'n'2. 定义描述三维坐标点(x,y,z)的结构体类型变量,完成坐标点的输入和输出,并求两坐标点之间的距离。要求:编写函数求两坐标点之间的距离。#include<iostream.h>#include<math.h>struct pointdouble x,y,z;double distance(point a,point b);void main()point a,b;cout<<"请分别输入两个点的坐标(x,y,z):n"cin>>a.x>>a.y>>a.z;cin>>b.x>>b.y>>b.z;cout<<"a点的坐标:"<<a.x<<','<<a.y<<','<<a.z<<'n'cout<<"b点的坐标:"<<b.x<<','<<b.y<<','<<b.z<<'n'cout<<"a,b两点的距离是:"<<distance(a,b)<<endl;double distance(point a,point b)double d; 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);return d;3. 某市青年歌手大赛聘请7名评委打分,下列程序协助进行评分统计。函数delmaxmin的功能是对一个选手的得分做以下计算:去掉一个最高分,去掉一个最低分,然后对剩余得分求平均分并保存。函数sort完成对n名选手的得分按平均分从高到低排序。【测试数据与运行结果】测试数据:程序中给定的初始化测试数据运行结果: li: 94 97 98 96 100 99 97 97.40zhang: 96 97 98 98 100 97 96 97.20 zhou: 95 100 99 96 97 96 97 97.00以下语句描述了包含数学成绩的学生信息结构体及其数组a: struct char player_name20; double score7,aver; PERSON3;#include<iostream.h>struct Pchar name20;double score7,aver;PERSON3;double delmaxmin(double a7)double aver=0,sum=0,max,min;max=min=a0;for(int i=0;i<7;i+)if(ai>max) max=ai;if(ai<min) min=ai;aver+=ai;aver-=max+min;return aver/5;void sort(P p3)int i,j;P a;for(i=0;i<3;i+)for(j=i+1;j<3;j+) /原程序:for(j=0;j<3;j+)if(pi.aver<pj.aver)/原程序: if(pi.aver<pi+1.aver)a=pi,pi=pj,pj=a;void main()int i,j;cout<<"请输入比赛选手的比赛数据:"<<endl;for(i=0;i<3;i+)cin>>PERSONi.name;for(j=0;j<7;j+)cin>>PERSONi.scorej;for(i=0;i<3;i+)PERSONi.aver=delmaxmin(PERSONi.score);sort(PERSON); cout<<"比赛成绩如下"<<endl;for(i=0;i<3;i+)cout<<PERSONi.name<<'t'for(j=0;j<7;j+)cout<<PERSONi.scorej<<'t'cout<<PERSONi.aver<<endl;25个人围成一个圈,从第1个人开始顺序报号(1,2,3),凡报号为3和3的倍数者退出圈子,找出最后留在圈子中的人原来的序号。要求:函数void seek( int *a , int n, int *pn) 按上述要求在a数组,找出最后留在圈子中的人原来的序号并返回。主函数是: void main( )int n=3;int num;int a25,*p=a;for(int i=0; i<25; i+) pi=i+1;seek( a,n ,&num);cout<<” 最后留在圈子中的人原来的序号是: ”<<num <<endl;*/#include<iostream.h>#define NUM 10#include<iomanip.h>void seek( int*a,int n,int *pn);void main( )int n=3;int num;int aNUM,*p=a;for(int i=0; i<NUM; i+) pi=i+1;for(i=0;i<NUM;i+)cout<<setw(3)<<ai;seek( a,n ,&num);cout<<"n最后留在圈子中的人序号是: "<<num+1 <<endl;void seek( int*a,int n,int *pn)int num=NUM;int k=1;int i;cout<<"n游戏中.n"while(num>1)for(i=0;i<NUM;i+)if(ai=0) continue;if(k+%3=0)ai=0;num-;else *pn=i;for(i=0;i<NUM;i+)if(ai!=0)cout<<setw(3)<<ai;cout<<endl;1 编程要求1) 编写函数int find(char *a , char *b),函数被调用时,a指向的数组中已存储一个字符串,该字符串是一个包含了多个单词的英语句子。函数的功能找出字符数组a中字符串中最长的单词并存入b所指向的数组中,函数返回最长单词在字符串的起迭位置下标。2) 编写main函数,接受键盘输入的一个英文句子。调用find函数找到该句子中最长的单词,将最长单词及其在字符串中的起始位置下标输出到屏幕。#include<iostream.h>#include<string.h>int find(char *a , char *b);void main()char a80,b80;int n;cout<<"请输入的一个英文句子: "cin.getline(a,80);cout<<b<<"n起始下标是: "<<find(a,b)<<endl;int find(char *a , char *b)char *p1,*p2,*p3;p1=p2=p3=a;int max=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);附加题2 重新排列一维数组元素的顺序,使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。【测试数据与运行结果】数组原始数据为:17 15 10 14 16 17 19 18 13 12输出结果:18 16 14 12 10 13 15 17 17 19要求:1) 编写函数void resort(int *x, int n),使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。(可根据编程需要增加函数)2) 编写main函数,接受键盘输入数据,调用resort函数完成上述功能,并输出结果。#include<iostream.h>#include<iomanip.h>void resort(int *x, int n);void sort(int *a,int n);void main()int a10=0;cout<<"请输入十个数据:"for(int i=0;i<10;i+)cin>>ai;cout<<"数组原始数据为:"for(i=0;i<10;i+) cout<<setw(4)<<ai;resort(a,10);cout<<"n输出结果:"for(i=0;i<10;i+)cout<<setw(4)<<ai;cout<<endl;void resort(int *x, int n)int a10,*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+;void sort(int *a,int n)int *i,*j,temp;for(i=a;i<a+n-1;i+)for(j=i+1;j<a+n;j+)if(*i<*j)temp=*i,*i=*j,*j=temp; 1 编写一个求积分的函数,该函数的原型如下: float Integral(int a, int b, float (*fun)(float); 该函数返回值为积分结果,形参a,b分别为积分上下限,fun是被积函数。要求: 1)积分算法:将积分区域划分为若干个小区间,求出所有小区间中被积函数下的面积之和即为函数在积分区域内的积分值;小区间面积可用梯形近似;2) 用积分函数分别求解y=x2和y=2x+1两个函数在0,1区域内的积分值。*/#include<iostream.h>float f1(float x)return x*x;float f2(float x)return (2*x+1);float Integral(int a, int b, float (*fun)(float);void main()cout<<"第一个积分值: "<<Integral(0,1,f1)<<endl;cout<<"第二个积分值: "<<Integral(0,1,f2)<<endl;float Integral(int a, int b, float (*fun)(float)float h,y;int i;y=(fun(a)+fun(b)/2;h=(b-a)/1000.0;for(i=1;i<1000;i+)y+=fun(h*i);return (y*h);2 编程题(20分)【编程要求】1) 编写函数int fun(long *x),找出所有满足以下特性的六位整数:它是一个完全平方数(完全平方数是指该数是某个整数的平方);该数同时也是回文数(回文数是指该数等于它的反序数)。例如,698896是836的平方并且698896是回文数,因此698896是满足所给条件的六位整数。将所有满足上述条件的六位整数存入x指向的数组中,函数返回x指向的数组中整数的个数。2) 编写main函数,声明result数组,调用fun函数将所有满足条件的六位整数存入result数组中,将result数组中的数据输出到屏幕。【测试数据与运行结果】 运行结果: 698896#include<iostream.h>#include<math.h>int fun(long *x);void main()long resort10;int n=fun(resort);cout<<"六位整数中完全平方数有: "<<endl;for(int i=0;i<n;i+)cout<<resorti<<endl;int fun(long *x)long n,n1,n2,n3=0;long *px=x;for(n2=n=100000;n<999999;n+,n2=n,n3=0)n1=sqrt(n);if(n1*n1=n)while(n2>0)n3=n3*10+n2%10;n2/=10;if(n3=n) *px+=n;return px-x;3 改错题【程序功能】对于s数组中保存的五个字符串,删除其中不符合下列组成规则的字符串,输出s数组中剩余的字符串。字符串组成规则:由字母、数字、下划线组成,首字符非数字。【测试数据与运行结果】s数组中五个字符串: a%1,_a12,aaa,$ss,1sss输出: _a12,aaa【含有错误的源程序】#include<iostream.h>#include<string.h> #define M 20#define N 10int isident(char sN,int n)int i,j,k,flag;for(j=0;j<n;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;k<n-1;k+) strcpy(sk,sk+1);n-;j-;return n;void main( ) char sM="a%1","_a12","aaa","$ss","1sss" int i,n=5;n=isident(s,n);cout<<"The correct C identifiers is :n"for(i=0; i<n; i+)cout<<si<<endl;1) 根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2) 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。#include<iostream.h>#include<ctype.h>#include<string.h> #define M 20#define N 10int isident(char sN,int n)int i,j,k,flag;for(j=0;j<n;j+)flag=0;if(sj0!='_' && !isalpha(sj0) )/if(sj0!='_' | -(sj0)=0 )flag=1;elsefor(i=1; sji!='0' i+)if(sji!='_' && !isalpha(sji) && !isdigit(sji)/#include<ctype.h>flag=1;if(flag=1) for(k=j;k<n-1;k+)/for(k=0;k<n-1;k+) strcpy(sk,sk+1);n-;j-;return n;void main( ) char sMN="a%1","_a12","aaa","$ss","1sss" /sMN int i,n=5;n=isident(s,n);cout<<"The correct C identifiers is :n"for(i=0; i<n; i+)cout<<si<<endl;第六周上机题目一、 编程题1. 编写函数int prime_m( int n,int x, long y),在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输出结果: 5 31 7 127 17 131071#include<iostream.h>#include<math.h>int prime_m( int n,int x, long y);void main()int n1,n,x10,*px=x;long y10,*py=y;cout<<"测试数据: n="cin>>n;n1=prime_m(n,x,y);cout<<"输出结果:n" while(n1->0) cout<<*px+<<'t'<<*py+<<'n'int prime_m(int n,int x,long y)int m,p=0,n1,*px=x;long k=2,*py=y;for(m=2;m<n;m+)k*=2;for(int i=2;i<=sqrt(k-1);i+)/判断k是不是素数if(k-1)%i=0) break;if(i<sqrt(k-1) continue;n1=k-1; /2.判断k的反序数是不是奇数while(n1>10) n1/=10;if(n1%2=0) continue;n1=k-1;/判断k中有无数字1while(n1%10)!=1 && n1>10) n1/=10; if(n1%10!=1) continue;*px+=m,*py+=k-1;return px-x;二、 编程题接收从键盘输入的若干个字符串,为每一个字符串动态申请一块存储区,将字符串复制到该存储区并将存储区的首地址依次保存到指针数组lineptr中,再以字典序输出所有的字符串(输入时以回车<CR>作为字符串之间的分隔符,以空串作为输入结束标记,输入的字符串总数不超过10个)。函数void sort(char *vp , int n)的功能是根据指针数组vp前n个元素指向的字符串,按字典序对指针数组排序。函数void outline(char *vp , int n) 的功能是输出指针数组vp前n个元素指向的字符串。【测试数据与运行结果】输入: 输出(排序后):No<CR> NoWell<CR> PracticeYou <CR> WellPractice<CR> You<CR>(空串)#include<iostream.h>#include<string.h>void sort(char *vp , int n);void outline(char *vp , int n);void main()char *lineptr10,s1100;int i=0;docin.getline(s1,100);lineptri=new charstrlen(s1)+1;strcpy(lineptri+,s1);while(strcmp(s1,"0");sort(lineptr,i-1);outline(lineptr,i-1);void sort(char *vp , int n)int i,j;char *temp;for(i=0;i<n-1;i+)for(j=i+1;j<n;j+)if(strcmp(vpi,vpj)>0)temp=vpi,vpi=vpj,vpj=temp;void outline(char *vp , int n)cout<<"输出:n"for(int i=0;i<n;i+)cout<<vpi<<endl;附加题:一、 编程题建立一条无序链表,并输出这条链表上个节点的值。设计一个函数,将这条链表构成一条新的逆序链表,即将链表头当尾,链表尾当头。输出这条新链表上节点的值。用以下一组数据测试程序的正确性:学号 C+成绩 英语成绩38 98 9045 90 8049 75 6350 86 49二、 改错题【程序功能】为了测试学生对英文单词的掌握程度,以下程序在给出的五个单词中随机抽取一个单词,用“*”替换该单词中的两个随机位置上的字母并显示替换后的单词,再将被测学生输入的单词与正确单词比较,显示对错信息。提示:库函数srand( )初始化随机数生成器,库函数rand( )%n随机产生0(n-1)之间的一个整数并返回,这两个函数的原型包含在stdlib.h中。【测试数据与运行结果】 程序运行结果是随机的,即每次运行结果可能不同。一次运行结果如下:显示:The word is: bea*tifu*, Please input correct word: 输入:beautiful显示:Right.另一次运行结果如下:显示:The word is: s*ude*t , Please input correct word:输入:studemt显示:Wrong! The word is : student【含有错误的源程序】#include <iostream.h>#include <string.h>#include <stdlib>int funtest(char *cp, int i) int ix=0, iy=0, ik=0; char ca20=0, cb20=0; strcpy(ca, cp); ik=strlen(ca); ix=rand( )%ik; iy=rand( )%ik; while(iy=ix)iy=rand( )%ik; caix='*' caiy='*' cout<<"The word is: "<<ca; cout<<”Please input correct word:" gets(cb); if(cb=cpi) return 1; else return 0; void main() char cs520="beautiful","student","China","function","include" int i,ik=0;unsigned n;cout<<”请输入一个随机数的种子”cin>>n;srand( ) i=rand( )%5; ik=funtest(cs,i); if(ik) cout<<"Right! n" else cout<<"Wrong! The word is:%sn"<<cs;实验七一、 编程题N个人围成一圈,他们的序号依次为1n,从第一个人开始顺序报数1、2、3、m,报到m者退出圈子,并输出退出圈子的人的序号。用一个结点的环形链表模拟围成一圈的人。假定有10个人围城一圈,凡报到5者退出圈子,则 退出圈子的人的序号依次为5、10、6、2、9、8、1、4、7,最后留在圈中的人是3号。是单向环形链表的结构,其中head指向第一个人。struct Nodeint x;Node *next;要求:1. 函数Node * creat (int n)用来创建一个有n个节点的环形链表,他们的序号依次为1n,函数返回头结点;2. 函数void del(Node *h , int m) 实现从第一个人开始顺序报数1、2、3、m,报到m者退出圈子,并输出退出圈子的人的序号。接着再顺序报数,直到圈子中留下一个人为止。3. 主函数要求从键盘输入m,n的值,并调用函数creat函数完成建立环形链表,和del函数依次输出退出圈子的人的序号,找出圈子中留下的最后一个人。#include<iostream.h>struct nodeint x;node *next;node *creat(int n)node *p1,*p2,*head=0;cout<<"建立环形链表:"<<'n'for(int i=1;i<=n;i+)p1=new node;p1->x=i;if(head=0)head=p1;p2=p1;elsep2->next=p1;p2=p1;if(head) p2->next=head;return(head);void print(const node *head)const node *p;p=head;cout<<"输出链表上的各结点:"<<'n' for(int i=1;i<=10;i+)cout<<p->x<<'t'p=p->next;cout<<'n'void del(node *head,int m)node *h,*p;int i=1,q=0,a=10;p=head; while(a!=1)h=p;p=p->next;i+;if(i%5=0)q+; cout<<"第"<<q<<"个退出圈子的是序号为:"<<p->x<<"的人"<<'n'h->next=p->next;delete p;p=h->next;i+;a-;if(a=1)cout<<"最后留在圈中的是序号为:"<<p->x<<"的人"<<'n'delete p;void main() int m,n;node *head; cout<<"请输入游戏的人数:"<<'n'cin>>n;head=creat(n);print(head);cout<<"顺序报数退出队列的m数为:"<<'n'cin>>m;del(head,m);二、 编程题用函数函数Node * creat (int n)建立两个有序的同结构的单向链表(结点包含一个整型数和一个指向本结点的类型的指针);用函数 merge(Node * h1 , Node * h2 )合并这两个链表;用函数void prin(Node * h)输出结果,主函数如下。用下列数据测试程序的正确性。链表1:5,9,21,36,58,79,81链表2:3,4,8,16,34,78,90,100,101void main( )list *h1, *h2, *h3;h1=creat( );h2= creat( );print(h1);print(h2);h3=merge (h1,h2);print(h3);del(h1);del(h2);del(h3);#include<iostream.h>struct Nodeint date;Node *next;Node * creat (int n);Node *merge(Node * h1 , Node * h2 );Node* insert(Node * h,Node *p);void print(Node *);void