본문 바로가기
C언어

야메 C언어 강좌: 7. while문과 for문

by 케찹이 2020. 4. 29.

이번 강좌에선 조건문의 꽃이라고 할 수 있는 while문과 for문에 대해서 알아보도록 하자.

 

while문과 for문이 조건문의 꽃이라고 부를 수 있는 이유는 바로 '반복'이란것에 있다. 대부분의 컴퓨터 작업에서 반복은 빼먹지 않고 거의 필수로 존재한 작업이다. 특히 기계라는 것의 제일 독출난 특징이 바로 반복이지 않겠는가. 우리가 비록 앞에서 많은 내용들을 다루었지만 이 while문과 for문을 배우면 반복이란 기능을 통해 더욱더 많은 기능의 코드를 만들어 낼 수 있다. 그럼 while문 부터 살펴보자.

 

#include<stdio.h>

int main(){
	int a;
	int b = 0;
	printf("a의 값을 입력해주세요 : ");
	scanf("%d",&a);
	
	while(a!=b){
		a-=1;
	}
	
	return 0;
}

위 코드에서 a의 값을 입력 받고서 while문으로 들어가게 된다. while문에서는 대괄호 안의 일을 소괄호 조건을 만족할 때 계속해서 반복시행이 된다. 

while(실행조건){
	........
    명령어들....
    ........
}

만약에 a에 10의 값을 입력하게 된다면 b의 값은 0이므로 while문에 들어가게 되면 a != b, 10과 0이 같지 않으므로 while문안의 명령들을 실행한다. 10에서 1을 빼 a는 9가 되고 9는 0과 같지 않으므로 다시 실행한다. 이걸 a가 0이 될때까지 실행하면 a와 b는 드디어 같은 값이 되어 while문을 빠져나오게 된다. 실제로 while문을 빠져나오고 a값을 출력하게 되면 0이 출력될것이다. 

 

그런데 만약에 우리가 a에 0보다 작은 변수들 예를 들어 -1을 집어 넣게 되면 어떻게 될까? 그렇게 되면 a와 b는 같지 않아서 while문 안의 명령어를 실행하게 될것이고 a의 값은 계속해서 -1을 더하게 된다. 그럼 결국에 a와b는 같아지는 일이 없어질 것이고 while문안의 명령어들이 무한대로 실행될 것이다. 이를 코드로 실행시키면 굉장히 곤란한 결과를 보게 될것이다....

그것을 방지하기 위해서 break라는 명령어가 있다. break는 이런 반복문을 탈출하게 해주는 명령어이다. 

#include<stdio.h>

int main(){
	int a;
	int b = 0;
	printf("a의 값을 입력해주세요 : ");
	scanf("%d",&a);
	
	while(a!=b){
	    if(a<0){
        	break;
        }
    	a-=1;
	}
	
	return 0;
}

위의 코드에서는 a가 0보다 작았을 때 break라는 구문을 넣어주었다. 이렇게 되면 a의 값에 음수가 들어왔을 때 if문에 들어가 break를 만나 while문을 탈출할 수 있게 된다. 

 

break문을 배웠으니 이와 비슷한 성질인 continue문도 배우고 넘어가겠다. 

#include<stdio.h>

int main(){
	int a;
	int b = 0;
	printf("a의 값을 입력해주세요 : ");
	scanf("%d",&a);
	
	while(a!=b){
    	if(a % 5 == 0){
        	a-=2
        	continue;
        }
		a-=1;
	}
	
	return 0;
}

continue의 기능은 continue를 만나게 되면 밑의 명령들을 실행하지 않고 처음 반복문으로 돌아간다. 그러니까 위 코드에서 a값이 5의 배수(a % 5 ==0)이면 a-=1을 실행하지 않고 처음 while문의 실행조건으로 가서 다시 while문을 실행시키는 일을 하고 있다. 

 

여기서 do-while문도 간단히 얘기하도록 하자. do-while문은 while문과 거의 똑같지만 그저 형식만 조금 바뀐 while문이라고 생각하면 편하겠다. 

#include<stdio.h>

int main(){
	int a;
	int b = 0;
	printf("a의 값을 입력해주세요 : ");
	scanf("%d",&a);
	
	do{
		a-=1;
	}while(a!=b!);
	
	return 0;
}

 

 

그럼 이어서 for문에 대해서 얘기해보도록 하자. for문 역시 반복문의 한 종류이며 솔직히 while문을 사용하던 for문을 사용하던 모두 코드 작성자의 마음이다. 

 

#include<stdio.h>

int main(){
	int a= 10;
	
	int i;
	for(i=0;i<a;i++){
		printf("i의 값은 %d\n",i);
	}
	
	return 0;
}

for문의 형식은 while과 비슷하지만 실행조건에서 for문은 세가지를 입력해야한다. 

for(초기식;조건식;증감식){
	명령어...
    .....
}

처음 초기식에는 변수하나의 처음값을 설정해주는 것이다. 반복문을 사용하면 몇번째에서는 반복을 그만시키기 위해 많이 사용하는 변수를 설정해준다. 그 변수의 초기식을 설정해준다고 생각하면 된다. 조건식은 for문을 실행시키는 조건을 생각하면된다. 증감식은 변수의 증가 혹은 감소값을 한번 반복할 때마다 얼마나 변화시키냐를 정해준다. 

위 for문 코드를 보게 되면 모두 i를 기본으로 for문의 실행조건을 맞추었다. i의 초기값은 0을 설정해주었고 0은 항상 a보다 작아야하고 for문이 한번 반복될때마다 i의 값은 1씩 증가해주어야 한다. 

 

굳이 for문을 사용할때는 하나의 변수에 대해서 초기식, 조건식, 증감식을 맞출필요는 없다. 초기식은 i에대해서, 조건식은 j에 대해서, 증감식은 k에 대해서 사용하여도 된다. 그리고 for문에선 초기식 조건식 증감식을 쓰지 않아도 for문이 실행가능하다. 예를 들어서 증감식을 쓰지 않아도 for문은 사용 가능하다.

for(i=0;i<a;){
	....
    break문이 없다면 무한으로 실행이 되겠다.
}

하지만 for문 괄호안의 세미콜론 만큼은 빼먹으면 안된다. 이렇게 for문에 조건을 부여하지 않게 되면 거의 while문과 다를 바가 없게 된다. 

 

 

우리가 앞에서 배운 while문과 for문 모두 중복해서 사용이 가능하다. 중복해서 사용하게 되면 머리는 좀 아플수도 있겠지만 굉장한 코드들을 만들어 낼 수 있게 된다. 

#include<stdio.h>

int main(){
	int input;
	scanf("%d",&input);
	
	for(int i=1;i<=input;i++){
		 for(int j = 1;j<i+1;j++){
		 	printf("*");
		 }
		 printf("\n");
	}
	
	return 0;
}

 

위 코드는 숫자를 입력하게 되면 그 숫자만큼의 별을 피라미드 형식으로 출력하는 코드이다. 처음 for문은 몇줄의 피라미드를 만들지 정해주고 그 다음 줄의 for문은 각줄애 몇개씩 *을 출력하는지 판단해주는 for문이다. 

조금만 생각해보면 그리 어렵지 않은 코드이다. 

 

for문은 그리 어렵지 않은 문법이나 처음 접하게 되면 어렵게 느껴질 수도 있다. 그래서 여러분들이 for문과 조금은 친해지길 바라면서 몇가지 연습문제를 남겨두겠다. 항상 모르는 것이 있으면 댓글에 글을 남겨주고 내 설명이 부족하다고 느끼시면 댓글에 남겨주시길 바랍니다. 

 

 

연습문제 

 

1. for문을 사용하여 구구단을 작성해보세요!(1단에서 9단까지) for문을 두번 사용해서 풀으셔야 합니다. 

 

2. 제가 만든 피라미드는 어떻게 보면 진짜 피라미드가 아니죠. 진짜 피라미드를 만들어 보세요!

이런식으로 말이죠!!!

 

댓글