본문으로 바로가기

[6장 실습문제]

category withTextBook/명품 JAVA 프로그래밍 2021. 4. 17. 02:09

1. 다음 main( )이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.

 

 

public class MyPoint {

	private int x;
	private int y;
	
    
	MyPoint (int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	
	public String toString() {
    
		return "Point(" + x + "," + y + ")";
	}
	
    
	public boolean equals (MyPoint mp) {
		if (this.x == mp.x && this.y == mp.y)
			return true;
		else
			return false;
	}


	public static void main(String[] args) {
    
		MyPoint p = new MyPoint(3, 50);
		MyPoint q = new MyPoint(4, 50);
        
		System.out.println(p);
        
		if(p.equals(q))
			System.out.println("같은 점");
		else
			System.out.println("다른 점");
	}
}

2. 중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다.

2. 생성자는 3개의 인자(s, y, radius)를 받아 해당 필드를 초기화하고,

2. equals( ) 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.

 

 

public class Circle {

	private int x;
	private int y;
	private int radius;
	
    
	Circle (int x, int y, int radius) {
    
		this.x = x;
		this.y = y;
		this.radius = radius;
	}
	
    
	public String toString() {
    
		return "Circle(" + x + "," + y + ")반지름" + radius;
	}
	
    
	public boolean equals (Circle c) {
    
		if (this.x == c.x && this.y == c.y)
			return true;
		else
			return false;
	}
	
    
	public static void main(String[] args) {
    
		Circle a = new Circle(2, 3, 5); // 중심 (2,3)에 반지름 5인 원
		Circle b = new Circle(2, 3, 50); // 중심 (2,3)에 반지름 30인 원
        
		System.out.println("원 a : " + a);
		System.out.println("원 b : " + b);
        
		if (a.equals(b))
			System.out.println("같은 원");
		else
			System.out.println("서로 다른 원");
	}
}

3. 다음 코드를 수정하여, Calc 클래스는 etc 패키지에, MainApp 클래스는 main 패키지로 분리 작성하라.

 

 

package etc;

public class Calc {

	private int x, y;
    
    
	public Calc(int x, int y) { this.x = x; this.y = y; }
    
    
	public int sum() { return x + y; }
}
package etc;

import etc.Calc;

public class MainApp {

	public static void main(String[] args) {
    
		Calc c = new Calc(10, 20);
		System.out.println(c.sum());
	}
}

4. 다음 코드를 수정하여 Shape 클래스는 base 패키지에, Circle 클래스는 derived 패키지에,

4. GraphicEditor 클래스는 app 패키지에 분리 작성하라.

 

 

package base;

public class Shape {

	public void draw() { System.out.println("Shape"); }
}
package derived;

import base.Shape;

public class Circle extends Shape {

	public void draw() { System.out.println("Circle"); }
}
package app;

import base.Shape;
import derived.Circle;

public class GraphicEditor {

	public static void main(String[] args) {
    
		Shape shape = new Circle();
        
		shape.draw();
	}
}

5. Calendar 객체를 생성하면 현재 시간을 알 수 있다.

 

5. 프로그램을 실행한 현재 시간이 새벽 4시에서 낮 12시 이전이면 "Good Morning"을,

5. 오후 6시 이전이면 "Good Afternoon"을,

5. 밤 10시 이전이면 "Good Evening"을,

5. 그 이후는 "Good Night"을 출력하는 프로그램을 작성하라.

 

import java.util.Calendar;

public class CalendarApp {

	public static void main(String[] args) {
    
		Calendar now = Calendar.getInstance();
        
		int hour = now.get(Calendar.HOUR_OF_DAY);
		int minute = now.get(Calendar.MINUTE);
		
        
		if (hour >= 4 && hour < 12)
			System.out.println("현재 시간은 " + hour + "시" + minute + "분입니다.\nGood Morning");
		else if (hour >= 12 && hour < 18)
			System.out.println("현재 시간은 " + hour + "시" + minute + "분입니다.\nGood Afternoon");
		else if (hour >= 18 && hour < 22)
			System.out.println("현재 시간은 " + hour + "시" + minute + "분입니다.\nGood Evening");
		else
			System.out.println("현재 시간은 " + hour + "시" + minute + "분입니다.\nGood Night");
	}
}

6. 경과시간을 맞추는 게임을 작성하라.

6. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고

6. 여기서 10초에 더 근접하도록 다음 <Enter>키를 입력한 사람이 이기는 게임이다.

 

import java.util.Calendar;
import java.util.Scanner;


public class Person {

	private String name;
	private int time;
	
    
	public void setName (String name) {
    
		this.name = name;
	}
	
    
	public void setTime (int time) {
    
		this.time = time;
	}
	
    
	public String getName() {
    
		return this.name;
	}
	
    
	public int getTime() {
    
		return this.time;
	}
}



public class Game {

		private Scanner scanner;	
		private Person p [];
		private int num;
		private int secondNow;
		private int secondTenAfter;
		
        
	Game() {
		num = 2;
		p = new Person [num];
		scanner = new Scanner(System.in);
	}
	
    
	public void setNames() {
    
		for (int i = 0; i < num; i++) {
			System.out.print("이름 입력 : ");
			String name = scanner.nextLine();
            
			p[i] = new Person();
			p[i].setName(name);
		}
	}
	
    
	public void run() {
    
		setNames();
			
		for (int i = 0; i < num; i++) {
        
			System.out.print(p[i].getName() + " 시작 <Enter>키>>");
			String enter = scanner.nextLine();
            
			Calendar now = Calendar.getInstance();
			secondNow = now.get(Calendar.SECOND);
			System.out.println("\t현재 초 시간 = " + secondNow);
            
			System.out.print("10초 예상 후 <Enter>키>>");
			enter = scanner.nextLine();
            
            
			Calendar tenAfter = Calendar.getInstance();
			secondTenAfter = tenAfter.get(Calendar.SECOND);
			System.out.println("\t현재 초 시간 = " + secondTenAfter);
            
            
			if (secondNow > secondTenAfter)
				p[i].setTime(Math.abs(secondTenAfter + 60 - secondNow));
			else
				p[i].setTime(Math.abs(secondNow - secondTenAfter));
		}
		
        
		for (int i = 0; i < num; i++)
			System.out.print(p[i].getName() + "의 결과 " + p[i].getTime() + ", ");
		
        
		int min = Math.abs(10 - p[0].getTime());
		String minName = p[0].getName();
        
		for (int i = 1; i < num; i++) {
			if (Math.abs(10 - p[i].getTime()) < min) {
				min = p[i].getTime();
				minName = p[i].getName();
			}
		}
		
		System.out.println("승자는 " + minName);
	}


	public static void main(String[] args) {
    
		Game game = new Game();
		
		System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
		game.run();
	}
}

7. Scanner를 이용하여 한 라인을 읽고,

7. 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.

 

 

7. (1) StringTokenizer 클래스를 이용하여 작성하라.

 

import java.util.StringTokenizer;
import java.util.Scanner;


public class StringTokenizerEx {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		while (true) {
			String str = scanner.nextLine();
			
			if (str.equals("그만")) {
				System.out.println("종료합니다...");
				System.exit(0);
			}
			
            
			StringTokenizer st = new StringTokenizer(str, " ");
            
			int total = st.countTokens();
            
			System.out.println("어절 개수는 " + total);
		}
	}
}

 

 

7. (2) String 클래스의 split( ) 메소드를 이용하여 작성하라.

 

import java.util.Scanner;

public class GameApp {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		while (true) {
			String str = scanner.nextLine();
			
			if (str.equals("그만")) {
				System.out.println("종료합니다...");
				System.exit(0);
			}
			
            
			String [] total = str.split(" ");
			
			System.out.println("어절 개수는 " + total.length);
		}
	}
}

8. 문자열을 입력받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.

 

import java.util.Scanner;

public class GameApp {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		while(true) {
			System.out.println("문자열을 입력하세요. 빈칸이 있어도 되고 영어 한글 모두 됩니다.");
			String str = scanner.nextLine();
			
            
			for (int i = 0; i < str.length(); i++) {
				System.out.print(str.substring(i+1));
				System.out.println(str.substring(0, i+1));
			}
		}
	}
}

9. 철수와 컴퓨터의 가위바위보 게임을 만들어보자.

9. 가위, 바위, 보는 각각 1, 2, 3 키이다.

9. 철수가 키를 입력하면, 동시에 프로그램도 Math.Random( )을 이용하여 1, 2, 3 중에 한 수를 발생시키고

9. 이것을 컴퓨터가 낸 것으로 한다.

9. 그런 다음 철수와 컴퓨터 중 누가 이겼는지 판별하여 승자를 출력하라.

 

import java.util.Scanner;

public class GameApp {
	
	private Scanner scanner;
	
    
	GameApp() {
		scanner = new Scanner(System.in);
	}
	
    
	void finish() { // 끝내기
		System.exit(0);
	}
	
    
	void run() {	
		while(true) {
			System.out.print("철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>");
			int num = scanner.nextInt();
			int computer = (int)(Math.random() * 3 + 1);
            
			switch (num) {
				case 1:
					if(computer == 1)
						System.out.println("철수(가위) : 컴퓨터(가위)\n비겼습니다.");
					else if(computer == 2)
						System.out.println("철수(가위) : 컴퓨터(바위)\n컴퓨터가 이겼습니다.");
					else if(computer == 3)
						System.out.println("철수(가위) : 컴퓨터(보)\n철수가 이겼습니다.");
					break;
				case 2:
					if(computer == 1)
						System.out.println("철수(바위) : 컴퓨터(가위)\n철수가 이겼습니다.");
					else if(computer == 2)
						System.out.println("철수(바위) : 컴퓨터(바위)\n비겼습니다.");
					else if(computer == 3)
						System.out.println("철수(바위) : 컴퓨터(보)\n컴퓨터가 이겼습니다.");
					break;
				case 3:
					if(computer == 1)
						System.out.println("철수(보) : 컴퓨터(가위)\n컴퓨터가 이겼습니다.");
					else if(computer == 2)
						System.out.println("철수(보) : 컴퓨터(바위)\n철수가 이겼습니다.");
					else if(computer == 3)
						System.out.println("철수(보) : 컴퓨터(보)\n비겼습니다.");
					break;
				case 4:
					finish();
					break;
			}
		}
	}
	
    
	public static void main(String[] args) {
    
		GameApp gameApp = new GameApp();
		gameApp.run();
		
		scanner.close();
	}
}

10. 갬블링 게임을 만들어보자.

 

10. 두 사람이 게임을 진행한다.

10. 이들의 이름을 키보드로 입력받으며 각 사람은 Person 클래스로 작성하라.

10. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다.

 

10. 두 사람은 번갈아 가면서 게임을 진행하는데

10. 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다.

 

10. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.

 

import java.util.Scanner;

public class Person {
	private String name;
	private int num [];
	private int size;
	
    
	Person() {
		this.name = name;
		size = 3;
		num = new int [size];
	}
	
    
	public void putName (String name) {
    
		this.name = name;
	}
	
    
	public String getName() {
    
		return this.name;
	}
	
    
	public void randomNum() {
    
		for (int i = 0; i < size; i++)
			num[i] = (int)(Math.random() * 3 + 1);
	}
	
    
	public void show() {
    
		System.out.print("\t");
		for (int i = 0; i < size; i++)
			System.out.print(num[i] + "  ");
	}
	
    
	public boolean result() {
    
		for (int i = 0; i < size - 1; i++) {
			if (num[i] != num[i + 1])
				return false;
		}
        
		return true;
	}
}



public class GameApp {
	
	private Scanner scanner;
	private Person p1;
	private Person p2;
	
    
	GameApp() {
    
		scanner = new Scanner(System.in);
		p1 = new Person();
		p2 = new Person();
	}
	
    
	void finish() {
    
		System.exit(0);
	}
	
    
	void run() {	

		System.out.print("1번째 선수 이름>>");
		String name = scanner.nextLine();
		p1.putName(name);
        
		System.out.print("2번째 선수 이름>>");
		name = scanner.nextLine();
		p2.putName(name);
		
        
		while (true) {
			System.out.print("[" + p1.getName() + "]:<Enter>");
			String enter = scanner.nextLine();           
            
			p1.randomNum();
            
			p1.show();
            
			if (p1.result()) {
				System.out.println(p1.getName() + "님이 이겼습니다.");
				finish();
			}
			else
				System.out.println("아쉽군요!");
			
            
			System.out.print("[" + p2.getName() + "]:<Enter>");
			enter = scanner.nextLine();
            
			p2.randomNum();
            
			p2.show();
            
			if (p2.result()) {
				System.out.println(p2.getName() + "님이 이겼습니다.");
				finish();
			}
			else
				System.out.println("아쉽군요!");	
		}
	}
	
    
	public static void main(String[] args) {
    
		GameApp gameApp = new GameApp();
		gameApp.run();
	}
}

11. StringBuffer 클래스를 활용하여 명령처럼 문자열을 수정하라.

 

11. 아래 실행 예시에서 love!LOVE는 love를 찾아 LOVE로 수정하라는 명령이다.

11. 첫 번재 만난 문자열만 수정한다.

 

import java.lang.StringBuffer;
import java.util.Scanner;

public class GameApp {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		System.out.print(">>");
		String str = scanner.nextLine();
        
        
		while (true) {
			System.out.print("명령: ");
			String order = scanner.next();
			
            
			if (order.equals("그만")) {
				System.out.println("종료합니다");
				System.exit(0);
			}
			
            
			if (order.charAt(0) == '!' || order.charAt(order.length() - 1) == '!' || !order.contains("!")) {
				System.out.println("잘못된 명령입니다!");
				continue;
			}
			
            
			String orderIndex [] = order.split("!");
			String strChange = str.replace(orderIndex[0], orderIndex[1]);
			
            
			if (str == strChange) {
				System.out.println("찾을 수 없습니다!");
				continue;
			}
			else {
				System.out.println(strChange);
				str = strChange;
			}
		}
	}
}

12. 문제 10의 갬블링 게임을 n명이 하도록 수정하라.

12. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라.

 

import java.util.Scanner;

public class Person {

	private String name;
	private int num [];
	private int size;
	
    
	Person() {
    
		this.name = name;
		size = 3;
		num = new int [size];
	}
	
    
	public void putName (String name) {
    
		this.name = name;
	}
	
    
	public String getName() {
    
		return this.name;
	}
	
    
	public void randomNum() {
    
		for (int i = 0; i < size; i++)
			num[i] = (int)(Math.random() * 3 + 1);
	}
    
	
	public void show() {
    
		System.out.print("\t");
		for (int i = 0; i < size; i++)
			System.out.print(num[i] + "  ");
	}
    
	
	public boolean result() {
    
		for (int i = 0; i < size - 1; i++) {
			if (num[i] != num[i + 1])
				return false;
		}
        
		return true;
	}
}



public class GameApp {
	
	private Scanner scanner;
	private Person p [];
	private int n;
	
    
	GameApp() {
    
		scanner = new Scanner(System.in);
	}
	
    
	void finish() {
    
		System.exit(0);
	}
	
    
	void run() {	
    
		System.out.print("겜블링 게임에 참여할 선수 숫자>>");
		this.n = scanner.nextInt();
        
		p = new Person [n];
        
		for (int i = 0; i < this.n; i++) {
			System.out.print((i + 1) + "번째 선수 이름>>");
			String name = scanner.next();
            
			p[i] = new Person();
			p[i].putName(name);
            
			String enter = scanner.nextLine();
		}
		
        
		while (true) {
			for (int i = 0; i < n; i++) {
				System.out.print("[" + p[i].getName() + "]:<Enter>");
				String enter = scanner.nextLine();
                
				p[i].randomNum();
				p[i].show();
                
                
				if (p[i].result()) {
					System.out.println(p[i].getName() + "님이 이겼습니다.");
					finish();
				}
				else
					System.out.println("아쉽군요!");
			}
		}
	}
	
    
	public static void main(String[] args) {
    
		GameApp gameApp = new GameApp();
		gameApp.run();
	}
}