본문 바로가기

프로그래밍/Java TestProject

Java_2차원 배열을 이용하여 평균과 등급 구하기

<프로젝트 양식>

math, science, korean
{20, 30, 85}
{60, 43, 78}
{86, 75, 99}
{90, 60, 77}
{59, 90, 50}
{50, 100, 85}
   

col(열)은 과목이고
row(행)은 학생이다.
   

각 과목마다 평균.
각 학생마다 평균.
전체 평균.
과목 점수별 등급 매기기 (0~30, 31~60, 61~90, 91~100) DCBA

평균에 대한 등급 매기기 (0~30, 31~60, 61~90, 91~100) 4,3,2,1 등급

 

<전체 코드>

public class personal_arrayAverage_Project_1 {

	public static void main(String[] args) {
		
		int[][] score = { 
				{ 20, 30, 85 }, 
				{ 60, 43, 78 }, 
				{ 86, 75, 99 }, 
				{ 90, 60, 77 }, 
				{ 59, 90, 50 },
				{ 50, 100, 85 } };
		
		int mathTotal = 0, scienceTotal = 0, korTotal = 0;
		float overall_average = 0.0f, student_average = 0.0f;
		float math_average = 0.0f, science_average = 0.0f, kor_average = 0.0f;
		System.out.println("학생\t수학\t과학\t국어\t학생평균");
		System.out.println("----------------------------------------");
		
		int sum = 0;
		for (int i = 0; i < score.length; i++) {
			int student_sum=0;

			mathTotal += score[i][0];
			scienceTotal += score[i][1];
			korTotal += score[i][2];

			System.out.printf("학생%d", (i + 1));

			for (int j = 0; j < score[i].length; j++) {
				student_sum+=score[i][j];
				sum += score[i][j];
				System.out.printf("\t%d", score[i][j]);

				overall_average = (float)sum/ (score.length*score[0].length);
			}

			math_average = (float) mathTotal / score.length;
			science_average = (float) scienceTotal / score.length;
			kor_average = (float) korTotal / score.length;
		
			char grade2 = ' ';

			if (student_average >= 91) {
				grade2 = '1';
			} else if (student_average >= 61) {
				grade2 = '2';
			} else if (student_average >= 31) {
				grade2 = '3';
			} else {
				grade2 = '4';
			}
			
			student_average = (float) student_sum / score[i].length;
			System.out.printf("\t%.2f \t%c%n", student_average, grade2);
		}
		
		float[] score2 = {math_average, science_average, kor_average};
		char[] grade= new char[3];
		
		for (int i = 0; i < score2.length; i++) {
			
			if (score2[i]>= 91 ) {
				grade[i] = 'A';
			} else if (score2[i] >= 61 ) {
				grade[i] = 'B';
			} else if (score2[i] >= 31) {
				grade[i] = 'C';
			} else {
				grade[i] = 'D';
			}
		}
		
		System.out.println("-----------------------------------------");
		
		System.out.printf("과목평균 %.2f %c  %.2f %c  %.2f %c  %.2f%n ",
        	score2[0],grade[0],score2[1],grade[1],score2[2],grade[2],overall_average);
		
	}
}
결과
학생	수학	과학	국어	학생평균
----------------------------------------
학생1	20	30	85	45.00 	4
학생2	60	43	78	60.33 	3
학생3	86	75	99	86.67 	3
학생4	90	60	77	75.67 	2
학생5	59	90	50	66.33 	2
학생6	50	100	85	78.33 	2
-----------------------------------------
과목평균 60.83 C  66.33 B  79.00 B  68.72

   

 

 

<코드 설명> 

		int[][] score = { 
				{ 20, 30, 85 }, 
				{ 60, 43, 78 }, 
				{ 86, 75, 99 }, 
				{ 90, 60, 77 }, 
				{ 59, 90, 50 },
				{ 50, 100, 85 } };
		
		int mathTotal = 0, scienceTotal = 0, korTotal = 0;
		float overall_average = 0.0f, student_average = 0.0f;
		float math_average = 0.0f, science_average = 0.0f, kor_average = 0.0f;
		System.out.println("학생\t수학\t과학\t국어\t학생 평균");
		System.out.println("----------------------------------------");

=>

데이터 타입 int인 score라는 2차원 배열을 선언해서 위와 같이 선언과 동시에 초기화한다. 

 

다음 각 타입에 따라 필요한 변수를 정해 선언을 한다. 

int 타입으로 수학총점, 과학총점, 국어총점을 선언하고,

float타입으로 전체평균, 학생평균, 수학평균, 과학평균, 국어평균을 선언한다. 

 

다음 표 형식으로 정리를 해서 결과를 보여주기 위해 위와 같이 System.out.println()을 한다. 

 

 

		int sum = 0;
		for (int i = 0; i < score.length; i++) {
			int student_sum=0;

			mathTotal += score[i][0];
			scienceTotal += score[i][1];
			korTotal += score[i][2];

			System.out.printf("학생%d", (i + 1));
        }

=>

우선 학생총점으로 전체 평균을 구할 sum을 선언해준다.

다음 반복문을 이용해 i가 0이고 i가 score의 길이보다 작으면 { }안을 수행한다. 

 

{ }안을 보면 student_sum(학생총점)은 나중에 student_average(학생평균)을 구할 때 사용하기 위해 선언했다.  

→ studnet_sum과 sum의 변수명이 비슷하고 둘 다 학생총점을 구하는 역할이라 헷갈려서 처음에 코드를 짤 때 헤맸었다. 

변수명을 정할 때는 어디에 어떻게 쓰일지 생각하고 신중하게 작성해야 헷갈리지 않는다. 


score[i][0]배열에 담긴 점수를 다 더한 값이 mathTotal이 된다. 

→ score[행][열]이니까 열의 index가 0인 20, 60, 86, 90, 59, 50을 다 더한 값이 mathTotal에 저장된다는 뜻이다.

위와 같은 방법으로 scienceTotal과 korTotal에 과목별 총점을 저장한다. 

 

그리고 바깥쪽 for문은 행에 관련된 내용을 적기 때문에 System.out.printf("학생%d", (i+1));을 적는다.

→ i+1을 하는 이유는 index가 0부터 시작하기 때문에 +1을 해주어 학생1부터 학생6까지 출력하게 하였다. 

 

 

			for (int j = 0; j < score[i].length; j++) {
				student_sum+=score[i][j];
				sum += score[i][j];
				System.out.printf("\t%d", score[i][j]);

				overall_average = (float)sum/ (score.length*score[0].length);
			}

=>

안쪽 for문은 열과 관련된 내용을 적는다. 

반복문을 이용해 j가 0이고 j가 score[i].length보다 작으면 

student_sum에 score[i][j]에 있는 모든 점수들을 더하도록 하고 

sum에도 score[i][j]에 있는 모든 점수들을 더하도록 하였다. 

그리고 모든 점수를 표 형식으로 출력하도록 한다. 

 

전체 평균을 구하기 위해 sum을 float로 형변환을 해주고 (score.length*score[0].length)를 나눈 값을 전체 평균에 저장한다. 

(score.length는 6이고 score[0].length는 3이니까 전체 총점에 18을 나누면 전체 평균이 나온다.)

 

 

			math_average = (float) mathTotal / score.length;
			science_average = (float) scienceTotal / score.length;
			kor_average = (float) korTotal / score.length;
			
			char grade = ' ';

			if (student_average >= 91) {
				grade = '1';
			} else if (student_average >= 61) {
				grade = '2';
			} else if (student_average >= 31) {
				grade = '3';
			} else {
				grade = '4';
			}
			
			student_average = (float) student_sum / score[i].length;
			System.out.printf("\t%.2f \t%c%n", student_average, grade);
		}

=> 

수학 평균을 구하기 위해 mathTotal을 float으로 형변환 해주고 score.length로 나누면 수학 평균이 나온다.

같은 식으로 과학평균과 국어평균을 구하면 된다. 

 

다음 학생등급을 담을 char grade를 선언해 위와 같이 if문을 만들어준다.

 

그리고 학생평균을 구하기 위해 student_sum을 float로 형변환 시키고 score[i].length로 나누어주어 학생평균과 학생등급을 출력하면 된다. 

 

 

		float[] score2 = {math_average, science_average, kor_average};
		char[] grade2= new char[3];
		
		for (int i = 0; i < score2.length; i++) {
			
			if (score2[i]>= 91 ) {
				grade2[i] = 'A';
			} else if (score2[i] >= 61 ) {
				grade2[i] = 'B';
			} else if (score2[i] >= 31) {
				grade2[i] = 'C';
			} else {
				grade2[i] = 'D';
			}
		}
		
		System.out.println("-----------------------------------------");
		
		System.out.printf("과목평균 %.2f %c  %.2f %c  %.2f %c  %.2f%n ", score2[0],grade2[0],score2[1],grade2[1],score2[2],grade2[2],
				overall_average);
		
	}
}

=> 

과목별 등급은 학생별 등급과 다르게 조건식에 들어갈 변수가 3개라서 배열로 묶어서 선언을 해주어야 한다. 

그래서 float[] score2 = {math_average, science_average, kor_average} 와 char[] grade2 = new char[3] 을선언해주고 위와같이 if문을 작성한다. 

 

그리고 구분선을 출력하고 System.out.printf로 score2[0], grade2[0] 이런식으로 값을 넣어주면 된다.

 

.

.

.

.

.

.

.

<처음 코드를 썼을 당시> 

코드가 굉장히 더럽고 너저분했습니다. 무작정 코드를 쓸 생각만 하지 않고 구글링해서 다른 사람들은 어떤식으로 작성하고 정리하는지 보기도 하고 직접 설계를 해서 코드를 작성해야 합니다. 

//		float student_avg1 = 0, student_avg2 = 0, student_avg3 = 0, student_avg4 = 0, student_avg5 = 0, student_avg6=0;
//		float subject_avg1 = 0, subject_avg2 = 0, subject_avg3 = 0, overall_avg = 0;
//		float student1=0, student2=0, student3=0, student4=0, student5=0, student6=0;
//		int mathTotal = 0, scienceTotal = 0, KoreanTotal = 0;
//		
//		for (int i = 0; i < score.length; i++) {
//			mathTotal += score[i][0];
//			scienceTotal += score[i][1];
//			KoreanTotal += score[i][2];
//
//			subject_avg1 = mathTotal / (float) score.length;
//			subject_avg2 = scienceTotal / (float) score.length;
//			subject_avg3 = KoreanTotal / (float) score.length;
//			
//
//			for (int j = 0; j < score[i].length; j++) {
//				int sum=0;
//				sum += score[i][j];
//				overall_avg = sum / (float) score.length;
//				
//				student_avg1 += score[0][j];
//				student_avg2 += score[1][j];
//				student_avg3 += score[2][j];
//				student_avg4 += score[3][j];
//				student_avg5 += score[4][j];
//				student_avg6 += score[5][j];
//				
//				student1=student_avg1/(float)score[i].length;
//				student2=student_avg2/(float)score[i].length;
//				student3=student_avg3/(float)score[i].length;
//				student4=student_avg4/(float)score[i].length;
//				student5=student_avg5/(float)score[i].length;
//				
//				char grade=' ';
//				int subject_score=0;
//				
//				if (subject_score >= 91) {
//					grade = 'A';
//				} else if (subject_score >= 61) {
//					grade = 'B';
//				} else if (subject_score >= 31) {
//					grade = 'C';
//				} else {
//					grade = 'D';
//				}
//
//				char grade2 = ' ';
//				int average_grade2 = 0;
//
//				if (average_grade2 >= 91) {
//					grade2 = '1';
//				} else if (average_grade2 >= 61) {
//					grade2 = '2';
//				} else if (average_grade2 >= 31) {
//					grade2 = '3';
//				} else {
//					grade2 = '4';
//				}
//				
//			}
//
//		}
//		System.out.println("수학 평균: " + subject_avg1);
//		System.out.println("과학 평균: " + subject_avg2);
//		System.out.println("국어 평균: " + subject_avg3);
//		System.out.println("전체 평균: " + overall_avg);
//		System.out.println("학생 1 평균: "+student1);
//		System.out.println("학생 2 평균: "+student2);
//		System.out.println("학생 3 평균: "+student3);
//		System.out.println("학생 4 평균: "+student4);
//		System.out.println("학생 5 평균: "+student5);
//		System.out.println("학생 6 평균: "+student6);