はじめに
どうも! みなため(@MinatameT)です。
この記事をご覧になっている大半の方は、学校の課題がわからない……という状況だと思います。でも、安心してください。
ここでは、「九九の表(配列)をC言語で表示するための考え方」と、「そのプログラミング例」を紹介します。
それでは、まずは考え方から見ていきます。
配列を使った九九の表の考え方
まず、九九の表をイメージしてください。ここでは、次のような実行結果を想定します。
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
読むときは、英文のように「左から右へ(1行ずつ)」読んでいきます。
それでは、ソースコードの設計を考えていきましょう。プログラミングにスムーズに移れるように、掛け算の記号は*(アスタリスク)で表します。
1の段を考えます。
1*1 = 1
1*2 = 2
1*3 = 3
(中略)
1*9 = 9
ここで、変数を使って考えます。a*b = ans[e] としましょう。a*bの結果を配列ansのe番めに代入するイメージです。ただし、配列番号は0番スタートです。1番スタートではないので、注意してください!
1の段で考えると……
a = 1
b = 1
e = 0
ans[e] = ans[0] = a*b = 1*1 = 1
a = 1
b = 2
e = 1
ans[e] = ans[1] = a*b = 1*2 = 2
a = 1
b = 3
e = 2
ans[e] = ans[2] = a*b = 1*3 = 3
(中略)
a = 1
b = 9
e = 8
ans[e] = ans[8] = a*b = 1*9 = 9
となります。ここで、「ある規則性」に気づけるかどうかが重要です。
その答えは、aの値は固定で、bの値とeの値が1ずつ増えていっているということです。
ここまでは大丈夫でしょうか……?
次に、2の段を考えますが、1の段が終わった時点で改行する必要があります。そうしなければ、
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
といった感じで、表の機能がなくなってしまいます。ですから、改行させましょう。
改行させたら、2の段を考えます。
a = 2
b = 1
e = 9
ans[e] = ans[9] = a*b = 2*1 = 2
a = 2
b = 2
e = 10
ans[e] = ans[10] = a*b = 2*2 = 4
a = 2
b = 3
e = 11
ans[e] = ans[11] = a*b = 2*3 = 6
(中略)
a = 2
b = 9
e = 17
ans[e] = ans[17] = a*b = 2*9 = 18
ここで「ある規則性」を考えてみてください。
答えは、2の段になったことでaの値が2になり、bの値が1にリセットされたことと、eの値はリセットされていないことです。それと、 aの値は固定で、bの値とeの値が1ずつ増えていっているということです。
こうした規則性が、9の段まで続くわけです。それでは、この規則性をループ文(for文)で考えていければOKです。
- aの値が1から9まで増えていく1つめのfor文(初期値:a = 1)を作る。
- 1つめのfor文の中に、bとeの値が1から9まで増えていく2つめのfor文(初期値:b = 1)を作る。
- 2つめのfor文の中に、a*bの結果を配列ansに代入する式と、その結果を表示するprintf文を記述する。
- 2つめのfor文の直後に、改行文字(\n)を入れる。
上記のことが理解できれば、完成は目前です!
おまたせしました。それでは、ソースコードと実行結果を確認していきます。
九九の表(配列)を表示するプログラムの例
ソースコード
#include<stdio.h>
int main(void)
{
int ans[81]; //掛け算の結果が入る配列
int e; //配列ansの要素番号
int a,b; //a×bのaとb
e = 0; //初期値(忘れるとエラーの原因になるので注意!)
for(a=1; a<=9; a=a+1)
{
for(b=1; b<=9; b=b+1,e=e+1)
{
ans[e] = a*b; //掛け算する。
printf("%4d",ans[e]); //半角4つ分のスペースに結果表示。
}
printf("\n"); //1つの段がすべて終わった後に改行する。
}
return(0);
}
エラー回避のため、変数には初期値を与えてください。なぜなら、int e; のように変数を宣言したとき、変数にどのような値が入っていてもおかしくないからです。とんでもなく大きな数値が入っている場合もあります。
実は、for文の第3引数には、b=b+1,e=e+1のように、式を複数入れることができます。ループ終了時に+1したい変数が2つあるのなら、カンマ(,)で区切ってまとめて記述すると良いですね。
printf文の「%4d」は、半角4つ分のスペースを確保して整数を表示するということです。ですから、%3dなら半角3つ分、%8dなら半角8つ分になります。よければ、各自でチェックしてみてください。
それでは実行結果を確認していきます。
実行結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
このように、九九の表が見事に表示されました!
ただ、この場合は配列を使う必要がないのですが、配列に1の段から9の段までの積(掛け算の結果)を順番に代入する……という配列の勉強にはなったと思います。
また、while文を使う場合もあるようですが、for文が理解できているのならwhile文をわざわざ使う必要はありません。私はfor文で十分だと思います。
今回は長くなりましたが、理解していただけましたでしょうか? とにかく、皆さん、お疲れ様でした。