- (問題1)
以下のプログラムを作成せよ.
"S:\a.txt" を "wt" モードで開く.
そのファイルが開けなかったら,
perror("file can not open");
exit(1);
を実行する.
開けたら,そのファイルに
double x[4], y[4];
x[0]=0.0; y[0]=0.0;
x[1]=1.0; y[1]=0.0;
x[2]=1.0; y[2]=1.0;
x[3]=0.0; y[3]=1.0;
fprintf( fp, "%lf\t%lf\n", x[0], y[0]);
fprintf( fp, "%lf\t%lf\n", x[1], y[1]);
fprintf( fp, "%lf\t%lf\n", x[2], y[2]);
fprintf( fp, "%lf\t%lf\n", x[3], y[3]);
fprintf( fp, "%lf\t%lf\n", x[0], y[0]);
と,書き込む.
そして,ファイルを閉じる.
ただし,fp は "S:\a.txt" のファイルポインタ.
C言語上では"S:\\a.txt"となることに注意せよ.
fprintf内の "\t" はタブ文字である.
そして,そのプログラムを実行し,
できあがった"S:\a.txt" をエクセルで開き,
散布図(マーカーなし,線あり)でグラフにせよ.
ヒント:
・正方形型に表示される.
・エクセルやサクラエディタで "S:\a.txt" を開いている状態で,
同ファイルを "wt" モードで開こうとすると失敗する.
- (問題2)
以下のプログラムを作成せよ.
"S:\a.txt" を "wt" モードで開き,(開けなかった 問題1 と同様)
そのファイルに
x = 0.0 かつ y = sin(x) の状態で,
fprintf( fp, "%lf\t%lf\n", x, y);
と書き込む.
x = 0.1 かつ y = sin(x) の状態で,
fprintf( fp, "%lf\t%lf\n", x, y);
と書き込む.
x = 0.2, y = sin(x) で fprintf( fp, "%lf\t%lf\n", x, y);
x = 0.3, y = sin(x) で fprintf( fp, "%lf\t%lf\n", x, y);
x = 0.4, y = sin(x) で fprintf( fp, "%lf\t%lf\n", x, y);
:
x = 9.9, y = sin(x) で fprintf( fp, "%lf\t%lf\n", x, y);
そして,ファイルを閉じる.
また,三角関数のsinを用いるために,
プログラムの先頭近辺(#includeの直後)に
#include <math.h>
を記述せよ.
できあがったファイルを エクセルで開き,
散布図でグラフにせよ.
- (問題3)
座標(x0, y0)を,原点を中心にθだけ回転した
座標(x1, y1)は,
x1 = cos(θ)*x0 + sin(θ)*y0;
y1 = -sin(θ)*x0 + cos(θ)*y0;
で,求めることができる.
以下のプログラムを作成せよ.
double x[4], y[4];
x[0]=0.0; y[0]=0.0;
x[1]=1.0; y[1]=0.0;
x[2]=1.0; y[2]=1.0;
x[3]=0.0; y[3]=1.0;
とする.
"S:\a.txt" を開き,
( x[0], y[0] )を θ=0.1 だけ回転した座標を
"%lf\t%lf\n"の フォーマットでファイルに書き込む.
( x[1], y[1] )を θ=0.1 だけ回転した座標を書き込む.
( x[2], y[2] )を θ=0.1 だけ回転した座標を書き込む.
( x[3], y[3] )を θ=0.1 だけ回転した座標を書き込む.
( x[0], y[0] )を θ=0.1 だけ回転した座標を書き込む.
そして,ファイルを閉じる.
できあがったファイルを エクセルで開き,
散布図でグラフにせよ.
- (問題4)
以下のプログラムを作成せよ.
double x[4], y[4];
x[0]=0.0; y[0]=0.0;
x[1]=1.0; y[1]=0.0;
x[2]=1.0; y[2]=1.0;
x[3]=0.0; y[3]=1.0;
とする.
"S:\a.txt" を開き,
x[0], y[0] を θ=0.0 だけ回転した座標,
x[1], y[1] を θ=0.0 だけ回転した座標,
x[2], y[2] を θ=0.0 だけ回転した座標,
x[3], y[3] を θ=0.0 だけ回転した座標,
x[0], y[0] を θ=0.0 だけ回転した座標,
空行
を書き込む.
x[0], y[0] を θ=0.1 だけ回転した座標,
x[1], y[1] を θ=0.1 だけ回転した座標,
x[2], y[2] を θ=0.1 だけ回転した座標,
x[3], y[3] を θ=0.1 だけ回転した座標,
x[0], y[0] を θ=0.1 だけ回転した座標,
空行
を書き込む.
x[0], y[0] を θ=0.2 だけ回転した座標,
x[1], y[1] を θ=0.2 だけ回転した座標,
x[2], y[2] を θ=0.2 だけ回転した座標,
x[3], y[3] を θ=0.2 だけ回転した座標,
x[0], y[0] を θ=0.2 だけ回転した座標,
空行
を書き込む.
x[0], y[0] を θ=0.3 だけ回転した座標,
x[1], y[1] を θ=0.3 だけ回転した座標,
x[2], y[2] を θ=0.3 だけ回転した座標,
x[3], y[3] を θ=0.3 だけ回転した座標,
x[0], y[0] を θ=0.3 だけ回転した座標,
空行
を書き込む.
;
x[0], y[0] を θ=0.9 だけ回転した座標,
x[1], y[1] を θ=0.9 だけ回転した座標,
x[2], y[2] を θ=0.9 だけ回転した座標,
x[3], y[3] を θ=0.9 だけ回転した座標,
x[0], y[0] を θ=0.9 だけ回転した座標,
空行
を書き込む.
そして,ファイルを閉じる.
できあがったファイルを エクセルで開き,
散布図でグラフにせよ.
ヒント:エクセルでは,空行があるとそこで線が途切れる
できあがる絵は このような感じになる.
- (問題5)
コッホ曲線を描くプログラムを作成せよ.
コッホ曲線は,以下の様に作成できる.
・(a)の様な線分を描く.
・(a)を3等分し,
中央の線(a1)を辺とする正三角形を描く(図の(b1)や(b2)を描く).
・代わりに(a1)を消して,(b)の状態(4本の線)にする.
・(b)の状態の4本の各線に,上記の「3等分,正三角形を足す,元の線を消す」を行い,
(c)の状態にする.
・(c)の状態の各線(16本)に,「3等分,正三角形を足す,元の線を消す」を行い,64本にする.
以下同様に繰り返す.
例
再帰を用いて,コッホ曲線の座標をファイルに出力する関数
void koch(double x0, double y0, double x1, double y1, int n, FILE *fp);
を作成し,それをmain関数より呼び出し,エクセルで表示せよ.
ただし,引数の(x0, y0)は,コッホ曲線を描く始点,
引数の(x1, y1)は,コッホ曲線の終点.
int n は再帰の深さを表す.
n==0 なら これ以上再帰せず,
座標(x0,y0)と座標(x1,y1)をファイルfpに出力する.
0<n なら (x0,y0)-(x1,y1) の線分を3等分し,4個の線分に変換し,
それぞれに koch() を再帰的に呼び出す.
その際,第5引数は n-1 に変更する.
円周率πを用いるためには,
プログラムの先頭近辺(#includeの直後)に
#define _USE_MATH_DEFINES // for C++
#include <cmath>
を記述し,M_PI を用いる.
例:x = sin( M_PI/3.0 );
平方根を用いるには,
プログラムの先頭近辺(#includeの直後)に
#include <math>
を記述し,sqrt() を用いる.
例:x = sqrt( 3.0 )/2.0;
ヒント:
main関数でファイルを開き,koch関数には fp を渡す.