摘自http://blog.csdn.net/sdliujiangbo/article/details/7693269
学生成绩管理系统,主要包含两个类,一个是student (存储学生的相关信息,包括姓名,学号,成绩等),另一个是studentmassage(学生信息的存储,内容输出到文件中等)
1 采用链表实现数据的存储,方便添加数据(动态申请存储空间),排序(链表的排序),最终都是对链表的处理,例如查找、修改、显示等(student为studentmessage服务)
2 从文件中进行操作,包括读取文件中的数据,和将数据存储到文件中(sort.txt)
第一次写,欢迎大家指点,(运行时,如果成绩输入为字母,会出错)
代码:student.h
#ifndef STUDENT_H
#define STUDENT_H
#include
#include
class student
{
public:
student() :math(0),english(0),chinese(0){}
student(student &stu) //拷贝控制运算符
{
name = stu.name;
ID = stu.ID;
math = stu.math;
english = stu.english;
chinese = stu.chinese;
sum = stu.sum;
avergae = stu.avergae;
}
void input(); //执行输入操作
void ReadFile(std::istream &in); //从文件中读取数据
void show(); //输出一个学生的相关数据
std::string getname() //私有数据成员接口
{
return name;
}
std::string getId()
{
return ID;
}
int getmath()
{
return math;
}
int getenglish()
{
return english;
}
int getchin()
{
return chinese;
}
int getsum()
{
return sum;
}
int getAverage()
{
return avergae;
}
student *next; //公有数据成员
private:
std::string name;
std::string ID;
int math;
int english;
int chinese;
int sum;
int avergae;
};
#endif
2 student.cpp
#include "stdafx.h"
#include"student.h"
void student::input()
{
std::cout << "\t\t请输入学生姓名:";
std::cin >> name;
std::cout << "\t\t请输入学生学号:";
std::cin >> ID;
std::cout << "\t\t请输入学生数学成绩:";
std::cin >> math;
std::cout << "\t\t请输入学生英语姓名:";
std::cin >> english;
std::cout << "\t\t请输入学生语文姓名:";
std::cin >> chinese;
sum = math + english + chinese;
avergae = sum / 3;
}
void student::ReadFile(std::istream &in) //从文件中读取数据,在文件中只需要输入姓名 学号 和各科成绩,总分和平均成绩由系统计算得出
{
in >> name >> ID >> math >> english >> chinese>>sum>>avergae;
}
void student::show()//显示数据
{
std::cout << "姓名:" << name << std::endl;
std::cout << "学号:" << ID << std::endl;
std::cout << "数学成绩:" << math << std::endl;
std::cout << "语文成绩:" << chinese << std::endl;
std::cout << "英语成绩:" << english << std::endl;
std::cout << "总成绩:" << sum << std::endl;
std::cout << "平均分:" << avergae << std::endl << std::endl << std::endl;
}
3 studentmassage.h
#include"student.h"
#include
#include
#include
#include
#ifndef STUDENTMESSAGE_H //防止头文件重复使用
#define STUDENTMESSAGE_H
class StudentMassage
{
public:
StudentMassage(); //构造函数
~StudentMassage(); //析构函数
void ShowMenu(); //菜单界面,主要说明各个操作执行的序号
void find(); //在链表中进行查找
void Save(); //将输入的数据进行保存到文件中
void ModifyItem(); //修改链表中的某一项
void RemoveItem(); //删除链表中的某一项
void AddItem(); //在链表中添加一项
void Swap(student*, student*); //将链表中的两项进行交换,方便进行排序
void Sort(); //排序
int ListCount(); //链表个数的统计,方便对链表进行显示???
void Display(); //将所有学生的信息输出
private:
student *head, *end; //用链表实现数据的存储 head是头结点,指向第一个存储student end是尾结点,指向最后一个student,且end->next=nnullptr
std::ifstream in; //?
std::ofstream out; //?
student *FindItem(std::string name); //在链表中寻找姓名为name的学生,返回指向该学生的指针
student *FindID(std::string id); //在链表中寻找学号为id的学生,返回指向该学生的指针
};
#endif
4 studentmessage.cpp
#include "stdafx.h"
#include"studentmassage.h"
using namespace std;
student *StudentMassage::FindItem(string name) //end所指的student内容已经为空
{
for (student *p = head; p->next != end; p = p->next)
{
if (p->getname() == name) return p;
}
return nullptr;
}
student *StudentMassage::FindID(string id)
{
for (student *p = head; p->next != end; p = p->next)
{
if (p->getId() == id) return p;
}
return nullptr;
}
StudentMassage::StudentMassage()
{
head = new student; //
head->next = new student;
end = head->next;
in.open("sort.txt");
if (!in)
{
std::cout << "这是一个新系统,无学生信息,请输入!" << endl;
}
else
{
while (!in.eof())
{
end->ReadFile(in);
if (end->getname() == " ")
break;
end->next = new student;
end = end->next;
}
in.close();
cout << "读取学生信息成功!" << endl;
}
}
StudentMassage::~StudentMassage() //从前往后进行删除,最后删除head和end
{
Save();
for (student *temp; head->next != end;)
{
temp = head->next;
head->next = head->next->next;
delete temp;
}
delete head, end;
}
void StudentMassage::ShowMenu()
{
cout << "********************************************************************************" << endl;
cout << "〓〓〓〓〓〓〓〓〓〓 ☆ 学 生 成 绩 管 理 系 统 ☆ 〓〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓★★★★★ ★★★★★★★ ★★★★★〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 2.显示学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 3.排序统计成绩 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 4.查找学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 5.删除学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 6.修改学生信息 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "〓〓〓〓〓〓〓〓〓★ ☆ 0.安全退出系统 ☆ ★〓〓〓〓〓〓〓〓〓" << endl;
cout << "\n\t\t\n\t\t请选择:";
}
void StudentMassage::find()
{
student *p = nullptr;
cout << "\n\t\t***********************************************\n";
cout << "\t\t$ 1 按照学生姓名查找\n\t\t$ 2 按照学生学号查找";
cout << "\n\t\t***********************************************\n请选择";
int x;
string name, Id;
cin >> x;
switch (x)
{
case 1:
{
cout << "\t\t请输入查找学生的姓名:";
cin >> name;
if (p=FindItem(name))
{
p->show();
cout << "输入任意字符!继续————";
_getch();
}
else
{
cout << "\t\t没有找到该姓名的学生!\n" << endl;
cout << "输入任意字符!继续————";
_getch();
}
break;
}
case 2:
{
cout << "\t\t请输入要查找学生的学号:"; cin >> Id;
if (p=FindID(Id))
{
p->show();
cout << "输入任意字符!继续————";
_getch();
}
else
{
cout << "\t\t没有找到该学号的学生!\n" << endl;
cout << "输入任意字符!继续————";
_getch();
}
break;
}
}
}
void StudentMassage::ModifyItem()
{
string name;
student *p = nullptr;
cout << "\t\t请输入要修改人的姓名";
cin >> name;
if (p = FindItem(name))
{
cout << "\t\t已找到学生的信息,请输入新的信息!" << endl;
p->input();
cout << "修改成功!" << endl;
cout << "输入任意字符!继续————";
_getch();
}
else
{
cout << "\t\t没有找到!" << endl;
cout << "输入任意字符!继续————";
_getch();
}
}
void StudentMassage::RemoveItem()
{
string name;
cout << "\t\t请输入要删除学生的姓名:" << endl;
cin >> name;
student *p=nullptr,*temp=nullptr;
if (p = FindItem(name))
{
temp = p->next;
p->next = p->next->next;
delete temp;
cout << "\t\t删除成功!" << endl;
cout << "输入任意字符!继续————";
_getch();
}
else
{
cout << "\t\t没有找到!" << endl;
cout << "输入任意字符!继续————";
_getch();
}
}
void StudentMassage::Swap(student *p1, student *p2)
{
student *temp = new student;
temp = p1;
p1 = p2;
p2 = temp;
}
int StudentMassage::ListCount()
{
if (!head)
{
return 0; //没有数据存储在里面
}
else
{
int n = 0;
for (student *p = head->next; p != end; p = p->next)
{
n++;
}
return n;
}
}
void StudentMassage::Sort() //对当前链表进行排序
{
cout << "Sort...." << endl;
student *p = nullptr, *p1 = nullptr, *k = nullptr;
int n = StudentMassage::ListCount();
if (n < 2)
{
return;
}
for (p = head->next; p != end; p = p->next)
{
for (k = p->next; k != end; k = k->next)
{
if (p->getsum()>k->getsum())
{
StudentMassage::Swap(p, k);
}
}
}
cout << "排序完成!" << endl;
_getch();
return;
}
void StudentMassage::Save()
{
out.open("sort.txt");
for (student *p = head->next; p != end; p = p->next)
{
out << p->getname() << '\t' << p->getId() << '\t' << p->getmath()
<<'\t'<
}
out.close();
}
void StudentMassage::Display()
{
for (student *p = head->next; p != end; p = p->next)
p->show();
cout << "输入任意字符!继续————";
_getch();
}
void StudentMassage::AddItem()
{
end->input();
end->next = new student;
end = end->next;
cout << "添加成功!" << endl;
cout << "输入任意字符!继续————";
_getch();
}
5 main
// studentm.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"student.h"
#include"studentmassage.h"
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "\t\t 欢迎进入学生成绩管理系统 " << endl;
bool quit = false;
StudentMassage Grades;
while (!quit)
{
system("cls");
Grades.ShowMenu();
int x;
cin >> x;
switch (x)
{
case 0:quit = true; break;
case 1:Grades.AddItem(); break;
case 2:Grades.Display(); break;
case 3:Grades.Sort(); break;
case 4:Grades.find(); break;
case 5:Grades.RemoveItem(); break;
case 6:Grades.ModifyItem(); break;
}
}
return 0;
}