情報処理技術演習 第03回 UMLとC++(2) 第2回目の課題1 n 切手販売を行う自動販売機がある。これをクラス 図を使って表しなさい。 ただし、切手販売クラスは自動販売機クラスを継 承して作成すること。 、そこで利用される n また、自動販売機だけではなく 切手やお金の関係も表現すること。 n 08.Jan.2003 03: UMLとC++(2) - [email protected] 2 第2回目の課題2 p 次のクラス図で表されるBOXクラスを作成しなさい。た だし、それぞれの関数の内容は次のページの通り。 Box - xlen: int - ylen: int - zlen: int + set(x: int, y: int, z: int): void + getX( ): int + getY( ): int + getZ( ): int + show( ): void 08.Jan.2003 03: UMLとC++(2) - [email protected] 3 第2回目の課題2( 2) n Box クラスのメンバ関数の内容 1. set(x:int, y:int, z:int): void n 与えられた各辺の長さx, y, z を xlen, ylen, zlen にそれ ぞれ代入する関数 2. getX( ): int 3. getY( ): int 4. getZ( ): int n オブジェクトの持つ値を返す関数。上から xlen, ylen, zlen の値を返す。 5. show(): void n オブジェクトの持つすべてのメンバ変数を画面に表示す る関数 08.Jan.2003 03: UMLとC++(2) - [email protected] 4 第2回目の課題2( 3) n ただし、main 関数は以下のようにして、その結果も提出 しなさい。 int main() main() {{ int Box box1; box1; Box int x, x, y, y, z; z; int box1.set(10, 20, 20, 30); 30); box1.set(10, box1.getX(); yy == box1.getY(); box1.getY(); zz == box1.getZ(); box1.getZ(); xx == box1.getX(); cout << << “(x, “(x, y, y, z) z) == (“ (“ << << xx << << ‘,’ ‘,’ << << yy << << ‘,‘ ‘,‘ << << zz << << “)¥n”; “)¥n”; cout box1.show(); box1.show(); return 0; 0; return }} 08.Jan.2003 03: UMLとC++(2) - [email protected] 5 第2回目の課題3 p これまでに作成したBoxクラスに対してコンストラクタ、及び、デスト ラクタを付け加えよ。 p なお、それぞれの関数では以下の処理を行う n コンストラクタ § 初期値を(xlen, ylen, zlen)=(100, 100, 100) に設定 n デストラクタ § 現在の (xlen, ylen, zlen) の値を表示 Box - xlen: int - ylen: int - zlen: int + Box( ) + ~Box( ) 08.Jan.2003 + set(x: int, y: int, z: int): void + getX( ): int + getY( ): int + getZ( ): int + show( ): void 03: UMLとC++(2) - [email protected] 6 第2回目の課題4 p 作成したBox クラスを継承して、色を表すメンバ変数を 付け加えたクラス ColoredBox を作成しなさい。 Box ColoredBox - color: string - xlen: int - ylen: int - zlen: int + ColoredBox( ) + ~ColoredBox( ) + set(x: int, y: int, z: int, ccolor: string): void + getColor( ): string + show( ): void + Box( ) + ~Box( ) + set(x: int, y: int, z: int): void + getX( ): int + getY( ): int + getZ( ): int + show( ): void string を利用する場合は #include <string> を始めの部分に挿入すること。 08.Jan.2003 03: UMLとC++(2) - [email protected] 7 オブジェクト指向言語 C++ Object-Oriented Language C++ コンストラクタの引数( 1) n コンストラクタの引数の利用 n オブジェクト生成時に呼ばれるコンストラクタに引 数を渡すことが出来る n n 基本的にはこれまでのコンストラクタと同じ n n クラス名( ) 丸括弧の中に、引数を書き入れることが可能 n 08.Jan.2003 一般の関数と同じように丸括弧の中に記述 例: クラス名(int x, int y) 03: UMLとC++(2) - [email protected] 9 コンストラクタの引数( 2) n コンストラクタの引数の例 Point::Point(int xx, xx, int int yy) yy) {{ Point::Point(int xx; xx == xx; yy; yy == yy; }} クラスの定義 class Point Point {{ class private: private: int x; x; int int y; y; int public: public: void setXY(int setXY(int xx, xx, int int yy); yy); void void show(); show(); void // Point(); Point(); // Point(int xx, xx, int int yy); yy); Point(int }; }; クラスの宣言 08.Jan.2003 03: UMLとC++(2) - [email protected] 引数を追加 10 コンストラクタの引数( 3) n コンストラクタの引数の例( 続き) int main() main() {{ int Point p1(123,456); p1(123,456); Point p1.show(); p1.show(); return 0; 0; return }} 08.Jan.2003 メイン 03: UMLとC++(2) - [email protected] 11 課題1 1. 前回までの課題で作成した Box クラスを変更し、コンストラクタに 引数を与えられるようにしなさい。 p p このことにより、オブジェクト生成時に二つのメンバ変数 xlen, ylen, zlen の初期値を与えられるようになる。 ヒント: これまでBox( ) としてコンストラクタを宣言、定義して いた部分を、 Box Box(int x, int y, int z) - xlen: int と変更して、それらの値を初期値 - ylen: int - zlen: int として代入 レポートとしてプログラムと実行結果 を提出せよ 08.Jan.2003 + Box( x: int, y: int, z: int ) + ~Box( ) + set(x: int, y: int, z: int): void + getX( ): int + getY( ): int + getZ( ): int + show( ): void 03: UMLとC++(2) - [email protected] 12 継承とコンストラクタ(1) n コンストラクタ n n サブクラスのコンストラクタでは、スーパークラスのコンスト ラクタを呼ぶ スーパークラスのコンストラクタに引数がある場合は、コン ストラクタ定義部分で引数を受け渡すよう記述する サブクラスの コンストラクタ スーパークラスの コンストラクタ 08.Jan.2003 03: UMLとC++(2) - [email protected] 13 継承とコンストラクタ(2) n 継承とコンストラクタの例 class Point Point {{ class private: private: int x, x, y; y; int public: public: Point(); Point(); :: }; }; class Point3D Point3D :: public public Point Point {{ class private: private: int z; z; int public: public: Point3D(); Point3D(); :: }; }; 08.Jan.2003 03: UMLとC++(2) - [email protected] 14 継承とコンストラクタ(3) n 継承とコンストラクタの例 n コンストラクタの定義部でスーパークラスのコンストラクタの 呼び方を指定 Point3D::Point3D() {{ Point3D::Point3D() 0; zz == 0; }} この場合は Pointクラスのコンストラクタ としては Point( ) が呼ばれる Point3D::Point3D(int xx, xx, int int yy, yy, int int zz) zz) :: Point(xx, Point(xx, yy) yy) {{ Point3D::Point3D(int zz; zz == zz; }} この場合は Pointクラスのコンストラクタ としては Point(xx, yy) が呼ばれる 08.Jan.2003 03: UMLとC++(2) - [email protected] 15 多重継承( 1) n 多重継承 n 複数のクラスを継承すること n 複数のクラスの属性と操作をそのまま引き継ぐこと SuperClass1 SuperClass2 SuperClass3 SubClass class ク ク ラ ス名 :: public public スーパークラ スーパークラ ス名1, class ラ ス名 ス名1, public スーパークラ スーパークラ ス名2, public ス名2, public スーパークラ スーパークラ ス名3 {{ public ス名3 メンバ定義; メンバ定義; }} 08.Jan.2003 03: UMLとC++(2) - [email protected] 16 多重継承( 2) n 多重継承の例 A B C class AA {{ class private: private: int a; a; int AA public: public: void set(int set(int aa); aa); void :: }; }; class AA AA :: public public A, A, public public B, B, public public CC {{ class class BB {{ .... .... }; }; class private: private: class CC {{ .... .... }; }; class int aa; aa; int public: public: void set(int set(int aaa); aaa); void :: }; }; 08.Jan.2003 03: UMLとC++(2) - [email protected] 17 課題2 n 以下に示すクラス図をもとにプログラムを作成しなさい。 Person Student - name: string # age: int # birthday: string + Person(nname: string, aage: int) + getName( ): string # setName(nname: string): void + Student(nname: string, aage: int, bbirthday: string) + show( ): void Teacher - room: string show は name, age, birthday, room(Teacher クラスの場合のみ) を出力するメンバ関数 08.Jan.2003 + Teacher(nname: string, aage: int, bbirthday: string, rroom: string) + show( ): void 03: UMLとC++(2) - [email protected] 18 課題2( 2) n 実行結果として以下のようになるようにプログラム全体を作成しなさい。 Student: Yamakawa Yamakawa (20) (20) –– Student: Teacher: Nagasaka Nagasaka (36) (36) –– Teacher: N4-521 N4-521 13.Jun 13.Jun 01.Feb 01.Feb n メイン部の一部 Student yamakawa(“Yamakawa”, yamakawa(“Yamakawa”, 20, 20, “13.Jun”); “13.Jun”); Student Teacher nagasaka(“Nagasaka”, nagasaka(“Nagasaka”, 36, 36, “01.FEB”, “01.FEB”, “N4-521”); “N4-521”); Teacher yamakawa.show(); yamakawa.show(); nagasaka.show(); nagasaka.show(); 08.Jan.2003 03: UMLとC++(2) - [email protected] 19 多重定義 n 多重定義( Overload) n 一つの演算子や関数に対して、複数の機能を多重に定義する こと n n 異なる振る舞いをする関数を同じ名前で定義 それぞれは、関数の引数の数と型で区別 § ただし、戻り値の型では区別しない n 戻り値は違っても良い 購入 ( オブジェクトの操作) 買うもの 08.Jan.2003 本 図書券を持って 本屋で購入 文具 文具券を持って 文房具屋で購入 靴 現金を持って 靴屋で購入 03: UMLとC++(2) - [email protected] 20 多重定義( 2) n 多重定義の例 n print 関数 n 引数で与えられた変数の表示 print print_char char型の表示 print_int int型の表示 print_double double型の表示 print_string string型の表示 print 08.Jan.2003 03: UMLとC++(2) - [email protected] 21 多重定義の例 n add 関数– 与えられた二つの引数の値を加える int 型引数が与えられた場合 ⇒ int 型の結果(戻り値) int add(int a, int b); n double 型引数が与えられた場合 ⇒ double 型の結果(戻り値) double add(double a, doube b); n char 型引数が与えられた場合 ⇒ string 型の結果(戻り値) string add(char a, char b); n 08.Jan.2003 03: UMLとC++(2) - [email protected] 22 多重定義の例( 2) n Class の宣言 n 三つの add 関数の宣言 class Calc Calc {{ class public: public: int add(int a, a, int b); b); int add(int int double add(double add(double a, a, double double b); b); double string add(char add(char a, a, char char b); b); string }; }; 08.Jan.2003 03: UMLとC++(2) - [email protected] 23 多重定義の例( 3) n Class の定義( 1) int Calc::add(int Calc::add(int a, a, int int b) b) {{ int int res; res; int res == aa ++ b; b; res return res; res; return }} double Calc::add(double Calc::add(double a, a, double double b) b) {{ double double res; res; double res == aa ++ b; b; res return res; res; return }} 08.Jan.2003 03: UMLとC++(2) - [email protected] 24 多重定義の例( 4) n Class の定義( 2) string Calc::add(char Calc::add(char a, a, char char b) b) {{ string string res, res, aa, aa, bb; bb; string aa == a; a; aa bb == b; b; bb res == aa aa ++ bb; bb; res return res; res; return }} 文字列を 扱う ため、 #include<iostream> <iostream>のほか、 のほか、 文字列を 扱う ため、 #include #include<string> <string> #include が必要 が必要 08.Jan.2003 03: UMLとC++(2) - [email protected] 25 多重定義の例( 5) n Main int main() main() {{ int int i; i; int double d; d; double string s; s; string #include <iostream> <iostream> #include #include <string> <string> #include using namespace namespace std; std; using Calc cal; cal; Calc cal.add(21,34); ii == cal.add(21,34); cout << << "i "i == "" << << ii << << "¥n"; "¥n"; cout cal.add(1.2, 4.3); 4.3); dd == cal.add(1.2, cout << << "d "d == "" << << dd << << "¥n"; "¥n"; cout cal.add('A', 'C'); 'C'); ss == cal.add('A', cout << << "s "s == "" << << ss << << "¥n"; "¥n"; cout return 0; 0; return }} 08.Jan.2003 03: UMLとC++(2) - [email protected] 26 課題3 3. 多重定義の例を実際にプログラミングして、その振る舞 いを調べなさい。 >> レポートとしてプログラムと実行結果を提出せよ 55 ii == 55 5.5 dd == 5.5 AC ss == AC 08.Jan.2003 実行結果 03: UMLとC++(2) - [email protected] 27 課題4 4. コンストラクタの多重定義( オーバーロード) も可能である。そこで、 これまでに作成した Box クラスに対して、 a) 引数を与えない場合 b) x, y 変数のみ値を与える場合 c) すべての変数の値を与える場合 の三つの場合に対応できるコンスト ラクタを作成しなさい。 また、実行結果として上記の変更 が確認できるようなメイン関数部を 作成しなさい。 レポートとしてプログラムと実行結果を 提出せよ 08.Jan.2003 Box - xlen: int - ylen: int - zlen: int + Box( ) + Box( x: int, y: int ) + Box( x: int, y: int, z: int ) + ~Box( ) + set(x: int, y: int, z: int): void + getX( ): int + getY( ): int + getZ( ): int + show( ): void 03: UMLとC++(2) - [email protected] 28
© Copyright 2025 ExpyDoc