第四回課題


以下の問題を解き、解答をレポート用紙に記述して提出せよ。

[注意]

1.配列の動的確保

関連→第四回-02

以下の様な動作をするプログラムを作成したい。 さて、このプログラムの実行例は以下のようになるだろう。

配列のサイズ?5
0番目の要素?1.2
1番目の要素?3.5
2番目の要素?0.1
3番目の要素?0.8
4番目の要素?-1.5
平均は0.82です。


ここで、「?」の後の数字は全てコンソールから入力したものである。
配列のサイズ (5) ぶんの数字に対する平均 ((1.2+3.5+0.1+0.8-1.5)/5 = 0.82) が計算されていることがわかる。
もちろん、配列のサイズとして違う値 (5 以外) を入力しても正しく動作しなければならない。

このようなプログラムを作成せよ。

2.queue について

ここでは queue について考えよう。


queue とは 下図に示すように、最初に入れたデータが最初に取り出される (first in first out (FIFO)) ようなデータ構造である。
なお、stack は (first in last out (FILO)) であったことに注意。



ここでは、「queue を配列を用いて実装する」ことを各自で実行してもらう。
じつは queue は配列で実装するには向かないデータ構造なのだが、
この問題を通して queue の性質を学び、なぜ配列で実装するのに向かないかを実感してもらいたい。

さて、 queue を配列に対応させるために上図を書き直したのが下図である。



ここで int 型の変数 tos と tos2 を考えよう。tos は stack の時と同様、 次に push すべき位置を表す。
tos2 は図にあるように、次に pop すべきデータの位置を表す。

では、配列を使った queue クラスを実装してもらおう。
まず、ここでは格納するデータとして char 型を考える。すなわち、 第二回の stack クラスと同じである。

さらに、学習のためにいくつかの制約を設けよう。
まず、「配列を用いる」と書いたが、配列そのものではなく、 第四回-04 で紹介した array クラスを用いることにする。

必要なクラス宣言部は以下のようになるだろう。

#include <iostream>
using namespace std;

// この位置に (1) で編集した array クラスの宣言および定義を挿入する

class queue{

    array p;
    int tos;
    int tos2;
    int size;	

  public:
    queue();       // デフォルトコンストラクタ
    queue(int n);  // 配列のサイズを指定するコンストラクタ

    void push(char ch); // queue に文字をプッシュ
    char pop();         // queue から文字をポップ
};


ただし、第四回-04 で紹介した array クラスのコードは int 型のデータを格納するようになっているので、変更の必要がある (具体的には以下の問題文で指示する)。

また、それに対するクラス定義部は以下のようになる。ただし、枠組のみしか記述していない。

// デフォルトコンストラクタ
queue::queue():p(){

//  ここは自分で記述

}       

// 配列のサイズを指定するコンストラクタ
queue::queue(int n):p(n){

//  ここは自分で記述

}

// queue に文字をプッシュ
void queue::push(char ch){

//  ここは自分で記述

}

// queue から文字をポップ
char queue::pop(){

//  ここは自分で記述

}


ここで、array クラスのオブジェクト p の初期化の部分で、新しい記法を用いた。
それが

…
queue::queue():p(){
…
queue::queue(int n):p(n){
…


なる記述である。これは「初期化子による初期化」と呼ばれるものである。
上は queue クラスのデフォルトコンストラクタが呼ばれたときに、p がデフォルトコンストラクタで初期化される。
一方、下は queue クラスの引数つきコンストラクタが呼ばれたときに、p が p(n) のように初期化される。
これは今後も出て来るのでそういうものかと納得して欲しい。

では、以下に問題を挙げる。


3.

質問、要望などがあれば書く。(ここは成績評価対象にはならない)



←第四回-04 : 演算子のオーバーロード ([] と +)第四回課題解答→

第四回トップページへ

クラスから入る C++