c++学生成绩管理系统

摘自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<iostream>
#include<string>
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<iostream>
#include<fstream>
#include<string>
#include<conio.h>   //_getch()
#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'<<p->getenglish()<<'\t'<<p->getchin()<<'\t' << p->getsum() <<'\t'<< p->getAverage() << endl;


}
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<iostream>
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;
}


  • 25
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实验题目1:班级学生学期成绩管理系统 (1)程序功能简介 灵活运用类的继承、对象成员等机制,设计一个能够实现班级学生学期成绩管理的程序。 (2)程序设计说明 ① 个人信息类CPerson的数据成员有姓名、性别、年龄、身份证号等数据成员,成员函数根据需要自行设计; ② 学生类CStudent从CPerson派生,并增加学号、CCourse对象成员数组(大小至少3个)等数据成员,并根据需要自行设计成员函数,包括能够求解所选修课程的总学分、显示某个学生基本信息和课程信息的成员函数; ③ 课程类CCourse包括课程名、学分、分数、任课老师等数据成员,成员函数根据需要自行设计; ④ 班级类CClass的数据成员有班级名称、班级人数、CStudent对象成员数组(大小由构造函数确定)等。本班级类CClass的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中用delete释放。在CClass类中设计包括能够求解最高成绩、最低成绩和平均成绩以及通过学号查找并输出某个学生全部信息(例如Seek())等功能在内的成员函数; ⑤ 构造三十个学生的数据,每个学生都有三门课程成绩,输出并显示这些数据; ⑥ 根据类的需要添加适当的其它成员,编写完整的程序并测试。 (3)程序调试运行 运行程序查看结果,并进行源代码调试和优化。
使用下面的数据,用C++设计一个简单的学籍管理系统,实现出最基本的功能。 学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成: 学号 姓名 性别 宿舍号码 电话号码 01 张成成 男 501 87732111 02 李成华 女 101 87723112 03 王成凤 女 101 87723112 04 张明明 男 502 87734333 05 陈东 男 501 87732111 06 李果 男 502 87734333 07 张园园 女 102 87756122 … …. .. … ……….. 学生成绩基本信息文件(B.TXT)及其内容: 学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分 01 A01 大学物理 3 66 78 82 02 B03 高等数学 4 78 -1 90 01 B03 高等数学 4 45 -1 88 02 C01 VF 3 65 76 66 … …. ………. .. .. … (一) 功能要求及说明: (1) 数据录入功能: 对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。 综合成绩的计算:如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩*30%+卷面成绩*70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*.15%+卷面成绩*70% . 实得学分的计算: 采用等级学分制. 综合成绩在90-100之间 ,应得学分=学分*100% 综合成绩在80-90之间 ,应得学分=学分*80% 综合成绩在70-80之间 ,应得学分=学分*75% 综合成绩在60-70之间 ,应得学分=学分*60% 综合成绩在60以下 ,应得学分=学分*0% (2)查询功能:分为学生基本情况查询和成绩查询两种 A:学生基本情况查询: A1----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。 A2---输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。 B:成绩查询: B1:输入一个学号时,查询出此生的所有课程情况,格式如下: 学 号:xx 姓 名:xxxxx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx … … … … ……… … … 共修:xx科,实得总学分为: xxx (3)删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。 (4 ) 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值