こんにちは。ECF代表のヒガです。
はじめに
アルゴリズムとは、コンピューターに行わせる計算手順のことです。自在にプログラムを作るには、プログラム言語の文法の知識とともにアルゴリズムの考え方を身につけることが必要になります。
アルゴリズム技法習得の肝は「繰り返し」の活用です。この連載では、簡単な題材で繰り返しを使うアルゴリズムの基本パターンを練習していきます。
演習問題の一覧や勉強スタイルについてのアドバイスはこちらからどうぞ。
Q022 九九表
かけ算九九の表(答えのみ)を表示させてください。数と数の間は半角スペースで区切ります。
実行例は次のとおりです。
アルゴリズムによっては、各行の最後に余計な半角スペースが入るかもしれませんが、Q019のカンマとは違って目に見えないのでそのまま許容します。(もちろん、個人の課題として、半角スペースを入れないアルゴリズムを考えるのも良いことです。)
ヒント
縦と横に数が並んでいますので、かけ算の計算と結果の表示を二重ループで繰り返すことになります。まずはQ005の基本の二重ループを確認し、その上で今回の繰り返し対象を検討しましょう。
解答例と解説
考え方
解説の前に、ここでは説明をわかりやすくするため、一般的に目にするかけ算九九の表とは違って、横方向に「○の段」の答えが並ぶと考えます。かけ算の性質(かけられる数とかける数をひっくり返しても答えは同じ)から、表示結果に影響はありません。あくまで考え方の説明のためです。
繰り返しの中に繰り返しがある「二重ループ」の例となります。
まず最初に「何を繰り返す」かを考えます。二重ループということで、小さな繰り返しと大きな繰り返しに分けて考えましょう。
小さい繰り返しは各行(段)の表示です。各行は
- 行番号(段数)×列番号の計算結果を表示する
の繰り返しです。列番号は1から9の値が対応します。さらに、今回の区切り文字は半角スペースですので、そこも踏まえると、
- 行番号(段数)×列番号の計算結果を表示する
- 半角スペースを表示する
の繰り返しとなります。
この繰り返しを繰り返すのが大きな繰り返しです。つまり、
- 「行番号(段数)×列番号の計算結果と半角スペースを表示する」の繰り返し
を繰り返す、ということです。行番号(段数)は1から9の値が対応します。
箇条書きでまとめると、
- 次の動作を1の段から9の段まで繰り返す
- 次の動作を列数の1から9まで繰り返す
- 段数×列番号の計算結果を表示する
- 半角スペースを表示する
- 改行する
- 次の動作を列数の1から9まで繰り返す
という流れになります。1.2の「改行する」を忘れないよう気をつけましょう。
フローチャート例
行ループが「段」に対応します。かけ算の計算はカウンタ変数iとjを使って、「i × j」となります。
Javaでの実装例
public class Q022 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { // iの段を表示する int ans = i * j; System.out.print(ans); System.out.print(' '); // 半角スペースで区切る } System.out.println(); // 行(iの段)が終われば改行 } } }
上のフローチャートからは少しだけ処理を増やし、かけ算の計算は5行目で行い変数ansに代入、6行目の表示はその変数ansを表示、としました。変数ansを使わず
System.out.print(i * j); System.out.print(' ');
と書いてもいいですし、半角スペースの表示も文字列結合で行うとして、一つのprint文
System.out.print((i * j) + " ");
だけでも問題ありません。
おわりに
今回は二重ループとカウンタ変数を使った計算の組み合わせでした。
今回はかけ算九九という慣れ親しんだ題材なのでそれほど難しくは感じなかったかもしれませんが、カウンタ変数がiとjの2つあるなかで目的の計算式を導き出すのは、実践ではなかなか難易度が高いものです。やはり具体的な値を考えながら図や対応表を手を動かして書くことで、正しいアルゴリズムを導き出していくのが常です。
次回はこちらです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。