学生成绩管理系统
在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号、姓名、各科名称和成绩等
并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找、浏览、插入、排序、保存。
要求:
1、提供用户界面
2、每一条记录包括一个学生的学号、姓名、三门课成绩、平均成绩
3、输入功能:可以一次完成若干条记录的输入
4、显示功能:完成全部学生记录的显示
5、查找功能:完成按姓名查找学生记录,并显示
6、排序功能:按学生平均成绩进行排序
7、插入功能:按平均成绩高低插入一条学生记录
8、将学生记录存在文件score中
需要的知识点:
数组,结构体,指针,文件,动态分配内存
——————————————————————————代码——————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void menu();
void select();
void input();
int line_number(FILE *a); // 统计文件行数
void output_all(); // 输出全部数据
void search();
void sort();
void write_file(struct student *p,int n); //重新将数据写入文件
struct student import();
void insert();
int flag1 = 1;
struct student
{
int sutdentID;
char name[20];
int ChineseScore;
int MathScore;
int EnglishScore;
float AVScroe; //平均成绩
};
int main()
{
printf("***********学生成绩管理系统*******************\n");
while(flag1)
{
select();
}
return 0;
}
void menu()
{
printf("**********************************************\n");
printf("**************** MENU ************************\n");
printf("* 1.输入 2.显示全部学生成绩 *\n");
printf("* 3.查找 4.排序 *\n");
printf("* 5.插入 0.退出 *\n");
printf("* *\n");
printf("**********************************************\n");
}
void select()
{
int CH;
menu();
printf("请输入你的选择:");
scanf("%d",&CH);
while(CH<0 || CH >5) //判断输入是否正确
{
printf("__________________________________________\n");
printf("输入错误,请重新选择\n");
menu();
scanf("%d",&CH);
}
switch (CH)
{
case 1: // 输入
input();
break;
case 2: // 显示全部学生成绩
output_all();
break;
case 3: //查找
search();
break;
case 4: // 排序
sort();
break;
case 5: // 插入
insert();
break;
case 0: //退出
flag1 = 0;
break;
default:
break;
}
}
struct student import()
{
struct student a;
printf("请输入学号:");
scanf("%d",&a.sutdentID);
printf("姓名:");
scanf("%s",a.name);
printf("语文成绩:");
scanf("%d",&a.ChineseScore);
printf("数学成绩:");
scanf("%d",&a.MathScore);
printf("英语成绩:");
scanf("%d",&a.EnglishScore);
a.AVScroe = ((float)a.ChineseScore + (float)a.EnglishScore + (float)a.MathScore) / 3; //计算平均成绩
printf("您输入的学生数据为:\n");
printf("ID\tname\tChinese\tMath\tEnglish\tAVE\n");
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",a.sutdentID,a.name,a.ChineseScore,a.MathScore,a.EnglishScore,a.AVScroe);
return a;
}
void input()
{
FILE *fp;
struct student a;
int flag = 1;
int f;
if((fp = fopen("score.txt","a+")) == NULL)
{
printf("error");
}
while(flag)
{
a = import();
printf("确认请输入1,修改请输入0:");
scanf("%d",&f);
while(f!=1 && f!= 0)
{
printf("输入错误,请重新输入");
scanf("%d",&f);
}
if(f == 1)
flag = 0;
printf("\n");
}
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%.2f\n",a.sutdentID,a.name,a.ChineseScore,a.MathScore,a.EnglishScore,a.AVScroe);
fclose(fp);
}
int line_number(FILE *a) // 统计文件行数
{
int n;
char ch;
n = 0;
while((ch = fgetc(a)) != EOF)
{
if(ch == '\n')
n ++;
}
rewind(a); //重新定位文件指向文件开头
return n;
}
void output_all() // 输出全部数据
{
FILE *fp;
int n;
int i;
struct student *p;
if((fp = fopen("score.txt","r")) == NULL) //open the file
{
printf("打开文件失败\n");
exit(0);
}
n = line_number(fp); //检测文件行数
printf("\n*******共计%d名学生***********\n",n);
p = (struct student *)malloc(n *(sizeof(struct student)));
if(p == NULL)
printf("内存分配失败\n");
printf("ID\tname\tChinese\tMath\tEnglish\tAve\n");
for(i=0;i<n;i++)
{
if(fscanf(fp,"%d%s%d%d%d%f\n",&p[i].sutdentID,p[i].name,&p[i].ChineseScore,&p[i].MathScore,&p[i].EnglishScore,&p[i].AVScroe) == EOF)
printf("error");
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[i].sutdentID,p[i].name,p[i].ChineseScore,p[i].MathScore,p[i].EnglishScore,p[i].AVScroe);
}
printf("\n");
fclose(fp);
free(p);
}
void search()
{
FILE *fp;
int n;
int i,j;
int choose;
int ID;
int flag=0;
struct student *p;
char name[20];
if((fp = fopen("score.txt","r")) == NULL) //open the file
{
printf("打开文件失败\n");
exit(0);
}
n = line_number(fp); //检测文件行数
p = (struct student *)malloc(n *(sizeof(struct student)));
if(p == NULL)
printf("内存分配失败\n");
for(i=0;i<n;i++)
{
if(fscanf(fp,"%d%s%d%d%d%f\n",&p[i].sutdentID,p[i].name,&p[i].ChineseScore,&p[i].MathScore,&p[i].EnglishScore,&p[i].AVScroe) == EOF)
printf("error");
}
fclose(fp);
printf("\n*************查询****************\n");
printf("* 1.按姓名 2.按学号 *\n");
printf("*********************************\n");
printf("请输入你的选择:");
scanf("%d",&choose);
while(choose != 1 && choose !=2)
{
printf("输入错误,请重新输入:");
scanf("%d",&choose);
}
switch (choose)
{
case 1: //按姓名查询
printf("请输入学生的姓名:");
scanf("%s",&name);
for(j=0;j<n;j++)
{
if(strcmp(name,p[j].name) == 0)
{
printf("ID\tname\tChinese\tMath\tEnglish\tAve\n");
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[j].sutdentID,p[j].name,p[j].ChineseScore,p[j].MathScore,p[j].EnglishScore,p[j].AVScroe);
flag =1;
}
}
if(flag == 0)
{
printf("\nERROR!!没有这个学生的数据\n");
}
break;
case 2: // 按学号查询
printf("请输入学生的学号:");
scanf("%d",&ID);
for(j=0;j<n;j++)
{
if(ID == p[j].sutdentID)
{
printf("ID\tname\tChinese\tMath\tEnglish\tAve\n");
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[j].sutdentID,p[j].name,p[j].ChineseScore,p[j].MathScore,p[j].EnglishScore,p[j].AVScroe);
flag =1;
}
}
if(flag == 0)
{
printf("\nERROR!!没有这个学生的数据\n");
}
break;
default:
break;
}
printf("\n");
free(p);
}
void sort()
{
FILE *fp;
int n;
int i,j;
struct student temp;
int min;
struct student *p;
if((fp = fopen("score.txt","r")) == NULL) //open the file
{
printf("打开文件失败\n");
exit(0);
}
n = line_number(fp); //检测文件行数
p = (struct student *)malloc(n *(sizeof(struct student)));
if(p == NULL)
printf("内存分配失败\n");
for(i=0;i<n;i++)
{
if(fscanf(fp,"%d%s%d%d%d%f\n",&p[i].sutdentID,p[i].name,&p[i].ChineseScore,&p[i].MathScore,&p[i].EnglishScore,&p[i].AVScroe) == EOF)
printf("error");
}
fclose(fp);
printf("****按平均成绩由低到高排序****\n");
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
{
if(p[i].AVScroe>p[i+1].AVScroe)
{
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp;
}
}
printf("ID\tname\tChinese\tMath\tEnglish\tAve\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[i].sutdentID,p[i].name,p[i].ChineseScore,p[i].MathScore,p[i].EnglishScore,p[i].AVScroe);
}
printf("\n");
printf("是否将新数据重新保存到文件(是:1,否:2):");
scanf("%d",&i);
while(i!=1 && i!= 2)
{
printf("输入错误,请重新输入:");
scanf("%d",&i);
}
if(i == 1)
write_file(p,n);
free(p);
}
void write_file(struct student *p,int n) //重新将数据写入文件
{
FILE *fp;
int i;
if((fp = fopen("score.txt","w")) == NULL) //open the file
{
printf("打开文件失败\n");
exit(0);
}
for(i=0;i<n;i++)
{
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%.2f\n",p[i].sutdentID,p[i].name,p[i].ChineseScore,p[i].MathScore,p[i].EnglishScore,p[i].AVScroe);
}
printf("写入文件成功\n");
fclose(fp);
}
void insert()
{
FILE *fp;
int n;
int i,j;
struct student temp;
int min;
struct student *p;
if((fp = fopen("score.txt","r")) == NULL) //open the file
{
printf("打开文件失败\n");
exit(0);
}
n = line_number(fp); //检测文件行数
p = (struct student *)malloc((n+1) *(sizeof(struct student)));
if(p == NULL)
printf("内存分配失败\n");
for(i=0;i<n;i++)
{
if(fscanf(fp,"%d%s%d%d%d%f\n",&p[i].sutdentID,p[i].name,&p[i].ChineseScore,&p[i].MathScore,&p[i].EnglishScore,&p[i].AVScroe) == EOF)
printf("error");
}
fclose(fp);
p[n] = import();
for(j=0;j<n;j++)
for(i=0;i<n-j;i++)
{
if(p[i].AVScroe>p[i+1].AVScroe)
{
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp;
}
}
printf("确认?(是:1,否:2):");
scanf("%d",&i);
while(i!=1 && i!= 2)
{
printf("输入错误,请重新输入:");
scanf("%d",&i);
}
if(i == 1)
write_file(p,n+1);
free(p);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。