今週から第3週まではタートルグラフィックスを使って、プログラミングのもっとも基本的な事柄を学んで行きます。今週の目標は、コンピュータに同じ命令を繰り返し実行させたい場合めに必要となる変数と繰り返しという二つの概念を理解し、それぞれのJavaでの表現方法を学ぶことです。また、ソースコードに日本語のコメントを添え、命令の意味や目的を明記する方法も併せて学習します。
2.1 「繰り返し」とは 2.2 繰り返しを実現するための準備(1)変数 2.3 繰り返しを実現するための準備(2)繰り返し文(while文) 2.4 繰り返しを用いた「正方形を描くプログラム」 2.5 もう一つの繰り返し文(for文) 2.6 コメントについて
今週学習する「繰り返し」の具体例を探すために、先週作成した「正方形を描くプログラム」をもう一度見てみましょう。
class MySecondTurtle extends Turtle{ void start(){ fd(100); rt(90); fd(100); rt(90); fd(100); rt(90); fd(100); rt(90); } } |
上記のプログラムを見ると、同じような作業を繰り返し行うことでプログラムの目的(正方形を描くこと)が実現されている、と解釈することができます。すなわち、ここで言う同じような作業とは「100歩前進して90度右に曲がる」
fd(100); rt(90); |
の部分のことで、この作業を4回繰り返すことで「正方形を描く」という目的が実現されるわけです。「繰り返し」とは、上記のように、同じ命令(群)を繰り返し実行させる場合のことを言います。
このような場合、もっと端的に「<100歩前進して90度右に曲がる>を4回繰り返せ」という風に命令を書くことができれば、プログラムは短くなり便利です。たとえば以下のようにソースコードを書くことができればどうでしょう?
以下を4回繰り返す{ fd(100); rt(90); } |
残念ながらJavaでは直接上記のように書くわけには行きません。しかし多くのプログラミング言語では、特定の命令(群)のある条件の下での繰り返しを指定するための特別な記法が繰り返し文として用意されています。もちろんJavaにもそれは用意されています。
そこで早速、より簡潔なプログラムを書くために繰り返し文を学習したいのですが、その前に一つだけ知っておかなければならないことがあります。たとえば先ほどの正方形を描くプログラムの場合、「4回の繰り返し」が必要となります。この「何回」を指定するためには、繰り返し文とは別に、コンピュータに回数を記憶させるための方法も知らなければならないのです。従って、まずは回数を記憶させる方法を学び、そのあとで繰り返し文の使い方を学習しましょう。
同じことを何回も繰り返すためには、何回繰り返しているのかを数えておく必要があります。人間でも繰り返し何かをするときには、「正」の字を書いて数えたり、指を折って何回繰り返しているのかを数えたりします。
このためにプログラムで用いるのが変数です。変数は本来いろいろな目的に使うことができますが、今回は、回数を数えるためのカウンターであると考えて下さい。
変数の特徴については、まずは以下のように理解しておいてください。
というわけで、早速変数の宣言のしかたを学びましょう。今回のプログラム(正方形を描く、、、)では回数を憶えておくために整数を入れておく変数を用います。整数を入れておく変数を利用する際、宣言は以下のように行います。
int 変数名; |
intとは、整数を意味するintegerの頭文字3文字です。そのあとにスペースを挟んで変数名を書きます。そして最後に忘れずにセミコロン(;)を入れます。たとえば変数名をiとするならば、宣言は
int i; |
となります。
次に、変数に値を入れる方法です。たとえば先ほどの変数iに1という値を入れておくためには次のような文を書きます。
i = 1; |
イコール記号を挟み、左辺に変数名、右辺に入れておきたい値を書きます。変数に値を入れることを代入と呼び、代入を命令する上記の文のことを代入文と呼びます。代入はかならず右辺から左辺に行われることになっています。
右辺には計算式をそのまま書くことができます。たとえば「1+1」の計算をさせ、その結果を変数iに入れて記憶させたい場合、次のように式を書きます。
i = 1+1; |
上記の式には、1)まず右辺の計算「1+1」を行い、2)その結果の値を左辺のiに入れる、という二つの命令が含まれています。すべての命令が完了した時点で、iの値は2になっています。
また、代入文は一見普通の数式と似ていますが、意味が異なることに注意しましょう。あくまでも代入は「右辺の(計算結果の)値を左辺の変数へ放り込む」です。従って次のような式を書くこともあります。
i = i+1; |
この場合、まず右辺の計算「i+1」を行います。もしもこの式を実行する直前の時点でiの中身が1ならば、計算結果の値は2になります。つぎに、この2という値をあらためてiに記憶させます。したがって、この代入文が実行されると、iの中身は1から2へと更新されるわけです。
変数を学んだら、次は繰り返し文です。Javaでは二つの繰り返し文が用意されていますが、まずはそのうちの一つであるwhile文を学習します。while文の書式は次の通りです。
while (繰り返し条件){ 繰り返したい命令文 } |
whileの直後の()内には、どれだけ繰り返すことになるのか、いつ繰り返しをやめたらいいのか、その条件を書いておきます。それがないとコンピュータはいつ繰り返しをやめたらいいのか判断できません。その直後の{とそれに対応する}に挟まれた場所に、繰り返したい命令文を書きます。もちろん複数の命令を書いてもかまいません。たとえば
while (繰り返し条件){ 命令文1; 命令文2; } |
となっている場合なら、「命令文1 → 命令文2」という順序の仕事を、繰り返し条件が指定する間だけ繰り返します。
次に繰り返し回数の制御の仕方です。ここでは先ほど学んだ変数と、次に示す条件式とをうまく組み合わせて使います。たとえば「命令文1」を5回繰り返したいのならば、以下のようにプログラムを書きます。プログラムには解説の便宜上、行番号がふってあります。
1: int i; 2: i=1; 3: while (i<=5){ 4: 命令文1; 5: i=i+1; 6: } |
while文では、条件式の評価結果が真である限り「条件式の評価 → {}内の命令の実行 → 条件式の評価 {}内の命令の実行 、、、」というプロセスを繰り返します。そしてあるとき条件式の評価結果が偽になると、繰り返しをやめます。上記の例では条件式と5行目で変数iを連携させるところがポイントとなります。このようにしておけば、確実に仕事を5回繰り返してくれます。
上記のプログラムの処理の流れをフローチャートで表すと、以下のようになります。
水色の四角は命令の実行を、黄色の菱形は条件の評価を表します。変数iに1が代入されたあと、終了条件の評価が行われます。最初は当然真ですから、以下「命令文1」、「i=i+1」の順序で命令を実行します。そのあとで再び条件の評価、命令の実行、という風に繰り返し、条件が偽になったら繰り返しを抜ける、という仕組みが理解できたでしょうか。これから先、プログラムの流れが複雑になったときに、このようにフローチャートをあらかじめ書いてみて処理の流れを整理すると良いでしょう。
それでは先週作成した「正方形を描くプログラム」を、while文を用いて書き直してみましょう。
class MySecondTurtle extends Turtle{ void start(){ int i; i=1; while(i<=4){ fd(100); rt(90); i=i+1; } } } |
先ほどまでの学習内容を理解していれば、それほど難しくはありませんね。このプログラムの場合、繰り返したい命令はfd(100)とrt(90)でした。これらを実行したあとで、カウンターの変数の値を1増やせば良いわけです。
なお、繰り返し文を用いたプログラムを書く場合、このカウンター変数に最初の値を与える式(このプログラムではi=1のこと)を特に初期化式、繰り返しの最後で変数の値を増やす式(このプログラムではi=i+1のこと)を増加式、とそれぞれ呼ぶことがあります。
また、条件式には<=を用いる以外にも次のようなものがあります。
左辺 >= 右辺 | 左辺の値が右辺より大きい、または等しい時に真 |
左辺 < 右辺 | 左辺の値が右辺より小さい時のみ真 |
左辺 > 右辺 | 左辺の値が右辺より大きい時のみ真 |
左辺 == 右辺 | 左辺の値が右辺と等しい時のみ真 |
左辺 != 右辺 | 左辺の値が右辺と異なる時のみ真 |
三角形を描くプログラムを、while文を用いて書き直しなさい。
Javaにはwhile文以外にもう一つ、for文が繰り返し文として用意されています。for文の書式は以下の通りです。
for(初期化式; 条件式; 増加式){ 繰り返したい命令文 } |
このように記述すると、処理の流れは次のようになります。
基本的にはwhile文と同じ構造ですね。forの直後の()で回数の制御に必要な要素をすべて書いてしまうので、for文を使うとプログラムがさらに簡潔になります。
たとえば「正方形を描くプログラム」をfor文を用いて書き直すならば、以下のようになります。
class MySecondTurtle extends Turtle{ void start(){ int i; for(i=1; i<=4; i++){ fd(100); rt(90); } } } |
増加式にはi++という式(赤字で示した部分)が書かれています。これはi=i+1の省略形です。i=i+1という計算はプログラム中にたびたび登場するため、特に用意されているものです。
また、増加式の代わりに減少式を用いることもできます。i++の逆の意味を持つi--(つまりi=i-1)という命令を用いて、次のように書くこともできます。
class MySecondTurtle extends Turtle{ void start(){ int i; for(i=4; i>=1; i--){ fd(100); rt(90); } } } |
for文を用いて三角形を描くプログラムを作成しなさい。
通常、ソースコードの中に命令として定義されていない文字や言葉が入っていると、コンパイルの際にエラーとなります。しかし以下のようにコメントを表す記号を用いると、その記号が指定する範囲はコンパイラー(コンパイルを行うソフトウェア)が無視するので、その範囲内に日本語で(もちろん英語でも良いのですが)注釈を付けることができます。Javaではコメントのために以下の2種類の記号が用意されています。
一つめは//です。この記号があると、そこから先改行されるまでの1行はコンパイルの際に無視されます。
//この1行は読み飛ばす |
二つめは/*と*/で範囲を囲むやり方です。
/*ここから、、、 、、、、、 、、、ここまでは読み飛ばす*/ |
/*にはじまり*/に終わる範囲をコンパイラーは無視します。その間に改行があってもかまいません。
コメントはどのような用途に用いることもできるのですが、とりわけプログラムに含まれる処理や命令の目的を簡潔に書き表すことができれば、ソースコードは読みやすくなります。たとえば正方形を描くプログラムにコメントを付けてみましょう。
/* 繰り返しの例として正方形を描く 00.4.15作成 */ class MySecondTurtle extends Turtle{ void start(){ // 四角形の各辺を順番に描く int i; for(i=1; i<=4; i++){ fd(100); rt(90); // 四角形の一辺を描く } } } |
上記のプログラムに付けられた三つのコメントは、それぞれ次のような役割があります。
/* 繰り返しの例として...*/ |
プログラム全体の目的を表す。また、あわせて作成日やバージョン情報を記入すると便利。特に見出しコメントと呼ぶ。 |
// 四角形の各辺を... |
プログラム中に記述される命令を、全体の目的を実現するためのより小さな目的の単位(ブロック)に分割した際、それぞれのブロックの目的を表す。特にブロックコメントと呼ぶ。 |
// 四角形の一辺を... |
各ブロックを構成する1行1行の命令の目的を表す。特に行コメントと呼ぶ。 |
つまり、全体の目的である「繰り返しの例として正方形を描く」ことを実現するためには、「四角形の各辺を順番に描く」という下位の目的を実現しなければならず、それを実現するためにはさらに下位の「四角形の一辺を描く」という目的を実現しなければならない、、、、という風に、プログラム全体を目的の階層構造としてとらえ、それをコメントとして反映させているわけです。
このようにするだけでも、あとから見たときにそのソースコードが何をするものなのか、そしてそれがどんな処理によって構成されているのかがすぐに分かり、非常に便利です。これから先にプログラムが長くなると、こういったコメントなしでは、自分が書いたプログラムがいったい何なのか分からないということにもなりがちです。プログラムを作成する際には必ずコメントを付けるよう心がけて下さい。
正三角形と正方形を組み合わせた「家を描くプログラム」を、while文のみを用いて作成しなさい(House02.java)。また、for文のみを用いたものも作成しなさい(House03.java)。なお、これらのプログラムには必ずコメントを付けること。
次のイメージのように星形を描くプログラムを、while文(Star01.java)、for文(Star02.java)それぞれを用いたバージョンを一つずつ作成しなさい。
ちなみに、星を構成する5本の線分の、一本の長さは200です。
>> 目次ページへ