十八日目はクラスの機能について

今日は多めに時間を取れたのでなんとかLesson9まで終わらせることができた。と言ってもまだ練習問題が解けてないけど。

今日学んだこと

や、何気なくオブジェクト化してたけどそれってコンストラクタを省略してたんだなぁ…と、今更ながら知った。これでまたもう少し「らしい」プログラム書けるようになるんだろか?
明日はやりかけの練習問題を解いてしまおう。


昨日載せたプログラムを修正してみた。少しはマシになったかな?

import java.io.*;
//車クラスを設定
class MyCar
{
	private int num;
	private double gas;

	int chkNum(int n)
	{
		num = n;
		//ナンバーは4桁以内
		if(0 < num && num < 10000){
			return num;
		}
		else{
			return 0;
		}
	}
	
	double chkGas(double g)
	{
		gas = g;
		//ガソリン量が100を超えると入りません
		if(0 < gas && gas < 101){
			return gas;
		}
		else{
			return 0;
		}
		}
}

class GasStation {

		//車クラスへアクセスする準備
		MyCar MC = new MyCar();
		//変数の宣言
		private String str;
		private int nm=0;
		private double gs=0;
		
		void sales() throws IOException
		{		
		System.out.println("いらっしゃいませ!");
		System.out.println("車のナンバーと給油量を教えて下さい");
		}
		
		void Numchk(int n) throws IOException
		{
			nm = n;
			nm = MC.chkNum(nm);

		//入力が不正の場合、繰り返し処理
			if(nm == 0){
				do{
					System.out.println("ナンバーが不正です");
					System.out.println("4桁の数字で入力して下さい");
					
					//入力準備
					BufferedReader br = new BufferedReader
					(new InputStreamReader(System.in));
					//車のナンバーを取得
					str = br.readLine();
					nm = Integer.parseInt(str);
					//車にナンバーの値を渡す
					MC.chkNum(nm);
				//	MC.setNum(nm);
				}
				while(nm == 0);
				System.out.println
				("ナンバーが" + nm + "の車ですね");
				System.out.println
				("続けて給油するガソリン量を入力して下さい");
			}
			else{
				System.out.println
				("ナンバーが" + nm + "の車ですね");
				System.out.println
				("続けて給油するガソリン量を入力して下さい");
			}
		}
		
		void Gaschk(double g) throws IOException
		{
			gs = g;
			gs = MC.chkGas(gs);
			
		//入力が不正の場合、繰り返し処理
			if(gs == 0){
				do{
					System.out.println("ガソリン量が不正です");
					System.out.println("1-100の範囲で入力して下さい");
					
					//入力準備
					BufferedReader br = new BufferedReader
					(new InputStreamReader(System.in));
					//ガソリン量を取得
					str = br.readLine();
					gs = Double.parseDouble(str);
					//車にガソリン量の値を渡す
					MC.chkGas(gs);
					//MC.setGas(gs);
				}
				while(gs == 0);
				System.out.println(gs + "Lのガソリンを給油します");
				System.out.println("しばらくお待ちください");
			}
			else{
				System.out.println(gs + "Lのガソリンを給油します");
				System.out.println("しばらくお待ちください");
			}
			int fi = (int)(gs/10);
			for(int i = 0; i < fi; i++){
				System.out.println("・・給油しています・・");
			}
		}
		
		void cashier()
		{
			//価格計算用の変数を宣言
			int sum;
			
			sum = (int)(gs*112);
			
			System.out.println("給油が完了しました");
			System.out.println("ガソリン代は" + sum + "円になります");
			System.out.println("毎度ありがとうございます!");
	}

}

class Driver{
	
	/**
	 * レギュラーガソリン112円という夢を見た
	 * 車のナンバーとガソリン量を入力してもらう
	 */

	public static void main(String[] args) throws IOException
	{
		//変数の宣言
		String str;
		int nmb;
		double gsn;
		
		//GasStationクラスへアクセスする準備
		GasStation GST = new GasStation();
		
		//スタンドの店員と対話
		GST.sales();
		
		//入力準備
		BufferedReader br = new BufferedReader
		(new InputStreamReader(System.in));

		//車のナンバーを取得
		str = br.readLine();
		nmb = Integer.parseInt(str);
		//店員に確認を取る
		GST.Numchk(nmb);
		
		//ガソリン量を取得
		str = br.readLine();
		gsn = Double.parseDouble(str);
		//店員に確認を取る
		GST.Gaschk(gsn);
		
		//お会計
		GST.cashier();
	}
	
}

えあさんの指摘、数字以外の入力時にエラー発生する件については今回スルー。例外に対する対処とかあるんだろうけどよくわからんかった。
しゅんの指摘、車が喋ってる件については修正できたと思う。また車、ガソリンスタンド、運転者と役割をはっきりさせたことで互いの関係がなんとなく見えた気がした。
DriverはGasStationにアクセスして、GasStationはMyCarにアクセスする。DriverからMyCar、またMyCarからDriverへ直接アクセスはしないようにしてみた。
セルフのスタンドでもなきゃ、運転手が自分で車のこと触ったりしないもんな。