学生管理系统(c版)

利用文本实现的,想法是修改时进行读和改操作,而排序不会重新写入文件。
不知道这样写会不会很罗嗦,但是先存上再说。。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define LIST_INIT_SIZE 100
typedef struct         //定义日期型数据
{
    int    year;
    int    month;
    int    day;
}birth;

typedef struct           //学生情况结构体定义
{
   int    num;           //学号
   char   name[20];      //姓名
   char   sex[2];        //性别,只能输入"男"或"女"
   birth  birthday;      //出生日期
   int    chinese;       //语文成绩
   int    english;       //英语成绩
   int    math;          //数学成绩
   int    total;         //总成绩
   double Aver;          //平均成绩
}Student;

typedef struct
{
    Student  *elem;        //职工信息,采用动态数组的方式进行存储
    int      Listsize;     //空间大小
    int      length;       //实际用的空间数
}StudentList;
 StudentList   stu;  
  FILE *fp; 
//****************************用户函数定义开始*****************************

void MainMenu()                   //主菜单
{
    printf("\n\n");
    printf("\t\t     常春藤学生成绩管理系统\n\n");
    printf("\t==============================================\n");
    printf("   \t\t    1  新   增   数   据\n\n");
    printf("   \t\t    2  删   除   数   据\n\n");
    printf("   \t\t    3  成   绩   录   入\n\n");
    printf("   \t\t    4  成   绩   汇   总\n\n");
    printf("   \t\t    5  信   息   排   序\n\n");
    printf("   \t\t    6  信   息   修   改\n\n");
    printf("   \t\t    7  学   生   信   息\n\n");
    printf("   \t\t    0  退   出   系   统\n\n");
    printf("\t==============================================\n");
    printf("\t\t请选择功能(0—6):");
}
//学生基本信息



//初始化学生顺序表,参见顺序表的初始化过程
int  InitStudentList(StudentList &Stu)
{
    Stu.elem=(Student *) malloc ( LIST_INIT_SIZE  * sizeof(Student));
    if( !Stu.elem )   exit(0);
    Stu.Listsize = LIST_INIT_SIZE ;
    Stu.length = 0;

    return 1;
    //申请空间,并将空间的地址赋给Stu.elem
    //判断是否申请成功;是返回1,否则返回0,并退出这个程序
}
void fread()                 //读文件
{
    int i=0;
    stu.length = -1;                                      //文件为空时会执行一次
    if((fp = fopen( "E:\\a.txt","rb" )) == NULL)          //首先先创建此文件,否则会报错
    {
        printf("can't open file!\n");
        system("pause");
        return ;
    }
   while(!feof(fp))  //文件不结束就一直读                //文件为空时会执行一次,所以Stu.length=0 不可以      
   {
      fread(&stu.elem[i],sizeof(Student),1,fp);
      i++;
      stu.length++;
   }
   fclose(fp);
}
void fwrite()             //写文件
{
     int i;
     if((fp = fopen( "E:\\a.txt","wb" )) == NULL)  
     {
        printf("can't open file!\n");
        return ;
    }
    for(i = 0 ; i < stu.length; i++)
      if( fwrite(&stu.elem[i],sizeof(Student),1,fp) != 1 )    //以二进制写入
         printf("file write error\n"); 
   fclose(fp);
}
void show (StudentList &Stu)
{  
    fread();
   int i;
    printf("  =============================================================================\n");
    printf("  学号  姓名  性别  出 生 日 期   语文  英语   数学    总分数   平均成绩     \n");
    printf("  =============================================================================\n");
    for(i  = 0 ; i < Stu.length ; i ++)
    printf("%d  %-5d%-5s  %-5s%-4d年%-2d月%-2d日 %-3d  %-3d     %-3d    %-3d      %-3.2lf     \n",i+1,Stu.elem[i].num,Stu.elem[i].name,Stu.elem[i].sex,
   Stu.elem[i].birthday.year,Stu.elem[i].birthday.month,Stu.elem[i].birthday.day,Stu.elem[i].chinese,Stu.elem[i].english,Stu.elem[i].math,Stu.elem[i].total,
   Stu.elem[i].Aver
    );

    putchar('\n');
}
//新增新学生的基本信息,包括:学号、姓名、性别和出生日期的输入,参见顺序表的输入
void AddNewStudent(StudentList &Stu)
{   
     int n,k,i = 0 ;
       fread();
      i=0;
      printf("请输入学号 :");
           scanf("%d",&n);
         while( i < Stu.length )
         {  
                if( Stu.elem[i].num == n )
                {
                    printf("当前学生已存在,是否继续输入其他学号!(0:终止 1:继续):\n");
                     scanf("%d",&k);
                     if( k != 1) return ;
                    printf("请输入学号 :");
                    scanf("%d",&n);
                    i = -1; 
                }
                i++;
         }
         if(i== Stu.length ) 
         {
            Stu.elem[Stu.length].num = n ;
         printf("--------------请继续输入该学生的其他信息---------------\n");
         getchar();
         printf("姓 名 : ");
         scanf("%s",Stu.elem[Stu.length].name);
         printf("性 别( 男 or 女 ) : ");
         scanf("%s",Stu.elem[Stu.length].sex);
         printf("生 日(年  月  日) ,以空格隔开 : ");
         scanf("%d%d%d",&Stu.elem[Stu.length].birthday.year,&Stu.elem[Stu.length].birthday.month,&Stu.elem[Stu.length].birthday.day);
         Stu.elem[Stu.length].chinese = 0 ;  Stu.elem[Stu.length].english = 0 ;  Stu.elem[Stu.length].math = 0 ;
          Stu.elem[Stu.length].total = 0 ;  Stu.elem[Stu.length].Aver = 0 ;
          printf("----------------添加成功----------------\n");
         Stu.length ++;
         }

     fwrite();
    //输入学生的学号;
    //检索当前学号的学生是否存在;
    //不存在,继续输入学生的其它基本信息,使学生的总数加1, 否则,提示学生已经存在,输入其它学号
}

//学生删除,参见顺序表数据的删除
void DelStudent(StudentList &Stu)
{
    Student temp; int i=0,j,k,number,flag=0;
    char a;
     fread();
      i = 0;
     printf("请输入学号 :");
           scanf("%d",&number);  
           while(i < Stu.length)
           {
             if( Stu.elem[i].num == number )
             {
                 printf("是否删除学号为%d的学生信息?(y/n):",number);
                 getchar();
                 a=getchar();
                 if( a == 'y')
                 {
                     for(j = i + 1 ; j < Stu.length ; j ++)
                     {
                             temp = Stu.elem[j];
                                 Stu.elem[j-1]=temp;
                     }
                     flag = 1;
                     Stu.length--;
                     fwrite();
                     printf("--------学号为%d的学生相关信息已删除!---------\n",number);
                 }

                else 
                {
                printf("-------不删除该同学信息,本程序退出---------\n");
                flag = 1;
                return ;
                }

             }

              else if( i == Stu.length -1  && flag == 0)
              {  
                    printf("当前学不存在,是否继续输入其他学号!(0:终止 1:继续):\n");
                      scanf("%d",&k);
                     if( k != 1) return ;
                    printf("请输入学号 :");
                    scanf("%d",&number);
                   i = -1;
              }
              i++;
           }

    //输入学生的学号;
    //检索当前学号的学生是否存在;
    //不存在,重新输入, 否则,提示是否删除,根据选择做相应的处理
}

//学生成绩输入,顺序表数据的修改
void   AddGrade(StudentList &Stu)
{ 
    int i,j,number;char a;
     fread();
    while(1)
    {
        printf("请输入学号:");
        scanf("%d",&number);
        for(i = 0 ; i < Stu.length ; i ++)
        if(Stu.elem[i].num  != number && i == Stu.length -1)
        {   printf("当前学生不存在,返回主程序!\n");
              return ;
        }
        else if ( Stu.elem[i].num == number)
        {
            j = i;
            break;
        }
         printf("-----------请继续输入语文,英语,数学三科成绩------------\n");
         scanf("%d",&Stu.elem[j].chinese);
         scanf("%d",&Stu.elem[j].english);
         scanf("%d",&Stu.elem[j].math);
         fwrite();
         printf("是否继续输入其他学生的三科成绩( y / n) ?\n");
         getchar();
         a=getchar();
         if(a  == 'n') return;
    }

    //输入学生的学号
    //检索当前学号的学生是否存在;
    //不存在,提示并返回主程序
    //存在,输入三科成绩,提示是否继续输入,是的则继续输入,否则该函数结束
}

//学生成绩的汇总
void SumGrade(StudentList &Stu)
{
    int i;
     fread();
    for(i = 0 ; i < Stu.length ; i ++)
    {
        Stu.elem[i].total = Stu.elem[i].chinese + Stu.elem[i].english +Stu.elem[i].math;
        Stu.elem[i].Aver = Stu.elem[i].total / 3.0;
    }
    fwrite();
    printf("-----------成绩汇总成功---------\n");
    //从第一个学生开始,将学生的三科成绩求和求平均成绩
}

//排序-----按语文成绩排序
void  BubbleSortbyCh(StudentList &Stu)
{
    Student temp; int i,j;
    fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].chinese < Stu.elem[j+1].chinese)
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }
   show(stu);
    //按语文成绩排序
}

//排序-----按英语成绩排序
void  BubbleSortbyEn(StudentList &Stu)
{
        Student temp; int i,j;
  fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].english < Stu.elem[j+1].english)
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }
    show(stu);
    //按英语成绩排序
}

//排序-----按数学成绩排序
void  BubbleSortbyMath(StudentList &Stu)
{
    Student temp; int i,j;
  fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].math < Stu.elem[j+1].math)
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }
    show(stu);
    //按数学成绩排序
}

//排序-----按总成绩排序
void  BubbleSortbyTotal(StudentList &Stu)
{
    Student temp; int i,j;
   fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].total < Stu.elem[j+1].total)
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }

            show(stu);
    //按总成绩排序
}
//排序-----按学号排序
void  BubbleSortbyNo(StudentList &Stu)
{
    Student temp; int i,j;
    fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].num > Stu.elem[j+1].num)
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }
       show(stu);
    //按学号排序
}
//排序-----按平均成绩排序
void  BubbleSortbyAver(StudentList &Stu)
{
    Student temp; int i,j;
    fread();
    for(i = 0 ; i <Stu.length - 1 ; i ++ )
        for(j = 0 ; j < Stu.length - i -1 ; j ++)
            if(Stu.elem[j].Aver < Stu.elem[j+1].Aver )
            {
                  temp=Stu.elem[j];
                   Stu.elem[j]=Stu.elem[j+1];
                   Stu.elem[j+1] = temp;
            }
     show(stu);

    //按平均成绩排序
}

//成绩修改——只修改一个学生的信息(对已经存在的成绩进行修改)
void ModifyGrade(StudentList &Stu)
{
    int i,number,n=1; char a;
    fread();
    while(n)
    {
    printf("请输入学号:");
    scanf("%d",&number);
    for(i = 0 ; i < Stu.length ; i ++)
        if(Stu.elem[i].num   == number )
        {
         printf("------------该学生成绩如下-------------\n");
         putchar('\n');
         printf("  \t 语 文  英 语   数 学\n");
         printf("  \t %3d   %3d     %3d\n",Stu.elem[i].chinese,Stu.elem[i].english,Stu.elem[i].math);
         printf("是否进行修改(y / n) ?\n");
         getchar();
         a=getchar();
         if(a == 'y')
         {
            printf("___________________请依次重新输入三科成绩!_______________\n");
            printf("语 文  英 语   数 学\n");
            scanf("%d%d%d",&Stu.elem[i].chinese,&Stu.elem[i].english,&Stu.elem[i].math);
            fwrite();
            n= 0;
         }
         else 
         {
            printf("-----------选择不修改该学生信息,本程序退出---------\n");
            return ;
         }
         break;     
        }
        if(i == Stu.length)
        {
            printf("该学生不存在,是否继续修改其他学生的信息(0:终止 1:继续):");
            scanf("%d",&n);
        }

    }
    //输入学号
    //查询该学号的学生是否存在
    //存在,则
              //输出1科成绩  //输出2科成绩   //输出3科成绩
              //提示是否修改,若修改,则输入新的成绩
}



//学生基本信息修改—-不能修改学号信息(只修改一个学生的)
void ModifyBasicInfor(StudentList &Stu)
{
int i,number,n=1; char a;
fread();
    while(n)
    {
    printf("请输入学号:");
    scanf("%d",&number);
    for(i = 0 ; i < Stu.length ; i ++)
        if(Stu.elem[i].num   == number )
        {
         printf("---------------该学生基本信息如下-------------\n");
         putchar('\n');
         printf("  \t姓    名    性   别     出 生 日 期\n");
         printf("  \t %5s      %5s      %4d年%2d月%2d日\n",Stu.elem[i].name,Stu.elem[i].sex,Stu.elem[i].birthday.year,
             Stu.elem[i].birthday.month,Stu.elem[i].birthday.day);
         printf("是否进行修改(y / n) ?\n");
         getchar();
         a=getchar();
         if(a == 'y')
         {
            printf("------------请重新输入该学生基本信息-------------\n");
            printf(" \t 姓 名    性   别     出生日期\n");
            scanf("%s%s%d%d%d",Stu.elem[i].name,Stu.elem[i].sex,&Stu.elem[i].birthday.year,
                &Stu.elem[i].birthday.month,&Stu.elem[i].birthday.day);
            fwrite();
            n= 0;
         }
         else 
         {
            printf("选择不修改该学生信息,本程序退出!\n");
            return ;
         }
         break;     
        }
        if(i == Stu.length)
        {
            printf("该学生不存在,是否继续修改其他学生的信息(0:终止 1:继续):");
            scanf("%d",&n);
        }

    }
    //输入学号
    //查询该学号的学生是否存在
    //存在,则
              //输出学生信息,提示是否修改,若修改,则输入新的信息
}

void Welcome()                 //系统显示界面
{
   system("cls");
   system("color 6f");
   printf("\n\t***************************************************************\n");
   printf("\n\t\t             常春藤学生管理系统\n");
   printf("\n\t      copyright to IVY(Chang Chun Teng) Corporation Ltd.\n");
   printf("\n\t***************************************************************\n");
}

int RLogin()  //登陆函数
{
    int i,j;
    char  username[20], password[20];
    for( i = 1; i<=3; i++)                 //规定用户尝试的次数不超过3次
    {
        Welcome();                         //显示欢迎界面
        printf("    username:");
        gets(username);
        printf("    password:");
        //gets(password);
        for(j = 0 ; j < 100 ; j ++)
        {
            password[j]=getch();
           if(password[j] == '\r') break;  //回车结束
           printf("*");
        }
        password[j]='\0';
        if((strcmp(username, "user01")) || (strcmp(password, "1234567")))
        {
            if(3-i>0)
                printf("用户名或密码错误,你还有 %d 次机会!\n", 3-i);  
            system("pause");
            system("cls");
        }
        else
            break; 
    }
    if( i < 3)
        return 1;
    else
        return 0;
}


void sortMenu()           //排序菜单
{
    printf("\n\t       常春藤学生成绩管理系统\n");
    printf("\n\t\t    数 据 排 序\n\n");
    printf("    ==============================================\n");
    printf("   \t\t1  按 学 号 排 序\n\n");
    printf("   \t\t2  按 语 文 成 绩 排 序\n\n");
    printf("   \t\t3  按 数 学 成 绩 排 序\n\n");
    printf("   \t\t4  按 英 语 成 绩 排 序\n\n");
    printf("   \t\t5  按 总 成 绩 排 序\n\n");
    printf("   \t\t6  按 平 均 成 绩 排 序\n\n");
    printf("   \t\t0  返 回 上 级 菜 单\n\n");
    printf("    ===========================================\n");
    printf("\t请选择功能(0—6):");
}

void ModifyData()         //修改菜单
{
    printf("\n\t         常春藤学生成绩管理系统\n");
    printf("\n\t\t    信  息  修  改\n\n");
    printf("    ===========================================\n");
    printf("   \t\t1  基本信息修改\n\n");
    printf("   \t\t2  成  绩 修 改\n\n");
    printf("   \t\t0  返回上级菜单\n\n");
    printf("    ===========================================\n");
    printf("\t请选择功能(0—2):");
}
//****************************用户函数定义结束*****************************


void main()                                            //主程序
{
   int        flag1,flag2,choice,pchoice;                       //choice用于主菜单的选择, pchoice用于2个子菜单的选择
                                //定义学生变量,用于存放学生的信息             
   if( RLogin() )
   {
       system("CLS");                                   //清除屏幕显示信息

       InitStudentList(stu);                            //初始化顺序表                     
       while(1)
       {   
           system("CLS"); 
           flag1 = 1 ,flag2 =1;
           MainMenu();                                  //显示操作界面
           scanf("%d", &choice);                        //用户功能选择
           switch(choice)
           {
               case 1: AddNewStudent(stu);     system("pause");  system("CLS");    break;   //调用相应的功能
               case 2: DelStudent(stu);        system("pause");  system("CLS");    break;   //调用相应的功能
               case 3: AddGrade(stu);          system("pause");  system("CLS");    break;   //调用相应的功能
               case 4: SumGrade(stu);          system("pause");  system("CLS");    break;   //调用相应的功能
               case 5: 
                   {   
                      while(flag1)
                      {
                       system("CLS");                                //清除屏幕显示信息
                       SumGrade(stu);
                       sortMenu();                                   //显示2级菜单
                       scanf("%d", &pchoice);                        //用户功能选择
                       switch(pchoice)
                       {
                          case 1:    BubbleSortbyNo(stu); system("pause");system("cls"); break;   //功能1                //调用相应的功能                          
                          case 2:    BubbleSortbyCh(stu); system("pause");system("CLS"); break;     
                          case 3:    BubbleSortbyMath(stu); system("pause");system("CLS"); break;
                          case 4:    BubbleSortbyEn(stu); system("pause");system("CLS");   break; 
                          case 5:    BubbleSortbyTotal(stu);system("pause");system("CLS"); break; 
                          case 6:    BubbleSortbyAver(stu); system("pause");system("CLS"); break; 
                          case 0:    flag1 = 0 ; break;//调用相应的功能
                          //.....                                    //其他功能依次在此增加
                       }
                      }
                    break;
                  }
               case 6:
                   {
                      while(flag2 )
                      {
                       system("CLS");                                //清除屏幕显示信息
                       ModifyData();                                 //显示2级菜单
                       scanf("%d", &pchoice);                        //用户功能选择
                       switch(pchoice)
                       {
                          case  1:   ModifyBasicInfor(stu);    system("pause");   system("CLS");    break;       //调用相应的功能  
                          case  2:   ModifyGrade(stu);         system("pause"); system("CLS"); break;
                          case  0:  flag2= 0;     break;       //调用相应的功能
                          //.....                                //其他功能依次在此增加
                          default:
                              {
                                  system("CLS");
                                  printf("输入有错误请重新输入:\n");
                              }
                       }
                      }
                       break;
                   }
               case 7: show(stu); system("pause");  system("CLS");    break; 
               //如果有其它功能,继续在这里添加
               case 0: 
                   {  system("CLS");                              
                      printf("\n\n    谢谢使用常春藤学生管理系统!\n");
                      exit(0);   
                   }
              default:
              {
                 system("CLS");
                 printf("输入有错误请重新输入:\n");
              }
           }
       }
   }
   else
   {
       printf("long in failure!\n");
       printf("please contact with administrator!\n");
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值