360 likes | 485 Vues
프로그래밍 기초. 제 5 주 2014 년 1 학기 강원대학교 컴퓨터학부 담당교수 : 정충교. 5 장 반복. 반복. while 문 do-while 문 for 문. while 문. int sum = 0; int count = 0; while(count < 50) { sum = sum + input.nextInt(); count++; } System.out.print(“Sum is ” + sum);. 예제. 몇 개의 수를 더하겠습니까 ? 3
E N D
프로그래밍 기초 제 5주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교 강원대학교
5장 반복 강원대학교
반복 while 문 do-while문 for문 강원대학교
while 문 int sum = 0; int count = 0; while(count < 50) { sum = sum + input.nextInt(); count++; } System.out.print(“Sum is ” + sum); 강원대학교
예제 몇 개의 수를 더하겠습니까? 3 3 개의 수를 입력하세요: 5 7 9 Sum: 21 강원대학교
import java.util.*; public class AddUp { public static void main (String[] args) { Scanner input =new Scanner(System.in); int sum = 0; // 정수들의 합 int count = 0; //차례로 세기 위한 변수 int size ; //정수 개수 // 프롬프트 출력 size = input.nextInt(); // 프롬프트 출력 while (count < size) { sum = sum + input.nextInt(); count++; } System.out.println("Sum: "+ sum); } } 강원대학교
플래그(flag) 루프를 종료하기 위해 사용하는 다른 방법으로 플래그(flag)나 감시 문자(sentinel)가 있다. 플래그 또는 감시 문자는 데이터의 끝을 알려주기 위하여 데이터 끝에 추가된 값이다. 강원대학교
예제 사용자가 제공하는 정수들의 합을 계산하는 프로그램 데이터의 끝을 나타내기 위해 -999를 입력한다. 이 값은 단지 플래그로만 사용되고 합에는 포함시키지 않는다. 데이터에는 -999가 나타나지 않는다고 가정한다. 강원대학교
실행 예 Enter the numbers. End with -999 5 6 7 -999 Sum: 18 Enter the numbers. End with -999 -999 Sum: 0 강원대학교
import java.util.*; public class AddEmUpAgain { public static void main (String[] args) { Scanner input =new Scanner(System.in); final int FLAG = -999; // 데이터의 끝 신호 int sum = 0; // 정수들의 합 int number; // 더해질 다음 정수 값 저장 System.out.println("Enter the numbers. End with "+FLAG); number = input.nextInt(); while (number != FLAG) { // FLAG는 데이터의 끝을 나타냄 sum += number; // 현재 정수 값을 sum에 더함 number = input.nextInt(); // 다음 정수를 읽기 } System.out.println("Sum: "+ sum); } } 강원대학교
반복문: 힘의 원천이자 버그의 원천 두 가지 일반적인 버그: 무한 루프 (infinite loop) “하나 차이"로 인한오류 (“off by one” error) 강원대학교
무한 루프(Infinite Loop) 무한 루프는 영원히 계속 실행되는 루프이다. 루프의 종료 조건이 거짓이 되지 않으면 무한 while 루프가 됨 while (count < size) { sum = sum + input.nextInt(); count++; } 문장 count++가 실수로 생략되면? 강원대학교
루프가 아예 실행되지 않는 오류 루프가 절대 실행되지 않는 경우: count = 0; while (count > size) { number = input.nextInt(); sum += number; count++; } 사용자가 size를 양수로 설정면? 강원대학교
“하나 차이(Off by One)"로 인한 오류 올바른 경우에 비해 루프가 한 번 더, 또는 한 번 덜 실행되어 생기는 오류 강원대학교
(1+2+3+ ... +n)을 계산n 값은 사용자가 입력 import java.util.*; public class AddUpToN { // 오류 발생! public static void main (String[] args) { Scanner input =new Scanner(System.in); int sum = 0; // 누적 합 int number; // 1+2+3+ ... +number의 값 int count = 1; // 1부터 number까지의 수 세기 System.out.print("Enter a positive integer: "); number = input.nextInt(); // 정수형 값 읽기 while (count < number) { //여기가 버그 sum += count; count++; } System.out.println("The sum of the first "+number+ " positive integers is "+ sum); } } 강원대학교
입력된 수들의 평균 계산감시문자 -999 public class Average { // 잘못된 프로그램! public static void main (String[] args) { Scanner input =new Scanner(System.in); final int FLAG = -999; double sum = 0; // 합 double number; // 더해질 다음 정수 int count = 0; // 데이터의 수 세기 double average; // 평균 System.out.println("Enter the numbers end with "+FLAG); number = input.nextDouble(); // 값 읽기 while (number != FLAG) { count++; number = input.nextDouble(); // 다음 수 읽기 sum += number; // sum에 현재 정수 더하기 } average = sum/count; System.out.println("Average: "+ average); } } 강원대학교
(오류) 출력 Enter the numbers end with -999 1 2 3 -999 Average: -331.3333333333333 강원대학교
do-while 문 do-while 루프는 루프의 끝부분에서 조건을 확인한다. int x; do { System.out.println("Enter a number > 0"); x = input.nextInt(); } while (x <= 0); // 만약 음수이면반복. 강원대학교
예제 몇 개의 정수를 더하시겠습니까? 0 몇 개의 정수를 더하시겠습니까? -3 몇 개의 정수를 더하시겠습니까? 3 3개의 정수를 입력하세요. 5 7 9 Sum: 21 강원대학교
import java.util.Scanner; public class DoWhileAdd { public static void main (String[] args) { Scanner input =new Scanner(System.in); int size; // 덧셈할 정수들의 개수 do { // size가 양수일 때까지 반복 System.out.print(" 몇 개의 정수를 더하시겠습니까? "); size = input.nextInt(); } while (size <= 0); System.out.println(size+" 개의 정수를 입력하세요. "); int sum = 0; int count = 0; while (count <size) { sum = sum + input.nextInt(); // 다음 정수를 읽어 sum에 더함 count++; // 카운터 증가 } System.out.println("Sum: "+ sum); } } 강원대학교
while vs do-while while 루프 조건이 거짓이면, 루프는 한 번도 실행되지 않는다. do-while 루프 적어도 한 번은 언제나 실행된다. 강원대학교
for 문 루프 실행 회수를 지정할 경우에 사용 강원대학교
int count = 0; int i; for (i = 0; i < 10; i++) count++; 강원대학교
for (initialization; loop condition; update statement) { statement-1: statement-2; … statement-n: } initialization: 초기화 loop condition: 루프 조건 statement: 문장 update: 증감문 (갱신문) 강원대학교
int count = 0; int i; for (i = 0; i < 10; i++) count++; int count = 0; for (int i = 0; i < 10; i++) count++; 변수 i가 for 문장 안에서만 유효하다. 강원대학교
예제 몇 개의 정수를 더하시겠습니까? 4 4개의 정수를 입력하세요. 3 5 7 9 Sum: 24 강원대학교
import java.util.Scanner; public class ForAddUp { public static void main (String[] args) { Scanner input =new Scanner(System.in); int sum = 0; int size; // 더할 정수의 개수 int number; // 더할 다음 정수 System.out.print(" 몇 개의 정수를 더하시겠습니까? "); size = input.nextInt(); System.out.println(size+"4개의 정수를 입력하세요."); for (int count = 1; count <= size; count++) { number = input.nextInt(); sum += number; } System.out.println("Sum: "+ sum); } } 강원대학교
for 문의 동작 특징 • 초기화는 정확하게 한 번만 실행된다. • 루프 조건은 문장 블록을 실행하기 전에 항상 테스트된다. • 증감문은 문장 블록 실행 후에 항상 실행된다. 강원대학교
중첩 루프 강원대학교
break 문의 사용 switch 문 내부에서 실행될 때 switch 문을 종료하고 switch 문 다음의 첫 번째 문장으로 이동 루프 내부에서 실행될 때 (while문, for문) 루프를 “탈출”하여 루프 다음 문장으로 이동 강원대학교
예제 • 유효하지 않은 신용카드 번호 찾기 • 가장 오른쪽에서 두 번째 숫자부터 시작하여 왼쪽으로 하나씩 거른 숫자를 두 배로 만든다. 만약 두 배로 만든 숫자의 값이 9보다 크면 그 값에서 9를 뺀다. • 1단계에서 계산한 새 값들과 변하지 않은 자리의 값들을 모두 합한다. • 만약 2단계의 합이 0으로 끝나지 않으면 (10의 배수가 아니면) 카드 번호는 유효하지 않다. 강원대학교
5113 4765 1234 8002 • 오른쪽에서 두 번째 숫자부터 하나씩 거른 숫자들을 두 배로 만든다. 9를 초과하는 값은 9를 빼준다. 하나씩 거른 숫자들에 두 배를 하고, 결과가 9보다 크면 9를 뺀다. • 합을 계산한다.: 1+1+2+3+8+7+3+5+2+2+6+4+7+0+0+2 = 53. • 합 53의 끝자리 값이 0이 아니다. 따라서 이 번호는 유효한 카드 번호가 아니다. 강원대학교
실행 예 출력 1: Enter Credit Card Number: 5113476512348002 Invalid number 출력 2: Enter Credit Card Number: 123456789876543 Credit card number passes test 강원대학교
import java.util.*; public class CheckCreditCard { public static void main (String[] args) { Scanner input =new Scanner(System.in); final int MAX_DIGITS = 16; // 신용 카드 번호 숫자의 최대 개수 long number; // 신용 카드 번호 long sum = 0; // 최종 합의 값은 끝자리가 0이 되어야 함 long digit; System.out.print("Enter Credit Card Number:" ); number = input.nextLong(); 강원대학교
import java.util.Scanner; public class CheckCreditCard { public static void main (String[] args) { Scanner input =new Scanner(System.in); final int MAX_DIGITS = 16; // 신용 카드 번호 자리 수 long number; // 신용 카드 번호 long sum = 0; // (매우 큰 수 이므로 long 타입) long digit; // 작업을 위한 변수 (단단위 수) System.out.print("Enter Credit Card Number:" ); number = input.nextLong(); 강원대학교
for (int i = 1; i <= MAX_DIGITS; i++) { digit = number % 10; // 가장 오른쪽 숫자 추출 if (i % 2 == 0) { // 2를 곱해줄 숫자인가? digit = digit*2; if (digit > 9) // 결과가 9보다 크면 9를 빼기 digit -= 9; } sum += digit; // digit을 누적하기 number =number/10; // 가장 오른쪽 숫자 제거 } if (sum % 10 != 0) // 합의 끝자리가 0이 아닌가? System.out.println("Invalid number"); else System.out.println("Credit card number passes test"); } } 강원대학교