您的位置:首页 > 其它

用文件实现学生成绩管理系统

2007-12-31 19:51 1161 查看
今天应了一个高中好友的要求用c写一个用文件实现的学生成绩管理系统,呵呵,非常的简单,但也花了将近3个小时才搞定!以下是代码:

#include <stdio.h>
#include <stdlib.h>
#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<num;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<i;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<num) low=mid+1;
else
{
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<i;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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: