学生成绩管理系统

  • 1.编译器
  • 2.系统功能需求分析
    • 2.1学生成绩管理系统需求分析
    • 2.2三个类功能需求分析
      • 2.2.1 Person类
      • 2.2.2 Student类
      • 2.2.3 Undergraduate类
  • 3.系统设计
    • 3.1学生成绩管理系统对四个类的设计
      • 3.1.1 BirthDate类
      • 3.1.2 Person类
      • 3.1.3 Student类
      • 3.1.4 Undergraduate类
  • 4.系统实现
    • 4.1四个类进一步完善
      • 4.1.1 BirthDate类
      • 4.1.2 Person类
      • 4.1.3 Studetn类
      • 4.1.4 Undergraduate类
  • 5.系统测试
    • 5.1学生成绩管理系统功能测试
      • 5.1.1输入
      • 5.1.2增加
      • 5.1.3删除
      • 5.1.4查找
      • 5.1.5修改
      • 5.1.6排序
      • 5.1.7挂科情况
      • 5.1.8显示学生成绩等信息
  • 6.结束语
  • 7.代码展示

1.编译器

Dev c++;

2.系统功能需求分析

2.1学生成绩管理系统需求分析

包含学生的基本信息:姓名,性别,生日。
学生的成绩信息:学号,五科成绩,五科课程的名字(不同专业学生有不同的课程),总分,专业,绩点等。
学生成绩管理系统具有以下这些功能:
(1)学生成绩的录入:录入新的学生成绩等信息;
(2)学生成绩的添加:添加新的学生成绩等信息;
(3)学生成绩的删除:删除不需要的学生成绩等信息。
(4)学生成绩的查找:查找你需要的学生成绩等信息。
(5)学生成绩的修改:修改错误的学生成绩等信息。
(6)学生成绩的排序:按学生的绩点排序,排序后结果写入文件。
(7)学生的挂科情况:统计学生成绩小于60的数目。
(8)学生成绩的显示:显示所有学生成绩等信息。
(9)学生成绩的保存:把学生成绩等信息保存到文件。


图 1 学生成绩管理系统框架

2.2三个类功能需求分析

2.2.1 Person类

如图 1所示:
Person类派生出Student类。
Person类中受保护的数据成员有:姓名,性别,生日包含年月日。生日这个成员函数是BirthDate类的对象。
Person类中公用的成员函数有:
(1)输入函数
(2)显示函数
(3)重载<<,>>的函数
(4)基本的构造函数,默认构造函数,析构函数。

2.2.2 Student类

Student类派生出Undergraduate类。
Student类的受保护的数据成员:学号,五门课程名,五门课的成绩,总成绩。静态数据成员N用来统计学生人数。
Student类的公用的成员函数:
(1)输入函数
输入学生成绩等信息,并写入student.dat文件。
(2)显示函数
从student.dat 文件中读,并打印到终端。
(3)重载<<,>>的函数
(4)构造函数,默认构造函数,和析构函数。

图 2 Student类框架

2.2.3 Undergraduate类

Undergraduate类的私有的数据成员:专业,绩点,静态数据成员N用来统计学生人数。
Undergraduate类的公用的成员函数:
(1)重载<<,>>的函数
(2)构造函数,默认构造函数,和析构函数。
(3)输入学生成绩等信息
输入学生成绩等信息并写入Undergraduate.dat文件。
(4)显示所有的学生成绩等信息
从Undergraduate.dat文件中读,并打印到终端。
(5)增加学生成绩等信息
增加学生成绩等信息并继续写入Undergraduate.dat文件,如果重复输入已存在的学生学号,需要重新输入学生的成绩等信息。
(6)删除学生成绩等信息
在已添加的学生中查找要删除学生的学号,如果输入学生的学号查找不到,需要重新输入要删除学生的学号,并在文件中删除该学生成绩等信息。
(7)查找学生成绩等信息
按学生的学号查找学生,如果输入学生的学号查找不到,需要重新输入要删除学生的学号。在已添加的学生中查找到学生,就打印学生成绩等信息到终端。
(8)修改学生成绩等信息
按学生的学号查找需要修改成绩等信息的学生,如果输入学生的学号查找不到,需要重新输入要删除学生的学号。在已添加的学生中查找到学生,就重新输入该学生的信息,打印修改前后学生成绩等信息到终端,并将修改后学生成绩等信息写入文件。
(9)判断重复学号
判断是否重复输入已存在的学号。
(10)学生成绩排序
从Undergraduate.dat文件中读,并计算学生总分,绩点,并按降序排序,将成绩单写入Undergraduate_score_list.dat文件,并打印到终端。
(11)判断挂科的情况
从Undergraduate.dat文件中读,统计学生五科成绩小于60的个数,并打印到终端。
(12)学生成绩管理系统的菜单
菜单有0~8种选项,选择不同的选项,分别实现上述不同的功能。

图 3 Undergraduate类框架

3.系统设计

3.1学生成绩管理系统对四个类的设计

3.1.1 BirthDate类

如图 4所示:
BirthDate类的数据成员:定义int类型的year,month,day.
BirthDate类的成员函数:
(1)默认构造函数。
(2)构造函数。
(3)重载运算符<<,>>
(4)change()函数,用来修改年月日。

图 4 BirthDate类

3.1.2 Person类

如图 5所示:
Person类的数据成员:定义string类型的姓名,性别。定义BirthDate类的对象birth。
Person类的成员函数:
(1)默认构造函数
(2)构造函数
(3)析构函数
(4)display()函数,将人的信息打印到终端。
(5)input()函数,输入人的信息。


图 5 Person类

3.1.3 Student类

如图 6所示:
Student类的数据成员:
定义string类型的id,course[5]用来存放五门课程的名字。
定义double类型的total,score[5]用来存放五门成绩。
定义int类型的静态数据成员N用来统计学生学生数量。
Student类的成员函数:
(1)默认构造函数
(2)构造函数,对直接基类Person类初始化。
(3)析构函数重载运算符>>,<<
(4)display()函数
从student.dat文件中读,并打印学生成绩等信息到终端。
(5)input()函数
输入学生成绩等信息并写入student.dat文件。


图 6 Student类

3.1.4 Undergraduate类

如图 7所示:
Undergraduate类的数据成员:
定义string类型的major
定义double 类型的gpa
定义int类型的静态数据成员N用来统计学生学生数量。


图 7 Undergraduate类

Undergraduate类成员函数:
(1)默认构造函数
(2)构造函数,对直接基类Student类初始化。
(3)析构函数
(4)重载运算符<<,>>
(5)display()函数
如图 8所示:
从Undergraduate.dat文件中读,并打印学生成绩等信息到终端。


图 8 显示函数设计思路

(6)input()函数
如图 9所示:
导入学生成绩等信息并写入Undergraduate.dat文件。

图 9 输入函数设计思路

(7)add()函数
如图 10所示:
增加学生成绩等信息并写入Undergraduate.dat 文件。调用unique()函数判断是否输入之前已导入Undergraduate.dat文件中学生的学号。如果重复输入学生的学号,需要重新输入学生成绩等信息。

图 10 增加函数设计思路

(8)remove()函数
如图 11所示:
删除学生成绩等信息并在Undergraduate.dat文件中删除该学生成绩等信息。如果从已导入Undergraduate.dat文件中未找到要删除学生的学号,需要重新输入要删除学生的学号。


图 11 删除函数设计思路

(9)search()友元函数
如图 12所示:
输入学生的学号查找学生,并在终端打印学生成绩等信息并输入挂科数,如果从已导入Undergraduate.dat文件中未找到要查找学生的学号,需要重新输入要查找学生的学号。

图 12 查找函数设计思路

(10)change()函数
如图 13所示:
输入学生的学号查找要修改的学生,如果找到该学生,就重新输入该学生信息。如果从已导入Undergraduate.dat文件中未找到要修改学生的学号,需要重新输入要修改学生的学号。将修改后学生成绩等信息写入Undergraduate.dat文件,并在终端打印修改前和修改后学生成绩等信息。

图 13 修改函数设计思路

(11)unique()函数
从Undergraduate.dat文件中读,并判断输入学号与文件中的学生的学号重复。
(12)sort1()友元函数
如图 14所示:
从Undergraduate.dat文件中读,计算总分,绩点,按降序冒泡排序,将排序后成绩单写入Undergraduate_score_list.dat文件,并打印到终端。

图 14 排序函数设计思路

(13)sling()友元函数
如图 15所示:
从Undergraduate.dat文件中读,统计文件中学生成绩小于60的数目,并打印到终端。

图 15 挂科函数设计思路

(14)menu()函数
如图 16所示:
有0~8种选项,分别实现上述的功能。

图 16 菜单

4.系统实现

4.1四个类进一步完善

4.1.1 BirthDate类

(1)BirthDate(),BirthDate类的默认构造函数。
(2)BirthDate(int,int,int);BirthDate类的构造函数。
(3)重载运算符<<,如图 17所示:可用于对BirthDate类的对象输出。

图 17 BirthDate类重载运算符<<

(4)重载运算符>>,如图 18所示:可用于对BirthDate类的对象输入。

图 18 BirthDate类重载运算符>>

(5)change(),用来修改年,月,日。

4.1.2 Person类

(1)Person(),Person类的默认构造函数。
(2)Person(string,string,int,int,int);BirthDate类的构造函数。
(3)~Person(),Person类的析构函数。
(4)display(),打印信息到终端。
(5)input(),输入信息。

4.1.3 Studetn类

(1)Student(),Student类的默认构造函数。
(2)Student(string,string,int,int,int,string,string,double,double),Student类的构造函数,对直接基类Person类和对自身数据成员初始化。
(3)~Student(),Student类的析构函数。
(4)重载运算符<<,如图 19所示:可用于对Student类的对象输出。

图 19 Student类重载运算符<<

(5)重载运算符>>,如图 20所示:可用于对Student类的对象输入。

图 20 Student类重载运算符>>

(6)display(),打印学生成绩等信息到终端。
(7)input(),输入学生成绩等信息。

4.1.4 Undergraduate类

(1)Undergraduate(),Undergraduate类的默认构造函数。
(2)Undergraduate(string,string,int,int,int,string,string,double,double,string,double) Undergraduate类的构造函数,对直接基类Student类和数据成员初始化。
(3)~Undergraduate(),Undergraduate类的析构函数。
(4)重载运算符<<,如图 21所示:可用于对Undergraduate类的对象输出。

图 21 Undergraduate类重载运算符<<

(5)重载运算符>>,如图 22所示:可用于对Undergraduate类的对象输出。

图 22 Undergraduate类重载运算符>>

(6)输入学生成绩等信息
代码实现的功能是输入学生成绩等信息,写入文件,统计学生数量。
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要导入学生人数。
步骤三:for循环,输入学生成绩成绩等信息,并写入文件,关闭文件。
具体代码如图 23所示:

图 23 输入函数

如图 24所示:就可以输入学生成绩等信息包含:学生的专业,姓名,性别,生日,学号,五科课程名和五科成绩。

图 24 输入函数运行结果

(7)增加学生成绩等信息
代码实现的功能是增加学生成绩等信息,判断是否输入重复学生学号,调用unique()实现。写入文件,增加学生数量。
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要增加学生人数。
步骤三:unique()判断是否输入重复学生学号,如果输入已存在学生学号,需要重新输入学生成绩等信息。
步骤四:将增加的学生,继续写入文件尾部。关闭文件,学生数量增加。
具体代码如图 25所示:

图 25 增加函数

如图 26所示:就可以增加学生成绩等信息包含:学生的专业,姓名,性别,生日,学号,五科课程名和五科成绩。

图 26 增加函数运行结果

(8)删除学生成绩等信息
代码实现的功能是按学生的学号删除学生成绩等信息,并在文件中删除该学生。
删除功能代码主要部分:
大体步骤如下:
步骤一:打开Undergraduate.dat文件。
步骤二:输入要删除学生的学号。如果找不到要删除学生学号,就重新输入学生学号。
步骤三:找到要删除学生的学号,记住在数组中的下标,往前移一位,覆盖要删除学生的信息。
步骤四:写入文件。学生数量减少。关闭文件。
如图 27所示:就可以输入要删除学生的学号。若未找到学号,需要重新输入学号。

图 27 删除函数运行结果

(9)查找学生成绩等信息
代码实现的功能是按学生的学号查找学生成绩等信息。统计挂科数,将要学生信息打印终端
大体步骤如下:
步骤一:输入要查找学生的学号。
步骤二:如果未找到该学生的学号,需要重新输入学生信息。
步骤三:找到学生的学号,统计挂科数,打印终端。
如图 28所示:就可以输入要查找学生学号,未找到要删除学生的学号,需要重新输入学生学号。

图 28 查找函数运行结果

(10)修改学生成绩等信息
代码实现的功能是输入要修改学生学号,重新输入该学生信息并将修改后的信息写入文件。
大体步骤如下:
步骤一:打开Undergraduate.dat文件,输入要修改学生的学号。
步骤二:未找到要修改学生学生学号,需要重新输入学号。
步骤三:找到要修改学生学号,重新输入学生信息。写入文件,打印终端。关闭文件。
如图 29所示:输入要修改学生学号,修改信息。

图 29 修改函数运行结果

(11)学生成绩排序
代码实现的功能是按学生基地排序,打印终端,写入Undergraduate_score_list.dat文件。
大体步骤如下:
步骤一:统计学生总分,计算绩点,排序
步骤二:打开文件,写入文件,打印终端,关闭文件。
如图 30所示:输入学生成绩等信息就可以看到排序后结果。(我事先未输入学生成绩,就看不到了。)

图 30 排序函数运行结果

(12)判断重复学号
如图 31所示:给定要输入学号,判断是否已存在。
具体代码如下:

图 31 判断重复学号

(13)学生挂科情况
代码实现功能是统计所有学生挂科情况,打印终端。
如图 32所示,具体代码如下:

图 32 学生挂科函数

(14)显示学生成绩等信息
如图 33所示:打印学生成绩等信息到终端。

图 33 显示函数

如图 34所示:显示学生成绩等信息。由于我事先未输入学生成绩等信息,就看得到学生成绩等信息。

图 34 显示函数运行结果

(15)学生成绩管理系统菜单
如图 35所示:根据不同选项,实现不同功能。

图 35 菜单运行结果

5.系统测试

5.1学生成绩管理系统功能测试

5.1.1输入

如图 36所示:
测试步骤大体如下:
步骤一:输入要导入学生人数。
步骤二:输入学生成绩等信息。依次输入学生专业,姓名,学号,(生日)年,月,日,学号,课程1,成绩1,课程2,成绩2,课程3,成绩3,课程4,成绩4,课程5,成绩5。

图 36 输入功能测试结果

5.1.2增加

如图 37所示:
测试步骤大体如下:
步骤一:输入要增加学生人数。
步骤二:如果输入学生的学号已存在,需要重新输入学生成绩等信息。
步骤三:输入学生成绩等信息。依次输入学生专业,姓名,学号,(生日)年,月,日,学号,课程1,成绩1,课程2,成绩2,课程3,成绩3,课程4,成绩4,课程5,成绩5。

图 37 增加功能测试结果

如图 38所示:将学生成绩等信息写入Undergraduate.dat文件。

图 38 Undergraduate.dat文件

5.1.3删除

如图 39所示:
测试删除功能的大体步骤:
步骤一:输入要删除学生的学号。
步骤二:未找到要删除学生的学号,重新输入学号,直到找到学号为止。(因此测试删除功能之前需要先输入学生成绩等信息。)
步骤三:找到要删除学生的学号,打印删除前后学生信息。(更直观)

图 39 删除功能测试结果
如图 40所示:删除学生成绩等信息后在文件中更改。

图 40 修改后Undergraduate.dat文件

5.1.4查找

如图 41所示:
测试查找功能的大体步骤:
步骤一:输入要查找学生的学号。
步骤二:未找到要查找学生的学号,重新输入学号,直到找到学号为止。(因此测试查找功能之前需要先输入学生成绩等信息。)
步骤三:找到要查找学生的学号,打印要查找的学生成绩等信息。

图 41 查找功能测试结果

5.1.5修改

如图 42所示:
测试修改功能大体步骤:
步骤一:输入要修改学生的学号。
步骤二;未找到要修改学生的学号,重新输入学号,直到找到学号为止。(因此测试修改功能之前需要先输入学生成绩等信息。)
步骤三:找到要修改学生的学号,重新输入学生成绩等信息。打印修改前后学生成绩等信息。(更直观)

图 42 修改功能测试结果

5.1.6排序

如图 43所示:
测试排序功能大体步骤:
步骤一:测试该功能之前需要输入学生成绩等信息。

图 43 排序功能测试结果

如图 44所示:将排序后学生成绩单写入Undergraduate_score_list.dat文件。

图 44 Undergraduate_score_list.dat文件

5.1.7挂科情况

如图 45所示:
测试挂科情况功能大体步骤:
步骤一:测试该功能之前需要输入学生成绩等信息。

图 45 挂科情况功能测试结果

5.1.8显示学生成绩等信息

如图 46所示:
测试该功能之前需要输入学生成绩等信息。

图 46 显示功能测试情况

6.结束语

我设计的学生成绩管理系统的缺点,缺点很多,由于能力有限,只是实现了简单的几个功能,设计的学生成绩管理系统很脆弱,很容易就崩了。
优点:能够对输入成绩按绩点排序,统计挂科数,对输入错误的生日,成绩进行异常处理。
缺点一:没有动态的开辟空间,对指针不熟,没有用链表增删学生信息,就定义80大小对象数组存放学生成绩等信息。
缺点二:每次使用都需要先输入学生成绩等信息。等到下一次使用时,上一次输入学生的成绩就没了。
缺点三:需要依次输入学生专业,姓名,性别,年,月,日,学号,课程1,成绩1…该输入int,输入string。多输入或少输入信息。系统都可能会崩。

缺点很多,这些问题仍需继续解决。
通过课程设计,发现了自己在知识上还存在很多问题。学到了不少东西,这个学生成绩管理系统不能很好体现继承和多态性。虽然用到了继承,但用的并不好。我觉得课程设计考察对知识的综合运用,用到了学过的很多知识,通过这次机会,找到自己的知识漏洞,查课本,查资料,收获很多。

7.代码展示

#include<iostream>
#include<fstream>
using namespace std;
class BirthDate{public:int year;//年 int month;//月 int day;//日 BirthDate();BirthDate(int y,int m,int d):year(y),month(m),day(d){}friend istream& operator>>(istream &in,BirthDate &b);friend ostream& operator<<(ostream &out,BirthDate &b);void change(int,int,int);//修改
};
class Person
{protected:string name;//姓名 string sex;//性别 BirthDate birth;//生日 public:Person();Person(string n,string s,int y,int m,int d):birth(y,m,d),name(n),sex(s){}~Person();virtual void display();//输出 void input();//输入
};
class Student:public Person//学生类
{ protected:string id;//学号 string course[5];//五门课名double score[5];//五门成绩 double total;//总分static int N;//统计学生数量 public:Student();Student(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t);~Student();friend istream& operator>>(istream &in,Student &s);friend ostream& operator<<(ostream &out,Student &s);void display();//打印终端 void input(Student*);//输入并写入文件
};
class Undergraduate:public Student//大学生类
{private:string major;//专业名 double gpa;//绩点 static int N;//统计学生数量 public:Undergraduate();Undergraduate(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t,string major):Student(n,s,y,m,d,i,course,score,t),major(major){gpa=0;}~Undergraduate();friend istream& operator>>(istream &in,Undergraduate &s);friend ostream& operator<<(ostream &out,Undergraduate &s);void display(); //显示 void input(Undergraduate*);//导入学生成绩等信息 void add(Undergraduate*);//增加 void remove(Undergraduate*);//删除 friend void search(Undergraduate*);//查找 void change(Undergraduate*);//修改 bool unique(const Undergraduate*,const string);//判断重复学号 friend void sort1(const Undergraduate *s);//排名 friend void sling(const Undergraduate*);//挂科 void menu(Undergraduate*); //目录
};
//BirthDate类
BirthDate::BirthDate()
{year=2000;month=1;day=1;
}
istream& operator>>(istream &in,BirthDate &b)
{in>>b.year>>b.month>>b.day;return in;
}
ostream& operator<<(ostream &out,BirthDate &b)
{out<<b.year<<" "<<b.month<<" "<<b.day;return out;
}
void BirthDate::change(int y,int m,int d)//修改
{year=y;month=m;day=d;
}
//Person类
Person::Person()
{name='0';sex='0';
}
Person::~Person()
{
}
void Person::display()//输出
{cout<<name<<" "<<sex<<" ";cout<<birth<<" ";
}
void Person::input()//输入
{cin>>name>>sex;cin>>birth;
}
//Student类
int Student::N=0;
Student::Student()
{id='0';for(int i=0;i<5;i++){course[i]='0';score[i]=0;}total=0;
}
Student::Student(string n,string s,int y,int m,int d,string i,string c[5],double sc[5],double t):Person(n,s,y,m,d),id(i),total(t)
{for(int i=0;i<5;i++){course[i]=c[i];score[i]=sc[i];}
}
Student::~Student()
{}
istream& operator>>(istream &in,Student &s)
{in>>s.name>>s.sex>>s.birth;in>>s.id;in>>s.course[0]>>s.course[1]>>s.course[2]>>s.course[3]>>s.course[4];in>>s.score[0]>>s.score[1]>>s.score[2]>>s.score[3]>>s.score[4];return in;
}
ostream& operator<<(ostream &out,Student &s)
{out<<s.name<<" "<<s.sex<<" "<<s.birth<<" ";out<<s.id<<" "<<s.course[0]<<" "<<s.score[0]<<" ";out<<s.course[1]<<" "<<s.score[1]<<" "<<s.course[2]<<" "<<s.score[0]<<" ";out<<s.course[3]<<" "<<s.score[3]<<" "<<s.course[4]<<" "<<s.score[4];return out;
}void Student::display()
{Student s[N];cout<<"姓名  性别  出生日期  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; ifstream infile("student.dat");if(!infile){cout<<"open error!"<<endl;}for(int i=0;i<N;i++){infile>>s[i];cout<<s[i]<<endl;}infile.close();
}
void Student::input(Student *s)
{int n;ofstream outfile("student.dat");if(!outfile){cout<<"open error!"<<endl;}cout<<"请输入导入学生人数:"<<endl;cin>>n;N=n;cout<<"请输入学生信息"<<endl; cout<<"姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; for(int i=0;i<n;i++){cin>>s[i];outfile<<s[i]<<endl;}outfile.close();
}//Undergradu类
int Undergraduate::N=0;
Undergraduate::Undergraduate()
{major='0';gpa=0;
}
Undergraduate::~Undergraduate()
{}
istream& operator>>(istream &in,Undergraduate &s)
{in>>s.major;in>>s.name>>s.sex>>s.birth; in>>s.id>>s.course[0]>>s.score[0];in>>s.course[1]>>s.score[1]>>s.course[2]>>s.score[2];in>>s.course[3]>>s.score[3]>>s.course[4]>>s.score[4];return in;
}
ostream& operator<<(ostream &out,Undergraduate &s)
{ out<<s.major<<" ";out<<s.name<<" "<<s.sex<<" "<<s.birth<<" "; out<<s.id<<" "<<s.course[0]<<"\t"<<s.score[0]<<"\t";out<<s.course[1]<<"\t"<<s.score[1]<<"\t"<<s.course[2]<<"\t"<<s.score[2]<<"\t";out<<s.course[3]<<"\t"<<s.score[3]<<"\t"<<s.course[4]<<"\t"<<s.score[4];return out;
} void Undergraduate::display()
{Undergraduate s[N];cout<<"专业  姓名  性别  出生日期  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; ifstream infile("Undergraduate.dat");//打开文件 if(!infile){cout<<"open error!"<<endl;}for(int i=0;i<N;i++){infile>>s[i];//写入文件 cout<<s[i]<<endl;//打印终端 }infile.close();//关闭终端
}
void Undergraduate::input(Undergraduate *s)//输入
{int n;ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile){cout<<"open error!"<<endl;}cout<<"请输入导入学生人数:"<<endl;cin>>n;if(n<0){cout<<"输入错误"<<endl;} s[0].N=n;//统计学生人数 cout<<"请输入学生成绩等信息"<<endl; cout<<"专业  姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5   score5"<<endl; try{for(int i=0;i<n;i++){cin>>s[i];//输入学生信息 if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100){int a;throw a;}if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31){BirthDate birth;throw birth;} outfile<<s[i]<<endl;//写入文件 }outfile.close();//关闭文件 }catch(int){cout<<"输入的成绩非法"<<endl;}catch(BirthDate){ cout<<"输入出生日期非法"<<endl; }
}
void Undergraduate::add(Undergraduate *s)//增加
{int n; cout<<"请输入要添加的人数"<<endl;cin>>n;cout<<"专业  姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; ofstream outfile("Undergraduate.dat",ios::app);//打开文件 if(!outfile){cout<<"open error!"<<endl;}try{for(int i=N;i<N+n;i++){cin>>s[i];//输入学生信息 if(Undergraduate::unique(s,s[i].id))//判断是否输入重复学号 {cout<<"请重新输入学生成绩等信息:"<<endl;cin>>s[i]; }if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100){int a;throw a;}if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31){BirthDate birth;throw birth;} outfile<<s[i]<<endl;//将学生信息写入文件 }outfile.close();//关闭文件 N+=n;//增加学生人数 }catch(int){cout<<"输入的成绩非法"<<endl;}catch(BirthDate){ cout<<"输入出生日期非法"<<endl; }
}
void Undergraduate::remove(Undergraduate *s)//删除
{int n;string id; bool flag=false;cout<<"请输入要删除学生信息的学号:"<<endl;while(!flag) {cin>>id;for(int i=0;i<N;i++){if(s[i].id==id)//判断是否找到要删除学生学号 {   flag=true;cout<<"学生成绩等信息:"<<endl; for(int k=0;k<N;k++) //打印到终端 {cout<<s[k]<<endl;}for(int j=i;j<N-1;j++)//往前移1为,覆盖该学生信息 s[j]=s[j+1];cout<<"删除成功!"<<endl; N=N-1;//减少学生人数 break;}} if(!flag){cout<<"未找到该学生信息,请重新输入"<<endl; }
}ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile){cout<<"open error!"<<endl;}cout<<"删除后学生信息表:"<<endl; for(int i=0;i<N;i++){outfile<<s[i]<<endl;//写入文件 cout<<s[i]<<endl;//打印终端}outfile.close(); //关闭文件
}
void search(Undergraduate *s)//查找
{string id; bool flag=false;int i,j,count=0;int num[5]={-1};int N=s[0].N;cout<<"请输入要查找学生信息的学号:"<<endl;while(!flag){cin>>id;for(i=0;i<N;i++){if(s[i].id==id)//判断是否查找到该学生信息 {flag=true;cout<<"该学生信息:"<<endl;cout<<s[i];  for(j=0;j<5;j++){if(s[i].score[j]<60){count++;//统计挂科数 }}cout<<"\t有"<<count<<"门课挂科"<<endl;break;}} if(!flag){cout<<"未找到该学生信息,请重新输入学号"<<endl;}}
}
void Undergraduate::change(Undergraduate *s)//修改
{string id; bool flag=false;cout<<"请输入要修改学生信息的学号:"<<endl;while(!flag){cin>>id; for(int i=0;i<N;i++){if(s[i].id==id)//判断是否找到要修改的学生  {flag=true;cout<<"学生成绩信息表:"<<endl;for(int k=0;k<N;k++) {cout<<s[k]<<endl; //打印修改前学生的信息 }cout<<"请重新输入该学生信息:"<<endl;cin>>s[i];   break;}} if(!flag){cout<<"未找到该学生信息,请重新输入学号:"<<endl; }}ofstream outfile("Undergraduate.dat");//打开文件 if(!outfile){cout<<"open error!"<<endl;}cout<<"修改后学生成绩信息表:"<<endl; for(int i=0;i<N;i++){outfile<<s[i]<<endl;//将修改后学生信息写入文件 cout<<s[i]<<endl;//将修改后信息打印终端 }outfile.close(); //关闭文件
}
bool Undergraduate::unique(const Undergraduate *s,const string id)//判断重复学号
{for(int i=0;i<N;i++){if(s[i].id==id){cout<<s[i].id<<"已存在,请勿输入重复学号的学生信息!"<<endl;return true;}}return false;
}
void sort1(const Undergraduate *s)//按学生绩点排序
{int i,j,k;int N=s[0].N;Undergraduate temp,stu[N];ifstream infile("Undergraduate.dat");if(!infile){cout<<"open error!"<<endl;}for(i=0;i<N;i++)//从文件读 infile>>stu[i];infile.close(); for(i=0;i<N;i++)//求总分 {stu[i].total=0;for(j=0;j<5;j++){stu[i].total+=stu[i].score[j];}stu[i].gpa=(stu[i].total/50.0)-5;//求绩点 }for(i=0;i<N-1;i++)//按学生绩点冒泡排序 从高到低打印到终端 {for(j=0;j<N-1-i;j++){if(stu[j].gpa<stu[j+1].gpa) {temp.name=stu[j].name;temp.sex=stu[j].sex;temp.birth=stu[j].birth;temp.id=stu[j].id;temp.name=stu[j].name;temp.total=stu[j].total;temp.gpa=stu[j].gpa;for(k=0;k<5;k++){temp.course[k]=stu[j].course[k];temp.score[k]=stu[j].score[k];}stu[j].name=stu[j+1].name;stu[j].sex=stu[j+1].sex;stu[j].birth=stu[j+1].birth;stu[j].id=stu[j+1].id;stu[j].name=stu[j+1].name;stu[j].total=stu[j+1].total;stu[j].gpa=stu[j+1].gpa;for(k=0;k<5;k++){stu[j].course[k]=stu[j+1].course[k];stu[j].score[k]=stu[j+1].score[k];}stu[j+1].name=temp.name;stu[j+1].sex=temp.sex;stu[j+1].birth=temp.birth;stu[j+1].id=temp.id;stu[j+1].name=temp.name;stu[j+1].total=temp.total;stu[j+1].gpa=temp.gpa;for(k=0;k<5;k++){stu[j+1].course[k]=temp.course[k];stu[j+1].score[k]=temp.score[k];}}}}ofstream outfile("Undergraduate_score_list.dat");//打开文件   cout<<"姓名 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5\t绩点"<<endl; for(i=0;i<N;i++) {outfile<<stu[i].name<<" "<<stu[i].id<<" ";//写入文件 cout<<stu[i].name<<" "<<stu[i].id<<" ";//打印终端 for(j=0;j<5;j++){outfile<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t";cout<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t";}outfile<<stu[i].gpa<<endl; cout<<stu[i].gpa<<endl;}outfile.close(); //关闭文件
}
void sling(const Undergraduate *s)//学生挂科情况
{int N=s[0].N;int i,j,count=0;Undergraduate stu[N];ifstream infile("Undergraduate.dat");//打开文件 if(!infile){cout<<"open error!"<<endl;}for(i=0;i<N;i++)//从文件读 infile>>stu[i];infile.close(); //关闭文件 for(i=0;i<N;i++){count=0;for(j=0;j<5;j++){if(stu[i].score[j]<60){count++;//统计挂科数 }}cout<<stu[i]<<"\t"<<"有"<<count<<"门课挂科"<<endl; //打印学生成绩等信息和挂科的情况 }
}
void Undergraduate::menu(Undergraduate *s)//学生成绩管理系统菜单
{Undergraduate STU;while(1){  system("color b1");cout<<"*===============================================================================================*"<<endl;cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&欢迎使用学生成绩管理系统&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**"<<endl;cout<<"**                                    ①输入学生信息                                           **"<<endl;cout<<"**                                    ②增加学生信息                                           **"<<endl;cout<<"**                                    ③删除学生信息                                           **"<<endl;cout<<"**                                    ④查找学生信息                                           **"<<endl;cout<<"**                                    ⑤修改学生信息                                           **"<<endl;cout<<"**                                    ⑥学生成绩排序                                           **"<<endl;cout<<"**                                    ⑦学生挂科情况                                           **"<<endl;cout<<"**                                    ⑧显示学生信息                                           **"<<endl;cout<<"**                                    〇   退出                                                **"<<endl;cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**" <<endl;cout<<"*===============================================================================================*"<<endl;cout<<"请输入您要选择的服务种类:( 0 ~ 8)"<<endl; int num;cin>>num;switch(num){case 1 :system("CLS");STU.input(s);system("pause");break;   case 2 :system("CLS");STU.add(s);system("pause");break;case 3 :system("CLS");STU.remove(s);system("pause");break;case 4 :system("CLS");search(s);system("pause");break;case 5 :system("CLS");STU.change(s);system("pause");break;case 6 :system("CLS");sort1(s);system("pause");break;case 7 :system("CLS");sling(s);system("pause");break;case 8 :system("CLS");STU.display();system("pause");break;case 0 :system("CLS");cout<<"谢谢使用!";exit(0);system("pause");default:system("CLS");printf("无效输入!\n\n");system("pause");}}
}
int main()
{Undergraduate undergraduate;Undergraduate stu[80]; undergraduate.menu(stu); return 0;
}

`4.结束语
我设计的学生成绩管理系统的缺点,缺点很多,由于能力有限,只是实现了简单的几个功能,设计的学生成绩管理系统很脆弱,很容易就崩了。
优点:能够对输入成绩按绩点排序,统计挂科数,对输入错误的生日,成绩进行异常处理。
缺点一:没有动态的开辟空间,对指针不熟,没有用链表增删学生信息,就定义80大小对象数组存放学生成绩等信息。
缺点二:每次使用都需要先输入学生成绩等信息。等到下一次使用时,上一次输入学生的成绩就没了。
缺点三:需要依次输入学生专业,姓名,性别,年,月,日,学号,课程1,成绩1…该输入int,输入string。多输入或少输入信息。系统都可能会崩。

缺点很多,这些问题仍需继续解决。
通过课程设计,发现了自己在知识上还存在很多问题。学到了不少东西,这个学生成绩管理系统不能很好体现继承和多态性。虽然用到了继承,但用的并不好。我觉得课程设计考察对知识的综合运用,用到了学过的很多知识,通过这次机会,找到自己的知识漏洞,查课本,查资料,收获很多。

C++课程设计 学生成绩管理系统相关推荐

  1. MFC课程设计 --学生成绩管理系统

    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论. 实验目的 使用MFC类库编制应用程 ...

  2. c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统

    <c语言课程设计学生成绩管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计学生成绩管理系统(31页珍藏版)>请在人人文库网上搜索. 1.河南理工大学计算机科学与技术学院 ...

  3. C语言成绩统计源代码,C语言课程设计学生成绩管理系统+源码

    <C语言课程设计学生成绩管理系统+源码>由会员分享,可在线阅读,更多相关<C语言课程设计学生成绩管理系统+源码(25页珍藏版)>请在人人文库网上搜索. 1.简易教学管理系统的设 ...

  4. C语言学生成绩管理设计总结,C语言课程设计学生成绩管理系统个人总结

    C语言课程设计学生成绩管理系统个人总结 C语言课程设计--学生成绩管理系统 个人心得体会 (徐州工程学院 14计嵌1班 07组 张凯) 这一周以来的课程设计,不仅让我明白了C语言的确是一门很有用的,但 ...

  5. 课程设计——学生成绩管理系统 C语言

    课程设计--学生成绩管理系统 基本要求: 1.程序功能 编程实现一个基础的成绩管理系统. 2.设计目的 通过本程序综合掌握结构体类型.指针.函数.文件等知识的综合使用. 3.功能要求(可扩充功能) ( ...

  6. 学生成绩统计c语言课程设计,学生成绩管理系统-C语言课程设计

    记一次课程设计作业 学生成绩管理系统#include #include #include #include /* 学生成绩管理系统介绍 2017C语言课程设计  202160936 1.支持将数据保存 ...

  7. c语言学生成绩管理系统课设作业,C语言课程设计——学生成绩管理系统

    摘 要 学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段.但一直以来人们使用传统人工的方式 ...

  8. 大一上学期C++课程设计——学生成绩管理系统(QT项目)

    这里是一个大一的萌新!仅做学习分享 工程文件在评论区置顶!! 近期整理了一下大一上学期的课程设计报告作为学习总结,使用的软件是Qt Creator,主界面效果如下图 ----------以下为课程设计 ...

  9. C语言课程设计——学生成绩管理系统(详细报告)

    欢迎来到<IT_WEH_coder>的博客.我是小魏,一名普通的在校大学生.希望大家多多关照,我们一起成长一起进步,也希望大家多多支持我鸭,喜欢我就给我一个关注吧! 本课程设计的编程部分所 ...

  10. java web期末课程设计 学生成绩管理系统(mysql,jstl+el,Javabean)+增删改查,session域+servlet(基础易理解)

    学生成绩管理系统 一.实验目的 为了更好的学习理解JavaWeb,创建了此系统.此系统可以帮助学习Java web基础,特别是javaweb入门,此系统使用大部分Java web基础知识.Java w ...

最新文章

  1. 「SAP技术」SAP MM 采购信息记录新价格不能体现在采购订单新的ITEM上?
  2. Using-更精彩更有用的做法-短签名
  3. JS数组去重之利用set数据结构去重
  4. OpenCASCADE绘制测试线束:数据交换命令之XDE 图层命令
  5. 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
  6. 做题不如巧做题,初中数学题型解题技巧都在这!
  7. 阿里AI界的新伙伴,1秒钟自动生成20000条文案
  8. 关于PHP代码的开始和结束标签书写,关于PHP结束标签?gt;的使用细节
  9. ESP8266-01/01S配对阿里云生活物联网教程(超详细)
  10. html5实现手写签名板,用于电子文档签名
  11. Netch + Connectify 实现代理转全局并共享给其他设备,例如Kindle
  12. 成都学计算机的大学有哪些专业学校,成都市计算机类专业开设的院校有哪些
  13. OpenLdap-如何使用phpLdapAdmin创建CN用户、OU用户组
  14. 信息搜集工具:Maltego
  15. java 键盘 映射 控制游戏_如何运用JAVA程序设计进行键盘控制游戏
  16. 2.数据分析-面板数据变系数模型
  17. PMP学习考试感悟之——坚持、努力是唯一法宝
  18. 微服务出现Shutting down DiscoveryClient问题
  19. python在excel应用实例视频-超简单:用Python让Excel飞起
  20. HTML5期末大作业:动物网站设计——宠物狗(10页) HTML+CSS+JavaScript 大学生静态网页设计 dw宠物网页设计 狗狗网页设计html web课程设计网页规划与设计...

热门文章

  1. 【转帖】华为芯片20年
  2. 从转行领先业内,到创业入选万人计划:上海交大博士的开挂科研路
  3. 【Nginx 之一】Nginx初体验(反向代理、负载均衡、动静分离)
  4. c语言程序设计编写钻石图形,C++简单输出钻石菱形图效果
  5. #c语言判断输入的合法性
  6. Glossary - 术语对照表 10
  7. 【关于JS注释和它们的快捷键】
  8. java保留小数点后面两位(四舍五入)
  9. 机器学习05:SVM支持向量机的学习和应用SVM解决猫狗图像分类问题
  10. 分享130 余个令你眼前一亮的网站,总有一个让你钟意