ji-6. Javaプログラミングにお
ける配列と数値計算アルゴリ
ズムの基礎
1
Java プログラミング入門)
URL: https://www.kkaneko.jp/pro/ji/index.html
金子邦彦
内容
例題1.月の日数
配列とは.配列の宣言.配列の添字.
例題2.ベクトルの内積
例題3.棒グラフを描く
例題4.Horner 法による多項式の計算
例題5.エラトステネスのふるい
配列と繰り返し計算の関係
2
目標
配列とは何かを理解し,integer, real の配列を使
ったプログラムを書けるようになる
配列繰り返し文組み合わせて多量のデータ
を扱えるようになる
3
配列
データの並びで,番号(添字)が付いている
4
添字
オンライン開発環境 Online GDB
プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
ウェブブラウザを使う
たくさんの言語を扱うことができる
Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
オンラインなので、「秘密にしたいプログラム」
を扱うには十分な注意が必要
5
Online GDB Java を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com
6
Language」のところで,「Javaを選ぶ
7
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
8
例題1.月の日数
年と月を読み込んで,日数を求めるプログラムを
作る
うるう年の2月ならば29
日数を求めるために,サイズ12(1から12まで)
integer 配列を使う
例) 2021 11 30
9
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int y, m;
int num[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Scanner s = new Scanner(System.in);
System.out.println("Please Enter y(year) =");
y = s.nextInt();
System.out.println("Please Enter m(month) =");
m = s.nextInt();
if ((m == 2) && (((y % 400) == 0) || (((y % 100) != 0) && ((y % 4) == 0)))) {
System.out.printf("number of days %d/%d is 29¥n", y, m);
} else {
System.out.printf("number of days %d/%d is %d¥n", y, m, num[m]);
}
}
}
10
配列からの
読み出し
配列への
書き込み
うるう年の判定
月の日数
11
実行結果の例
プログラムとデータ
12
メモリ
num[1]
num[m];
配列からの値の
読み出し
num[2]
num[3]
num[4]
num[5]
num[6]
num[7]
num[8]
num[9]
num[10]
num[11]
num[12]
31
28
31
30
31
30
31
31
30
31
30
31
num[0]
0
配列の宣言
配列には,名前データの種類のこと)と
イズがある
整数データ int
浮動小数データ float double
配列を使うには,配列の使用をコンピュータに伝
えること(宣言)が必要
13
整数
名前は
num
配列の中身を読み書きするときに
は,配列の名前と添字を書く
例) num[m]
添字
配列の読み書き
値の初期化
名前と添字で読み書き
14
例題2.ベクトルの内積
ベクトル(1.9, 2.8, 3.7と,ベクトル(4.6, 5.5,
6.4内積を表示するプログラムを作る
2つのベクトルの内積の計算のために,サイズ3の配列
を2つ使う
15
ベクトルの内積
ベクトルの成分から内積を求める
16
( )
aaaa
210
,,=
babababa
221100
++=
( )
bbbb
210
,,=
のとき
public class Main
{
public static void main(String[] args) {
double p;
int i;
double u[] = {1.9, 2.8, 3.7};
double v[] = {4.6, 5.5, 6.4};
p = 0;
for(i = 0; i <= 2; i++) {
p = p + (u[i] * v[i]);
}
System.out.printf("p(product) = %f¥n", p);
}
}
17
配列からの
読み出し
配列への
書き込み
ベクトルの内積
18
実行結果の例
プログラムとデータ
19
メモリ
u[0]
p = p + (u[i] * v[i]);
配列からの
読み出し
u[1]
u[2]
1.9
2.8
3.7
v[0]
v[1]
v[2]
4.6
5.5
6.4
ベクトルの内積
20
繰り返し
1回目
i = 0 i < 3 が成り立つ p = p + u[0] * v[0];
繰り返し
2回目
繰り返し
3回目
繰り返し
4回目
i = 1 i < 3 が成り立つ p = p + u[1] * v[1];
i = 2 i < 3 が成り立つ p = p + u[2] * v[2];
i = 3 i < 3 が成り立たない
i の値
繰り返し条件式
が成り立つか
ip の値
つまり ip の値は u[0]*v[0]
つまり ip の値は u[0]*v[0] + u[1]*v[1]
つまり ip の値は u[0]*v[0] + u[1]*v[1]
+u[2]*v[2]
例題3.棒グラフを描く
整数の配列から,その棒グラフを表示するプログ
ラムを作る.
ループの入れ子で,棒グラフの表示を行う
21
public class Main
{
public static void main(String[] args) {
int i, j;
int a[] = {6, 4, 7, 1, 5, 3, 2};
for(i = 0; i < 7; i++) {
for(j = 1; j <= a[i]; j++) {
System.out.printf("*");
}
System.out.printf("¥n");
}
}
}
22
配列からの
読み出し
配列への
書き込み
棒グラフを描く
23
実行結果の例
プログラムとデータ
24
メモリ
a[0]
for(j = 1; j <= a[i]; j++) {
配列からの
読み出し
a[1]
a[2]
6
a[3]
a[4]
a[5]
a[6]
4
7
1
5
3
2
例題4. Horner 法による多項式の計算
n次の多項式
f(x) = a0 + a1x + a2x2 + ・・・ +anxn
について,次数 n と,係数 a0 から an を読み込ん
で,f(x) を計算するプログラムを作る
まず n を読み込んで,その後に a0 から an を読み込む.
最後に x を読み込む.
次ページで説明する Horner法を使う
読み込んだ係数は,いったん配列に格納する. n は高々
20とする.
25
Horner
f(x) = a0 + a1x + a2x + ・・・ +anx
= a0 + ( a1 + ( a2 + ・・・ + ( an-1 + an x ) x
・・) x ) x
例えば, 5 + 6x + 3x
= 5 + ( 6 + 3x ) x
26
計算手順
an
an-1 + anx
an-2 + ( an-1 + anx ) x
・・・ a
0
まで続ける)
2
n
2
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int i, n;
double x, y;
double a[] = new double[20];
Scanner s = new Scanner(System.in);
System.out.println("Please Enter n =");
n = s.nextInt();
for(i = 0; i <= n; i++) {
System.out.printf("Please Enter a[%d] =¥n", i);
a[i] = s.nextFloat();
}
System.out.println("Please Enter x =");
x = s.nextFloat();
y = a[n];
i = n - 1;
while(i >= 0) {
y = y * x + a[i];
i = i - 1;
}
System.out.printf("y = %8.3f", y);
}
}
27
配列からの読み出し
配列への書き込み
配列からの読み出し
実行結果の例
28
例題5.エラトステネスのふる
エラトステネスのふるい」の原理に基づいて
を求め,結果を表示するプログラムを作成する
配列を使う
配列には,添字が素数なら1そうでなければ0をセ
ットする
29
エラトステネスのふるい (1/3)
30
10 11 ・・・
2×2
2×3
2×4
2×5
まず,2の倍数を消す
エラトステネスのふるい (2/3)
31
10 11 ・・・
3×2
次に,3の倍数を消す
3×3
エラトステネスのふるい (3/3)
32
10 11 ・・・
次に,5の倍数を消す
(「4の倍数」は考えない.
それは,「4」がすでに消えているから)
5×2
import java.lang.Math;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int i, n, max;
int p[] = new int[100000];
Scanner s = new Scanner(System.in);
System.out.println("Please Enter max =");
max = s.nextInt();
for(i = 1; i <= max; i++) {
p[i] = 1;
}
n = 2;
while(n <= Math.sqrt(max)) {
i = 2;
while((n * i) <= max) {
p[n * i] = 0;
i = i + 1;
}
n = n + 1;
while((p[n] == 0) && (n <= Math.sqrt(max))) {
n = n + 1;
}
}
for(i = 2; i <= max; i++) {
if(p[i] == 1) {
System.out.printf("%d, ", i);
}
}
}
}
33
p[1] から a[100] までを
「1」にセット
まず「2」の倍数は,素数ではない
n の倍数は素数ではない
n の「次」の
素数を探す
求めた素数の表示
実行結果の例
34