プログラミングにおける数学の魅力
劉少英(りゅう しょうえい)
情報科学部・コンピュータ科学科・教授
法政大学
授業計画
1.プログラミングの基本概念
2.プログラミング言語Javaの紹介と演習 3.プログラムの形式仕様の紹介と演習
1.プログラミングの基本概念
(1)プログラムとは、何?
(2)プログラムの作成プロセスは、何? (3)プログラムと数学の関係は、何?
プログラム
入力 出力
料理の調理
入力 出力
数学的には、プログラムが関数のようなもの です。 関数
f : X -> Y
ここで、f は、プログラムで、Xは、入力の範囲 を決める「定義域」という、Yは、出力の範囲を 決める「値域」という。プログラムの構成: プログラム = データ構造 + アルゴリズム データ構造とは、データを保存する「箱」の構造 で、Javaの「変数」で表す。 アルゴリズムとは、一連の行動或いは命令の 並び。 Javaの「命令文」で表現する。
(2)プログラムの作成プロセスは、何?
プログラムの機能仕様 の作成 プログラムの作成 仕様によってプログラムテスト 変換 何をして欲しい どうやってする 仕様言語: (1)自然言語 ○ (2)形式言語 ○ ○ プログラミング言語: (1)自然言語 × (2)形式言語 ○(3)プログラムと数学の関係は、何?
(あ) プログラムの意味は、数学で定義する。 (い) プログラム自体は、数学の関数のような ものです。 (う) プルグラム機能仕様は、数学によって 設計された形式言語で表現します。2.プログラミング言語Javaの紹介と演習
• Java言語の構造
このスライドの目標
簡単な入出力を持つJavaプログラムの構築が 出来るようになる。
Java言語の基本的な構造
プログラムは以下の様な構造で記述される
クラス名以外はおまじないなのであまり気にしない クラス名には英数字を利用して記述できる
public class “クラス名”{
public static void main(String[] args){
//ここにプログラムを記述する
//次のページからはこの部分を説明する
} }
Javaのクラスの最低限の構造
下のコードがJava言語での実行できる最小のコー ド(実行出来るだけで、実行しても何も起きない。) public class MyTest{
public static void main(String[] args){ //最低限の構造
} }
Java言語のプログラミング記述
先のページでのmain関数の書き方に付いて説明を行う。 public static void main(String args[]){//変数の宣言 //入力 //アルゴリズム //出力 } 以上の4つの項目の組み合わせで様々なプログラムを記述 できる。 次のページからは各項目に関して説明を行なっていく。
変数とは?
• 変数とは、プログラムで用いる様々な値(整数、 実数、文字等)を一時的に記憶しておくために 使う入れ物の様なものである。
Java言語(変数宣言)
Java言語での変数の宣言は以下の様に行う。 //初期化を行わない場合 型名 変数名 ; //初期化を行う場合 型名 変数名 = 値 ; 型名に関しては次ページで説明を行う。 セミコロンを忘れずに変数の種類
• 今回使用するのは主に下の4つの変数の型 を用いる。 データの種類 Javaでの型 整数 int 小数点 double 文字列 String 論理型 booleanJava言語での変数宣言例
Java言語中では以下の様な形で変数の宣言を行うことが出 来る。
Public static void main(String[] args){ int a; //変数自体の宣言
a = 10; //10を変数aに代入
int b = 100; //100を変数bに代入
double c = 1.5; //1.5をcに代入
String str=“test”; //文字列testをstrに代入する
// ””で囲まれた部分を文字列とする。
boolean bool = true; //真の値をboolに代入する
Java言語(出力)
プログラムにユーザーからの入力する方法をここでは学ぶ。 public static void main(String args[]){
JOptionPane.showMessageDialog(null,”文字列”); } このコードを実行すると 右の図の様な結果がえられる。 “文字列”を変更することで 様々な物を表示することが出来る
出力
基本的にコンピュータの計算過程を覗くことは 出来ない。 計算の結果や過程を知るためには、プログラ ムとして自分で出力するための命令を指定して あげる必要がある。出力に使うおまじない
今回は以下の命令を用いる。 固定の文字を表示する場合 JOptionPane.showMessageDialog(null,”文字”); 変数の内容を表示したい場合 JOptionPane.showMessageDialog(null, 変数名);実行すると
GUIの画面がポップアップする。
実行するコード public class OutPutTest {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "出力"); }
}
実行結果
Java言語(入力)
コンピュータに処理(計算など)をさせるために 必要なパラメータを入力する必要がある。 必要なパラメータはコードに埋め込むことも出 来るが、対話的にユーザに入力させる方法をこ こでは学ぶ。入力に使うおまじない一覧
入力に使うおまじないは、入力するデータによって変更される。 Int型の場合
int integer = Integer.parseInt(JOptionPane.showInputDialog("メッセー ジ"));
Double 型の場合
double dec = Double.parseDouble(JOptionPane.showInputDialog("メッ セージ"));
String 型の場合
入出力のクラス練習
整数、小数、文字列をそれぞれ入力し入力された値を表示するプログラム。 public class InputTest {
public static void main(String args[]) {
int i = Integer.parseInt(JOptionPane.showInputDialog("整数入力")); JOptionPane.showConfirmDialog(null, i); double d = Double.parseDouble(JOptionPane.showInputDialog("小数入力 ")); JOptionPane.showConfirmDialog(null, d); String str = JOptionPane.showInputDialog("文字列入力"); JOptionPane.showConfirmDialog(null, str); } }
アルゴリズム
アルゴリズムとは、問題を解くための手順を一般 的な形で示したもの。 コンピュータに解るようにアルゴリズムを指示す るためにプログラミング言語を用いて実装を行う。 今回はアルゴリズムを実装するのに必要な様々 な演算(四則演算等)、条件分岐、繰り返しについ て説明を行う。Javaの四則演算
• 計算だけを行う場合 – 計算対象 演算子 計算対象; – 例) 10 + 10; //10+10を計算 • 計算の保存をする場合 – 計算結果 = 計算対象 演算子 計算対象; – 例) a = 10 + 10;// 10+10の結果を変数aに入力Javaの四則演算の演算子
• 以下のような演算子が用意されている。 計算 Javaの演算子 足し算 + 引き算 - 掛け算 * 割り算 /四則演算の簡単な計算
以下のように足し算、引き算、掛け算、割り算が実行できる。 また複雑な数式も実現することも出来る。
public class AddSubMulDiv {
public static void main(String args[]) { int i = 10;
double d = 2.0; double result = 0;
result = i + i;// resultに20.0が入る
JOptionPane.showMessageDialog(null, result); result = i - d;// resultに8.0が入る JOptionPane.showMessageDialog(null, result); result = i * d;// result20.0が入る JOptionPane.showMessageDialog(null, result); result = i / d;// reusltに5.0が入る JOptionPane.showMessageDialog(null, result); result = i * d / 3.0;// 3項以上の計算を行うことも出来る result = (i + i) / d;//計算順位の低い物を先に実行したい場合は括弧で囲む } }
条件分岐
• ここまでのプログラムは上から順に実行する だけだったが、条件分岐を学ぶことで複雑な プログラムを構築できるようになる。
Javaの条件分岐
• Javaの条件分岐として以下の4つのものが使 用できる。 – if文 – if – else 文 – if – else if 文 – switch case文 • 今回は if 文 または if – else 文を使用する。条件式
• Javaには比較を行うために必要な演算が定義 されている。 演算子 意味 == 等しい != 等しくない > 右辺より大きい >= 右辺以上 < 右辺より小さい <= 右辺以下条件分岐のクラス練習
• 入力した整数が奇数か偶数かを判定するプ ログラムを作成せよ。 • Javaには割り算の余りを求める演算子とし て”%”が用意されている • 簡単な使い方 – 20 % 3 == 2 – 2 % 3 == 2条件分岐のクラス練習
実装してもらうコード
public static void main(String args[]) {
int i = Integer.parseInt(JOptionPane.showInputDialog("整数入力")); if (i % 2 == 1) { JOptionPane.showMessageDialog(null, "入力した数字は奇数です。"); } else { JOptionPane.showMessageDialog(null, "入力した数字は偶数です。"); } }
繰り返し
• 同じ処理を繰り返して行いたい場合、必要な 回数だけ処理を書くことで処理を行うことがで きる。 • しかし、次ページの様に1~100まで表示する プログラムをそのまま書いた場合、プログラ ムの記述量が多くミスをする原因にもなってし まう。繰り返しを使わない場合
• 1~100まで表示するプログラムを作る場合
for文
• 定められた回数だけループを行う文。 • ループの準備を1度だけ行い、それ以後条件式 に合致した場合に繰り返し処理を行い、ループ 後の処理を行う。 ループの準備 ループの条件式 ループ後の処理1~100までの数字を表示するプログラ
ム
このプログラムは27ページ目で示したプログラムと同じ意味 を持つ。この様に繰り返しの処理を行う場合は
public class ForTest {
public static void main(String args[]){ for(int i = 1; i<=100;i++){
JOptionPane.showConfirmDialog(null, i); }
} }
配列
複数の数値の平均を求める場合など、複数の データをひとまとめにして扱いたい場合がある。 Javaには、複数のデータをひとまとめにするた
Javaによる配列の宣言方法
変数の宣言に似ている。 []を付けて宣言することで配列が用意される。 右辺の数字を変えることで配列の長さを変え ることが出来る(この場合は0~4までの5個 )。 []で配列であること を示す おまじない 配列の長さを定義配列への代入、値の利用方法
配列に代入をするために添字(0以上の数字)を 利用する。 添字は0~全体の長さ-1まであるので注意する。 添字 添字配列を使わなかった場合
5教科のテストの合計点を求めるプログラムを作る場合。
public class Sum {
public static void main(String args[]) { int kokugo, sugaku, rika, shakai, eigo; kokugo = 100;
sugaku = 80; rika = 75; shakai = 60; eigo = 50;
int sum = kokugo + sugaku + rika + shakai + eigo; JOptionPane.showConfirmDialog(null, sum); }
配列+繰り返し
配列に加えて繰り返しを加えた場合 public class Sum {
public static void main(String args[]) { int sum = 0;
int []points = new int[5]; points[0]=100; points[1]=80; points[2]=75; points[3]=60; points[4]=50; for(int i =0;i<5;i++){
sum = sum + points[i]; //この様に簡単に記述ができる }
JOptionPane.showConfirmDialog(null, sum); }
配列と繰り返しのクラス練習
• 5教科7科目に対応できるように変更を行って ください。 • 入力を作成する場合は数学、国語、英語、 (物理、化学、生物の中から二つ)と(政治経 済、世界史、日本史、現代社会の中から二 つ)の入力を作成してください。解答
public static void main(String args[]) {int sum = 0;
int[] points = new int[7];
points[0] = Integer.parseInt(JOptionPane.showInputDialog("数学の点数を入力")); points[1] = Integer.parseInt(JOptionPane.showInputDialog("英語の点数を入力")); points[2] = Integer.parseInt(JOptionPane.showInputDialog("国語の点数を入力")); points[3] = Integer.parseInt(JOptionPane.showInputDialog("物理の点数を入力")); points[4] = Integer.parseInt(JOptionPane.showInputDialog("化学の点数を入力")); points[5] = Integer.parseInt(JOptionPane.showInputDialog("政治経済の点数を入力")); points[6] = Integer.parseInt(JOptionPane.showInputDialog("世界史の点数を入力")); for (int i = 0; i < 5; i++) {
sum = sum + points[i];// この様に簡単に記述ができる }
JOptionPane.showConfirmDialog(null, sum); }
Javaの開発環境
Eclipse
• IBMによって製作された統合開発環境(IDE) • 読み方は エクリプスか,イクリプス
• 主にJava言語を開発するときに用いられる開発 環境
• ライセンスはEclipse Public License
Eclipseの使い方(起動方法1)
スタートメニューから起動する Eclipse3.6.xを選択してクリック
Eclipseの使い方(起動方法2)
起動するとよ うこそ画面が 開くので、赤 丸の部分をク リックし、これ を閉じるEclipseの使い方(起動方法3)
このような 画面にな れば起動 は成功
Eclipseの使い方(プロジェクトの作成)
• Eclipseでは、プログラムをプロジェクトという単 位で管理する。
• ここでは,Javaのプロジェクトの作成方法につ いて学ぶ
プロジェクトの作成
パッケージエク スプローラー上 で右クリック → 新規 → プロジェクト を選択プロジェクトの作成(2)
プロジェクト名に
”SummerCampus” と入力し完了をク リック
Eclipseの使い方(クラスの作成)
• Javaはクラス単位でソースコードを管理するこ とが出来る。
• 今回は単に実行ファイルを個別に作る際に用 いる。
クラスの作成
プロジェクトを開き srcを右クリックし、 メニューを開く。 新規→クラス を選択するクラスの作成(2)
左の様な画面が開 いたら、名前に任意 の名前を入れる。 また、注意としてど のメソッド・スタブを 作成しますか?で Public ・・・・にチェッ クを入れる。 入れ終わったら完了 する。クラスの作成(3)
Eclipseの使い方(Javaファイルの実行)
• EclipseでのJavaの実行方法について、ここで は学ぶ
プログラムの実行
今作ったプログラ ムを実行してみる。 作成したプログラ ム上で右クリック 実行→ Javaアプリケー ション で実行される。 空なので何も発 生しないEclipseのクラス練習
Javaの構文(目次)
• 出力方法 • 数学的な関数、計算方法 • 変数 • 入力方法 • 条件分岐 • ループ処理 • 配列 • メソッド出力
• コンピュータの計算は外部から覗くことは一 般的には出来ない • ユーザに対して適切に計算結果を出力をす る必要がある。 • ここではその方法を学ぶJOptinPane
• 短い文字列の入出力 • YES/NOの判定 • OK/Cancelの判定 • 等を行うときに使用するクラス • ここでは短い文字列の出力を行うために利用 する。JOptionPaneの使い方
• 出力では以下の様に利用する。
• 一番目にはnullを入れる。
クラス練習(1)
• 文字列を自分の好きなメッセージに変えてみ て表示されるかどうかを調べてみよう。
コメントアウト
• ある行をコンピュータに読み取らせないように することが出来る。 • 利用例としては – ソースコードを読む人のための説明 – コードを一時的に使わないようにする • Javaでは行頭に//を付けることで可能となる。変数の種類
• 変数に入っているものが何か解らないと困っ たことが発生する。 • 例) – “abc”+”123”=“abc123” 文字と文字なら連結 – “abc”+123=? 文字と数字なら? • 中に入っているものが何であるかを示す必要 がある。変数の宣言方法
• Javaで変数を使用するときは、変数として宣言を 行う必要がある。 • 変数の宣言方法 – 型名 変数名; – 例) int a; //int型(整数)の変数aを用意する • 初期値付きの変数の宣言方法 – 型名 変数名 = 値; – 例) int a = 10; //int型の変数aを用意し10を代入する数学的な計算
• Javaでは、簡単な四則演算(+,-,*,/)から平方 根、指数対数、三角関数などの数学で用いる 様々な関数が事前に用意されている • ここでは四則演算を学び、残りは必要に応じ て関数の説明を行うクラス練習(2)
• 変数の値を変更して様々な計算を試してみよ う。
入力方法
• コンピュータでの計算方法を学んできたが、こ こまでの方法では事前にコードに打ち込んだ 値しか計算ができない。 • JOptionPaneを用いて利用する。 – 今回はテンプレートを用いるので特に利用はしな い使用方法
• 以下のような方法で使用できる。
• 戻り値はString型なので適宜変換する必要が ある。
クラス練習(3)
• 直角三角形の面積をユーザから入力された 値によって計算するプログラムを作成しなさ い。
3.プログラムの形式仕様の紹介と演習
P
x y
プロセス仕様
(Process specification)
プロセスとは、入力によって出力を出す操作です。 プロセスの機能を次のような仕様で定義します。
process A (input) output
ext external variable
pre P
post Q
comment
事例1
process P(入力は整数) 出力は実数 pre 入力はゼロではない post 出力は、入力の5倍で入力プラス10を割った 結果より大きい実数である。 end_process P x y事例1の形式プロセス仕様
process P(x: int) y: real
pre x > 0
post y > (x + 10) / x * 5
end_process
P
課題1
次のプロセス仕様を実装するプログラムをJavaで 作成しなさい。
process Computing(x: int) y: real
pre x > 0
post y > (x + 10) / x * 5
end_process
P
次のテストデータを用いて、作成されたプログラムをテストしなさ い。テスト結果(yの値)を次の表に記入、仕様のpre- and
postconditions (pre and post) を評価、及び自作したプログラム にある誤りを除去しなさい。 x y pre post 20 3000000 0 -20 -3000000 -4.56
テストでエラーを発見した条件
課題2
次のプロセス仕様を実装しなさい。
process P(x: int) y: int
ext rd s: int pre x > s post x > s + 5 and y = x + s or x = s + 5 and y < x or x < s + 5 and y > x + s * 10 end_process P x y s 1
x s y pre post 500 30 4000000 5000000 0 0 -500 -30 -4000000 -5000000 35 20 次のテストデータを用いて、作成されたプログラムをテストしなさい。 テスト結果(yの値)を次の表に記入、仕様のpre- and
postconditions (pre and post) を評価、及び自作したプログラムに ある誤りを除去しなさい。
課題3
次のプロセス仕様を実装しなさい。
process P(x: int) y: int
ext wr s: int pre x > s post x > ~s + 5 and y = x + s or x = ~s + 5 and y < x and s > ~s + x or x < ~s + 5 and y > x + s * 10 end_process P x y s 1
x ~s s y pre post 500 3000 4000000 5000000 0 0 -500 -500 -5000000 -4000000 35.58 20.50 次のテストケースを用いて、作成されたプログラムをテストしなさい。 テスト結果(yとsの値)を次の表に記入、仕様のpre and
postconditions (pre and post) を評価、及び自作したプログラムに ある誤りを除去しなさい。
課題4
円の面積をユーザから入力された半径によって 計算するプログラムを作成しなさい。
– 円周率はMath.PIで3.14より正確な近似値を知る ことが出来る。
SOFL仕様
process Circle(radius: real) area: real pre radius > 0
post area = radius * radius * 3.14 end_process
課題5
三角形の面積を求めるプログラムを作成し なさい。
SOFL仕様
process Triangle(x: int, y: int) area: int pre x > 0 and y > 0
post area = x * y / 2 end_process
課題6
•簡単なじゃんけんプログラムを完成させてみよ う。 – 1,2,3の入力に対して、それぞれ”グー”, “チョキ”, “パー”を割り振る •コンピュータの値は乱数Math.random()を用い る。SOFL仕様
process Rps(user: int, cpu: int) str: string pre user > 0 and cpu < 4
post user = cpu and str = “あいこ” or ( user < cpu or user = 3 and cpu = 1) and str =“コンピュータの勝ち” or
( user > cpu or user = 1 and cpu = 3) and str = “あなたの勝ち”
課題7
5教科(数学, 英語, 理科, 社会, 国語)の平均値 を求めるプログラムを書いてみよう。
SOFL仕様
process Average(array: seq of int) avg: int pre len(array) > 1
post avg = sum(array) / len(array) end_process
function sum(array: seq of int): int
post len(array) > 1 and sum = hd(array) + tl(array) or
sum=hd(array) end_function
関数(メソッド)
• ここではプログラム中の命令のまとまりを「関数」とし てひとまとまりにする方法を述べる。 • 今のところ小さなプログラムしか書いてないが、大きな プログラムを書くときによく用いる。 • イメージ的には数学の関数をイメージすると良い – f(x)=x+1等 • これまでに使ったMath.sqrt(int)などもその内の一つ関数の書き方
• 引数(値の受け渡し)がない場合 と書くことが出来る • testの部分は好きなアルファベットと数字の組み 合わせで書くことが出来る関数の呼び出し方
• 関数の呼び出し方は以下のとおりである。
関数の書き方
(値渡しがある場合)
• 数学でのf(x)の関数のように、値の受け渡し を行うことも出来る。 • 上図の場合はint型のvalueの値を受け渡す 場合の関数の書き方である。関数の呼び出し方
(値渡しがある場合)
関数の書き方
(戻り値がある場合)
• 関数に計算させた結果を取得することも出来 る。 • 関数から戻ってくる値を戻り値と呼ぶ 戻り値の型をここに書く return のあとに戻 り値を書く関数の呼び出し方
(戻り値のある場合)
• 関数の戻り値を直接変数に代入することが出 来る
課題8 (高級)
Show Get Buy x z c r mbox mbox: moneybox次のCDFD(Condition Data Flow Diagram) を実装しなさい。
Figure 1
e
module System_Moneybox
var
mbox: nat; /*natは、自然数の型である*/
behav CDFD_Figure 1;
process Show(x : sign) z : nat
ext rd mbox /* rd = read */
pre true /* This precondition can be omitted */
post z = mbox
comment
Show is executed on the availablility of event x, under no specific condition, and will generate the output z that is equal to the money in the money box mbox.
process Get(z : nat) c : nat | e: string
ext wr mbox : nat /*wr = write */ rd a: nat /*toy price*/
post if z >= a
then c >= a and c <= z and mbox = z – c
else e = “The money in the money box is not enough.” and mbox = ~mbox
comment
If input z, the total money in the mbox, is not smaller than a (the price of the toy to buy), an
estimated amount of money c necessary to buy the toy,
must be greater than or equal to a but smaller than z, and mbox must be updated with c; otherwise, an error message is given.
process Buy(c : nat) r : nat
ext wr mbox: nat rd a: nat
post r = c – a and mbox = ~mbox + r
comment
If money c is greater than or equal
to the toy-price a, output r will represents the remaining money after buying the toy with the toy-price, and put the remaining money r back to the money box, which is expressed by the expression:
mbox = ~mbox + r.
end_process;
適当なテストデータを生成、作成されたプログラム をテストしなさい。そのテスト結果によって、必要で あれば、プログラムの誤りを除去しなさい。
学生の議論
学生たちは、数学とプログラミングおよびそれら の関係について自由に議論してもらいます。