Document

情報基礎Ⅱ
(第4回)
月曜4限
担当:北川 晃
演習:ユークリッドの互除法
ユークリッドの互除法を用いて,2つの正整数a,b
(a>b)の最大公約数を求めるプログラムを作れ.
ただし,While文によるループを用いること.
あまり
と
の最大公約数は
例:1058と943の最大公約数
•1058÷943=1 あまり 115
(943と115の最大公約数)
•943÷115=8 あまり 23
(115と23の最大公約数)
•115÷23=5 あまり 0
と
のとき,
の最大公約数に等しい.
•あまりが0になるまで
この作業を繰り返す.
•あまりが0になったときの
割る数が最大公約数
プログラム例:ユークリッドの互除法
Dim a, b, ℓ, m, n As Integer
Console.Write("一つ目の整数を入力して下さい")
a = Console.ReadLine()
Console.Write("二つ目の整数を入力して下さい")
b = Console.ReadLine()
m = a
n = b
余りが0かどうかを判定
ℓ = m - (m \ n) * n
While ℓ <> 0
m = n
n = ℓ
ℓ = m - (m \ n) * n
End While
この二つの行を
逆にしてはならない
余りを計算し直して
もう一度評価
Console.WriteLine("最大公約数は{0}", n)
判断と飛び越し2
IF-THEN-ELSE型
YES
IF文
条件成立?
処理1
NO
処理2
合流
次の処理へ
If文の基本的な表式 その2
If 条件式 Then
[ 文ブロック1 ]
[ Else
[ 文ブロック2 ] ]
End If
• 条件式の値が真(True)の場合に文ブロック1が,
偽(False)の場合に文ブロック2が実行される.
• 文ブロックは1文だけでも,あるいは
文が1つも無い場合も許される.
• [ ]で囲まれた部分は省略可.
例題:大きい値と小さい値
n個のデータx1, x2, …, xnと定数aが与えられているとき,
xi≧aであるものの個数と,xi<aであるものの個数を求めよ.
•大きい値:6個
•小さい値:5個
大きい値と小さい値:アルゴリズム
1. 入力装置から区切りの値aを読み込む.
2. 初期値:大きい値の数ℓ=0, 小さい値の数s=0
3. 入力装置からxを一つ読み込む.
4. xとaを比較して, x≧aである場合はℓ→ℓ+1
x<aである場合はs→s+1
5. 次のxを読み込み,再び判定する.
6. 以上を繰り返し,読み込む値がなくなったら, ℓとsを書き出す.
大きい値と小さい値:出力例
プログラム例:大きい値と小さい値
Dim c, ℓ, s, n As Integer, a, x As Single
Console.Write("区切りとなる値aを入力して下さい")
a = Console.ReadLine()
Console.Write("データの個数nを入れて下さい")
n = Console.ReadLine()
c = 0
ℓ = 0
s = 0
データの個数のカウンタ(初期値0)
大きな数字の個数のカウンタ(初期値0)
小さな数字の個数のカウンタ(初期値0)
データの個数のカウンタを1増やす
point1: c = c + 1
Console.Write("{0}個目のデータを入力して下さい", c)
x = Console.ReadLine()
プログラム例:大きい値と小さい値(続き)
入力したxの値がaよりも
If x >= a Then
ℓ = ℓ + 1
Else
s = s + 1
End If
 大きい場合はℓを1増やす
 小さい場合はsを1増やす
cがnに達していなければ,point1へ戻る
If c <> n Then GoTo point1
Console.WriteLine("aより大きい値は{0}個," _
& "小さい値は{1}個", ℓ, s)
If文の基本的な表式 その3
If 条件式1 Then
[ 文ブロック1 ]
[ ElseIf 条件式2 Then
[ 文ブロック2 ] ]
[ Else
[ 文ブロック3 ] ]
End If
• 条件式1の値が真(True)の場合に文ブロック1が,偽(False)の
場合には条件式2が調べられ,式の値が真(True)の場合に
文ブロック2が,偽(False)の場合には文ブロック3が実行される.
• ElseIf句はいくつでも追加できる.
より複雑な条件式の書き方
•
かつ
のとき
If a=1 And b=2 Then…
•
または
のとき
If a=1 Or b=2 Then…
•
のとき
If x <= 0 Or (3 <= x And x < 5) Then…
括弧()などをうまく使って,条件式をまとめる.
プログラミング演習
• 1~12の月(month)を入力をしたとき,
 3~5月ならば「春」
 6~8月ならば「夏」
 9~11月ならば「秋」
 12~2月ならば「冬」
と表示させるプログラムを作れ.
考え方:入力された”month”の値によって場合分けする.
出力例:季節の判定
プログラム例:季節の判定
Console.Title = "季節の判定プログラム"
Dim month As Integer, season As String
Console.WriteLine("何月ですか?1~12の整数を入力して下さい.")
month = Console.ReadLine()
3≦月≦5の場合
If month >= 3 And month <= 5 Then
season = "春"
6≦月≦8の場合
ElseIf month >= 6 And month <= 8 Then
season = "夏"
9≦月≦11の場合
ElseIf month >= 9 And month <= 11 Then
season = "秋"
ElseIf month = 12 Or (month >= 1 And month <= 2) Then
season = "冬"
月=12もしくは1≦月≦2
Else
の場合
season = "入力エラー"
End If
それ以外の場合
Console.WriteLine("{0}月の季節は{1}です.", month, season)
様々な繰り返しの構文
• 同じ作業を,あらかじめ決まった回数だけ繰り返す
 For……Next文
• ある条件式が満たされるまで,同じ作業を繰り返す
 While……End While文
条件式が真の場合は,ループを繰り返す(前判定)
 Do……Loop文
条件が真の場合,または真になるまで,
ループを繰り返す(前判定,後判定).
For……Next文の基本的な表式
For 制御変数 [As 型] = 初期値 To 終了値 [Step 増分]
文ブロック
Next [制御変数]
• 制御変数の値が初期値から終了値の間,ループを繰り返す.
• 1回ループするたびに,制御変数の値は増分だけ増加する.
• 増分が負の場合は,減少する.
• 増分が1の場合のみ,”Step 1”は省略可.
• ループ内でのみ用いる制御変数を,Asで宣言できる.
• […]内は省略可.
For……Next文の例文
• 整数nを読み込んで,1+2+…+nの値を計算せよ.
Console.Title = "1~nまでの和"
Dim n As Integer, sum As Integer = 0
Console.Write("n=")
n = Console.ReadLine()
繰り返し
構造
変数iは,ループ内
でのみ用いる.
増分”1”は省略
For i As Integer = 1 To n
sum = sum + i
繰り返し構造の終了
Next i
(iは省略可)
Console.WriteLine("1+2+…+n={0}", sum)