#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
void addInfo();//添加
void welcome();//主界面
void showAllInfo();//展示所有学生信息
void showInfo(struct Student student);//展示学生信息
int findIndex(struct Student student[], int id);//根据学号返回对应下标
void del();//删除
void search();//查找学生信息
void update();//更新
void sortTotal();//按总分排序
void writeData();//数据写入文件中
void initData();//初始化数据,从文件中读取数据,初始化数组
void showCount();//展示存储过学生的总个数
void insertInfo();//插入学生信息
void insertCurrentInfo(int size);//当前位置插入
void con();//按任意键继续
int find1(struct Student student[], int id);//判断学号是否有重复,重复返回1,不重复返回0
void isIdSame();//检校所输入学号是否重复
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();
welcome();
return 0;
}
//光标定位
void gotoxy(int x, int y) {
COORD pos;
pos.X = x;//横坐标
pos.Y = y;//纵坐标
//将控制台光标移动到 (COORD.X, COORD.Y) 的位置
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
//设置颜色输出
int color(int c) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);//更改文字颜色
return 0;
}
//主界面
void welcome() {
while (1) {
system("cls");
//int n;
int i;
int 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:update();break;
case 5:insertInfo();break;
case 6:sortTotal();break;
case 7:showCount();break;
case 8:showAllInfo();break;
case 9:writeData();exit(0);
}
}
}
//判断学号是否重复,重复返回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);
}
//添加学生信息
void addInfo() {
system("cls");
printf("\t添加学生信息\n");
printf("请输入学号\n");
isIdSame(count);
printf("请输入姓名\n");
scanf("%s", &student[count].name);
printf("请输入数学成绩\n");
scanf("%d", &student[count].math);
printf("请输入语文成绩\n");
scanf("%d", &student[count].chinese);
printf("请输入英语成绩\n");
scanf("%d", &student[count].english);
student[count].total = student[count].math + student[count].chinese + student[count].english;
printf("%s的信息已录入成功", student[count].name);
int choose;
printf("1继续录入下一个学生信息 2返回主界面\n");
count++;//学生数加一
scanf("%d", &choose);
if (choose == 1) {
addInfo();
}
system("cls");
}
//根据学号,返回结构体数组对应的下标,找不到则返回-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 showInfo(struct Student student) {
//传入数组里的元素
printf("学号:%d\t姓名:%s\t数学成绩:%d\t语文成绩:%d\t英语成绩:%d\t总分:%d", student.id, student.name, student.math, student.chinese, student.english, student.total);
printf("\n-----------------------------分割线------------------------------------\n");
}
//按任意键继续
void con() {
printf("\n按任意键继续\n");
_getch();
}
//查找,展示结果
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 update() {
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].math);
break;
case 4:
printf("请输入语文成绩:\n");
scanf("%d", &student[target].chinese);
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 = 0;
scanf("%d", &choose);
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 insertCurrentInfo(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();
}
//插入学生信息
void insertInfo() {
system("cls");
int site;//位置
printf("请输入你要插入学生信息的位置(从0开始):\n");
scanf("%d", &site);
//插入位置大于总数,则插入在数组最后一位
if (site > count) {
insertCurrentInfo(count);
printf("%s同学的信息插入成功\n", student[site].name);
}
else {
//不是最后一位,从当前位置开始数组全部后移一位
for (int i = count; i >= site; i--) {
student[i + 1] = student[i];
}
//在当前位置添加学员
insertCurrentInfo(site);
printf("%s同学的信息插入成功\n", student[site].name);
con();
}
}
展示学生信息
//void showInfo(struct Student stud) {
// //传入数组里的元素
// printf("学号:%d\t姓名:%s\t语文:%d\t数学:%d\t英语:%d\t总分:%d", stud.id, stud.name, stud.math, stud.chinese, stud.english, stud.total);
// printf("\n------------------------------分割线--------------------------------\n");
//}
//展示所有信息
void showAllInfo() {
system("cls");//清屏
for (int i = 0; i < count; i++) {
showInfo(student[i]);
}
con();
}
int compare(const void* a, const void* b) {
struct Student* s1 = (struct Student*)a;
struct Student* s2 = (struct Student*)b;
return s1->total - s2->total;
}
//按总分排序
void sortTotal() {
//快速排序
qsort(student, count, sizeof(struct Student), compare);
printf("排序完成");
showAllInfo();
}
//展示学生总个数
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].math, &student[count].chinese, &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[count].name, student[count].math, student[count].chinese, student[count].english, student[count].total);
}
printf("数据保存成功\n");
}
学生信息管理系统(C语言版)
最新推荐文章于 2024-08-16 11:58:51 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)