반응형
구조적인 프로그래밍 이란
절차로만 이루어져 있는 프로그램을 코드를 나누어주다 보니 그 나눠진 것들 사이에서 구조가 만들어진다.
두 가지 방식이 있는데
그중 첫 번째인 Bottom Up은 이미 있는 프로그램을 잘라서 조각을 낸 뒤
그 조각을 가지고 구조를 만들어 가는 방법이다. 프로그램은 성적 출력을 가지고 코드를 나누는 연습을 해보겠다.
1. 절차로만 이루어진 코드
package part2.ex1.성적입력부분나누기;
import java.util.Scanner;
public class newlec {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int kors[][] = new int[3][3];
int total = 0;
float avg;
boolean keeploop = true;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++)
kors[j][i] = 0;
}
EXIT: while (keeploop) {
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 프로그램 │ ");
System.out.println("└───────────────┘");
System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
System.out.println("2. 국어 성적 출력");
System.out.println("3. 종료");
System.out.print("입력 > ");
String menu_ = scan.nextLine();
int menu = Integer.parseInt(menu_);
switch (menu) {
case 1:
System.out.println("┌───────────────┐");
System.out.println("│ 성적 입력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
do {
System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
kors[j][i] = scan.nextInt();
scan.nextLine();
if (kors[j][i] < 0 || kors[j][i] > 100)
System.out.println("성적범위(0~100) 입니다.");
} while (kors[j][i] < 0 || kors[j][i] > 100);
}
}
break;
case 2:
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
total = kors[j][0] + kors[j][1] + kors[j][2];
avg = total / 3.0f;
for (int i = 0; i < 3; i++) {
System.out.printf("%d국어 성적 : %3d\n", i + 1, total);
System.out.printf("총점 :%3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
}
}
break;
case 3:
break EXIT;
default:
System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");
}
}
scan.close();
System.out.println("bye~~");
}
}
2. 구조화시키기 함수로 나눈다
package part2.ex1.성적입력부분나누기;
import java.util.Scanner;
public class newlec {
// static int x; 전역변수선언하는법
static int kors[][] = new int[3][3];
public static void main(String[] args) {
boolean keeploop = true;
int menu;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++)
kors[j][i] = 0;
}
EXIT: while (keeploop) {
menu = 메뉴입력();
switch (menu) {
case 1:
성적입력(); // F3눌르면 성적입력함수로 가짐.
break;
case 2:
성적출력();
break;
case 3:
System.out.println("bye~~");
break EXIT;
default:
System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");
}
}
}
static int 메뉴입력() {
Scanner scan = new Scanner(System.in);
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 프로그램 │ ");
System.out.println("└───────────────┘");
System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
System.out.println("2. 국어 성적 출력");
System.out.println("3. 종료");
System.out.print("입력 > ");
int menu = scan.nextInt();
return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
}
static void 성적출력() {
int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
float avg = 0;
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
total = kors[j][0] + kors[j][1] + kors[j][2];
avg = total / 3.0f;
for (int i = 0; i < 3; i++) {
System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);
}
System.out.println("-------------------------------");
System.out.printf("\t총점 :%3d\n", total);
System.out.printf("\t평균 : %6.2f\n", avg);
System.out.println();
}
}
// 함수를 만들어 코드를 나눔
static void 성적입력() {
Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
// kors라는 변수를 쓸 수 가없다 쓸려면.
// 전역변수(자원) 선언
System.out.println("┌───────────────┐");
System.out.println("│ 성적 입력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
do {
System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
kors[j][i] = scan.nextInt();
if (kors[j][i] < 0 || kors[j][i] > 100)
System.out.println("성적범위(0~100) 입니다.");
} while (kors[j][i] < 0 || kors[j][i] > 100);
}
}
}
}
3. 깔끔하게 보이기 사용자는 모르지만 우리가 거시적으로 볼 때 좋다.
package part2.ex1.성적입력부분나누기;
import java.util.Scanner;
public class newlec {
// static int x; 전역변수선언하는법
static int kors[][] = new int[3][3];
public static void main(String[] args) {
boolean keeploop = true;
int menu;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++)
kors[j][i] = 0;
}
EXIT: while (keeploop) {
menu = 메뉴입력();
switch (menu) {
case 1:
성적입력(); // F3눌르면 성적입력함수로 가짐.
break;
case 2:
성적출력();
break;
case 3:
System.out.println("bye~~");
break EXIT;
default:
System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");
}
}
}
static int 메뉴입력() {
Scanner scan = new Scanner(System.in);
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 프로그램 │ ");
System.out.println("└───────────────┘");
System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
System.out.println("2. 국어 성적 출력");
System.out.println("3. 종료");
System.out.print("입력 > ");
int menu = scan.nextInt();
return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
}
static void 성적출력() {
int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
float avg = 0;
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
total = kors[j][0] + kors[j][1] + kors[j][2];
avg = total / 3.0f;
for (int i = 0; i < 3; i++) {
System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);
}
System.out.println("-------------------------------");
System.out.printf("\t총점 :%3d\n", total);
System.out.printf("\t평균 : %6.2f\n", avg);
System.out.println();
}
}
// 함수를 만들어 코드를 나눔
static void 성적입력() {
Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
// kors라는 변수를 쓸 수 가없다 쓸려면.
// 전역변수(자원) 선언
System.out.println("┌───────────────┐");
System.out.println("│ 성적 입력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
do {
System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
kors[j][i] = scan.nextInt();
if (kors[j][i] < 0 || kors[j][i] > 100)
System.out.println("성적범위(0~100) 입니다.");
} while (kors[j][i] < 0 || kors[j][i] > 100);
}
}
}
}
4. 최종
전역 변수를 사용하지 않기 위해
전역 변수를 main함수에 넣고
메뉴, 성적 입출력 함수에 매개변수로써 함수를 고립시켜
전역 변수에 대한 오류 가능성을 줄인다.
import java.util.Scanner;
public class newlec {
// static int x; 전역변수선언하는법
public static void main(String[] args) {
int[][] korList = new int[3][3];
//외부로부터 함수 고립화를 시키겠다.
// 전역변수 보다 메인함수에 넣은뒤 다른함수에서 매개변수형태로 받게하겠다.
int menu;
boolean keeploop = true;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++)
korList[j][i] = 0;
}
EXIT: while (keeploop) {
menu = inputMenu(); //함수명을 한글보단 영어가 바람직하다.
switch (menu) {
case 1:
intputKors(korList); // F3눌르면 성적입력함수로 가짐.
break;
case 2:
printKors(korList);
break;
case 3:
System.out.println("bye~~");
break EXIT;
default:
System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");
}
}
}
static int inputMenu() {
Scanner scan = new Scanner(System.in);
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 프로그램 │ ");
System.out.println("└───────────────┘");
System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
System.out.println("2. 국어 성적 출력");
System.out.println("3. 종료");
System.out.print("입력 > ");
int menu = scan.nextInt();
return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
}
static void printKors(int[][] kors) {
int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
float avg = 0;
System.out.println("┌───────────────┐");
System.out.println("│ 성적 출력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
total = kors[j][0] + kors[j][1] + kors[j][2];
avg = total / 3.0f;
for (int i = 0; i < 3; i++) {
System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);
}
System.out.println("-------------------------------");
System.out.printf("\t총점 :%3d\n", total);
System.out.printf("\t평균 : %6.2f\n", avg);
System.out.println();
}
}
// 함수를 만들어 코드를 나눔
static void intputKors(int[][] kors) {
Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
// kors라는 변수를 쓸 수 가없다 쓸려면.
// 전역변수(자원) 선언
int kor;
System.out.println("┌───────────────┐");
System.out.println("│ 성적 입력 │ ");
System.out.println("└───────────────┘");
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
do {
System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
kor = scan.nextInt();
if (kor < 0 || kor > 100)
System.out.println("성적범위(0~100) 입니다.");
} while (kor < 0 || kor > 100);
kors[j][i] =kor;
}
}
}
}
반응형
'JAVA > [JAVA] 바구니' 카테고리의 다른 글
java.lang.NullPointerException 오류1 (0) | 2020.03.03 |
---|---|
JAVA 구조적인 프로그래밍 Top Down (0) | 2020.02.28 |
성적 입출력 프로그램 중 오류 (0) | 2020.02.27 |
JAVA 연산자 -1 (0) | 2020.02.20 |
JAVA 값과 형식 (0) | 2020.02.20 |
댓글