見出し画像

iT-16-[Java勉強🔥たのしい。]

復習🔥

・配列

データ型[] 配列名 = new データ型[要素数]

int[] score = new int[3];
score[0] = 80;
// scoreの0番目に、80を代入してください。 添字は、0からスタートすることに注意
データ型[] 配列名 = { 値1, 値2, ・・・・}

配列.length で、配列の要素数をGet
class Array {
  public static void main(String args[]) {
    int[] score = new int[3]
    score[0] = 80;
    score[1] = 100;
    score[2] = 70;

    String[] name = {"高木", "西山", "小梅"};

    System.out.println(name[0] + "さん:" + score[0] + "点");
    System.out.println(name[1] + "さん:" + score[1] + "点");
    System.out.println(name[2] + "さん:" + score[2] + "点");

    System.out.println("受験者数:" + score.length + "人です。");

// score.lengthをすることで、その要素の数(要素数)を利用することができる!!いいね。
  } 
}

多次元配列

class MultiArray{
  public static void main(String[] args){
    int[][] allScore = new int[2][3];
    allScore[0][0] = 80;
    allScore[0][1] = 100;
    allScore[0][2] = 75;
    allScore[1][0] = 85;
    allScore[1][1] = 95;
    allScore[1][2] = 80;
    
    // 多次元配列の初期化
    // int[][] allScore = { {10, 20, 30}, {40, 50, 60} };

    System.out.println(allScore[0][0] + "点");
    System.out.println(allScore[0][1] + "点");
    System.out.println(allScore[0][2] + "点");
    System.out.println(allScore[1][0] + "点");
    System.out.println(allScore[1][1] + "点");
    System.out.println(allScore[1][2] + "点");
    
    System.out.println("allScore.length:" + allScore.length);
    System.out.println("allScore[0].length:" + allScore[0].length);
  }
}

・演算子

//割り算
7 / 23
//あまりの数
7 % 21
//a = a + bと同じ。
a += b 
//aにbを加えて、aに再度代入する。
//a = a + 1;と同じ。
a ++;
a --;
class Operator {
  public static void main(String[] args){
    //コマンドラインから入力した文字列型を、int aとして宣言する
    int a = Integer.parseInt(args[0]);
    int b = Integer.parseInt(args[1]);

    System.out.println("a =" + a + "b =" + b );
    System.out.println("a + b =" + (a + b));
    System.out.println("a - b =" + (a - b));
    System.out.println("a / b =" + (a / b));
    System.out.println("a % b =" + (a % b));
    System.out.println("a >= 0 :" + (a >= 0);
    System.out.println("(a >= 0) && (b >= 0):" + ((a >= 0)&&(b >= 0));
    
  }
}

関係演算子
trueかfalse

論理演算子
(a >= 0)&& (b >= 0)
→&&は「かつ」を表す。
→||は「もしくは」を表す。

・基本データの型変換

表現の幅が広い順〜狭い(自動で)
double, float, long, int, short, byte

大きい箱を小さな箱にむりやり入れる(代入する)ためには、
キャストというものが必要。もしそういう時になったら、こう書く。

class FukuKau {
  public static void main(String[] args){
    
    //服のねだんを入力したらそれをargs[0]が引数となりpriceに代入してくれる。
    int price = Integer.parseInt(args[0]);
        
        //0.08は、浮動小数点数としてdoubleで宣言をし、値を代入しておく。
    double rate = 0.08;

        //amountという整数型を宣言しておく。
    int amount;

        /*amountに、税込金額の式を代入する。このとき、double型が64bit,int型が32bitなので、小きな
            箱に、大きな箱をむりやり入れることになる。そのため、てこ=キャストを使う必要がある。
            よって、(int)で変換後のデータ型を入れamountに代入している。  */
            
    amount = (int)(price * (1 + rate))
    System.out.println("税込金額は、" + amount + "円です。");
    
  }
}

・構造化プログラミング

以下を組み合わせてプログラムをかくことを意識して書くと、プログラムがわかりやすくなる。

①順次進行

→|処理|→|処理|→|処理|→|処理|→|処理|→|処理|→|処理|→|処理|→|処理|→・・

②分岐
→|条件|→true→|処理|→
  ↓                            ↑
   |→ false→|処理|→ |

③繰り返し
→|条件|→|処理|→|更新!|→|条件|→|処理|→|更新!|→

If文

if (条件式) {
  処理1
  } else {
   処理2
    }

・else if文

    if(price >= 3000){
       discount = 300;    
    } else {
       discount = 0;    
    }

の拡張!!さらに条件式を入れる場合はこちら。

    if(条件式1){
       処理1;    
    } else if (条件式2)
       処理2;
    } else {    
       処理3;
    }

・swich文

    swich(式){
       
       case1:
       処理1
       break1;
     
       case2:
       処理2
       break2;
 
       case3:
       処理3
       break3;
    
    }

・式に入るのは、byte, short, int, char型である。
・式の値によって、処理の開始位置が決まる!!
・breakは何かというと、  { }を抜けます!という意味。

・while文

    while(条件式){
       処理
       case1:
       処理1
       break1;
     
       case2:
       処理2
       break2;
 
       case3:
       処理3
       break3;
    
    }

前回の問題復習🔥🔥

・1問

面積と高さ・幅・面積の表示をしなさい。

class Triangle{
  public static void main(String[] args){
    int height = Integer.parseInt(args[0]);
    int width = Integer.parseInt(args[1]);
    int area;
    
    //面積の計算
    
    //高さ・幅・面積の表示

  }
}

回答コード

class Triangle{
  public static void main(String[] args){
    int height = Integer.parseInt(args[0]);
    int width = Integer.parseInt(args[1]);
    int area;
    
    //面積の計算
    area = height * width / 2;
    
    //高さ・幅・面積の表示
    System.out.println("高さ:" + height);
    System.out.println("幅 :" + width);
    System.out.println("面積:" + area);
  }
}

・2問

面積を小数点第2位まで表示するようにしてください。

class Sample003{
  public static void main(String[] args){
    int radius = 15;
    double pi = 3.141592;
    double area;
    double minus;
    
    area = radius * radius * pi;
    
    //小数点第3位以降を切り捨て
    
    System.out.println("半径:" + radius);
    System.out.println("面積:" + area);
  }
}

回答コード

class Circle{
  public static void main(String[] args){
    int radius = Integer.parseInt(args[0]);
    double pi = 3.141592;
    double area;
    
    area = radius * radius * pi;
    
    //小数点第3位以降を切り捨て
    area = (int)(area * 100);
    area = area / 100;
    
    System.out.println("半径:" + radius);
    System.out.println("面積:" + area);
  }
}

・3問

二つの数字を入れた時に、大きい方の値を表示させなさい。

class Comparison{
  public static void main(String[] args){
    int a = Integer.parseInt(args[0]);
    int b = Integer.parseInt(args[1]);
    
    //大きいほうの値を表示

  }
}

参考コード

class Comparison{
  public static void main(String[] args){
    int a = Integer.parseInt(args[0]);
    int b = Integer.parseInt(args[1]);
    
    //大きい方の値を表示
    if( a > b ){
      System.out.println("大きいのは" + a + "です");
    } else if( b > a ){
      System.out.println("大きいのは" + b + "です");
    } else {
      System.out.println("同じです");
    }
  }
}

・4問

メッセージを10回表示させるプログラムを作りなさい。

class LoopMessage{
  public static void main(String[] args){
    //メッセージを10回表示(while文)

  }
}
class LoopMessage{
  public static void main(String[] args){
    int i = 1;
    //メッセージを10回表示(while文)
    while(i <= 10){
      System.out.println(i +"回目:フリーラーニングを広げたいぜ!");
      i ++;
    }
  }
}

ちなみに、Chat-gpt(勝手にジプトさんと読んでいる。)に聞いたのですが、以下の内容です。

コードの目的は、指定されたメッセージを10回表示することです。`i`という変数が初期値1で宣言され、`while`ループが使われています。ループの条件は、`i`が10未満であることです。ループ内部では、`System.out.println`メソッドを使用して、`i`の値と指定されたメッセージを出力し、`i`をインクリメントしています。

したがって、プログラムを実行すると、以下のような結果が表示されます。

1回目:フリーラーニングを広げたいぜ!
2回目:フリーラーニングを広げたいぜ!
3回目:フリーラーニングを広げたいぜ!
4回目:フリーラーニングを広げたいぜ!
5回目:フリーラーニングを広げたいぜ!
6回目:フリーラーニングを広げたいぜ!
7回目:フリーラーニングを広げたいぜ!
8回目:フリーラーニングを広げたいぜ!
9回目:フリーラーニングを広げたいぜ!

10回目は条件が`i < 10`であるため、表示されません。

とのことでした。

・5問

コマンドラインから入力した文字列を、そのまま表示できるプログラムをfor文を使って表示しなさい。

class Echo{
  public static void main(String[] args){
    //コマンドラインの入力文字列を表示(for文)

  }
}
>Java Echo aa bb cc

と入れたら、そのまま aa bb ccというものが出てくるはず。

参考コード

class Echo{
  public static void main(String[] args){
    //コマンドラインの入力文字列を表示(for文)
    for(int i = 0; i < args.length; i++) {
      System.out.println(args[i]);
    }
  }
}

では、続き。

勉強🔥🔥🔥

・オブジェクト指向とは

class NonObject{
  public static void main(String[] args){
    //データの代入
    int[] score = {80, 100, 75};
    String[] name = {"菅原", "村山", "寺島"};

    //データの表示
    for(int i = 0; i < score.length; i++) {
      System.out.println(name[i] + "さん:" + score[i] + "点");
    }
  }
}

というコード。

1回作ったコードは、更新(変更)することがほとんどである。
例えば、この要素数の中で、生徒が一人増えたとした。
もしくは、教科の数を増やしたいと考える。

class NonObject{
  public static void main(String[] args){
    //データの代入
    int[] score1 = {80, 100, 75, 90};
    int[] score2 = {90, 80, 85, 70};

    String[] name = {"菅原", "村山", "寺島"};
    String[] name = {"数学", "英語"};

    //データの表示
    for(int i = 0; i < score.length; i++) {
      System.out.println(name[i] + "さん:" + score[i] + "点");
    }
  }
}

いちいち面倒だ。また、誰の、何の得点が何点かがわからない・・・。

人ごとの点数がもう少しまとめて、管理しやすくできないかを考える必要があると考える。

Javaには、実行用のクラスと、設計図クラスの二つがある。

クラス(設計図)
属性→何のデータを持っているのか。
(名前、教科、点数など)
操作→何の処理ができるか。
(点数を表示する)

→これによって、名前(菅原)英語(90)国語(80)
名前(佐藤)英語(50)国語(60)などというのをそのまま使える。

このような、クラスから作られる実体(モノ)を、object(オブジェクト)と呼ぶ。
このオブジェクトを中心にプログラムを作っていくことを、オブジェクト指向という。

・メリット

開発効率、保守性、メモリ効率、システム化など!!

クラス(設計図)
属性→何のデータを持っているのか。→  プログラムの世界では、変数
(名前、教科、点数など)
操作→何の処理ができるか。→  プログラムの世界では、メソッド
(点数を表示する)
これらの言い方がごっちゃにならないようにする。

・変数の定義

データ型 変数名;

class Student{
  //メンバ変数(属性)
  String name;
  int engScore;
  int mathScore;
以下はその下に続く

・メソッドの定義

戻り値の型 メソッド名(引数リスト){
(処理)
}

メソッドは、呼び出す側と、呼び出される側がある。

  //メソッド(操作)
  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  
  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

引数・・呼び出し元から受け取る値のこと。
戻り値・・メソッドの処理の後に、呼び出しもとに返す値。returnで指定することができる。
また、何も返さない場合は、voidを記述する。

  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }

↑は、引数がないが、()は書いておくことに注意しておく。

  //データ型 変数名
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  

↑は、引数がある。戻り値がない。

  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

↑は、引数なし、戻り値ありのパターンある。

また、引数の中で定義した有効範囲は、そのブロックの中でしか使えないので、注意をする必要がある。

・オブジェクトの使い方

①オブジェクトを生成すること
②変数・メソッドを利用すること

①オブジェクトを生成すること
クラス名 オブジェクト名 = new クラス名();
Student stul = new Student( );

new キーを使うと、メモリ上に新しく領域が確保される。配列でも出ました。

デフォルト初期値も入る。このように、プログラムにおいて、オブジェクトを作ることを、インスタンス化という。

②変数・メソッドを利用すること
オブジェクト名.変数名
オブジェクト名.メソッド名(引数)
stul.name = "菅原";
stul.setScore(80,90);

設計図

class Student{
  //メンバ変数(属性)
  String name;
  int engScore;
  int mathScore;
 
   //メソッド(操作)
  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  
  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

設計図をもとに、StuSampleクラスを動かしていく。

class StuSample{
  public static void main(String[] args){
    Student stu1 = new Student();

    stu1.name = "菅原";
    stu1.setScore(90, 80);

    stu1.display();    
    System.out.println("平均" + stu1.getAvg() + "点");
  }
}

ちょっと解説をしていく。

    Student stu1 = new Student();

ここは、まさにオブジェクト生成をしている。stu1というオブジェクト名で、Studentクラスを使っていると言える。(言い方は逆なのかな。)

私の考えとしては、設計図の中のStudentクラスの中の、stu1オブジェクトを作ると考えている。それをすることによって、インスタンスを生成することができる。
オブジェクトの生成が先で、そうでないと変数やメソッドは利用できない。
基本上から下にコードはよまれるので、もちろん同じStuSampleクラスの中でも生成は最初の方に書く必要がある。
その後、

    stu1.name = "菅原";
    stu1.setScore(90, 80);

ここで、実際に先ほどの

②変数・メソッドを利用すること
オブジェクト名.変数名
オブジェクト名.メソッド名(引数)
stul.name = "菅原";
stul.setScore(80,90);
を使っている。

    stu1.name = "菅原";

↑はString nameで宣言したメンバ変数。(属性)

    stu1.setScore(90, 80);

↑は()が語尾についており、メソッドになる。()の中には、引数が入れられる。90,80はそれぞれ、Studentクラスでのメソッドの宣言で使った、

  void setScore(int eng, int math){

ここの部分が入れられることになる。英語は90点、数学は80点である。
頭いいなこの人。

    stu1.display();    
    System.out.println("平均" + stu1.getAvg() + "点");

最後の行で考えていくと、

stu1.display()は、

void display()

の部分のメソッド(操作)を使っていることになる。
引数はないので、()になっている。
では、このメソッドの中身は何をするのかというと、

  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }

となっている。
よって、先ほど代入した
stu1.name = "菅原"の部分に"さん"がくっつき、
菅原さんが表示される。
また、菅原さんの英語が90点、数学が80点という素晴らしい成績も表示されることになる。

なるほどな〜〜おもろい。
こういう書き方をするとなんか気持ちいいし、その上、その後の変更や更新が楽でいい。

楽をする人にはならないようにする。でも、どうしたら自分が楽できるかを考える人になりたい。そのことが、いつか誰かの暮らしをラクにするものと信じて・・。

そして、オブジェクト指向はそんなラクちんを叶えてくれる重要な考え方なのだとわかった。つまり、「作って終わり」とか、「楽しんで終わり」ではなくて、その後のエンジニアやユーザーのための作品作りが必要なのかなぁ。

とりあえずここまで!


少しずつですが、投稿をしております。 noteで誰かのためになる記事を書いています。 よろしくおねがいします。