グラフの作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ととさん

グラフの作成

#1

投稿記事 by ととさん » 2年前

大学の課題で
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]

アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

Re: グラフの作成

#2

投稿記事 by purin52002 » 2年前

こんにちは

変数名に()は使えなかった気がします(使ったことないからわからないけど^^;)。

とりあえず必要な変数は x,y,t の3つだと思います。
for文で t を 0~6π までループして、
x=tcos(t)、y=tsin(t)の値を計算することはできますか?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

ととさん

Re: グラフの作成

#3

投稿記事 by ととさん » 2年前

for文で t を 0~6π までループして、
x=tcos(t)、y=tsin(t)の値を計算することはできますか

<ループの方法、πや整数以外の計算方法が全く分かりません(TT)

アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

Re: グラフの作成

#4

投稿記事 by purin52002 » 2年前

for分は以下のように書きます。

コード:

for(初期化式; 判定式; 処理1){処理2}
一般的に
初期化式:ループ変数の初期化
判定式:ループを続けるか判定
処理1:ループ変数の処理
処理2:目的の処理
となります。

今回の場合だとループ変数は t になり、
初期化式で t=0
判定式で t<=6π
処理1で t+=delta (deltaは自分で決める微小な値、小さいほど正確なグラフになる)
とすればいいと思います。

πや整数以外の計算方法 というのが何を指しているかちょっとわからなかったのでこっちは無視します^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

ととさん

Re: グラフの作成

#5

投稿記事 by ととさん » 2年前

ここまで作ってみたのですが、できませんでした…
何が原因でしょうか

コード:

#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;
 }

アバター
みけCAT
記事: 6216
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: グラフの作成

#6

投稿記事 by みけCAT » 2年前

初期化されていない自動変数x, yの値(不定)が計算に使われている(関数に渡されている)のがよくないですね。
やりたいことをよく理解していませんが、tから計算して代入する必要があるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: グラフの作成

#7

投稿記事 by かずま » 2年前

渦巻になるかどうか確かめるために作ったプログラムです。

コード:

#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: グラフの作成

#8

投稿記事 by かずま » 2年前

かずま さんが書きました:渦巻になるかどうか確かめるために作ったプログラムです。

コード:

const double PI = 3.115692653589793238;
すみません。円周率が間違っていました。訂正します。

コード:

const double PI = 3.141592653589793238;

返信

“C言語何でも質問掲示板” へ戻る