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

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

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

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

Q&A

解決済

9回答

3991閲覧

C言語で九九の表を表示するプログラムで末尾の空白の削除の方法がわかりません。

hayate0821

総合スコア7

C

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

0グッド

0クリップ

投稿2016/06/21 14:15

C言語のプログラミングについての質問です。
九九の表を表示させるという問題なのですが、
①二重ループ
②値の間に\tで空白を空ける
③末尾の空白を削除する
上記の条件がありまして③のところがわかりません。
どうすれば末尾の空白が削除できるのか教えてください。
宜しくお願い致します。

#include <stdio.h>

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

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

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

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

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

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

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

guest

回答9

0

こういう方法もありますね。

C

1printf("%d%c", i*j, (j == 9) ? '\n' : '\t'); 2// 後ろの printf("\n"); は不要なので削除

投稿2016/06/21 15:21

catsforepaw

総合スコア5938

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

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

0

こういう質問は色々な書き方が集まって参考になりますね。
とりあえず私の場合。

C

1int main (void) 2{ 3 int i,j; 4 for(i = 1; i <= 9; i++){ 5 for(j = 1; j <= 9; j++){ 6 if(j > 1){ 7 printf("\t"); 8 } 9 printf("%d", i * j); 10 } 11 printf("\n"); 12 } 13 return 0; 14}

ポイントは要はタブ(\t)の出力タイミングをどう制御するかです。
あとは%dの出力箇所は一か所にすることで、冗長性をなくしています。

末尾の空白が解決されていないという指摘を受けたので、問題ないという結果を貼り付けておきます。

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

http://ideone.com/hj19Va

投稿2016/06/22 00:35

編集2016/06/22 07:25
ttyp03

総合スコア16998

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

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

maiko0318

2016/06/22 01:03

>末尾の空白が削除できるのか教えてください。 問題はここです。解決されていませんね。
ttyp03

2016/06/22 01:06

え?されてると思いますが。
guest

0

面白そうなので(でもCは書けないので、考え方だけ)

方法1,空白の出力を文字の後ろではなく前に入れる。
方法2,1行たまるまで都度出力としないで、出力文字列として準備しておき、最終空白を削除して改行を挿入。

特に1はコロンブスかと。削除じゃないですけど。

投稿2016/06/25 13:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

cateye

2016/06/26 01:01

1に関しては”行頭にタブがあってはいけない”とは言われてないのでいいかと思います。が、どうも”削除”というのが気になってw
退会済みユーザー

退会済みユーザー

2016/06/26 01:21

ですよねw 1が書きたかっただけですが、削除じゃないんですよね。
guest

0

今環境がないので未確認ですが・・・

C

1static const char EOT[]= "0\t\t\t\t\t\t\t\t\n"; 2 3int i; 4int j; 5for( i= 1; i <= 9; i++ ){ 6 for( j= 1; j <= 9; j++ ){ 7 printf("%d%c",i*j, EOT[j]); 8 } 9}

〔追記〕帰宅して作ってみました。

c

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

odの結果
~/test/ctst >./a.out >03.txt
~/test/ctst >od -xc 03.txt
0000000 0931 0932 0933 0934 0935 0936 0937 0938
1 \t 2 \t 3 \t 4 \t 5 \t 6 \t 7 \t 8 \t
0000020 0a39 0932 0934 0936 0938 3031 3109 0932
9 \n 2 \t 4 \t 6 \t 8 \t 1 0 \t 1 2 \t
0000040 3431 3109 0936 3831 330a 3609 3909 3109
1 4 \t 1 6 \t 1 8 \n 3 \t 6 \t 9 \t 1
0000060 0932 3531 3109 0938 3132 3209 0934 3732
2 \t 1 5 \t 1 8 \t 2 1 \t 2 4 \t 2 7
0000100 340a 3809 3109 0932 3631 3209 0930 3432
\n 4 \t 8 \t 1 2 \t 1 6 \t 2 0 \t 2 4
0000120 3209 0938 3233 3309 0a36 0935 3031 3109
\t 2 8 \t 3 2 \t 3 6 \n 5 \t 1 0 \t 1
0000140 0935 3032 3209 0935 3033 3309 0935 3034
5 \t 2 0 \t 2 5 \t 3 0 \t 3 5 \t 4 0
0000160 3409 0a35 0936 3231 3109 0938 3432 3309
\t 4 5 \n 6 \t 1 2 \t 1 8 \t 2 4 \t 3
0000200 0930 3633 3409 0932 3834 3509 0a34 0937
0 \t 3 6 \t 4 2 \t 4 8 \t 5 4 \n 7 \t
0000220 3431 3209 0931 3832 3309 0935 3234 3409
1 4 \t 2 1 \t 2 8 \t 3 5 \t 4 2 \t 4
0000240 0939 3635 3609 0a33 0938 3631 3209 0934
9 \t 5 6 \t 6 3 \n 8 \t 1 6 \t 2 4 \t
0000260 3233 3409 0930 3834 3509 0936 3436 3709
3 2 \t 4 0 \t 4 8 \t 5 6 \t 6 4 \t 7
0000300 0a32 0939 3831 3209 0937 3633 3409 0935
2 \n 9 \t 1 8 \t 2 7 \t 3 6 \t 4 5 \t
0000320 3435 3609 0933 3237 3809 0a31
5 4 \t 6 3 \t 7 2 \t 8 1 \n
0000334
~/test/ctst >

投稿2016/06/22 15:12

編集2016/06/23 13:40
cateye

総合スコア6851

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

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

cateye

2016/06/25 13:33

>③末尾の空白を削除する >上記の条件がありまして③のところがわかりません。 回答を書いた後で気になったのですが、“末尾の空白を削除する ”というのは一度出力したものを削除しろと言っているのでしょうか? どの回答を見ても”末尾の空白は出力しない”処理になっています。もし削除であれば誤答になってしまいます・・・どうなんでしょうか? (画面ならバックスペース'\b'で消せるかもですが?…未確認)
guest

0

ループ内部のifは時間を食いますから、
#include <stdio.h>

int main (void)
{
int i,j;
for(i=1;i<=8;i++){
for(j=1;j<=8;j++){
printf("%d\t",ij);
}
printf("%d\n",i
j); /* ループを抜けるとi=9になっている。
}

for(j=1;j<=8;j++){
printf("%d\t",i*j);
}

printf("%d",ij); / 行末の\tも消しています。

return 0;
}

こうしましょう。

投稿2016/06/21 19:32

編集2016/06/21 19:40
maiko0318

総合スコア876

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

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

0

sprintf で文字列に変換しておいて末尾の空白を削除してから出力するという方法もありますね。

投稿2016/06/21 14:27

Zuishin

総合スコア28660

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

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

Zuishin

2016/06/21 15:58

こういうのはどうでしょうか? #include <stdio.h> int main(void) { char *seperator[] = { "\t", "\n" }; for (int i = 1; i <= 9; i++) for (int j = 1; j <= 9; j++) printf("%d%s", i * j, seperator[j == 9]); return 0; }
guest

0

ベストアンサー

③末尾の空白を削除する

たぶんの下記のコードのようにj==9で処理を変えると実現できると思います。

C

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

投稿2016/06/21 14:25

ai_2013_dev

総合スコア338

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

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

hayate0821

2016/06/22 14:53

ご対応ありがとうございます。 おかげさまで理解できました。
guest

0

こんにちは。

良くある処理なのですが、いつも悩ましい部分です。
このケースでは「j == 9なら"%d"で出力し、それ以外なら"%d\t"で出力する」で良いと思います。

投稿2016/06/21 14:22

Chironian

総合スコア23272

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

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

0

一度出力した文字を取り消す(削除する)ことはできませんので、
最後だけ\tを出力しない、というような条件をつければ良いのではないでしょうか。

投稿2016/06/21 14:21

yh1224

総合スコア653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問