今天应了一个高中好友的要求用c写一个用文件实现的学生成绩管理系统,呵呵,非常的简单,但也花了将近3个小时才搞定!以下是代码:
#include
#include
#define MAXNUM 1000
struct StuGrade
{
int Stu_ID;
char Stu_Name[30];
int Grade;
}StGde[MAXNUM];
/*///////////////////////////////////
功能:返回主目录
///////////////////////////////////*/
void Show()
{
printf("目录:/n");
printf("添加:1/n排序:2/n查询:3/n删除:4/n打印:5/n退出:0/n/n");
printf("选择各种功能,请输入相应行后面的数字:");
}
/*///////////////////////////////////////////////////////////////////////
功能:添加学生的学号、姓名和成绩
///////////////////////////////////////////////////////////////////////*/
void Add()
{
FILE *fp;
int num;
printf("请输入要添加的记录条数(总数不得超过%d):",MAXNUM);
scanf("%d",&num);
printf("/n");
for(int i=0;i
printf("学号:");scanf("%d",&StGde[i].Stu_ID);
printf("姓名:");scanf("%s",&StGde[i].Stu_Name);
printf("分数:");scanf("%d",&StGde[i].Grade);
//判断该学号是否已经存在
int flag=1;
StuGrade sg;
if((fp=fopen("StudentsGrade.txt","r"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
while(!feof(fp))
{
fread(&sg,sizeof(StuGrade),1,fp);
if(sg.Stu_ID==StGde[i].Stu_ID)
{
flag=0;
break;
}
}
fclose(fp);
//不存在,添加到记录去
if(flag)
{
if((fp=fopen("StudentsGrade.txt","a"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
if(fwrite(&StGde[i],sizeof(StuGrade),1,fp)!=1)
{
printf("file write error!/n");
}
fclose(fp);
}
//已经存在
else printf("该学生已经在库,请不要再次输入!/n");
printf("/n");
}
}
/*////////////////////////////////////////////////////
功能:打印,即把所有在库学生的姓名、学号和成绩列出来
////////////////////////////////////////////////////*/
void Display()
{
FILE *fp;
if((fp=fopen("StudentsGrade.txt","rb"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
int i=0;
printf("姓名 学号 分数/n");
while(!feof(fp))
{
fread(&StGde[i],sizeof(StuGrade),1,fp);
if(StGde[i].Grade!=0&&StGde[i].Stu_ID!=0)
printf("%-10s %6d %7d/n",StGde[i].Stu_Name,StGde[i].Stu_ID,StGde[i].Grade);
i++;
}
fclose(fp);
}
/*///////////////////////////////////////////////////////
功能:把在库学生按学号排序
算法:快速排序
///////////////////////////////////////////////////////*/
int cmp(const void *a,const void *b)
{
StuGrade *c=(StuGrade *)a;
StuGrade *d=(StuGrade *)b;
return c->Stu_ID-d->Stu_ID;
}
void Sort()
{
FILE *fp;
if((fp=fopen("StudentsGrade.txt","r"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
int i=0;
while(!feof(fp))
{
fread(&StGde[i],sizeof(StuGrade),1,fp);
i++;
}
fclose(fp);
if((fp=fopen("StudentsGrade.txt","w"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
qsort(StGde,i,sizeof(StGde[0]),cmp);
for(int j=0;j fwrite(&StGde[j],sizeof(StuGrade),1,fp);
fclose(fp);
}
/*/////////////////////////////////////////////////////////////////////
功能:查询,即输入一个学号,判断该学生是否在库。
如在库,输出该学生的信息,
否则,显示提示
注意:在执行查询功能之前必须先执行排序功能,因为这里采用的是折半查找算法
/////////////////////////////////////////////////////////////////////*/
void Search()
{
int num;
printf("请输入要查找学生的学号(以输入'0'结束):");
FILE *fp;
if((fp=fopen("StudentsGrade.txt","r"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
int i=0;
while(!feof(fp))
{
fread(&StGde[i],sizeof(StuGrade),1,fp);
i++;
}
fclose(fp);
while(scanf("%d",&num)&&num)
{
int low=0,high=i;
int flag=1;
while(low<=high)
{
int mid=(low+high)/2;
if(StGde[mid].Stu_ID>num) high=mid-1;
else if(StGde[mid].Stu_ID
{
printf("姓名 学号 分数/n");
printf("%-10s %6d %7d/n",StGde[mid].Stu_Name,StGde[mid].Stu_ID,StGde[mid].Grade);
flag=0;
break;
}
}
if(flag)
printf("对不起,您输入的学号不存在!/n");
printf("请输入要查找学生的学号(以输入'0'结束):");
}
}
/*//////////////////////////////////////////////////////////////////////
功能:删除,即输入一个学号,如果这个学号在库,则删除,否则,显示提示信息
//////////////////////////////////////////////////////////////////////*/
void Delete()
{
int num;
printf("请输入要删除学生的学号(以输入'0'结束):");
while(scanf("%d",&num)&&num)
{
int flag=1;
FILE *fp;
if((fp=fopen("StudentsGrade.txt","r"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
int i=0;
while(!feof(fp))
{
fread(&StGde[i],sizeof(StuGrade),1,fp);
if(StGde[i].Stu_ID==num)flag=0;
i++;
}
fclose(fp);
if(flag==0)
{
if((fp=fopen("StudentsGrade.txt","w"))==NULL)
{
printf("Can not open the file!/n");
return ;
}
for(int j=0;j if(StGde[j].Stu_ID!=num)
fwrite(&StGde[j],sizeof(StuGrade),1,fp);
fclose(fp);
}
else printf("对不起,您输入的学号不存在!/n");
printf("请输入要删除学生的学号(以输入'0'结束):");
}
}
/*/////////////////////////////////////////////////////////
主函数
/////////////////////////////////////////////////////////*/
int main()
{
Show();
int text;
scanf("%d",&text);
while(text!=0)
{
switch(text)
{
case 1:Add();printf("/n");Show();break;
case 2:Sort();printf("/n");Show();break;
case 3:Search();printf("/n");Show();break;
case 4:Delete();printf("/n");Show();break;
case 5:Display();printf("/n");Show();break;
default :printf("输入错误,请再次输入!/n");break;
}
scanf("%d",&text);
}
return 0;
}