반응형

문제

문제 13을 확장하여 다음 명령을 추가하라.

 

명령 사용 예시

>>rename phone txt p.txt //phone.txt를 p.txt로 변경. 파일과 디렉터리 이름 변경
>>mkdir xxx // 현재 디렉터리 밑에 xxx 디렉터리 생성

 

소스 코드 ( 실습문제 13번 디렉터리 이동 부분 NullPointerException 오류도 수정 하였습니다. )

import java.io.*;
import java.util.*;

public class Main13 {
	public static void ListFile(File f) {
		File[]subFiles = f.listFiles();
		for(int i = 0;i<subFiles.length;i++) {
			File file = subFiles[i];
			
			// 파일 종류
			if(file.isDirectory())
				System.out.print("dir\t");
			else if(file.isFile())
				System.out.print("file\t");
			
			System.out.printf(file.length()+"바이트"); // 파일 크기
			System.out.println("   \t"+file.getName()); // 파일이름
		}
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File f = new File("C:\\");
		Scanner s = new Scanner(System.in);
		System.out.println("***** 파일 탐색기입니다. *****");
		System.out.println("\t["+f.getPath()+"]");
		ListFile(f);
		while(true) {
			
			System.out.print(">>");
			String search = s.next();
			if(search.equals("그만")) {
				break;
			}
			else if(search.equals("..")) {
				File temp = new File(f.getParent());
				f = temp;
			}
			else if(search.equals("rename")) {
				String Changename = s.nextLine();
				try {
					StringTokenizer st = new StringTokenizer(Changename," ");
					while(st.hasMoreTokens())
					{
						File temp = new File(f.getPath()+"\\"+st.nextToken());
						File renameFile = new File(f.getPath()+"\\"+st.nextToken());
						temp.renameTo(renameFile);
					}
				}catch(NoSuchElementException e) {
					System.out.println("두 개의 파일명이 주어지지 않았습니다.!");
					continue;
				}
			}
			
			else if(search.equals("mkdir")) {
				String name = s.nextLine();
				File fout = new File(f.getPath()+"\\"+name);
				if(!fout.exists()) {
					System.out.println(fout.getName()+ " 디렉터리를 생성하였습니다.");
					fout.mkdir();
				}
				else {
					System.out.println("이미 존재하는 파일입니다.");
					continue;
				}
				
			}
			else {
					File temp = new File(f.getPath()+"\\"+search);	
					f = temp;		
			}
			try {
				System.out.println("\t["+f.getPath()+"]");
				ListFile(f);
			}catch(NullPointerException e) {
				System.out.println("없는 파일입니다.");
				continue;
			}
		}
		s.close();
	}
}
반응형
반응형

문제

간단한 파일 탐색기를 만들어보자. 처음 시작은 C:\에서부터 시작한다. 명령은 크게 2가지로서 ".."를 입력하면 부모 디렉터리로 이동하고, "디렉터리명"을 입력하면 서브 디렉터리로 이동하여 파일리스트를 보여준다.

(출력예시는 너무 길어 생략하겠습니다.)

 

소스 코드

import java.io.*;
import java.util.*;

public class Main13 {
	public static void ListFile(File f) {
		File[]subFiles = f.listFiles();
		for(int i = 0;i<subFiles.length;i++) {
			File file = subFiles[i];
			
			// 파일 종류
			if(file.isDirectory())
				System.out.print("dir\t");
			else if(file.isFile())
				System.out.print("file\t");
			
			System.out.printf(file.length()+"바이트"); // 파일 크기
			System.out.println("   \t"+file.getName()); // 파일이름
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File f = new File("C:\\");
		Scanner s = new Scanner(System.in);
		System.out.println("***** 파일 탐색기입니다. *****");

		while(true) {
			System.out.println("\t["+f.getPath()+"]");
			ListFile(f);
			System.out.print(">>");
			String search = s.nextLine();
			if(search.equals("그만")) {
				break;
			}
			else if(search.equals("..")) {
				File temp = new File(f.getParent());
				f = temp;
			}
			else {
				File temp = new File(f.getPath()+"\\"+search);	
				f = temp;
			}
		}
		s.close();
	}
}
반응형
반응형

문제

텍스트 파일에 있는 단어를 검색하는 프로그램을 작성해보자. 실행 예시는 프로젝트 폴더 밑에 자신이 작성한 자바 파일( 예 : test.java )을 복사하여 두고 읽은 경우이다.

 

출력 예시

전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.
대상 파일명 입력>> test.java
검색할 단어나 문장>> void
4: public static void main(String[] args) {
검색할 단어나 문장>> int
9: System.out.println("전체 경로명이 아닌 파일 이름만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다."); 11: System.out.print("첫 번째 파일 이름을 입력하세요>>");
14: System.out.print("두 번째 파일 이름을 입력하세요>>");
17: System.out.print(src + "와 " + dst + "를 비교합니다.");
22: System.out.println("파일이 같습니다.");
24: System.out.println("파일이 다릅니다.");
29: System.out.println("입출력 오류가 발생했습니다.);
39: int srcCount=0, destCount;
49: for (int i=0; i<srcCount;i++) {
검색할 단어나 문장>> for
49: for (int i=0; i<srcCount;i++) {
검색할 단어나 문장>> 그만
프로그램을 종료합니다.

 

소스 코드

import java.io.*;
import java.util.*;
public class Main12 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FileReader fin = null;
		BufferedReader bf = null;
		System.out.println("전체 경로명이 아닌 파일 이르만 입력하는 경우, 파일은 프로젝트 폴더에 있어야 합니다.");
		System.out.print("대상 파일명 입력>> ");
		Scanner s = new Scanner(System.in);
		String file = s.nextLine();
		Vector<String> v = new Vector<String>();
		try {
			fin = new FileReader(file);
			bf = new BufferedReader(fin);
			String Line = "";
			while((Line = bf.readLine()) != null) {
				v.add(Line);
			}
			fin.close();
			bf.close();
		}catch(IOException e) {
			System.out.println("입출력 오류");
			return;
		}
		while(true) {
			System.out.print("검색할 단어나 문장>> ");
			String word = s.nextLine();
			if(word.equals("그만")) {
				System.out.println("프로그램을 종료합니다.");
				break;
			}
			for(int i =0;i<v.size();i++)
			{
				if(v.get(i).contains(word)) {
					System.out.printf("%3d:",i);
					System.out.println(v.get(i));
				}			
			}
		}
        s.close();
	}

}

 

 

반응형
반응형

문제

words.txt 파일(출판사 홈페이지에 자료로 제공. 현재 이 문제의 정답 프로젝트에도 있음)에 한 라인에 하나의 영어 단어가 들어 있다. 이 파일을 한 라인씩 읽어 Vector<String>에 라인별로 삽입하여 저장하고, 영어 단어를 입력받아 그 단어로 시작하는 모든 단어를 벡터에서 찾아 출력하는 프로그램을 작성하라.

 

출력 예시

프로젝트 폴더 밑의 words.txt 파일을 읽었습니다.
단어>>lov
lov
lovebird
lovelorn
단어>>kitt
kitten
kittenish
kittle
kitty
단어>>ajlfasf
발견할 수 없음
단어>>그만
종료합니다...

 

소스 코드

(저는 따로 파일을 만들어 txt파일을 관리하기 때문에 경로를 설정해주지만 작업하는 파일 내에 작업하시면 따로 경로없이 txt파일만 쓰시면 됩니다. ex - FileReader("words.txt"); )

import java.io.*;
import java.util.*;
public class Main11 {
	public static void main(String[] args) {
		FileReader fin = null;
		BufferedReader bf = null;
		Vector<String> v = new Vector<String>();
		Scanner s = new Scanner(System.in);
		
		try {
		fin = new FileReader("파일 경로\\words.txt");
		bf = new BufferedReader(fin);
		String Line = " ";
		System.out.println("프로젝트 폴더 밑의 words.txt 파일을 읽었습니다...");
		while((Line = bf.readLine())!=null) {
			v.add(Line);
		}
		bf.close();
		fin.close();
		}catch(IOException e) {
			System.out.println("입출력 오류");
		}
		while(true) {
			int count = 0;
			System.out.print("단어>>");
			String word = s.next();
			if(word.equals("그만")){
            	System.out.println("종료합니다...");
				break;
			}
            for(int i = 0;i<v.size();i++)
			{
				if(word.length() <= v.get(i).length()){
					if(v.get(i).substring(0, word.length()).equals(word)) {
						System.out.println(v.get(i));
						count++;
					}
				}
			}
			if(count == 0)
				System.out.println("발견할 수 없음");
				
		}
		
		s.close();
	}
}

words.txt
0.22MB

생능 출판사 홈페이지의 words.txt파일입니다.

 

보조자료에 파일 다운 받으시면 실습문제 홀수 답지 있습니다.

https://www.booksr.co.kr/html/book/book.asp?seq=697068

 

명품 JAVA Programming(개정4판)

명품 자바를 사랑해주시는 많은 교수님들과 독자들께 감사드립니다. 2017년 7월에 개정3판이 나오고, 두 달도 지나지 않아 Java 9가 출시되었습니다. 그리고 급기야 올해 3월에는 Java 10이 출시되었

www.booksr.co.kr

 

반응형
반응형

문제

전화번호를 미리 C:\temp\phone.txt 파일에 여러 개 저장해둔다. 이 파일을 읽어 다음 실행 예시와 같은 작동하는 검색 프로그램을 작성하라.

 

출력 예시

총 7개의 전화번호를 읽었습니다.
이름>> 최박사
010-2222-3333
이름>> 백점만
011-1100-1100
이름>> 이상아
찾는 이름이 없습니다.
이름>> 이상형
010-3333-4444
이름 >> 그만

 

소스 코드

import java.io.*;
import java.util.*;

public class Main10 {
	public static void main(String[] args) {
		
		FileReader fin = null;
		BufferedReader bf = null;
		String Line = "";
		Scanner s = new Scanner(System.in);
		HashMap <String,String> HM = new HashMap<String,String>();
		try {
			fin = new FileReader("파일 경로\\phone.txt");
			bf = new BufferedReader(fin);
			while((Line = bf.readLine() )!= null) {
				String[] temp = Line.split(" ");
				HM.put(temp[0],temp[1]);
			}
			fin.close();
			bf.close();
		}catch(IOException e)
		{
			System.out.println("입출력 오류");
		}
		System.out.println("총 "+HM.size()+"개의 전화번호를 읽었습니다.");
		while(true) {
			System.out.print("이름>> ");
			String name = s.nextLine();
			if(name.equals("그만"))
				break;
			System.out.println(HM.get(name));
		}
		s.close();
	}

}

phone.txt
0.00MB

반응형
반응형

문제

명령을 실행하는 소프트웨어를 작성하라. 명령은 다음과 같이 mov, add, sub, jn0, prt로 구성되면 move sum 0는 sum 변수에 0을 삽입하고, add sum i는 sum 변수에 i 값을 더하면 sub n 1은 n 변수의 값을 1 감소시키고, jn0 n 3은 변수 n의 값이 0이 아니면 3 번째 명령(실제 4번째 줄)으로 돌아가도록 처리하고, prt sum 0은 sum 변수의 값을 출력하고 프로그램을 종료한다. prt에서 마지막 0은 특별한 의미가 없다. go는 지금까지 입력한 프로그램을 처음부터 실행하도록 하는 지시어이다.
참고로, 실행 예시에서 첫 번재 프로그램은 5에서 15까지 더하는 프로그램이다.

 

예시 답안

수퍼컴이 작동합니다. 프로그램을 입력해주세요. GO를 입력하면 작동합니다.
>> mov sum 0
>> mov i 5
>> mov n 10
>> add sum i
>> add i 1
>> sub n 1
>> jn0 n 3
>> prt sum 0
>> go
[ptr sum 0]
I:15 SUM:95 N:0
출력할 결과는 95. 프로그램 실행 끝
>> mov n 100
>> mov m 20
>> add n m
>> sub n 5
>> prt n 0
>> go
[prt n 0]
M:20 N:115
출력할 결과는 115. 프로그램 실행 끝
>>

 

소스 코드

(한번만 실행되게 만들었습니다.)

import java.util.*;

class ControlProgram{
	ArrayList<String> excution = new ArrayList<String>();
	ArrayList<String> temp = new ArrayList<String>();
	HashMap<String,Integer> var = new HashMap<String,Integer>();
	ArrayList<String> num = new ArrayList<String>();
	
	String [] alpha= {"a","b","c","d","e","f","g",
			"h","i","j","k","l","n","m","o",
			"p","q","r","s","t","u","v","w","x","y","z"};
	
	public ControlProgram() {
		Scanner s = new Scanner(System.in);
		System.out.println("수퍼컴이 작동합니다. 프로그램을 입력해주세요. GO를 입력하면 작동합니다.");
		
		while(true) {
			System.out.print(">> ");
			String temp1 = s.next();
			if(temp1.equals("go"))
				break;
			String temp2 = s.next();
			String temp3 = s.next();
			s.nextLine();
			excution.add(temp1);
			temp.add(temp2);
			num.add(temp3);
		}
		run();
		
		s.close();
	}
	private boolean Compare(String s) {
		for(int i = 0;i<alpha.length;i++)
		{
			if(s.contains(alpha[i]))
				return true;
		}
		return false;
	}
	
	private void run() {
		int count = 0;
		while(true) {
			switch(excution.get(count)) {
			case "mov":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.put(temp.get(count),var.get(num.get(count)));
				else // 알파벳이 아니라 정수형이면
					var.put(temp.get(count), Integer.parseInt(num.get(count)));
				count++;
				break;
			case "add":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.replace(temp.get(count), var.get(temp.get(count))+var.get(num.get(count)));
				else
					var.replace(temp.get(count), var.get(temp.get(count))+Integer.parseInt(num.get(count)));
				count++;
				break;
			case "sub":
				if(Compare(num.get(count))) // 알파벳 포함 여부 
					var.replace(temp.get(count), var.get(temp.get(count))-var.get(num.get(count)));
				else
					var.replace(temp.get(count), var.get(temp.get(count))-Integer.parseInt(num.get(count)));
				count++;
				break;
			case "jn0":
				int k;
				if(Compare(num.get(count)))
					k = var.get(num.get(count));
				else
					k = Integer.parseInt(num.get(count));
				if(var.get(temp.get(count)) != 0)
					count = k;
				else
					count++;
				break;
			case "prt":
				if(Compare(num.get(count)))
					System.out.println("[ptr "+ temp.get(count) +" "+ var.get(num.get(count)) +"]");
				else
					System.out.println("[ptr "+ temp.get(count) + " " + num.get(count) + "]");
				Set<String> keys = var.keySet();
				Iterator<String> it = keys.iterator();
				for(int i =0;i<var.size();i++)
				{
					String t = it.next();
					System.out.print(t.toUpperCase()+":"+var.get(t)+" ");
				}
				System.out.println();
				System.out.println("출력할 결과는 "+ var.get(temp.get(count))+". 프로그램 실행 끝");
				return;
			}
		}
	}
}

public class Main13 {
	public static void main(String[] args){
		new ControlProgram();
	}
}
반응형
반응형

문제

JLabel 컴포넌트는 Mouse 이벤트를 받을 수 있다. JLabel 컴포넌트에 마우스를 올리면 "LOVE JAVA"가, 내리면 "사랑해"가 출력되도록 스윙 응용프로그램을 작성하라.

 

소스 코드

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Main1 extends JFrame{
	Main1(){
		setTitle("마우스 올리기 내리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout());
		
		JLabel label = new JLabel("사랑해");
		
		label.addMouseListener(new MouseAdapter() {
			public void mouseEntered(MouseEvent e) {
				label.setText("Love Java");
			}
			public void mouseExited(MouseEvent e) {
				label.setText("사랑해");
			}
		});
		
		c.add(label);
				
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new Main1();
	}

}

기본 화면 입니다.
마우스 올린 상태에서 윈도우 캡처한 화면입니다.

 

반응형
반응형

문제

다음과 같은 GUI 모양을 가진 스윙 프레임을 작성하라. Open Challenge의 힌트나 정답을 참고하라. 10개의 '*' 문자는 10개의 JLabel을 이용하여 랜덤한 위치에 출력하라.

 

소스코드

import javax.swing.*;
import java.awt.*;

public class Main8 extends JFrame{
	public Main8() {
		setTitle("여러 개의 패널을 가진 프레임");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.setLayout(new BorderLayout());
		
		c.add(new NorthPanel(),BorderLayout.NORTH);
		c.add(new CenterPanel(),BorderLayout.CENTER);
		c.add(new SouthPanel(),BorderLayout.SOUTH);
		
		setSize(300,300);
		setVisible(true);
	}
	class NorthPanel extends Panel {
		public NorthPanel(){
		setBackground(Color.gray);
		JButton btn[] = new JButton[3];
		btn[0] = new JButton("열기");
		btn[1] = new JButton("닫기");
		btn[2] = new JButton("나가기");
		for(int i =0;i<3;i++)
			add(btn[i]);		
		}
	}
	class CenterPanel extends Panel {
		public CenterPanel() {
			setBackground(Color.white);
			setLayout(null);
			JLabel[] label = new JLabel[10];
			for(int i = 0;i<10;i++) {
				label[i] = new JLabel("*");
				label[i].setForeground(Color.red);
				label[i].setBackground(Color.white);
				int x = (int)(Math.random()*200)+10;
				int y = (int)(Math.random()*200)+10;
				label[i].setLocation(x, y);
				label[i].setSize(10,10);
				label[i].setOpaque(true);
				add(label[i]);
			}
		}
	}
	class SouthPanel extends Panel {
		public SouthPanel() {
			setBackground(Color.yellow);
			JButton btn = new JButton("Word Input");
			TextField tf = new TextField(20);
			add(btn);
			add(tf);
		}
	}
	public static void main(String[] args) {
		new Main8();
	}

}

반응형
반응형

문제

다음과 같은 GUI 모양을 가진 스윙 프레임을 작성하라. Open Challenge의 힌트나 정답을 참고하라. 버튼은 JButton, 텍스트 JLabel, 입력창은 JTextField를 사용하면 된다.

 

소스 코드

import javax.swing.*;
import java.awt.*;
public class Main7 extends JFrame{
	public Main7() {
		setTitle("계산기 프레임");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		JPanel [] p = new JPanel[3];
		for(int i = 0;i<3;i++)
			p[i] = new JPanel();
		JLabel label = new JLabel("수식 입력");
		TextField tf = new TextField(20);
		p[0].setBackground(Color.LIGHT_GRAY);
		p[0].add(label);
		p[0].add(tf);
		
		c.add(p[0],BorderLayout.NORTH);
		
		p[1].setLayout(new GridLayout(4,4));
		JButton [] btn = new JButton[16];
		for(int i = 0;i<10;i++) {
			btn[i] = new JButton(Integer.toString(i));
			p[1].add(btn[i]);
		}
		btn[10] = new JButton("CE");
		btn[11] = new JButton("계산");
		btn[12] = new JButton("+");
		btn[13]	= new JButton("-");
		btn[14] = new JButton("x");
		btn[15] = new JButton("/");
		for(int i = 10;i<16;i++)
		{
			if(i > 11)
				btn[i].setBackground(Color.CYAN);
			p[1].add(btn[i]);
		}
		
		c.add(p[1],BorderLayout.CENTER);
		
		JLabel label2 = new JLabel("계산 결과");
		TextField tf2 = new TextField(20);
		p[2].setBackground(Color.yellow);
		
		p[2].add(label2);
		p[2].add(tf2);
		
		c.add(p[2],BorderLayout.SOUTH);
		
		setSize(300,300);
		setVisible(true);
	}
	public static void main(String[] args) {
		new Main7();
	}

}

반응형
반응형

문제

20개의 10 x 10 크기의 JLabel 컴포넌트가 프레임 내에 (50, 50) 위치에서 (250, 250) 영역에서 랜덤한 위치에 출력되도록 스윙 프로그램을 작성하라. 프레임의 크기를 300 X 300으로 하고, JLabel의 배경색은 모두 파란색으로 하라.

 

소스 코드

import javax.swing.*;
import java.awt.*;

public class Main6 extends JFrame{
	public Main6() {
		setTitle("Random Labels");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.setLayout(null);
		JLabel [] label = new JLabel[20];
		
		for(int i = 0;i<20;i++) {
			label[i] = new JLabel();
			label[i].setBackground(Color.BLUE);
			int x = (int)(Math.random()*200)+50;
			int y = (int)(Math.random()*200)+50;
			label[i].setLocation(x, y);
			label[i].setSize(10,10);
			label[i].setOpaque(true);
			c.add(label[i]);
		}
		setSize(300,300);
		setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new Main6();
	}
}

반응형

+ Recent posts