|
ファイル名 cond1.rr
1: def main(A,B) {
2: print(A+B);
3: print("A kakeru B=",0);
4: print(A*B);
5: }
6: end$
実行例
[0] load("cond1.rr");
[1] main(43,900)$
943
A kakeru B=38700
|
|
左のプログラムはあたらえられた二つの数の和と積を出力するプログラムである.
関数の引数として数 A, B を読み込む.
2, 3 行目で和と積を計算して出力する.
{ と } かこんだものが
ひとかたまりの単位である.
実行は自前の関数 main() に数字をいれて評価すればよい.
字さげ(インデントという)をしてわかりやすく書いていることに注意.
なお,
cond1.rr のロードが失敗する場合は,
|
|
プログラム
/* cond2.rr */
def main(A,B) {
if ( A > B ) {
C=A;
}else{
C=B;
}
print(C);
}
end$
出力結果
[0] load("cond2.rr");
[1] = main(2,-54354)$
2
|
|
プログラム
/* cond2.rr */
def main(A,B) {
if ( A > B ) {
C=A;
}else{
C=B;
}
return(C);
}
end$
出力結果
[0] load("cond2.rr");
[1] = main(2,-54354);
2
|
/* と */ でかこまれた部分はコメントであり,
プログラムとはみなされない.
プログラム全体で利用される定数は, define 文で宣言しておくとよい.
たとえば,
#define AAA 10
と書いておくと, 以下 AAA があらわれるとすべて 10 でおきかえられる.
この置き換えは, プログラムのロード時におこなわれるので,
AAA=10 とするより実行速度の点で有利である.
|
プログラム
/* cond3.rr */
def main() {
Result = 0;
for (K = 1; K<= 10; K++) {
Result = Result + K^2;
}
print(Result);
}
end$
実行例
[0] load("cond3.rr");
[1] main()$
385
|
|
左のプログラムは
問題 5.1 [05]
|
|
プログラム
/* cond3a.rr */
def main(N) {
Result = 0;
for (K = 1; K<= N; K++) {
Result = Result + K^2;
}
print(Result);
}
end$
実行例
[0] load("cond3a.rr");
[1] main(10)$
385
[2] main(20)$
2870
|
|
左のプログラムは
N の実際の値は, 例のように main の後に 与えればよい. |
|
プログラム
def main() {
for (X=-990; X<=990; X++) {
if (X^2-89*X-990 == 0) {
print(X);
break;
}
}
}
main()$
end$
|
|
このプログラムは 2 次方程式
|
|
プログラム
/* cond4.m */
load("glib");
def main0() {
glib_open();
glib_window(0,0,1,1);
glib_putpixel(0.8,0.5);
glib_line(0,0,1,0.5);
glib_line(0,0,1,1);
}
end$
|
| 繰り返しをつかってグラフィックスを書く前にちょっとトレーニングを. 左のプログラムは・をうって, 線分を二本か書くプログラムである. glib_window では, グラフィックを表示する座標系の設定をしている. 引数の 0,0,1,1 は 座標 (0,0) を画面の 左上に, 座標 (1,1) を画面の右下にせよという意味である. glib で始まる関数については, 本章末の 5.3 節の解説を参照. |
/* cond5.rr */
load("glib")$
def main() {
glib_open();
glib_window(0,0,100,100);
for (K=1; K<=100; K = K+8) {
glib_line(0,0,70,K);
}
}
end$
|
|
プログラムを実行するには, ロードしたあと, main(); と入力する.
左のプログラムは傾きが段々おおきくなっていく線分達を描く.
K = K+8 は K += 8 と書いた方が簡潔である. |
/* cond7.rr */
load("glib")$
def main() {
for (A=0.0; A<=2; A += 0.8) {
plot(sin(5*x)+A*sin(2*x),
[x,0,10*3.14]);
}
}
end$
|
|
プログラムを実行するには, ロードしたあと, main(); と入力する.
このプログラムは
のグラフを |
/* taylor.rr */
load("glib")$
def taylor(N) {
glib_open();
glib_window(-5,-2,5,2);
glib_clear();
F = 0;
for (I=0; I<=N; I++) {
F=F+
(-1)^I*x^(2*I+1)/fac(2*I+1);
}
print("sin(x) の Taylor 展開 :",0);
print(2*N+1,0);
print(" 次までは ");
glib_line(-5,0,5,0);
glib_line(0,-5,0,5);
print(F);
for (K=-5; K<=5; K = K+0.03) {
glib_putpixel(K,subst(F,x,K));
}
}
print("Type in, for example,
taylor(2);taylor(4);")$
end$
|
|
taylor(N); と入力すると,
このプログラムは
のテイラー展開
を 2*N+1 次まで計算して, グラフを描く. たとえば taylor(4); と入力してみよう. subst(F,x,K) は 式 F の中の x を 数 K で置き換えた結果を戻す. |
load("glib")$
def fourier(N) {
glib_open();
glib_window(-5,-5,5,5);
glib_clear();
F = 0;
for (I=1; I<=N; I++) {
F=F+(-1)^(I+1)*sin(I*x)/I;
}
F = 2*F;
print("x の Fourier 展開 :",0);
print(N,0);
print(" 次までは ");
glib_line(-5,0,5,0);
glib_line(0,-5,0,5);
glib_line(deval(-@pi),deval(-@pi),
deval(-@pi),deval(@pi));
glib_line(deval(@pi),deval(-@pi),
deval(@pi),deval(@pi));
print(F);
for (K=-5; K<=5; K = K+0.03) {
glib_putpixel(
K,deval(subst(F,x,K)));
}
}
print("Type in, for example,
fourier(4); fourier(10);")$
end$
|
|
fourier(N); と入力すると,
このプログラムは
の Fourier 展開
を N 次まで計算して, グラフを描く. deval(F) は F を double の精度で (11 章を見よ), 数値計算する. subst(F,x,K) では 2*sin(0.5)-sin(1.0) みたいな
式に変形されるだけなので, deval
による評価が必要である.
|
|
プログラム
/* cond6.m */
def main() {
for (I=1; I<=3; I++) {
print("<<<");
for(J=1;J<=2;J++) {
print("I=",0);
print(I);
print("J=",0);
print(J);
}
print(" >>>");
}
}
end$
|
| for の中に for を入れることもできる. 実行例をよくみて I, J の値がどう変わっていっているか 見て欲しい. |
実行例
main(); <<< I=1 J=1 I=1 J=2 >>> つづきは右 |
<<< I=2 J=1 I=2 J=2 >>> <<< I=3 J=1 I=3 J=2 >>> |
|
プログラム
/* cond77.rr */
def main() {
for (X=1; X<10; X++) {
for (Y=1; Y<10; Y++) {
for (Z=1; Z<10; Z++) {
if (X^2+Y^2 == Z^2) {
print([X,Y,Z]);
}
}
}
}
}
end$
実行例
[346] load("cond77.rr");
1
[349] main();
[3,4,5]
[4,3,5]
0
|
|
問題 5.2 [15]
もっと早く整数解を見つけられるようにプログラムを改良せよ.
ちなみに, この方程式の解は理論的によくわかっているので,
その結果を使うのは反則.
|
def main() {
for (K=0; K<5; K++) {
print(K);
}
}
この関数を while を使って書き換えよ.