= Programming C++ = <> このページでは、C++でプログラムを一通り書けるようになるまでに知っておくべきことをまとめる。 どんどんコードを書いて実行の様子を確認することがプログラミングを習得する近道なので、数行~数10行の小さいプログラムをたくさん書いていく。 == 簡単なC++プログラムの作成とコンパイル == まずは、プログラミング学習の定番HelloWorldプログラムを書く。helloWorld.cxxというファイルを作り、以下の内容を記述して保存する。ファイルの編集はemacsのようなファイル編集ソフトを使って行う。 helloWorld.cxx (内容は以下の通り) {{{ #include int main(int argc, char* argv[]) { std::printf("Hello, World!\n"); return 0; }}} C++プログラムは必ずmain関数という関数を持っていなけらばならず、プログラムの実行はコンピュータがこの関数を呼び出すところことによって始まる。そして、main関数の中に記述したコードが上から順番に実行されていく。main関数の最後まで到達するか、途中でexit文またはreturn文に遭遇したらその時点でmain関数から抜け出してプログラムが終了する。 helloWorld.cxxのようにC++の文法にしたがって書かれたものをプログラムのソースコードと呼ぶ。ソースコードを基に実行可能なプログラムを作成するには、これをコンパイルする必要がある。ターミナル上で以下のようにg++というコマンドを使ってコンパイルする。ターミナルで入力するコマンドは以下のように先頭を">"で始めるがこの文字を入力する必要はない。 {{{ > g++ -o helloWorld.exe helloWorld.cxx }}} 上のコマンドで、"-o helloWorld.exe"の部分はg++プログラムに-oオプションを指定している部分である。-oはoutputの略でコンパイルした結果を書き出す出力ファイル名である。コンパイルした結果は実行可能形式のファイル(executable)となるので、ここでは拡張子.exeを付けたファイル名を指定しているがファイル名は好きに選んでよい。オプションの後にはコンパイルしたいソースファイル名を指定する。 以下に示す例でも、それぞれのソースファイルはこのようにg++コマンドを使って実行可能ファイルを生成した後でそのプログラムを実行する。 == プログラムの構成要素を習得 == これから、C++でプログラムを書くために知っておくべき知識や構文を列挙する。C++言語によるプログラムの書き方を習得することを目的とするので、ターミナルからコマンドラインで実行できるプログラムを作っていく。 それぞれの項目についてより詳しい説明はC++について解説した書籍かウェブページで検索するかして学習すること。 === 型と変数 === 計算機で扱うデータはメモリ上に配置され2進数で表される。通常、32ビットまたは64ビットをひとまとまりのデータとして扱い、32ビットの2進数をどのように解釈すべきかはそのデータの型によって決まる。同じ0x0000_0001という32ビットデータでもこれを整数値として解釈するか浮動小数点数として解釈するかによってデータの意味するものは異なる。 計算によってメモリ上にあるデータは次々と変化していくが、プログラミングとは望みの計算結果を得るように、計算の仕方や順序を指定することである。プログラミングではメモリ上に配置されたデータを指定するのに、それぞれのデータの型とともにそれらに名前を付ける。これを変数名という。 例えば、 {{{ int a=1; }}} という文はint型(通常32ビット整数)のデータをメモリ上に確保して、そのデータをaという名前の変数としてプログラムの中で使えることを意味している。そして、この変数には1という値が代入されている、すなわち、メモリ上のデータは0x0000_0001というビット列になっている。 以下の型の変数を宣言して値の代入や演算をした後、値を標準出力に出力する。 * 整数型(int, short, long, unsigned int, unsigned short, unsigned long) * 浮動小数点数(float, double) * 文字型(char, unsigned char) * 文字列型(std::string) === 画面に出力する === ターミナルに文字や数値を出力するプログラムを書く。次のプログラムは整数の足し算で100+22を実行するものである。計算結果はターミナル上にテキストで出力される。 {{{ #include int main(int argc, char* argv[]) { std::printf("Hello, world!\n"); int a=100, b=22; std::printf("%d + %d = %d\n", a, b, a+b); return 0; } }}} === コマンドラインからデータを受け取る === {{{ #include int main(int argc, char* argv[]) { std::printf("Number of command-line arguments: %d\n", argc); int i=0; for (i=0; i simpleCalculator.exe 3 + 5 > simpleCalculator.exe 10 - 7 > simpleCalculator.exe 3 * 22 > simpleCalculator.exe 100 / 6 }}} === 数値の演算 === 二項演算子 {{{ +, -, *, /, % }}} <
> 比較演算子 {{{ ==, !=, <, >, <=, >= }}} <
> === 繰り返し構文 === for文、while文、do-while文 === 条件分岐 === if文、if-else文 === 関数の定義と呼び出し === あるまとまった処理を行うのに独自の関数を定義して利用することができる。 長軸と短軸の半径がそれぞれa, bである楕円の面積を求めて、a+b=10という拘束がある中で楕円の面積が最大になるようなa, bの長さを求めたいとする。このような問題に対してa, bを求めるプログラムを作成して数値的に答えを求める。 この問題の場合、与えられたa, bに対して楕円の面積を返すような関数があると便利である。 (a, b) ==> 楕円の面積 これはプログラムの中では2つのfloat変数を受け取って、新たなfloat値を計算することになる。これをC++では以下のように表現する。 {{{ float daen(float a, float b); }}} 最初のfloatが関数が計算の結果返す値の型の指定で、括弧の中が関数に与えるデータのリストである。 daenは関数名で変数名と同じように好きな名前を付けることができる。 === 配列 === {{{ int a[100]; }}} これはint型の長さ100の配列を定義したもので、配列の名前はaである。100個の整数をaという一つの変数で扱うことができる。配列の個々の要素には {{{ a[0], a[1] }}} のように添え字を使ってアクセスすることができる。 上の楕円の問題で (a, b) = (0.1, 9.9), (0.2, 9.8), ...とaの長さを0.1刻みで9.9まで変化させたときに、(a, b, S)の値を画面に書きだすプログラムを作るとき、 {{{ float a[100], b[100], S[100]; }}} のようにそれぞれの設定値及びそのときの面積の値を配列として保管しておいて最後に出力するといった使い方ができる。 === データ構造(クラス) === === オブジェクトの振る舞い(クラス) === === データの共有 === === ポインタ === === STLを使う === ==== std::string ==== ==== std::cout, std::cin ==== ==== std::vector ==== ==== std::map ==== == 課題 == === ばねの問題 === ばねに繋がれた質点の運動をシミュレーションする。