Annotation of OpenXM/src/cfep/Doc/Intro/next2.tex, Revision 1.9
1.1 takayama 1: % makeindex next2.idx
1.2 takayama 2: % License: GNU Free Documentation License 1.2.
1.1 takayama 3: \documentclass{jbook}
1.9 ! takayama 4: %\usepackage{html}
1.1 takayama 5: \usepackage{makeidx}
6: \usepackage{ascmac}
7: \usepackage[dvips]{graphicx}
8: \textwidth = 15cm
9: \textheight = 23cm
10:
11: \topmargin = 0.7cm
12: \evensidemargin = 0cm
13: \oddsidemargin = 1cm
14:
15: \def\comment#1{ #1 }
16: %\def\comment#1{ }
17: \input{asirbookmacro}
18:
1.9 ! takayama 19: \title{ {\bf 超入門 Cfep/asir (MacOS X)} }
! 20: \author{ 高山信毅 }
! 21: \date{ 2006年(平成18年), 3月12日版(cfep 1.1). 2008-09-26, 2009-09-19, 2012-08-28 修正 \\ コメントは takayama@math.kobe-u.ac.jp まで}
1.1 takayama 22: \makeindex
23:
24: \begin{document}
25: \maketitle
26: \tableofcontents
27:
1.9 ! takayama 28: \chapter{ 電卓としての利用 } \label{chapter:next}
1.1 takayama 29: %en \chapter{A Tour of Asir} \label{chapter:next}
30:
1.9 ! takayama 31: 神戸大学の教育用計算機環境が MacOS X に変更されるのに伴い,
! 32: 筆者が教材として利用していた Windows で動作する10進Basicが利用できなくなった.
! 33: Cfep/asir はその代用として,
! 34: 2006年初頭から開発を進めているシステムである.
! 35: 10進Basicの優れている点の一つは, 丁寧な入門解説が付属していることである.
! 36: ``Cfep/asir超入門'' はこの解説にすこしでも近付こうと努力してみた.
! 37: Asirの入門テキストに ``Asirドリル'' があるが, この超入門では ``Asirドリル''
! 38: の一章およびその先の入門的内容を丁寧に(少々くどく)説明した.
1.1 takayama 39:
40: \bigbreak
41:
1.9 ! takayama 42: この節では MacOS X での cfep/asir の起動法, 電卓風, Basic風の使い方を説明する.
! 43: ファイルの保存等 MacOS X の共通の操作方法にはほとんどふれていないが,
! 44: cfep/asir は MacOS X 標準のファイルの保存等を用いているので,
! 45: このような部分では他のソフトウエアと利用方法は同一である.
! 46: 初心者の人は適当な本やガイドを参照されたい.
1.1 takayama 47:
48:
1.9 ! takayama 49: \section{キー操作と用語の復習}
1.1 takayama 50:
51: \noindent
1.9 ! takayama 52: キーボード, マウスの操作の用語.
1.1 takayama 53: \begin{enumerate}
54: %
55: \item
1.9 ! takayama 56: \fbox{\tt Command} キーや
! 57: \fbox{\tt ALT } キーや \fbox{\tt SHIFT} キーや
! 58: \fbox{\tt CTRL } キーは他のキーと一緒に押すことで始めて機能する
! 59: キーである.これらだけを単独に押してもなにもおきない.
! 60: 以後 \fbox{\tt SHIFT} キーをおしながら他のキーを押す操作を
! 61: \shift{きー} と書くことにする. command キー, alt キー, ctrl キーについても
! 62: 同様である.
1.1 takayama 63: %
64: \item
1.9 ! takayama 65: \shift{a} とすると大文字の A を入力できる.
1.1 takayama 66: %
67: \item
1.9 ! takayama 68: \fbox{\tt BS} とか \fbox{\tt DEL} と書いてあるキー押すと一文字前を消去できる.
1.1 takayama 69: %
1.9 ! takayama 70: \item 日本語キーボードの場合 \fbox{{\tt $\backslash$}}
! 71: (バックスラッシュ) は \alt{\yen} で入力できる.
1.1 takayama 72: %
73: \item
1.9 ! takayama 74: \fbox{\tt SPACE} キーは空白を入力するキーである.
! 75: 計算機の内部では文字は数字に変換されて格納および処理される.
! 76: 文字に対応する数字を文字コードと呼ぶ. 文字コードにはいろいろな種類のものがあるが,
! 77: 一番基礎的なのはアスキーコード系であり, アルファベットや数字, キーボードに現れる
! 78: 記号などをカバーしている. 漢字はアスキーコード系では表現できない.
! 79: \fbox{A} のアスキーコードは 65番である. 以下 \fbox{B} が 66, \fbox{C} が 67,
! 80: と続く.
! 81: 空白のアスキーコードは32番である.
! 82: 日本語入力の状態で入力される空白は ``全角空白'' と呼ばれており,
! 83: アスキーコード32番の空白 (半角空白) とは別の文字である.
! 84: 全角空白がプログラムに混じっているとエラーを起こす.
! 85: asir ではメッセージやコメント等に日本語が利用可能であるが,
! 86: 慣れるまでは英字モードのみを利用することをお勧めする.
! 87: 右上の言語表示が
1.1 takayama 88: \begin{center}
89: \scalebox{0.1}{\includegraphics{Figs/language.ps}}
90: \end{center}
1.9 ! takayama 91: となっている状態で cfep/asir に入力しよう.
1.1 takayama 92: %
93: \item
1.9 ! takayama 94: \fbox{ ' } (シングルクオート) と \fbox{ ` } (バッククオート)
! 95: は別の文字である.
! 96: プログラムを読む時に注意.
! 97: また, プログラムを読む時は {\tt 0} (ゼロ)と {\tt o} (おー)
! 98: の違いにも注意.
1.1 takayama 99: %
100: %
101: \item
1.9 ! takayama 102: マウスの操作には次の三種類がある.
1.1 takayama 103: %
104: %
105: \begin{enumerate}
1.9 ! takayama 106: \item クリック: 選択するとき,
! 107: 文字を入力する位置(キャレットの位置)の移動に用いる.
! 108: マウスのボタンをちょんとおす. \index{くりっく@クリック}
! 109: \item ドラッグ: 移動, サイズの変更, 範囲の指定, コピーの
! 110: ときなどに用いる.
! 111: マウスのボタンを押しながら動かす.
! 112: \item ダブルクリック:プログラムの実行, open(ファイルを開く)をするために
! 113: 用いる. \index{だぶるくりっく@ダブルクリック}
! 114: マウスのボタンを2回つずけてちょんちょんとおす.
! 115: ダブルクリックをしたアイコンは白くなったり形状がかわることが
! 116: おおい.
! 117: ダブルクリックしたらしばらく待つ.
! 118: 計算機が忙しいときは起動に時間がかかることもあり.
! 119: むやみにダブルクリックを繰り返すとその回数だけ起動されてなお遅くなる.
1.1 takayama 120: \end{enumerate}
121: %
122: \end{enumerate}
123:
124:
1.9 ! takayama 125: \section{ Cfep/Asir の起動法と電卓的な使い方 }
1.1 takayama 126: %en \section{Using Risa/Asir as a Calculator}
127: %C
128:
1.9 ! takayama 129: cfep のアイコン(いのぶた君)
1.1 takayama 130: %en
131: %en In case of Windows, open the folder (directory) in which Risa/Asir is
132: %en installed and double click the icon of {\tt asirgui}
133: %<C
134: \begin{center}
135: \scalebox{0.1}{\includegraphics{Figs/inobuta.ps}}
136: \end{center}
137: %>C
1.9 ! takayama 138: をダブルクリックすると図\ref{fig:cfepStart}のように cfep/asir が起動する.
! 139: 以下 cfep/asir を単に asir とよぶ.
1.1 takayama 140:
141: %<C
142: \begin{figure}[tb]
143: \scalebox{0.5}{\includegraphics{Figs/cfepStart.ps}}
1.9 ! takayama 144: \caption{ cfep/asir の起動画面} \label{fig:cfepStart}
1.1 takayama 145: \end{figure}
146: %>C
147:
1.9 ! takayama 148: 図\ref{fig:cfepStart} の入力窓に計算したい式やプログラムを入力して
! 149: ``始め''ボタン
1.1 takayama 150: %<C
151: \begin{center}
152: \scalebox{0.1}{\includegraphics{Figs/buttonStart.ps}}
153: \end{center}
154: %>C
1.9 ! takayama 155: をおすと実行を開始する.
! 156: 式の計算やプログラムの実行が終了すると,
! 157: 新しいウインドウ OutputView が開き結果がそのウインドウに表示される.
! 158: \index{にゅうりょくまど@入力窓}
1.1 takayama 159: \index{OutputView}
1.9 ! takayama 160: ``始め''ボタンをおして実行を開始することを計算機用語では
! 161: ``入力の評価を始める'' という.
! 162: \index{;} \index{ひょうか@評価}
! 163:
! 164: 出力小窓にはシステムからのいろいろな情報が出力されるが,
! 165: 内容は中上級者向けのものが多い.
! 166: \index{しゅつりょくこまど@出力小窓}
1.1 takayama 167:
1.9 ! takayama 168: ファイルメニュー
1.1 takayama 169: %<C
170: \begin{center}
171: \scalebox{0.3}{\includegraphics{Figs/menuFile.eps}}
172: \end{center}
173: %>C
1.9 ! takayama 174: から''保存''や''別名で保存''を実行すると入力窓の内容をファイルとして保存できる.
! 175: 出力小窓の内容や OutputView の内容は保存されないので注意してほしい.
1.1 takayama 176:
1.9 ! takayama 177: cfep/asir を完全に終了するには cfep メニュー
1.1 takayama 178: %<C
179: \begin{center}
180: \scalebox{0.3}{\includegraphics{Figs/menuCfep.eps}}
181: \end{center}
182: %>C
1.9 ! takayama 183: の ``cfep を終了'' を実行する.
1.1 takayama 184: %en Input \verb@ quit; @ to terminate the Risa/Asir.
185: %
186: %
187:
188: %<C
189: \bigbreak
190: \bigbreak
191:
192: %>C
193:
194:
1.9 ! takayama 195: さて図\ref{fig:cfepStart}では
! 196: $ 3 \times 4 + 1 $ の計算をしている.
1.1 takayama 197: \begin{screen}
1.9 ! takayama 198: Asir における計算式は普通の数式と似ていて,
! 199: 足し算は {\tt $+$},
! 200: 引き算は {\tt $-$}
! 201: と書く.
! 202: かけ算と割算は $\times$ や ÷ がキーボードにないという歴史的理由もあり,
! 203: それぞれ {\tt *} と {\tt /} で表現する.
! 204: 累乗 $P^N$ は \verb@P^N@ のように \verb@^@ 記号を用いて表す.
1.1 takayama 205: \end{screen}
206:
207: \begin{screen}
1.9 ! takayama 208: 式の終りを処理系(asir)に教える(示す)のに {\tt ;} (セミコロン)
! 209: を書かないといけない.
! 210: 文末の ``。'' のような役割を果たす.
! 211: またかけ算の記号 {\tt *} の省略はできない.
1.1 takayama 212: \end{screen}
213:
214: \begin{example} \rm
1.9 ! takayama 215: 以下の左の計算式を asir では右のようにあらわす.
1.1 takayama 216: \begin{center}
217: \begin{tabular}{|l|l|} \hline
218: $2 \times (3+5^4)$ & \verb@2*(3+5^4);@ \\ \hline
219: $\left\{\left(2+\frac{2}{3}\right)\times 4+\frac{1}{3}\right\}\times 2 +5 $
220: & \verb@ ((2+2/3)*4+1/3)*2+5; @ \\ \hline
221: $AX+B$ & \verb@A*X+B;@ \\ \hline
222: $AX^2+BX+C$ & \verb@A*X^2+B*X+C;@ \\ \hline
223: $\frac{1}{X-1}$ & \verb@1/(X-1);@ \\ \hline
224: \end{tabular}
225: \end{center}
226: \end{example}
227:
1.9 ! takayama 228: 計算の順序は括弧も含めて普通の数式の計算と同じである.
! 229: ただし
! 230: 数学ではかっことして, {\tt [,]},{\tt \{,\}}などがつかえるが
! 231: asir では {\tt (,)} のみ.
! 232: {\tt [,]} や {\tt \{,\}}は別の意味をもつ.
! 233: 上の例のように {\tt (,)} を何重にもつかってよい.
1.1 takayama 234: %en In mathematics, {\tt (,)}, {\tt [,]} ,{\tt \{,\}} are used
235: %en as brackets in expressions,
236: %en but in Risa/Asir, only {\tt (,)} can be used as brackets in expressions,
237: %en and {\tt [,]} and {\tt \{,\}} are used for different purposes (list and
238: %en grouping in programs).
1.9 ! takayama 239: この場合括弧の対応関係がわかりにくい.
! 240: 括弧の対応を調べたい範囲をマウスでドラッグして選択し,
1.1 takayama 241: \begin{center}
242: \scalebox{0.1}{\includegraphics{Figs/buttonBracket.eps}}
243: \end{center}
1.9 ! takayama 244: ボタンをおすことにより括弧の対応を調べることができる.
1.1 takayama 245: \begin{figure}[tb]
246: \begin{center}
247: \scalebox{0.5}{\includegraphics{Figs/menuCheckBracket.eps}}
248: \end{center}
1.9 ! takayama 249: \caption{括弧の対応} \label{fig:menuCheckBracket}
1.1 takayama 250: \end{figure}
1.9 ! takayama 251: 図\ref{fig:menuCheckBracket}の例では \verb@(1+2*(3+4))@ と書くべきところを
! 252: \verb@(1+2*(3+4)@ と書いておりエラーが表示されている.
1.1 takayama 253:
254: \bigbreak
255:
256: \noindent \QQQ
1.9 ! takayama 257: ``Basic風の使い方を説明する'' と書いてありましたが, Basic って何ですか? \\
1.1 takayama 258: \noindent \AAA
1.9 ! takayama 259: コンピュータに仕事をさせるには最終的にはプログラム言語
! 260: (計算機への仕事の手順を指示するための人工言語)を用いる.
! 261: ワープロ等もプログラム言語で記述されている.
! 262: Basic は最も古いプログラム言語の一つであり, 初心者にやさしく, かつ
! 263: 計算機の仕組みやプログラム言語の理解にも有用である.
! 264: Basic は高校の数学の教科書等にも登場する.
! 265: 著者はいままで ``10進BASIC'' を初心者向け教材として活用していたが,
! 266: ``10進BASIC''が MacOS X で動作しないため cfep を開発した.
! 267: Asir 言語もプログラム言語であり Basic とよく似ているが, C 言語にもっと近い.
1.1 takayama 268:
269:
270: \noindent \QQQ
1.9 ! takayama 271: MacOS X って何ですか? \\
1.1 takayama 272: \noindent \AAA
1.9 ! takayama 273: -----まだ書いてない.
1.1 takayama 274:
275:
276:
277: %<C
278: \bigbreak
279: \noindent
280: %>C
1.9 ! takayama 281: Asir は数の処理のみならず, $\sqrt{x}$や三角関数の近似計算, 多項式の計算もできる.
1.1 takayama 282: %en Asir can do calculations not only for numbers, but also for polynomials.
283: %en Let us see some examples.
284: %en
1.9 ! takayama 285: 左の数学的な式は asir では右のように表す.
1.1 takayama 286: \begin{center}
287: \begin{tabular}{|l|l|} \hline
1.9 ! takayama 288: $\pi$ (円周率) & {\tt @pi} \\ \hline
1.1 takayama 289: $\cos x$ & {\tt cos(x)} \\ \hline
290: $\sin x$ & {\tt sin(x)} \\ \hline
291: $\tan x$ & {\tt tan(x)} \\ \hline
292: $\sqrt{x}$ & \verb@x^(1/2)@ \\ \hline
293: \end{tabular}
294: \end{center}
295: %en {\tt sin(x), cos(x)} are the trigonometric functions sine and cosine.
296: %en The symbol {\tt @pi} is the constant $\pi$.
1.9 ! takayama 297: 三角関数の角度にあたる部分の $x$ はラジアンという単位を用いて表す.
! 298: 高校低学年の数学では角度を度(degree)という単位を用いて表すが,
! 299: 数学3以上では角度はラジアンという単位で表す.
! 300: \begin{screen}
! 301: 90度(直角)が $\pi/2$ ラジアン, 180度が $\pi$ ラジアン.
! 302: 一般に $d$度は $\frac{d}{180} \pi$ ラジアンである.
! 303: \end{screen}
! 304: 単位ラジアンをもちいると微分法の公式が簡潔になる.
! 305: たとえば $x$ がラジアンであると $\sin x$ の微分は $\cos x$ である.
! 306: \index{らじあん@ラジアン}
1.1 takayama 307:
1.9 ! takayama 308: $\sin(x)$ や $\cos(x)$ の近似値を求めるにはたとえば
1.1 takayama 309: %en \item In order to get approximate values of $\sin(x)$ $\cos(x)$, input as
310: %<C
311: \begin{center}
312: \verb@ deval(sin(3.14)); @
313: \end{center}
314: %>C
1.9 ! takayama 315: と入力する.
! 316: これは $\sin (3.14)$ の近似値を計算する.
! 317: $\sin \pi = 0 $ なので $0$ に近い値が出力されるはずである.
! 318: 実際 {\tt 0.00159265} を出力する. \index{deval}
1.1 takayama 319: {\tt deval}
1.9 ! takayama 320: (\underline{eval}uate and get a result in {\underline d}ouble number precision の略)
! 321: は 64 bitの浮動小数点数により近似値計算する.
! 322: 64 bitの浮動小数点数とは何かの説明は超入門の範囲外であるが,
! 323: 計算機は有限の記憶領域(メモリ)しか持たないので, 小数も有限桁しか扱えない
! 324: と覚えておこう. 64bit は扱える桁数を表している.
! 325: 詳しくは ``asir ドリル'' を参照して欲しい.
1.1 takayama 326:
327: %en The function {\tt deval} numerically evaluates the argument in 64 bit floating point arithmetic.
328: %en As to details, see Chapter \ref{chapter:naibu}.
329: %en
330:
331: \begin{figure}[thb]
332: \begin{center}
333: \scalebox{0.5}{\includegraphics{Figs/sqrt2.eps}}
334: \end{center}
1.9 ! takayama 335: \caption{平方根の計算}
1.1 takayama 336: \label{fig:sqrt2}
337: \end{figure}
338:
339: \begin{example} \rm
1.9 ! takayama 340: $\sqrt{2}$, $\sqrt{3}$ の近似値を計算しなさい. \\
! 341: 入力
1.1 takayama 342: \begin{screen}
343: \begin{verbatim}
344: print(deval(2^(1/2)));
345: print(deval(3^(1/2)));
346: \end{verbatim}
347: \end{screen}
1.9 ! takayama 348: 出力は
! 349: 図\ref{fig:sqrt2}をみよ.
1.1 takayama 350: \end{example}
351:
352:
1.9 ! takayama 353: 上の例のように,
! 354: セミコロン {\tt ;} で区切られた一連の命令のあつまりはもっとも
! 355: 単純な asir プログラムの例である. \index{ぷろぐらむ@プログラム}
! 356: 一連の命令は始めから順番に実行される.
! 357: {\tt print(式等);} は ``式等'' の値を計算して値を画面に表示する.
1.1 takayama 358:
1.9 ! takayama 359: さて出力の {\tt 1.41421} (ひとよ ひとよに ひとみごろ) は $\sqrt{2}$ の近似値なので,
1.1 takayama 360: \verb@print(deval(2^(1/2)));@
1.9 ! takayama 361: の実行結果である.
! 362: さて出力の {\tt 1.73205} (ひとなみに おごれや) は $\sqrt{3}$ の近似値なので,
1.1 takayama 363: \verb@print(deval(3^(1/2)));@
1.9 ! takayama 364: の実行結果である.
! 365: 最後の {\tt 0} はなんなのであろうか?
! 366: 実はこれは最後の {\tt print} 文の戻している値である.
! 367: むつかしい? 別の例で説明しよう.
1.1 takayama 368:
369: \noindent
1.9 ! takayama 370: \fbox{入力}
1.1 takayama 371: \begin{screen}
372: \begin{verbatim}
373: 1+2;
374: 2+3;
375: 3+4;
376: \end{verbatim}
377: \end{screen}
1.9 ! takayama 378: この時出力は(OutputViewへの表示は)
1.1 takayama 379: \begin{screen}
380: {\tt 7}
381: \end{screen}
1.9 ! takayama 382: となる.
! 383: cfep/asir ではとくに {\tt print} 文をかかない限り
! 384: 最後の文の計算結果(評価結果)しか出力しない.
! 385: いまの場合は $3+4$ の結果 $7$ を出力している.
! 386: \index{しゅつりょくけっか@出力結果}
1.1 takayama 387:
388: \begin{problem} \rm
1.9 ! takayama 389: \begin{enumerate} \index{2のるいじょう@$2$の累乗}
1.1 takayama 390: \item $2^8$, $2^9$, $2^{10}$,
1.9 ! takayama 391: の値を計算して答えを表示するプログラムを書きなさい.
! 392: \item $2$ の累乗はパソコンの性能説明によく登場する.
! 393: たとえば検索システム google にキーワード ``512 メモリ 搭載'' を入力したところ
! 394: ``ビデオメモリを 256M から 512M に倍増させ'' など, 数多くの記事がヒットする.
! 395: このような記事を(意味がわからなくても)10件あつめてみよう.
! 396: $512$ 以外の $2$ の累乗でも同じことを試してみよう.
! 397: \item (中級) $2$ の累乗がパソコンの性能説明によく登場する理由を論じなさい.
1.1 takayama 398: \end{enumerate}
399: \end{problem}
400:
401: \bigbreak
402:
403: \begin{figure}[thb]
404: \begin{center}
405: \scalebox{0.4}{\includegraphics{Figs/plot1.eps}}
406: \end{center}
1.9 ! takayama 407: \caption{関数のグラフ}
1.1 takayama 408: \end{figure}
409:
410: \noindent
411: \HHH
412: \index{plot} \index{X11}
413: %en \begin{example} \rm
414: %en \index{plot}
1.9 ! takayama 415: \underline{X11 環境が動いていれば},
! 416: {\tt plot(f);} 命令で
! 417: $x$の関数 $f$ のグラフを描ける.
1.1 takayama 418: %en The command {\tt plot(f);}
419: %en draws the graph of the function $f$ in the variable $x$.
1.9 ! takayama 420: {\tt x} の範囲を指定したいときはたとえば \\
1.1 takayama 421: {\tt plot(f,[x,0,10])}
1.9 ! takayama 422: と入力すると, {\tt x} は 0 から 10 まで変化する.
1.1 takayama 423: %en When you need to specify the range of variables {\tt x},
424: %en input, for example \\
425: %en {\tt plot(f,[x,0,10])}
426: %en Then, the variable {\tt x} runs over $[0, 10]$.
427:
1.9 ! takayama 428: \noindent \fbox{入力例}
1.1 takayama 429: %<C
430: \begin{screen}
431: \begin{verbatim}
432: plot(sin(x));
433: plot(sin(2*x)+0.5*sin(3*x),[x,-10,10]);
434: \end{verbatim}
435: \end{screen}
436: %>C
437: \begin{problem} \rm
1.9 ! takayama 438: いろいろな関数のグラフを描いてあそんでみよう.
! 439: 数学の知識を総動員して計算機の描く形がどうしてそうなのか
! 440: 説明を試みてみよう.
1.1 takayama 441: \end{problem}
442:
443:
1.9 ! takayama 444: \section{エラーメッセージ}
1.1 takayama 445:
1.9 ! takayama 446: 入力にエラーがあると, エラーメッセージが表示される.
! 447: \index{えらー@エラー}
! 448: \index{えらーめっせーじ@エラーメッセージ}
1.1 takayama 449:
450: \begin{figure}[htb]
451: \begin{center}
452: \scalebox{0.5}{\includegraphics{Figs/errorParseEq}}
453: \end{center}
1.9 ! takayama 454: \caption{文法エラー} \label{fig:errorParseEq}
1.1 takayama 455: \end{figure}
1.9 ! takayama 456: 図\ref{fig:errorParseEq} では
1.1 takayama 457: \verb@ 2+4= @
1.9 ! takayama 458: と入力している. 最後に \verb@=@ を書く表現は asir の文法では
! 459: 許されていないので, ``文法エラー'' と指摘されている. \index{ぶんぽうえらー@文法エラー}
1.1 takayama 460: \begin{screen}
1.9 ! takayama 461: 大体これでわかってくれていいじゃない,
! 462: とこちらがおもっていてもプログラム言語は一切融通がきかない.
1.1 takayama 463: \end{screen}
1.9 ! takayama 464: なお
1.1 takayama 465: \begin{verbatim}
466: error([41,4294967295,parse error,[asir_where,[[toplevel,1]]]])
467: \end{verbatim}
1.9 ! takayama 468: の部分は上級者向けの情報なのでとりあえず無視してもらいたい.
1.1 takayama 469:
470:
471: \begin{figure}[htb]
472: \begin{center}
473: \scalebox{0.5}{\includegraphics{Figs/errorMultiLine}}
474: \end{center}
1.9 ! takayama 475: \caption{エラー行} \label{fig:errorMultiLine}
1.1 takayama 476: \end{figure}
1.9 ! takayama 477: 図\ref{fig:errorMultiLine} では
1.1 takayama 478: \begin{screen}
479: \begin{verbatim}
480: print( 2^7 );
481: print( 2^8 );
482: print( deval(2^(1/2));
483: print( deval(3^(1/2)));
484: \end{verbatim}
485: \end{screen}
1.9 ! takayama 486: と入力している.
! 487: 3行目は右括弧がひとつ足りなくて
1.1 takayama 488: \verb@print( deval(2^(1/2)));@
1.9 ! takayama 489: が正しい入力である.
! 490: エラー行の3行目にキャレットが自動的に移動しているはずである.
! 491: なおプログラムの入力ウインドー内でマウスをクリックすると, せっかく自動移動した
! 492: キャレットの位置が変ってしまう.
! 493: プログラムの入力ウインドーのタイトルバーでクリックするとよい.
! 494: なおこの例では
1.1 takayama 495: \begin{center}
496: \scalebox{0.05}{\includegraphics{Figs/buttonBracket.eps}}
497: \end{center}
1.9 ! takayama 498: ボタンをもちいてもすぐエラーの場所がわかる.
! 499: \index{かっこ@括弧}
1.1 takayama 500:
1.9 ! takayama 501: \noindent {\bf 注意}:
! 502: 表示された行はエラーの発生位置であるが,
! 503: エラーの原因はその前の方の行にあることも多い.
! 504: たとえば
1.1 takayama 505: \begin{screen}
506: \begin{verbatim}
507: 1+2
508: 2+3;
509: \end{verbatim}
510: \end{screen}
1.9 ! takayama 511: と入力するとエラー行は 2 行目であるが, 原因は1行目で {\tt ; } を
! 512: 書き忘れたことである.
1.1 takayama 513:
514: \bigbreak
1.9 ! takayama 515: エラー行が複数表示された場合はそれらの中のどこかにエラーがある.
! 516: 複数あるエラー行に順番にジャンプしていくには,
! 517: \fbox{実行} メニューから \fbox{次のエラー行へ} を選択する.
1.1 takayama 518: \begin{center}
519: \scalebox{0.3}{\includegraphics{Figs/menuNextError.eps}}
520: \end{center}
1.9 ! takayama 521: \index{つぎのえらーぎょうへ@次のエラー行へ}
1.1 takayama 522:
523: \begin{problem} \rm
1.9 ! takayama 524: エラーを生じる式またはプログラムを5つ作れ.
1.1 takayama 525: \end{problem}
526:
527:
1.9 ! takayama 528: \chapter{ 変数とプログラム }
1.1 takayama 529:
1.9 ! takayama 530: \section{変数}
1.1 takayama 531:
1.9 ! takayama 532: \noindent \index{へんすう@変数}
! 533: 変数に数値等を記憶しておける.
! 534: \underline{変数名は大文字で始まる}. \index{へんすうめい@変数名}
! 535: %英字の大文字, 子文字を区別しているので注意.
! 536: なお後述するように asir では多項式計算ができるが小文字で始まる文字列は
! 537: 多項式の変数名として利用される.
! 538: \index{たこうしきのへんすうめい@多項式の変数名}
1.1 takayama 539: %en \noindent
540: %en Symbols starting with capital alphabetical characters are
541: %en {\it program variables}, which are used to store values.
542: %en \index{program variable}
543: %en Names of functions defined in programs start with small alphabetical
544: %en characters.
545: %en Note that variable symbols starting with small alphabetical characters are
546: %en variables in polynomials in Risa/Asir and they cannot be used to store
547: %en values.
548: %en
549:
1.9 ! takayama 550: \index{2のるいじょう@$2$の累乗}
! 551: $2$の累乗を表示する次のプログラムを考えよう.
1.1 takayama 552: \begin{screen}
553: \begin{verbatim}
554: print( 2^1 );
555: print( 2^2 );
556: print( 2^3 );
557: print( 2^4 );
558: print( 2^5 );
559: print( 2^6 );
560: print( 2^7 );
561: print( 2^8 );
562: \end{verbatim}
563: \end{screen}
1.9 ! takayama 564: このプログラムは変数 {\tt X} を用いて
! 565: 次のように書いておけば $2$ の累乗だけなく $3$ の累乗を表示する
! 566: のに再利用できる(図\ref{fig:powerOf2}).
1.1 takayama 567: \begin{screen}
568: \begin{verbatim}
569: X = 2;
570: print( X^1 );
571: print( X^2 );
572: print( X^3 );
573: print( X^4 );
574: print( X^5 );
575: print( X^6 );
576: print( X^7 );
577: print( X^8 );
578: \end{verbatim}
579: \end{screen}
580: \begin{figure}[thb]
581: \begin{center}
582: \scalebox{0.3}{\includegraphics{Figs/powerOf2.eps}}
583: \end{center}
1.9 ! takayama 584: \caption{変数の利用} \label{fig:powerOf2}
1.1 takayama 585: \end{figure}
1.9 ! takayama 586: $3$ の累乗を表示するには
! 587: \verb@X=2@ の行を \verb@X=3@ に変更すればいいだけである.
1.1 takayama 588:
1.9 ! takayama 589: アルファベットの\underline{大文字}ではじまる英数字の列が asir の
! 590: 変数である.
! 591: つまり, {\tt X}, {\tt Y}, {\tt Z} はもちろんのこと,
! 592: {\tt Sum} とか {\tt Kazu} とか {\tt X1} など2文字以上の英数字の列
! 593: の組み合わせが変数名として許される.
1.1 takayama 594:
595:
1.9 ! takayama 596: 変数を含んだ式をプログラム中で自由につかうこともできる.
! 597: たとえば
1.1 takayama 598: \begin{verbatim}
599: X = 2;
600: A = 1;
601: print( 2*X^2 -A );
602: \end{verbatim}
1.9 ! takayama 603: を実行すると {\tt 7} が表示される.
1.1 takayama 604:
1.9 ! takayama 605: このような例をみると, 変数の機能は
! 606: 中学数学でならう文字式と似ていると思うだろう.
! 607: 超入門としてはこれでほぼ正しい理解であるが, よりステップアップしていくには,
! 608: 次のことを強く記憶しておこう.
1.1 takayama 609: \begin{screen}
1.9 ! takayama 610: 変数とは計算機に数値等を保存しておくメモリ上の場所の名前である.
1.1 takayama 611: \end{screen}
612:
1.9 ! takayama 613: さて, 超入門, 第一の関門である.
1.1 takayama 614: \begin{screen}
1.9 ! takayama 615: {\tt =} 記号は次のような形式でつかう:
! 616: $$ \mbox{{\bf 変数名}} {\tt = } \mbox{{\bf 式}} {\tt ;} $$
! 617: これはまず右辺の式を計算しそのあとその計算結果を左辺の変数に代入せよという意味.
! 618: \verb@=@ 記号は右辺を計算してその結果を左辺へ代入せよという\underline{命令}
! 619: だと思って欲しい. \\
! 620: たとえば,
! 621: \verb@X=1@ は \verb@X@ が \verb@1@ に等しいという意味ではなく,
! 622: \verb@1@ を 変数 \verb@X@ に代入せよという意味である.
1.1 takayama 623: \end{screen}
1.9 ! takayama 624: ここでいいたいことは, \index{だいにゅう@代入} \index{=} \index{だいにゅうきごう=@代入記号=}
1.1 takayama 625: \begin{screen}
1.9 ! takayama 626: \verb@=@ 記号の意味が数学での意味と違うよ!
1.1 takayama 627: \end{screen}
1.9 ! takayama 628: ということである.
! 629: これで混乱する入門者も多いのでプログラム言語によっては
! 630: ``$2$ を変数 {\tt X} に代入せよ'' を
1.1 takayama 631: \verb@X:=2@
1.9 ! takayama 632: と書く場合もある (たとえばプログラム言語 Pascal).
1.1 takayama 633:
1.9 ! takayama 634: 次のプログラムは $2$, $2^2$, $2^4$, $2^8$ を計算して表示する.
1.1 takayama 635: \begin{screen}
636: \begin{verbatim}
637: X=2;
638: print(X);
639: X = X*X;
640: print(X);
641: X = X*X;
642: print(X);
643: X = X*X;
644: print(X);
645: \end{verbatim}
646: \end{screen}
647: \begin{figure}[thb]
648: \begin{center}
649: \scalebox{0.3}{\includegraphics{Figs/powerOf2b.eps}}
650: \end{center}
1.9 ! takayama 651: \caption{変数の利用} \label{fig:powerOf2b}
1.1 takayama 652: \end{figure}
1.9 ! takayama 653: 出力が図\ref{fig:powerOf2b}のようになる理由を説明しよう.
! 654: まず1行目で変数{\tt X}に2が代入される.
! 655: 次に3行目ではまず右辺の式を計算する. この場合 {\tt X} の値は $2$ であるので,
! 656: $2\times2$ で結果は $4$ である.
! 657: \underline{この計算が終った後}結果の $4$ が変数 {\tt X} に代入される.
! 658: 5行目では右辺の式は $4 \times 4$ なので, その計算結果の $16$ が 左辺の変数 $X$
! 659: に代入される.
! 660: \index{へんすう@変数}
1.1 takayama 661:
662: \bigbreak
663: %
664: %
665: \noindent
1.9 ! takayama 666: \HHH \index{たこうしき@多項式} \index{すうしきしょり@数式処理}
! 667: Asir は多項式計算もできる. 実は Asir は計算機で記号的に数式を処理するための
! 668: 数式処理システムでもある.
1.1 takayama 669: %en Asir can do calculations for polynomials.
670: \begin{enumerate}
671: %en \begin{enumerate}
1.9 ! takayama 672: \item 小文字ではじまる記号は多項式の変数である.
! 673: 数学とちがって変数の名前は一文字とはかぎらない.
! 674: たとえば {\tt rate} と書くと, $rate$ という名前の多項式の変数となる.
! 675: たとえば {\tt x2} と書くと, $x2$ という名前の多項式の変数となる.
! 676: $x$ かける $2$ は {\tt x*2} と書く. \index{たこうしきへんすう@多項式変数}
1.1 takayama 677: %en \item Symbols starting small alphabetical character are variables of polynomials. For example, {\tt x2} is the variable of the name x2.
678: %en The expression {\tt x*2} stands for $x$ times $2$.
679: %
680: %
1.9 ! takayama 681: \item \index{いんすうぶんかい@因数分解} \index{fctr}
! 682: {\tt fctr(\poly)} は \poly を有理数係数の範囲で因数分解する.
! 683: {\tt fctr} は factor の短縮表現である.
1.1 takayama 684: %en \item \index{factorization} \index{fctr}
685: %en The input {\tt fctr(\poly)} factors \poly in the ring of polynomials
686: %en with rational number coefficients.
687: %
688: %
689: \end{enumerate}
690: %en \end{enumerate}
691:
692: \begin{figure}[tbh]
693: \begin{center}
694: \scalebox{0.3}{\includegraphics{Figs/fctr1.eps}}
695: \end{center}
1.9 ! takayama 696: \caption{因数分解} \label{fig:fctr1}
1.1 takayama 697: \end{figure}
698:
1.9 ! takayama 699: 図\ref{fig:fctr1} の{\tt fctr} の出力の最初は $x^2+2xy+y^2$ が
1.1 takayama 700: $ 1^1 \times (x+y)^2 $
1.9 ! takayama 701: と因数分解されることを意味している.
! 702: 図\ref{fig:fctr1} の{\tt fctr} の出力の2番目は $x^2-1$ が
1.1 takayama 703: $$ 1^1 \times (x-1)^1 \times (x+1)^1
704: $$
1.9 ! takayama 705: と因数分解されることを意味している.
1.1 takayama 706:
707:
1.9 ! takayama 708: \section{くりかえし}
1.1 takayama 709:
1.9 ! takayama 710: くりかえしや判断をおこなうための文が asir には用意されている.
! 711: この文をもちいると複雑なことを実行できる.
! 712: まず一番の基礎であるくりかえしの機能をためしてみよう.
! 713: \index{くりかえし} \index{forぶん@for文}
1.1 takayama 714: %en A programming language is installed in Asir.
715: %en Let us try the most basic programming; repeating and printing.
716: \begin{example} \rm
1.9 ! takayama 717: 図\ref{fig:powerOf2}のプログラムは次のように繰り返し機能 --- {\tt for}文 ---
! 718: を用いて簡潔に書ける.
1.1 takayama 719: \begin{screen}
720: \begin{verbatim}
721: X = 2;
722: for (I=1; I<=8; I++) {
723: print( X^I );
724: }
725: \end{verbatim}
726: \end{screen}
1.9 ! takayama 727: 実行結果は図\ref{fig:powerOf2For}をみよ.
1.1 takayama 728: \end{example}
729:
730: \begin{figure}[tbh]
731: \begin{center}
732: \scalebox{0.3}{\includegraphics{Figs/powerOf2For.eps}}
733: \end{center}
1.9 ! takayama 734: \caption{for文} \label{fig:powerOf2For}
1.1 takayama 735: \end{figure}
736:
737:
1.9 ! takayama 738: 繰り返し関連の表現の意味を箇条書にしてまとめておこう.
1.1 takayama 739: \begin{enumerate}
740: %en \begin{enumerate}
1.9 ! takayama 741: \item \index{for} \index{くりかえし@繰り返し} \index{\<@\verb&<=&}
1.1 takayama 742: %en \item \index{for} \index{repeat} \index{\<@\verb&<=&}
1.9 ! takayama 743: \verb@ for (K=初期値; K<=終りの値; K++) {ループの中で実行するコマンド}; @
! 744: はあることを何度も繰り返したい時に用いる.
! 745: for ループと呼ばれる.
! 746: ``{\tt K<=N}'' は, ``${\tt K} \leq {\tt N}$か'' という意味である.
! 747: 似た表現に,
! 748: ``{\tt K>=N}''があるが, これは ``${\tt K} \geq {\tt N}$か'' という意味である.
! 749: {\tt =} のない
! 750: ``{\tt K<N}'' は, ``${\tt K} < {\tt N}$か'' という意味である.
! 751: \item \verb@ ++K @ や \verb@ K++ @ は {\tt K} を 1 増やせという意味である.
! 752: \verb@ K = K+1 @ と書いてもよい.
! 753: 同じく, \verb@ --K @ や \verb@ K-- @ は {\tt K} を 1 減らせという意味である.
1.1 takayama 754: %en The sentence
755: %en {\tt for (K={\it initial value}; K<={\it limit}; K++) \{{\it commands}\}; }
756: %en is used to repeat commands.
757: %en It is called the ``for'' loop.
758: %en ``{\tt K<=N}'' means that ``${\tt K} \leq {\tt N}$ holds''.
759: %en A similar expression
760: %en ``{\tt K>=N}'' implies that ``${\tt K} \geq {\tt N}$ holds''
761: %en The expression ``{\tt K<N}'' means that ``${\tt K} < {\tt N}$''.
762: %en \item The expressions \verb@ ++K @ and \verb@ K++ @ mean increasing
763: %en {\tt K} by $1$.
764: %en In this example, it has the same meaning with \verb@ K = K+1 @.
765: %en Similarly \verb@ --K @ and \verb@ K-- @ mean decreasing {\tt K} by 1.
766: %
767: %
768: \end{enumerate}
769: %en \end{enumerate}
770: %en
771:
772: \begin{figure}[tbh]
773: \begin{center}
774: \scalebox{0.3}{\includegraphics{Figs/powerOf2For2.eps}}
775: \end{center}
1.9 ! takayama 776: \caption{for文} \label{fig:powerOf2For2}
1.1 takayama 777: \end{figure}
1.9 ! takayama 778: for のあとの {\tt \{}, {\tt \}} の中には複数の文(命令)を書ける.
1.1 takayama 779: \begin{screen}
780: \begin{verbatim}
781: X = 2;
782: for (I=1; I<=8; I++) {
1.9 ! takayama 783: print("2の"+rtostr(I)+"乗は ",0);
1.1 takayama 784: print( X^I );
785: }
786: \end{verbatim}
787: \end{screen}
1.9 ! takayama 788: この例では
! 789: 日本語を含むので前の節で述べたように日本語空白をプログラム本体にいれないようにして,
! 790: 注意深くプログラムを入力してもらいたい.
! 791: 実行結果は図\ref{fig:powerOf2For2}をみよ. \index{2のるいじょう@$2$の累乗}
! 792: \verb@print("2の"+rtostr(I)+"乗は ",0);@ の部分を簡単に説明しておこう.
! 793: まず最後の {\tt 0} は出力のあと改行しない, つまり次の {\tt print} 文の出力を
! 794: そのまま続けよという意味. \index{print} \index{rtostr}
! 795: \verb@"@ でかこまれた部分は文字列と呼ばれている.これはこのまま表示される.
! 796: \verb@rtostr(I)@ は数字 {\tt I} を文字列表現に変換しなさい, という意味
! 797: (超入門としては難しい?).
! 798: あと文字列に対して {\tt +} を適用すると文字列が結合される.
! 799: \index{もじれつのけつごう@文字列の結合}
! 800: \index{もじれつひょうげん@文字列表現}
1.1 takayama 801:
802:
803: \noindent
1.9 ! takayama 804: \fbox{雑談}
! 805: (江戸時代の数学の本にあった問題の改題) \\
! 806: 殿様: このたびの働きはあっぱれであった. 褒美はなにがよいか? \\
! 807: 家来: 今日は一円, 明日は2円, 明後日は4円と, 前日の2倍づつ, これを4週間続けて
! 808: くださるだけで結構でございます. \\
! 809: 殿様: なんともささやかな褒美じゃのう. よしよし. \\
! 810: さて, 家来はいくら褒賞金をもらえるだろう?
! 811: これもまた$2$の累乗の計算である. \index{2のるいじょう@$2$の累乗}
! 812: Cfep/asir で計算してみよう.
1.1 takayama 813:
814:
815:
816: \begin{example}\Begin \quad
1.9 ! takayama 817: {\tt for} による繰り返しを用いて $\sqrt{x}$ の数表をつくろう.
1.1 takayama 818: %en \begin{example}\Begin [02] \quad
819: %en By using {\tt for} loop, generate a table of $\sqrt{x}$.
820: %en \end{example}
821: %en
822: \begin{screen}
823: \begin{center}
824: \begin{verbatim}
825: for (I=0; I<2; I = I+0.2) {
826: print(I,0); print(" : ",0);
827: print(deval(I^(1/2)));
828: }
829: \end{verbatim}
830: \end{center}
831: \end{screen}
832: %>C
1.9 ! takayama 833: 出力結果
1.1 takayama 834: %en Output.
835: %<C
836: \begin{center}
837: \begin{tabular}{|l|} \hline \sl
838: 0 : 0 \\
839: 0.2 : 0.447214 \\
840: 0.4 : 0.632456 \\
841: 0.6 : 0.774597 \\
842: 0.8 : 0.894427 \\
843: 1 : 1 \\
844: 1.2 : 1.09545 \\
845: 1.4 : 1.18322 \\
846: 1.6 : 1.26491 \\
847: 1.8 : 1.34164 \\
848: 2 : 1.41421 \\
849: \hline
850: \end{tabular}
851: \end{center}
852: %>C
853: \rm
854: \index{print}
1.9 ! takayama 855: {\tt print(A)} は変数 {\tt A} の値を画面に表示する.
! 856: {\tt print(文字列)} は文字列を画面に表示する.
! 857: {\tt print(A,0)} は変数 {\tt A} の値を画面に表示するが, 表示した
! 858: あとの改行をしない.
! 859: 空白も文字である.したがって, たとえば
1.1 takayama 860: {\tt A=10; print(A,0); print(A+1);}
1.9 ! takayama 861: を実行すると, \index{print}
! 862: {\tt 1011} と表示されてしまう.
1.1 takayama 863: {\tt A=10; print(A,0); print(" ",0);print(A+1);}
1.9 ! takayama 864: を実行すると,
! 865: {\tt 10 11} と表示される.
1.1 takayama 866: %en \rm
867: %en \index{print}
868: %en The command {\tt print(A)} displays the value of the variable {\tt A}
869: %en on the screen.
870: %en The command {\tt print({\it string})} outpus the {\it string} on the screen.
871: %en The command {\tt print(A,0)} displays the value of the variable {\tt A},
872: %en but it does not make the newline.
873: %en Note that the blank is a character. For example, if you input
874: %en {\tt A=10; print(A,0); print(A+1);}
875: %en {\tt 1011} will be displayed. So, input as
876: %en {\tt A=10; print(A,0); print(" ",0);print(A+1);}
877: %en Then,
878: %en {\tt 10 11} will be displayed.
879: %en
880: \end{example}
881:
1.9 ! takayama 882: ところで, この例では条件が ${\tt I}<2$ なのに ${\tt I}=2$
! 883: の場合が表示されている.
! 884: 実際に asir 上で実行してみるとこうなるが, 理由を知るには、
! 885: 浮動小数の計算機上での表現についての知識が必要である
! 886: (``asirドリル''を参照).
! 887: とりあえず,
1.1 takayama 888: %en In this example, the termination condition is ${\tt I}<2$, but
889: %en the case of ${\tt I}=2$ is executed. In order to understand the reason,
890: %en we need to study the format of floating point numbers.
891: %en (See \ref{chapter:naibu} for details).
892: %en For now, please keep the following in our mind.
893: \begin{FRAME}
1.9 ! takayama 894: 整数や分数の計算は Asir 上で正確に実行されるが,
! 895: 小数についてはそうでない.
1.1 takayama 896: \end{FRAME}
1.9 ! takayama 897: と覚えておこう.
1.1 takayama 898: %en \begin{FRAME}
899: %en Arithmetics for integers and rational numbers are exact in Risa/Asir,
900: %en but arithmetics for dicimal numbers are not.
901: %en \end{FRAME}
902: %en
903:
904: \begin{problem}
1.9 ! takayama 905: あたえられた 10 進数を 2進数へ変換するプログラムを作れ.
! 906: ヒント: {\tt A}÷{\tt B} の余りは \verb@A%B@ で計算できる.
! 907: \index{あまり@余り}
1.1 takayama 908: \end{problem}
909:
1.9 ! takayama 910: \section{実行の中止}
1.1 takayama 911: %
912: %
1.9 ! takayama 913: \index{ちゅうし@中止} \index{interrupt}
! 914: 実行中の計算やプログラムの実行を中止したい時は中止ボタン
1.1 takayama 915: \begin{center}
916: \scalebox{0.1}{\includegraphics{Figs/buttonStop.eps}}
917: \end{center}
1.9 ! takayama 918: をクリックする.
1.1 takayama 919:
920: \begin{figure}[tbh]
921: \begin{center}
922: \scalebox{0.5}{\includegraphics{Figs/interrupt.eps}}
923: \end{center}
1.9 ! takayama 924: \caption{実行の中止} \label{fig:interrupt}
1.1 takayama 925: \end{figure}
926:
1.9 ! takayama 927: 図\ref{fig:interrupt}では
! 928: $10^{100}$ 回の {\tt Hello } の出力の繰り返しを中止している.
1.1 takayama 929:
1.9 ! takayama 930: cfep は開発途上のシステムのため
1.1 takayama 931: \begin{verbatim}
932: [control] control function_id is 1030
933: [control] control_reset_connection.
934: Sending the SIGUSR1 signal to 1226: Result = 0
935: In ox103_reset: Done.
936: 515
937: Done
938: \end{verbatim}
1.9 ! takayama 939: このような開発者専用のメッセージも出力されるが,
! 940: とりあえずこのようなメッセージがでたら中止が成功したということである.
1.1 takayama 941:
942:
1.9 ! takayama 943: \section{エンジン再起動}
1.1 takayama 944:
1.9 ! takayama 945: \index{さいきどう@再起動} \index{けいさんえんじん@計算エンジン}
! 946: \index{けいさんさーば@計算サーバ}
! 947: Cfep/asir では次のように3つのプロセスが互いに通信しながら動作している.
1.1 takayama 948: \begin{center}
1.9 ! takayama 949: \fbox{cfep} $\Leftrightarrow$ \fbox{コントローラ(ox\_texmacs)}
! 950: $\Leftrightarrow$ \fbox{計算エンジン(ox\_asir)}
1.1 takayama 951: \end{center}
1.9 ! takayama 952: 計算エンジン(計算サーバ)を再起動したり別のものにとりかえたりできる.
! 953: \index{けいさんえんじん@計算エンジン}
! 954: \index{けいさんさーば@計算サーバ}
! 955: \index{えんじん@エンジン}
1.1 takayama 956:
1.9 ! takayama 957: \index{さいきどう@再起動} \index{restart}
! 958: エンジン再起動ボタン
1.1 takayama 959: \begin{center}
960: \scalebox{0.05}{\includegraphics{Figs/buttonRestart}}
961: \end{center}
1.9 ! takayama 962: をクリックすると,
! 963: 現在利用している計算エンジンを停止し,
! 964: 新しい計算エンジンをスタートする.
! 965: 選択範囲のみを実行するモードでないかぎり利用上で中止との違いは
! 966: あまりないが, 再起動のときのメッセージ
1.1 takayama 967: \begin{center}
968: \scalebox{0.4}{\includegraphics{Figs/restartDialog}}
969: \end{center}
1.9 ! takayama 970: にもあるように, 別の計算エンジンを起動することも可能である.
! 971: この例では unix shell も起動できる.
1.1 takayama 972:
1.9 ! takayama 973: また, ``実行'' メニューから ``エンジンを自動スタートしない'' モードを選んでる
! 974: 場合に計算エンジンを手動でスタートするには, このボタンを用いる.
1.1 takayama 975:
976: \bigbreak
977:
978: \noindent
979: \HHH
1.9 ! takayama 980: cfep は \index{cfep}
1.1 takayama 981: Cocoa FrontEnd view Process
1.9 ! takayama 982: の略である.
! 983: cfep は Objective C という言語および xcode 2 という開発環境を用いて
! 984: Cocoa というフレームワークのもとで開発されている.
! 985: cfep の Objective C のプログラムの一部をみてみよう.
1.1 takayama 986: \begin{screen}
987: \begin{verbatim}
988: for (i=0; i<oglCommSize; i++) {
989: gc = [oglComm objectAtIndex: i];
990: [self execute: gc];
991: }
992: \end{verbatim}
993: \end{screen}
1.9 ! takayama 994: asir と同じような {\tt for} 文があるね.
1.1 takayama 995:
1.9 ! takayama 996: \section{ヘルプの利用}
1.1 takayama 997:
1.9 ! takayama 998: \index{かんすう@関数}
! 999: Cfep/asir での ``関数'' とは数学の関数のように引数を与えると計算して値をもどし,
! 1000: かつある仕事(表示等)をする手続きの集まりである.
! 1001: 例えば {\tt print}, {\tt deval}, {\tt sin}, {\tt fctr} 等は関数である.
! 1002: 関数を自分で定義することも可能である. これについては後の説明および
! 1003: ``asirドリル''を参照.
1.1 takayama 1004:
1.9 ! takayama 1005: あらかじめ定義ずみの関数を ``組み込み関数'' とよぶ.
1.1 takayama 1006: \index{help}
1.9 ! takayama 1007: \index{へるぷ@ヘルプ} \index{くみこみかんすう@組み込み関数}
! 1008: 組み込み関数の詳しい説明を調べるには
! 1009: ``cfep のヘルプ'' から
1.1 takayama 1010: \begin{center}
1011: \scalebox{0.3}{\includegraphics{Figs/helpTop}}
1012: \end{center}
1.9 ! takayama 1013: の ``索引'' を選び, 索引
1.1 takayama 1014: \begin{center}
1015: \scalebox{0.45}{\includegraphics{Figs/helpIndex}}
1016: \end{center}
1.9 ! takayama 1017: の ``Risa/Asir マニュアル'' を選び,
! 1018: ``Risa/Asir マニュアル'' の最初のページの関数一覧から
! 1019: 調べたい関数を探す.
! 1020: たとえば {\tt fctr} (因数分解用の関数) はこの一覧の中にある.
1.1 takayama 1021: \begin{center}
1022: \scalebox{0.35}{\includegraphics{Figs/helpFctr}}
1023: \end{center}
1024: \index{fctr}
1025:
1026:
1027: \index{spotlight}
1.9 ! takayama 1028: 検索には spotlight の活用も有益であろう. 索引
1.1 takayama 1029: \begin{center}
1030: \scalebox{0.45}{\includegraphics{Figs/helpIndex}}
1031: \end{center}
1.9 ! takayama 1032: の ``使用説明書のフォルダをfinderで開く''
! 1033: を選ぶと使用説明書のフォルダが開くので, ここを spotlight で検索すると
! 1034: いろいろな発見があるであろう.
! 1035: ちなみに, この超入門や asirドリルはこのフォルダの pdf フォルダの中にある.
! 1036: (なおここからの spotlight 検索は何故か遅いので, メニューバーの
! 1037: splotlight からの検索の方がいいかもしれない.
1.1 takayama 1038: )
1039: %% mdfind, mdimport?
1040:
1041:
1.9 ! takayama 1042: \chapter{グラフィック}
1.1 takayama 1043:
1.9 ! takayama 1044: \section{ライブラリの読み込み} \index{らいぶらり@ライブラリ}
1.1 takayama 1045:
1046: \begin{figure}
1047: \begin{center}
1048: \scalebox{0.5}{\includegraphics{Figs/glib_lineImport.eps}}
1049: \end{center}
1.9 ! takayama 1050: \caption{ライブラリのロード} \label{fig:glib_lineImport}
1.1 takayama 1051: \end{figure}
1052:
1.9 ! takayama 1053: Asir 言語で書かれている関数定義の集合がライブラリである.
! 1054: ライブラリを読み込むには {\tt import} コマンドまたは
! 1055: {\tt load} コマンドを用いる. \index{import} \index{load}
! 1056: マニュアルに記述されている関数でライブラリの読み込みが前提となってるものも
! 1057: 多い.
! 1058: たとえば, 線を引くコマンド {\tt glib\_line(0,0,100,100);}
! 1059: を実行しても, ``glib\_line が定義されていません''
! 1060: というエラーが表示される.
! 1061: グラフィックコマンドのライブラリ読み込むコマンド
1.1 takayama 1062: \begin{verbatim}
1063: import("glib3.rr");
1064: \end{verbatim}
1.9 ! takayama 1065: を実行しておくと図\ref{fig:glib_lineImport}のように
! 1066: 線を描画する.
1.1 takayama 1067:
1068:
1.9 ! takayama 1069: Asir-contrib プロジェクトにより集積されたライブラリの集合体が
! 1070: asir-contrib である. \index{asir-contrib}
! 1071: Asir-contrib を読み込んでしまうと,
! 1072: ほとんどの関数について import が必要かどうか気にする必要はなくなるが,
! 1073: 大量のライブラリを読み込むために時間がかかるのが欠点である.
! 1074: asir-contrib は \fbox{実行} メニューから読み込める.
1.1 takayama 1075: \begin{center}
1076: \scalebox{0.3}{\includegraphics{Figs/importContrib}}
1077: \end{center}
1078:
1.9 ! takayama 1079: \section{線を引く関数}
1.1 takayama 1080:
1081: \begin{example} \rm
1082: \begin{screen}
1083: \begin{verbatim}
1084: import("glib3.rr");
1085: glib_line(0,0, 100,100);
1086: glib_flush();
1087: \end{verbatim}
1088: \end{screen}
1.9 ! takayama 1089: 図\ref{fig:glib_lineImport} が描画結果である.
! 1090: $y$座標は画面が下へいくほど大きくなる.
! 1091: 図\ref{figure:cond:coord} を参照.
! 1092: 左上の座標は $(0,0)$, 右下の座標が $(400,400)$.
! 1093: \verb@glib_line@ で $(0,0)$ から $(100,100)$ へ線を描画.
! 1094: \verb@glib_flush@ は画面を更新するはたらきがある. flush しないと,
! 1095: 描画結果が画面での表示に反映しない場合がある.
1.1 takayama 1096: \end{example}
1097:
1098: \index{glib}
1.9 ! takayama 1099: {\tt glib3.rr} をロードすることにより, 次の関数が使えるようになる. \\
1.1 takayama 1100: \begin{tabular}{|l|l|}
1101: \hline
1102: {\tt glib\_window(X0,Y0,X1,Y1)} &
1.9 ! takayama 1103: 図を書く window のサイズを決める. \\
! 1104: & 画面左上の座標が {\tt (X0,Y0)},
! 1105: 画面右下の座標が {\tt (X1,Y1)} \\
! 1106: & であるような座標系で以下描画せよ. \\
! 1107: & ただし x 座標は, 右にいくに従いおおきくなり, \\
1.1 takayama 1108: &
1.9 ! takayama 1109: y 座標は \underline{下に} いくに従い大きくなる (図 \ref{figure:cond:coord}). \\ \hline
! 1110: {\tt glib\_clear()} & 全てのOpenGLオブジェクトを消去し,
! 1111: 描画画面をクリアする. \\ \hline
! 1112: {\tt glib\_putpixel(X,Y)} & 座標 {\tt (X,Y)} に点を打つ. \\ \hline
1.1 takayama 1113: {\tt glib\_set\_pixel\_size(S)} &
1.9 ! takayama 1114: 点の大きさの指定. 1.0 が1ピクセル分の大きさ. \\ \hline
! 1115: {\tt glib\_line(X,Y,P,Q)} & 座標 {\tt (X,Y)} から 座標 {\tt (P,Q)} へ直線を引く \\ \hline
! 1116: {\tt glib\_remove\_last()} & 一つ前の OpenGL オブジェクトを消す. \\ \hline
1.1 takayama 1117: \end{tabular}
1118:
1119: \begin{figure}[htb]
1120: \setlength{\unitlength}{1mm}
1121: \begin{picture}(100,40)(0,0)
1122: \put(20,35){\vector(1,0){80}}
1123: \put(98,32){x}
1124: \put(20,35){\vector(0,-1){35}}
1125: \put(23,1){y}
1126: \end{picture}
1.9 ! takayama 1127: \caption{座標系} \label{figure:cond:coord}
1.1 takayama 1128: \end{figure}
1129:
1.9 ! takayama 1130: 色を変更したいときは, \verb@ | @ 記号で区切ったオプショナル引数
! 1131: {\tt color} を使う. \index{おぷしょなるひきすう@オプショナル引数}
! 1132: たとえば,
1.1 takayama 1133: \begin{center}
1134: \verb@ glib_line(0,0,100,100|color=0xff0000); @
1135: \end{center}
1.9 ! takayama 1136: と入力すると, 色 {\tt 0xff0000} で線分をひく.
! 1137: ここで, 色は RGB の各成分の強さを 2 桁の 16 進数で指定する.
! 1138: 16進数については ``asir ドリル'' を参照.
! 1139: この例では, R 成分が ff なので, 赤の線をひくこととなる.
! 1140: なお, 関数 {\tt glib\_putpixel} も同じようにして, 色を指定できる.
! 1141: 16進数を知らない人用に, 色とその16進数による表現の対応表をあげておく.
1.5 takayama 1142:
1143: \begin{tabular}{|l|l|}
1144: \hline
1.9 ! takayama 1145: 0xffffff & 白 \\ \hline
! 1146: 0xffff00 & 黄 \\ \hline
! 1147: 0xff0000 & 赤 \\ \hline
! 1148: 0x00ff00 & 緑 \\ \hline
! 1149: 0x0000ff & 青 \\ \hline
! 1150: 0x000000 & 黒 \\ \hline
1.5 takayama 1151: \end{tabular}
1152:
1153: \noindent
1.9 ! takayama 1154: (あとは試して下さい)
1.1 takayama 1155:
1.9 ! takayama 1156: さて, 図 \ref{figure:cond:coord} で見たようにコンピュータプログラムの
! 1157: 世界では, 画面の左上を原点にして, 下へいくに従い, $y$ 座標が増えるような
! 1158: 座標系をとることが多い.
! 1159: 数学のグラフを書いたりするにはこれでは不便なことも多いので,
! 1160: {\tt glib3.rr} では,
1.1 takayama 1161: \begin{center}
1162: \verb@ Glib_math_coordinate=1; @
1163: \end{center}
1.9 ! takayama 1164: を実行しておくと
! 1165: 画面の左下が原点で, 上にいくに従い $y$ 座標が増えるような
! 1166: 数学での座標系で図を描画する.
1.1 takayama 1167:
1.9 ! takayama 1168: \begin{example} \rm \index{ぐらふ@グラフ}
! 1169: 2次関数 $y=x^2-1$ のグラフを書いてみよう.
1.1 takayama 1170: %%Prog: cfep/tests/2006-03-11-graph2d.rr
1171: \begin{screen}
1172: \begin{verbatim}
1173: import("glib3.rr");
1174: Glib_math_coordinate=1;
1175: glib_window(-2,-2, 2,2);
1176:
1177: glib_line(-2,0,2,0 | color=0x0000ff);
1178: glib_line(0,-2,0,2 | color=0x0000ff);
1179: for (X=-2.0; X< 2.0; X = X+0.1) {
1180: Y = X^2-1;
1181: X1 = X+0.1;
1182: Y1 = X1^2-1;
1183: glib_line(X,Y, X1,Y1);
1184: }
1185: glib_flush();
1186: \end{verbatim}
1187: \end{screen}
1.9 ! takayama 1188: 実行結果は図\ref{fig:graph2d}.
! 1189: -----プログラムの解説はまだ書いてない.
1.1 takayama 1190: \end{example}
1191:
1192: %<C
1193: \begin{figure}[tb]
1194: \scalebox{0.6}{\includegraphics{Figs/graph2d.eps}}
1.9 ! takayama 1195: \caption{2次関数のグラフ} \label{fig:graph2d}
1.1 takayama 1196: \end{figure}
1197: %>C
1198:
1199:
1.9 ! takayama 1200: \section{円を描く関数を作ってみよう}
1.1 takayama 1201:
1202: %%Prog: cfep/tests/2006-03-11-circle.rr
1203: \begin{screen}
1204: \begin{verbatim}
1205: import("glib3.rr");
1206: Glib_math_coordinate=1;
1207: glib_window(-1,-1,1,1);
1208: glib_clear();
1209: E = 0.2; X = 0; Y = 0; R = 0.5;
1210: for (T=0; T<=deval(2*@pi); T = T+E) {
1211: Px = X+deval(R*cos(T));
1212: Py = Y+deval(R*sin(T));
1213: Qx = X+deval(R*cos(T+E));
1214: Qy = Y+deval(R*sin(T+E));
1215: glib_line(Px,Py,Qx,Qy);
1216: glib_flush();
1217: }
1218: \end{verbatim}
1219: \end{screen}
1.9 ! takayama 1220: -----プログラムの解説はまだ書いてない.
1.1 takayama 1221:
1.9 ! takayama 1222: 上のプログラムでは $\cos$, $\sin$ を用いて円を描いている.
! 1223: 中心, 半径を変更したり, 色を変更したりしながらたくさんの円を描くには,
! 1224: どのようにすればよいであろうか?
! 1225: ``関数'' を用いるとそれが容易にできる.
! 1226:
! 1227: あるひとまとまりのプログラムは関数 (function) として
! 1228: まとめておくとよい. \index{かんすう@関数}
! 1229: 計算機言語における関数は数学でいう関数と似て非なるものである.
! 1230: 関数を手続き (procedure) とか サブルーチン (subroutine) とか
! 1231: よぶ言語もある.
! 1232: 関数を用いる最大の利点は, 関数を一旦書いてしまえば,
! 1233: 中身をブラックボックスとして扱えることである.
! 1234: 大規模なプログラムを書くときは複雑な処理をいくつかの関数に分割して
! 1235: まず各関数を十分テストし仕上げる.
! 1236: それからそれらの関数を組み合わせていくことにより,
! 1237: 複雑な機能を実現する.
! 1238: このようなアプローチをとることにより, ``困難が分割'' される.
! 1239:
! 1240: 円の例をしばらく離れ,
! 1241: 簡単な関数の例をとり関数の書き方を説明しよう.
! 1242: 前の節では $2$ の巾の表を作成するプログラムを書いた.
! 1243: これを元に次のような関数を作る.
1.7 takayama 1244: \begin{screen}
1245: \begin{verbatim}
1246: def power_table(N) {
1247: X=2;
1248: for (I=1; I<=N; I++) {
1249: print(X^I);
1250: }
1251: }
1252: power_table(8);
1253: \end{verbatim}
1254: \end{screen}
1.9 ! takayama 1255: 関数の定義は次のように {\tt def} 命令で行なう.
1.7 takayama 1256: \begin{verbatim}
1.9 ! takayama 1257: def 関数名(引数) {
! 1258: 関数本体
1.7 takayama 1259: }
1260: \end{verbatim}
1.9 ! takayama 1261: 上の例では関数名は {\tt power\_table} であり, 引数(argument)は {\tt N} である.
! 1262: 関数名は英数字と {\tt \_} を用いてつける.
! 1263: ただし数字や大文字ではじまる名前をつけることはできない.
! 1264: 処理内容を連想させるような名前をつけるのが望ましい.
! 1265: {\tt def} 命令では関数を定義するだけで実行は行なわない.
! 1266: 実行させるには, 上の例のように {\tt power\_table(8);} と引数の部分に実際の数字等を入れて
! 1267: 呼び出す.
1.7 takayama 1268:
1.9 ! takayama 1269: 引数は二つ以上あってもよくて,たとえば,
1.7 takayama 1270: \begin{screen}
1271: \begin{verbatim}
1272: def power_table2(X,N) {
1273: for (I=1; I<=N; I++) {
1274: print(X^I);
1275: }
1276: }
1277: power_table2(3,8);
1278: \end{verbatim}
1279: \end{screen}
1.9 ! takayama 1280: なる関数定義と最後の行のその呼び出しは
! 1281: $3^i$ を $i=1, \ldots, 8$ の範囲で計算して表示する.
! 1282: このような関数を用意しておけば,
! 1283: $2^i$, $3^i$, $5^i$, $1 \leq i \leq 10$ の表を表示したいとすると,
1.7 takayama 1284: \begin{screen}
1285: \begin{verbatim}
1286: power_table2(2,10);
1287: power_table2(3,10);
1288: power_table2(5,10);
1289: \end{verbatim}
1290: \end{screen}
1.9 ! takayama 1291: と書くだけで良く, プログラムも短くなり, かつ整理されているので, 読みやすくなる.
1.7 takayama 1292:
1.9 ! takayama 1293: さて, {\tt power\_table2(2,3);} を実行すると
1.7 takayama 1294: \begin{screen}
1295: \begin{verbatim}
1296: 2
1297: 4
1298: 8
1299: 0
1300: \end{verbatim}
1301: \end{screen}
1.9 ! takayama 1302: と表示される.
! 1303: 最後の 0 は一体何であろうか?
! 1304: これは実は関数の値である.
! 1305: 関数の値のことを戻り値ともいう.
! 1306: 戻値を指定するには, {\tt return} 文を用いる.
1.7 takayama 1307: \begin{flushleft}
1308: \begin{minipage}[t]{7cm}
1309: \begin{screen}
1310: \begin{verbatim}
1311: def twotimes(N) {
1312: S=2*N;
1313: return(S);
1314: }
1315: \end{verbatim}
1316: \end{screen}
1317: \end{minipage} \quad
1318: %
1319: \begin{minipage}[t]{7cm}
1.9 ! takayama 1320: 関数 {\tt twotimes(N)} は
! 1321: $2N$ の値を計算して戻す. \\
! 1322: この定義を書いておいて
1.7 takayama 1323: \begin{verbatim}
1324: A=twotimes(10);
1325: B=twotimes(100);
1326: print(A+B);
1327: \end{verbatim}
1.9 ! takayama 1328: を実行すると, {\tt A} には $20$ が代入され, {\tt B} には $200$ が代入され,
! 1329: {\tt print}文により $220$ が出力される.
! 1330: そのあと $0$ が出力されるがこれは {\tt print}文の戻り値である.
1.7 takayama 1331: \end{minipage} \\
1332: \end{flushleft}
1333:
1334: \noindent
1.9 ! takayama 1335: 関数の戻り値 (return value) は {\tt return} 文で
! 1336: 指定する.
! 1337: いまの場合は変数 {\tt S} の値である.
! 1338: なお, {\tt print} と {\tt return} は違う.
! 1339: {\tt print} は画面に値を印刷するのに対して,
! 1340: {\tt return} は関数の値を戻す働きを持つ.
! 1341: {\tt print} 文では, 関数の値を戻すことはできない.
! 1342:
! 1343: ``戻り値''(return value) という言い方は計算機言語特有の言いまわしである.
! 1344: ``関数 {\tt twotimes} は引数の2倍を計算して結果を戻す'' みたいに使う.
! 1345: 上の例でいえば {\tt A=twotimes(10)} としたとき,
! 1346: 戻り値が関数の値として変数 {\tt A} に代入される.
! 1347:
! 1348:
! 1349: 関数のなかで利用されている変数と引数は,
! 1350: その関数の実行中のみ生成される変数であり,
! 1351: さらにその関数外部の同名の変数の値を変えない.
! 1352: このように一時的に生成される変数を局所変数 (local variable) とよぶ.
! 1353: 関数の中で変数の値を変更したら, その関数の外の同じ名前の変数の
! 1354: 値もかわってしまうとしたら, 処理を分割した利点がすくない.
! 1355: そこででてきた概念がこの ``局所変数''
! 1356: の概念である.
! 1357: 上のプログラム例では,
! 1358: {\tt N}, {\tt S} が局所変数である.
! 1359: 局所変数はその関数のなかだけで有効な変数である.
! 1360: これを, ``局所変数のスコープはその関数のなかだけ'' という
! 1361: 言いかたをする.
! 1362: 局所変数の考え方は, 計算機言語の歴史では大発明の一つである.
1.7 takayama 1363:
1364: \noindent
1.9 ! takayama 1365: 例:
1.7 takayama 1366: %%%%%%%%%% mini page template %%%%%%%%%%%%
1367: \begin{flushleft}
1368: \begin{minipage}[t]{7cm}
1369: \begin{screen}
1370: \begin{verbatim}
1371: S=3;
1372: twotimes(2);
1373: print(S);
1374: \end{verbatim}
1375: \end{screen}
1376: \end{minipage} \quad
1377: %
1378: \begin{minipage}[t]{7cm}
1.9 ! takayama 1379: このプログラムの {\tt S} と関数 {\tt twotimes} のなかの変数 {\tt S} は別物
! 1380: である.
! 1381: したがって, {\tt twotimes} の終了時点で関数 {\tt twotimes} のなかの変数 {\tt S}
! 1382: の値は $6$ であるが, {\tt print} 文で {\tt S} の値を表示させてみても
! 1383: やはり $3$ のままである.
1.7 takayama 1384: \end{minipage} \\
1385: \end{flushleft}
1386:
1387:
1.1 takayama 1388: %<C
1389: \begin{figure}[tbh]
1390: \scalebox{0.6}{\includegraphics{Figs/circleFunc.eps}}
1.9 ! takayama 1391: \caption{ 関数による同心円の描画} \label{fig:circleFunc}
1.1 takayama 1392: \end{figure}
1393: %>C
1394:
1.9 ! takayama 1395: さて円を描く例にもどろう.
! 1396: 以下のように関数 {\tt circle(X,Y,R,Color)}を定義 ({\tt def}) する.
! 1397: この関数を $R$ や $Color$ を変化させながら呼ぶことにより,
! 1398: 図\ref{fig:circleFunc} のような同心円の図を描くことが可能となる.
! 1399: 関数についてさらに詳しくは ``asir ドリル'' を参照してほしい.
1.1 takayama 1400:
1401: \begin{screen}
1402: \begin{verbatim}
1403: import("glib3.rr");
1404:
1405: def circle(X,Y,R,Color) {
1406: E = 0.2;
1407: for (T=0; T<deval(2*@pi); T = T+E) {
1408: Px = X+deval(R*cos(T));
1409: Py = Y+deval(R*sin(T));
1410: Qx = X+deval(R*cos(T+E));
1411: Qy = Y+deval(R*sin(T+E));
1412: glib_line(Px,Py,Qx,Qy | color=Color);
1413: }
1414: glib_flush();
1415: }
1416:
1417: Glib_math_coordinate=1;
1418: glib_window(-1,-1,1,1);
1419: glib_clear();
1420: CC = 0xff0000;
1421: for (P = 0.4; P<0.5; P = P+0.01) {
1422: circle(0,0,P,CC);
1423: CC = random()%0x1000000;
1424: }
1425: \end{verbatim}
1426: \end{screen}
1.9 ! takayama 1427: {\tt (Qx,Qy)} と {\tt (Px,Py)} は
! 1428: {\tt E} だけ偏角が異る.
! 1429: 円を多面体で近似して描画している. \\
! 1430: -----プログラムの詳しい解説まだ.
1.1 takayama 1431:
1432: \begin{problem} \rm
1433: \begin{enumerate}
1.9 ! takayama 1434: \item このプログラムの関数を用いて接する半径の同じ円を二つ描画するプログラムを書きなさい.
! 1435: \item 円を塗り潰す関数を作れ.
! 1436: \item 分度器を描くプログラムを作れ.
! 1437: \item (発展課題) この分度器, 糸, おもり, わりばし, 板, cfep/asir によるプログラム等を用いて,
! 1438: 木やビルの高さを測定する機械とソフトウエアシステムを開発せよ.
1.1 takayama 1439: \end{enumerate}
1440: \end{problem}
1441:
1442: \begin{problem} \rm
1.9 ! takayama 1443: (これは発展課題) \index{OpenGL} \index{3じげんぐらふぃっくす@3次元グラフィックス}
! 1444: cfep には OpenGL インタプリターが組み込んである.
! 1445: OpenGL は3次元グラフィックスを用いるソフトウエア作成のために
! 1446: 用いられる約 150種類のコマンドから構成されているパッケージで
! 1447: 3次元グラフィックスの標準規格のひとつでもある.
! 1448: cfep 1.1ではその中の 10 弱のコマンドを利用できる.
! 1449:
! 1450: この OpenGL インタプリターを用い,
! 1451: 多面体(polygon)を材料にし,
! 1452: cfep上級編, OpenGL のプログラムを参考に
! 1453: ``家'' を書いてみよう.
1.1 takayama 1454: \end{problem}
1455:
1456:
1.7 takayama 1457: \noindent
1.9 ! takayama 1458: \fbox{\bf 実習の落とし穴}\\
1.7 takayama 1459: \begin{enumerate}
1.9 ! takayama 1460: \item unix 版, windows 版では asir ドリルにあるように
1.7 takayama 1461: \verb@ end$ @ %$
1.9 ! takayama 1462: をプログラムの最後に書かないと行けないが, cfep/asir ではこの命令は
! 1463: 計算エンジンの停止命令となるので書いてはいけない.
! 1464: ただし\underline{行の頭}に\underline{空白をいれずに}書いてある
1.7 takayama 1465: \verb@ end$ @ %$
1.9 ! takayama 1466: は自動削除されるので, unix, windows 版共通のプログラムを書くときは
! 1467: 空白を入れずに行の頭に書いておくと便利である.
! 1468: \item 空白や改行は原則自由に挿入していいが, 空白を入れてはいけない表現がある.
! 1469: たとえば
1.7 takayama 1470: \begin{verbatim}
1471: 0.1
1472: \end{verbatim}
1.9 ! takayama 1473: と書くべきところを
1.7 takayama 1474: \begin{verbatim}
1475: 0. 1
1476: \end{verbatim}
1.9 ! takayama 1477: と $1$ の前に空白を入れるとエラーとなる.
! 1478: 数字には空白を入れてはいけない.
! 1479: 理由は asir ドリルの構文解析の章を読むと理解できると思う.
! 1480: \item {\tt sin\ x} なる表現は受け付けてくれない.
! 1481: 必ず括弧がいる. つまり {\tt sin(x)} と書く.
! 1482: \item 掛け算の {\tt *} は省略できない.
1.7 takayama 1483: \end{enumerate}
1484:
1485: \noindent
1.8 takayama 1486: \HHH.
1.9 ! takayama 1487: {\tt [1,2,3]} のように {\tt []} で囲った表現をリスト(list)と呼ぶ.
! 1488: 関数の戻り値を数の組にしたいときはリストを値として戻すと良い.
! 1489: {\tt print} 文で多くの数を一行で表示したいときもリストを使うと便利である.
! 1490: {\tt L} をリストとするとき {\tt L[0]} でリストの最初(0番目)の元,
! 1491: {\tt L[1]} でリストの1番目の元, ... を表す.
! 1492: 詳しくは asir ドリル参照.
1.7 takayama 1493: \begin{screen}
1494: \begin{verbatim}
1495: L=[3,2,1];
1496: print(L);
1497: print(L[0]+L[1]+L[2]);
1498: \end{verbatim}
1499: \end{screen}
1.9 ! takayama 1500: %%Note: misc-2010/10/keisan-1/note-ja.txt 講義の進度.
1.1 takayama 1501:
1.9 ! takayama 1502: \chapter{For 文による数列の計算}
1.1 takayama 1503:
1.9 ! takayama 1504: \section{超入門, 第2の関門: 漸化式できまる数列の計算}
1.1 takayama 1505:
1506: \begin{example} \rm
1.9 ! takayama 1507: $a$ を正の数とするとき,
1.1 takayama 1508: \begin{eqnarray*}
1509: x_{n+1} &=& \frac{x_n + \frac{a}{x_n}}{2}, \\
1510: x_0 &=& a
1511: \end{eqnarray*}
1.9 ! takayama 1512: できまる数列 $x_0, x_1, x_2, \ldots $
! 1513: は $\sqrt{a}$ にどんどん近付くこと(収束すること)が知られている.
! 1514: $a=2$ の時, $x_1, x_2, \ldots, x_4, x_5$ を計算するプログラムを書いてみよう.
1.1 takayama 1515: %%Prog: cfep/tests/2006-03-11-sqrt.rr
1516: \begin{screen}
1517: \begin{verbatim}
1518: A = 2.0;
1519: X = A;
1520: for (I=0; I<5; I++) {
1521: Y = (X+A/X)/2;
1522: print(Y);
1523: X = Y;
1524: }
1525: \end{verbatim}
1526: \end{screen}
1527: \end{example}
1528:
1.9 ! takayama 1529: このプログラムの実行結果は図\ref{fig:sqrt}.
1.1 takayama 1530: %<C
1531: \begin{figure}[tbh]
1532: \scalebox{0.5}{\includegraphics{Figs/sqrt.eps}}
1.9 ! takayama 1533: \caption{$\sqrt{2}$ に収束する数列} \label{fig:sqrt}
1.1 takayama 1534: \end{figure}
1535: %>C
1536:
1.9 ! takayama 1537: 超入門での関門は
1.1 takayama 1538: \begin{screen}
1539: \begin{verbatim}
1540: Y = (X+A/X)/2;
1541: X = Y;
1542: \end{verbatim}
1.9 ! takayama 1543: の意味を完全に理解すること
1.1 takayama 1544: \end{screen}
1.9 ! takayama 1545: である.
! 1546: 変数の章で説明したように,
! 1547: $$ \mbox{{\bf 変数名}} {\tt = } \mbox{{\bf 式}} {\tt ;} $$
! 1548: はまず右辺の式を計算しそのあとその計算結果を左辺の変数に代入せよという意味
! 1549: である. したがって,
! 1550: \verb@ Y = (X+A/X)/2; @ は現在の {\tt X} と {\tt A} に格納された
! 1551: 数字をもとに \verb@ (X+A/X)/2 @ の値を計算し, その結果を変数 {\tt Y} へ代入せよ,
! 1552: という意味である. また
! 1553: \begin{screen}
! 1554: \verb@X=Y@ は \verb@X@ が \verb@Y@ に等しいという意味ではなく,
! 1555: 変数\verb@Y@ に格納された数字を 変数 \verb@X@ に代入せよという意味である.
! 1556: \end{screen}
! 1557: このように考えれば, 上のプログラムが $x_1, x_2, x_3, x_4$ の値を
! 1558: 順番に計算して print している理由が理解できるであろう.
! 1559: 自分が計算機になったつもりで,
! 1560: 変数の中の数値がどのように変化していくのか,
! 1561: 書きながら理解して頂きたい.
! 1562: これがはっきり理解でき, 応用問題が自由に解けるようになった, 超入門卒業である.
! 1563: \index{だいにゅう@代入}
1.1 takayama 1564:
1.5 takayama 1565: \begin{problem} \rm
1.9 ! takayama 1566: 変数 {\tt I}, {\tt X}, {\tt Y} の値は {\tt for} ループ内でどのように
! 1567: 変化するか?
! 1568: {\tt Y= (X+A/X)/2} の行が実行される前のこれらの変数の値を表にして
! 1569: まとめよ. {\tt print([I,X,Y])} をはさむことによりこの表が正しいことを
! 1570: たしかめよ.
1.5 takayama 1571: \end{problem}
1.9 ! takayama 1572: 表は次のような形式で書く.
1.8 takayama 1573: \begin{tabular}{|c|c|c|c|c|c|}
1574: \hline
1575: {\tt I} & 0&1&2&3&4 \\ \hline
1576: {\tt X} & &&&& \\ \hline
1577: {\tt Y} & &&&& \\ \hline
1578: \end{tabular}
1.5 takayama 1579:
1580: \begin{problem} \rm
1.9 ! takayama 1581: プログラムのバグ(bug)とはなにか?
1.5 takayama 1582: \end{problem}
1583:
1.9 ! takayama 1584: \section{円を描く数列}
1.1 takayama 1585:
1.9 ! takayama 1586: 前の章で円を描く関数を紹介した.
! 1587: $\sin$,$\cos$ の計算に時間がかかる計算機では, なるべく
! 1588: これら三角関数を用いないで円を描画する必要がある.
1.8 takayama 1589:
1.9 ! takayama 1590: 一つの方法は $s=\tan \frac{t}{2}$ とおくと
1.8 takayama 1591: $\cos t = \frac{1+s^2}{1-s^2}$,
1592: $\sin t = \frac{2s}{1-s^2}$
1.9 ! takayama 1593: と書けるという公式を使う方法である.
! 1594: $s$ はタンジェントで定義されていることを忘れてしまえばよい.
1.8 takayama 1595:
1.9 ! takayama 1596: もう一つは
! 1597: 数列の計算を用いて, $\cos$ や $\sin$ の計算をやらずに円を描く
! 1598: 方法である.
1.1 takayama 1599: %%Prog: cfep/tests/2006-03-11-circle-dda.rr
1600: \begin{screen}
1601: \begin{verbatim}
1602: import("glib3.rr");
1603: Glib_math_coordinate=1;
1604: glib_window(-2,-2, 2,2);
1605: glib_clear();
1606: E = 0.1;
1607: C1 = 1.0; C2=1.0;
1608: S1 = 0.0; S2=E;
1609: for (T=0; T<=deval(2*@pi); T = T+E) {
1610: C3 = 2*C2-C1-E*E*C2;
1611: S3 = 2*S2-S1-E*E*S2;
1612: glib_line(C1,S1, C2,S2);
1613: C1=C2; S1=S2;
1614: C2=C3; S2=S3;
1615: glib_flush();
1616: }
1617: \end{verbatim}
1618: \end{screen}
1619:
1.9 ! takayama 1620: このプログラムの実行結果は図\ref{fig:circleDda}.
1.1 takayama 1621: %<C
1622: \begin{figure}[tbh]
1623: \scalebox{0.6}{\includegraphics{Figs/circleDda.eps}}
1.9 ! takayama 1624: \caption{$\cos$, $\sin$ を使わずに円を描く} \label{fig:circleDda}
1.1 takayama 1625: \end{figure}
1626: %>C
1627:
1.9 ! takayama 1628: -----プログラムの解説まだ書いてない.
1.1 takayama 1629:
1.9 ! takayama 1630: ヒント:
! 1631: 微分方程式 $d^2 x/dt^2 = -x, d^2 y/dt^2 = -y$ を $t$ をラジアンとして
! 1632: 差分法で近似的に解いている.
! 1633:
! 1634: この話題は, 数列の計算と差分方程式によるシミュレーションに続く.
! 1635: これについてはまた稿をあらためて書いてみたい.
! 1636:
! 1637: 以上で超入門は終了である. 続きは ``Asir ドリル'' を読んでね.
! 1638: 特に配列と関数をマスターすると数学プログラムには重宝する.
! 1639:
! 1640: なお, asir ドリルに紹介してあるプログラムは \verb@ end$ @ %$
! 1641: または \verb@ end; @ が最後に書いてある場合が多いが,
! 1642: cfep/asir ではこの {\tt end} を書いてはいけない.
! 1643: {\tt end } は計算エンジンの停止命令であり, 実行されると ``計算中の表示'' がでて無応答となる.
! 1644: (一応, 行頭にあるこれらの命令は自動的に削除するようになってはいる.)
1.6 takayama 1645: %% kxx/ox_texmacs.c
1646:
1.5 takayama 1647: \begin{problem} \rm
1.9 ! takayama 1648: (レポート問題の例) \\
! 1649: なにか図を描くプログラムを書きなさい. (定番ドラエモンでもよい)
1.5 takayama 1650: \end{problem}
1.1 takayama 1651:
1.8 takayama 1652: \noindent
1.9 ! takayama 1653: \fbox{ノート}.
! 1654: 著者の場合, 週に1コマ講義, 演習1コマでは, ここまでで3週である.
! 1655: 上のレポート問題が最初のレポート.
! 1656: 3週目の演習の時間からとりかかり, 5週目の演習の時間に発表.
! 1657: 4週目からは asirドリル.
1.8 takayama 1658:
1.9 ! takayama 1659: \chapter{cfep 上級編}
1.1 takayama 1660:
1.9 ! takayama 1661: \section{\TeX によるタイプセット(実験的)}
1.1 takayama 1662: %%Doc: cfep/tests/2006-03-06
1.9 ! takayama 1663: 出力をTeXでタイプセットするには
! 1664: ``実行'' メニューから ``出力をTeXでタイプセット'' を選択する.
! 1665: {\tt latex}, {\tt dvipng} がインストールされてい
! 1666: ないと動作しない.
! 1667: これらはたとえば {\tt fink} から \TeX をインストールしたり,
! 1668: {\tt ptex\_package\_2005v2.1.dmg} (最近の状況は ptex package macosx で検索)
! 1669: などで Mac 用の pTeX をインストールしておけばよい.
! 1670: \TeX を用いた仕上り例は図\ref{fig:sl2}を見よ.
! 1671: なお, \TeX でタイプセットする場合ホームの下に
! 1672: \verb@OpenXM_tmp@ なる作業用のフォルダが作成される.
! 1673: タイプセットは実験機能のため, このフォルダの中の作業用ファイルは自動では消去されない.
! 1674: 時々手動で作業ファイルを消去されたい.
1.1 takayama 1675: \index{tex@\TeX}
1676:
1.9 ! takayama 1677: \section{選択範囲のみの実行}
1.1 takayama 1678:
1.9 ! takayama 1679: \index{せんたくはんいのみのじっこう@選択範囲のみの実行}
! 1680: 画面上の ``選択範囲のみを実行'' をチェックすると,
! 1681: ``始め'' ボタンをおしたとき, 選択範囲のみが評価される.
! 1682: 選択範囲がない場合はキャレット位置の行が自動選択されて実行される.
! 1683: \command{{\tt Enter}} と組み合わせてこの機能を使うと, ターミナルから
! 1684: asir を利用するのにちょっと似てくる.
! 1685: 図\ref{fig:sl2}はこのような実行をしている例である.
1.1 takayama 1686:
1687: %<C
1688: \begin{figure}[tbh]
1689: \scalebox{0.5}{\includegraphics{Figs/sl2.eps}}
1.9 ! takayama 1690: \caption{ターミナル風} \label{fig:sl2}
1.1 takayama 1691: \end{figure}
1692: %>C
1693:
1694:
1695: \noindent
1696: %%Doc: cfep/tests/2007-03-07-debug.rtfd
1.9 ! takayama 1697: \fbox{質問}
! 1698: cfep のインタフェースでデバッグをしながらプログラムを開発するにはどのようにやると
! 1699: よいか? \\
! 1700: \fbox{答え}
! 1701: cfep は初心者向きのインタフェースなので,
! 1702: 大規模なプログラム開発を想定していないが,
! 1703: 私は次のようにライブラリの開発をしている.
1.1 takayama 1704:
1705: \begin{enumerate}
1.9 ! takayama 1706: \item 必要な関数を書く. 下の例では {\tt sum1}.
! 1707: \item 関数をテストする入力をコメントの形でその関数の近くに書いておく.
! 1708: 下の例ではコメントにある {\tt sum1(10,1); } 等.
1.1 takayama 1709: \end{enumerate}
1710:
1711:
1712: \begin{screen}
1713: \begin{verbatim}
1714: /*
1715: testinput: sum1(10,1);
1716: testinput: sum1(10,2);
1717: */
1718: def sum1(N,M) {
1719: S = 0; i=1;
1720: for (I=1; I<N; I++) {S = S+I^M; }
1721: return S;
1722: }
1723: \end{verbatim}
1724: \end{screen}
1725:
1726: \begin{enumerate}
1.9 ! takayama 1727: \item ``始め'' ボタンで関数定義をロード.
! 1728: この時点で文法エラーなどがあればメッセージにしたがって修正.
! 1729: \item そのあと ``選択範囲のみを実行'' のモードに変更してコメント内の testinput を実行.
! 1730: \item 実行時のエラーの行番号への移動は "選択範囲のみを実行" のモードを解除してから
! 1731: 行う. \index{えらー@エラー}
1.1 takayama 1732: \end{enumerate}
1733:
1734: %<C
1735: \begin{figure}[tb]
1736: \scalebox{0.5}{\includegraphics{Figs/howtoDebug1.eps}}
1.9 ! takayama 1737: \caption{``選択範囲のみを実行''の活用} \label{fig:howtoDebug1}
1.1 takayama 1738: \end{figure}
1739: %>C
1740:
1741:
1.9 ! takayama 1742: \section{エンジンを起動しない}
1.1 takayama 1743: %%cfep/tests/2006-03-08-noEngine
1744:
1745: \noindent
1.9 ! takayama 1746: \fbox{質問}
! 1747: テキスト編集またはテキストの閲覧だけで計算をするつもりはありませんが. \\
! 1748: \fbox{答え}
! 1749: ``実行'' メニューで ``エンジンを自動起動しない'' を選択. \\
1.1 takayama 1750: %<C
1751: \scalebox{0.3}{\includegraphics{Figs/menuNoEngine.eps}} \\
1752: %>C
1.9 ! takayama 1753: あとでエンジンを起動したい場合は ``再起'' ボタンをおしてエンジンを起動する. \\
1.1 takayama 1754: %<C
1755: \scalebox{0.3}{\includegraphics{Figs/popupRestart.eps}}
1756: %>C
1757:
1758:
1.9 ! takayama 1759: \section{OpenGLインタプリタ}
1.1 takayama 1760:
1761: \index{OpenGL}
1.9 ! takayama 1762: Cfep には OpenGL インタプリターが組み込んである
! 1763: \footnote{{\bf 注意}: cfep/asir の
! 1764: OpenGL は MacOS 10.13 (High Siera) 以降では動作しない.
! 1765: glib も X11 を用いている.}.
! 1766: OpenGL は3次元グラフィックスを用いるソフトウエア作成のために
! 1767: 用いられる約 150種類のコマンドから構成されているパッケージで
! 1768: 3次元グラフィックスの標準規格のひとつでもある.
! 1769: cfep 1.1ではその中の 10 弱のコマンドを利用できる.
! 1770: 詳しくは
! 1771: {\tt cfep.app/OpenXM/lib/asir-contrib/cfep-opengl.rr} を参照.
! 1772:
! 1773: \index{OpenGLぐらふぃっくおぶじぇくと@OpenGLグラフィックオブジェクト}
! 1774: OpenGL ではまず OpenGLグラフィックオブジェクトを配置し,
! 1775: それから視点の位置から見た画像を描画する方法を用いる.
! 1776: したがって, システムは常に OpenGLグラフィックオブジェクトの集合を保持
! 1777: している.
! 1778: {\tt glib\_remove\_last()} 命令はその最後の要素を削除する命令である.
! 1779: {\tt cfep-opengl.rr} ライブラリでは,
! 1780: {\tt opengl.metaRemoveLast()} 関数で最後の要素を削除できる.
1.1 takayama 1781: \index{opengl}
1782:
1783: %<C
1784: \begin{figure}[tb]
1785: \scalebox{0.6}{\includegraphics{Figs/twoPolygon.eps}}
1786: \caption{} \label{fig:twoPolygon}
1787: \end{figure}
1788: %>C
1789:
1790: \begin{screen}
1791: \begin{verbatim}
1792: import("cfep-opengl.rr");
1793: opengl.metaRemoveAll();
1794: opengl.init();
1795: opengl.glib3DefaultScene(0);
1796: opengl.redraw();
1797: opengl.glColor4f(0.0,0.0,1.0,0.3);
1798: opengl.glBegin(GL_POLYGON); Y=0.1;
1799: opengl.glVertex3f(-1.0, Y, 0.5);
1800: opengl.glVertex3f(-1.0, Y, -0.5);
1801: opengl.glVertex3f(1.0, Y, -0.5);
1802: opengl.glVertex3f(1.0, Y, 0.5);
1803: opengl.glEnd();
1804:
1805: opengl.glColor4f(1.0,0.0,0.0,0.5);
1806: opengl.glBegin(GL_POLYGON);
1807: opengl.glVertex3f(0.0, 0.5, 0.0);
1808: opengl.glVertex3f(0.0, 0.5, -0.4);
1809: opengl.glVertex3f(0.5, -0.2, -0.4);
1810: opengl.glVertex3f(0.5, -0.2, 0.0);
1811: opengl.glEnd();
1812: opengl.glFlush() ;
1813: opengl.metaShowListOfOpenGLCommands();
1814: \end{verbatim}
1815: \end{screen}
1.9 ! takayama 1816: このプログラムでは 2 枚の長方形を描いている.
! 1817: このプログラムの出力は図\ref{fig:twoPolygon}.
! 1818: -----詳しい説明はまだ.
! 1819:
! 1820: OpenGL の画面には普通の数学のように $(x,y)$ 座標がはいっており,
! 1821: 画面から手前側が $z$ 座標が正の方向, 画面の向こう側が
! 1822: $z$ 座標が負の方向である.
! 1823: ``目'' から原点方向を見た画像が
! 1824: 図\ref{fig:twoPolygon}にあるように 3 つのスライダーを用いて目の位置を動かせるので,
! 1825: OpenGLオブジェクトをいろいろな角度からみることが可能である.
! 1826: 下のスライダーが目の $x$ 座標, 右の二つのスライダーがそれぞれ目の $y$, $z$ 座標である.
! 1827: 目の動きに慣れるには, 次の二つのデモ画面をためすと面白いだろう.
1.1 takayama 1828: \begin{screen}
1829: \begin{verbatim}
1830: import("cfep-opengl.rr");
1831: opengl.glib3DefaultScene("mesa demo/ray");
1832: \end{verbatim}
1833: \end{screen}
1834:
1835: \begin{screen}
1836: \begin{verbatim}
1837: import("cfep-opengl.rr");
1.3 takayama 1838: opengl.glib3DefaultScene("cfep demo/icosahedron");
1.1 takayama 1839: \end{verbatim}
1840: \end{screen}
1841:
1.9 ! takayama 1842: \section{asir 以外の計算エンジンの利用}
1.4 takayama 1843:
1.9 ! takayama 1844: cfepから asir 以外の OpenXM 準拠の計算エンジンも利用できます.
! 1845: たとえば, 実行, 計算エンジンの選択で, kan/sm1 を利用することも可能です.
! 1846: cfep, {\tt ox\_texmacs}, {\tt ox\_sm1} が相互に通信しながら計算しています.
1.4 takayama 1847:
1.9 ! takayama 1848: なお kan/sm1 の {\tt run} コマンドは使えません.
1.4 takayama 1849: \begin{verbatim}
1.9 ! takayama 1850: [(parse) (ファイル名) pushfile] extension
1.4 takayama 1851: \end{verbatim}
1.9 ! takayama 1852: で代用して下さい.
1.4 takayama 1853:
1.1 takayama 1854: \cleardoublepage
1855: \flushbottom
1856: \printindex
1857:
1.9 ! takayama 1858: \end{document}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>