特集PC技術

Java言語入門 ~C言語を学んだ君へ~

 

[第18回]演習問題Ⅲ

この回がJava言語の最後になります。
学習したすべての内容を元に演習問題を解いてもらいます。
もしわからない場合には、前のページに戻り必要な情報を調べてください。調べるのも勉強の1つです。

演習問題 第1問

まず、可変長のint型配列を実現するMyVectorクラスを作成しなさい。
クラスとコンストラクタとメソッドは次の条件を満たしなさい。

クラス

クラス:public class MyVector
ファイル名:MyVector.java
継承:Objectクラス

コンストラクタ

コンストラクタ:public MyVector()
処理内容:メンバ変数の初期化。
容量(配列の長さ)を「10」に指定するなど。
引数:なし

メソッド

メソッド:public int size()
処理内容:要素数を返す。
引数:なし
戻り値:要素数

メソッド:public void add(int n, int index)
処理内容:指定位置に要素を挿入する。
容量がいっぱいなら、容量を10増して挿入する。
引数:n - 要素、index - 位置
戻り値:なし
例外:ArrayIndexOutOfBoundsException-(index < 0 || index > 要素数)の場合

メソッド:public void remove(int index)
処理内容:指定位置の要素を削除する。
指定位置以降の要素は左に移動する
引数:index - 位置
戻り値:なし
例外:ArrayIndexOutOfBoundsException-(index < 0 || index >= 要素数)の場合

メソッド:public int get(int index)
処理内容:指定位置の要素を返す。
引数:index - 位置
戻り値:要素
例外:ArrayIndexOutOfBoundsException-(index < 0 || index >= 要素数)の場合

メンバ変数

メンバ変数については「必要なもの」を定義してください。
アクセス修飾子はすべて「private」とします。

Ex18_01クラス

次にEx18_01クラスを作成して、以下の処理を行いなさい。

1. MyVectorクラスのオブジェクト「vector」を生成
2. vectorに「0~19」の20個の要素を追加する(addメソッドを使用)
3. vectorの0番目の要素を削除する(removeメソッドを使用)
4. vectorの0番目の要素をコンソールに出力する(getメソッドを使用)
5. vectorの要素数をコンソールに出力する(sizeメソッドを使用)

実行結果

実行結果は次のようになります。

18演習問題1実行結果

第1問解答

演習問題 第2問

まず、int型の要素の後入れ先出し(LIFO)を実現するMyStackクラスを作成しなさい。
LIFOとは、後から入れた要素から、先に取り出すことです。
そして、このようなデータ構造を「スタック」といいます。
クラスとメソッドは次の条件を満たしなさい。

クラス

クラス:public class MyStack extends MyVector
ファイル名:MyStack.java
継承:演習問題1で作成したMyVectorクラスを継承する

メソッド

メソッド:public void push(int n)
処理内容:スタックの先頭に要素を入れる
引数:n - 要素
戻り値:なし

メソッド:public int pop()
処理内容:スタックの先頭の要素を削除し、その要素を取り出す
引数:なし
戻り値:要素

コンストラクタ、メンバ変数

なお、コンストラクタとメンバ変数は、必要ならば記述しなさい。
特に指定はありません。

Ex18_02クラス

次にEx18_02クラスを作成して、以下の処理を行いなさい。

1. MyStackクラスのオブジェクト「stack」を生成
2. stackに「0~19」の20個の要素を追加する(pushメソッドを使用)
3. stackから要素を5個取り出し、コンソールに出力する(popメソッドを使用)
4. stackの要素数をコンソールに出力する(sizeメソッドを使用)

実行結果

実行結果は次のようになります。

18演習問題2実行結果

第2問解答

演習問題 第3問

2つの入力ファイル(in1.txtとin2.txt)より、データを読み込み、一文ずつ交互に出力を行って、1つの出力ファイル(out.txt)を作成するプログラムを作りなさい。
ただし、作成にて条件があります。
それは、ファイルの入出力にはスレッドを使うことです。
つまり、2つのスレッドがそれぞれ、2つの入出力ファイルより、データを受け取り、同期により書き込みを制御し、一行ずつ交互に処理するようにしてください。

in1.txtのファイル内容

A
C
E

in2.txtのファイル内容

B
D
F

実行結果(out.txtのファイル内容)


18演習問題3実行結果
out.txtファイルより、交互に出力されていることがわかると思います。
なお、作成方法は上記の条件を満たせば自由に作ってよい。

第3問解答

コメント

匿名

第3問の解答例ではうまくいきません。
synchronizedによる排他制御はスレッドの実行順序を規定しないため、
交互に書き込まれる保証はありません。

2018年4月15日 14:37

コメントの投稿


画像の中に見える文字を入力してください。

トラックバックURL

http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1084

pagetopこのページの先頭へ戻る