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

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

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

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

Q&A

解決済

4回答

317閲覧

c: 99表を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/07/19 00:57

編集2018/07/19 02:03

c

1#include <stdio.h> 2 3void write_profile(FILE *fp) 4{ 5 int i,j,k = 0; 6 7 for(i=0; i < 10; i++){ 8 if(i == 0){ 9 continue; 10 }else{ 11 } 12 for(j=1; j < 10; j++){ 13 k = i * j; 14 } 15 printf("\n"); 16 } 17 fprintf(fp, "%d\n", k); 18 printf("ファイルに書き込みました。\n"); 19} 20 21 22int main(void) 23{ 24 FILE *fp; 25 26 if((fp = fopen("sample.text", "a")) == NULL) { 27 printf("\aファイルをオープンできません。\n"); 28 } 29 else { 30 fclose(fp); 31 } 32 33 return(0); 34}

問題文

困っていること

コマンドラインには表示させることは出来るがファイルに書き換えれなくて困っています。

旧コード

c

1#include <stdio.h> 2 3void write_profile(FILE *fp) 4{ 5 int i,j; 6 7 for(i=0; i < 10; i++){ 8 if(i == 0){ 9 continue; 10 }else{ 11 } 12 for(j=1; j < 10; j++){ 13 fprintf(fp, "%2d\n", i*j); 14 } 15 printf("\n"); 16 } 17 printf("ファイルに書き込みました。\n"); 18} 19 20 21int main(void) 22{ 23 FILE *fp; 24 25 if((fp = fopen("sample.text", "a")) == NULL) { 26 printf("\aファイルをオープンできません。\n"); 27 } 28 else { 29 write_profile(fp); 30 fclose(fp); 31 } 32 33 return(0); 34}

旧コード

c

1#include <stdio.h> 2 3void write_profile(FILE *fp) 4{ 5 int a; 6 int b; 7 8 for (a = 1; a <= 9; a++) { 9 for (b = 1; b <= 9; b++) { 10 fprintf(fp, "%d × %d = %2d\n",a,b,a*b); 11 printf("%d x %d = %d\n", a, b, a*b); 12 } 13 } 14 15 printf("ファイルに書き込みました。\n"); 16} 17 18 19int main(void) 20{ 21 FILE *fp; 22 23 if((fp = fopen("sample.text", "a")) == NULL) { 24 printf("\aファイルをオープンできません。\n"); 25 } 26 else { 27 write_profile(fp); 28 fclose(fp); 29 } 30 31 return(0); 32}

2重ループでしたので改良しました。
それでテキストファイルに反映されたですが縦一列に表示されていて困っています。

完成

c

1#include <stdio.h> 2 3void write_profile(FILE *fp) 4{ 5 int a; 6 int b; 7 8 for (a = 1; a <= 9; a++) { 9 fprintf(fp, "\n"); 10 for (b = 1; b <= 9; b++) { 11 fprintf(fp, "%d × %d = %2d",a,b,a*b); 12 printf("%d x %d = %d", a, b, a*b); 13 } 14 } 15 16 printf("ファイルに書き込みました。\n"); 17} 18 19 20int main(void) 21{ 22 FILE *fp; 23 24 if((fp = fopen("sample.text", "a")) == NULL) { 25 printf("\aファイルをオープンできません。\n"); 26 } 27 else { 28 write_profile(fp); 29 fclose(fp); 30 } 31 32 return 0; 33}

皆様のおかげで解決することが出来ました。
ありがとうございました。

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

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

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

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

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

ttyp03

2018/07/19 01:29

write_profile関数はどこからも呼ばれていませんがこの質問したいコードはこれで正しいのですか?
退会済みユーザー

退会済みユーザー

2018/07/19 01:38

すいませんでした。 質問の編集に誤って消していました。 今の所九九の最後の81だけ表示されます。
cateye

2018/07/19 01:48

2.を見る限り、出力ファイル名は実行時引数として指定されているようですが?
guest

回答4

0

書いてみました。(環境は windows でなく mac ですが)

c

1#include <stdio.h> 2 3void usage(char* prog_name) { 4 printf("使い方: %s output_file_name\n", prog_name); 5 printf("  例: %s 99.txt\n", prog_name); 6} 7 8int write_99(char * file_name) { 9 FILE * fp = fopen(file_name, "w"); 10 if (fp == NULL) { 11 printf("%s:ファイルをオープンできません。\n", file_name); 12 return 1; 13 } 14 15 for (int y = 1; y < 10; y++) { 16 for (int x = 1; x < 10; x++) { 17 fprintf(fp, " %dX%d=%2d", y, x, y * x); 18 } 19 fprintf(fp, "\n"); 20 } 21 fclose(fp); 22 printf("%s に書き込みました。\n", file_name); 23 return 0; 24} 25 26int main(int argc, char** argv) { 27 if (argc != 2) { 28 usage(argv[0]); 29 return 1; 30 } 31 32 return write_99(argv[1]); 33} 34

実行例:
イメージ説明

投稿2018/07/21 09:47

katoy

総合スコア22324

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

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

0

BAが出てるので・・・実行時引数として出力ファイルを指定するバージョンです。

usr~/test/c % cat ct.c

c

1#include <stdio.h> 2 3#define CRLF(fp) fputc('\n',fp) 4 5void write_profile(FILE *fp) 6{ 7 for (int i = 1; i < 10; i++) { 8 for (int j = 1; j < 10; j++) { 9 fprintf(fp, "%d×%d=%2d ", i, j, i * j); 10 } 11 CRLF(fp); 12 } 13 puts("ファイルに書き込みました。"); 14} 15 16int main(int argc, char *argv[]) 17{ 18 if( argc != 2 ){ 19 puts("出力ファイルを指定して下さい。"); 20 return 1; 21 } 22 // 23 FILE *fp; 24 25 if ((fp = fopen(argv[1], "w")) == NULL) { 26 printf("%s:ファイルをオープンできません。\n",argv[1]); 27 } else { 28 write_profile(fp); 29 fclose(fp); 30 } 31 32 return (0); 33}

usr~/test/c % cc ct.c
ct.c:5:6: warning: no previous prototype for function 'write_profile' [-Wmissing-prototypes]
void write_profile(FILE *fp)
^
1 warning generated.
usr~/test/c % ./a.out
出力ファイルを指定して下さい。
usr~/test/c % ./a.out tst.txt
ファイルに書き込みました。
usr~/test/c % cat tst.txt

c

11×1= 1 1×2= 2 1×3= 3 1×4= 4 1×5= 5 1×6= 6 1×7= 7 1×8= 8 1×9= 9 22×1= 2 2×2= 4 2×3= 6 2×4= 8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18 33×1= 3 3×2= 6 3×3= 9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27 44×1= 4 4×2= 8 4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36 55×1= 5 5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45 66×1= 6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36 6×7=42 6×8=48 6×9=54 77×1= 7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49 7×8=56 7×9=63 88×1= 8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64 8×9=72 99×1= 9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81 10

usr~/test/c %

投稿2018/07/19 02:38

cateye

総合スコア6851

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

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

0

『せっかく九九をファイルに書き込む関数  write_profile を定義しているのに、どこからも呼び出していないので、ファイルに書き込まれない。』
というのが現状で起きていることだと思います。

mainの中の fclose(fp); の行の前に write_profile関数を呼び出すコード "write_profile(fp);"を追加すると、ファイルに書き込みがされるようになります。

==
質問に書かれたコードには間違いがあります。修正しましょう。
(1)write_profile関数
設問では 「2x3= 6」のような形式で9行9列でファイルに書き込むように指示されてるのに、
コードは "fprintf(fp, "%d\n", k);"と乗算の答えの部分(2x3=6なら、6の部分)だけしか書き込んでおらず、毎回改行しているので、9行9列ではなく、81行1列で書き込まれてしまいます。

(2)main関数
設問で”ap0712_2 kaku.txt”のように起動する(ファイル名はコマンドラインで指定する)ようになっているのに、質問のコードではファイル名が"sample.text"に固定されています。

投稿2018/07/19 01:44

編集2018/07/19 01:47
coco_bauer

総合スコア6915

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

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

coco_bauer

2018/07/19 01:48

"fprintf(fp, "%d\n", k);"が入るべき場所も間違えていますね。
退会済みユーザー

退会済みユーザー

2018/07/19 01:54

2重ループが条件でしたのでそれを含めてコードを修正しました。 それでテキストファイルには91行1列で表示する所まで出来ました。 9行9列にしたい場合どのようにすればいいかアドバイスいただけないでしょうか?
cateye

2018/07/19 02:04

内側のforループでの改行(\n)は不要です。1行出力したら改行するようにしましょう。
退会済みユーザー

退会済みユーザー

2018/07/19 02:10

わかりました。修正します。
guest

0

ベストアンサー

課題は自分でやりましょう。

というのはさておき、

コマンドラインに表示させることができたなら、そのコードを提示してはどうでしょうか

投稿2018/07/19 01:05

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/07/19 01:12

コマンドラインならprintfを入れれば上記のプログラムで出来ます。 一応、このコードでもファイルに書き込みが出来ましたってなるのですがファイルをみると何も書き込まれてないのでどうすればいいか分からなく質問させて頂きました。テキストには答えが載ってないので
y_waiwai

2018/07/19 01:34

そのコードでは問題にでてるような出力はされなさそうですが。 とりあえず、 fclose(fp); のまえに、 write_profile(fp); をおいてみてください
退会済みユーザー

退会済みユーザー

2018/07/19 01:37

すいませんでした。 質問の編集に誤って消していました。 今の所九九の最後の81だけ表示されます。
y_waiwai

2018/07/19 01:57

printfの \n というのは改行を表します これがあると、次の行に移ってしまいますねー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問