【レポート】プログラムを構成する部品であるメソッドについて

【レポート】プログラムを構成する部品であるメソッドについて

目的

プログラムを構成する部品であるメソッドについて、その作り方や使い方などができるようにすること

内容

P238 List7-11を改造して、問題発生部メソッド化する。もし余力があればcomfirmRetry部の修正により、異なる種類の問題も選択できるようにする。また、なお他人とは違う何かをプログラムの中に機能として組込む。

ソースコード

以下に内容のプログラムのソースコードを示す

package lesson5;  

import java.util.Random;

import java.util.Scanner;

public class Kadai5 {

        static Scanner stdIn = new Scanner(System.in);

        static Random  rand  = new Random();

           //引数を受け取らない乱数を発生させるメソッド

          static int  kazu(){

                        int a= rand.nextInt(900) + 100;

                        return a;

          }

 //3桁の正の数字がメソッドkazu()によって出てそれをランダムに+かーにするメソッド

          static int fugou(int n){

            int p = rand.nextInt(2);

            if(p==0)

             return n;

             else

           return -n;

          }

          //+,-をだすメソッド

          static String puramai(int n){

             if(n>=0)

             return “+”;

              else

            return “-“;

           }

      //絶対値のメソッド

          static int zettaiti(int n){

          if(n<0)

          return -n;

          else

          return n;

          }

        //引数を受け取らないメソッド

static boolean confirmRetry(){

                int cont;

  do{

         System.out.println(“和差と積どちらをやりますか?和差・・・10/積・・・20”);

                  int choice=stdIn.nextInt();

                  //和差

        if(choice==10){

              int x = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

            int y = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

            int z = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

                  y = fugou(y);//confirmRetryメソッドからfugouメソッドの呼び出し

            z = fugou(z);//confirmRetryメソッドからfugouメソッドの呼び出し

            x = fugou(x);//confirmRetryメソッドからfugouメソッドの呼び出し

                 while(true){

                System.out.print(puramai(x)+zettaiti(x)+puramai(y)+zettaiti(y)+puramai(z)+zettaiti(z)+”=”);//解く計算の表示

            //zettaiti

                int k = stdIn.nextInt();

                if(k == x+y+z)

                break;//while(true)抜け出す。146行目へ

           System.out.println(“違いますよ!!”);//while(true)文の先頭へ(100行)

               }

    }

                //乗除 

 if(choice==20){

                 int x = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

           int y = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

           int z = kazu();//confirmRetryメソッドからkazuメソッドの呼び出し

              y = fugou(y);//confirmRetryメソッドからkazuメソッドの呼び出し

           z = fugou(z);//confirmRetryメソッドからkazuメソッドの呼び出し

           x = fugou(x);//confirmRetryメソッドからkazuメソッドの呼び出し

          while(true){

          System.out.print(“(“+x+”)*(“+y+”)*(“+z+”)”+”=”);//解く計算の表示

               int k = stdIn.nextInt();

                   if(k == x*y*z)

               break;//while(true)文抜け出す。146行目へ

          System.out.println(“違いますよ!!”);//while(true)文の先頭へ(129行)

           }

   }   

 System.out.println(“正解です!!もう一度やりますか?<Yes・・・1/No・・・0>:”);

              cont=stdIn.nextInt();

  }while(cont==1);//do文の先頭へ(83行)

          return cont==0;//mainメゾッドへ boolean

}//static boolean confirmRetry()       

     //mainメソッド

  public static void main(String[] args) {

            System.out.println(“暗算力トレーニング!!”);

            confirmRetry();

            System.out.println(“お疲れ様でした!!”);

 }

}

結果

3のソースコードの実行結果の画面キャプチャを以下の図1に示す。

図1 3のソースコードの結果

考察

 今回のプログラムは多くのメソッドを使用した。メソッドとは、ひとまとまりの手続きを1つの部品としてまとめることができる機能。メソッドを使うにはメソッドの宣言と呼出しが必要になる。メソッドの宣言はその頭部に返却型、メソッド名、仮引数並び、が必要だ。まず、返却型はメソッドに戻す値である返却値の型。次のメソッド名はメソッド名の名前である。メソッドは、名前をもとに、他から呼び出される。そして、最後の仮引数並びは指示を受け取るための変数である仮引数を( )の中で宣言する。複数の仮引数を受け取る場合は、コンマで区切る。頭部が書き終わったら、次はメソッドの本体を書いていく。メソッドの本体はブロックの中に書き、メソッドの中でのみ利用する変数は、そのメソッドの中で宣言・利用するのが原則。なお、メソッド本体の中では、メソッド名と同一名の変数を宣言できることになっている。理由は、メソッドと変数は種類が異なるため、名前が衝突しないからだ。ただし、メソッド本体内で、仮引数と同一名の変数を宣言することは出来ない。メソッドの宣言が終わると次はメソッドの呼出しだ。メソッドの呼出しは、メソッド名の後ろに( )を付けて行う。この( )はメソッド呼出し演算子だ。メソッドに対する補助的な指示として与える実引数は、コンマで区切って( )の中に与える。そして、メソッド呼出しが行われると、プログラムの流れは、そのメソッドへと移る。呼び出されたメソッドでは、仮引数用の変数が生成されると同時に、実引数の値で初期化される。そして、メソッド呼出し式を評価すると、メソッドによって返された返却値が得られる。

 今回のプログラムの流れを見ていくと、mainメソッドの前までのメソッドは全部で6つある。呼び出せるのは1番早くてmainメソッドの中、次は他のメソッドの中での呼び出し。従って、プログラムの流れ的にmainから見ていくと”暗算力トレーニング!!と出力したあとにconfirmRetry()という引数なしの真か偽か評価して返すboolean型のメソッドが呼び出される。始めにint contと宣言しているが、contはconfirmRetryメソッドの中だけで使われる。do文の中の処理において、例えば和差の計算の処理を見ていくと、いきなりint x,y,zのとこで引数なしのkazuメソッドが呼び出される。Kazu()の処理は乱数を使って3桁の数字をだすプログラムで、終わるとreturn文によって返され、x,y,zに代入される。次の処理はx,y,zのとこで引数ありのfugou(x)、fugou(y) fugou(z)メソッドが呼び出される。fugouメソッドの中の処理は2の乱数つまり1か0をランダムに出しpに代入しpが0なら正の値になって返す、1なら負の値になって返しx,y,zが新しくなるプログラムだ。これが終わると次はwhile文。Whileの制御文がtrueである為、breakがないと永遠に回り続けてしまう。while文の中身をみていくと、和差の計算問題の出力が出てくるが、このとき引数ありのparamai(X), puramai(y), puramai(z)メソッドとこれまた引数ありのzettaiti(x), zettaiti(y), zettaiti(z)メソッドが呼び出される。puramaiメソッドはfugouメソッドによってランダムに+-がついたx,y,zを引数にとり0以上なら+を0以下なら-を出力するプログラムで、zettaitiメソッドもランダムに+-がついたx,y,zを引数にとり0以下なら数を正にし、0以上はそのままにするというプログラム。もし、このzettaitiメソッドがなく、この部分をx,y.zで書いて出力すると、仮にfugouメソッドまでの処理によってxが-5、yが4、zが-2と出たとするとpuramaiメソッドのとこでそれぞれ、-、+、-と出力してしまい、全体の出力のとこで「--5+4--2」というおかしな出力になったりマイナスとマイナスでプラスになると勘違いしてしまうと答えが間違ってしまう為、zettaitiメソッドは必要なのである。計算が無事にあうとその後のif文のなかにあるbreakによってwhile文を抜けだせ、contに0か1を入力する。1を入力した場合はdo文の先頭に戻り、和差か乗除を選択し計算がまた始まる。0を入力した場合はreturn文によってmaniメソッドに戻りプログラムが終了する。

 もし、積を選択すると3つ数はx,y,zはfugouメソッドにより出てあとは3つを掛け算するだけで得に問題はない。

まとめ

 ひとまとまりの手続きは、メソッドという部品として実現でき、そのメソッドの宣言は名前・返却値・仮引数並び・メソッド本体などで定義する。メソッドは、メソッド呼出し演算子()を用いて呼び出せる。メソッドを呼び出すと、プログラムの流れは、呼出し元から、呼び出されるメソッドへ移る。メソッド呼出しにおける引数のやりとりは、値渡しによって行われる。呼出し側が渡す実引数の値によって、メソッドが受け取る仮引数が初期化される。呼び出しされたメソッドで仮引数の値を書きかえても、呼出し側の実引数の値が変わることはない。メソッドはreturn文によって、値を返却できる。return文が実行されると、プログラムの流れは、呼出し元へと戻る。返却された値は、メソッド呼出し式の評価によって得られる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です