情報基礎II第二回目

Download Report

Transcript 情報基礎II第二回目

情報基礎II
(第2回)
月曜4限
担当:北川 晃
講義資料のスライド
http://www.cc.kochi-u.ac.jp/~kitagawa/
より,適宜ダウンロードして参照してください.
判断と飛び越し1
WHILE型
IF文
条件成立?
NO
繰り返して
実行する部分
GoTo文
次の処理へ
YES
If文の基本的な表式1
条件式:
•条件式が満たされれば文1を実行
•満たされないときは文2を実行
[ ]で囲まれたElse句は省略可.
If 条件式 Then 文1 [Else 文2]
条件式(比較演算子)の書き方
•
•
•
•
•
•
<
<=
>
>=
=
<>
(より小さい)
(以下)
(より大きい)
(以上)
(等しい)
(等しくない)
If
If
If
If
If
If
a<100 Then ……
a<=100 Then ……
a>100 Then ……
a>=100 Then ……
a=100 Then ……
a<>100 Then ……
1行のIf文の例文
Dim a, b, c, d, As Integer
Dim flag As Boolean
If a > b Then c = 100 Else c = -100
If a <= b Then c = 125
If flag Then c = d
• 条件式は論理型の変数として扱われる.
• 満たされた場合は「真」(True),
満たされない場合は「偽」(False)という.
• 条件式に,論理型の変数を用いることも可能.
例題:ユークリッドの互除法
ユークリッドの互除法を用いて,2つの正整数a,b
(a>b)の最大公約数を求めるプログラムを作れ.
あまり
と
の最大公約数は
例:1058と943の最大公約数
•1058÷943=1 あまり 115
(943と115の最大公約数)
•943÷115=8 あまり 23
(115と23の最大公約数)
•115÷23=5 あまり 0
と
のとき,
の最大公約数に等しい.
•あまりが0になるまで
この作業を繰り返す.
•あまりが0になったときの
割る数が最大公約数
ユークリッドの互除法のアルゴリズム
1. 2つの整数aとbを読み込む.
2. a→m,b→nを代入.
3. l=(m÷nのあまり)を計算.
4. (n,l)を新たな(m,n)として代入.
5. 手順3と4を,あまりlが0になるまで繰り返す.
6. このときのnを最大公約数として書き出す.
プログラム例:ユークリッドの互除法
Dim a, b, l, m, n As Integer
Console.Write("一つ目の整数を入力して下さい")
a = Console.ReadLine()
Console.Write("二つ目の整数を入力して下さい")
b = Console.ReadLine()
GoTo で m = a
飛ぶ先 n = b
余りを計算して,0なら
‘point2’へ飛べ,という命令
point1: l = m - (m \ n) * n
If l = 0 Then GoTo point2
m = n
この二つの行を
n = l
GoTo point1
逆にしてはならない
条件成立?
NO
繰り返して
実行する部分
point2: Console.WriteLine("最大公約数は{0}", n)
次の処理へ
YES
大きい値と小さい値:出力例
Whileループを用いた条件分岐
• While……End While文
ある条件によって繰り返しを続けるかどうかを判断するループ
While 条件式
文ブロック
End While
• 条件式が真(True)の間はループを繰り返す.
• 条件が最初から偽(False)の場合は,
ループを1回も実行しない.
While文の例題
Dim sum As Integer = 0, i As Integer
i = 1
While i <= 10
sum = sum + i
i = i + 1
End While
iが11を越えるまで,
以下の命令を繰り返せ.
変数’sum’に’i’を加えた
ものを新たな’sum’とする.
Console.WriteLine(“合計は{0}”, sum)
While文の条件式を誤れば,ループが
無限に繰り返されることにもなる.
プログラム例:ユークリッドの互除法
Dim a, b, l, m, n As Integer
Console.Write("一つ目の整数を入力して下さい")
a = Console.ReadLine()
Console.Write("二つ目の整数を入力して下さい")
b = Console.ReadLine()
m = a
n = b
余りが0かどうかを判定
l = m - (m \ n) * n
While l <> 0
m = n
n = l
l = 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つも無い場合も許される.
• [ ]で囲まれた部分は省略可.
If文の基本的な表式 その3
If 条件式1 Then
[ 文ブロック1 ]
[ ElseIf 条件式2 Then
[ 文ブロック2 ] ]
[ Else
[ 文ブロック3 ] ]
End If
• 条件式1の値が真(True)の場合に文ブロック1が,偽(False)の
場合には条件式2が調べられ,式の値が真(True)の場合に
文ブロック2が,偽(False)の場合には文ブロック3が実行される.
• ElseIf句はいくつでも追加できる.
例題:大きい値と小さい値
n個のデータx1, x2, …, xnと定数aが与えられているとき,
xi≧aであるものの個数と,xi<aであるものの個数を求めよ.
•大きい値:6個
•小さい値:5個
大きい値と小さい値:アルゴリズム
1. 入力装置から区切りの値aを読み込む.
2. 初期値:大きい値の数l=0, 小さい値の数s=0
3. 入力装置からxを一つ読み込む.
4. xとaを比較して, x≧aである場合はl→l+1
x<aである場合はs→s+1
5. 次のxを読み込み,再び判定する.
6. 以上を繰り返し,読み込む値がなくなったら, lとsを書き出す.
プログラム例:大きい値と小さい値
Dim c, l, s, n As Integer, a, x As Single
Console.Write("区切りとなる値aを入力して下さい")
a = Console.ReadLine()
Console.Write("データの個数nを入れて下さい")
n = Console.ReadLine()
c = 0
l = 0
s = 0
データの個数のカウンタ(初期値0)
大きな数字の個数のカウンタ(初期値0)
小さな数字の個数のカウンタ(初期値0)
データの個数のカウンタを1増やす
point1: c = c + 1
Console.Write("{0}個目のデータを入力して下さい", c)
x = Console.ReadLine()
プログラム例:大きい値と小さい値(続き)
入力したxの値がaよりも
If x >= a Then
l = l + 1
Else
s = s + 1
End If
 大きい場合はlを1増やす
 小さい場合はsを1増やす
cがnに達していなければ,point1へ戻る
If c <> n Then GoTo point1
Console.WriteLine("aより大きい値は{0}個," _
& "小さい値は{1}個", l, s)
大きい値と小さい値:出力例