ページ 1 / 1
グラフの作成
Posted: 2017年7月24日(月) 11:21
by ととさん
大学の課題で
x = t cos t, y = t sin t (0 ≤ t ≤ 6π)のグラフを作成したいのですが
以下のようにfor文を書いてみたものの全く作成されません。
どの様に改善したらよいでしょうか。
※正解は渦巻きのようなグラフになります。
[date]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *fp;
double sin(x),cos(x);
if ((fp = fopen("graph.csv", "w")) == NULL){ /* ファイルを開く */
/* 開けなかった場合の処理 */
fprintf(stderr, "Cannot open 'graph.csv'\n");
exit(1);
}
for(cos(x)=0; cos(x) <=18.8495559; cos(x)+=0.01)
fprintf(fp,"%f,%f\n",cos(x),sqrt(1-x*x)+sqrt(fabs(x)));
for(sin(x)=0; sin(x) >=-18.8495559; cos(x)-=0.01)
fprintf(fp,"%f,%f\n",cos(x),-sqrt(1-x*x)+sqrt(fabs(x)));
fprintf(fp,"-1,1\n");
fclose(fp); /* ファイルを閉じる */
return 0;
}
[/date]
Re: グラフの作成
Posted: 2017年7月24日(月) 14:15
by purin52002
こんにちは
変数名に()は使えなかった気がします(使ったことないからわからないけど^^;)。
とりあえず必要な変数は x,y,t の3つだと思います。
for文で t を 0~6π までループして、
x=tcos(t)、y=tsin(t)の値を計算することはできますか?
Re: グラフの作成
Posted: 2017年7月25日(火) 14:35
by ととさん
for文で t を 0~6π までループして、
x=tcos(t)、y=tsin(t)の値を計算することはできますか
<ループの方法、πや整数以外の計算方法が全く分かりません(TT)
Re: グラフの作成
Posted: 2017年7月25日(火) 14:45
by purin52002
for分は以下のように書きます。
コード:
for(初期化式; 判定式; 処理1){処理2}
一般的に
初期化式:ループ変数の初期化
判定式:ループを続けるか判定
処理1:ループ変数の処理
処理2:目的の処理
となります。
今回の場合だとループ変数は t になり、
初期化式で t=0
判定式で t<=6π
処理1で t+=delta (deltaは自分で決める微小な値、小さいほど正確なグラフになる)
とすればいいと思います。
πや整数以外の計算方法 というのが何を指しているかちょっとわからなかったのでこっちは無視します^p^
Re: グラフの作成
Posted: 2017年7月27日(木) 16:59
by ととさん
ここまで作ってみたのですが、できませんでした…
何が原因でしょうか
コード:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *fp;
double x, y, t;
if ((fp = fopen("graph.csv", "w")) == NULL){ /* ファイルを開く */
/* 開けなかった場合の処理 */
fprintf(stderr, "Cannot open 'graph.csv'\n");
exit(1);
}
for(t=0; t<=18.8495559; t+=1)
fprintf(fp,"%f,%f\n",cos(x),sqrt(1-x*x)+sqrt(fabs(x)));
for(t=0; t<=18.8495559; t+=1)
fprintf(fp,"%f,%f\n",sin(y),sqrt(1-y*y)+sqrt(fabs(y)));
fprintf(fp,"-1,1\n");
fclose(fp); /* ファイルを閉じる */
return 0;
}
Re: グラフの作成
Posted: 2017年7月27日(木) 22:09
by みけCAT
初期化されていない自動変数x, yの値(不定)が計算に使われている(関数に渡されている)のがよくないですね。
やりたいことをよく理解していませんが、tから計算して代入する必要があるかもしれません。
Re: グラフの作成
Posted: 2017年7月27日(木) 23:08
by かずま
渦巻になるかどうか確かめるために作ったプログラムです。
コード:
#include <stdio.h> // printf
#include <string.h> // memset
#include <math.h> // cos, sin
const int N = 256; // 分割数 (点の個数は N+1)
const double PI = 3.115692653589793238;
const double MAX = 20;
char screen[20][40];
void plot(double x, double y)
{
int i = 10 * (1 - y / MAX);
int j = 20 * (1 + x / MAX);
screen[i][j] = '*';
}
void display()
{
for (int i = 0; i < 20; i++)
printf("%.40s\n", screen[i]);
}
int main(void)
{
double a, b, delta, t, x, y;
int i;
memset(screen, ' ', sizeof screen);
a = 0, b = 6 * PI;
delta = (b - a) / N;
for (i = 0; i <= N; i++) {
t = a + delta * i;
x = t * cos(t);
y = t * sin(t);
plot(x, y);
}
display();
return 0;
}
問題の解答ではありませんが、参考にはなると思います。
Re: グラフの作成
Posted: 2017年7月28日(金) 08:07
by かずま
かずま さんが書きました:渦巻になるかどうか確かめるために作ったプログラムです。
コード:
const double PI = 3.115692653589793238;
すみません。円周率が間違っていました。訂正します。
コード:
const double PI = 3.141592653589793238;