记一次课程设计作业 学生成绩管理系统#include
#include
#include
#include
/*
学生成绩管理系统介绍
2017C语言课程设计 202160936
1.支持将数据保存到文件并从文件中读取已有数据
2.支持添加、删改数据
3.支持按学号或姓名查询、删除、修改数据
4.支持简单统计,包括 不及格人数、最高分、最低分
5.支持按总分排序整理数据
*/
struct student
{
char num[10];
char name[20];
int cgrade;
int sxgrade;
int yygrade;
int total;
float ave;
};
struct node
{
struct student data;
struct node *next;
}*head,*last;
int Add(int i)//执行增加学生记录操作
{
struct node *tmp;
int loop=1;
while (loop)
{
printf("请按以下格式输入数据:\n");
tmp=(struct node *)malloc(sizeof (struct node));
printf("学号姓名 C语言成绩 数学成绩 英语成绩\n");
scanf("%s %s %d %d %d",tmp->data.num,tmp->data.name,&tmp->data.cgrade,&tmp->data.sxgrade,&tmp->data.yygrade);
tmp->data.total=tmp->data.cgrade+tmp->data.sxgrade+tmp->data.yygrade;
tmp->data.ave=tmp->data.total/3.0;
if (last!=NULL)
{
last->next=tmp;
last=last->next;
}
else
{
head=last=tmp;
}
last->next=NULL;
i++;
printf("添加成功!输入1继续录入,输入0终止录入 ");
int t;
scanf("%d",&t);
if (t==0)
loop=0;
}
return i;
}
int Del(int i)//执行删除学生记录操作
{
char tmpname[20];
char tmpnum[10];
int find=0,way;
struct node *tmp=head,*tmpbak=head;
printf("请选择删除依据: 1.学号 2.姓名 \n ");
scanf("%d",&way);
switch (way)
{
case 1:printf("请输入学号:");
scanf("%s",tmpnum);
while ((tmp!=NULL)&&(!find))
{
if (!strcmp(tmpnum,tmp->data.num))
{
find=1;
break;
}
tmpbak=tmp;
tmp=tmp->next;
}
if (!find)
{
printf("抱歉,学号 %s未查到相关数据!\n",tmpnum);
}
else
{
if (tmpbak==tmp)
{
head=head->next;
printf("删除成功!\n");
i--;
return i;
}
else
{
tmpbak->next=tmp->next;
printf("删除成功!\n");
i--;
return i;
}
}
case 2:printf("请输入姓名:");
scanf("%s",tmpname);
while ((tmp!=NULL)&&(!find))
{
if (!strcmp(tmpname,tmp->data.num))
{
find=1;
break;
}
tmpbak=tmp;
tmp=tmp->next;
}
if (!find)
{
printf("抱歉,姓名 %s未查到相关数据!\n",tmpname);
}
else
{
if (tmpbak==tmp)
{
head=head->next;
printf("删除成功!\n");
i--;
return i;
}
else
{
tmpbak->next=tmp->next;
printf("删除成功!\n");
i--;
return i;
}
}
default:printf("选择错误,查询失败!\n");
}
}
void Edit(struct node* tmp)//执行修改学生记录操作
{
printf("请输入修改后的信息:\n");
printf("学号姓名 C语言成绩 数学成绩 英语成绩\n");
scanf("%s %s %d %d %d",tmp->data.num,tmp->data.name,&tmp->data.cgrade,&tmp->data.sxgrade,&tmp->data.yygrade);
tmp->data.total=tmp->data.cgrade+tmp->data.sxgrade+tmp->data.yygrade;
tmp->data.ave=tmp->data.total/3.0;
printf("修改成功! \n");
printf("*************************************\n");
}
void Query()//执行查询学生记录操作
{
char tmpname[20];
char tmpnum[10];
int find=0,way,change=0;
struct node *tmp=head;
printf("请选择查询方式: 1.学号 2.姓名 \n ");
scanf("%d",&way);
switch (way)
{
case 1:printf("请输入学号:");
scanf("%s",tmpnum);
while ((tmp!=NULL)&&(!find))
{
if (!strcmp(tmpnum,tmp->data.num))
{
find=1;
printf("找到以下数据!\n");
printf("学号姓名 C语言成绩 数学成绩 英语成绩 总分 平均分 \n");
printf("%s %s%d%d%d%d%.2f \n",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
printf("*************************************\n");
printf("是否修改数据? 输入1修改,输入0取消 ");
scanf("%d",&change);
if (change)
Edit(tmp);
}
tmp=tmp->next;
}
if (!find)
{
printf("抱歉,学号 %s未查到相关数据!\n",tmpnum);
}
break;
case 2:printf("请输入姓名:");
scanf("%s",tmpname);
while ((tmp!=NULL)&&(!find))
{
if (!strcmp(tmpname,tmp->data.name))
{
find=1;
printf("找到以下数据!\n");
printf("学号姓名 C语言成绩 数学成绩 英语成绩 总分 平均分 \n");
printf("%s %s%d%d%d%d%.2f \n",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
printf("*************************************\n");
printf("是否修改数据? 输入1修改,输入0取消 ");
scanf("%d",&change);
if (change)
Edit(tmp);
}
tmp=tmp->next;
}
if (!find)
{
printf("抱歉,姓名 %s未查到相关数据!\n",tmpname);
}
break;
default:printf("选择错误,查询失败!\n");
}
}
void Tongji()//执行统计学生记录操作
{
struct node *tmp=head;
int cbjg=0,sxbjg=0,yybjg=0,avebjg=0,cmax=0,sxmax=0,yymax=0,avemax=0,cmin=100,sxmin=100,yymin=100,avemin=100;
printf("正在统计数据,请稍候...\n");
while (tmp!=NULL)
{
if (tmp->data.cgrade<60)
cbjg++;
if (tmp->data.cgrade>cmax)
cmax=tmp->data.cgrade;
if (tmp->data.cgrade
cmin=tmp->data.cgrade;
if (tmp->data.sxgrade<60)
sxbjg++;
if (tmp->data.sxgrade>sxmax)
sxmax=tmp->data.sxgrade;
if (tmp->data.sxgrade
sxmin=tmp->data.sxgrade;
if (tmp->data.yygrade<60)
yybjg++;
if (tmp->data.yygrade>yymax)
yymax=tmp->data.yygrade;
if (tmp->data.yygrade
yymin=tmp->data.yygrade;
if (tmp->data.ave<60)
avebjg++;
if (tmp->data.ave>avemax)
avemax=tmp->data.ave;
if (tmp->data.ave
avemin=tmp->data.ave;
tmp=tmp->next;
}
printf("****************************\n统计完成,数据如下:\n");
printf("C语言不及格人数:%d 最高分:%d 最低分:%d \n",cbjg,cmax,cmin);
printf("数学不及格人数:%d 最高分:%d 最低分:%d \n",sxbjg,sxmax,sxmin);
printf("英语不及格人数:%d 最高分:%d 最低分:%d \n",yybjg,yymax,yymin);
printf("平均分不及格人数:%d 最高分:%d最低分:%d \n",avebjg,avemax,avemin);
printf("**********************************\n");
}
void Sort(int n)//执行按降序进行排列学生记录的操作
{
int i,j;
struct node *tmp=head,*tmpbak=head->next,*bak;
bak=(struct node *)malloc(sizeof (struct node));
for(i = 0; i
{
for(j = 0; i + j
{
if(tmpbak->data.total> tmp->data.total)
{
bak->data =tmp->data;
tmp->data = tmpbak->data;
tmpbak->data = bak->data;
}
tmp=tmp->next;
tmpbak=tmpbak->next;
}
tmp=head;
tmpbak=head->next;
}
printf("排序完成!\n");
}
int Save()//执行存盘操作stuinfo.dat
{
if(!head) return 0;
FILE *fp=fopen("stuinfo.dat","wb");
int i=0;
while(head)
{
fwrite(&head->data,sizeof(student),1,fp);
i++;
head=head->next;
}
fclose(fp);
return i;
}
int load() //从文件stuinfo.dat中载入数据
{
FILE *fp=fopen("stuinfo.dat","rb");
if(!fp)
{
printf("Can not open the file!\n");
return 0;
}
struct node *tmp;
fseek(fp,0,SEEK_END);
long end=ftell(fp);
fseek(fp,0,SEEK_SET);
int i=0;
if(ftell(fp)==end)
{
printf("无记录!\n");
return 0;
}
while(ftell(fp)!=end)
{
tmp=(struct node*)malloc(sizeof(struct node));
tmp->next=NULL;
fread(&tmp->data,sizeof(struct student),1,fp);
i++;
if (last!=NULL)
{
last->next=tmp;
last=last->next;
}
else
{
head=last=tmp;
}
last->next=NULL;
}
fclose(fp);
return i;
}
void Display()//执行将学生记录以表格形式打印输出至屏幕的操作
{
struct node *tmp=head;
printf("学号姓名 C语言成绩 数学成绩 英语成绩 总分 平均分 \n");
while (tmp!=NULL)
{
printf("%s %s%d%d%d%d%.2f",tmp->data.num,tmp->data.name,tmp->data.cgrade,tmp->data.sxgrade,tmp->data.yygrade,tmp->data.total,tmp->data.ave);
tmp=tmp->next;
printf("\n");
}
}
void Wrong()//给出按键错误提示
{
printf("输入错误,请重新输入! \n");
}
int Quit()//存盘且退出
{
Save();
return 0;
}
int Menu()//操作选单
{
int i;
printf("========================================================\n");
printf("欢迎使用学生成绩管理系统!\n");
printf(" 0: 存盘并退出\n");
printf(" 1:增加学生记录\n");
printf(" 2:删除学生记录\n");
printf(" 3:查询/修改学生记录\n");
printf(" 4:统计学生记录\n");
printf(" 5:按降序进行排列学生记录\n");
printf(" 6:将学生记录以表格形式打印输出至屏幕\n");
printf("========================================================\n");
printf("请选择你需要的操作:");
scanf("%d",&i);
printf("\n");
return i;
}
void main()
{
int i,choice,loop=1;
i=load();
printf("从stuinfo.dat导入了%d条数据\n\n",i);
while (loop)
{
choice=Menu();
switch (choice)
{
case 0:loop=Quit();break;
case 1:i=Add(i);break;
case 2:i=Del(i);break;
case 3:Query();break;
case 4:Tongji();break;
case 5:Sort(i);break;
case 6:printf("共有%d条数据!\n",i);Display();break;
default:Wrong();
}
}
}