第2回 入出力プログラミング
コマンドライン引数
数値パラメータや文字列の変更が予定されているプログラムについては、数値や文字列を変更してその都度コンパイルするのではなく、プログラム実行時に引数を与えるべきである。
以下のプログラムを入力し、コンパイルして、実行せよ。
なお、実行時には以下のように引数をつけて実行すること。
Z:\compmech\ex2> argtest hogehoge
また、以下のように引数の個数が1ではない場合は、エラーが出ることを確認せよ。
Z:\compmech\ex2> argtest
Z:\compmech\ex2> argtest hogehoge fugafuga
補足
以上の引数の個数に関するエラーは、プログラム中の以下の箇所によって処理されたものであることがわかると思います。
if (argc != 2) { // コマンドライン引数が1個ではない場合はエラーとする
argc は、コマンドラインに文字列配列がいくつ与えられたのかを表す値が格納されます。
実行時引数をまったくつけなかった場合、argc には 1 が入ります。
今回のプログラムは、argc が 2 の場合に動作するよう想定されたものになっています。
数値をコマンドライン引数とする場合
コマンドライン引数は文字列としてmain関数に渡されるため、この値を数値として利用するためには、文字列を数値に変換する関数 atoi および atof を利用する必要がある。
atoi 関数 および atof 関数については検索して使い方を調べること。ヘッダファイルの定義が必要。
おまけ
例えば、コンパイル作業自体もコマンドライン引数を利用したプログラムの一例であるといえる。
Z:\compmech\ex2> bcc32 hogehoge.cpp
ファイル入出力
何らかの処理を行うプログラムは、その演算結果をファイルに保存して記録をのこしたり、他のプログラム(自作のものや、Excelのような表計算やグラフ化プログラムなど)に渡す必要がある。従って、殆どすべてのプログラムで何らかのファイル入出力が必要となる。ここでは、もっとも基本的なプログラムである、ファイル入出力のプログラムを作成することを通して、C言語によるプログラミングの復習を行う。
C言語によるプログラミング上の注意
関数を書く時の常識
- 関数は出来るだけシンプルにし、複雑になる時は分割する。
- グローバル変数は出来る限り使わない。
- コメントを沢山いれる。
- 行頭にはタブをいれてインデントをキチンと合わせる。
- ソースコードの上方に呼び出される側の関数を、ソースコードの下方に呼び出し側の関数を書くと、コンパイル時のタイプチェックが自然に行われ、型宣言を行う必要も無くなる。
メイン関数を書く上での常識
- メイン関数はプログラムコードの最後に書く。
- メイン関数にはセットアップや終了手続きのみ書く。
プログラム例
注意
以下のファイル名を用いると、コマンドは次のようになる。
Z:\compmech\ex2> filetest inputdata.txt outputdata.csv
入力ファイル例 (inputdata.txt)
147 0.369
258 0.147
369 0.258
ファイル出力結果の例 (outputdata.csv)
147, 0.369, 54.243
258, 0.147, 37.926
369, 0.258, 95.202
画面出力結果
147 x 0.369 = 54.243
258 x 0.147 = 37.926
369 x 0.258 = 95.202
課題 (提出〆切:金曜日22時)
- 上のプログラムの間違いを修正し、適当な入力ファイルを用いて実行させよ。修正を加えたプログラムを提出のこと。ファイル名は 2_1.cpp
とする。
-
a_mat.csv には7行8列の行列 A を表すデータ列が格納されており、
b_mat.csv には8行9列の行列 B を表すデータ列が格納されている。
行列の乗算 A * B を行い、結果を画面に出力するプログラムを作成せよ。
課題2のヒント
-
A が m 行 p 列の行列、B が p 行 n 列の行列であるとする。
これらの行列の積を C (C = A*B)とすると、C の i,j 要素 C(i,j) は、A の i 行目と B の j 列目の内積となる。
これを数式で表すと、次のようになる。
課題の提出について
Oh-o! Meijiを利用して提出せよ。提出期限は金曜日の22:00までとする。
課題のサンプルプログラム