1071 : [기초 - 반복 실행구조] 0 입력될 때까지 무한 출력하기 1
문제 설명 : https://codeup.kr/problem.php?id=1071
0이 입력될 때까지 출력하는 문제다.
- 제어문을 배운다.
- 제어문 중 goto문을 배운다.
- goto문을 사용하면 간단한 반복 실행을 만들 수 있다.
goto문은 break문처럼 특정 위치로 프로그램의 흐름을 '즉시'변경한다.
break문은 대상 위치가 문법적으로 제한된 상태이고 변경할 수도 없다. 또한 switch문과 반복문으로 사용이 제한된다.
반면에 goto문은 사용자가 레이블로 명시한 위치면 어디든 이동할 수 있다. 따라서 아무 제한 없이 코드의 흐름을 변경할 수 있다.
이것이 장점처럼 보이지만, 사실은 매우 심각한 단점이다. 코드의 흐름을 뒤죽박죽으로 만들어서 논리적으로 심각한 결함이 있음에도 불구하고 해결하기 어려운 상태가 되도록 할 가능성이 높기 때문이다.
goto문을 사용하면 코드의 흐름과 구성을 예측하는 것이 매우 힘들어진다. 이런 이유로, 만은 사람들은 goto문을 사악한 코드(evil code)라고 부르며 절대 사용하지 말라고 한다.
제어문, 반복문은 헷갈리기 쉽다.
그러므로 코드가 어떻게 돌아가는지를 자세히 설명해 정답을 보여주기보다는 주석으로 코드가 어떻게 돌아가는지 설명한다.
#include <stdio.h>
int main()
{
int x;
replay:
// 레이블은 콜론(:)으로 끝내고, 일반적으로 들여 쓰기를 하지 않는다. goto문으로 이동할 수 있는 지점.
scanf("%d", &x);
if(x != 0) // if문 x가 0이 아닐 때 밑 구문을 실행.
{
printf("%d\n", x); // x를 출력
goto replay; // 레이블로 이동
} // x가 0이면 if문을 빠져나가 소스코드가 끝남.
return 0;
}
1072 : [기초 - 반복 실행구조] 정수 입력받아 계속 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1072
몇 번 입력받을지를 입력받아 그 수만큼 계속 출력하는 문제다.
- 제어문을 배운다.
- 제어문 중 goto문을 응용한다.
- goto문을 사용하면 간단한 반복 실행을 만들 수 있다.
1071에서 배운 goto문을 응용해 반복 실행구조를 만든다.
goto문을 만나서 위에 있는 레이블로 다시 올라가는 구조가 되기 때문에 반복 실행이 된다.
#include <stdio.h>
int main()
{
int x, y;
scanf("%d", &x); // 정수를 입력받아 x에 저장
replay: // 레이블, goto문으로 이동할 수 있는 지점.
scanf("%d", &y); // 정수를 입력받아 y에 저장
if(x-- != 0) // if문 x가 감소 연산자를 만나서 0이 아닐 때 밑 구문을 실행
{
printf("%d\n", y); // y를 출력 후 개행.
goto replay; // goto문 레이블로 이동, x의 값 1만큼 감소
}
// if문의 조건식이 0이면 if문을 빠져나옴
return 0;
}
1073 : [기초 - 반복 실행구조] 0 입력될 때까지 무한 출력하기 2
문제 설명 : https://codeup.kr/problem.php?id=1073
0이 입력될 때까지 계속 출력하는 문제다.
- 반복문을 배운다.
- 반복문 중 while문을 배운다.
1024에서 잠시 언급한 반복문을 자세히 배운다.
반복문에는 while문과 for문이 있다.
반복문은 일정구간의 코드를 연속적으로 반복해 실행하는 제어문이다.
프로그래밍에서 '반복'은 매우 중요한 의미다. 사람이 할 귀찮을 일을 기계가 대신 실수 없이 반복하는 것이 업무 전산화의 목표 중 하나이기 때문이다.
반복문이 반복 대상 코드를 반복하여 수행하는 것을 '돈다'라고 표현한다.
'반복문을 3회 수행한다'는 말도 쓰지만 '반복문이 세 번 돈다'는 표현도 사용한다.
표현이 어찌 되었건 이 두 표현에는 중요한 공통점은 반복 횟수다. 반복문에서 가장 중요한 것이 바로 반복 횟수다. 경우에 따라 횟수보다는 조건만 따지기도 한다. 그리고 횟수든 조건이든 더 중요한 점은 반복을 멈추기 위한 조건식이다.
while문의 기본 구조
while(조건식)
{
// 조건식이 참일 때 실행하는 구문
}
조건에 기반을 둔 while문의 문법구조는 if문과 차이가 없다.
그러나 while문은 if문과 달리 반복문이다.
내부 구문이 끝나면 그다음으로 그냥 넘어가는 것이 아니라 디시 구문의 처음으로 돌아가 조건식을 확인한다.
그리고 조건이 참이면 계속해서 구문을 실행한다. 이 반복이 끝나는 시점은 조건식의 결과가 거짓이 되는 때다.
#include <stdio.h>
int main()
{
int x = 1; // 처음 조건 검사를 넘어가 위해 0이 아닌 값
while (x != 0) // while문 x가 0이 아닐 때 밑 구문을 실행
{
scanf("%d", &x); // 입력받아 x에 저장
if(x != 0) // 이때 x가 0이 아니면 밑 구문을 실행
printf("%d\n", x); // x를 출력
}
return 0;
}
1074 : [기초 - 반복 실행구조] 정수 1개 입력받아 카운트다운 출력하기 1
문제 설명 : https://codeup.kr/problem.php?id=1074
정수를 입력받아 카운트다운을 출력하는 문제다.
- 반복문을 배운다.
- 반복문 중 while문을 배운다.
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x); // 정수를 입력받아 x에 저장
while(x != 0) // x가 0이 아닐 때 밑 구문을 실행
{
printf("%d\n", x--); // x를 출력 후 개행한다. x를 1 감소한다.
}
return 0;
}
1075 : [기초 - 반복 실행구조] 정수 1개 입력받아 카운트다운 출력하기 2
문제 설명 : https://codeup.kr/problem.php?id=1075
정수를 입력받아 한 줄에 하나씩 0이 될 때까지 출력하는 문제다.
- 반복문을 배운다
- 반복문 중 whil문을 배운다.
1074에서는 5를 입력했을 때 5부터 1까지 출력하는 문제였다.
이번 문제는 입력한 수에서 1을 줄여 0까지 출력하는 문제다.
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x); // 정수를 입력받아 x에 저장
while(x != 0) // x가 0이 아닐 때 밑 구문을 실행
{
x--; // x를 1 감소
printf("%d\n", x); // x를 출력
}
return 0;
}
1076 : [기초 - 반복 실행구조] 문자 1개 입력받아 알파벳 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1076
a부터 입력한 문자까지 순서대로 출력하는 문제다.
- 반복문을 배운다
- 반복문 중 do while문을 배운다.
do while문은 while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭 { }의 순서를 바ㅜ꺼놓은 것이다.
그래서 while문과 반대로 블럭 { }을 먼저 수행한 후에 조건식을 평가한다.
do while문은 while문이나 for문과 달리 반복 대상 단위 코드를 조건과 상관없이 일단 한 번은 실행한 후, 조건을 비교한다.
따라서 반복 대상 코드가 아예 실행되지 않는 일은 없다. 문법적으로 매우 특이한 컷은 조건식 괄호 뒤에 세미콜론( ; )이 붙는다.
#include <stdio.h>
int main()
{
char input, t = 'a';
scanf("%c", &input); // 문자를 입력받아 input에 저장
do // 실행 후 while문으로 이동
{
printf("%c ", t); // 변수 t를 출력
t++; // 변수 t를 1 증가
}while (t <= input); // t가 input보다 작거나 같을 때까지 반복
return 0;
}
1077 : [기초 - 반복 실행구조] 정수 1개 입력받아 그 수까지 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1077
정수를 입력받아 그 수까지 출력하는 문제다.
- 반복문을 배운다.
- 반복문 중 for문을 배운다.
for문과 while문은 반복문이라는 점에서 같지만, while문은 조건에 기반을 둔 측면이 강하고 for문은 계수에 기반을 둔 측면이 강하다.
계수에 기반을 둔 반복을 while문으로 기술할 경우 반복 자체를 위한 코드가 세 부분임에도 문법상으로는 조건식만 기술하면 된다.
이 때문에 중첩된 반복문을 구현할 때 계수기 증감식 코드를 빼먹거나, 반복문 내부에 반드시 기술되어야 하는 증감식을 깜빡해버리는 실수를 할 가능이 있다.
그러나 for문은 그 세 가지 요소를 모두 한 행에 기술하도록 강제하는 문법이다.
반복 횟수에 영향을 주는 초기화, 조건식, 증감식의 코드를 모두 한 행에 확인할 수 있기 때문에 단 한 줄의 코드만으로도 for문을 몇 회 반복 수행하는지 명확히 알 수 있다.
for문의 기본 구조
for(초기화; 조건식; 증감식)
{
// 수행할 구문
}
for문의 수행 순서
- 초기화
- 조건식
- 수행할 구문
- 증감식
for문의 수행 순서에 대한 부연설명
1. 초기화
반복문에 사용될 변수를 초기화하는 부분이며 처음에 한 번만 수행된다. 보통 변수 하나로 for문을 제어하지만, 둘 이상의 변수가 필요할 때는 콤마', '를 구분자로 변수를 초기화하면 된다. 단, 두 변수의 타입은 같아야 한다.
for( int i = 1; i <= 10; i++) // 변수 i의 값을 1로 초기화
{
//수행할 구문
}
for(int i = 1, j = 0; i <= 10; i++) // int타입의 변수 i와 j를 선언하고 초기화
{
// 수행할 구문
}
2. 조건식
조건식의 값이 참(True)이면 반복을 계속하고, 거짓(False)이면 반복을 중단하고 for문을 벗어난다.
for의 뜻이 '~하는 동안' 이므로 조건식이 '참인 동안' 반복을 계속한다고 생각하면 쉽다.
조건식을 잘못 작성하면 블럭 { } 내의 문장이 한 번도 수행되지 않거나 무한반복에 빠지기 쉬우므로 주의해야 한다.
for(int i = 1; i <= 10; i++) // 'i <= 10'가 참인 동안 블럭 { } 안의 문장들을 반복
{
// 수행할 구문
}
3. 수행될 구문
for문 안에 있는 구문들이 수행된다.
4. 증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다. 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다. 변수의 값을 1씩 증가시키는 연산자 '++'가 증감식에 주로 사용되지만, 다양한 연산자들로 증감식을 작성할 수도 있다.
for(int i = 1; i <= 10; i++) // 1부터 10까지 1씩 증가
{
// 수행할 구문
}
for(int i = 10; i >= 1; i-) // 10부터 1까지 1씩 감소
{
// 수행할 구문
}
for(int i = 1; i <= 10; i += 2) // 1부터 10까지 2씩 증가 i += 2는 i = i +2와 같다.
{
// 수행할 구문
}
for(int i = 1; i <= 10; i *= 3) // 1부터 10까지 3배씩 증가 i *= 3은 i = i * 3과 같다.
{
// 수행할 구문
}
for문의 부연설명을 보면 수행 순서에 대해 쉽게 이해할 수 있다.
#include <stdio.h>
int main()
{
int i, j;
scanf("%d", &j); // 정수를 입력받아 j에 저장
for(i = 0; i <=j; i++) // 변수 i의 데이터형을 위에서 초기화했기 때문에 데이터형을 생략
{ // i는 0부터 j까지 반복할 때 밑 구문을 실행하고 i를 1 증가 시킴
printf("%d\n", i); // i를 j이하일 때까지 출력
} // i가 j 초과되었을 때 for문을 빠져나감
return 0;
}
'CodeUp 기초 100제 > C' 카테고리의 다른 글
CodeUp[코드업] C언어 1086 ~ 1092 : [기초 - 종합] (0) | 2019.12.09 |
---|---|
CodeUp[코드업] C언어 1078 ~ 1085 : [기초 - 종합] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1063 ~ 1070 : [기초 - 삼항연산] ~ [기초 - 조건/선택 실행구조] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1053 ~ 1062 : [기초 - 논리 연산] ~ [기초 - 비트단위 논리 연산] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1047 ~ 1052 : [기초 - 시프트 연산] ~ [기초 - 비교 연산] (0) | 2019.12.08 |
댓글