...

平成27年度 後期 理学部数学科 計算機数学概論

by user

on
Category: Documents
11

views

Report

Comments

Transcript

平成27年度 後期 理学部数学科 計算機数学概論
10/8
計算機数学概論
脇 隼人
九州大学 マス・フォア・インダストリ研究所
2015-10-08
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/8 の講義・演習」にこの資料を掲載
1 / 10
10/8
今日の目標
Finder, テキストエディット, ターミナルの使い方を学ぶ 1
1. Finder
ファイルやフォルダを管理する MAC OS X のアプリケー
ション
フォルダを使って項目ごとにファイルを保存すること
2. テキストエディット
テキスト (文字を書く) のための MAC OS X のアプリケー
ション
この講義・演習では Java 言語でプログラムを書くために使
います (重要)
3. ターミナル
計算機を管理するための MAC OS X のアプリケーション
この講義・演習では Java 言語で書いたプログラムをコンパ
イル・実行するために使います (重要)
1
といっても大したことはない. 30 分くらいで終わるはず
2 / 10
10/8
Finder の使い方
1 次をクリック
Figure : 出典 : Apple.com
2
左側にある, 自分のアカウントが書いているところをクリッ
クする
3 / 10
10/8
Finder の使い方 (続き)
1 右クリックして, 「CS」という名前のフォルダを作る
2 この「CS」の下にこの講義・演習で作るファイルをおきま
しょう
注意 : もし Finder の左側に自分のアカウントが出なければ,
Finder の環境設定を変更する (4372277867 は私のアカウント)
4 / 10
10/8
テキストエディットの使い方
Finder の左側にある「アプリケーション」→「テキストエ
ディット」で起動
「テキストエディット」の環境設定をみて, 「フォーマット」
を「標準テキスト」する
課題 1 : この講義・演習への自分なりの目標や希望を手短に
書いて, フォルダ CS に保存する
5 / 10
10/8
ターミナルの使い方
Finder の左側にある「アプリケーション」→「ユーティリ
ティー」→ 「ターミナル」を起動
ターミナルで cd とタイプする.
次に cd CS とタイプする. これで, フォルダ CS にファイルを
作ることができる
touch test.txt とすると, フォルダ CS の下に text.txt と
いうファイルができる.
テキストエディットで text.txt を開く 2 . その際にフォルダ
に注意する.
2
もちろん何も書いてありません
6 / 10
10/8
寄り道 : 代表的なコマンドと意味
コマンド
cd CS
ls
pwd
mv fileA fileB
mv fileA FolderB
cp fileA fileB
cp fileA FolderB
mkdir FolderA
意味
フォルダ「CS」への移動
そのフォルダにあるファイルやフォルダを表示
今いるフォルダを表示
ファイル「fileA」を「fileB」と名前を変える
ファイル「fileA」をフォルダ「FolderB」へ移動
ファイル「fileA」を「fileB」へコピー
ファイル「fileA」をフォルダ「FolderB」へコピー
フォルダ「FolderA」を作る
その他, いろいろあるので Google などで検索して調べましょう
7 / 10
10/8
Java のコンパイルと実行
準備
講義・演習の Web page の「情報」から quiz1.java と
quiz2.java をフォルダ CS にダウンロード
ダウンロードの詳細は webct に記載
ターミナルを開いて, フォルダ CS に移る
コンパイル
コンパイルとは, Java 言語で書いたプログラムを機械後に変
換する操作
ターミナルで javac quiz1.java と打ち込んで return キー
を押す
8 / 10
10/8
実行
変換されたプログラムを実行する
ターミナルで java quiz1 と打ち込んで return キーを押す
Input positive integer とでるので, 何か正の整数を (半
角文字で) 入力する
課題 2 : 何回も実行することでこのプログラムが何をしてい
るか予想しなさい 3
課題 3 : quiz2.java に対してもコンパイル・実行して, このプ
ログラムが何をしているか予想しなさい 4
3
4
直接プログラムを読んで答えても構わない
直接プログラムを読んで答えても構わない
9 / 10
10/8
課題の提出先
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/8 の課題」をクリック
期限は, 10/8 PM 11:59 です
10 / 10
10/8 のコメント
10/22
計算機数学概論
脇 隼人
九州大学 マス・フォア・インダストリ研究所
2015-10-22
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/22 の講義・演習」にこの資料を掲載
1 / 16
10/8 のコメント
10/22
前回の課題 1 へのコメント I
一年の頃に受けたプログラミングは途中から理解できなかったも
のがあったので、この講義では最後までなんとか理解できるよう
に努力することを目標としています。
理解することも大切ですが, 「使えるようになる」というの
が大切です.
この講義では、あまりなじみのないプログラムについて、苦手意
識がなくなるようにする。
苦手意識をなくす事は大切です.
一年のときにターミナルを使ったときは、よく分からずに打って
いたので、ひとつひとつの意味を理解した上で使えるようになっ
て、応用などがきくようにしたいと思います。
JAVA だけでなく, ターミナルの使い方やスナップショットの
取り方など, JAVA 以外の技術も身につけてください
2 / 16
10/8 のコメント
10/22
前回の課題 1 へのコメント II
人に頼ることなく、自分の力だけで授業についていけるようにな
る。演習課題を毎回必ず出す。
無理をせずに, 困った時は教員・TA だけでなく友達にも頼り
ましょう
日常的にパソコンを使っていても触れることのできないプログラ
ミングについてこの機会にしっかり学習して、将来的に自分の研
究に使えたらと考えている。
この講義では最低限の情報しか与えられません. プログラミ
ング能力を高めるにはみなさんの興味・努力が必要です.
目標は Java 言語をうまく使いこなせるようになることです!
JAVA だけでなく, 様々な言語を必要に応じて使えるようにな
ることが大切です.
パソコンを使うのは苦手ですが、がんばりたいと思います。
3 / 16
10/8 のコメント
10/22
前回の課題 1 へのコメント III
「文房具」ですので好き嫌いにかかわらず使えるようになっ
てください.
自分で Android のアプリケーションを作れるようになりたい。
この講義だけではそれは難しいです.
4 / 16
10/8 のコメント
10/22
JAVA の初歩
目標
JAVA のおまじないから, 入出力, 変数と型, 代入, if 文, for 文,
while 文が使えるようになる
間違い探し (デバッグ) ができるようになる
注意
資料のプログラムを Copy & Paste しても正常に動かない工
夫をしています.
より簡単にプログラムが書けるような技術も紹介するので見
逃さないように
5 / 16
10/8 のコメント
10/22
おまじない
Hello World!を出力するプログラム
public class Hello {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
注意
Hello.java というファイルを作成しコンパイル&実行
javac Hello.java
java Hello
入力文字は全て半角文字
1 行目の Hello と 3 行目以外はおまじない.
1 行目の Hello とファイル名の Hello.java は同じものでな
いといけない
6 / 16
10/8 のコメント
10/22
Hello World!を出力するプログラム
public class Hello {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
注意 (続き 1)
”{”と”}”は対応する
1 行目の”{”の冒頭の位置と対応する”}”の位置を合わせる
2 行目の”{”の冒頭の位置と対応する”}”の位置を合わせる
2 行目と 4 行目は行頭で tab キーを 1 回押す
3 行目は Hello World!を出力する命令
"Hello World!"と出力するには, \"Hello World!"と書く
7 / 16
10/8 のコメント
10/22
出力
例 次の出力を表示するプログラム
3 +
5 *
7 /
7.0
4
6
8
/
= 7
= 30
= 0
8.0 = 0.875
public class keisan{
public static void main(String[] args){
System.out.println("3 + 4 = "+ (3+4));
System.out.println("5 * 6 = "+ (5*6));
System.out.println("7 / 8 = "+ (7/8));
System.out.println("7.0 / 8.0 = "+ (7.0/8.0));
}
}
課題 1
上記のプログラムを作成&実行しなさい. またそのプログラ
ムを提出すること
8 / 16
10/8 のコメント
10/22
補足
System.out.println("文字列"); は文字列と改行を出力
System.out.print("文字列"); は文字列だけを出力
例 : println と print ではこんなに違う?
public class keisan{
public static void main(String[] args){
System.out.print("3 + 4 = "+ (3+4));
System.out.print("5 * 6 = "+ (5*6));
System.out.print("7 / 8 = "+ (7/8));
System.out.print("7.0 / 8.0 = "+ (7.0/8.0));
}
}
出力
3 + 4 = 75 + 6 = 307 / 8 = 07.0 / 8.0 = 0.875
9 / 16
10/8 のコメント
10/22
おまじないと出力のまとめ
おまじないのまとめ
???.java
public class ???{
public static void main(String[] args){
(以下プログラム)
}
}
出力のまとめ
System.out.println
文字列 (と改行) を出力するには, System.out.println("文
字列");
System.out.print("文字列"); は文字列だけ
文字列 A 文字列 B を出力するには, +でつなげる
整数 / 整数 は商を出力することに注意!
10 / 16
10/8 のコメント
10/22
変数と型
変数 : 整数, 有理数, 文字などを保存する「箱」みたいな物
整数の場合 (整数型の変数 x を作って 4 を代入
int x;
x = 4;
あるいは
int x = 4;
注意 : 次のプログラムでは, 変数 x に 3 が代入される
int x = 4;
x = 3;
11 / 16
10/8 のコメント
10/22
有理数の場合 (有理数型の変数 x を作って 4.0 を代入
double x;
x = 4.0;
あるいは
double x = 4.0;
注意 : 次のプログラムでは, 変数 x に 3.5 が代入される
double x = 4.0;
x = 3.5;
文字の場合 (文字型の変数 x を作って c を代入
char x;
x = ’c’;
あるいは
char x = ’c’;
12 / 16
10/8 のコメント
10/22
課題 2 : 下の問いに答えるために, x, y を出力するプログラムを
作成しなさい. ファイル名を sample.java として提出すること.
代入について
int x = 10;
x = x + 1; // (1) 左辺の x の値はなんでしょう
x = x*x;// (2) 左辺の x の値はなんでしょう
double y = 5.5;
y = x*y;// (3) 左辺の y の値はなんでしょう
13 / 16
10/8 のコメント
10/22
(キーボードからの) 入力
整数の場合 (入力の型が整数の場合
import java.util.Scanner;// これは public class の前の行に書
くこと
(中略)
Scanner input = new Scanner(System.in)
;
int N = input.nextInt()
;
キーボードでタイプした値を, 整数型の変数 N に代入
有理数の場合 (入力の型が有理数の場合
import java.util.Scanner; // これは public class の前の行に書
くこと
(中略)
Scanner input = new Scanner(System.in);
double x = input.nextDouble();
キーボードでタイプした値を, 有理数型の変数 x に代入
14 / 16
10/8 のコメント
10/22
課題 3 : keisan3.java というファイルを作成し下記の値を出力
するプログラムを作成して提出しなさい.
キーボードから整数値 x と有理数 y を 1 つずつ入力して次を
出力させること.
x
y
x
x
x
=
=
+ y =
* y =
/ y =
15 / 16
10/8 のコメント
10/22
課題の提出先
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/22 の課題」をクリック
期限は, 10/22 PM 11:59 です
16 / 16
10/22
10/29
計算機数学概論
脇 隼人
九州大学 マス・フォア・インダストリ研究所
2015-10-29
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/29 の講義・演習」にこの資料を掲載
1 / 21
10/22
10/29
10/22 の課題の解説
注意
「10/29 の課題」に 10/22 の課題を提出している人が 2 名.
間違えないように
解答例を公開しているので, 必ずダウンロードして眺める or
読むこと
コンパイルの通らないプログラムは評価しない
間違った答えを出すプログラムは評価しない
補足
ターミナルには補完機能があります.
タブキーで, 補完してくれます
上下キーを押すと, 過去に入力したコマンドに遡れます
2 / 21
10/22
10/29
コメント 1 : 二重引用符のエラー
これは, 二重引用符 (double quotation) が悪い.
テキストエディットの設定を変更すること
3 / 21
10/22
10/29
コメント 2 : 記述ミス
これは, System.out.println の二つ目のピリオドがない
ちゃんと入力する
4 / 21
10/22
10/29
JAVA の初歩 2
目標
JAVA のおまじないから, 入出力, 変数と型, 代入, if 文, for 文,
while 文が使えるようになる
間違い探し (デバッグ) ができるようになる
注意
資料のプログラムを Copy & Paste しても正常に動かない工
夫をしています.
より簡単にプログラムが書けるような技術も紹介するので見
逃さないように
5 / 21
10/22
10/29
変数の型について
整数 (int)
計算機内部で整数を表現する際に 2 進法を使う. 1bit で 0 と 1
を表現
nbit なら
(−1)s
n−1
∑
ai 2i
i=1
ただし, s, a1 , . . . , an−1 ∈ {0, 1},
絶対値がとても大きい整数が表現できない
32bit なら, −231 から 231 − 1 まで可能
64bit なら, −263 から 263 − 1 まで可能
6 / 21
10/22
10/29
有理数 (double)
正確には有理数でなく浮動小数点数と呼ばれている
計算機内部での表現は, 通常 64bit 利用する.
s e e ··· ··· ··· e e m m ··· ··· ··· m m m
符号 s, 指数部 e(11 桁), 仮数部 m(52 桁)
(
x = (−1) × 2
s
e−1023
×
1+
52
∑
)
di 2
−i
i=1
表現できない数が沢山ある. 例えば x = 0.1
7 / 21
10/22
10/29
異なる型を扱うには
例 : 次はコンパイルするとエラーになる
int x = 1;
x = x + 1.0;
x は int だが 1.0 は double であるため
型変換 (キャスト) I
int x = 1;
x = x + (int)1.0; // x = 2 と出力
double から int へ変換 = 1.0 から 1 へ変換
int x = 1;
x = x + (int)1.75; // 実は 2.75 ではなく 2 となる
8 / 21
10/22
10/29
型変換 (キャスト) II
x
x
x
x
=
=
=
=
7/8; // x は 0 になる
(double)7/(double)8; // x は 0.875
7.0/8; // x は 0.875
7.0/8.0; // x は 0.875
注意 : double 型を扱うときは, 定数も double 型を扱うと間違
えが少なくなる. 例えば,
double y = 1.0; // y = 1; と書いても良い
y = 2.0 * Math.sin(Math.PI/2.0); // y = 2*Math.sin(Math.PI/2);
と同じ
9 / 21
10/22
10/29
if 文
if 文 : 条件分岐
if (条件式) {
条件式が true の処理;
}
条件式が正しければ true, 間違っていれば false
例 1 : p を降水確率だと思うと...
int p;
...
if (p >= 50) {
System.out.println("It will rain today.");
}
10 / 21
10/22
10/29
if 文 : 条件分岐
if (条件式) {
条件式が true の処理;
}else{
条件式が false の処理;
}
例 2 : p を降水確率だと思うと...
int p;
...
if (p >= 50) {
System.out.println("Need an umbrella.");
}else{
System.out.println("Not need an umbrella.");
}
11 / 21
10/22
10/29
if 文 : 条件分岐
if (条件式 A) {
条件式 A が true の処理;
}else if (条件式 B){
条件式 B が true の処理;
}else{
条件式 A も条件式 B も false の処理;
}
例 3 : p を降水確率だと思うと...
if (p >= 0 && p<=20) {
System.out.println("Sunny!");
}else if(p > 20 && p <=50 ){
System.out.println("Cloudy.");
}else{
System.out.println("Rainy.");
}
12 / 21
10/22
10/29
if 文 : 条件式の書き方
Tabelle: if 文の条件式
Java
p == 50
p != 50
p >= 50
p <= 50
p > 50
p < 50
数学
p = 50
p ̸= 50
p ≥ 50
p ≤ 50
p > 50
p < 50
意味
p が 50 に等しければ true, それ以外なら false
p が 50 に等しくなければ true, それ以外なら false
p が 50 以上ならば true, それ以外なら false
p が 50 以下ならば true, それ以外なら false
p が 50 より大きければ true, それ以外なら false
p が 50 より小さければ true, それ以外なら false
p >= 0 && p <= 20 は, 0 ≤ p かつ p ≤ 20
p >= 40 || p <= 20 は, p ≥ 40 または p ≤ 20
13 / 21
10/22
10/29
10/8 の課題から
if(N % 3 == 0 && N % 5 == 0){
System.out.println("FizzBuzz");
}else if(N % 3 == 0){
System.out.println("Fizz");
}else if(N % 5 == 0){
System.out.println("Buzz");
}else{
System.out.println(N);
}
入力 N に対して, FizzBuzz などを出力
注意 : N % 3 は N を 3 で割った余りを返す
14 / 21
10/22
10/29
数学クラス https://docs.oracle.com/javase/8/
docs/api/java/lang/Math.html) I
擬似乱数 : 計算機で生成するデタラメな数
double x = Math.random(); // 0 以上 1 未満の浮動小数点数を返す
int y = (int) (9*Math.random()); // 0 以上 8 以下の整数を返す
double z = 2*Math.random()-1.0; // -1 以上 1 未満の浮動小数点数
を返す
絶対値
double x = Math.abs(-3.0);
平方根, 立方根
double x = Math.sqrt(2.0);
double y = Math.cbrt(2.0);
15 / 21
10/22
10/29
数学クラス https://docs.oracle.com/javase/8/
docs/api/java/lang/Math.html) II
累乗, loge
double x = Math.pow(1.5, 6);// 1.5 の 6 乗
double y = Math.log(1.3);
sin(x), cos(x), tan(x)
double x = Math.sin(2.0);
double y = Math.cos(Math.PI/2.0);
double z = Math.tan(-Math.PI);
arcsin(x), arccos(x), arctan(x)
double x = Math.asin(0.5);
double y = Math.acos(0.5);
double z = Math.atan(-10);
16 / 21
10/22
10/29
数学クラス https://docs.oracle.com/javase/8/
docs/api/java/lang/Math.html) III
π, e
double x = Math.PI;
double y = Math.E;
切り上げ, 切り捨て
double x = Math.ceil(1.5);
double y = Math.floor(1.5);
17 / 21
10/22
10/29
課題 1 : double d = Math.random(); を使って, 以下のプログ
ラムを作成せよ. ファイル名は Omikuji.java とすること.
d < 0.1 ならば, Great blessing と出力
0.1 ≤ d < 0.3 ならば, Small blessing と出力
0.3 ≤ d < 0.5 ならば, Blessing と出力
0.5 ≤ d < 0.7 ならば, Curse と出力
0.7 ≤ d < 0.9 ならば, Small curse と出力
0.9 ≤ d < 1.0 ならば, Great curse と出力
最後に d の値も出力すること
18 / 21
10/22
10/29
課題 2 : 以下の公式を用いて求めた π の近似値と Java の数学ク
ラスを使って π を出力するプログラムを書いて提出しなさい.
ファイル名は pi.java にしなさい.
π
(Machin の公式)
4
π
(Euler の公式)
4
π
(Stormer の公式)
4
( )
(
)
1
1
= 4 arctan
− arctan
,
5
239
( )
( )
1
3
= 5 arctan
+ 2 arctan
,
7
79
( )
( )
(
)
1
1
1
= 6 arctan
+ 2 arctan
+ arctan
.
8
57
239
参考
double p1 = 4*Math.atan(1.0/5.0)-Math.atan(1.0/239.0); // Machin
...
System.out.println("Machin = "+ (p1*4));
...
System.out.println("PI = "+Math.PI);
19 / 21
10/22
10/29
課題 3 : 入力を西暦 N(正の整数で, 2500 以下とする) として, グ
レゴリオ暦で閏年かどうか判定するプログラムを書きなさい.
leap.java というファイル名にすること.
閏年の定義は以下の通りである (Wikipedia より):
N が 4 で割り切れないならば, 閏年でない
(N が 4 で割り切れて) さらに N が 100 で割り切れないならば,
閏年である
(N が 4 と 100 で割り切れて) さらに N が 400 で割り切れるな
らば, 閏年である
(N が 4 と 100 で割り切れて) さらに N が 400 で割り切れない
ならば, 閏年でない
出力例
Input a positive
Not leap
Input a positive
Leap
Input a positive
Not leap
Input a positive
Leap
integer :101
integer :204
integer :100
integer :1200
20 / 21
10/22
10/29
課題の提出先
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「10/29 の課題」をクリック
期限は, 10/29 PM 11:59 です
21 / 21
10/29
11/5
計算機数学概論
脇 隼人
九州大学 マス・フォア・インダストリ研究所
2015-11-05
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「11/5 の講義・演習」にこの資料を掲載
1 / 13
10/29
11/5
10/29 の課題の解説
コメント
よくできていました. できなかった人は, 解答例を公開して
いますので, 参考にしてください.
Omikuji.java や leap.java での if 文の使い方についてもう
少し工夫できます.
Omikuji.java
if(d < 0.1){
System.out.println("Great blessing");
}else if(d < 0.3){
System.out.println("Small blessing");
...(中略)...
}else if(d < 1.0){
System.out.println("Great curse");
}
System.out.println("d = "+d);
}
2 / 13
10/29
11/5
JAVA の初歩 3
目標
JAVA のおまじないから, 入出力, 変数と型, 代入, if 文, for 文,
while 文が使えるようになる
間違い探し (デバッグ) ができるようになる
注意
資料のプログラムを Copy & Paste しても正常に動かない工
夫をしています.
より簡単にプログラムが書けるような技術も紹介するので見
逃さないように
3 / 13
10/29
11/5
for 文
例題 (円周率の近似)
∞
π ∑ (−1)n
=
4
2n + 1
n=0
無限回の演算は不可能なので, これを有限和で扱うと, π/4 の近似
として扱える:
N
∑
(−1)n
π
pN =
→ (N → ∞)
2n + 1
4
n=0
それでは, N = 0 から N = 6 までをもとめるプログラムを書いて
みる
4 / 13
10/29
11/5
double p = 1.0; // N=0
System.out.println("p = "+p);
p = p - 1.0/3.0; // N = 1
System.out.println("p = "+p);
p = p + 1.0/5.0; // N = 2
System.out.println("p = "+p);
p = p - 1.0/7.0; // N = 3
System.out.println("p = "+p);
p = p + 1.0/9.0; // N = 4
System.out.println("p = "+p);
p = p - 1.0/11.0; // N = 5
System.out.println("p = "+p);
p = p + 1.0/13.0; // N = 6
System.out.println("p = "+p);
注意
p に (−1)n /(2n + 1) を追加してるだけ
N = 10 を計算するためにはこの繰り返しをもっと書かなけ
ればいけない
5 / 13
10/29
11/5
for 文を使うと...
double p = 1.0; // N = 0
int N = 10; // N=10 まで出力
for(int n=1; n < N+1; n++){
if(n % 2 == 0){
p = p + 1.0/(2*n+1);
}else{
p = p - 1.0/(2*n+1);
}
System.out.println("p = "+p);
}
6 / 13
10/29
11/5
for 文
for(初期化; 条件式; 次の一歩){
(繰り返す処理);
}
例 1 : 0 から 99 までの整数を出力する
for(int i=0; i<100; i++){
System.out.println("i = "+i);
}
1
i=0 ⇒ i<100 を判定 ⇒ i=0 を出力 ⇒ i=i+1 つまり i=1
2
i=1 ⇒ i<100 を判定 ⇒ i=1 を出力 ⇒ i=i+1 つまり i=2
3
以下繰り返し
4
i=100 ⇒ i<100 を判定 ⇒ 終わり
7 / 13
10/29
11/5
for 文 : 繰り返しの処理に便利
for(初期化; 条件式; 次の一歩){
(繰り返す処理);
}
例2 :
∑10
k=1 k
を計算
int sum = 0;
for(int k=1; k<=10; k++){
sum = sum + k;
}
1
k=1 ⇒ k<=10 を判定 ⇒ sum = 1 ⇒ k=k+1 つまり k=2
2
k=2 ⇒ k<=10 を判定 ⇒ sum = 3 ⇒ k=k+1 つまり k=3
3
以下繰り返し
4
k=11 ⇒ k<=10 を判定 ⇒ 終わり
8 / 13
10/29
11/5
二重の for 文
例 3 : DrawGraph1.java
public class DrawGraph1{
public static void main(String[] args){
for(int i=0; i<10; i++){
System.out.print(i +":");
for(int j=0; j<i; j++){
System.out.print("*");
}
System.out.println("");
}
}
}
外側の for 文は前と同じ
内側の for 文の条件式は j < i
内側の for 文が何をするのか, i を固定して考えてみよう
i の有効範囲, j の有効範囲に注意すること
9 / 13
10/29
11/5
課題 1 : (階乗の計算) 1 以上の整数 N を入力して, N! を出力す
るプログラムを提出しなさい. ファイル名は factorial.java と
しなさい.
N! := N × (N − 1) × · · · × 3 × 2 × 1.
課題 2 : 2 以上の整数 N を入力して, N の約数を全て出力するプ
ログラムを提出しなさい. ファイル名は divisor.java としな
さい.
参考
Input a positive integer :10
1
2
5
10
Input a positive integer :5
1
5
10 / 13
10/29
11/5
課題 3 : (二重 for 文 I) 次のような九九の表を出力するプログラ
ムを提出しなさい. ファイル名は Kuku.java としなさい.
課題 3 の出力
1*1=1,
2*1=2,
3*1=3,
4*1=4,
5*1=5,
6*1=6,
7*1=7,
8*1=8,
9*1=9,
1*2=2, 1*3=3, 1*4=4, 1*5=5, 1*6=6, 1*7=7, 1*8=8, 1*9=9,
2*2=4, 2*3=6, 2*4=8, 2*5=10, 2*6=12, 2*7=14, 2*8=16, 2*9=18,
3*2=6, 3*3=9, 3*4=12, 3*5=15, 3*6=18, 3*7=21, 3*8=24, 3*9=27,
4*2=8, 4*3=12, 4*4=16, 4*5=20, 4*6=24, 4*7=28, 4*8=32, 4*9=36,
5*2=10, 5*3=15, 5*4=20, 5*5=25, 5*6=30, 5*7=35, 5*8=40, 5*9=45,
6*2=12, 6*3=18, 6*4=24, 6*5=30, 6*6=36, 6*7=42, 6*8=48, 6*9=54,
7*2=14, 7*3=21, 7*4=28, 7*5=35, 7*6=42, 7*7=49, 7*8=56, 7*9=63,
8*2=16, 8*3=24, 8*4=32, 8*5=40, 8*6=48, 8*7=56, 8*8=64, 8*9=72,
9*2=18, 9*3=27, 9*4=36, 9*5=45, 9*6=54, 9*7=63, 9*8=72, 9*9=81,
11 / 13
10/29
11/5
課題 3 のヒント : 以下の???を埋めれば良い
for(int i=0; ???; i++){
for(int j=0; ???; j++){
???;
}
???;
}
また, 出力のためには System.out.println と
System.out.print を使うと良い
12 / 13
10/29
11/5
課題の提出先
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「11/5 の課題」をクリック
期限は, 11/5 PM 11:59 です
13 / 13
11/5
11/12
計算機数学概論
脇 隼人
九州大学 マス・フォア・インダストリ研究所
2015-11-12
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「11/12 の講義・演習」にこの資料を掲載
1 / 11
11/5
11/12
前回の課題について
総評
よくできていました.
次のプログラムはどこが間違っているでしょう
public class divisor {
public static void main (String[] args){
int n = 1;
for(int a = 1; a<=n; n++){
if(n%a==0){
System.out.println(a);
}
}
}
}
2 / 11
11/5
11/12
コメント
実際に実行してみるとどうなるでしょう
こういうのを「無限ループ」という
Control キーを押しながら c を押すと強制的に終了します
for 文がおかしい
3 / 11
11/5
11/12
JAVA の初歩 4
目標
JAVA のおまじないから, 入出力, 変数と型, 代入, if 文, for 文,
while 文が使えるようになる
間違い探し (デバッグ) ができるようになる
注意
資料のプログラムを Copy & Paste しても正常に動かない工
夫をしています.
より簡単にプログラムが書けるような技術も紹介するので見
逃さないように
4 / 11
11/5
11/12
while 文
while 文 : 繰り返しの処理
while(条件式){
(繰り返す処理);
}
例 1 : i=0, . . ., 99 を出力する
int i = 0;
while(i < 100){
System.out.println("i = "+i);
i = i + 1;
}
1
2
3
4
i = 0 ⇒while 文の条件式 ⇒ i = 0 を出力 ⇒ i=1
i = 1 ⇒while 文の条件式 ⇒ i = 1 を出力 ⇒ i=2
繰り返す
i = 100 ⇒ while 文の条件式 ⇒ 終了
5 / 11
11/5
11/12
例 2 : x = 100 に 1.08 を何回かけ算すると 200 を超えるか
double x = 100.0;
int c = 0;
while(x <= 200){
x = x * 1.08;
c = c + 1;
}
System.out.println("c = "+c);
1
x = 100.0 ⇒while 文の条件式 ⇒ x = 108.0, c = 1
2
x = 108.0 ⇒while 文の条件式 ⇒ x = 116.64, c = 2
3
繰り返す
4
x = 215.89... ⇒ while 文の条件式 ⇒ while 終了
5
c = 10 を出力
6 / 11
11/5
11/12
while 文 : 繰り返しの処理
while(条件式){
(繰り返す処理);
}
do while 文 : 繰り返しの処理
do{
(繰り返す処理);
}while(条件式);
違いは条件式が後ろにある, ということ
無限ループ
while(true){
...
}
break を入れると, 無限ループから抜け出すことができる.
ctrl-C で止めることもできる.
7 / 11
11/5
11/12
for, while 使い分け
for と while は似ています. for でも while でも書ける場合はあ
ります. どちらを使うべきかは, 明確な基準は無く状況によります
for で書いた方が良い場合
繰り返し処理の回数があらかじめ分かっている
繰り返し処理のための条件式や, 次の一歩が簡単
など
while で書いた方が良い場合
繰り返しの回数があらかじめ分かっていない
繰り返し処理のための条件式が複雑
など
8 / 11
11/5
11/12
課題 1 : ユーザが整数値 0 を入力するまで, 繰り返し整数の入力
を求めて, ユーザが 0 を入力するとそれまでに入力された数値の
総和を出力するプログラムを提出しなさい. ファイル名は
inputintsum.java としなさい.
参考
import java.util.Scanner;
...
while(条件式){
scanner input = new Scanner(System.in);
System.out.print("Input an integer :");
N = input.nextInt();
(手続き);
}
上記の, 条件式と手続きを考えなさい. N が int であることは
while の外で記述した方が良い. do-while の方が書きやすい?
9 / 11
11/5
11/12
課題 1 の出力例
Input
Input
Input
Input
sum =
a positive
a positive
a positive
a positive
31
integer
integer
integer
integer
:10
:20
:1
:0
Input
Input
Input
Input
sum =
a positive
a positive
a positive
a positive
15
integer
integer
integer
integer
:13
:-2
:4
:0
10 / 11
11/5
11/12
課題 2 : (オイラーの定数の計算) オイラー定数 γ の近似値とし
て γN を計算したい (ただし, N は正の整数):
γN :=
N
∑
1
− log(N).
k
k=1
while 文を使って, 初めて |γN − γN−1 | ≤ ϵ となる N を出力するプ
ログラムを提出しなさい. 提出するプログラムは, 例えば,
ϵ = 10−6 として計算しなさい.
ϵ = 10−6 は double eps = 1.0e-6; と書けばよい.
ファイル名は eulersconst.java としなさい.
ちなみに, limN→∞ γN = 0.5772156649 であまり精度の良い
値にならないはず
11 / 11
11/5
11/12
課題の提出先
URL : http://webct.kyushu-u.ac.jp
上記から, 「計算機数学概論」を選択
「コンテンツ」→「11/12 の課題」をクリック
期限は, 11/12 PM 11:59 です
12 / 11
Fly UP