1、.实验 数组、结构体和函数综合编程练习1学生成绩统计从键盘输入一个班(全班最多不超过 30 人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:(1)统计不及格人数并打印不及格学生名单;(2)统计成绩在全班平均分及平均分之上的学生人数, 并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。注:将成绩分为六个分数段, 60 分以下为第 0 段,6069 为第 1 段,7079 为第2 段,8089 为第 3 段,9099为第 4 段,100 分为第 5 段。编程要求 :1. 较好的用户输入输出提示信息2. 使用子函数来实现上述各个功能, 并且要使用结构体数组来实现
2、, 该结构体中包括学生学号和成绩3. 最好不要使用全局变量#include #define ARR_SIZE 30typedef 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,
3、fail, aboveAver;Student 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=
4、0; in; i+)if (stui.score 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;/* 函数功能:统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单函数参数
5、:存放学生信息的 Student 结构体数组整型变量 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,(floa
7、t)stuLeveli/(float)n*100);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(Stude
9、nt stu,int n);void Print(Student stu,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);
10、 /* 计算总分和平均分 */printf(Before sort:n);Print(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 A VERn);printf(%8dt%4ldt
11、%4dt%4dt%4dt%5dt%5.0fn,pos+1,stupos.num, stupos.math,stupos.english,stupos.physics, stupos.sum,stupos.aver);elseprintf(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);sca
12、nf(%d, &stui.english);scanf(%d, &stui.physics);/* 函数功能:计算每个学生的总分和平均分函数参数: 结构体数组 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
13、,存放学生人数函数返回值:无*/void Sort(Student stu,int n)int 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|
14、 MT t EN t PH t SUM t A VERn);printf(-n);for (i=0; in; 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(Stud
15、ent stu,int n,long x)int i;for (i=0; in; i+)if (stui.num = x) return(i);return (-1);实验 递归程序设计求游戏人员的年龄4. 求游戏人员的年龄#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
16、,y;int gcdResult;printf( 输入要计算最大公约数的两个数: );scanf(%d%d,&x,&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
17、;void createList(Node *head,int num);int findByNo(Node *head,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
18、个结点的值: ;createList(head,6);coutnum;data=findByNo(head,num);cout 查找到的结点的值为 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+;i
19、f (count=num)return p-data;int findByData(Node *head,int data)Node *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
20、+;if (count=num)Node *q=new Node();q-data=data;q-next=p-next;p-next=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;elsepre=p
21、;p=p-next;void printOut(Node *head)Node *p=head-next;while (p!=NULL)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;实验 结构、链表综合编程注意:下面的代码用到了文件,但是学生编程并不要求使用文件【编写程序】:建立多个班级学生成绩链表,其中,每个结点包含下面这些信息:学号、姓名、成绩要求完成
22、下面的功能:1建立 2 个班学生成绩的无序链表,其中每个班包含 10 个结点数据(输入或从文件中读取每个同学的信息) ,将每个班的成绩链表按成绩高低排序后分别输出该链表;2将 2 个班级学生成绩合并(按成绩高低排序)后输出;3查找学生成绩:通过输入同学的学号,将该同学从链表中找出,并输出该同学信息;如果找不到,则输出“无此学生” 。/class1.txt101 a 56102 b 78103 c 69104 d 26105 e 60106 f 66107 g 70108 h 90109 i 92110 j 99/class2.txt201 aa 26202 bb 55203 cc 78204
23、dd 46205 ee 89206 ff 65207 gg 99208 hh 85209 ii 73210 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
24、*headClass1=new Node();q=headClass1;ifstream fin1(class1.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 文件
25、1 打开失败! endl;return;for (i=0;ip-nop-namep-perform;p-next=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-n
26、ame,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 班级 1 排序后数据为: next;temp=new Node();while (q!=NULL)temp-perform=q-perform;max=q;p=q-next;w
27、hile (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);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;del
28、ete temp;temp=NULL;cout 班级 2 排序后数据为: next;q=headClass2-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 合并后的结果
29、为: endl;printOut(head);/查找学生 -/此时只有 head 合并为有学生的,别的两个链表都是空的了。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 n
30、amespace std;struct Nodeint data;Node *next;class 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();priva
31、te:Node *head;#endif/linkedList.cpp#include linkedList.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)re
32、turn count;return 0;/输入序号 num 和值 data。在序号为 num 的结点后插入 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 LinkedLis
33、t: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;void LinkedList:printOut()Node *p=head-next;while (p!=NULL)coutdata;p=p-next;coutendl;void LinkedList:readList(int num)Node *p;Nod
34、e *q=head;for (int i=0;ip-data;p-next=NULL;q-next=p;q=q-next;/main.cpp#include using namespace std;#include linkedList.hvoid 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)
35、;cout 查找到的结点的值为 datadata;num=pList-findByData(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(
36、void)=0;protected:double m_area;class circle:public 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;#endif/myShape.cpp#include myShape.hvoid circle:area(void)m_area=3.14*radius*radius;void rectang