面对简易的学生成绩管理系统需要实现以下几个功能要求p:1、可以手动录入用户输入的学生成绩信息 2、可以实现对系统中某个特定项进行修改 3、可以对已经存在的学生信息进行查找 4、对录入的数据信息进行保存 5、可以对输入的数据进行删除清空 6、显示出保存好的信息
根据这些功能需求现在来进行具体实现:声明一个学生类和一个学生成绩派生类并在类外分别进行定义,包含学号、姓名、身份证号码,数学成绩、英语成绩、计算机成绩、各科总成绩,平均成绩及一些函数。由于系统要求所有的数据都需要存放在txt文件中,所以需要使用文件的输入输出流。此次系统是创建链表来存放学生信息,也使用到链表头指针和数据域指针来检索信息。自定义功能函数:void creat();//录入成绩;void Tshow();//输出此次录入数据;void del();//删除已存某个数据;void clean();//清空数据库;void rework();//修改数据库;void save();//保存学生信息进入文件;void find();//查找数据库中学生信息;void displist();//输出数据库;之后再创建一个简易的菜单对用户的操作进行提示,根据提示完成相应操作,使系统更具有操作性。此系统既可以从控制台进行信息处理,也可以在txt文件里进行对数据的添加。此次学习让我很好的学习到代码与文件的联系,并亲自写代码实践了,收获颇丰。
核心代码:int main()
{
root = new link;
root->next = nullptr;
cout << "**************************************" << endl;
cout << "* 欢迎使用学生成绩管理系统主菜单 *" << endl;
cout << "* (请按提示操作) *" << endl;
cout << "*1 录入成绩\t 2 修改已存信息*\n*3 保存信息\t 4 输出信息 *\n*5 删除信息\t 6 清空\t *\n*7 查询信息\t 8 输出数据库 *" << endl;
cout << "* 按其他键退出 *" << endl;
cout << "**************************************" << endl;
cout << " 选择1-8进行操作,你的选择是:";
int n;
cin >> n;
while (n > 0 && n < 9)
{
switch (n)
{
case 1:
creat(); break;//录入成绩
case 2:
rework(); break;//修改数据库
case 3:
save(); break; //保存学生信息进入文件
case 4:
Tshow(); break;//输出此次录入数据
case 5:
del(); break;//删除已存某个数据
case 6:
clean(); break;//清空数据库
case 7:
find(); break;//查找数据库中学生信息
case 8:
displist(); break;//输出数据库
default:break;
}
system("pause");
system("cls");
cout << "**************************************" << endl;
cout << "* 迎使用学生成绩管理系统主菜单 *" << endl;
cout << "* (请按提示操作) *" << endl;
cout << "*1 录入成绩\t 2 修改已存信息*\n*3 保存信息\t 4 输出信息 *\n*5 删除信息\t 6 清空\t *\n*7 查询信息\t 8 输出数据库 *" << endl;
cout << "* 按其他键退出 *" << endl;
cout << "**************************************" << endl;
cout << " 选择1-8进行操作,你的选择是:";
cin >> n;
}
cout << "*****************************************" << endl << endl;
cout << " 感谢使用学生成绩管理系统!!!" << endl << endl;
cout << "*****************************************" << endl;
return 0;
}
void creat()//录入成绩
{
link* s;
s = new link;
s->head.fcourse();//利用链表指针输入数据
ifstream in;//从硬盘到内存,in为输入流对象
in.open("学生成绩数据.txt", ios::in);//文件以输入方式打开,向文件中录入数据
if (!in.is_open())
{
cout << "打开文件失败!" << endl;
return;
}
string x, y, z;//专业,姓名,年级
double q, w, e,t,u;
in >> x >> y >> z >> q >> w >> e >>t>> u ;//从文件中读取数据传给程序
if (x == s->head.a)//x为学号,判断录入学号是否已经存在
{
cout << "************" << endl << endl;
cout << " 学号重复!" << endl;
cout << s->head.a << "录入失败!" << endl << endl;
cout << "************" << endl;
in.close();//关闭输入流对象
delete s;
return;
}
s->next = root;//连接root链表
root = s;//将s中录取的学生数据信息存入root链表中
cout << "************" << endl << endl;
cout << " 录入成功!" << endl << endl;
cout << "************" << endl;
}
void Tshow()//输出此次录入数据
{
cout << "***********************************************************************************************" << endl << endl;
cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机" << setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
link* p = root;//创建一个指针指向root链表
while (p->next != nullptr)//判断链表中的信息情况
{
p->head.show();//显示输出本次输出的学生信息
p = p->next;//指针依次往后移
}
cout << " 输出成功!" << endl << endl;
cout << "************************************************************************************************" << endl;
}
void clean()//清空数据
{
ofstream clear;//从内存到硬盘清空数据,clear为输出流对象
clear.open("学生成绩数据.txt", ios::trunc);//如果文件存在,把文件长度设为0
clear.close();
cout << "************" << endl << endl;
cout << " 清空成功!" << endl << endl;
cout << "************" << endl;
}
void rework()//修改数据
{
int p = 0;//判断标值
string b;//b为学号
cout << "********************" << endl << endl;
cout << " 请输入修改的学号:";
cin >> b;
ifstream in;//从硬盘到内存,in为输入流对象
in.open("学生成绩数据.txt", ios::in); // 文件以输入方式打开
if (!in.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
ofstream out;//从内存到硬盘,out输出流对象
out.open("学生成绩表.txt", ios::app);//以追加的方式打开文件,添加数据到文件尾部
if (!out.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
string x, y, z;//学号、姓名、身份证号
double q, w, e,t,u;
while (in >> x)
{
in >> y >> z >> q >> w >> e >> t >> u;//从文件把数据传给程序
if (b == x)//判断输入流对象数据中学号是否相等
{
int o = 0;
cout << "请选择需要修改的数据!" << endl;
cout << "1:修改数学 2:修改英语 3:修改计算机:" << endl;
cin >> o;
switch (o)
{
case 1:
cout << "请输入成绩:" << endl;
in >> q;
cin >> q ;
t = q + w + e;
u = t / 3.0;
p++;
out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
//从程序中把修改后的数据传给文件数据库
break;
case 2:
cout << "请输入成绩:" << endl;
in >> w;
cin>> w ;
t = q + w + e;
u = t / 3.0;
p++;//修改数据库
out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
//从程序中把修改后的数据传给文件数据库
break;
case 3:
cout << "请输入成绩:" << endl;
in >> e;
cin >> e ;
t = q + w + e;
u = t / 3.0;
p++;//执行后p变为1;
out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
//从程序中把修改后的数据传给文件数据库
break;
}
//out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
////从程序中把修改后的数据传给文件数据库
}
}
out.close();
in.close();
system("del 学生成绩数据.txt");
system("rename 学生成绩表.txt 学生成绩数据.txt");//改名
if (p == 0)
{
cout << " 查无此人!" << endl << endl;
cout << "********************" << endl;
}
else
{
cout << " 修改成功!" << endl << endl;
cout << "********************" << endl;
}
}
void save()//保存数据进入文件中
{
link* P = root;
while (P->next != nullptr)//判断链表中是否有数据
{
P->head.ishow();//将链表中数据存储到文件中
P = P->next;//指针后移
}
cout << "********************" << endl << endl;
cout << " 保存数据成功!" << endl << endl;
cout << "********************" << endl;
}
void find()//查找数据库中学生信息
{
string b;//输入学号
cout << "********************" << endl << endl;
cout << " 请输入查找的学号:";
cin >> b;
fstream ff("学生成绩数据.txt", ios::in);//ff为输入输出流文件对象,对ff进行输入操作
if (!ff)
{
cout << "打开文件失败!" << endl;
return;
}
string x, y, z;
double q, w, e,t, u;
ff >> x >> y >> z >> q >> w >> e >> t >> u;//将文件里的数据传给程序
while (x != b)//根据学号判断
{
if (!(ff >> x >> y >> z >> q >> w >> e >> t >> u))//判断是否存在该学号的成绩信息
{
cout << " 查无此人!" << endl << endl;
cout << "********************" << endl;
return;
}
}
ff.close();//关闭文件
cout << "学号:" << x << " 姓名:" << y << " 身份证号:" << z << " 数学:" << q << " 英语:" << w << " 计算机:" << e << " 总成绩:" << t << " 平均成绩:" << u << endl;
cout << " 输出成功!" << endl << endl;
cout << "********************" << endl;
}
void del()//删除已存某个数据
{
int p = 0;
string b;
cout << "********************" << endl << endl;
cout << " 请输入删除的学号:";
cin >> b;
ifstream in;//从硬盘到内存,输入流对象
in.open("学生成绩数据.txt", ios::in);
if (!in.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
ofstream out;//从内存到硬盘
out.open("学生成绩表.txt", ios::app);
if (!out.is_open())
{
cout << "文件打开失败!" << endl;
return;
}
string x, y, z;
double q, w, e, t, u;
while (in >> x)
{
in >> y >> z >> q >> w >> e >> t >> u;
if (b != x)
{
out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
}
if (b == x)
{
p++;
}
}
out.close();
in.close();
system("del 学生成绩数据.txt");
system("rename 学生成绩表.txt 学生成绩数据.txt");
if (p == 0)
{
cout << " 查无此人!" << endl << endl;
cout << "********************" << endl;
}
else
{
cout << " 删除成功!" << endl << endl;
cout << "********************" << endl;
}
}
void displist()//输出数据库
{
int p = 0;
string x, y, z;
double q, w, e, t, u;
cout << "*******************************************************************************************" << endl << endl;
cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机" << setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
ifstream in;//in为输入流对象
in.open("学生成绩数据.txt", ios::in);
if (!in.is_open())
{
cout << "打开文件失败!" << endl;
return;
}
while (in >> x)
{
p++;
in >> y >> z >> q >> w >> e >> t >> u;
cout << setw(10) << x << setw(6) << y << setw(20) << z << setw(8) << q << setw(8) << w << setw(8) << e << setw(8) << t << setw(8) << u << endl;
//控制数据的域宽
}
if (p == 0)
{
cout << " 无数据!" << endl << endl;
cout << "*******************************************************************************************" << endl;
}
else
{
cout << " 输出成功!" << endl << endl;
cout << "*******************************************************************************************" << endl;
}
}
|