//학생 성적 관리 프로그램 (ver 0.0.1)
//반의 총원은 5명
//학번은 1~
//과목은 국어 영어 수학
//출력은 각 과목의 성적과 합계, 평균(소수 둘째자리까지)을 구하시오
1.문자열 이용
:입력하는 만큼 다 들어간다.
package com.bit.day07;
public class Ex10 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
int num=0;
String data="-------------------------------------------\n";
data+=" 학번 | 국어 | 영어 | 수학 | 합계 | 평균\n";
data+="-------------------------------------------\n";
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println(data);
}else if(su==2){
num++;
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
int sum=kor+eng+math;
double avg=sum*100/3/100.0; //소수 둘째 자리까지 나오도록 자르기
data+=num+" "+kor+" "+eng+" "+math+" "+sum+" "+avg+" "+"\n";
}
}
System.out.println("이용해주셔서 감사합니다.");
}
}
2.다중배열 이용
:배열의 크기가 정해져 있기에 그 이상 입력할 수 없다.
package com.bit.day07;
public class Ex10 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
int cnt=0;
int[][] data=new int[5][3]; //3을 입력해야 null포인터 exception오류가 안떨어진다.
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<data.length; i++){
int[] stu=data[i]; //국어,영어,수학의 값이 하나씩 인덱스에 들어간다.
//data[5][]로 만들었을 경우, 여기에 if(stu!=null)이라는 조건을 주어 null오류 해결할 수 있다.
System.out.println(i+1+" |"+stu[0]+" |"+stu[1]+" |"+stu[2]+" |"+(stu[0]+stu[1]+stu[2])+" |"+
(stu[0]+stu[1]+stu[2])*100/3/100.0);
}
}else if(su==2 && cnt<5){
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
//초기화는 배열 생성시에만 할 수 있기 때문에 새로운 배열 stu를 생성하여 data배열에 넣는다.
int[] stu=new int[]{kor,eng,math};
data[cnt]=stu;
cnt++;
} else if(su==2){
System.out.println("입력이 끝났습니다.");}
}
System.out.println("이용해주셔서 감사합니다.");
sc.close();
}
}
배열 공간을 입력받는대로 쓸 수 있도록 수정
package com.bit.day07;
public class Ex10 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
int cnt=0; //while문의 안이 아니라 밖에 선언,초기화해야한다.
System.out.print("총원>");
int tot=sc.nextInt();
int[][] data=new int[tot][3]; //while문의 안이 아니라 밖에 선언,초기화해야한다.
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<data.length; i++){
int[] stu=data[i]; //i번지를 출력하면 행이 나오니까, 다시 단일배열에 넣는다.
System.out.println(i+1+" |"+stu[0]+" |"+stu[1]+" |"+stu[2]+" |"+(stu[0]+stu[1]+stu[2])+" |"+
(stu[0]+stu[1]+stu[2])*100/3/100.0);
}
}else if(su==2 && cnt<data.length){
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
int[] stu=new int[]{kor,eng,math};
data[cnt]=stu; //data=다중배열이므로 stu를 받을 수 있다.
cnt++; //인덱스를 for문으로 돌린다고 생각하지말고 변수를 이용할 생각해보기!
} else if(su==2){
System.out.println("입력이 끝났습니다.");}
}
System.out.println("이용해주셔서 감사합니다.");
sc.close();
}
}
3.단일배열
:좋은케이스가 아니다. 바꿀 것들이 많아진다.
package com.bit.day07;
public class Ex10 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
System.out.print("총원>");
int max=sc.nextInt();
int[] data=new int[max*3]; //한 사람당 국어,영어,수학의 점수 3개 공간이기 때문에 *3
int idx=0;
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<data.length; i++){
int num=i/3+1; //학번
int kor=data[i++];
int eng=data[i++];
int math=data[i];
int sum=kor+eng+math;
double avg=sum*100/3/100.0;
System.out.println(num+" |" +kor+" |"+eng+" |"+math+ " |"+sum+" |"+avg);
}
}
else if(su==2 && idx<data.length){
System.out.println("국어>");
data[idx++]=sc.nextInt();
System.out.println("영어>");
data[idx++]=sc.nextInt();
System.out.println("수학>");
data[idx++]=sc.nextInt();
}
}
System.out.println("이용해주셔서 감사합니다.");
}
}
4. 문자열 단일배열
package com.bit.day07;
public class Ex11 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
String[] data=new String[5];
int idx=0;
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<data.length; i++){
if(data[i]!=null){
String[] stu=data[i].split("\t"); //string이니까 쪼개준다. 문자열 3개를 갖는 배열이 된다.
int kor=Integer.parseInt(stu[0]);
int eng=Integer.parseInt(stu[1]);
int math=Integer.parseInt(stu[2]);
int sum=kor+eng+math;
double avg=sum*100/3/100.0;
System.out.println(i+1+"\t"+kor+"\t"+eng+"\t"+math+"\t"+sum+"\t"+avg);
}
}
}
else if(su==2){
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
data[idx++]=kor+"\t"+eng+"\t"+math;
}
}
System.out.println("이용해주셔서 감사합니다.");
}
}
5. 객체 배열 이용
장점 : 요구사항이 늘어도 쉽게 추가할 수 있다. + 다양한 자료형 처리 가능하다
package com.bit.day07;
class Student{
int num;
String name;
int kor;
int eng;
int math;
}
public class Ex11 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
Student[] stus=new Student[5];
int num=0;
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<stus.length; i++){
Student stu = stus[i];
if(stu!=null){
System.out.println(stu.num+"\t"+stu.kor+"\t"+stu.eng+"\t"+stu.math+
"\t"+(stu.kor+stu.eng+stu.math)+"\t"+(stu.kor+stu.eng+stu.math)*100/3/100.0);
}
}
}
else if(su==2&&num<stus.length){
// System.out.println("이름>");
// String name=""+sc.nextInt(); //문자열로 입력받기
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
Student stu=new Student();
stus[num++]=stu; //여기서 stu의 시작 주소값을 stus[0]에게 넣는 것?
// stu.name=name; //객체의 속성을 쉽게 늘릴 수 있다.
stu.num=num; //1을 넣는다.
stu.kor=kor;
stu.eng=eng;
stu.math=math;
}
}
System.out.println("이용해주셔서 감사합니다.");
}
}
-생성자 이용
:바뀌지 않는 값인 학번, 이름을 넣어 처리하면 더 좋다.
package com.bit.day07;
class Student{
int num;
String name;
int kor;
int eng;
int math;
Student(int kor, int eng, int math){
this.kor=kor;
this.eng=eng;
this.math=math;
}
}
public class Ex11 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.1)");
System.out.println("-------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
Student[] stus=new Student[5];
int num=0;
while(boo){
System.out.println("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("-------------------------------------------");
System.out.println(" 학번 | 국어 | 영어 | 수학 | 합계 | 평균");
System.out.println("-------------------------------------------");
for(int i=0; i<stus.length; i++){
Student stu = stus[i];
if(stu!=null){
System.out.println(stu.num+"\t"+stu.kor+"\t"+stu.eng+"\t"+stu.math+
"\t"+(stu.kor+stu.eng+stu.math)+"\t"+(stu.kor+stu.eng+stu.math)*100/3/100.0);
}
}
}
else if(su==2&&num<stus.length){
System.out.println("국어>");
int kor=sc.nextInt();
System.out.println("영어>");
int eng=sc.nextInt();
System.out.println("수학>");
int math=sc.nextInt();
Student stu=new Student(kor,eng,math);
stus[num++]=stu;
stu.num=num;
}
}
System.out.println("이용해주셔서 감사합니다.");
}
}
배열 복사를 이용한 동적할당
: 넣으면 넣는대로 들어가길 원하기 때문에
정적 자료구조를 배열복사를 통하여 동적할당으로 만들었다. = ArrayList 클래스
package com.bit.day07;
class Array{
int[] arr=new int[0];
public void add(int su){
int[] temp=arr;
arr=new int[arr.length+1];
//기존값 복사
for(int i=0; i<temp.length; i++){
arr[i]=temp[i];
}
arr[arr.length-1]=su; //늘어난 arr배열 마지막 번지에 su를 넣는다.
}
public int get(int idx){
return arr[idx];
}
//사이즈 알려주는 메소드
public int size(){
return arr.length;
}
}
public class Ex12 {
public static void main(String[] args) {
Array arr=new Array(); //사용하는 입장에서는 내가 값을 넣은만큼 늘어나는 효과를 볼 수 있다.
arr.add(1111);
arr.add(2222);
arr.add(3333);
for(int i=0; i<arr.size(); i++){
System.out.println(arr.get(i));
}
}
}
배열 복사를 이용한 프로그램
package com.bit.day07;
class StuArray{
Student[] arr=new Student[0]; //객체 배열 arr 생성
public void add(Student su){
Student[] temp=arr;
arr=new Student[arr.length+1]; //새로운 배열 객체 생성, arr는 새로운 객체 참조
//기존값 복사
for(int i=0; i<temp.length; i++){
arr[i]=temp[i];
}
arr[arr.length-1]=su;
}
public int size(){
return arr.length;
}
public Student get(int idx){
return arr[idx];
}
}
class Student{
int num;
String name;
int kor;
int eng;
int math;
Student(int kor,int eng,int math){
this.kor=kor;
this.eng=eng;
this.math=math;
}
}
public class Ex13 {
public static void main(String[] args) {
System.out.println("학생성적관리프로그램(ver0.0.5)");
System.out.println("--------------------------------");
java.util.Scanner sc=new java.util.Scanner(System.in);
boolean boo=true;
StuArray data=new StuArray();
int num=0;
while(boo){
System.out.print("1.목록 2.입력 0.종료>");
int su=sc.nextInt();
if(su==0){
boo=false;
}else if(su==1){
System.out.println("------------------------------------------------");
System.out.println("학번 |국어 |영어 |수학 |합계 |평균");
System.out.println("------------------------------------------------");
for(int i=0;i<data.size(); i++){
//=arr[i]번지에 있는 stu객체를 가져온다.
Student stu=data.get(i);
if(stu!=null){
System.out.println(stu.num+"\t"+stu.kor+"\t"+stu.eng+"\t"
+stu.math+"\t"+(stu.kor+stu.eng+stu.math)+"\t"
+(stu.kor+stu.eng+stu.math)*100/3/100.0);
}
}
System.out.println("------------------------------------------------");
}else if(su==2){
System.out.print("국어>");
int kor=sc.nextInt();
System.out.print("영어>");
int eng=sc.nextInt();
System.out.print("수학>");
int math=sc.nextInt();
Student stu=new Student(kor,eng,math);
stu.num=num++;
data.add(stu);
}
}
System.out.println("이용해주셔서 감사합니다");
}
}