C++演習(2014年4~5月)

目標

素粒子物理の分野で良く使われるデータ解析用のソフトウェアROOTを使うのに必要なC++プログラミングの知識を習得する。

内容と進め方

プログラミングは文法を正確に覚えることよりも、とにかくコードを書いて慣れることが重要である。したがって、文法事項を順番に説明することはせず、ソースコード例を用いる。用意されたソースコードは、コンパイルして実行すること。できれば、ソースコード中の変数の値や論理を少し変更して、コンパイル・実行してプログラムの動作を検証するということを自分でやってみること。 小さな文法的なミスのせいでコンパイルができない、ということは頻繁にあるが、それを解決するには経験を積むのが一番である。上達するにはとにかく自分でコードを書いて、コンパイル、実行するということを何度も繰り返すことが重要である。

スライド: 201404-CppTutorial.pdf 201404-CppTutorial.pptx

事前準備

演習を進めていく上で、環境変数をいくつか設定する必要がある。これは、システム全体で共用され、通常ソフトウェアのインストール先、その他のディレクトリ名、外部サーバー名等を設定して様々なプログラムで参照できるようにするものである。 ログインした際に自動的に初期設定を行うファイル(~/.zshrc)を編集して、以下の行を加える。(これは共通アカウントに対しては設定済み)

export ROOTSYS=/nfs/opt/root-v5-34-07
a=$(pwd); cd $ROOTSYS; source ./bin/thisroot.sh; cd $a;
export OCHA_SVN=svn+ssh://hpx.phys.ocha.ac.jp/var/svn/repos
alias start_ssh_agent=`eval $(ssh-agent)`

環境変数が設定されているかどうかは、

echo $ROOTSYS;

のように、環境変数名の先頭に'$'を付け加えてその値を書き出させることで確認できる。または、printenvで全ての環境変数を表示することができる。

ソースコード

演習で使うプログラムのソースコードは、 Subversionレポジトリ においてある。

svn co $OCHA_SVN/Lab/Tutorials

環境変数OCHA_SVNが設定されていない場合は、以下のコマンドを実行する。コマンドで実行した場合、次回ログインした際には、もう一度行う必要があるため、初期設定ファイルで行っておくと良い。

export OCHA_SVN=svn+ssh://hpx.phys.ocha.ac.jp/var/svn/repos

Subversionの使い方

Subversionはソースコード管理に使用するためのソフトウェアで、ファイル一括して管理するため複数の人でコードを共有する場合に便利である。また、更新履歴も管理してくれるため、間違ったコードをアップロードしても容易に以前のバージョンに戻すことができる。使用するには、svnというコマンドに引数でサブコマンドや他の情報を指定する。良く使うものは、

svn co <URL>

レポジトリ(サーバー)のURLを指定して、コードをcheckoutする(=ダウンロード)

svn update

サーバー上の変更をローカルに反映させる

svn status -u

ローカルなファイルとサーバー上のファイルの違いを調べる

svn diff

ローカルとサーバー上のファイルの中身を一行ずつ比較する

svn co -m <コメント>

ローカルなファイルへの変更をサーバー上に反映させる(=アップロード)

svnコマンドを使用して、サーバーに接続する際にパスワードを聞かれます。毎回聞かれるのが面倒な場合は

start_ssh_agent
ssh-add

を一度前もって実行しておくと、以後パスワードは聞かれなくなります。

第2回

環境設定

前回、ソースコードをダウンロードして、環境設定、プログラムのコンパイル、実行ができるようになった。但し、改めてログインするため、各自の作業ディレクトリ等の環境設定をする必要がある。

cd ~/<自分のディレクトリ>/Tutorials; # <自分のディレクトリ>の部分は適切なディレクトリ名に置き換える
source ./TutorialSetup/setup.sh

今回は共通アカウントを使っているため、これはログインする度に行う必要がある。自分のアカウントを使っている場合は初期設定ファイル(~/.zshrc)に加えても良い。

もう一つ、svnコマンドを使うたびにパスワードを聞かれるが、これを避けたい場合、

start_ssh_agent
ssh-add

を実行する。こうすると、Subversionレポジトリのあるマシンに接続する際に使用するsshコマンドにパスワードを登録することができ、毎回パスワードを入力する必要が無くなる。

CppTutorial1のプログラムの中身の確認

プログラム名

実行例

コメント

Add_1plus2.exe

 ./Add_1plus2.exe 

1+2=3に特化したプログラム

Add_Aplus2.exe

 ./Add_AplusB.exe 12 34 

実行時に2つの数値を指定できる。コマンドライン引数

Calculate_AandB.exe

 ./Calculate_AandB.exe - 100 31 

実行時に四則演算も指定できる。プログラム内で条件分岐

それぞれのプログラムのソースコードをファイルを見て確認する。

繰り返し(for構造)

課題

1から100までの和を計算する

プログラムを一から作成する練習として1から100までの整数を全て足して和を求めてみる。答えは5050になるはずである。以下の手順は、プログラムを書く際に、途中で何度かコンパイル・実行をしてコードに誤りが無い事を確認しながら進めている。この通りにする必要はないが、一般にもっと大きなプログラムを書く際は、全体をいくつかの部分に分けそれぞれが正しく動作していることを確認しながら書くことになるので、ここでやる方法が少しは参考になるであろう。

  1. main関数を用意する。int main(int argc, char* argv[]) { }
  2. main関数内にforループを用意する。for (int i=1; i<=100; i++i) { }

  3. forループ内にprintf("i=%d\n", i);を入れて、この時点でコンパイル・実行して、"i=1", "i=2", ...という出力が得られることを確認する
  4. forループの前にint sum=0;、ループ内にsum += i;、ループの後にprintf("sum=%d\n", sum);を追加する。
  5. 再度、コンパイルして実行する。

前のプログラムを少し変更してみる

1から100までの和を計算するのではなく、例えば以下のような計算をしてみる

浮動小数点数の計算