티스토리 뷰

반응형

2021.10.16 - [코딩 공부/C 언어] - [C언어 기초] 조건문 switch

 

[C언어 기초] 조건문 switch

2021.10.10 - [코딩 공부/C 언어] - [C언어 기초] if ~ else와 else if [C언어 기초] if ~ else와 else if 2021.10.05 - [코딩 공부/C 언어] - [C언어 기초] 조건문 if [C언어 기초] 조건문 if 2021.04.16 - [코딩..

hgu-can.tistory.com


지난 시간까지 C언어의 조건문에 대해 알아봤습니다.
오늘부턴 반복문에 대해 알아볼 것입니다.


1. 반복문이란?


반복문이란 이름에서 유추할 수 있듯이 반복문을 사용해서 컴퓨터에게 어떤 명령을 계속해서 수행하라고 시킬 수 있어요.
지금까지는 오로지 한 번만 시킬 수 있었기 때문에 만약 같은 일을 여러번 시키고 싶으면 같은 코드를 여러번 적어줘야 했어요...
2021년에 뭐 하는?
하지만 반복문을 배우고 나면 손 아프게 같은 코드를 여러번 적을 필요가 없어집니다.
반복문을 실행하는 키워드를 사용해서 한 문장을 계속해서 반복하도록 시킬 수가 있게 되죠.

반복문을 사용하는 키워드에는 크게 두 가지가 있는데
그 중에서도 while문 먼저 배워볼게요!


2. 반복문 while

 


조건식을 평가하여 그 결과가 참일 경우 종속문장(반복시키고 싶은 명령)을 반복해서 실행합니다.

 

while (조건식)
{
	종속문장;
}
다음문장;
.
.
.

 

기본적인 형태는 위와 같습니다. 

 

 

#include<stdio.h>

void main()
{
	int Num = 1;
	while (5 >= Num)
	{
		printf("Hello~~\n");
		Num++;
	}
}

 

그럼 비주얼 스튜디오를 켜서 위와 같이 적어봅시다. 

 

 

 

실행시키면 위와 같이 Hello~~가 5번 출력되는 것을 볼 수 있습니다. 

 

while (5 >= Num)
{
	printf("Hello~~\n");
	Num++;
}

 

5 >= Num 이라는 조건을 통해 

Num이 5보다 작거나 같을 동안에 중괄호 안의 종속문장을 실행해라는 명령을 내린 것입니다. 

5번동안 Num이 1씩 증가되면서 6이 되는 순간 while의 조건을 만족하지 못 하게 되고 반복문이 종료됩니다. 

 


* 여기서 숫자를 앞에 적는 이유는 비교 조건식을 적을 때 실수를 조금이나마 줄이고자 함입니다. 

대소관계 비교에서는 실수가 적지만

== 같은지 아닌지를 비교하는 연산자를 쓸 때엔 가끔 실수로 = 하나만 쓰는 경우가 있습니다. 

만약 if (num == 5) 라는 조건을 확인하고 싶은데,

실수로 if (num = 5) 라고 적으면 이 조건은 실행되지 않습니다. 

num = 5 자체는 조건이 아니니깐요...

하지만 그냥 코드를 썼을 때엔 빨간 줄이 뜨질 않아요. 

 

 

 

컴파일러가 봤을 때 문제는 없는 문장이거든요. 

그래서 만약 코드가 몇백줄씩 되는데 저런 식으로 조건을 잘못 적었다면 문제가 없어뵈는데 왜 원하는대로 동작이 안 되지? 하는 상황이 생기고... 

저 때부터 코드 처음부터 끝까지 뒤져야 됩니다...ㅎ 저런건 잘 보이지도 않아요. 

 

하지만 if (5 = num) 이라 적었다면 

 

 

 

수정할 수 없는 상수에 값을 넣는다는 것은 말이 안 되기 때문에

컴파일러가 바로 오류 표시를 해 줍니다. 

그러면 뭘 잘못 적었는지 한 번에 알 수 있습니다. 

이를 통해 실수를 줄일 수 있죠. 

 

 

 

저기서 =를 하나 더 추가해주면 정상적으로 동작하는 것을 볼 수 있습니다. 

이런 이유로 조건식을 적을 때엔 숫자가 앞에 오도록 하는 것이 좋습니다. 

 


다시 본론으로 돌아와서 

while문을 쓸 때에 주의사항이 있습니다. 

 

 

#include<stdio.h>

void main()
{
	int Num = 1;
	while (5 >= Num)
	{
		printf("Hello~~\n");
	}
}

 

만약 위의 코드처럼 Num을 증가시키라는 문장을 삭제해서 Num을 증가 시켜주지 않는다면 Num은 영원히 1일 것입니다. 

그러면 Num은 영원히 5가 되지 않을테니 반복문도 영원히 반복될 것입니다. 

그 말은 무한루프에 빠져버린다는 뜻이죠...

컴퓨터를 하다 보면 프로그램 응답 없음을 종종 겪어보셨을 것입니다. 

엄밀히 말하면 그 때의 응답 없음과는 좀 다른 상황이긴 하지만

위와 같이 코드를 잘못 작성해서 while문이 종료되지 않는다면 

프로그램은 해당 종속문장을 영원히 실행하면서 다른 행동을 하지 못 하는 것이죠. 

 

그렇기 때문에 반복문을 사용할 때엔 종료 조건을 정확하게 설정해줘야 합니다. 

반복문을 사용할 땐 이것만 기억하시면 됩니다. 

 


3. define

 

while에 대한 기본적인 내용은 끝났지만 토막 상식으로 define이라는 것에 대해서 알아볼게요. 

 

 

#include<stdio.h>
#include<conio.h> //콘솔입출력 헤더파일(getch(),putch())
#define ESC 27

void main()
{
	char ch;
	while (1) //참(1)일 동안 계속 반복하라는 뜻
	{
		ch = getch();//콘솔 입력함수
		if (ESC == ch)
			break;
		else if ('a' <= ch && 'z' >= ch)
			ch -= 32;
		putch(ch);//콘솔 출력함수
		printf("\n");
	}
}

 

위와 같이 쓰고 실행해보면 ESC가 아닌 키들을 누르면 대문자가 출력되다가 ESC를 누르면 프로그램이 종료되는 것을 보실 수 있을 것입니다. 

키보드의 각 키는 아스키 코드의 숫자로 대응되어 있습니다. 

(궁금하시면 아스키 코드 검색)

 

세번째 줄에서 볼 수 있는 것처럼 #define ESC 27 이라고 쓰면 

이제부터 ESC라는 글자는 27로 바꿔서 적용해라 라는 뜻이 됩니다. 

이렇게 쓰는 이유는 27 == ch 라 쓰면 27이 뭐길래 조건을 걸었을까?

한 눈에 알아보기가 힘들어요. 

그렇지만 ESC == ch 라 적으면 입력받은 키가 ESC면 종속문장을 실행하라는 거구나~

보다 쉽게 알 수 있습니다. 

성능에 영향을 주는 것은 없고 좀 더 좋은 가독성을 위해서 많이 씁니다. 

 

하지만 #define도 약간 옛날 스타일이라 요즘 스타일로 쓰면

 

const int ESC = 27;

 

이렇게 const 키워드를 붙여 쓰는 것도 좋습니다. 

const 키워드를 쓰면 이 변수는 더 이상 변수가 아닌 상수로 정의되면서 수정할 수 없는 값이 됩니다. 

 

 

ch = getch();
putch(ch);

 

그리고 중간에 보이는 getch와 putch가 뭔가 싶으실 텐데,

scanf와 printf와 비슷한 기능을 하는데 scanf는 입력받은 뒤 꼭 엔터를 쳐야 변수에 값이 들어갔다면

getch는 엔터를 안 쳐도 값이 바로 변수에 들어가는 함수라고 보시면 됩니다. 

자세한 것은 따로 구글링 해 보시거나 버퍼에 대해 배우고 나면 이해하실 수 있는데 

지금은 버퍼에 대한 것까지는 넘 복잡하니까 그냥 엔터 필요없는 scanf구나 정도로 알고 계시면 됩니다. 

 

putch는 printf처럼 콘솔창에 () 안의 char 변수 값을 출력해주는 함수입니다. 

이건 잘 쓰지를 않아서 그냥 printf 말고도 이런 함수도 있구나 정도로 알고 넘어가셔도 됩니다. 

왜냐면 printf로도 다 되서... putch까지 굳이 쓸 이유가 없었어요...

 


#include<stdio.h>
#define TRUE 1

void main()
{
	int i = 0, j = 0, sum = 0;
	while (TRUE)
	{
		printf("1 ~ 100 사이 수 입력 : ");
		scanf("%d", &i);
		if (1 <= i && 100 >= i)
			break;
		printf("잘못 다시 입력");
	}
	while (j <= i)
	{
		sum += j;
		j++;
	}
	printf("1 ~ %d 누적합계 : %d", i, sum);
}

 

마지막으로 위 코드를 쓰고 실행해보면 

 

 

 

이렇게 입력한 값 까지의 누적 합계를 구해주는 것을 볼 수 있습니다. 

이렇게 반복되는 계산을 할 때 반복문을 쓰면 정말 유용합니다. 

사실 코딩의 절반 이상은 반복문이라고 봐도 되는...

앞으로 계속 코딩 공부를 하시다 보면 반복문을 쓸 일이 정말 많을 거에요. 

 


10 ~ 20 사이의 숫자만 입력 받아 1 부터 입력 받은 수까지의 누적합계를 구하시오

While 을 사용하여 “Hello”를 5번 출력하시오

정수를 반복하여 입력 받아 누적 합계를 구하시오

(입력 받은 정수가 0 일 경우 while문을 종료 후 최종 합계 출력)

입력된 수가 소수인지 판별하는 코드를 작성하시오

입력된 수를 거꾸로 출력 하시오 ( 123 -> 321 )

입력된 수의 각 자리 수 의 총 합계를 구하시오 ( 123 -> 6 )

 

그럼 오늘 공부를 마무리하면서 간단한 문제를 풀어봅시다. 

지금까지 배운 것들과 오늘 배운 while문을 이용해서 충분히 풀 수 있는 문제들입니다. 

최대한 구글링 없이 풀어보시면서 그동안 배운 것을 복습하는 시간을 가지시길 바랍니다. 

피드백이 필요하시면 언제든지 댓글로 남겨주세요. 

그럼 예습복습 열심히 하시고 다음에 또 만나요~~

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함