学生成绩管理系统升级版(c语言)

#include
#include
#include
#define max 100  //数组定义统一大小
int g = 0;                    //全局变量,为登录时输入密码次数
int student_number = 5;  //全局变量,student_number为学生的人数
  struct user      //定义一个结构体,存储用户登录账号和密码,并初始化五个管理员的信息
{
 char username[20];
 char password[20];
}user[5] = {
 {"蒋超", "1450824311"},
 {"李佳树", "2041775273"},
 {"刘英杰", "395636706"},
 {"胡友亮", "924056026"},
 {"黄家杨", "2946644844"}
};

struct student  //定义结构体,包含学生信息,并初始化五个学生的信息 
{
 char name[max];  //姓名
 char num[max];  //学号
 char sex[max];  //性别
 int chinese;  //语文成绩
 int mathematic;  //数学成绩
 int english;  //英语成绩
 int computer;  //计算机成绩
}s[5] = {
 {  "蒋超", "00001", "boy", 80,90,80,90},
 {  "李佳树", "00002", "boy", 60,80,90,50},
 {  "黄家杨", "00003", "girl", 85,65,75,90},
 {  "胡友亮", "00004", "boy", 55,65,75,80},
 {  "刘英杰", "00005", "girl", 90,95,98,99}
};

struct student* p;  //定义一个结构体指针

//主菜单函数声明
void login();    //登入函数
void main_menu();    //主界面函数
void input_record();    //输入学生成绩处理   1
void show_record();    //显示学生成绩处理   2   
void search_record();    //查询学生成绩处理   3
void change_record();    //更新学生成绩处理   4
void delete_record();    //删除学生信息   5
void calc_record();    //计算成绩处理   6
void save_record();    //保存处理   7
void exit_record();    //退出   8


//查询子函数声明
void search_by_num();    //学号查询
void search_by_name();   //姓名查询
void search_by_sex();    //性别查询
void search_by_exit();   //返回上一级


//计算子函数声明
void calc_sum();     //计算总成绩
void calc_ave();     //计算平均成绩
void calc_eixt();     //返回上一级


//自定义函数
void print_table();   //表头
void print_table_sum();  //总成绩表格
void print_table_ave();  //平均分表格
void read();        //将文件中的数据读入到结构体数组中

//微信搜索公众号:C语言中文社区,关注获取200G编程资料。
int main()        //*主函数
{
 login();  //首先进行管理员登录
 main_menu();  //登录成功后显示主界面
 return 0;
}


void login()    //登录函数,管理员使用该系统前需进行登录,定义密码只允许输错三次 
{
 int i;
 char id[20], password[20];
 printf("****登录界面****\n");
 printf("请输入账号名:");
 scanf("%s", id);
 printf("请输入密码:");
 scanf("%s", password);
 for (i = 0; i < 5; i++)  //遍历五个管理员的信息,如果输入的信息在初始化的信息中存在则登录成功
 {
  if (strcmp(id, user[i].username) == 0 && strcmp(password, user[i].password) == 0)
  {
   printf("登录成功!\n");
   system("cls");  //清屏函数
   main_menu();   //登录成功,打印主界面
   break;
  }
 }

 if (i == 5)     //遍历完一轮管理员信息,此时i=5且未找到符合的管理员信息,说明账号密码输入错误
 {
  system("cls");
  printf("登录失败!\n\n");
  g++; //有三次登录机会,每次登录都遍历一次user结构体
  if (g >= 3)  //若三次机会都用完,则退出系统
  {
   printf("你已经输错三次,将自动退出系统\n");
   exit(1);
  }
  else
  {
   login(); //否则,登陆成功,进入主界面
  }
 }
}


void main_menu()    //展示主菜单,并对用户的请求做出对应响应 
{
 read();    //将文件中的学生信息读取到链表中
 system("cls");  //清屏函数
 int x;
 //主菜单
 printf("*************************************************\n");
 printf("*\t欢迎使用高校学生成绩管理系统V2.0\t*\n");
 printf("*************************************************\n");
 printf("*\t\t1.输入学生信息\t\t\t*\n");
 printf("*\t\t2.显示学生信息\t\t\t*\n");
 printf("*\t\t3.查询学生信息\t\t\t*\n");
 printf("*\t\t4.更新学生信息\t\t\t*\n");
 printf("*\t\t5.删除学生信息\t\t\t*\n");
 printf("*\t\t6.计算学生成绩\t\t\t*\n");
 printf("*\t\t7.保存\t\t\t\t*\n");
 printf("*\t\t8.退出系统\t\t\t*\n");
 printf("*************************************************\n");
 printf("请输入你要执行的操作:");
 scanf("%d", &x);
 if (x == 1)
  input_record();   //输入信息 
 if (x == 2)
  show_record();   //显示信息 
 if (x == 3)
  search_record();  //查询信息 
 if (x == 4)
  change_record();   //更新信息 
 if (x == 5)
  delete_record();   //删除信息 
 if (x == 6)
  calc_record();   //计算成绩 
 if (x == 7)
  save_record();   //保存
 if (x == 8)
  exit_record();   //退出
 else
 {
  printf("输入错误,即将重新进入主界面\n");
  main_menu();
 }
}


void input_record()  //输入学生成绩函数    1
{
 //定义两个char类型变量来获取用户的输入 
 char v, z;
 //在开头位置做一个标记
 aa:
  {
  system("cls");  //清屏函数

  printf("请输入学生姓名:");
  scanf("%s", s[student_number].name);

  printf("请输入学生学号(五位):");
  scanf("%s", s[student_number].num);

  printf("请输入学生性别(boy/girl):");
  scanf("%s", s[student_number].sex);

  printf("请输入学生语文成绩:");
  scanf("%d", &s[student_number].chinese);

  printf("请输入学生数学成绩:");
  scanf("%d", &s[student_number].mathematic);

  printf("请输入学生英语成绩:");
  scanf("%d", &s[student_number].english);

  printf("请输入学生计算机成绩:");
  scanf("%d", &s[student_number].computer);

  printf("请选择是否保存(y或n):");
  scanf("%s", &z);

  if (z == 'y')  //若输入为y,则保存信息到文件中
  {
   student_number++;
   save_record();
  }

  printf("是否继续添加,请选择(y或n)(否会回到主界面):");
  scanf("%s", &v);

  if (v == 'y')  //若输入为y,则跳转至开头标记aa处
  {
   goto aa;
  }

  else
  {
   main_menu();
  }
 }
}


void show_record()  //显示学生信息函数    2   
{
 system("cls");  //清屏函数

 int i, k, x;
 char get;
 x = student_number;

 print_table();  //打印表头 
 for (i = 0; i < x; i++) //打印表格数据 
 {
  printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
 }

 printf("\n1.返回主界面\n2.返回上一级\n");
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
 {
  main_menu();
 }

 else if (k == 2)
 {
  main_menu();
 }

}


void search_record()   //查询学生成绩函数    3
{
 system("cls");  //清屏函数

 int x;

 //打印菜单
 printf("1 按学号查询\n");
 printf("2 按姓名查询\n");
 printf("3 按性别查询\n");
 printf("4 返回上一级\n");
 printf("请输入:");
 scanf("%d", &x);

 if (x == 1)
  search_by_num(); //按学号查询函数 
 if (x == 2)
  search_by_name(); //按姓名查询函数 
 if (x == 3)
  search_by_sex(); //按性别查询查询 
 if (x == 4)
  search_by_exit(); //返回主界面
 else
 {
  printf("输入错误\n");
  search_record();  //重新查询
 }

}


void print_table()     //打印学生信息表格的表头函数 
{
 printf("+----------+----------+----------+------+------+------+------+\n");
 printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|\n");
 printf("+----------+----------+----------+------+------+------+------+\n");
}


void search_by_num()    //查询学生信息函数的子函数——按学号查询函数 
{
 int i, k;
 char num1[max];  //用户输入学生学号

 system("cls");  //清屏函数

 printf("请输入要查找的学号:");
 scanf("%s", num1);

 for (i = 0; i < student_number; i++)  //遍历链表,寻找是该学号是否存在
 {
  if (strcmp(num1, s[i].num) == 0)
  {
   print_table();
   printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
   break;
  }
 }

 if (i == student_number)  //student_number为全局变量学生的人数
 {
  printf("不存在这个学号!\n\n");
 }

 printf("1.返回主界面\n2.继续查询\n");
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
 {
  main_menu();
 }

 else
 {
  search_record();
 }
}


void search_by_name()    //询学生信息函数的子函数——按姓名查询函数 
{
 int i, k;
 char name1[max]; //用户输入学生姓名

 system("cls");  //清屏函数
 printf("请输入查找的姓名:");
 scanf("%s", name1);

 for (i = 0; i < student_number; i++)  //遍历链表,看该名字是否存在
 {
  if (strcmp(name1, s[i].name) == 0)
  {
   print_table();
   printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
   break;
  }
 }

 if (i == student_number) 
 {
  printf("不存在这个姓名\n");
 }
 
 printf("1.返回主界面\n2.继续查询\n");
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
 {
  main_menu();
 }

 else
 {
  search_record();
 }
}


void search_by_sex()    //询学生信息函数的子函数——按性别查询函数 
{
 int i, k;
 char sex1[max];  //用户输入学生的性别

 system("cls");  //清屏函数
 printf("请输入查找的性别(boy/girl):");
 scanf("%s", sex1);
 print_table();   //表格

 for (i = 0; i < student_number; i++)  //遍历链表,看该性别是否存在
 {
  if (strcmp(sex1, s[i].sex) == 0)
   printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
 }

 if (i == student_number)
 {
  printf("1.返回主界面\n2.继续查询\n");
 }
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
 {
  main_menu();
 }

 else
 {
  search_record();
 }
}


void search_by_exit()    //返回上一级(返回主菜单)的函数 
{
 main_menu();
}


void change_record()    //更新学生成绩函数    4
{
 //输入学生学号修改学生信息并保持

 system("cls");  //清屏函数
 int i;
 char name2[max], sex2[max];
 int chinese2, mathematic2, english2, computer2;
 char numbefor[max];

 printf("请输入要修改的学生的学号:");     //用户输入学生学号
 scanf("%s", numbefor);

 for (i = 0; i < student_number; i++)  //遍历链表,看该学号是否存在
 {
  if (strcmp(numbefor, s[i].num) == 0) //存在
  {
   printf("修改前:\n");
   print_table();  //打印表格

   printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);

   printf("请分别输入修改后信息\n");

   printf("请输入学生姓名:");
   scanf("%s", name2);

   printf("请输入学生性别:");
   scanf("%s", sex2);

   printf("请输入学生语文成绩:");
   scanf("%d", &chinese2);

   printf("请输入学生数学成绩:");
   scanf("%d", &mathematic2);

   printf("请输入学生英语成绩:");
   scanf("%d", &english2);

   printf("请输入学生计算机成绩:");
   scanf("%d", &computer2);

   printf("请选择是否保存(y或n):");
   getchar();
   if (getchar() == 'y')  //修改学生信息
   {
    strcpy(s[i].name, name2);
    strcpy(s[i].sex, sex2);
    s[i].chinese = chinese2;
    s[i].mathematic = mathematic2;
    s[i].english = english2;
    s[i].computer = computer2;
    save_record();  //保存学生信息到文件中

    printf("修改后:\n");
    printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
    printf("\n");
   }
   break;
  }
 }
 if (i == student_number)
 {
  printf("很抱歉!没有这位学生\n");
 }
 printf("是否继续修改,请选择(y/n):");
 getchar();
 if (getchar() == 'y')
 {
  change_record();  //继续修改
 }
 else
 {
  main_menu();  //返回主界面
 }
}


void delete_record()    //删除学生信息函数    5
{
 //输入学生学号删除学生信息并保存 

 system("cls");
 char num4[max];
 char a;
 int v;
 printf("请输入要删学生的学号:\n");
 scanf("%s", num4);

 int i, j;
 for (i = 0; i < student_number; i++)   //遍历链表,看学号是否存在
 {
  if (strcmp(num4, s[i].num) == 0)  //存在,执行删除操作
  {
   printf("你将要删除该学生信息\n");
   printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
   printf("\n");
   printf("y 确认删除\tn 取消\n");
   printf("请输入:");
   scanf("%s", &a);
   if (a == 'y')
   {
    for (j = i; j < student_number; j++)  //将链表中该节点指向下一节点以实现删除操作
    {
     strcpy(s[j].num, s[j + 1].num);  strcpy(s[j].name, s[j + 1].name);  strcpy(s[j].sex, s[j + 1].sex);
     s[j].chinese = s[j + 1].chinese;  s[j].mathematic = s[j + 1].mathematic;  s[j].english = s[j + 1].english;
     s[j].computer = s[j + 1].computer;
    }
    printf("删除成功!\n");
    student_number--;  //全局变量,student_number-1
    save_record();  //将删除后的信息保存到文件中
   }
   else
   {
    printf("已取消操作\n");
   }

  }
 }
 if (i == student_number)  //该学号不存在
 {
  printf("没有这个学号的学生\n");
 }
 printf("1.继续删除 2.返回主界面\n");
 printf("请输入:");
 scanf("%d", &v);
 if (v == 1)
 {
  delete_record();
 }
 else
 {
  main_menu;
 }
}


void calc_record()    //计算学生成绩函数    6
{
 //有两个功能,一个是计算总成绩一个是计算平均分 

 system("cls");  //清屏函数
 int x;
 printf("1 计算总成绩\n");
 printf("2 计算平均分\n");
 printf("3 返回上一级\n");
 printf("请输入:");
 scanf("%d", &x);

 if (x == 1)
  calc_sum();  //计算总成绩
 if (x == 2)
  calc_ave();  //计算平均成绩
 if (x == 3)
  main_menu();  //返回主界面
 else
 {
  printf("输入错误\n");
  calc_record(); //重新打印该界面
 }
}


void print_table_sum()    //计算总成绩函数的子函数——打印总成绩表格的表头 
{
 printf("+----------+----------+----------+------+------+------+------+------+\n");
 printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|总成绩|\n");
 printf("+----------+----------+----------+------+------+------+------+------+\n");
}


void print_table_ave()    //计算平均分函数的子函数——打印平均成绩表格的表头 
{
 printf("+----------+----------+----------+------+------+------+------+------+\n");
 printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|平均分|\n");
 printf("+----------+----------+----------+------+------+------+------+------+\n");
}


void calc_sum()    //计算学生成绩函数的子函数——计算总成绩函数 
{
 print_table_sum();  //打印表头
 int i, k, sum = 0;  //sum为学生的总成绩
 int x = student_number;  //student_number为学生人数

 for (i = 0; i < x; i++)
 {
  sum = s[i].chinese + s[i].mathematic + s[i].english + s[i].computer;
  printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6d\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, sum);
 }

 printf("1 返回上一级\n2 返回主界面\n ");
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
  calc_record();
 if (k == 2)
  main_menu();
 else
 {
  printf("输入错误!\n");
  calc_record();
 }
}


void calc_ave()    //计算学生成绩函数的子函数——计算平均成绩函数 
{
 print_table_ave();  //打印表头
 int i, k;
 int x = student_number;  //student_number为学生人数
 float ave;  //ave为学生平均成绩

 for (i = 0; i < x; i++)
 {
  ave = (s[i].chinese + s[i].mathematic + s[i].english + s[i].computer) * 0.25;
  printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6.2f\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, ave);
  if (i == 6)
  {
   break;
  }
 }

 printf("1 返回上一级\n2 返回主界面\n ");
 printf("请输入:");
 scanf("%d", &k);

 if (k == 1)
  calc_record();
 if (k == 2)
  main_menu();
 else
 {
  printf("输入错误!\n");
  calc_record();
 }
}


void calc_eixt()    //返回上一级(返回主菜单)函数 
{
 main_menu();
}


void save_record()  //保存学生信息函数    7(将结构体数组学生数据写入到文件中) 
{
 FILE* fp;  //定义一个文件指针
 int i;

 //若文件打开失败
 if ((fp = fopen("student-list", "wb")) == NULL)  //以二进制方式对文件进行读写
 {
  printf("cannot open file\n");
  return;
 }

 fwrite(&student_number, 4, 1, fp);     //将学生人数写入文件

 for (i = 0; i < student_number; i++)     //二进制写
 {
  if (fwrite(&s[i], sizeof(struct student), 1, fp) != 1)
  {
   printf("file write error\n"); //出错处理
  }
  else
  {
   printf("file write sucess\n"); //文件写入成功
  }
 }
 fclose(fp);  //关闭文件指针
}


void read()     //将文件中的数据读入到结构体数组中
{
 FILE* fp;  //定义一个文件指针
 int i;

 //若文件打开失败
 if ((fp = fopen("student-list", "rb")) == NULL)  //以二进制方式读取文件
 {
  printf("cannot open file\n");
  return;
 }

 fread(&student_number, 4, 1, fp);     //读取学生人数

 for (i = 0; i < student_number; i++)  //二进制写
 {
  if (fread(&s[i], sizeof(struct student), 1, fp) != 1)
  {
   printf("file read error\n"); //出错处理
  }
  else
  {
   printf("file read sucess\n"); //文件读取成功
  }
 }
 fclose(fp);  //关闭文件指针
}


void exit_record()   //退出系统函数    8
{
 printf("感谢您的使用,已退出!");
 exit;

 

你可能感兴趣的:(算法,c语言,数据结构)