这篇文章主要介绍“怎么用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");
- }
主界面
关于“怎么用C语言编写实现学生管理系统”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡网行业资讯频道,小编每天都会为大家更新不同的知识点。