魔兽亡灵骑士:C语言(学员管理系统)

来源:百度文库 编辑:中财网 时间:2024/05/12 13:57:33
/**************************************************************************
      北大青鸟学员管理系统。。
  此程序可实现以管理员方式操作学员的学号,姓名,三门成绩,以及平均成绩的录入,
  读取,删除,排序,查找,保存功能。并提供普通帐户对学员信息的浏览。
***************************************************************************/
#include
#include
#include
int count=0,flag;           //定义两个全局变量,count为总录入人数。flag为一个标记
char ch;             //定义一个全局字符变量,为程序经常执行“是否继续”输入
struct student            //声明一个结构体,并作为全局变量。
{
char num[5];           //学号
char name[30];           //姓名
float score[3];           //三门课程成绩
float pinjun;           //平均成绩
}stu[50];             //声明结构数组可存放50名学生
void denglu();            //选择登录函数
void administrator();          //管理员界面
void guess();            //普通帐户界面
void input();            //录入函数
void charu();            //插入函数
void xiugai();            //修改函数
void del();             //删除函数
void output();            //显示函数
void jiang();            //降序排列函数
void sheng();            //升序排列函数
void find();            //查找函数
void exit1();            //退出函数
void jilu();            //读取上次记录
void read_count();           //读取总人数值
void save_count();           //保存总人数值
void read();            //读取学员信息
void save();            //保存学员信息
void main()             //主函数
{
denglu();            //主函数中调用登录函数
}
void denglu()            //登录函数
{
char admin[30],pass[20];        //字符数组分别用于存放用户名,密码
char pass1[20]="123456";        //字符串用于存放默认密码
int i,j;            //统计数组下标
/***********************************登录前界面***********************************************/
printf("\n\n\n\n\t\t\t★★★★★★★★★★★★★★★");
printf("\n\n\t\t\t★    学 员 管 理 系 统     ★\n\n\t\t\t★★★★★★★★★★★★★★★\t\t\t\t\n\n\n");

printf("\t﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉\n");
getch();
do{
  printf("\n\n\t\t\t1:管理员帐户\n\t\t\t2:普通帐户\n\t\t\t0:退出程序\n\n\t\t\t");
  printf("\n\t\t\t请选择登录类型:");
  fflush(stdin);
  ch = getchar();
  switch(ch)            //分支实现用户输入的功能
   {
    case '1':          //选择管理员登录
      printf("\n\t\t\t请输入用户名:");      
      fflush(stdin);        
      gets(admin);
      fflush(stdin);
      printf("\n\t\t\t请输入密码:");      
      i=0;            
      /*以下用于输入密码,从键盘得到一个符并赋给字符数组。同时打印一个*号。直到遇\n结束。*/
      do{
       fflush(stdin);
       ch=getch();
       pass=ch;
       if(ch!=13)
       {
        printf("*");
       }
       i++;
      }while(ch!=13);
      /* 以下用于判断密码是否为管理员密码,将用户输入密码串与系统内设密码相比,
      相等则继续,否则跳出  ,同时返回一个j的值                                           */
      for(j=0;j<6;j++)
      {
       if(pass[j]==pass1[j])
        continue;
       else
        break;
      }
      if((j==6)&&(strcmp(admin,"admin")==0)&&(i==7))  //判断用户名,密码是否为管理员。
       {
        printf("\n\t\t\t登录中请稍等");
        for(i=0;i<6;i++)
         {
          Sleep(500);
          printf(".");
         }
        system("cls");        //系统清屏
        printf("\n登录成功,当前是管理员账户."); //成功登录
        administrator();       //调用管理员界面函数
       }
      if((strcmp(pass,pass1)!=0)||(strcmp(admin,"admin")!=0))  //用户名,密码错误,则跳出重新选择
       {
        printf("\n\t\t\t用户名或密码错误,请重新选择");
        break;
       }
    case '2':               //分支实现用户输入的功能:游客
      printf("\n\t\t\t将以普通帐户登录");
      for(i=0;i<6;i++)           //循环控制输出系统等待时间
          {
           Sleep(500);
           printf(".");
          }
      system("cls");            //清屏
      printf("\n登录成功,当前是普通帐户.");
      guess();             //调用普通帐户界面函数
    case '0':               //分支实现用户输入的功能:退出
     /******************************退出时显示界面***********************************************/
     system("cls");
     printf("\n\n\n\n******************************************************************************\n");
     printf("\n\t\t\t关于学员成绩管理系统\n");
     Sleep(800);
     printf("\n\t\t\t作者 赛思特组\n");
     Sleep(800);
     printf("\n\t\t\t组员:汪波 王勃 张小惠 李承檬 田庆康\n");
     Sleep(800);
     printf("\n\t\t\t特别鸣谢:北大青鸟清河中心\n");
     Sleep(800);
     printf("\n\t\t\t北大青鸟TS111班 2008-5-19\n");
     Sleep(800);
     printf("\n\t\t\tCopyright(C)2008\n");
     Sleep(800);
     printf("\n******************************************************************************\n\n\n\n\n\n\n");
    
     printf("正在退出请稍候");
     for(i=0;i<6;i++)            //循环控制退出等待时间
      {
       Sleep(500);
       printf(".");
      };
     system("cls");             //清屏
     printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t成功退出!\n\n\t\t\t\t谢谢使用!\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
     exit(0);              //终止程序
    default:               //若用户输入错误。则跳出继续循环。
     {
      printf("\n\t\t\t输入错误!");
      continue;
     }
  }
}while(ch!='1'||ch!='2');              //判断用户输入不为1或者2时执行循环
}
void administrator()                //管理员函数
{
char sel;                  //字符变量,控制选择降序或者升序
int i;
jilu();                   //调用函数,询问用户是否读取上次操作记录。
do{
   /************************管理员主界面*******************************/
   printf("\n\n\t\t\t〖\t学 员 管 理 系 统\t〗\t\n");
   printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");                //提示信息
   printf("\n\t\t︴\t\t1: 录入新学员信息\t\t︴");
   printf("\n\n\t\t︴\t\t2: 插入新学员信息\t\t︴");
   printf("\n\n\t\t︴\t\t3: 修改学员信息  \t\t︴");
   printf("\n\n\t\t︴\t\t4: 删除学员信息  \t\t︴");
   printf("\n\n\t\t︴\t\t5: 查看学员信息  \t\t︴");
   printf("\n\n\t\t︴\t\t6: 顺序排列学员  \t\t︴");
   printf("\n\n\t\t︴\t\t7: 查找学员      \t\t︴");
   printf("\n\n\t\t︴\t\t8: 保存所有信息  \t\t︴");
   printf("\n\n\t\t︴\t\t0: 退出          \t\t︴\n");
   printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");
   printf("\n请选择您要进行的操作(0-8): ");        //操作选择
   fflush(stdin);
   ch = getchar();
   switch(ch)                //分支实现各项功能
    {
     case '1': system("cls");input();system("cls");continue;   //调用记录函数 并清屏
     case '2': system("cls");charu();system("cls");continue;   //调用插入函数 并清屏
     case '3': system("cls");xiugai();system("cls");continue;  //调用修改函数 并清屏
     case '4': system("cls");del();system("cls");continue;   //调用删除函数 并清屏
     case '5':
       system("cls");
       output();            //调用显示函数 并清屏
       system("cls");
       continue;
          
     case '6':
      system("cls");
      printf("\n程序将按成绩排序:\n\na:降序\t\tb:升序\n\n请选择:");    
      fflush(stdin);
      sel = getchar();
      if(sel=='a'||sel=='A')            //选择成绩降序,则调用降序函数
      {
       jiang();
       output();
      }
      else if(sel=='b'||sel=='B')           //选择成绩升序,则调用降序函数
      {
       sheng();
       output();
      }
      system("cls");
      continue;
     case '7': system("cls");find();system("cls");continue;   //调用查找函数
     case '8':
      system("cls");
      printf("\n正在保存,请稍候!");
        for(i=0;i<6;i++)         //循环控制输出系统等待。。。。。。
         {
          Sleep(500);
          printf(".");
         }
      save();              //调用保存函数
      printf("\n保存成功。\n");
      printf("\n任意键继续!");
      fflush(stdin);
      ch = getch();
      
      continue;  
     case '0':
      printf("是否保存当前更改?(y/n)");
      fflush(stdin);
      ch = getchar();
      if(ch=='y'||ch=='Y')
       {
        printf("\n正在保存,请稍候!");
        for(i=0;i<6;i++)         //循环控制输出系统等待。。。。。。
         {
          Sleep(500);
          printf(".");
         }
        save();
        printf("\n保存成功。\n");
        exit1();
        system("cls");
       }
      else{
       exit1();
       system("cls");
       }
       continue;            //退出函数
     default:
      {
       printf("\n输入错误!请重新输入\n");      //提示选择错误的信息
       flag=1;             //使标记值为真并跳出switch 执行下次循环
       break;
      }
    }
  }while(1);
}
void guess()                  //普通帐户函数
{
int flag=1;                  //定义检查标记
char sel;                  //字符变量,控制选择降序或者升序
printf("\n\n\n\n\t\t\t〖\t学 员 管 理 系 统\t〗\t\n");
do{
  /*****************************普通帐户主界面**********************************/
  printf("\n\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");                //提示信息
  printf("\n\t\t︴\t\t1: 查看学员信息  \t\t︴");
  printf("\n\n\t\t︴\t\t2: 顺序排列学员  \t\t︴");
  printf("\n\n\t\t︴\t\t3: 查找学员      \t\t︴");
  printf("\n\n\t\t︴\t\t0: 退出          \t\t︴\n");
  printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");
  printf("\n\n\n请选择您要进行的操作(0-3): "); //操作选择
  fflush(stdin);
  ch = getchar();
  printf("\n--------------------------------------\n");
  switch(ch)                  //分支实现用户输入各项功能
   {
    case '1': system("cls");output();system("cls");continue;    //调用显示函数  
    case '2':                //实现排序
      system("cls");
      {
      
      printf("\n程序将按成绩排序:\n\na:降序\t\tb:升序\n\n请选择:");
      fflush(stdin);
      sel = getchar();
      if(sel=='a')             //选a则实现降序
      {
       jiang();      
       output();             //调用降序函数后调用显示函数
      }
      else if(sel=='b')            //选b则实现升序
      {
       sheng();
       output();             //调用降序函数后调用显示函数
      }
      system("cls");
      continue;  
     }
    case '3': system("cls");find();system("cls");continue;     //调用查找函数
    case '0': exit1();system("cls");continue;        //退出
    default:
     {
      printf("\n输入错误!请重新输入\n");        //提示选择错误的信息
      flag=1;               //使标记值为真并跳出switch
      system("cls");
      continue;
     }
   }
}while(flag=1);
}
void input()                   //录入函数
{
int i=0,j;                   //i控制结构数组元素,j 为标记
float s=0;
printf("\n请输入学员信息:\n");
do{
  float s=0;                  //初始化总成绩为0
  do{
   printf("请输入学号:");
   fflush(stdin);
   gets(stu[count].num);              //接收用户输入学号
   for(i=0;i   {
    if(strcmp(stu.num,stu[count].num)==0)        //判断用户输入学号是否已经存在结构数组中
     {
      printf("\n学号已存在,请重新输入!\n");
      j=1;               //标记为1
      break;               //存在则跳出内循环。
     }
    else
     j=0;                //否则标记为0
   }
  }while(j==1);                 //判断标记为1时执行循环
  printf("请输入姓名:");              
  fflush(stdin);                 //接收输入姓名
  gets(stu[count].name);
  for(j=0;j<3;j++)                //循环接收三门课程成绩并累加和
   {
    fflush(stdin);
    printf("请输入第%d门成绩:",j+1);
    scanf("%f",&stu[count].score[j]);
    s=s+stu[count].score[j];          
   }
  stu[count].pinjun = s/3;              //求平均成绩
  count++;
  printf("是否继续录入?(y/n)");
  fflush(stdin);
  ch = getchar();
}while(ch=='y'||ch=='Y');               //循环是否继续
save();                    //执行录入完后保存
}
void charu()                   //插入函数
{
int i=0,j;                   //i,j控制下标
float s=0;                   //s存放累加和并初始化为0
printf("\n插入前学员信息:\n");              //显示插入前信息
output();                   //调用显示函数
printf("\n请插入学员信息:\n");              //执行插入
do{
  float s=0;
  do{
   printf("请输入学号:");
   fflush(stdin);
   gets(stu[count].num);
   for(i=0;i   {
    if(strcmp(stu.num,stu[count].num)==0)        //判断学号是否已经存在,如存在,则跳出执行下次循环。
     {
      printf("\n学号已存在,请重新输入!\n");
      flag=1;               //标记为1
      break;
     }
    else
     flag=0;                //否则标记为0
   }
  }while(flag==1);                //标记为1时继续循环
   printf("请输入姓名:");
   fflush(stdin);
   gets(stu[count].name);
   for(j=0;j<3;j++)               //循环控制三门成绩输入
   {
    fflush(stdin);
    printf("请输入第%d门成绩:",j+1);
    scanf("%f",&stu[count].score[j]);
    s+=stu[count].score[j];             //累加和
   }
  stu[count].pinjun = s/3;              //求平均值
  count++;                  //每插入一名学员,人数加1
  printf("是否继续插入?(y/n)");
  fflush(stdin);
  ch = getchar();
}while(ch=='y'||ch=='Y');               //判断是否继续
printf("\n插入后学员信息:\n");              //显示插入后学员信息  --调用降序函数--调用显示函数
jiang();
output();                   //插入后显示
save();                    //保存
}
void xiugai()                  //修改函数
{
char xiu[5];                 //定义一个字符串,用于查找结构体学号成员
int i,j;
float s = 0;                 //总成绩S
do{
  printf("\n请输入要修改的学员学号:");
  fflush(stdin);
  gets(xiu);
  for(i=0;i<=count;i++)              //循环用于查找学号
   {
    if(strcmp(xiu,stu.num)==0)          //如果用户输入学号在结构体中查到。则执行
    {                 //此时下标i正好指向要修改的元素
     printf("\n 请选择要修改的部分\n");        //选择修改内容。
     printf("\n 1: 学号");
     printf("\n 2: 姓名");
     printf("\n 3: 成绩");
     printf("\n请选择: ");
     fflush(stdin);
     ch=getchar();
     switch(ch)              //分支用于选择
      {
       case '1':
        do{
        printf("\n请输入新的学号: ");      //修改学号
        fflush(stdin);
        gets(stu.num);
        for(j=0;j         {
          if((ji)&&(strcmp(stu[j].num,stu.num)==0))  //判断学号是否已经存在,如存在,则跳出执行下次循环。
           {
            printf("\n学号已存在,请重新输入!\n");
            flag=1;        //标记为1
            break;
           }
          else
           flag=0;         //否则标记为0
         }
        }while(flag==1);
        break;
       case '2':            //修改姓名
        printf("\n请输入新的姓名: ");
        fflush(stdin);
        gets(stu.name);
        break;
       case '3':            //修改成绩并重新计算平均值
        for(j=0,s=0;j<3;j++)
         {
          fflush(stdin);
          printf("请输入第%d门成绩:",j+1);
          scanf("%f",&stu.score[j]);
          s+=stu.score[j];
         }
        stu.pinjun = s/3;
        break;
       default:
         printf("\n没有此项操作!\n");
         flag=1;           //标记
      }
     if(flag!=1)              //如果有操作,,则提示修改成功
      {
       printf("\n 修改成功!该学员修改后的信息如下\n");
       printf("学号\t姓名\tc成绩\tj成绩\ts成绩\t平均成绩\n");
       printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.pinjun);
       break;
      }
    }
    if(strcmp(xiu,stu.num)!=0)          //如果未找到学号,则继续执行循环
     {
      continue;
     }
   }
  if(i>count)                 //如果下标越界,则未找。
   {
    printf("没找到此学号\n");
   }
  printf("是否继续修改?(y/n)");
  fflush(stdin);
  ch = getchar();
}while(ch=='Y'||ch=='y');              //循环是否继续
save();                   //保存
}
void del()                   //删除函数
{
char dell[5];                 //定义字符串,用于查找学号
int i;                   //i为下标
struct student temp;               //声明一个结构体。用于作容器
do{
  printf("\n请输入要删除的学员学号:");
  fflush(stdin);
  gets(dell);
  for(i=0;i<=count;i++)              //循环查找学员学号,找着则退出循环
   {
    if(strcmp(dell,stu.num)==0)
     {
      break;
     }
   }
  if(i>count)                 //如果下标越界,则说明未找以。
   {
    printf("\n找不到这个学员!\n");
   }
  if(i<=count)                //提示找到, ,询问是否删除
   {
    printf("\n是否要删除%s号学员的信息(Y/N):",stu.num);
    fflush(stdin);
    ch = getchar();
    if(ch=='Y'||ch=='y')
     {
      for(;i       {
        temp = stu;          //删除某个学员,并把后面元素前移一位。
        stu = stu;
        stu = temp;
       }
      count--;             //总人数-1
      printf("删除成功\n");
     }
   }
  printf("是否继续删除?(y/n)");
  fflush(stdin);
  ch = getchar();
}while(ch=='Y'||ch=='y');              //判断是否继续
save();                   //保存
}
void output()                  //显示函数
{

int i;                   //定义I为下标
if(count>0)                  //如果 有录入记录,则显示相关信息
   {
    printf("\n\t\t\t学员信息:\n\n");
    printf("学号\t姓名\tc成绩\tj成绩\ts成绩\t平均成绩\n");
    
    for(i=0;i     {
      printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.pinjun);
     }
   }
  else                  //否则说明文件无记录
   {
    printf("\n文件中无任何信息!\n");
   }
  printf("\n任意键退出查看!");
  fflush(stdin);
  ch = getch();
}
void jiang()                  //降序函数
{
int i,j;                  //i控制大循环。j控制小循环
struct student temp;               //定义一个结构体容器
for(i=0;i  {
   for(j=0;j    {
     if(stu[j].pinjun     {
      temp = stu[j];
      stu[j] = stu[j+1];
      stu[j+1] = temp;
     }
    }
  }
}
void sheng()                  //升序函数
{
int i,j;                  //i控制大循环。j控制小循环
struct student temp;               //定义一个结构体容器
for(i=0;i  {
   for(j=0;j    {
     if(stu[j].pinjun>stu[j+1].pinjun)        //如果第一个元素大于第二个,则交换位置,然后下标后移一位
     {
      temp = stu[j];
      stu[j] = stu[j+1];
      stu[j+1] = temp;
     }
    }
  }
}
void find()                   //查找函数
{
char s[5];                  //定义一个数组,用于查找学号
int i;
printf("\n请输入要查找的学员学号:");
fflush(stdin);
gets(s);
for(i=0;i  {
   if(strcmp(s,stu.num)==0)            //如果学号一样,则显示输出。
    {
     printf("该学员信息如下:\n");
     printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
     printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.pinjun);
     break;
    }
  }
if(i>=count)                 //如果下标越界未找着相同的,则显示没找到。
   {
    printf("没找到该学号\n");
   }
printf("\n\n按任意键返回\n");
fflush(stdin);
ch = getch();                 //控制画面停顿
}

void exit1()                  //退出函数
{
int i;                   //i 为计数器
printf("\n\n正在退出,请稍等");
for(i=0;i<6;i++)                //循环控制输出系统等待。。。。。。
  {
  Sleep(500);
  printf(".");
  }
system("cls");                 //清屏
printf("\n\t\t\t\t\t成功退出");
denglu();                  //返回登录界面
}
void read_count()                 //读取总人数值
{
FILE *reade_Count;

if((reade_Count=fopen("count.txt","r"))!=NULL)
{
  fscanf(reade_Count,"%d",&count);
}
fclose(reade_Count);
}
void save_count()                 //保存总人数值
{
FILE *write_count;
write_count = fopen("count.txt","w");
fprintf(write_count,"%d",count);
fclose(write_count);
}
void read()                   //读取学员信息
{
struct student stu1;
FILE *fp;
int i;

if((fp=fopen("student.txt","r"))==NULL)
{
  printf("文件中无记录,按任意键新建\n");
  fflush(stdin);
  ch=getch();
}
else
{
  printf("\n读取成功,正在进入");
   for(i=0;i<6;i++)         //循环控制输出系统等待。。。。。。
    {
     Sleep(500);
     printf(".");
    }
  read_count();
  for(i=0;i  {
   fscanf(fp,"%s%s%f%f%f%f",stu.num,stu.name,&stu.score[0],&stu.score[1],&stu.score[2],&stu.pinjun);
  }
  fclose(fp);
}
}
void save()                   //保存学员信息
{
FILE *fp;                  /*FILE4个字母都要大写*/
int i;
fp=fopen("student.txt","w");
for(i=0;i<50;i++)
  {
   fprintf(fp,"%s %s %f %f %f %f ",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.pinjun);
  }
fclose(fp);
save_count();
}
void jilu()
{
int i;
FILE *fp;
if((fp=fopen("student.txt","r"))!=NULL)
  {
   printf("\n\n是否读取上次记录?(y/n)");
   fflush(stdin);
   ch = getchar();
   if(ch=='Y'||ch=='y')
    {
     printf("\n读取中,请稍候");
     for(i=0;i<6;i++)         //循环控制输出系统等待。。。。。。
      {
       Sleep(500);
       printf(".");
      }
     read();
    }
  }
else
  {
   return;
  }
}