• 検索結果がありません。

スライド 1

N/A
N/A
Protected

Academic year: 2021

シェア "スライド 1"

Copied!
106
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミングにおける数学の魅力

劉少英(りゅう しょうえい)

情報科学部・コンピュータ科学科・教授

法政大学

(2)

授業計画

1.プログラミングの基本概念

2.プログラミング言語Javaの紹介と演習 3.プログラムの形式仕様の紹介と演習

(3)

1.プログラミングの基本概念

(1)プログラムとは、何?

(2)プログラムの作成プロセスは、何? (3)プログラムと数学の関係は、何?

(4)

プログラム

入力 出力

料理の調理

入力 出力

(5)

数学的には、プログラムが関数のようなもの です。 関数

f : X -> Y

ここで、f は、プログラムで、Xは、入力の範囲 を決める「定義域」という、Yは、出力の範囲を 決める「値域」という。

(6)

プログラムの構成: プログラム = データ構造 + アルゴリズム データ構造とは、データを保存する「箱」の構造 で、Javaの「変数」で表す。 アルゴリズムとは、一連の行動或いは命令の 並び。 Javaの「命令文」で表現する。

(7)

(2)プログラムの作成プロセスは、何?

プログラムの機能仕様 の作成 プログラムの作成 仕様によってプログラムテスト 変換 何をして欲しい どうやってする 仕様言語: (1)自然言語 ○ (2)形式言語 ○ ○ プログラミング言語: (1)自然言語 × (2)形式言語 ○

(8)

(3)プログラムと数学の関係は、何?

(あ) プログラムの意味は、数学で定義する。 (い) プログラム自体は、数学の関数のような ものです。 (う) プルグラム機能仕様は、数学によって 設計された形式言語で表現します。

(9)

2.プログラミング言語Javaの紹介と演習

• Java言語の構造

(10)

このスライドの目標

簡単な入出力を持つJavaプログラムの構築が 出来るようになる。

(11)

Java言語の基本的な構造

プログラムは以下の様な構造で記述される

クラス名以外はおまじないなのであまり気にしない クラス名には英数字を利用して記述できる

public class “クラス名”{

public static void main(String[] args){

//ここにプログラムを記述する

//次のページからはこの部分を説明する

} }

(12)

Javaのクラスの最低限の構造

下のコードがJava言語での実行できる最小のコー ド(実行出来るだけで、実行しても何も起きない。) public class MyTest{

public static void main(String[] args){ //最低限の構造

} }

(13)

Java言語のプログラミング記述

先のページでのmain関数の書き方に付いて説明を行う。 public static void main(String args[]){

//変数の宣言 //入力 //アルゴリズム //出力 } 以上の4つの項目の組み合わせで様々なプログラムを記述 できる。 次のページからは各項目に関して説明を行なっていく。

(14)

変数とは?

• 変数とは、プログラムで用いる様々な値(整数、 実数、文字等)を一時的に記憶しておくために 使う入れ物の様なものである。

(15)

Java言語(変数宣言)

Java言語での変数の宣言は以下の様に行う。 //初期化を行わない場合 型名 変数名 ; //初期化を行う場合 型名 変数名 = 値 ; 型名に関しては次ページで説明を行う。 セミコロンを忘れずに

(16)

変数の種類

• 今回使用するのは主に下の4つの変数の型 を用いる。 データの種類 Javaでの型 整数 int 小数点 double 文字列 String 論理型 boolean

(17)

Java言語での変数宣言例

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に代入する

(18)

Java言語(出力)

プログラムにユーザーからの入力する方法をここでは学ぶ。 public static void main(String args[]){

JOptionPane.showMessageDialog(null,”文字列”); } このコードを実行すると 右の図の様な結果がえられる。 “文字列”を変更することで 様々な物を表示することが出来る

(19)

出力

基本的にコンピュータの計算過程を覗くことは 出来ない。 計算の結果や過程を知るためには、プログラ ムとして自分で出力するための命令を指定して あげる必要がある。

(20)

出力に使うおまじない

今回は以下の命令を用いる。 固定の文字を表示する場合 JOptionPane.showMessageDialog(null,”文字”); 変数の内容を表示したい場合 JOptionPane.showMessageDialog(null, 変数名);

(21)

実行すると

GUIの画面がポップアップする。

実行するコード public class OutPutTest {

public static void main(String[] args) {

JOptionPane.showMessageDialog(null, "出力"); }

}

実行結果

(22)

Java言語(入力)

コンピュータに処理(計算など)をさせるために 必要なパラメータを入力する必要がある。 必要なパラメータはコードに埋め込むことも出 来るが、対話的にユーザに入力させる方法をこ こでは学ぶ。

(23)

入力に使うおまじない一覧

入力に使うおまじないは、入力するデータによって変更される。 Int型の場合

int integer = Integer.parseInt(JOptionPane.showInputDialog("メッセー ジ"));

Double 型の場合

double dec = Double.parseDouble(JOptionPane.showInputDialog("メッ セージ"));

String 型の場合

(24)

入出力のクラス練習

整数、小数、文字列をそれぞれ入力し入力された値を表示するプログラム。 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); } }

(25)
(26)

アルゴリズム

アルゴリズムとは、問題を解くための手順を一般 的な形で示したもの。 コンピュータに解るようにアルゴリズムを指示す るためにプログラミング言語を用いて実装を行う。 今回はアルゴリズムを実装するのに必要な様々 な演算(四則演算等)、条件分岐、繰り返しについ て説明を行う。

(27)

Javaの四則演算

• 計算だけを行う場合 – 計算対象 演算子 計算対象; – 例) 10 + 10; //10+10を計算 • 計算の保存をする場合 – 計算結果 = 計算対象 演算子 計算対象; – 例) a = 10 + 10;// 10+10の結果を変数aに入力

(28)

Javaの四則演算の演算子

• 以下のような演算子が用意されている。 計算 Javaの演算子 足し算 + 引き算 - 掛け算 * 割り算 /

(29)

四則演算の簡単な計算

以下のように足し算、引き算、掛け算、割り算が実行できる。 また複雑な数式も実現することも出来る。

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;//計算順位の低い物を先に実行したい場合は括弧で囲む } }

(30)

条件分岐

• ここまでのプログラムは上から順に実行する だけだったが、条件分岐を学ぶことで複雑な プログラムを構築できるようになる。

(31)

Javaの条件分岐

• Javaの条件分岐として以下の4つのものが使 用できる。 – if文 – if – else 文 – if – else if 文 – switch case文 • 今回は if 文 または if – else 文を使用する。

(32)

条件式

• Javaには比較を行うために必要な演算が定義 されている。 演算子 意味 == 等しい != 等しくない > 右辺より大きい >= 右辺以上 < 右辺より小さい <= 右辺以下

(33)

条件分岐のクラス練習

• 入力した整数が奇数か偶数かを判定するプ ログラムを作成せよ。 • Javaには割り算の余りを求める演算子とし て”%”が用意されている • 簡単な使い方 – 20 % 3 == 2 – 2 % 3 == 2

(34)

条件分岐のクラス練習

実装してもらうコード

public static void main(String args[]) {

int i = Integer.parseInt(JOptionPane.showInputDialog("整数入力")); if (i % 2 == 1) { JOptionPane.showMessageDialog(null, "入力した数字は奇数です。"); } else { JOptionPane.showMessageDialog(null, "入力した数字は偶数です。"); } }

(35)

繰り返し

• 同じ処理を繰り返して行いたい場合、必要な 回数だけ処理を書くことで処理を行うことがで きる。 • しかし、次ページの様に1~100まで表示する プログラムをそのまま書いた場合、プログラ ムの記述量が多くミスをする原因にもなってし まう。

(36)

繰り返しを使わない場合

• 1~100まで表示するプログラムを作る場合

(37)

for文

• 定められた回数だけループを行う文。 • ループの準備を1度だけ行い、それ以後条件式 に合致した場合に繰り返し処理を行い、ループ 後の処理を行う。 ループの準備 ループの条件式 ループ後の処理

(38)

1~100までの数字を表示するプログラ

このプログラムは27ページ目で示したプログラムと同じ意味 を持つ。この様に繰り返しの処理を行う場合は

public class ForTest {

public static void main(String args[]){ for(int i = 1; i<=100;i++){

JOptionPane.showConfirmDialog(null, i); }

} }

(39)

配列

複数の数値の平均を求める場合など、複数の データをひとまとめにして扱いたい場合がある。 Javaには、複数のデータをひとまとめにするた

(40)

Javaによる配列の宣言方法

変数の宣言に似ている。 []を付けて宣言することで配列が用意される。 右辺の数字を変えることで配列の長さを変え ることが出来る(この場合は0~4までの5個 )。 []で配列であること を示す おまじない 配列の長さを定義

(41)

配列への代入、値の利用方法

配列に代入をするために添字(0以上の数字)を 利用する。 添字は0~全体の長さ-1まであるので注意する。 添字 添字

(42)

配列を使わなかった場合

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); }

(43)

配列+繰り返し

配列に加えて繰り返しを加えた場合 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); }

(44)

配列と繰り返しのクラス練習

• 5教科7科目に対応できるように変更を行って ください。 • 入力を作成する場合は数学、国語、英語、 (物理、化学、生物の中から二つ)と(政治経 済、世界史、日本史、現代社会の中から二 つ)の入力を作成してください。

(45)

解答

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); }

(46)

Javaの開発環境

(47)

Eclipse

• IBMによって製作された統合開発環境(IDE) • 読み方は エクリプスか,イクリプス

• 主にJava言語を開発するときに用いられる開発 環境

• ライセンスはEclipse Public License

(48)

Eclipseの使い方(起動方法1)

スタートメニューから起動する Eclipse3.6.xを選択してクリック

(49)

Eclipseの使い方(起動方法2)

起動するとよ うこそ画面が 開くので、赤 丸の部分をク リックし、これ を閉じる

(50)

Eclipseの使い方(起動方法3)

このような 画面にな れば起動 は成功

(51)

Eclipseの使い方(プロジェクトの作成)

• Eclipseでは、プログラムをプロジェクトという単 位で管理する。

• ここでは,Javaのプロジェクトの作成方法につ いて学ぶ

(52)

プロジェクトの作成

パッケージエク スプローラー上 で右クリック → 新規 → プロジェクト を選択

(53)

プロジェクトの作成(2)

プロジェクト名に

”SummerCampus” と入力し完了をク リック

(54)

Eclipseの使い方(クラスの作成)

• Javaはクラス単位でソースコードを管理するこ とが出来る。

• 今回は単に実行ファイルを個別に作る際に用 いる。

(55)

クラスの作成

プロジェクトを開き srcを右クリックし、 メニューを開く。 新規→クラス を選択する

(56)

クラスの作成(2)

左の様な画面が開 いたら、名前に任意 の名前を入れる。 また、注意としてど のメソッド・スタブを 作成しますか?で Public ・・・・にチェッ クを入れる。 入れ終わったら完了 する。

(57)

クラスの作成(3)

(58)

Eclipseの使い方(Javaファイルの実行)

• EclipseでのJavaの実行方法について、ここで は学ぶ

(59)

プログラムの実行

今作ったプログラ ムを実行してみる。 作成したプログラ ム上で右クリック 実行→ Javaアプリケー ション で実行される。 空なので何も発 生しない

(60)

Eclipseのクラス練習

(61)

Javaの構文(目次)

• 出力方法 • 数学的な関数、計算方法 • 変数 • 入力方法 • 条件分岐 • ループ処理 • 配列 • メソッド

(62)

出力

• コンピュータの計算は外部から覗くことは一 般的には出来ない • ユーザに対して適切に計算結果を出力をす る必要がある。 • ここではその方法を学ぶ

(63)

JOptinPane

• 短い文字列の入出力 • YES/NOの判定 • OK/Cancelの判定 • 等を行うときに使用するクラス • ここでは短い文字列の出力を行うために利用 する。

(64)

JOptionPaneの使い方

• 出力では以下の様に利用する。

• 一番目にはnullを入れる。

(65)

クラス練習(1)

• 文字列を自分の好きなメッセージに変えてみ て表示されるかどうかを調べてみよう。

(66)

コメントアウト

• ある行をコンピュータに読み取らせないように することが出来る。 • 利用例としては – ソースコードを読む人のための説明 – コードを一時的に使わないようにする • Javaでは行頭に//を付けることで可能となる。

(67)

変数の種類

• 変数に入っているものが何か解らないと困っ たことが発生する。 • 例) – “abc”+”123”=“abc123” 文字と文字なら連結 – “abc”+123=? 文字と数字なら? • 中に入っているものが何であるかを示す必要 がある。

(68)

変数の宣言方法

• Javaで変数を使用するときは、変数として宣言を 行う必要がある。 • 変数の宣言方法 – 型名 変数名; – 例) int a; //int型(整数)の変数aを用意する • 初期値付きの変数の宣言方法 – 型名 変数名 = 値; – 例) int a = 10; //int型の変数aを用意し10を代入する

(69)

数学的な計算

• Javaでは、簡単な四則演算(+,-,*,/)から平方 根、指数対数、三角関数などの数学で用いる 様々な関数が事前に用意されている • ここでは四則演算を学び、残りは必要に応じ て関数の説明を行う

(70)

クラス練習(2)

• 変数の値を変更して様々な計算を試してみよ う。

(71)

入力方法

• コンピュータでの計算方法を学んできたが、こ こまでの方法では事前にコードに打ち込んだ 値しか計算ができない。 • JOptionPaneを用いて利用する。 – 今回はテンプレートを用いるので特に利用はしな い

(72)

使用方法

• 以下のような方法で使用できる。

• 戻り値はString型なので適宜変換する必要が ある。

(73)

クラス練習(3)

• 直角三角形の面積をユーザから入力された 値によって計算するプログラムを作成しなさ い。

(74)

3.プログラムの形式仕様の紹介と演習

P

x y

(75)

プロセス仕様

(Process specification)

プロセスとは、入力によって出力を出す操作です。 プロセスの機能を次のような仕様で定義します。

process A (input) output

ext external variable

pre P

post Q

comment

(76)

事例1

process P(入力は整数) 出力は実数 pre 入力はゼロではない post 出力は、入力の5倍で入力プラス10を割った 結果より大きい実数である。 end_process P x y

(77)

事例1の形式プロセス仕様

process P(x: int) y: real

pre x > 0

post y > (x + 10) / x * 5

end_process

P

(78)

課題1

次のプロセス仕様を実装するプログラムをJavaで 作成しなさい。

process Computing(x: int) y: real

pre x > 0

post y > (x + 10) / x * 5

end_process

P

(79)

次のテストデータを用いて、作成されたプログラムをテストしなさ い。テスト結果(yの値)を次の表に記入、仕様のpre- and

postconditions (pre and post) を評価、及び自作したプログラム にある誤りを除去しなさい。 x y pre post 20 3000000 0 -20 -3000000 -4.56

(80)

テストでエラーを発見した条件

(81)

課題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

(82)

x s y pre post 500 30 4000000 5000000 0 0 -500 -30 -4000000 -5000000 35 20 次のテストデータを用いて、作成されたプログラムをテストしなさい。 テスト結果(yの値)を次の表に記入、仕様のpre- and

postconditions (pre and post) を評価、及び自作したプログラムに ある誤りを除去しなさい。

(83)

課題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

(84)

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) を評価、及び自作したプログラムに ある誤りを除去しなさい。

(85)

課題4

円の面積をユーザから入力された半径によって 計算するプログラムを作成しなさい。

– 円周率はMath.PIで3.14より正確な近似値を知る ことが出来る。

(86)

SOFL仕様

process Circle(radius: real) area: real pre radius > 0

post area = radius * radius * 3.14 end_process

(87)

課題5

三角形の面積を求めるプログラムを作成し なさい。

(88)

SOFL仕様

process Triangle(x: int, y: int) area: int pre x > 0 and y > 0

post area = x * y / 2 end_process

(89)

課題6

•簡単なじゃんけんプログラムを完成させてみよ う。 – 1,2,3の入力に対して、それぞれ”グー”, “チョキ”, “パー”を割り振る •コンピュータの値は乱数Math.random()を用い る。

(90)

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 = “あなたの勝ち”

(91)

課題7

5教科(数学, 英語, 理科, 社会, 国語)の平均値 を求めるプログラムを書いてみよう。

(92)

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

(93)

関数(メソッド)

• ここではプログラム中の命令のまとまりを「関数」とし てひとまとまりにする方法を述べる。 • 今のところ小さなプログラムしか書いてないが、大きな プログラムを書くときによく用いる。 • イメージ的には数学の関数をイメージすると良い – f(x)=x+1等 • これまでに使ったMath.sqrt(int)などもその内の一つ

(94)

関数の書き方

• 引数(値の受け渡し)がない場合 と書くことが出来る • testの部分は好きなアルファベットと数字の組み 合わせで書くことが出来る

(95)

関数の呼び出し方

• 関数の呼び出し方は以下のとおりである。

(96)

関数の書き方

(値渡しがある場合)

• 数学でのf(x)の関数のように、値の受け渡し を行うことも出来る。 • 上図の場合はint型のvalueの値を受け渡す 場合の関数の書き方である。

(97)

関数の呼び出し方

(値渡しがある場合)

(98)

関数の書き方

(戻り値がある場合)

• 関数に計算させた結果を取得することも出来 る。 • 関数から戻ってくる値を戻り値と呼ぶ 戻り値の型をここに書く return のあとに戻 り値を書く

(99)

関数の呼び出し方

(戻り値のある場合)

• 関数の戻り値を直接変数に代入することが出 来る

(100)

課題8 (高級)

Show Get Buy x z c r mbox mbox: moneybox

次のCDFD(Condition Data Flow Diagram) を実装しなさい。

Figure 1

e

(101)

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.

(102)

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.

(103)

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;

(104)

適当なテストデータを生成、作成されたプログラム をテストしなさい。そのテスト結果によって、必要で あれば、プログラムの誤りを除去しなさい。

(105)

学生の議論

学生たちは、数学とプログラミングおよびそれら の関係について自由に議論してもらいます。

(106)

参照

関連したドキュメント

• 1つの厚生労働省分類に複数の O-NET の職業が ある場合には、 O-NET の職業の人数で加重平均. ※ 全 367

CIとDIは共通の指標を採用しており、採用系列数は先行指数 11、一致指数 10、遅行指数9 の 30 系列である(2017

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

業種 事業場規模 機械設備・有害物質の種 類起因物 災害の種類事故の型 建設業のみ 工事の種類 災害の種類 被害者数 発生要因物 発生要因人

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge