[C언어] 8.C언어 기초(5)
부제
군대갑니다...
이번에는 제어문 중 반복문을 할 겁니다...
반복문이란 매우 간단합니다. 조건이 참이 될때까지 반복해서 수행해주는 명령어인거죠.
반복문의 문법에는 for 와 while 이 있습니다.
for와 while의 차이는 for는 반복 수행 횟수가 정해져있을때 while은 반복 수행 횟수가 정해져있지 않을 때에 사용합니다.
라고 합니다만 실제로 for로 while의 역할을 못하는것도 아니고 while로 for의 역할을 못하는것도 아닙니다.
for문
for는 기본적으로 for(변수초기화 ; 반복 조건 ; 변수 증가 방법)으로 사용이 되는데요.
여기서 중요한건 각자 조건의 사이에 콤마(,)가 아닌 세미콜론(;)을 사용한다는 점이죠.
예를들어서 위에서 i라는 변수를 선언했다라고 가정을 하였을 경우에
for(i=0;i<9;i++) <- (여기서 i=0이 변수초기화 , i<9 반복조건 , i++이 변수 증가 방법입니다.)
{
printf("%d",i);
}
라고 코드를 적고 실행을 하였다면 0부터 8까지 순서대로 출력이 되겠죠.
여기서 i=1이라고한다면 1부터 출력이되겠죠.
혹은 for(i=9;i>0;i--)
{
printf("%d",i);
}
라고 코드를 적고 실행을 한다면 9부터 1까지 역순으로 실행이 됩니다.
for문에 다중 for문이라고 for문안에 for을 삽입하는 방식이 있습니다.
다중 for문을 제일 처음 배울때 하는게 구구단 만들기인데요.
구구단을 예제로 설명드리겠습니다.
for(i=2;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%d*%d=%d,i,j,i*j)
}
}
실행을 하면 2단부터 9단까지를 출력하는데요. 왜 그러냐면 i는 8번 j는 9번을 실행합니다. j의 조건이 완료되고 j의 반복문을 빠져나와야만 i가 1 증가합니다.
그러므로 i가 2일때 j는 9번을 실행하고 i가 3일때도 j는 9번을 실행하는거죠. 그렇기 때문이 총 8*9 72번의 printf를 실행합니다.
while문
while문은 일반 while문과 do while문이 있는데요. 둘의 차이는 각자 설명하며 말해드리겠습니다.
일반 while문은 while(조건) 처리구문 으로 사용합니다.
예제를 보여드리자면
i=0;
while(i<9)
{
printf("%d",i)
i++;
}
이런식이지요.
위의 for문과 같이 0부터 8까지 출력하는 반복문입니다.
while문에서의 중요한점은 조건이 증가 혹은 감소하는 조건등이 for문과는 다르게 처리구문에 들어간다는 점이죠.
그리고 for문과 다르게 시작할때 초기화를 하지않기때문에 사용 전 초기화를 해주어야합니다.
do~while문은 do 처리구문 while(조건) 으로 사용됩니다.
이 구문이 일반 while문과 다른점은 일반 while문은 조건이 처음부터 맞지않을때에는 반복문의 처리구문을 한번도 실행하지않지만 do ~ while문은 조건이 처음부터 맞지않더라도 조건문이 마지막에 있기때문에 처리구문을 한번은 실행해줍니다.
do~while문도 예제를 보여드리면
i=0;
do
{
printf("%d",i)
i++;
}
while(i<9)
물론 결과는 위의 for이나 while문 같이 0~8까지 출력이 됩니다.
반복문을 사용할때 조심해야할점이 있습니다.
for문과 달리 while문은 얼마나 실행될지 모르는 경우에서 실행하는 경우가 많기때문에, for문보단 while문에서 자주 나오는 오류입니다. for문에서도 안나오는건 아닌데요.
무한루프라고 불리는 오류입니다.
만약 반복문의 조건이 항상 성립하게 만들어버리면 반복문이 계속 끊임없이 실행되는 오류인데요.
예를들어 for(i=1;i>0;i++) 이런식 혹은 while(i<10)을 했는데 조건문에 i++등을 안넣어줬다던지 할때 나오는 오류입니다.
for에서는 i는 0보다 클때 실행인데 i는 계속 증가하는데 0보다 작을 수 없으니 계속 실행되겠죠.
while(i<10)의 경우에는 i가 10보다 작고 조건내에 i++이 없다면 i가 증가하지않으므로 계속 실행이 되겠지요.
허나 이 무한루프를 이용하여 코딩하는 방법도 있습니다. 그러기위해선 아래 2가지의 명령어를 익혀야합니다.
break와 continue
그리고 반복문을 사용할때 중요한 명령어가 2가지 있습니다. break와 continue인데요.
break의 경우에는 그 구문이 실행될때 현재 실행되고 있는 반복문을 강제로 빠져나옵니다.
continue의 경우에는 그 구문이 실행될때 현재 실행되고 있는 반복문의 다음차례를 실행시킵니다.
break
C언어는 말로만 설명하면 이해하기 힘드니 무한루프예제로 보여드리겠습니다.
i=0;
while(1) <- C언어에서 0을 제외한 모든수는 참입니다. 그러므로 while은 조건이 참으로 인식하기때문에 무한루프가 실행이 됩니다.
{
if(i>10)
{
break;
}
printf("%d",i);
}
만약 i가 10보다 크다면 if의 조건이 참이므로 break를 실행하게되고 그럼으로써 의도한 무한루프를 빠져나오게되는 방식입니다.
위의 예제를 보시면 break문이 왜 필요해? 라고 할수 있기때문에 무한루프와 break문을 제대로 활용한 예제를 하나 적어보겠습니다.
int i;
while(1)
{
scanf("%d",&i)
if(i==100)
{
break;
}
printf("%d",i);
}
이런 예제인데요.
반복문이 실행될때 사용자가 숫자를 입력하게하고, 만약 그 숫자가 100이라면 반복문을 끝내고 아니라면 그 숫자를 출력하는 방식입니다.
그럼 for문은 의도적인 무한루프가 안되는가? 라는 의문을 가질수도 있는데요. for문도 물론 무한루프가 가능합니다.
for문에서 조건없이 for( ; ; )라고 실행을 하면 무한루프가 될겁니다.
continue
for(i=0;i<=9;i++)
{
if(i%3==0)
{
continue;
}
printf("%d",i)
}
라고 코딩을 하면 실행을 하면 3의 배수를 제외한 수만 출력이 되는 소스코드가 만들어집니다.
continue는 break와 달리 현재의 반복처리만을 중지시키기때문이죠.
반복문을 학교나 학원에서 제일 처음배우면 반복문에 익숙해지라고 내주는 숙제가 몇가지 있습니다.
1.구구단만들기
2.마름모꼴만들기,피라미드만들기 등등이죠.
여기까지 어느정도 익숙해졌으면 rand라는 랜덤함수를 이용하여 컴퓨터와 간단한 게임도 가능합니다...
(i=rand() 이런식으로 사용하는 함수입니다. 잘 이해가안되면 검색해보면 됩니다. 매우 쉽습니다.)
뭐 컴퓨터가 생각하는 홀짝맞추기하던가...
옛날에 야구게임이라고 출제자가 세자리숫자 생각을 한뒤 맞추는사람이 숫자말하면 스트라이크인지 볼인지 알려줘서 출제자가 생각해낸 숫자를 맞추는 게임이 있었는데요... 이제 직접 코딩짜서 컴퓨터랑 할 수 있습니다. (이 야구게임에 규칙을 추가해 더욱 세세하게 만든게 더지니어스:룰브레이크에서의 진실탐지기입니다.)
이 진실탐지기라는 게임도 만드려하면 만들 수 있습니다.
물론 컴퓨터가 자신의 숫자를 맞추는걸 구현하는게 현재의 상황에선 힘들겠지만... 자신이 컴퓨터의 숫자를 맞추는것만은 구현이 가능합니다.
혹은 내기같은것을 할때 높은 숫자를 뽑는 내기같은것도 구현이 가능하구요.
문자로 주사위도 구현이 가능하고... 여기까지 배웠으면 매우 다양한게 구현이 가능합니다..
프로그래밍책을 사셔서 보셨을 때 파일입출력을 제외하고 모든 프로그램의 기초가 여기까지입니다.
(C언어 기초가 여기까지란게 아닙니다. 여기까지가 모든 프로그래밍의 공통점! 어떤 프로그래밍기초 책을 사더라도 여기까지 명령어만 다를뿐 하는행동은 같습니다.)
여기까지만 알고있어도 어떤 언어든 기초까지는 배우기 수월해집니다. 명령어만 다르지 하는행동은 똑같으니까요.
현재 대부분의 C언어 기초책은 여기서 위에서 말한 파일입출력과 약간의 자료구조(배열,구조체,포인터)를 추가한게 대부분입니다.
아무튼 쉽게 말해서 여기서 자료구조+그래픽을 공부하기 시작하면 나름 프로그래밍 고급과정으로 들어가게되는거지요.
게임 프로그래밍의 기초가 테트리스라고 말하는데... 완전 기초적인 테트리스는 거짓말 하나 안보태고 여기서 그래픽만 공부하고 몇가지 명령어만 더 익히면 만들 수 있습니다.
그리고 약간 고급스러운 테트리스는 약간의 자료구조를 익히면 되니 여기서 그래픽+자료구조를 익히면 만들 수 있게 되는거지요.
참고로 전 게시글에서부터 적었고 이 게시글 시작할때 적었듯이 제가 11.24 입대를합니다... 현재 글을 쓰는 시간으로 따지면 2일후...에 입대합니다... ㅅ.ㅂ...
ㅅ...ㅂ.... 친구들 입대하는거 보면서 웃을때 난 입대안할줄알았는데...
그리고 친구들이 제대를 하는걸 구경도 했는데 이제 걔들한테 제가 놀림을 당하고있습니다.
제가 신체검사를 하면서 팅기지 않고 입대에 성공한다면....
저는 나름 널널한 곳을 갔기때문에 블로그를 운영하려면 충분히 할 수 있을것 같습니다만... 잘모르겠네요.
같은 곳에 간 사람 중 어떤 사람은 일주일에 두세번씩 네이버카페 들어가고있던데...
여기까지 뭐 보신사람이 얼마나 있을지는 모르겠지만... (내 생각엔 20명보면 많이 본거...)
C언어를 조금이라도 배우신분은 별 무리없이 그냥 보셨을꺼고 C언어 자체를 모르셨던분은 그냥 검은건 글자요 하얀건 여백이로다하면서 봤을거라고 생각됩니다.
(솔직히 아무리 C언어 자체가 기초로 독학하기 좋다라는 말을 하곤 하지만 까고 말해서 JAVA보다 컴퓨터쪽에 지식이 없으면 독학하기 힘듭니다. JAVA도 아예 지식없으면 하기힘든데요 뭘...)
원래 그렇게 보는게 정상이구요... 여기까지가 프로그래밍언어의 첫 고비라고 할 수 있습니다.(C언어 수강생이 30명일 경우 기본 15명정도는 여기까지 따라옵니다..많으면 20명정도..)
프로그래밍언어는 처음 글에서 말했다시피 계속 코딩하고 수정하고 코딩하고 수정하고 코딩하고 수정하고가 제일 중요한 작업입니다.
검은건 글자요 하얀건 여백이로다 라고 느끼시는분들도 제가 적은 예제 한번씩 따라 코딩해보고 응용해보고 스스로 피라미드같은걸 만들어보고 문제를 만들어서 풀어보고 하다보면 여기까지는 쉽게 이해가 될꺼라고 생각합니다.
이걸 시작할때 C언어의 꽃이라는 포인터까지는 적는게 목표였고.. 자료구조는 반응보면서 적을까했는데... 조만간 적고 싶긴한데 힘들꺼같네요...
여기까지 보신분이 얼마나 있을지는 모르겠지만 읽어주셔서 감사합니다. (위에서 말했다시피 제 예상은 3명정도나 보지않을까 싶네요 솔직히 많이봐야 20명)
신체검사에서 팅기지않는다면 2~3개월 후 뵙겠습니다...
글쓴분 지금 군대가서 자삭도 못한다그여ㅋㅋㅋㅋㅋㅋㅋ
추천0
[신고]