前に自分で作った関数BodyMassIndex.mを基に、for文とwhile文を使ってBMIを計算してするプログラムに書き換える。やりたいことは、1〜5列まで順に1行目と2行目の値を繰り返し処理することであり、for文を使った場合の完成形は以下のようになる。されに、これをwhile文にも書き換えてみる。
function BodyMassIndex2(data) name = { 'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん' }; for num = 1:5 bmi = data(1,num)/(data(2,num)/100)^2; fprintf(1, ' %s: %.1f \n ', char(name(num)), bmi); end
forでループ処理を記述
for文では、決められた回数だけ繰り返す処理の制御を記述する。BMIを計算する2行をforとendで挟み、forの後に実行回数を設定した変数を記述する。今回のように、繰り返す回数が分かっている反復処理などに有効である。
関数名を変えて保存
ファイルを開いたら、最初に宣言した関数名を変更し、エディタータブにある「保存」の下にある▼をクリックして関数名と同じ名称で保存する。ここでは関数名をBodyMassIndex2(data)にして、BodyMassIndex2.mという名称で保存した。関数名を変更したとき名称の部分に色が着いてファイル名と違うことを教えてくれが、関数名と同じ名称で保存すれば消える。さらに、繰り返し処理する1組の命令を残して他の命令を削除しておく。
表示する名前をcell配列で用意する
変数nameを作り、BMI計算結果を表示するときに挿入する参加者名を代入する。参加者の名前は文字列なので表示名は’ ‘(シングルクォーテーション)で囲み、’ ‘で囲んだ表示名の間は半角空ける。さらに{ }(波括弧)で全体を囲む。この{ }で囲んだ配列変数を「cell配列」といい文字列を扱うときに使う。プログラムにおける配列とはデータを記憶する変数の一つでデータの塊のこと。しかし、配列では同じ形式のデータしか扱えないため、異なる形式のデータを「セル」というコンテナに入れてから並べるようにする。
% 変数nameに表示する名前を用意 name = {'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん'};
行末に「;(セミコロン)」を入れると処理が抑制される。つまり、改行したときにコマンドウィンドウに実行された処理が表示されなくなる。
% 5まで1ずつ増える変数を設定 for num = 1:5
計算処理と出力データの書式設定
配列変数の要素は( 行, 列 )と指定するので、BMIを計算する行ではカウントアップする列の箇所にnumを指定する。
出力設定の行では、「関数(表示先,参加者名:BMI値 改行,文字列(参加者名(何番目か)),左側の参加者の場合に代入する変数)」と記述する。表示する処理結果は文字列なので’ ‘ で囲む。書式設定は、%sで変数内の文字配列(参加者名)を配置、:を入れて%.1fでBMI値を数字として配置、\nで改行するということになる。読み込む参加者はname(num)で設定し、配列nameを文字配列に変換するため関数charに入れる。そのchar(name(num))に代入する変数bmiを指定すれば完成となる。
% BMIの計算結果を代入する変数の作成 bmi = data(1,num)/(data(2,num)/100)^2; % 処理結果の出力設定 fprintf(1, '%s: %.1f \n', char(name(num)), bmi); % 繰り返し処理の終了 end
プログラムの実行
コマンドウィンドウで、変数arrayを読み込んでプログラムを実行する。
>> BodyMassIndex2(array) Aさん: 23.0 Bさん: 18.4 Cさん: 22.0 Dさん: 27.0 Eさん: 23.8
whileでループ処理を記述
while文では、条件が満たされるまで繰り返す処理の制御を記述する。複雑な前処理や後処理が必要な反復処理でよく使われるが、今回は参加者が5名なので同じ条件が満たされるまで繰り返す処理の制御を記述する。for文の場合と違って、処理する列番号をカウントアップしていくときの初期設定が必要になる。
関数名を変えて保存
関数名をBodyMassIndex3(data)にして、BodyMassIndex3.mという名称で保存する。完成したプログラムは以下のようになる。
function BodyMassIndex3(data) name = { 'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん' }; num = 0; while (num < 5) num = num + 1; bmi = data(1,num)/(data(2,num)/100)^2; fprintf(1, '%s: %.1f \n', char(name(num)), bmi); end
初期化
処理する列の番号は1ずつ大きくなるので、最初は0にしておく必要がある。初期値として0を代入した変数numを変数nameの下に記述する。
% 初期値を設定 num = 0;
while文に書き換える
forをwhileに書き換え、変数numが5になるまで処理を繰り返す設定をする。設定が済んだら、コマンドウィンドウで、BodyMassIndex3(array)と入力すれば処理が実行される。
% 変数numの数が5になるまで繰り返す while (num < 5) % 変数numの数は1つずつ増やしていく num = num + 1;
処理結果をテキストファイルで保存
ここまでは、プログラムで処理した結果をコマンドウィンドウに表示してきた。しかし、処理結果はMATLABを終了すると消えてしまうので、テキストファイルとして残すようにする。ファイルは、このままBodyMassIndex3(data)を使う。
BodyMassIndex3(data)を改造する
上記で作成したプログラムを改造する。完成形は以下のようになり、赤文字が追記された箇所になる。
function BodyMassIndex6(data) fileID = fopen('Result.txt','a'); name = { 'Aさん' 'Bさん' 'Cさん' 'Dさん' 'Eさん' }; for num = 1:5 bmi = data(1,num)/(data(2,num)/100)^2; fprintf(1, '%s: %.1f \n', char(name(num)), bmi); fprintf(fileID, '%s: %.1f \n', char(name(num)), bmi); end fclose(fid);
関数の宣言の下にテキストファイルを開く関数fopen()を代入する変数を追加し、endの下に開いたファイルを閉じる関数fclose()を追加する。
fopen()に渡すパラメータは、処理結果を保存するテキストファイル名、, で区切ってaを書く。どちらも’ ‘ でくくること。aはファイルの開き方を指定するパーミッションで、テキストファイルが存在しないときは新規に作成され処理結果が記録される。同名のテキストファイルが存在した場合は、ファイルの末尾に今回の処理結果が追記される。
% 変数名は任意 fileID = fopen('Result.txt','a');
さらに、fprintf()の1行を複製して、処理結果を画面に表示するパラメータを変数に代入するように書き換える。
% 1つめのパラメータ「1」を「fileID」に書き換える fprintf(fileID, '%s: %.1f \n', char(name(num)), bmi);
% コマンドウィンドウからプログラムを実行して確認する >> BodyMassIndex3(array)
現在のフォルダーにResult.txtが作成されるので、ダブルクリックすれば内容がエディターウィンドウに表示される。