177 Views
February 23, 22
スライド概要
Java プログラミング入門(スライド資料とプログラム例)(全6回)
https://www.kkaneko.jp/pro/ji/index.html
金子邦彦研究室ホームページ
https://www.kkaneko.jp/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
ji-6. 配列 (Java プログラミング入門) URL: https://www.kkaneko.jp/cc/ji/index.html 金子邦彦 1
内容 • 例題1.月の日数 配列とは.配列の宣言.配列の添字. • 例題2.ベクトルの内積 • 例題3.棒グラフを描く • 例題4.Horner 法による多項式の計算 • 例題5.エラトステネスのふるい 配列と繰り返し計算の関係 2
目標 • 配列とは何かを理解し,integer, real の配列を使 ったプログラムを書けるようになる • 配列と繰り返し文を組み合わせて,多量のデータ を扱えるようになる 3
配列 データの並びで,番号(添字)が付いている 添字 0 1 2 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
プログラムとデータ num[m]; 配列からの値の 読み出し メモリ num[0] num[1] num[2] num[3] num[4] num[5] num[6] num[7] num[8] num[9] num[10] num[11] num[12] 0 31 28 31 30 31 30 31 31 30 31 30 31 12
配列の宣言 • 配列には,名前と型(データの種類のこと)とサ イズがある • 整数データ int • 浮動小数データ float や double • 配列を使うには,配列の使用をコンピュータに伝 えること(宣言)が必要 整数 名前は num 配列の中身を読み書きするときに は,配列の名前と添字を書く 例) num[m] 添字 13
配列の読み書き • 値の初期化 • 名前と添字で読み書き 14
例題2.ベクトルの内積 • ベクトル(1.9, 2.8, 3.7)と,ベクトル(4.6, 5.5, 6.4)の内積を表示するプログラムを作る 2つのベクトルの内積の計算のために,サイズ3の配列 を2つ使う 15
ベクトルの内積 ベクトルの成分から内積を求める → a = (a , a , a ) b = (b , b , b ) → 0 → 1 → a •b = 0 2 a b 0 0 + ab 1 1 1 + 2 a b 2 のとき 2 16
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
プログラムとデータ メモリ u[0] u[1] u[2] 1.9 2.8 3.7 v[0] v[1] v[2] 4.6 5.5 6.4 p = p + (u[i] * v[i]); 配列からの 読み出し 19
ベクトルの内積 i の値 繰り返し 1回目 i=0 繰り返し条件式 が成り立つか i < 3 が成り立つ ip の値 p = p + u[0] * v[0]; つまり ip の値は u[0]*v[0] 繰り返し 2回目 i=1 i < 3 が成り立つ p = p + u[1] * v[1]; つまり ip の値は u[0]*v[0] + u[1]*v[1] 繰り返し 3回目 繰り返し 4回目 i=2 i < 3 が成り立つ p = p + u[2] * v[2]; つまり ip の値は u[0]*v[0] + u[1]*v[1] +u[2]*v[2] i=3 i < 3 が成り立たない 20
例題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
プログラムとデータ メモリ a[0] a[1] a[2] a[3] a[4] a[5] a[6] 6 4 7 1 5 3 2 for(j = 1; j <= a[i]; j++) { 配列からの 読み出し 24
例題4. Horner 法による多項式の計算 • n次の多項式 f(x) = a0 + a1・x + a2・x2 + ・・・ +an・xn について,次数 n と,係数 a0 から an を読み込ん で,f(x) を計算するプログラムを作る • まず n を読み込んで,その後に a0 から an を読み込む. 最後に x を読み込む. • 次ページで説明する Horner法を使う • 読み込んだ係数は,いったん配列に格納する. n は高々 20とする. 25
Horner法 f(x) = a0 + a1・x + a2・x + ・・・ +an・x 2 n = a0 + ( a1 + ( a2 + ・・・ + ( an-1 + an ・x ) x ・ ・・) x ) x 例えば, 5 + 6x + 3x 2 = 5 + ( 6 + 3x ) x 計算手順 ① an ② an-1 + an・x ③ an-2 + ( an-1 + an・x ) x ・・・ (a0 まで続ける) 26
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) 2 3 4 2×2 5 6 2×3 7 8 2×4 9 10 11 ・・・ 2×5 まず,2の倍数を消す 30
エラトステネスのふるい (2/3) 2 3 4 5 6 3×2 7 8 9 10 11 ・・・ 3×3 次に,3の倍数を消す 31
エラトステネスのふるい (3/3) 2 3 4 5 6 7 8 9 10 11 ・・・ 5×2 次に,5の倍数を消す (「4の倍数」は考えない. それは,「4」がすでに消えているから) 32
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();
p[1] から a[100] までを
for(i = 1; i <= max; i++) {
p[i] = 1;
「1」にセット
}
n = 2;
まず「2」の倍数は,素数ではない
while(n <= Math.sqrt(max)) {
i = 2;
while((n * i) <= max) {
p[n * i] = 0;
n の倍数は素数ではない
i = i + 1;
}
n = n + 1;
n の「次」の
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
実行結果の例 34