情報基礎II 出題範囲

Download Report

Transcript 情報基礎II 出題範囲

情報基礎II
試験出題範囲
月曜4限
担当:北川 晃
評価
• 中間試験(もしくはレポート):30%
• 定期試験:70%
その他,出席状況などを加味して総合的に判断する.
この講義で扱う内容
• アルゴリズムとは何か
• Microsoft Visual Basic Expressを用いた
初歩的なプログラミング
 Visual Basicの基本的な文法
 アルゴリズムの実装の仕方
 判断・分岐,飛び越し,繰り返しの処理の仕方
 ソースコードを実際に入力し,動作を確認
• 様々な日常問題への応用
情報基礎実習I(木4・5)にて,問題演習を行う
参考書
他に,戸川 隼人 著,「ザ・FORTRAN 77」,サイエンス社(1986年)など.
情報処理を学ぶ意義
理工系において…
数学を用いて
方程式を解く
•手で解けない問題も多い
例:
cos x  x の解を求めよ.
実験を行い,
データを取る
•膨大なデータを,素早く整理したい
例:1000個以上あるデータを,
小さい順に並べ替えよ.
計算機(コンピュータ)を用いて,効率的に問題を解決する.
•ユーザーの指示により,動作する(自発的には動かない).
•機械は繰り返しなど,単純操作は得意.
•用途に合わせて,最適な方法を適用する.
アルゴリズム
• 数学,コンピューティン
グ,言語学などの分野に
おいて,問題を解くための
効率的手順を定式化した
形で表現したもの.
流れ図,フローチャート
プログラム
• コンピュータの行う処理(演算,動作,通信,等)の手
順を指示したもの
上底A,下底B,高さHの
台形の面積Sを求める
Visual Basicプログラム
Sub Main()
Dim a, b, h, s As Single
Console.WriteLine("上底の値を入力して下さい")
a = Console.ReadLine()
Console.WriteLine("下底の値を入力して下さい")
b = Console.ReadLine()
Console.WriteLine("高さを入力して下さい")
h = Console.ReadLine()
s = (a + b) * h / 2
Console.WriteLine("台形の面積はs={0}", s)
End Sub
プログラミング
• アルゴリズムを元に,プログラムを作成
(流れ図などを利用)
アルゴリズム
プログラム言語
プログラム
話の内容(文脈)
対応
言語
文章
プログラミング言語
• コンピュータに対する一連の動作の指示を記述するため
の人工言語の総称
※自然言語(日本語,英語,ドイツ語…)との違い
論理的,厳密
•構文上の間違いは許されない
•文脈によって意味が変わることがない
•設計者の意図と作業によってのみ変更される
主なプログラム言語
BASIC
Java
C
JavaScript
C++
Lisp
COBOL
Pascal
FORTRAN
Prolog
• BASIC: Beginner’s All-purpose Symbolic Instruction Code
(初心者向け汎用記号命令コード)
• 英語を基礎とした,初学者にも分かりやすい文法
• 非常に多くの方言がある
→
Visual Basic (Microsoft)
情報処理の流れ
外部記憶装置
(ハードディスク,
USBメモリ)
入力装置
(キーボード,
マウス)
記憶装置
(メモリ)
出力装置
(モニタ,
プリンタ)
演算装置
(CPU)
処理装置
(CPUが行う)
Visual Basic 2013を使ってみよう
ファイルメニューから,新しいプロジェクトを選ぶ.
コンソールアプリケーションを選び,’Hello’と名前をつける.
(保存箇所にも注意)
プログラミングの第一歩
ここにプログラムを書く.
Sub:サブルーチン,
ひとかたまりのプログラム
(値を返さない)
プログラミングの第一歩(続き)
Sub Main()
Dim s As String
s = "Hello world"
Console.WriteLine(s)
End Sub
左のプログラムを
入力して保存
プログラミングの第一歩(続き)
「デバッグ」タブから,
「デバッグなしで開始」を選ぶ.
コンソールに結果が表示される.
プロジェクトとソリューション
プロジェクト:
• フォームやプログラムなどを含む1つの
アプリケーション全体を指す.
• プロジェクトごとにプログラムを作成して保存.
• プログラムを作成する=プロジェクトを作成する
ソリューション:
• 1つまたは複数のプロジェクトと,それ全体を含む.
• C#など,Visual Studioの他の言語の
プロジェクトを含むことができる.
• 当面,1つのソリューションに1つのプロジェクトを作成
コード記述の基本
• ステートメント(文)は1行に1つが基本.
• 長い文の場合は,文末にスペースと
アンダースコアを書くことで,次の行に継続できる.
• 各行でアポストロフィ(’)をつけた箇所以降は,
コメント扱いとなる(何も処理されない).
 コメントは,プログラムを見る人間向けの説明書き.
 プログラムのうち,半分程度がコメントであるプログラム
がよいとされる.
 折に触れ,コメントをつけるよう心がけるとよい.
定数と変数
• 定数:プログラムで扱うデータを定数という.
(プログラム実行中に,その値は変わらない)
• 変数:データを記憶する場所を変数という.
(その値は計算中に変化する場合がある)
変数名の付け方
 頭文字は英字.
 英字,数字,アンダースコア(_)を使用する.
 大文字,小文字の区別はない.
 字数は16383字以内.
定数と変数の型
いろいろな型のデータがあるが,
基本的には以下のものを用いる.
• 整数型:Integer
• 単精度実数型:Single
• 倍精度実数型:Double
• 文字列:String
• ブール型(論理型):Boolean
• 日付型:Date
変数の宣言
プログラムの最初に,必ず変数の型宣言を行う.
Dim文
Dim 変数名, … As 型名, 変数名, … As 型名
例:
Dim Gokei As Integer
Dim a As Single, b As Double
Dim moji5 As String
Dim L As Boolean
Dim sum As Integer=100
宣言時に任意の
初期データを設定可能
四則演算,様々な演算
• 変数にデータや式の計算結果を
記憶させるには,代入文を用いる.
• 等号“=”は,右辺の式の計算結果を
左辺の変数に代入するという意味である.
• 式に用いることのできる演算子は,次の通り.
 ():かっこ
 \:整数除算の商
 ^:べき乗
 Mod:整数除算の余り
 -:負符号
 +, -:加算,減算
 *, /:乗算,除算
 &:文字の結合
情報基礎実習I
(第1回)
木曜4・5限
担当:北川 晃
プログラムの例 その1
“Hello world”と表示させるプログラム
Console.WriteLine(“Hello world”)
コンソールに()内を表示させる命令
(表示後,改行する)
文字列は
” ”で囲む
以下のように書くことでも同じ結果が表示される
Dim s As String
S=“Hello world”
Console.WriteLine(s)
変数sを文字列として宣言
データの読み込み,書き出し
• データをキーボードから読み込む
s = Console.ReadLine()
引数はなし
Consoleクラス
• データをコンソール上に表示する
Console.Write(“文字列の表示”)
表示後,改行
はしない
表示後,改行はしない
Console.WriteLine(“答えはx={0},y={1}”, x, y)
表示後,改行をする
文字の結合
Console.WriteLine(“答えはx=”&x&“,y={1}”&y)
プログラムの例 その2
二つの整数の和,差,積,商,余りを計算するプログラム
Dim m, n, wa, sa, seki, sho, amari As Integer
’値を代入する
m=7
整数型の変数宣言
n=3
値を代入
wa=m+n
sa=m-n
seki=m*n
演算の実行
sho=m\n
amari=m-(m\n)*n
コメント文
文の継続
Console.WriteLine( _
“和={0},差={1},積={2},商={3},余り={4}”, _
wa, sa, seki, sho, amari)
プログラミング演習
• 二つの整数m,nの和,差,積,商,余りを計算する
プログラムにおいて,mおよびnの値をキーボードから
入力する形式に変更してみよ.
• 円の半径rを読み込んで,円周の長さLと
面積Sを計算して表示させるプログラムを作れ.
解答例:m, nの和,差,積,商,余り
Console.Title=“m, nの和,差,積,商,余り”
Dim m, n, wa, sa, seki, sho, amari As Integer
Console.Write(“m=”)
m=Console.ReadLine()
Console.Write(“n=”)
n=Console.ReadLine()
入力に先立って“m=”と
表示させることで,次に
何をすればよいかわかり
やすくなる.
wa=m+n
sa=m-n
seki=m*n
sho=m\n
amari=m-(m\n)*n
Console.WriteLine( _
“和={0},差={1},積={2},商={3},余り={4}”, _
wa, sa, seki, sho, amari)
出力例:m, nの和,差,積,商,余り
解答例:円の円周,面積の計算
Console.Title = "円の円周,面積の計算"
単精度実数型
Dim r, pi, L, S As Single
Console.WriteLine("半径を入力して下さい")
Console.Write("r=")
“WriteLine”と
r = Console.ReadLine()
“ Write”の使い
pi = 3.1415926
L = 2 * pi * r
S = pi * r ^ 2
πの近似値を代入
分けに注意
べきの計算
文字列の途中で改行する方法
Console.WriteLine("円周の値は{0}," _
& "円の面積は{1}", L, S)
出力例:円の円周,面積の計算
プログラミング演習
• 「3時21分50秒から8時17分46秒までは何時間 何分 何秒か」
というように,一般に時分秒の組で表された二つの時刻の
間の時間を計算したい.
H1時M1分S1秒 から H2時M2分S2秒 までの時間
H3時間M3分S3秒を計算して表示させるプログラムを作れ.
経過時間の計算:考え方
• 時分秒の計算は,時刻をすべて秒単位に換算して
計算するのが簡単である.秒への変換は,
3600×(時)+60×(分)+(秒)
とすればよい.
秒単位の大きな数Kから時分秒への換算は,
 Kを3600で割る……………… その商が「時間」
 余りを60で割る……………… その商が「分」
余りが「秒」
各変数を整数型として取り扱うとよい.
プログラム例:経過時間の計算 その1
Console.Title = "経過時間の計算"
Dim H1, M1, S1, H2, M2, S2, H3, M3, S3, _
K, K1, K2, Amari As Integer
Console.WriteLine("初期時間を入力して下さい")
Console.Write("何時?(0-23)")
H1 = Console.ReadLine()
入力できる値の幅
Console.Write("何分?(0-59)")
を明示するとよい
M1 = Console.ReadLine()
Console.Write("何秒?(0-59)")
S1 = Console.ReadLine()
解答例:経過時間の計算 その2
Console.WriteLine("終了時間を入力して下さい")
Console.Write("何時?(0-23)")
H2 = Console.ReadLine()
Console.Write("何分?(0-59)")
入力できる値の幅
M2 = Console.ReadLine()
を明示するとよい
Console.Write("何秒?(0-59)")
S2 = Console.ReadLine()
K1 = 3600 * H1 + 60 * M1 + S1
K2 = 3600 * H2 + 60 * M2 + S2
K = K2 - K1
経過時間を秒で計算
解答例:経過時間の計算 その3
H3 = K \ 3600
Amari = K - H3 * 3600
M3 = Amari \ 60
S3 = Amari - M3 * 60
整数の割り算
Console.WriteLine("経過時間は{0}時間{1}分{2}秒", _
H3, M3, S3)
出力例:経過時間の計算
情報基礎II
(第2回)
月曜4限
担当:北川 晃
判断と飛び越し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
iが10を越えるまで,
以下の命令を繰り返せ.
While i <= 10
sum = sum + i
i = i + 1
End While
変数’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)
大きい値と小さい値:出力例
情報基礎実習I
(第2回)
木曜4・5限
担当:北川 晃
より複雑な条件式の書き方
•
かつ
のとき
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)
出力例:季節の判定
Select Case文
Select Case 条件式
[Case 値リスト1
1. 条件式が評価される.
2. その結果と各Caseの
[文ブロック1]]
値リストが比較される.
[Case 値リスト2
[文ブロック2]]
条件式の書き方の例:
~
• Case 5
~
• Case “Sun” (文字列)
[Case Else
• Case 3, 5, 7
(複数の値)
• Case 2 To 8
(2~8の範囲)
[文ブロックn]]
End Select
(単独の値)
• Case ls < 7 (範囲,不等式)
Select Case 例文
Select Case x
Case Is < 0
xの値がどのケースに
当てはまるかを選ぶ
Text=“負の値です”
Case 0
Text=“0の値です”
Case 1 To 99
Text=“1~99の値です”
Case Else
Text=“100以上の値です”
End Select
End Selectで締めくくる
プログラミング演習
• 1~12の月(month)を入力をしたとき,
 3~5月ならば「春」
 6~8月ならば「夏」
 9~11月ならば「秋」
 12~2月ならば「冬」
と表示させるプログラムを作れ.
考え方:Select Case文を用いてプログラムを書き換えてみよ.
プログラム例:季節の判定
Console.Title = "季節の判定プログラム"
Dim month As Integer, season As String
Console.WriteLine("何月ですか?1~12の整数を入力して下さい.")
month = Console.ReadLine()
Select Case month
Case 3, 4, 5
season = "春"
Case 6, 7, 8
season = "夏"
Case 9, 10, 11
season = "秋"
Case 12, 1, 2
season = "冬"
Case Else
season = "入力エラー"
End Select
Console.WriteLine("{0}月の季節は{1}です.", month, season)
さまざまな組み込み関数
• Math.Sign(-5)→-1
• Math.Sign(0)→0
• Math.Sign(30)→1
• Math.Abs(x):
xの絶対値
• Math.Sign(x):
xの符号
• Int(x):
xを超えない最大の整数
• Fix(x):
xの整数部分
• Math.Sqrt(x):
xの平方根
• Math.Log(x):
xの自然対数
• Math.Exp(x):
xの指数関数
• Math.Sin(x):
xの正弦(ラジアン単位)
• Math.Cos(x):
xの余弦(ラジアン単位)
• Math.Tan(x):
xの正接(ラジアン単位)
• Int(-4.3)→-5
• Int(4.3)→4
• Fix(-4.3)→-4
• Fix(4.3)→4
プログラミング演習
• 三角形の3辺a, b, cを読み込んで,
三角形ができる場合は面積Sを計算せよ.
A
三角形の成立条件
a0
ab  c
かつ
ヘロンの公式
S
b
c
a b  c
B
p  p  a  p  b  p  c 
abc
ただし p 
2
a
C
プログラム例:三角形の面積
Console.Title = "三角形の面積"
Dim a, b, c, p, s As Single
Console.WriteLine("三角形の3辺a,b,cを入力して下さい")
Console.Write("a=")
a = Console.ReadLine()
Console.Write("b=")
b = Console.ReadLine()
Console.Write("c=")
c = Console.ReadLine()
If a = 0 Then GoTo Point1
If Math.Abs(a - b) > c Or a + b <= c Then GoTo Point1
p = (a + b + c) / 2
s = Math.Sqrt(p * (p - a) * (p - b) * (p - c))
Console.WriteLine("三角形の面積はS={0}", s)
GoTo PointEnd
Point1: Console.WriteLine("三角形にならない")
PointEnd:
出力例:三角形の面積
情報基礎II
(第3回)
月曜4限
担当:北川 晃
様々な繰り返しの構文
• 同じ作業を,あらかじめ決まった回数だけ繰り返す
 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)
For……Next文の入れ子構造
For j = 1 To n
For i = 1 To n
文ブロック
Next
Next
右のようなループの
組み合わせは許されない.
文頭でi,jの型を
宣言している場合
繰り返し構造の中に繰り返し
構造を作ることもできる.
“Next i”などと書けば,どの
変数のループかはっきりする
For j = 1 To n
For i = 1 To n
文ブロック
Next j
Next i
例題:フィボナッチ数列
フィボナッチ数列の最初の40項を求めて
出力するプログラムを作れ.
…
フィボナッチ数列:アルゴリズム
1. 求めたい項を’n_new’,ひとつ前の項を’n_last’,
二つ前の項を’n_old’とする.
2. 初期値としてn_old=0,n_last=1を代入し,
第一項と第二項をそれぞれ書き出す.
3. 第三項をn_new=n_old+n_lastにより計算し,書き出す.
4. 次の第四項を求めるために,
n_old=n_last,n_last=n_newの置き換えを行う.
5. この手順を,第40項が求まるまで繰り返す.
フィボナッチ数列:プログラム例
Dim i, num, n_old, n_last, n_new As Integer
num = 40
項の数
n_old = 0
Console.WriteLine("{0}", n_old)
初項
n_last = 1
Console.WriteLine("{0}", n_last)
第二項
i=1~num(=40)
まで繰り返し
For i = 3 To num
n_new = n_last + n_old
増分”Step 1”
Console.WriteLine("{0}", n_new)
n_old = n_last
は省略
n_last = n_new
Next
これらの文を
逆にしてはならない
フィボナッチ数列:出力例
例題:ピタゴラス数
l , m, n すべてを正数としたとき,次の関係
l 2  m2  n2
を満たすような l , m, n の組を見つけて表示せよ.
ただし,l  m  100 とする.
考え方
•
l  m を求め,Fix関数を用いて小数点を切り捨てる.
2
2
• この数を再び二乗し,l  m に一致するか調べる.
2
2
• l  m  100 より,l=1~99,m=l+1~100の数値に対して
For~Next文を用いて調べる.
ピタゴラス数:プログラム例
Dim l, m As Integer
Dim n_sq, n_int As Single
Console.Title = "ピタゴラス数"
ループの
入れ子構造
For l = 1 To 99
nの整数部分
For m = l + 1 To 100
の計算
n_sq = l ^ 2 + m ^ 2
n_int = Fix(Math.Sqrt(n_sq))
nが整数なら,
If n_sq = n_int ^ 2 Then
書き出す
Console.WriteLine( _
"{0,4}^2+{1,4}^2={2,4}^2", l, m, n_int)
End If
“l”を書き出すため
Next
に,
Next
4文字分確保する
ピタゴラス数:出力例
“l”を書き出すため
に,
4文字分確保されている
Whileループを用いた条件分岐
• While……End While文
ある条件によって繰り返しを続けるかどうかを判断するループ
While 条件式
文ブロック
End While
• 条件式が真(True)の間はループを繰り返す.
• 条件が最初から偽(False)の場合は,
ループを1回も実行しない.
While文の例題
Dim sum As Integer = 0, i As Integer
i = 1
iが10以下の間は,
以下の命令を繰り返せ.
While i <= 10
sum = sum + i
i = i + 1
End While
変数’sum’に’i’を加えた
ものを新たな’sum’とする.
Console.WriteLine(“合計は{0}”, sum)
While文の条件式を誤れば,ループが
無限に繰り返されることにもな
る.
Do……Loop文の基本的な表式1
前判定ループ
Do While 条件式
• 条件が「真」の間は,
ループを繰り返す.
文ブロック
• 条件が最初から「偽」の場合
Loop
は,
ループを1回も実行しな
Do Until 条件式
• 条件が「真」になるまで,
い.
文ブロック
ループを繰り返す.
Loop
• 条件が最初から「真」の場合
は,
Do……Loop文の基本的な表式2
後判定ループ
• 条件が「真」の間は,
Do
文ブロック
ループを繰り返す.
Loop While 条件式
文ブロックは条件の「真」,「偽」に関わらず,最低一回は実行され
る.
• 条件が「真」になるまで,
Do
文ブロック
Loop Until 条件式
ループを繰り返す.
情報基礎実習I
(第3回)
木曜4・5限
担当:北川 晃
プログラミング演習
• 非負の整数 n を読み込んで,その階乗
n !  n   n  1 
 2 1
を計算するプログラムを作れ.ただし,
0!  1
とする.
考え方:
• 非負の整数nと整数pを導入する.
• i=1~nについて,繰り返しp=p*iを計算する.
• 最終的なpを書き出す.
階乗の計算:プログラム例
Dim n, p As Integer
Console.Title = "階乗の計算"
整数型では
-2147483648≦p≦214783647
の数しか扱えない
Console.Write("非負の整数nを入力して下さい:n=")
n = Console.ReadLine()
p = 1
pの初期値
nがゼロかどうかで場合分け
If n <> 0 Then
For i As Integer = 1 To n
p = p * i
Next
End If
Console.WriteLine("{0}!={1}", n, p)
階乗の計算:実行例
プログラミング演習
n個のデータx1, x2, …, xnがある.データの個数とデータを
順次読み込んで,それらのデータの最大値と最小値を求めよ.
N=11個のデータ
最大値:9,最小値:1
最大と最小:考え方
1. 第(i-1)番目までのデータについて,
最大値xmaxと最小値xminが分かっているとする.
2. 次に読み込む第 i 番目のデータ xi について,
(i)xi>xmaxのとき,xiが新たな最大値となる.
xmax=xi
(ii)xi≦xmaxのとき,
(ii)-1. xi≧xminのとき,xmax,xminは変わらず.
(ii)-2. xi<xminのとき,xiが新たな最小値となる.
xmin=xi
3. これをすべてのデータについて繰り返す.
最大と最小:アルゴリズム
1. 最初のデータxを読み込む.
2. 最大値と最小値の初期値として,最初のデータを代入
xmax=x, xmin=x
3. 次のデータxを読み込み,xmaxとの大小を判定.
4. xmaxの方が小さければ,xとxminの大小を判定.
5. 必要があればxmaxもしくはxminを
読み込んだデータxで置き換え.
6. これを繰り返し,最後にxmaxとxminを書き出す.
プログラム例:最大値と最小値 その1
Dim xmax, xmin, x As Single, n As Integer
Console.Write("データの個数nを入力して下さい")
n = Console.ReadLine()
Console.Write("1個目のデータxを入力して下さい")
x = Console.ReadLine()
xmax = x
xmin = x
最大の値,最小の値の初期値として,
ともに1個目のデータxを代入する.
プログラム例:最大値と最小値 その2
For i As Integer = 2 To n
Console.Write("{0}個目のデータxを入力して下さい", i)
x = Console.ReadLine()
xが最大値より大きければ,
If x > xmax Then
最大値を置き換える.
xmax = x
xは最大値より小さい.
ElseIf x >= xmin Then
このとき,xの値が最小値より
大きい場合は,何もしない.
Else
xmin = x
それ以外の場合は
End If
最小値を置き換え
Next
る.
Console.WriteLine("最大の値は{0}", xmax)
Console.WriteLine("最小の値は{0}", xmin)
最大値と最小値:実行例
例題:平方根の計算
a=1, 2, …, 50に対して,その平方根
を求め,
表を出力するプログラムを作れ.
: Math.Sqrt(a)
aの平方根の近似値:
補正値:
平方根の計算:アルゴリズム
1. 整数
2. 初期値として,
3. 補正値
について,以下の手順を繰り返す.
roota=1を代入する.
の計算を行う.
4. roota=roota+cにより補正を行う.
5. 補正した値の相対値
を設定した値
と比較して
小さくなるまで補正を繰り返す.
平方根の計算:プログラム例
許容誤差
単精度実数型の限界
Dim a As Integer, eps As Single = 0.000001
Dim roota, c As Single 整数a=1~50に
ついて繰り返す
For a = 1 To 50
√aの初期値
roota = 1
補正値の計算
Do
c = (a / roota - roota) / 2
√aの値を補正
roota = roota + c
Loop Until Math.Abs(c) / roota < eps
Console.WriteLine("√{0}={1}", a, roota)
Next
補正値が許容誤差より
小さくなるまで繰り返す
(後判定ループ)
平方根の計算:出力例
情報基礎実習I
(第4回)
木曜4・5限
担当:北川 晃
例題:4次式の数表(改)
4次式
f  x   1.5 x  0.8 x  6.2 x  0.5 x  2.1
4
について,f
 x
3
2
の値を,0から0.2きざみで5.0までの
xに対して計算し,順に書き出すプログラムを作れ.
xをMath.Sqrt(x)で置き換え
Dim y As Single
For x As Single = 0.0 To 5.0 Step 0.2
y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _
+ 6.2 * x ^ 2 + 0.5 * x + 2.1
Console.WriteLine("{0,8},{1,16}", x, y)
Next
書き換えが煩雑!!関数として定義できないか?
プロシージャとは
• ある一連の処理コードに名前をつけて登録した
下請けプログラムを,プロシージャという.
• 従来の言語では,「関数」あるいは
「サブルーチン」と呼ぶ処理に該当する.
• Functionプロシージャが関数にあたり,呼び出した
コードブロックに,必ず一つの値を返す.
• Subプロシージャがサブルーチンにあたり,
呼び出したコードブロックに値を返さない.
• プロシージャ間のデータの引き渡しは,「引数」で行う.
関数の定義の書式
Sub Main()
…
y1 = プロシージャ名(引数リスト)
…
End Sub
仮引数,「値渡し」と
「参照渡し」がある
Function プロシージャ名(引数リスト) [As 戻り値の型]
文ブロック
Return 戻り値 または プロシージャ名 = 戻り値
End Function
関数の定義の仕方の例(その1)
(主プログラム)
Sub Main()
…
y1=f(x)
…
End Sub
一種の副プログラムであるから,
主プログラムとは別に書
く.
組み込み関数のように
呼び出せる
引数を値渡しの単精度
実数型として宣言
Function f(ByVal x As Single) As Single
Dim y As Single
戻り値の型の宣言
y = x ^ 2 + 2 * x
関数の定義
Return y
End Function
主プログラムへ返す値
(副プログラム)
(戻り値)
関数の定義の仕方の例(その2)
Sub Main()
組み込み関数のように
…
呼び出せる
y1=f(x)
…
省略した場合は
End Sub
(主プログラム)
値渡し
Function f(x) As Single
Dim y As Single
戻り値の型の宣言
If x < 0 Then
y = 0
Else
関数の定義
ステップ
y=1
関数
End If
主プログラムへ返す値
Return y
(戻り値)
End Function (副プログラム)
例題:4次関数の定義
4次式
f  x   1.5 x  0.8 x  6.2 x  0.5 x  2.1
4
について,f
 x
3
2
の値を,0から0.2きざみで5.0までの
xに対して計算し,順に書き出すプログラムを作れ.
考え方:
• 実数xを引数とする実数型の関数
f(x)を定義する.
• xを繰り返し変化させながら,y=f(√x)の値を
順に書き出す.
4次関数の定義:プログラム例
Sub Main()
Dim y As Single
For x As Single = 0.0 To 5.0 Step 0.2
y = f(Math.Sqrt(x))
Console.WriteLine("{0,8},{1,16}", x, y)
Next
End Sub
Function f(x) As Single
Dim y As Single
y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _
+ 6.2 * x ^ 2 + 0.5 * x + 2.1
Return y
End Function
4次関数の定義:出力例
プログラミング演習
• 非負の整数 n に対する階乗 n ! を計算する
関数を定義し,これを用いることで級数

1 1 1 1
   

0! 1! 2!
k 0 k !
1
1

 
 n  1! n !
の値を計算せよ.
考え方:
• 整数nを引数とする実数型の関数
factorial(n)を定義する.
• 与級数は有限の値に収束する.有限項で切って
も,
十分よい近似値が得られる.
級数の計算:プログラム例
Sub Main()
Dim sum As Single = 0
有限で切る項を
十分大きく取る
For i As Integer = 0 To 100
sum = sum + 1 / factorial(i)
Next
関数の呼び出し
Console.WriteLine("級数の値は{0}", sum)
End Sub
Function factorial(n) As Single
Dim p As Single = 1
For i As Integer = 1 To n
p = p * i
Next
Return p
関数として返す値
End Function
大きなnに対して
計算できるよう
に,
実数型で定義
級数の計算:出力例
例題:方程式の根
方程式
は,区間[0,2]において
ただ1つ根があることがわかっている.その根を
2分法によって求めるプログラムを作れ.
•2分法
両端と中点の
符号を調べる
方程式の根:考え方
1. 区間
の中点
を計算する.
2. 区間
と
において,
•
ならば解は左の区間
•
ならば解は右の区間
3. 解がある方の区間において新たな中点を計算し,
判定を行う.
となるまで繰り返し,そのときの
4.
解とする.
を
方程式の根:プログラム例(主プログラム)
Dim eps, x1, x2, xm As Single
eps = 10 ^ -6
単精度実数型の
x1 = 0
精度の限界
x2 = 2
端の値を入力
条件が真の間
While x2 - x1 > eps
は繰り返す
xm = (x1 + x2) / 2
中点の計算
If f(x1) * f(xm) > 0 Then
x1 = xm
解が中点の左右
Else
どちらにあるか判定
x2 = xm
端の点を再定義
End If
End While
解の書き出し
Console.WriteLine("解はx={0}", xm)
方程式の根:プログラム例(関数)
Function f(x) As Single
Dim y As Single
y = x ^ 3 - x - 1
Return y
End Function
関数として返す値
級数の計算:出力例
例題:数値積分(台形公式)
次の関数を
から
プログラムを作れ.
数値積分には台形公式を用いる.
まで積分する
数値積分(台形公式):考え方
台形で近似する
f  xi 
f  xi 1 
Si
ba
h
n
xi  a  i  h
f  xi 1 
h
a
xi 1 h xi
n
S   Si
i 1
b x
f  xi 
h
Si   f  xi 1   f  xi   
2
数値積分(台形公式):プログラム例
Sub Main()
Dim h, a, b, S As Single
区間の分割数
Dim n As Integer = 65536
刻み幅
a = 0 : b = 2 : h = (b - a) / n
複数の文を改行せずに
続ける表記法
S = 0
For i = 1 To n
S = S + (f(a + (i - 1) * h) + f(a + i * h)) * h / 2
Next
i 1
i
f x

f x

Console.WriteLine(“積分値はS={0}", S)
End Sub
Function f(x) As Single
Dim y As Single
y = Math.Sqrt(4 - x ^ 2)
Return y
End Function
f  x  4  x
2
数値積分(台形公式):出力例
数値積分(台形公式):計算結果の精度
分割の数と計算結果
分割数
4
16
64
256
1024
4096
16384
65536
  3.1415926
計算値
誤差(%)
2.995709
4.64361
3.123253
0.5837687
3.139297
0.07308303
3.141305
0.009144868
3.141557
0.001123187
3.141587
0.0001821384
3.141594 -5.312396×10-5
3.141598 -0.0001669602
有効数字の桁数が上げられないか?
精度が悪く
なっている!?
数値積分(台形公式):プログラム例
Sub Main()
Dim h, a, b, S As Double
倍精度実数型
Dim n As Ineger = 65536
a = 0 : b = 2 : h = (b - a) / n
S = 0
For i = 1 To n
S = S + (f(a + (i - 1) * h) + f(a + i * h)) * h / 2
Next
Console.WriteLine("積分値はS={0}", S)
End Sub
倍精度実数型
Function f(x) As Double
倍精度実数型
Dim y As Double
y = Math.Sqrt(4 - x ^ 2)
Return y
倍精度実数型と単精度実数型を
End Function
混在させると,精度は単精度になる
数値積分(台形公式):倍精度での計算結果
分割の数と計算結果
分割数
4
16
64
256
1024
4096
16384
65536
  3.1415926535897931
計算値
2.99570906810244
3.12325303782774
3.13929691277968
3.14130558295723
3.14155676653902
3.14158816760776
3.1415920928389
3.14159258349582
誤差(%)
4.6436
0.58377
0.073076
0.0091377
0.0011423
0.00014279
1.7849×10-5
2.2312×10-6
分割数を大きくするほど,誤差が減っていく
情報基礎II
(第4回)
月曜4限
担当:北川 晃
数値積分(台形公式):改良
Dim a, h As Double
共通で使う変数をMainの外で宣言
Sub Main()
Dim b, S As Double
Dim n As Integer = 65536
Dim rel_error As Double, _
pi As Double = 3.1415926535897931
a = 0 : b = 2 : h = (b - a) / n : S = 0
座標を関数として扱う
For i = 1 To n
S = S + (f(x(i - 1)) + f(x(i))) * h / 2
Next
Console.WriteLine("積分値はS={0}", S)
End Sub
数値積分(台形公式):改良(続き)
Function f(x) As Double
Dim y As Double
y = Math.Sqrt(4 - x ^ 2)
Return y
End Function
Function x(i)
Dim x_i As Double
x_i = a + i * h
座標xをiの関数として定義
Return x_i
End Function
このFunctionプロシージャ
内部でaやhが定義されて
いないことに注意
例題:最大値と最小値 (改)
n個のデータx1, x2, …, xnがある.データの個数とデータを
順次読み込んで,それらのデータの最大値と最小値を求めよ.
N=100個のデータ
100個のデータ,すべて手で打ち込むの?
外部データファイルからの読み込み
データの個数
データ
の数列
Streamクラスを用いたファイルの接続
外部ファイルから変数’s’にデータを読み込む場合
プログラム中における
ファイルの名前
…
Dim インスタンス名 As New IO.StreamReader( _
“ファイルの絶対パス”, _
System.Text.Encoding.Default)
…
ReadToEnd:ファイルの内容すべてを取得
s = インスタンス名. ReadLine:ファイルから1行読み込む
Read :ファイルから1文字読み込む
…
インスタンス名.Close()
ファイルを閉じる
外部ファイルからのデータの読み込み:例文
Dim a, b, c As Single
Dim ReadText As New IO.StreamReader( _
“D:\read_test\data.txt”, _
1行ずつ
System.Text.Encoding.Default)
読み込み
ファイル名”data.txt”として
a = ReadText.ReadLine
“D:\read_test\”に保存
b = ReadText.ReadLine
c = ReadText.ReadLine
3.141592656
Console.WriteLine(“a={0}”,a) 2.718281828
Console.WriteLine(“b={0}”,b) 1
Console.WriteLine(“c={0}”,c)
ReadText.Close()
ファイル
を閉じる
外部ファイルからのデータの読み込み:出力例
プログラム例:最大値と最小値(改)その1
Dim xmax, xmin, x As Single, n As Integer
Dim ReadText As New IO.StreamReader( _
外部ファイル
"D:\...\max_min_data.txt", _
の指定
System.Text.Encoding.Default)
n = ReadText.ReadLine()
x = ReadText.ReadLine()
xmax = x
xmin = x
外部ファイル
から読み込み
最大の値,最小の値の初期値として,
ともに1個目のデータxを代入する.
プログラム例:最大値と最小値(改)その2
For i As Integer = 2 To n
x = ReadText.ReadLine()
外部ファイル
から読み込み
If x > xmax Then
xが最大値より大きければ,
xmax = x
最大値を置き換える.
ElseIf x >= xmin Then
xは最大値より小さい.
このとき,xの値が最小値より
Else
大きい場合は,何もしない.
xmin = x
End If
それ以外の場合は
Next
最小値を置き換える.
Console.WriteLine("最大の値は{0}", xmax)
Console.WriteLine("最小の値は{0}", xmin)
ReadText.Close()
開いたファイルは閉じておく
最大値と最小値(改):出力例
Streamクラスを用いたファイルの接続
外部ファイルにデータを書き込む場合
プログラム中における
ファイルの名前
…
Dim インスタンス名 As New IO.StreamWriter( _
“ファイルの絶対パス”, _
[True または False], [文字コードの指定])
…
インスタンス名.
‘True’のときは追記
WriteLine:ファイルに書き込む(改行)
Write :ファイルに書き込む(改行無し)
…
インスタンス名.Close()
ファイルを閉じる
外部ファイルへのデータの書き出し:例文
Writerとして,ファイル
“D:\...\result.txt”を接続
Dim Writer As New IO.StreamWriter( _
"D:\...\result.txt")
Dim x As Single = 3, y As Single
‘True’と書かれていないので,
y = Math.Sqrt(x)
ファイルは上書きされる
Writer.Write(y)
‘y’の値を,Writerとして
接続したファイルに書き込む
Writer.Close()
ファイルを閉じる
情報基礎実習I
(第5回)
木曜4・5限
担当:北川 晃
例題:関数のグラフの作成
区間 x0  x  x0  1 において,正弦関数の
グラフを作成せよ.
考え方:
• x0をキーボードから読み込み,x=x0から0.1刻みで
x=x0+1まで変化させる.
• それぞれのxについて,y=Math.Sin(x)を計算する.
• x,yの組をCSV (Comma Separated Value) 形式で
ファイルに書き出す⇒Excelで読み込み
CSV形式のファイル
• テキストエディタで開くと…
• Excelで開くと…
三角関数のグラフ:プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x0, x, y As Single
Dim Writer As New IO.StreamWriter( _
"D:\...\result.csv",True)
ファイルがある場合は追記
Console.Write("初期値x0を入力してください:x0=")
x0 = Console.ReadLine()
For x = x0 To x0 + 1.0 Step 0.1 Writerとして接続した
ファイルに書き込む
y = Math.Sin(x)
Writer.WriteLine(" {0,10}, {1,10}", x, y)
Next
コンマで区切る
ファイルを閉じる
完了を知らせる出力
Writer.Close()
Console.WriteLine("ファイル書き込み完了しました.")
三角関数のグラフ:出力例
追記されている
三角関数のグラフ:出力例(続き)
データの列を選択
三角関数のグラフ:出力例(続き)
プログラミング演習
区間 0  x  10 において,正弦関数 y  sin x
およびその導関数,2階導関数のグラフを作成せよ.
考え方:
• オイラーの差分公式を用いる. y ⇒ f  x   sin x
df  x  f  x  h   f  x 

dy ⇒
dx
h
d 2 f  x f  x  h  2 f  x  f  x  h

d2y ⇒
2
dx
h2
• x, y, dy, d2yの各値を,CSV形式で
外部ファイルに書き出す.
三角関数の導関数:出力例
三角関数の導関数:プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x, y, dy, d2y, h As Single
Dim Writer As New IO.StreamWriter("D:\...\result.csv")
h = 0.01
微小量を定める
For x = 0 To 10 Step 0.1
導関数の計算
y = Math.Sin(x)
dy = (Math.Sin(x + h) - Math.Sin(x)) / h
d2y = (Math.Sin(x + h) - 2 * Math.Sin(x) _
+ Math.Sin(x - h)) / h ^ 2
Writer.WriteLine("{0,10},{1,10},{2,10},{3,10}", _
x, y, dy, d2y)
コンマで区切る
Next
Console.WriteLine("ファイルの書き込み終了しました.")
Writer.Close()
ファイルを閉じる
完了を知らせる出力
プログラミング演習
次の微分方程式の初期値問題をオイラー法により数値的に解け.
dy
y  x  0, y  0   2
dx
 0  x  2
考え方:
• オイラーの差分公式を利用する.
dy
 f  x, y 
dx
⇒
yi  yi 1  hf  x, yi 1 
• 0  x  2 について,繰り返し計算を行う.
• x=0のとき, yi 1=y0=2として, yi =yを計算する.
• xとyを書き出し,y0=yと置き直して
次のxについて計算を続ける.
微分方程式(オイラー法):出力例
微分方程式(オイラー法):プログラム例
Writerとして,ファイル
“D:\...\result.csv”を接続
Dim x, y, y0, h As Single
Dim Writer As New IO.StreamWriter("D:\...\result.csv")
h = 0.01 : y0 = 2
刻み幅,初期値の設定
Writerとして接続した
For x = 0 To 2 Step h
ファイルに書き込む
y = y0 + h * f(x, y0)
Writer.WriteLine("{0,10}, {1,10}", x, y)
y0 = y
コンマで区切る
Next
次の計算のための置き直し
Console.WriteLine("ファイルの書き込み終了しました.")
Writer.Close()
ファイルを閉じる
完了を知らせる出力
微分方程式(オイラー法):プログラム例(続き)
Function f(x, y0)
Dim y As Single
y = -x / y0
Return y
End Function
関数プロシージャ部分
情報基礎II
(第5回)
月曜4限
担当:北川 晃
プログラミング演習
ニュートン法により,方程式
根を計算し表示するプログラムを作れ.
•ニュートン法
接線と 軸の交点を
求め,次の接線を引く.
ニュートン法:考え方
•
•
を通る接線:
軸との交点
この操作を一定の
精度まで繰り返す.
:
ニュートン法:アルゴリズム
•
x0 , x  1,   106 を定義する
•
以下の操作を繰り返し行う
 x0  x を代入
f  x0 
 x  x0 
により,次の座標を計算
f   x0 
 x, f  x  の値を書き出す
x  x0

  となるまで繰り返す
x0
• 最終的な x を書き出す
• 関数プロシージャで, f  x  , f   x  を定義する
ニュートン法:出力例
二分法よりも
収束が速い
ニュートン法:プログラム例
Sub Main()
Console.Title = "ニュートン法による求根"
Dim x As Single = 1, x0 As Single
Dim eps As Single = 10 ^ -6
Do
x0 = x
x = x0 - f(x0) / df(x0)
Console.WriteLine("{0,10},
{1,10}", x, f(x))
Loop Until Math.Abs((x - x0) / x0) < eps
Console.WriteLine("解はx={0}", x)
End Sub
条件を満たす
まで繰り返し
ニュートン法:プログラム例
Function f(x)
Dim y As Single
y = x - Math.Cos(x)
Return y
End Function
Function df(x)
Dim dy As Single
dy = 1 + Math.Sin(x)
Return dy
End Function
導関数の定義
(手で計算して与える)
配列とは?
表を一つの変数のように扱う
•一次元の配列:
→ a(i)
•二次元の配列:
→ b(i,j)
ベクトル
行列
配列の表記法
配列内の個々のデータ(配列要素)は,
配列名に添え字を付けて表す.
•alpha(16)
•n(5,1)
•p(i,j)
•b(i+1)
•x(2*n-1)
•k(l(m))
配列の引数には,
整数型の式,関数
なども許される
配列の宣言
二次元,整数型
の配列の宣言
b(0,0)~b(0,8)
b(1,0)~b(1,8)
…
b(8,0)~b(8,8)
Dim a(10) As Single
Dim b(8,8) As Integer
Dim c(3,5) As String
一次元,
単精度整数型
の配列の宣言
a(0)~a(10)
• 配列の番号は0から始まる
• 使わない要素は0と見なされるだけなので,
少し余裕を見て大きめに宣言するとよい
配列の操作
•配列Aの内容をBにコピーする(下限1,上限N).
For i As Integer = 1 To n
b(i)=a(i)
Next
•行列A,Bの和を作ってCに代入する(M行N列とする).
For i as Integer = 1 To m
For j As Integer = 1 To n
c(i,j) = a(i,j) + b(i,j)
Next j
Next i
例題:九九の表
九九の表を書き出すプログラムを作れ.
1
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
九九の表:プログラム例
行ごとに
改行する
九九の表:プログラム例
Console.Title = "九九の表"
Dim i, j, kuku(9, 9) As Integer
For j = 1 To 9
For i = 1 To 9
kuku(i, j) = i * j
表の右端で改行する
If i <> 9 Then
Console.Write("{0,4}", kuku(i, j))
Else
Console.WriteLine("{0,4}", kuku(i, j))
End If
Next
Next
ベクトルの内積
•ベクトルAとベクトルBの内積を計算する(下限1,上限N).
s = 0.0
For i As Integer = 1 To n
s = s + a(i) * b(i)
Next
行列の積の成分計算
•行列Aと行列Bの積を計算する(下限1,上限N).
第(i,j)成分は・・・
s = 0.0
For k As Integer = 1 To N
s = s+a(i,k)*b(k,j)
Next k
情報基礎実習I
(第6回)
木曜4・5限
担当:北川 晃
プログラミング演習
3×3の正方行列A,Bを外部ファイルからデータとして
読み込み,その積C=ABを計算するプログラムを作れ.
 2 1 4 


A   0 3 2 
 2 1 1 


data_a.txt
-2
1
4
0
3
-2
2
-1
1
 1 2 3 


B   3 0 2 
 0 1 5 


data_b.txt
1
2
-3
-3
0
2
0
-1
5
行列の積:出力例
行ごとに
改行する
行列の積:プログラム例
Dim ReadText1 As New IO.StreamReader( _
"D:\...\data_a.txt", System.Text.Encoding.Default)
Dim ReadText2 As New IO.StreamReader( _
"D:\...\data_b.txt", System.Text.Encoding.Default)
Dim n As Integer = 3
Dim a(10, 10), b(10, 10), c(10, 10) As Single
二つの外部
For i As Integer = 1 To n
ファイルを接続
For j As Integer = 1 To n
a(i, j) = ReadText1.ReadLine()
配列の宣言
b(i, j) = ReadText2.ReadLine() (サイズは大きめに)
Next
行列データの
Next
読み込み
ReadText1.Close()
ReadText2.Close()
ファイルを閉じる
行列の積:プログラム例(続き)
For i As Integer = 1 To n
For j As Integer = 1 To n
積の(i,j)成分の計算
c(i, j) = 0.0
For k As Integer = 1 To n
c(i, j) = c(i, j) + a(i, k) * b(k, j)
Next
行の右端で改行する
If j <> n Then
Console.Write("{0,10}", c(i, j))
Else
Console.WriteLine("{0,10}", c(i, j))
End If
Next
Next
CSV形式のファイルからのデータ読み込み
data.csv
1,
2,
3,
4,
5,
10
20
30
40
50
a(1,0)=1,
a(2,0)=2,
a(3,0)=3,
a(4,0)=4,
a(5,0)=5,
a(1,1)=10
a(2,1)=20
a(3,1)=30
a(4,1)=40
a(5,1)=50
CSV形式からのデータ読み込み:プログラム例
Dim ReadText As New IO.StreamReader( _
"D:\...\data.csv", System.Text.Encoding.Default)
データ1行を文字列のs
Dim s, items(10) As String
へ,分割して配列の
Dim a(10, 10) As Single
For i As Integer = 1 To 5
s = ReadText.ReadLine()
items = Split(s, ",")
For j As Integer = 0 To 1
a(i, j) = CSng(items(j))
Next j
items()へ
データを格納する配列
sをコンマの位置で区切る
文字列から
単精度実数型へ
Console.WriteLine("a({0},0)={1,4}, a({0},1)={2,4}", _
i, a(i, 0), a(i, 1))
Next i
ReadText.Close()
データの型の変更
• Cint(x): xを整数型へ変換
• CStr(x): xを文字列へ変換
• CSng(x): xを単精度実数型へ変換
• CDbl(x): xを倍精度実数型へ変換
• CBool(x): xを論理型へ変換
Subプロシージャとは
• 主プログラムの一部を外部の副プログラムに移す
• 繰り返し同じ記述をする場合などに有効
• Functionプロシージャとは異なり,
主プログラムに値は返さない
• 主プログラムと変数のやりとりをすることもできる
Mainプログラムも,
プログラムで
Sub Main()
Subプロシージャの一つ
共有する変数は,
…
Mainよりも外で
プロシージャ名(変数)
…
宣言する
End Sub
Sub プロシージャ名(変数)
値は返さないので,
文ブロック
“Return *”はいらない
End Sub
Subプロシージャの例
Sub Main()
For i As Integer = 1 To 20
If i - (i \ 3) * 3 = 0 Then
fizz(i)
‘fizz’という名の
Else
Subプロシージャ
Console.WriteLine(i)
を呼び出す
End If
Next
End Sub
iの値と,’Fizz’と
書き出すプログラム
Sub fizz(i)
Console.WriteLine("{0} Fizz", i)
End Sub
Subプロシージャの例:出力例
情報基礎実習I
(第7回)
木曜4・5限
担当:北川 晃
データの統計処理に関する諸問題
• データの分布の様子
• データの期待値(平均値)
• データの分散,標準偏差(ばらつきの度合い)
• 回帰直線へのフィッティング(最小二乗法)
• 一様乱数の発生
• 正規乱数への変換
• モンテカルロシミュレーション
平均値と標準偏差
n個のデータx1, x2, …, xnが与えられている.
データを逐次読み込んで,その平均値と
標準偏差を求めよ.
平均値:
標準偏差:
平均値と標準偏差:具体例
(i) N≧2のとき
:平均値
:標準偏差
平均値と標準偏差:具体例(続き)
(ii) N=1のとき
:平均値
ばらつきゼロ
(標本は一つなので当然)
(iii) N=0のとき
数値がありません!
プログラミング演習
• 外部データ’normal_data.txt’よりデータ点数および
各データを読み込んで,それらの平均値を計算す
るプログラムを作れ.
• 上記のプログラムをSubプロシージャに書き直し,平
均値と標準偏差を計算するプログラムを作れ.
出力例:平均値の計算
プログラム例:平均値の計算
Dim a(100), ave As Single, s As Single = 0, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
データ点数の
読み込み
データを配列
へ読み込む
For i As Integer = 1 To n
データの和の計算
s = s + a(i)
Next
ave = s / n
平均値の計算
Console.WriteLine("平均はE={0,8}", ave)
ReadText.Close()
標準偏差の計算:考え方
• 平均値の計算のプログラムより,データの和,
平均値の計算,平均値の書き出しの部分を
Subプロシージャとして,分離する.
• 配列’a()’,変数’ave’はSubプロシージャでも用いるので,
共通の変数として宣言する.
• その他,Main()で用いる変数,Subプロシージャで
用いる変数などを整理する.
• 標準偏差の計算部分を加える.
出力例:標準偏差の計算
プログラム例:標準偏差の計算
Dim a(100), ave As Single
Sub Main()
Dim var, sd As Single, s2 As Single = 0, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
データ点数の
読み込み
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
データを配列
へ読み込む
average(n)
平均値の計算
For i As Integer =
s2 = s2 + a(i)
Next
var = s2 - n * ave
sd = Math.Sqrt(var
1 To n
^ 2
二乗の和の計算
^ 2
/ n)
標準偏差の計算
プログラム例:標準偏差の計算(続き)
Console.WriteLine("標準偏差は{0,8}", sd)
標準偏差の
書き出し
ReadText.Close()
End Sub
Sub average(n)
Dim s As Single = 0
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
データの和の計算
平均値の計算
Console.WriteLine("平均はE={0,8}", ave)
End Sub
平均値の書き出し
情報基礎II
(第7回)
月曜4限
担当:北川 晃
例題:平均値を求める関数副プログラム
データ点数nとa(i) (i=1,…,n)を引数として,それらの
平均値を返す関数副プログラムを作れ.
関数プロシージャの引数には,配列を取ることも可能.
配列
Sub Main()
Dim a(10), ave As Single, n As Integer
…
ave = average(n,a)
…
End Sub
配列
Function average(n,a)
…
Return ave0
配列
End Function
平均値を求める関数副プログラム:プログラム例
Sub Main()
Dim a(10000), ave As Single, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
ReadText.Close()
ave = average(n, a)
Console.WriteLine("平均はE={0,8}", ave)
End Sub
平均値を求める関数副プログラム:プログラム例
Function average(n, a)
Dim s As Single = 0, ave As Single
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
Return ave
End Function
関数副プロシージャで,
以下のものは宣言不要
• 共通に宣言した変数
• 関数の仮引数
最小二乗法による直線の推定
n個のデータの真ん中を通るように
直線を引きたい
y
y  ax  b
傾きa, 切片bはいくらにすればよいか?
回帰直線
 xi , yi 
i番目のデータと直線とのズレをεiとする.
yi  axi  b   i
x
E      yi  axi  b 
2
i
i
2
i
の値を最小にするようなa, bを決める
最小二乗法による直線の推定(つづき)
E
 2  yi  axi  b   xi   0
a
i


2
2
x
y

a
x

b
x

n
xy

ax
 bx  0
ii i i
i
i
i
E
 2  yi  axi  b  1  0
b
i
 y  a x  b  n  y  ax  nb   0
i
i
i
i
上の条件式をa, bについて解く
a
xy  x  y
x x
2
2
b  y  ax
x 2 :二乗の平均
2
x :平均の二乗
最小二乗法の計算
x
y
xy
xy
1.2
2.2
2.1
3.8
3.3
5.6
4.1
7.1
5.0
8.8
a
xy  x  y
x x
2
2
x2
x2
b  y  ax
x
y
情報基礎実習I
(第8回)
木曜4・5限
担当:北川 晃
プログラミング演習
‘least_square_data.csv’より,データの点数nと,(xi,yi) (i=1,…,n)
を読み込んで,最小二乗法よりその回帰直線y=ax+bを求めよ.
n
x
n
x
i 1
i
xy 
n
n
y
x y
i
i 1
i
n
n
 yi
x2 
i 1
n
2
x
i
i 1
n
配列a(i)と,要素数nを引数として,
平均値’ave’を返す関数を用いる
a
xy  x  y
x x
2
2
b  y  ax
least_square_data.csv
5
1.2,
2.1,
3.3,
4.1,
5.0,
2.2
3.8
5.6
7.1
8.8
最小二乗法による回帰直線:出力例
データには有効数字
二桁分しか信頼性がない
最小二乗法による回帰直線:プログラム例
Sub Main()
Dim n As Integer, s, items(10) As String, a, b As Single
Dim x(10), x2(10), y(10), xy(10), x_a, y_a, x2_a, xy_a As Single
Dim ReadText As New IO.StreamReader( _
"D:\…\least_square_data.csv", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
s = ReadText.ReadLine()
items = Split(s, ",")
x(i) = CSng(items(0))
y(i) = CSng(items(1))
x2(i) = x(i) ^ 2
xy(i) = x(i) * y(i)
Next
ReadText.Close()
• xi2
• xiyi
の計算
最小二乗法による回帰直線:プログラム例
x_a = average(n, x)
y_a = average(n, y)
xy_a = average(n, xy)
x2_a = average(n, x2)
それぞれの
平均値の計算
a = (xy_a - x_a * y_a) / (x2_a - x_a ^ 2)
傾き,切片の計算
b = y_a - a * x_a
Console.WriteLine("回帰直線は,y={0}x+{1}", a, b)
End Sub
Function average(n, a)
Dim s As Single = 0, ave As Single
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
Return ave
End Function
乱数とは?
サイコロを振って出る目の数のように,予測はできないが,
ある確率法則に従うでたらめな数.
 一様乱数
 正規乱数
 ポアッソン乱数
乱数の利用:
1. 自然科学および社会科学の問題のシミュレーション
2. 暗号の秘密鍵生成
乱数の発生方法
1. サイコロを振る.
例:
6
4
6
4
3
4
3
2
3
5
4
3
1
2
2
2
4
6
2
1
5
6
3
5
3
4
4
1
2
6
1
6
2. 自然現象を利用する(電子管のノイズ,放射性崩壊など)
3. 一つ前の値から次の値を計算する乱数列を生成する
(擬似乱数).
混合型合同法(擬似一様乱数列の生成法)
(μを法として合同)
疑似乱数列の特徴
•生来の乱数ではないので(初期値を与えている),
同じ条件で計算すれば,再現性がある.
•周期がある.少なくとも
回後には,同じ数列が現れる.
を大きくとる.
16ビットの乱数列だと・・・
  2  32768
15
(計算機で使える最大の数を使うとよい)
例題:疑似乱数列の発生
混合型合同法を用いて,乱数の初期値より,
擬似乱数列を生成するプログラムを作れ.
考え方:
1. 初期値
2.
を読み込む.
を計算し, で割ったあまりを計算する.
3. あまりを次の乱数として,
とおく.
4. さらに次の乱数を計算する.
  2 ,   12869, c  6925
15
疑似乱数列の発生:出力例
疑似乱数列の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Dim x, lambda, c As Integer
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
x = Console.ReadLine()
lambda = 12869
c = 6925
For i As Integer = 1 To 20
x = (lambda * x + c) Mod mu
Console.WriteLine("{0,8}", x)
Next
プログラミング演習
疑似乱数列を発生させるプログラムを用いて,
六面サイコロの出目を生成するプログラムを作れ.
考え方
• 混合型合同法では,0≦x<μの乱数が得られる.
• 得られた乱数をμで割れば,[0,1)の乱数が得られる.
• [0,1)の規格化乱数が得られれば,これに(b-a)
をかけてaを加えることで,[a,b)の乱数が得られる.
• 実数で得られる乱数列を整数化する.
サイコロの出目:出力例
サイコロの出目の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Sub Main()
Console.Title = "乱数の発生"
Dim x, x_dice As Integer, n As Integer = 100
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
一様乱数を生成する関数
x = Console.ReadLine()
For i As Integer = 1 To n
x_dice = Fix(6 * uni_rnd(x) / mu + 1)
If i Mod 10 <> 0 Then
Console.Write("{0,5}", x_dice)
1≦x<7の
Else
Console.WriteLine("{0,5}", x_dice) 実数列を生成
End If
x = uni_rnd(x)
Next
xを次の値に置き直す
End Sub
サイコロの出目の発生:プログラム例(つづき)
Function uni_rnd(x) As Single
Dim lambda, c As Integer
lambda = 12869
c = 6925
x = (lambda * x + c) Mod mu
Return x
End Function
一様乱数を計算する
関数副プログラム
情報基礎II
(第8回)
月曜4限
担当:北川 晃
プログラミング演習
y
1
-1≦x<1,-1≦y<1の
範囲に無作為にn個の点を打ち,
そのうち単位円内部にある点の
1
O
数をncとする.nc/nの値を計算せよ.
モンテカルロ法
考え方:
• 領域は対称なので,第一象限だけを考えればよい.
• 乱数により各点を計算し,x2+y2≦1ならばncを1だけ増やす.
• 各領域に点が打たれる頻度が,面積に比例するので…
x
モンテカルロ法:プログラム例(つづき)
Dim mu As Integer = 2 ^ 15
Sub Main()
Console.Title = "モンテカルロ法による円周率の計算"
Dim c, n, x, y As Integer
Console.WriteLine("繰り返し回数nを入力してください")
Console.Write("n=")
n = Console.ReadLine()
x = 0
y = 2000
c = 0
初期値は固定した
円の中にある数のカウンター
座標の計算
For i As Integer = 1 To n
x = uni_rnd(x)
y = uni_rnd(y)
If (x / mu) ^ 2 + (y / mu) ^ 2 <= 1 Then c = c + 1
Next
座標が円の中にあるか判定
モンテカルロ法:プログラム例(つづき)
Console.WriteLine("π={0}", 4 * c / n)
End Sub
Function uni_rnd(x) As Single
Dim lambda, c As Integer
lambda = 12869
c = 6925
x = (lambda * x + c) Mod mu
Return x
End Function
計算値の書き出し
モンテカルロ法:出力例
論理型変数
•「真」もしくは「偽」に関する情報処理を扱う.
•処理規則は論理代数(ブール代数)に従う.
•論理定数:真を’True’で,偽を’False’で表し,
これ以外の値は取らない.
論理演算子
• a = True
• b = False
• c = a And b
• d = Not b
•
•
•
•
•
Not
And
Or
=
<>
(
(
(
(
(
)
)
)
)
 )
:否定
:論理積
:論理和
:論理等価
:論理非等価
論理演算子
書き方
結果が真になるための条件
Not X
X And Y
X Or Y
X = Y
X <> Y
Xが真でない
X,Yが共に真
X,Yの少なくとも一方が真
XとYが共に真,または共に偽
XとYの内の一方が真で,他方が偽
上記以外のときは,結果が偽
例題:論理代数による演算処理
Dim a, b, c, d, e, f, g, h As Boolean
a = True
b = False
aに「真」を,bに
「偽」を代入する
c = a
d = Not a
cにaの値を,
dにbの否定を代入する
e
f
g
h
=
=
=
=
a
a
a
a
And b
Or b
= b
<> b
g = (a = b)と書いてもよい
一つ目の“=”は「代入」を,
二つ目は「論理等価」を
表していることに注意
Console.WriteLine("a={0,6}",
Console.WriteLine("c={0,6}",
Console.WriteLine("e={0,6}",
Console.WriteLine("g={0,6}",
a)
c)
e)
g)
:
:
:
:
C:
D:
E:
真
偽
偽
F:
真
G:
偽
H:
真
Console.WriteLine("b={0,6}",
Console.WriteLine("d={0,6}",
Console.WriteLine("f={0,6}",
Console.WriteLine("h={0,6}",
b)
d)
f)
h)
論理代数による演算処理:出力例
A:
B:
C:
D:
E:
真
偽
真
偽
偽
F:
真
G:
偽
H:
真
例題:真理値表
論理式
a  b  c 
の真理値表を与えるプログラムを作れ.
真理値表:
変数の取り得るすべての値の組み合わせに対し,
論理式がとる値を表にしたもの.
例:a∧bの真理値表
a
b
ab
真
真
偽
偽
真
偽
真
偽
真
偽
偽
偽
真理値表:出力例
要素の数を
指定しない
真理値表:プログラム例
Dim v() As Boolean = {True, False}
配列に初期値を
代入する場合
Console.WriteLine("
a
b
c result")
Console.WriteLine("------------------------------------")
For i As Integer = 0 To 1
For j As Integer = 0 To 1
For k As Integer = 0 To 1
Console.WriteLine(" {0,8} {1,8} {2,8} {3,8}", _
v(i), v(j), v(k), v(i) And Not (v(j) Or v(k)))
Next
Next
a bc
a, b, c
Next


情報基礎実習I
(第9回)
木曜4・5限
担当:北川 晃
例題:エラトステネスのふるい
n までの素数を求めて出力するプログラムを作れ.
アルゴリズム:エラトステネスのふるい
•2の倍数(2自身を除く)に全部印をつける.
•3の倍数(3自身を除く)に全部印をつける.
•5の倍数(5自身を除く)に全部印をつける.
•…
• n まで全部の倍数に印をつけたとき,
印がつかないで残っている数は,
どの数の倍数でもないから素数である.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17…
エラトステネスのふるい:アルゴリズム
• 上限となる整数nを読み込む.
• i=3以上の奇数について調べる.
• c(i)という配列(印をつけるのに用いる)のすべての
成分に,「真」を代入する.
• エラトステネスのふるいの方法で,
各整数の倍数に印をつける.
• 印なしを「真」,印ありを「偽」として区別する.
• ふるいをかける整数の最初の値を,
配列成分p(m)に代入する.
• これをnまで繰り返し,最後に配列p(m)を書き出す.
エラトステネスのふるい:出力例
エラトステネスのふるい:プログラム例
Console.Title = "nまでの素数の探索"
Dim c(10000) As Boolean
Dim i, j, m, n, p(10000) As Integer, l As Integer = 1
Console.WriteLine("上限となる値を入力して下さい")
Console.Write("n=")
n = Console.ReadLine()
'c(i)は素数かどうかのチェック(=Trueは素数,=Falseは素数でない)
'mは素数列の項番号
'素数列の初項
m = 1
p(m) = 2
'3以上の奇数について,すべてに一旦,素数のチェックを入れる(True)
For i = 3 To n Step 2
c(i) = True
Next
エラトステネスのふるい:プログラム例(つづき)
For i = 3 To n Step 2
‘iのチェック(c(i))が入っていない(True)場合
If c(i) = True Then
‘素数の項数mを1増やし,iを素数としてp(m)に書き出す.
m = m + 1
p(m) = i
'iとそれ以降の倍数のチェック(c(i))を入れる(False)
For j = i To n Step i
c(j) = False
Next
End If
Next
For i = 1 To m
If (i = m) Or (i Mod 10 = 0) Then
Console.WriteLine("{0,5}", p(i))
Else
Console.Write("{0,5}", p(i))
End If
Next
情報基礎II
(第9回)
月曜4限
担当:北川 晃
Visual Studio用語の整理
• プロジェクト(project):フォームやプログラムなどを含む
1つのアプリケーション全体.プロジェクトごとに
プログラムを作成して保存する.
• ソリューション(solution):1つまたは複数のプロジェクトと
それ全体を含むもの.ソリューションには,C#など
VSの他の言語のプロジェクトを含むことができる.
• フォーム(form):Windows上でアプリケーションを表示する
元になる設計用のウィンドウで,表示されるアプリケー
ションのデザインは,このフォーム上で設計する.
Visual Studio用語の整理(つづき)
• プロパティ(property):フォームやコントロールの種々の属性の
こと.プロパティウィンドウを開いて設定するか,コードを
用いて設定する.
• コントロール(control):フォーム上に配置するボタンやテキスト
などの部品(ツール).各種コントロールは式画面の
左側のツールボックスから選択してフォーム上に配置する.
• オブジェクト(object):プロジェクトを構成するフォームや
コントロールなど動作(イベント)の対象となるものの総称.
コードだけでなくオブジェクトを使ってプログラムを作成する
言語(Visual Basicなど)をオブジェクト指向言語という.
Visual Studio用語の整理(つづき)
• イベント(event):ユーザーがフォームやコントロールなど各種の
オブジェクトに対し行う動作(例:マウスでボタンをクリック).
• メソッド(method):ユーザーがフォームやコントロールなど各種の
オブジェクトを操作する命令.
• コード(code):予約語などを使って記述する狭義のプログラムの
こと.コードを作成することをコーディングという.
• プロシージャー(procedure):各オブジェクトについてのコードを
記述した一連の処理のまとまりのこと(例:Private Subから
End Subまでの範囲)
Windowsフォームアプリの作成
例題:文字の表示
フォームに,「今日はよいお天気ですね」と
表示するプログラムを作成せよ.
フォームのタイトルの入力
‘Form1’が「文字の表示」に変わる
Textの項,「文字の表示」に書き換え
ラベルの設置
もう一度「ツールボックス」を
クリックすると,メニューが閉じる
文字列の設定
適当な位置に貼り付け
Textの項,「今日はよいお天気ですね」に書き換え
Windowsフォームアプリの実行
Windowsフォームアプリの保存
ツールボックスの再表示
「ツールボックス」
が消えた場合
例題:文字の表示と変更
先の例題を,文字をラベルの中央に,背景色を白,
枠を実線,文字色を赤,字体をメイリオで太字,14ptに
変更し,次のように表示せよ.
ラベルのプロパティ
ラベルの上
で右クリック
テキストの
位置の調整
フォントの変更
ウィンドウのサイズを,
マウスで適当に調節する
フォントの
変更
文字列の枠の設定
文字列の
枠線の設定
文字列背景の色の設定
文字列の
背景色の設定
文字の色の設定
文字列の
フォント色の設定
例題:コードによる文字の表示
日本語をクリックすると「おはよう!」と,英語をクリック
すると”Good Morning!”と表示するプログラムを作れ.
2つのラベルの貼り付け
二つのラベルを貼り付け,
それぞれ「日本語」,「英語」と書き換え
ラベル1のコードの入力
「日本語」を
ダブルクリック
ラベル1の動作の設定
コードエディタが開く
Label1.Text = "おはよう!"
Label1.ForeColor = Color.Red
Label1.BackColor = Color.Gold
Label1.BorderStyle = BorderStyle.Fixed3D
Label1.TextAlign = ContentAlignment.MiddleCenter
ラベル2のコードの入力
「英語」を
ダブルクリック
ラベル2の動作の設定
Label2.Text = “Good Morning!"
Label2.ForeColor = Color.Blue
Label2.BackColor = Color.Cyan
Label2.BorderStyle = BorderStyle.Fixed3D
Label2.TextAlign = ContentAlignment.MiddleCenter
アプリケーションの実行
例題:金額の計算
品物の単価と数量をキーボードから入力し,その金額
を表示するフォームアプリを作成せよ.
Label,Textboxの貼り付け
Label1~3を
貼り付け
ツールボックスより,
Textbox1~3を貼り付け
Label,Textboxの設定
それぞれ「単価」,
「数量」,「金額」と
書き換え,太字に
変更
Textを太字,
TextAlignを
”Left”に変更
Buttonの配置
ツールボックスより,
Button1を貼り付け
Buttonの設定
「計算」と書き換え,
太字に変更
ボタンを
ダブルクリックする
Buttonの設定
Val()は,括弧内の文字列を
数値に変換する関数
Dim tanka, suryo, kingaku As Integer
tanka = Val(TextBox1.Text)
suryo = Val(TextBox2.Text)
kingaku = tanka * suryo
TextBox3.Text = kingaku
情報基礎実習I
(第10回)
木曜4・5限
担当:北川 晃
Format関数
例:
Format(式,”書式”)
小数点以下
3桁目を
四捨五入
• Format(123.567, “General Number”)
123.567
• Format(123.567, “Fixed”)
123.57
• Format(1235.67, “Standard”)
1,235.67
• Format(123.567, “Percent”)
12356.70%
• Format(1235.67, “Currency”)
\1,236
• Format(123.567, “Scientific”)
1.24E+03
Fixedの表示に
3桁ごとにコンマ
先頭に\記号と
3桁ごとにコンマ
例:
Format関数(つづき)
• Format(123.567, “####”)
• Format(123.567, “0000”)
124
0124
• Format(123.567, “###.#”)
123.6
• Format(123.567, “###.#0”)
123.57
• Format(0.5, “###.##%”)
50.%
• Format(0.5, “###.#0%”)
50.00%
• Format(10000, “##,###円”)
10,000円
• Format(10000, “\\##,###”)
\10,000
0の場合は省略
0であっても表示
小数点以下2桁目を
四捨五入
小数点以下3桁目を
四捨五入
先頭に\記号と
3桁ごとにコンマ
プログラミング演習
2つの数を入力し,「計算」ボタンをクリック
すると,それぞれの計算結果を次のように
表示するプログラムを作れ.
四則演算:プログラム例
Label1~8,Textbox1~8,
Button1, 2の貼り付け
Dim m, n, wa, sa, seki, sho_int As Integer
Dim amari As Integer, sho As Single
m = Val(TextBox1.Text)
n = Val(TextBox2.Text)
wa = m + n : TextBox3.Text = wa
sa = m - n : TextBox4.Text = sa
seki = m * n : TextBox5.Text = seki
sho = m / n : TextBox6.Text = sho
sho_int = m \ n : TextBox7.Text = sho_int
amari = m Mod n : TextBox8.Text = amari
情報基礎II
(第10回)
月曜4限
担当:北川 晃
例題:得点の評価
100点満点の得点を入力し,
 0点以上30点未満なら Terrible!!
 30点以上60点未満なら Bad!
 60点以上70点未満なら Good
 70点以上90点未満なら Great!
 90点以上なら Excellent!!
と表示するプログラムを作れ.
得点の評価:プログラム例
Label1,Textbox1,2,
Button1の貼り付け
得点の評価:プログラム例(つづき)
評価ボタン Dim point As Integer
の動作 point = Val(TextBox1.Text)
If point >= 90 Then
TextBox2.BackColor = Color.Blue
TextBox2.ForeColor = Color.White
TextBox2.Text = "Excellent!!"
ElseIf point >= 70 Then
TextBox2.BackColor = Color.Green
TextBox2.ForeColor = Color.White
TextBox2.Text = "Great!"
ElseIf point >= 60 Then
TextBox2.BackColor = Color.GreenYellow
TextBox2.ForeColor = Color.Black
TextBox2.Text = "Good"
得点の評価:プログラム例(つづき)
評価ボタン ElseIf point >= 30 Then
TextBox2.BackColor = Color.Yellow
の動作
TextBox2.ForeColor = Color.Black
TextBox2.Text = "Bad!"
Else
TextBox2.BackColor = Color.Red
TextBox2.ForeColor = Color.Black
TextBox2.Text = "Terrible!!"
End If
例題:円,球の評価
半径rの値を入力し,以下の計算のいずれかを
選択した後,結果を表示するプログラムを作れ.
 円の円周=2πr
 円の面積=πr2
 球の表面積=4πr2
 球の体積=4πr3/3
RadioButton
GroupBox
例題:円,球の評価
Label1,2,Textbox1,2,
Button1の貼り付け
RadioButton1~4の貼り付け
GroupBoxで囲む
円,球の評価:プログラム例(つづき)
計算ボタン
の動作
Dim r, p, result
r = Val(TextBox1.Text)
πの数値を与える
p = Math.PI
If RadioButton1.Checked Then result = 2 * p *
If RadioButton2.Checked Then result = p * r ^
If RadioButton3.Checked Then result = 4 * p *
If RadioButton4.Checked Then result = 4 / 3 *
TextBox2.Text = Format(result, "#,###.#0")
「各RadioButtonが
チェックされている」
が真か偽か?
r
2
r ^ 2
p * r ^ 3
情報基礎実習I
(第11回)
木曜4・5限
担当:北川 晃
例題:金額の計算
希望する商品すべてをクリックし,おのおのの個数を入力
したとき,合計金額を計算して表示するプログラムを作れ.
CheckBox
金額の計算:プログラム例
Label1~3,Textbox1~7,
Button1,2の貼り付け
CheckBox1~6の貼り付け
金額の計算:プログラム例(つづき)
Private Sub Button1_Click(sender As Object, e As EventArgs) …
Dim result As Integer = 0
各チェックボックスが真か偽か
If CheckBox1.Checked Then _
result = result + 150 * Val(TextBox1.Text)
If CheckBox2.Checked Then _
result = result + 200 * Val(TextBox2.Text)
…
If CheckBox6.Checked Then _
result = result + 150 * Val(TextBox6.Text)
TextBox7.Text = Format(result, "\\###,###")
End Sub
金額の表示の書式
Private Sub Button2_Click(sender As Object, e
CheckBox1.Checked = False : TextBox1.Text
CheckBox2.Checked = False : TextBox2.Text
…
CheckBox6.Checked = False : TextBox6.Text
End Sub
As EventArgs) …
= ""
= ""
= ""
各チェックボックスのチェックを外す
情報基礎II
(第11回)
月曜4限
担当:北川 晃
プログラミング演習
高知大学の各学部を入力し,どこのキャンパスに
あるかを表示するプログラムを作れ.
各学部の所在地:プログラム例
Label1~3,TextBox1,2,
Button1の貼り付け
各学部の所在地:プログラム例(つづき)
「検索」
ボタン
Dim faculty As String
faculty = TextBox1.Text
Select Case faculty
Case "人文"
TextBox2.Text =
Case "教育"
TextBox2.Text =
Case "理"
TextBox2.Text =
Case "医"
TextBox2.Text =
Case "農"
TextBox2.Text =
Case Else
TextBox2.Text =
End Select
"朝倉"
"朝倉"
"朝倉"
"岡豊"
"物部"
"(存在しない)"
プログラミング演習
• ラジオボタンで高知大学の各学部を選択し,
どこのキャンパスにあるかを表示するプログラムを作れ.
学部の場所:プログラム例
Label1~4,TextBox1,2,
Button1,2,
RadioButton1~5の貼り付け
学部の場所:プログラム例(つづき)
If RadioButton1.Checked Then
TextBox1.Text = "人文"
TextBox2.Text = "朝倉"
ElseIf RadioButton2.Checked Then
TextBox1.Text = "教育"
TextBox2.Text = "朝倉"
ElseIf RadioButton3.Checked Then
TextBox1.Text = "理"
TextBox2.Text = "朝倉"
ElseIf RadioButton4.Checked Then
TextBox1.Text = "医"
TextBox2.Text = "岡豊"
ElseIf RadioButton5.Checked Then
TextBox1.Text = "農"
TextBox2.Text = "物部"
End If
「検索」
ボタン
学部の場所:プログラム例(つづき)
RadioButton1.Checked
RadioButton2.Checked
RadioButton3.Checked
RadioButton4.Checked
RadioButton5.Checked
TextBox1.Text = "" :
= False
= False
= False
= False
= False
TextBox2.Text = ""
「クリア」
ボタン
改行コード
• vbCr(キャリッジリターン):行頭復帰
• vbLf(ラインフィード):行送り
• vbCrLf:改行文字
• vbTab:タブ文字
縦方向は紙を動かし,
横方向はキャリッジを動かす
改行のための
レバー
システムにより様々なコードが混在しているので注意が必要
例題:10人の点数の平均点
10人のテストの点数データをキーボードから1つずつ
入力し,その平均点を計算して表示するプログラムを作れ.
入力のためのフォーム
(InputBox関数を使用)
10人の点数の平均点:プログラム例
Label1,Textbox1,
Button1,2の貼り付け
Label1に「ここにデータ
が表示されます」と入力
10人の点数の平均点:プログラム例(つづき)
Private Sub Button1_Click(sender As Object, e As EventArgs) …
Dim goukei, n, ten As Integer : Dim heikin As Single
goukei = 0 : Label1.Text = "入力データ" & vbLf
For n = 1 To 10
ten = InputBox("点数を入力してください", "点数")
Label1.Text = Label1.Text & Format(ten, " ##0")
goukei = goukei + ten
Next n
heikin = goukei / 10
TextBox1.Text = Format(heikin, "平均点は###.0点")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) …
End
End Sub
例題:多重ループ
2から20までの数について,1を除くすべての約数を
ラベルに表示するプログラムを作れ.
多重ループ:プログラム例
Label1,Button1,2
の貼り付け
多重ループ:プログラム例(つづき)
Private Sub Button1_Click(sender As Object, e As EventArgs) …
Dim n, m As Integer
Label1.Text = ""
For n = 2 To 20
Label1.Text = Label1.Text & Format(n, "##の約数は:")
For m = 2 To n
If n Mod m = 0 Then
Label1.Text = Label1.Text & Format(m, " ## ")
End If nをmで割って,余りがゼロなら約数なので書き出す
Next m
Label1.Text = Label1.Text & vbLf
Next n
End Sub
次のnの評価に移る前に改行コードを入れる
Private Sub Button2_Click(sender As Object, e As EventArgs) …
End
End Sub