平成17年度 情報表現 試験問題

試験日時:平成18年1月25日(水)
出題者:神田・西村・広瀬
持ち込み:参考書、ノート、電卓可、PC 不可。 携帯電話鳴動は即退場。

解答は解答用紙の所定の欄に書くこと。問題用紙は持ち帰ってよし。

第1問

以下の空欄を埋めよ

0b0d0x
[ア][イ]121
1111111[ウ][エ]
[オ]2006[カ]

第2問

アルファベットの a を 1 つずらすと b になる。 a を 4 つずらすと e になる。z を 1 つずらすときは1周して aに戻ると考え a とする。これにより z を 4 つずらすと d になる。

元の英文のアルファベットすべてを 13 個ずらしたものは、もう一回 13 個ずら すと元の文に戻ることから、簡単な暗号として利用される。 以下のプログラム caesar.rb は、英小文字の文章を読み込み、 アルファベットを 13 個分ずらした文字列を出力する。

#!/usr/koeki/bin/ruby

s = gets.chomp!

[ (A) ]
while i < s.length
  char = s[i] + [ (B) ]
  if char > ?z
    char -= [ (C) ]
  end
  printf("[ (D) ]", char)
  [ (E) ]
end
print "\n"
  1. プログラムを起動し koeki という文字列を与えたときの 出力結果を示せ。

  2. 空欄を埋めてプログラムを完成させよ。

    なお、?x とすると x の文字コードが求められる。

第3問

以下のプログラムの実行結果を示せ。

#!/usr/koeki/bin/ruby

a=b=2
sum=a
printf("%d",a)
a=a+b

a.step(10,b) do |i|
   printf ("+%d", i)
   sum += i
end

printf ("=%d\n", sum)

第4問

以下のプログラムをみて、各問に答えよ。

#!/usr/koeki/bin/ruby

def f(x)
  b = -2
  x**2 + b
end

STDERR.print("この [ア] では、与えられた数を [イ] し、[ウ] ます。")

STDERR.print("好きな数を入力して下さい。")

z = gets.chomp.to_i

printf("答えは %s です \n", [エ])
  1. このプログラムで z = 1 を入力した場合、 最後に返される値は何か。

  2. 次の語彙から選び、[ア]〜[エ] を埋めよ。

    a.文法 b.メソッド c.アルゴリズム d.標準入力 e.1倍 f.2倍 g.1乗 h.2乗 i.1を加える j.2を加える k.-1を引く l.-2 を加える m.f(z) n.f(x) o.f(a) p.f(b)

第5問

以下は list.txt を読み込んで処理を行うプログラムである。

  1. このプログラムは1箇所間違いがあり、実行してもエラーになる。 どこをどのように修正すればよいか示せ。

  2. このプログラムでは telnum という2つの配列を使用している。 これを number というハッシュを使って書き直せ。

 電話の故障 113
 警察 110
 天気予報 177
 時報 117
 番号案内 104
 災害伝言ダイヤル 171
#!/usr/koeki/bin/ruby

tel=[]
num=[]
i=0
open ("list.txt","r") do |call|
  while line = call.gets 
    if /(\S+)\s+(\d+)/ =~ line
      tel[i] = $1
      num[i] = $2
              i += 1
        end
  end
end

j=0
print "3桁番号サービス一覧\n"
while j <= tel.length
        printf ("%-20s%d\n",tel[j],num[j])
        j += 1
end

第6問

掛算だけで √2 の近似値を求めたい。以下のプログラム root2.rb は、√2 が 1 より大きく 2 より小さいことを 既知の情報として、その区間で解を探すものである。解のある下限を left、 上限を right 変数とし、その中間値 x = (left+right)/2を仮の解として以下の処理を繰り返し行なう。

(a)  x2 と 2 の差を 2 乗したものが 0.0000001 より小さかったら
     x を解とする(繰り返しを抜ける)。

(b) (a)でなくなおかつ x2 が2より大きければ解の存在する
    上限をそのときの x の値に変更して処理の最初に戻る。

(c) (a)でも(b)でもないときは解の存在する下限をそのときの x
    の値に変更して処理の最初に戻る。
#!/usr/local/bin/ruby

left=1.0
right=2.0

while true
  x = [ (A) ]
  if (x*x - 2)[ (B) ]2 < 0.0000001
    [ (C) ]
  elsif x*x > 2
    [ (D) ]
  else
    [ (E) ]
  end
end

printf("√2の近似値は%5.3fです\n", x)
  1. プログラムの空欄 (A)〜(E) を埋めよ。

  2. printf 文の引数にある 5.3f はどういう働きか説明せよ。

  3. プログラムを実際に動かしたときの x の最終的な値は1.414551となる。これをふまえて、 プログラムにより出力される結果を正確に記述せよ。

以上