序言
潘先森1024这位先辈的博客给了我很大帮助,要特别感谢,谢谢!
大家有时间去看看他的,真的写的很好很详细。
#然后我在GitHub也找到一位先辈的学生工作系统的源文件,不过那位先辈的代码比较复杂,还在学习中…
抖音:功能展示;
B站:功能展示;
Github大佬的:源代码;
#注:此文章较长,请耐心观看。作者萌新小白,如有错误请指教,谢谢!
一、写需求文档和确定语言和工具
1.需求文档
因为写的学生工作管理系统是学习C语言的实践项目,所以功能和要求不会很多,这是我写的需求文档:
- 添加学生信息 add
- 显示学生信息 display
- 修改学生信息 modify
- 删除学生信息 delete
- 查找学生信息 find():
- 统计不及格人数、最高分和平均分 statistic();
- 按总分排序 sort();
- 从文件读入(文本)load_txt();
- 清屏 clean
- 菜单显示 display_menu();
- 退出程序 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.更改一处错误,补上一处链接