C语言项目——学生信息管理系统


学生信息管理系统

知识点如下:

  1. 数组遍历
  2. 结构体、结构体指针、结构体数组
  3. 函数调用
  4. 文件处理

功能如下:

  1. 登入验证
  2. 文件存储信息
  3. 录入/浏览学生信息
  4. 查找(按学号、姓名)/修改/删除学生信息
  5. 排序(按单科、三科成绩)/求平均分数/求最高低分学生信息

视频展示:

视频展示链接


一、项目思路

在做一个项目时,需要知道如何去做?怎样按步骤?第一步该做什么,第二步该做什么?

1、模块化思想

  • 学生系统:学生需要写哪些属性(学号、姓名、成绩等);学生的数量
  • 将学生系统的中的每个功能作为一个模块,通过一个函数来实现

2、流程图

在这里插入图片描述

二、功能框架

1、系统菜单

//2.绘制菜单
void menu() {
	printf("*---------------【管理系统】-------------*\n");
	printf("\t\t0.退出功能\n");
	printf("\t\t1.录入信息\n");
	printf("\t\t2.浏览信息\n");
	printf("\t\t3.查找信息\n");
	printf("\t\t4.修改信息\n");
	printf("\t\t5.删除信息\n");
	printf("\t\t6.排序显示\n");
	printf("\t\t7.平均分数\n");
	printf("\t\t8.最高低分\n");
	printf("*---------------------------------------*\n");
	printf("请输入要实现的功能(0-8):\n");
}

运行效果:
在这里插入图片描述

2、其他功能

利用模块化思想将每个模块用一个函数来实现

//1.创建系统
pSys createSystem() {

}
//2.绘制菜单
void menu() {

}
//4.录入信息
void insertData(pSys psystem) {
	
}
//5.浏览信息
void printData(pSys psystem) {
	
}
//6.查找信息
void searchMenu() {
	
}
void searchByStudentNumber(pSys psystem) {
	
}
void searchByName(pSys psystem) {
	
}
void searchData(pSys psystem) {

}
//7.修改信息
void modifyData(pSys psystem) {
	
}
//8.删除信息
void deleteData(pSys psystem) {
	
}
//9.排序显示
void sortMenu() {
	
}
void sortByEnglish(pSys psystem) {

}
void sortByTotal(pSys psystem) {

}
void sortData(pSys psystem) {
	
}
//10.平均分数
void calAverage(pSys psystem) {
	
}
//11.最高低分数
void highLow(pSys psystem) {
	
}
//12.文件读写
void readFile(pSys psystem, const char* fileName) {
	
}
//13.登入验证
void login() {
	
}
//3.按键操作
void keyDown(pSys psystem) {
	
}

int main() {

	while (1)
	{
	
	}
	return 0;
}

三、分布实现

0.学生属性/系统属性

(1)学生属性

因学生具有多种属性,则具有多种数据类型(字符型、整型、浮点型等);利用结构体存储学生信息;

//学生信息
typedef struct Student {
	char number[20];	//学号
	char name[20];		//姓名
	int english;		//英语成绩
	int math;			//数学成绩
	int chinese;		//语文成绩
	double score;		//总分
}Stu, * pStu;

(2)系统属性

系统属性包括学生信息、学生数量;

//系统信息
typedef struct System {
	Stu stuInfo[100];
	int curSize;		//当前学生数量
}Sys, * pSys;

1.创建系统

//1.创建系统
pSys createSystem() {
	pSys psystem = (pSys)malloc(sizeof(Sys));	//申请内存
	assert(psystem);	//断言处理:判断内存是否申请成功
	psystem->curSize = 0;
	return psystem;
}

2.绘制菜单

//2.绘制菜单
void menu() {
	printf("*---------------【管理系统】-------------*\n");
	printf("\t\t0.退出功能\n");
	printf("\t\t1.录入信息\n");
	printf("\t\t2.浏览信息\n");
	printf("\t\t3.查找信息\n");
	printf("\t\t4.修改信息\n");
	printf("\t\t5.删除信息\n");
	printf("\t\t6.排序显示\n");
	printf("\t\t7.平均分数\n");
	printf("\t\t8.最高低分\n");
	printf("*---------------------------------------*\n");
	printf("请输入要实现的功能(0-8):\n");
}

3.按键操作

通过按键输入指令,再利用switch判断指令并调用相关函数;

//3.按键操作
void keyDown(pSys psystem) {
	int userkey = 0;
	scanf_s("%d", &userkey);
	switch (userkey)
	{
	case 0:
		printf("----退出----\n");
		exit(0);
		break;
	case 1:
		printf("----录入----\n");
		insertData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 2:
		printf("----浏览----\n");
		printData(psystem);
		break;
	case 3:
		printf("----查找----\n");
		searchData(psystem);
		break;
	case 4:
		printf("----修改----\n");
		modifyData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 5:
		printf("----删除----\n");
		deleteData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 6:
		printf("----排序----\n");
		sortData(psystem);
		break;
	case 7:
		printf("----平均分数----\n");
		calAverage(psystem);
		break;
	case 8:
		printf("----最高低分----\n");
		highLow(psystem);
		break;
	default:
		printf("----Error----\n");
		break;
	}
}

4.录入信息

//4.录入信息
void insertData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
		scanf_s("%s%s%d%d%d",
			psystem->stuInfo[psystem->curSize].number, 20,
			psystem->stuInfo[psystem->curSize].name, 20,
			&psystem->stuInfo[psystem->curSize].english,
			&psystem->stuInfo[psystem->curSize].math,
			&psystem->stuInfo[psystem->curSize].chinese);
		psystem->curSize++;
		printf("是否继续录入信息?(y/n):");
		while (getchar() != '\n');
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n') {
			break;
		}
		while (getchar() != '\n');
		printf("录入信息成功\n");
	}
}

5.浏览信息

通过数组遍历方式,打印学生信息;

//5.浏览信息
void printData(pSys psystem) {
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}

6.查找信息

绘制一个查找菜单,通过两种方式查找;一种是根据学号查找,另一种是根据姓名查找;

//6.查找信息
//查找菜单
void searchMenu() {
	printf("--------【查找菜单】--------\n");
	printf("\t1.按学号查找\n");
	printf("\t2.按姓名查找\n");
	printf("---------------------------\n");
	printf("请输入查找方式(1-2):");
}
//1.通过学号查找
void searchByStudentNumber(pSys psystem) {
	int flag = 0;
	char student_number[20] = { "" };
	printf("请输入查找的学号:\n");
	scanf_s("%s", student_number, 20);
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			flag = 1;
			printf("%s\t%s\t%d\t%d\t%d\n",
				psystem->stuInfo[i].number,
				psystem->stuInfo[i].name,
				psystem->stuInfo[i].english,
				psystem->stuInfo[i].math,
				psystem->stuInfo[i].chinese);
		}
	}
	if (flag == 0) {
		printf("查找失败\n");
	}
	else
		printf("查找成功\n");
}
//2.通过姓名查找
void searchByName(pSys psystem) {
	int flag = 0;
	char name[20] = { "" };
	printf("请输入查找的姓名:\n");
	scanf_s("%s", name, 20);
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		if (strcmp(name, psystem->stuInfo[i].name) == 0) {
			flag = 1;
			printf("%s\t%s\t%d\t%d\t%d\n",
				psystem->stuInfo[i].number,
				psystem->stuInfo[i].name,
				psystem->stuInfo[i].english,
				psystem->stuInfo[i].math,
				psystem->stuInfo[i].chinese);
		}
	}
	if (flag == 0) {
		printf("查找失败\n");
	}
	else
		printf("查找成功\n");
}
//键盘输入指令;选择
void searchData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		searchMenu();
		scanf_s("%d", &userkey);
		switch (userkey)
		{
		case 1:
			searchByStudentNumber(psystem);
			break;
		case 2:
			searchByName(psystem);
			break;
		default:
			printf("----Error----\n");
			break;
		}
		printf("是否继续查找?(y/n):");
		while (getchar() != '\n');		//清除缓冲区
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n') {
			break;
		}
		system("cls");
	}
}

7.修改信息

首先通过学号找到该同学的数组坐标,然后进行修改信息;

//7.修改信息
void modifyData(pSys psystem) {
	int pos = -1;		//第一个数据可能是数组下标0,所以要从-1开始
	int i = 0;
	char student_number[20] = { "" };
	printf("请输入修改的学号:");
	scanf_s("%s", student_number, 20);
	for (i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			pos = i;
			break;
		}
	}
	if (pos == -1) {
		printf("未找到修改的信息\n");
	}
	else {
		printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
		scanf_s("%s%s%d%d%d",
			psystem->stuInfo[pos].number, 20,
			psystem->stuInfo[pos].name, 20,
			&psystem->stuInfo[pos].english,
			&psystem->stuInfo[pos].math,
			&psystem->stuInfo[pos].chinese);
		printf("修改成功\n");
	}
}

8.删除信息

//8.删除信息
void deleteData(pSys psystem) {
	int pos = -1;
	int i = 0, j = 0;
	char student_number[20] = { "" };
	printf("请输入删除的学号:");
	scanf_s("%s", student_number, 20);
	for (i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			pos = i;
			break;
		}
	}
	if (pos == -1) {
		printf("未找到删除的信息\n");
	}
	else {
		for (int j = i; j < psystem->curSize - 1; j++) {
			psystem->stuInfo[j] = psystem->stuInfo[j + 1];
		}
		psystem->curSize--;
		printf("删除成功\n");
	}
}

9.排序显示

绘制一个排序菜单,通过两种方式排序;一种是根据单科成绩(本项目是英语成绩;可自行修改),另一种是三科总分;

//9.排序显示
void sortMenu() {
	printf("--------【排序菜单】------\n");
	printf("\t1.按英语成绩\n");
	printf("\t2.按三科总分\n");
	printf("-------------------------\n");
	printf("请输入(1-2):");
}
void sortByEnglish(pSys psystem) {
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].english > psystem->stuInfo[j + 1].english) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = psystem->curSize - 1; i >= 0; i--) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
void sortByTotal(pSys psystem) {
	double total = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
		psystem->stuInfo[i].score = total;
	}
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = psystem->curSize - 1; i >= 0; i--) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
void sortData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		sortMenu();
		scanf_s("%d", &userkey);
		switch (userkey)
		{
		case 1:
			sortByEnglish(psystem);
			break;
		case 2:
			sortByTotal(psystem);
			break;
		default:
			printf("----Error---\n");
			break;
		}
		printf("是否继续排序?(y/n):");
		while (getchar() != '\n');
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n')
			break;
		system("cls");
	}
}

10.平均分数

本项目的平均分数是求每科的平均分数;可以自己写总分的平均分数;

//10.平均分数
void calAverage(pSys psystem) {
	int sum1 = 0, sum2 = 0, sum3 = 0;
	double average1 = 0, average2 = 0, average3 = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		sum1 += psystem->stuInfo[i].english;
		sum2 += psystem->stuInfo[i].math;
		sum3 += psystem->stuInfo[i].chinese;
	}
	average1 = sum1 / psystem->curSize;
	average2 = sum2 / psystem->curSize;
	average3 = sum3 / psystem->curSize;

	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
	printf("\n");
	printf("平均分数\t\t英语\t数学\t语文\n");
	printf("平均分数\t       %.2f\t%.2f\t%.2f\n", average1, average2, average3);
}

11.最高低分数

先求出每个学生的三科总分,然后通过冒泡排序方式进行排序,最后得出最高分与最低分的数组坐标并打印出来;

//11.最高低分数
void highLow(pSys psystem) {
	double total = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
		psystem->stuInfo[i].score = total;
	}
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}

	if (psystem->curSize >= 1) {
		printf("--------------最高分数--------------\n");
		printf("学号\t\t姓名\t英语\t数学\t语文\n");
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[psystem->curSize - 1].number,
			psystem->stuInfo[psystem->curSize - 1].name,
			psystem->stuInfo[psystem->curSize - 1].english,
			psystem->stuInfo[psystem->curSize - 1].math,
			psystem->stuInfo[psystem->curSize - 1].chinese);
		printf("\n");
		printf("--------------最低分数--------------\n");
		printf("学号\t\t姓名\t英语\t数学\t语文\n");
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[0].number,
			psystem->stuInfo[0].name,
			psystem->stuInfo[0].english,
			psystem->stuInfo[0].math,
			psystem->stuInfo[0].chinese);
	}
}

12.文件读写

通过文件指针FILE* fp访问文件,如果没有学生信息文件,则创建文件;通过fopenfclosefscanffprintf函数操作文件进行打开关闭、读写;

//12.文件读写
//读学生信息
void readFile(pSys psystem, const char* fileName) {
	FILE* fp = fopen(fileName, "r");
	if (fp == NULL) {
		fp = fopen(fileName, "w+");
	}
	while (fscanf(fp, "%s\t%s\t%d\t%d\t%d\n",
		psystem->stuInfo[psystem->curSize].number,
		psystem->stuInfo[psystem->curSize].name,
		&psystem->stuInfo[psystem->curSize].english,
		&psystem->stuInfo[psystem->curSize].math,
		&psystem->stuInfo[psystem->curSize].chinese) != EOF)
	{
		psystem->curSize++;
	}
	fclose(fp);
}
//写学生信息
void writeFile(pSys psystem, const char* fileName) {
	FILE* fp = fopen(fileName, "w+");
	for (int i = 0; i < psystem->curSize; i++) {
		fprintf(fp, "%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}

13.登入验证

登入验证通过用户名与密码一起登入验证,用户输入密码用*来保护密码;

//13.登入验证
void login() {
	char username[20] = { "" };
	char password[20] = { "" };
	printf("----登入验证----\n");
	printf("用户名:");
	gets_s(username, 20);
	printf("密 码:");
	int key = 0;
	int i = 0;
	while ((key = _getch()) != '\r')
	{
		if (key == '\b') {
			printf("\b \b");
			i--;
			continue;
		}
		putchar('*');
		password[i++] = key;
	}
	password[i] = '\0';
	printf("\n");
	if (!strcmp(username, "root") && !strcmp(password, "123456")) {
		printf("登入成功!\n");
	}
	else {
		printf("登入失败!\n");
		exit(0);
	}
}

效果如下:
在这里插入图片描述


四、完整代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

//学生信息
typedef struct Student {
	char number[20];	//学号
	char name[20];		//姓名
	int english;		//英语成绩
	int math;			//数学成绩
	int chinese;		//语文成绩
	double score;		//总分
}Stu, * pStu;

//系统信息
typedef struct System {
	Stu stuInfo[100];
	int curSize;		//当前学生数量
}Sys, * pSys;

//1.创建系统
pSys createSystem() {
	pSys psystem = (pSys)malloc(sizeof(Sys));	//申请内存
	assert(psystem);	//断言处理:判断内存是否申请成功
	psystem->curSize = 0;
	return psystem;
}
//2.绘制菜单
void menu() {
	printf("*---------------【管理系统】-------------*\n");
	printf("\t\t0.退出功能\n");
	printf("\t\t1.录入信息\n");
	printf("\t\t2.浏览信息\n");
	printf("\t\t3.查找信息\n");
	printf("\t\t4.修改信息\n");
	printf("\t\t5.删除信息\n");
	printf("\t\t6.排序显示\n");
	printf("\t\t7.平均分数\n");
	printf("\t\t8.最高低分\n");
	printf("*---------------------------------------*\n");
	printf("请输入要实现的功能(0-8):\n");
}
//4.录入信息
void insertData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
		scanf_s("%s%s%d%d%d",
			psystem->stuInfo[psystem->curSize].number, 20,
			psystem->stuInfo[psystem->curSize].name, 20,
			&psystem->stuInfo[psystem->curSize].english,
			&psystem->stuInfo[psystem->curSize].math,
			&psystem->stuInfo[psystem->curSize].chinese);
		psystem->curSize++;
		printf("是否继续录入信息?(y/n):");
		while (getchar() != '\n');
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n') {
			break;
		}
		while (getchar() != '\n');
		printf("录入信息成功\n");
	}
}
//5.浏览信息
void printData(pSys psystem) {
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
//6.查找信息
void searchMenu() {
	printf("--------【查找菜单】--------\n");
	printf("\t1.按学号查找\n");
	printf("\t2.按姓名查找\n");
	printf("---------------------------\n");
	printf("请输入查找方式(1-2):");
}
void searchByStudentNumber(pSys psystem) {
	int flag = 0;
	char student_number[20] = { "" };
	printf("请输入查找的学号:\n");
	scanf_s("%s", student_number, 20);
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			flag = 1;
			printf("%s\t%s\t%d\t%d\t%d\n",
				psystem->stuInfo[i].number,
				psystem->stuInfo[i].name,
				psystem->stuInfo[i].english,
				psystem->stuInfo[i].math,
				psystem->stuInfo[i].chinese);
		}
	}
	if (flag == 0) {
		printf("查找失败\n");
	}
	else
		printf("查找成功\n");
}
void searchByName(pSys psystem) {
	int flag = 0;
	char name[20] = { "" };
	printf("请输入查找的姓名:\n");
	scanf_s("%s", name, 20);
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		if (strcmp(name, psystem->stuInfo[i].name) == 0) {
			flag = 1;
			printf("%s\t%s\t%d\t%d\t%d\n",
				psystem->stuInfo[i].number,
				psystem->stuInfo[i].name,
				psystem->stuInfo[i].english,
				psystem->stuInfo[i].math,
				psystem->stuInfo[i].chinese);
		}
	}
	if (flag == 0) {
		printf("查找失败\n");
	}
	else
		printf("查找成功\n");
}
void searchData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		searchMenu();
		scanf_s("%d", &userkey);
		switch (userkey)
		{
		case 1:
			searchByStudentNumber(psystem);
			break;
		case 2:
			searchByName(psystem);
			break;
		default:
			printf("----Error----\n");
			break;
		}
		printf("是否继续查找?(y/n):");
		while (getchar() != '\n');		//清除缓冲区
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n') {
			break;
		}
		system("cls");
	}
}
//7.修改信息
void modifyData(pSys psystem) {
	int pos = -1;		//第一个数据可能是数组下标0,所以要从-1开始
	int i = 0;
	char student_number[20] = { "" };
	printf("请输入修改的学号:");
	scanf_s("%s", student_number, 20);
	for (i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			pos = i;
			break;
		}
	}
	if (pos == -1) {
		printf("未找到修改的信息\n");
	}
	else {
		printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
		scanf_s("%s%s%d%d%d",
			psystem->stuInfo[pos].number, 20,
			psystem->stuInfo[pos].name, 20,
			&psystem->stuInfo[pos].english,
			&psystem->stuInfo[pos].math,
			&psystem->stuInfo[pos].chinese);
		printf("修改成功\n");
	}
}
//8.删除信息
void deleteData(pSys psystem) {
	int pos = -1;
	int i = 0, j = 0;
	char student_number[20] = { "" };
	printf("请输入删除的学号:");
	scanf_s("%s", student_number, 20);
	for (i = 0; i < psystem->curSize; i++) {
		if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
			pos = i;
			break;
		}
	}
	if (pos == -1) {
		printf("未找到删除的信息\n");
	}
	else {
		for (int j = i; j < psystem->curSize - 1; j++) {
			psystem->stuInfo[j] = psystem->stuInfo[j + 1];
		}
		psystem->curSize--;
		printf("删除成功\n");
	}
}
//9.排序显示
void sortMenu() {
	printf("--------【排序菜单】------\n");
	printf("\t1.按英语成绩\n");
	printf("\t2.按三科总分\n");
	printf("-------------------------\n");
	printf("请输入(1-2):");
}
void sortByEnglish(pSys psystem) {
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].english > psystem->stuInfo[j + 1].english) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = psystem->curSize - 1; i >= 0; i--) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
void sortByTotal(pSys psystem) {
	double total = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
		psystem->stuInfo[i].score = total;
	}
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}
	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = psystem->curSize - 1; i >= 0; i--) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
void sortData(pSys psystem) {
	int userkey = 0;
	while (1)
	{
		sortMenu();
		scanf_s("%d", &userkey);
		switch (userkey)
		{
		case 1:
			sortByEnglish(psystem);
			break;
		case 2:
			sortByTotal(psystem);
			break;
		default:
			printf("----Error---\n");
			break;
		}
		printf("是否继续排序?(y/n):");
		while (getchar() != '\n');
		userkey = getchar();
		if (userkey == 'N' || userkey == 'n')
			break;
		system("cls");
	}
}
//10.平均分数
void calAverage(pSys psystem) {
	int sum1 = 0, sum2 = 0, sum3 = 0;
	double average1 = 0, average2 = 0, average3 = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		sum1 += psystem->stuInfo[i].english;
		sum2 += psystem->stuInfo[i].math;
		sum3 += psystem->stuInfo[i].chinese;
	}
	average1 = sum1 / psystem->curSize;
	average2 = sum2 / psystem->curSize;
	average3 = sum3 / psystem->curSize;

	printf("学号\t\t姓名\t英语\t数学\t语文\n");
	for (int i = 0; i < psystem->curSize; i++) {
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
	printf("\n");
	printf("平均分数\t\t英语\t数学\t语文\n");
	printf("平均分数\t       %.2f\t%.2f\t%.2f\n", average1, average2, average3);
}
//11.最高低分数
void highLow(pSys psystem) {
	double total = 0;
	for (int i = 0; i < psystem->curSize; i++) {
		total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
		psystem->stuInfo[i].score = total;
	}
	for (int i = 0; i < psystem->curSize; i++) {
		for (int j = 0; j < psystem->curSize - 1 - i; j++) {
			if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
				Stu temp = psystem->stuInfo[j];
				psystem->stuInfo[j] = psystem->stuInfo[j + 1];
				psystem->stuInfo[j + 1] = temp;
			}
		}
	}

	if (psystem->curSize >= 1) {
		printf("--------------最高分数--------------\n");
		printf("学号\t\t姓名\t英语\t数学\t语文\n");
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[psystem->curSize - 1].number,
			psystem->stuInfo[psystem->curSize - 1].name,
			psystem->stuInfo[psystem->curSize - 1].english,
			psystem->stuInfo[psystem->curSize - 1].math,
			psystem->stuInfo[psystem->curSize - 1].chinese);
		printf("\n");
		printf("--------------最低分数--------------\n");
		printf("学号\t\t姓名\t英语\t数学\t语文\n");
		printf("%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[0].number,
			psystem->stuInfo[0].name,
			psystem->stuInfo[0].english,
			psystem->stuInfo[0].math,
			psystem->stuInfo[0].chinese);
	}
}
//12.文件读写
void readFile(pSys psystem, const char* fileName) {
	FILE* fp = fopen(fileName, "r");
	if (fp == NULL) {
		fp = fopen(fileName, "w+");
	}
	while (fscanf(fp, "%s\t%s\t%d\t%d\t%d\n",
		psystem->stuInfo[psystem->curSize].number,
		psystem->stuInfo[psystem->curSize].name,
		&psystem->stuInfo[psystem->curSize].english,
		&psystem->stuInfo[psystem->curSize].math,
		&psystem->stuInfo[psystem->curSize].chinese) != EOF)
	{
		psystem->curSize++;
	}
	fclose(fp);
}
void writeFile(pSys psystem, const char* fileName) {
	FILE* fp = fopen(fileName, "w+");
	for (int i = 0; i < psystem->curSize; i++) {
		fprintf(fp, "%s\t%s\t%d\t%d\t%d\n",
			psystem->stuInfo[i].number,
			psystem->stuInfo[i].name,
			psystem->stuInfo[i].english,
			psystem->stuInfo[i].math,
			psystem->stuInfo[i].chinese);
	}
}
//13.登入验证
void login() {
	char username[20] = { "" };
	char password[20] = { "" };
	printf("----登入验证----\n");
	printf("用户名:");
	gets_s(username, 20);
	printf("密 码:");
	int key = 0;
	int i = 0;
	while ((key = _getch()) != '\r')
	{
		if (key == '\b') {
			printf("\b \b");
			i--;
			continue;
		}
		putchar('*');
		password[i++] = key;
	}
	password[i] = '\0';
	printf("\n");
	if (!strcmp(username, "root") && !strcmp(password, "123456")) {
		printf("登入成功!\n");
	}
	else {
		printf("登入失败!\n");
		exit(0);
	}
}
//3.按键操作
void keyDown(pSys psystem) {
	int userkey = 0;
	scanf_s("%d", &userkey);
	switch (userkey)
	{
	case 0:
		printf("----退出----\n");
		exit(0);
		break;
	case 1:
		printf("----录入----\n");
		insertData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 2:
		printf("----浏览----\n");
		printData(psystem);
		break;
	case 3:
		printf("----查找----\n");
		searchData(psystem);
		break;
	case 4:
		printf("----修改----\n");
		modifyData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 5:
		printf("----删除----\n");
		deleteData(psystem);
		writeFile(psystem, "studentInfo.txt");
		break;
	case 6:
		printf("----排序----\n");
		sortData(psystem);
		break;
	case 7:
		printf("----平均分数----\n");
		calAverage(psystem);
		break;
	case 8:
		printf("----最高低分----\n");
		highLow(psystem);
		break;
	default:
		printf("----Error----\n");
		break;
	}
}

int main() {
	login();
	system("cls");		//清屏
	pSys psystem = createSystem();	//创建系统
	readFile(psystem, "studentInfo.txt");
	while (1)
	{
		menu();
		keyDown(psystem);
		system("pause");	//按任意键继续
		system("cls");		//清屏
	}
	return 0;
}

感谢阅读,如有不足之处,欢迎来指正。谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值