第三回課題


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

[注意]

1.数字の交換

関連→第三回-02

二つの数字の組、例えば (3, 4) があるときに、この数字を (4, 3) と入れ換える関数を作成しようと思い、
以下のような (C 言語的な) プログラムを作成した。

#include <iostream>
using namespace std;

void koukan(int x, int y){

  int tmp = x;
  x = y;
  y = tmp;

}

int main(){

  int x=3;
  int y=4;

  cout << "交換前\n";
  cout << "x=" << x << ", y=" << y << "\n";

  koukan(x,y);

  cout << "交換後\n";
  cout << "x=" << x << ", y=" << y << "\n";

  return 0;
}


このプログラムを実行したが、x, y は正しく交換されなかった (自分でも確認してみよ)。
なぜ正しく交換されなかったのか論ぜよ。
また、x と y が正しく交換されるためにプログラムを変更せよ。

2.AND 素子の働きをするクラス

関連→プログラミング I の復習

本問題では、論理回路の AND 素子の働きをするクラスを作成してもらう。
AND 素子とは、

入力1
入力2
出力
0
0
0
0
1
0
1
0
0
1
1
1


なる真理値表に従って論理値を出力する素子である。

以下の条件を満たすように AND クラスを作成せよ。 さらに、以下の main 関数のような使い方ができるものとする。

int main(){

  int in1, in2;
  AND o;

  in1 = 1;   // 二つの入力の設定
  in2 = 0;

  o.calc_out(in1,in2);     // 二つの入力を渡すことで、メンバ変数 out が計算される

  cout << "input1=" << in1 << "\n";
  cout << "input2=" << in2 << "\n";
  cout << "output="  << o.get_out() << "\n";

  return 0;
}


このとき、結果は以下のようになるはずである。

input1=1
input2=0
output=0

3.ノードとエッジ

関連→第三回-01第三回-02

本問題では、ノードとエッジをプログラミングしてもらう。

ここでは、下図のようなノードとエッジを作成することを目標にしよう。

このために必要な「クラス宣言部」および「クラス利用部」を 以下に提示する。 ソースコードの下に問題 (2) があるので注意すること。

// クラス宣言部

#include <iostream>
using namespace std;

#define EDGE_NUM 2  // ノードに接続可能なエッジの数

class Edge;

class Node{

  private:
    Edge *edge[EDGE_NUM]; // エッジへのポインタの配列。
                          //ここでは、二つのポインタ edge[0] と edge[1] があると思えば良い。
    int edgenum; // 現在接続しているエッジの数

  public:
    // コンストラクタ
    Node();
    // デストラクタ
    ~Node();

    void edgeAdd(Edge *e);  // ノードにエッジを接続
};


class Edge{

  private:
    Node *node;

  public:
    // コンストラクタ
    Edge();

    // デストラクタ
    ~Edge();

    void nodeAdd(Node *n);  // エッジにノードを接続
};
// クラス利用部

int main(){

  Node node0, node1, node2;

  Edge edge1, edge2;

  node0.edgeAdd(&edge1);
  node0.edgeAdd(&edge2);

  edge1.nodeAdd(&node1);
  edge2.nodeAdd(&node2);

  return 0;
}



上の条件を満たすクラスができれば、下記のような利用が可能となるはずである。
このような拡張を施せ。必要ならば、Edge クラスにも必要なメンバ関数などを追加せよ。

原理的には、このように Node と Edge をどんどんつないでいくことで、 より複雑な論理回路のシミュレーションが行えることが理解できるだろうか。

// クラス利用部

int main(){

  Node node0, node1, node2;

  Edge edge1, edge2;

  node0.edgeAdd(&edge1);
  node0.edgeAdd(&edge2);

  edge1.nodeAdd(&node1);
  edge2.nodeAdd(&node2);

//  以下からが追加した部分

  node1.set_out(1);   // 入力1に 1 をセット
  node2.set_out(0);   // 入力2に 0 をセット

  node0.set_from_edges();  // 入力1と入力2から値を取得し、AND 演算の結果を node0 の out に格納

  cout << "input1=" << node1.get_out() << "\n";
  cout << "input2=" << node2.get_out() << "\n";
  cout << "output=" << node0.get_out() << "\n";

  return 0;
}


なお、結果は以下のようになるはずである。

input1=1
input2=0
output=0

4.

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



第三回-03 : 関数の戻り値第三回課題解答→

第三回トップページへ

クラスから入る C++ へ戻る