課題 (06:スプレッドシート)
作業について
今回の課題は以下のパッケージに作成してください。
パッケージの名前 |
---|
j1.lesson06 |
作成するクラスの名前は問題ごとに指示があります。下記を参照してください
課題の提出方法については下記を参照してください。
また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。
新しい内容
列データの取得
今回はスプレッドシートからデータを「配列」として取り出すための仕組みを紹介します。
package j1.lesson05; import gpjava.Spreadsheet; import javax.swing.JOptionPane; public class GetAsArray { public static void main(String[] args) { new GetAsArray().start(); } void start() { Spreadsheet.show(); Spreadsheet.load(); get00(); get11(); get22(); get33(); } void get00() { int[] array = Spreadsheet.getIntArray(0, 0); JOptionPane.showMessageDialog(null, "getIntArray(0, 0)の配列の長さ: " + array.length); JOptionPane.showMessageDialog(null, "getIntArray(0, 0)の内容: " + array[0] + ", " + array[1] + ", " + array[2] + ", " + array[3]); } void get11() { int[] array = Spreadsheet.getIntArray(1, 1); JOptionPane.showMessageDialog(null, "getIntArray(1, 1)の配列の長さ: " + array.length); JOptionPane.showMessageDialog(null, "getIntArray(1, 1)の内容: " + array[0] + ", " + array[1] + ", " + array[2]); } void get22() { int[] array = Spreadsheet.getIntArray(2, 2); JOptionPane.showMessageDialog(null, "getIntArray(2, 2)の配列の長さ: " + array.length); JOptionPane.showMessageDialog(null, "getIntArray(2, 2)の内容: " + array[0] + ", " + array[1]); } void get33() { int[] array = Spreadsheet.getIntArray(3, 3); JOptionPane.showMessageDialog(null, "getIntArray(3, 3)の配列の長さ: " + array.length); JOptionPane.showMessageDialog(null, "getIntArray(3, 3)の内容: " + array[0]); } }
このプログラムでは、「Spreadsheet.getIntArray」 のように、末尾に「Array」という名前がついた命令を使っています。これは、「Spreadsheet.getInt」のように1つの値を取り出すのではなく、そこから下の値を「配列」としてまとめて取り出します。
example05-1.txtをダウンロードしてからプログラムを実行し、ファイルダイアログにダウンロードしたファイルを指定してください。
すると、それぞれ「Spreadsheet.getIntArray」 の指定したマスから、下方向に値を取り出して整数の配列に代入します。
11 | 21 | 31 | 41 | |
12 | 22 | 32 | 42 | |
13 | 23 | 33 | 43 | |
14 | 24 | 34 | 44 |
整数の配列の他にも、実数の配列を取り出す「Spreadsheet.getDoubleArray」や文字列の配列を取り出す「Spreadsheet.getStringArray」などを用意しています。これらはそれぞれ、「Spreadsheet.getIntArray」と同様に開始する行番号と列番号を指定して、「double[]」や「String[]」などの変数に記憶させてから使ってください。
double[] [変数の名前] = Spreadsheet.getDoubleArray([開始する行番号], [列番号]);
String[] [変数の名前] = Spreadsheet.getStringArray([開始する行番号], [列番号]);
問題
1. スプレッドシートからメッセージをひとつ選んで表示するプログラム
作成するクラスの名前 |
---|
SelectS1 |
スプレッドシートのメッセージをひとつ表示するプログラムを作成してください。ファイルmessages06-1.txtを読み出して、さらに入力ダイアログから0以上の整数を入力し、入力された値に対するスプレッドシートのメッセージをメッセージダイアログで表示します。0が入力された場合は1行目(最初の行)のメッセージ、1が入力された場合は2行目のメッセージ、という具合に、(入力された値+1)行目のメッセージを表示してください。messages06-1.txtの内容は次のようになっています。
おはよう。 | ||||
こんにちは。 | ||||
こんばんは。 |
ただし、入力ダイアログに範囲外(0未満や、行数以上の値)が入力された場合、メッセージダイアログに「そのメッセージはありません」と表示してください。
次に、同じプログラムでmessages06-2.txtを読み出し、そこからもメッセージを読み出せるようにしてください。このファイルはmessages06-1.txtと行数が違います(5行あります)が、0以上5未満の数を入力された際に、正しく表示できるようにしてください。
おはよう。 | ||||
こんにちは。 | ||||
こんばんは。 | ||||
さようなら。 | ||||
おやすみなさい。 |
プログラムが完成したら、同じプログラムで別のファイルmessages06-3.txtやmessages06-4.txtの内容をスプレッドシート上に読みだして正しく動作するか確認してください。これらは1列目にメッセージが入っていて、行数はファイルによって異なります(必ず1行以上あります)。
ヒント
Spreadsheet.show();のあとに次のように書くと、変数messagesにすべてのメッセージを配列として読み出せます。
Spreadsheet.load(); String[] messages = Spreadsheet.getStringArray(0, 0);
messages.lengthで配列の長さがわかりますので、範囲外かどうかはそれを利用して判定しましょう。これは授業の{{download <文字列>.split(",")}}で紹介した内容が参考になるかもしれません。
2. カンマ区切りのデータを再配置する
作成するクラスの名前 |
---|
RelocateS1 |
次のようなデータcsv06-1.txtがあります。
Alice,95,合格 | ||||
Bob,40 | ||||
Charley,105 | ||||
David,81,合格 |
これを読み出した後ににカンマ区切りで分解し、スプレッドシート上に配置するプログラムを書いてください。
ただし、データの形式は「名前,得点」または「名前,得点,合格」の順で並んでいるものとします。再配置する際に得点の中に100を超えるものがあったら、100に修正して配置してください。
Alice | 95 | 合格 | ||
Bob | 40 | |||
Charley | 100 | |||
David | 81 | 合格 |
プログラムが完成したら、同じプログラムで別のファイルcsv06-2.txtの内容をスプレッドシート上に読みだして正しく動作するか確認してください。このファイルはそれぞれの得点が変わっているだけの内容です。
ヒント
string.split(",")を使うと、合格の場合は長さが3、そうでない場合は長さが2の配列が生成されます。配列の長さを判定していずれの形式であるかを判定しましょう。
3. クイズを読み出して1問だけ出題するプログラム
作成するクラスの名前 |
---|
QuizS1 |
quiz06-1.txtを読み出しそこからクイズを1問だけ出題するプログラムを作成してください。このファイルの内容は、次のように1列目に問題文、2列目に正解が整数で格納されています。
10 + 20 = ? | 30 | |||
1 + 2 + 3 + 4 = ? | 10 | |||
777 + 333 = ? | 1110 | |||
7 * 8 = ? | 56 | |||
1 + 2 * 3 – 4 = ? | 3 |
出題する問題は入力ダイアログから選ぶことができ、1が入力されたら1行目の問題、2が入力されたら2行目の問題と、入力された数値と同じ行番号の問題を表示してください (0から始まらないことに注意してください)。範囲外の行番号が入力された場合、「その問題は存在しません」とメッセージダイアログに表示してください。
クイズへの回答は、入力ダイアログで行います。入力ダイアログに問題文を表示し、そこに問題に対する正解を整数で入力するようにしてください。入力された値が正解であれば「正解です」、不正解であれば「不正解です」と表示してください。
また、同じ構造で問題や問題数が異なるquiz06-2.txtを利用してプログラムの動作を確認してください。
4. スプレッドシートからメッセージを3つ選んで表示するプログラム
作成するクラスの名前 |
---|
MultiMessagesS1 |
スプレッドシートのメッセージを3つ表示するプログラムを作成してください。ファイルmessages06-1.txtを読み出して、さらに入力ダイアログから0以上の整数を3回入力し、そのあとに入力された値に対するスプレッドシートのメッセージをメッセージダイアログで表示します。今回は入力ダイアログで3つの整数を入力しています。
入力された整数の順に、3つのメッセージを結合してメッセージダイアログに表示してください。0が入力された場合は1行目(最初の行)のメッセージ、1が入力された場合は2行目のメッセージ、という具合に、(入力された値+1)行目のメッセージを表示してください。messages06-1.txtの内容は次のようになっています。
おはよう。 | ||||
こんにちは。 | ||||
こんばんは。 |
たとえば、「2, 1, 2」の順に整数が入力されたら、メッセージダイアログには「こんばんは。こんにちは。こんばんは。」と表示します。今回は、入力ダイアログに範囲外(0未満や、行数以上の値)が入力された場合について、特に考えないでもかまいません (ちゃんとやると少し長いプログラムになってしまいます)。この課題では、配列の練習を兼ねて次のようにプログラムを作成してください。配列の操作に絶対の自信がある方は、別の方法でプログラミングしてもかまいません。
-
まず、入力ダイアログを3回表示してそれぞれに整数を入力させた後、
それらを長さ3の配列に格納して返すメソッドを宣言してください。
メソッドの名前は何でもかまいませんが、たとえば「getNumbers」など意味のわかるものにしてください。
このとき、「入力ダイアログに入力させて整数を返す」というメソッドをさらに宣言すると楽です。 -
次に、長さ3の整数の配列を受け取って、それぞれの要素の整数に対応するメッセージを
スプレッドシートから取り出し、順番に結合してメッセージダイアログに表示するメソッドを宣言してください。
メソッドの名前は何でもかまいませんが、たとえば「showMessages」など意味のわかるものにしてください。 -
最後に、startメソッドから上記2つのメソッドを起動し、プログラムを完成させてください。
スプレッドシートを表示する部分や、ファイルを読み出す部分も必要です。
なお、上記の手順に書いてないメソッドを作成してもかまいません。また、必要に応じて仮引数を余計に宣言してもかまいません。
次に、同じプログラムでmessages06-2.txtを読み出し、そこからもメッセージを読み出せるようにしてください。このファイルはmessages06-1.txtと行数が違います(5行あります)が、0以上5未満の数を入力された際に、正しく表示できるようにしてください。
おはよう。 | ||||
こんにちは。 | ||||
こんばんは。 | ||||
さようなら。 | ||||
おやすみなさい。 |
プログラムが完成したら、同じプログラムで別のファイルmessages06-3.txtやmessages06-4.txtの内容をスプレッドシート上に読みだして正しく動作するか確認してください。これらは1列目にメッセージが入っていて、行数はファイルによって異なります(必ず1行以上あります)。