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

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

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

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

Q&A

解決済

7回答

17879閲覧

C言語で九九表を作る

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

1グッド

0クリップ

投稿2015/12/18 09:03

編集2015/12/19 02:26

c

1 2 | 1 2 3 4 5 6 7 8 9 3---+------------------------ 4 1 | 1 2 3 4 5 6 7 8 9 5 2 | ・ ・ ・ ・ ・ ・ ・ 6 3 | ・ ・ ・ ・ ・ ・ ・ 7 4 | ・ ・ ・ ・ ・ ・ ・ 8 5 | ・ ・ ・ ・ ・ ・ ・ 9 6 | ・ ・ ・ ・ ・ ・ ・ 10 7 | ・ ・ ・ ・ ・ ・ ・ 11 8 | ・ ・ ・ ・ ・ ・ ・ 12 9 | ・ ・ ・ ・ ・ ・ ・ 13

このように縦にかけられる数を、横にかける数を表示し、、それを線で区切るプログラムを作る課題(本)なのですが、やり方がわかりません。ヒントをください。生意気ですが、答えは言わないでほしいです・・・

C

1 int x, y; 2 for(y = 1; y <= 9; y++) { 3 for(x = 1; x <= 9; x++) { 4 printf("%3d", x * y); 5 } 6 putchar('\n'); 7 }

ここで行き詰っています。線の出し方がわかりません。


みなさんありがとうございます!
素晴らしいヒントを参考にして自分なりに考えてみたところこんなコードになりました。

C

1int i, x, y; 2 3 for (i = 1; i <= 9*2; i++) { 4 if (i == 1) { 5 printf(" |%3d", i); 6 } else if (i <= 9) { 7 printf("%3d", i); 8 } 9 if (i == 9*2) { 10 printf("---\n"); 11 } else if (i == 9*2-9) { 12 printf("\n---+"); 13 } else if (i > 9){ 14 printf("---"); 15 } 16 } 17 18 for (y = 1; y <= 9; y++) { 19 printf("%2d |", y); 20 for (x = 1; x <= 9; x++) { 21 printf("%3d", x * y); 22 } 23 putchar('\n'); 24 }

これで、一応うまくいったのですが、無駄なことが多くて、改善の余地がある気がします。
最初の for文に if文が2つあることが無駄。
もう少しコンピューター的にできそう。といったところです・・・

本当に助かりましたありがとうございました!

yohhoy👍を押しています

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

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

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

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

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

guest

回答7

0

以下のような処理を追加すればどうでしょうか。

  • 外側のfor に入る前に上側の1~9と横線を出力。
  • 外側と内側のfor文の間に横側の数と縦線を出力(この時、改行はしない)

投稿2015/12/18 09:13

yoshi777

総合スコア674

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

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

退会済みユーザー

退会済みユーザー

2015/12/19 02:33

素晴らしいヒントをありがとうございました。 外側、内側の for文に入る前というところが少し難しかったですが、自分なりに考えてみて、あのコードになりました。外側に入る前、というのは int x, y; for(y = 1; y <= 9; y++) { for(x = 1; x <= 9; x++) { printf("%3d", x * y); } putchar('\n'); } これの前でよかったですかね? とても参考になりました! もしよろしければ、貴方ならどのように書くかを教えてください!
guest

0

ベストアンサー

そもそも「コンピュータ的」というのは、基本的に人間がやると面倒なことを機械に力まかせでやらせてしまおう、ということですから。

円周率の計算とか、人間がやったら何万年かかるかわからないことをコンピュータの演算速度にまかせてやらせてしまおうということですから。

おそらくあなたが「コンピュータ的」と思ってるのは、コード(プログラム)の最適化のことだと思いますよ。

本来の目的が達成できるまでは、コンピュータに(その計算速度を生かして)愚直にやらせればいいんです。
掛け算の計算をその回数足し算させてもいいんです。それがコンピュータですから。

まずは目的を達成して正しい結果が出るのが第一目標。
それができたら、その後にプログラムを見直して「あ、これは非効率的だな」と最適化していけばいいんですよ(^^)v

投稿2016/01/12 17:35

mike

総合スコア118

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

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

退会済みユーザー

退会済みユーザー

2016/01/22 08:56

ありがとうございます。
guest

0

とりあえず、九九レベルの表の頭はfor文で作らないかな。

C

1printf(" | 1 2 3 4 5 6 7 8 9\n----+-----------------------------\n");

これならとりあえずくだらないバグが入る余地はないし、ズレがあっても修正が容易。
質問者さんも自分なりの回答ができたようなので私ならの実装例を載せてしまいますが

C

1 int i, j; 2 printf(" | 1 2 3 4 5 6 7 8 9\n----+-----------------------------\n"); 3 4 for (i = 1; i <= 9; ++i) 5 { 6 printf("%3d |", i); 7 for (j = 1; j <= 9; ++j) 8 { 9 printf("%3d", i*j); 10 } 11 printf("\n"); 12 }

とりあえず for 文などを駆使して出力を作り上げたほうが楽になるのか、ベタで書いた方が楽になるか、を最初に考えてみるのもいいと思いますよ。

投稿2016/01/05 05:14

編集2016/01/06 00:34
WoodenHamlet

総合スコア306

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

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

退会済みユーザー

退会済みユーザー

2016/01/22 08:56

ありがとうございます。
guest

0

c

1int main(){ 2 int x, y; 3 for(y = 1; y <= 9; y++) { 4 for(x = 1; x <= 9; x++) 5 printf("%3d", x * y); 6 putchar('\n'); 7 } 8 return 0; 9} 10これがほとんど答えだけど、トークンの教え方が分からない 11次の人、頼むm(_ _)m

投稿2015/12/19 02:39

JhonDoe

総合スコア36

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

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

退会済みユーザー

退会済みユーザー

2016/01/22 08:56

ありがとうございます。
guest

0

c

1int x, y; 2 for(y = 1; y <= 9; y++) { 3 for(x = 1; x <= 9; x++) 4 printf("%3d", x * y); 5 }

ヒントは、{}このトークンを使う位置を考えること

投稿2015/12/19 00:52

JhonDoe

総合スコア36

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

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

退会済みユーザー

退会済みユーザー

2015/12/19 02:33 編集

素晴らしいヒントをありがとうございました。 トークンの使う位置というのが少し分かりませんでした・・・ もしよろしければ、貴方ならどのように書くかを教えてください!
guest

0

| 1 2 3 4 5 6 7 8 9 ---+---------------------------

以上のような「見出し」のコード例です。

C言語

1printf(" |"); 2for (i = 0; i < 2; i++) { 3 if (i == 1) printf("---+"); 4 for (j = 1; j < 10; j++) { 5 if (i < 1) { 6 printf("%3d", j); 7 }else { 8 printf("---"); 9 } 10 } 11 printf("\n"); 12}

投稿2015/12/18 13:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/12/19 02:33 編集

見出しの出し方を教えてくださりありがとうございました。このコードを参考に自分なりに作ってみましたが、こちらの方がコードがすっきりしていますね! もしよろしければ、貴方ならどのように書くかを教えてください!
退会済みユーザー

退会済みユーザー

2015/12/19 06:24

自分であれば以下のように記述します。 もっと良い方法があるとは思いますが、参考までにどうぞ。 ```C言語 #include <stdio.h> int main(int argc, char* argv[]) { int i, j, x, y; // 見出しの作成 for (i = 0; i < 2; i++) { if (i == 0) { printf(" |"); } else { printf("---+"); } for (j = 1; j < 10; j++) { if (i < 1) { printf("%3d", j); }else { printf("---"); } } printf("\n"); } // 九九表作成 for (x = 1; x < 10; x++) { printf(" %d|", x); for (y = 1; y < 10; y++) { printf("%3d", x * y); } printf("\n"); } return 0; } ```
guest

0

それでは、縦棒(|)を書くところだけ

for(y = 1; y <= 9; y++) { // yの値を書いて、その後に縦棒(|)を書く printf(" %d |",y); // ヒント! // ここに、x*yの値を順に書くコードを入れる。 putchar('\n'); }

投稿2015/12/18 09:21

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2015/12/19 02:34 編集

縦棒の書き方を教えてくださりありがとうございました。 コメントを書いてくださり、わかりやすかったです! もしよろしければ、貴方ならどのように書くかを教えてください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問