学生成绩管理系统 要求:可以求全班或单科的平均分,某个人的多门课的平均分。
#include#include#include#include#define D "%d" #define F "%f" #define S scanf#define P printf#define OK 1#define ERROR 0#define NULL 0#define NC 3//每个学生课程总数typedef int Status;typedef int NUM;typedef float CHINESE;typedef float ENGLISH;typedef float MATH;typedef float EVE_Stusum;//EVE(everyone)type...全部
#include#include#include#include#define D "%d" #define F "%f" #define S scanf#define P printf#define OK 1#define ERROR 0#define NULL 0#define NC 3//每个学生课程总数typedef int Status;typedef int NUM;typedef float CHINESE;typedef float ENGLISH;typedef float MATH;typedef float EVE_Stusum;//EVE(everyone)typedef float AVE_Stu;//AVE(average)每个学生平均分typedef float AVE_Course;//每门课平均分typedef struct LNode{//定义结点 NUM num; CHINESE ch; MATH math; ENGLISH eng; EVE_Stusum sum;//每个学生总分 AVE_Stu ave;//每个学生平均分 struct LNode *next;}LNode,*LinkList;typedef struct{ AVE_Course av_ch; AVE_Course av_math; AVE_Course av_eng;}*Average,AVENode;void CreatList_L(LinkList &L){//建立链表 LinkList p=NULL,p1=NULL;//p用来指向每一个新建立的结点,,p1做记录 p1=L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;//头结点 P("----请输入各学生学号和成绩(学号为零则输入截止)----
"); p=(LinkList)malloc(sizeof(LNode)); P("请输入第一位学生学号:
"); S(D,&p->num); P("请输入分数:
"); P("----语文 数学 英语(空格隔开)----
"); S("%f%f%f",&p->ch,&p->math,&p->eng); while(p->num) { p1->next=p; p1=p; p=(LinkList)malloc(sizeof(LNode)); P("请输入下一位学生学号:
"); S(D,&p->num); if(p->num==0) break;//学号为0则输入结束 P("请输入分数:
"); P("----语文 数学 英语----
"); S("%f%f%f",&p->ch,&p->math,&p->eng); } p1->next=NULL;}int Length_L(LinkList L)//求出带头结点的链表中除头结点外其余结点的数目{ LinkList p=L; int i=0; while(p->next) { p=p->next; i ; }return i;}Status GetNumI_L(LinkList &L,NUM num2){//在带头节点的链表中找出num2所在的位序,头结点后第一个结点为1,后依次为2,3,4。
。。。。。。 int i=1; LinkList p=L->next;//此时p指向头结点后第一个结点 while(p&&p->num!=num2) { p=p->next; i ; } if(!p) {P("没找到该学号--——
");return ERROR; } return i;}Status ListDelete_L(LinkList &L,int i){//在带头结点的单链表中删除第i个元素 LinkList p=L,q=NULL; int j=0; while(p->next&&jnext; j ; } q=p->next; p->next=q->next; free(q); return OK;}Status ListInsert_L(LinkList &L){//在带头结点的L学号顺序存放链表中插入新的学生信息 LinkList p=L,s=NULL,p1=NULL; p1=p=p->next; s=(LinkList)malloc(sizeof(LNode)); P("
---请输入想要插入的学生信息---
"); P(" 请输入学号:
"); S(D,&s->num); P("请输入分数:
"); P("----语文 数学 英语----
"); S("%f%f%f",&s->ch,&s->math,&s->eng); if(s->numnum){L->next=s;s->next=p;return OK;} while(p&&s->num>=p->num) {p1=p;p=p->next;} p1->next=s; s->next=p; return OK;}Status EveryStu_Sum(LinkList &L){//求每个学生总分 LinkList p=L; p=p->next; while(p) { p->sum=p->ch p->eng p->math; p=p->next; }return OK;}Status EveryStu_EVE(LinkList L){//求每个学生平均分 LinkList p=L; p=p->next; while(p) { p->ave=(p->ch p->eng p->math)/NC; p=p->next; } return OK;} Status AVE_Every(LinkList L,Average PJF){//求每门课平均分,存放在PJF所指结点 LinkList p=L; int i=Length_L(L); float sum1=0,sum2=0,sum3=0; p=p->next; while(p){ sum1 =p->ch; sum2 =p->math; sum3 =p->eng; p=p->next; } PJF->av_ch=sum1/i; PJF->av_math=sum2/i; PJF->av_eng=sum3/i; return OK;}Status TheMaxAVE(LinkList L){//找出平均分最高的学生 LinkList p=L; LinkList p1=p; p=p->next; float max=0; while(p) { if((p->ave)>max) {max=p->ave;p1=p;} p=p->next; } p=p1; P("平均分最高的学生学号为:%d 平均分:%4。
2f
",p->num,p->ave); return OK;}Status Max_Every(LinkList L){//找出每门成绩最高分 LinkList p=L,p1=L,p2=L,p3=L; p=p->next; float max1=0,max2=0,max3=0; while(p) { if(p->ch>max1){max1=p->ch;p1=p;} if(p->math>max2){max2=p->math;p2=p;} if(p->eng>max3){max3=p->eng;p3=p;} p=p->next; }P("
语文最高:
学号:%d 成绩:%4。
2f
",p1->num,p1->ch);P("数学最高:
学号:%d 成绩:%4。2f
",p2->num,p2->math);P("英语最高:
学号:%d 成绩:%4。2f
",p3->num,p3->eng);return OK;}Status Min_Every(LinkList L){//找出每门成绩最低分 LinkList p=L,p1=L,p2=L,p3=L; p=p->next; float min1=101,min2=101,min3=101; while(p) { if(p->chch;p1=p;} if(p->mathmath;p2=p;} if(p->engeng;p3=p;} p=p->next; }P("
语文最低:
学号:%d 成绩:%4。
2f
",p1->num,p1->ch);P("数学最低:
学号:%d 成绩:%4。2f
",p2->num,p2->math);P("英语最低:
学号:%d 成绩:%4。2f
",p3->num,p3->eng);return OK;}void PrintAVE_EvryCourse(Average PJF){//打印每门课平均分 P(" 语文平均 数学平均 英语平均
"); P(" %4。
2f %4。2f %4。2f
",PJF->av_ch,PJF->av_math,PJF->av_eng); P("
");}void Print_Sum(LinkList L){//打印每个学生总分 LinkList p=L; p=p->next; P(" 学号 总分
" ); while(p) { P(" %d %4。
2f
",p->num,p->sum); p=p->next; }}void PrintEveryStu_EVE(LinkList L){//打印每个学生平均分 LinkList p=L; p=p->next; P(" 学号 平均分
"); while(p) { P(" %d %4。
2f
",p->num,p->ave); p=p->next; }}void Print_L(LinkList L){//打印链表中所有元素 LinkList p=L; p=p->next; P(" ------学生信息如下-----
"); P(" 学号 成绩
"); P(" -----------------------------------------
"); P(" || | 语文 数学 英语 ||
"); P(" -----------------------------------------
"); while(p) { P(" ||%d | %4。
2f %4。2f %4。
2f||
",p->num,p->ch,p->math,p->eng); p=p->next; } P(" -----------------------------------------
");}void menu(){//打印菜单 P("
------请选择操作------
"); P(" **********MENU*********
"); P(" ||0---统计学生总数-- ||
"); P(" ||1---插入学生成绩---||
"); P(" ||2---删除学生成绩---||
"); P(" ||3---求每个学生总分-||
"); P(" ||4---求每学生平均分-||
"); P(" ||5---求每门课平均分-||
"); P(" ||6---平均分最高学生-||
"); P(" ||7---每门最高低分---||
"); P(" ||8---退出-----------||
"); P(" ***********************
");}void main(){ LinkList L;//L指向链表头结点; Average PJF;//PJF指向存放平均分的一个结点 PJF=(Average)malloc(sizeof(AVENode));//为存放各科平均分分配一块空间 NUM num1=0,num0=0; int i=0; char ch=0,cho=0; CreatList_L(L); Print_L(L); while(1) { menu(); P(" your choice:"); cho=getche();//选择操作 P("
"); switch(cho) { case '0': P("学生总数为:%d
",Length_L(L)); break; case '1': while(1) { ListInsert_L(L); Print_L(L); P("---q键退出上一层菜单,其他任意键继续---
"); ch=getche(); if(ch=='q'||ch=='Q')break; } break; case '2': while(1) { P("请输入要删除的学号:
"); S(D,&num1); i=GetNumI_L(L,num1); if(i==0) continue; else ListDelete_L(L,i); Print_L(L); P("---q键退出上一层菜单,其他任意键继续---
"); ch=getche(); if(ch=='q'||ch=='Q')break; } break; case '3': EveryStu_Sum(L);//每个学生总分函数 Print_Sum(L);//打印每个学生总分函数 break; case '4': EveryStu_EVE(L);//求每个学生平均分 PrintEveryStu_EVE(L);//打印每个学生平均分 break; case '5': AVE_Every(L,PJF); PrintAVE_EvryCourse(PJF); break; case '6': EveryStu_EVE(L); TheMaxAVE(L);break; case '7': Max_Every(L); Min_Every(L); break; case '8':exit(0); default:P("请重新选择:
");break; } }getch();}。收起