C++のプログラミング

 

1.文字列の扱い

C++は文字列の扱いがCより便利である。まず、次の簡単なプログラムを見よう。

 

プログラム例

-------------------------------------------ここから-----------------------------------------------------

#include <iostream>

using namespace std;

 

int main()

{

        cout << "田中研究室にようこそ!\n";

        return 0;

}

 

説明

C++では、stdio.hではなく、iostreamincludeする。,iostreamがなぜ必要なのか知りたければ、試しに1行目のincludeをコメントアウトしてみればよい(//を先頭につける)

using namespace std;

「名前空間」として、標準(std)を使う(とりあえず、ここではこうすることにする)

cout << 出力文字列;

入力の場合は、

cin >> 変数;

とする。

--------------------------------------------ここまで----------------------------------------------------

 

文字列の扱いの便利さは、formatが不要なだけでなく、

(1) 比較が == でできる。

(2) 文字列の取り扱いに便利な関数を伴っている。

という特徴がある。

 

(1) について

次のプログラム例を見よう。

-------------------------------------------ここから-----------------------------------------------------

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

        string prof;

 

        cout << "知能情報学部です。\n";

        cout << "あなたの好きな教員名を1つ入力してください:";

        cin >> prof;

 

        if (prof == "田中")

                cout << "ありがとうございます!\n";

        else {

                cout << prof << "先生はとてもよい先生ですね。\n";

                cout << "田中もよろしくお願いします。\n";

        }

        return 0;

}

C言語での文字列の比較は、==は使えず、

if (strcmp(prof, “田中”) == 0)

などとしなければならなかったことに注意。

--------------------------------------------ここまで----------------------------------------------------

 

(2)について

プログラム例を見る。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

        string s;

        int len;

 

        cout << "文字列を入れてください:";

        cin >> s;

 

        len = s.length();

        cout << "" << s <<  "" << "の長さは" << len << "バイトです。\n";

 

        return 0;

}

 

string型で定義されている変数であるが、string型はC言語にはなく、C++の仕様で追加されている型である。この型には、長さを返す関数が内包されており、

s.length()

という形で長さを取り出すことができる。

--------------------------------------------ここまで----------------------------------------------------

 

 

 

 

2.クラスについて

 

クラス=データ+手続き

とも言える。非常に関係が深いものとして、諸君が既に知っている、C言語の構造体をまず復習しよう。

 

C言語の構造体はこのようにして定義する。

struct ABC {

int i;

double p;

};

 

C++言語の構造体では、関数も使える。たとえば以下のプログラム例を参照。

 

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//構造体ABCの定義

struct ABC{

        int i;

        int j;

        int func1(){ return i + j;} //C++では関数が使える。C言語の構造体では関数は使えない

};

int main()

{

        ABC pqr; //構造体ABC型の変数 pqrの定義

        int k;

 

        pqr.i=1;

        pqr.j=2;

        k = pqr.func1();

        printf("%d\n",k);

}

--------------------------------------------ここまで----------------------------------------------------

 

次に、構造体ではなく、クラスを使う例を示す。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

        int i;

        int j;

        int func1(){ return i + j;}

};

int main()

{

        ABC pqr; //クラスABCのインスタンス pqrの定義

        int k;

 

        pqr.i=1;

        pqr.j=2;

        k = pqr.func1();

        printf("%d\n",k);

}

 

説明

しかし、これはエラーとなる。クラスの中のメンバーやメンバー関数は、クラスの外からはそのままでは使えない。

クラスの中のメンバーやメンバー関数は、クラスの外からでも使えるものと、使えないものを分けて記述することができる。外から使えるようにするためには、

class ABC {

public:

….

…..

private:

…..

…..

};

とする。構造体は、クラスにおいて、メンバーやメンバー関数全部をpublicにするのと同じであると理解しておくとよい。

クラスの記述の中で、publicprivateを明らかにしない場合は、全部privateとして扱われる。そのため、エラーとなったのである。

動くようにすると、

 

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

        int i;

        int j;

        int func1(){ return i + j;}

};

int main()

{

        ABC pqr; //クラスABCのインスタンス pqrの定義

        int k;

 

        pqr.i=1;

        pqr.j=2;

        k = pqr.func1();

        printf("%d\n",k);

}

 

 

 

ABC pqr;

の部分でのpqrをインスタンスという。

-------------------------------------------ここまで-----------------------------------------------------

 

 

 

 

 

クラスは、単にそれだけではなく、それ以外に知っておくべき基本的事項がある。

 

・メンバー関数の記載方法

(1) インライン関数を使う

上記で書いた方法。短い場合に有効。

(2) スコープ演算子::を使う

 

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

        int i;

        int j;

        int func1();

};

int ABC::func1()

{

        return i + j;

}

int main()

{

        ABC pqr; //クラスABCのインスタンス pqrの定義

        int k;

 

        pqr.i=1;

        pqr.j=2;

        k = pqr.func1();

        printf("%d\n",k);

}

 

--------------------------------------------ここまで----------------------------------------------------

 

・インスタンスを定義したときに実行されるコンストラクタと、インスタンスが消えるときに実行されるデストラクタ

これらは、特殊なメンバー関数である。自動的に実行される。定義の方法も、通常のメンバー関数とは異なっている。

 

次のプログラムを解釈し、実行してみよ。

--------------------------------------------ここから----------------------------------------------------

#include <iostream>

using namespace std;

 

//クラスABCの定義

class ABC{

public:

        int i;

        int j;

        int sum;

        void func1();

        ABC(); //これがコンストラクタの宣言

        ~ABC(); //これがデストラクタの宣言

};

void ABC::func1(){

        sum += j;

}

ABC::ABC()

{

        sum=0;

        cin >> i;

}

ABC::~ABC()

{

        cout << "=" << sum << endl;

}

 

int main()

{

        ABC pqr;

        for (pqr.j=1; pqr.j<=pqr.i; pqr.j++){

                pqr.func1();

        }

}

 

・コンストラクタ、デストラクタは、定義していないときには、「何もしない」というコンストラクタ、デストラクタが自動的に生成され、実行される。

 

・インスタンスはコピー可能

ABC c;

ABC d = c; //コピー

コピーした場合は、「コピーコンストラクタ」が呼び出される。コンストラクタ同様の定義方法であるが、引数がつく。たとえば、

ABC(const ABC& c)

と宣言する。cは仮引数。

 

コンストラクタは、引数があるメンバー関数を使うときには注意が必要。

--------------------------------------------ここまで----------------------------------------------------

応用(入出力)

標準入出力(キーボード入力、画面出力)には、iostreamincludeして、cout, cinを使う。

#include <iostream>
using namespace std;
int main( )
{
  cout << "abc" << endl;
  return 0;
}

 

C++でファイル入力出力には,fstreamを使う。

ifstreamクラスでファイルから入力

ofstreamクラスでファイルへ出力する



-----------------------------------

#include <fstream>

using namespace std;

int main()

{

         ofstream ofs( "test.txt" );

 

         ofs << "testmessage" << 123 << endl;

 

         return 0;

}

同じ内容を、キーボードから入力したファイル名で保存

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main()

{

         string fn;

         cout << "filename? ";

         cin >> fn;

         ofstream ofs(fn);

 

         ofs << "testmessage" << 123 << endl;

 

         return 0;

}

 

 

1回課題

クラスを用いて、次のような動作をするプログラムを作成せよ。

=============================================

データ入力部分

d[0]= 10

d[1]= 8

d[2]= 3

d[3]= 12

d[4]= 20

結果表示部分

1番目に小さい値=3

2番目に小さい値=8

3番目に小さい値=10

4番目に小さい値=12

5番目に小さい値=20

続行するには何かキーを押してください . . .

 

プログラム(穴埋め方式)

 

#include <iostream>

#include <string>

using namespace std;

 

//クラスSORTの定義

class SORT{

public:

        int d[5];

        int i;

        int j;

        int dummy;

        void func1();

        SORT(); //これがコンストラクタの宣言

        ~SORT(); //これがデストラクタの宣言

};

void SORT::func1(){

 

 

}

SORT::SORT()

{

 

 

}

SORT::~SORT()

{

 

 

}

 

int main()

{

        SORT pqr;

        pqr.func1();

}