zoukankan      html  css  js  c++  java
  • 【数据结构实习】学生信息管理系统2.0

    Student.h

     1 #include<iostream>
     2 #include<string>
     3 #include<fstream>
     4 using namespace std;
     5 const int MAXSIZE = 5;//最大班级数目
     6 /*
     7 学生结点,即每个学生的信息
     8 */
     9 struct Stu_Node {
    10     string name;//学生姓名
    11     int sex;//性别
    12     int age;//年龄
    13     string stu_number;//学号
    14     double *stu_grade;//科目成绩
    15     double stu_average;//平均分
    16     int stu_rank;//成绩排名
    17     Stu_Node *next;
    18 };
    19 /*
    20 Class_Node结点即为班级,负责记录班级姓名以及每一个班级的链表的首地址
    21 其中,科目为每一个班的通用信息
    22 */
    23 struct Class_Node {
    24     string *stu_lesson;//科目
    25     int lesson_number;//科目数量
    26     string class_name;//班级名称
    27     Stu_Node *address;//首地址
    28     int stu_total;//该班级学生人数
    29 };
    30 
    31 class STUDENT {
    32 private:
    33     Class_Node *data;
    34     int class_number;//班级个数
    35     //初始化班级,形参列表为:班级名称,课程数,课程名称
    36     void init_class(string class_name[]);//初始化班级
    37     void init_grade(int location);
    38     int search_className(string name);//返回班级地址下标,-1代表未找到
    39     //添加学生信息,形参列表为:班级地址,学生数目
    40     void add_stu(int location, int number, string name);
    41     Stu_Node* search_stuName(string name, int location);//未找到返回空
    42     void delete_stu(Stu_Node *&p, Stu_Node *&head);
    43     void print(int loc);//打印学生信息
    44     void average_grade(int loc);
    45     void sort_select(int loc);
    46     void exchange(Stu_Node *&p, Stu_Node *&q, int loc);
    47     void print_grade(int loc);
    48     bool grade_premisson(int loc);
    49     void add_class(string name);//一次只能增加一个班级
    50     void print_stu(Stu_Node *p);
    51     void save_data(int mode);
    52     bool save_premisson();
    53 public:
    54     STUDENT(int class_number);//构造函数
    55     STUDENT(bool flag,bool &result);//存档的构造函数
    56     void deleteStu();//删除学生
    57     void initSystem();//初始化系统
    58     void addStu();//添加学生
    59     void Print();//打印信息
    60     void averageStu();//求平均成绩
    61     void sortStu();//排序
    62     void initGrade();//录入成绩
    63     void printGrade();//打印学生成绩
    64     void addClass();//添加班级
    65     void searchStu();//查找学生
    66     void saveData(int mode);
    67 };

    Student.cpp

      1 #include "Student.h"
      2 void STUDENT::print_stu(Stu_Node *p)
      3 {
      4     if (p == NULL)
      5     {
      6         cout << "未找到该学生!" << endl;
      7     }
      8     else
      9     {
     10         cout << "姓名: " << p->name << " 学号:" << p->stu_number;
     11         cout << " 性别:";
     12         if (p->sex)
     13             cout << "";
     14         else
     15             cout << "";
     16         if (p->stu_average > 0)
     17         {
     18             cout << " 平均分:" << p->stu_average << " 排名:" << p->stu_rank << endl;
     19         }
     20     }
     21 }
     22 
     23 void STUDENT::save_data(int mode)
     24 {
     25     //存储操作,将用户录入的数据存入本地
     26     fstream ofile;
     27     if (mode == 1)
     28         ofile.open("userDataBase.txt", ios::out);
     29     else
     30         ofile.open("EXdataBase.txt", ios::out);
     31     if (ofile.fail())
     32     {
     33         cout << "打开文件失败!" << endl;
     34         return;
     35     }
     36     ofile << class_number << endl;//写入班级个数
     37     for (int i = 0; i < class_number; i++)
     38     {
     39         ofile << data[i].class_name << " ";//写入班级名称
     40         ofile << data[i].lesson_number << " ";
     41         for (int j = 0; j < data[i].lesson_number; j++)
     42         {
     43             ofile << data[i].stu_lesson[j] << " ";//输出课程名称
     44         }
     45         ofile << endl;
     46     }
     47     for (int i = 0; i < class_number; i++)//写入学生信息
     48     {
     49         ofile << data[i].stu_total << endl;//学生个数
     50         Stu_Node *p = data[i].address;
     51         while (p != NULL)
     52         {
     53             ofile << p->name << " " << p->age << " " << p->sex << " " << p->stu_number << " ";
     54             for (int j = 0; j < data[i].lesson_number; j++)
     55             {
     56                 ofile << p->stu_grade[j] << " ";
     57             }
     58             ofile << endl;
     59             p = p->next;
     60         }
     61     }
     62     ofile.close();
     63 }
     64 
     65 bool STUDENT::save_premisson()
     66 {
     67     for (int i = 0; i < class_number; i++)
     68     {
     69         if (data[i].stu_total == 0)
     70         {
     71             return false;
     72         }
     73         else
     74         {
     75             if (data[i].address->stu_rank == 0)
     76                 return false;
     77         }
     78     }
     79     return true;
     80 }
     81 
     82 /*
     83 函数名称:初始化班级
     84 函数类型:私有函数
     85 函数参数:班级名称的字符串
     86 函数功能:初始化班级名称以及学科
     87 函数原理:
     88           1.分别给这class_number个班级进行赋值
     89           2.为班级逐个指定课程和课程名称
     90 */
     91 void STUDENT::init_class(string class_name[])
     92 {
     93     for (int i = 0; i < class_number; i++)
     94     {
     95         data[i].class_name = class_name[i];
     96         cout << "请输入 " << class_name[i] << " 的课程数和课程名称:" << endl;
     97         cin >> data[i].lesson_number;
     98         data[i].stu_lesson = new string[data[i].lesson_number];
     99         for (int j = 0; j < data[i].lesson_number; j++)
    100         {
    101             cin >> data[i].stu_lesson[j];
    102         }
    103     }
    104 }
    105 /*
    106 函数名称:初始化学生成绩
    107 函数类型:私有函数
    108 函数参数:班级下标
    109 函数功能:为班级学生的科目成绩赋值
    110 函数原理:
    111           1.判断对应班级的链表中学生的信息是否存在
    112           2.通过遍历链表逐一赋值
    113 */
    114 void STUDENT::init_grade(int location)
    115 {
    116     Stu_Node *p = data[location].address;
    117     if (p == NULL)
    118     {
    119         cout << "错误!请检查该班级是否已录入学生信息!" << endl;
    120     }
    121     else
    122     {
    123         while (p != NULL)
    124         {
    125             cout << "请输入" << p->name << "的成绩:" << endl;
    126             p->stu_grade = new double[data[location].lesson_number];
    127             for (int i = 0; i < data[location].lesson_number; i++)
    128             {
    129                 cout << data[location].stu_lesson[i] << " ";
    130                 cin >> p->stu_grade[i];
    131             }
    132             p = p->next;
    133         }
    134     }
    135 }
    136 /*
    137 函数名称:查找班级
    138 函数类型:私有函数
    139 函数参数:班级名称,返回班级下标
    140 函数功能:遍历数组查找指定班级名称,查找失败返回-1
    141 函数原理:
    142           1.简单查找,逐一比对
    143           2.成功返回对应地址下标,否则返回-1
    144 */
    145 int STUDENT::search_className(string name)
    146 {
    147     for (int i = 0; i < class_number; i++)
    148     {
    149         if (data[i].class_name == name)
    150         {
    151             return i;
    152         }
    153     }
    154     return -1;
    155 }
    156 /*
    157 函数名称:添加学生信息
    158 函数类型:私有函数
    159 函数参数:班级地址,添加学生数量,班级名称
    160 函数功能:指定班级添加学生信息
    161 函数原理:
    162           1.判断是否存在该班级
    163           2.若存在则增加班级人数并逐一赋值
    164           3.若不存在则提示是否创建班级
    165             否结束函数
    166             是则判断是否可以添加
    167               可以就添加班级信息
    168               不可以提示已满
    169 */
    170 void STUDENT::add_stu(int location, int number, string name)
    171 {
    172     if (location == -1)//未找到指定班级
    173     {
    174         cout << "未找到该班级,是否添加?(y/n)" << endl;
    175         char option;
    176         cin >> option;
    177         if (option == 'y')
    178         {
    179             add_class(name);
    180             location++;
    181         }
    182         else
    183             return;
    184     }
    185     //下面开始赋值
    186     data[location].stu_total = data[location].stu_total + number;//添加学生个数
    187     cout << "请分别输入这" << number << "个学生的 姓名 年龄 性别(0/1) 学号 " << endl;
    188     Stu_Node *end = data[location].address;//从首地址开始
    189     if (end == NULL)//如果首地址为空则说明该班级人数为空,需要创建头节点
    190     {
    191         end = new Stu_Node();
    192         cin >> end->name;
    193         cin >> end->age;
    194         cin >> end->sex;
    195         cin >> end->stu_number;
    196         end->next = NULL;
    197         number--;//头节点就是一个学生,故需要在总数里减少一个
    198         data[location].address = end;
    199     }
    200     while (end->next != NULL)//移动到最后一个节点处
    201         end = end->next;
    202     for (int i = 0; i < number; i++)
    203     {
    204         //这里其实可以直接在结构体里定义一个构造函数可能会更简洁一点
    205         Stu_Node *add = new Stu_Node;
    206         cin >> add->name;
    207         cin >> add->age;
    208         cin >> add->sex;
    209         cin >> add->stu_number;
    210         add->next = NULL;
    211         add->stu_average = 0;
    212         add->stu_rank = 0;
    213         add->stu_grade = NULL;
    214         end->next = add;
    215         end = add;
    216     }
    217 }
    218 /*
    219 函数名称:搜索学生
    220 函数类型:私有函数
    221 函数参数:学生姓名,班级地址
    222 函数功能:查找指定班级的学生姓名
    223 函数原理:
    224           1.创建一个指针指向班级的首地址
    225           2.若不为空进行遍历操作,相等则返回学生指针地址
    226           3.未找到则返回空指针
    227 */
    228 Stu_Node* STUDENT::search_stuName(string name, int location)
    229 {
    230     Stu_Node *p = data[location].address;
    231     while (p != NULL)
    232     {
    233         if (p->name == name)
    234             return p;
    235         p = p->next;
    236     }
    237     return NULL;
    238 }
    239 /*
    240 函数名称:删除学生
    241 函数类型:私有函数
    242 函数参数:班级的首地址,学生的地址
    243 函数功能:删除学生信息
    244 函数原理:
    245           1.创建一个temp指针找到要删除的学生的前一个地址
    246           2.进行删除操作
    247           3.删除p指针
    248 */
    249 void STUDENT::delete_stu(Stu_Node *& p, Stu_Node *&head)
    250 {
    251     Stu_Node *temp = head;
    252     if (p == NULL)
    253     {
    254         cout << "未找到该学生或者该班级学生信息不存在!" << endl;
    255         return;
    256     }
    257 
    258     if (temp == p && temp->next == NULL)//头结点
    259     {
    260         delete head;
    261         head = NULL;
    262     }
    263     else if (temp == p && temp->next != NULL)
    264     {
    265         temp = temp->next;
    266         head = temp;
    267         delete p;
    268     }
    269     else
    270     {
    271         while (temp->next != p)
    272             temp = temp->next;
    273         temp->next = p->next;
    274         delete p;
    275     }
    276 }
    277 void STUDENT::print(int loc)
    278 {
    279     if (loc == -1)
    280     {
    281         cout << "未找到班级,请重试!" << endl;
    282         return;
    283     }
    284     Stu_Node *p = data[loc].address;
    285     while (p != NULL)
    286     {
    287         cout << "姓名: " << p->name << " 学号:" << p->stu_number;
    288         cout << " 性别:";
    289         if (p->sex)
    290             cout << "";
    291         else
    292             cout << "";
    293         cout << endl;
    294         p = p->next;
    295 
    296     }
    297 }
    298 /*
    299 函数名称:计算平均分
    300 函数类型:私有函数
    301 函数参数:班级地址
    302 函数功能:计算指定班级的平均分
    303 函数原理:
    304           1.判断地址是否合法,不合法返回
    305           2.地址合法 判断是否grade已经赋值,若没有赋值询问是否录入(调用函数)
    306           3.获取该班级的科目总数并sum每个学生的成绩
    307 */
    308 void STUDENT::average_grade(int loc)
    309 {
    310     if (loc == -1)
    311     {
    312         cout << "未找到班级,请重试" << endl;
    313         return;
    314     }
    315     //判断是否为空
    316     if (data[loc].address == NULL)
    317     {
    318         cout << "该班级的成绩还未录入,是否录入?(y/n)" << endl;
    319         char option;
    320         cin >> option;
    321         if (option == 'y')
    322         {
    323             init_grade(loc);
    324         }
    325         else
    326         {
    327             return;//退出程序
    328         }
    329     }
    330     //下面是计算
    331     Stu_Node *p = data[loc].address;
    332     while (p != NULL)
    333     {
    334         double sum = 0.0;
    335         for (int i = 0; i < data[loc].lesson_number; i++)
    336         {
    337             sum = sum + p->stu_grade[i];
    338         }
    339         p->stu_average = sum / data[loc].lesson_number;
    340         p = p->next;
    341     }
    342 
    343 }
    344 /*
    345 函数名称:选择排序
    346 函数类型:私有函数
    347 函数参数:班级地址
    348 函数功能:通过平均分来排序
    349 函数原理:
    350           1.判断地址是否合法,不合法返回
    351           2.地址合法 进行排序
    352             需要两个指针,一个指向当前比较,一个指向下一个交替进行
    353           3.排序完以后由于学生信息已经是有序的了,故直接给rank赋值即可,按照1-n
    354 
    355 */
    356 void STUDENT::sort_select(int loc)
    357 {
    358     if (loc == -1)
    359     {
    360         cout << "指定班级不存在OK?重试一次吧!" << endl;
    361         return;
    362     }
    363     //需要两个指针 
    364     Stu_Node *p = data[loc].address;
    365     Stu_Node *q;
    366     while (p != NULL)
    367     {
    368         Stu_Node *tag = p;
    369         q = tag->next;
    370         while (q != NULL)
    371         {
    372             if (p->stu_average < q->stu_average)
    373             {
    374                 exchange(p, q, loc);
    375             }
    376             q = q->next;
    377         }
    378         p = p->next;
    379     }
    380     //排序完成后对rank进行赋值
    381     p = data[loc].address;
    382     int rank_number = 1;
    383     while (p != NULL)
    384     {
    385         p->stu_rank = rank_number;
    386         rank_number++;
    387         p = p->next;
    388     }
    389 }
    390 /*
    391 函数名称:交换函数
    392 函数类型:私有函数
    393 函数参数:两个结构指针,班级地址
    394 函数功能:在排序中调用,负责交换两个结点的信息
    395 函数原理:
    396           1.为其中一个创建数据副本
    397           2.两个数据进行赋值
    398           3.副本对另一个数据进行赋值
    399 */
    400 void STUDENT::exchange(Stu_Node *& p, Stu_Node *& q, int loc)
    401 {
    402     string temp_name = p->name;
    403     int temp_sex = p->sex;
    404     int temp_age = p->age;
    405     string temp_stu_number = p->stu_number;
    406     double *temp_grade = new double[data[loc].lesson_number];
    407     for (int i = 0; i < data[loc].lesson_number; i++)
    408     {
    409         temp_grade[i] = p->stu_grade[i];
    410     }
    411     double temp_average = p->stu_average;
    412     int temp_rank = p->stu_rank;
    413 
    414     p->name = q->name;
    415     p->sex = q->sex;
    416     p->age = q->age;
    417     p->stu_number = q->stu_number;
    418     for (int i = 0; i < data[loc].lesson_number; i++)
    419     {
    420         p->stu_grade[i] = q->stu_grade[i];
    421     }
    422     p->stu_average = q->stu_average;
    423     p->stu_rank = q->stu_rank;
    424 
    425     q->name = temp_name;
    426     q->sex = temp_sex;
    427     q->age = temp_age;
    428     temp_stu_number = p->stu_number;
    429     for (int i = 0; i < data[loc].lesson_number; i++)
    430     {
    431         q->stu_grade[i] = temp_grade[i];
    432     }
    433     q->stu_average = temp_average;
    434     q->stu_rank = temp_rank;
    435 }
    436 /*
    437 函数名称:打印成绩
    438 函数类型:私有函数
    439 函数参数:班级地址
    440 函数功能:打印班级对应学生的成绩信息
    441 函数原理:
    442           1.判断地址是否合法,不合法返回
    443           2.地址合法 打印学生对应的成绩
    444 */
    445 void STUDENT::print_grade(int loc)
    446 {
    447     if (loc == -1)
    448     {
    449         cout << "指定班级不存在,请重试!" << endl;
    450         return;
    451     }
    452     Stu_Node *p = data[loc].address;
    453     while (p != NULL)
    454     {
    455         cout << p->name << " ";
    456         for (int i = 0; i < data[loc].lesson_number; i++)
    457         {
    458             cout << data[loc].stu_lesson[i] << ": " << p->stu_grade[i] << "  ;";
    459         }
    460         cout << "平均分:" << p->stu_average << " 排名:" << p->stu_rank << endl;
    461         p = p->next;
    462     }
    463 }
    464 /*
    465 函数名称:打印许可
    466 函数类型:私有函数
    467 函数参数:班级地址
    468 函数功能:判断是否可以打印学生成绩信息
    469 函数原理:
    470           1.判断地址是否合法,不合法返回
    471           2.地址合法 判断 rank grade average 是否已被赋值
    472 */
    473 bool STUDENT::grade_premisson(int loc)
    474 {
    475     if (loc == -1)
    476         return false;
    477     else if (data[loc].address != NULL)
    478     {
    479         if (data[loc].address->stu_rank != 0 && data[loc].address->stu_grade != NULL && data[loc].address->stu_average != 0)
    480             return true;
    481         else
    482             return false;
    483     }
    484     else
    485         return false;
    486 }
    487 
    488 /*
    489 函数名称:构造函数
    490 函数类型:共有函数
    491 函数参数:班级数量
    492 函数功能:创建类对象并为number数量个班级进行赋值操作
    493 函数原理:
    494           1.判断数目是否合法或者超出最大存储范围,不合法报错
    495           2.地址合法 逐一初始化操作
    496 */
    497 STUDENT::STUDENT(int class_number)
    498 {
    499     if (class_number < MAXSIZE&&class_number>0)
    500     {
    501         this->class_number = class_number;
    502         data = new Class_Node[MAXSIZE];
    503         for (int i = 0; i < class_number; i++)
    504         {
    505             data[i].stu_lesson = NULL;//科目
    506             data[i].lesson_number = 0;//科目数量
    507             data[i].class_name = " ";//班级名称
    508             data[i].address = NULL;//首地址
    509             data[i].stu_total = 0;//该班级学生人数
    510         }
    511     }
    512     else
    513     {
    514         cerr << "错误!超出最大范围或输入不合法!" << endl;
    515         exit(1);
    516     }
    517 
    518 }
    519 /*
    520 函数名称:构造函数
    521 函数类型:共有函数
    522 函数参数:班级数量
    523 函数功能:从本地读取进行赋值
    524 函数原理:
    525           读取根目录下的database.txt进行赋值操作
    526 */
    527 STUDENT::STUDENT(bool flag,bool &result)
    528 {
    529     fstream ifile;
    530     if (flag)
    531         ifile.open("userDataBase.txt", ios::_Nocreate);
    532     else
    533         ifile.open("EXdataBase.txt", ios::in);
    534     if (ifile.fail())
    535     {
    536         result = false;
    537         return;
    538     }
    539     ifile >> class_number;//从文件中读取班级个数
    540     if (class_number < MAXSIZE&&class_number>0)//先对所有的进行一次初始化
    541     {
    542         data = new Class_Node[MAXSIZE];
    543         for (int i = 0; i < class_number; i++)
    544         {
    545             data[i].stu_lesson = NULL;//科目
    546             data[i].lesson_number = 0;//科目数量
    547             data[i].class_name = " ";//班级名称
    548             data[i].address = NULL;//首地址
    549             data[i].stu_total = 0;//该班级学生人数
    550         }
    551     }
    552     else
    553     {
    554         result = false;
    555         return;
    556     }
    557     for (int i = 0; i < class_number; i++)//初始化班级
    558     {
    559         ifile >> data[i].class_name;
    560         ifile >> data[i].lesson_number;
    561         data[i].stu_lesson = new string[data[i].lesson_number];
    562         for (int j = 0; j < data[i].lesson_number; j++)
    563         {
    564             ifile >> data[i].stu_lesson[j];
    565         }
    566     }
    567     int stu_number;
    568     //录入学生信息
    569     for (int i = 0; i < class_number; i++)
    570     {
    571         ifile >> stu_number;
    572         data[i].stu_total = stu_number;
    573         Stu_Node *end = data[i].address;//从首地址开始
    574         if (end == NULL)//如果首地址为空则说明该班级人数为空,需要创建头节点
    575         {
    576             end = new Stu_Node();
    577             ifile >> end->name;
    578             ifile >> end->age;
    579             ifile >> end->sex;
    580             ifile >> end->stu_number;
    581             end->next = NULL;
    582             end->stu_average = 0;
    583             end->stu_rank = 0;
    584             end->stu_grade = new double[data[i].lesson_number];
    585             stu_number--;//头节点就是一个学生,故需要在总数里减少一个
    586             data[i].address = end;
    587             for (int j = 0; j < data[i].lesson_number; j++)
    588             {
    589                 ifile >> end->stu_grade[j];
    590             }
    591         }
    592         while (end->next != NULL)//移动到最后一个节点处
    593             end = end->next;
    594         for (int k= 0; k < stu_number; k++)
    595         {
    596             //这里其实可以直接在结构体里定义一个构造函数可能会更简洁一点
    597             Stu_Node *add = new Stu_Node;
    598             ifile>>add->name;
    599             ifile >> add->age;
    600             ifile >> add->sex;
    601             ifile >> add->stu_number;
    602             add->next = NULL;
    603             add->stu_average = 0;
    604             add->stu_rank = 0;
    605             add->stu_grade = new double[data[i].lesson_number];
    606             for (int j = 0; j < data[i].lesson_number; j++)
    607             {
    608                 ifile >> add->stu_grade[j];
    609             }
    610             end->next = add;
    611             end = add;
    612         }
    613     }
    614     ifile.close();
    615     averageStu();
    616     sortStu();
    617 }
    618 /*
    619 函数名称:删除学生
    620 函数类型:共有函数
    621 函数参数:无
    622 函数功能:调用对应私有函数进行删除操作
    623 */
    624 void STUDENT::deleteStu()
    625 {
    626     cout << "请输入要删除的学生的班级:" << endl;
    627     string class_name;
    628     int loc;
    629     cin >> class_name;
    630     loc = search_className(class_name);
    631     if (loc == -1)
    632     {
    633         cout << "错误!未找到该班级,请检查后重试!" << endl;
    634     }
    635     else
    636     {
    637         cout << "请输入学生姓名:";
    638         string stu_name;
    639         cin >> stu_name;
    640         Stu_Node *p = search_stuName(stu_name, loc);
    641         if (p == NULL)
    642         {
    643             cout << "未找到该学生" << endl;
    644             return;
    645         }
    646         else
    647         {
    648             delete_stu(p, data[loc].address);
    649             cout << stu_name << "已经被删除!" << endl;
    650         }
    651     }
    652 }
    653 /*
    654 函数名称:初始化系统
    655 函数类型:共有函数
    656 函数参数:无
    657 函数功能:调用对应私有函数init_class进行班级初始化操作
    658 */
    659 void STUDENT::initSystem()
    660 {
    661     cout << "请分别输入这" << class_number << "个班级名称:" << endl;
    662     string *name_class;
    663     name_class = new string[class_number];
    664     for (int i = 0; i < class_number; i++)
    665     {
    666         cin >> name_class[i];
    667     }
    668     init_class(name_class);//初始化班级
    669 
    670 }
    671 /*
    672 函数名称:添加学生信息
    673 函数类型:共有函数
    674 函数参数:无
    675 函数功能:调用对应私有函数add_stu进行学生信息添加操作
    676 */
    677 void STUDENT::addStu()
    678 {
    679     cout << "请输入要增添学生的班级和添加的人数" << endl;
    680     string name_class;
    681     int number;
    682     cin >> name_class;
    683     cin >> number;
    684     add_stu(search_className(name_class), number, name_class);
    685 }
    686 /*
    687 函数名称:打印学生信息
    688 函数类型:共有函数
    689 函数参数:无
    690 函数功能:调用对应私有函数print进行学生信息打印操作
    691 */
    692 void STUDENT::Print()
    693 {
    694     //打印,打印班级学生信息
    695     cout << "请选择打印模式:1.打印指定班级学生信息 2.打印全部班级" << endl;
    696     int option;
    697     string name;
    698     cin >> option;
    699     switch (option)
    700     {
    701     case 1:
    702         cout << "请输入要打印的班级:";
    703         cin >> name;
    704         print(search_className(name));
    705         break;
    706     case 2:
    707         for (int i = 0; i < class_number; i++)
    708         {
    709             cout << data[i].class_name << "班: " << endl;
    710             print(i);
    711         }
    712         break;
    713     default:
    714         cout << "您输入的选项有误,请重试!" << endl;
    715     }
    716 }
    717 /*
    718 函数名称:计算平均分
    719 函数类型:共有函数
    720 函数参数:无
    721 函数功能:调用对应私有函数print进行学生信息打印操作
    722 */
    723 void STUDENT::averageStu()
    724 {
    725     for (int i = 0; i < class_number; i++)
    726     {
    727         average_grade(i);
    728     }
    729 }
    730 /*
    731 函数名称:排序
    732 函数类型:共有函数
    733 函数参数:无
    734 函数功能:调用对应私有函数sort_select进行学生成绩排序操作,必须执行成绩录入和求平均数
    735 */
    736 void STUDENT::sortStu()
    737 {
    738     for (int i = 0; i < class_number; i++)
    739     {
    740         sort_select(i);
    741     }
    742 }
    743 /*
    744 函数名称:初始化成绩
    745 函数类型:共有函数
    746 函数参数:无
    747 函数功能:调用私有函数init_grade
    748 */
    749 void STUDENT::initGrade()
    750 {
    751     cout << "请选择录入模式 1.全部 2.输入指定班级" << endl;
    752     int option;
    753     cin >> option;
    754     string name;
    755     switch (option)
    756     {
    757     case 1:
    758         for (int i = 0; i < class_number; i++)
    759         {
    760             cout << "请录入第" << i + 1 << " 个班级的学生成绩:" << endl;
    761             init_grade(i);
    762         }
    763         break;
    764     case 2:
    765         cout << "请输入要录入成绩的班级:" << endl;
    766         cin >> name;
    767         init_grade(search_className(name));
    768         break;
    769     default:
    770         cout << "Oops!您输入的选项错误!" << endl;
    771     }
    772 }
    773 /*
    774 函数名称:打印班级学生成绩信息
    775 函数类型:共有函数
    776 函数参数:无
    777 函数功能:打印成绩信息
    778 函数原理:
    779           调用私有函数print_grade 函数
    780           支持指定班级打印和全部打印
    781 */
    782 void STUDENT::printGrade()
    783 {
    784     cout << "请选择打印模式:1.打印指定班级学生成绩 2.打印全部班级" << endl;
    785     int option;
    786     string name;
    787     cin >> option;
    788     switch (option)
    789     {
    790     case 1:
    791         cout << "请输入要打印的班级:";
    792         cin >> name;
    793         if (grade_premisson(search_className(name)))
    794         {
    795             cout << "成绩未录入或者排序/平均分还未计算,请重试!" << endl;
    796             return;
    797         }
    798         print_grade(search_className(name));
    799     case 2:
    800 
    801         for (int i = 0; i < class_number; i++)
    802         {
    803             if (grade_premisson(i))
    804             {
    805                 cout << data[i].class_name << "班: " << endl;
    806                 print_grade(i);
    807             }
    808         }
    809         break;
    810     default:
    811         cout << "您输入的选项有误,请重试!" << endl;
    812     }
    813 }
    814 /*
    815 函数名称:添加班级
    816 函数类型:私有函数
    817 函数参数:班级名称
    818 函数功能:添加班级
    819 函数原理:
    820         1.逻辑判断系统空间是否足够即 class_number<MAXSIZE
    821         2.若空间足够则赋值且class_number++
    822 */
    823 void STUDENT::add_class(string name)
    824 {
    825     if (class_number + 1 < MAXSIZE)//判断存储空间是否足够
    826     {
    827         data[class_number].class_name = name;
    828         data[class_number].stu_total = 0;
    829         data[class_number].address = NULL;
    830         cout << "请输入 " << name << " 的课程数和课程名称:" << endl;
    831         cin >> data[class_number].lesson_number;
    832         data[class_number].stu_lesson = new string[data[class_number].lesson_number];
    833         for (int j = 0; j < data[class_number].lesson_number; j++)
    834         {
    835             cin >> data[class_number].stu_lesson[j];
    836         }
    837         class_number++;//班级个数加1
    838     }
    839     else
    840     {
    841         cout << "已达到最大存储空间,添加失败" << endl;
    842     }
    843 }
    844 /*
    845 函数名称:添加班级
    846 函数类型:共有函数
    847 函数参数:无
    848 函数功能:添加班级
    849 函数原理:
    850           调用私有函数add_class(string name)函数
    851 */
    852 void STUDENT::addClass()
    853 {
    854     cout << "请输入要添加的班级的姓名:";
    855     string name;
    856     cin >> name;
    857     add_class(name);
    858     cout << "添加班级功能执行完毕!" << endl;
    859 }
    860 void STUDENT::searchStu()
    861 {
    862     cout << "请输入要查询学生所属班级:" << endl;
    863     string name_class, name_stu;
    864     cin >> name_class;
    865     int loc = search_className(name_class);
    866     if (loc == -1)
    867     {
    868         cout << "您所输入的班级不存在,请重试!" << endl;
    869         return;
    870     }
    871     cout << "请输入要查询的学生名称:" << endl;
    872     cin >> name_stu;
    873     Stu_Node *p = search_stuName(name_stu, loc);
    874     print_stu(p);
    875 }
    876 
    877 void STUDENT::saveData(int mode)
    878 {
    879     if (save_premisson())
    880     {
    881         cout << "保存数据会覆盖原来的数据,是否继续?(y/n)" << endl;
    882         char option;
    883         cin >> option;
    884         if (option == 'y')
    885         {
    886             save_data(mode);
    887             cout << "数据保存成功!" << endl;
    888         }
    889         else
    890         {
    891             return;
    892         }
    893     }
    894     else
    895     {
    896         cout << "保存失败!请检查数据是否完整!" << endl;
    897     }
    898 }

    源.cpp

      1 #include"Student.h"
      2 void mainMenu()
      3 {
      4     cout << "----------------Student Administration System-------------------" << endl;
      5     cout << "|                                                              |" << endl;
      6     cout << "|       1____________增加班级                                  |" << endl;
      7     cout << "|       2____________添加学生信息                              |" << endl;
      8     cout << "|       3____________删除学生信息                              |" << endl;
      9     cout << "|       4____________录入学生成绩                              |" << endl;
     10     cout << "|       5____________更新成绩                                  |" << endl;
     11     cout << "|       6____________输出学生信息                              |" << endl;
     12     cout << "|       7____________查询学生成绩                              |" << endl;
     13     cout << "|       8____________查找学生                                  |" << endl;
     14     cout << "|       9____________保存数据                                  |" << endl;
     15     cout << "|       0____________返回主界面                                |" << endl;
     16     cout << "|                                                              |" << endl;
     17     cout << "----------------------------------------------------------------" << endl;
     18 }
     19 void welcomeMenu()
     20 {
     21     cout << "----------------------欢迎使用学生信息管理系统------------------" << endl;
     22     cout << "|                                                              |" << endl;
     23     cout << "|       1____________进入系统管理界面                          |" << endl;
     24     cout << "|       2____________读取本地存档                              |" << endl;
     25     cout << "|       0____________退出                                      |" << endl;
     26     cout << "|                                                              |" << endl;
     27     cout << "----------------------------------------------------------------" << endl;
     28 }
     29 void continueMenu()
     30 {
     31     cout << "----------------Student Administration System-------------------" << endl;
     32     cout << "|                                                              |" << endl;
     33     cout << "|       1____________输出学生信息                              |" << endl;
     34     cout << "|       2____________查询学生成绩                              |" << endl;
     35     cout << "|       3____________查找学生                                  |" << endl;
     36     cout << "|       0____________返回主界面                                |" << endl;
     37     cout << "|                                                              |" << endl;
     38     cout << "----------------------------------------------------------------" << endl;
     39 }
     40 int main()
     41 {
     42     welcomeMenu();//进入欢迎界面
     43     int option;
     44     
     45     while (1)
     46     {
     47         cin >> option;
     48         if(option==1)
     49         {
     50                 int number;
     51                 system("cls");//清一下屏
     52                 cout << "请输入要创建的班级个数:" << endl;
     53                 cin >> number;
     54                 STUDENT user(number);
     55                 user.initSystem();//初始化
     56                 int selection;
     57                 int end_misson = 0;
     58                 while (end_misson!=1)
     59                 {
     60                     mainMenu();
     61                     cin >> selection;
     62                     switch (selection)
     63                     {
     64                     case 1:
     65                         user.addClass();
     66                         break;
     67                     case 2:
     68                         user.addStu();
     69                         break;
     70                     case 3:
     71                         user.deleteStu();
     72                         break;
     73                     case 4:
     74                         user.initGrade();
     75                         break;
     76                     case 5:
     77                         user.averageStu();
     78                         user.sortStu();
     79                         cout << "数据更新完毕!" << endl;
     80                         break;
     81                     case 6:
     82                         user.Print();
     83                         break;
     84                     case 7:
     85                         user.printGrade();
     86                         break;
     87                     case 8:
     88                         user.searchStu();
     89                         break;
     90                     case 9:
     91                         user.saveData(1);
     92                         break;
     93                     case 0:
     94                         system("cls");
     95                         welcomeMenu();
     96                         end_misson = 1;
     97                         break;
     98                     default:
     99                         cout << "您的输入有误,请重试!" << endl;;
    100                     }
    101                 }
    102         }
    103         else if (option == 2)
    104         {
    105             int mode;
    106             bool flag;
    107             bool result = true;//读取存档结果,默认为true
    108             cout << "请选择读取存档的模式:1.样例演示 2.用户存档(若不存在系统会自动退出!)" << endl;
    109             while (1)
    110             {
    111                 cin >> mode;
    112                 if (mode == 1)
    113                 {
    114                     flag = false;
    115                     break;
    116                 }
    117                 else if (mode == 2)
    118                 {
    119                     flag = true;
    120                     break;
    121                 }
    122                 else
    123                 {
    124                     cout << "您的输入有误!" << endl;
    125                 }
    126             }
    127             STUDENT loc(flag,result);
    128             if (result)
    129             {
    130                 int selection;
    131                 system("cls");
    132                 int end_misson = 0;
    133                 while (end_misson != 1)
    134                 {
    135                     continueMenu();
    136                     cin >> selection;
    137                     switch (selection)
    138                     {
    139                     case 1:
    140                         loc.Print();
    141                         break;
    142                     case 2:
    143                         loc.printGrade();
    144                         break;
    145                     case 3:
    146                         loc.searchStu();
    147                         break;
    148                     case 0:
    149                         system("cls");
    150                         welcomeMenu();
    151                         end_misson = 1;
    152                         break;
    153                     default:
    154                         cout << "您输入的有误!" << endl;
    155                     }
    156                 }
    157             }
    158             else
    159             {
    160                 cout << "文件损坏,读取失败!" << endl;
    161                 welcomeMenu();
    162             }
    163         }
    164         else if (option == 0)
    165         {
    166             return 0;
    167         }
    168         else
    169         {
    170             cout << "您输入的有误!" << endl;
    171         }
    172     }
    173     
    174 }
    175     

    EXdataBase.txt

    2
    计算机1171 6 大学英语 数字逻辑设计 毛概 图论与近世代数 数据结构 线性代数
    计算机1172 7 大学英语 数字逻辑设计 毛概 图论与近世代数 数据结构 线性代数 创新创业基础
    7
    黄梓轩 19 1 117101 98.5 95 80 75 80 84
    冯煜航 19 1 117102 85   92 85  62 70 58
    姜贤彬 19 0 117103 85 77 88 99 80 98 
    朱歆婷 19 0 117104 89 85 84 87 85 81 
    李浩鹏 19 1 117105 85   84   82   70 62  59
    唐紫涵 19 0 117106 90   85   92   91  84  88
    田语晨 19 0 117107 92   85   88.5 94  70 81.5
    5
    洪丽芳 19 0 117201 91 87 88 88 95 75 85
    冯鹏旭 18 1 117202 87 76 91 74 95 84 75
    黄雨彤 19 0 117203 87 76 74 88 90 84 80 
    黄奕轩 19 1 117204 94   85 74  85  90 60.5 82
    李彦龙 20 1 117205 94   83.5 75 84 78 89 100
    View Code

    userDataBase.txt

    2
    计算机1171 2 离散数学 线性代数 
    计算机1172 3 离散数学 数据结构 线性代数 
    2
    小亮 19 1 117101 98 95 
    小明 19 1 117102 94 85 
    2
    小芳 19 0 117201 91 87 88 
    小蔡 18 1 117202 87 76 91 
    View Code
  • 相关阅读:
    HDU 1009 FatMouse' Trade
    HDU 2602 (简单的01背包) Bone Collector
    LA 3902 Network
    HDU 4513 吉哥系列故事——完美队形II
    LA 4794 Sharing Chocolate
    POJ (Manacher) Palindrome
    HDU 3294 (Manacher) Girls' research
    HDU 3068 (Manacher) 最长回文
    Tyvj 1085 派对
    Tyvj 1030 乳草的入侵
  • 原文地址:https://www.cnblogs.com/robotpaul/p/10230355.html
Copyright © 2011-2022 走看看