用结构体数组编写学生管理系统,获得初次输入信息或读取上一次的输入储存的信息并运行后续功能、 插入功能、 删除功能、修改功能、查询功能、显示全部学部学生信息功能、输出总分排名功能、保存功能、实时更新功能

先来说说本管理系统囊括的功能:
用户名密码锁;
自动清空屏幕;(关于这一点,如果你需要,也可以改成判断型清屏)
缓冲;(这点是因为某些功能需要保留屏幕上一些信息一段时间,免遭自动清屏而设置的)
多重菜单;(以满足并协调各个阶段的功能)
输入选项;(与菜单功能配套使用,但并不在同一头文件、源文件内)
初次输入信息并运行后续功能;
读取上一次的输入储存的信息并运行后续功能;
插入学生信息;
删除学生信息;
修改学生信息;
查询学生信息;
显示全部学生信息;
输出总分排名表;
保存信息到文件夹中;
实时更新学生信息并保存;(每次修改、插入、删除后自动更新文件夹中所储存的信息)

接下来我介绍一下本管理系统的大致思路:
我将这个系统所应具备的各个功能分别放在不同的头文件、源文件中编写,每套头文件、源文件对应相应的某个功能,最后再通过添加头文件、调用函数,在源文件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);

}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值