Javaによるアルゴリズムとデータ構造

Similar documents
明解Javaによるアルゴリズムとデータ構造

新・明解Javaで学ぶアルゴリズムとデータ構造

新・明解C言語で学ぶアルゴリズムとデータ構造

JavaプログラミングⅠ

C言語によるアルゴリズムとデータ構造

新・明解Javaで学ぶアルゴリズムとデータ構造

明解Javaによるアルゴリズムとデータ構造

Java講座

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

プログラミング入門1

解きながら学ぶJava入門編

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(Java) サンプル問題 知識科目 第 1 問 (

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

2

Microsoft Word - VBA基礎(3).docx

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

2

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

新版 明解C++入門編

JavaプログラミングⅠ

JavaプログラミングⅠ

明解Java入門編

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

JavaプログラミングⅠ

8 if switch for while do while 2

メソッドのまとめ

Prog2_9th

新・明解Java入門

JavaプログラミングⅠ

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

問題1 以下に示すプログラムは、次の処理をするプログラムである

プログラミング実習I

Microsoft Word - keisankigairon.ch doc

JavaプログラミングⅠ

JAVA入門

PowerPoint プレゼンテーション

オブジェクト指向プログラミング・同演習 5月21日演習課題

JavaプログラミングⅠ

解きながら学ぶC++入門編

情報実習Ⅱ

微分方程式 モデリングとシミュレーション

JavaプログラミングⅠ

Assignment_.java 課題 : 転置行列 / class Assignment_ public static void main(string[] args) int i,j; int[][] array = 1,,,,,,,,,,,,,1,1,; 行 列行列 i

JavaプログラミングⅠ

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

Javaプログラムの実行手順

ガイダンス

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

K227 Java 2

文字列操作と正規表現

Transcription:

1 algorithm List 1-1 a, b, c List 1-1 // import java.util.scanner; class Max3 { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); int a, b, c; int max; // Chap01/Max3.java a1 Ÿ b3 Ÿ c2 Ÿ 3 System.out.println(""); System.out.print("a"); a = stdin.nextint(); System.out.print("b"); b = stdin.nextint(); System.out.print("c"); c = stdin.nextint(); max = a; if (b > max) max = b; if (c > max) max = c; System.out.println("" + max + ""); max a b max max b c max max c flowchart Fig.1-1 4 4 4 4 4 4 if

max = a; if (b > max) max = b; if (c > max) max = c; 上から下へと流れていく 開始 a max b > max No Yes b max b > c> a である場合に通る経路 1-1 c > max Yes Fig.1-1 No c max 終 了 b > max c > max a max a max フローチャートの記号は p.8 で解説します a, b, c 1, 3, 2 a, b, c 1, 2, 3 3, 2, 1 5, 5, 5 5, 3, 5 a, b, c 6, 10, 7-10, 100, 10 b c a List 1-2a, b, c 3

1 List 1-2 Chap01/Max3m.java // class Max3m { //--- a, b, c ---// static int max3(int a, int b, int c) { int max = a; if (b > max) max = b; if (c > max) max = c; return max; // public static void main(string[] args) { System.out.println("max3(3,2,1) = " + max3(3,2,1)); System.out.println("max3(3,2,2) = " + max3(3,2,2)); System.out.println("max3(3,1,2) = " + max3(3,1,2)); System.out.println("max3(3,2,3) = " + max3(3,2,3)); System.out.println("max3(2,1,3) = " + max3(2,1,3)); System.out.println("max3(3,3,2) = " + max3(3,3,2)); System.out.println("max3(3,3,3) = " + max3(3,3,3)); System.out.println("max3(2,2,3) = " + max3(2,2,3)); System.out.println("max3(2,3,1) = " + max3(2,3,1)); System.out.println("max3(2,3,2) = " + max3(2,3,2)); System.out.println("max3(1,3,2) = " + max3(1,3,2)); System.out.println("max3(2,3,3) = " + max3(2,3,3)); System.out.println("max3(1,2,3) = " + max3(1,2,3)); max3(3,2,1) = 3 max3(3,2,2) = 3 max3(3,1,2) = 3 max3(3,2,3) = 3 max3(2,3,2) = 3 max3(1,3,2) = 3 max3(2,3,3) = 3 max3(1,2,3) = 3 // abc // abc // acb // acb // cab // abc // abc // cab // bac // bac // bca // bca // cba Column 1-1 3 method max3 int a, b, c int ここでは 三値の最大値を求めるアルゴリズムが正しいことを 論理的に確認するとと もに プログラムの実行結果からも確認したわけです 四値の最大値を求めるメソッドを作成せよ ( もちろん それをテストするプログラム=クラスを作成しなければならない ) static int max4(int a, int b, int c, int d)

三値の最小値を求めるメソッドを作成せよ static int min3(int a, int b, int c) 四値の最小値を求めるメソッドを作成せよ static int min4(int a, int b, int c, int d) Column 1-1 三値の大小関係の組合せ 13 種類は 下図 によって列挙できます ( このような木を と呼びます ) 左端の枠から始めて 枠内 の条件が成立すれば上側の黒線を 成立しな ければ下側の青線をたどっていきます 右端 の枠内が大小関係です なお 最大値 最小値とは異なり 中央値 を求める手続きは複雑であり 右のようにな ります ( 各 return に与えられた注釈,, は下の図と対応しています ) static int med3(int a, int b, int c) { if (a >= b) if (b >= c) return b; else if (a <= c) return a; else return c; else if (a > c) return a; else if (b > c) return c; else return b; A B F G D E H C I J K L M 1-1 a b Yes No a>b a c b c b c a>c b c b>c a c b>c H 3 2 2 c>a=b I 3 2 1 b>a>c J 3 2 2 b>a=c b>c M 3 2 1 c>b>a A 3 2 1 a>b>c B 3 2 2 a>b=c a>c E 3 2 1 c>a>b F 3 3 2 a=b>c G 3 3 3 a=b=c K 3 2 1 b>c>a L 3 3 2 b=c>a C 3 2 1 a>c>b D 3 3 2 a=c>b

1 List 1-3 Fig.1-2 List 1-3 // import java.util.scanner; class JudgeSign { Chap01/JudgeSign.java 5 Ÿ public static void main(string[] args) { Scanner stdin = new Scanner(System.in); System.out.print(""); int n = stdin.nextint(); -5 Ÿ if (n > 0) System.out.println(""); else if (n < 0) System.out.println(""); else System.out.println(""); 0 Ÿ n 4 4 4 4 Fig.1-2 開 始 a n > max 0 No Yes それは正です a n < max 0 No Yes それは負です それは0です 終 了

if List 1-3 if (n == 1) System.out.println(""); else if (n == 2) System.out.println(""); else if (n == 3) System.out.println(""); n 1 2 3 if if ( ) else if ( ) else List 1-3 n 4 5-10 1 2 if 1-1 if (n == 1) System.out.println(""); else if (n == 2) System.out.println(""); else if (n == 3) System.out.println(""); else ; // List 1-3 if Column 1-2 プログラミング言語の世界では + や - などの演算を行う記号を(operator) と呼び 演算の対象となる式のことを(operand) と呼びます たとえば 大小関係の比較を行う式 a > b において 演算子は > であって オペランドは a と b です このように二つのオペランドをもつ演算子を(binary operator) と呼びます Java には 2 項演算子のほかにも オペランドが一つの(unary operator) と オペランドが三つの(ternary operator) があります? : 演算子は Java で唯一の3 項演算子です 式 a? b : c が評価されると 式 a を評価した値が真であれば b の値を生成し 偽であれば c の値を生成します

1 flowchart データ 処理 定義済み処理 判断

名前 名前 1-1 端子 List 1-2 を参考にして 三値の大小関係 13 種類すべてに対して中央値を求めて表 示するプログラムを作成せよ 中央値を求める手続きは 以下のようにも実現できるものの Column 1-1 中に 示した med3 と比較すると実行効率が悪い その理由を考察せよ static int med3(int a, int b, int c) { if ((b >= a && c <= a) (b <= a && c >= a)) return a; else if ((a > b && c < b) (a < b && c > b)) return b; return c;

101 1 n n 2 1 + 2 n 3 1 + 2 + 3 1 + 2 + + n Fig.1-3 List 1-4 Fig.1-3 開 始 0 sum 1 i ここを通過する際の i と sum の値の変化 i n Yes sum + i sum i + 1 i No i sum 1 0 2 1 3 3 4 6 5 10 6 15 終 了 while while ( 式 ) 文

11 List 1-4 // 1, 2,, nwhile import java.util.scanner; class SumWhile { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); Chap01/SumWhile.java 1n n5 Ÿ 1515 1-2 System.out.println("1n"); System.out.print("n"); int n = stdin.nextint(); int sum = 0; int i = 1; // while (i <= n) { // in sum += i; // sumi i++; // i System.out.println("1" + n + "" + sum + ""); true 文 while 文では 最初に を評価した結果が false であればループ本体は一度も実行され ません この点が を実現する do 文 (p.14) と大きく異なります sum 0 i 1 i n i n i n i sum 複合代入演算子 += は右辺の値を左辺に加えます 単項演算子である増分演算子 ++ はオ ペランドの値を一つ増やします i n while i n n + 1 List 1-4 の while 文終了時点における変数 i の値が n + 1 となることを確認せよ ( 変 数 i の値を表示するプログラムを作成せよ )

121 while for for List 1-5 List 1-5 // 1, 2,, nfor import java.util.scanner; class SumFor { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); Chap01/SumFor.java 1n n5 Ÿ 1515 System.out.println("1n"); System.out.print("n"); int n = stdin.nextint(); int sum = 0; // for (int i = 1; i <= n; i++) sum += i; // sumi System.out.println("1" + n + "" + sum + ""); Fig.1-4 loop limit Fig.1-4 開 始 0 sum 合計 i : 1, 1, n 合計 i : 1, 1, n sum + i sum i の値を 1 から始めて n になるまで一つずつ増やしながら繰り返す 終値増分初期値変数名 合計 終 了

13 i 1, 2, 3, 1 n 1 sum += i; Fig.1-5 for 1-2 for (for 初期化式 ; 式 1; 式 2) 文 for 初期化式 式 1 true 文 文 式 2 Fig.1-5 合計 i : 1, 2,, n sum + i sum 合計 for 初期化式 式 1 式 2 のいずれも省略でき ます ( セミコロンは省略できません ) また for 初期化式中で宣言された変数は その for 文の中でのみ利用できるものであり for 文の終了とともに消えてしまいます 4 4 4 for 文の実行が終了した後にも値が必要で あれば 以下のように for 文に先立って変 数を宣言しなければなりません int i; for (i = 1; i <= n; i++) sum += i; List 1-5 のプログラムをもとにして たとえば n が 7 であれば 1 から 7 までの和は 28 です ではなくて 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 と表示するプログラムを作成せよ ガウスの方法 ( たとえば 1 から 10 までの和であれば (1 + 10) * 5 によって求める ) を用いて和を求めるプログラムを作成せよ 整数 a, b を含め その間の全整数の和を求めて返す以下のメソッドを作成せよ static int sumof(int a, int b) なお a と b の大小関係に関係なく和を求めること たとえば a が 3 で b が 5 であれば 12 を a が 6 で b が 4 であれば 15 を返すこと

141 List 1-5 n -5 1-5 0 n List 1-6 List 1-6 Chap01/SumForPos.java // 1, 2,, ndon import java.util.scanner; class SumForPos { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); int n; 1n n-6 Ÿ n0 Ÿ n10 Ÿ 11055 System.out.println("1n"); do { System.out.print("n"); n = stdin.nextint(); while (n <= 0); int sum = 0; // for (int i = 1; i <= n; i++) sum += i; // sumi System.out.println("1" + n + "" + sum + ""); n 0 n do do 文 while ( 式 ); while 文や for 文などとは異なり 構文の末尾にセミコロン ; が付きます

15 do Fig.1-6 Fig.1-6 1-2 読込み n を入力 n を入力 Yes n 0 No n > 0 読込み n の値は正になっている n の値は正になっている n 0 do n 右に示すように 二つの変数 a, b に整数値を読み込んで b - a の値を表示するプログラムを作成せよ なお 変数 b に読み込んだ値が a 以下であれば再入力させること a6 Ÿ b6 Ÿ a b8 Ÿ b - a2 正の整数値を読み込んで その値の桁数を表示するプログラムを作成せよ たとえば 135 を読み込んだら その数は 3 桁です と表示し 1314 を読み込んだら その数は 4 桁です と表示すること

161 List 1-7 List 1-7 // public class Multi99Table { public static void main(string[] args) { System.out.println("----- -----"); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) System.out.printf("%3d", i * j); System.out.println(); Chap01/Multi99Table.java ----- ----- 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 Fig.1-7 i j for i 1 9 for j 1 9 1 i 1 j 1 9 1 * j i 2 j 1 9 2 * j i 3 j 1 9 3 * j 以下省略 i 1 9

17 Fig.1-7 開始 行ループ i : 1, 1, 9 列ループ j : 1, 1, 9 i * j を表示 列ループ 改行 行ループ 終了 変数 i と j の変化 i 1 j 1 2 3 4 5 6 7 8 9 2 1 2 3 4 5 6 7 8 9 3 1 2 3 4 5 6 7 8 9 4 1 2 3 4 5 6 7 8 9 5 1 2 3 4 5 6 7 8 9 6 1 2 3 4 5 6 7 8 9 7 1 2 3 4 5 6 7 8 9 8 1 2 3 4 5 6 7 8 9 9 1 2 3 4 5 6 7 8 9 j の値を1から9まで増やして繰り返す 1-2 j 1 9 右のように 九九の表の上と左に 掛ける数を表示するプログラムを作成せよ 表示には マイナス記号 - プラス記号 + 縦 線記号 を用いること 1 2 3 4 5 6 7 8 9 ---+--------------------------- 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81 九九の掛け算ではなく足し算を行う表を表示するプログラムを作成せよ 右図のように 読み込んだ段数を一辺としてもつ正方形 を * 記号で表示するプログラムを作成せよ 5 Ÿ ***** ***** ***** ***** *****

181 * List 1-8 Fig.1-8 List 1-8 Chap01/TriangleLB.java // import java.util.scanner; public class TriangleLB { public static void main(string[] args) { Scanner stdin = new Scanner(System.in); int n; System.out.println(""); do { System.out.print(""); n = stdin.nextint(); while (n <= 0); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) System.out.print('*'); System.out.println(); 5 Ÿ * ** *** **** ***** n 5 for i 1 n for j 1 i i 1 j 1 1 * * i 2 j 1 2 * ** i 3 j 1 3 * *** i 4 j 1 4 * **** i 5 j 1 5 * ***** 1 n i i * n n *

19 Fig.1-8 開始 行ループ i : 1, 1, n 列ループ j : 1, 1, i * を表示 列ループ 改行 変数 i と j の変化 ( 変数 nの値が5である場合 ) i j 1 2 1 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 j の値を1から i まで増やして繰り返す 1-2 行ループ 終了 直角三角形を表示する部分を独立させて 以下の形式のメソッドとして実現せよ static void trianglelb(int n) // さらに 直角が左上側 右上側 右下側の三角形を表示するメソッドを作成せよ static void trianglelu(int n) // static void triangleru(int n) // static void trianglerb(int n) // n 段のピラミッドを表示する関数を作成せよ ( 右図は 4 段の例 ) static void spira(int n) 第 i 行目には (i - 1) * 2 + 1 個の * 記号を表示して 最終行である第 n 行目には (n - 1) * 2 + 1 個の * 記号を表示すること * *** ***** ******* 右図のように n 段の数字ピラミッドを表示する関数を作成せよ static void npira(int n) 第 i 行目に表示する数字は i % 10 によって得られる 1 222 33333 4444444