程序设计与问题求解下实验答案_第1页
程序设计与问题求解下实验答案_第2页
程序设计与问题求解下实验答案_第3页
程序设计与问题求解下实验答案_第4页
程序设计与问题求解下实验答案_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、实验 数组、结构体和函数综合编程练习1.学生成绩统计 从键盘输入一个班(全班最多不超过 30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:(1)统计不及格人数并打印不及格学生名单;(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。注:将成绩分为六个分数段,60分以下为第0段,6069为第1段,7079为第2段,8089为第3段,9099为第4段,100分为第5段。编程要求:1 .较好的用户输入输出提示信息2 .使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中 包括学生学号和成绩3 .最

2、好不要使用全局变量#include #define ARR_SIZE 30 typedef struct tagStudentlong num;/学生学号float score;/ 学生分数 Student;int ReadScore(Student stu);int GetFail(Student stu, int n);float GetAver(Student stu口,int n);int GetAboveAver(Student stu, int n);void GetDetail(Student stu, int n);main()int n, fail, aboveAver;St

3、udent stuARR_SIZE;printf(Please enter num and score until score= 0)i+;scanf(%ld%f, &stui.num, &stui.score);return i;/* 函数功能:统计不及格人数并打印不及格学生名单函数参数:存放学生信息的Student 结构体数组整型变量n,存放学生总数函数返回值:不及格人数*/int GetFail(Student stu, int n)int i, count;printf(Fail:nnumber-scoren);count = 0;for (i=0; in; i+)if (stui.s

4、core 60)printf(%ld%.0fn, stui.num, stui.score);count+;return count;/* 函数功能:计算全班平均分函数参数:存放学生信息的Student 结构体数组整型变量n,存放学生总数函数返回值:平均分*/float GetAver(Student stu, int n)int i;float sum = 0;for (i=0; in; i+)sum = sum + stui.score;return sum/n;/* 函数功能:统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单函数参数:存放学生信息的Student 结构体数组整型

5、变量n,存放学生总数函数返回值:成绩在全班平均分及平均分之上的学生人数*/int GetAboveAver(Student stu, int n)int i, count;float aver;aver = GetAver(stu, n);printf(aver = %fn, aver);printf(Above aver:nnumber-scoren);count = 0;for (i=0; i= aver)printf(%ld%.0fn, stui.num, stui.score);count+;return count;/* 函数功能:统计各分数段的学生人数及所占的百分比函数参数:存放学

6、生信息的Student 结构体数组整型变量n,存放学生总数函数返回值:无*/void GetDetail(Student stu, int n)int i, j, stuLevel6;for (i=0; i6; i+)stuLeveli=0;for (i=0; in; i+)if (stui.score 60)j = 0; elsej = (int)stui.score - 50) / 10;stuLevelj+;for (i=0; i6; i+)if (i = 0)printf( 60 %d %.2f%n, stuLeveli, (float)stuLeveli/(float)n*100);

7、else if (i = 5)printf( %d %d %.2f%n, (i+5)*10, stuLeveli,(float)stuLeveli/(float)n*100);elseprintf(%d-%d %d %.2f%n, (i+5)*10,(i+5)*10+9, stuLeveli,(float)stuLeveli/(float)n*100);2成绩排名次某班期末考试科目为数学(MT、英语(EN)和物理(PH,有最多不超过30人 参加考试。要求:( 1)计算每个学生的总分和平均分;(2)按总分成绩由高到低排出成绩的名次;(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;

8、(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数#include #define STU 30typedef struct tagStudentlong num;/ 学号float aver;/ 平均分int sum;/ 总分int math;/ 数学(MT)int english;/英语(EN)int physics;/物理(PH)Student;void Input(Student stu, int n);void GetSumAver(Student stu,int n);void Sort(Student stu,int n);void Print(Student s

9、tu,int n);int Search(Student stu,int n,long x);main() int n, pos;long x;Student stuSTU;printf(Please enter the total number of the students(n=30):);scanf(%d, &n);/* 输入参加考试的学生人数*/printf(Enter No. and score as: MT EN PHn);Input(stu, n);/* 输入学生成绩*/GetSumAver(stu,n); /* 计算总分和平均分*/printf(Before sort:n);P

10、rint(stu,n);Sort(stu,n);/* 排名次 */printf(After sort:n);Print(stu,n);printf(Please enter searching number:);*/scanf(%ld, &x);/* 以长整型格式输入待查找学生的学号pos = Search(stu, n, x);/* 名次查询*/if (pos != -1)printf(position:t NO t MT t EN t PH t SUM t AVERn);printf(%8dt%4ldt%4dt%4dt%4dt%5dt%5.0fn,pos+1,stupos.num,stup

11、os.math,stupos.english,stupos.physics,stupos.sum,stupos.aver); else printf(Not found!n); /* 函数功能:输入某班学生期末考试三门课程成绩函数参数:结构体数组stu ,存放学生信息整型变量n,存放学生人数函数返回值:无*/void Input(Student stu, int n)int i;for (i=0; in; i+) scanf(%ld, &stui.num);scanf(%d, &stui.math);scanf(%d, &stui.english);scanf(%d, &stui.physic

12、s);/* 函数功能:计算每个学生的总分和平均分函数参数:结构体数组stu ,存放学生信息整型变量n,存放学生人数函数返回值:无*/void GetSumAver(Student stu,int n)int i;for (i=0; in; i+)stui.sum = stui.english+stui.math+stui.physics; stui.aver = (float)stui.sum / 3;/* 函数功能:按总分成绩由高到低排出成绩的名次函数参数:结构体数组stu ,存放学生信息整型变量n,存放学生人数函数返回值:无*/void Sort(Student stu,int n)int

13、 i,j,k;Student tempStu;for (i=0; in-1; i+)k = i;for (j=i+1; j stuk.sum) k = j;if (k != i)tempStu=stui;stui=stuk;stuk=tempStu;/* 函数功能:打印名次表,表格内包括学生编号、各科分数、总分和平均分函数参数:结构体数组stu ,存放学生信息整型变量n,存放学生人数函数返回值:无*/void Print(Student stu,int n)int i;printf( NO t| MT t EN t PH t SUM t AVERn);printf(n);for (i=0; i

14、n; i+)printf(%ldt| , stui.num);printf(%4dt%4dt%4dt, stui.math,stui.english,stui.physics);printf(%5dt%5.0fn, stui.sum, stui.aver);/* 函数功能:查找学生的学号函数参数:结构体数组stu ,存放学生信息整型变量n,存放学生人数长整型变量x,存放待查找学生的学号-1函数返回值:找到时,返回学生学号在数组中的下标位置,否则返回值*/int Search(Student stu,int n,long x)int i;for (i=0; in; i+)if (stui.num

15、 = x) return(i);return (-1);递归程序设计求游戏人员的年龄1. 求游戏人员的年龄#include int age(int n);int main() int age5;age5=age(5);printf( 第 5 个人的年龄为%dn,age5);int age(int n) if(n=1)return 10;elsereturn age(n-1)+2;求最大公约数#include int gcd(int x,int y);int main() int x,y;int gcdResult;printf( 输入要计算最大公约数的两个数:);scanf(%d%d,&x,&

16、y);gcdResult=gcd(x,y);printf( 最大公约数为%dn,gcdResult);int gcd(int x,int y)if (x=y)return x;else if (xy)return gcd(x-y,y);else return gcd(x,y-x);/*xy*/ 实验链表编程/注:该程序并没有出错控制,假设用户输入都是正常的范围内#include using namespace std;struct Nodeint data;Node *next;;void createList(Node *head,int num);int findByNo(Node *he

17、ad,int num);int findByData(Node *head,int data);void insertData(Node *head,int data,int num);void deleteData(Node *head,int num);void printOut(Node *head);void main()/int a6=21,23,25,27,29,31;int num;int data;Node *head=new Node();cout请输入6个结点的值:;createList(head,6);coutnum;data=findByNo(head,num);cou

18、t查找到的结点的值为 datadata;num=findByData(head,data);cout查找到的结点的序号为:numendl;coutnum;coutdata;insertData(head,data,num);coutnum;deleteData(head,num);int findByNo(Node *head,int num)int count=0;Node *p=head;while (p-next!=NULL)p=p-next;count+;if (count=num)return p-data;int findByData(Node *head,int data) No

19、de *p=head;int count=0;while (p-next!=NULL)p=p-next;count+;if (p-data=data)return count;/输入序号num和值data。在序号为num的结点后插入data ,并输出该链表 void insertData(Node *head,int data,int num)int count=0;Node *p=head;while (p-next!=NULL)p=p-next;count+;if (count=num) Node *q=new Node();q-data=data;q-next=p-next;p-next

20、=q;printOut(head);return;输入序号num,删除序号为num的结点,并输出该链表void deleteData(Node *head,int num)int count=0;Node *p=head-next;Node *pre=head;while (p!=NULL)count+;if (count=num)/ 删除节点pre-next=p-next;delete p;printOut(head);return; else pre=p; p=p-next;void printOut(Node *head) Node *p=head-next;while (p!=NULL

21、)printf(%d ,p-data);p=p-next;coutendl;void createList(Node *head,int num) Node *p;Node *q=head;for (int i=0;ip-data; p-next=NULL; q-next=p; q=q-next;实验结构、链表综合编程注意:下面的代码用到了文件,但是学生编程并不要求使用文件【编写程序】:建立多个班级学生成绩链表,其中,每个结点包含下面这 些信息:学号、姓名、成绩要求完成下面的功能:1 .建立2个班学生成绩的无序链表,其中每个班包含10个结点数据(输入或从文件中读取每个同学的信息),将每个班的成

22、绩链表按成绩高低 排序后分别输出该链表;2 .将2个班级学生成绩合并(按成绩高低排序)后输出;3.查找学生成绩:通过输入同学的学号,将该同学从链表中找出,并输出 该同学信息;如果找不到,则输出“无此学生”。/classl.txt101 a 56102 b 78103 c 69104 d 26105 e 60106 f 66107 g 70108 h 90109 i 92110 j 99 class2.txt 201 aa 26 202 bb 55 203 cc 78 204 dd 46 205 ee 89 206 ff 65 207 gg 99 208 hh 85 209 ii 73 210

23、jj 96 代码如下: #include using namespace std; #include struct Nodechar no5;char name6;double perform;Node *next;void printOut(Node *head)Node *p=head-next;while (p!=NULL)coutno name performnext;coutendl;void main()Node *q;Node *p;int i;/ 读入班级1,构成链表Node *headClass1=new Node();q=headClass1;ifstream fin1(c

24、lass1.txt);if (!fin1)cout 文件 1 打开失败!endl;return;for (i=0;ip-nop-namep-perform;p-next=NULL;q-next=p;q=q-next;cout 班级 1 原始数据为:endl;printOut(headClass1);/ 读入班级2,构成链表Node *headClass2=new Node();q=headClass2;ifstream fin2(class2.txt);if (!fin2)cout 文件 1 打开失败!endl;return;for (i=0;ip-nop-namep-perform;p-ne

25、xt=NULL;q-next=p;q=q-next;cout 班级 2 原始数据为:next;Node *temp=new Node();Node *max;while (q!=NULL)temp-perform=q-perform;max=q;p=q-next;while (p!=NULL)if (p-performtemp-perform)max=p;temp-perform=p-perform;p=p-next;strcpy(temp-no,q-no); strcpy(temp-name,q-name); temp-perform=q-perform;strcpy(q-no,max-no

26、);strcpy(q-name,max-name); q-perform=max-perform;strcpy(max-no,temp-no); strcpy(max-name,temp-name); max-perform=temp-perform;q=q-next;delete temp;temp=NULL;cout 班级 1 排序后数据为:next;temp=new Node();while (q!=NULL)temp-perform=q-perform;max=q;p=q-next;while (p!=NULL)if (p-performtemp-perform) max=p;temp

27、-perform=p-perform;p=p-next;strcpy(temp-no,q-no); strcpy(temp-name,q-name); temp-perform=q-perform;strcpy(q-no,max-no); strcpy(q-name,max-name); q-perform=max-perform;strcpy(max-no,temp-no); strcpy(max-name,temp-name); max-perform=temp-perform;q=q-next;delete temp;temp=NULL;cout 班级 2 排序后数据为:next;q=h

28、eadClass2-next;while (p!=NULL & q!=NULL)if (p-performq-perform)h-next=p;p=p-next;(h-next)-next=NULL; h=h-next;elseh-next=q;q=q-next;(h-next)-next=NULL;h=h-next;if (p!=NULL)h-next=p;else if(q!=NULL)h-next=q;headClass1=NULL;headClass2=NULL;/ 打印合并链表cout 合并后的结果为:endl;printOut(head);/ 查找学生/ 此时只有head 合并为有

29、学生的,别的两个链表都是空的了。char no5;coutno;h=head;bool isFind=false;while (h-next!=NULL)h=h-next;if (strcmp(h-no,no)=0)coutno name performendl; isFind=true;break;if (!isFind)cout 无此学生endl;实验类与对象/linkedList.h#ifndef LINKEDLIST_H_#define LINKEDLIST_H_#include using namespace std;struct Node int data;Node *next;c

30、lass LinkedListpublic:LinkedList(void)/生成头结点,方便后面的操作 head=new Node; head-next=NULL;void readList(int num);/num表示在初始构造链表时,读入结点的个数int findByNo(int num);int findByData(int data);void insertData(int data,int num);void deleteData(int num);void printOut();private:Node *head;#endif/linkedList.cpp#include l

31、inkedList.hint LinkedList:findByNo(int num)int count=0;Node *p=head;while (p-next!=NULL) p=p-next;count+;if (count=num)return p-data;return 0;int LinkedList:findByData(int data) Node *p=head;int count=0;while (p-next!=NULL) p=p-next;count+;if (p-data=data)return count;return 0;/输入序号num和值data。在序号为num

32、的结点后插入data ,并输出该链表 void LinkedList:insertData(int data,int num)int count=0;Node *p=head;while (p-next!=NULL) p=p-next;count+;if (count=num)Node *q=new Node();q-data=data;q-next=p-next;p-next=q;printOut(); return;输入序号num,删除序号为num的结点,并输出该链表 void LinkedList:deleteData(int num)int count=0;Node *p=head-n

33、ext;Node *pre=head;while (p!=NULL)count+;if (count=num)/ 删除节点pre-next=p-next;delete p;printOut();return;elsepre=p;p=p-next;void LinkedList:printOut()Node *p=head-next;while (p!=NULL)coutdata;p=p-next;coutendl;void LinkedList:readList(int num) Node *p;Node *q=head;for (int i=0;ip-data;p-next=NULL;q-n

34、ext=p; q=q-next; /main.cpp#include using namespace std;#include linkedList.h void main()/int a6=21,23,25,27,29,31;int num;int data;LinkedList *pList=new LinkedList();coutreadList(6);coutprintOut();printf(请输入要查找的结点的序号(1-6):);cinnum;data=pList-findByNo(num);cout查找到的结点的值为 datadata;num=pList-findByData(

35、data);cout查找到的结点的序号为:numendl;coutnum;coutdata;pList-insertData(data,num);coutnum;pList-deleteData(num);实验继承与多态myShape.h#ifndef MYSHAPE_H_#define MYSHAPE_H_#include using namespace std;class shapepublic:virtual void area(void)=0;virtual void showarea(void)=0; protected:double m_area;class circlepubli

36、c shapepublic:circle(double r)radius=r;void area(void);void showarea(void);protected:double radius;class rectangle:public shapepublic:rectangle(double l=0,double w=0)length=l;width=w;void area(void);void showarea(void);protected:double length;double width;#endifmyShape.cpp#include myShape.hvoid circ

37、le:area(void)m_area=3.14*radius*radius;void rectangle:area(void)m_area=length*width;void circle:showarea(void)cout半径为radius的圆形面积为m_areaendl;void rectangle:showarea(void)cout长宽分另1J为width,length 的长方形面积为m_areaendl;/main.cpp#include myShape.h#include using namespace std;void main()shape *pShape;circle m

38、yCircle(1);rectangle myRectangle(2,3);pShape=&myCircle;pShape-area();pShape-showarea();pShape=&myRectangle;pShape-area();pShape-showarea();实验模板类和运算符重载模板类注:下面的程序假设用户输入都是正确的,即没有考虑用户输入错误数据的处理 /linkedList.h#ifndef LINKEDLIST_H_#define LINKEDLIST_H_#include using namespace std;templatestruct NodeT data;N

39、ode *next;template class LinkedList public: LinkedList(void)/生成头结点,方便后面的操作head=new Node(); head-next=NULL;void readList(int num);/num表示在初始构造链表时,读入结点的个数int findByNo(int num);int findByData(T data);void insertData(T data,int num);void deleteData(int num);void printOut(); private:Node *head; ;#endif/li

40、nkedList.cpp#include linkedList.h templateint LinkedList:findByNo(int num) int count=0;Node *p=head;while (p-next!=NULL) p=p-next;count+;if (count=num) return p-data;return 0;templateint LinkedList:findByData(T data)Node *p=head;int count=0;while (p-next!=NULL) p=p-next;count+;if (p-data=data) retur

41、n count;return 0;/输入序号num和值data。在序号为num的结点后插入data ,并输出该链表 templatevoid LinkedList:insertData(T data,int num)int count=0;Node *p=head;while (p-next!=NULL) p=p-next;count+;if (count=num)Node *q=new Node();q-data=data;q-next=p-next;p-next=q;printOut();return;输入序号num,删除序号为num的结点,并输出该链表 templatevoid Link

42、edList:deleteData(int num)int count=0;Node *p=head-next;Node *pre=head;while (p!=NULL)count+;if (count=num)/ 删除节点pre-next=p-next;delete p;printOut();return; elsepre=p;p=p-next;templatevoid LinkedList:printOut()Node *p=head-next;while (p!=NULL)coutdata; p=p-next;coutendl; templatevoid LinkedList:read

43、List(int num) Node *p;Node *q=head;for (int i=0;inum;i+)p=new Node();cinp-data;p-next=NULL;q-next=p;q=q-next; /main.cpp#include using namespace std;#include linkedList.h#include linkedList.cpp void main()/int a6=21,23,25,27,29,31;int num;char data;LinkedList *pList=new LinkedList();coutreadList(6);c

44、outprintOut();printf(请输入要查找的结点的序号(1-6):);cinnum;data=pList-findByNo(num);cout查找到的结点的值为 datadata;num=pList-findByData(data);cout查找到的结点的序号为:numendl;coutnum;coutdata;pList-insertData(data,num);coutnum;pList-deleteData(num);运算符重载注意:下面的代码可以在 VC6中运行。VC 6中有一个小bug。如果像以前一样 using name space std;那么就会出现错误,无法重载

45、,而如果代码在 VC7 (VS.net中运行是完全没 有问题的)下面仅仅给出一种能在VC6中运行的方案。还有另一种解决方法(实验指导书中的方案),就是将运算符 的重载的实现也写在类里面,而不是分开来(即声明和实现一起写在Time这个类中)在VC 6中,有bug ,两种解决方案方案一:使用std:cout ,可以将重载的 定义在类外,方案二:使用using namespace std; 但是,重载的 必须定义为内联的VS中都可以,没有问题/mytime.h#ifndef MYTIME_H_#define MYTIME_H_#include class Timeprivate:int hours;int minutes;public:Time();constructorTime(int h,int m=0);con

温馨提示

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

评论

0/150

提交评论