C++入門

C++で苦しんでいる人を対象に、C++プログラミングを学ぶ上で必要な最低限の事柄を収めた。説明を読んで、例題、練習問題をこなして行くうちに、自然にC++がマスターできるようにしたつもりである。しかし、C++は言語だ。皆さんも経験しているように、言語を習得する最良の方法は、“習うより慣れろ”だ。囲んであるプログラムはすべて自分で打ち込んで、実行してみよう。では、始めよう。まず、C++プログラムの形を見てみよう。

 

一般的なC++のプログラムは次の形をしている。

/***************************************************************************

*Program namefundamental.cpp

*AuthorHisashi Yokota

*DateDec 1,2000

*Purposeintroduce how to write C++ program

****************************************************************************/

前処理句(例えば#include <iostream>)が1行目にくる

//クラスの定義

クラス宣言

{

  データメンバ

public:

    コンストラクタ

  データ関数

};

//コンストラクタの定義

クラス名::コンストラクタ名(仮引数)

{

}

//データ関数の定義

型 クラス名::データ関数名(仮引数)

{

}

//メイン関数

int main(int argc, char *argv[]) 

{         /*main関数の始まり*/

宣言部および定義 (これから用いる変数の型宣言をする)

メインプログラム (重要な部分で、ここの書き方を学んでいく)

}

 

このテキスト内のプログラムには、紙面の都合上プログラムの最初にくるコメントは付けていないが、自分のプログラムには必ずコメントをつけるようにする。

 

実際にプログラムを書いて実行してみよう。使っているエディタやコンパイラにより作業ステップが異なるので、ここでは、gppg++VisualC++での操作方法をあげる。古いコンパイラを使っている人は,1998年に承認されたISO C++準拠のコンパイラに変更しよう。この10年の間にC++は飛躍的な変化を及びだした。,

 

出力ストリーム

例題1.1 画面への出力

Hello world 

              初めてのC++

と画面に表示してみよう。

実行結果

基本事項

C++にはcout(console out)という画面に表示するための出力ストリームが用意されている。使い方はcout << “  “;でダブルクォート内の文字はそのまま表示される。改行するには\nとダブルクォート内で書く。また、段落を取るには\tと書けばよい。Cを学んだ人に一言、printfも使えるがオブジェクト指向の観点からcoutを用いよう。

 

解答 C++で書くと次のようになる。

/* hello.cpp*/

#include <iostream>    // 標準入出力ライブラリの情報を取り込む

int main( )              // 最初の intはこの関数は整数を返すことを意味する。

{                       //  mainの文は大括弧で囲む

std: : cout << “Hello world\n\t初めてのC” << endl;

return 0;  /* Visual C++の場合に必要。*/

}

 

このプログラムをエディタ(vi,emacs)を使って書き、hello.cppという名前を付けて保存する。次に、hello.cppをコンパイルする。

gppまたはg++の場合:コマンドプロンプトから次のように打ち込む

gpp hello.cpp –o hello

g++ hello.cpp –o hello

Visual c++の場合Visual c++を立ち上げ、ファイルを開くでhello.cppを開き、ビルドの下にあるコンパイルをクリックする。

この操作により、hello.exeという実行ファイルができるので、実行させると画面に

Hello world 

              初めてのC

と表示されるはずである。

g++ hello.c -o-oはオブジェクトファイルの生成を意味している。

Visual c++clの場合:コンソールで次のように打ち込む。

              cl hello.cpp –o hello

この操作により,helloという実行ファイルができるので,コマンドプロンプトでhelloと打ち実行させると画面に

Hello world 

              初めてのC

と表示されるはずである。

UNIX(Linux)gppを用いている場合:ターミナルから次のように打ち込む

gpp hello.c –o hello

ここで、実行ファイルにpathが通っていれば、helloと打つと、

Hello world 

              初めてのC

と表示される。

pathが通っていない場合は、./helloと打てば、

Hello world 

              初めてのC

と表示される。

 

キャッチ

Windowsを用いている場合、メモ帳を使って書くとhello.cpp.txtと保存されてしまうので対処が必要である。スタート(右クリック)→エクスプローラ→表示→フォルダオプション→ファイルタイプ→新規で拡張子の関連付けを行う。

 

hello.cppの説明

#include <iostream>は標準入出力のヘッダーファイルを呼び込めという命令である。このヘッダーファイルは、coutというストリームを用いるために必要となる。

int main( )main関数の戻り値は整数で、引数は何もないことを表している。

{から}までがmain関数の中身である。

std::cout は標準出力(ディスプレイ)へ出力させるためのストリームオブジェクト。

<< とは標準出力(ディスプレイ)へ出力させるためのオペレータであり、ダブルクォートからまでは、書いたものがそのまま出力される。

cout内の\nは行を変えろということを意味し、\tはタブを取れということを意味する。これらをエスケープシークエンス(escape sequenceといい、

ダブルクォート内からの脱出をいみする。よく使うエスケープシークエンスをあげると、

\nは改行、\tはタブ、\aはベル、\bはバックスペース、\”の表示、\’の表示などがある。

endl\nと同じ働きをする。

return 0は標準のC++main( )関数では、オプションになっている。ただし,VisualC++を用いている場合は戻り値が必要である。

キャッチ

coutは必ず最後にセミコロン;をつける。

 

もう一つのHello World

/* hello.cpp*/

#include <iostream> 

using namespace std;

int main( )

{

cout << “Hello world\n\t初めてのC” << endl;

return 0;  /* Visual C++の場合に必要。*/

}

3行目の

using namespace std;

により,コンパイラはstd::が必要な部分にはstd::をつけてくれるので,std::coutと書かずにcoutだけでよい。このことにより,大きなプログラムではプログラムが読みやすくなる利点がある。

 

練習問題1.1 次のプログラムの説明およびプログラムを読んで、設問に答えよ。

「プログラムの説明」

次のプログラムを実行すると、以下のようになる。

<実行例>

Mainは最初に動く関数。

coutは表示するための関数。

「設問」プログラムの中の□を埋めて、プログラムを完成せよ。ただし、実行例の2行目の先頭文字は、水平タブのあとで表示されるものとする。

#include <iostream>

/* 1行あける*/

int main( )

{

  std::cout << “Mainは最初に動く関数。   coutは表示するための関数。\n”

}

 

解答 改行してタブを設ければよいので、\n\tが□に入る。

 

例題1.2 出力ストリームへの数値の挿入

次の文章を出力してみよう。

20世紀は2000年12月31日で終わった。

解答

#include <iostream>

using namespace std;

int main()

{

              cout << "20世紀は" << 2000 << "" << 12 << "" << 31 << "日で終わった。" << endl;

}

 

変数とその宣言

変数はコンピュータのメモリへの格納場所を表す記号である。その場所に格納された情報を変数の値という。変数の値を取り出すには,代入が用いられその文法は

              変数 = ;

となる。最初に式が求められ,その結果が変数に代入される。ここで,等号”=”はC++では代入演算子である。

 

例題1.3 

整数44を変数mに代入し,式m + 33の結果をnに代入するプログラムを作成せよ。

解答 

#include <iostream>

using namespace std;

int main()

{

              int m,n;

              m = 44;

              cout << "m = " << m;

              n = m + 33;

              cout << " and n = " << n << endl;

}

実行結果

変数mnは次のように考えることができる。

これはちょうど郵便受けのように考えることができる。変数名mが住所で,44は郵便受けの中身,そして型intが郵便の種類(速達,書留など)である。

 この例題で,変数m,nint m,n;と宣言されているが,同じ型の変数はこのようにまとめて宣言できる。

C++プログラムでは,全ての変数は使う前に宣言されていなければならない。その記述法は

              specifier 型 変数名 初期化節

となる。

 

変数の初期化

多くの場合,変数を宣言するときに同時に初期化を行っておくほうが賢明である。

例題1.4

変数を初期化せずに用いた場合,何が表示されるか。

#include <iostream>

using namespace std;

int main()

{

              int m;

              int n = 44;

              cout << "m = " << m << " and n = " << n << endl;

}

実行結果1.

実行結果1.はg++で行った結果である。

実行結果2.

実行結果2.はVC++で行った結果である。

初期化されていない変数は,それぞれのコンパイラで特別な方法で扱われる。

 

大きなプログラムでは初期化されていない変数がしばしばエラーの原因となるので,変数は初期化するように心がけよう。

 

オブジェクト,変数,定数

オブジェクトとは、アドレス、サイズ、型、値を持ったメモリの一部である。

例えば、オブジェクトn

int  n = 22;

と与えられたとしよう。このとき、メモリのアドレスは0x3fffcd6、サイズは4、型はint、値は22である。

型と値はプログラマーによって決められるが、サイズは使っているコンパイラーによって決められる。例えば、GNU C++ではint はサイズ4だが、Boland C++ではint はサイズ2である。 アドレスは使っているコンピュータのオペレーティングシステムによって決められる。

名前のあるオブジェクトは変数と呼ばれる。この場合nは変数である。C++では変数は値を持った箱と理解すると分かりやすい。箱の名前が変数名で、箱の中身が値と考える。変数名にはなるべく中身が分かりやすい名前を付ける。例えばテストの平均を入れる箱にはtestAverageという名前をつける。この箱の中身が変えられない物を定数という。定数はその型の前にキーワード {\bf const}をつける。つまり,

              const int n = 22;

のようになる。

定数は,宣言されるときに初期化もされなければならない。

 

例題1.5 

定数の指定の仕方

#include <iostream>

using namespace std;

int main()

{

              const char BEEP = '\b';

              const int MAXINT = 2147483647;

              const int N = MAXINT/2;

              const float KM_PER_MI = 1.60934;

              const double PI = 3.14159265358979323846;

}

定数は大文字であらわすのが決まりになっている。

 

入力演算子

C++では入力は,出力と同じくらい簡単である。入力演算子>> (get 演算子ともよばれる)は出力演算子と同じように働く。

例題1.6 入力演算子を用いて型のチェック

#include <iostream>

using namespace std;

int main()

{

              int m,n;

              cout << "2つの整数を入力してください。";

              cin >> m >> n;

             cout << "M = " << m << ", n = " << n << endl;

              double x,y,z;

              cout << "3つの実数を入力してください。";

              cin >> x >> y >> z;

              cout << "x = " << x << ", y = " << y << ", z = " << z << endl;

              char c1, c2, c3, c4;

              cout << "4つの文字を入力してください。";

              cin >> c1 >> c2 >> c3 >> c4;

              cout << "c1 = " << c1 << ", c2 = " << c2 << ", c3 = " << c3 << ", c4 = "               << c4 << endl;

}

実行結果

整数と実数

C++では数値を実数と整数で区別する。もっと詳しくいうと、1/21/2.0ではまったく違う値になる。1/20になり、1/2.00.5になる。

 

練習問題1.2 以下の項目で、実数で表す必要のあるものはどれか。

解答群

ア 体重の平均を計算する。

イ 人数の合計をカウントする。

ウ 実行回数をカウントアップする。

 

解答 体重の平均は小数点を含むので実数

 

表記

C++では10進数(decimal)、8進数(octagonal)、16進数(hexagonal)、指数の表記が可能である。8進数の表記には0を数字の前に付け、16進数では0xを付ける。例えば、10進数40を16進数に直すと

40 = 2×16+8

となるので0x28となる。

指数表記では1.2×10151.2e15と表す。

 


練習問題1.3 以下の空欄を埋めよ。

10進数

16進数

8進数

18

0x25

012

8

 

解答 (ア)0x12 (イ)022 (ウ)37 (エ)045 (オ)10(カ)0xa (キ)0x8

(ク)010

18を16進数で表すと

18 = 1×16 + 2

より0x12. 8進数で表すと

18=2×8 + 2

より022

0x25を10進数で表すと

2×16+5=37

より37。37を8進数で表すと

37=4×8+5

より045

012を10進数で表すと

1×8+2=10

より10。10を16進数であらわと0xa

8を16進数で表すと

8 = 0×16 + 8

より0x8、8進数で表すと

8=1×8+0

より010となる。

表記方法に注意。数値の先頭に「0x」が付くと16進数、「0」が付くと8進数になる。

 

練習問題1.4 以下にC++の記法で表した数字がある。同じ値のものどうしのグループに分けよ。

.25e2, 0x25, 25, 012, 37, 8, 1, e1, 8.e0

 

解答 .25e2=.25×102 =25   0x25=37   012=1.e1  8=8.e0

実数は、「e2」「e1」のように、指数部をつけて表す。「E」でもよい。

 

  C++メイン / 次のページ