学生信息管理系统(C语言版)

该程序是一个基于C语言的学生信息管理系统,包括添加、查找、删除、更新、插入、排序、统计和显示所有学生信息等功能。系统使用结构体存储学生数据,并通过文件进行数据的读写,确保信息持久化。用户界面友好,有清晰的操作提示。
摘要由CSDN通过智能技术生成
#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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值