C++上机题目及答案1.doc_第1页
C++上机题目及答案1.doc_第2页
C++上机题目及答案1.doc_第3页
C++上机题目及答案1.doc_第4页
C++上机题目及答案1.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第一周上机题1. 以下语句描述了包含数学成绩的学生信息结构体及其数组a:struct student char name20; float math; ;student a10 = 张三, 90,李四,85,王五,73;int count=3; / 数组中包含的学生数编写两个函数分别实现在a数组中添加和删除学生信息。要求:1) 原数组已按数学成绩排序(降序),添加和删除学生信息后数组应仍为降序;2)以下数据用于添加:赵二, 96, 钱六,65,孙七,803) 注意:添加,删除后count数据要相应变化。#include#includestruct 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-结束nn;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;stu.math;while(stu.mathai.math & ii;n-) an=an-1; /腾位置ai=stu; /插入count+;print(a);void dele(student a10)char name20;int i=0,n=count;print(a);coutname;while(strcmp(name,)!=0 & i=n) cout查无此人!n;else for(;in-1;i+) ai=ai+1; /删除count-;print(a);void print(student a)coutn最新学生信息: n;for(int i=0;icount;i+)tai.mathn;2. 定义描述三维坐标点(x,y,z)的结构体类型变量,完成坐标点的输入和输出,并求两坐标点之间的距离。要求:编写函数求两坐标点之间的距离。#include#includestruct pointdouble x,y,z;double distance(point a,point b);void main()point a,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;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;#includestruct Pchar name20;double score7,aver;PERSON3;double delmaxmin(double a7)double aver=0,sum=0,max,min;max=min=a0;for(int i=0;imax) max=ai;if(aimin) min=ai;aver+=ai;aver-=max+min;return aver/5;void sort(P p3)int i,j;P a;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;void main()int i,j;cout请输入比赛选手的比赛数据:endl;for(i=0;iPERSON;for(j=0;jPERSONi.scorej;for(i=0;i3;i+)PERSONi.aver=delmaxmin(PERSONi.score);sort(PERSON); cout比赛成绩如下endl;for(i=0;i3;i+)coutPERSONt;for(j=0;j7;j+)coutPERSONi.scorejt;coutPERSONi.averendl;第二周 上机题1. 查找并输出同时出现在两个一维数组中的整数,每个一维数组中的元素均按升序排列,并且每个数组中的元素没有重复值。函数int coincidence_count ( int *a , int *b; int *c) 按上述要求在a数组和b数组上查找,将找到的数据保存到c所指向的的数组中。a数组中的数据:1,2,4,8,10,12,13,14,16,18b数组中的数据:3,4,7,8,9,10,12,13,16,19#includeint coincidence_count(int *a,int*b,int *c);void print(int *d,int n);void main()int a=1,2,4,8,10,12,13,14,16,18;int b=3,4,7,8,9,10,12,13,16,19,c10;int k=coincidence_count(a,b,c);cout原始数据:n 数组a: ; print(a,10);coutn 数组b: ; print(b,10);coutn结果显示: n 数组c: ; print(c,k);coutn;int coincidence_count ( int*a,int*b,int*c)int *pa=a,*pb=b,*pc=c;while(paa+10 & pbb+10)if(*pa*pb)pa+;else if(*pb*pa) pb+;else *pc+=*pa+;return (pc-c);void print(int *d,int n)int *pd=d;while(pdd+n)cout*pd+,;2. 从键盘任意输入10个整数,用函数void( int *pa , int *pb)编程实现找出最大值和最小值,并通过指针pa ,pb返回它们所在数组中的位置。主函数并通过屏幕输出结果(最大值,最大值在数组中的位置,最小值,最小值在数组中的位置,)。#includevoid max_min(int *a,int *pa,int *pb);void main()int a10,max, min;max=min=0;int *pa=a;while(pa*pa+;max_min(a,&max,&min);coutmax=amax在数组中位置是:maxendl;coutmin=amin在数组中位置是:minendl;void max_min(int *a,int *pa,int *pb)int max,min;max=min=*(a+0);for(int i=0;imax)max=*a,*pa=i;else if(*amin)min=*a,*pb=i;附加题:3. 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; i25; i+) pi=i+1;seek( a,n ,&num);cout” 最后留在圈子中的人原来的序号是: ”num endl;*/#include#define NUM 10#includevoid seek( int*a,int n,int *pn);void main( )int n=3;int num;int aNUM,*p=a;for(int i=0; iNUM; i+) pi=i+1;for(i=0;iNUM;i+)coutsetw(3)ai;seek( a,n ,&num);coutn最后留在圈子中的人序号是: num+1 endl;void seek( int*a,int n,int *pn)int num=NUM;int k=1;int i;cout1)for(i=0;iNUM;i+)if(ai=0) continue;if(k+%3=0)ai=0;num-;else *pn=i;for(i=0;iNUM;i+)if(ai!=0)coutsetw(3)ai;coutendl;第三周上机题目题目:1 从一个整型数组中删除所有小于数组元素平均值并且不是素数的那些整数。【编程要求】1) 编写函数int del(int r , int n),计算r数组中前n个整数的平均值,删除数组中所有小于该平均值并且不是素数的那些数,函数返回r数组中剩余整数的个数。2) 编写main函数,声明数组resource并用测试数据初始化,调用del函数处理数组resource中的数据,将resource数组中剩余的整数输出到屏幕。【测试数据与运行结果】数组初始数据为: 17 5 6 18 8 28运行结果: 17 5 18 28#include#includeint del(int r , int n);int sh(int n);void main()int resource=17,5,6,18,8,28,n;cout数组初始数据为:;for(int i=0;i6;i+)coutresourceit;n=del(resource,6);coutn运行结果:;for(i=0;in;i+)coutresourceit;coutendl;int del(int r , int n)int *p1=r,*p2=r,i=0;float avr=0;while(p1r+n)avr+=*p1+;avr/=6;p1=r;while(p1r+n)if(*p1avr & sh(*p1)=0) p1+;continue;*p2+=*p1+ ;return (p2-r);int sh(int n)int j;j=sqrt(n);for(int i=2;i=j;i+)if(n%i=0) break;if(i(j+1) return 0;return 1;2 编程要求1) 编写函数int find(char *a , char *b),函数被调用时,a指向的数组中已存储一个字符串,该字符串是一个包含了多个单词的英语句子。函数的功能找出字符数组a中字符串中最长的单词并存入b所指向的数组中,函数返回最长单词在字符串的起迭位置下标。2) 编写main函数,接受键盘输入的一个英文句子。调用find函数找到该句子中最长的单词,将最长单词及其在字符串中的起始位置下标输出到屏幕。#include#includeint find(char *a , char *b);void main()char a80,b80;int n;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);附加题3 重新排列一维数组元素的顺序,使得左边的所有元素均为偶数并按由大到小的次序存放,右边的所有元素均为奇数并按由小到大的次序存放。【测试数据与运行结果】数组原始数据为: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#includevoid resort(int *x, int n);void sort(int *a,int n);void main()int a10=0;cout请输入十个数据:;for(int i=0;iai;cout数组原始数据为:;for(i=0;i10;i+) coutsetw(4)ai;resort(a,10);coutn输出结果:;for(i=0;i10;i+)coutsetw(4)ai;coutendl;void resort(int *x, int n)int a10,*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+;void sort(int *a,int n)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;4 【程序功能】生成一个n阶螺旋方阵,将其存放到一个二维数组中并输出。【测试数据与运行结果】当n为5时,输出如下螺旋方阵:1) 编写函数void rot( int matNN, int n) 生成一个n阶螺旋方阵,并存放到一个二维数组mat中;2) 编写主函数,由主函数调用rot函数完成上述功能,并按行输出结果。#include#include#define N 7void rot( int matNN, int n);void main()int aNN=0,k=1;rot(a,N);int *p=a0;int n=1;for(;p=&aN-1N-1;p+)coutsetw(6)*p;if(k+%N=0)cout0)for(i=1;i0;i+)if(i%2=1)x=-x;z=x;/(上下移动)向下-指针每次移动N位 向上-指针每次移动-N位向左指针每次移动-1位else n-;y=-y;z=y; /(左右移动)向右-指针每次移动+1位,向左-指针每次移动-1位for(j=0;jn;j+,p1+=z)*p1=num+;p1-=z; if(i%2=1)p1-=y; /调整起点位置else p1-=x;第五周上机题目1 编写一个求积分的函数,该函数的原型如下: float Integral(int a, int b, float (*fun)(float); 该函数返回值为积分结果,形参a,b分别为积分上下限,fun是被积函数。要求: 1)积分算法:将积分区域划分为若干个小区间,求出所有小区间中被积函数下的面积之和即为函数在积分区域内的积分值;小区间面积可用梯形近似;2) 用积分函数分别求解y=x2和y=2x+1两个函数在0,1区域内的积分值。*/#includefloat 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;i1000;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#includeint fun(long *x);void main()long resort10;int n=fun(resort);cout六位整数中完全平方数有: endl;for(int i=0;in;i+)coutresortiendl;int fun(long *x)long n,n1,n2,n3=0;long *px=x;for(n2=n=100000;n0)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#include #define M 20#define N 10int isident(char sN,int n)int i,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-;return n;void main( ) char sM=a%1,_a12,aaa,$ss,1sss; int i,n=5;n=isident(s,n);coutThe correct C identifiers is :n;for(i=0; in; i+)coutsiendl;1) 根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2) 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。#include#include#include #define M 20#define N 10int isident(char sN,int n)int i,j,k,flag;for(j=0;jn;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)/#includeflag=1;if(flag=1) for(k=j;kn-1;k+)/for(k=0;kn-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);coutThe correct C identifiers is :n;for(i=0; in; i+)coutsiendl;第六周上机题目一、 编程题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#includeint prime_m( int n,int x, long y);void main()int n1,n,x10,*px=x;long y10,*py=y;coutn;n1=prime_m(n,x,y);cout0) 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;mn;m+)k*=2;for(int i=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; if(n1%10!=1) continue;*px+=m,*py+=k-1;return px-x;二、 编程题接收从键盘输入的若干个字符串,为每一个字符串动态申请一块存储区,将字符串复制到该存储区并将存储区的首地址依次保存到指针数组lineptr中,再以字典序输出所有的字符串(输入时以回车作为字符串之间的分隔符,以空串作为输入结束标记,输入的字符串总数不超过10个)。函数void sort(char *vp , int n)的功能是根据指针数组vp前n个元素指向的字符串,按字典序对指针数组排序。函数void outline(char *vp , int n) 的功能是输出指针数组vp前n个元素指向的字符串。【测试数据与运行结果】输入: 输出(排序后):No NoWell PracticeYou WellPractice You(空串)#include#includevoid 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;in-1;i+)for(j=i+1;j0)temp=vpi,vpi=vpj,vpj=temp;void outline(char *vp , int n)cout输出:n;for(int i=0;in;i+)coutvpiendl;附加题:一、 编程题建立一条无序链表,并输出这条链表上个节点的值。设计一个函数,将这条链表构成一条新的逆序链表,即将链表头当尾,链表尾当头。输出这条新链表上节点的值。用以下一组数据测试程序的正确性:学号 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 #include #include 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=*; coutThe 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;coutn;srand( ) i=rand( )%5; ik=funtest(cs,i); if(ik) coutRight! n; else coutWrong! The word is:%sncs;实验七一、 编程题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函数依次输出退出圈子的人的序号,找出圈子中留下的最后一个人。#includestruct nodeint x;node *next;node *creat(int n)node *p1,*p2,*head=0;cout建立环形链表:n;for(int i=1;ix=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+)coutxnext;coutnext;i+;if(i%5=0)q+; cout第q个退出圈子的是序号为:x的人next=p-next;delete p;p=h-next;i+;a-;if(a=1)cout最后留在圈中的是序号为:x的人n;delete p;void main() int m,n;node *head; cout请输入游戏的人数:n;head=creat(n);print(head);cout顺序报数退出队列的m数为: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(h

温馨提示

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

最新文档

评论

0/150

提交评论