情報科学概論(1年生 & 再履修生)
追試験問題

2005.02.14

Back to index page for freshmen

Back to index page for 2nd course



期末試験に関する注意事項をよく読んでおくこと!

解答用紙


  1. 次のスクリプトの for ループを全て while ループに変更せよ. (25点)

       難易度 ★

    for i in 10..13
      for j in i..13
        for k in 1..j
          printf "%3d", i + j + k
        end
    
        printf "\n"
      end
    
      printf "\n"
    end
    

    解答例
    i = 10
    
    while i <= 13
      j = i
    
      while j <= 13
        k = 1
    
        while k <= j
          printf "%3d", i + j + k
          k += 1
        end
    
        printf "\n"
        j += 1
      end
    
      printf "\n"
      i += 1
    end
    

  2. 乱数により6桁から15桁の整数を発生させる.このとき,発生させた整数と その各位の数字を次のように表示するスクリプトを作成せよ.(20点)

       難易度 ★★★

    Obtained number = 808053058928063
    Each digit :   8 0 8 0 5 3 0 5 8 9 2 8 0 6 3
    

    解答例
    power = rand(10)
    num = rand(1000000*10**power) + 1
    
    printf "Obtained number = %d\n", num
    printf "Each digit :  "
    
    ary = []
    i = 0
    
    while num > 0
      mod = num % 10
      ary[i] = mod
      num /= 10
      i += 1
    end
    
    ans = ary.reverse
    
    for i in 0..ary.size-1
      printf "%2d", ans[i]
    end
    
    printf "\n"
    

  3. 1000から1以上100以下の乱数を引く.残った数からさらに繰りかえし1以上 100以下の乱数を発生させて引き続ける.このとき,発生した乱数と差を次 のように表示するスクリプトを作成せよ.(20点)

       難易度 ★★★

    乱数:  18, 引いた残り:  982
    乱数: 100, 引いた残り:  882
    乱数:  74, 引いた残り:  808
    乱数:  90, 引いた残り:  718
    乱数:  24, 引いた残り:  694
    乱数:  75, 引いた残り:  619
    乱数:  85, 引いた残り:  534
    乱数:  46, 引いた残り:  488
    乱数:  45, 引いた残り:  443
    乱数:  45, 引いた残り:  398
    乱数:  20, 引いた残り:  378
    乱数:  56, 引いた残り:  322
    乱数:  93, 引いた残り:  229
    乱数:  84, 引いた残り:  145
    乱数:  61, 引いた残り:   84
    乱数:  82, 引いた残り:    2
    乱数:  37, もう引けません!
    

    解答例
    org = 1000
    
    while org > 0
      num = rand(100) + 1
      org -= num
      
      if org >= 0
        printf "乱数: %3d, 引いた残り: %4d\n", num, org
      else
        printf "乱数: %3d, もう引けません!\n", num
      end
    end
    

  4. 10000以下の正の乱数 n を発生させる.次に n よりも小さ い乱数を発生させる.これを繰りかえし行い,発生させた乱数すべてを要 素に持つ配列を生成し,次のように表示するスクリプトを作成せよ.(20点)

       難易度 ★★★

    [8488, 7046, 1539, 1027, 723, 357, 345, 222, 16, 11, 5, 1, 0]
    

    解答例
    ary = []
    
    n = 10000
    i = 0
    
    while n > 0
      ary[i] = rand(n)
      n = ary[i]
      i += 1
    end
    
    p ary
    

  5. 図1に示すように,xy座標系において中心が(3,3)にある半径2の円を考える. 出発点を点P(5,3)として,サイコロを繰りかえし振ることにより円周上を 反時計回りに回る動きを考える.サイコロの目を3で割った値を中心角と してその角度(ラジアン) だけ,一回に進むとし,1周したら終了とする.このとき,移動した経過 について,出たサイコロの目,円周上を進んだ出発点からの累積距離,各 回の原点からの直線距離の3つをを1行に表示するスクリプトを作成せよ. 1周する際にはサイコロの目によって通り過ぎる場合もあるが,通り過ぎ る場合も終了とする.(15点)

       難易度 ★★★★★

    図1

    数学関数を利用する際には,

    include Math
    

    を忘れないように.また,円周率πは定数 PI として利用可能.

    解答例
    include Math
    
    theta = 0
    path = 0
    
    until theta > 2*PI
      dice = rand(6) + 1
      step = dice / 3.0
      theta += step
      x = 2 * cos(theta) + 3
      y = 2 * sin(theta) + 3
      path += 2 * step
      distance = sqrt(x*x + y*y)
      printf "サイコロの目: %2d, 進んだ累積距離距離: %5.2f, 原点からの直線距離: %5.2f\n", dice, path, distance
    end