解説 4月5日B

今回の学習項目です。


復習と準備

前回学んだことの確認のため次の課題を行ってください。

課題1

課題1-1

次のプログラムを実行すると何が表示されるかまずは、自分の頭で考えて予想を書きなさい。
予想を書いたら、次に実際にプログラムを実行し、自分の予想通りの結果になったか確かめて報告しなさい。
予想と違う結果になった場合は、自分の予想がどう間違っていたか説明し、どのように考えてそのような結果になったのかも説明しなさい。予想とあっていた場合も、どのように考えて予想できたのか、(わからなかった人に説明するつもりで)書きなさい。

a = 10
b = 20
c = a + b
print c, "\n"

a = "10"
b = "20"
c = a + b
print c, "\n"

[ヒント:数の足算と文字列の足算]

数の足算と文字列の足算は異なる働きを持ちます。
数の足算は数と数を足し合わせて合計を計算しますが、文字列の足算は次のように、複数の文字列を連結する働きを持ちます。

name = "中京太郎"
aisatsu = "こんにちは、" + name + "さん。\n"  #文字列を連結して変数に代入。
print aisatsu
こんにちは、中京太郎さん。

また、数と文字列を足したり、文字列から文字列を引いたりすることはできません。 これらは実行するとエラーになります。

print 10 + "20"    #数と文字列を足し合わせる。
kadai1.rb:1:in `+': String can't be coerced into Fixnum (TypeError)
        from kadai1.rb:1
print "10" - "20"  #文字列から文字列を引く。
kadai1.rb:1: undefined method `-' for "10":String (NoMethodError)

課題1-2

次のような応答を実現するプログラムを作成しなさい。 オレンジ色の文字はキーボードからの入力を表しています。 名前を尋ねてくるので、あなたが自分の名前を入れると、コンピュータが名前の入った挨拶を返します。

コンピュータ:お名前は何とおっしゃいますか?
あなた:中京太郎
コンピュータ:はじめまして、中京太郎さん。今後ともよろしくお願いします。

このようなプログラムを作ることを前回学びました。
これは今後もよく出てくる基本パターンの一つです。 今日も、これを使うので、きちんとマスターしておきましょう。
すぐにできない場合でも、前回のメモやメールを見ないで、自力で思い出す努力をしてください。
できない場合は、次のヒントが役に立つはずです。

[どこから手をつければよいか見当がつかない場合のヒント]

とりあえず、このプログラムを作るために、関係のありそうなプログラムの部品を 想い出す努力をしてみましょう。
例えば、次のようなものです。何を忘れてしまったのか、分かってきたら、次のヒントなどを参考に してみてください。

キーボードからの入力はやったな。。。
「変数」も使う必要がありそう。
最初は、print文から始まるのかな。
...

[キーボードからの入力の実現が分からない人へのヒント]

次のプログラムをていねいに読んで、これを実行したら、何が起こるのか、実際に実行せずに、頭の中で追いかけて予想してください。確信ができれば、実際に実行してみて、自分の予想通りかどうか確かめてみましょう。もし、うまく予想できないようだったら、どこが分からないのかその場所をできるだけはっきりさせて、そこを担当教員やTAに尋ねてください。ここで、分からないまま先に行くのは、得策ではありません。 後で分からなくなって、かえって時間がかかる可能性があります。 一歩、一歩プログラムを追いかけることが大事です。 じっくり、分かるまで時間をかけてください。

print "あいさつの言葉をキーボードから入力しください。\n"
print "あいさつ:"

aisatsu = gets.chomp  #ここが大事。

print aisatsu, "、お元気ですか?\n"

gets.chompの部分が実行されると、コンピュータはキーボードからの入力を「待つ」状態に入ります。 実際、そこで止まっていると言ってよいでしょう。
次に、キーボードから文字を打ち込んで、最後にEnterを入れると、それをきっかけにして、 コンピュータは動き出します。

課題1-3

次の実行結果のように、入力された3個の数の平均を計算するプログラムを作成しなさい。 (オレンジ色の文字はキーボードからの入力を表しています。)

3個の数の平均を計算します。
数を入力してください。
(1):10
(2):20
(3):30
これらの平均は20です。

ヒント: 最初に sum というような変数に数の 0 を与えておきます。 キーボードからの入力から数を受け取り、この変数に加えていきます。
キーボードから数の入力を受け取る方法については、下の解説を参照してください。

[キーボードから数の入力を受け取るには]

キーボードから数の入力を受け取るときは、次のような命令文を書きます。

変数 = gets.to_i    #キーボードからの数の入力を受け取り、変数に代入する。

上の命令文により、キーボードから受け取った文字列を数に変換しています。 .to_iのiは「整数」を意味するIntegerのiです。 .to_iには、文字列を整数に変換する働きがあります。


条件分岐

条件分岐とは、次のように状況を判断して、適切な反応ができるようなプログラムの仕組みです。 次のコンピュータとの対話例を見てください。

コンピュータ:あなたの年齢はいくつですか?(年齢を数字で入力してください。)
年齢:19
コンピュータ:残念ですが、まだ、お酒を飲んではいけない年齢ですね。

年齢に20を入力すると、

コンピュータ:あなたの年齢はいくつですか?(年齢を数字で入力してください。)
年齢:20
コンピュータ:おめでとう。もう、お酒を飲める年齢ですね。

このように、入力によって違う応答を返すことができます。

このようなやりとりを実現するためには、入力された年齢(これは数として扱います)によって、 コンピュータに異なる振る舞いをさせるプログラムを作成する必要があります。 そのためには次のような、ifの構文を使った、条件分岐の仕組みが必要です。

if (条件判定式)
  
  
 ...
else
 
  
 ...
end
まずは実際に条件分岐の仕組みを持つプログラムを動かしてみて、上の対話例と同じような振る舞いをするか確認しておきましょう。
次のプログラムをコピーしてファイルに保存し、実行して振る舞いを確かめなさい。 どのような年齢を入力するとどんな応答が返ってくるか確かめて、わかったことを報告しなさい。 いろいろな年齢を入力して試してみるとよい。

print "コンピュータ:あなたの年齢はいくつですか?(年齢を数字で入力してください。)\n"
print "年齢:"
nenrei = gets.to_i

if (nenrei < 20)
  print "コンピュータ:残念ですが、まだ、お酒を飲んではいけない年齢ですね。\n"
else
  print "コンピュータ:おめでとう。もう、お酒を飲める年齢ですね。\n"
end

条件分岐は強力な仕組みです。 コンピューターが人間のための強力な道具になるのは、 このように場面に応じて適切に動作するようにプログラムできるからである、 と言っても言い過ぎではないでしょう。 知的な振る舞い、つまり適切な場面で適切な動作をさせる根源にこの「条件分岐」があるのです。
ifで作られる条件分岐のプログラムの、基本の形は次のようなものです。

if (条件判定式)
 #上の括弧の中の条件判定式の実行結果が真のときだけ以下の文が次々に実行される。
   
  
 ...
else
  #上の括弧の中の条件判定式の実行結果が真でないときだけ以下の文が次々に実行される。
 
  
 ...
end
先にあげたプログラムがどのように動作するのか、年齢に19という数を入力した場合を例に、ていねいに追いかけてみましょう。
print "コンピュータ:あなたの年齢はいくつですか?(年齢を数字で入力してください。)\n"
print "年齢:"
nenrei = gets.to_i  #キーボードから19という数が入力されると...

if (nenrei < 20)
  print "コンピュータ:残念ですが、まだ、お酒を飲んではいけない年齢ですね。\n"
else
  print "コンピュータ:おめでとう。もう、お酒を飲める年齢ですね。\n"
end

ifの括弧の中の条件判定式が問題です。 この括弧の中の「条件」が判定され、合っていればすぐ下の部分が実行されます。 条件に合っていない場合は、elseの下に書かれた部分が実行されます。

条件判定式について詳しく見てみましょう。 条件判定式の部分が、実際に実行されることに注意してください。 実行されると値を持つのが式でした。 条件判定式も式ですので、実行されるとその値が求められます。 上の条件判定式の場合、nenrei < 20 という式がまず実行され、「19は20より小さい」という意味に合致しますので、trueという値がこの式の値になります。 trueというのは、条件判定式が正しいことを表す値です。 反対に、条件判定式が間違っている場合はfalseという値で表されます。

式の値として、これまでは文字列だけを扱ってきましたが、 これからは真を表すtrue偽を表すfalseも扱うことになります。これらは「真偽値」と呼ばれます。文字列と数とは違う「第3の」種類の値です。 今度はこの部分だけを、詳しく見てみましょう。

課題2

課題2-1

条件判定式が実際に値を持つことを確かめてみましょう。
次のプログラムを実行すると何が表示されるか考え、予想を書きなさい。
次に、実際にプログラムを実行してみて、自分の予想と適合したかどうかを報告しなさい。
予想と違う結果になった場合は、自分の予想がどう間違っていたか説明し、どのように考えてそのような結果になったのか説明しなさい。

nenrei = 19
print nenrei < 20

print "\n"

nenrei = 21
print nenrei < 20

[ヒント1]

ここまでで扱った3種類の値(文字列、数、真偽値)を、printを使って表示してみましょう。

print "こんにちは", "\n"    #文字列
print 100, "\n"             #数
print true, "\n"            #true
print false, "\n"           #false

真偽値のtrueとfalseは数と同じように、そのままtrue、falseと表示されます。

こんにちは
100
true
false

[ヒント2]

次のような文字列の連結や、数の計算も「式」の一種です。

#文字列の連結
print "こんにちは、" + "中京太郎" + "さん。", "\n"

#数の計算
print 100 * 2, "\n"

式は実行されると値を持ちますので、printによって表示されるときにはその値が表示されます。

こんにちは、中京太郎さん。
200

条件判定式も「式」ですので、何らかの値を持ちます。 上と同じように、printの実行時には式の持つ値が表示されます。

nenrei = 19
print nenrei < 20

print "\n"

nenrei = 21
print nenrei < 20

2つの条件判定式がそれぞれどのような値を持つか考えてみましょう。 わからない人はもう一度、課題1-1の前の解説を読んでみましょう。

比較演算子

if文の条件判定式で使用する < や > のことを比較演算子と呼びます。 比較演算子には次のような種類があります。

 
  
a == baとbは等しい
a != baとbは等しくない
a < baはbより小さい
a > baはbより大きい
a <= baはb以下
a >= baはb以上

課題2-2

次のようなプログラムを実現しなさい。
キーボードから入力した年齢が20才以上の場合は、「あなたは選挙権を持っています。」 と返事をし、年齢が20才より小さい場合には「あなたはまだ選挙権をもっていません。」 というメッセージを出力するプログラムを作成しなさい。
具体的な応答の例です。
年齢はいくつですか?年齢を数字でキーボードから入力し、最後にエンターキーを押してください。
年齢:19
あなたはまだ選挙権をもっていません。

ランダムな数の生成

rand(n)は乱数を発生させる命令です (そしてrandは、乱数を発生させる 関数、nはその引数(ひきすう)と言います)。
ここで引数のnには正の整数か、正の整数を値とする変数が入ります。 rand(n)を実行すると、0から、n-1までのどれかの整数がランダムに作り出されます。 ですから、rand(3)では 0,1,2の3つの数がどれかが発生するのであって、3は発生されないことに注意してください。
ランダムな数の集まりのことを乱数ともいいますが、乱数はプログラミングではとても重要で役に立つものです。 実際、乱数を使ったプログラムがたくさんあります。
次の課題で、さいころの目を出すプログラムをこのrand関数で実現してみましょう。

課題2-3

次のように、実行するたびごとにサイコロの出る目がランダムに変わるプログラムを実現しなさい。
H:>ruby program.rb
さいころを振ります!
コロ,,,  #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
         #0.5秒待つ。
さいころの目は3でした。

H:>ruby program.rb
さいころを振ります!
コロ,,,  #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
         #0.5秒待つ。
さいころの目は5でした。
[ヒント:0から5ではなく、1から6までの目を出すには]
rand(6) + 1
とすればよいだけです!

課題2-4

これまでに学んだことを応用して、次のようなサイコロゲームを作成しなさい。
#当たった時
さいころゲームの始まりです!
次に振ったさいころの目を当てましょう。
次にでる目はなんですか?
予測:5
では振ります。
コロ,,,  #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
サイコロの目は? #0.5秒待つ。
5 でした!
大当たりです! 超能力をもっていますね。
#はずれた時
さいころゲームの始まりです!
次に振ったさいころの目を当てましょう。
次にでる目はなんですか?
予測:5
では降ります。
コロ,,,  #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
コロ,,, #0.3秒づつ待つ。
サイコロの目は? #0.5秒待つ。
2 でした!
残念でした。また挑戦してくださいね。

※ 普通に実行するとおそらく「予測」という漢字が文字化けしてしまうはずです。 正しく表示するためには、Rubyのプログラムを次のようにして実行する必要があります。

H:>ruby -Ks kadai2-4.rb 

半角大文字のKと小文字のs(漢字コードはShift_JISの意。)

「予測」のように正しく表示できない文字が出てきたときは、上の方法で実行することを覚えておいてください。

[作成のヒント1:プログラムの流れ]

さいころの目はrand(6)+1で作り出せます。
ゲームの参加者の予測はキーボード入力から取り出せます。
上の二つが同じかどうかの判定とそれに従った分岐は今回学んだのif文の条件分岐でできます。
num1とnum2が同じかどうかは、(num1 == num2 )という条件判定式でできます。

[作成のヒント2:変数をうまく使う]

変数に値(数など)をとっておけば、後で必要になった時に使えます。

[作成のヒント3:文字列と数の違いに注意]

gets.chompでは、文字列が入るだけで、数の判定ができません。

より複雑な条件分岐(if文)を理解する

if文はプログラムを場面に応じて適切に動作させるためになくてはならない ものであり、プログラミングの基本の一つであることは上で述べました。 より 複雑なif文を持つプログラムの理解と作成に挑戦してみましょう。 上で学んだように、if文の基本的な構造は次のようなものです。
if (条件判定式)
    文1
    文2
    ...
else
    文100
    文101
    ...
end
ifとelseとendというキーワードと条件判定式と実行される文の集まり二つから構成されています。 前に出した同じ具体例で、もう一度確かめておきましょう。
nenrei = 21

if (nenrei >= 18)
  print "あなたは車の免許を取ることができます。"
else
  print "あなたはまだ車の免許を取ることができる年齢に達していません。"
end
ifの次の括弧の中式は条件判定式です。この括弧の中の式が実行され、値が 真であれば、次の行の文1、文2などが順番に実行されて終わります。 条件判定式を実行した結果の 値が偽であれば、elseの下の実行文100、実行文101などが順番に が実行されます。 つまり、条件判定式の値によって、実行される文(の集まり)が違うところが大事なところです。

さて、基本は同じですが、もう少し複雑なif文を見てみましょう。 if文全体も一つの文ですから、次のようにif文の実行式1のところに、if文を 入れることで、つぎのようにより複雑な分岐を実現することができます。 プログラムの書き方として、内側のif文は何文字か字下げ して、見やすくするようにすることが大事です。(インデントと言います。)

if (条件判定式)
  if (条件判定式)
    文
    文
    ...
  else
    文
    文
    ...
  end
else
  文
 文
  ...
end
具体的には、次のような例に応用できます。
print "年齢を数字でキーボードから入力してください。"
nenrei = gets.to_i

if (nenrei >= 18)
  if (nenrei >=20)
    print "あなたは車の免許を取ることができます。\n"
    print "あなたはお酒も飲むこもできます。\n"
    print "よかったですね!\n"
  else
    print "あなたは車の免許を取ることができます。\n"
    print "しかし、あなたはお酒を飲むことは法律で禁じられています。\n"
    print "残念でしたね!\n"
  end
else
  print "あなたは残念ながらまだ車の免許を取ることができる年齢に達していません。\nお酒も飲んではいけません。\n"
end

if文は自由に組み合わせて構成できますから、さまざまな変形の形があります。 elseがないものも可能です。

if (条件判定式)
  文
  文
  ...
end

また、次のように、if文の中にif文のつながりがあってもよいことになります。

if (条件判定式)

   if (条件判定式)
     文
     文
     ...
   end

   if (条件判定式)
     文
     文
     ...
   else
     文
     文
     ...
   endend

課題2-5

次のプログラムがどのように振舞うのか、プログラムを一歩一歩追いかけて予測しなさい (実行して調べてははだめです)。 その後、実際に実行して、予測と合ったかどうか報告しなさい。

spacer = "          "
print spacer

kazu = gets.to_i

if (kazu == 1)
  print "☆","\n"
else
  if (kazu == 2)
      print "☆☆","\n"
  else  
    if (kazu == 3)
        print "☆☆☆","\n"
    else
      if (kazu == 4)
        print "☆☆☆☆","\n"
      else
        print "★","\n"
      end
    end
  end
end

elsif文

今のプログラムでは else のあとに if文が現れていました。図示すると次のようになっていました。
if (kazu == 1)
  文1
else
  if (kazu == 2)
    文2
  else  
    if (kazu == 3)
        文3
    else
      if (kazu == 4)
        文4
      else
        文5
      end
    end
  end
end
この場合は、変数kazuの値がなにかによって実行する文が選ばれています。
このようにelseの中にif文が埋め込まれる場合はよくあります。 Rubyではこのような場合、次のように elsif 文によって見やすく(?)書くことを許しています。
if (kazu == 1)
  文1
elsif (kazu == 2)
    文2
elsif (kazu == 3)
        文3
elsif (kazu == 4)
        文4
else
        文5
end

課題2-6

課題2-5のプログラムをelsif文を使って書き直しなさい。 またこれを実行して課題2-4のプログラムと同じ結果を返すことを確認しなさい。

[参考:case文]

課題2-5のプログラムはkazuの値によって実行する文が異なり、その選択をif文を使って実現していました。 このように、ある変数の値によって実行する文を変える場合、Rubyでは次のようにcase文を使って書くことができます。 そして、この方がよりプログラムがわかりやすくなると考えられています。
case kazu
  when 1   # (kazu == 1) と同じ効果
      文1
  when 2   # (kazu == 2) と同じ効果
     文2
  when 3   # (kazu == 3) と同じ効果
     文3
  when 4   # (kazu == 4) と同じ効果
     文4
  else
     文5
end


繰り返しの基本を学ぶ

プログラミングをする上で頻繁に使う最も重要な基本パターン は「繰り返し」の構造だと 言っても言い過ぎではないでしょう。 コンピューターが強力な道具であるのは、それが高速であるため ですが、その高速性を生かして役に立つ道具にするためには、これから説明する 「繰り返し」の構造が本質的な役割を果たしています。 現実のほとんどのプログラムが繰り返し構造を使っていると言ってもよいでしょう。

次のように、「こんにちは」を10回表示するプログラムを考えてみましょう。

こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは

これまでは、print文を10個書く必要がありました。

print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"
print "こんにちは\n"

繰り返し構造を実現するforwhile を使うことで、上のプログラムを次のように短く簡潔に書くことができます。

なぜ、これでうまくいくのか、その仕組みを理解しましょう。 仕組みを理解することは大事です。 そうしないと、大事なくり返しの構文を自由自在に使いこなせないからです。

2種類の繰り返し: forとwhileの特徴

Rubyではいろいろな種類の「繰り返し」の構文が用意されています。 その中でforwhile はとても重要です。これは2つの違う考えに基づく繰り返しを実現するからです。

forは、「ある決まった回数だけ」 (もしくは決まった個数の対象に対してだけ)、命令を繰り返します。 今の例はprint命令を10回繰り返すという問題でしたから、for文を使うには 最適の問題でした。

whileは、「ある条件が成り立っている間」だけ 命令を繰り返します。 今の例はprint命令を10回繰り返すという問題でしたから、while文を 使うにはあまり適さない問題でした。

for文の仕組み

forというキーワードを使った繰り返しの構文は次のような形をしています。
for 変数 in 変数の取りうる最小値..最大値
     文1
     文2
     ...
end

for文を実行すると、次のように動作します。

1. まず変数の値として「変数の取りうる範囲の最小値」が与えられる。
2. 変数の値が「変数の取りうる範囲の最大値」より大きければ、for全体の実行を終える。
3. endまでの文1, 文2, ...が順番に実行される。
4. 変数の値に1が足され、プログラムの実行が2.に戻り、もう一度同じことが繰り返される。
先ほどの「こんにちは」を10回表示するfor構文を使ったプログラムが働く上で大事なことは、 繰り返しを制御する変数が必要なことです。変数iの値の変化を表すよう書きなおした 次のプログラムを実行させてみてください。

for i in 1..10
  print i, "回目のこんにちは\n"
end

ここで変数としてiを使いましたが、変数として使えるものならなんでも構いません。 ただこの変数がないと、繰り返しはうまく機能しません。 なお、変数iのとりうる範囲を1..10と書いていますが、これはもちろん 最小値が1,最大値が10であることを表しています。 ちなみに、単に10回「こんにちは」をprintするだけでしたら、 最小値が1001で最大値が1010でも構いません(変数iがとる値は1001から1010までの10通り)。 実際、次のようにも書けます(が、プログラムがわかりにくくなりますので、普通はやりません)。

for i in 1001..1010
  print "こんにちは\n"
end

課題3-1

次の結果を出力するプログラムを、for文を使って実現しなさい。
1
2
3
4
5
6
7
8
9
10

課題3-2

次の結果を出力するプログラムを、for文を使って実現しなさい。
20
18
16
14
12
10
8
6
4
2

[ヒント:数を減らすにはどうしたらいい?]

for文では数を1つずつ増やすことしかできません。 そこで表示する数を徐々に減らしていくにはどうしたらよいか、悩んだかもしれません。

いろいろなやり方がありますが、計算によって数を減らしていく方法を紹介しましょう。

10 - i = 10    # i=0 の場合
10 - i =  9    # i=1 の場合
10 - i =  8    # i=2 の場合
10 - i =  7    # i=3 の場合
10 - i =  6    # i=4 の場合
...

while文の仕組み

whileというキーワードを使った繰り返しの構文は次のような形をしています。

while (条件判定式)
  文1
  文2
  ...
end

whileを実行すると次のように動作します。

1. まずif文と同様、条件判定式が実行され、その値が取り出される。
  1-1. 条件判定式の値がの時、
         その下の文1、文2などが順番に実行される。(この辺りはif文と同じです。)
         endまで来ると、プログラムの実行場所がwhileの先頭に戻る。
         (1. に戻り、条件判定式がもう一度実行され、同じことが繰り返される。)
  1-2. 条件判定式の値がの時、
         何もしないで、while全体の実行を終える。(2. に進む。)
2. endの次の文から実行を再開する。

先ほどの「こんにちは」を10回表示するプログラムをwhile構文を使って書くには、 表示される回数を数えるための変数が必要になります。以下ではその変数として iを用いています。そして、while文の前に変数iに0を与え、 表示が終わるごとにiに1を足すようにしています。変数iの値の変化に着目してください。

i = 0          #iの値は0。
while(i < 10)
  print "こんにちは\n"
  i = i + 1    #iの値を1つ増やす。
end

10回繰り返して、そこで終わりになるのは、繰り返すたびごとにiの値が1ずつ増えていることと、 条件判定式 (i < 10) のおかげです。 10回繰り返すまでは、iの値は10より小さいので、条件判定式が真となり、繰り返しを行うことになります。 10回以上になると、条件判定式が偽となりますので、whileの実行を止めることになります。
このように、回数を記憶するための変数 (このような変数をカウンター変数と呼びます)には、 whileの繰り返しに入る前に0などの数を代入しておく必要があります。 この変数の働きがないと、while文を使ってある一定の回数繰り返す、というプログラムはうまく機能しません。

課題3-3

次の結果を出力するプログラムを、while文を使って実現しなさい。
1
2
3
4
5
6
7
8
9
10

課題3-4

次の結果を出力するプログラムを、while文を使って実現しなさい。
20
18
16
14
12
10
8
6
4
2

課題3-5

次の実行結果に示されるように、 最小値と最大値をそれぞれキーボードから入力し、その間の数をすべて足した 合計を返すプログラムをfor文とwhile文、それぞれを使って書きなさい。 (オレンジ色の文字はキーボードからの入力を 表しています。キーボードから数の入力を受け取る方法は、 ここを参照してください。)

数の合計を計算します。数を入力してください。
最小値:10
最大値:30
10から30までの数の合計は420です。

for文とwhile文のどちらのほうが書きやすかったでしょうか?またその理由は何でしょう。

課題3-6

nを正の整数とした時、階乗n!を計算するプログラムを作成しなさい。
但し、次の例のように、nはキーボードから入力するものとし、 階乗を計算した結果を以下のように出力するようにしなさい。
以下はnが100の時の例です。

コンピュータ:自然数nの階乗の計算を行います。nをキーボードから入力し、Enterキーを押してください。
n:20
結果:20の階乗は2432902008176640000です。

[ヒント:階乗の意味]

階乗の意味は次の通りです。

n! = n * (n-1) * (n-2) * ... * 3 * 2 * 1 
例
5! = 5 * 4 * 3 * 2 * 1 = 120


「アルゴリズムとデータ構造」のホームに戻る