数値解析法 (Fortran 編), 2006-06-09 質問とコメント, M は宮本によるコメント。 h03s2006: fortranは配列操作に長けているという話を某サイトにてありました。他の プログラムで配列操作をやったことがありますか?やはり、使いにくいのでしょうか? M: 「某サイト」とはどこのことでしょうか ? そのサイトの記述の信頼性は ?? 配列は最も基本的なデータ構造のひとつですから, たいていのプログラム言語に備え られていて, 取り扱うことができると思います。C 言語であつかったこともあります。 h03s2011: 文法入門の後半パート2の15ページ下*19のトコロで末端のcontinue文 がカッコ悪いとあるのですが、これは個人的な意見としての文なのでしょうか? それともプログラミングをする人一般的な意見でしょうか?いまいちどのあたりが カッコ悪いのかわかりません。 M: continue 文を使うということは, 文番号を使っていますね。プログラムをその論理 構造にしたがってインデントして書いたりしたときに, continue が字下げされて いるのに, 文番号は 2--5 桁に書かなければいけなくって, せっかくの字下げの効果も 半減です。まあ古来からの Fortran プログラマにとっては, インデントなどせずに 実行文が 7 桁目からそろって書かれているほうが美しいと感じるかもしれませんね。 その意味では個人的見解ということにしておいた方が無難かもしれません。 h03s2090: FORTRANの世界では必ず宣言語が必要であるのは理解できます。でもなぜ 暗黙言語がありますか?きまっていたことですか?暗黙語と明示語は両方が存在して、 本当に面倒ですよ、覚えにくいです。理解しにくいです。 M: あなたが 暗黙語 (暗黙言語) とか明示語という言葉で何を意味したいのかが良く 分かりません。変数の型宣言のことだとして, 最初に FORTRAN を設計した技術者たちは 配列の index に良く使われる I, J などを宣言無しで整数としてあつかえるのが 便利だと思ったのでしょう。A(I) と書けば, 特別な宣言無しで実数 A の配列の I 番目 の要素のことだと。宣言を明示的に書くのは, 能力の低かった当時のコンピュータに 余計な仕事をさせるムダなことだと考えたのかもしれません。 (2006-06-16 追記) h04s2005: List7とList8は、Fortran77版とFortran90版の違いを見るためのもの ですか?ここに劇的な違いはあったりするのですか? M: どこが違うのか, 見比べてください。Fortran90 では do while --- end do が 使えるので, goto 文と if 文による実行順が交差しているような記述を避けることが できます。すなわち, 上から順に実行する形式にプログラムの論理を構築することが できて, わかりやすい。この「わかりやすい」は, 劇的に重要なことです。 h04s2012: 日本語でプログラミングしたいです。ないですか? M: MIND とかいう言語があったような気がします。それ以外にもあると思いますが, 詳しくは自分で調べてください。 h04s2016: LUMIXでできた課題をメールで送信するにはどうすればよいですか? M: 「LUMIX」って何ですか ? とプログラムなら聞き返しますよ (笑)。それはさておき, なぜ $HOME/windows/fortran というディレクトリで作業しているかってことは, 解説したはずだし, 前回までにそれに関する質問もあったんですけど ......。 例えば 2006-06-02 の h04s2022 とかを参照してください。 h04s2017: 倍精度実数とは何ですか? M: まず, 言葉の文字面から想像できませんか ? 次に, 私がここで説明するよりも ちゃんとした文法書を見てもらった方が, はるかに詳しく正しく書いてあると 思いませんか ? そして数日待たずともあなたのペースで読み進められるし。 h04s2021: プログラミングに適したosってありますか? M: この「数値解析法」を担当しているという立場もあるので, 「Unix !」と答えて おきます (笑)。 h04s2022: リスト9のプログラムで、eの指数関数の話がありましたが、なぜ「D」を 使うのですか?普通に「E」とかではだめなのですか? M: 倍精度の数値としてあつかいたかったからです。ソースプログラム上で, いくら多桁の数値を書いたとしても「E」を使うと単精度の数値になってしまい, 多桁書いた意味がなくなってしいます。また代入される変数が倍精度であっても, 代入する数値が単精度では, 有効数字の下の方の位にゴミが入るだけです。 h04s2024: Exercise 2.5で正確に入力したつもりが、goto 10というエラー表示がでま した。アシスタントの人にも聞いたのですが原因がわかりませんでした。どういった 原因が考えられますか? M: 自分の「つもり」が, 実はそうなっていないとか, TA の仕事っプリが悪い (わからなかったら私を呼べ, と) のが原因として考えられますネ。 または, 主プログラムは program 文で始まり end 文で終わっていますか ? h04s2027: 場合分けをするときのプログラムの書き方がなかなか難しいです。 if 、else if 以外に条件分けをするときのプログラムでの表し方はありますか? M: Fortran77 では, 条件分枝のためには if 文を使うしかありません。Fortran90 では select case 文というものがあります。分枝の場合分けの数が多数あるときに, if --- else if --- else if --- else if ... end if と else if を繰り返した 記述をせずにすみます。 h04s2028: 電子常磁性共鳴とはどういったものなんですか? M: ここで説明するには, 問題が複雑すぎます。本当に知りたければ, ぜひ研究室へ おいでください。 h04s2030: 自分がパソコンだったとしてプログラムを考えると、何とかプログラムを 作れる気がしました。どうしたら上手くプログラムを作れますか? M: すばらしい ! 良いところに気付きましたね !! 自分がコンピュータになった つもりで, ひとつずつ命令文を実行していくとどうなるか, と考えて既存の プログラムを読んでみましょう。そしてそういう発想で, やりたいことを細かな ステップに分解して考えることができるようになると, プログラムがうまく作れる ようになるかもしれません。 h04s2032: プログラムリストのListing3 配列でwriteの行のjをiに変えてやれば、 jがいらないと思うんですが、jには何か意図があるんですか? M: 変数を節約し, 実行時に必要なメモリを節約する意味ではそうでしょう。 しかし, 一つの変数に一つの意味, という意味で別の変数を使いました。 h04s2034: プログラミング言語にはfortran言語とC言語があり、現在はC言語が主流と 聞いたことがあるのですが、fortran言語はなぜ衰退したのですか?fortranには何か 致命的な欠点があるのですか? M: そのニュースソースの信憑性を疑います。他にもたくさんの言語があるし, 分野に よっては C 言語以外のものが主流だと思います。したがって, 分野の特徴に応じて それぞれ個性を持った言語が選択されているだけだと思いますよ。 h04s2036: 入出力文で装置番号指定するようになっていますが、どのように星印と1番と 5番と6番の使い分けたら良いのでしょうか。参考書を読んでも良く理解することは できませんでした。 M: 5, 6 番は標準の入出力で, 5 が入力側, 6 が出力側だということすら, 理解でき なかったのでしょうか ? 1 番にはそのようなお約束が無いので, プログラム作成者が 必要に応じて, ファイルからの入力またはファイルへの出力として利用すること でしょう。入出力装置の機器番号が明示的に指定されていれば, OS 側での操作でその 機器として具体的に何を接続するかを決定することになります。もし入力装置として 明示的に 5 番を指定していれば, 同様に OS 側の機能で任意のファイルや通信回線 などの具体的な入力装置に接続を変更できます。さらにもしも入出力機器番号を変数に していたら, プログラム内部で機器を切り替えることができます。 星印の場合には, 入出力は標準入出力装置が相手です。現在みなさんが使っている コンピュータや OS では標準入出力を切り替える操作/機能が OS 側にありますので, 5, 6 番を用いることとの差はほとんどないかもしれません。しかし昔からそうだった, あるいはすべてのコンピュータにとってそうであるとは限りませんね。 h04s2038: Fortranの主要な最適化オプションでこのオプションの指定は必ず 必要ですか? M: あなたが「この」と言っても, どの最適化オプションのことを言っているのか わかりません。そもそも「オプション」なのだから, 選択の自由は利用者である あなたにあるのでは ? 最適化する必要があれば指定するし, なければ指定しないという だけでしょ ?? h04s2039: 今やっているプログラミングのほかにもっと面白い事を行うプログラムが あると思いますが、どんなプログラムがあるのですか? M: そんなあなたに dungeon をお勧めします ;-p h04s2040: 6/23は括弧がついていますが、出席をとるのですか? M: 最初の時間に言った通り, 6/23 の回の出欠は評価の対象外です。でも今回の出欠は 評価の対象ですし, あなたのこの質問の内容も評価の対象です。もしも面白い質問を 思いついて, そのことをアピールして評価の足しにしてほしいという人があれば, 6/23 にメールしてみるのも無駄ではないかもしれません。 h04s2042: fortranの77と90には大きく違いがあるのですか?(使いやすいなど)また、 これらはwindowsの2000やMeなどみたいに年度で名前をつけてるのですか? M: 使いやすさというのは主観ですので, 新しい方が使いやすいと一概に言えるものでは ないと思いますし, Fortran77 と 90 との違いも沢山あるので全部について一括しては 言えないと思います。さらに Fortran は過去との互換性も重視していますので, 77 のレベルで書いたプログラムを 90 のコンパイラで処理しても, ほとんどがそのまま エラー無く通ることでしょう。この場合, そのプログラムは 77 のプログラムなのか 90 のプログラムなのか, どうでしょう ? (笑)。なお 66, 77, 90, 95 などの数字は, 規格の制定年を基にしていると思われます。ちなみに Windows は 95 からですから, Fortran の方が歴史は古く, Windows の方が真似した形ですよ。ちなみのちなみに, Fortran2003 くらいが最新版らしい。 h04s2043: プログラミングだけならやはりUNIX系のOSが適していると思いますが。 プログラミングとほかにの事を一緒にやるとなると、先生はOSは何が適していると 考えますか? M: え ? こうして文書を書いているのも FreeBSD (unix 系) の emacs だし, 論文も 授業で配るプリントも LaTeX だし, プレゼン資料も LeTeX → PDF ファイル だし, メールも web ブラウズもだし, unix でみんなできますけど ?? あ, 大学事務からの word や excel ファイルは windows のソフトを使ってますね。 でもそれも Openoffice を使えば, windows は不要ですね。 h04s2044: Fortranでは、実数と小数を区別しなければならないのでしょうか? M: あなたが言っているところの「実数」や「小数」とは何ですか ? 文法についての 詳細が知りたければ, ちゃんとした文法書を見たらいかがでしょうか ?? h04s2046: 分数の計算で分母と分子を分けて計算しようと思いますが、計算結果は 分母も分子も整数でなければなりませんか。 M: あなたがそこで想定している分数って, どんなものですか ? そこでは分母や分子が 整数以外のものになることがあるのですか ?? 2.2/1 は分数ですか, 2.6/3.3 は ??? h04s2048: Fortranで、文字を整数型にする組み込み関数ってありますか?(icharは コードの整数化、inumやjnumはコンパイラが認識できないのでそれ以外で)。なければ 整数化する方法教えてください。 M: 文法書を見ると, そのような組み込み関数は無いことがわかりますね。 そこでどうするのかが工夫のしどころです。たとえばこんな方法があります。 まず文字 `0', `1', ..., `9' の文字コード番号が連続していることが前提ですが, もしそうでなければ自前で配列などを利用して連続した番号を割り当てておきます。 するとどうでしょう ! 文字 `0', `1', ..., `9' のそれぞれのコード番号と `0' の それとの差が, 文字の値になっているではありませんか !! もしも桁数が多ければ, 一桁ずつ順に処理して, 10**n 倍 (十進数の場合) して加えるのを繰り返せばいいです よね。 h04s2054: 先生はプログラミング得意ですか?どの程度できるのですか? M: パズルなどを考えるのは好きな方です。 h04s2057: Listing 8のBJゲームを作ったのですが、ゲームの内容がよくわかりません。 どのような、数値を入れてしまったらDOBON になってしまうのですか? M: 帰納的に解決する方法と演繹的に解決する方法が, すぐに思いつきませんか ? 前者はプログラムを実行してひとつずつ確かめてみる方法, 後者はプログラムの ソースを見て内容を確認する方法ですが。 h04s2058: 配列の文法がfotranとCはよく似ているが、Cのほうは添え字が0から 始まるのにfortranは1からです。どうしてでしょうか? M: それぞれの言語の起源に関わることだと思います。 Fortran は formula translation という名に恥じず, 通常の数式をコンピュータに 実行可能なように翻訳するのが目的でした。数学の級数 {a_i} などの添字としては, 1 からを使うのが自然であると思われます。 いっぽう C は, OS そのものの記述などを目的として開発され, ハードウェアに 密着した部分の記述が容易にできるのが特徴です。そこで重要な事項にメモリ操作が あります。そこでは目的とするメモリのアドレスを先頭アドレス A とオフセット アドレス I の和 A+I として計算します。そういうときはオフセットアドレスは 0 から 始まるとした方がわかりやすいですね。 h04s2059: 大学の先生は使うOSにかなりこだわりがあるようですが、これは使用目的に 適したOSを使っているからでしょうか。 M: そういうこだわりがある人も, そうでない人もいるでしょう。またコンピュータに あまり詳しくなくて, 最初にいじったものと同じものを使い続けるとか, 困ったときに 頼れる知人と同じものを使うとか, 色々な理由があるのは世間一般と同じだと 思います。 h04s2062: GONOME端末に日本語で書き込めないのですか?VINUXは世界共通で使われて いるものなのですか? M: 「GONOME端末」が何を意味しているのか不明ですが, 「GNOME端末」だとして話して みます。(ちなみに, こういうたった一文字の違いでも, コンピュータはこちらの 意図した通りには動いてくれませんよ。普段から注意するにこしたことはありません ね。) その端末は, コマンドを入力してコンピュータにある動作を命じるものです よね。ではそのコンピュータは日本語で入力された命令を, 解釈して実行できるので しょうか ? あなたが書き込もうとするのは勝手ですが, 相手が理解できなければ意味が ありませんね。 つぎに「VINUX」とは何でしょうか ? そういうワケの分からないものが世界共通で 使われているとは思えません。「Linux」または「Unix」の間違いでしょうか ?? もしそうだとしても, 「世界共通」の「共通」という言葉で, あなたは何を表現したい のでしょうか ??? Linux や Unix は, 現在では世界中で使用されています, その意味 では世界共通。しかし全く同一のものが使用されているかと言えば, それぞれ微妙に モデファイされたりローカライズされたりしていると思われます, その意味では 世界共通ではない。 h04s2063: 繰り返し回数がわからない反復処理はどうするんですか? M: 別の条件で繰り返しを終了します, って資料に書いてたでしょっ ! h04s2067: プログラムを有効にし実行したあと、プログラムに間違いがあれば、 間違ってた部分が表示されますが、「^」で間違ってた文字にマークがつきますが、 「^」以外に間違いを示すマークはどんなものがありますか? M: 「プログラムを有効にし実行したあと」っていうのが独自の言葉づかいのせいか 意味不明です。ソースをコンパイルすることだとして, たまたまここで使っている コンパイラ g77 が「^」記号で解釈不能のところを示しているだけですね。使う記号や エラーの指摘方法は, ものによりさまざまにできていることでしょう。 h04s2069: 先生はプログラム作るの楽しいですか? 私は1人じゃ難しくて大変です。 M: h04s2054 を参照してください。 h04s2070: 宮本先生は今まで組んだプログラムでどんな分子や原子の電子軌道を計算 した事がありますか? M: 分子や原子の電子軌道をまともに計算することはとてつもなく難しく, そのための プログラムの作成もしかりです。したがって自分でプログラムを作って計算できる ようなものは, せいぜいヒュッケル法くらいのものでしょう。それ以上に高度なものは, 既存のプログラムを使う方が圧倒的にトクだと思います。どんな分子について計算 したのか, もしも本当に知りたければ, 研究室においでください。 h04s2071: fortran だとか入力言語は英語ですがなぜウィンドウズは日本語なの ですか?日本で広く使われているからという理由だけなのでしょうか?? M: 「入力言語」というのが何を意味しているのか意味不明です。Windows で [はい] や [いいえ] のボタンをクリックしたり, [ワード] のアイコンを「開く」したりするのが コンピュータに命令を日本語で入力しているつもりなのでしょうか。Fortran のソース を g77 でコンパイルすべく端末のプロンプトに対してコマンドを入力するのが, 英語で 入力してるってことなのでしょうか ?? Linux の Gnome デスクトップ環境でアイコンに「ブラウザ」とカタカナで文字を 添えたり, クリックするボタンに「はい」と表示させることは可能だし, Windows の コマンドプロンプトまたは類似の端末ウインドウから しかるべきコマンドを入力して 実行させることは可能ですよ。 h04s2073: 自分でパソコン作るのは、難しいですか? M: どのレベルで作ることを想定していますか ? 世間で Windows 用の PC を作ると 言っても, それは部品が実装されている基盤や電源ユニットを購入してきて, それらを 決められたコネクタでつないで配線するだけです。PC メーカーやショップブランドでも やってることはいっしょですね。 h04s2075: 参考書などを見たら、プログラム内にカタカナで注釈などが記載されていた のですが、自分でカタカナを打ちこんでみようと思ってやってもできません。 プログラム内にカタカナ(または、ひらがな)を打ちこむことはできるのですか? また打ちこむことができた場合、どのようにすれば、打ちうちこむことができるの ですか? M: 末尾の疑問文は論理がおかしいね。それはさておき, プログラム中にカタカナを 入力することは, たぶん可能です。しかしそれをコンパイラがあなたの意図どおりに あつかってくれるかどうかは, 個々のコンパイラに依存する話です。g77 について どうであるか私は知りませんので, 必要な人は調べてみるか試してみてください。 ちなみにカタカナを交えたファイルを作成できるかどうかは, 使用するエディタに 依存した話ですので, あなたがお使いのエディタについてどうすればいいのかは, 自分で調べてください。 h04s2076: プログラムを作るのにはやはりセンスが必要でしょうか? M: そりゃぁ何事につけても, それに応じたセンスがあった方が, 優れたものができる ことでしょう。無い場合には, それなりのものができるだけですが。 h04s2078: 2c Fortran 文法入門 (Part III, プログラムリスト, 2.11) のListing3で dimension b(10)というものがありますが、dimension b(10) を消して real a(10) , b(10)にしても動くのですがdimension b(10)はどういう意味があるの ですか? M: 資料で説明してあるつもりですが, わかりにくいのであればご指摘下さい。または 文法の詳細は, やっぱりチャンとした文法書を見てください。 ちなみに, b という名前の配列を要素数 10 個のものとして宣言してるんですが。 h04s2081: CPUの中ではいったいどのようなことが行われているのですか? M: それをここで説明するのは困難です。ぜひ自分でしかるべき書物を読んでみて ください。 h04s2084: 問題2.3についてですが縦軸、横軸2つのカラムがあるとしてとありますが、 最低いくつくらいのプロット数が必要ですか。あとカラムっていう単語の意味が わからないんでこの機会に教えてください。 M: そんな最低数などありません。そもそもプログラムをちょっと修正すれば, 十でも 百でも, いくらでもすぐにできるでしょ。 あと単語の意味が分からなければ辞書を調べれば良いのではないでしょうか ? ちなみに「カラム (column)」とは列のことですが (行, row, ではない), (英字) 新聞の一段もカラム (コラム) ですし, 化学物質の分離生成をする器具・装置も カラムですね。みんな同じです。 h04s2086: フォートランはどのような場合に一番使われますか? M: 既出の質問ですね。つまんないです。