3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

Similar documents
System.out.println("char : " + (int)character.min_value + "~" + (int)character.max_value); System.out.println("float : " + Float.MIN_VALUE + "~" + Flo

プログラミングA

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

Prog1_2nd

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

さぬきの安全2016-cs5-出力.indd

看護学科案内'16/表紙

Java講座

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

Microsoft Word - java a.doc

デジタル表現論・第6回

スライド 1

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

解きながら学ぶJava入門編

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

Prog1_6th

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

JavaプログラミングⅠ

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

Prog1_15th

JavaプログラミングⅠ

Microsoft Word - 3new.doc

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

2

デジタル表現論・第4回

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Prog1_3rd

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

2016東奥義塾高等学校スクールガイド

01.P28-01

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf


JavaプログラミングⅠ

JavaプログラミングⅠ

2

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

JavaプログラミングⅠ

1 May 2011

JavaプログラミングⅠ

JavaプログラミングⅠ

メソッドのまとめ

gengo1-8

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

ガイダンス

Microsoft PowerPoint - prog03.ppt

JavaプログラミングⅠ

美唄市広報メロディー2014年1月号

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

ポインタ変数

cp-7. 配列

プログラミング入門1

プログラミング入門1

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

情報処理Ⅰ

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

Microsoft PowerPoint - 11.pptx

memo

Microsoft Word - no103.docx

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

人工知能入門

Java プログラミング Ⅰ 11 回目多次元配列 2 次元配列 2 次元配列配列要素が直線上に並ぶ一次元配列に対して 平面上に並ぶ配列要素をもつ配列 直観的には 2 次元配列の準備配列変数の宣言は型と識別子を指定して次のように行う 型識別子 [ ][ ]; または 型 [ ][ ] 識別子 ; 配

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Microsoft PowerPoint - program.ppt [互換モード]

Microsoft Word - NonGenList.doc

Microsoft Word - 商業-3

Javaプログラムの実行手順

Java Java Java Java Java 4 p * *** ***** *** * Unix p a,b,c,d 100,200,250,500 a*b = a*b+c = a*b+c*d = (a+b)*(c+d) = 225

JavaプログラミングⅠ


Microsoft PowerPoint - ruby_instruction.ppt

講習No.8

02: 変数と標準入出力

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

Prog1_10th

情報実習Ⅱ

02: 変数と標準入出力

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

プログラミング入門1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

2

Microsoft PowerPoint - lec10.ppt

PowerPoint プレゼンテーション

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

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

kiso2-09.key

Microsoft PowerPoint - kougi6.ppt

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

memo

Prog2_12th

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

class TestPrimitiveType{ public static

PowerPoint プレゼンテーション

プログラムの基本構成

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint - lec06 [互換モード]

MEISEI HEROES HERO HERO HERO MEISEI HEROES

講習No.9

Transcription:

配列 2 前回には 配列の基本的な使い方と拡張 for 文について学んだ 本日は配列に付いての追加の説明として 配列のコピー 文字列配列 ガーベジコレクション 多次元配列について学んでいく 配列のコピー配列を用意し その全ての要素を別の配列にコピーすることを考える まず 以下に間違った例を示していく プログラム例 1 public class Prog07_01 int[] a = 1, 2, 3,, ; int[] b = 6,,, 3, 2, 1, 0; System.out.print("a = "); for(int i = 0; i < a.; i++) System.out.print(a[i] + " "); System.out.println(); System.out.print("b = "); for(int i = 0; i < b.; i++) System.out.print(b[i] + " "); System.out.println(); // 配列 a の全要素を表示 // 配列 b の全要素を表示 b = a; // 配列 a を b にコピー (?) a[0] = 10; // 配列 a[0] の値を書きかえる System.out.println("a を b に代入しました "); System.out.print("a = "); for(int i = 0; i < a.; i++) System.out.print(a[i] + " "); System.out.println(); System.out.print("b = "); for(int i = 0; i < b.; i++) System.out.print(b[i] + " "); System.out.println(); 実行結果 a = 1 2 3 b = 6 3 2 1 0 a を b に代入しました a = 10 2 3 b = 10 2 3 // 配列 a の全要素を表示 // 配列 b の全要素を表示 配列 a の要素数は で その各値は 1, 2, 3,, であり 配列 b の要素数は 7 その各値は 6,,, 3, 2, 1, 0 である b = a; で配列 b に配列 a の値をコピー (?) し a[0] = 10; で配列 a[0] の値を書き換えている この処理では 配列 a が 10, 2, 3,, 配列 b が 1, 2, - 1 -

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は同一のをするという結果が得られる 代入前 a b 7 1 2 3 6 3 2 1 0 6 代入後 b = a; a b 7 10 2 3 6 3 2 1 0 6 a[0] = 10; 先が変わる 図 1 の代入 そのため 配列をコピーする場合には繰り返し文を使って全要素を一つずつコピーしていく必要がある この方法を用いて配列をコピーしたプログラム例を以下に示す プログラム例 2 import java.util.scanner; public class Prog07_02 Scanner stdin = new Scanner(System.in); System.out.print(" 要素数 :"); int n = stdin.nextint(); int[] a = new int[n]; int[] b = new int[n]; // 要素数を読み込む for(int i = 0; i < n; i++) // 配列 a に値を読み込む System.out.print("a[" + i + "] = "); a[i] = stdin.nextint(); for(int i = 0; i < n; i++) - 2 - // 配列 a の全要素を配列 b にコピー

b[i] = a[i]; System.out.println("a の全要素を b にコピーしました "); for(int i = 0; i < n; i++) // 配列 b を表示 System.out.println("b[" + i + "] = " + b[i]); 実行結果例 ( 斜体は入力値 ) 要素数 : a[0] = 2 a[0] = 3 a[0] = 8 a[0] = 2 a[0] = -7 a の全要素を b にコピーしました b[0] = 2 b[0] = 3 b[0] = 8 b[0] = 2 b[0] = -7 こちらの例ではキーボードから要素数を n に読み込み 2 つの配列 a b を生成しているため どちらの要素数も等しい もし 要素数が異なる配列でコピーを行うならば コピー元の配列の要素数を用いて コピー先の配列の要素数を同じにするため 以下のようにコピー先の配列を生成し直す必要がある if(a.!= b.) b = new int[a.]; for(int i = 0; i < a.; i++) b[i] = a[i]; // 配列の要素数が異なる場合 // 配列を生成し直す // 配列のコピー 文字列の配列文字列は String 型で表すので その配列の型は String[] 型となる ジャンケンの手を例に取ると " グー " " チョキ " " パー " という文字列の配列が考えられる 要素型は String 型で要素数が 3 の配列を生成すれば良いので以下のようにして 配列を生成し 文字列を代入することで文字列の配列を実現する String[] hands = new String[3]; hands[0] = " グー "; hands[1] = " チョキ "; hands[2] = " パー "; この宣言方法や利用方法はここまでに学んだ int 型や double 型を用いた配列の場合と変わらない また 以下のように宣言すれば 配列の生成と初期化 ( 代入ではない ) も同時に行えることも変わらない String[] hands = " グー ", " チョキ ", " パー "; - 3 -

次のプログラム例は月名の英単語を学習するためのプログラムである 英単語の文字列を配列で用意し 乱数を用いて英単語を選択する キーボードからの月 ( 数値 ) の入力を促し 正解したかどうかを判定する また 間違った場合には正解するまで月の入力を促すことを繰り返す プログラム例 3 import java.util.random; import java.util.scanner; public class Prog07_03 Random rand = new Random(); Scanner stdin = new Scanner(System.in); String[] monthstring = "January", "Febrary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ; int month = rand.nextint(12); // 当てるべき月 :0~11 の乱数 System.out.println(" 問題は " + monthstring[month]); while(true) System.out.print(" 何月かな :"); int m = stdin.nextint(); if(m == month + 1) break; System.out.println(" 違います "); System.out.println(" 正解です "); 実行結果例 ( 斜体は入力値 ) 問題は August 何月かな : 7 違います 何月かな : 8 正解です ガーベジコレクション以下のプログラム例は配列の値ではなく そのものの値を表示するプログラムである プログラム例 public class Prog07_0 int[] a = new int[]; System.out.println("a = " + a); // 1 // 2 - -

実行結果例 a = [I@ca0b6 a = null a = null; System.out.println("a = " + a); // 3 // 1 の処理は配列の宣言である 通常の変数はプログラムの実行時に記憶領域が 確保 される それに対して new で生成されるは通常の変数と異なり new が実行されるタイミングで記憶領域が動的に確保される は通常の変数とは異なるため オブジェクト と呼ばれる オブジェクトを指すための変数の型が 型 である そのため の型である配列型は型の一種である 2 では a の値そのものを出力した処理だが その結果は [I@ca0b6 となっている を出力すると特殊な文字の並びが表示される 3 の処理では a に null を代入している null は 空リテラル と呼ばれる 空リテラルが代入されたは 空 となる これはが何もしていない状態を表す特殊なであり この null の型は 空型 と呼ぶ リテラルとは定数値のことであり 記述する形式によっていくつかの種類があるので 表 1 にまとめておく の処理では null を代入した a そのものの値を出力した結果であるが 空のを出力すると null と表示されることが確認できる 表 1 リテラルの種類と型 リテラル名 形式 型 例 整数リテラル 数 123 先頭に 0 を付けると 8 進数先頭に 0x を付けると 16 進数 int 0123 0xFA 末尾に L か l を付けると long 型 long 123L 浮動小数リテラル 小数点付きの数 double 123.0 末尾に F か f を付けると float 型 float 123f 末尾に D か d を付けると double 型 double 123d 文字リテラル シングルクォーテーションで囲む char 'A' 文字列リテラル ダブルクォーテーションで囲む String "abc" 論理値リテラル true または false boolean true false 空リテラル null 空型 null に null を代入した場合や他のへのを代入すると 以下に示す図のように もともとのはどこからもされない ゴミ となってしまう ゴミをそのままの状態にしておくと 記憶領域の不足をまねく原因となる そのため Java ではどこからもされなくなったオブジェクト用の領域はその時点で自動的に 解放 され その領域を再利用できるようにしている この不要となったオブジェクトの領域を解放して再利用することを ガーベジコレクション (garbage collection: ゴミ集め ) と呼ぶ - -

null 代入前 null 代入後 a 空 a 1 2 3 ガーベジコレクションで回収される図 2 空とガーベジコレクション 1 2 3 に誤って null を代入したり 他のへのを代入したりするという状況を防ぐ方法として 以下のようにを final 変数として宣言する方法がある final int[] a = new int[]; この処理の場合 final 変数として値の書き換えを行うことができなくなるのは配列 a の先である 配列の個々の要素の値は書き換えることができる 以下の例をのこと a[0] = 10; a = null; a = new int[10]; // OK // エラー // エラー 多次元配列ここまでに習った配列は要素が 1 次元で並んでいた しかし 配列には 2 次元以上のものも存在する これらは 1 次元の配列と区別するため 多次元配列と呼ばれる int 型の 2 次元配列を考えると その宣言方法は以下の 3 種類が挙げられるが 最も利用されるのは 1 の宣言方法である 使用例 1int[][] x; 2int[] x[]; 3int x[][]; 例えば 2 行 列の配列を宣言と生成を同時に行うには 以下のようになる 使用例 int[][] x = new int[2][]; int[][] x = new int[2][]; 行数列数 x x[0][0] x[0][1] x[0][2] x[0][3] 2 行 x[1][0] x[1][1] x[1][2] x[1][3] 図 3 2 次元配列のイメージまた 以下のようにして 2 行 列の 2 次元配列を用意することもできる 列 使用例 - 6 -

int[][] x; x = new int[2][]; x[0] = new int[]; x[1] = new int[]; この場合に生成される 2 次元配列の構造は使用例 int[][] x = new int[2][]; に示した方法で生成した場合の構造と全く同じである それでは この 2 次元配列の内部構造を示していく 1 2 x int[][] 型の先は int[] 型 2 x. int[][] x; x = new int[2][]; x[0] = new int[]; x[1] = new int[]; // 1 // 2 // 3 // : int[] 型の先は int 型 x[0] x[1] 0 1 3 x[0]. x[1]. : int 型の変数 x[0][0] x[0][1] x[0][2] x[0][3] 0 1 2 3 x[1][0] x[1][1] x[1][2] x[1][3] 0 1 2 3 図 2 次元配列の内部構造 図 において 処理 1 では int[] 型のをする int[][] 型の x を宣言する 処理 2 で x の要素数を 2 と定めた 2 で生成されるは int 型の変数をする int[] 型の x[0] x[1] である 実際に int 型の値の出し入れを行うことができる要素は次の 3 の処理でを生成した後に確保される ここでは それぞれ要素数を として生成した また この 3 の処理において 以下に示すように要素数を異なる数で設定すると 凸凹な配列を用意することもできる 使用例 int[][] c; c = new int[3][]; c[0] = new int[]; c[1] = new int[3]; c[2] = new int[]; c[0][0] c[0][1] c[0][2] c[0][3] c[0][] c[1][0] c[1][1] c[1][2] c[2][0] c[2][1] c[2][2] c[2][3] 図 異なる列数を持つ配列のイメージ 行によって列数が異なる - 7 -

1 c int[][] 型の先は int[] 型 2 3 c. int[][] c; c = new int[3][]; c[0] = new int[]; c[1] = new int[3]; c[2] = new int[]; // 1 // 2 // 3 // // : int[] 型の先は int 型 c[0] c[1] 0 1 c[2] 2 3 3 c[0]. c[1]. c[2]. : int 型の変数 c[0][0] c[0][1] c[0][2] c[0][3] 0 1 2 3 c[0][] c[1][0] c[1][1] c[1][2] 0 1 2 c[2][0] c[2][1] c[2][2] c[2][3] 0 1 2 3 図 6 異なる列数を持つ配列の内部構造 ここまでに多次元配列の構造の説明を述べた 複雑な印象を受けたかもしれないが 実際に使用する場合にはシンプルに書くことができる 以下に 2 次元配列と列数が異なる 2 次元配列を利用したプログラム例を示す プログラム例 import java.util.random; import java.util.scanner; public class Prog07_0 Random rand = new Random(); Scanner stdin = new Scanner(System.in); System.out.print(" 行数 :"); int h = stdin.nextint(); System.out.print(" 列数 "); int w = stdin.nextint(); // 行数を読み込む // 列数を読み込む int[][] x = new int[h][w]; for(int i = 0; i < h; i++) for(int j = 0; j < w; j++) x[i][j] = rand.nextint(100); System.out.println("x[" + i + "][" + j + "] = " + x[i][j]); - 8 -

実行結果例 ( 斜体は入力値 ) 行数 :2 列数 : x[0][0] = 72 x[0][1] = 68 x[0][2] = 6 x[0][3] = 6 x[1][0] = 9 x[1][1] = x[1][2] = 18 x[1][3] = 9 このプログラムは 2 次元配列を生成し 乱数で全ての要素に値を代入し 結果を表示している プログラム例 6 public class Prog07_06 int[][] c; c = new int[3][]; c[0] = new int[]; c[1] = new int[3]; c[2] = new int[]; 実行結果 0 0 0 0 0 0 0 0 0 0 0 0 for(int i = 0; i < c.; i++) for(int j = 0; j < c[i].; j++) System.out.printf("%3d", c[i][j]); System.out.println(); このプログラムは列数が異なる 2 次元配列を生成し 結果を出力する 配列の全要素には値を代入していないが 生成時に既定値である 0 で初期化が行われていることが確認できる - 9 -

演習プログラム例 1~6 を作成し 実行しなさい 課題 の続き kadai- 配列 a の全要素を配列 b に逆順にコピーし 結果を出力するプログラムを作成しなさい 二つの配列の要素数は同一であるとみなして良い kadai- 要素型が int 型である配列を作り 全要素を 1 から 10 の乱数で埋め尽くし 結果を出力するプログラムを作成しなさい 要素数はキーボードから読み込むものとし 連続した要素が同じ値とならないようにすること たとえば 1, 3,,, 1, 2 とならないようにする 配列の要素数は 10 以下とする 同じ値が連続したら 乱数を生成し直すなどで対応する kadai-6 2 行 3 列の行列 a b を用意する 代入する値は任意である 行列和を求め 結果を出力するプログラムを作成しなさい 提出方法 kadai-1 から kadai-6 提出する - 10 -