【C言語】九九表を表示する

C言語での九九表の表示の仕方解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、C言語での「九九表」の表示の仕方について解説していきたいと思います。

九九に関しては小学生の時に習ったと思いますが、その際に下の図のような九九表を使用して各掛け算結果を覚えていったのではないかと思います。

九九表の例を示す図

このページでは、この図のような九九表を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

特にC言語初心者の方であれば、この九九表の表示の仕方を考えていくことで、C言語の基礎として重要なことも多く学べることができるのではないかと思います。是非読んでみてください!

九九の計算結果の表示

まず、九九における各掛け算結果を表示することを考えていきましょう。

特定の段の表示

九九表は 19 の段の9つの段から構成されており、九九表の表示は、1つの段の掛け算結果を横に並べ、さらに各段を縦に並べることで実現することができます。まず、この9つの段の中の特定の1つの段を表示することを考えていきましょう!

特定の1つの段のみを表示する様子

例えば、1 の段の計算結果を表示するためには、1 * 1 の計算結果、1 * 2 の計算結果・・・1 * 9 の計算結果という風に、計算式における一方の項を 1 に固定し、さらに他方の項を 19 の値に変化させながら掛け算を行い、各掛け算結果を横に並べて表示していけば良いことになります。

1の段の表示の仕方の説明図

計算式における一方の項を 1 に固定した場合は 1 の段の計算結果の表示となりますが、固定する値を 2 にすれば 2 の段の計算結果を表示することができますし、他の段に関しても同様の方法で計算結果を表示することができます。

つまり、計算式における一方の項を i に固定し、さらに他方の項を 19 の値に変化させながら繰り返し掛け算を行いながら各掛け算結果を表示していくことで、i の段の計算結果の表示を行うことができることになります。

iの段の表示の仕方の説明図

また、”さらに他方の項を 19 の値に変化させながら繰り返す” のように、特定の範囲で値を 1 ずつ変化させながら処理を行うことは for ループにより実現することができます。

例えば j に対する for ループで実現した場合、この i の段の表示は下記のような処理によって実現することができます。C言語の場合、改行を行わなければ自然と横方向に出力結果が並ぶことになるので、これにより i の段の表示が実現できることになります。

iの段の表示
for (int j = 1; j <= 9; j++) {
    printf(" %d", i * j);
}

例えば、i = 7 とした場合、下記のように表示されることになります。

 7 14 21 28 35 42 49 56 63

スポンサーリンク

全ての段の表示

i の段が表示できるようになれば、あとは i を 19 に変化させながら繰り返し各段を表示することで、九九表に必要となる掛け算結果全てを表示することができるようになります。

九九表の出力の仕方の説明図

これは、i の段の表示i に対する for ループの中で繰り返し行うことで実現できます。

全ての段を表示するためのループ
for (int i = 1; i <= 9; i++) {
    i の段の表示
}

ここで、i の段の表示 は前述で示した j に対する for ループで実現できるため、結局は下記のような2重のループにより九九表における全ての段の表示を実現することができることになります。

全ての段の表示
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        printf(" %d", i * j);
    }
}

上記のような処理を実行すれば、下記のように九九における各掛け算結果が表示されることになります。

 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

九九表の表示

ただ、上記表示結果からも分かるように、これだと単に横並びに掛け算結果が表示されるだけになります。C言語では、基本的には printf 関数等で文字の出力を行なった場合、改行を行わなければ自然と横に並ぶ形で出力が行われることになります。次の行に出力するためには改行を行う必要があります。改行は '\n' の出力により実現できます。

改行の説明図

つまり、九九表を横並びではなく表形式で表示するためには、各段の表示(i の段の表示)を行なった後に改行を入れる必要があります。これにより、各段が縦方向に並べて表示されるようになります。

前述の通り、各段の表示は内側の j に対する for ループで実施していますので、下記のように、この j に対する for ループが終わったタイミングで改行を行えば良いことになります。

表形式での表示
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        printf(" %d", i * j);
    }
    printf("\n");
}

この改行の実行を加えることで、表示結果は下記のようになります。かなり九九表っぽくなってきましたが、まだズレていますね…。このズレの修正方法は次の章で解説します。

 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重ループにより実現することが可能となります。

ポイントになるのが、この2重ループにおける内側のループと外側のループの役割です。

内側のループでは、横方向への出力の実現を役割としています。そして、内側のループが終了した際に改行を行うことで一行分の出力が完成することになります。

表形式での出力方法の説明図1

さらに、外側のループによって、その一行分の結果を縦方向に並べていくことで表形式での表示が実現できます。

表形式での出力方法の説明図2

このような、表形式や縦横方向に二次元的に並べる形で表示を行う機会は結構多いと思います。その際には、ここまでの解説で説明してきたように、まず一行分の出力を行うためのループを作成し、さらに、そのループの外側にもう一段階ループを用意して複数行に拡張していくという考え方が適用できるので、この表形式での表示方法は覚えておくと良いと思います!

また、改行を行う '\n' のように、表示ではなく制御を行うための文字は他にも存在します。これらに関しては下記ページで紹介していますので、詳しく知りたい方は下記ページをご参照いただければと思います!

エスケープシーケンスの解説ページアイキャッチ 【C言語】エスケープシーケンスで特殊文字を扱う

九九表の整形

さて、表形式で九九表が表示できるようにはなったものの、まだ見栄えが悪いです…。その理由は、掛け算結果の桁数がバラバラのために、各掛け算結果の表示位置がズレてしまっているからです。

そのため、掛け算結果の桁数に関わらず、各掛け算結果を 2 桁分の幅で表示することで、九九表の整形を行なっていきます。要は掛け算結果の表示桁数を統一することで表示される九九表を綺麗にしていきます。

表の整形方法の説明図

こういった表示する桁数の調整は printf 関数に指定する変換指定子により実現することができます。

printf 関数に対し、変換指定子として %d を指定した場合、出力する値の桁数に応じた出力が行われることになります。例えば 1 桁の値を出力する場合は 1 桁分のみ出力が行われます。

それに対し、%2d を指定した場合、出力する値の桁数が 2 桁未満であれば出力する値の前に半角スペースが 1 つ追加される形で出力されることになります。出力する値が 2 桁の場合はそのまま表示されることになります。すなわち、九九の掛け算結果が 1 桁であろうが 2 桁であろうが、出力される文字数は 2 つとなり、出力される文字数が統一されるので表としてズレが発生しなくなります。

ということで、下記のように printf%d を指定していた箇所を %2d に変更すれば、綺麗な九九表を表示することができるようになります。

整形済みの九九表の表示1
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        printf(" %2d", i * j);
    }
    printf("\n");
}

表示結果は下記のようになります。

  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 桁の場合のみ、すなわち 10 未満の場合のみ、半角スペースを printf で追加で出力するようにすることでも同じ表示結果を得ることができます。

整形済みの九九表の表示2
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        if (i * j < 10) {
            printf(" ");
        }
        printf(" %d", i * j);
    }
    printf("\n");
}

変換指定子を利用する方がスマートなやり方だと思いますが、今回の例のように、プログラミングでは実現したい事に対して実現方法が複数存在する場合も多いです。いろんな実現方法を考えてみることで、プログラミングに重要な「やりたいことを実現方法を考える力」を養うことができますので、様々な実現方法を考えてみることも良い学習方法の1つになると思います!

スポンサーリンク

九九表を表示するプログラム

ここまで、九九表を表示するための処理のみを紹介してきたので、最後に九九表を表示するプログラムのソースコード全体を紹介しておきます。

コンパイルして実行すれば、九九表が表示されることを確認することができるはずです。

九九表を表示するプログラム
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            printf(" %2d", i * j);
        }
        printf("\n");
    }

    return 0;
}

まとめ

このページでは、C言語での「九九表」の表示の仕方について解説しました!

綺麗に九九表を表示する際には、ループを2重に組む、適切に改行を入れる、表示桁数を揃える等を行う必要があり、特にC言語初心者の方には難しいと感じる部分もあるかもしれません。が、逆に言えば、挑戦してみることで学べることも多いのではないかと思います。

特に、表形式での表示を2重ループで実現するやり方は、今後も使用する機会が多いと思いますので、是非この機会に覚えておいてください!

オススメの参考書(PR)

C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!

まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。

  • 参考書によって、解説の仕方は異なる
  • 読み手によって、理解しやすい解説の仕方は異なる

ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?

それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。

なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。

特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。

もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!

入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。

https://daeudaeu.com/c_reference_book/

同じカテゴリのページ一覧を表示