My footsteps

code 실습 / 1️⃣2️⃣ 본문

국비수업/CODE

code 실습 / 1️⃣2️⃣

밀김 2023. 3. 3. 22:51
728x90

 
 
 
 
 
 
 

 
 
 
 
 

1. 성적관리 프로그램 (다른 조원이 짠 코드)

	public static void main(String[] args) throws FileNotFoundException, InterruptedException {
		String fileName = "res/exam.txt"; //파일 지정 경로를 fileName 변수에 저장
		FileOutputStream fos = new FileOutputStream(fileName); //파일지정경로를 fos에 저장 
		PrintStream ps = new PrintStream(fos); //지정된 파일에 저장하기 위한 변수 ps 설정
		//파일값들을 파일에 저장하기 위한 
		
		FileInputStream fis = new FileInputStream(fileName);
		Scanner fsc = new Scanner(fis);
		//콘솔에 출력하기 위한 
		
		Scanner sc = new Scanner(System.in);  //메뉴값 입력받기 위한 스캐너 기능이 필요해서 선언
		
		int[] kors = new int[3]; //처음에 입력받은 시험점수를 저장하기 위한 배열 
		int[] loadKors = new int[3]; //시험 점수를 콘솔에 출력하기 위한 배열 fileOutput
		
		Loop : while(true) {   //전체과정 반복을 위해 while문 사용,탈출을 위한 Loop붙임 
			System.out.println("성적관리");
			System.out.println("1. 성적 입력");
			System.out.println("2. 성적 출력");
			System.out.println("3. 성적 저장");
			System.out.println("4. 성적 로드");
			System.out.println("5. 종료");
			System.out.print("입력 > ");
			int input = sc.nextInt(); //위 스캐너에서 받은 메뉴값이 내려와서 input에 담김
			
			
			switch (input) {
			case 1:
				System.out.println("성적입력");
				for(int i=0;i<3;i++) { //성적이 3개가 들어와야해서 0 1 2 
					System.out.printf("시험 %d >",i+1); //성적1 부터 출력이 되야해서 i+1
					kors[i] = sc.nextInt(); //입력된 시험 점수를 kors[i] 배열에 차례대로 저장
				}
				break;
			case 2:
				System.out.println("성적출력");
				for(int i=0;i<3;i++) {//3개의 받은 성적을 출력하는 for문
					System.out.printf("%d. %d점\n",i+1,kors[i]);
				}
				break;
			case 3:
				System.out.println("파일이 저장됩니다...");
				Thread.sleep(1200);
				for(int i=0;i<3;i++) { //위에서 입력받은 성적을 파일에 보내주기 위한 for문
					ps.printf("%d ", kors[i]); //case2 출력된 성적을 파일에 저장하기 위해 ps 사용
					//printf는 sysout과 똑같다고 생각하면 된다. printf를 사용함으로써 kors[i]에 저장된 점수를 파일에 ps를 이용해 보내줌
                    //ps는 fileOutput 
				}
				System.out.println("파일이 저장되었습니다.");
				break;
			case 4:
				System.out.println("성적을 불러옵니다...");
				Thread.sleep(1200);
				for(int i=0;i<3;i++) { //성적 출력 for문
					loadKors[i] = fsc.nextInt(); //위에서 만든 콘솔에출력하기위한 변수 fsc를 이용해 정수값으로 loadKors배열에 넣는다
				}
				for(int i=0;i<3;i++) {
					System.out.printf("%d. %d점\n",i+1,loadKors[i]);
				}
				break;
			case 5:
				System.out.println("종료합니다~ 안녕~");
				break Loop;
			default:
				System.out.println("제대로 선택해!");
				break;
			}
		}

	}
 <코드리뷰>
fsc.close 음수,100점이상입력됐을때 (유효성 검사)
fileinput,output 객체를 사용하는곳에서 넣어줘야함 상단에 해놓으면 안됨 >코드습관에 관한 문제
(case3번에 fileoutput , case4번에 fileInput)
fileName은 전역으로 빼기
loadkors콘솔출력을 위한 배열은 굳이 필요없음
for문의 반복횟수 정할때 변수를 따로 정해놓는게 좋음 ex) int max = 3; for(int i=0; i<max; i++)
지역화!
이름충돌도 피하고 필요한곳에서만 변수를 쓰고.. 변수 이름을 잘지어야한다 행위가 아닌 what에 초점을맞춰야한다 ex)input을 menu로 바꾸는게 좋다  
 

 

 

2. 성적관리 프로그램 (내가 짠 코드. 물론 이제 도움을 좀 받은^^..)

	public static void main(String[] args) throws IOException{
		
		String fileName = "res/exams.txt";//파일 경로 선언
		FileOutputStream fos = new FileOutputStream(fileName); //파일 경로 입력
		PrintStream ps = new PrintStream(fos);//파일 출력을 위한 스트림 선언겸 생성
		
		FileInputStream fis = new FileInputStream(fileName);
		Scanner fsc = new Scanner(fis);
		
		int[] loadkors = new int[3];
		//성적불러오기 

		Scanner sc = new Scanner(System.in); //성적 입력받기 위한 스캐너
		int[] kors = new int[3];//성적 저장 배열
		
		loop:
		while(true) {
			System.out.println("<성적 관리 프로그램>");
			System.out.println("1.입력 2.출력 3.저장 4.불러오기 5.종료");
			int input = sc.nextInt();//스위치 메뉴 선택을 위한 변수input
			switch(input) {
			case 1:
				System.out.println("<성적 입력>"); 
				for(int i=0; i<3; i++) {
					System.out.printf("%d.",i+1);
					kors[i] = sc.nextInt(); //성적이나오는
				}
				break;
			case 2:
				System.out.println("성적 출력");
				for(int i=0; i<3; i++) {
					System.out.printf("%d. %d점\n",i+1,kors[i]);
				}
				break;
			case 3:
				System.out.println("성적 저장합니다");
				for(int i=0; i<3; i++) {
					ps.printf("%d ",kors[i]);
				}
				System.out.println("성적이 저장되었습니다");
				break;
			case 4:
				System.out.println("불러오기");
				String score = fsc.nextLine(); //문자열인 nextLine을 score에다가 넣어주고 
				String[] scores = score.split(" ");//score를 스플릿으로 공백마다 잘라준걸 스트링배열인 scores에 넣음
				for(int i=0;i<3;i++) {
					loadkors[i] = Integer.parseInt(scores[i]);
				}
				//자른 scores배열을 정수형으로 바꾼뒤 loadkors배열에 다시 넣어준다

				int total = 0; //점수 총합을 위한 변수
				float avg = 0; //점수 평균을 위한 변수
				
				for(int i=0;i<3;i++) {
					total += loadkors[i]; //loadkors에 있는 변수들을 누적해서 total에 넣어주고
					avg = total/3.0f; //total을 실수형으로 나눠서 평균변수에 넣는다
				}
				for(int i=0; i<3; i++) {//콘솔출력을위한포문
					System.out.printf("%d. %d점\n",i+1,loadkors[i]);
				}
				
				System.out.printf("총점은 %d점 평균은 %.2f점 입니다.\n",total,avg);
				break;
			case 5:
					System.out.println("종료");
				break loop;
			default : System.out.println("잘못입력함");
				break;
			}
		}

 
 
 
 
 
 

2. 성적관리 프로그램 심화문제

		//성적 저장 심화문제
		
		String fileName = "res/exams.txt";//파일 경로 선언
		FileOutputStream fos = new FileOutputStream(fileName); //파일 경로 입력
		PrintStream ps = new PrintStream(fos);//파일 출력을 위한 스트림 선언겸 생성
		
		FileInputStream fis = new FileInputStream(fileName);
		Scanner fsc = new Scanner(fis);
		//콘솔입력을 위한 파일 인풋
		
		Scanner sc = new Scanner(System.in); 
		int[][] scores = new int[3][2];
		//성적 입력값을 받기 위한 2차원배열 scores생성
		int[][] loadkors = new int[3][2];
		//최종값을 출력하기 위한 2차원 배열 loadkors생성
		
		String[] name = { "국어", "영어", "수학" };
		
		loop:
		while(true) {
			System.out.println("<성적 관리 프로그램>");
			System.out.println("1.입력 2.출력 3.저장 4.불러오기 5.종료");
			int input = sc.nextInt();//스위치 메뉴 선택을 위한 변수input
			switch(input) {
			case 1:
				System.out.println("<성적 입력>"); 
				for(int i=0;i<3;i++) { //인덱스
					for(int j=0;j<2;j++) {
						System.out.printf("%s %d. >",name[i], j+1);
						//name[i]에는 { "국어", "영어", "수학" }이 저장되어있기 때문에 문자열형식지정자 %s를 이용해 출력
						scores[i][j] = sc.nextInt();
						//입력받은 성적을 scores 2차원배열에 저장
					}
				}
				break;
			case 2:
				System.out.println("성적 출력");
				for(int i=0; i<3; i++) {
					for(int j=0;j<2;j++)
						System.out.printf("%s %d. %d점\n",name[i],j+1,scores[i][j]);
					//위에서 저장했던 성적들을 2차원배열 scores를 이용해 출력
				}
				break;
			case 3: //파일출력
				System.out.println("성적 저장합니다");
				for(int i=0; i<3; i++) {
					for(int j=0;j<2;j++)
						ps.printf("%d ",scores[i][j]);
					//성적이 저장되어 있는 2차원 배열 scores의 값들을 파일에 출력하기
					//PrintStream ps <-> printf (서로짝꿍짝긔)
				}
				System.out.println("성적이 저장되었습니다");
				break;
			case 4: //콘솔출력
				System.out.println("불러오기");
				String line = fsc.nextLine(); //파일값들을 콘솔에 출력해야하니까 fsc를 사용하는데, nextLine이라서 문자열 한줄이니까
				String[] cutLine = line.split(" "); //스플릿을 이용해 공백마다 잘라주고 그값들을 cutLine에 넣어준다
				for(int i=0;i<3;i++) {
					for(int j=0;j<2;j++) {
						loadkors[i][j] = Integer.parseInt(cutLine[i]);
					}	
				}	
				//자른값들을 2차원배열에 차곡차곡 순서대로 넣어야 하니까 이중for문을 사용해 넣어주는데 Line을 잘라 넣은거니까 int로 바꿔준다
				//
				
//				int total = 0;
//				float avg = 0;
//				
//				for(int i=0;i<3;i++)
//					total += loadkors[i];
//				avg = total/3.0f;
				
				for(int i=0;i<6;i++) {
					System.out.printf("%s%d. %s ",name[i/2],i%2+1,cutLine[i]);
					//name[i/2]는 cutLine이 0~5고 name이0~2라서 국어국어(인덱스번호 00) 출력될때 cutLine은(1,2)니까..*사진참고*  
					//i%2+1는 계산해보면 i가 0일때 2로 나누면 나머지가0인데 거기에 1을 더하면 인덱스1로 출력되고,i가 1일때 2로 나누면 나머지가 1이고 거기에 1더하면 인덱스2가 출력
					//cutLine[i]를 사정상(?) 문자열로 출력해줌..%d로 출력하면 형식이 안맞는다고 떠서
					if(i%2==1)//인덱스가 1,3,5일때 개행을 해줘야하니까 2로 나눴을때 나머지값이 1이면 개행을함
						System.out.println();
				}
				
				
//				for(int i=0; i<3; i++) {//콘솔출력을위한포문
//					for(int j=0;j<2;j++)
//						System.out.printf("%s %d. %d점\n",name[i],j+1,loadkors[i][j]);
//				}
				
//				System.out.printf("총점은 %d점 평균은 %.2f점 입니다.\n",total,avg); 
				//소수점 뒤로 두자리만 출력하게 하고 싶어서 .2
				break;
			case 5:
					System.out.println("종료");
				break loop; //종료면 while문 자체를 끝내야 하니까 탈출 라벨링을 5번에 해야한다
			default : System.out.println("잘못입력함");
				break;
				//5번 이외의 숫자를 입력하면 프로그램을 다시 작동시켜야하니까 탈출 라벨링을 달면 안됨
			}
		}

 

 
 
 
 
 
 

728x90

'국비수업 > CODE' 카테고리의 다른 글

code 실습 / 1️⃣4️⃣  (0) 2023.03.07
code 실습 / 1️⃣3️⃣  (0) 2023.03.06
code 실습 / 1️⃣1️⃣  (0) 2023.03.02
code 실습 / 🔟  (0) 2023.02.28
code 실습 / 9️⃣  (0) 2023.02.27