プログラミングの6つのミソのうち、最後が「繰り返し処理」である。
•入力
•処理
•出力
•順次処理
•分岐処理
•繰り返し処理
沢山のデータを記録する配列を使うことで、3つのラベルを動かすことができた。しかし、もっとLabelを増やすには、Labelの個数だけプログラムを用意することは面倒なので避けたい。そこで利用できるのが繰り返し処理である。
ここでマスターしたいこと
- for文の使い方を知ること
- for文を使って、演習のプログラムで重複している部分を整理すること
for文の使い方
for文は、指定の条件が成立している間、for文の直後のブロックを繰り返し実行する。配列と組み合わせることで、大量のデータを処理することができる。
for文の基本形
for (初期化式 ; 繰り返す条件 ; 更新処理) { // 繰り返しブロック }
- 基本構造は、for(){}
- for文の後ろの()の中は、以下の3つのブロックがあり、;(セミコロン)で区切る。
- 初期化式
- 繰り返す条件
- 更新処理
- for文の直後の{}の中に、繰り返す条件が成立している間、実行するプログラムを入力する。
for文の動作イメージ
for文は複雑な動きをする。各ブロックの処理手順を図とアニメで示す。よく観察して、動きをマスターしよう。
for文の処理手順
for文の処理手順アニメ
for文のまとめ
- 上記は繰り返しの典型例である。暗記しておくこと。
- 上記で3回繰り返す。
- 繰り返す条件のi<3の3を、繰り返したい回数に変更して使う。
- 繰り返しブロック内の変数iを、制御変数と呼ぶ。
- 制御変数は、繰り返すたびに0から1ずつ数が増えていく。
- 制御変数を、配列の添え字の参照に利用することで、大量のデータを繰り返して処理することができる。
例
0~10までの乱数を5個生成して、その合計を求めるプログラムを以下に示す。
作成手順
- 新しいC#のプロジェクトを作成して、名前をprojForなどにする。
- フォームにButtonを1つ配置する。
- button1をダブルクリックしてコードを開く。
- 乱数を使うためのRandom型のrandを定義する。
- 乱数を5個入れておくための配列datasを定義する。
- コンストラクタで、以下のコードを書く。
- 5回繰り返すfor文を書く。
- 繰り返しブロックで、datas[i]に0~10の乱数を代入する。
- 生成した乱数を「○番目の乱数は、○」と表示する。
- button1をクリックした時の処理内に、以下のコードを書く。
- 合計を求めるためのint型の変数sumを定義して、0を代入。
- 5回繰り返すfor文を書く。
- 繰り返しブロックで、sumにdatas[i]を足していく。
- for文のブロックの下に、sumの表示を作成する。
プログラム
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace projFor { public partial class Form1 : Form { Random rand = new Random(); int[] datas = new int[5]; public Form1() { InitializeComponent(); for (int i = 0; i < 5; i++) { datas[i] = rand.Next(0, 11); MessageBox.Show("" + i + "番目の乱数は、" + datas[i]); } } private void button1_Click(object sender, EventArgs e) { int sum = 0; for (int i = 0; i < 5; i++) { sum = sum + datas[i]; } MessageBox.Show("合計は" + sum); } } }
演習
- 前の項の演習で作成したプログラムの行数を、for文を使って減らす。
考え方
- Labelのデータはすべて配列になっているので、[0]~[2]の添え字を使って、何番目のLabelを処理するかを指定できる。
- 3回繰り返すfor文を作成して、制御変数を添え字にすれば、3つにコピーしたプログラムを1つにすることができる。
手順
- コンストラクタの中で以下を行う。
- 3回繰り返すfor文を作成する。
- vx[1]、vy[1]、vx[2]、vy[2]に乱数を求める行を削除する。
- 同様に、label[1]とlabel[2]の行も削除する。
- vx[0]とvy[0]に乱数を求める行と、label[0]を生成する行を、for文の繰り返しブロックの中に移動。
- vx[0]をvx[i]に、vy[0]をvy[i]、label[0]をlabel[i]に書き換える。
- タイマー処理の中で以下を行う。
- 3回繰り返すfor文を作成する。
- vx[1]、vy[1]、label[1]、vx[2]、vy[2]、label[2]に関連する行をすべて削除する。
- vx[0]、vy[0]、label[0]に関連する行をすべてfor文の繰り返しブロックに移動する。
- vx[0]、vy[0]、label[0]をそれぞれ、vx[i]、vy[i]、label[i]に書き換える。
以上。
まとめ
- for文でプログラムを繰り返して実行することができる。
- for文の処理手順は複雑なので、何度も確認して雰囲気を掴む。
- 繰り返しの基本形は以下の通り。
for (int i=0 ; i<繰り返し回数 ; i++) { //繰り返しブロック }
- 制御変数と配列を組み合わせることで、大量のデータを処理することができる。
関連情報
- for文の繰り返しブロック内では、以下の命令が使える。
- break文は、その場で繰り返しを終了する。
for (int i=0 ; i<100 ; i++) { MessageBox.Show(""+i); if (i == 5) { break; } }
上記のプログラムは100回繰り返すfor文があるが、iが5になったらbreak文で繰り返しが終了する。よって、MessageBoxで表示されるのは「0」「1」「2」「3」「4」「5」だけである。
-
- continue文は、繰り返しブロックの処理をその場で終え、次の繰り返しの確認に移行する。
for (int i=0 ; i<10 ; i++) { if (i<5) { continue; } MessageBox.Show(""+i); }
上記のプログラムは10回繰り返すfor文があるが、iが5より小さい間はcontinueが実行されるのですぐに次の繰り返しに移行する。よって、MessageBoxで表示されるのは「5」「6」「7」「8」「9」だけである。
- 繰り返し処理には以下のwhile()文も使える。繰り返し条件が成立している間、繰り返しブロックが実行され続ける。
while(繰り返し条件) { // 繰り返しブロック }
-
- for文と違い、初期化式や、繰り返す時に行う処理を書く場所がないので、自分で書く必要がある。
- 繰り返しブロック内で、繰り返し条件の変更がないと、繰り返しが終わらない無限ループという状態に陥ることがあるので、使い方には注意が必要である。
- while文の繰り返しブロック中でも、breakとcontinueが使える。