先来说说本管理系统囊括的功能:
用户名密码锁;
自动清空屏幕;(关于这一点,如果你需要,也可以改成判断型清屏)
缓冲;(这点是因为某些功能需要保留屏幕上一些信息一段时间,免遭自动清屏而设置的)
多重菜单;(以满足并协调各个阶段的功能)
输入选项;(与菜单功能配套使用,但并不在同一头文件、源文件内)
初次输入信息并运行后续功能;
读取上一次的输入储存的信息并运行后续功能;
插入学生信息;
删除学生信息;
修改学生信息;
查询学生信息;
显示全部学生信息;
输出总分排名表;
保存信息到文件夹中;
实时更新学生信息并保存;(每次修改、插入、删除后自动更新文件夹中所储存的信息)
接下来我介绍一下本管理系统的大致思路:
我将这个系统所应具备的各个功能分别放在不同的头文件、源文件中编写,每套头文件、源文件对应相应的某个功能,最后再通过添加头文件、调用函数,在源文件main.cpp中将它们整合到一起,使整个系统具备所需的各个方面的功能并成功运行。
这样做的好处在于,如果需要为这个系统添加一些其他的功能,我们只需要在该项目里建立新的头文件、源文件,在这些头文件、源文件里编写相应的功能后,再通过在main.cpp中添加相应头文件并调用函数就能为系统添加上那些功能,而不需要对着复杂又晃眼睛的一大堆代码进行大整改。同时这样编写不仅能让该系统代码可读性更强,还能在某些功能出现问题时能更方便找到并进行解决。
但如果这种方法使用不熟练、对代码的运用不过关的话,比较容易出现重载现象,所以使用时还请小心。
//main.cpp
#include"struct.h"
#include"menu.h"
#include"information_scanf.h"
#include"file_fprintf.h"
#include"computer_write.h"
#include"computer_read.h"
#include"lock.h"
#include"choose.h"
#include"delete.h"
#include"insert.h"
#include"modification.h"
#include"printf.h"
#include"seek.h"
#include"swap.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//手动输入信息所需的结构体数组,方括号里的100是所能储存的学生信息的人数的最大容量,可根据自己的需要进行谨慎修改
student student_people_information_scanf[100];
//电脑读取信息所需的结构体数组,方括号里的100是所能储存的学生信息的人数的最大容量,可根据自己的需要进行谨慎修改
student student_computer_information_scanf[100];
//注意:如果对方括号里的数字进行了修改,需将后面相应的位置的数字一起修改,后面就不在重复说明这个了
//手动输入的人数
int num;
//电脑应读取的人数
int num_read;
int main()
{
//初始化start=1,使switch开关能从case1开始运行
int start = 1;
//设置字符变量,用于:输入相应选项,完成“退出系统”的判定
char lock_out;
switch (start)
{
case 1:
//lock()是用户名与密码的锁,并返回一个选项的字符赋值给lock_out,完成“退出系统”的判定
lock_out=lock();
//是否退出系统的判定
if (lock_out == '#')
{
printf("see you again......");
break;
}
case 2:
//清屏工具
system("cls");
//一级菜单
first_menu();
//first_choose()是选项的输入,并返回该选项用于switch开关
switch (first_choose())
{
case first_use:
//使用键盘输入学生人数
printf("请输入学生人数:");
scanf_s("%d", &num);
//调用“初次使用输入信息”的功能
information_scanf(student_people_information_scanf,num);
//将信息放入文件夹computer version,用于供电脑读取
student_computer_writer(student_people_information_scanf,num);
//将信息放入文件夹people version,用于供使用者阅读
student_file_fprintf(student_people_information_scanf, num);
//二级菜单
while (1)
{
//二级菜单选项变量
int b;
//清屏工具
system("cls");
//二级菜单目录
second_menu();
//输入二级菜单选项,并返回赋值给b
b = second_choose();
switch (b)
{
//选项:插入学生信息
case insert_student_information:
//由于有人数数值的变动,所以应返回变动后的人数数值并重新赋值给num
num = student_insert(student_people_information_scanf, num);
//将信息放入文件夹computer version
student_computer_writer(student_people_information_scanf, num);
//将信息放入文件夹people version
student_file_fprintf(student_people_information_scanf, num);
break;
//选项:删除学生信息
case delete_student_information:
//由于有人数数值的变动,所以应返回变动后的人数数值并重新赋值给num
num = student_delete(student_people_information_scanf, num);
//将信息放入文件夹computer version
student_computer_writer(student_people_information_scanf, num);
//将信息放入文件夹people version
student_file_fprintf(student_people_information_scanf, num);
break;
//选项:查询学生信息
case seek_student_information:
//添加头文件调用函数
student_seek(student_people_information_scanf,num);
break;
//选项:修改学生信息
case change_student_information:
//添加头文件调用函数
student_modification(student_people_information_scanf, num);
//将信息放入文件夹computer version
student_computer_writer(student_people_information_scanf, num);
//将信息放入文件夹people version
student_file_fprintf(student_people_information_scanf, num);
break;
//选项:总分排名
case all_score_rank:
//添加头文件调用函数
student_all_swap(student_people_information_scanf, num);
break;
//选项:显示全部学生信息
case browse_student_information:
//添加头文件调用函数
student_printf(student_people_information_scanf, num);
//缓冲
getchar();
char bro_end;
printf("进行下一步请按任意键:");
scanf_s("%c", &bro_end);
break;
//选项:退出系统
case second_out:
break;
}
//选项:退出系统
if (b == 0)
break;
}
printf("see you again...");
break;
//电脑读取上次储存的信息
case ever_use:
//读取信息,并返回学生人数
num_read = student_computer_read(student_computer_information_scanf);
//二级菜单
while (1)
{
//二级菜单选项变量
int b;
//清屏工具
system("cls");
//二级菜单目录
second_menu();
//输入二级菜单选项,并返回赋值给b
b = second_choose();
switch (b)
{
//选项:插入学生信息
case insert_student_information:
//由于有人数数值的变动,所以应返回变动后的人数数值并重新赋值给num
num_read = student_insert(student_computer_information_scanf, num_read);
//将信息放入文件夹computer version
student_computer_writer(student_computer_information_scanf, num_read);
//将信息放入文件夹people version
student_file_fprintf(student_computer_information_scanf, num_read);
break;
//选项:删除学生信息
case delete_student_information:
//由于有人数数值的变动,所以应返回变动后的人数数值并重新赋值给num
num_read = student_delete(student_computer_information_scanf, num_read);
//将信息放入文件夹computer version
student_computer_writer(student_computer_information_scanf, num_read);
//将信息放入文件夹people version
student_file_fprintf(student_computer_information_scanf, num_read);
break;
//选项:查询学生信息
case seek_student_information:
//添加头文件调用函数
student_seek(student_computer_information_scanf, num_read);
break;
//选项:修改学生信息
case change_student_information:
//添加头文件调用函数
student_modification(student_computer_information_scanf, num_read);
//将信息放入文件夹computer version
student_computer_writer(student_computer_information_scanf, num_read);
//将信息放入文件夹people version
student_file_fprintf(student_computer_information_scanf, num_read);
break;
//选项:总分排名
case all_score_rank:
//添加头文件调用函数
student_all_swap(student_computer_information_scanf, num_read);
break;
//选项:显示全部学生信息
case browse_student_information:
//添加头文件调用函数
student_printf(student_computer_information_scanf, num_read);
//缓冲
getchar();
char bro_end;
printf("进行下一步请按任意键:");
scanf_s("%c", &bro_end);
break;
//选项:退出系统
case second_out:
break;
}
//选项:退出系统
if (b == 0)
break;
}
printf("see you again...");
break;
//选项:退出系统
case first_out:
printf("see you again...");
break;
}
break;
}
return 0;
}
//struct.h
#ifndef __STRUCT__
#define __STRUCT__
struct student
{
//学号
int number;
//姓名
char name[30];
//性别
char sex;
//语文成绩
double china_score;
//英语成绩
double english_score;
//数学分数
double math_score;
//总成绩
double all_score;
//平均成绩
double average_score;
};
#endif
//computer_read.h
#ifndef __COMPUTER_READ__
#define __COMPUTER_READ__
//使用电脑读取电脑文件夹中曾经储存的学生信息
int student_computer_read(struct student p[]);
#endif
//computer_writer.h
#ifndef __COMPUTER_WRITE__
#define __COMPUTER_WRITE__
//将学生信息储存到文件夹中供电脑读取
void student_computer_writer(struct student p[],int n);
#endif
//choose.h
#ifndef __CHOOSE__
#define __CHOOSE__
//使用枚举法
enum first_choose { first_use = 1, ever_use = 2, first_out = 0 };
enum second_choose{second_out = 0, insert_student_information = 1, delete_student_information = 2, seek_student_information = 3, change_student_information = 4, all_score_rank = 5, browse_student_information = 6};
enum third_choose{third_out = 0, return_second_menu = 1};
//一级菜单选项的选择输入
int first_choose();
//二级菜单选项的选择输入
int second_choose();
#endif
//delete.h
#ifndef __DELETE__
#define __DELETE__
//删除学生信息
int student_delete(struct student p[], int n);
#endif
//file_fprintf.h
#ifndef __FILE_FPRINTF__
#define __FILE_FPRINTF__
//将学生信息储存在文件夹中供使用者阅读浏览
void student_file_fprintf(struct student p[], int n);
#endif
//information_scanf.h
#ifndef __INFORMATION_SCANF__
#define __INFORMATION_SCANF__
//手动输入学生信息
void information_scanf(struct student p[],int n);
#endif
//insert.h
#ifndef __INSERT__
#define __INSERT__
//插入学生信息
int student_insert(struct student p[], int n);
#endif
//lock.h
#ifndef __LOCK__
#define __LOCK__
//用户名密码锁
char lock();
#endif
//menu.h
#ifndef __MENU__
#define __MENU__
//一级菜单
void first_menu();
//二级菜单
void second_menu();
#endif
//modification.h
#ifndef __MODIFICATION__
#define __MODIFICATION__
//修改学生信息
void student_modification(struct student p[], int n);
#endif
//printf.h
#ifndef __PRINTF__
#define __PRINTF__
//浏览全部学生信息
void student_printf(struct student p[], int n);
#endif
//seek.h
#ifndef __SEEK__
#define __SEEK__
//查询学生信息
void student_seek(struct student p[], int n);
#endif
//swap.h
#ifndef __SWAP__
#define __SWAP__
//总分排名
void student_all_swap(struct student p[], int n);
#endif
//computer_read.cpp
#include"computer_read.h"
#include"struct.h"
#include<stdio.h>
int student_computer_read(struct student p[])
{
int i;
FILE *fp;
//void student_computer_read(struct student p[], int n)改为void student_computer_read(struct student p[]),使用这个。
int n;
printf("请输入读取数:");
scanf_s("%d", &n);
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\computer_write_6.txt", "rt+");
fread(p, n * sizeof(struct student), 1, fp);
for (i = 0; i < n; i++)
{
printf("第%d个学生的信息:\n学号:%d,\n姓名:%s,\n性别:%c,\n语文成绩:%lf,\n数学成绩:%lf,\n英语成绩:%lf,\n总成绩:%lf,\n个人平均分:%lf\n\n", i + 1, p[i].number, p[i].name, p[i].sex, p[i].china_score, p[i].math_score, p[i].english_score, p[i].all_score, p[i].average_score);
}
getchar();
char read_end;
printf("进行下一步请按任意键:");
scanf_s("%c", &read_end);
fclose(fp);
return n;
}
//computer_writer.cpp
#include"computer_write.h"
#include"struct.h"
#include<stdio.h>
void student_computer_writer(struct student p[] , int n)
{
FILE *fp;
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\computer_write_6.txt", "wt+");
fwrite(p, n * sizeof(struct student), 1, fp);
fclose(fp);
}
//choose.cpp
#include"choose.h"
#include<stdio.h>
//一级菜单选项的选择输入
int first_choose()
{
int b;
while (1)
{
int c;
printf("请输入选项:");
scanf_s("%d", &c);
if (c != 1 && c != 2 && c != 0)
{
printf("输入错误,选项不存在,请重新输入,谢谢......\n");
}
else
{
b = c;
break;
}
}
return b;
}
//二级菜单选项的选择输入
int second_choose()
{
int b;
while (1)
{
int c;
printf("请输入选项:");
scanf_s("%d", &c);
if (c != 1 && c != 2 && c != 3 && c != 4 && c != 5 && c != 6 && c != 0)
{
printf("输入错误,选项不存在,请重新输入,谢谢......\n");
}
else
{
b = c;
break;
}
}
return b;
}
//delete.cpp
#include"struct.h"
#include"delete.h"
#include<stdio.h>
int student_delete(struct student p[], int n)
{
int number_delete;
int i;
printf("请输入所需删除的学生信息的学号:");
scanf_s("%d", &number_delete);
for (int j = 0; j < n; j++)
{
if (number_delete == p[j].number)
{
struct student temp1;
temp1 = p[j];
p[j] = p[n - 1];
p[n - 1] = temp1;
i = n - 1;
}
}
return i;
}
//file_fprintf.cpp
#include"file_fprintf.h"
#include"struct.h"
#include<stdio.h>
void student_file_fprintf(struct student p[], int n)
{
int i;
FILE *fp;
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\file_fprintf_6.txt", "wt+");
for (i = 0; i < n; i++)
{
fprintf(fp, "学号:%d\n", p[i].number);
fprintf(fp, "姓名:%s\n", p[i].name);
fprintf(fp, "性别:%c\n", p[i].sex);
fprintf(fp, "语文成绩:%lf\n", p[i].china_score);
fprintf(fp, "数学成绩:%lf\n", p[i].math_score);
fprintf(fp, "英语成绩:%lf\n", p[i].english_score);
fprintf(fp, "总成绩:%lf\n", p[i].all_score);
fprintf(fp, "平均成绩:%lf\n", p[i].average_score);
}
fclose(fp);
}
//information_scanf.cpp
#include"information_scanf.h"
#include"struct.h"
#include<stdio.h>
void information_scanf(struct student p[],int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("学号:");
scanf_s("%d", &p[i].number);
getchar();
printf("姓名:");
gets_s(p[i].name);
printf("性别:");
scanf_s("%c", &p[i].sex);
printf("语文成绩:");
scanf_s("%lf", &p[i].china_score);
printf("数学成绩:");
scanf_s("%lf", &p[i].math_score);
printf("英语成绩:");
scanf_s("%lf", &p[i].english_score);
p[i].all_score = p[i].china_score + p[i].math_score + p[i].english_score;
p[i].average_score = p[i].all_score / 3.0;
}
}
//insert.cpp
#include"struct.h"
#include"insert.h"
#include<stdio.h>
int student_insert(struct student p[], int n)
{
int j;
printf("请输入需添加的学生信息的人数:");
scanf_s("%d", &j);
for (int k = n; k < n + j; k++)
{
printf("学号:");
scanf_s("%d", &p[k].number);
getchar();
printf("姓名:");
gets_s(p[k].name);
printf("性别:");
scanf_s("%c", &p[k].sex);
printf("语文成绩:");
scanf_s("%lf", &p[k].china_score);
printf("数学成绩:");
scanf_s("%lf", &p[k].math_score);
printf("英语成绩:");
scanf_s("%lf", &p[k].english_score);
p[k].all_score = p[k].china_score + p[k].math_score + p[k].english_score;
p[k].average_score = p[k].all_score / 3.0;
}
j = j + n;
return j;
}
//lock.cpp
#include"lock.h"
#include<stdio.h>
#include<string.h>
char lock()
{
char uesr[20] = "1";
char pass[20] = "1";
int i;
for (i = 1; i > 0; i++)
{
char user_now[20];
char pass_now[20];
printf("请输入用户名:");
gets_s(user_now);
printf("\n请输入密码:");
gets_s(pass_now);
printf("\n");
if (strcmp(user_now, uesr) == 0 && strcmp(pass_now, pass) == 0)
{
printf("欢迎使用学生管理系统6.0!!\n");
break;
}
else
{
printf("用户名或密码错误,请重新输入,您已输入%d次......\n", i);
char m;
printf("退出,请按#:");
scanf_s("%c", &m);
printf("\n");
if (m == '#')
return m;
continue;
}
}
}
//menu.cpp
#include"menu.h"
#include<stdio.h>
void first_menu()
{
printf("*************************学生管理系统********************************\n");
printf("***************************一级菜单**********************************\n");
printf("*1.初次使用 2.读取使用上次输入的信息 0.退出系统*\n");
printf("*********************************************************************\n");
}
void second_menu()
{
printf("*************************学生管理系统**********************************\n");
printf("***************************二级菜单************************************\n");
printf("*1.插入学生信息 2.删除学生信息 3.查询学生信息 *\n");
printf("*4.修改学生信息 5.按总成绩排序 6.浏览全部学生信息*\n");
printf("* 0.退出系统 *\n");
printf("***********************************************************************\n");
}
}
//modification.cpp
#include"struct.h"
#include"modification.h"
#include<stdio.h>
void student_modification(struct student p[], int n)
{
//修改学生信息的原理,其实就是对“覆盖”的利用
int number_modification;
printf("请输入所需修改的学生信息的学号:");
scanf_s("%d", &number_modification);
for (int i = 0; i < n; i++)
{
if (number_modification == p[i].number)
{
printf("学号:");
scanf_s("%d", &p[i].number);
getchar();
printf("姓名:");
gets_s(p[i].name);
printf("性别:");
scanf_s("%c", &p[i].sex);
printf("语文成绩:");
scanf_s("%lf", &p[i].china_score);
printf("数学成绩:");
scanf_s("%lf", &p[i].math_score);
printf("英语成绩:");
scanf_s("%lf", &p[i].english_score);
p[i].all_score = p[i].china_score + p[i].math_score + p[i].english_score;
p[i].average_score = p[i].all_score / 3.0;
}
}
}
//printf.cpp
//浏览全部学生信息
#include"struct.h"
#include"printf.h"
#include<stdio.h>
void student_printf(struct student p[], int n)
{
for (int i = 0; i < n; i++)
{
printf("学号:%3d;姓名:%10s;性别:%2c;语文成绩:%3lf;数学成绩:%3lf;英语成绩:%3lf;总成绩:%4lf;平均分:%3lf;\n", p[i].number, p[i].name, p[i].sex, p[i].china_score, p[i].math_score, p[i].english_score, p[i].all_score, p[i].average_score);
}
}
//seek.cpp
#include"struct.h"
#include"seek.h"
#include<stdio.h>
#include<string.h>
void student_seek(struct student p[], int n)
{
char name_seek[30];
int number_seek;
getchar();
printf("请输入所需学生信息的姓名:");
gets_s(name_seek);
printf("或者\n");
printf("请输入所需学生信息的学号:");
scanf_s("%d", &number_seek);
for (int i = 0; i < n; i++)
{
if (strcmp(name_seek, p[i].name) == 0 || number_seek == p[i].number)
{
printf("学号:%3d;\n姓名:%10s;\n性别:%2c;\n语文成绩:%3lf;\n数学成绩:%3lf;\n英语成绩:%3lf;\n总成绩:%4lf;\n平均分:%3lf;\n\n", p[i].number, p[i].name, p[i].sex, p[i].china_score, p[i].math_score, p[i].english_score, p[i].all_score, p[i].average_score);
int j;
while (1)
{
printf("是否需要保存到文件,需要请按1,不需要请按0:");
scanf_s("%d", &j);
printf("\n");
if (j == 1)
{
FILE *fp;
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\所查询学生的信息.txt", "wt+");
fprintf(fp, "学号:%3d;姓名:%10s;性别:%2c;语文成绩:%3lf;数学成绩:%3lf;英语成绩:%3lf;总成绩:%4lf;平均分:%3lf;\n", p[i].number, p[i].name, p[i].sex, p[i].china_score, p[i].math_score, p[i].english_score, p[i].all_score, p[i].average_score);
fclose(fp);
break;
}
else if (j == 0)
{
break;
}
else
printf("输入错误,请重新输入。。。\n");
}
}
}
}
//swap.cpp
#include"swap.h"
#include"struct.h"
#include<stdio.h>
void student_all_swap(struct student p[], int n)
{
int j, k;
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
if (p[j].all_score > p[k].all_score)
{
struct student temp;
temp = p[j];
p[j] = p[k];
p[k] = temp;
}
}
}
//是否保存到文件夹
int m;
while (1)
{
printf("是否需要保存到文件,需要请按1,不需要请按0:");
scanf_s("%d", &m);
printf("\n");
if (m == 0 || m == 1);
{
break;
}
printf("输入错误,请重新输入。。。\n");
}
if (m == 1)
{
FILE *fp;
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\总分排名.txt", "wt+");
for (int c = 0; c < n; c++)
{
fprintf(fp, "学号:%3d;姓名:%10s;性别:%2c;语文成绩:%3lf;数学成绩:%3lf;英语成绩:%3lf;总成绩:%4lf;平均分:%3lf;\n", p[c].number, p[c].name, p[c].sex, p[c].china_score, p[c].math_score, p[c].english_score, p[c].all_score, p[c].average_score);
}
fclose(fp);
fopen_s(&fp, "C:\\Users\\Asus\\Desktop\\学生管理系统6\\1班\\总分排名computer.txt", "wt+");
fwrite(p, n * sizeof(struct student), 1, fp);
fclose(fp);
}
}