C++でsinとcosのグラフを作成する方法

このQ&Aのポイント
  • C++でsinとcosのグラフを作成しようとしているが、うまくいかず悩んでいる。プログラムはコンパイルは成功しているが何も表れない。角度でx軸を表現する方法がわからない。
  • 開発環境はWindows Visual Studio 2008のC++。sin(x)とcos(x)の値を取得する関数myfを使用してグラフを描画している。
  • 三角関数sinとcosの値をグラフに描画するために、x軸とy軸の座標を設定している。グラフの縦軸の値はmyf関数を使用して取得し、特定の範囲の値に制限している。
回答を見る
  • ベストアンサー

C++ グラフ作成

sin と cosのグラフを作成しようとしているのですが、思うように行かず、悩んでいます。 一応試行錯誤の結果、下のようなプログラムを書いたのですが、コンパイルが成功しても何も表れないという悲しい現実が待っていました。*を表示させる部分を省くと、グラフが書けるのですが、そもそも三角関数を扱っているのにxを角度で表現するということすらできません。 有識者の方の回答をお待ちしています。よろしくお願いします。 なお、開発環境はwindows visual studio 2008のC++です。 #include <stdio.h> #include <math.h> #define Xmax 40 #define Ymax 40 char a[Xmax][Ymax],x,y; int myf(float x); int main(void){ for(x=0;x<Xmax;x++){ for(y=0;y<Ymax;y++){ a[x][y]=' '; } } for(y=0;y<Ymax;y++){ a[Xmax/2][y]='-'; } for(x=0;x<Xmax;x++){ a[x][Ymax/2]='|';} a[Xmax/2][Ymax/2]='+'; for(x=0;x<Xmax;x++){ for(y=0;y<Ymax;y++){ int y = myf(sin(x)); if(y>=0&&y<=1) a[x][y]='*'; } } for(x=0;x<Xmax;x++){ for(y=0;y<Ymax;y++){ int y = myf(cos(x)); if(y>=0&&y<=1) a[x][y]='*'; } } for(x=0;x<Xmax;x++){ for(y=0;y<Ymax;y++){ printf("%c",a[x][y]); } printf("\n"); } } int myf(float x){ double sin(double x); double cos(double x); y=sin(x); y=cos(x); return 5*cos(x); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

そもそも、sinとかcosとかに渡す引数はラジアンである、ということはおわかりでしょうか。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ちと gnuplot で確かめてみたけど, このプログラムなら「何も表れない」... じゃない, 「何も現れない」のが正解. そもそもどんな関数のグラフを出したいの? 普通 x は横軸にとりそうな気がするけど....

関連するQ&A

  • 実行結果を表示させたいです。

    以下のプログラムの計算結果を表示したいのですが、 うまく表示させられません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define KMAX 100 #define XMAX 300 #define PI 3.14159265358979323846 int main(void) { double ek = PI * 2.0 * 0.7 / XMAX; double a = 2.5 - 1.0; double fmax = 0.0; double fmin = 0.0; double f[XMAX]; int x, k; srand((unsigned)time(NULL)); for(x = 0; x < XMAX; x++){ f[x] = 0.0; for(k = 0; k < KMAX; k++){ double rk = k + 1.0; double kx = ek * rk * x; f[x] += pow((ek * rk), -a) * (ga() * cos(kx) - ga() * sin(kx)); } if(fmax < f[x]) fmax = f[x]; if(fmin > f[x]) fmin = f[x]; } } ga()はランダムな変数です。 どなたか教えてください。

  • visual C++だとコンパイルできるのに、borlandだとできません。

    borlandと、VisualC++の両方使っているのですが、VisualC++だとコンパイルでき、実行できます。 しかし、Borlandでコンパイルしようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 学校の課題で、Borlandでコンパイルしたいのですが、どうすればいいのか分かりません。 ソースを載せるので、どこがいけないのか、教えてください。 sin(x)の値を入力して、x度を求めるプログラミングです。 #include<stdio.h> #include<math.h> int main(void) { double x_mid, x0=0, x1=90, y_mid, y0, y1, M_PI=3.14159265358979; float y_ans; printf("sin(x)はいくつ?\n"); scanf("%f", &y_ans); for( ; ;) { x_mid=0.5*(x0+x1); y0=sqrt(1-cos(M_PI*x0/180)*cos(M_PI*x0/180)); y1=sqrt(1-cos(M_PI*x1/180)*cos(M_PI*x1/180)); y_mid=sqrt(1-cos(M_PI*x_mid/180)*cos(M_PI*x_mid/180)); if(y0-y_ans>0 || y1-y_ans<0) { printf("答えが出ません。もう一度sin(x)は?\n"); scanf("%f", &y_ans); continue; } if(fabs(y0-(double)y_ans) <= 0.000000001) break; else if((double)y_ans < y_mid) { x1=x_mid; } else { x0=x_mid; } } printf("sin(x)=%fのとき、xは%f度\n",y_ans, x0); return 0; }

  • C++でグラフをリスト構造で作る

    今、『グラフのデータを読み込んで、行列形式で配列に保存するプログラム』を作りました。下記に私の作ったそのプログラムがあります。しかしこの次にこれと同じことを「リスト構造」を使って作らないといけないのですがなかなかうまくいかないです。どのように作ればいいか分かる人がいたら教えてください! #include<stdio.h> #define hairetu 5 int main(void){ int x, y, i, j, a[hairetu][hairetu]; for(i=0; i<5; i++){ for(j=0; j<5; j++){ a[i][j]=0; } } printf("0以下の数を入れると終了します\n"); while(1){ printf("1~5の数のうち、2つ数字を入力しなさい\n"); scanf("%d%d", &x, &y); if(x<=0 || y<=0){ break; } else if(x>5 || y>5){ printf("エラー\n"); return 1; } a[x-1][y-1]=1; } for(i=0; i<5; i++){ printf("\n"); for(j=0; j<5; j++){ printf("%d", a[j][i]); } } printf("\n"); return 0; }

  • 碁盤目の経路数

    某大学院の入試問題で、碁盤目状の経路において視点(0, 0)から終点(xmax, ymax)までの経路を求めるプログラムなのですが、ア~エの所がどうしてもわかりません。教えて頂けないでしょうか。 #include <stdio.h> int xmax, ymax; /* 終点の座標 */ int search_path(int, int); int main(void) { int n; scanf("%d %d", &xmax, &ymax); /* xmaxとymaxを読む */ n = search_path(0, 0); /* (0,0)から(xmax,ymax)まで経路数を求める */ printf("%d\n", n); return 0; } int search_path(int x, int y) { if (ア) return 0; if (イ) return 1; return search_path(ウ) + search_path(エ); }

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。

  • ハンガリアン記法

    #include "CScreen.h" #include <math.h> //定数定義 #define LAST_PAS_X (30) #define PI 3.1415926f #define HI 0.035f //メイン関数 // 引数なし // 戻り値なし void main(void) { float sam=PI; float jim,zak=0,dom=12; int x=40,y=12,X,Y; CUROFF(); for(jim=1.0f;jim<dom;jim+=HI) //ループ開始 { X=(int)(x+cos(zak)*jim*2); Y=(int)(y+sin(zak)*jim); LOCATE(X,Y); COLOR(rand()%7+1); //色の処理 { printf("**"); //**入力 } WAIT(10); zak+=0.1F; while(zak>=sam*2) //*ループ { zak-=sam*2; } } //ループ終了 LOCATE(1,24); } このプログラムの変数名をハンガリアン記法で変えたいんですがよくわかりません。 教えてください。

  • プログラム

    #include "CScreen.h" #include <math.h> //定数定義 #define LAST_PAS_X (30) void main(void) { float sam=3.1415926f; float jim,zak=0,dom=12; int x=40,y=12,X,Y; CUROFF(); for(jim=1.0f;jim<dom;jim+=0.035f) //ループ開始 { X=(int)(x+cos(zak)*jim*2); Y=(int)(y+sin(zak)*jim); LOCATE(X,Y); COLOR(rand()%7+1); //色の処理 { printf("**"); //**入力 } WAIT(10); zak+=0.1F; while(zak>=sam*2) //*ループ { zak-=sam*2; } } //ループ終了 LOCATE(1,24); } 関数ヘッダとはなんですか。 どこに関数ヘッダを書けばいいのですか?  詳しく教えてください。

  • c言語

    #include<stdio.h> #define N 5 int main(){ double x[] = {1, 3, 4, 5.5, 7}; double y[] = {3, 5, 6, 8, 11}; double a = 0.028; double eta = 0.001; double dEda; int ite, i ; for (ite = 1; ite <= 1000; ++ite){ dEda = 0; for(i = 0; i < N; i++){ dEda = dEda + (a * x[i] - y[i]) * x[i]; } a = if (ite == 1 || ite == 10 || ite == 100) printf("%4d: a = %.8lf\n", ite, a); } printf("%4d: a = %.8lf\n", 1000, a); return 0; } このプログラムの a = の部分にa-(dE/da)*((d^2)E/d(a^2))^-1を代入したいのですがうまくいきません。((d^2)E/d(a^2))の値を格納する変数を用意してちゃんと計算できるようにするにはどうすればよいでしょうか? 補足 dE/da = Σ(ax-y)*x (d^2)E/d(a^2) = Σx^2 という計算になります。

  • ニュートン法

    ケプラー方程式x-e*sin(x)-c=0の解をステップ数とともに出力するプログラムで、e,cはそれぞれ0.5と1です。 xに値を入力して計算させるのですが、どうしてもできません。 下のプログラムリストでおかしいところはどこでしょうか? // ニュートン法 x-e*sin(x)-c=0 #include <stdio.h> #include <math.h> #define e 0.5 #define c 1.0 #define K 10000 double fun(double x); double bibun(int i,double x); float m=1.0,n=1.0; int i=1; main(){ float x1,x2; float z; printf("初期値x0を入力して下さい\n"); scanf("%f",&x1); for(i=0;i<=K;i++){ x2 = x1 - fun(x1)/bibun(i,x1); x1 = x2; z = fun(x1); z = fabs(z); if(fabs(z)<=0.00001){ break; } if(i==K){ printf("収束しません\n"); exit(0); }    } printf("解 = %f\n",x1); printf("ステップ数 = %d",i); return 0; } // 関数f(x) double fun(double x1){ double r; r = x1 - e * sin(x1) - c; return r; } // 微分 double bibun(int i,double x1){ float p; if(i%2==1){ p = pow((-1.0),m)*e*sin(x1); m++; } else { p = pow((-1.0),n)*e*cos(x1); n++; } return p; }

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

専門家に質問してみよう