基于c语言-高中生信息管理系统

该系统使用C语言编写,包括学生信息的基本资料管理、成绩管理、统计查询以及系统设置功能。用户通过登录界面进行管理员或学生身份登录,不同权限可执行不同的操作。系统设置允许管理员进行权限设置、数据库备份、恢复和初始化。整个系统采用结构体数据库存储学生信息,并实现了增删改查等常见操作。
摘要由CSDN通过智能技术生成

基于c语言-高中生信息管理系统

一、题目简介

该设计要求学生以学生管理业务为背景,对“学生信息管理系统”软件进行分析和设计。
通过该题目的分析和设计,使学生初步得到软件工程的训练,全面培养软件开发过程中的分析、设计、编码、测试及文档规范书写的能力,得到软件工程的综合训练,提高解决实际问题的能力。

二、设计任务

1、查阅文献资料,一般在5篇以上;
2、针对学生信息管理系统,锻炼学生的分析、设计能力,培养学生对软件文档规范的书写能力;
3、以学生信息管理业务为背景,通过调研、分析现有的管理模式和已有的管理软件,建立系统模型;
4、完成学生信息管理系统的软件可行性分析、项目开发计划、需求规格说明、概要设计和详细设计(结构化设计方法和面向对象设计方法可任选一种);
5、在分析和设计的基础上编码完成一个可演示的版本并进行测试;
6、撰写设计说明书;

三、主要框架

系统框架

四、系统结构详解

1.全局介绍:

//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
//2.成绩管理:对学生的成绩进行管理;
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
//5.返回登录界面

2.库函数与函数定义

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

void Databaseinitialization();
void Loginscreen();
void Interface();
int outmenu();

//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement();
void addstudent( );
void restudent( );
void destudent();
void listudent( );
//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement();
void addstuscores();
void resstuscores();
void destuscores();
void listuscores();
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery();
void stuinforinquiry();
void stubainforstatistics();
void gendernum();
void agenum();
void clanum();
void stuperforstatistics();
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings();
void adPerSettings();
void dadababackup();
void resdadatabase();
void indadatabase();

3.结构体数据库与初始变量设置

//学生资料数据
typedef  struct Student	
{
	int id;			//编号1,2,3...
	char name[15];	//名字
	char gender[2];	//性别-男-女 
	int age;		//年龄
	char cla[10];	//班级
	char phone[15];	//电话
	int sco[4];	//成绩--语文,数学,英语,总分
};
//账户数据
typedef  struct Account 
{
	char acc[20];		//账号
	char password[20];	//密码
	int key;			//忘记密码问题答案
	int permissions;	//权限-0-管理员,1-学生
};

#define n 100	//最大储存数

//全局变量
int logstatus = -1;//登录状况,0-管理员,1-学生
int id = 0;//资料数据库数组[id](0-1-...)  id=0-->序号为1的资料,即stu[id].id=1;
int idnum = 0;//资料总人数
int accnum = 0;//账户数据库数组[accnum](0-1-...)
int numbackup = 0;//备份的数目
int Ending = 1;	//退出
const char* filename = "d:/code/c/database.txt";//备份文件放置位置
Student stu[n];  //资料数据库
Account acc[n];	 //账户数据库

4.主函数-main()

void main()	//主程序
{
	Databaseinitialization();//数据库初始化
	while (Ending)
	{
		Loginscreen();//用户登录界面
		if (Ending)
			Interface();  //操作界面
	}
}

5.数据库初始化-Databaseinitialization()

//数据库初始化
void Databaseinitialization()
{
	accnum = 2;
	id = 2;
	idnum = 2;
	//设置账户第一个账号密码,且权限为管理员
	strcpy(acc[0].acc, "0");
	strcpy(acc[0].password, "0");
	acc[0].permissions = 0;
	//设置账户第二个账号密码,且权限为普通用户
	strcpy(acc[1].acc, "1");
	strcpy(acc[1].password, "1");
	acc[1].permissions = 1;

	//学生资料初始化
	stu[0].id = 1;
	strcpy(stu[0].name, "张三");
	strcpy(stu[0].gender, "男");
	stu[0].age = 21;
	strcpy(stu[0].cla, "高三一班");
	strcpy(stu[0].phone, "13200000000");
	stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;

	stu[1].id = 2;
	strcpy(stu[1].name, "李四");
	strcpy(stu[1].gender, "男");
	stu[1].age = 21;
	strcpy(stu[1].cla, "高三一班");
	strcpy(stu[1].phone, "18000000000");
	stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
}

以下介绍界面代码过长,就统一放在总代码里啦.

6.用户登录界面-Loginscreen()

登录界面

7.操作界面-Interface()

信息管理系统

7.1学生信息基本资料管理-Stubainformanagement()

学生信息基本资料管理
①添加学生基本信息-addstudent()
②修改学生基本信息-restudent()
③删除学生基本信息-destudent()
④查看学生基本信息-listudent()

7.2学生成绩管理-Performancemanagement()

学生成绩管理
①添加学生成绩-addstuscores()
②修改学生成绩-resstuscores()
③删除学生成绩-destuscores()
④查看学生成绩-listuscores()

7.3统计查询-Statisticalquery()

统计查询
①学生资料查询-stuinforinquiry()
②学生基本信息统计-stubainforstatistics()
//性别人数比例-gendernum()
//年龄分布-agenum()
//班级人数分布-clanum()
③学生成绩统计–平均分,最高分-stuperforstatistics()

7.4系统设置-SysSettings()

系统设置
①管理员权限设置-adPerSettings()
②对资料数据库备份-dadababackup()
③恢复上一次的备份-resdadatabase()
④数据库初始化-indadatabase()

7.4返回登录界面-outmenu()

返回登录界面

五、总代码

/*
	-->高中生信息管理系统
	该设计要求学生以学生管理业务为背景,对“学生信息管理系统”软件进行分析和设计。
	将学生信息管理系统划分为:学生基本资料管理、成绩管理、统计查询管理、系统设置等。
	其中:
		//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
		//2.成绩管理:对学生的成绩进行管理;
		//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
		//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
*/
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include <conio.h>

void Databaseinitialization();
void Loginscreen();
void Interface();
int outmenu();

//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement();
void addstudent( );
void restudent( );
void destudent();
void listudent( );
//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement();
void addstuscores();
void resstuscores();
void destuscores();
void listuscores();
//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery();
void stuinforinquiry();
void stubainforstatistics();
void gendernum();
void agenum();
void clanum();
void stuperforstatistics();
//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings();
void adPerSettings();
void dadababackup();
void resdadatabase();
void indadatabase();

//学生资料数据
typedef  struct Student	
{
	int id;			//编号1,2,3...
	char name[15];	//名字
	char gender[2];	//性别-男-女 
	int age;		//年龄
	char cla[10];	//班级
	char phone[15];	//电话
	int sco[4];	//成绩--语文,数学,英语,总分
};
//账户数据
typedef  struct Account 
{
	char acc[20];		//账号
	char password[20];	//密码
	int key;			//忘记密码问题答案
	int permissions;	//权限-0-管理员,1-学生
};

#define n 100	//最大储存数

//全局变量
int logstatus = -1;//登录状况,0-管理员,1-学生
int id = 0;//资料数据库数组[id](0-1-...)  id=0-->序号为1的资料,即stu[id].id=1;
int idnum = 0;//资料总人数
int accnum = 0;//账户数据库数组[accnum](0-1-...)
int numbackup = 0;//备份的数目
int Ending = 1;	//退出
const char* filename = "d:/code/c/database.txt";//备份文件放置位置
Student stu[n];  //资料数据库
Account acc[n];	 //账户数据库

void main()	//主程序
{
	Databaseinitialization();//数据库初始化
	while (Ending)
	{
		Loginscreen();//用户登录界面
		if (Ending)
			Interface();  //操作界面
	}
}

//数据库初始化
void Databaseinitialization()
{
	accnum = 2;
	id = 2;
	idnum = 2;
	//设置账户第一个账号密码,且权限为管理员
	strcpy(acc[0].acc, "0");
	strcpy(acc[0].password, "0");
	acc[0].permissions = 0;
	//设置账户第二个账号密码,且权限为普通用户
	strcpy(acc[1].acc, "1");
	strcpy(acc[1].password, "1");
	acc[1].permissions = 1;

	//学生资料初始化
	stu[0].id = 1;
	strcpy(stu[0].name, "张三");
	strcpy(stu[0].gender, "男");
	stu[0].age = 21;
	strcpy(stu[0].cla, "高三一班");
	strcpy(stu[0].phone, "13200000000");
	stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;

	stu[1].id = 2;
	strcpy(stu[1].name, "李四");
	strcpy(stu[1].gender, "男");
	stu[1].age = 21;
	strcpy(stu[1].cla, "高三一班");
	strcpy(stu[1].phone, "18000000000");
	stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
}
//用户登录界面
void Loginscreen()
{
	int i;
	int Loop = 1;	//账户登录界面loop
	do
	{
		Loop = 1;
		int ch = 0, key;
		int login=-1;//登录寻找结果
		int useregistration = 0;//用户注册寻找结果
		int forpassword = 0;//修改与忘记密码的寻找结果
		int loop1 = 111;
		char acc1[20] = "";
		char password1[20] = "";
		printf("----------------学生信息信息管理系统登录界面----------------\n\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("请选择(1-6):\n");
		scanf("%d", &ch);
		if (ch > 6 || ch < 1)
		{
			printf("输入有误,请重新输入\n");
			continue;
		}
		switch (ch)
		{
		case 1:
			//1 管 理 员 登 录(可进行信息查看与修改)
			while (loop1)
			{
				printf("请输入管理员账号(-1返回):\n");
				scanf("%s", acc1);
				if (!strcmp(acc1, "-1"))
				{
					loop1 = 0; break;
				}
				for (i = 0; i < accnum; i++)
				{
					if (!strcmp(acc[i].acc, acc1))
					{
						login = i;//数据库存在该账户
						break;
					}
				}
				if (login != -1)
				{
					printf("请输入管理员账号密码:\n");
					scanf("%s", password1);
					for (i = 0; i < accnum; i++)
					{
						if (!strcmp(acc[i].acc, acc1))
						{
							if (!strcmp(acc[i].password, password1))
							{
								if (acc[i].permissions == 0)
								{
									logstatus = 0;
									printf("管理员登录成功\n");
									loop1 = 0;
									Loop = 0;
								}
								else
									printf("该账户非管理员\n");
							}
							else
								printf("密码输入有误,请重新输入.\n");
							break;
						}
					}
				}
				else
					printf("资料库没有该用户!!!\n");
			}
			break;
		case 2:
			//2 学 生 登 录(只能查看不能修改)
			while (loop1)
			{
				printf("请输入学生账号:\n");
				scanf("%s", acc1);
				if (!strcmp(acc1, "-1"))
				{
					loop1 = 0; break;
				}
				for (i = 0; i < accnum; i++)
				{
					if (!strcmp(acc[i].acc, acc1))
					{
						login = i;//数据库存在该账户
						break;
					}
				}
				if (login != -1)
				{
					printf("请输入学生账号密码:\n");
					scanf("%s", password1);
					for (i = 0; i < accnum; i++)
					{
						if (!strcmp(acc[i].acc, acc1))
						{
							if (!strcmp(acc[i].password, password1))
							{
								logstatus = 1;
								printf("学生登录成功\n");
								loop1 = 0;
								Loop = 0;
							}
							else
								printf("密码输入有误,请重新输入.\n");
						}
					}
				}
				else
					printf("资料库没有该用户!!!\n");
			}
			break;
		case 3:
			//3 用 户 注 册
			while (loop1)
			{
				printf("请输入用户账号(-1返回):\n");
				scanf("%s", acc1);
				if (!strcmp(acc1, "-1"))
				{
					loop1 = 0; break;
				}
				for (i = 0; i < accnum; i++)
				{
					if (!strcmp(acc[i].acc, acc1))
					{
						printf("已经存在该账号,请重新输入!!!\n");
						useregistration = 1;
						break;
					}
					else
						useregistration = 0;
				}
				if (!useregistration)
				{
					printf("请输入账号密码:\n");
					scanf("%s", password1);
					printf("请输入账号密匙(用于更改密码):\n");
					scanf("%d", &key);
					strcpy(acc[accnum].acc, acc1);
					strcpy(acc[accnum].password, password1);
					acc[accnum].key = key;
					accnum++;
					printf("账户创建完成!!!\n");
				}
			}
			break;
		case 4:
			//4 密 码 修 改
			while (loop1)
			{
				printf("请输入要修改密码的账户(-1返回):\n");
				scanf("%s", acc1);
				if (!strcmp(acc1, "-1"))
				{
					loop1 = 0; break;
				}
				for (i = 0; i < accnum; i++)
				{
					if (!strcmp(acc[i].acc, acc1))
					{
						forpassword = i;//数据库存在该账户
						break;
					}
				}
				if (forpassword)
				{
					printf("请输入该账号密匙:\n");
					scanf("%d", &key);
					if (key == acc[forpassword].key)
					{
						printf("请输入新密码:\n");
						scanf("%s", password1);
						strcpy(acc[forpassword].password, password1);
						printf("密码修改完成!!!\n");
					}
					else
						printf("输入的密匙有误!!!\n");
				}
				else
					printf("未存在该账号,请重新输入!!!\n");
			}
			break;
		case 5:
			//5 忘 记 密 码
			while (loop1)
			{
				printf("请输入忘记密码的账户(-1返回):\n");
				scanf("%s", acc1);
				if (!strcmp(acc1, "-1"))
				{
					loop1 = 0; break;
				}
				for (i = 0; i < accnum; i++)
				{
					if (!strcmp(acc[i].acc, acc1))
					{
						forpassword = i;//数据库存在该账户
						break;
					}
				}
				if (forpassword)
				{
					printf("请输入该账号密匙:\n");
					scanf("%d", &key);
					if (key == acc[forpassword].key)
					{
						printf("该账户密码为:%s\n", acc[forpassword].password);
					}
					else
						printf("输入的密匙有误!!!\n");
				}
				else
					printf("未存在该账号,请重新输入!!!\n");
			}
			break;
		case 6:
			//6 退       出
			Loop = 0;
			Ending = outmenu();
			break;
		}
	} while (Loop);
}
//操作界面
void Interface()
{
	int choice = 0;
	int ending = 111, loop = 111;
	do
	{
		printf("----------------学生信息信息管理系统----------------\n\n");
		printf("\t\t1 学生信息基本资料管理\n");
		printf("\t\t2 成绩管理\n");
		printf("\t\t3 统计查询管理\n");
		printf("\t\t4 系统设置\n");
		printf("\t\t5 返回登录界面\n");
		printf("请选择(1-5):\n");
		scanf("%d", &choice);
		if (choice > 5 || choice < 1)
		{
			printf("输入有误,请重新输入");
			continue;
		}
		switch (choice)
		{
		case 1:
			//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
			Stubainformanagement();
			break;
		case 2:
			//2.成绩管理:对学生的成绩进行管理;
			Performancemanagement();
			break;
		case 3:
			//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
			Statisticalquery();
			break;
		case 4:
			//4.系统设置:①可以对数据库备份/恢复/初始化,②管理操作员等。
			if (!logstatus)
			{
				SysSettings();
			}
			else
			{
				printf("需要管理员权限\n");
			}
			break;
		case 5:
			ending = outmenu();
			break;

		}
	} while (ending);
}
//退出菜单--返回0
int outmenu()
{
	int loop = 0;
	char choice;
	printf("\n你确定要退出吗? y/n\n");
	do {
		getchar(); //跳过回车
		scanf("%c", &choice);

		if (choice == 'y' || choice == 'n') {
			break;
		}
		printf("\n你的输入有误,请重新输入 y/n ?");
	} while (1);
	if (choice == 'y')
		loop = 0;
	else
		loop = 1;
	return loop;

}

//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
void Stubainformanagement()
{
	int ch;
	int loop = 111;
	do
	{
		printf("----------------学生信息操作选择----------------\n\n");
		printf("\t\t1 添 加 学 生 信 息\n");	
		printf("\t\t2 修 改 学 生 信 息\n");
		printf("\t\t3 删 除 学 生 信 息\n");
		printf("\t\t4 学 生 信 息 列 表\n");
		printf("\t\t5 退             出\n");
		printf("请选择(1-5(1-3需要管理员权限)):\n");
		scanf("%d", &ch);
		if (ch > 5 || ch < 1)
		{
			printf("输入有误,请重新输入");
			continue;
		}
		switch (ch)
		{
		case 1:
			if (!logstatus)
			{
				addstudent();
				id++;
			}
			else
			{
				printf("需要管理员权限\n");
			}
			break;
		case 2:
			if (!logstatus)
			{
				restudent();
			}
			else
			{
				printf("需要管理员权限\n");
			}
			break;
		case 3:
			if (!logstatus)
			{
				destudent();
			}
			else
			{
				printf("需要管理员权限\n");
			}
			break;
		case 4:
			listudent();
			break;
		case 5:
			loop = 0;
			break;
		}
	} while (loop);
}
//①添加学生基本信息
void addstudent( )
{
	stu[id].id = id + 1;
	printf("------------------添加学生信息------------------\n\n");
	printf("姓名:\n");
	scanf("%s", stu[id].name);
	printf("性别:\n");
	scanf("%s", stu[id].gender);
	printf("年龄:\n");
	scanf("%d", &stu[id].age);
	printf("班级:\n");
	scanf("%s", stu[id].cla);
	printf("电话:\n");
	scanf("%s", stu[id].phone);
	idnum = id + 1;
	printf("--------------------添加完成--------------------\n");
}
//②修改学生基本信息
void restudent( )
{
	int moid;
	while (1)
	{
		printf("------------------修改学生信息------------------\n\n");
		printf("请选择待修改学生编号(-1退出):");
		scanf("%d", &moid);
		if (moid == -1)
		{
			return;
		}
		else if (moid > idnum)
		{
			printf("输入编号没有学生信息,请重新输入\n");
		}
		else
		{
			moid = moid - 1;
			//printf("请选择要修改的内容:)\n");
			printf("姓名(%s):\n", stu[moid].name);
			scanf("%s", stu[moid].name);
			printf("性别(%s):\n", stu[moid].gender);
			scanf("%s", stu[moid].gender);
			printf("年龄(%d):\n", stu[moid].age);
			scanf("%d", &stu[moid].age);
			printf("班级(%s):\n", stu[moid].cla);
			scanf("%s", stu[moid].cla);
			printf("电话(%s):\n", stu[moid].phone);
			scanf("%s", stu[moid].phone);
			printf("--------------------修改成功--------------------\n");
			return;
		}
	}
}
//③删除学生基本信息
void destudent( )
{
	int deid;
	int i;
	char choice;
	while (1)
	{
		printf("------------------删除学生信息------------------\n");
		printf("请选择待删除学生信息编号(-1退出):");
		scanf("%d", &deid);
		if (deid == -1)
		{
			return ;
		}
		else if (deid > id)
		{
			printf("输入编号没有学生信息,请重新输入\n");
			continue;
		}
		else
		{
			printf("确认是否删除(Y/ N):\n");
			getchar(); //跳过回车
			scanf("%c", &choice);
			if (choice == 'y' || choice == 'Y')
			{
				deid = deid - 1;
				id = id - 1;
				idnum = id;
				for (i = deid; i < n - 2; i++)
				{
					stu[i] = stu[i + 1];
					stu[i].id--;
				}
				printf("--------------------删除完成--------------------\n");
				return ;
			}
			else
				return ;
		}
	}

}
//④查看学生基本信息
void listudent( )
{
	int i,lenmax;
	int len[n];
	if (id == 0)
	{
		printf("表格中尚未有用户数据!\n");
		return;
	}
	else
	{
		for (i = 0; i < id; i++)
		{
				len[i]= 10-strlen(stu[i].cla);
		}
		printf("--------------------用户列表--------------------\n");
		printf("编号\t姓名\t性别\t年龄\t班级\t  电话\n");
		for (i = 0; i < id; i++)
		{
			printf("%d\t%s\t%s\t%d\t%s", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla);
			for (int j = 0; j < len[i]; j++)
				printf(" ");
			printf("%s", stu[i].phone);
			printf("\n");
		}
		printf("----------------学生信息列表完成----------------\n\n");
	}

}

//2.成绩管理:对学生的成绩进行管理;
void Performancemanagement()
{
	int ch;
	int loop = 111;
	if (idnum == 0)
	{
		printf("表格中尚未有用户数据!\n");
		return;
	}
	else
	{
		do
		{
			printf("----------------学生成绩操作选择----------------\n\n");
			printf("\t\t1 添加学生成绩信息\n");
			printf("\t\t2 修改学生成绩信息\n");
			printf("\t\t3 删除学生成绩信息\n");
			printf("\t\t4 学生成绩信息列表\n");
			printf("\t\t5 退	出\n");
			printf("请选择(1-5(1-3需要管理员权限)):\n");
			scanf("%d", &ch);
			if (ch > 5 || ch < 1)
			{
				printf("输入有误,请重新输入");
				continue;
			}
			switch (ch)
			{
			case 1:
				if (!logstatus)
				{
					addstuscores();
				}
				else
				{
					printf("需要管理员权限\n");
				}
				break;
			case 2:
				if (!logstatus)
				{
					resstuscores();
				}
				else
				{
					printf("需要管理员权限\n");
				}
				break;
			case 3:
				if (!logstatus)
				{
					destuscores();
				}
				else
				{
					printf("需要管理员权限\n");
				}
				break;
			case 4:
				listuscores();
				break;
			case 5:
				loop = 0;
				break;

			}
		} while (loop);
		return;
	}
}
//①添加学生成绩
void addstuscores()
{
	int addid;
	while (1)
	{
		printf("请输入要添加成绩的学生编号(-1退出):\n");
		scanf("%d", &addid);
		if (addid == -1)
			return;
		else if (addid > idnum)
		{
			printf("输入的学生编号没有对应信息.请重新输入");
		}
		else
		{
			printf("---------------------添加学生成绩信息---------------------\n\n");
			printf("语文成绩:\n");
			scanf("%d", &stu[addid - 1].sco[0]);
			printf("数学成绩:\n");
			scanf("%d", &stu[addid - 1].sco[1]);
			printf("英语成绩:\n");
			scanf("%d", &stu[addid - 1].sco[2]);
			stu[addid - 1].sco[3] = stu[addid - 1].sco[0] + stu[addid - 1].sco[1] + stu[addid - 1].sco[2];
			printf("--------------------添加完成--------------------\n");
			return;
		}

	}

}
//②修改学生成绩
void resstuscores()
{
	int moid;
	while (1)
	{
		printf("请输入要修改成绩的学生编号(-1退出):\n");
		scanf("%d", &moid);
		if (moid == -1)
			return;
		else if (moid > idnum)
		{
			printf("输入的学生编号没有对应信息.请重新输入");
		}
		else
		{
			printf("----------------修改学生成绩信息----------------\n\n");
			printf("语文成绩:\n");
			scanf("%d", &stu[moid - 1].sco[0]);
			printf("数学成绩:\n");
			scanf("%d", &stu[moid - 1].sco[1]);
			printf("英语成绩:\n");
			scanf("%d", &stu[moid - 1].sco[2]);
			stu[moid - 1].sco[3] = stu[moid - 1].sco[0] + stu[moid - 1].sco[1] + stu[moid - 1].sco[2];
			printf("--------------------修改完成--------------------\n");
			return;
		}
	}
}
//③删除学生成绩
void destuscores()
{
	int deid;
	while (1)
	{
		printf("请输入要删除成绩的学生编号(-1退出):\n");
		scanf("%d", &deid);
		if (deid == -1)
			return;
		else if (deid > idnum)
		{
			printf("输入的学生编号没有对应信息.请重新输入");
		}
		else
		{
			printf("----------------删除学生成绩信息----------------\n");
			stu[deid - 1].sco[0] = 0;
			stu[deid - 1].sco[1] = 0;
			stu[deid - 1].sco[2] = 0;
			stu[deid - 1].sco[3] = 0;
			printf("--------------------删除完成--------------------\n");
			return;
		}
	}
}
//④查看学生成绩
void listuscores()
{
	int i;
	int len[n];
	if (idnum == 0)
	{
		printf("表格中尚未有用户数据!\n");
		return;
	}
	else
	{
		for (i = 0; i < id; i++)
		{
			len[i] = 10 - strlen(stu[i].cla);
		}
		printf("------------------学生成绩列表------------------\n");
		printf("编号\t姓名\t班级\t  语文  数学  英语  总分");
		printf("\n");
		for (i = 0; i < id; i++)
		{
			printf("%d\t%s\t%s", stu[i].id, stu[i].name, stu[i].cla);
			for (int j = 0; j < len[i]; j++)
				printf(" ");
			printf("%d    %d    %d    %d", stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
			printf("\n");
		}
		printf("----------------成绩信息列表完成----------------\n\n");
	}

}

//3.统计查询:对学生的资料查询,对学生信息进行综合统计、成绩统计等统计;
void Statisticalquery()
{
	int ch;
	int loop = 111;
	if (idnum == 0)
	{
		printf("表格中尚未有用户数据!\n");
		return;
	}
	else
	{
		do
		{
			printf("------------------统计查询操作------------------\n\n");
			printf("\t\t1 学 生 资 料 查 询\n");
			printf("\t\t2 学 生 基 本 信 息 统 计\n");
			printf("\t\t3 学 生 成 绩 统 计\n");
			printf("\t\t4 退             出\n");
			printf("请选择(1-4):_\n");
			scanf("%d", &ch);
			if (ch > 4 || ch < 1)
			{
				printf("输入有误,请重新输入");
				continue;
			}
			switch (ch)
			{
			case 1:
				stuinforinquiry();
				break;
			case 2:
				stubainforstatistics();
				break;
			case 3:
				stuperforstatistics();
				break;
			case 4:
				loop = 0;
				break;
			}
		} while (loop);
	}
}
//①学生资料查询
void stuinforinquiry()
{
	int quid;	
	int choice;
	int loop=111;
	while (1)
	{
		printf("请输入要查询的学生编号(-1退出):\n");
		scanf("%d", &quid);
		if (quid == -1)
			return;
		else if (quid > idnum)
		{
			printf("输入的学生编号没有对应信息.请重新输入");
		}
		else
		{
			while (loop)
			{
				printf("----------------学生信息查看选择----------------\n\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");
				scanf("%d", &choice);
				if (choice > 8 || choice < 1)
				{
					printf("输入有误,请重新输入");
					continue;
				}
				switch (choice)
				{
				case 1:
					printf("姓名\t性别\t年龄\t班级\t电话\t语文   数学   英语   总分\n");
					printf("%s\t%s\t%d\t%s\t%s\t%d   %d   %d   %d\n", stu[quid].name, stu[quid].gender, stu[quid].age, stu[quid].cla, stu[quid].phone, stu[quid].sco[0], stu[quid].sco[1], stu[quid].sco[3], stu[quid].sco[4]);
					break;
				case 2:
					printf("姓名为:%s\n", stu[quid].name);
					break;
				case 3:
					printf("性别为:%s\n", stu[quid].gender);
					break;
				case 4:
					printf("年龄为:%d\n", stu[quid].age);
					break;
				case 5:
					printf("班级为:%s\n", stu[quid].cla);
					break;
				case 6:
					printf("电话为:%s\n", stu[quid].phone);
					break;
				case 7:
					printf("成绩为:语文:%d\n数学:%d\n英语:%d\n总分:%d\n", stu[quid].sco[0], stu[quid].sco[1], stu[quid].sco[2], stu[quid].sco[3]);
					break;
				case 8:
					loop = 0;
					break;
				}
			}
			return;
		}
	}
}
//②学生基本信息统计
void stubainforstatistics()
{
	printf("总人数: %d\n",idnum);
	//性别人数比例
	gendernum();
	//年龄分布
	agenum();
	//班级人数分布
	clanum();
}
//性别人数比例
void gendernum()
{
	int i;
	int mnum=0, femnum=0; //男女人数
	double proofmale, prooffemale;//男女比例
	for (i = 0; i < idnum; i++)
	{
		if (!strcmp(stu[i].gender, "男"))
			mnum++;
		else if (!strcmp(stu[i].gender, "女"))
			femnum++;
	}
	proofmale = mnum * 100 / idnum;
	prooffemale = femnum * 100 / idnum;
	printf("男生人数:%d  所占比例:%.2f%%\n", mnum, proofmale);
	printf("女生人数:%d  所占比例:%.2f%%\n", femnum, prooffemale);
}
//年龄分布
void agenum()
{
	int i, j;
	typedef  struct age
	{
		int age;
		int agenum = 1; //该年龄人数
		double ageratio;//该年龄比例
	};
	int anum = 1;//年龄种类个数
	age a[20];
	a[0].age = stu[0].age;
	for (i = 1; i < idnum; i++)
	{
		for (j = 0; j < anum; j++)
		{
			if (stu[i].age == a[j].age)	//原有,则对应数目+1
				a[j].agenum++;
			else
				a[anum++].age = stu[i].age;//没有,则添加
		}
	}
	for (i = 0; i < anum; i++)
	{
		a[i].ageratio = a[i].agenum*100 / idnum;//计算各年龄比例
	}
	for (i = 0; i < anum; i++)
	{
		printf("%d岁人数:%d 所占比例:%.2f%%\n", a[i].age, a[i].agenum, a[i].ageratio);
	}
}
//班级人数分布
void clanum()
{
	int i, j;
	typedef  struct cla
	{
		char cla[10];
		int clanum = 1; //该班级人数
		double claratio;//该班级人数比例
	};
	int cnum = 1;//班级种类个数
	cla c[20];
	strcpy(c[0].cla, stu[0].cla);
	for (i = 1; i < idnum; i++)
	{
		for (j = 0; j < cnum; j++)
		{
			if (!strcmp(stu[j].cla, c[j].cla))	//原有,则对应数目+1,相同-返回0
				c[j].clanum++;
			else
				strcpy(c[cnum++].cla, stu[i].cla);//没有,则添加
		}
	}
	for (i = 0; i < cnum; i++)
	{
		c[i].claratio = c[i].clanum *100/ idnum;//计算各年龄比例
	}
	for (i = 0; i < cnum; i++)
	{
		printf("%s班级人数:%d 所占比例:%.2f%%\n", c[i].cla, c[i].clanum, c[i].claratio);
	}
}
//③学生成绩统计--平均分,最高分
void stuperforstatistics()
{
	int i, j;
	typedef  struct score
	{
		double topoints=0;//总分
		double avescore=0;//平均分
		double tapscore=0;//最高分
	};
	score sco[4];//语文-数学-英语-总分
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < idnum; j++)
		{
			sco[i].topoints = sco[i].topoints + stu[j].sco[i];//求单个数据总和
		}
	}
	for (i = 0; i < 4; i++)
	{
		sco[i].avescore = sco[i].topoints / idnum;//求平均分
		sco[i].tapscore= stu[0].sco[i];//储存第一个学生成绩,用于求最大值
	}
	for (i = 0; i < idnum; i++)
	{
		for (j = 0; j < 4; j++)
		{
			if (sco[j].tapscore < stu[i].sco[j])
				sco[j].tapscore= stu[i].sco[j];//求最高分
		}
	}
	printf("类别   语文  数学  英语  总分\n");
	printf("平均分 %.1f  %.1f  %.1f  %.1f\n", sco[0].avescore, sco[1].avescore, sco[2].avescore, sco[3].avescore);
	printf("最高分 %.f    %.f    %.f   %.f\n", sco[0].tapscore, sco[1].tapscore, sco[3].tapscore, sco[3].tapscore);

}

//4.系统设置:①管理员权限设置,②对资料数据库备份③恢复④初始化等。
void SysSettings()
{
	int choice;
	int ending = 111;
	do
	{
		printf("---------------------系统设置---------------------\n\n");
		printf("\t\t1 管理员权限设置\n");
		printf("\t\t2 数据库备份\n");
		printf("\t\t3 数据库恢复\n");
		printf("\t\t4 数据库初始化\n");
		printf("\t\t5 退	出\n");
		printf("请选择(1-5):\n");
		scanf("%d", &choice);
		if (choice > 5 || choice < 1)
		{
			printf("输入有误,请重新输入");
			continue;
		}
		switch (choice)
		{
		case 1:
			//1.学生信息基本资料管理:可完成学生信息资料的添加、删除、修改的常用操作;
			adPerSettings();
			break;
		case 2:
			//2 数据库备份
			dadababackup();
			break;
		case 3:
			//3 数据库恢复
			resdadatabase();
			break;
		case 4:
			//4 数据库初始化
			indadatabase();
			break;
		case 5:
			//5 退		出
			ending = 0;
			break;

		}
	} while (ending);
}
//①管理员权限设置
void adPerSettings()
{
	int i;
	int forpassword = 0;
	int loop = 111;
	char acc1[20];
	while (loop)
	{
		printf("请输入要赋予管理员权限的账户(-1返回):\n");
		scanf("%s", acc1);
		if (!strcmp(acc1, "-1"))
		{
			loop = 0; break;
		}
		for (i = 0; i < accnum; i++)
		{
			if (!strcmp(acc[i].acc, acc1))
			{
				forpassword = i;//数据库存在该账户
				break;
			}
		}
		if (forpassword)
		{
			acc[forpassword].permissions = 0;
			printf("-------------------------操作完成-------------------------\n");
		}
		else
			printf("未存在该账号,请重新输入!!!\n");
	}
}
//②对资料数据库备份
void dadababackup()
{
	int i;
	//创建一个文件指针
	FILE* fp = NULL;

	//打开文件/如果不存在则创建
	fp = fopen(filename, "w");//清空原数据
	if (fp == NULL)
	{
		puts("打开文件失败!");
		exit(0);
	}
	fputs("", fp);
	fclose(fp);
	fp = fopen(filename, "a");//追加模式写入
	fprintf(fp, "编号\t姓名\t性别\t年龄\t班级\t电话\t\t语文   数学   英语   总分\n");
	for (i = 0; i < idnum; i++)
	{
		fprintf(fp, "%d\t%s\t%s\t%d\t%s\t%s\t%d   %d   %d   %d\n", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla, stu[i].phone, stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
	}
	numbackup = idnum;
	//关闭文件!!!
	fclose(fp);
	printf("---------------------数据库备份完成--------------------\n");

}
//③恢复上一次的备份
void resdadatabase()
{
	int i;
	FILE* fp = NULL;
	char s[20][20];
	//打开文件/如果不存在则创建
	fp = fopen(filename, "a+");//追加模式读取
	if (fp == NULL)
	{
		puts("Fali to open file!");
		exit(0);
	}
	///将文件位置指示符移动到指定文件流的开始。
	rewind(fp);
	//从文件中读取数据,保存到stu
	fscanf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t\t%s   %s   %s   %s\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
	id = idnum = numbackup;
	for (i = 0; i < idnum; i++)
	{
		fscanf(fp, "%d\t%s\t%s\t%d\t%s\t%s\t%d   %d   %d   %d\n", &stu[i].id, stu[i].name, stu[i].gender, &stu[i].age, stu[i].cla, stu[i].phone, &stu[i].sco[0], &stu[i].sco[1], &stu[i].sco[2], &stu[i].sco[3]);
	}
	printf("数据恢复为:\n");
	printf("%s\t%s\t%s\t%s\t%s\t%s\t\t%s   %s   %s   %s\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
	for (i = 0; i < idnum; i++)
	{
		printf("%d\t%s\t%s\t%d\t%s\t%s\t%d   %d   %d   %d\n", stu[i].id, stu[i].name, stu[i].gender, stu[i].age, stu[i].cla, stu[i].phone, stu[i].sco[0], stu[i].sco[1], stu[i].sco[2], stu[i].sco[3]);
	}

	fclose(fp);
	printf("---------------------数据库恢复完成--------------------\n");
}
//④数据库初始化
void indadatabase()
{
	id = 2;
	idnum = 2;
	stu[0].id = 1;
	strcpy(stu[0].name, "陈望明");
	strcpy(stu[0].gender, "男");
	stu[0].age = 21;
	strcpy(stu[0].cla, "高三一班");
	strcpy(stu[0].phone, "13288403973");
	stu[0].sco[0] = 80; stu[0].sco[1] = 90; stu[0].sco[2] = 80; stu[0].sco[3] = 250;

	stu[1].id = 2;
	strcpy(stu[1].name, "扎龙");
	strcpy(stu[1].gender, "男");
	stu[1].age = 21;
	strcpy(stu[1].cla, "高三一班");
	strcpy(stu[1].phone, "18070193131");
	stu[1].sco[0] = 90; stu[1].sco[1] = 80; stu[1].sco[2] = 90; stu[1].sco[3] = 260;
	printf("-------------------数据库初始化成功-------------------\n");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值