学生信息管理系统(C语言版本)(新手向)

序言

潘先森1024这位先辈的博客给了我很大帮助,要特别感谢,谢谢!
大家有时间去看看他的,真的写的很好很详细。
#然后我在GitHub也找到一位先辈的学生工作系统的源文件,不过那位先辈的代码比较复杂,还在学习中…

抖音:功能展示
B站:功能展示
Github大佬的:源代码;

#注:此文章较长,请耐心观看。作者萌新小白,如有错误请指教,谢谢!

一、写需求文档和确定语言和工具

1.需求文档

因为写的学生工作管理系统是学习C语言的实践项目,所以功能和要求不会很多,这是我写的需求文档:

  1. 添加学生信息 add
  2. 显示学生信息 display
  3. 修改学生信息 modify
  4. 删除学生信息 delete
  5. 查找学生信息 find():
  6. 统计不及格人数、最高分和平均分 statistic();
  7. 按总分排序 sort();
  8. 从文件读入(文本)load_txt();
  9. 清屏 clean
  10. 菜单显示 display_menu();
  11. 退出程序 exit

2.选择语言和工具

语言是:C语言
平台为:Visual Studio 2022,VS社区版的免费,下载链接为VS2022;
操作系统为:windows 11.

二、前期准备

1.软件下载可以看别的博主,我这里跳过

2.创建项目

在这里插入图片描述
在这里插入图片描述
请添加图片描述
OK了,接下来按需求,右键源文件,添加,新建项,将下面的名称后缀改为 .c 就可以写C语言了,头文件直接建立就行了。

三、写框架

1.头文件 “student.h”

我先写了一个自定义的头文件,因为在主函数每次调用函数需要先声明,所以可以写一个头文件用来存放声明,以及存放学生的结构体

//这是一些常见的头文件的声明
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义学生信息的结构体
struct stu_type{...};

#define MAX_N 100
#define LEN sizeof(struct stu_type)
//定义结构体的最大容量和是结构体大小

extern struct stu_type stu[MAX_N];
//声明结构体
//这里的extern表明,在程序的其他某个地方存在一个名为stu的全局变量。
//此声明的作用是让其他文件能够使用这个变量,不过它并不会为该变量分配内存空间

#ifdef __cplusplus
extern "C" {
//因为VS2022常用来写C++,所以编译器可能会用C++的方式编译,
//这一段代码的作用就是让编译器使用C++编码的时候改用C的方式
#endif
   void add();
   void display_all();
   void modify();
   void delete ();
   void find();
   void statistic();
   void sort();
   void load_txt();
   void display_id(char num[]);
   void clean();
   void display_menu();
   //这里写函数声明
#ifdef __cplusplus
}
#endif

2.主函数 main.c

#include "student.h"
//只用这一个就够了,这个头文件里已经声明了各种定义
//特别注意的是:自定义的头文件要用 "" 而不是 <>
struct stu_type stu[MAX_N];
//这行代码真正为stu数组分配了内存,也就是创建了这个变量
int main() {
	int choice;
	while (1) { //while循环的作用是让程序一直运行,等待用户选择功能模块,
	//就算输错了,也能重新循环,直到用户选择推出模块
		display_menu();
		//先调用,使其显示主菜单
		printf("请输入你需要的功能编号:\n");
		scanf_s("%d", &choice);
		if (choice >= 1 && choice <= 14) {
			switch (choice) {
			case 1: add();break;
			case 2: display_all();break;
			case 3: modify();break;
			case 4: delete ();break;
			case 5: find();break;
			case 6: statistic();break;
			case 7: sort();break;
			case 8: load_txt();break;
			case 9: display_menu();break;
			case 10: clean();break;
			case 11:
				printf("\n");
				printf("\t *****感谢使用,再见!*****\n");
				printf("\n");
				exit(0);
				break;
			default:
				printf("输入的数字有误!请重新输入:\n");
			}
			printf("按任意键返回主菜单...");
			getchar();
		}else {
			printf("\n");
			printf("输入的数字有误!请输入1-11之间的数字。\n");
			printf("按任意键继续...");
			getchar();
		}
	}
	return 0;
}

至此,主函数写完了,再创建一个功能函数fun.c,专门写各种功能。

3.功能函数 fun.c

#include"student.h"
//不同的函数文件都要包含头文件
static int openfile(const char* filename, const char* mode) {...}
//后面会用到很多次,于是我单独对它进行了封装,这个是打开文件,并返回读取学生的个数
void add() {...};

void display_all() {...};

void modify() {...};

void delete() {...};

void find() {...};

void display_id(char num[]) {...};

void statistic() {...};

void sort() {...};

void load_txt() {...};

void clean(){...};

void display_menu() {...};

四、完善各个功能

1.头文件的结构体

typedef enum {MALE,FEMALE} Gender;
//重定义一下共用体,用来存放性别

//定义学生信息的结构体
struct stu_type{
	char num[15];
	char name[10];
	Gender gender;
	int age;
	int chinese;
	int math;
	int English;
	int C;
	int sum;
	float ave;
};

#define MAX_N 100
#define LEN sizeof(struct stu_type)

extern struct stu_type stu[MAX_N];

2. openfile打开文件函数

static int openfile(const char* filename, const char* mode) {
//传入为文件名和打开方式
//static为静态,这个函数只在这个fun.c中使用
	int m = 0;
	errno_t err;
	//fopen_s的返回值类型
	FILE* fp;
	if ((err = fopen_s(&fp, filename, mode)) != 0) {
		printf("文件打开失败!错误码%d\n",err);
		//err 报错码可以查查,蛮有用,2是找不到文件
		printf("错误发生位置: %s\n", __func__);
		//这个是当时有问题,豆包高诉的调试代码,我觉的蛮有用就留下了 
		return -1;
	}
	while (fread(&stu[m], LEN, 1, fp) ==  1) {
	//判断指针是否到文件末尾
	//这里要去宏定义下LEN为结构体长度 
			m++;
	}
//作用是统计读到多少学生
	fclose(fp);
//每次打开要记得关文件
	if (m == 0) {
		printf("文件打开成功!\n");
		printf("文件中没有数据!\n");
	}
	return m;
}

3.add录入功能

void add() {
	void display_all();
	int i, m = 0;
	char ch[2] = {0};
	//作为判断使用
	//一定要初始化,并且容量要为2:'\0'结束符占一个
	FILE* fp;
	errno_t err;
	//这两个后面如果不用可以不写
	m = openfile("stu.txt", "a+");
	//用a+的方式打开,如果没有文件就创建
	if (m > 0) {
		display_all();
	}
	if ((err = fopen_s(&fp, "stu.txt", "a+")) != 0) {
	//fopen 成功则返回0
		printf("文件打开失败!\n");
		return 1;
	}
	printf("文件打开成功!\n");
	printf("是否输入学生信息(y/n):\n");
	scanf_s("%1s",ch,(unsigned)_countof(ch));
	while (ch[0] == 'y' || ch[0] == 'Y') {
		int exists = 0;
		printf("请输入学生学号:");
		scanf_s("%s", stu[m].num,(unsigned)_countof(stu[m].num));
		for (i = 0;i < m;i++) {//这个for循环的作用是检查你输入的学生是否之前存过
			if (strcmp(stu[i].num, stu[m].num) == 0) {
			//我当时定义的学号为字符串T-T
				printf("你的信息已存在\n");
				fclose(fp);
				int c;
				while ((c = getchar()) != '\n' && c != EOF);//getchar 的作用的是暂停程序运行,会等待用户输入一个人字符,回车就行,然后程序继续执行;另外是为了清除缓冲区的残留,比如换行符
				exists = 1;
				break;
			}
		}
		if (exists)//当他为1时会跳过这一次的循环
			continue;
		printf("请输入学生姓名:");
		scanf_s("%s",stu[m].name,(unsigned)_countof(stu[m].name));
		printf("请输入学生性别(0是男性,1是女性):");
		//输出的时候会根据这个转换为汉字男女
		int temp;
		scanf_s("%d", &temp);
		stu[m].gender = (Gender)temp;
		//强制转换为gender的类型
		printf("请输入学生年龄:");
		scanf_s("%d", &stu[m].age);
		printf("请输入学生语文成绩:");
		scanf_s("%d", &stu[m].chinese);
		printf("请输入学生数学成绩:");
		scanf_s("%d", &stu[m].math);
		printf("请输入学生英语成绩:");
		scanf_s("%d", &stu[m].English);
		printf("请输入学生C语言成绩:");
		scanf_s("%d", &stu[m].C);
		stu[m].sum = stu[m].chinese + stu[m].math + stu[m].English + stu[m].C;
		stu[m].ave = (float)stu[m].sum / 4.0;
		fseek(fp, 0, SEEK_END);
		//这个是调试的时候出BUG了,豆包提供的解决方案,后面重启了一下又发现,这段没起作用
		//它的作用是使指针指向结尾
		if (fwrite(&stu[m], LEN, 1, fp) != 1) {
		//用fwrite将数据写入文件
			printf("保存失败!\n");
		}
		else {
			printf("保存成功!\n");
			m++;
		}
		do {
			printf("\n是否继续录入学生信息?\n");
			printf("1. 继续录入  2. 返回主菜单 \n");
			printf("请选择 (1-2): \n");
			scanf_s("%1s", ch, (unsigned)_countof(ch));
			while (getchar() != '\n'); // 清空缓冲区
		} while (ch[0] != '1' && ch[0] != '2');
		if (ch[0] == '2') {
			break;
		}
		if (ch[0] == '1') {
			ch[0] = 'y';
		}
	}
	if (ch[0] == 'n' || ch[0] == 'N')
	{
		getchar();
		fclose(fp);
		return;
	}
	fclose(fp);
	return 0;
};

4.display_all展示所有人的功能

void display_all() {
	int i, m = 0;
	m = openfile("stu.txt", "r");
	if (m > 0) {
		printf("\n");
		printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
			"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			//想要对其的话就要手动输占多少位置,-是左对齐的意思
		for (i = 0;i < m;i++) {
			printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
		}
		printf("\n");
	}
	getchar();
	//这个很有用,就是暂停程序,等你任意输入一个东西后继续
};

stu[i].gender == MALE ? “男” : “女”
这个就是根据0.1输出是男是女

5.modify修改功能

void modify() {
	int i, j, n, m = 0, flag = 0;
	char num[20]; // 修改为字符数组以存储学号  
	errno_t err;
	FILE* fp;
	m = openfile("stu.txt", "r");
	if (m != 0) {
		display_all();
		printf("请输入要修改的学生的学号:");
		scanf_s("%s",&num, (unsigned)_countof(num)); // 使用字符数组  
	}
	for (i = 0; i < m; i++) {
		if (strcmp(stu[i].num, num) == 0) { // 使用strcmp比较字符串  
			printf("学生存在,请选择修改的内容:\n");
			printf("1.学号:%s\n2.姓名:%s\n3.性别:%s\n4.年龄:%d\n5.语文成绩:%d\n6.数学成绩:%d\n7.英语成绩:%d\n8.C语言成绩: %d\n",
				stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C);
			scanf_s("%d", &n);
			while (n) {
				switch (n) {
				case 1:
					printf("将学号为%s的学生的学号更改为:", num);
					scanf_s("%s", stu[i].num, (unsigned)_countof(stu[i].num)); // 修改学号
					do {
						flag = 0;
						for (j = 0;j < m;j++) {
							if (strcmp(stu[j].num, stu[j].num) == 0 && i != j) {
								printf("输入的学号已存在,请重新输入:");
								scanf_s("%s", &stu[i].num, (unsigned)_countof(stu[i].num));
								flag = 1;
							}
						}
					} while (flag);
					break;
				case 2:
					printf("将学号为%s的学生的姓名更改为:", num);
					scanf_s("%s",&stu[i].name,sizeof(stu[i].name));
					break;
				case 3:
					printf("将学号为%s的学生的性别更改为(0是男生,1是女生):", num);
					scanf_s("%d",&stu[i].gender);
					break;
				case 4:
					printf("将学号为%s的学生的年龄更改为:", num);
					scanf_s("%d", &stu[i].age);
					break;
				case 5:
					printf("将学号为%s的学生的语文成绩更改为:", num);
					scanf_s("%d",&stu[i].chinese);
					break;
				case 6:
					printf("将学号为%s的学生的数学成绩更改为:", num);
					scanf_s("%d",&stu[i].math);
					break;
				case 7:
					printf("将学号为%s的学生的英语成绩更改为:", num);
					scanf_s("%d",&stu[i].English);
					break;
				case 8:
					printf("将学号为%s的学生的C语言成绩更改为:", num);
					scanf_s("%d",&stu[i].C);
					break;
				default:
					printf("无效选项\n");
					break;
				}
				stu[i].sum = stu[i].chinese + stu[i].math + stu[i].English + stu[i].C;
				stu[i].ave = stu[i].sum / 4.0;

				printf("继续修改请输入选项编号,退出请输入0:");
				scanf_s("%d", &n);
			}
			if ((err = fopen_s(&fp, "stu.txt", "w")) != 0){
				printf("文件打开失败!");
				return;
			}

			for (j = 0;j < m;j++) {
			if (fwrite(&stu[j], LEN, 1, fp) != 1) {
				printf("保存失败!");
				fclose(fp);
				return;
				}
			}

			fclose(fp);
			printf("保存成功!\n");
			getchar();
			return;
		}		
	}
	printf("未找到该学生!");
}

6.delete删除功能

void delete() {
	FILE* fp;
	int i, j, flag = 0;
	int m = 0;
	char ch[2], num[20];
	errno_t err;
	m = openfile("stu.txt", "r");
	if (m != 0) {
		display_all();
		printf("请输入要删除的学生的学号:");
		scanf_s("%s", &num,sizeof(num));
		for (i = 0;i < m;i++) {
			if (strcmp(stu[i].num, num) == 0) {
				printf("该学生已找到,信息如下,请问是否要删除?(Y/N)");
				display_id(stu[i].num);
				scanf_s("%s",ch,sizeof(ch));
				if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {
					flag = 1;
					for (j = i;j < m-1;j++) {
						stu[j] = stu[j + 1];
					}
					m--;
					flag = 1;
					if ((err = fopen_s(&fp, "stu.txt", "w")) != 0) {
						printf("文件打开失败!");
						return;
					}
					for (i = 0;i < m;i++) {
						if (fwrite(&stu[i], LEN, 1, fp) != 1) {
							printf("文件保存失败");
							fclose(fp);
							return;
						}
					}
					fclose(fp);
					printf("删除成功!\n");
					getchar();
				}
				else {
					printf("功能模块已退出");
					break;
				}
			}
		}
		if (flag == 0 && i == m) {
			printf("未找到该学生!\n");
			while (getchar() != '\n');
		}
	}
};

7.find查找功能

void find() {
	char num[20];
	printf("请输入要查找的学生的学号:");
	scanf_s("%s", num, sizeof(num));
	display_id(num);
};

8.display_id 展示特定的学生功能

void display_id(char num[]) {  
//需要传入字符串
int m, i;  
m = openfile("stu.txt", "r");  
for (i = 0; i < m; i++) {  
	if (strcmp(stu[i].num, num) == 0) {  
		printf("\n");  
		printf("该学生信息已被找到\n");  
		printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
			"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
		printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", 
			stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);  
		getchar();
		return;  
	}  
}  
printf("该学生不存在!\n");  
while (getchar() != '\n');
//暂停作用
}

9.statistic统计功能的函数

void statistic() {
	int m, n;
	int i;
	int count = 0;
	int min = 400, sum = 0;
	m = openfile("stu.txt", "r");
	while (1) {
		printf("选择你想统计的:\n");
		printf("1.不及格人数 2.最高分同学 3.平均分 4.最低分同学 0.退出\n");
		printf("请输入(0-4):");
		scanf_s("%d", &n);
		switch (n) {
		case 0:
			return;

		case 1:
			for (i = 0; i < m; i++) {
				if (stu[i].ave < 60)
					count++;
			}
			printf("\n");
			printf("不及格人数为:%d\n", count);
			printf("\n");
			printf("按任意键继续统计(退出按0)...");
			count = 0;
			while (getchar() != '\n');
			getchar();
			printf("\n");
			break;

		case 2: {
			int max = stu[0].sum;
			int max_index = 0;
			for (i = 1; i < m; i++) {
				if (stu[i].sum > max) {
					max = stu[i].sum;
					max_index = i;
				}
			}
			printf("\n");
			printf("总分最高的同学为:%s\n", stu[max_index].name);
			display_id(stu[max_index].num);
			printf("\n");
			printf("按任意键继续统计(退出按0)...");
			while (getchar() != '\n');
			printf("\n");
			break;
		}

		case 3:
			for (i = 0; i < m; i++) {
				sum += stu[i].ave;
			}
			printf("\n");
			printf("平均分为:%d\n", sum / m);
			printf("\n");
			printf("按任意键继续统计(退出按0)...");
			while (getchar() != '\n');
			getchar();
			printf("\n");
			break;

		case 4: {
			int min_index = 0;
			for (i = 1; i < m; i++) {
				if (stu[i].sum < stu[min_index].sum) {
					min_index = i;
				}
			}
			printf("\n");
			printf("总分最低的同学为:%s\n", stu[min_index].name);
			display_id(stu[min_index].num);
			printf("\n");
			printf("按任意键继续统计(退出按0)...");
			while (getchar() != '\n');
			printf("\n");
			break;
		}

		default:
			printf("选择错误!请重新输入:\n");
			printf("按任意键继续统计(退出按0)...\n");
			while (getchar() != '\n');
			getchar();
			printf("\n");
			break;
		}
	}
	while (getchar() != '\n');
};

CTRL加C,CTRL加V大法,如果是可以尝试简化的,我记得我好像失败了

10.sort排序功能

void sort() {
	int m, n;
	int i, j;
	struct stu_type temp;
	m = openfile("stu.txt", "r");
	while (1) {
		printf("1.学号升序 2.语文成绩升序 3.数学成绩升序 4.英语成绩升序 5.C语言成绩升序 6.总成绩升序 7.平均成绩升序\n");
		printf("请选择显示形式(退出请输入0):\n");
		scanf_s("%d", &n);
		switch (n) {
		case 0:
			getchar();
			return;
		case 1:
			for (i = 0;i < m-1;i++) {
				for (j = 0;j < m-i-1;j++) {
					int num1 = atoi(stu[j].num);
					int num2 = atoi(stu[j+1].num);
					if (num1 > num2){//用字符串的比较函数
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 2:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].chinese > stu[j + 1].chinese) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 3:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].math > stu[j + 1].math) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 4:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].English > stu[j + 1].English) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 5:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].C > stu[j + 1].C) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 6:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].sum > stu[j + 1].sum) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		case 7:
			for (i = 0;i < m - 1;i++) {
				for (j = 0;j < m - i - 1;j++) {
					if (stu[j].ave > stu[j + 1].ave) {
						temp = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = temp;
					}
				}
			}
			printf("\n");
			printf("%-12s\t%-8s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-4s\t%-6s\t%-6s\n",
				"学号", "姓名", "性别", "年龄", "语文", "数学", "英语", "C语言", "总分", "平均值");
			for (i = 0;i < m;i++) {
				printf("%-12s\t%-8s\t%-4s\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%-4d\t%2.2f\n", stu[i].num, stu[i].name, stu[i].gender == MALE ? "男" : "女", stu[i].age, stu[i].chinese, stu[i].math, stu[i].English, stu[i].C, stu[i].sum, stu[i].ave);
			}
			printf("\n");
			break;

		default:
			printf("选择无效!\n");
			continue;
		};
	}
};

一样的,加油

11.load_txt载入文件功能

void load_txt() {
#include <direct.h>
	int m;
	char filename[20];
	printf("请输入文件名:");
	scanf_s("%19s", filename, sizeof(filename));
	printf("尝试打开文件: %s\n", filename);
	char cwd[256];
	_getcwd(cwd, sizeof(cwd)); 
	printf("当前工作目录: %s\n", cwd);
	m = openfile(filename, "r");
	if (m > 0) {
		printf("成功读取到%d条数据!\n", m);
		printf("\n");
	}
	getchar();
};

12.clean清屏功能

void clean() {
	printf("已清屏!\n");

	system("cls");
	printf("已清屏!\n");
	getchar();
};

13.display_menu展示菜单功能

void display_menu() {
	printf("\n\n\n");
	printf("\t\t  ***** 欢迎使用学生信息管理系统!*****\n");
	printf("\t\t         --.--    + . +   --.--        \n");
	printf("\t\t---------------------------------------\n");
	printf("\t\t||          ----------------         ||\n");
	printf("\t\t||**********学生信息管理系统*********||\n");
	printf("\t\t||          ----------------         ||\n");
	printf("\t\t||                                   ||\n");
	printf("\t\t||  1.录入学生信息    2.展示学生信息 ||\n");
	printf("\t\t||  3.修改学生信息    4.删除学生信息 ||\n");
	printf("\t\t||  5.查找学生信息    6.统计学生信息 ||\n");
	printf("\t\t||  7.排序      8.从文本文件读取数据 ||\n");
	printf("\t\t||  9.展示菜单                       ||\n");
	printf("\t\t||  10.清屏           11.退出        ||\n");
	printf("\t\t||                                   ||\n");
	printf("\t\t||-----------------------------------||\n");
};

这个就是主菜单的面板了,至此,功能全部做完了,在调试一下,就ok了

五、调试和完善

没什么可说的,只能分享一些我自己的经验,虽然我也只是一个才开始写代码的小白。
#首先得让它能成功编译吧,附一张我第一次编译的图:请添加图片描述
当然失败了,但我老师说过,成功就是在一次次失败中摸索出来的,所以慢慢调试嘛
#然后再是优化,使体验更好,我编译成功能跑起来的时候就去将每一个功能都使用,然后发现了一些不好的体验,比如以下那张图片:请添加图片描述
文件打开失败和后面的显示连在一起,所以这个时候要加 ‘’\n’’ 这个很有用,然后更关键的使文件打开失败为什么还要显示学号什么的,这个时候就要去找原因了。

还有每次执行完以一个函数都会很快退出,所以就有了很多的 “getchar()” ,这个的作用可以暂停,还有一个不过作用不是很明确,但好像能起到同样的作用
“while(getchar() != ‘\n’)”

写到这一个下午没了,今天星期天啊啊啊,一个星期零零散散的写了不少,但主要是星期六和星期天。

预祝各位能一次成功,没有bug!

制作不易,各位点点免费的赞支持一下啦!谢谢!

!!!完结撒花!!!

25.5.19.更改一处错误,补上一处链接

安装Django框架有两种方法。第一种方法是通过在命令行中使用pip命令进行安装。可以使用以下命令安装最新版本的Django: pip install -i https://pypi.douban.com/simple django 如果需要安装特定版本的Django,可以使用以下命令: pip install -i https://pypi.douban.com/simple django==2.0 第二种方法是通过官方网站下载最新版本的Django压缩包,并手动安装。您可以在Django的官方网站上找到并下载最新版本的Django框架。在下载完成后,解压缩文件并按照官方文档中的指引进行安装。 在安装Django之前,请确保已经安装了Python和PyCharm等开发工具,并且已经配置好了相应的环境变量。安装完成后,您就可以开始使用Django框架进行开发了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [django框架简介及安装](https://blog.csdn.net/prigilm/article/details/121127448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [django安装教程](https://blog.csdn.net/weixin_44293949/article/details/113071069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值