質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

3748閲覧

C言語で九九表

sanshi0312

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/02/18 09:02

最近独学でC言語を始めたのですが

1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
2 , 4 , 6 , 8 ,10 ,12 ,14 ,16 ,18



9 ,18 ,27 ,36 ,45 ,54 ,63 ,72 ,81

のような感じでコンソール画面で九九表をfor文一つで表示させたいのですが
どうしたらいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

力技ですが・・・

c

1~/test/ctst >cat tst03.c 2#include <stdio.h> 3 4int main() 5{ 6 7 for( int i= 1; i < 10; i++ ){ 8 /* 1 2 3 4 5 6 7 8 9 */ 9 printf( "%2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d\n", 10 i * 1, i * 2, i * 3, i * 4, i * 5, i * 6, i * 7, i * 8, i * 9 ); 11 } 12 13 return 0; 14} 15 16~/test/ctst >./a.out 17 1, 2, 3, 4, 5, 6, 7, 8, 9 18 2, 4, 6, 8, 10, 12, 14, 16, 18 19 3, 6, 9, 12, 15, 18, 21, 24, 27 20 4, 8, 12, 16, 20, 24, 28, 32, 36 21 5, 10, 15, 20, 25, 30, 35, 40, 45 22 6, 12, 18, 24, 30, 36, 42, 48, 54 23 7, 14, 21, 28, 35, 42, 49, 56, 63 24 8, 16, 24, 32, 40, 48, 56, 64, 72 25 9, 18, 27, 36, 45, 54, 63, 72, 81 26~/test/ctst >

投稿2016/02/18 09:30

編集2016/02/18 09:48
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/02/18 09:53

おお、読みやすくて良いですね。このケースでは力技もありと思います。
cateye

2016/02/18 10:12

テーブルを使うかどうか迷ったんですが、改行入れるのにどうしても判断が必要になるのでこうなってしまいました^^;
WoodenHamlet

2016/02/20 16:53 編集

テーブルを使いたい?でも改行判断が面倒?そんなあなたにコレ! const static char kukuTable[] = " 1 2 3 4 5 6 7 8 9\n 2 4 6 8 10 12 14 16 18\n 3 6 9 12 15 18 21 24 27\n 4 8 12 16 20 24 28 32 36\n 5 10 15 20 25 30 35 40 45\n 6 12 18 24 30 36 42 48 54\n 7 14 21 28 35 42 49 56 63\n 8 16 24 32 40 48 56 64 72\n 9 18 27 36 45 54 63 72 81\n"; 出題者のやる気をそぎ落とす驚異のベタ書きテーブル!これを一文字ずつ熟練の職人のようにプロットするだけで for 文一個、九九表出力が出来てしまうスグレモノ! 「こんなんするなら%sで出力しろよ!!」 「でも先生for文一個って言ったじゃないですか」 「そういう意味じゃねーよ!」
guest

0

掛け算を使わずに作ってみました。
99.c

c

1#include <stdio.h> 2 3#define N (10) // (N -1) * (N - 1) の掛け算の表をつくる 4#define FORM " %2d" // 一マスの書式 5// N = 21, FORM = " %3d" とすれば 20 * 20 の掛け算表が出力できる。 6 7int main() { 8 int base = 1; 9 int diff = 1; 10 int n = 1; 11 for (int i = 1; i <= N * (N - 1); i++) { 12 if (i % N == 0) { 13 printf("\n"); 14 base ++; 15 diff ++; 16 n = base; 17 } else { 18 printf(FORM, n); 19 n += diff; 20 } 21 } 22 return 0; 23}

実行結果

$ gcc 99.c $ ./a.out 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

投稿2016/02/18 12:46

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kosaji

2016/02/18 14:06

感動しました! 掛け算を使わないなんて思い浮かびませんでした! すごくスタイリッシュでかっこいいコードですね!
katoy

2016/02/18 14:39

読みにくくなりますが、こんな風に短くすることもできます。 (出力の最初に余計な改行でてしまうけど) int main() { int base = 0, diff = 0, n = 0; for (int i = 0; i <= N * (N - 1); i++) { (i % N != 0) ? printf(FORM, n += diff) : (printf("\n"), diff++, base++, n = 0); } return 0; }
guest

0

for 文がもっと減るとこうなってくる

C

1#include <stdio.h> 2 3int rowMax; 4int columnMax; 5 6void PlotMultSub(int row, int column) 7{ 8 int nextRow = row+1, nextColumn = column; 9 10 printf(" %3i", row * column); 11 12 if (row == rowMax) 13 { 14 printf("\n"); 15 if (column == columnMax) 16 { 17 return; 18 } 19 nextRow = 1; 20 nextColumn++; 21 } 22 23 PlotMultSub(nextRow, nextColumn); 24} 25 26void PlotMultTable(int row, int column) 27{ 28 if (row <= 0 || column <= 0) 29 { 30 return; 31 } 32 rowMax = row; 33 columnMax = column; 34 PlotMultSub(1, 1); 35} 36 37int main () 38{ 39 PlotMultTable(9, 9); 40 return 0; 41}

投稿2016/02/20 07:59

編集2016/02/20 08:03
WoodenHamlet

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Huyuto

2016/09/28 13:55

PlotMultTable の引数変えれば、九九だけではなく万万もできますね。 #けど、再帰しすぎてスタック...(組込系では結構シビアかも?)
WoodenHamlet

2016/09/30 08:24

スタックもそうですが出力されたテーブルが桁数の関係でぐちゃぐちゃになるのでPlotMultTableで最初にrow*columnを計算して桁数を数えた方が(大きな表を出すなら)良いですね。そうすれば使用するスタック量(row*column*一段分のメモリ消費) で計算できるか……めんどくせえやw
guest

0

c

1include <stdio.h> 2 3void main( void ) 4{ 5 for( int i = 1 , j = 1 ; ; i++ ) 6 { 7 printf ( "%2d" , i * j ) ; 8 if( i == 9 ) 9 { 10 printf ( "\n" ) ; 11 i = 0 ; 12 j++ ; 13 if ( j == 10 ) 14 break ; 15 } 16 } 17}

結構スタイリッシュにできたと思うのですが、どうでしょうか。

投稿2016/02/18 10:07

編集2016/02/18 12:40
kosaji

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

2重for文がベストと思いますが、for文1つに拘るのであれば、少しデバッグのしやすさに配慮して下記で如何でしょうか?

C

1#include <stdio.h> 2 3int main() 4{ 5 for (int i=0; i < 10*10; ++i) 6 { 7 if (((i/10)==0) || ((i%10)==0)) 8 continue; 9 10 if ((i%10) < 9) { 11 printf("%2d,", (i%10)*(i/10)); 12 } else { 13 printf("%2d\n", (i%10)*(i/10)); 14 } 15 } 16 17 return 0; 18}

単純に10進法で処理しているので効率が悪いです。9進法にて処理すれば効率は落ちません。
是非、9進法による処理にチャレンジされてみてください。
for (int i=0; i < 10*10; ++i)は、for (int i=0; i < 9*9; ++i)となり、かつ、if (((i/10)==0) || ((i%10)==0)) continue;はやっぱり無くせる筈です。

投稿2016/02/18 09:23

編集2016/02/18 09:33
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanshi0312

2016/02/18 09:34

ありがとうございます!表示することができました!
guest

0

2重for文をつかわずにということでしょうか?

if文を10個ほど使えば可能です。(switchのほうが見栄えいいかも)

どうすればというのはコードを知りたいのでしょうか?やり方でしょうか?(アイデア)

投稿2016/02/18 09:18

編集2016/02/18 09:23
yzccdefine

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanshi0312

2016/02/18 09:23 編集

2重 for文を使わずに for文1個でということです すいません、コードを知りたいです
yzccdefine

2016/02/18 09:25

今すぐにうてる状況ではないので自宅に戻り次第返答します。 他の方が回答していた場合はそちらを参考にしてしまってください^^ 一応動かし方をご自分で考えてみてください。すぐに答えが見つかるかもしれません。
sanshi0312

2016/02/18 09:34

ありがとうございます!解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問