ポリモーフィズムでなく配列をもちいた場合のプログラムはこちらです

先のエピソードつづきです



ソーラー「


今度は


ポリモーフィズムでなく


            配列をもちいて


プログラムの実行結果を


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


から


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇

変更してみましょう


まず

最初の


プログラムの実行結果


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


を表示するプログラムは以下のようになっているとします

👇


#include <iostream>


using namespace std;



class Character {



public:

virtual void characterdisplay()= 0;


};


//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません




class CircleCharacter:public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void CircleCharacter::characterdisplay() {


cout << "〇";


}




class StarCharacter :public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void StarCharacter::characterdisplay() {


cout << "☆";


}




class SquareCharacter:public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void SquareCharacter::characterdisplay() {


cout << "□";


}



int main() {


CircleCharacter circle;

StarCharacter star;

SquareCharacter square;


Character* a[18];


a[0]=&circle;

a[1]=&circle;

a[2]=&star;

a[3]=&square;

a[4]=&circle;

a[5]=&square;

a[6]=&star;

a[7]=&square;

a[8]=&circle;

a[9]=&star;

a[10]=&circle;

a[11]=&star;

a[12]=&star;

a[13]=&square;

a[14]=&star;

a[15]=&circle;

a[16]=&square;

a[17]=&circle;


a[0]->characterdisplay();

a[1]->characterdisplay();

a[2]->characterdisplay();

a[3]->characterdisplay();

a[4]->characterdisplay();

a[5]->characterdisplay();


cout << "\n";


a[6]->characterdisplay();

a[7]->characterdisplay();

a[8]->characterdisplay();

a[9]->characterdisplay();

a[10]->characterdisplay();

a[11]->characterdisplay();


cout << "\n";


a[12]->characterdisplay();

a[13]->characterdisplay();

a[14]->characterdisplay();

a[15]->characterdisplay();

a[16]->characterdisplay();

a[17]->characterdisplay();


cout << "\n";


return 0;

}


プログラムの実行結果


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


ソーラー「まずは練習として


このプログラムの以下の部分を

👇


a[0]->characterdisplay();

a[1]->characterdisplay();

a[2]->characterdisplay();

a[3]->characterdisplay();

a[4]->characterdisplay();

a[5]->characterdisplay();


cout << "\n";


a[6]->characterdisplay();

a[7]->characterdisplay();

a[8]->characterdisplay();

a[9]->characterdisplay();

a[10]->characterdisplay();

a[11]->characterdisplay();


cout << "\n";


a[12]->characterdisplay();

a[13]->characterdisplay();

a[14]->characterdisplay();

a[15]->characterdisplay();

a[16]->characterdisplay();

a[17]->characterdisplay();


cout << "\n";

👆


配列を用いて書き換えてみたいと思います」



マックス「なんだ 


こんなんでどうだ?

👇


int i;

for (i = 0; i<6; i++) {

a[i]->characterdisplay();

}


cout << "\n";


for (i = 6; i<12; i++) {

a[i]->characterdisplay();

}


cout << "\n";


for (i =12; i<18; i++) {

a[i]->characterdisplay();

}


なはは ど~だ~



int i;

for (i = 0; i<6; i++) {

a[i]->characterdisplay();

}


for (i = 6; i<12; i++) {

a[i]->characterdisplay();

}



for (i =12; i<18; i++) {

a[i]->characterdisplay();

}


の間に


cout << "\n";


を代入しているのがポイントだ」



てんC「上記の命令文は


さらに


簡単に


以下のように短く書き換えることができるのではないですか

👇


int i;

for (i = 0; i<18; i++) {


a[i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}


マックス「おおっ!短くなった」



ソーラー「ほんとだね!」


if((i+1)%6==0)


cout << "\n";


の部分が見事だね


i+1


6の倍数になるごとに


cout << "\n";


実行されるというわけだね。」


マックス「%はなんだ


古代生物メガネウラか?」


ソーラー「%は剰余演算子といって


左辺の数を右辺の数で割ったときの余りの数を表示する働きがあります


6%6なら


0

を表示し


(i+1)%6なら


(i+1)の数を6の数で割ったときの余りの数を表示する働きがあります


if((i+1)%6==0)

cout << "\n";



(i+1)の数を6の数で割ったときの余りが0なら


cout << "\n";


が実行されて


改行が行われるんだね。


それでは


a[0]->characterdisplay();

a[1]->characterdisplay();

a[2]->characterdisplay();

a[3]->characterdisplay();

a[4]->characterdisplay();

a[5]->characterdisplay();


cout << "\n";


a[6]->characterdisplay();

a[7]->characterdisplay();

a[8]->characterdisplay();

a[9]->characterdisplay();

a[10]->characterdisplay();

a[11]->characterdisplay();


cout << "\n";


a[12]->characterdisplay();

a[13]->characterdisplay();

a[14]->characterdisplay();

a[15]->characterdisplay();

a[16]->characterdisplay();

a[17]->characterdisplay();


cout << "\n";

👆

の部分を


配列を用いて


int i;

for (i = 0; i<18; i++) {


a[i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}

と書き換えた


プログラムを実行してみたいと思います

👇

#include <iostream>


using namespace std;



class Character {



public:

virtual void characterdisplay() = 0;


};


//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません




class CircleCharacter :public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void CircleCharacter::characterdisplay() {


cout << "〇";


}




class StarCharacter :public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void StarCharacter::characterdisplay() {


cout << "☆";


}




class SquareCharacter :public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void SquareCharacter::characterdisplay() {


cout << "□";


}



int main() {


CircleCharacter circle;

StarCharacter star;

SquareCharacter square;


Character* a[18];


a[0] = &circle;

a[1] = &circle;

a[2] = &star;

a[3] = &square;

a[4] = &circle;

a[5] = &square;

a[6] = &star;

a[7] = &square;

a[8] = &circle;

a[9] = &star;

a[10] = &circle;

a[11] = &star;

a[12] = &star;

a[13] = &square;

a[14] = &star;

a[15] = &circle;

a[16] = &square;

a[17] = &circle;


int i;

for (i = 0; i<18; i++) {


a[i]->characterdisplay();


if ((i + 1) % 6 == 0)


cout << "\n";


}

return 0;

}


プログラムの実行結果


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇



ソーラー「プログラムの書き換えに成功したね!



今度は



〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


から


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇

が表示されるよう


プログラムを変更してみたいと思います



表示される絵文字の順番を

1→→→→→

〇〇☆□〇□

2→→→→→

☆□〇☆〇☆

3→→→→→

☆□☆〇□〇

(1,2,3と表示されていきます)

から


←←←←←3

〇〇☆□〇□

←←←←←2

☆□〇☆〇☆

←←←←←1

☆□☆〇□〇


のように

先頭の絵文字から最後の絵文字へと絵文字の並んでいる順番を


           今回は



         ポリモーフィズム


でなく


           配列を用いて



最後の絵文字から先頭の絵文字へと絵文字の並ぶ順番を並べ替えて表示してみたいというわけです」


マックス「 


ポリモーフィズム


でなく


         😊配列を用いて😊


か・・・



ようは


a[0]->characterdisplay();

a[1]->characterdisplay();

a[2]->characterdisplay();

a[3]->characterdisplay();

a[4]->characterdisplay();

a[5]->characterdisplay();


cout << "\n";


a[6]->characterdisplay();

a[7]->characterdisplay();

a[8]->characterdisplay();

a[9]->characterdisplay();

a[10]->characterdisplay();

a[11]->characterdisplay();


cout << "\n";


a[12]->characterdisplay();

a[13]->characterdisplay();

a[14]->characterdisplay();

a[15]->characterdisplay();

a[16]->characterdisplay();

a[17]->characterdisplay();


cout << "\n";


なら

プログラムの実行結果

〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


が表示されるんだろう


この

a[0]->characterdisplay();

a[1]->characterdisplay();

a[2]->characterdisplay();

a[3]->characterdisplay();

a[4]->characterdisplay();

a[5]->characterdisplay();

a[6]->characterdisplay();

a[7]->characterdisplay();

a[8]->characterdisplay();

a[9]->characterdisplay();

a[10]->characterdisplay();

a[11]->characterdisplay();

a[12]->characterdisplay();

a[13]->characterdisplay();

a[14]->characterdisplay();

a[15]->characterdisplay();

a[16]->characterdisplay();

a[17]->characterdisplay();



並び替えを配列をもちいて行えばいいわけだ


つまり


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇

のように


最後の絵文字から最初の絵文字へと並ぶ絵文字の順番を入れ替えて表示されるようにしたいなら


a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

a[9]->characterdisplay();

a[8]->characterdisplay();

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";


a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";



       実行すればいいわけだ



      💖単に命令文の並び替えなので💖


         ポリモーフィズムは


関わってこないわけだ


そこで


この

👇


a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

a[9]->characterdisplay();

a[8]->characterdisplay();

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";


a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";

👆


を配列を用いて表現できればいいってわけだろう


そうすれば


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇


が表示されていたのを


配列を用いて


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇


が表示できたことになるではないか(´▽`*)



そうだな


こんなんでどうだ?

👇


int i;

for (i = 0; i<6; i++) {

a[17-i]->characterdisplay();

}


cout << "\n";


for (i = 6; i<12; i++) {

a[17-i]->characterdisplay();

}


cout << "\n";


for (i =12; i<18; i++) {

a[17-i]->characterdisplay();

}



てんC「上記の命令文は


さらに


簡単に


以下のように短く書き換えることができるのではないですか」

👇


int i;

for (i = 0; i<18; i++) {


a[17-i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}


マックス「おおっ!短くなった」



ソーラー「ほんとだね!


先程と同じく


if((i+1)%6==0)


cout << "\n";


の部分がポイントだね


i+1


6の倍数になるごとに


cout << "\n";


実行されるというわけだね。」



てんC「では


int i;

for (i = 0; i<18; i++) {


a[17-i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}


を使って


プログラムの実行結果


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇


表示してみたいと思います。


そのプログラムはこちらです


👇                       」

#include <iostream>


using namespace std;



class Character {



public:

virtual void characterdisplay()= 0;


};


//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません




class CircleCharacter:public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void CircleCharacter::characterdisplay() {


cout << "〇";


}




class StarCharacter :public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void StarCharacter::characterdisplay() {


cout << "☆";


}




class SquareCharacter:public Character

{


public:


void characterdisplay();//🌞親クラスCharacterのメンバ関数characterdisplay()をオーバーライドしています


};


void SquareCharacter::characterdisplay() {


cout << "□";


}



int main() {


CircleCharacter circle;

StarCharacter star;

SquareCharacter square;


Character* a[18];


a[0]=&circle;

a[1]=&circle;

a[2]=&star;

a[3]=&square;

a[4]=&circle;

a[5]=&square;

a[6]=&star;

a[7]=&square;

a[8]=&circle;

a[9]=&star;

a[10]=&circle;

a[11]=&star;

a[12]=&star;

a[13]=&square;

a[14]=&star;

a[15]=&circle;

a[16]=&square;

a[17]=&circle;


int i;

for (i = 0; i<18; i++) {


a[17-i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}

return 0;

}


プログラムの実行結果


〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇


ソーラー「ポリモーフィズムを用いずに


配列を使って


プログラムの実行結果


〇〇☆□〇□

☆□〇☆〇☆

☆□☆〇□〇



〇□〇☆□☆

☆〇☆〇□☆

□〇□☆〇〇


に変更することができたね


ただ


今の場合は


以下の部分を

👇

a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

a[9]->characterdisplay();

a[8]->characterdisplay();

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";


a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";

👆

for文と配列を用いて


うまく


👇

int i;

for (i = 0; i<18; i++) {


a[17-i]->characterdisplay();


if((i+1)%6==0)


cout << "\n";


}

👆

のように書き換えることができましたが


cout << "😻";

cout << "😻";

cout << "😻";

a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

cout << "😽";

a[9]->characterdisplay();

a[8]->characterdisplay();

cout << "😻";

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";

cout << "😻";

a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

cout << "😸";

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";

👆


のように


関数の並びに規則性がないと


for文と配列を用いて


うまく表現することができません


となると


for文と配列を用いて


cout << "😻";

cout << "😻";

cout << "😻";

a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

cout << "😽";

a[9]->characterdisplay();

a[8]->characterdisplay();

cout << "😻";

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";

cout << "😻";

a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

cout << "😸";

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";

👆


を実行する方法はないのですが


cout << "😻";

cout << "😽";

cout << "😸";

cout << "\n";


全部


親クラスCharacterを継承した別の💖子クラス💖のメンバ関数


characterdisplay()(親クラスの純粋仮想関数characterdisplay()をオーバーライドしています)



の定義に使用すれば



        🌞🌞🌞for文と配列を用いて🌞🌞🌞


cout << "😻";

cout << "😻";

cout << "😻";

a[17]->characterdisplay();

a[16]->characterdisplay();

a[15]->characterdisplay();

a[14]->characterdisplay();

a[13]->characterdisplay();

a[12]->characterdisplay();


cout << "\n";


a[11]->characterdisplay();

a[10]->characterdisplay();

cout << "😽";

a[9]->characterdisplay();

a[8]->characterdisplay();

cout << "😻";

a[7]->characterdisplay();

a[6]->characterdisplay();


cout << "\n";

cout << "😻";

a[5]->characterdisplay();

a[4]->characterdisplay();

a[3]->characterdisplay();

cout << "😸";

a[2]->characterdisplay();

a[1]->characterdisplay();

a[0]->characterdisplay();


cout << "\n";

👆



簡単にまとめて表現することができるようになるんだよ」


マックス「そんなことができるのか! すごいな


どういう仕組みなんだ」


ソーラー「その方法を次からのエピソードでまなんでみようよ


ね ぶーにゃん」


ぶーにゃん「にゃあ~ん😺


にゃにゃ~ん」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る