<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>条件文</title><revhistory><revision><revnumber>4</revnumber><date>2010-02-19 06:19:21</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2010-02-19 06:09:27</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2010-02-19 06:02:19</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2010-02-19 05:54:03</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>条件文</title><section><title>流れ図</title><para>プログラムは記述した順に実行されました。 次のようなプログラムがあったとします。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ 文１
 文２
 文３]]></screen></listitem></itemizedlist><para>ここでは、文１～３は代入文かprint文だと考えてください。 このプログラムを実行すると、文１～３はこの順に実行されます。 </para><para>実行の順序を図で表すと次のようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken1.png"/></imageobject><textobject><phrase>jouken1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>処理の流れ（実行順序）を表すための図を流れ図といいます。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件文の書き方</title><para>いつも同じ処理をするだけでなく、場合によって処理内容を変えることができると、もっといろんなプログラムが書けます。 </para><para>条件によって処理内容を変えるための、もっとも基本的な文が <emphasis role="strong">if文</emphasis> です。 </para><para>if文の書き方は </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken2.png"/></imageobject><textobject><phrase>jouken2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>です。 </para><para>丸で囲まれたところはその通りに書きます。 条件のところには、数の比較などが書けます。 文のところには、代入文や print文などが書けます。 </para><para>if文はしばしば数行を使って記述します。 </para><para>例を示します。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( tate > 20 ) {
     wa = tate + 10;
     sa = tate - 30;
 }]]></screen></listitem></itemizedlist><para>書き方と対応させて見ましょう。 丸で囲まれた部分に対応する<emphasis role="strong"> if ( ) { } </emphasis>の位置を確認してください。 </para><itemizedlist><listitem override="none"><para><emphasis role="strong">条件</emphasis>に対応するのは tate &gt; 20 だと分りますね。 </para></listitem><listitem override="none"><para><emphasis role="strong">文</emphasis>に対応するのは wa=tate+10; と sa=tate-30; の２行です。 </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件文の実行</title><para>if文の処理順序は次のようになります。 </para><itemizedlist><listitem override="none"><para>（１） 条件が成り立つか判定する </para></listitem><listitem override="none"><para>（２） 条件が成り立っているときだけ、{ } で挟まれた文を実行する。 </para></listitem></itemizedlist><para>条件が成り立たないときは、（２）では何も行われないことになります。 </para><para>このようなプログラムがあったとします。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ 文１
 文２
 if ( 条件 ) {
     文３
     文４
 }
 文５]]></screen></listitem></itemizedlist><para>このプログラムを流れ図であらわすと、次のようになります。 点線で囲んだ範囲が if文に対応する部分です。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken3.png"/></imageobject><textobject><phrase>jouken3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>処理順序は </para><itemizedlist><listitem override="none"><para>（１） 文１が実行されます。 </para></listitem><listitem override="none"><para>（２） 文２が実行されます。 </para></listitem><listitem override="none"><para>（３） 条件が成り立つか判定されます。 </para></listitem><listitem override="none"><para>（４） 条件が成り立っているときだけ、文３、文４の順に実行されます。 </para></listitem><listitem override="none"><para>（５） 文５が実行されます。 </para></listitem></itemizedlist><para>です。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件</title><para>条件のところには、数値の比較などが記述できます。 他にも論理式を含め、いろいろな条件を記述できますが、この授業では２つの数値の比較のみを扱います。 </para><para>数値とは、リテラルで表された数値、変数名が表す数値、それらを使った数式、関数などのことです。 </para><para>２つの数値が、等しいか、等しくないか、大きいか、小さいかなどの比較ができます。 </para><para>比較を表すには次の記号を使います。 </para><itemizedlist><listitem override="none"><informaltable><tgroup cols="2"><colspec colname="col_0"/><colspec colname="col_1"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para>記号</para></entry><entry colsep="1" rowsep="1"><para>意味</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>==</para></entry><entry colsep="1" rowsep="1"><para>等しい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>!=</para></entry><entry colsep="1" rowsep="1"><para>等しくない</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>&gt;</para></entry><entry colsep="1" rowsep="1"><para>大きい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>&gt;=</para></entry><entry colsep="1" rowsep="1"><para>大きいか等しい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>&lt;</para></entry><entry colsep="1" rowsep="1"><para>小さい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>&lt;=</para></entry><entry colsep="1" rowsep="1"><para>小さいか等しい</para></entry></row></tbody></tgroup></informaltable></listitem></itemizedlist><para>等しいことの判定にはイクオール２つ、等しくないことの判定には！とイクオールです。注意してください。 </para><itemizedlist><listitem override="none"><informaltable><tgroup cols="2"><colspec colname="col_0"/><colspec colname="col_1"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para>例</para></entry><entry colsep="1" rowsep="1"><para>意味</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>maru == 12</para></entry><entry colsep="1" rowsep="1"><para>maruの値が１２と等しい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>hidari &lt; migi</para></entry><entry colsep="1" rowsep="1"><para>hidariがmigiより小さい</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>x + y &gt;= 30</para></entry><entry colsep="1" rowsep="1"><para>x+yの値が３０より大きいか等しい</para></entry></row></tbody></tgroup></informaltable></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>書き方の例</title><para>条件が成り立つときだけ実行される部分を、右にずらして書いています。 このように揃えて分りやすく書きましょう。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( tate > 20 ) {
     wa = tate + 10;
     sa = tate - 30;
 }]]></screen></listitem></itemizedlist><para>print 文も使えます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( tate == 20 ) {
     wa = tate + 10;
     print( '縦が２０です' );
 }]]></screen></listitem></itemizedlist><para>条件が成り立つときだけ実行される部分が１文だけのときは、このように書くこともあります。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( tate <= 20 ) { wa = tate + 10; }]]></screen></listitem></itemizedlist><para>条件が成り立つときだけ実行される部分が１文だけのときは、括弧を省略することもできます。今回は使いません。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( tate != 20 ) wa = tate + 10;]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件文の書き方（１）</title><para>if文の書き方は </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken1.png"/></imageobject><textobject><phrase>jouken1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>であり、処理の流れは図に示す通りです。 図では、いくつかの文をまとめて処理という箱で表しています。 条件が成り立つときだけ、処理の部分を実行します。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken5.png"/></imageobject><textobject><phrase>jouken5.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>この流れ図に対応するif文は次のように書きます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( 条件 ) {
     処理
     
 }]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件文の書き方（２）</title><para>条件が成り立つときとそうでないときで、別の処理をさせたいことがあります。 流れ図で示すような場合です。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken6.png"/></imageobject><textobject><phrase>jouken6.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>条件が成り立つときは処理１を行い、そうでないときは処理２を行います。 </para><para>この流れ図に対応するif文は else を使って次のように書きます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( 条件 ) {
     処理１
 }
 else {
     処理２
 }]]></screen></listitem></itemizedlist><para>処理と書いた部分は、文がいくつか並んだものです。 ｛ と ｝ で挟まれた部分は、このように右にずらして書くと分りやすい。 </para><para>elseを含むif文の構文図はこのようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken4.png"/></imageobject><textobject><phrase>jouken4.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>条件文の書き方（３）</title><para>if文の中の処理の部分には、代入文やprint文だけでなく、if文を書くこともできます。 そうすることで、いくつもの場合に分けた処理を行うことができます。 </para><para>多くの場合に分けるときは、次のように考えます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=jouken7.png"/></imageobject><textobject><phrase>jouken7.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>条件１が成り立つときは、処理１を行い、</para><para> そうではなくて（条件１が成り立たなくて）条件２が成り立つときは、処理２を行い、</para><para> そうではなくて（条件１も条件２も成り立たなくて）条件３が成り立つときは、処理３を行い、</para><para> そうではない（条件１も条件２も条件３も成り立たない）ときは、処理４を行う。 </para><para>この流れ図に対応するif文は次のように書きます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ if ( 条件１ ) {
     処理１
 }
 else if ( 条件２ ) {
     処理２
 }
 else if ( 条件３ ) {
     処理３
 }
 else {
     処理４
 }]]></screen></listitem></itemizedlist><para>if文と流れ図が対応していることを、確認してください。 最初の条件は if で、２番目以降の条件は else if で記述します。 最後は else です。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>例題</title><para>次の図で haba を与えて、面積と周囲の長さを表示する関数 kao を作りなさい。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=menseki13.png"/></imageobject><textobject><phrase>menseki13.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>プログラムのおよその形はこのようになりました。 ３行目以下で計算し、変数 wa に面積を代入しています。 そのあとprint文を使って表示します。面積のみ示していますが、実際は他の表示も必要です。 値を返さないreturn文を使っています。値を返してもかまいません。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ function kao ( haba ) {
     var ...
     ...
     wa = ...
     print ( '面積は', wa, 'です' );
     return;
 }]]></screen></listitem></itemizedlist><para><emphasis role="strong">面積の計算</emphasis> </para><para>面積を計算するには、四角や三角の部分に分けて部分ごとに面積を計算し合計します。 さらに２つの円の面積を計算して、これを引けば求まります。 </para><para>関数の中でprintを行っているので、引数の値を変えて呼び出すことで結果が表示されます。 例えば </para><itemizedlist><listitem override="none"><screen><![CDATA[ js> kao(9);
 幅 9 のとき
 面積は 111.80 です
 js> kao(10);
 幅 10 のとき
 面積は 125.66 です]]></screen></listitem></itemizedlist><para>のようになります。 </para><para>これらは正しく計算されているようですが、引数の値によっては正しく計算できない場合があります。 </para><para>幅６のときを計算させてみると </para><itemizedlist><listitem override="none"><screen><![CDATA[ js> kao(6)
 幅 6 のとき
 面積は 67.98 です]]></screen></listitem></itemizedlist><para>と表示されますが、実際の形と比べてみると正しくないことが分ります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E6%9D%A1%E4%BB%B6%E6%96%87?action=AttachFile&amp;do=get&amp;target=menseki13b.png"/></imageobject><textobject><phrase>menseki13b.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>円の半径が２ですから、幅が８より小さいときは範囲内に２つ並べることができず、はみ出してしまいます。 このような場合は、面積を求めることができません。 </para><para>また幅が２０より大きくなるとアゴの三角形ができなくなり、この場合も面積は求まりません。 </para><para>計算が正しく行えないときは、そのことを表示するようにしましょう。 </para><para>if文を使って </para><itemizedlist><listitem override="none"><para>条件 haba &lt; 8 が成り立つときだけ '幅が小さすぎます' が表示される </para></listitem></itemizedlist><para>ようにします。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ function kao ( haba ) {
     var ...
     ...
     wa = ...
     print ( '面積は', wa, 'です' );
     if ( haba < 8 ) { print( '幅が小さすぎます' ); }
     return;
 }]]></screen></listitem></itemizedlist><para>条件 haba &lt; 8 が成り立つときだけ、print( '幅が小さすぎます' ); が実行されます。 条件 haba &lt; 8 が成り立たないときは、print( '幅が小さすぎます' ); は実行されません。 </para><para>したがって、habaの値が 6 のように８より小さいときにはprintが行われ、 habaの値が 10 のように８より大きいときにはprintは行われません。 </para><para>実行するとこのようになります。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ js> kao(6);
 幅 6 のとき
 面積は 67.98 です
 幅が小さすぎます
 js> kao(10);
 幅 10 のとき
 面積は 125.66 です]]></screen></listitem></itemizedlist><para>実際には、幅が小さすぎるときや大きすぎるときには 面積がを表示しないようにするのがよい。 </para></section></section></article>