[JAVA] 구조체 배열 가변 길이 추가 - 국영수 성적 입출력 프로그램

2021. 11. 24. 23:08· 프로그래밍언어/JAVA
//시험성적프로그램 국영수 성적 자료형
package ex03;

//1. 데이터 구조 정의
public class Exam {
	//2. 선언(참조형 : 기본형외 / 값형식 : 기본자료형)
	int kor;
	int eng;
	int math;
}
//시험성적자료형배열, 현재길이
package ex03;

public class ExamList {
	Exam[] exams;
	int current;
}
//3명 이상의 국영수 성적 입출력 프로그램
package ex03;

import java.util.Scanner;

public class ListProgram {

	public static void main(String[] args) {
		
		ExamList list = new ExamList();
		list.exams = new Exam[3];
		list.current = 0;
		
		
		int menu;
		boolean keepLoop = true;
		
		while(keepLoop)
		{
			menu = inputMenu();
			
			switch(menu)
			{
			case 1:
				inputList(list);
				break;
			case 2:
				printList(list);				
				break;
			case 3:
				System.out.println("Bye~~");
				
				keepLoop = false;
				break;
				
			default:
				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
			}
		}

	}//main()

	private static void printList(ExamList list) {
		System.out.println("┌────────────────────────┐");
		System.out.println(" │        성적출력         │");
		System.out.println("└────────────────────────┘");
		System.out.println();
		
		int count = list.current;
		Exam[] exams = list.exams;
		
		for(int i=0; i<count; i++) {
			Exam exam = exams[i];
			int kor = exam.kor;
			int eng = exam.eng;
			int math = exam.math;
			int total = kor + eng + math;
			float avg = total/3.0f;
			
			System.out.printf("%d번 학생\n",i+1); 
			System.out.printf("\t국어 : %3d\n", kor);
			System.out.printf("\t영어 : %3d\n", eng);
			System.out.printf("\t수학 : %3d\n", math);
			System.out.println("-----------------------");	
			System.out.printf("\t총점 : %3d\n",total);
			System.out.printf("\t평균 : %6.2f\n",avg);
			System.out.println("────────────────────────");
		}
	}//printList

	private static void inputList(ExamList list) {
		Scanner scan = new Scanner(System.in);
		
		System.out.println("┌────────────────────────┐");
		System.out.println(" │         성적입력        │");
		System.out.println("└────────────────────────┘");
		System.out.println();
		
			
			int kor, eng, math;
			
			System.out.printf("%d번 학생\n",list.current+1); 
			
			do {
				System.out.printf("국어 : ");
				kor = scan.nextInt();
				
				if(kor<0 || 100<kor)
					System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
			} while(kor<0 || 100<kor);
			do {
				System.out.printf("영어 : ");
				eng = scan.nextInt();
				
				if(eng<0 || 100<eng)
					System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
			} while(eng<0 || 100<eng);
			do {
				System.out.printf("수학 : ");
				math = scan.nextInt();
				
				if(math<0 || 100<math)
					System.out.println("입력오류 : 성적유효범위에 맞게 입력하세요.");
			} while(math<0 || 100<math);
			
			Exam exam = new Exam();
			exam.kor = kor;
			exam.eng = eng;
			exam.math = math;
			
			Exam[] exams = list.exams;
			int count = list.current;
			
			if(list.exams.length == list.current) { //list.exams 배열의 길이가 현재 list.current와 같다. 즉 exams의 공간이 없다면.
				// 1. 크기가 5개 정도 더 큰 새로운 배열을 생성하시오. 
				Exam[] temp = new Exam[list.exams.length + 5]; //8개. 다쓰면 또 +5개
				// 2. 값을 이주시키기
				for(int i=0; i<count; i++)
					temp[i]=exams[i];
				// 3. list.exams가 새로만든 temp 배열을 참조 할 수 있도록 한다.
				list.exams = temp;
			}
	
			
			list.exams[list.current] = exam;
			list.current++;
			System.out.println("────────────────────");
		
		
	}//inputList()

	static int inputMenu() {
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("┌──────────────────┐");
		System.out.println("│     메인 메뉴     │");
		System.out.println("└──────────────────┘");
		System.out.println("\t1. 성적입력 ");
		System.out.println("\t2. 성적출력 ");
		System.out.println("\t3. 종료 ");
		System.out.println("\t선택> ");
		int menu = scan.nextInt();
		
		return menu;
		
	}//inputMenu()

}

 

 

Exam[] exams = list.exams;
int count = list.current;

if(list.exams.length == list.current) { //list.exams 배열의 길이가 현재 list.current와 같다. 즉 exams의 공간이 없다면.
// 1. 크기가 5개 정도 더 큰 새로운 배열을 생성하시오. 
Exam[] temp = new Exam[list.exams.length + 5]; //현재크기만큼 다 사용했다면 추가로 5개 생성된다.
// 2. 값을 이주시키기
for(int i=0; i<count; i++)
temp[i]=exams[i];
// 3. list.exams가 새로만든 temp 배열을 참조 할 수 있도록 한다.
list.exams = temp;
}

 

 

최소한의 배열의 크기를 3으로 만들어 준 후 추가적으로 더 필요한 5개의 크기는 if문을 통해 만들어 줬다.

배열의 길이가 현재사용한 길이와 같으면 더이상의 공간이 없다는 뜻이다.

그럼 그 때 더 필요한 크기만큼 더해서 새로운 배열을 생성해준다.

현재까지 받은 값을 새로운 배열로 옮겨준다.

기존에 배열이 새로만든 배열을 참조 할 수 있도록 한다.

 

배열의 크기만큼 다 사용하고 나면 배열의 크기를 5개 늘려줘서 계속적으로 학생성적을 입력 할 수 있게 됐다.

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] 캡슐화 - 국영수 성적 입출력 프로그램  (0) 2021.11.28
[JAVA] 함수 Overloading - 국영수 성적 입출력 프로그램  (0) 2021.11.25
[JAVA] 구조적인 프로그래밍  (0) 2021.11.24
[JAVA] 자바의 입출력  (0) 2021.11.21
[JAVA] 자바의 연산자와 제어문  (0) 2021.11.21
'프로그래밍언어/JAVA' 카테고리의 다른 글
  • [JAVA] 캡슐화 - 국영수 성적 입출력 프로그램
  • [JAVA] 함수 Overloading - 국영수 성적 입출력 프로그램
  • [JAVA] 구조적인 프로그래밍
  • [JAVA] 자바의 입출력
개발원슝이
개발원슝이
꾸준히 개발공부를 합니다.
개발원슝이
꾸준히 개발슝이
개발원슝이
전체
오늘
어제
  • ALL (242)
    • 프로젝트 (34)
      • clone coding (19)
      • mini project (5)
      • Team project(with KIC) (10)
    • 문제 (37)
      • 백준 (7)
      • 프로그래머스 (14)
      • 정보처리기사실기 (16)
    • 설치 (9)
    • 개발 기초 (13)
    • 프로그래밍언어 (124)
      • HTML (16)
      • CSS (17)
      • JavaScript (22)
      • JAVA (13)
      • JSP (10)
      • Python (22)
      • C언어 (24)
    • 프레임워크 (6)
      • Spring (3)
      • Django (3)
    • DB (2)
      • MySQL (2)
    • AWS (1)
    • 오류 (2)
    • 이것저것 (6)
    • 전공자 개발 (3)
    • 비전공자 개발 (5)

블로그 메뉴

  • 네이버블로그(강의노트)
  • GitHub
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 점프 투 파이썬
  • javascript
  • 따배씨
  • 인프런
  • 코딩테스트
  • 백준
  • 생활코딩
  • 홍정모의 따라하며 배우는 C언어
  • 파이썬공부
  • 홍정모교수님

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
개발원슝이
[JAVA] 구조체 배열 가변 길이 추가 - 국영수 성적 입출력 프로그램
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.