前回の補足
よい「手抜き」のススメ
普段の学業においては「手抜き」は非難の対象であるが、この演習中は以下のような「手抜き」を有効活用することを勧める。 なぜならこれらは、無用なタイプミスを防いでくれる などの効果が大きいからである。
- 便利なキー操作を活用せよ
端末の中 (コマンドプロンプトが出ているとき) で使うと便利なもの
- カーソルの up キー ↑ を押すと、最近実行したコマンドを表示 してくれる機能がついている。 しかも連打が (ある程度だけだが) 効く。
- カーソルの left キー ← や right キー → を押すと、現在表示中のコマンド中でカーソルを移動 してくれる機能がついている。
- TAB キーを押すと、ファイル名を補完 してくれる機能がついている。
gedit の中でも何かあると思うのだが.... 見つけた人は発表してください。
ついで (の布教活動) であるが、emacs というエディターの プログラミング支援機能 は実に素晴らしい。 emacs の Fortran モード のありがた味にハマると、もう gedit なんて使う気分になりません (経験者談)。 例えば亀山は emacs で Fortran のプログラムを書くにあたって、Enter キーで改行したら、すかさず TAB キーを押す クセがついてしまっております。
- 許される範囲内の「コピペ」はやって OK
他人様のものでない資料からは積極的に「コピペ」をしてよい。 特にこの演習に限っていえば、自分でこれまで入力・作成したプログラムの中身からはどんどん「コピペ」するべき である。 既に「問題なく動く」ことが確認できているなら、その部分にタイプミスなどはないはずだから。 またウェブ・ブラウザ上で見ている この講義資料からも (できるところならば) 「コピペ」してもらって OK (のつもりで作っている)。
Fortran 90 の文法や機能が気になって仕方がない人へ
既に気付いているとは思うが、この演習で示しているサンプルプログラムの中には、これまでにまだ習っていない (はずの) Fortran 90 の文法や機能が (けっこう多く) 使われている。 そのような機能はこれから先に少しずつ説明を加えていく予定であるので、当面は「そういうもんだ」と思っていてほしい。 外国語を勉強する場合と同様に、プログラミング言語を勉強する時にもまずは 「習うより慣れろ」 という心掛けが大事なのだ (という経験をしてきたので、なおさらそう思う)。
ただし、どうしても気になる人向けに、参考書としてシラバスにも掲載している「Fortran 90 プログラミング」という本の web 版を ここ からたどれるようにしている。 必要に応じて利用されたし (ただし、どうせなら本を買ったほうがいいと思うけれど)。
今日のテーマ: 平均・分散・標準偏差 (その1)
最初の目標として、「各年の平均気温を求め、それを表示させる」ことを考える。 そのためにはまず、何はなくとも 各月の平均気温の総和をとる ための方法を考えてやる必要がある。
なお本来は、各月に含まれる日の数 (1月なら31日分、4月なら30日分とか) に応じた「重み」をつけて平均を計算してやる (これを 「重みつき平均」 という) 必要があるのだが、ここでは (面倒なので)、各月の平均気温の総和を12で割る ことで年平均気温が求まるものとする。
方法その1: ベタベタなやり方
準備として、前回 作成した enshu01.f90 からスタートし、「各年の 1月から4月までの気温の平均 を求めて表示する」機能を追加したプログラムの例を示す。 もとの enshu01.f90 と比べて、どこがどう違っているかに注目せよ。 なお、以下で 薄い文字で書いてある行は、新たに書き足す必要のない 行であることを示す。
p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | a | |||||||||||||||||||||||||||||||||||||||||
i | m | p | l | i | c | i | t | n | o | n | e | ||||||||||||||||||||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | s | e | i | r | e | k | i | , | j | o | u | t | a | i | |||||||||||||||||||||||||||||||||
r | e | a | l | , | d | i | m | e | n | s | i | o | n | ( | 1 | 2 | ) | : | : | k | i | o | n | ||||||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | |||||||||||||||||||||||||||||||||||
d | o | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
r | e | a | d | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 5 | . | 1 | ) | ' | , | i | o | s | t | a | t | = | j | o | u | t | a | i | ) | s | e | i | r | e | k | i | , | k | i | o | n | |||||||||
i | f | ( | j | o | u | t | a | i | / | = | 0 | ) | e | x | i | t | |||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | = | ( | k | i | o | n | ( | 1 | ) | + | k | i | o | n | ( | 2 | ) | & | |||||||||||||||||||||||
+ | k | i | o | n | ( | 3 | ) | + | k | i | o | n | ( | 4 | ) | ) | / | 4 | . | 0 | |||||||||||||||||||||||||||||||||||
w | r | i | t | e | ( | * | , | ' | ( | i | 4 | , | 1 | 3 | f | 6 | . | 1 | ) | ' | ) | s | e | i | r | e | k | i | , | k | i | o | n | , | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | ||||||
e | n | d | d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||
e | n | d | p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | a |
このプログラムのミソは
- 各年の平均気温の値を入れるために、kion_nen_heikin という名前の「器」を使うことを宣言する。
「器」の名前は何でもよいが、分かりやすいものにしておくこと。 平均気温の値は実数 であるはずだから、ここでも実数を入れるための「器」として宣言しておく。
- 配列の要素の参照のしかた。
kion(1) で 配列 kion の1番めの位置 (に入っている値) を指す。 kion(2) 〜 kion(12) も同様。
- 平均値を計算して「器」に入れる。
Fortran の「=」とは「代入」と呼ばれるもので、「右辺の式を計算して出てきた答の値を、左辺の変数に入れてください」という命令 の意味である (気になる人はここを)。 実にまぎらわしいのだが、数学で出てくる「=」とは違って 「右辺と左辺で値が等しい」という意味ではない ことに十分注意すること。 また 「/4」ではなく「/4.0」としている のにも、実はちゃんとした意味がある (説明は後日)。
- 計算した値を書き出す。
write で始まる行を修正し、kion_nen_heikin の値も書き出すようにする。 ただし、もともと 12f6.1 だったところを 13f6.1 と変更することも忘れないように。 これは、もともと「12個の実数を書き出してください」という命令を、「13個の実数を書き出してください」と直したことに相当する (説明は省略; どうしても気になる人は ここ を)。
- 「継続行」の指定。
Fortran 90 には 1行の長さが132文字まで という制限がある。 もし1行に書くべき命令がこの制限を超えて長くなってしまいそうな場合は、「継続行」の指定をする。 文の最後に「&」記号がつくと、次の行はその行の続きであるとみなされる (説明は ここ)。
これを参考にして、各年の気温の平均 (要するに「1月から12月までの気温の平均」) を計算する命令がどう書けるかを考えよ。 そして、enshu01.f90 にその機能を追加したプログラムを作成せよ [みほん]。 なお (当然気付いているとは思うが)、もともとの enshu01.f90 をコピーして新たなファイル (例えば enshu02a.f90) を作り、それを編集するのが簡単。 そして
$ gfortran enshu02a.f90によりコンパイルを行い、gfortran に怒られなかったら、以下の手順によりプログラムを実行する。
$ cat matsuyama-kion.txt | ./a.out
変更後のプログラムを実行すると、各行の最後 (13番めの実数) にその年の平均気温が出力されているはずだ。 自分の作ったプログラムが平均気温を正しく計算できているか を、2023年の気温データを例にとって確認せよ。 確認には電卓 (コンピュータに付属のものでもOK) を使ってよい。 なお 「gfortran に怒られなかった」とか「プログラムが転ばなかった」からといって「正しく計算できた」と断定できる訳がない (当然) のだから、自分でプログラムを作る場合でも、こうした確認作業は必ず行うべき である。
なお正しく計算できていれば、プログラムの出力 (の最後の1行) は以下のようになるはずである。 各行の最後の数字 (下の例では 17.8) でその年の年平均気温が出力されたことになっている。
2023 6.5 7.6 12.7 15.9 19.8 23.1 28.0 28.9 27.3 19.4 14.8 9.3 17.8
「平均」の意味をグラフから理解してみよう
前回も少し使ってみたグラフ化ツール Gnuplot を使って、計算で求まった「平均」の意味をグラフで確認してみよう。 まずは端末で以下のように入力してみよう ($ は端末のコマンドプロンプト)。
$ gnuplotすると Gnuplot の入力画面に入る。 そこで (gnuplot>は Gnuplot のプロンプト)
gnuplot> plot "< tail -n 1 matsuyama-kion.txt | awk '{for (i=2;i<14;i++) print i-1,$i}'" with linespointと入力する (コピペ可) すると、去年の月平均気温 (正確には「matsuyama-kion.txt の最後の行のデータ」) から折れ線グラフを描くことができる。 さらに
gnuplot> plot "< tail -n 1 matsuyama-kion.txt | awk '{for (i=2;i<14;i++) print i-1,$i}'" with linespoint,17.8と入力する (こちらもコピペ可) すると、去年の月平均気温のグラフに、それらの平均値が重ねて表示される。 各月の気温を表す折れ線グラフと、その平均値を表す直線の位置関係に注目することで、平均値のもつ意味を確認せよ。
ちなみにこのグラフ化の操作では、ちょっとした Gnuplot の裏技だったり、awk という別のプログラミング言語を、実にさりげなく (断りもなしに) 使っていたりする。 そのうち awk について知りたくなった人は http://www.ie.u-ryukyu.ac.jp/~e085739/awk.html なんかを見てみるといいかも。
方法その2: いろいろと融通のきくやり方
「方法その1」で使ったやり方では、扱うデータの数がものすごく増えたときに面倒で仕方がない。 そこで「方法その2」では、データの数が増えてもプログラミングの手間が増えないやり方を示す。
その準備として、「各年の 1月から4月までの気温の平均 を求めて表示する」プログラムの例を示す。 もとの enshu01.f90 や enshu02a.f90 と比べて、どこがどう違っているかに注目せよ。
p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | b | |||||||||||||||||||||||||||||||||||||||||
i | m | p | l | i | c | i | t | n | o | n | e | ||||||||||||||||||||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | s | e | i | r | e | k | i | , | j | o | u | t | a | i | |||||||||||||||||||||||||||||||||
r | e | a | l | , | d | i | m | e | n | s | i | o | n | ( | 1 | 2 | ) | : | : | k | i | o | n | ||||||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | , | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | ||||||||||||||||||||
i | n | t | e | g | e | r | : | : | i | ||||||||||||||||||||||||||||||||||||||||||||||
d | o | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
r | e | a | d | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 5 | . | 1 | ) | ' | , | i | o | s | t | a | t | = | j | o | u | t | a | i | ) | s | e | i | r | e | k | i | , | k | i | o | n | |||||||||
i | f | ( | j | o | u | t | a | i | / | = | 0 | ) | e | x | i | t | |||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | = | 0 | . | 0 | ||||||||||||||||||||||||||||||||||||||
d | o | i | = | 1 | , | 4 | |||||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | = | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | + | k | i | o | n | ( | i | ) | |||||||||||||||||||
e | n | d | d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | = | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | / | 4 | . | 0 | ||||||||||||||||||||||
w | r | i | t | e | ( | * | , | ' | ( | i | 4 | , | 1 | 3 | f | 6 | . | 1 | ) | ' | ) | s | e | i | r | e | k | i | , | k | i | o | n | , | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | ||||||
e | n | d | d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||
e | n | d | p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | b |
- いくつかの「作業変数」を準備する。
平均気温を入れる「器」の他に、気温の「総和」を入れるための kion_nen_souwa という「器」も使うことを宣言する。 さらに (以下の作業で使う) 整数用の「器」i も宣言している。
- 1月から4月までの平均気温の 「総和」 を求める。
上記プログラムの10〜13行めにある手順は、「総和」を求めるための定石 である。 ものすごく大事な点なので、もう少し解説しておこう。
この部分が実行する内容を、do ループを使わずに書いてみるとこうなる。
k i o n _ n e n _ s o u w a = 0 . 0 k i o n _ n e n _ s o u w a = k i o n _ n e n _ s o u w a + k i o n ( 1 ) k i o n _ n e n _ s o u w a = k i o n _ n e n _ s o u w a + k i o n ( 2 ) k i o n _ n e n _ s o u w a = k i o n _ n e n _ s o u w a + k i o n ( 3 ) k i o n _ n e n _ s o u w a = k i o n _ n e n _ s o u w a + k i o n ( 4 ) Fortran の「=」が代入を表わしている ことと、プログラムが上から順に実行される ことを考えると、この手続きによって kion_nen_souwa という「器」の中に、1月から4月までの平均気温の値がどんどん足し込まれている ことが分かるだろう。
この kion_nen_souwa という「器」の使い方を理解するには、この部屋の中にいる人々の所持金の合計を調べる 場合を例にとって考えるのが (著しく「教育的配慮に欠けている」ことを別にすれば) 最も分かりやすいのではないかと思う。 具体的には- 「器」を1つ用意し、その中身を空っぽにしておく。 この時点での「器」の中に入っている額は0。
- 最初の人は自分の所持金全額を「器」の中に入れて、次の人に回す。 この時点での「器」の中には、最初の人の所持金の額だけ入っている。
- 2番目の人も自分の所持金全額を「器」の中に入れて、さらに次の人に回す。 この時点での「器」の中には、最初の人と2番目の人の所持金を合わせた額だけ入っている。
- 3番目の人も自分の所持金全額を「器」の中に入れて、さらにまた次の人に回す。 この時点での「器」の中には、最初の人から3番目の人までの所持金を合わせた額だけ入っている。
- 同じ手順を、部屋の中にいる人全員が行う。
「1月から4月までの平均気温を足し込んでください」と命令している4行は、kionの何番めの位置に入っている値を足すかの違い はあるものの、それ以外は やっていることは全く同じ であることも分かるだろう。 こうした「同じ処理の繰り返し」は、do ループ を用いてやると簡潔に書くことができる。 しかも、do ループを回すのに使っている変数 (「カウンタ変数」などと呼ばれる; 上の例では i) の 始点と終点の値を変えるだけで、ループが動く範囲を変える こともできる。
- 平均気温を計算して「器」に入れる
これを参考にして、各年の気温の平均 (要するに「1月から12月までの気温の平均」) を計算する命令がどう書けるかを考えよ。 そして、enshu01.f90 にその機能を追加したプログラムを作成せよ [みほん]。 またここでももちろん、自分の作ったプログラムが平均気温を正しく計算できているかを確認せよ。 さらに本日の演習の出席確認のため、このプログラムを 末尾のフォーム 経由で提出せよ。
方法その3: Fortran 90 の「組み込み関数」を使うやり方
上のプログラムのミソである 配列の「要素」の総和を求める手順は、 Fortran 90 の機能をもっとうまく使うと、もっと簡略な書き方が可能 である。 具体的には、配列 kion の「要素」12個の総和を求める手順は、以下の1行で OK。
k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | = | s | u | m | ( | k | i | o | n | ) |
これを参考にして、各年の気温の平均 (要するに「1月から12月までの気温の平均」) を計算する命令がどう書けるかを考えよ。 そして、enshu01.f90 にその機能を追加したプログラムを作成せよ [みほん]。 またここでももちろん、自分の作ったプログラムが平均気温を正しく計算できているかを確認せよ。
この sum は Fortran 90 で用意されている 組み込み関数 の1つであり、上の例では 「配列 kion の全ての要素の値の総和をとってください」 という意味になる。 こういうところからも、「配列」という ある意味をもったデータの集まり を考えることの大事さを感じてもらえるだろう。
Fortran 90 には他にも多くの「組み込み関数」が用意されている。 2年生後期の実験で出てきた「乱数を発生させる関数」 rand もその例の1つ。 他の例は ここ などを参照のこと。
なお sum のような、配列を直接操作できる組み込み関数は、古い規格の Fortran (Fortran 77 とか) ではそもそも用いることができなかった。 であるから、ものすごく歴史の古い Fortran プログラムでは、「方法その2」のような書き方が頻繁に使われている はずだ。 Fortran 90 の世界では、わざわざ「方法その2」を使う理由は必ずしもないのではあるが、こうした書き方があることを知っていて損はない (と思う) し、こうした書き方をするほうが便利なことも (場合によっては) ある。
余力のある人向け: 「重みつき平均」
より正確な「年平均気温」を求めるために、各月に含まれる日の数 (1月なら31日分、4月なら30日分とか) に応じた「重み」をつけた 「重みつき平均」 で計算してみよう。
プログラム例 (その1, その2) を参考にして、重みつき平均の考え方を用いて年平均気温を求めるプログラムを作ってみよ。 なおここでは簡単のため、うるう年はない (要するに「2月は常に28日まで」で「1年は常に365日」) ものと仮定してある。 この方法で計算した年平均気温の値は、これまでのやり方で求めた年平均気温とどれくらい違っているか。
ただし実際に「重みつき平均」をプログラミングするには、「この月は何日あって....」という場合分けが結構面倒であり、エレガントな書き方をするのが (できなくはないけど) 難しい。 そのため、「方法その1」に基づいたプログラミングをするのが最もやりやすい (と思う)。
余力のある人向け: 各年の気温の分散と標準偏差を求める
次回から数回分をかけて「過去 134 年間の○月の気温の平均・分散・標準偏差を求める」ことを目標として演習を行っていくことにしている。 ここではその準備として 「各年の気温の分散・標準偏差」を求めるプログラムを作ってみよう。
1限の授業で示した通り、分散や標準偏差をプログラミングで求めるには、 「平均」に加えて「2乗の平均」も求めておく 必要があった。 ということで具体的には、これまでに作った「平均」を求めるプログラムに「2乗の平均」を求める機能をまず追加し、その後に分散や標準偏差を求める機能をさらに付け加えてやればよいことになる。
余力のある人は下のプログラム例を参考にして、各年の気温の平均を求めるプログラムに、分散・標準偏差を全て計算する機能を追加したプログラムを作ってみよ。 このプログラム例は、「方法その2」に基づいた方法で、各年の気温の平均に加えて分散・標準偏差も計算して表示するものである。 以下これまでと同様に、薄い文字で書いてある行は、新たに書き足す必要のない 行であることを示す。
このプログラムのミソは、
- いくつかの「作業変数」を準備する。
新たに計算する分散や標準偏差をとるのに必要な変数も追加で準備する。 ここでは分散を入れる kion_nen_bunsan、標準偏差を入れる kion_nen_hensa だけでなく、「2乗の平均」をとるのに必要な kion2_nen_souwa と kion2_nen_heikin も準備する。
- 気温の「2乗の総和」を計算し、その後に「2乗の平均」を計算する。
i月の気温の2乗は kion(i)**2 と書くことができる。 ここで **2 は2乗を計算する命令である。 ここさえ突破できれば、その先はふつうの「平均」をとる手順と全く同じ。
- 気温の「平均」と「2乗の平均」を使って、気温の「分散」を計算し、その後に「標準偏差」を計算する。
1限の授業で示した2種類の「分散」の計算式のうち、「プログラミング用」の式を用いて分散を計算する。 分散が求まれば、標準偏差も簡単に求まるはずだ。 なお kion_nen_bunsan の平方根をとるには sqrt(kion_nen_bunsan) とすればよい。
- 最後に結果を表示する。
その年の気温の平均の次に、分散と標準偏差も書き出す。 ただし、新しく2つの実数を書き出すことにしたいので、もともと 13f6.1 だったところに ,2f6.2 という記述を追加することも忘れないように。 この部分の解説は省略させてもらいたいのだが、どうしても気になる人は ここ を参照するか、あるいは教員・TAに質問してください。
p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | e | |||||||||||||||||||||||||||||||||||||||||||||||||
i | m | p | l | i | c | i | t | n | o | n | e | ||||||||||||||||||||||||||||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | s | e | i | r | e | k | i | , | j | o | u | t | a | i | |||||||||||||||||||||||||||||||||||||||||
r | e | a | l | , | d | i | m | e | n | s | i | o | n | ( | 1 | 2 | ) | : | : | k | i | o | n | ||||||||||||||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | , | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | ||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | _ | n | e | n | _ | b | u | n | s | a | n | , | k | i | o | n | _ | n | e | n | _ | h | e | n | s | a | ||||||||||||||||||||||||||||
r | e | a | l | : | : | k | i | o | n | 2 | _ | n | e | n | _ | s | o | u | w | a | , | k | i | o | n | 2 | _ | n | e | n | _ | h | e | i | k | i | n | ||||||||||||||||||||||||||
i | n | t | e | g | e | r | : | : | i | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
d | o | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
r | e | a | d | ( | * | , | ' | ( | i | 4 | , | 1 | 2 | f | 5 | . | 1 | ) | ' | , | i | o | s | t | a | t | = | j | o | u | t | a | i | ) | s | e | i | r | e | k | i | , | k | i | o | n | |||||||||||||||||
i | f | ( | j | o | u | t | a | i | / | = | 0 | ) | e | x | i | t | |||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | = | 0 | . | 0 | ||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | 2 | _ | n | e | n | _ | s | o | u | w | a | = | 0 | . | 0 | |||||||||||||||||||||||||||||||||||||||||||||
d | o | i | = | 1 | , | 1 | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | = | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | + | k | i | o | n | ( | i | ) | |||||||||||||||||||||||||||
k | i | o | n | 2 | _ | n | e | n | _ | s | o | u | w | a | = | k | i | o | n | 2 | _ | n | e | n | _ | s | o | u | w | a | + | k | i | o | n | ( | i | ) | * | * | 2 | ||||||||||||||||||||||
e | n | d | d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | = | k | i | o | n | _ | n | e | n | _ | s | o | u | w | a | / | 1 | 2 | . | 0 | |||||||||||||||||||||||||||||
k | i | o | n | 2 | _ | n | e | n | _ | h | e | i | k | i | n | = | k | i | o | n | 2 | _ | n | e | n | _ | s | o | u | w | a | / | 1 | 2 | . | 0 | |||||||||||||||||||||||||||
k | i | o | n | _ | n | e | n | _ | b | u | n | s | a | n | = | k | i | o | n | 2 | _ | n | e | n | _ | h | e | i | k | i | n | - | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | * | * | 2 | |||||||||||||
k | i | o | n | _ | n | e | n | _ | h | e | n | s | a | = | s | q | r | t | ( | k | i | o | n | _ | n | e | n | _ | b | u | n | s | a | n | ) | ||||||||||||||||||||||||||||
w | r | i | t | e | ( | * | , | ' | ( | i | 4 | , | 1 | 3 | f | 6 | . | 1 | , | 2 | f | 6 | . | 2 | ) | ' | ) | s | e | i | r | e | k | i | , | k | i | o | n | , | k | i | o | n | _ | n | e | n | _ | h | e | i | k | i | n | & | |||||||
, | k | i | o | n | _ | n | e | n | _ | b | u | n | s | a | n | , | k | i | o | n | _ | n | e | n | _ | h | e | n | s | a | |||||||||||||||||||||||||||||||||
e | n | d | d | o | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e | n | d | p | r | o | g | r | a | m | e | n | s | h | u | 0 | 2 | e |
正しく計算できていれば、プログラムの出力 (の最後の1行) は以下のようになるはずである。
2023 6.5 7.6 12.7 15.9 19.8 23.1 28.0 28.9 27.3 19.4 14.8 9.3 17.8 57.90 7.61 ↑ ↑ ↑ 西暦 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 平均 分散 標準偏差また再び gnuplot を起動し、(gnuplot>は Gnuplot のプロンプト)
gnuplot> plot "< tail -n 1 matsuyama-kion.txt | awk '{for (i=2;i<14;i++) print i-1,$i}'" with points,17.8,17.8+7.61,17.8-7.61として表示されるグラフに基づいて、平均や標準偏差の意味を確認してみよ。
出席確認用プログラム提出フォーム
Moodle のコースページ 以下の 課題ファイル提出 により、各自で作成した (enshu02b.f90 に相当する) 各年の気温の平均を計算する Fortran 90 プログラムの最終版を提出せよ。