项目介绍

学生信息管理系统是一个基于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语言编写学生管理系统相关推荐

  1. C语言编写工资管理系统类似学生管理系统

    C语言编写工资管理系统类似学生管理系统 开始界面和菜单界面B void start() //开始界面 {system("cls");//清屏 system("color ...

  2. c语言编写简单的成绩管理系统,用c语言编写学生成绩管理系统

    <用c语言编写学生成绩管理系统>由会员分享,可在线阅读,更多相关<用c语言编写学生成绩管理系统(9页珍藏版)>请在人人文库网上搜索. 1.include#include#inc ...

  3. C语言编写学生成绩管理系统

    文章链接:https://codemouse.online/archives/2020-06-04-16-07-48 需求 用C语言编写学生成绩管理系统,要求该系统可 对学生操作:添加和删除操作. 可 ...

  4. c语言根据学分修改成绩,用c语言编写学分管理系统-成绩管理系统

    1.用用 c c 语言编写学分管理系统语言编写学分管理系统- -成绩管理系统成绩管理系统#include#include#include #include#include#define LEN siz ...

  5. C语言图书馆如何添加图书,如何使用C语言编写图书馆管理系统?

    全部展开 图书管理系统是在Windows系统下运行的应用程序软件,主要用于添加,删除,更改和检查库中的图书信息,并且还可以登录和密码使用该图书的用户. 系统. 管理等. 系统为用户提供了简单的人机界面 ...

  6. (C语言)学生管理系统

    学生管理系统 题目:编写学生管理系统,其中学生的信息有姓名(汉语拼音,最多20个字符),性别(男/女,用1表示男,2表示女). 生日(19850101(年月日)).身高(以m为单位),还需要处理C语言 ...

  7. C语言实现学生管理系统

    C语言实现-学生管理系统 程序员的必经之路吧,学生管理系统.在制作过程中体会到了编写一个具体可用的软件而要做的工作,无论是编写前的准备,还是编写过程中每个细节的处理,都让我理解了这份工作是个什么样子. ...

  8. c语言图书管理系统用什么软件,编写c语言的软件 纯C语言编写图书管理系统.doc...

    编写c语言的软件 纯C语言编写图书管理系统 编写c语言的软件 纯C语言编写图书管理系统WORD文档bbszp 导读:就爱阅读网友为您分享以下"纯C语言编写图书管理系统WORD文档bbszp& ...

  9. c语言之bbs管理系统,编写c语言的软件 纯C语言编写图书管理系统WORD文档bbszp.doc...

    编写c语言的软件 纯C语言编写图书管理系统WORD文档bbszp 编写c语言的软件 纯C语言编写图书管理系统WORD文档bbszp 导读:就爱阅读网友为您分享以下"纯C语言编写图书管理系统W ...

  10. C/C++语言实现 学生管理系统

    C/C++语言实现 学生管理系统 首先,让我分部分介绍本学生管理系统 本系统分为两个大板块,分别是学生版和教师版,学生版又分出三个具体功能,教师版分为七个功能,让我依次来介绍它们吧! (一)学生版 1 ...

最新文章

  1. element -ui 表单验证 如果 需要验证的v-model 是对象中的对象 总是提示没有填写....
  2. .NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制...
  3. python仿真智能驾驶_基于Python的3R机器人运动仿真
  4. (一)深入浅出TCPIP之理解TCP报文格式和交互流程
  5. MySQL之在储存过程中使用表名为变量
  6. Python把docx文档中的题库导入SQLite数据库
  7. 一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能
  8. Raki的读paper小记:GloVe: Global Vectors for Word Representation
  9. matlab 逐日 变逐月,100多年的逐日数据在EXCEL里用VBA程序求月平均和月求和 - 信息科学 - 小木虫 - 学术 科研 互动社区...
  10. Java 接收OutLook 微软邮箱邮件
  11. 微信停止苹果手机服务器,IOS13微信杀后台终极解决办法亲测有效
  12. hive中order by、distribute by、sort by和cluster by的区别和联系
  13. 模拟电路-模拟加法器的设计和仿真
  14. 《安富莱嵌入式周报》第209期:2021.04.19--2021.04.25
  15. 致创业者:你死的太快,是因为做的太慢
  16. labelimg win10安装教程
  17. 不同BMP位图与调色板分析
  18. springboot连接redis 没有权限 io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication requir
  19. HTML标题、段落、各种标签
  20. 到欧特克应用程序商店发布程序(一个100美金), 参加欧特克编程大赛, 有奖又学习!

热门文章

  1. 让Jayrock插上翅膀(加入输入输出参数注释,测试页面有注释,下拉框可以搜索)...
  2. A simple brute force problem.
  3. 设置Response中的ContentType
  4. Linux kernel tick发起调度软中断函数调用图
  5. 华为harmonyos公测,华为开启HarmonyOS2.0开发者Beta公测招募第二期
  6. tukey 窗口_语音信号滤波去噪——使用TUKEYWIN窗设计的FIR滤波器.
  7. 模拟计算机用英语怎么说,电脑里的 属性 英语怎么说
  8. 【我的Android进阶之旅】Realm数据库学习资料汇总(持续更新)
  9. 【JY】精彩仿真书籍推荐与投票~
  10. 40 多套 Java 完整实战项目,各个精品!