My footsteps
토요스터디 / 2주차 (2차원 배열,성적관리 프로그램, 입출력API,목요일 코드 복습) 본문
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();
- Scanner는 FileInput이랑 같이 쓰임
- PrintStream은 FileOut이랑 같이 쓰임
<성적관리 프로그램 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
'Develop > 곤부📙' 카테고리의 다른 글
쪽지시험 / 1 (0) | 2023.03.06 |
---|---|
일요일 혼공 / (2차원배열 두줄 출력) (0) | 2023.03.05 |
<udemy> 자바 프로그래밍 / 섹션8 (0) | 2023.03.01 |
삼일절 혼공 / (로또 배열 복습,수동입력 중복제거 해결!!) (0) | 2023.03.01 |
<udemy> 자바 프로그래밍 / 섹션13 (0) | 2023.02.26 |