c语言用结构体编的学生成绩管理系统,有问题
每一条记录包含一个学生的学号、姓名、5门成绩、平均成绩、名次一次可以完成若干条记录的输入
完成全部学生信息的显示
完成按学号或者姓名查找学生信息并显示
按学生的平均成绩排序
------------------------------
求救 我想加个名次 这个好难啊 怎么办 我加了一个rank 就不知道怎么办了
------------------------------
#include<stdio.h>/*标准输入输出函数库*/
#include<malloc.h>//分配动态内存
#include<stdlib.h>/*标准函数库*/
#include<string.h>/*字符串函数库*/
typedef struct info//命名一个新的类型代表结构体类型
{
char studentNumber[10];
char studentName[20];
char className[20];
float grade1;
float grade2;
float grade3;
float grade4;
float grade5;
float sum;
float rank;
}info;//info为变量名
typedef struct STUDENT//命名一个新的类型代表结构体类型
{
info stu;
struct STUDENT *next;//*next可以指向 struct STUDENT 类型的变量或数组元素
}STUDENT;
STUDENT *headLink;//全局变量
/*以下是函数声明 */
void DisplayMenu(void);
void CreateHeadLink(void);//建立链表表头
STUDENT *MallocNode(void);
void GetInformation(STUDENT *t);//输入信息
void DisplayInfoBystudentName(void);//输入姓名显示学生信息
void DisplayInfoBystudentNumber(void);//输入学号显示学生信息
void DisplayOneNode(STUDENT *t);//显示节点信息
void InsertOneNode(STUDENT *t);//在链表结尾加入新节点
void DeleteNodeBystudentNumber(void);//按学号删除学生信息
void Print();//显示
int choose;/*用语接收用户的选择*///全局变量
/*主函数*/
void main()
{
CreateHeadLink();//链表
DisplayMenu();//显示菜单
}
void Print()//显示所有学生信息
{
STUDENT *t;
t=headLink->next;
while(t)
{
printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\名次\n\n");
DisplayOneNode(t);//调用
t=t->next;
}
return;
}
/*排序*/
void Sort()/*递减排序函数:入口参数:链表的头指针,为次链表中的排序函数*/
{
STUDENT *p,*q;
STUDENT temp;
p=q=(STUDENT*)malloc(sizeof(STUDENT));
p=headLink->next;
for(;p!=NULL;p=p->next)//类似冒泡法
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->stu.sum<q->stu.sum)
{
temp.stu=q->stu;
q->stu=p->stu;
p->stu=temp.stu;
}
}
}
Print();
return;
}
//函数功能,显示菜单
void DisplayMenu(void)
{
STUDENT *p;
printf("\t\t-----请选择相应选项-----\n\n");
printf("|\t\t\t 1 输出学生所有信息|\n");
printf("|\t\t\t 2 按学号查询|\n");
printf("|\t\t\t 3 按姓名查询|\n");
printf("|\t\t\t 4 增加学生|\n");
printf("|\t\t\t 5 删除学生|\n");
printf("|\t\t\t 6 排序结果并输出成绩|\n");
printf("|\t\t\t 0 退出|\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
Print();/*显示所有学生的信息*/
break;
case 2:
DisplayInfoBystudentName();
break;
case 3:
DisplayInfoBystudentNumber();
break;
case 4:
p=MallocNode();/*先申请一个新的节点*/
GetInformation(p);/*要求用户输入信息到新的节点中*/
InsertOneNode(p);/*将新节点加到链表中*/
break;
case 5:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 6:
Sort();break;
case 0:
exit(1);
default:
printf("请重新输入!\n");
break;
}
DisplayMenu();//递归调用
}
/*函数功能 建立链表表头*/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));//分配内存空间
headLink=p;
p->next=NULL;
}
//函数功能申请一个新节点
STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->stu.studentNumber[i]='\0';
for(i=0;i<20;i++)
p->stu.studentName[i]='\0';
for(i=0;i<20;i++)
p->stu.className[i]='\0';
p->stu.grade1=0.0;
p->stu.grade2=0.0;
p->stu.grade3=0.0;
p->stu.grade4=0.0;
p->stu.grade5=0.0;
p->stu.sum=0.0;
p->stu.rank=0.0;
p->next=NULL;
return p;
}
//函数功能 取得学生信息
void GetInformation(STUDENT *t)
{
printf("请输入学生学号:\n");
scanf("%s",t->stu.studentNumber);
printf("请输入学生的姓名:\n");
scanf("%s",t->stu.studentName);
printf("请输入学生的班级:\n");
scanf("%s",t->stu.className);
printf("请输入第一门成绩:\n");
scanf("%f",&(t->stu.grade1));
printf("请输入第二门成绩:\n");
scanf("%f",&(t->stu.grade2));
printf("请输入第三门成绩:\n");
scanf("%f",&(t->stu.grade3));
printf("请输入第四门成绩:\n");
scanf("%f",&(t->stu.grade4));
printf("请输入第五门成绩:\n");
scanf("%f",&(t->stu.grade5));
t->stu.sum=t->stu.grade1+t->stu.grade2+t->stu.grade3+t->stu.grade4+t->stu.grade5;
}
//在链表的结尾处加一个节点
void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
//函数的功能 根据用户输入的学生姓名显示该学生信息
void DisplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生的姓名;\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->stu.studentName,studentName)==0)
{
printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DisplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为%s 的学生\n",studentName);
}
//根据用户输入的学号显示该学生的信息
void DisplayInfoBystudentNumber(void)
{
STUDENT *p;
char studentNumber[10];
char flag=0;
p=headLink->next;
printf("请输入学生的学号\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->stu.studentNumber,studentNumber)==0)
{
printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DisplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为%s 的学生\n",studentNumber);
}
//输出一个节点的信息
void DisplayOneNode(STUDENT *t)
{
printf("%s\t",t->stu.studentNumber);
printf("%s\t",t->stu.studentName);
printf("%s\t",t->stu.className);
printf("%.2f\t",t->stu.grade1);
printf("%.2f\t",t->stu.grade2);
printf("%.2f\t",t->stu.grade3);
printf("%.2f\t",t->stu.grade4);
printf("%.2f\t",t->stu.grade5);
printf("%.2f\t",t->stu.sum);
printf("%.2f\t\n",(t->stu.sum)/5);
}
//根据用户输入的学号删除该学生
void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入你要删除的学号;");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->stu.studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("不存在该学生");
return;
}
printf("成功删除\n");
}