next up previous
Next: 10 関数定義 Up: octave_kiso_out Previous: 8 多項式に関する演算

Subsections


9 制御コマンド- for, if, while -

制御コマンドを覚えるとプログラミングの幅が大きく広がります。 (と言うよりは、プログラミングのためには、制御コマンドは必須です。) ここでは、代表的な ``if'', ``for'', ``while''について学習します。

9.1 まず、``input'', ``disp''から

対話形式でキーボードより数値などを入力するコマンドを学びます。 それでは以下のようなリストを入力し、新しいファイル名で保存して下さい。
######### program ###############
a = input('How old are you? ');

disp(" You are ")  
disp(a) 
disp(" years old." )
#################################
実行してみます。
[nisimiya@localhost Renshu]$ octave input_1.m
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

How old are you? 35
 You are
35
 years old.
表示されましたでしょうか? 1行目の ``input''文で変数``a''に、年齢を代入しています。 ``disp''というのは()内の変数を画面に表示させるコマンドです。

9.1.1 練習

  1. あなたの家では、子供達は、(年齢)$\times$(300) 円のお小遣いをもらっ てます。年齢を入力し、お小遣いを計算するプログラムを作れ

    (解答例)
    ######### program ###############
    a = input('あなたの年齢は? ')
    
    disp("あなたのお小遣いは ")
    disp(a * 300)
    disp("円です。")
    #################################
    
    (実行例)
    [nisimiya]$ octave ex_7.m
    GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
    Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details, type `warranty'.
    
    あなたの年齢は? 21
    a = 21
    あなたのお小遣いは
    6300
    円です。
    

  2. 英語、数学の点数を入力し、それらの合計点数を表示するプ ログラムを作成せよ。

    (解答例)
    ######### program ###############
    a = input('英語の点数は? ');
    b = input('数学の点数は? ');
    c = a + b;
    disp("あなたの試験の点数の合計は ")
    disp(a + b)
    disp("点です。")
    #################################
    
    
    ######### 実行例 ################
    [nisimiya]$ octave ex_8.m
    GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
    Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details, type `warranty'.
    
    英語の点数は? 87
    数学の点数は? 95
    あなたの試験の点数の合計は
    182
    点です。
    #################################
    

9.1.2 演習

  1. 英語、数学、物理の点数を入力し、それらの合計点数、平均点数を表示するプ ログラムを作成せよ。

9.2 if 文について

``if''を使ってプログラムを書くときは、図のような書式になります。
\includegraphics[width=6cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Computer_kisoron/Octave/Fig/if_basic.eps}
それでは具体的な例で説明してみましょう。次のプログラムを入力し、新しいファ イル名で保存してみて下さい。
######### program ###############
a = input('試験の点数を入力して下さい。 ');

if a < 60
  disp("あなたは、不合格です。")
else
  disp("あなたは、合格です。")
endif
################################
実行してみましょう。

######### 実行例 ################
[nisimiya]$ octave if_1.m
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

試験の点数を入力して下さい。 45
あなたは、不合格です。

[nisimiya]$ octave if_1.m
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

試験の点数を入力して下さい。 69
あなたは、合格です。

#################################
条件文が「真」のとき「処理1」が実行され、条件文が「偽」のとき「処理2」 が実行されます。

条件文には、以下のような式を書きます。

条件文 判断内容
$a==b$ aとbが等しい場合真になる
$a\sim =$ aとbが等くない場合真になる
$a>b$ aがbより大きい場合真になる
$a<b$ aがbより小さい場合真になる
$a>=b$ aがbより大きいか等しいとき真になる
$a<=b$ aがbより小さいか等しいとき真になる
$!(条件1)$ (条件1)が成り立たないとき真になる
(条件1) && (条件2) (条件1) と(条件2)がともに成り立つとき真
(条件1) $\vert$ $\vert$ (条件2) (条件1) と(条件2)がの内のどちらかが成り立つとき真

処理を3つに分岐したい場合はどのようすればよいか?

\includegraphics[width=6cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Computer_kisoron/Octave/Fig/if_basic2.eps}

9.2.1 練習

以下の問題を考えてみましょう。
  1. あるビュッフェタイプのレストランは、以下のような料金体系になってい る。 年齢を入力したとき、料金を表示するプログラムを作成せよ。

    $16歳未満 \Rightarrow (年齢)\times 80円$ $16-64歳 \Rightarrow 1500円$ $65歳以上 \Rightarrow 1000円$

    (解答例)
    ############# Program ###############
    a = input('あなたの年齢を入力して下さい。 ');
    
    if (a > 0) &&  (a < 16)
       disp("あなたの食事料金は ")
       disp(a * 80)
       disp("円です。")
    elseif (a >= 16) && (a < 65)
       disp("あなたの食事料金は ")
       disp(1500)
       disp("円です。")
    elseif a >= 65 
       disp("あなたの食事料金は ")
       disp(1000)
       disp("円です。")
    elsif
    disp("範囲外の年齢です。")
    endif
    ############# ここまで ###############
    
    
    以下は実行例です。
    ############## 実行例 ################
    [nisimiya]$ octave sei_2.m
    GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
    Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details, type `warranty'.
    
    あなたの年齢を入力して下さい。 32
    あなたの食事料金は
    1500
    円です。
    ############## ここまで ##############
    

  2. テストの得点を入力し、60点未満は「あなたは不可デス。」、60点から 79点までは「あなたは良です。」、80点以上なら「あなたは優デス。」と 表示させるプログラムを作れ。

  3. 以下のように入力された月に応じて季節を表示するプログラムを作成せよ。
    
    aa, aa, aa aaaa aaa 
    
    3, 4, 5 $\Rightarrow$ 月は春です。
    6, 7, 8 $\Rightarrow$ 月は夏です。
    9, 10, 11 $\Rightarrow$ 月は秋です。
    12, 1, 2 $\Rightarrow$ 月は冬です。
    ### 実行例 ###
    Please input month. 8
    8
    is summer.
    

9.3 for文について

``for''文は、ある処理を繰り返し実行したいときに使います。 構文は下図のような形です。
\includegraphics[width=8cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Computer_kisoron/Octave/Fig/for_basic1.eps}
``n''にベクトルの各要素が順次代入され、``end''までの命令が実行されます。 ``sum''を使わずに、 ``for''文を使って1から10までの和を計算してみましょう。 以下のようなリストをつくって実行して下さい。
############## Program ###############
p = 0;
 for n = [1 2 3 4 5 6 7 8 9 10]
 p = p + n;
end
disp(p)
############## ここまで ##############
ベクトルは、"n = 1:1:10;"と書いてもよいですね。 それでは、1から1000まで2乗の和を求めてみましょう。 すなわち、`` $1 + 4 + 9 + \dots + 1000000 $''
############## Program ###############
p = 0;
 for n = 1:1:10000;
 p = p + n*n ;
end
disp(p)
############## ここまで ##############

実行例を以下に示します。

nisimiya]$ octave test.m
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

 3.3338e+11

表示される桁をもう少し増やすにはどうすればよいか? 例えば20桁まで表示させたければ ``output_precision = 20''などと、プログラムの上の方に書き込んでおきます。

############## Program ###############
output_precision = 20
p = 0;
 for n = 1:1:10000;
 p = p + n*n ;
end
disp(p)
############## ここまで ##############
実行してみて下さい。

9.3.1 演習

  1. 数列の和 $0.1 + 0.2 + 0.3 + \cdots 99.9 + 100$を ``for''文を使って求め よ。
  2. $30!$ (30の階乗)を計算するプログラムを作成せよ。表示桁は適当に設定 せよ。(output_precision = XXX)
  3. $1/1+1/2+1/4+1/8+1/16+ .....$を第5項まで計算せよ。また、第50項まで 計算せよ。(ヒント:各値の分母は $2^0, 2^1, 2^2, 2^3,\cdots$と表せる。)
  4. 1から20までの整数のうち、奇数だけを表示するプログラムを作成せよ。

9.4 while文について

次は ``while''文について練習します。 ``while''は、下図のような構文になっており、条件文の条件が満たされるまで ``end''までの処理が実行されます。

\includegraphics[width=8cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Computer_kisoron/Octave/Fig/while_basic1.eps}

例えば、先ほどの1から10までの和を ``while''を使って計算してみましょう。 以下のようになります。

############## Program ###############
p = 0;
n = 0;
while n <= 10
  p = p + n
  n = n +1;
end

disp(p)
############## ここまで ##############

``p = p + n''の後に、セミコロンを敢えて入れてません。 pの値がどのように変化していくか表示されています。

############## 実行例 ################
[nisimiya]$ octave while_1.m
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

p = 0
p = 1
p = 3
p = 6
p = 10
p = 15
p = 21
p = 28
p = 36
p = 45
p = 55
55

############## ここまで ##############

9.4.1 演習

以下の演習をやってみましょう。
  1. ``while''を使って、30!を求めよ。
  2. ``while''を使って、 $2^0+2^1+2^2+2^3+2^4+2^5+ \cdots + 2^{16}$ を求め よ。
  3. ``while''を使って、

    \begin{displaymath}
1/1 + 1/3 + 1/5 + 1/7 + 1/9 +\cdots
\end{displaymath}

    の式の第10項までもとめよ。また、50項まで求めよ。
  4. 入力した値の階乗を計算するプログラムを作成せよ。但し、入力した値が マイナスの時は、``Can not get answer.''を表示させよ。 ヒント: ``while'' と``if''を使う。
  5. $1 + 3 + 5 + 7 + \cdots$を計算し、はじめて1000を超えるのは、何項目 かを求めるプログラムを作成せよ。


next up previous
Next: 10 関数定義 Up: octave_kiso_out Previous: 8 多項式に関する演算
Nobuo Nishimiya
平成20年6月3日