課題 (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[]」などの変数に記憶させてから使ってください。

int[] [変数の名前] = Spreadsheet.getIntArray([開始する行番号], [列番号]);
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.txtmessages06-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.txtmessages06-4.txtの内容をスプレッドシート上に読みだして正しく動作するか確認してください。これらは1列目にメッセージが入っていて、行数はファイルによって異なります(必ず1行以上あります)。