06020
1年後期>report2


課題:JavaアプリケーションとC言語のオリジナル問題作成と解答例。制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なる べく短い行数で)を作成し、模範解答例を示せ。併せて、同様な動作を行うC言語 のソースコードを示せ。

1.次のjavaプログラムの下線部1〜3に当てはまる変数名を書け。
なお、このプログラムは、相手が出したカードを入力し、そのカードより数が大きいカードを全て出力するプログラムである。しかし,A(エース)は出されれば1番弱いが、K(キング)が出された時にだけAは1番強くなるようにする。

1-1.プログラム
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.*;

class report2 {

    public static void main(String arg[]) throws Exception{
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));

        String card = "A 2 3 4 5 6 7 8 9 0 J Q K   ";
        int i;

        System.out.println("使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}");
        System.out.print("出たカード >> ");

        String a = ___1___.readLine();        //値を読み込む

        System.out.print("出すカード >> ");

        int n = card.indexOf(___2___);        //()内を検索する
        String m = card.substring(n+2);

        System.out.print(___3___);

        if(n == 'K')
            System.out.println("A");
        else System.out.println("");
    }
}


1-2.実行結果
[kanoutakeshi-no-ibook-g4:~] j06020% java report2
使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出たカード >> A
出すカード >> 2 3 4 5 6 7 8 9 0 J Q K   
[kanoutakeshi-no-ibook-g4:~] j06020% java report2
使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出たカード >> 3
出すカード >> 4 5 6 7 8 9 0 J Q K   
[kanoutakeshi-no-ibook-g4:~] j06020% java report2
使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出たカード >> 9
出すカード >> 0 J Q K   
[kanoutakeshi-no-ibook-g4:~] j06020% java report2
使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出たカード >> Q                                           
出すカード >> K   
[kanoutakeshi-no-ibook-g4:~] j06020% java report2
使用カード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出たカード >> K
出すカード >> A

1-3.解答
(___1___) sc
6行目のBufferedReaderクラスからのreadLineメソッドである。よってscが入ることが分かる。

(___2___) a
readLineで読み込んだ値を検索するので、その変数のaが入る。

(___3___) m
検索した値から文の最後までを表示するので、mが当てはまる。


1-4.考察
6行目は文字を読み込むためにBufferedReaderクラスを作っている。
8行目でAからKまでの文字列を作る。
14行目でコマンドから値を読み込む。
18行目のindexOfはオブジェクトから特定の文字列を探すインスタンスメソッド。文字列が見つかればその位置を返す。
19行目の(n+2)は次の文字を表示させるために+2をしている。
23行目は題意より、入力された値がKならばAを表示させるために入れている。




2. 同様な動作を行うC言語のソースコードを示せ。

2-1.プログラム
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include 
#include 

char card[13] = {'A','2','3','4','5','6','7','8','9','0','J','Q','K'};
char sc,*a;
int i;
int main (){

  printf("使用するカード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}\n");
  printf("出されたカード >> ");
  scanf("%c",&sc);

  printf("出せるカード >> ");

  a = memchr(card, sc, 13);

  for(i=1; i<13; i++){
    if(&a[i] < &card[13])
      printf("%c ", a[i]);
  }
  if(sc == 'K')
    printf("A\n");
  else printf("\n");
    return(0);
}

2-2.実行結果
[kanoutakeshi-no-ibook-g4:~] j06020% ./report2
使用するカード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出されたカード >> A
出せるカード >> 2 3 4 5 6 7 8 9 0 J Q K 
[kanoutakeshi-no-ibook-g4:~] j06020% ./report2
使用するカード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出されたカード >> 5
出せるカード >> 6 7 8 9 0 J Q K 
[kanoutakeshi-no-ibook-g4:~] j06020% ./report2
使用するカード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出されたカード >> 0
出せるカード >> J Q K 
[kanoutakeshi-no-ibook-g4:~] j06020% ./report2
使用するカード {A,2,3,4,5,6,7,8,9,0(10),J,Q,K}
出されたカード >> K
出せるカード >> A


2-3.考察
4行目で必要な値を配列で準備する。
11行目scanfで取り込んだ値をscのアドレスに取り込む。
15行目memchrはcardの配列からscの値を13バイト分検索するソースである。これを使って取り込んだ値を探す。
17~20行目はfor文を使って文字を出力している。取り込んだ値からcardの最後に来るまで文字を出力する。
21~23行目は取り込んだ値がKならばAを表示させ、それ以外ならば改行を出力する.