비트교육센터/자바

[비트교육센터] 자바 12일차 조건문,반복문,배열

달의요정루나 2023. 6. 16. 18:53

1.  조건문, 반복분

 

1) 조건문

package com.julian5383.train;

public class IfTest {
	public static void main(String[] args) {
		int num=(int)(Math.random()*6)+1;
        //1~6, Math.random(): double 형으로 0.0이상 1.0 미만 사이의 값을 반환하는 함수
		//(int)를 붙여 형변환을 하고 6개의 정수중 하나를 랜덤으로 선택한다.
        //원래는 0~5이지만 맨 뒤에 +1을 붙여 출력하려는 수에 1을 더해준다.
        
		if(num ==1) {
			System.out.println("1번");
		}else if(num==2) {
			System.out.println("2번");
		}else if(num==3) {
			System.out.println("3번");
		}else if(num==4) {
			System.out.println("4번");
		}else if(num==5) {
			System.out.println("5번");
		}else {
			System.out.println("6번");
		}
        // 랜덤으로 선택된 수를 통해 if문이 동작한다.
        
		System.out.println("===============");
		num=(int)(Math.random()*6)+1;
		switch(num) {
			case 1:
				System.out.println("1번");
				break;
			case 2:
				System.out.println("2번");
				break;
			case 3:
				System.out.println("3번");
				break;
			case 4:
				System.out.println("4번");
				break;
			case 5:
				System.out.println("5번");
				break;
			default:
				System.out.println("6번");
		}
        //switch-case를 이용해 1-5번중 출력되는 수로 case문이 동작한다.
        //6일 경우 case에 해당되지 않기 때문에 default에 있는 구문이 출력된다.
        //case마다 break를 넣어 조건에 맞는 코드가 걸렸을때 실행을 중단시킨다.
        
		System.out.println("===============");
		char ch='y';
		
		switch(ch) {
			case 'Y':
			case 'y':
				System.out.println("진행~~");
				break;
			case 'N':
			case 'n':
				System.out.println("중지");
				break;
			default:
				System.out.println("잘못선택");
		}
        //case를 2번 선언할 수 있다. 대문자,소문자 관계없이 처리할 수 있다.
        
		System.out.println("===============");
		char ch1='N';
		
		switch(ch1) {
			case 'Y','y'->System.out.println("진행~~");
			case 'N','n'->System.out.println("중지");
			default->System.out.println("잘못선택");
		}
        //Java12 부터는 switch에 표현식을 사용할 수 있다.
        //break 문을 없애는 대신 화살표와 중관호를 이용할 수 있다.
	}
}

--> 결과

4번
===============
4번
===============
진행~~
===============
중지

2) 반복문(For)

package com.julian5383.train;

public class ForTest {
	public static void main(String[] args) {
		int num = 10;
		++num; // num = num + 1, num += 1
		System.out.println(num);
		num++;
		System.out.println(num);
		int num2 = 20 + ++num; //++num은 피연산자를 1증가 시키고 해당연상을 진행한다.
		System.out.println(num+" - "+num2);
		num2 = 20 + num++;  //num++은 해당 연산을 수행 후, 피연산자 값을 1증가 시킨다.
		System.out.println(num+" - "+num2);
		System.out.println("===============");
		int sum=0;
		for (int i = 1; i <= 100; i++) {
			sum+=i;
		}
		System.out.println(sum);
		System.out.println("===============");
		sum=0;
		int i=1; //for문의 초기화식은 지역변수라서 분리시킬 수 있다.
		for (; i <= 100; i++) {
			sum+=i;
		}
		System.out.println(sum);
		System.out.println("===============");
		i=1;
		int j=1;
		for (; i <= 100; i++,j++) {//i하고 j가 같이상승
			sum+=i;
		}
		System.out.println(sum);//10100
		System.out.println("j = "+j);//j=101
		System.out.println("===============");
		/*for(;;) {
			sum=0; //for문으로 무한루프
		}*/
	}
}

- 초기화식 이후로 for문은 조건식->실행문장->증감식으로 계속 반복된다.

- 그 과정에서 j증감식도 계속 증가한다. 그래서 j가 101이 나오는 것이다.

---

- 마지막 for문에 어떤 설정도 안해주면 for문은 무한루프를 돌게된다.

 

--> 결과

11
12
13 - 33
14 - 33
===============
5050
===============
5050
===============
10100
j = 101
===============

3) 반복문(While)

package com.julian5383.train;

import java.util.Scanner;

public class WhileTest {
	public static void main(String[] args) {
		int i=1;
		int sum=0;
		while(i<=100) {
			sum+=i;
			i++;
		}
		System.out.println(sum);
		//while문으로 1에서 100을 더해준다.
        
		System.out.println("===============");
		
		sum=0;
		i=1;
		
		do {
			sum+=i;
			i++;
		}while(i<=100);
		System.out.println(sum);
		//do~while: while에 있는 조건식이 true이든 false이든 무조건 한번은 실행한다.
        //실행후 조건을 검사해 반복을 결정한다.
        
		System.out.println("===============");
		
		String input;
		Scanner scanner = new Scanner(System.in);
        //Scanner는 기본적인 데이터타입을 모두 입력받을 수 있다.
        //java.util 패키지에 포함되어 java.util을 import 해줘야 사용할 수 있다.
        
		do {
			System.out.print(">");
			input = scanner.nextLine();
            //입력받은 문자열을 input에 저장한다.
            //String을 읽고 개행을 기준으로 읽는다.
			System.out.println("==>"+input);
		}while(!input.equals("q"));
        //만약 q를 입력하면 중지한다.
		scanner.close();
        //Scanner를 닫는다.
		System.out.println("Game Over!!");
	}
}

--> 결과

5050
===============
5050
===============
>ㄹ
==>ㄹ
>ㅇ
==>ㅇ
>q
==>q
Game Over!!

2.  배열

 

1) 배열

package com.julian5383.train;

public class ArrayTest {
	public static void main(String[] args) {
		int[] scores= {80,90,100};
		//scores라는 배열을 선언해 80,90,100에 대한 집합을 선언한다.
        
		System.out.println(scores.length);
        //scores배열의 길이를 출력한다.
        
		System.out.println(scores[0]);
		System.out.println(scores[1]);
		System.out.println(scores[2]);
		//scores 배열의 인덱스 0,1,2의 값이 무엇인지 출력한다.
        
		int sum=0;
		for (int i = 0; i < scores.length; i++) {
			sum+=scores[i];
		}
		System.out.println(sum);
        //scores배열에 있는 값들의 합을 출력한다.
		
		System.out.println("===============");
		
		sum=0;
        //for each구조로로 배열을 선언한 것이다.
		for (int score : scores) {//for(각 요소 값 : 배열이나 컨테이너 값)
			sum+=score;			//반복 수행할 작업
		}
        
		System.out.println(sum);
	}
}

--> 결과

3
80
90
100
270
===============
270

2) 배열, 자바참조

package com.julian5383.train;

public class ArraySample {
	public static void main(String[] args) {
		if(args.length != 2) {//입력한 데이터 개수가 2개가 아닌 경우
			System.out.println("Usage: 클래스명 매개변수1 매개변수2");
            //사용법 출력
			System.exit(0);
            //강제종료
		}
		
		System.out.println("입력한 값: "+args[0]+"와 "+args[1]+"입니다.");
        //입력한 매겨변수 출력
	}
}

- 자바 커맨드 라인 입력이다.

- String[] args를 통해 커맨드라인에서 입력된 데이터의 수(배열의 길이), 입력된 데이터(배열의 항목 값)을 알 수 있다.

- 프로그램을 실행시 2개의 문자열을 주지 않으면 프로그램의 사용법을 출력하고 강제종료하도록 한다.

- 만약 프로그램을 실행시 2개의 문자열이 정확히 입력되면 2개의 문자열을 출력한다.

 

--> 결과

Usage: 클래스명 매개변수1 매개변수2

- 터미널을 실행하고 본인이 작업하는 workspace의 주소로 이동합니다.

- 그리고 해당 주소의 bin폴더 경로까지의 경로를 입력합니다.

- java com.julian5383.train.ArraySample hahaha hohoho

   ==> java     java파일     매개변수1     매개변수2 으로 입력한다. 참고로 자바파일은 패키지 경로도 같이 선언해야 한다.

 

3) 2차원 배열

package com.julian5383.train;

public class MultiArray {
	public static void main(String[] args) {
		int [][] scores= {	{90,85},
							{85,80},
							{77,100}
						};
		//2차원 배열 생성
        
		for (int i = 0; i < scores.length; i++) {//행 길이를 기준으로
			for (int k = 0; k < scores[i].length; k++) {//열 길이를 기준으로
				System.out.print("scores[" + i + "][" + k + "] = " + scores[i][k] + " ");
			}
			System.out.println("");
		}
        //생성한 2차원 배열을 출력한다.
		
		int [][] mathScores = new int[3][];
		int[] row01= {90,85};
		int[] row02= {85,80};
		int[] row03= {77,100};
		
		mathScores[0]=row01;
		mathScores[1]=row02;
		mathScores[2]=row03;
        //mathScores에 대한 2차원 배열을 생성한다.
		
		for (int i = 0; i < scores.length; i++) {
			for (int k = 0; k < scores[i].length; k++) {
				System.out.print("mathscores[" + i + "][" + k + "] = " + scores[i][k] + " ");
			}
			System.out.println("");
		}
        //mathscores배열과 scores배열을 출력한다.
		
		for(int i[]: scores) {
			for(int j:i) {
				System.out.print( j + " ");
			}
			System.out.println();
		}
        //scores 배열을 for-each로 출력한다.
	}
}

--> 결과

scores[0][0] = 90 scores[0][1] = 85 
scores[1][0] = 85 scores[1][1] = 80 
scores[2][0] = 77 scores[2][1] = 100 
mathscores[0][0] = 90 mathscores[0][1] = 85 
mathscores[1][0] = 85 mathscores[1][1] = 80 
mathscores[2][0] = 77 mathscores[2][1] = 100 
90 85 
85 80 
77 100

4) 배열 실습문제

- 2차원 배열을 선언하고 해당 배열에서 0이 있을 경우 0이 있는 열과 행을 값을 이용한다.

- 열에 있는 값들의 평균값과 행에 있는 평균값 중 가장 큰 값을 0을 대신해서 넣어준다.

[1] 내가 푼 답변

package com.julian5383.train;

public class ArrayExam {
	public static void main(String[] args) {
		double[][] findAvgInput = {	{ 5, 4.5, 6.8 }, 
									{ 6, 0, 3.4 }, 
									{ 7, 8.4, 2.3 }
									};
		
		findAverage(findAvgInput);
		
	}
	
	public static void findAverage(double[][] array) {
		int row=-1;
		int col=-1;
		//행인덱스, 열 인덱스 초기화
		
		double sum_row=0.0,avg_row=0.0;//행 전체합, 행평균
		double sum_col=0.0,avg_col=0.0;//열 전체합, 열평균
		
		for (int i = 0; i < array.length; i++) {
			for (int k = 0; k < array[i].length; k++) {
				if (array[i][k]==0) {//만약 0이 존재한다면???
					row=i;
					for (int j = 0; j < array[row].length; j++) {
						sum_row+=array[row][j];
					}
					avg_row=sum_row/(array[i].length);//0이 속한 행 평균 구하기

					col=k;
					for (int j = 0; j < array.length; j++) {
						sum_col+=array[j][col];
					}
					avg_col=sum_col/(array.length);//0이 속한 열 평균 구하기
					
					if(avg_row > avg_col) {
						array[i][k]=avg_row;				
					}
					else {
						array[i][k]=avg_col;
					}//행 평균, 열 평균 중 가장 큰 것을 0이 있는 주소에 넣기
					
					System.out.print(array[i][k]+" ");
					//최종출력
				}else {
					System.out.print(array[i][k]+" ");
					//0이 아예 없으면 그대로 출력
				}			
			}
			System.out.println("");
		}
	}
}

--> 결과

5.0 4.5 6.8 
6.0 4.3 3.4 
7.0 8.4 2.3

[2] 선생님의 답변

package com.julian5383.train;

public class ArrayExam_Answer {
	public static void main(String[] args) {
		double[][] findAvgInput = {	{ 5, 4.5, 6.8 }, 
									{ 6, 0, 3.4 }, 
									{ 7, 8.4, 2.3 }
									};
		
		findAverage(findAvgInput);
		
	}
	
	public static void findAverage(double[][] array) {
		for(int row=0;row<array.length;row++){//행 인덱스
			for (int column = 0; column < array[row].length; column++) {//열 인덱스
				if (array[row][column] == 0) {//만약 0이 존재한다면??
					array[row][column] = Math.max(getRowTotal(array, row) / array[row].length,
							getColumnTotal(array, column) / array.length);
					//행과 열의 평균중 가장 큰값을 0이 있는 인덱스에 입력해준다.
				}
			}
		}
		for (double[] row : array) {
			for (double column : row) {
				System.out.printf("%2.1f  ", column);
			}
			System.out.println();
		}//최종 출력한다.
	}

	public static double getRowTotal(double[][] array, int row) {
		double sum = 0.0;
		for (int column = 0; column < array[row].length; column++) {//열 개수
			sum += array[row][column];
		}
		return sum;
	}//0이 존재하는 행의 합계를 계산한다.

	public static double getColumnTotal(double[][] array, int column) {
		double sum = 0.0;
		for(int row=0;row<array.length;row++){//행 개수
			sum += array[row][column];
		}
		return sum;
	}//0이 존재하는 열의 합계를 계산한다.
}

--> 결과

5.0  4.5  6.8  
6.0  4.3  3.4  
7.0  8.4  2.3

[3] 다른 분의 답변

package com.julian5383.train;

public class ArrayExam_Other {
	public static void main(String[] args) {
		double[][] findAvgInput = {	{ 5, 4.5, 6.8 }, 
									{ 6, 0, 3.4 }, 
									{ 7, 8.4, 2.3 }
									};
		
		findAverage(findAvgInput);
		
	}
	public static void findAverage(double[][] array) {
		double row_sum = 0.0;
		double length_sum = 0.0;
		int length_index = 0;
		int row_index = 0;
		double length_end = 0.0;
		double row_end = 0.0;
		double max_end = 0.0;

		for (double[] row : array) {
			row_index = 0;
			for (double row_v : row) {
				if (row_v == 0.0) {
					for (double i : row) {
						row_sum = row_sum + i;
					}//0이 존재하는 행 더하는 곳
					for (double[] i : array) {
						length_sum = length_sum + i[length_index];
					}//0이 존재하는 열 더하는 곳
					
					
					row_end = row_sum / array.length  ;
					length_end = length_sum / row.length ;
					//행,열 평균 구하기
					
					if (length_end < row_end)
						max_end = row_end;
					if (length_end > row_end)
						max_end = length_end;
					//평균중 가장큰값
					
					array[length_index][row_index] = max_end;
					//가장 큰값을 입력
				}
				row_index++;//인덱스 길이 증가
			}
			length_index++;//열 인덱스 길이 증가
		}

		

		for (double[] scoress : array) {
			for (double scoresss : scoress) {
				System.out.print(scoresss + " ");
			}
			System.out.println("");
		}
		//최종출력
	}
}

--> 결과

5.0 4.5 6.8 
6.0 4.3 3.4 
7.0 8.4 2.3