C语言—班级学生管理系统

下面是根据班级,这个人数较少的单位设计的学籍管理系统,录入时,要求班内序号由1开始  按顺序录入,其中主要用到了 结构体数组,文件处理,循环语句,选择语句等方面的知识
在设计中遇到一个问题就是  不知道怎样修改已经保存在文件中的某一个指定学生的信息,后来在询问学长之后才了解到  可以: 先把文件中的数据全部读入结构体数组中,再修改指定序号的数组元素,然后再用“wt”的方式写进原文件,这样就可以删除文件里的原内容,再写进新内容
下面是源代码,在Dev-C++ 条件下进行编译

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int count1=0;
int count2=0;
int count3=0;
void class_print();
void men1_student();
void men2_student();
void men3_student();
void men4_student();
void input_student();
void input_grade();
void input_reward();
void input_finance();
void report_finance();
void seek_student();
void seek_grade();
void seek_reward();
void change_student();
void change_grade();
void change_reward();
int now1_student();
int now2_student();
int now3_student();
struct date
{
 int year;
 int month;
 int day;
};
struct student
{
 char number[2];
 char name[10];
 char sex[4];
 char tel[15];
 char id[20];
 char study[10];
};
struct grade
{
 char number[2];
 char name[10];
 char math[4];
 char English[4];
 char Cprogram[4];
 char sumtest[4];
};
struct reward
{
 char number[2];
 char name[10];
 struct date time;
 char rewarding[80];
};
struct finance
{
 char thing[20];
 char type[8];
 struct date time2;
 int i;
};
struct student m_stu[50];
struct grade g_stu[50];
struct reward r_stu[50];
struct finance f_class;
struct grade t_change;
main()
{
 
 int choice=-1;                                                 //一级菜单
 while(choice!=0)
 {
 printf("\n");
 printf("\t\t\t\t\t\t**");  class_print();  printf("**\n");   
 printf("\t\t\t\t\t\t****************************\n");
 printf("\t\t\t\t\t\t**  班级学生学籍管理系统  **\n");
    printf("\t\t\t\t\t\t**     1.户籍管理系统     **\n");
 printf("\t\t\t\t\t\t**     2.成绩管理系统     **\n");
 printf("\t\t\t\t\t\t**     3.奖惩管理系统     **\n");
 printf("\t\t\t\t\t\t**     4.财务管理系统     **\n");
 printf("\t\t\t\t\t\t**     0.退        出     **\n");
 printf("\t\t\t\t\t\t请选择");
 scanf("%d",&choice);
 switch(choice)
 {
 case 1:
        men1_student();
  break;
 case 2:
     men2_student();
     break;
 case 3:
     men3_student();
     break;
 case 4:
     men4_student();
     break;
    case 0:
     printf("返回上一级");
        break;
    default :
        break;
 }
    }
}
void men1_student()                                                                              //二级菜单(学生户籍管理)
{
int choice=-1;
while(choice!=0)
    {
    printf("\n");
    printf("\t\t\t\t\t\t****************************\n");
    printf("\t\t\t\t\t\t**");  class_print();  printf("**\n");
 printf("\t\t\t\t\t\t**  班级学生户籍信息管理  **\n");
 printf("\t\t\t\t\t\t**  户籍信息已录入人数:");now1_student();printf("  **\n");
    printf("\t\t\t\t\t\t**     1.户籍录入系统     **\n");
 printf("\t\t\t\t\t\t**     2.户籍修改系统     **\n");
 printf("\t\t\t\t\t\t**     3.户籍查询系统     **\n");
 printf("\t\t\t\t\t\t**     0.返        回     **\n");
 printf("\t\t\t\t\t\t请选择");
 scanf("%d",&choice); 
    switch(choice)
    {
         case 1:
      input_student();
      break;
      case 2:
      change_student();
      break;
      case 3:
      seek_student();
      break;
            case 0:
            printf("返回上一级");
            break;
            default :
            break;
 }
 getch();
   }
}
   
void input_student()                                                                                   // 户籍录入函数  录入信息保存至D盘根目录下information1.txt文件下
    {
     int j;
     printf("学生户籍信息录入");
     printf("\n班内序号: ");
     scanf("%s",&m_stu[count1].number);
     printf("\n姓名: ");
     gets(m_stu[count1].name);
     gets(m_stu[count1].name);
     printf("\n性别: ");
     scanf("%s",&m_stu[count1].sex);
     printf("\n电话号码: ");
     scanf("%s",&m_stu[count1].tel);
     printf("\n身份证号: ");
     scanf("%s",&m_stu[count1].id);
     printf("\n学号: ");
     scanf("%s",&m_stu[count1].study);
     printf("是否保存该学生信息?1-保存 2-放弃");
     scanf("%d",&j);
     if(j==1)
     {
      
      FILE *info;                                           //保存至本地文件
      info=fopen("d:\\information1.txt","at+");
      fwrite(&m_stu[count1],sizeof(struct student),1,info);
      fclose(info);
      printf("信息已保存至D:\\information1.tex 文件下,按任意键继续");
      count1++;
  }
     else printf("放弃保存,按任意键继续");
    }
void seek_student()                                                                               //查询户籍信息函数                  
  {
     FILE *info;                                      
     info=fopen("d:\\information1.txt","rt");
     int i;
  printf("请输入该学生班内序号");
  scanf("%d",&i);
  if(i<1||i>50) printf("抱歉,该学生信息不存在");
    else
    {
     rewind(info);
     fseek(info,sizeof(struct student)*(i-1),0);
     fread(&m_stu[i-1],sizeof(struct student),1,info);
     printf("\n\n序号 姓名    性别 电话号码\t   身份证号\t\t学号\t");
     printf("\n\n%d   %s   %s   %s   %s    %s",i,m_stu[i-1].name,m_stu[i-1].sex,m_stu[i-1].tel,m_stu[i-1].id,m_stu[i-1].study);
    }
  }
  void change_student()                                                                           //修改户籍信息
  {
   int i=0,j,k,f;char h[100000];
   FILE *info;
   info=fopen("d:\\information1.txt","rt");
 printf("\n\t请输入要修改户籍信息的学生班内序号");
  scanf("%d",&j);
  if(j<1||j>50) printf("抱歉,该学生信息不存在");
  else
  {
   rewind(info);
   while(fgets(h,sizeof(struct student),info)!=NULL)
   {
     fseek(info,sizeof(struct student)*i,0);
     fread(&m_stu[i],sizeof(struct student),1,info);
     i++;
     }
  }
  fclose(info);
     printf("\n该学生目前户籍信息为\n:");
     printf("\n\n序号 姓名    性别 电话号码\t   身份证号\t\t学号\t");
     printf("\n\n%d   %s   %s   %s   %s    %s",j,m_stu[j-1].name,m_stu[j-1].sex,m_stu[j-1].tel,m_stu[j-1].id,m_stu[j-1].study);
      printf("确定修改此学生信息?1- 修改 2- 返回");
      scanf("%d",&k);
     if(k==1)
   {
     printf("\n姓名: ");
     gets(m_stu[j-1].name);
     gets(m_stu[j-1].name);
     printf("\n性别: ");
     scanf("%s",&m_stu[j-1].sex);
     printf("\n电话号码: ");
     scanf("%s",&m_stu[j-1].tel);
     printf("\n身份证号: ");
     scanf("%s",&m_stu[j-1].id);
     printf("\n学号: ");
     scanf("%s",&m_stu[j-1].study);
   }
   else return;                                    
      info=fopen("d:\\information1.txt","wt");
   for(f=0;f<i;f++)
   {
        fseek(info,sizeof(struct student)*f,0);
      fwrite(&m_stu[f],sizeof(struct student),1,info);
   }
         fclose(info);
         printf("修改成功!");
   }
 
 
 
 
   
void men2_student()                                                                           //二级菜单(学生成绩管理)
  {
   int choice=-1;
   while(choice!=0)
   {
   printf("\n\t\t\t\t\t\t****************************\n");
   printf("\t\t\t\t\t\t**");  class_print();  printf("**\n");
 printf("\t\t\t\t\t\t**  班级学生成绩信息管理  **\n");
 printf("\t\t\t\t\t\t**  成绩信息已录入人数:");now2_student();printf("  **\n");
    printf("\t\t\t\t\t\t**     1.成绩录入系统     **\n");
 printf("\t\t\t\t\t\t**     2.成绩修改系统     **\n");
 printf("\t\t\t\t\t\t**     3.成绩查询系统     **\n");
 printf("\t\t\t\t\t\t**     4.综测排名系统     **\n");
 printf("\t\t\t\t\t\t**     0.返        回     **\n");
 printf("\t\t\t\t\t\t请选择");
 scanf("%d",&choice);
 switch(choice)
  {
  case 1:input_grade();
         break;
  case 2:change_grade();
         break;
  case 3:seek_grade();
         break;
  case 4:printf("功能正在研发中,敬请期待...");
         break;
  default:
         break;
  }
  getch();
    }
 }
void input_grade()                                                                                          // 成绩录入函数   ,录入信息保存至 D盘根目录下information2.txt文件下
    {
     int j;
     printf("学生成绩信息录入");
     printf("\n班内序号");
     scanf("%s",&g_stu[count2].number);
     printf("\n姓名: ");
     gets(g_stu[count2].name);
     gets(g_stu[count2].name);
     printf("\n高数: ");
     scanf("%s",&g_stu[count2].math);
     printf("\n英语:");
     scanf("%s",&g_stu[count2].English);
     printf("\nC语言:");
     scanf("%s",&g_stu[count2].Cprogram);
     printf("\n综测:");
     scanf("%s",&g_stu[count2].sumtest);
     printf("是否保存该学生信息?1-保存 2-放弃");
     scanf("%d",&j);
     if(j==1)
     {
      
      FILE *info2;                                           //保存至本地文件
      info2=fopen("d:\\information2.txt","at+");
      fwrite(&g_stu[count2],sizeof(struct grade),1,info2);
      fclose(info2);
      printf("信息已保存至D:\\information.tex2 文件下,按任意键继续");
      count2++;
  }
     else printf("放弃保存,按任意键继续");
    }
   
   
   
void seek_grade()                                                                                      //查询成绩信息函数                  
  {
     FILE *info2;                                      
     info2=fopen("d:\\information2.txt","rt");
     int i;
  printf("\n\t请输入该学生班内序号");
  scanf("%d",&i);
  if(i<1||i>50) printf("\n抱歉,该学生信息不存在");
    else
    {
     rewind(info2);
     fseek(info2,sizeof(struct grade)*(i-1),0);
     fread(&g_stu[i-1],sizeof(struct grade),1,info2);
     printf("\n\n序号 姓名  高数  英语  C语言  综测");
     printf("\n\n%d   %s   %s   %s   %s    %s",i,g_stu[i-1].name,g_stu[i-1].math,g_stu[i-1].English,g_stu[i-1].Cprogram,g_stu[i-1].sumtest);
    }
  }
void change_grade()                                                                                     //修改成绩信息   
  {
   int i=0,j,k,f;char h[100000];
   FILE *info;
   info=fopen("d:\\information2.txt","rt");
 printf("\n\t请输入要修改成绩信息的学生班内序号");
  scanf("%d",&j);
  if(j<1||j>50) printf("\n抱歉,该学生信息不存在");
  else
  {
   rewind(info);
   while(fgets(h,sizeof(struct grade),info)!=NULL)
   {
     fseek(info,sizeof(struct grade)*i,0);
     fread(&g_stu[i],sizeof(struct grade),1,info);
     i++;
     }
  }
  fclose(info);
     printf("\n该学生目前成绩信息为\n:");
     printf("\n\n序号 姓名  高数 英语  C语言  综测");
     printf("\n\n%d   %s   %s   %s   %s    %s",j,g_stu[j-1].name,g_stu[j-1].math,g_stu[j-1].English,g_stu[j-1].Cprogram,g_stu[j-1].sumtest);
      printf("\n\t确定修改此学生信息?1- 修改 2- 返回");
      scanf("%d",&k);
     if(k==1)
   {
     printf("\n姓名: ");
     gets(g_stu[j-1].name);
     gets(g_stu[j-1].name);
     printf("\n高数: ");
     scanf("%s",&g_stu[j-1].math);
     printf("\n英语: ");
     scanf("%s",&g_stu[j-1].English);
     printf("\nC语言: ");
     scanf("%s",&g_stu[j-1].Cprogram);
     printf("\n综测: ");
     scanf("%s",&g_stu[j-1].sumtest);
   }
   else return;                                    
      info=fopen("d:\\information2.txt","wt");
      if(info==NULL)
      {
       printf("不能打开此文件,按任意键继续");
       getch();
      
   }
   for(f=0;f<i;f++)
   {
        fseek(info,sizeof(struct grade)*f,0);
      fwrite(&g_stu[f],sizeof(struct grade),1,info);
   }
         fclose(info);
         printf("修改成功!");
   }
void men3_student()                                                                           //二级菜单(学生奖惩管理)
{
int choice=-1;
while(choice!=0)
    {
    printf("\n");
    printf("\t\t\t\t\t\t****************************\n");
    printf("\t\t\t\t\t\t**");  class_print();  printf("**\n");
 printf("\t\t\t\t\t\t**  班级学生奖惩信息管理  **\n");
 printf("\t\t\t\t\t\t**  奖惩信息已录入人数:");now3_student();printf("  **\n");
    printf("\t\t\t\t\t\t**     1.奖惩录入系统     **\n");
 printf("\t\t\t\t\t\t**     2.奖惩修改系统     **\n");
 printf("\t\t\t\t\t\t**     3.奖惩查询系统     **\n");
 printf("\t\t\t\t\t\t**     0.返        回     **\n");
 printf("\t\t\t\t请选择");
 scanf("%d",&choice); 
    switch(choice)
    {
         case 1:
      input_reward();
      break;
      case 2:
      change_reward();
      break;
      case 3:
      seek_reward();
      break;
            case 0:
            printf("返回上一级");
            break;
            default :
            break;
 }
 getch();
   }
}
void input_reward()                                                                                // 奖惩录入函数      录入信息保存至D盘根目录下information3.txt文件下
    {
     int j;
     printf("学生奖惩信息录入");
     printf("\n班内序号: ");
     scanf("%s",&r_stu[count3].number);
     printf("\n姓名: ");
     gets(r_stu[count3].name);
     gets(r_stu[count3].name);
     printf("\n奖惩时间: ");
     scanf("%d.%d.%d",&r_stu[count3].time.year,&r_stu[count3].time.month,&r_stu[count3].time.day);
     printf("\n具体事件: ");
     gets(r_stu[count3].rewarding);
     gets(r_stu[count3].rewarding);
     printf("\n是否保存该学生信息?1-保存 2-放弃");
     scanf("%d",&j);
     if(j==1)
     {
      
      FILE *info;                                           //保存至本地文件
      info=fopen("d:\\information3.txt","at+");
      fwrite(&r_stu[count3],sizeof(struct reward),1,info);
      fclose(info);
      printf("\n信息已保存至D:\\information3.tex 文件下,按任意键继续");
      count3++;
  }
     else printf("放弃保存,按任意键继续");
    }
void seek_reward()                                                                                //查询奖惩信息函数     根据学生班级序号              
  {
     FILE *info;                                      
     info=fopen("d:\\information3.txt","rt");
     int i;
  printf("\n\t请输入该学生班内序号");
  scanf("%d",&i);
  if(i<1||i>50) printf("\n抱歉,该学生信息不存在");
    else
    {
     rewind(info);
     fseek(info,sizeof(struct reward)*(i-1),0);
     fread(&r_stu[i-1],sizeof(struct reward),1,info);
     printf("\n\n序号  姓名    奖惩时间                 具体事件\t\t");
     printf("\n\n%d   %s   %d.%d.%d   %s   ",i,r_stu[i-1].name,r_stu[i-1].time.year,
                                                            r_stu[i-1].time.month,
                  r_stu[i-1].time.day,    r_stu[i-1].rewarding);
    }
  }
void change_reward()                                                                            //修改奖惩信息
  {
   int i=0,j,k,f;char h[100000];
   FILE *info;
   info=fopen("d:\\information3.txt","rt");
 printf("\n\t请输入要修改奖惩信息的学生班内序号");
  scanf("%d",&j);
  if(j<1||j>50) printf("\n抱歉,该学生信息不存在");
  else
  {
   rewind(info);
   while(fgets(h,sizeof(struct reward),info)!=NULL)
   {
     fseek(info,sizeof(struct reward)*i,0);
     fread(&r_stu[i],sizeof(struct reward),1,info);
     i++;
     }
  }
  fclose(info);
     printf("\n该学生目前奖惩信息为\n:");
     printf("\n\n序号 姓名  奖惩时间    具体事件");
     printf("\n\n%d   %s   %d.%d.%d   %s   ",j,r_stu[j-1].name,r_stu[j-1].time.year,
                                                            r_stu[j-1].time.month,
                  r_stu[j-1].time.day  ,r_stu[j-1].rewarding);
      printf("\n\t确定修改此学生信息?1- 修改 2- 返回");
      scanf("%d",&k);
     if(k==1)
   {
     printf("\n姓名: ");
     gets(r_stu[j-1].name);
     gets(r_stu[j-1].name);
     printf("\n奖惩时间: ");
     scanf("%d.%d.%d",&r_stu[j-1].time.year,&r_stu[j-1].time.month,&r_stu[j-1].time.day);
     printf("\n具体事件: ");
     scanf("%s",&r_stu[j-1].rewarding);
   }
   else return;                                    
      info=fopen("d:\\information3.txt","wt");
   for(f=0;f<i;f++)
   {
        fseek(info,sizeof(struct reward)*f,0);
      fwrite(&r_stu[f],sizeof(struct reward),1,info);
   }
         fclose(info);
         printf("修改成功!");
   }
int now1_student()                                                                    //录入户籍信息学生数目       在菜单中 显示 已经录入学生人数
{
 int i=1;
 char j[100000];
 FILE *info;
 info=fopen("D:\\information1.txt","rt");
 rewind(info);
     while(fgets(j,sizeof(struct student),info)!=NULL)
     {
         fseek(info,sizeof(struct student)*i,0);
         i++;
  }
  fclose(info);
        printf("%d",i-1);                                          
}

int now2_student()                                                                     //录入成绩信息学生数目     在菜单中 显示 已经录入学生人数
{
 int i=1;
 char j[100000];
 FILE *info;
 info=fopen("D:\\information2.txt","rt");
 rewind(info);
     while(fgets(j,sizeof(struct grade),info)!=NULL)
     {
         fseek(info,sizeof(struct grade)*i,0);
         i++;
  }
  fclose(info);
        printf("%d",i-1);                                          
}

int now3_student()                                                                       //录入奖惩信息学生数目     在菜单中 显示 已经录入学生人数
{
 int i=1;
 char j[100000];
 FILE *info;
 info=fopen("D:\\information3.txt","rt");
 rewind(info);
     while(fgets(j,sizeof(struct reward),info)!=NULL)
     {
         fseek(info,sizeof(struct reward)*i,0);
         i++;
  }
  fclose(info);
        printf("%d",i-1);                                          
}
void class_print()                                                                         // 录入专业班级信息,并保存至D盘根目录下information0.txt文件下
{
 char major[20],class_number[4];
 FILE *info;
 info=fopen("d:\\information0.txt","rt");
 if(info==NULL)
 {
  info=fopen("d:\\information0.txt","wt");
  printf("\n请输入专业 :");
  scanf("%s",&major);
  printf("\n请输入班级 :");
  scanf("%s",&class_number);
  fwrite(major,sizeof(major),1,info);
  fwrite(class_number,sizeof(class_number),1,info);
  printf("\n\t已保存专业班级信息!");
  fclose(info);
  info=fopen("d:\\information0.txt","rt");
  fread(&major,sizeof(major),1,info);
  fread(&class_number,sizeof(class_number),1,info);
  printf("%s",major);printf("%s班",class_number); 
 }
 else
 {
  fread(&major,sizeof(major),1,info);
  fread(&class_number,sizeof(class_number),1,info);
  printf("%s",major);printf("%s班",class_number);
  fclose(info);
 }
}
void men4_student()                                                                               //二级菜单(班级财务管理)
{
int choice=-1;
while(choice!=0)
    {
    printf("\n");
    printf("\t\t\t\t\t\t****************************\n");
    printf("\t\t\t\t\t********财务信息不可修改,请谨慎录入!******\n");
 printf("\t\t\t\t\t\t**  班级学生财务信息管理  **\n");
    printf("\t\t\t\t\t\t**     1.财务录入系统    **\n");
 printf("\t\t\t\t\t\t**     2.财务报表系统    **\n");
 printf("\t\t\t\t\t\t**     0.返        回     **\n");
 printf("\t\t\t\t\t\t请选择");
 scanf("%d",&choice); 
    switch(choice)
    {
         case 1:
      input_finance();
      break;
      case 2:
      report_finance();
      break;
      case 3:
            case 0:
            printf("返回上一级");
            break;
            default :
            break;
 }
 getch();
   }
}
 
void input_finance()                                                                        // 财务录入函数 ,录入后信息保存到D盘根目录下 information4.txt文件中
    {
     int j;
     printf("班级财务信息录入");
     printf("\n收支时间: ");
     scanf("%d.%d.%d",&f_class.time2.year,&f_class.time2.month,&f_class.time2.day );
     printf("\n具体事件: ");
     gets(f_class.thing);
     gets(f_class.thing);
     printf("\n财务类型(收入或开支): ");
     scanf("%s",&f_class.type);
     printf("\n流动金额(收入为正开支为负): ");
     scanf("%d",&f_class.i);
     printf("\n是否保存该财务信息?1-保存 2-放弃");
     scanf("%d",&j);
     if(j==1)
     {
      
      FILE *info;                                           //保存至本地文件
      info=fopen("d:\\information4.txt","at+");
      fwrite(&f_class,sizeof(struct finance),1,info);
      fclose(info);
      printf("\n信息已保存至D:\\information4.txt 文件下,按任意键继续");
      
  }
     else printf("放弃保存,按任意键继续");
    }
void report_finance()                                                                                       // 财务信息报表
{   
    char h[100000];int sum=0,i=0;
 printf("\n收支时间   具体事件\t财务类型  流动金额\n");
 FILE *info;                                      
     info=fopen("d:\\information4.txt","rt");
     while(fgets(h,sizeof(struct finance),info)!=NULL)
   {
   fseek(info,sizeof(struct finance)*i,0);
     fread(&f_class,sizeof(struct finance),1,info);i++;
     printf("\n%d.%d.%d %s          %s           %d\n",f_class.time2.year,
                                                f_class.time2.month,
               f_class.time2.day,  f_class.thing,f_class.type,f_class.i);
               sum=sum+f_class.i ;
     }
  printf("\n\t\t班费余额:%d元",sum);           
}
 

猜你喜欢

转载自blog.csdn.net/wintershii/article/details/78946171