C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1

Similar documents
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

IO

02

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

c_cpp

C/C++程序设计 - 字符串与格式化输入/输出

新版 明解C++入門編

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 30 日 1

Microsoft PowerPoint - 10 模板 Template.pptx

C 1

Microsoft PowerPoint - string_kruse [兼容模式]

C/C++语言 - C/C++数据

C/C++ - 文件IO

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

untitled

第3章.doc

FY.DOC

extend

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1

北京大学

Microsoft Word - 第3章.doc

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C++ 程序设计 OJ10 - 参考答案 MASTER 2019 年 6 月 17 日 1

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Strings

幻灯片 1

untitled

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

untitled

untitled

上海交通大学

C++11概要 ライブラリ編

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

Guava学习之CharSequenceReader

Strings

文档 1

Eclipse C C++, or

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

迅速在两个含有大量数据的文件中寻找相同的数据

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

untitled

C/C++ - 函数

C/C++ - 数组与指针

Microsoft PowerPoint - CPP-Ch Print.ppt [兼容模式]

Microsoft Word - 新1-12.doc

ebook39-5

untitled

Microsoft Word cppFinalSolution.doc

Microsoft Word - CPE考生使用手冊 docx

C/C++ 语言 - 循环

untitled

untitled

1.5招募说明书(草案)

Microsoft Word 箕æ−¥ï¼‹å®ı稿;

98年度即測即評學科測試與即測即評即發證技術士技能檢定簡章

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

机 密

Chapter12 Derived Classes

新・解きながら学ぶC言語

第七讲 继承与多态

untitled

记 忆 155 期 北 京 大 学 文 革 专 辑 (9) 目 录 专 稿 章 铎 从 高 云 鹏 的 遭 遇, 看 迟 群 之 流 的 专 制 附 : 高 云 鹏 给 胡 宗 式 章 铎 的 信 (2015 年 11 月 19 日 ) 评 论 马 云 龙 王 复 兴 抢 救 记 忆 : 一 个 北

硕士论文正文


不 会 忘 记, 历 史 不 会 忘 记, 当 一 个 古 老 神 州 正 以 崭 新 的 姿 态 昂 首 屹 立 于 世 界 东 方 的 时 候, 当 世 界 把 延 伸 的 广 角 镜 瞄 准 这 片 神 奇 土 地 的 时 候, 中 国 人 民 已 深 深 感 到, 现 在 所 拥 有 的,

第一章

标题

第 二 章 鉴 证 业 务 的 定 义 和 目 标 第 五 条 鉴 证 业 务 是 指 注 册 会 计 师 对 鉴 证 对 象 信 息 提 出 结 论, 以 增 强 除 责 任 方 之 外 的 预 期 使 用 者 对 鉴 证 对 象 信 息 信 任 程 度 的 业 务 鉴 证 对 象 信 息 是 按

Microsoft Word - media-tips-zh.doc


第六篇守势




A 单 位 负 责 人 B 会 计 机 构 负 责 人 C 会 计 主 管 人 员 D 会 计 人 员 多 选 题 : 1. 单 位 伪 造 变 造 会 计 凭 证 会 计 账 簿, 编 制 虚 假 财 务 会 计 报 告 的, 县 级 以 上 人 民 政 府 财 政 部 可 以 依 法 行 使 的

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 30 日 1

新版 明解C言語入門編

《计算概论》课程 第十九讲 C 程序设计语言应用

!! :!!??!!?!??!!!... :... :'?'?! :' ' :'?' :'?' :'!' : :? Page 2

Page 2 of 12

<D2B0D0C4D3C5D1C52DC8CED6BEC7BF202D20BCC7CAC2B1BE>

秘密大乘佛法(下)

國立臺東高級中學102學年度第一學期第二次期中考高一國文科試題

Microsoft Word - Sunday

Transcription:

C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1

1 简单图形 1 简单图形 输入图形的行数 ( 如下图 7 行 ), 输出如下图所示图形 * *** ***** ******* ***** *** * 2

1 简单图形 1 #inc lude <iostream> 2 using namespace std ; 3 4 // 注意变量命名的方式 5 // 表示第几行, 循环都用同一个变量, 形式和逻辑上是完全一致的 row 6 i n t main ( ) 7 { 8 i n t rows = 4 ; 9 10 f o r ( i n t row = 1 ; row<= rows + 1 ; row++) 11 { 12 f o r ( i n t i = rows ; i >= row ; i )cout << " " ; // 空格们 13 f o r ( i n t i = 1 ; i <= 2*row 1; i++)cout << "*" ; // 星星们 14 cout << endl ; // 换行 15 } 16 17 f o r ( i n t row = rows ; row >=1; row ) 18 { 19 f o r ( i n t i = rows ; i >= row ; i )cout << " " ; 20 f o r ( i n t i = 1 ; i <= 2*row 1; i++)cout << "*" ; 21 cout << endl ; 22 } 23 24 return 0 ; 25 } 3

2 数学图形 2 数学图形 在屏幕上显示正弦函数 y = a*sin(b*x)+c 的图形 用 * 来画图 寻找合适的 a,b,c 以显示出明显的正弦图形 ( 提示 : 其中一种方法, 可以将函数的图形旋转 90 度, 即 x = a*sin(b*y)+c, 这样每行只有一个 *) 4

2 数学图形 1 #inc lude <iostream> 2 using namespace std ; 3 4 /* 此题用重载比较恰当, 因为需要编写的函数功能都是一样的排序输出的意思并非一定要有返回值, 参数通过指针或者引用也能够输出!, */ 5 void s o r t ( i n t &a, i n t &b) 6 { 7 i f ( a < b) return ; 8 9 i n t temp = a ; 10 a = b ; 11 b = temp ; 12 } 13 14 void s o r t ( i n t &a, i n t &b, i n t &c ) 15 { 16 s o r t ( a, b) ; 17 s o r t (b, c ) ; 18 19 s o r t ( a, b) ; 20 } 21 22 void s o r t ( i n t *pa, i n t *pb) 23 { 24 i f (* pa < *pb) return ; 25 26 i n t temp = *pa ; 27 *pa = *pb ; 28 *pb = temp ; 29 } 30 31 i n t main ( ) 32 { 33 i n t a, b, c ; 34 a = 300; 35 b = 260; 36 s o r t ( a, b) ; 37 cout << "a: " << a << ", b: " << b << "\n" ; 38 39 a = 300; 40 b = 260; 41 s o r t (&a, &b) ; 42 cout << "a: " << a << ", b: " << b << "\n" ; 43 44 a = 300; 45 b = 260; 46 c = 130; 47 s o r t ( a, b, c ) ; 48 cout << "a: " << a << ", b: " << b << ", c: " << c << "\n" ; 5

2 数学图形 49 50 return 0 ; 51 } 6

3 参数传递 3 参数传递 分别用指针和引用两种参数传递方式实现函数 函数功能 : 将两个数排序 输入 : 两个整数 输出 : 两个参数, 第一个参数返回小的整数, 第二个参数返回大的整数并分别使用这两个函数实现三个整数的排序 7

3 参数传递 1 #inc lude <iostream> 2 using namespace std ; 3 4 /* 此题用重载比较恰当, 因为需要编写的函数功能都是一样的排序 输出的意思并非一定要有返回值, 参数通过指针或者引用也能够输出!*/ 5 6 void s o r t ( i n t &a, i n t &b) 7 { 8 i f ( a < b) return ; 9 10 i n t temp = a ; 11 a = b ; 12 b = temp ; 13 } 14 15 void s o r t ( i n t &a, i n t &b, i n t &c ) 16 { 17 s o r t ( a, b) ; 18 s o r t (b, c ) ; 19 20 s o r t ( a, b) ; 21 } 22 23 void s o r t ( i n t *pa, i n t *pb) 24 { 25 i f (* pa < *pb) return ; 26 27 i n t temp = *pa ; 28 *pa = *pb ; 29 *pb = temp ; 30 } 31 32 i n t main ( ) 33 { 34 i n t a, b, c ; 35 a = 300; 36 b = 260; 37 s o r t ( a, b) ; 38 cout << "a:" << a << ",b:" << b << "\n" ; 39 40 a = 300; 41 b = 260; 42 s o r t (&a, &b) ; 43 cout << "a:" << a << ",b:" << b << "\n" ; 44 45 a = 300; 46 b = 260; 47 c = 130; 48 s o r t ( a, b, c ) ; 8

3 参数传递 49 cout << "a:" << a << ",b:" << b << ",c:" << c << "\n" ; 50 51 return 0 ; 52 } 9

4 函数模板 4 函数模板 使用函数模板编写不同类型的数组冒泡排序算法 提示 : 1 template <c l a s s T> 2 void Sort ( const T * arr, i n t nlen ) 3 { 4 //.. 5 } 10

4 函数模板 1 #inc lude <iostream> 2 using namespace std ; 3 4 // 模板排序, 注意函数命名, 以及的用法 s i z e o f 5 6 template<typename T> 7 void s o r t (T &a, T &b) 8 { 9 i f ( a < b) return ; 10 11 T temp = a ; 12 a = b ; 13 b = temp ; 14 } 15 16 template<typename T> 17 void s o r t (T arry [ ], i n t n) 18 { 19 f o r ( i n t i = 0 ; i < n 1 ; i++) //n 轮 1 20 { 21 f o r ( i n t j = 0 ; j < n 1 i ; j++) 22 { 23 s o r t ( arry [ j ], arry [ j + 1 ] ) ; 24 } 25 } 26 } 27 28 template<typename T> 29 void show (T arry [ ], i n t n) 30 { 31 f o r ( i n t i = 0 ; i < n ; i++) cout << arry [ i ] << " " ; 32 cout << endl ; 33 } 34 35 i n t main ( ) 36 { 37 i n t arry1 [ ] = { 6, 1,5,3 } ; 38 s o r t ( arry1, s i z e o f ( arry1 ) / s i z e o f ( i n t ) ) ; 39 show ( arry1, s i z e o f ( arry1 ) / s i z e o f ( i n t ) ) ; 40 41 double arry2 [ ] = { 1. 2, 4. 5, 7. 3 } ; 42 s o r t ( arry2, s i z e o f ( arry2 ) / s i z e o f ( double ) ) ; 43 show ( arry2, s i z e o f ( arry2 ) / s i z e o f ( double ) ) ; 44 45 return 0 ; 46 } 11

5 学生信息类 5 学生信息类 设计有关学生信息的类 并在 main 中测试 基础属性 姓名 (std::string) 性别 ( F, M ) 年龄 联系方式 (std::string) 多门课程 课程需要定义新的类 / 结构体 Course( 课程名称, 分数 ) 多门课使用模板类 std::vector<course> 接口 ( 成员函数 ) 包括 : 构造函数, 析构函数 一个不带参数的构造函数 一个用于初始化带参数的构造函数 析构函数 访问属性的接口 读 Read/ 获取 Get 数据成员, 类似 int GetAge()constreturn ; 写 Write/ 设置 Set 数据成员, 类似 void SetAge(int age) 课程接口 ( 更高要求 ) 添加一门课程, 类似 void Insert(const Cource& course) 课程数目 获取第 n 门课 vector 示例 12

5 学生信息类 Person.h 1 #pragma once 2 3 #include<s t r i n g > 4 #inc lude <vector> 5 6 using namespace std ; 7 8 s t r u c t course 9 { 10 s t r i n g coursename ; 11 i n t mark ; 12 } ; 13 14 c l a s s CPerson 15 { 16 p r i v a t e : 17 s t r i n g m_name; 18 s t r i n g m_gender ; 19 i n t m_age ; 20 s t r i n g m_phone ; 21 vector<course> m_courses ; 22 i n t m_courseaverage ; 23 p r i v a t e : 24 void CourseAverage ( ) ; 25 public : 26 CPerson ( ) ; 27 CPerson ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) ; 28 ~CPerson ( ) ; 29 30 void Show ( ) const ; 31 void SetInformation ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) ; 32 void InsertCourse ( const s t r u c t course& c ) ; // 增加课程 33 course *FindCourse ( const s t r i n g& coursename ) ; // 根据课程名称查找课程 34 35 unsigned i n t CourseNumber ( ) const { return m_courses. s i z e ( ) ; } 36 course *GetCourse ( i n t n) ; 37 38 s t r i n g GetName() const { return m_name; } 39 s t r i n g GetGender ( ) const { return m_gender ; } 40 s t r i n g GetPhone ( ) const { return m_phone; } 41 i n t GetAge ( ) const { return m_age; } 42 i n t GetCourseAverage ( ) const { return m_courseaverage ; } 43 } ; Person.cpp 1 #inc lude <iostream> 13

5 学生信息类 2 #inc lude <vector> 3 #include "Person.h" 4 5 using namespace std ; 6 CPerson : : CPerson ( ) 7 { 8 m_name = "no name" ; 9 m_gender = "no gender" ; 10 m_age = 0 ; 11 m_phone = " 000000" ; 12 } 13 14 CPerson : : CPerson ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) 15 { 16 m_name = name ; 17 m_gender = gender ; 18 m_age = age ; 19 m_phone = phone ; 20 } 21 22 CPerson : : ~ CPerson ( ) {} 23 24 void CPerson : : SetInformation ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) 25 { 26 m_name = name ; 27 m_gender = gender ; 28 m_age = age ; 29 m_phone = phone ; 30 } 31 32 void CPerson : : Show ( ) const 33 { 34 cout << " name:" << m_name << endl ; 35 cout << " gender:" << m_gender << endl ; 36 cout << " age:" << m_age<< endl ; 37 cout << " phone:" << m_phone << endl ; 38 39 f o r ( unsigned i n t i = 0 ; i < m_courses. s i z e ( ) ; i++) 40 cout << m_courses [ i ]. coursename<< ":" << m_courses [ i ]. mark<<endl ; 41 } 42 43 void CPerson : : InsertCourse ( const s t r u c t course& c ) 44 { 45 m_courses. push_back ( c ) ; 46 CourseAverage ( ) ; 47 } 48 14

5 学生信息类 49 void CPerson : : CourseAverage ( ) 50 { 51 m_courseaverage = 0 ; 52 f o r ( unsigned i n t i =0; i<m_courses. s i z e ( ) ; i++) 53 { 54 m_courseaverage += m_courses [ i ]. mark ; 55 } 56 i f ( m_courseaverage ) 57 m_courseaverage = m_courseaverage/ m_courses. s i z e ( ) ; 58 } 59 60 course *CPerson : : FindCourse ( const s t r i n g& coursename ) 61 { 62 f o r ( unsigned i n t i =0; i<m_courses. s i z e ( ) ; i++) 63 { 64 i f ( coursename==m_courses [ i ]. coursename ) // 找到 65 return &m_courses [ i ] ; 66 } 67 68 return 0 ; // 没找到 69 } 70 71 course *CPerson : : GetCourse ( i n t n) 72 { 73 i f (n<i n t ( m_courses. s i z e ( ) ) && n>=0)return &m_courses [ n ] ; 74 return 0 ; 75 } main.cpp 1 #inc lude <iostream> 2 #include "Person.h" 3 4 using namespace std ; 5 6 i n t main ( ) 7 { 8 CPerson student ; 9 s t r i n g name, gender, phone ; 10 i n t age ; 11 // cout << e n t e r name, gender, age, phone, mark1, mark2 and mark3 :\ n ; 12 // cin >> name >> gender >> age >> phone ; 13 14 name = " Student" ; 15 gender = " male" ; 16 phone = " phone" ; 17 age = 108; 18 19 student. SetInformation ( name, gender, age, phone ) ; 20 15

5 学生信息类 21 s t r u c t course c ; 22 // cin >> c. coursename >> c. mark ; 23 c. coursename = " 语文 ", c. mark = 99; 24 student. InsertCourse ( c ) ; 25 26 // cin >> c. coursename >> c. mark ; 27 c. coursename = " 数学 ", c. mark = 98; 28 student. InsertCourse ( c ) ; 29 30 // cin >> c. coursename >> c. mark ; 31 c. coursename = " 外语 ", c. mark = 97; 32 student. InsertCourse ( c ) ; 33 34 student. Show ( ) ; 35 36 // 查询接口会经常用到 37 s t r u c t course *pc = student. FindCourse ( " 外语 " ) ; 38 i f ( pc ) 39 { 40 cout << pc >coursename << " found: " << pc >mark << endl ; 41 } 42 e l s e 43 { 44 cout << "Can't find 外语 \n" ; 45 } 46 47 cin. get ( ) ; 48 return 0 ; 49 } 16

6 班级类 6 班级类 利用设计好的学生类, 继续设计一个班级的类 要求 多个构造函数, 一个析构函数 用 std::vector 保存学生信息 三个接口 : 添加学生, 学生个数, 第 n 个学生 从文件读入班级信息 (page190) 根据年龄排序 根据课程平时成绩排序 17

6 班级类 Person.h 1 #pragma once 2 3 #include<s t r i n g > 4 #inc lude <vector> 5 6 using namespace std ; 7 8 s t r u c t course 9 { 10 s t r i n g coursename ; 11 i n t mark ; 12 } ; 13 14 c l a s s CPerson 15 { 16 p r i v a t e : 17 s t r i n g m_name; 18 s t r i n g m_gender ; 19 i n t m_age ; 20 s t r i n g m_phone ; 21 vector<course> m_courses ; 22 i n t m_courseaverage ; 23 p r i v a t e : 24 void CourseAverage ( ) ; 25 public : 26 CPerson ( ) ; 27 CPerson ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) ; 28 ~CPerson ( ) ; 29 30 s t r i n g GetName() const { return m_name; } 31 s t r i n g GetGender ( ) const { return m_gender ; } 32 s t r i n g GetPhone ( ) const { return m_phone; } 33 i n t GetAge ( ) const { return m_age; } 34 i n t GetCourseAverage ( ) const { return m_courseaverage ; } 35 36 void Show ( ) const ; 37 void SetInformation ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) ; 38 void InsertCourse ( const s t r u c t course& c ) ; // 增加课程 39 course *FindCourse ( const s t r i n g& coursename ) ; // 根据课程名称查找课程 40 41 i n t CourseNumber ( ) { return m_courses. s i z e ( ) ; } 42 course *GetCourse ( i n t n) ; 43 } ; Person.cpp 1 #inc lude <iostream> 18

6 班级类 2 #inc lude <vector> 3 #include "Person.h" 4 5 using namespace std ; 6 CPerson : : CPerson ( ) 7 { 8 m_name = "no name" ; 9 m_gender = "no gender" ; 10 m_age = 0 ; 11 m_phone = " 000000" ; 12 } 13 14 CPerson : : CPerson ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) 15 { 16 m_name = name ; 17 m_gender = gender ; 18 m_age = age ; 19 m_phone = phone ; 20 } 21 22 CPerson : : ~ CPerson ( ) {} 23 24 void CPerson : : SetInformation ( const s t r i n g& name, const s t r i n g& gender, i n t age, const s t r i n g& phone ) 25 { 26 m_name = name ; 27 m_gender = gender ; 28 m_age = age ; 29 m_phone = phone ; 30 } 31 32 void CPerson : : Show ( ) const 33 { 34 cout << " name:" << m_name << endl ; 35 cout << " gender:" << m_gender << endl ; 36 cout << " age:" << m_age<< endl ; 37 cout << " phone:" << m_phone << endl ; 38 39 f o r ( unsigned i n t i = 0 ; i < m_courses. s i z e ( ) ; i++) 40 cout << m_courses [ i ]. coursename<< ":" << m_courses [ i ]. mark<<endl ; 41 } 42 43 void CPerson : : InsertCourse ( const s t r u c t course& c ) 44 { 45 m_courses. push_back ( c ) ; 46 CourseAverage ( ) ; 47 } 48 19

6 班级类 49 void CPerson : : CourseAverage ( ) 50 { 51 m_courseaverage = 0 ; 52 f o r ( unsigned i n t i =0; i<m_courses. s i z e ( ) ; i++) 53 { 54 m_courseaverage += m_courses [ i ]. mark ; 55 } 56 i f ( m_courseaverage ) 57 m_courseaverage = m_courseaverage/ m_courses. s i z e ( ) ; 58 } 59 60 course *CPerson : : FindCourse ( const s t r i n g& coursename ) 61 { 62 f o r ( unsigned i n t i =0; i<m_courses. s i z e ( ) ; i++) 63 { 64 i f ( coursename==m_courses [ i ]. coursename ) // 找到 65 return &m_courses [ i ] ; 66 } 67 68 return 0 ; // 没找到 69 } 70 71 course *CPerson : : GetCourse ( i n t n) 72 { 73 i f (n<i n t ( m_courses. s i z e ( ) ) && n>=0)return &m_courses [ n ] ; 74 75 return 0 ; 76 } Group.h 1 #pragma once 2 #include "Person.h" 3 4 c l a s s CGroup 5 { 6 public : 7 CGroup( void ) ; 8 ~CGroup( void ) ; 9 10 void LoadFile ( const s t r i n g &f i l e ) ; 11 void SaveFile ( const s t r i n g &f i l e ) ; 12 void SortByAge ( ) ; 13 void SortByCourse ( ) ; 14 15 CPerson *FindPerson ( const s t r i n g &name) ; 16 17 i n t PersonNumber ( ) const { return m_persons. s i z e ( ) ; } 18 CPerson *GetPerson ( i n t n) { 19 i f (n<0 n>=m_persons. s i z e ( ) ) 20

6 班级类 20 return 0 ; 21 return &m_persons [ n ] ; 22 } 23 p r i v a t e : 24 vector<cperson> m_persons ; 25 } ; Group.cpp 1 #include "Group.h" 2 #include <fstream > 3 4 typedef bool (* fun_ptr ) ( CPerson &, CPerson &) ; 5 6 bool comparebyage ( CPerson &a, CPerson &b) 7 { 8 i f ( a. GetAge ( )<b. GetAge ( ) ) return true ; 9 return f a l s e ; 10 } 11 12 // 高级技巧 13 bool comparebycourse ( CPerson &a, CPerson &b) 14 { 15 i f ( a. GetCourseAverage ( )<b. GetCourseAverage ( ) ) return true ; 16 return f a l s e ; 17 } 18 19 // 排序使用函数指针传入不同的比较函数, 实现按照不同标准排序, 20 void s o r t ( vector<cperson> &arry, fun_ptr compare ) 21 { 22 i n t n = arry. s i z e ( ) ; 23 f o r ( i n t i =0; i<n 1; i++) //n 轮 1 24 { 25 f o r ( i n t j =0; j<n 1 i ; j++) 26 { 27 i f (! compare ( arry [ j ], arry [ j +1]) ) 28 { 29 CPerson temp = arry [ j ] ; 30 arry [ j ] = arry [ j +1]; 31 arry [ j +1] = temp ; 32 } 33 } 34 } 35 } 36 37 CGroup : : CGroup( void ) 38 { 39 } 40 41 CGroup : : ~ CGroup( void ) 21

6 班级类 42 { 43 } 44 45 /************************************************************************ 文件格式简单定义 46 47 ************************************************************************/ 48 void CGroup : : LoadFile ( const s t r i n g &f i l e ) 49 { 50 i f s t r e a m i n F i l e ; 51 i n F i l e. open ( f i l e ) ; 52 53 i n t students ; 54 i n F i l e >> students ; // 先读入学生个数 55 m_persons. r e s i z e ( students ) ; // 设置数组大小 56 57 f o r ( i n t m=0; m<students ; m++) 58 { 59 CPerson &student = m_persons [m] ; // 此处为引用, 这样可以对刚刚增加的对象修改属性 60 61 s t r i n g name, gender, phone ; 62 i n t age ; 63 i n F i l e >> name >> gender >> age >> phone ; 64 student. SetInformation ( name, gender, age, phone ) ; 65 66 i n t couses ; 67 i n F i l e >> couses ; 68 f o r ( i n t i =0; i<couses ; i++) 69 { 70 s t r u c t course c ; 71 i n F i l e >> c. coursename >> c. mark ; 72 student. InsertCourse ( c ) ; 73 } 74 } 75 i n F i l e. c l o s e ( ) ; 76 } 77 78 void CGroup : : SaveFile ( const s t r i n g &f i l e ) 79 { 80 ofstream o u t F i l e ; 81 o u t F i l e. open ( f i l e ) ; 82 83 i n t students = m_persons. s i z e ( ) ; ; 84 o u t F i l e << students << endl ; // 先输出学生个数 85 86 f o r ( i n t m=0; m<students ; m++) 87 { 88 CPerson &student = m_persons [m] ; // 此处为引用 89 22

6 班级类 90 o u t F i l e << student. GetName() << endl << student. GetGender ( ) << endl << student. GetAge ( ) << endl << student. GetPhone ( ) << endl ; 91 92 i n t couses = student. CourseNumber ( ) ; 93 o u t F i l e << couses << endl ; // 课程门数 94 f o r ( i n t i =0; i<couses ; i++) 95 { 96 s t r u c t course *c = student. GetCourse ( i ) ; 97 o u t F i l e << c >coursename << endl << c >mark << endl ; // 课程信息 98 } 99 } 100 101 o u t F i l e. c l o s e ( ) ; 102 } 103 104 // 根据年龄排序 105 void CGroup : : SortByAge ( ) 106 { 107 s o r t ( m_persons, comparebyage ) ; 108 } 109 110 // 根据课程平均成绩排序 111 void CGroup : : SortByCourse ( ) 112 { 113 s o r t ( m_persons, comparebycourse ) ; 114 } 115 116 // 根据名字查找学生 找到返回指针, 否则返回 0 117 CPerson *CGroup : : FindPerson ( const s t r i n g &name) 118 { 119 f o r ( unsigned i n t i =0; i<m_persons. s i z e ( ) ; i++) 120 { 121 i f ( m_persons [ i ]. GetName() == name) 122 return &m_persons [ i ] ; 123 } 124 return NULL; 125 } main.cpp 1 #inc lude <iostream> 2 #include "Group.h" 3 using namespace std ; 4 5 i n t main ( ) 6 { 7 CGroup group ; 8 9 group. LoadFile ( "list.txt" ) ; 10 23

6 班级类 11 group. SortByAge ( ) ; 12 group. SaveFile ( "test1.txt" ) ; 13 14 group. SortByCourse ( ) ; 15 group. SaveFile ( "test2.txt" ) ; 16 17 return 0 ; 18 } 24