#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;
}
学生管理系统
最新推荐文章于 2024-08-16 21:55:01 发布