20240102 나의 첫 블로그.. 오늘부터 시작해 꾸준히 작성해 보려 한다.
첫번째로는 작년에 과제를 하며 해결 했던 몇가지 문제들을 다시 되짚어 보겠다.
#알람
09시에 알람이 울린다고 할 때, 현재 시간을 입력 받고 알람이 울리기까지 남은 시간이나 알람이 울린 후 지난 시간을 출력하는 프로그램을 작성하세요.
java
import java.util.Scanner;
public class week2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("현재 시간을 입력하세요 (HH 형식): ");
int h = sc.nextInt();
if (0 > h || h > 23) {
System.out.printf("잘못된 입력 형식 입니다.");
System.exit(0);
}
System.out.print("현재 분을 입력하세요 (mm 형식): ");
int m = sc.nextInt();
if (0 > m || m >= 60) {
System.out.printf("잘못된 입력 형식입니다.");
System.exit(0);
}
if (0 <= h && h < 9) {
if (0 < m && m < 60) {
h = 9 - (h + 1);
m = 60 - m;
System.out.printf("알림이 울리기까지 %d시간 %d분 남았습니다", h, m);
} else if (m == 0) {
h = 9 - h;
System.out.printf("알림이 울리기까지 %d시간 %d분 남았습니다.", h, m);
}
} else if (9 <= h && h <= 23) {
h = h - 9;
System.out.printf("알림이 울린지 %d시간 %d분 지났습니다.", h, m);
}
}
}
여기서 날짜를 지정할 수 없기에 09시에 알람이 울린다 하였을때, 16시를 입력하면 이것이 알람이 울리기 전인지 후인지 구분이 불가능하기에 이부분은 생략하고 진행하였다.
해당코드는 조금만 생각하면 쉽게 접근이 가능했다. 핵심은 '시'를 9시 이전인 경우와 그이후로 나눠 9시 이후의 시간은 전부 시간이 지난것으로 판단되게 하고, '분'이 0일때와 아닐때를 나눠서 접근하면 쉬운접근이 가능해 진다
#로또번호
import java.util.Scanner;
import java.util.Arrays;
public class week3 {
public static void main(String[] args) {
int arr[] = new int[6];//로또 번호 저장 배열
int my[] = new int[6];//입력받은 번호 저장 배열
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 6; i++) {
arr[i] = (int) (Math.random() * 45 + 1);//로또 번호 생성
}
for (int j = 0; j < 6; j++) {//배열 길이가 6이 될때 까지
System.out.print("로또 번호를 입력하세요 (1부터 45사이의 숫자, 중복 없이) :");//배열 입력 받음
my[j] = sc.nextInt();// 배열 입력 받음
for (int k = 0; k < j; k++) {//입력받은 배열중 중복 배열 검열
if (my[j] == my[k] && j != k) {// 배열을 입력받았을때 자기자신을 제외하고 중복되는 숫자가 있는경우
System.out.println("이미 입력한 번호입니다. 중복없이 입력하세요.");
Arrays.copyOf(my, j);//중복 배열 제외 후 배열 재설정
j--;// j값 줄이고 해당 배열번호에 다시 입력 받기 위함
}
//System.out.printf(Arrays.toString(my)); 배열 잘 들어가는지 확인용 코드
}
}
System.out.printf("로또 당첨 번호 : %s\n",Arrays.toString(my)); //로또번호 출력
System.out.printf("사용자 번호 : %s\n",Arrays.toString(arr)); // 사용자 번호 출력
int num = 0;// 당첨 갯수 확인용 변수
for (int i = 0; i < 6; i++) {
for (int k = 0; k < 6; k++) {
if (my[i] == arr[k]) {// 로또번호와 일치하는 사용자 번호가 있다면
num++;// 갯수 +1
}
}
}
switch (num) {// 갯수에 따른 결과 반환
case 0, 1, 2:
System.out.println("꽝입니다. 일치하는 번호가 2개 이하입니다.");
break;
case 3:
System.out.println("4등니다. 일치하는 번호가 3개입니다.");
break;
case 4:
System.out.println("3등니다. 일치하는 번호가 4개입니다.");
break;
case 5:
System.out.println("2등니다. 일치하는 번호가 5개입니다.");
break;
case 6:
System.out.println("1등니다. 일치하는 번호가 6개입니다.");
break;
}
}
}
로또 번호를 생성하기 위해 math.random을 이용하여 1부터 45까지의 숫자를 받아오게 설정하였다. 그 이후에는 6개(1부터45)의 숫자를 입력받아 해당 번호들이 같은지 비교하면 되는것이다. 여기서 중요한점은 같은지 비교를 할때 자기자신은 제외하고 5개의 숫자를 비교한다는점이다.
#GUI를 이용한 계산기
다음과 같은 GUI 모양을 가진 스윙 프레임을 작성하세요.
버튼은 JButton 사용.
텍스트는 Jlabel 사용.
입력창은 JTextField 사용.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class NorthPanel extends JPanel { //tf1영역
private JTextField text1;
public NorthPanel(JTextField textField) {
text1 = textField;
setLayout(new FlowLayout());
setBackground(Color.LIGHT_GRAY);
add(new JLabel("연산수식"));
add(text1);
}
public JTextField getop() {
return text1;
}
}
class CenterPanel extends JPanel {
private JButton[] label = new JButton[16];
private String[] cal = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "CE", "=", "+", "-", "*", "/"};
private JTextField tf1;
private JTextField tf2;
public CenterPanel(JTextField textField1, JTextField textField2) {
tf1 = textField1;
tf2 = textField2;
setLayout(new GridLayout(4, 4, 5, 5));
for (int i = 0; i < 16; i++) { //버튼 영역의 색 설정
label[i] = new JButton(cal[i]);
label[i].setOpaque(true);
if (i == 10 || i == 11) {
label[i].setForeground(Color.BLACK);
} else if (i >= 12) {
label[i].setBackground(Color.YELLOW);
} else {
label[i].setBackground(Color.GRAY);
}
add(label[i]);
}
for (int i = 0; i < 16; i++) { //버튼에 액션리스너 추가
if (i <= 9 || i >= 12) {
label[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton tempButton = (JButton) e.getSource();
String s1 = tf1.getText();
tf1.setText(s1 + tempButton.getText());
}
});
}
}
// 버튼 처리
label[10].addActionListener(new ActionListener() {// ce버튼 사용시 tf1,tf2의 내용을 지움
public void actionPerformed(ActionEvent e) {
tf1.setText("");
tf2.setText("");
}
}
);
label[11].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String expression = tf1.getText();
int result = 0;
// 연산 수행
try {
// 연산자 추출
char operator = ' ';
for (char c : expression.toCharArray()) {
if (c == '+' || c == '-' || c == '*' || c == '/') {
operator = c;
break;
}
}
// 정수 부분만 추출한 후 해당 값을 통해 연산
String[] operands = expression.split("[\\+\\-\\*\\/]");
int operand1 = Integer.parseInt(operands[0].trim());
int operand2 = Integer.parseInt(operands[1].trim());
// 연산자에 따라 계산 수행
switch (operator) {
case '+':
result = operand1 + operand2;
break;
case '-':
result = operand1 - operand2;
break;
case '*':
result = operand1 * operand2;
break;
case '/':
result = operand1 / operand2;
break;
default:
tf2.setText("Error");
return;
}
// 계산 결과를 tf2에 표시
tf2.setText(String.valueOf(result));
// tf1의 내용을 지움
tf1.setText("");
} catch (Exception ex) {
// 예외 처리: 유효하지 않은 표현식 등
tf2.setText("Error");
}
}
});
}
}
class SouthPanel extends JPanel {
private JTextField tf2;
public SouthPanel(JTextField textField2) { //맨밑의 판
tf2 = textField2;
setLayout(new FlowLayout());
setBackground(Color.BLACK);
JLabel resultLabel = new JLabel("계산결과");
resultLabel.setForeground(Color.WHITE); // 흰색으로 글씨 색상 지정
add(resultLabel);
add(tf2);
}
}
public class week6 extends JFrame {
public week6() {
setTitle("산술 계산기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new BorderLayout());
JTextField tf1 = new JTextField(20);
JTextField tf2 = new JTextField(20);
NorthPanel northPanel = new NorthPanel(tf1);
CenterPanel centerPanel = new CenterPanel(tf1, tf2);
SouthPanel southPanel = new SouthPanel(tf2);
c.add(northPanel, BorderLayout.NORTH);
c.add(centerPanel, BorderLayout.CENTER);
c.add(southPanel, BorderLayout.SOUTH);
setSize(400, 400);
setVisible(true);
}
}
해당문제는 GUI로 표현된 계산기를 만들어야하는것이다. north,center,south,로 나눠서 문제를 해결해야한다. 계산기 기능을 만드는것은 어렵지 않았으나, GUI쪽을 다루려다 보니 어려운 부분들이 많았다.