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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Q&A

解決済

3回答

3882閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

0グッド

0クリップ

投稿2016/01/17 08:45

編集2016/01/17 09:59

C言語初心者です

三角関数:y=(1/n)sin(2π15nt)について、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を使用しています。
↓ご指摘いただいた点を修正したソースコードです

C

1#include <stdio.h> 2#include <math.h> 3 4int main(void) 5{ 6 int n, nmax; 7 double t; 8 double y; 9 10 char filename[FILENAME_MAX]; 11 FILE *fp; 12 13 printf("出力ファイル名 = "); 14 scanf("%s", filename ); 15 16 fp = fopen( filename, "w" ); 17 18 if( fp == NULL ){ 19 printf("[%s] ファイル・オープンの失敗\n", filename ); 20 return(1); 21 } 22 23 printf( "倍数nの最大値を入力してください:"); 24 scanf( "%d", &nmax ); 25 26 for( t = 0.0; t < 1.002; t+=0.002 ){ 27 fprintf( fp, "%f ", t ); 28 for( n = 1; n <= nmax; n+=2 ){ 29 y = sin(2.0 * M_PI * 15.0 * t * n ); 30 fprintf( fp, "(n=%d, y=%f) ", n, y/n ); 31 } 32 fprintf( fp, "\n"); 33 } 34 35 fclose(fp); 36 return(0); 37}

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

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

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

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

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

guest

回答3

0

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

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

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

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

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

投稿2016/01/17 10:38

DaiGuard

総合スコア159

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

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

退会済みユーザー

退会済みユーザー

2016/01/19 04:03

回答ありがとうございます。 なんとかCygwinで頑張ってみたところ、上手くいきました! 教えて頂いた方法、また困ったときに参考にさせていただきます!
guest

0

ベストアンサー

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

投稿2016/01/17 09:03

yoshi777

総合スコア674

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

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

退会済みユーザー

退会済みユーザー

2016/01/17 09:41

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

2016/01/17 10: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);
yoshi777

2016/01/17 10:46

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

退会済みユーザー

2016/01/19 04: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); }
guest

0

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

c

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

投稿2016/01/17 08:58

KoichiSugiyama

総合スコア3041

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

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

退会済みユーザー

退会済みユーザー

2016/01/17 09:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問