学生管理系统

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

#define DEFAULT_SZ  5
#define DEFAULT_INC 2

#define MAX_NAME 20

//成绩
struct score
{
	int math;//数学
	int english;//英语
	int chinese;//语文
	int avergage;//平均成绩
	int total;//总成绩
};

//一个学生的信息
typedef struct PeopleInfo
{
	char name[MAX_NAME];
	int age;
	char id[13];
	//成绩
	struct score sc;//
}PeopleInfo;

//成绩管理系统类型
class ScoreSystem
{
private:
	struct PeopleInfo * pdata;//存储数据的地址
	int sz;//当前有效信息个数
	int capacity;//容量
public:
	ScoreSystem();//构造函数
	~ScoreSystem();//析构函数
	//增容
	void CheckCapacity();
	//加载文件中的信息
	void LoadScoreSystem();
	//查找接口
	int FindEntry(char name[]);
	//添加一个学生信息
	void AddScoreSystem();
	//显示学生信息
	void ShowScoreSystem();
	//删除系统中一个信息
	void DelScoreSystem();
	//查找一个学生信息
	void SearchScoreSystem();
	//修改学生信息
	void ModifyScoreSystem();
	//保存信息到文件
	void SaveScoreSystem();
};



ScoreSystem::ScoreSystem()
{
	//开辟最初保存数据的空间
	pdata = (PeopleInfo*)malloc(DEFAULT_SZ*sizeof(PeopleInfo));
	sz = 0;
	capacity = DEFAULT_SZ;
	//加载文件中的信息
	LoadScoreSystem();
}

ScoreSystem::~ScoreSystem()
{
	//保存信息到文件
	SaveScoreSystem();
	//回收空间,以免内存泄漏
	free(pdata);
	pdata = NULL;
	sz = 0;
	capacity = 0;
}

void ScoreSystem::CheckCapacity()
{
	PeopleInfo* tmp = (PeopleInfo* )realloc(pdata, (capacity+DEFAULT_INC)*sizeof(PeopleInfo));
	if(tmp == NULL)
	{
		printf("扩容失败\n");
		return;
	}
	else
	{
		pdata = tmp;
		capacity+=DEFAULT_INC;
	}
}

void ScoreSystem::LoadScoreSystem()
{
	//此处打开文件时,得保证文件已经存储
	//所以刚刚开始要在工程的目录下创建:data.txt 的文件
	
	FILE* pfRead = fopen("data.txt", "r");
	//读数据
	PeopleInfo tmp;//
	while(fread(&tmp, sizeof(PeopleInfo), 1, pfRead))
	{
		//
		if(sz == capacity)
		{
			CheckCapacity();
		}
		pdata[sz] = tmp;
		sz++;
	}
	fclose(pfRead);
	pfRead = NULL;
}

void menu()
{
	printf("********************************\n");
	printf("***** 1. add      2. del  ******\n");
	printf("***** 3. search   4.modify******\n");
	printf("***** 5. show      6.save  ******\n");
	printf("***** 0. exit              ******\n");
	printf("********************************\n");
}


//查找实体
int ScoreSystem::FindEntry(char name[])
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		//字符串比较
		if(strcmp(pdata[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void ScoreSystem::AddScoreSystem()
{
	if(sz == capacity)
	{
		//扩容
		CheckCapacity();
	}
	//信息的录入
	printf("请输入名字:>");
	scanf("%s", pdata[sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pdata[sz].age));
	printf("请输入学号:>");
	scanf("%s", pdata[sz].id);
	printf("请输入成绩:>\n");
	printf("语文:");
	scanf("%d", &(pdata[sz].sc.chinese));
	printf("数学:");
	scanf("%d", &(pdata[sz].sc.math));
	printf("英语:");
	scanf("%d", &(pdata[sz].sc.english));
	pdata[sz].sc.total = pdata[sz].sc.chinese+pdata[sz].sc.math+pdata[sz].sc.english;
	pdata[sz].sc.avergage = pdata[sz].sc.total/3;

	sz++;
	printf("添加成功\n");
}
void ScoreSystem::ShowScoreSystem()
{
	int i = 0;
	printf("%8s\t%5s\t%5s\t%5s\t%5s\t%5s\t%5s\t%5s\n", 
		"学号", "名字", "年龄","语文","英语","数学", "平均", "总成绩");

	for(i=0; i<sz; i++)
	{
		printf("%8s\t%5s\t%5d\t%5d\t%5d\t%5d\t%5d\t%5d\n", 
			pdata[i].id,
			pdata[i].name,
			pdata[i].age,
			pdata[i].sc.chinese,
			pdata[i].sc.english,
			pdata[i].sc.math,
			pdata[i].sc.avergage,
			pdata[i].sc.total);
	}
}

void ScoreSystem::DelScoreSystem()
{
	char name[MAX_NAME];
	int pos = 0;
	int i = 0;
	if(sz == 0)
	{
		printf("没有可删除的信息\n");
		return;
	}
	printf("请输入要删除人的名字:");
	scanf("%s", name);
	//1.找到
	pos = FindEntry(name);
	if(-1 == pos)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2.删除
	for(i=pos; i<sz-1;i++)
	{
		pdata[i] = pdata[i+1];
	}
	sz--;
	printf("删除成功\n");
}

void ScoreSystem::SearchScoreSystem()
{
	char name[MAX_NAME];
	int pos = 0;
	printf("请输入要查找人名字:>");
	scanf("%s", name);
	pos = FindEntry(name);
	if(-1 == pos)
	{
		printf("要查找的人不存在\n");
	}
	else
	{
		printf("%8s\t%5s\t%5s\t%5s\t%5s\t%5s\n", 
			"学号", "名字", "年龄","语文","英语","数学");
		printf("%8s\t%5s\t%5d\t%5d\t%5d\t%5d\n", 
			pdata[pos].id,
			pdata[pos].name,
			pdata[pos].age,
			pdata[pos].sc.chinese,
			pdata[pos].sc.english,
			pdata[pos].sc.math);
	}
}

void ScoreSystem::ModifyScoreSystem()
{
	char name[MAX_NAME];
	int pos = 0;
	printf("请输入要修改人名字:>");
	scanf("%s", name);
	pos = FindEntry(name);
	if(-1 == pos)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("请输入名字:>");
		scanf("%s", pdata[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pdata[pos].age));
		printf("请输入学号:>");
		scanf("%s", pdata[pos].id);
		printf("请输入成绩:>\n");
		printf("语文:");
		scanf("%d", &(pdata[pos].sc.chinese));
		printf("数学:");
		scanf("%d", &(pdata[pos].sc.math));
		printf("英语:");
		scanf("%d", &(pdata[pos].sc.english));
	}
}

void ScoreSystem::SaveScoreSystem()
{
	int i = 0;
	FILE* pfWrite = fopen("data.txt", "w");
	//写数据
	for(i=0; i<sz; i++)
	{
		fwrite(&(pdata[i]), sizeof(PeopleInfo), 1, pfWrite);
	}
	fclose(pfWrite);
	pfWrite = NULL;
}

void test()
{
	int input = 0;
	ScoreSystem sc;//成绩管理系统	
	//初始成绩管理系统
	do 
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			sc.AddScoreSystem();
			break;
		case 2:
			sc.DelScoreSystem();
			break;
		case 3:
			sc.SearchScoreSystem();
			break;
		case 4:
			sc.ModifyScoreSystem();
			break;
		case 5:
			sc.ShowScoreSystem();
			break;
		case 6:
			sc.SaveScoreSystem();
			break;
		case 0:
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值