My footsteps

토요스터디 / 2주차 (2차원 배열,성적관리 프로그램, 입출력API,목요일 코드 복습) 본문

Develop/곤부📙

토요스터디 / 2주차 (2차원 배열,성적관리 프로그램, 입출력API,목요일 코드 복습)

밀김 2023. 3. 4. 10:04
728x90

 

 

 

 

 

 

 

 

 

 

 

 

<2차원 배열에 값 넣기>

		FileInputStream fis = new FileInputStream("res/lotto.csv");
		Scanner fscan = new Scanner(fis);
		//파일의 값을 콘솔로 출력하기 전에 먼저 가져오는 과정

		
		int[][] lotto = new int[3][6];
		//정수형 2차원배열인 로또를 만들어줌
		
		for(int r=0; r<3; r++) {
			String line = fscan.nextLine();
			String[] tokens = line.split(",");
			//스플릿을 이용해 콤마를 기준으로 잘라줘서 스트링배열인 토큰스에 넣는다
			for(int i=0; i<6; i++) {
				lotto[r][i] = Integer.parseInt(tokens[i]);
			}
		}
		
		for(int r=0; r<3; r++) {
			for(int i=0; i<6; i++) {
				System.out.printf("%d ",lotto[r][i]);
				if(i==5 || i==11) {
					System.out.println();
				}
			}
		}
		
		
		fscan.close();
		fis.close();
		//다 가져왔으면 닫아준다

 

 

 

 

 

<2차원 배열에 1차원 배열로 참조변수 지정해주기>

		FileInputStream fis = new FileInputStream("res/lotto.csv");
		Scanner fscan = new Scanner(fis);
		//파일의 값을 콘솔로 출력하기 전에 먼저 가져오는 과정

		int[][] lottos = new int[3][6];
		
		for(int r=0; r<3; r++) {
			String line = fscan.nextLine();
			//스캐너에서 입력받은 파일값들을 스트링 라인변수에 넣어주고
			String[] tokens = line.split(",");
			//스트링 토큰즈 배열에 콤마로 자른 라인값들을 넣어준다
			
			int[] lotto = lottos[r];
			//2차원배열인 lottos는 총 3칸인데 한칸한칸의 이름을 lotto라고 설정(=lotto는 lottos의 참조변수)
			
			for(int i=0; i<6; i++) {
				lotto[i] = Integer.parseInt(tokens[i]);
				System.out.printf("%d ",lotto[i]);
				if(i==5 || i==11) {
					System.out.println();
				}
			}
		} 
		fscan.close();
		fis.close();

 

 

- ScannerFileInput이랑 같이 쓰임

 

- PrintStreamFileOut이랑 같이 쓰임

 

 

 

 

 

<성적관리 프로그램 1차원 배열+입출력 API 이용하기>

		/*
		 1. 파일에 값 출력을 위한 파일아웃 구문들 작성
		 2. 성적관리 메인페이지(입력-출력-저장-로드-종료 / 입력>)
		 3. while문으로 전체 돌아가게. 탈출문도 붙이기
		 4. switch문으로 메뉴선택시 돌아가게
		 5. 1번메뉴 / 스캐너로 값 입력 받기 성적입력 시험123 (배열에 저장)
		 6. 2번메뉴 / 배열로 입력받은 성적 출력하기
		 7. 3번메뉴 / 성적을저장합니다-성적저장완 처음입력받은 성적배열을 파일에쏴줌
		 8. 4번메뉴 / 성적을불러옵니다..3번에서 저장된 성적을 불러옴
		 9. 5번메뉴 / 프로그램종료(+탈출문)
		 10.그외번호입력했을때 다시입력하라는거 뜨게 하기  
		*/
		
		
		//파일에 값 출력을 위한 파일아웃풋 구문들
		FileOutputStream fos = new FileOutputStream("res/exams.txt");
		PrintStream ps = new PrintStream(fos);
		
		//콘솔 출력을 위한 파일인풋 구문들
		FileInputStream fis = new FileInputStream("res/exams.txt");
		//콘솔 출력을 위해 파일주소를 참조해, 파일 값들을 인풋하여 fis 변수에 담고
		Scanner fsc = new Scanner(fis);
		//그 값들을 담아서 콘솔출력을 위한 배열인,finalGrade에 전달하기 위해 fsc변수 생성
		
		Scanner sc = new Scanner(System.in);
		//선택한 메뉴값을 담아서 스위치문에 전달할 스캐너
		
		int[] grade = new int[3];
		//성적입력을 받아서 저장하기 위한 1차원배열 생성
		int[] finalGrade = new int[3];
		//콘솔 출력을 위한 점수가 저장된 1차원배열 생성
		
		out:while(true) {
			System.out.println("< 성적 관리 프로그램>");
			System.out.println("──────────────────");
			System.out.println("1.성적 입력\n2.성적 출력\n3.성적 저장\n4.성적 로드\n5.종료");
			int input = sc.nextInt();
			//스타트 화면
			//★★★시작 멘트와 입력받은 메뉴번호들을 담을 input변수가 while문안에 있어야 1번 선택하고 끝나면 다시 메인으로 돌아와서 다른 메뉴들을 선택할수있음★ 
				switch(input) {
					case 1:
						System.out.println("<성적입력>");
						for(int i=0; i<3; i++) {
							System.out.printf("시험%d ",i+1);
							grade[i] = sc.nextInt();
						}
						break;
					case 2:
						System.out.println("<성적출력>");
						for(int i=0; i<3; i++) {
							System.out.printf("시험%d %d점\n",i+1,grade[i]);
						}
						break;
					case 3://입력받은 성적배열 파일에 쏘기
						System.out.println("<성적을 저장합니다>");
						for(int i=0; i<3; i++) {
							ps.printf("%d ",grade[i]);
							//printf() = System.out.println()
						}
						Thread.sleep(1500);
						System.out.println("<성적 저장 완료>");
						break;
					case 4:
						System.out.println("<성적을 로드 합니다>"); //콘솔출력
						Thread.sleep(1500);
						for(int i = 0; i<3; i++) {
							finalGrade[i] = fsc.nextInt();
							System.out.printf("시험%d %d점 \n",i+1,finalGrade[i]);
						}
						break;
					case 5:
						System.out.println("프로그램을 종료합니다.");
						break out;
					default:
						System.out.println("잘못 선택하셨습니다. 다시 선택해주세요.");
						break;

 

 

 

 

 

<성적관리 프로그램 1차원 배열+입출력 API 이용하기+평균내기>

		//파일에 값 출력을 위한 파일아웃풋 구문들
		FileOutputStream fos = new FileOutputStream("res/exams.txt");
		PrintStream ps = new PrintStream(fos);
		
		//콘솔 출력을 위한 파일인풋 구문들
		FileInputStream fis = new FileInputStream("res/exams.txt");
		Scanner fsc = new Scanner(fis);
		
		Scanner sc = new Scanner(System.in);
		//선택한 메뉴값을 담아서 스위치문에 전달할 스캐너
		
		int[][] grade = new int[3][2];
		//성적입력을 받아서 저장하기 위한 2차원배열 생성
		int[][] finalGrade = new int[3][2];
		//콘솔 출력을 위한 점수가 저장된 2차원배열 생성
		String[] name = {"국어","영어","수학"};
		//과목 이름 출력을 위한 스트링 1차원배열 생성 
		
		int avg = 0;//총점 저장
		float total = 0;//평균
		
		out:while(true) {
			System.out.println("< 성적 관리 프로그램>");
			System.out.println("──────────────────");
			System.out.println("1.성적 입력\n2.성적 출력\n3.성적 저장\n4.성적 로드\n5.성적 평균 보기\n6.종료");
			int input = sc.nextInt();
			//스타트 화면
			//★★★시작 멘트와 입력받은 메뉴번호들을 담을 input변수가 while문안에 있어야 1번 선택하고 끝나면 다시 메인으로 돌아와서 다른 메뉴들을 선택할수있음★ 
				switch(input) {
					case 1:
						System.out.println("<성적입력>");
						for(int r=0; r<3; r++) { //r=2차원배열 세로(과목)
							for(int i=0; i<2; i++) { //i=2차원배열 가로(과목별 인덱스)
								System.out.printf("%s%d ",name[r],i+1);
								grade[r][i] = sc.nextInt();
							}
						}
						break;
					case 2:
						System.out.println("<성적출력>");
						for(int r=0; r<3; r++) {
							for(int i=0; i<2; i++) { //조건식(i<2) 배열 length로 설정 못함. 2차원이라 그런가?
								System.out.printf("%s%d %d점\n",name[r],i+1,grade[r][i]);
							}
						}
						break;
					case 3://입력받은 성적배열 파일에 쏘기
						System.out.println("<성적을 저장합니다>");
						for(int r=0; r<3; r++) {
							for(int i=0; i<2; i++) {
								ps.printf("%d ",grade[r][i]);
							}
						}
						Thread.sleep(1500);
						System.out.println("<성적 저장 완료>");
						break;
					case 4:
						System.out.println("<성적을 로드 합니다>"); //콘솔출력
						Thread.sleep(1500);
						//값 자르기
						String line = fsc.nextLine();
						String[] cutLine = line.split(" ");
						for(int r=0; r<3; r++) {
							for(int i=0; i<2; i++) {
								finalGrade[r][i] = Integer.parseInt(cutLine[i]);
								//★★이부분이 계속 오류 났었는데 이유는 58번째에서 printf로 넣어서 형식지정자 %d해줘야될걸 print로하고 %d도 안넣음
								//그래서 값이 아무것도 안들어가서 오류났떤것!!!!
							}
						}
						//성적 로드하기(=값 최종 출력하기)
						for(int r=0; r<3; r++) {
							for(int i=0; i<2; i++) {
								System.out.printf("%s%d %d점\n",name[r],i+1,finalGrade[r][i]);
							}
						}
						//총점 다 더해서 평균 구하기
						for(int r=0; r<3; r++) {
							for(int i=0; i<2; i++) {
								avg += finalGrade[r][i];
								total = avg/6.0f;
							}
						}
						break;
					case 5:
						System.out.println("<성적 평균 보기>");
						System.out.printf("총점:%d 평균:%.2f\n",avg,total);
						break;
					case 6:
						System.out.println("프로그램을 종료합니다.");
						break out;
					default:
						System.out.println("잘못 선택하셨습니다. 다시 선택해주세요.");
						break;

 

 

 

		int count = 0;
		
		FileInputStream fis = new FileInputStream("res/data.txt");
		Scanner fsc = new Scanner(fis);
		String line = fsc.nextLine();
		
		while(line.indexOf(" ")!=-1) {
			//공백을 -1이라고 하고,-1이 아니면 > 즉, 공백이 없으면 while문은 멈춘다
			int index = line.indexOf(" ");
			//line에 있는 첫번째 공백을 index에 저장			
			line = line.substring(index+1);
			//첫번째 공백 인덱스를 포함하지 않고 그 다음 인덱스부터 line에 다시 저장
			//인덱스가 올라갈때마다(index+1)
			count++;
			//인덱스가 공백을 만나서 다음칸으로 넘어갈때마다 카운트가 하나씩 올라간다
		}System.out.println(count);

 

 


 

 

 

 

<목요일 클래스룸 코드 복습>

		FileInputStream fis = new FileInputStream("res/data.txt");
		Scanner fsc = new Scanner(fis);
		String line = fsc.nextLine();
		
		int count = 0;
		while(line.indexOf(" ")!=-1) {
			//공백을 -1이라고 하고,-1이 아니면 > 즉, 공백이 없으면 while문은 멈춘다
			int index = line.indexOf(" ");
			//line에 있는 첫번째 공백을 index에 저장			
			line = line.substring(index+1);
			//첫번째 공백 인덱스를 포함하지 않고 그 다음 인덱스부터 line에 다시 저장
			//인덱스가 올라갈때마다(index+1)
			count++;
			//인덱스가 공백을 만나서 다음칸으로 넘어갈때마다 카운트가 하나씩 올라간다
		}System.out.println(count);
		fsc.close();
		fis.close();
		
		//-------------------------------------------------------------------------------------
		
		FileInputStream fis2 = new FileInputStream("res/data.txt");
		Scanner scan2 = new Scanner(fis2);	
		//위에서 닫아줬으니까 새로 다시 만들어야함
        
		int[] b = new int[count];//위에서만든 count배열의 길이를 배열b에 넣음
		int max = -1; //최댓값 출력을 위한 변수 설정
	
		for(int i=0; i<count; i++) {
			b[i] = scan2.nextInt();
		}//카운트의 값을 하나씩 넣어주는 배열b생성. 카운트의 길이만큼 이 과정이 반복
		for(int i=0; i<count; i++) {
			if(b[i]>max) { //배열b에 하나씩 들어간 값들과 max를 비교한다. 
				max = b[i];//max가 -1이니까 계속해서 최댓값이 반복문에 의해 갱신되며 최종적으로는 가장 큰값이 max에 담긴다
			}
		}
		System.out.println(max);
		fsc.close();
		fis.close();
		
		//-------------------------------------------------------------------------------------
		
		int index = -1;
		
		for(int i=0; i<b.length; i++) {
			if(b[i]==10) {
				System.out.println(i);
			}
		}
		
		//-------------------------------------------------------------------------------------
		
		int[] nums = new int[15];
		
		FileInputStream fis = new FileInputStream("res/data.txt");
		Scanner fsc = new Scanner(fis);
		
		for(int i=0; i<nums.length; i++) {
			nums[i] = fsc.nextInt();
			System.out.println(nums[i]);
		}
		
		//-------------------------------------------------------------------------------------
		
		Random rand = new Random();
		
		for(int i=0; i<50; i++) {
			int a = rand.nextInt(15);
			int b = rand.nextInt(15);
			//rand로 랜덤값을 입력받고 그것들을 nums배열의 길이에 맞게 15개만 nextInt를 통해 각 변수 a,b에게 준다
			
			int tmp = nums[a];
			nums[a] = nums[b];
			nums[b] = tmp;
			
			for(int k=0; k<nums.length; k++) {
				System.out.println(nums[k]);
			}
		}
		
		//-------------------------------------------------------------------------------------
		
		int size = 4;
		
		int[] exams = new int[size];
		
		FileInputStream fis = new FileInputStream("res/exams.txt");
		Scanner sc = new Scanner(fis);
		
		for(int i=0; i<4; i++) {
			exams[i] = sc.nextInt();
		}
		
		int[] newExams = new int[size*2];
		
		for(int i=0; i<4; i++) {
			newExams[i] = exams[i];
			//exams배열의 값을 크기가 8칸인 newExams에 넣으면 exams값4개+아무것도 들어있지 않은(0) newExams값4개
		}
		
		exams = newExams;
		//newExams는 exams값4개+아무것도 들어있지 않은(0) newExams값4개 가 들어있는데 그것을 크기가4인 exams 배열에 옮기면 
		//exams배열의 크기가 늘어나게 되는 것이다. 이 과정없이 그냥exams[i]을 출력하면 당연히 4칸의 값이 나오고,
		//newExams[i]를 출력하면 newExams[i] = exams[i] 이것때문에 newExams[i]도 4칸 배열로 나온다.
		
		
		for(int i=0; i<exams.length; i++) {
			System.out.println(exams[i]);
		}

 

 

 

 

 

 

 

 

 

 

728x90