目录
近来有空闲,把前几个学期做的实验报告上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~
实验要求
编写一个实验程序实现以下功能:
有一个学生成绩文本文件xyz4.in,第一行为整数n,接下来为n行学生基本信息,包括学号、姓名和班号,接下来为整数m,然后为m行课程信息,包括课程编号和课程名,再接下来为整数k,然后为k行学生成绩,包括学号、课程编号和分数。编写一个程序按班号递增排序输出所有学生的成绩,相同班号按学号递增排序,同一个学生按课程编号递增排序,相邻的班号和学生信息不重复输出。
一、实验目的
1.熟悉线性表的逻辑结构、线性表抽象数据类型的描述方法;
2.熟悉存储结构以及算法设计方法;
3.熟悉线性表的建立、插入操作;
4.熟练 STL 中的 vector 容器及其应用;
5.复习文件读写的基本操作。
二、问题分析及数据结构设计
本次开发任务要求我们读取文件建立学生成绩线性表,并对其进行按某域值递增排序的操作。该任务涵盖功能要求有文件读取学生基本信息、课程信息和学生成绩以及建立线性表、按照班号递增排序输出所有学生的成绩,同时相同班号的学生按学号递增排序,同一个学生的成绩按课程编号递增排序。
从实验要求可知我们并不需要后续的交互, STL 标准库比我们自己实现的算法更健壮高效,在我们了解数据结构及其操作的基础上,直接使用标准库不用重复造轮子,可以提高工作效率,因此本次开发采用 STL 。 STL 组件包括容器、迭代器、算法三部分, STL 的基本观念是将数据与操作分离,数据由容器类管理,操作则由可定制的算法负责,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。
首先我们需要选择容器,因为是线性表,自然选择顺序容器,有 vector 、 string 、 deque和 list ,因为不需要后续的插入与删除操作,故选择 vector 向量容器。
其次是数据结构设计,我们需要建立结构体方便储存从文件中读取的信息。根据实验要求,我们建立学生与课程两个结构体。课程信息结构体 Course 包含的数据项有课程编号、课程名和成绩,因为这3种都是字符串,所以使用 string 来分别定义为 id 、 name 和 score ;学生信息结构体Student包含的数据项有学号、姓名、班号和成绩,因为前三种数据都是字符串,所以使用 string 来分别定义为 id 、 name 和 classNum ,而成绩有多项数据,因此定义为课程信息结构体 Course 的 vector 容器 score 。同时为了保存学生信息和课程信息,创建包含 Student 结构体类型的 vector 向量容器 studentList 和包含 Course 结构体类型的 vector 向量容器 courseList 。
三、算法设计
1.读入文件功能
本实验要求从文本文件中读取学生成绩到线性表中,涉及的算法为 C++ 文件读取。
1.1第一步:写头文件 #include <fstream>
要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream> 。 iostream 标准库提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。fstream 标准库定义了三个数据类型: ofstream 、 ifstream 、 fstream ,可以创建文件,向文件写入信息,从文件读取信息。
1.2第二步:采用open() 函数打开文件
本次实验只需要打开文件进行读操作,则使用 ifstream 对象。随后采用 open() 函数打开文件。open() 函数标准语法为:
void open(const char *filename, ios::openmode mode);
在这里, open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。
模式标志 |
描述 |
ios::app |
追加模式。所有写入都追加到文件末尾。 |
ios::ate |
文件打开后定位到文件末尾。 |
ios::in |
打开文件用于读取。 |
ios::out |
打开文件用于写入。 |
ios::trunc |