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

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

ただいまの
回答率

89.52%

C言語 三角関数の値をtxtで出力

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,340
退会済みユーザー

退会済みユーザー

C言語初心者です

三角関数:y=(1/n)sin(2*π*15*n*t)について、n(n=1,3,5,....)の最大値(nmax)とファイル名を入力すると

0      (n=1,t=0のときの値)  (n=3,t=0のときの値).....(n=nmax,t=0のときの値)
0.002  (n=1,t=0.002   )  (n=3,t=0.002   ).....(n=nmax,t=0.002     )
:           :                              :                      :
1      (n=1,t=1         )  (n=3,t=1           )......(n=nmax,t=1         )

のようなtxtファイルが作成されるプログラムを作ろうとしたのですが、
以下のようなプログラムでは表示される値が左一列のみになってしまいました。
訂正すべき点を教えていただきたいです。宜しくお願いします<m(__)m>

【追記】cygwinを使用しています。
↓ご指摘いただいた点を修正したソースコードです

#include <stdio.h>
#include <math.h>

int main(void)
{
    int n, nmax;
    double t;
    double y;

    char filename[FILENAME_MAX];
    FILE *fp;

    printf("出力ファイル名 = ");
    scanf("%s", filename );

    fp = fopen( filename, "w" );

    if( fp == NULL ){
        printf("[%s] ファイル・オープンの失敗\n", filename );
        return(1);
    }

    printf( "倍数nの最大値を入力してください:");
    scanf( "%d", &nmax );

    for( t = 0.0; t < 1.002; t+=0.002 ){ 
        fprintf( fp, "%f ", t ); 
        for( n = 1; n <= nmax; n+=2 ){ 
            y = sin(2.0 * M_PI * 15.0 * t * n ); 
            fprintf( fp, "(n=%d, y=%f) ", n, y/n ); 
        } 
        fprintf( fp, "\n"); 
    }

    fclose(fp);
    return(0);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

nmax は double になっているので、scanf の "%d" では値を取れません。
int にする必要があります。
あと、for文の初期値がどちらも n == 1 のようになってますが、代入なので = にする必要があります。
また、関係ないですが、include  は 前に # をつける必要があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/17 18:41

    ありがとうございます!教えていただいた通り訂正しましたが、tの値しか表示されませんでした...他に間違っている所があるのでしょうか...

    キャンセル

  • 2016/01/17 19:35

    こちらの Ubuntu (Linux)の環境で試してみましたが、n や y も表示されています。たとえば、nmax に 4 を入れた場合、以下のようになっています。

    0.000000 (n=1, y=0.000000) (n=3, y=0.000000)
    0.002000 (n=1, y=0.187381) (n=3, y=0.178609)
    0.004000 (n=1, y=0.368125) (n=3, y=0.301609)
    0.006000 (n=1, y=0.535827) (n=3, y=0.330705)
    0.008000 (n=1, y=0.684547) (n=3, y=0.256838)
    0.010000 (n=1, y=0.809017) (n=3, y=0.103006)
    .... 省略

    原因はわかりませんが、まずは、nmax の値や内側のforで n の値がどうなっているかを値を出力するなどして調べてみてはどうでしょうか。

    printf( "倍数nの最大値を入力してください:");
    scanf( "%d", &nmax );

    printf("nmax = %d\n",nmax);
    for( t = 0.0; t < 1.002; t+=0.002 ){
    fprintf( fp, "%f ", t );
    for( n = 1; n <= nmax; n+=2 ){
    printf(" n = %d nmax = %d \n",n,nmax);

    キャンセル

  • 2016/01/17 19:46

    DaiGuard さんから回答がありましたが、fprintf の問題かどうかを切り分けるため、printf で画面に出力させて、nやyが表示されるか、試してみるのもいいかもしれません。

    キャンセル

  • 2016/01/19 13:01

    ありがとうございました!
    いろいろ試してみたところ、上手くいきました!

    #include <stdio.h>
    #include <math.h>

    int main(void)
    {
    int n, nmax;
    double t;
    double y;

    char filename[FILENAME_MAX];
    FILE *fp;

    printf("出力ファイル名 = ");
    scanf("%s", filename );

    fp = fopen( filename, "w" );

    if( fp == NULL ){
    printf("[%s] ファイル・オープンの失敗\n", filename );
    return(1);
    }

    printf( "倍数nの最大値を入力してください:");
    scanf( "%d", &nmax );

    fprintf ( fp, "t ");
    for (n = 1; n <= nmax; n+=2 ){
    fprintf( fp, "n=%d ", n );
    }

    for( t = 0.0; t < 1.002; t+=0.002 ){
    fprintf( fp, "\n%f ", t );
    for( n = 1; n <= nmax; n+=2 ){
    y = sin( 2.0 * M_PI * 15.0 * t * n ) / n;
    fprintf( fp, "%f ", y );
    }

    }

    fclose(fp);
    return(0);
    }

    キャンセル

0

for ループのところろが少しおかしいですね。あと、nはint型でいいのではないかと思います。
直したらこんな感じでしょうか。

for( t = 0.0; t < 1.002; t+=0.002 ){ 
    fprintf( fp, "%f ", t ); 
    for( n = 1; n <= nmax; n+=2 ){ 
        y = sin(2.0 * M_PI * 15.0 * t * n ); 
        fprintf( fp, "(n=%d, t=%f) ", n, y/n ); 
    } 
    fprintf( fp, "\n"); 
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/17 18:44

    ご丁寧な回答ありがとうございます。訂正してみたのですが、tの値しか表示されませんでした...他に間違いありましたら教えていただけると嬉しいです<m(__)m>

    キャンセル

0

私にはCygwin環境がなかったのでUbuntuのGCC環境でテストしてみましたが
このコードでちゃんと保存できました。

おそらくCygwinのfprintfではそういう仕様なのかもしれません

もし試せるようでしたら
fprintf( fp, "%f ", t ); 
の後でfseek(fp, 0, SEEK_CUR)を使用してファイル位置が進んでいるかどうか
確認してみてください。

かなり面倒ですが、進んでいないようでしたら
同じくfseek(fp, ○○,SEEK_CUR)を使用して進めてみたらいかがでしょうか

回答になっていなくて申し訳ありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/19 13:03

    回答ありがとうございます。
    なんとかCygwinで頑張ってみたところ、上手くいきました!

    教えて頂いた方法、また困ったときに参考にさせていただきます!

    キャンセル

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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