青山学院大学

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

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

変数名 (14 点)

下記の閏年 (leap year) のための変数名 (1.1~1.6) はそれぞれ問題点を持っている。問題点を指摘し、その理由を説明しなさい。最後に (1.7で) 改善案を示しなさい。

uruudoshi: ローマ字の日本語、外国人が分からない。

ly: 短すぎ、意味が分からない。

leapYear: 変数名の部分の区切りは大文字のではなく、"_" が習慣

Leap_year: 変数名は大文字ではなく、小文字から始まらないといけない。

leap_year?: 変数名には ? などの記号は使用不可能

leapyear: 複数の言葉からなる変数名を分けないで書くのがわかりにくい。

改善案: leap_year

Ruby についての豆知識 (10 点)

下記の発言の後、正しければ ○、間違いであれば × を書きなさい。

例: Ruby はプログラム言語である: ○
Ruby は2005年で十歳になった: ×
Ruby の創作者の英語でのあだ名は Matz である:
イテレータを使うから Ruby に while がない: ×
Ruby が内部ドメイン特化言語に非常に向いている:
文字列とハッシュはクラスのインスタンスであるが、配列はそうではない: ×
irb では Ruby を一行ずつ試してみることが可能:
Ruby でメタプログラミングも可能なので、「奥が深い」と言われている:
Ruby on Rails では初心者が非常に簡単にウェブアプリを作れる: ×
Google の製品の中でも Ruby が使われているものがある:
授業で使った Ruby のバージョンは 2.0 であった: ×

用語の説明 (15 点)

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

regular expression
正規表現; 文字列 (の一部) をマッチできるパターン、文字処理に非常に便利
instance variable
インスタンス変数; クラスのインスタンスが持っているデータの場所
initialization
初期化; クラスのインスタンスを作るときに、インスタンス変数を整えるなどの作業
Range
範囲; Ruby のクラスで、例えば 1..5 は1から5までの範囲を表している
operator
演算子; +-*/ など演算ができる記号

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

Ruby の式の結果 (48 点)

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

s = "Aoyama"
a = [3, 2, 20, 7, 9, 3]
例: 3 + 5
8
  20-4 * 3
8
  s.length
6
  5 ** 3
125
  14 / 5
4
  2 ** 2 ** 3
256
  s + 'Gakuin'
"AoyamaGakuin"
  s * 2 + 'Gakuin'
"AoyamaAoyamaGakuin"
  a[2]
20
  s[4]
"m"
  a.sort
[2, 3, 3, 7, 9, 20]
  "Aoyama Gakuin".split("a")
["Aoy", "m", " G", "kuin"]
  a.join(':')
"3:2:20:7:9:3"
  s.reverse.upcase
"AMAYOA"
  s.rjust(11, "xX")
"xXxXxAoyama"
  s.delete("axyz")
"Aom"
  "abc mno xyz".split(" ").reverse.join(".")
"xyz.mno.abc"
  a.collect do |e| e * 3 end
[9, 6, 60, 21, 27, 9]
  a.class.name
"Array"
  500500500500500.class.name
"Bignum"
  a.select { |e| e > 10 or e < 5 }
[3, 2, 20, 3]
  "Aoyaoyuoyo".gsub(/oy[ao]/, "ex")
"Aexoyuex"
  { 'a' => 23, 'b' => 44, 12 => 'fg' }.values
[23, 44, 'fg']
  a.sort_by do |n| 5-n end
[20, 9, 7, 3, 3, 2]
  a.group_by do |n| n>5 end
{ false => [20, 7, 9], true => [3, 2, 3] }

青山学院大学

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

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

エラーの指摘 (10 点)

次のプログラムに 10 個の間違いがある。それぞれの間違いは一文字の除去、追加、もしくは変更で修正しなさい。分かりやすいように直接プログラムの中に書き込みなさい。説明する必要はない。

class sStudent
  attr_reader :name, :age, :department, :hobby
  dehf initialize (line)
    @name, @age, @department, @hobby = line.split('", ")
    @age == age:.to_i
  end
emnd

プログラムの説明 (24 点)

下記のプログラムの行 (1) から行 (8) までに、その行で行われる操作を説明しなさい。(このプログラムは直前の問で定義されたクラスを修正後で利用する。)

lines = readlines                                                           # (1)
students = lines.collect { |line| Student.new(line) }                       # (2)
adults = students.select { |student| student.age >= 20 }                    # (3)
adults.each { |student| puts student.name }                                 # (4)
department_groups = students.group_by { |student| student.department }      # (5)
department_groups.keys.each do |department|                                 # (6)
  department_students = department_groups[department]                       # (例)
  sum = department_students.inject(0) { |sum, student| sum + student.age }  # (7)
  puts "#{department}: #{sum / department_students.length }"                # (8)
end

例: 学科ごとのハッシュからある一つの学科の学生の配列を取り出し、変数 department_students に代入

: 入力ファイルを readlines 関数で行ごとに文字列の配列にして、lines 変数に代入

: 配列 lines を collect でクラス Student の学生の配列に置き換えて students 変数に代入

: 学生全員の配列から年齢が 20才以上の成人の学生を選んで、変数 adults に代入

: adults 配列にある成人の学生全ての名前をそれぞれ別の行で出力

: 学生を group_by で学科ごとにグループ分けして、ハッシュ department_groups に代入

: ハッシュ department_groups のキーである学科ごとに do...end の間の処理を実行

: 一つの学科の学生の年齢の合計を inject で計算

: 学科 (の名前) と学生の年齢の合計と学生の数の割算で計算した年齢の平均を出力

授業改善のための意見 (5 点)

授業について、改善のつながりそうな意見を書きなさい (内容にかかわらず何か書いたら 5 点)。