学生成绩管理系统求解释
#include <stdio.h>#include<stdlib.h>
#define MAXSIZE 100
#include<string.h>
struct stu
{
unsigned long int number;
char name[30];
float score[3];
float aver_score;
float total_score;
};
typedef struct stu DATATYPE;//定义一个名为DATATYPE的新的结构体类型
typedef struct tagLINKLIST//定义一个名为tagLINKLIST的数据类型
{
DATATYPE elem[MAXSIZE];//定义一个DATATYPE类型的名为elem的数组(含有100个元素)
int length;//--------------------------------------------------------------这里就是我不懂的地方----------------------------------------------
}LINKLIST;//定义一个名为LINKLIST的结构体类型
LINKLIST Student;//定义一个LINKLIST类型的名为Student的变量
int ListIsFull(void)
{
return (Student.length >= MAXSIZE)?1:0;//---------------------------------------------length怎么用-------------------------------------------
}
int AddSTU(void)
{
int i;
struct stu temp;//定义一个stu类型的名为temp的结构体变量
printf("***************************************************************\n");
printf("********** 请输入学生的学号:");
scanf("%ld",&temp.number);
printf("********** 请输入学生的姓名:");
scanf("%s",&temp.name);
printf("********** 请输入学生的三科成绩:\n");
printf("**********\t\t语文:");
scanf("%f",&temp.score[0]);
printf("**********\t\t数学:");
scanf("%f",&temp.score[1]);
printf("**********\t\t英语:");
scanf("%f",&temp.score[2]);
temp.total_score = temp.score[0] + temp.score[1] + temp.score[2];
temp.aver_score = temp.total_score/3;
if(ListIsFull()) // 如果表格是满的
{
return 1;
}
for(i=0;i<Student.length;i++)//查找学号是否重复//----------------Student.length应该有值才对,但我没发现它们的值---------------------------------
{
if(Student.elem[i].number == temp.number)
{
return 2;
}
}
Student.elem[Student.length] = temp;//添加学生
Student.length++;//---------------------------这里三行的代码的作用我也不明白,尤其是这个自增运算符,具体有什么用?----------------------------------
return 0;
}
int chaxun(void)
{
int i,j=0,menu1;
unsigned long int t;
char name[20];
printf("***************************************************************\n");
printf("********** 请选择要查询学员的 1:学号 2:名字 *************\n");
scanf("%d",&menu1);
if(menu1==1)
{
printf("***************************************************************\n");
printf("请输入学员的学号:");
scanf("%ld",&t);
for(i=0;i<Student.length;i++)
{
if(Student.elem[i].number == t)
{
printf("***************** %-6s的信息为: ****************************\n",Student.elem[i].name);
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 \n");
printf("%-10ld %-16s",Student.elem[i].number,Student.elem[i].name);
printf("%-5.2f %-5.2f ",Student.elem[i].score[0],Student.elem[i].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[i].score[2],Student.elem[i].aver_score);
printf("%-5.2f \n",Student.elem[i].total_score);
printf("***************************************************************\n");
return 0;
}
}
return 1;
}
else if(menu1==2)
{
printf("***************************************************************\n");
printf("请输入学员的名字:");
scanf("%s",name);
for(i=0;i<Student.length;i++)//---------------------------------这个for循环用到了Student.length后我瞬间崩溃了,看不懂
{
for(j=0;j<sizeof(name);j++)
{
if(Student.elem[i].name[j] != name[j])
{
return 1;
}
else
{
printf("************* %-6s的信息为: ********************************\n",Student.elem[i].name);
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 \n");
printf("%-10ld %-16s",Student.elem[i].number,Student.elem[i].name);
printf("%-5.2f %-5.2f ",Student.elem[i].score[0],Student.elem[i].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[i].score[2],Student.elem[i].aver_score);
printf("%-5.2f \n",Student.elem[i].total_score);
printf("***************************************************************\n");
return 0;
}
}
}
return 1;
}
else
{
printf("**************** 选择错误! 请重新选择!*********************");
}
return 1;
}
int chaxun1(void)
{
int i,j=0,menu1;
unsigned long int t;
char name[20];
printf("***************************************************************\n");
printf("********** 请选择要查询学员的 1:学号 2:名字 *************\n");
scanf("%d",&menu1);
if(menu1==1)
{
printf("***************************************************************\n");
printf("请输入学员的学号:");
scanf("%ld",&t);
for(i=0;i<Student.length;i++)//----------------------------------这个for循环也看不懂---------------------------------------
{
if(Student.elem[i].number == t)
{
printf("*************** %-6s的平均分和总分 **************************\n",Student.elem[i].name);
printf("\t平均分=%-5.2f\t",Student.elem[i].aver_score);
printf("\t总 分=%-5.2f\n",Student.elem[i].total_score);
printf("***************************************************************\n");
return 0;
}
}
return 1;
}
else if(menu1==2)
{
printf("***************************************************************\n");
printf("请输入学员的名字:");
scanf("%s",name);
for(i=0;i<Student.length;i++)//------------------------一样看不懂-----------------------------
{
for(j=0;j<sizeof(name);j++)
{
if(Student.elem[i].name[j] != name[j])
{
return 1;
}
else
{
printf("************* %-6s的信息为: ********************************\n",Student.elem[i].name);
printf("\t平均分=%-5.2f\t",Student.elem[i].aver_score);
printf("\t总 分=%-5.2f\n",Student.elem[i].total_score);
printf("***************************************************************\n");
return 0;
}
}
}
return 1;
}
else
{
printf("**************** 选择错误! 请重新选择!*********************");
}
return 1;
}
int DeleteList(void)
{
int i,j=0,menu1;
unsigned long int t;
char name[20];
printf("***************************************************************\n");
printf("********* 请选择输入待删除学员的 1:学号 2:名字 **********\n");
scanf("%d",&menu1);
switch(menu1)
{
case 1:{
printf("***************************************************************\n");
printf("请输入待删除学员的学号:");
scanf("%ld",&t);
for(i=0;i<Student.length;i++)
{
if(Student.elem[i].number == t)
{
printf("********** 待删除的学员%-6s的信息为: ***********************\n",Student.elem[i].name);
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 \n");
printf("%-10ld %-16s",Student.elem[i].number,Student.elem[i].name);
printf("%-5.2f %-5.2f ",Student.elem[i].score[0],Student.elem[i].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[i].score[2],Student.elem[i].aver_score);
printf("%-5.2f \n",Student.elem[i].total_score);
printf("***************************************************************\n");
for(j=i;j<Student.length;j++)//删除
Student.elem[j]=Student.elem[j+1];
Student.length--;//---------------------------------------这个删除怎么实现?----------------------------
return 0;
}}
}
}
case 2:{printf("***************************************************************\n");
printf("请输入待删除学员的名字:");
scanf("%s",name);
for(i=0;i<Student.length;i++)//----------------------------------求解释---------------------------------------------
{
for(j=0;j<sizeof(name);j++)//-------这里用name的长度做啥?
{
if(Student.elem[i].name[j] != name[j])
{
return 1;
}
else
{
printf("********** 待删除的学员%-6s的信息为: ***********************\n",Student.elem[i].name);
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 \n");
printf("%-10ld %-16s",Student.elem[i].number,Student.elem[i].name);
printf("%-5.2f %-5.2f ",Student.elem[i].score[0],Student.elem[i].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[i].score[2],Student.elem[i].aver_score);
printf("%-5.2f \n",Student.elem[i].total_score);
printf("***************************************************************\n");
//删除
for(i;i<Student.length;i++)
Student.elem[i]=Student.elem[i+1];
Student.length--;
return 0;
}
}
}
return 1;
}
return 1;
}
}
int print(void)
{
int i;
printf("********* 根据总分进行降序排列,并输出所有学员的信息 ********\n");
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 名次\n");
for(i=0;i<Student.length;i++)
{
printf("%-10ld %-16s",Student.elem[i].number,Student.elem[i].name);
printf("%-5.2f %-5.2f ",Student.elem[i].score[0],Student.elem[i].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[i].score[2],Student.elem[i].aver_score);
printf("%-5.2f %d\n",Student.elem[i].total_score,i+1);
}
printf("***************************************************************\n");
printf("\n");
return 0;
}
void paixu(int n)
{
int i,j;
struct stu t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(Student.elem[j].total_score<Student.elem[j+1].total_score) //根据总分进行降序排列
{
t=Student.elem[j];
Student.elem[j]=Student.elem[j+1];
Student.elem[j+1]=t;
}
}
}
}
int main(void)
{
int i,menu;
int flag;
printf("*******************************************************************************\n");
printf("********** 功能: \n");
printf("********** 1.增加学生 \n");
printf("********** 2.查询每个学员的平均成绩和总分,并输出\n");
printf("********** 3.显示总分最高的学生信息 \n");
printf("********** 4.根据总分进行降序排列,并输出所有学员的信息***********************\n");
printf("********** 5.查询某个学生的信息\n");
printf("********** 6.删除一个学生\n");
printf("********** 0.退出 \n");
printf("*******************************************************************************\n");
while(1)
{
scanf("%d",&menu);
switch(menu)
{
case 1:{
flag = AddSTU();
if(flag==0)
{
printf("******************** 添加学员成功! ****************************\n");
}
else if(flag==1)
{
printf("******************* 系统已满! *********************************\n");
}
else if(flag==2)
{
printf("******************* 学号重复! *********************************\n");
}
};break;
case 2:{
chaxun1();
};break;
case 3:{
i=Student.length;
paixu(i);
printf("************* 总分最高的学生信息: ****************************\n",i);
printf(" 学 号 姓 名 语文 数学 英语 平均分 总分 \n");
printf("%-10ld %-16s",Student.elem[0].number,Student.elem[0].name);
printf("%-5.2f %-5.2f ",Student.elem[0].score[0],Student.elem[0].score[1]);
printf("%-5.2f %-5.2f ",Student.elem[0].score[2],Student.elem[0].aver_score);
printf("%-5.2f \n",Student.elem[0].total_score);
printf("***************************************************************\n");
};break;
case 4:{
i=Student.length;
paixu(i);
print();
};break;
case 5:{
flag=chaxun();
if(flag == 0)
{
printf("******************** 查询学员成功! ****************************\n");
}
else if(flag == 1)
{
printf("******************* 查询的信息不存在! *************************\n");
fflush(stdin);// 清空输入缓冲区
}
}break;
case 6:{
flag=DeleteList();
if(flag == 0)
{
printf("******************** 删除学员成功! ****************************\n");
}
else if(flag == 1)
{
printf("******************* 要删除的信息不存在! ***********************\n");
fflush(stdin);// 清空输入缓冲区
}
}break;
case 0:{
printf("*************** 信息录入完毕!按任意键退出!*******************\n");
exit(0);
}break;
default:{
printf("*************** 选择错误!请重新选择!*************************\n");
fflush(stdin);// 清空输入缓冲区
}break;
}
}
return 0;
}