C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1
1 圆 1 圆 设计圆类 包含 包含基本属性和基本属性访问接口 计算面积和周长接口 2
1 圆 1 #include <iostream> 2 using namespace std ; 3 c l a s s CCircle 4 { 5 p r i v a t e : 6 double r ; 7 const double PI = 3. 14159265359; 8 public : 9 CCircle ( ) { r = 0 ; } 10 CCircle ( const double r ) { this >r = r ; } 11 12 double GetR ( ) const { return r ; } 13 double Area ( ) const { return PI* r * r ; } 14 } ; 15 16 i n t main ( ) 17 { 18 CCircle c ( 5. 2 ) ; 19 cout << "Circle: " << c. GetR ( ) << ", " << c. Area ( ) << endl ; 20 return 0 ; 21 } 3
2 图书类 2 图书类 设计图书类 包含 基本属性 : 书名, 出版社, 出版日期, 作者 属性 : 是否借出, 该图书的数量 基本接口 构造函数 析构函数 属性访问 从指定文件读取图书信息 将图书信息存放到指定文件 ( 注 : 目的就是为了熟悉类的用法 ) 4
3 图书管理类 3 图书管理类 利图书类构建一个简单的图书管理类 基本属性 : 图书馆名字, 图书 基本接口 添加一本书 根据书名查询一本书 借一本书 还一本书 ( 注 : 和实验 1 的第 6 题类似 图书类可以使用 vector( 参考 ) 来管理图书 录入书是往 vector 添加一个元素, 使用 vector 模板的 push_back() 接口 查询书可以使用遍历 vector 数组的方法进行, 返回结果有两种情况, 没有书或者有书 这时候有两种做法 返回指针, 指针指向查找的书, 如果指针为空表示没有书 返回 bool 类型, 以及传入一个引用参数, 但返回值为 true 时, 传入引用参数将返回查找到的书 借书, 先查询, 如果没有该书, 返回, 如果有, 看看书库拥有该书的数量,>0 表示可以出借, 借出, 数量 -1 还书, 和借书类似 ) 5
3 图书管理类 Book.h 1 #pragma once 2 #include <iostream> 3 #include <s t r i n g > 4 using namespace std ; 5 6 c l a s s Library ; 7 c l a s s Book 8 { 9 f r i e n d Library ; 10 f r i e n d ostream& operator <<(ostream &os, const Book& book ) ; 11 f r i e n d istream& operator >>(istream &i s, Book& book ) ; 12 public : 13 Book ( ) ; 14 Book( const s t r i n g &name, const s t r i n g &author, const s t r i n g &press, const s t r i n g &date, i n t num) ; 15 ~Book ( ) ; 16 17 s t r i n g Name( ) const { return m_name; } 18 s t r i n g Author ( ) const { return m_author ; } 19 s t r i n g Date ( ) const { return m_date ; } 20 s t r i n g Press ( ) const { return m_press ; } 21 i n t Total ( ) const { return m_total ; } 22 i n t Aailable ( ) const { return m_available ; } 23 p r i v a t e : 24 s t r i n g m_name; 25 s t r i n g m_press ; 26 s t r i n g m_date ; 27 s t r i n g m_author ; 28 i n t m_total, m_available ; 29 } ; Book.cpp 1 #include "Book.h" 2 using namespace std ; 3 4 Book : : Book ( ) 5 { 6 m_total = 0 ; 7 m_available = m_total ; 8 } 9 10 Book : : ~ Book ( ) 11 { 12 } 13 14 Book : : Book( const s t r i n g &name, const s t r i n g &author, const s t r i n g &press, const s t r i n g &date, i n t num) 6
3 图书管理类 15 { 16 m_name = name ; 17 m_author = author ; 18 m_press = p r e s s ; 19 m_date = date ; 20 21 m_total = num; 22 m_available = m_total ; 23 } 24 25 ostream& operator <<(ostream &os, const Book& book ) 26 { 27 os << book.m_name << " " << book. m_author << " " << book. m_date << " " << book. m_press << endl ; 28 return os ; 29 } 30 31 istream& operator >> ( istream &i s, Book& book ) 32 { 33 return i s ; 34 } Library.h 1 #pragma once 2 #include <iostream> 3 #include <s t r i n g > 4 #include <vector> 5 #include "Book.h" 6 using namespace std ; 7 8 c l a s s Library 9 { 10 public : 11 Library ( const s t r i n g &name) ; 12 ~ Library ( ) ; 13 14 s t r i n g Name( ) const ; 15 void AddBook( const Book& book ) ; 16 bool SearchBook ( const s t r i n g& bookname, Book& found_book ) const ; 17 const Book* SearchBook ( const s t r i n g& bookname) const ; 18 Book* SearchBook ( const s t r i n g& bookname) ; 19 bool ReturnBook ( const s t r i n g& bookname) ; 20 bool LendBook ( const s t r i n g& bookname) ; 21 p r i v a t e : 22 vector<book> m_books ; 23 s t r i n g m_name; 24 } ; 7
3 图书管理类 Library.cpp 1 #include "Library.h" 2 using namespace std ; 3 4 Library : : Library ( const s t r i n g &name) : m_name(name) 5 { 6 } 7 8 Library : : ~ Library ( ) 9 { 10 } 11 12 s t r i n g Library : : Name( ) const 13 { 14 return m_name; 15 } 16 17 void Library : : AddBook( const Book& book ) 18 { 19 Book *pbook = SearchBook ( book. Name( ) ) ; 20 i f (pbook) { 21 pbook >m_total += book. m_total ; 22 return ; 23 } 24 e l s e 25 m_books. push_back ( book ) ; 26 } 27 28 const Book* Library : : SearchBook ( const s t r i n g& bookname) const 29 { 30 f o r ( unsigned i n t i =0; i<m_books. s i z e ( ) ; ++i ) 31 { 32 i f (m_books [ i ]. Name( ) == bookname) return &(m_books [ i ] ) ; 33 } 34 return NULL; 35 } 36 37 Book* Library : : SearchBook ( const s t r i n g& bookname) 38 { 39 f o r ( unsigned i n t i = 0 ; i < m_books. s i z e ( ) ; ++i ) 40 { 41 i f (m_books [ i ]. Name( ) == bookname) return &(m_books [ i ] ) ; 42 } 43 return NULL; 44 } 45 46 bool Library : : ReturnBook ( const s t r i n g& bookname) 47 { 8
3 图书管理类 48 Book *pbook = SearchBook ( bookname) ; 49 i f (! pbook) return f a l s e ; 50 51 pbook >m_available++; 52 return true ; 53 } 54 55 bool Library : : LendBook ( const s t r i n g& bookname) 56 { 57 Book *pbook = SearchBook ( bookname) ; 58 i f (! pbook pbook >m_available <=0) return f a l s e ; 59 60 pbook >m_available ; 61 return true ; 62 } main.cpp 1 #include <iostream> 2 #include "Library.h" 3 using namespace std ; 4 5 i n t main ( ) 6 { 7 Library l i b ( "BJFU" ) ; 8 Book cppbook ( "C++", "SRW", "20150101", "BJFU", 2) ; 9 Book cbook ( "C", "Master", "20160401", "BJFU", 3) ; 10 l i b. AddBook( cppbook ) ; 11 l i b. AddBook( cbook ) ; 12 13 s t r i n g name = "C" ; 14 const Book *book = l i b. SearchBook (name) ; 15 i f ( book ) 16 cout << " Book is found: " << * book << endl ; 17 e l s e 18 cout << " Book is not found!\n" ; 19 return 0 ; 20 } 9
4 向量类 CVECTOR 4 向量类 CVector 设计向量类 CVector 包含 基本属性 向量长度 向量数据指针 接口 向量的模 ( 分量平方和再开根号 ) 向量归一化 ( 如果向量模不为 0, 向量的每个分量都除以该模 ) 因为使用了动态内存 析构函数里需要删除内存 拷贝 ( 复制 ) 构造函数 赋值运算符编写一个非成员函数来测试拷贝构造函数的调用 不使用引用, 传入两个 CVector, 返回具有较大模的那个 CVector ( 注 : 参照课本 string 的写法 CVector v0 ; CVector v1 = v0 ; // 初始化会调用复制构造函数 v1 = v0 ; // 此处是赋值运算 CVector (FunCVector,v1 CVector )v2// 不是引用, 复制构造函数传入, 的值 v1v2 { CVector r e t ; return r e t ; // 不是引用, 调用复制构造函数返回的值, 即返回 retcvector ( r e t ) } ) 10
4 向量类 CVECTOR Vector.h 1 #i f n d e f VECTOR_H 2 #d e f i n e VECTOR_H 3 4 c l a s s Vector 5 { 6 p r i v a t e : 7 double *m_data ; 8 i n t m_len ; 9 public : 10 Vector ( ) { 11 m_len = 0 ; 12 m_data = 0 ; 13 } 14 Vector ( double *data, i n t len ) ; 15 Vector ( const Vector &v ) ; 16 ~Vector ( ) ; 17 18 Vector operator=(const Vector &v ) ; 19 20 double Magnitude ( ) const ; 21 void Normalize ( ) ; 22 } ; 23 24 #e n d i f Vector.cpp 1 #inc lude <iostream> 2 #inc lude <cmath> 3 #include "Vector.h" 4 5 using namespace std ; 6 7 Vector : : Vector ( double *data, i n t len ) 8 { 9 m_len = len ; 10 m_data = new double [ m_len ] ; 11 12 f o r ( i n t i = 0 ; i < m_len ; i++) 13 m_data [ i ] = data [ i ] ; 14 } 15 16 Vector : : Vector ( const Vector &v ) 17 { 18 m_len = v. m_len ; 19 m_data = new double [ m_len ] ; 20 21 f o r ( i n t i = 0 ; i < m_len ; i++) 11
4 向量类 CVECTOR 22 m_data [ i ] = v. m_data [ i ] ; 23 } 24 25 Vector : : ~ Vector ( ) 26 { 27 i f (m_data) d e l e t e [ ] m_data ; 28 } 29 30 Vector Vector : : operator=(const Vector &v ) 31 { 32 i f (m_data) d e l e t e [ ] m_data ; 33 34 m_len = v. m_len ; 35 m_data = new double [ m_len ] ; 36 37 f o r ( i n t i = 0 ; i < m_len ; i++) 38 m_data [ i ] = v. m_data [ i ] ; 39 40 return * t h i s ; 41 } 42 43 double Vector : : Magnitude ( ) const 44 { 45 double mag2 = 0 ; 46 f o r ( i n t i = 0 ; i < m_len ; i++) 47 { 48 mag2 += m_data [ i ] * m_data [ i ] ; 49 } 50 return s q r t (mag2) ; 51 } 52 53 void Vector : : Normalize ( ) 54 { 55 double mag = Magnitude ( ) ; 56 i f (mag <= 0.00001) return ; 57 58 f o r ( i n t i = 0 ; i < m_len ; i++) 59 { 60 m_data [ i ] /= mag ; 61 } 62 } main.cpp 1 #inc lude <iostream> 2 #include "Vector.h" 3 using namespace std ; 4 5 Vector func ( Vector a, Vector b) 6 { 12
4 向量类 CVECTOR 7 Vector c ; 8 i f ( a. Magnitude ( ) < b. Magnitude ( ) ) 9 c = a ; 10 e l s e 11 c = b ; 12 return c ; 13 } 14 15 i n t main ( ) 16 { 17 double arr1 [ ] = { 3, 6 } ; 18 double arr2 [ ] = { 1, 5, 4 } ; 19 Vector vec1 ( arr1, s i z e o f ( arr1 ) / s i z e o f ( arr1 [ 0 ] ) ) ; 20 Vector vec2 ( arr2, s i z e o f ( arr2 ) / s i z e o f ( arr2 [ 0 ] ) ) ; 21 22 Vector v = func ( vec1, vec2 ) ; 23 24 return 0 ; 25 } 13
5 C++ 简单动画 - 选作 5 C++ 简单动画 - 选作 示例程序是一个简单动画演示 CShape 是简单动画类 请你补上移动豌豆荚, 以及子弹 和僵尸碰撞检测的代码, 使得子弹能击中僵尸 ( 此题很难 ) 14