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

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

ただいまの
回答率

90.33%

  • C

    3995questions

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

c: 99表を作りたい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 221
#include <stdio.h>

void write_profile(FILE *fp)
{
    int i,j,k = 0;

    for(i=0; i < 10; i++){
        if(i == 0){
            continue;
        }else{
        }
        for(j=1; j < 10; j++){
            k = i * j;
        }
        printf("\n");
    }
    fprintf(fp, "%d\n", k);
    printf("ファイルに書き込みました。\n");
}


int main(void)
{
    FILE *fp;

    if((fp = fopen("sample.text", "a")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        fclose(fp);
    }

    return(0);
}

問題文

 困っていること

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

旧コード

#include <stdio.h>

void write_profile(FILE *fp)
{
    int i,j;

    for(i=0; i < 10; i++){
        if(i == 0){
            continue;
        }else{
        }
        for(j=1; j < 10; j++){
        fprintf(fp, "%2d\n", i*j);
        }
        printf("\n");
    }
    printf("ファイルに書き込みました。\n");
}


int main(void)
{
    FILE *fp;

    if((fp = fopen("sample.text", "a")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        write_profile(fp);
        fclose(fp);
    }

    return(0);
}

旧コード

#include <stdio.h>

void write_profile(FILE *fp)
{
    int a;
    int b;

    for (a = 1; a <= 9; a++) {
        for (b = 1; b <= 9; b++) {
            fprintf(fp, "%d × %d = %2d\n",a,b,a*b);
            printf("%d x %d = %d\n", a, b, a*b);
        }
    }

    printf("ファイルに書き込みました。\n");
}


int main(void)
{
    FILE *fp;

    if((fp = fopen("sample.text", "a")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        write_profile(fp);
        fclose(fp);
    }

    return(0);
}


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

完成

#include <stdio.h>

void write_profile(FILE *fp)
{
    int a;
    int b;

    for (a = 1; a <= 9; a++) {
        fprintf(fp, "\n");
        for (b = 1; b <= 9; b++) {
            fprintf(fp, "%d × %d = %2d",a,b,a*b);
            printf("%d x %d = %d", a, b, a*b);
        }
    }

    printf("ファイルに書き込みました。\n");
}


int main(void)
{
    FILE *fp;

    if((fp = fopen("sample.text", "a")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        write_profile(fp);
        fclose(fp);
    }

    return 0;
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2018/07/19 10:29

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

    キャンセル

  • swift-study-now

    2018/07/19 10:38

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

    キャンセル

  • cateye

    2018/07/19 10:48

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

    キャンセル

回答 4

checkベストアンサー

0

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

というのはさておき、

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 10:12

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

    キャンセル

  • 2018/07/19 10:34

    そのコードでは問題にでてるような出力はされなさそうですが。

    とりあえず、
    fclose(fp);
    のまえに、
    write_profile(fp);
    をおいてみてください

    キャンセル

  • 2018/07/19 10:37

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

    キャンセル

  • 2018/07/19 10:57

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

    キャンセル

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 10:48

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

    キャンセル

  • 2018/07/19 10:54

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

    キャンセル

  • 2018/07/19 11:04

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

    キャンセル

  • 2018/07/19 11:10

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

    キャンセル

0

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

usr~/test/c % cat ct.c

#include <stdio.h>

#define CRLF(fp)    fputc('\n',fp)

void write_profile(FILE *fp)
{
    for (int i = 1; i < 10; i++) {
        for (int j = 1; j < 10; j++) {
            fprintf(fp, "%d×%d=%2d ", i, j, i * j);
        }
        CRLF(fp);
    }
    puts("ファイルに書き込みました。");
}

int main(int argc, char *argv[])
{
    if( argc != 2 ){
        puts("出力ファイルを指定して下さい。");
        return 1;
    }
    //
    FILE *fp;

    if ((fp = fopen(argv[1], "w")) == NULL) {
        printf("%s:ファイルをオープンできません。\n",argv[1]);
    } else {
        write_profile(fp);
        fclose(fp);
    }

    return (0);
}


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 

1×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 
2×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 
3×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 
4×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 
5×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 
6×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 
7×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 
8×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 
9×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 


usr~/test/c % 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

#include <stdio.h>

void usage(char* prog_name) {
  printf("使い方: %s output_file_name\n", prog_name);
  printf("  例: %s 99.txt\n", prog_name);
}

int write_99(char * file_name) {
  FILE * fp = fopen(file_name, "w");
  if (fp == NULL) {
     printf("%s:ファイルをオープンできません。\n", file_name);
     return 1;
  }

  for (int y = 1; y < 10; y++) {
    for (int x = 1; x < 10; x++) {
      fprintf(fp, " %dX%d=%2d", y, x, y * x);
    }
    fprintf(fp, "\n");
  }
  fclose(fp);
  printf("%s に書き込みました。\n", file_name);
  return 0;
}

int main(int argc, char** argv) {
  if (argc != 2) {
    usage(argv[0]);
    return 1;
  }

  return write_99(argv[1]);
}

実行例:
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    3995questions

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