C语言编写实现学生管理系统

本文实例为大家分享了C语言实现学生管理系统的具体代码,供大家参考,具体内容如下

项目介绍

学生信息管理系统是一个基于C语言开发的系统,其中有用到冒泡排序、指针、结构体、二位数组等知识。通过模块化的方法编写各个函数,其中在主界面函数调用各个模块的函数的实现以下具体功能:

1、学生信息的增删改查
2、学生成绩的排序
3、统计学生人数
4、显示所有学生的信息。
5、对学生信息存档

总体设计

本实验通过在main函数打开保存数据结果的文档和调用主界面函数;在主界面函数welcom()中实现边框的绘制,以及显示各个功能及各个功能对应的函数实现方法。

录入信息函数addInfo():此函数通过结构体student来保存录入的信息,其中为了确保数据的后续操作的准确性,通过学号的唯一性来标识每个学生的信息,通过编写及调用一个isIdSame()函数,该函数通过遍历所有学号确认学号来保障学号的唯一性,学号重复会提示用户需要重新输入函数。

查找学生信息函数:通过学号查找学生的信息,编写并调用一个findIndex()函数,该函数会遍历结构体的学号信息,查询到会返回该学号的坐标,没有找到该学号则返回-1;通过变量target来保存返回的结果。如果target不等于-1,则程序找到了该学号,通过编写并调用一个showInfo()函数来输出所有该学生的信息;否则输出查询此人,因为下标不可能为负数。

更新学生信息函数update():通过学号来找到该学生,调用findIndex()函数来确定该学生的位置,如果返回结果是小于0则函数结束,查无此人;若大于0则找到该学生,通过do…while函数switch选择语句的嵌套来进行用户需要求改某一项的内容。

删除函数del():查找学生的步骤跟更新学生信息函数的流程一样,如果findIndex()函数小于0则函数结束,否则通过一个for循环把结构体的数组从光标开始往前覆盖从而达到删除效果。

插入学生信息函数inserInfo():通过要求用户输入位置来定位插入到位置,输入用户输入的大于结构体数组的总数则插入到最后一个数组。否则通过一个for循环,把数组从最后开始往后移一位,把用户输入的位置的结果移到后一数组就编写并调用插入函数inserCurrentInfo()对当前位置数组进行覆盖插入。inserCurrentInfo()函数只负责对接收到的该位置的元素所有信息的写入。

排序函数sortTotal():创建一个临时变量提供元素与元素之间交换信息。通过双循环嵌套结构进行结构体的分数进行大小对比、交换位置来进行冒泡排序。最后排序完成之后输出分数由高到低排序的所有学生的信息。

显示学生信息函数showAllInfo():该函数通过全局变量count(该变量记录了所有添加、插入或删除过的学生信息,能准确记录学生的总人数)通过for循环去遍历student结构体,从而输出所有的所生信息。

学生数据存档函数writeData():该函数定义一个指针,以写入方式打开”stu.txt文本”,并把该文本的地址赋给指针fp。通过一个for循环遍历结构体里的元素,把结构体里的元素的属性输入到”stu.txt文本”。

详细代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <windows.h> void addInfo();// 添加 void welcom(); //主界面  void showAllInfo();//展示所有信息  void showInfo(struct Student student);//展示学生信息  int findIndex(struct Student student[],int id);// 根据学号 返回对应下标  void del(); //删除  void search();// 查找学生信息  void updata();//更新  void sortTotal();//按总分排序  void writeData();//数据写入文件中  void initData();//初始化数据 从文件中读取数据,初始化数组 void showCount(); // 展示存储学生个数  void inserInfo();//插入学生信息  void inserCurrentInfo(int site); //当前位置插入  void con();//按任意键继续  int find1(struct Student student[],int id); //判断学号是否有重复 重复返回1 不重复返回0  void isIdSame(int x); //校验所输入学号是否重复  void gotoxy(int x,int y);//光标定位 int color(int c); //设置颜色输出  struct Student{     int id;     char name[20];     int _math;     int _chinese;     int _english;     int total;// 总分  } student[500];  int count=0;// 记录当前数组中存储学生个数  //主函数  int main(){     initData();      welcom();      return 0; } // 光标定位  void gotoxy(int x, int y) {     COORD pos;      pos.X = x;      //横坐标      pos.Y = y;      //纵坐标      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } //设置颜色输出  int color(int c) {     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改文字颜色     return 0; };  // 主界面  void welcom() {     while(1){         system("cls");             int n;             int i,j = 1;             color(10);                                          //淡绿色边框             for (i = 5; i <= 35; i++)                               //循环y轴坐标,打印输出上下边框===             {                 for (j = 10; j <= 57; j++)                      //循环x轴坐标,打印输出左右边框||                 {                     gotoxy(j, i);                     if (i == 5 || i == 35) printf("=");            //输出上下边框===                     else if (j == 10 || j == 56) printf("||");    //输出左右边框||                 }             }              color(15);//白色               gotoxy(25,8);              printf("学生信息管理系统");             color(14);                //设置字体颜色为黄色             gotoxy(15, 12);             printf("1:录入学生信息");             gotoxy(35, 12);             printf("2.查找学生信息");             gotoxy(15, 16);             printf("3.删除学生信息");             gotoxy(35,16);             printf("4.修改学生信息");             gotoxy(15, 20);             printf("5.插入学生信息");             gotoxy(35,20);             printf("6.按照学生成绩排序");                  gotoxy(15, 24);             printf("7.统计学生总数");             gotoxy(35,24);             printf("8.显示所有学生信息");             gotoxy(15, 28);             printf("9.学生数据存档并退出");             gotoxy(25,32);              int choose;             printf("请选择:[ ]\b\b"); //\b 光标回退一格               color(15); //  颜色变回白色               scanf("%d", &choose);                  switch (choose){                       case 1:addInfo(); break;                       case 2:search(); break;                       case 3:del(); break;                       case 4:updata(); break;                       case 5:inserInfo();break;                        case 6:sortTotal(); break;                       case 7:showCount(); break;                       case 8:showAllInfo(); break;                       case 9:writeData();exit(0);                       }      }                 } // 添加  void addInfo(){     system("cls");     printf("\t添加学生信息\n");     printf("请输入学号\n");     isIdSame(count);     printf("请输入姓名\n");     scanf("%s",&student[count].name);     printf("请输入语文成绩\n");     scanf("%d",&student[count]._chinese);     printf("请输入数学成绩\n");     scanf("%d",&student[count]._math);     printf("请输入英语成绩\n");     scanf("%d",&student[count]._english);     student[count].total=student[count]._chinese+student[count]._english+student[count]._math;     printf("%s的信息录入成功\n\n",student[count].name);     int choose;     printf("1继续 2返回主界面\n");      count++;       scanf("%d",&choose);     if(choose==1){         addInfo();     }      system("cls");  }  // 查找 展示结果  void search(){     system("cls");     int id;     printf("请输入你想查找学生的学号\n");     scanf("%d",&id);     int target = findIndex(student,id);  //目标下表     int flag=1;//是否存在要查询的学号      //for循环对比      if(target != -1)      {         printf("\n\t查询结果\n\n");         showInfo(student[target]);         con();       }     else{ // 输出查询结果              printf("\n查无此人\n");                  con();     }  } // 更新  void updata(){     system("cls");     int id;     printf("请输入你要修改学生的学号\n");     scanf("%d",&id);     int    target = findIndex(student,id);     if(target<0){         printf("查无此人");         con();      }else{         int flag=1;         do{         int choose=0;         printf("请输入需要修改的选项\t(1.学号\t2.姓名\t3.语文\t4.数学\t5.英语):\n");         scanf("%d",&choose);              switch (choose) {                 case 1:                     printf("请输入学号\n"); //                    scanf("%d",&student[target].id);                     isIdSame(target);                                 break;                 case 2:                     printf("请输入姓名\n");                     scanf("%s",&student[target].name);                     break;                 case 3:                     printf("请输入语文成绩\n");                     scanf("%d",&student[target]._chinese);                     break;                  case 4:                     printf("请输入数学成绩\n");                     scanf("%d",&student[target]._math);                     break;                     case 5:                     printf("请输入英语成绩\n");                     scanf("%d",&student[target]._english);                     break;                     }              student[target].total=student[target]._chinese+student[target]._english+student[target]._math;             printf("%s的信息修改成功\n",student[target].name);             printf("\n按1继续 按2退出修改\n");             int choose2;              scanf("%d",&choose2);             if(choose2==1){                 flag=1;             }else{                 flag=0;             }      }while(flag);     }     }  //删除 void del(){     system("cls");         int id;     int target;//目标元素的下标      printf("\n请输入你想删除学生的学号\n");     scanf("%d",&id);     target=findIndex(student, id);     if(target<0){         printf("\n查无此人\n");         con();     } else{          for(int i=target;i<count;i++){              student[i]=student[i+1]; //删除操作 后一位元素覆盖前一位元素           }         printf("删除成功\n");         con();     count--;      }  } //插入学生信息 void inserInfo(){     system("cls");     int site; //位置      printf("请输入你要插入学生信息的位置(从0开始):\n");     scanf("%d",&site);     //插入位置大于总数,则插入在数组最后一位     if ( site > count){         inserCurrentInfo(count);          printf("%s的信息插入成功\n", student[count].name);     }else{         //不是最后一位 从当前位置 数组全部后移一位          for (int i = count; i >= site; i--){                 student[i + 1] = student[i];             }         //在当前位置添加学员         inserCurrentInfo(site);         printf("%s同学的信息插入成功\n", student[site].name);         con();          } }  //当前位置插入 void inserCurrentInfo(int site){      printf("请输入学号\n");      isIdSame(site);      printf("请输入姓名\n");      scanf("%s", student[site].name);      printf("请输入语文成绩\n");      scanf("%d", &student[site]._chinese);      printf("请输入数学成绩\n");      scanf("%d", &student[site]._math);      printf("请输入英语成绩\n");      scanf("%d", &student[site]._english);     student[site].total= student[site]._chinese+student[site]._english+student[site]._math;      count++;      con();  } // 判断学号是否重复 重复返回1 否则返回0  int find1(struct Student student[],int id) {  int temp = 0;  for(int i=0;i<count;i++)   {    if(student[i].id==id)     {      temp=1;      break;     }   }   return temp; }  //校验所添加学号是否重复 void isIdSame(int x){     int inputId;         scanf("%d",&inputId);      do{        if(find1(student,inputId)){          printf("学号有重复,请重新输入\n");          scanf("%d",&inputId);         }        else         {          student[x].id=inputId;          break;         }       }while(1); } // 根据学号 返回下标  int findIndex (struct Student student[],int id){     int temp;     for(int i=0;i<count;i++){         if(student[i].id==id){             temp=i;             break;          } else {             temp = -1;          }      }     return temp; } //按总分排序  void sortTotal(){      //冒泡排序      struct Student temp;// 元素与元素交换的临时容器      for (int i = 0; i < count - 1; i++){         for (int j = 0; j < count - 1 - i; j++){             if (student[j].total<student[j+1].total){                 temp = student[j + 1];                 student[j + 1] = student[j];                 student[j]= temp;             }         }     }     printf("排序完成");     showAllInfo();       }  //按任意键继续   void con(){      printf("\n按任意键继续\n");       getch();  };   //展示学生总个数   void showCount(){      system("cls");       printf("\n\t学生总个数为:%d个\n",count);      con();   }   //初始化数据   void initData(){      FILE * fp = NULL;      fp = fopen("stu.txt", "r");      if (!fp){          printf("文件打开失败\n");          exit(0);// 退出程序       }      while (1){    //读取数据 赋值给数组           fscanf(fp, "%d%s%d%d%d%d", &student[count].id, student[count].name, &student[count]._chinese, &student[count]._math, &student[count]._english, &student[count].total);          if (feof(fp)){ //文件末尾 跳出循环               break;          }          count++;      }  }  //数据写入文件中   void writeData(){     FILE * fp = NULL;     fp = fopen("stu.txt", "w");     for (int i = 0; i < count; i++){         fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", student[i].id, student[i].name, student[i]._chinese, student[i]._math, student[i]._english,student[i].total);     }     printf("数据保存成功\n");       } // 展示所有信息 void showAllInfo(){     system("cls");//清屏      for(int i=0;i<count;i++){         showInfo(student[i]);          }      con();  }  // 展示学生信息 void showInfo(struct Student stu){//传入数组里的元素      printf("学号:%d\t姓名:%s\t语文:%d\t数学:%d\t英语:%d\t总分:%d",stu.id,stu.name,stu._chinese,stu._math,stu._english,stu.total);     printf("\n-----------------分割线-----------------------\n");  } 

主界面

推荐阅读