授業資料/03 の変更点


#contents

* プログラミング入門 I [#vee86a9f]

まずは「本当に最小限の」テクニカルな知識を知ろう.
例えば,英語を学ぶにあたってアルファベットを知らないと始まらないように,プログラミングにも最低限必要な知識があるのだ.

* 変数と代入 [#cf8bf51b]

** 変数 [#t0ab8384]
数式で良く使う「変数」という概念はプログラムでも使えて,しかも大活躍だ.
例えば,先の平均を求めるプログラムは,(''説明のために,行に番号をつけて表示している'')
#highlighter(language=ruby,number=on,cache=on){{
include Math

a = [1.2, -3.0, 3.3, 4.1, 0.9]

sum = 0.0
for i in 1..a.size do
  sum += a[i-1]
  end

average = sum / a.size

p average
}}
だったが,この中の

3行目:  a 
5行目: sum
6行目: i
10行目: average

が''変数''である.

&ref(./warning.png); Ruby では変数の名前を大文字で始めると特殊な扱い(定数. 変更不可能)になる. これは初学者には間違いのもととなるので,
CENTER:&size(24){''変数の名前は小文字で始めるべし.''};

&br;
** 代入 [#tb7a78b9]
まず,ぱっと書くと,コンピュータ業界(の半分以上)では,
CENTER:&size(24){''a = b は等式ではなく,a に b の中身を代入する命令である.''};

&ref(./warning.png); 間違えやすいので注意しよう. ちなみにこの悪習? は歴史的経緯によるものである…
&br;
上のプログラム例だと

(3行目) a = ...
(5行目) sum = ...
(7行目) sum += ... &color(blue){← 「右辺を足して代入する」特殊な代入};
(10行目) average = ...

が''代入''に該当する.

* 四則演算や他の簡単な演算 [#m45794d1]

簡単な計算については,ほぼ数学の通りに使えるが,記号には慣れておく必要があるだろう. 以下,簡単に説明しよう.

その前に…
&ref(./warning.png); 数学計算,定数などのいくつかは,Ruby はそのままでは行えないので,
CENTER:&size(24){''プログラムの最初に include Math という行をいつも入れておこう. ''};

これは,「数学計算をするプログラムを読み込め」という意味と思えばよい.
&br;
''演算 簡易表''
| 演算 | 説明 | 例 |h
| 足し算 | + を使う | 3.0 + 5.0 (= 8.0) |
| 引き算 | - を使う | 3.0 - 5.0 (= -2.0) |
| かけ算 | * を使う | 3.0 * 5.0 (= 15.0) |
| 割り算 | / を使う | 3.0 / 5.0 (= 0.6) &color(blue){← 実数を書くと実数として計算される}; |
|~|~| 3 / 5 (= 0) &color(blue){← 整数を書くと整数として計算される}; |
| 余り | % を使う | 5 % 3 (= 2) |
| べき乗 | ** を使う | 2**3 (= 8) |
| 絶対値 | .abs をつける |  (-2).abs (= 2) |
| 四捨五入 | .round をつける | (1.6).round (= 2) |
| 切り上げ | .ceil をつける | (1.6).ceil (= 2) |
| 切り下げ | .floor をつける | (1.6).floor (= 1) |
| 対数 | log 関数を使う | log(10.0) (= 2.3025...) &color(blue){自然対数}; |
|~| log10 関数を使う | log10(10.0) (= 1.0) &color(blue){10が底の対数}; |
| 指数 | exp 関数を使う | exp(1.0) (= 2.71828...)  |
| 平方根 | sqrt 関数を使う | sqrt(2.0) (= 1.41421...) |
| 三角関数 | sin関数, cos関数, tan関数... | sin(1.0) (= 0.84147...) |
| 逆三角関数 | 三角関数の名前の最初に ''a'' をつける | acos(0.54) (= 1.000...) |
| 乱数 | rand とする | rand (= ?) &color(blue){0以上1未満の実数乱数が得られる}; |
||||
| 等価か? | == を使う | &color(blue){条件を調べるときなどに使う. 後述.}; |
| 不等号が成り立つか? | >, <, >=, <= を使う |~|
| 不一致か? | != を使う |~|
| 条件A かつ 条件B | &amp;&amp; でつなげる | (条件A) &amp;&amp; (条件B) |
| 条件A もしくは 条件B | &brvbar;&brvbar; (縦棒2つ)でつなげる | (条件A) &brvbar;&brvbar; (条件B) |
| 条件A の否定 | ! を頭につける | !(条件A) |


&br;
''定数 簡易表''
| 定数 | 説明 | 近似値 |
| ネイピア数(e) | E | 2.71828... |
| 円周率 | PI | 3.14159... |

* プログラムの「流れ」を制御しよう: 原則 [#hbf2a39a]

まず,プログラムの基本を学ぼう.
われわれが今 学ぶプログラムの大原則として,
CENTER:&size(24){''原則: プログラムは上から下へと実行される. ''};

というものがある.
ただ,これだけだと何かと不便なので,この「流れ」を変えるための方法が用意されている.
この方法について,以下,簡単なものを学ぼう.
&br;

* 決められた回数だけループ: 今何回目のループかがわかる ''for'' 命令 [#ud04a695]

一番簡単な,決められた回数だけループする,という制御を学ぼう.
これには何種類かの方法があるが,まずはループするとき ''今 何回目のループか'' がわかる''for'' 命令を学ぼう.

文法は大ざっぱには以下の通りである. 例えば 5 回ループする場合は
&br;
//''5回 ループする場合''
&size(24){''for'' &color(blue){i}; ''in'' &color(blue){1..5}; ''do''};
    &size(18){&color(blue){ここに書いた部分が 5 回実行される};};
    &size(18){&color(blue){この場合,変数 i に「今 何回目のループか」の数字が入っている};};
&size(24){''end''};
&br;
という感じだ.
青い字の部分が,自分で好きに変えられる部分であると思えばよい.

&ref(./notes.png); この ''for'' 命令を使って,1 から 100 まで順番に真面目に足していくプログラムを書いてみよう. ただし,途中までの足し算の結果も随時 画面に出すようにしてみよう.
&br;
この場合は,例えば次のようなプログラムになるだろう(説明のために,行に番号をつけて表示している). 自分で出来ただろうか.
#highlighter(language=ruby,number=on,cache=on){{
include Math

sum = 0
for i in 1..100 do
  sum += i
  p sum
  end
}}
&ref(./warning.png); 3行目の sum = 0 は,「合計が入っているはずの変数 sum を,計算前に念の為にいったんゼロにしておく」という動作だ.  プログラムが複雑になってくると,こういう「念の為」があるかないかでうまく動くかどうかが大きく変わってくるので気をつけよう.
&br;

* 条件によって,動作を変える ''if'' 命令 [#t0a66f11]

次に,''条件によって動作を変える'' ための ''if'' という命令を学ぼう.
これができると,だいぶプログラムらしいプログラムが(初心者ながら)書けるだろう.

まずおおざっぱに文法的なものを示すと次のようになる.
&br;
&size(24){''if (''&color(blue){条件};'') then''};
      &size(24){&color(blue){条件が満される場合,ここが実行される};};
    &size(24){''else''};
      &size(24){&color(blue){条件が満されない場合,ここが実行される};};
&size(24){''end''};
&br;
青い字の部分が,自分で好きに変えられる部分であると思えばよいのは上と同じである.
&br;
&ref(./notes.png); この ''if'' 命令を使って,適当な整数が偶数か奇数かを判断して出力するプログラムを書いてみよう.   ただし,その整数はプログラムの最初で適当に自分で決めてしまってよい.
&br;
この場合は,例えば次のようなプログラムになるだろう(説明のために,行に番号をつけて表示している). 自分で出来ただろうか.
#highlighter(language=ruby,number=on,cache=on){{
include Math

n = 5
p n

if (n % 2 == 0) then
    p "is even"
  else
    p "is odd"
end
}}
&ref(./warning.png); 6行目の ''=='' こそ,等価性(等式)を示す記号である. このように,数学と「記号の使い方」が異なることがあるので注意しよう.
&br;

* 今日の総仕上げ [#n937050c]

&ref(./notes.png); ''for'' 命令と ''if'' 命令を使って,適当な整数が素数かどうかを判断して出力するプログラムを書いてみよう.  ただし,その整数は 100 以上 300 以下ぐらいで,プログラムの最初で適当に自分で決めてしまってよい.
&br;

&ref(./warning.png); 少しややこしい問題だ. どうやったらできるか,少し考えないといけないだろう.
こういう時は,慣れていない人は
CENTER:&size(24){''紙にアルゴリズムをざっとデザインしてから取り掛かろう.''};

(慣れるまでは)結果的にその方が早く,かつ確実にプログラミングできることが分かるだろう.
&br;

&ref(./warning.png); プログラミングに慣れていない人は,かっこいいアルゴリズムにしようと考えない方がよいだろう. 対象数が大きいわけではないので,素数の定義に基づいてただひたすらにチェックをさせればよい…
&br;

&ref(./warning.png); 「今のところ素数と思われるかどうか」という判断値を変数に入れておく,などの工夫をするとよいだろう. 例えば,''isPrime'' という変数を作って,最初は ''yes'' を代入しておく. そして,ある数で割り切れたら ''no'' を代入する. そうすれば…
&br;


* レポート [#aba6b711]

本日受けた講義および行った実習について,簡単にまとめた報告をせよ.
また,総仕上げの部分で自分で書いたプログラムを報告せよ.

もちろん各自の

+ 所属(学部,学科)
+ 学籍番号
+ 学年
+ 氏名
+ 日時
+ 肝心のレポート内容(得た知見,作業について気づいたこと等も)

を書くのを忘れないように. 

* about Icons, ClipArts [#z41e2295]
Some icons in this page are downloadable at [[ICONFINDER:http://www.iconfinder.net/]].

The "note" icon &ref(./notes.png); designed by [[Marco Martin:http://www.notmart.org/]] is distributed with the LGPL licence,
the "warning" icon &ref(./warning.png); designed by [[Alexandre Moore:http://nuovext.pwsp.net/]] with the GPL licence
and the "triangle" icon &ref(JNorth_arrow-right-sm.png); designed by [[Joseph North:http://sweetie.sublink.ca/]] is distributed with the [[Creative Commons (Attribution-Noncommercial-Share Alike 3.0 Unported):http://creativecommons.org/licenses/by-nc-sa/3.0/]] licence.

Some clip arts used in this page are downloadable at [[Open Clip Art Library:http://www.openclipart.org/]].
We deeply appreciate their superb works. With licence, they describe that "the actual clipart content on open clipart library is Public domain" in the web.

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭をブランクで始める」.
// コマンドライン出力は「行頭を > で始める」.

// 実習アイコン
// &ref(./notes.png); 

// 注意アイコン
// &ref(./warning.png);

// Link アイコン
// &ref(JNorth_arrow-right-sm.png);