17 文字入力(readLine)

| コメント(0)

キーボードからの文字入力を取り込むプログラムは下記です。

import java.io.*;
class Sample {
    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            String line = reader.readLine();
            System.out.println("入力文字は" + line);
        } catch(IOException e) {
            System.out.println(e);
        }
    }
}

キーボードには例外が発生します。try catch が組み込まれています。
エラー IOException  (In/Outの例外)って。。。

調べても詳しい説明がないのですが、PCのキー入力だけが入力だけでなく
システム組込み(レンジや洗濯機)のキーなどにも対応するからエラーをチェックするらしいです。

BuffereReader、InputStreamReader、readLine() はjavaの後半に習います。

とりあえず、今は太字の部分の入力プログラムを覚えてしまいましょう。

問題17
三択問題を作ってみよう。

ヒント

問題は下記の配列を使い。[i][0]に問題、[i][1]に解答が入っています。

String[][] toi = {
            {"メソッドの名前で使えるのは?  ①1_count ②count_1 ③count-1","2"},
            {"参照型String変数のメモリの格納場所は? ①スタック領域 ②ストリング領域 ③ヒープ領域" ,"3"},
        };
正解の判定は、入力の値 line との比較は文字列同士なので、
 if ( toi[i][1].equals(line) ) { となります。
あとは、for 文で問題数を繰り返しましょう。
上の例外を参考に Try { 文を忘れずに。。。

16 例外 (try & catch)

| コメント(0)
次のサンプルを コンパイル、実行 をしてみよう。

public class Sample {
    public static void main(String[] args) {
        String s = args[0];
        int a = Integer.parseInt(s);
        System.out.println(a);
    }
}

java Sample 5 と引数に数値なら正常ですが、
java Sample a と引数が数値以外だとエラーになる
  、、NumberFormatException: For input string:
Integer.parseInt(s)で "a" を int型に変換しようとしている。

このように、コンパイルではエラーにならないが予想外のエラーを
例外(Exception) と呼んでいる。

数値を0で割ったり、メモリーオーバーになったり、存在しないファイルを開けたり、
プログラムがエラーで途中に止まってしまわないようにする仕組みが try と catch である。
tyr&catch.bmp
上記のサンプルは次のように書かなければならない。
public class Sample {
    public static void main(String[] args) {
        String s = args[0];
        try {
            int a = Integer.parseInt(s);
            System.out.println(a);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

※finally は省略可能です。

問題16
他に例外が発生する場合は何があるだろうか?

15 コマンドライン引数

| コメント(0)
Dos 画面で プロンプトマーク > が表示されています。
コマンドを入力する行なのでコマンドラインと呼ばれます。
Dos画面でjava実行時に >java Sample に続けて Test.txt   と入力。
DosLine.bmp
>java Sample Test.txt    とすると、
Test.txt を変数に取り込んでプログラムの中で使えるようになります。
この引数をコマンドライン引数と呼んでいます。

引数を取り込む方法を覚えましょう。

サンプル
public class Sample {
    public static void main(String[] args) {
DosLine2.bmp
        if (args.length == 2) {
            System.out.println(args[0]);
            System.out.println(args[1]);
        } else {
            System.out.println("引数が2つありません");
        }
    }
}

Dos画面で >java Sample abc  def  と入力すると
abc
defと表示される。
args[0] に1つ目、args[1] に2つ目の引数が入ります。
※配列はString型です。

問題15
ライン引数 p なら "プリント" の表示、
ライン引数 s なら "保存"の表示、
ライン引数 なしなら 終了するプログラムを作ってみよう。
ヒント switch で分岐します。 
char S =args[0].charAt(0); でキャラ型に変換します。
 

14 参照型(String)

| コメント(0)

Stirng c = "あい";
if (c== "あい" ) {

Book.png

と記述するとコンパイルエラーとなる。
これは、Stringが参照型なので "あい" と比較できないからである。

参照型って?

通常の変数はint型は4バイト、double型は8バイトとサイズが決まっている。
int a=110 でも int b=1356 でも同じメモリ数を確保する。
しかし、Stringは代入する値によって大きさが変化する。
c="あ" もあれば c="あいうえお" もある。変数cのサイズが変わる。

javaでは文字列は、本の目次ページに変数cを管理し、実際の値は
「ページを参照してさい」と、なっている。まさに参照である。

説明では、目次はスタック領域、参照先のページはヒープ領域と呼ばれている。

配列も行や列の大きさが変化するので参照型となっている。

String 型での比較は

String c = "あいうえお";
if (c.equals("あいうえお")) {

としなければならない。

問題14

String c = "あいうえお";
if (c.equals("あいうえお")) {
}
if ("あいうえお".equals(c)) {
}

2つの比較は同じ?同じでなければその違いは?

13 switch 文

| コメント(0)
switch(数値) の数値で、それぞれの選択の分岐処理をします。
switch.bmp
※数値には char, byte, short, int 型以外は使えない。
※default 以降は省略可能。
※breakを省略すると次のbreakまで続けて実行します。
   (処理1のbreakを省略するとcase1と2の両方の処理を実行する)

サンプル
public class Sample {
    public static void main(String[] args) {
        int i = (int)(Math.random()*4);   //0~3の乱数生成
        switch( i ){
            case 0:
                 System.out.println("0です");
                 break;
            case 1:
                 System.out.println("1です");
                 break;
            default:
                 System.out.println("他です");
                 break;
        }
    }
}
 
問題13
おつり 100円玉x4、50円玉x2、10円玉x4 を 
switch 文で合計金額を計算するプログラムを作ろう。
ヒント 配列を使います。
 int en [ ][ ] ={
     {100,4},
     {50,2},
     {10,4},
}
  for (int i=0; i<en.length; i++) {

12 whileの break/continue

| コメント(0)
while 文には ループから抜け出す break と continue がある。
whilebreak.bmp
class Sample {
public static void main(String args[]){
int j = 1;
while (j < 20) {
if (j == 6) {
j++;
break;
}
System.out.println(j);
j++;
}
}
}

break は whileループを終了させます。
この実行結果は 1から5までが表示されます。

問題12
上記の break を continue に入れ替えたらどうなるか?

11 while 文

| コメント(0)
while (条件式) 
{
    成り立っている間のループの処理
}                //ここで while  に戻る
while
while.bmp 文は、条件式が成り立っている間だけ、永久にループしています。
for 文と違い、カウンタが無く、繰り返す回数が分からない時に使用します。

サンプル
public class A {
public static void main(String[] args) {
int a = 0;
while (a < 4) {
a = (int)(Math.random() * (4+1));  // 4以下の乱数を生成
                        System.out.println(a);
}
}
}

0から3までなら永久にループしますが、4ならストップします。

問題11
問題7の for文を while文に置き換えてみよう。
   問題7 数字の 3 から 10 まで順に表示するプログラムを作ってみよう。
           3, 4, 5, 6, 7, 8, 9, 10

10 論理演算子

| コメント(0)
条件式が2つ以上あるとき使うと便利なのが論理演算子
 
&&    (かつ),        ||   ( または) ,        !  (否定),
の3種ある。
  
if 文の条件式で使えば、2つの if が 1つに出来る場合がある。

if ( (a >= 3) && (a <= 5) ) {        // a=3以上 かつ 5以下 なら、、、
if ( (a <= 3)  ||   (a >= 6) ) {        // a=3以下 または 6以上なら、、、
if   ! (a <= 3)                            // (a=3以下)以外 なら、、、
 
 
問題10
問題9 で if の条件式を 「論理演算子」 を使い再度作りなおしてみよう。

9 if 文

| コメント(0)
if 文とは 条件分岐の事。

if.bmp
if (条件式1) {
   式1が真(true)の場合の処理
} else if (条件式2) {
   式2が真(true)の場合の処理
} else {
   式1,式2以外、つまり全てが偽(false)場合の処理
}

条件式 一覧
a == b   (等しい),         a !=b    (等しくない),
a<b      (大なり),          a>b     (小なり),
a<=b    (以上),            a>=b   (以下),
問題9
西暦1000~2010年のうるう年を全て表示る一覧表プログラムを作ろう。
       1004, 1008, 1012, , , , , , , ,2008,
if の条件は
  西暦が4で割れる年はうるう年
  ただし、西暦が100で割れる年は除く
  ただし 西暦が400で割り切れる年は含める

ヒント for (int a=1000; a<=2010; a++) { 
             if (a % 400 == 0) {
                   System.out.print(a + "  ");
              }else if (                    // for文 と同じように、入れ子にします
  

8 for 文(二重ループ)

| コメント(0)
for文の2重ループとは、for 文が入れ子になった状態をいいます。
forfor.bmp
サンプル 
for ( int i=1; i<=3; i++) {
     for ( int j=1; J<=3; j++ ) {
          Sytem.out.println(i+","+j);
     }
}
 
まず、for① i は1。 
  続いてj が3 回繰り返されます。
次に for① i に戻り i は2。
  続いてj が3 回繰り返されます。
次に for① i に戻り i は3。
  続いてj が3 回繰り返されます。
次に for① i に戻り i は3以上なので終了します。

問題8  
九九の掛け算を1から9まで表示するプログラムを作ろう。
実行表示例
  1x1=1, 1x2=2, 1x3=3,,,,,
     2x1=2, 2x2=4, 2x3=6,,,,,
        ~
     9x1=9, 9x2=18, 9x3=27,,,,,