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

来源:互联网 发布:星星知我心歌曲 编辑:程序博客网 时间:2024/06/10 09:06

          今天应了一个高中好友的要求用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;
}
 

 

原创粉丝点击