青山学院大学

後期試験 ・ 2011 年 1 月 24 日 3 時限実施 ・ ページ

授業
科目
プログラミング基礎 II 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

用語の説明 (14 点)

次の Ruby 関連の英語の用語に相当する日本語の用語を書いて、簡単に説明しなさい。

exponentiation
冪乗演算; 「何の何乗」の計算, Ruby では演算子 ** で書く。
element
要素; 配列のそれぞれの項目。
associative array
連想配列; 配列みたいに番地ではなく、例えば文字列でもデータが整理できる仕組み。
scope
[変数の] 範囲; 変数が使える範囲、例えば関数やメソッド
class
クラス; データの種類みたいなもので、クラスによって使えるメソッドが決まる
assignment
代入; 変数に値を設定すること
domain specific language
ドメイン特化言語; ある分野に特化したプログラム言語みたいなもの

ファイル形式の定義 (15 点)

重量挙げ部から、Ruby でのデータ処理をたのまれた。必要なデータ (部員ごとに名、その読み、学部、学科、学年、住所、郵便番号、電話番号 (自宅・下宿と携帯)、自己ベスト) は部のマネージャーが提供する。データを提供するファイル形式全体や各項目について、処理しやすくするための要点を五つ細かく書きなさい。

ファイルは部員一人に一行使うようにする。空行などは無し。

各行のデータ項目は順番通り、半角コンマで区切る。項目がない時は ,, にする。

データは前もって決めた文字コードにする (例: UTF-8 又は Shift_JIS・Windows-31J)

読みはひらがなで、姓と名の間に半角スペース一つ。

数字は全部半角で、自己ベストは kg で記述だが、単位を書かないようにする。

正規表現 (15 点)

下記の表の正規表現がその同じ行の三つの文字列にマッチする場合は ○、マッチしない場合は × をその右の ○× 欄に記入しなさい。

番号 正規表現 文字列 1 ○× 1 文字列 2 ○× 2 文字列 3 ○× 3
  /^abc/ "abc" "abababc" × "abcdefg"
  /aaa?/ "cbabc" × "aaaaaaaa" "cbaacb"
  /[abc][ABC]/ "aCdC" "Ab Ab" × "aaaDDD" ×
  /[0-9]+\.[0-9]+/ ".253" × "000.769" "abc 3.2 def"
  /ad|bc/ "bcde" "badc" "abdc" ×

後期試験 ・ 2011 年 1 月 24 日 3 時限実施 ・ ページ

Ruby の式の結果 (48 点)

次の Ruby の式の結果を IRB のように記述しなさい。次の変数が問題中に使われている:

s = "Hello"
a = [7, 4, 1, 6, 2, 3, 5]
例: 3 + 5
8
5 * 3+2 * 2
19
"あおやま".length
4
2 ** 5
32
a.sort
[1, 2, 3, 4, 5, 6, 7]
s + "Ruby!"
"HelloRuby!"
"Ruby" * 3
"RubyRubyRuby"
27 / 4
6
a[3]
6
2 ** 2 ** 2
16
"Hello Ruby World!".split(" ")
["Hello", "Ruby", "World!"]
a.join
"7416235"
(s+" Students").reverse
"stnedutS olleH"
s.center(15, "12345")
"12345Hello12345"
s.squeeze("lxo")
"Helo"
"abc def ghi".split(" ").join(".").reverse
"ihg.fed.cba"
"abc def ghi".split(" ").reverse.join(".")
"ghi.def.abc"
"abc def ghi".split(" ").collect do |s| s.reverse end.join(".")
"cba.fed.ihg"
a.length
7
nil.Class
NilClass
(3..5).map do |n| n.to_s * (n-2) end.join("X")
3X44X555
a.collect do |n| if n>3; 5 else 0 end end # ; は改行の代わり
[5, 5, 0, 5, 0, 0, 5]
"ababcdabcde".gsub(/abc/, "zyz")
"abzyzdzyzde"
a.sort_by do |n| -n end
[7, 6, 5, 4, 3, 2, 1]
a.group_by do |n| n%3 end
{1=>[7, 4, 1], 0=>[6, 3], 2=>[2, 5]}

青山学院大学

後期試験 ・ 2011 年 1 月 24 日 3 時限実施 ・ ページ

授業
科目
プログラミング基礎 II 学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.

プログラムの変更 (合計 16 点)

list = [1, 3, 4, 7, 9, 15]
here = 0
while here < list.length
  puts list[here] ** 2
  here = here + 1
end

次のプログラムで while を Ruby の特長のイテレータに書き換えなさい。(8 点)

list = [1, 3, 4, 7, 9, 15]
list.each do |this|
  puts this ** 2
end

両方の書き方を比較し、自分の好みとその理由を書きなさい。(8 点)

後方のイテレータが好き。なぜかというと、まずは while
を使ったものより短い。これは書きやすいだけではなく、読みやすいこともある。
リストの長さとか、現在何番なのか、番号を毎回ひとつ増やす、
など手間が少ない。do ブロックの外と中は完全に分かれている。

プログラム開発方針 (10 点)

授業で説明したプログラム開発方針の一つを選んで、明記し、Ruby で使える機能を含め細かく説明しなさい。

トップダウン開発を選びました。トップダウン開発はプログラム全体をまず考え、
大まかな構造から少しずつ詳細に進む開発方針です。例えばまずプログラム全体を
入力、計算、出力に分け、そこから入力の詳細、... と進む。Ruby で特に使える機能:
コメントでまだわからない部分を表す; 関数やメソッドに詳細を任せる;
関数を擬似的に実装する (例えば BMI は常に 21 とか) がある。

エラーの指摘 (8 点)

次のプログラムはそれぞれエラーとなる。その原因と対処法を説明しなさい。

"abc" + 5

文字列と数は足し算できない。5.to_s で数を文字列に変換しないといけない。

class person; end # ; は改行の代わり

クラス名は大文字でないといけない。personPerson にしたら大丈夫。

授業についての意見 (5 点)

授業についての意見を書来なさい (内容にかかわらず何か書いたら 5 点)。