(7)06/01の授業内容
- 配列とは
- Subjectは「学籍番号-kadai5」とすること
- 本文の1行目ではまず名乗ること
- 2行目以降は下記の構成で記載すること
- 作成したプログラム(メール本文に貼り付ける)
- プログラムの各部の説明
- プログラムの実行結果
- 感想
- emacsで新しいファイルを作成する場合は,C-x C-fを押し,ミニバッファにkensaku/kadai2.rbのようにファイル名を入力する
- ファイルの保存はC-x C-s
- 日本語入力のオンオフの切り替えはC-o
- emacsを起動する
- Escとxを押し,mewと入力しReturn(Escとxを押すことを,一般にM-xと表記します)%<--これでMewが起動します
- Mewを起動するとパスワードがたずねられるので入力しReturn
- 新着メールの確認およびパスワードを間違えた場合はiと入力しReturn
- メールを読む場合は,カーソルキー(矢印キー)で読みたいメールを選びReturn
- メールの新規作成はwと入力
- e-mailの本文にテキストファイルを読み込むには,新規送信メール画面の本文を記入するエリアにカーソルを移動し,Ctrl+x,iとすると,ミニバッファにInsert file: ~/と表示されるので,読み込みたいファイル名を入力する。
- プログラムの実行結果の貼り付けは,kterm上の出力結果部分をマウスで選択し,Mewの本文の貼り付け位置にカーソルを移動し,マウスの真ん中ボタンをクリックする
- メールの送信はC-c C-cと入力するか,もしくはメニューのsendアイコンをクリックする
- Mewを終了するにはqと入力
- emacsを終了する
前回課題として実施した二進数の計算では,入力された値を2で割り続け,余りをを足していく必要があった.計算を行ううえでは下記のように,2で割った余りをamariという変数に代入し,さらに文字列に変換した上でnishinという変数に代入を行った.このような紛らわしい方法をとらざるをえなかったのは,amariという変数には1つの値しか代入することができないためであった
while item > 1 amari=item%2 item/=2 nishin=amari.to_s+nishin.to_s end
これに対して,ひとつの変数を拡張して,複数の値を入れられるようにしたものが配列である.
amari = 1:これまでの変数
amari = [1, 0, 0, 0, 1, 0]:配列
上記は要素数が6個の配列である.配列に値を格納する場合や,配列に格納された値を表示する場合には,位置を表す番号インデックスを使用する.この際にインデックスは0から始まることに注意する
a = [10, 20, 30, 40, 50, 60] print a[0]"\n" #=>10 print a[1]"\n" #=>20 print a[2]"\n" #=>30
配列に含まれる要素数を増やしたり,配列に含まれる値を変更することもできる
a = [10, 20, 30, 40, 50, 60] print a[6]"\n" #=>nil a[6] = 70 #配列全体は[10, 20, 30, 40, 50, 60, 70] print a[6]"\n" #=>70 a[4] = 90 #配列全体は[10, 20, 30, 40, 90, 60, 70] print a[4]"\n" #=>90
配列に含めることのできる要素は数字だけではない.文字を含めることも可能であるし,文字と数字を混在させることもできる
name = ["伊藤", "木村", "山田", "鈴木", "川島"] mixed = ["Hello", 34, "Windows", "Green", 125]
配列に含まれる要素の数が決まっていない場合にはa=[]というように[]だけ書くと,空の配列ができる.プログラムの冒頭で特定の変数を配列として使用したい場合などに行う
配列を用いると,前回の2進数を求めるプログラムは下記のように書くこともできる
#!/usr/koeki/bin/ruby amari = [] i = 0 STDERR.print "好きな数字を入力してください:" item = gets.chomp!.to_i while true amari[i] = item%2 item /= 2 if item == 1 then break end i += 1 end amari[i+1] = item print amari.reverse,"\n"
配列に要素を付け加えるメソッド
unshift:配列の先頭に新しい要素を付け加える
push:配列の末尾に新しい要素を付け加える
a = [10, 20, 30] a.unshift(100) #配列全体は[100,10, 20, 30] print a[0]"\n" #=>100 a.push(55) #配列全体は[100,10, 20, 30, 55] print a[4]"\n" #=>55
配列から要素を取り除くメソッド
shift:配列の先頭の要素を取り除く
pop:配列の末尾の要素を取り除く
a = [10, 20, 30, 40] a.shift #配列全体は[20, 30, 40] print a[0]"\n" #=>20 a.pop #配列全体は[20, 30] print a[1]"\n" #=>30
delete(x):配列から要素xを取り除く
delete_at(n):配列からn番目の要素を取り除く
a = [10, 20, 30, 20,40] a.delete(20) #配列全体は[10,30,40] a.delete_at(2) #配列全体は[10,30]
配列の並び替えを行うメソッド
sort(もしくはsort!):配列の要素を小さい順に並べた結果を返す.sortは並び替えをした結果を表示するのみで実際の配列の順番に変更は行われない.sort!は配列の順番そのものを変更する
reverse(もしくはreverse!):配列の要素を反対順に並び替える.reverseは反対順に並べ替えをした結果を表示するのみで実際の配列の順番に変更は行われない.reverse!は逆順が新しい配列の順番になるように変更する
a = [5,2,7,9,1] print a,"\n" #=>52791 print a.sort,"\n" #=>12579 print a,"\n" #=>52791 print a.sort!,"\n" #=>12579 print a,"\n" #=>12579 print a.sort.reverse,"\n" #=>97521
配列の大きさを調べるメソッド
length:配列の長さを返す
size:lengthと同じ
a = [5,2,7,9,1]
print a.length #=>5
課題
前々回に例題として示した,レジスターを模擬したregister.rbは,個々の商品の金額を入力すると,最後に合計金額を示すものであった.このプログラムを配列を用いて改良し,最後に合計金額のみでなく,個々の商品の単価も表示できるようにせよ.具体的にはレシートを想定すればよい.なお商品名は全て「シナモノ」と示すことにする
作成したプログラムや実行結果をメールでnaoya@e.koeki-u.ac.jp宛に送る.
課題の提出期限は6月4日(土)17:00までです
メール送信時の注意
今回は既存のプログラムの改良であり,変更箇所も少ない.またプログラムの説明も多くはこれまでに行ってきたものの繰り返しになると考えられる.それゆえ,評価を行う上では,金額の入力やレシートの表示方法などを含めたインタフェース部を重視する(もちろんプログラムの説明がひどければ減点対象となるが).