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
  • 相关阅读:
    xdoj 1237 (贪心+逆向思维)
    linux系统 (实验一)实验楼的课程笔记
    fc_net.py cs231n
    cnn.py cs231n
    optim.py cs231n
    layers.py cs231n
    Python数据分析与展示[第一周]
    配置了两天python【python可以的】
    PYTHON网络爬虫与信息提取[scrapy框架应用](单元十、十一)
    PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
  • 原文地址:https://www.cnblogs.com/robotpaul/p/10230355.html
Copyright © 2011-2022 走看看