자료구조&기본 알고리즘 입문(자바)- 반복
● 1부터 n까지의 정수 합 구하기
import java.util.Scanner;
// 1, 2, …, n의 합을 구한다.
class SumWhile {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("1부터 n까지의 합.");
System.out.print("n의 값:");
int n = stdIn.nextInt();
int sum = 0; // 합
int i = 1;
while (i <= n) { // i가 n 이하면 반복.
sum += i; // sum에 i를 더한다.
i++; // i 값을 1만큼 증가.
}
System.out.println("1부터 " + n + "까지의 합은 " + sum );
}
}
○while문 반복
어떤 조건이 성립하는 동안 처리(프로그램 명령문 또는 명령어의 집합)를 반복하여 실행하는 것을
반복(repitition) 구조라 하며 루프(loop)라고 부른다.
이때 while문은 실행 전에 반복을 계속할지를 판단하는데, 이런 구조를 '사전 판단 반복 구조'라고 부른다.
제어식의 평갓값이 0이 아니면 프로그램 명령문이 반복되나.
while(제어식)명령문
○for문 반복
하나의 변수를 사용하는 반복문은 while문보다 for문을 사용하는 것이 좋다.
import java.util.Scanner;
// 1, 2, …, n의 합을 구한다
class SumFor {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("1부터 n까지의 합.");
System.out.print("n의 값:");
int n = stdIn.nextInt();
int sum = 0; // 합
for (int i = 1; i <= n; i++)
sum += i; // sum에 i를 더한다
System.out.println("1부터 " + n + "까지의 합은 " + sum);
}
}
for(초기화부분; 제어식; 업데이트 부분) 명령문
초기화 부분은 for문을 실행하기 전에 한 번만 실행한다. 제어식을 평가한 값이 true이면 for문의 명령문을 반복한다.
명령문을 실행한 다음에는 업데이트 부분을 실행한다.
- n이 7이면 '1+2+3+4+5+6+7 =28' 로 출력하는 프로그램
package chap01;
import java.util.Scanner;
public class Q7 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("1부터 n까지의 합을구합니다.");
System.out.print("n의 값:");
int n = stdIn.nextInt();
int sum = 0; // 합
for (int i = 1; i <= n; i++) {
if(i<n) {
System.out.print( i + " + ");
}else {
System.out.print(i);
}
sum += i;
}
System.out.println(" = " + sum);
}
}
- 정수 a,b를 포함하여 그 사이의 모든 정수의 합을 구하여 반환하는 메서드
import java.util.Scanner;
// 정수a, b를 포함하여 그 사이의 모든 정수의 합.
class Q9 {
static int sumof(int a, int b) {
int min; // a, b의 작은 쪽의 값
int max; // a, b의 큰 쪽의 값
if (a < b) {
min = a;
max = b;
} else {
min = b;
max = a;
}
int sum = 0;
for (int i = min; i <= max; i++)
sum += i;
return (sum);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("a와 b를 포함하여 그 사이의 모든 정수의 합.");
System.out.print("a의 값:");
int a = sc.nextInt();
System.out.print("b의 값:");
int b = sc.nextInt();
System.out.println("정수 a, b 사이의 모든 정수의 합은 " + sumof(a, b));
}
}
○do문 while(제어식)
do 문은 일단 루프 본문을 한 번 실행하 ㄴ다음에 계쏙 반복할 것인지를 판단하는 사후 반단 반복문.
while문과 마찬가지로 () 안의 제어식을 평가한 값이 0이 아니면 루프 본문의 명령이 반복
import java.util.Scanner;
// 1, 2, …, n의 합 (양수만 입력).
class SumForPos {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int n;
System.out.println("1부터 n까지의 합.");
do {
System.out.print("n의 값:");
n = stdIn.nextInt();
} while (n <= 0);
int sum = 0; // 합
for (int i = 1; i <= n; i++)
sum += i; // sum에 i를 더함
System.out.println("1부터 " + n + "까지의 합은 " + sum );
}
}
○사전 판단 반복과 사후 반단 반복의 차이점
사전 판단 반복문인 while문과 for문은 처음에 제어식을 평가한 결가가 0이면 루프 본문은 한 번도 실행되지 않는다.
이와 달리 사후 판단 반복문인 do문은 루프 본문이 반드시 한번은 실행된다.
이것이 사전 판단 반복과 사후 판단 반복의 차이점이다.
● 구조적 프로그래밍
하나의 입구와 하나의 출구를 가진 구성 요소만을 계층적으로 배치하여 프로그램을 구성하는 방법을
구조적 프로그래밍(structured programming)이라고 한다. 구조적 프로그래밍은 순차,선택,반복이라는
3종류의 제어 흐름을 사용한다
○논리 연산과 드모르간 법칙
import java.util.Scanner;
// 2자리의 양수(10 ~ 99)를 입력.
class Digits {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int no;
System.out.println("2자리의 정수를 입력.");
do {
System.out.print("입력:");
no = stdIn.nextInt();
} while (no < 10 || no > 99);
System.out.println("변수 no의 값은 " + no);
}
}
while (no < 10 || no > 99) 의 제어식에 의해 변수 no에 입력한 값이 10보다 작거나 99보다 크면 루프 본문을 반복. 여기서 아용하는 || 는 논리합을 구하는 논리합 연산자. 논리 연산을 하는 또 하나의 션산자로 논리곱을 구하는 논리곱 연산자 &&가 있다.
논리 연산자의 단축 평가
no에 입력한값이 5인 경우 식 no<10의 평갓값은 true이므로 오른쪽 피연산자 no>99를 평가하지 않아도 제어식 no<10||no>99값이 true가 된다. 왼쪽 피연산자 x와 오른쪽 피연산자 y 중 어느 하라나로 trute면 논리식 x || y 값은 trute가 되기 때문이다. 그러므로 || 연산자의 왼쪽 피연사자를 평가한 값이 true면 오른쪽 피연산자는 평가하지 않는다
마찬가지로 && 연산자의 경우 왼쪽 피연산자를 평가한 값이 flase면 오른쪽 피연산자는 평가하지 않는다.
이처럼 논리 연산의 식 전체를 평가한 결과가 왼쪽 피연선자의 평가 결과만으로 정확해지는 경우 오른쪽 피연산자의
평가를 수행하지 않는데, 이를 단축 평가 (short sircuit evaluation)라고 한다.
드모르간 법칙
제어식 (no < 10 || no > 99) 를 논리 부정 연산자!를 사용하여 수정하면 !(no < 10 || no > 99) 와 같다.
'각 조건을 부정하고 논리곱을 논리합으로, 논리합을 논리곱으로 바꾸고 다시 전체를 부정하면 원래의 조건과 같다'라는
법칙을 드모르간 법칙(De Morgan's laws)이라고 한다. 이 법칙은 일반적으로 다음과 같이 표현한다.
(1) x && y와 !(!x || !y)는 같다
(2) x||y와 !(!x&&!y)는 같다
○다중 루프
반복 안에서 다시 반복할 수 있으며, 이런 반복을 루프가 중첩되는 수준에 따라 '이중루프, 삼중루프'라고 한다.
package chap01;
// 곱셈표를 출력
public class Multi99Table {
public static void main(String[] args) {
System.out.println("----- 곱셈표 -----");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++)
System.out.printf("%3d", i * j);
System.out.println();
}
}
}
○직각 이등변 삼각형 출력
이중 루프를 응용하면 기호를 늘어놓아 삼각형이나 사각형 모양으로 출력 할 수 있다.
import java.util.Scanner;
// 왼쪽 아래가 직각인 이등변 삼각형을 출력.
public class TriangleLB {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int n;
System.out.println("왼쪽 아래가 직각인 이등변 삼각형을 출력.");
do {
System.out.print("몇 단 삼각형? : ");
n = stdIn.nextInt();
} while (n <= 0);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++)
System.out.print('*');
System.out.println();
}
}
}
-출처: 자료구조와 함꼐 배우는 알고리즘 입문[자바편] 책 중
http://www.yes24.com/Product/Goods/60547893