Java(応用編)演習問題

1日目

「1日目:継承」演習問題

【問1】

次の要件を満たすプログラムを作成してみましょう
Personクラス(スーパークラス)
 フィールド
  名前(⽂字列)
  性別(⽂字) ’m’→男性、’f’→⼥性を表す
  ⽣年⽉⽇(⽂字列) YYYY/MM/DD形式)
 メソッド
  Introduction()を⽤意 名前、性別、⽣年⽉⽇を表⽰
Patientクラス(Personクラスから派⽣する)
 フィールド
  ⾝⻑(cm)
  体重(kg)
 メソッド
  Introductionを⽤意 名前、性別、⽣年⽉⽇、⾝⻑、体重を表⽰
  適正体重を表⽰する関数
  ※適正体重=⾝⻑(m)×⾝⻑(m)×22
適正体重より⼤きいか⼩さいかを表⽰する関数
mainの処理
  Patientクラスを実装し、表⽰関数、適正体重を表⽰する関数、適正体重より⼤きいか⼩さいかを表⽰する関数をそれぞれ呼び出す

「1日目:継承」解答例

【問1】

class Person{
    String name;
    char gender;
    String birthday;
    
    Person(String n, char gender,String birthday){
        this.name = n;
        this.gender = gender;
        this.birthday = birthday;
    }
    
    void Introduction() {
        System.out.println ("私の名前は" + this.name);
        if(this.gender=='m'){
            System.out.println("男性です");
        }else if(this.gender=='f'){
            System.out.println("女性です");
        }
        System.out.println("生年月日は"+this.birthday+"です");        
     }
}

class Patient extends Person{
    double height;
    double weight;
    
    Patient(String name, char gender,String birthday,double height,double weight){
        super(name,gender,birthday);
        this.height = height;
        this.weight = weight;
    }
    
    public double getBMI(){
        return (this.height/100.0) * (this.height/100.0) * 22;
    }
    
    /* BMIより小さい場合true、大きい場合falseを返す*/
    public boolean isLighter(double bmi){
        if(bmi>this.weight){
            return true;
        }else{
            return false;
        }
    }
}
public class Sample{
     public static void main(String []args){
        Patient pt = new Patient("Yamada Taro",'m',"2001/12/12",175.0,78.5);
        pt.Introduction();
        double bmi = pt.getBMI();
        System.out.println("私の標準体重は"+bmi+"kgです");
        if(pt.isLighter(bmi)){
            System.out.println("私は標準体重はより軽いです");
        }else{
            System.out.println("私は標準体重はより重いです");
        }
     }
}
実行結果
私の名前はYamada Taro
男性です
生年月日は2001/12/12です
私の標準体重は67.375kgです
私は標準体重はより重いです

Java 応用編 1日目へ戻る

2日目

「2日目:ポリモーフィズム」演習問題

【問1】

前述したソースを実装してみましょう

【問2】

Rectangleクラスに存在するcalcAroundメソッドをShapeクラスに移動し、すべてのサブクラスでオーバーライドしてみましょう
calcAroundは図形の外周の長さを求める機能を持っているものとします
※三角形は直角三角形とします

【問3】

Shapeクラスから継承したCircleクラスを作成し、calcArea、calcAroundメソッドを呼び出してみましょう

「2日目:ポリモーフィズム」解答例

【問2】

class Shape {
    int color;
    int dot;
    
    Shape(){}
    Shape(int color,int dot){
        this.color=color;
        this.dot=dot;
    }
    double calcArea(){
        return 0;
    }
    double calcAround(){
        return 0;
    }
}
class Rectangle extends Shape{
    double width;
    double height;
    
    Rectangle(){}
    Rectangle(int color,int dot,double width,double height){
        super(color,dot);
        this.width=width;
        this.height=height;
    }
    double calcArea(){
        return this.width * this.height;
    }
    double calcAround(){
        return (this.width+this.height)*2;
    }
}
class Triangle extends Shape{
    double bottom;
    double height;
    
    Triangle(){}
    Triangle(int color,int dot,double bottom,double height){
        super(color,dot);
        this.bottom=bottom;
        this.height=height;
    }
    double calcArea(){
        return (this.bottom * this.height)/2;
    }
    double calcAround(){
        // 斜辺の長さ
        double c = Math.sqrt(this.bottom * this.bottom + this.height * this.height);

        // 周長を計算
        double perimeter = this.bottom + this.height + c;
        return perimeter;
    }
}

public class Sample{
     public static void main(String []args){
        Rectangle rect = new Rectangle(0xff0000,1,10,20);
        Triangle triangle = new Triangle(0x00ff00,2,10,20);
        
        double area = rect.calcArea();
        System.out.println("Rectangle Area = " + area);
        double r = rect.calcAround();
        System.out.println("Rectangle round = " + r);
        
        area = triangle.calcArea();
        System.out.println("Triangle Area = " + area);
        r = triangle.calcAround();
        System.out.println("Triangle round = " + r);
    }
}
実行結果
Rectangle Area = 200.0
Rectangle round = 60.0
Triangle Area = 100.0
Triangle round = 52.3606797749979

【問3】

class Circle extends Shape{
    double radius;

    Circle(){}
    Circle(int color,int dot,double radius){
        super(color,dot);
        this.radius=radius;
    }
    double calcArea(){
        return Math.PI + this.radius * this.radius ;
    }
    double calcAround(){
        return 2 * Math.PI + this.radius;
    }
}
public class Sample{
     public static void main(String []args){
        Circle circle = new Circle(0x0000ff,1,10);
        
        double area = circle.calcArea();
        System.out.println("Circle Area = " + area);
        double r = circle.calcAround();
        System.out.println("Circle round = " + r);
     }
}
実行結果
Circle Area = 103.1415926535898
Circle round = 16.283185307179586

Java 応用編 2日目へ戻る

4日目

「4日目:抽象クラス」演習問題

【問1】

サンプルグラムを実装してみましょう

【問2】

Triangleクラス(三角形)を追加してみましょう

【問3】

次のようなradioクラスとTelevisionクラスがあります。電源状態の処理が共通になるため、抽象クラスのPowerableクラスを作成してみましょう

class Radio{
    private int battery; // バッテリー残量
    private boolean powerStatus; // 電源状態

    public Radio(int battery) {
        this.battery = battery;
        this.powerStatus = false; // 初期状態はOFF
    }
    
    public boolean getPowerStatus() {
        return this.powerStatus;
    }

    public int getBattery() {
        return this.battery;
    }

    public void setBattery(int battery) {
        this.battery = battery;
    }

    public void powerOn() {
        if (this.battery > 0) {
            // バッテリー残量が0より大きい場合のみ電源ON可能
            // 電源ON処理
            this.powerStatus = true;
            System.out.println("ラジオの電源をONにしました。");
        } else {
            System.out.println("バッテリー残量がありません。電源をONにできません。");
        }
    }

    public void powerOff() {
        // 電源OFF処理
        this.powerStatus = false;
        System.out.println("ラジオの電源をOFFにしました。");
    }
}

class Television{
    private boolean powerStatus; // 電源状態

    public Television(boolean socket) {
        this.powerStatus = false; // 初期状態はOFF
    }
    
    public boolean getPowerStatus() {
        return this.powerStatus;
    }

    public void powerOn() {
        // 電源ON処理
        this.powerStatus = true;
        System.out.println("テレビの電源をONにしました。");
    }

    public void powerOff() {
        // 電源OFF処理
        this.powerStatus = false;
        System.out.println("テレビの電源をOFFにしました。");
    }
}
public class Main {
    public static void main(String[] args) {
        Radio radio = new Radio(50); // バッテリー残量50でラジオを作成

        radio.powerOn(); // 電源ONを試みる
        radio.powerOff(); // 電源OFF

        radio.setBattery(0); // バッテリー残量を0にする
        radio.powerOn(); // 電源ONを試みる (バッテリー不足)
        
        Television tv = new Television(); // テレビを作成
        
        tv.powerOn();  // 電源ONを試みる
        tv.powerOff(); // 電源OFF
    }
}

「4日目:抽象クラス」解答例

【問2】

class Triangle extends Shape{
    double height;
    double bottom;
    
    Triangle(int color,int dot,double height,double bottom){
        this.color=color;
        this.dot=dot;
        this.height=height;
        this.bottom=bottom;
    }
    public void draw(){
        this.drawCharacter();
        System.out.println("in Triangle");
    }
    public double calcArea(){
        return this.height * this.bottom / 2.0;
    }
}
public class Sample{

     public static void main(String []args){
        Triangle triangle = new Triangle(0x0000ff,2,6,3);
        triangle.draw();
        double area = triangle.calcArea();
        System.out.println("circle area=" + area);
     }
}
実行結果
color=255 dot=2
in Triangle
circle area=9.0

【問3】

abstract class Powerable{
       abstract public boolean getPowerStatus() ;
       abstract public void powerOn();
       abstract public void powerOff();
}
class Radio extends Powerable{
    private int battery; // バッテリー残量
    private boolean powerStatus; // 電源状態

    public Radio(int battery) {
        this.battery = battery;
        this.powerStatus = false; // 初期状態はOFF
    }
    
    public boolean getPowerStatus() {
        return this.powerStatus;
    }

    public int getBattery() {
        return this.battery;
    }

    public void setBattery(int battery) {
        this.battery = battery;
    }

    public void powerOn() {
        if (this.battery > 0) {
            // バッテリー残量が0より大きい場合のみ電源ON可能
            // 電源ON処理
            this.powerStatus = true;
            System.out.println("ラジオの電源をONにしました。");
        } else {
            System.out.println("バッテリー残量がありません。電源をONにできません。");
        }
    }

    public void powerOff() {
        // 電源OFF処理
        this.powerStatus = false;
        System.out.println("ラジオの電源をOFFにしました。");
    }
}

class Television extends Powerable{
    private boolean powerStatus; // 電源状態

    public Television(boolean socket) {
        this.powerStatus = false; // 初期状態はOFF
    }
    
    public boolean getPowerStatus() {
        return this.powerStatus;
    }

    public void powerOn() {
        // 電源ON処理
        this.powerStatus = true;
        System.out.println("テレビの電源をONにしました。");
    }

    public void powerOff() {
        // 電源OFF処理
        this.powerStatus = false;
        System.out.println("テレビの電源をOFFにしました。");
    }
}
public class Main {
    public static void main(String[] args) {
        Radio radio = new Radio(50); // バッテリー残量50でラジオを作成

        radio.powerOn(); // 電源ONを試みる
        radio.powerOff(); // 電源OFF

        radio.setBattery(0); // バッテリー残量を0にする
        radio.powerOn(); // 電源ONを試みる (バッテリー不足)
        
        Television tv = new Television(true); // テレビを作成
        
        tv.powerOn();  // 電源ONを試みる
        tv.powerOff(); // 電源OFF
    }
}

Java 応用編 4日目へ戻る

5日目

「5日目:インタフェース」演習問題

【問1】

上のサンプルプログラムを実装してみましょう

【問2】

ShapeCircleクラスをIShape、ICalculateAreaから実装してみましょう

【問3】

以下のようなWalletクラスとCreditCardクラスがあります。pay()メソッドをもったインタフェースIPaymentを作成しWalletおよびCreditCardクラスを書き換えてみましょう

class Wallet{
    int amount;
    
    Wallet(int amount){
        this.amount = amount;
    }
    
    boolean pay(int money){
        if(this.amount<money){
            System.out.println("Not enough money left");
            return false;
        }else{
            this.amount-=money;
            System.out.println("The remaining balance is " + this.amount + " yen.");
            return true;
        }
    }
}

class CreditCard{
    String company;
    String cardNo;
    String name;
    
    CreditCard(String company,String cardNo,String name){
           this.company = company;
           this.cardNo = cardNo;
           this.name = name;
    }
    
    boolean pay(int money){
        System.out.println("Credit card payment completed");
        return true;
    }
}
public class Main {
    public static void main(String[] args) {
        Wallet wallet = new Wallet(10000); // 財布インスタンスを作成し1万円入れる
        wallet.pay(6000);
        wallet.pay(5000);

        CreditCard card = new CreditCard("Yamamoto","N社","1234567890");
        card.pay(15000);
    }
}

「5日目:インタフェース」解答例

【問2】

interface IShape{
    public int getColor();
    public int getDot();
    public void getDraw();
}
interface ICalculateArea {
	public double getCalculateArea();
}
class ShapeCircle implements IShape,ICalculateArea{
	int color;
    int dot;
    double radius;
    
    ShapeCircle(int color,int dot,double radius){
        this.color = color;
        this.dot = dot;
        this.radius = radius;
    }
    public int getColor(){
        return this.color;
    }
    public int getDot(){
        return this.dot;
    }
    public void getDraw(){
        System.out.println("radius=" + this.radius );
    }
    public double getCalculateArea(){
        return this.radius * this.radius * Math.PI;
    }
}
public class Sample {
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		ShapeCircle shape1 = new ShapeCircle(1, 2, 10.0);
		shape1.getDraw();
		double area = shape1.getCalculateArea();
		System.out.println("円の面積="+area);
	}

}

【問3】

interface IPayment {
	boolean pay(int money);
}
class Wallet implements IPayment{
    int amount;
    
    Wallet(int amount){
        this.amount = amount;
    }
    
    public boolean pay(int money){
        if(this.amount<money){
            System.out.println("Not enough money left");
            return false;
        }else{
            this.amount-=money;
            System.out.println("The remaining balance is " + this.amount + " yen.");
            return true;
        }
    }
}

class CreditCard implements IPayment{
    String company;
    String cardNo;
    String name;
    
    CreditCard(String company,String cardNo,String name){
           this.company = company;
           this.cardNo = cardNo;
           this.name = name;
    }
    
    public boolean pay(int money){
        System.out.println("Credit card payment completed");
        return true;
    }
}
public class Sample {
    public static void main(String[] args) {
        Wallet wallet = new Wallet(10000); // 財布インスタンスを作成し1万円入れる
        wallet.pay(6000);
        wallet.pay(5000);

        CreditCard card = new CreditCard("Yamamoto","N社","1234567890");
        card.pay(15000);
    }
}
実行結果
The remaining balance is 4000 yen.
Not enough money left
Credit card payment completed

Java 応用編 5日目へ戻る

6日目

「6日目:例外を捉える」演習問題

【問1】

Integer.parseIntメソッドを使い、文字列を整数に変換してみましょう
また、以下のURLを参考に、例外処理を組み込んでみましょう
https://docs.oracle.com/javase/jp/12/docs/api/java.base/java/lang/Integer.html#parseInt(java.lang.String)

【問2】

整数型の配列を用意し、要素数以上の添え字に値を代入するプログラムを、例外処理を組み込んで作成してみましょう

実行結果
Index 5 out of bounds for length 5

「6日目:例外を捉える」解答例

【問1】

public class Sample{
     public static void main(String []args){
    	 String value = "123a";
    	 try {
    		 int num = Integer.parseInt(value);
    		 System.out.println("num=" + num);
    	 }catch(NumberFormatException e) {
    		 System.out.println(e));
    	 }
     }
}
実行結果
java.lang.NumberFormatException: For input string: "123a"

【問2】

public class Sample{
     public static void main(String []args){
    	 String value = "123a";
    	 try {
    		 int num = Integer.parseInt(value);
    		 System.out.println("num=" + num);
    	 }catch(NumberFormatException e) {
    		 System.out.println(egetMessage());
    	 }
     }
}

Java 応用編 6日目へ戻る

7日目

「7日目:キーボードからの入力」演習問題

【問1】

キーボードから⽂字列を⼊⼒後、受け取った⽂字列とその⻑さを表⽰するプログラムを作成してみましょう

【問2】

それぞれのサンプルプログラムを実行してみましょう

「7日目:キーボードからの入力」解答例

【問1】

import java.util.Scanner;
public class Sample{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("文字列を入力してください:");
        String input = scanner.nextLine();
        System.out.println("入力された文字列は"+input+"です");
        System.out.println("文字列の長さは"+input.length()+"です");
        scanner.close();
    }
}
// または
import java.util.Scanner;
public class Sample{
	public static void main(String[] args) {
		try(Scanner scanner = new Scanner(System.in)) {
			System.out.println("文字列を入力してください:");
	        String input = scanner.nextLine();
	        System.out.println("入力された文字列は"+input+"です");
	        System.out.println("文字列の長さは"+input.length()+"です");
		};
    }
}

Java 応用編 7日目へ戻る

「7日目:バッファストリーム」演習問題

【問1】

それぞれのサンプルプログラムを実行してみましょう

【問2】

FileInputStream、FileOutputStreamを使ったサンプルもバッファストリームを使って書き換えてみましょう

「7日目:バッファストリーム」解答例

【問2】

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileInput {

	public static void main(String[] args) {
		try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("./star.png"));
	             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("./star_copy.png"))) {

	            byte[] buffer = new byte[1024]; // バッファサイズは適宜調整
	            int bytesRead;

	            while ((bytesRead = bis.read(buffer)) != -1) {
	                bos.write(buffer, 0, bytesRead);
	            }

	            System.out.println("バイナリファイルのコピーが完了しました。");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
    }
}

Java 応用編 7日目へ戻る

コメント

この記事へのコメントはありません。

関連記事

【Java】簡単操作でサーブレットをカスタマイズ!【動画あり】

Java 応用編 3日目

Java 基本編 4日目

PAGE TOP