学生成绩管理系统 要求:可以求全班或单科的平均分,某个人的多门课的平均分。
#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();
}。
答:详情>>