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