1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
*************************< 캠퍼스 C 강좌 >****************************
[제목] :
[코드] : campusc1-006 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄
수 있습니다.그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있
습니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
**************************<< 목 차 >>**********************************
<1> 세미콜론 ";" 에 대하여 (단문, 복문)
<2> 제어문 : if , else if , else
<3> while 사용법 (순환문)
<4> do while 사용법(순환문)
*************************< 내용 시작 >*********************************
<1> 세미콜론 ";" 에 대하여 (단문, 복문)
***********************************************************************
세미콜론에 대해서 정식으로 언급하자. C 에서는 "문장(statement)"
이란 용어를 쓴다. 즉 다음에서 세미콜론으로 끝난 줄들이 문장이다.
-------------------------------------
#include <stdio.h>
#define PI 3.141592654
int ii,jj=90;
main()
{
int age ;
age = 10;
while( age < 20) {
printf("No Drink\n");
age++;
}
printf("Beer !");
}
------------------------------------
초보자들은 세미콜론을 붙이는 자리가 혼동될지도 모르겠다. 일단은
크게 안 붙이는 자리를 기억하기로 하자.
1) #include 가 있는 줄
2) #define 이 있는 줄
3) 함수를 "짤 때" 함수 머리와 몸통 사이
4) 함수 형태 예약어인 if(),for(), while(), switch(), do 다음
이 외에는 거의 전부 붙인다고 봐도 좋다. 일반적인 원칙을 적어보
면 다음과 같다.
-----------------------------------------------------
세미콜론은 컴파일러에게 있어서 종지부(마침표)와 같다.
------------------------------------------------------
즉 뒤따라오는 글자와 내용적으로 아무 상관없으니까 여기까지 일단
한 묶음으로 해석하라는 뜻이다. 이런 개념에 입각하면 위의 3) 과 4)의 경
우는 이해가 갈 것이다. 예를 들어 다음 문장
if(a> 0)
a = a+ 1;
이걸 한국말로 하면 "만일 a 가 0 보다 크면 a 에다 1을 더해라" 이
다. 문장 중에 마침표 찍을 자리가 없다는 걸 알 것이다. 그러나 다음 같이
세미콜론을 중간에 찍으면 의미는 달라진다.
if(a> 0); <-- 세미콜론 찍음
a = a+ 1;
한국말로는 다음과 같다
첫째) " 만일 a 가 0 보다 크면 ... 얘기 끝났음."
둘째) " a 에다 1을 더해라."
여기서 1은 "무조건" 더하는 것이다. 즉 아무리 들여 짜기를 해도 내용적으
로 다음과 같다.
if(a> 0);
a = a+ 1;
의도가 달라져 있음을 알 것이다. 따라서 세미콜론의 의미만 알면, 어디다
종지부를 찍어야 할지 이해할 수 있을 것이다.
예전에 블럭(block) { } 를 얘기한 적이 있다. 이 블럭은 문장을 여
러개 묶을 때 쓴다. 이른바 복문이 되면 블럭을 쓴다는 것이다. C 에서도 단
문, 복문이라는 용어를 쓰는데 국어 시간의 그것과 똑같다. ; 이 하나만 있
으면 단문, 여러 개 있으면 복문이다.
***********************************************************************
<2> 제어문 : if , else if , else
***********************************************************************
지난 시간에 다른 함수의 몸통 안에서 baby() 형태를 갖는걸 찾아본
적이 있다. 그때 4개를 외우라고 했는데 이제부터 그것들을 하나씩 이야기
해 보겠다.
if() { while() { for() { switch() {
} } } }
이것은 함수처럼 보이지만 함수가 아니라고 했다. 왜냐하면
if,while,for, switch 는 "제어문"에 쓰이는 예약어들이지, 내 맘대로 쓰는
함수 이름이 아니기 때문이다.
여러 문장들이 블럭안에서 시작되면 자기들끼리 "같은 그룹이라는 표시
로 들여짜기"를 한다는 것을 얘기한 적이 있다.
지금부터 그것이 실제로 적용되기 시작한다. 중괄호 가 열리면 자
동적으로 들여짜기가 시작되는 것을 잠시 보자. 이것을 자꾸 언급하는 이유
는 사소해 보이는 이 법칙이 실제 프로그램 작성및 분석에서는 아주 중요하
기 때문이다.
main()
{
int i,j,k;
i = j + k;
if( i > 0) {
k *= i;
j = k*k;
if(j >0) {
i++;
j--;
}
}
k = i%k;
}
또 단문인 경우도 꼭 들여짜기를 할 것을 권한다. 이것도 비록 한
문장이지만, 어떤 영향을 받고 있다는 가시적인 표현 인 것이다. 즉 아래가
좋은 방법이다.
------------------
if(a > b)
c = c +d;
------------------
아래와 같은 형태는 읽는 사람을 어리둥절케 한다.
----------
if(a > b)
c = c +d;
----------
이와 같이 단문과 복문에서 들여짜기를 하는 경우는 위에 언급한 4
가지뿐이다.
if문 사용법에 대해서는 긴 설명이 필요 없을 것 같다. 다음 말을
if문으로 써 보자.
" 만일 a 가 b 보다 크면 a를 찍고 아니면 b를 찍어라"
C 말로는 다음과 같다.
if(a > b)
putch('a');
else
putch('b');
내용적으로는 어려울 것이 없고 표기법에 익숙하기만 하면 되는데
그 모든 경우의 수가 [117쪽] 아래 표에 나와 있다. 앞으로 프로그램을 직접
짜면서 혹시 혼동되는 부분이 있으면 이 "쪽"을 참조하시길 바란다.
그리고 나중에 큰 프로그램의 분석을 위해서 잠깐 연습해 보자. 지
금 이 정도의 프로그램에는, 아래의 방법을 사용할 필요는 없지만, 프로그램
을 분석할 때는 다음과 같이 시각적으로 프로그램의 각 부분을 확실히 구분
하는 것이 좋은 요령이라는 것을 아시고, 책에 연필로 다음과 같이 네모 box
를 그려보자.
+-----------------------+
| 1) if( a > 0) |
| a = b + c; |
+-----------------------+
2) 번의 경우는 다음같이 그린다.
+------------------------+
| 2) if( a > 0) |
| a = b + c; |
+------------------------+
| else |
| a = b - c; |
+------------------------+
7) 번의 경우는 다음과 같이 될 것이다.
+---------------------------------+
| 7) if( a > 0) |
| +--------------------+ |
| | if(a == 0) | |
| | a = b - c; | |
| +--------------------+ |
| | else | |
| | a--; | |
| +--------------------+ |
+---------------------------------+
| else |
| a--; |
+---------------------------------+
저의 의도를 아시리라 믿는다. 사실은 들여짜기한 것이 위에 우리가
그린 box와 동일한 형태를 가지는 것이지만, 이렇게 직접 네모를 그려 놓으
면 더 "확실히" 눈에 들어온다. 이런 분석법은 프로그램이 복잡해질수록 더
진가를 발휘한다. 이런 방법은 사실상 일종의 요령이고 저의 개인적인 방법
이지만 여러분들은 이 연습을 통해 스스로 들여짜기 및 block의 올바른 사용
법에 더 신경을 써야 된다.
원래 남이 짜 놓은 프로그램을 읽는 것은 귀찮고 짜증스러운 일이
다. 그래서 보통은 분석할 때 눈에 핏발이 좀 서는 법인데 어떤 초보자가 들
여짜기를 잘못해 놓으면 입에서 당장 욕이 나온다.
"어떤 xx 가 이렇게 짜놨어. 이걸 돈주고 배웠어 ! 한심한...."
이건 내가 하는 욕이 아니고 왕년에 내가 들었던 욕이다. 나도 이제
는 이 욕을 써먹으려고 호시탐탐 노리고 있으니까 주의하시고, 또 그래도 신
대세의 조류에 맞게 자기 개성껏 들여 짜기를 하실 분들은 저에게 배웠다는
말씀은 삼가 해 주시길 부탁 드린다.
<숙제> 나머지 경우도 위와 같이 box를 쳐보세요
if의 표현 법칙은 의외로 간단하다.
1) "if" , "else if" , "else"의 조합이다.단 if만 존재할 수는 있어도
else if ,else 만 존재하지는 못한다.(상식)
2) 복문에서는 { } 를 써서 블럭화 한다.
3) 중첩(nesting)이 가능하다 즉 if 또는 else 안에서 또 독립적으로
if,else를 시작할 수 있다.
4) 머리 부분만 봤을 때 [117쪽] 위부분의 표현은 전부 다 옳다.
[117쪽]의 표현들에서도 보다시피 if()의 소괄호 사이 ( ) 안에서
는 무슨 짓을 해도 상관없다. 다만 그 결과가 "0"(거짓) 인가 "0 이외의 값"
(참)인가 하는 사실만 분명히 알 수 있으면 된다.(중요), 이 부분에 형광 펜
으로 표시해 두세요). 이 "참", "거짓"의 문제는 if() 문에만 해당하는 것이
아니고, C에서 "조건"을 따지는 모든 문제에 해당한다.
if의 몸통 문제를 보면, 단문에서 { } 를 해주어도 상관은 없다. 그
러나 { } 를 사용할 자리에 생략을 하는 것은 당연히 error 다. 이런 건 상
식이라고 생각하는데 어떻게 생각하시는지 모르겠다. 간단한 예를 보면,
< 단문 > < 복문 >
if( a > 3) if( a > 3 ) {
a = v + c; a = c + v;
a = d + c;
}
위는 다 옳은 문장이다.그러나 다음을 보자
if( a > 3) { if( a > 3 )
a = b + c; putch('a');
} putch('b');
여기서 왼쪽은 맞다. 그러나 오른쪽은 틀린다. 위 오른쪽의 의도는 들여짜기
로 보아 "만일 a가 3 보다 크면 글자 a 와 글자 b를 찍어라" 이다.그러나 아
무리 들여짜기를 같이 해주었다고 해도 컴파일러는 그것을 상관치 않고 자기
문법에 맞게 아래와 같이 해석한다.
if( a > 3)
putch('a');
putch('b');
즉 "조건이 맞으면 a를 찍는다. 그러나 b는 무조건 찍는다".
의도가 많이 달라져 있음을 알 것이다. 따라서 아주 단순한 경우가 아니라면
무조건 { } 를 쓰는 편이 좋다. 따라서 앞으로 여러분께서도 if(), for(),
while(), switch()만 보시면 "{ }" 부터 찾으려고 하는 습관이 필요하다.
보통 if() 문에서 큰 문제거리가 되는 것은, 위와 같은 "표현법 자
체"가 아니다. 이런 건 여러분도 금새 익숙해 질 수 있을 것이고, 사실은
"문제의 논리적인 분석"이 더 어려운 문제다. 말을 이해할 수 없는 것이 더
큰 문제인 것 같은데 직접 예를 들자.
지난 시간에 내 드린 숙제를 여러분들이 충실히 하셨는지 모르겠는
데, is...() 함수들이 "yes" 라고 대답하는 경우는 교재에 나온 대로 다음과
같다.
isalnum() : A - Z, a - z, 0 - 9
isalpha() : A - Z, a - z
isdigit() : 0 - 9
isgraph() : 0x21 - 0x7e
islower() : a - z
isprint() : 0x20 - 0x7e
isupper() : A - Z
isxdigit() : A - F, a - f, 0 - 9
isascii() : 0x00 - 0x7f
isspace() : 0x09 - 0x0d, 0x20
iscntrl(): 0x00 - 0x1f, 0x7f
즉, 위의 함수들은 "한 바이트" 즉, 256 각형 주사위 중의 한 숫자가 어느
속성에 속하는가 하는 것을 분류하는 함수들이다. 영어 의미 그대로 "아스키
코드냐 ?"를 " isascii() ? "로 묻고 있는 것이다.
이제 한 글자 0x00 을 예를 들어보자. 이것은 위의 함수중 어느 것
에 속하는가 ? 해당하는 함수를 전부 찾는 프로그램은 아래와 같다. 이 문제
를 해결하려면 오늘 배운 if() 만 있으면 충분하다.
-----------------------------------------
main()
{
char ch = 0x00;
clrscr();
if( ch < 0x7f)
printf(" isascii() --> Yes\n");
if( ch < 0x20) {
printf(" iscntrl() --> Yes\n");
if( ch >= 0x09 && ch <= 0x0d ) {
printf(" isspace() --> Yes\n");
}
} else {
+------------------------------+
| < 이 부분이 숙제 임> |
+------------------------------+
}
------------------------------------------
위에서 가장 큰 분류는
1. isascii()인가를 확인하는것 이다.
2. 둘째는 iscntrl() 과 그렇지 않은 부분으로 나누는 것이다.
여기서 0x00을 확인 해 보려면 위의 프로그램으로 충분하다는 것을 알 것이
다.
<숙제>
위의 box 부분을 완성해서 0x30 이 어느 is..() 함수중 어느 것들에 해당하
는지 확인해 볼 수 있는 프로그램을 작성해 보세요.
위에서 어려운 말로 했던 "문제의 논리적인 분석" 이란게 이렇다.문
제를 얼마나 간결하게 정리를 해서 쉽게 if()문으로 구현할 수 있는가 하는
것이 문제지, if()문을 쓰는 표현법이 어렵다는 말이 아니다.이런 문제는 제
가 가르쳐 드릴 만한 문제가 아니다. 여러분의 참신한 머리가 더 잘 하시리
라고 믿는다.
예를 하나 더 들면 if 구문에서 꼭 끼는 게 성적 분류 프로그램이다.
< 숙제>
아래의 프로그램을 좀더 세분하여 점수가
90 - 100 사이 이면 'A'
80 - 89 사이 이면 'B'
70 - 79 사이 이면 'C'
60 - 69 사이 이면 'D'
0 - 59 사이 이면 'F'
가 되도록 고쳐 보라.
-------------------------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char str[10];
int score;
main()
{
clrscr();
while(1) {
printf(" Type your score( 0 for EXIT) : ");
gets(str);
score = atoi(str);
if(score == 0) /* exit */
return;
if(score >= 90 && score <= 100) /* A check */
printf("Grade 'A'\n");
else if(score >= 80 && score <= 89) /*<-- 아래 <문> */
printf("Grade 'B'\n");
else {
printf(" Wrong score \n");
putch(0x07);
}
}
}
--------------------------
<문> 위에 표시한 부분에서 else if(score >= 80 ...) 의 "else if" 대신
(else 를 생략하고) "if"만 써서 if(score >= 80 ...) 라고 쓰면 프로그램은
어떻게 달라지는가 ? 어떤 방법이 더 좋다고 생각되는가 ?
***********************************************************************
<3> while 사용법 (순환문)
***********************************************************************
이것도 약방의 감초 같은 것이다. 뜻은 영어 그대로 "조건이 맞는
동안..".이다. 언뜻 들으면 if 와 비슷한 것 같으나, 지금부터는 소위 말하
는 loop(순환문)이다. if는 조건이 맞거나 안 맞거나 한번 쭉 지나가면 그만
이지만 여기서는 조건을 만족시키지 못하면 평생 거기서 갇혀 살아야 한다.
아무리 빠삐용 같은 탈출 의지가 있어도 허사다.
완전한 사용 법은 [122쪽] 상단의 표이다. 이제 이 사용예를 직접
보자 " age 가 20 보다 작은 한 No Drink " 라고 찍는 프로그램이다.
---------------------------------
main()
{
int age ;
age = 10;
while( age < 20)
printf("No Drink\n");
}
----------------------------------
위를 실행 시켜 보면 어떤 결과가 나타날 걸로 생각하는가 ? 현재 나이 10
살이다. 어떤 영화처럼 이 아이는 안 자란다. 계속 No Drink 다. 또 보자
---------------------------------
main()
{
int age ;
age = 10;
while( age < 20) {
printf("No Drink\n");
age++;
}
printf("Beer !");
}
---------------------------------
복문이 되면서 { } 를 사용한 걸 보라. 그리고 여기서는 애가 자란
다. 처음부터 살펴보면, 나이는 10살부터 시작한다. 조건을 따진다 "20살이
안되었나 ?", "참" 이다. 그러면 while()의 영향력 내로 들어와서 "No
Drink"를 찍는다.
이걸 찍는데 일년이 걸린 모양이다 한 살 올려 주었다. 그리고 다시
올라가서 while(age < 20)을 따진다. 또 처음의 과정을 반복한다.이것이 if
와 다른 점이다. 이와 같이 while 문 안에서 조건을 만족시키는 한(즉 20 살
이 안되면)계속 돈다. 내 생각엔 이래서 "프로그램이 돈다" 고 얘기하는 것
같다. 그리고 문제가 조금 더 복잡해지면 사람도 같이 따라서 도는 수가 있
다.
<문> "No Drink"를 몇 번 찍나요 ?
20 살이 되면 while( age < 20) 조건에 맞지 않는다. 따라서 while()을 빠져
서 while 영향권을 벗어난 블럭 {}의 아래로 내려간다. 그러면 "Beer !" 한
잔 마실 수 있다.
위 예에서 보면,정상적인 while() 문에서는 3 부분이 완비 되야 자기가 원하
는 일을 할 수가 있다는 것을 알 것이다(중요). 자세히 살펴보면,
-----------------------------------------------------------
1. while() 전에 나이가 초기화 되야 한다. : age = 10
2. 조건을 따져 봐야 한다. : while( age < 20)
3. 나이를 올려 줘야 한다. : age++;
------------------------------------------------------------
천천히 음미해 봐야 한다.다음을 또 보자
while(1) while(100)
putch('\a'); putch('a');
위 프로그램은 어떤 결과를 나타내는가 ? C에서는 이런 조건 문을
따질 때 0 이면 '거짓' 그 외의 숫자는 전부 참으로 취급한다.통상 1 이 대
표적으로 '참'을 나타낸다. 따라서 위와 같은 경우는 조건을 따지지도 않고
무조건 "참" 이다. 별일이 없는 한 평생 그 안에서 돌아야 한다. 이런걸 "무
한 루프(loop)" 라고 한다 .
<문제 1> 1 부터 100 까지 더하는 프로그램을 짜 보면 ?
<문제 2> 다음 프로그램의 결과를 머리 속에서 찍어 보고, 화면으로도 찍어
보세요. 결과가 똑 같습니까 ?
main()
{
int i = 1;
clrscr();
while( i <= 24) {
if( i < 10) {
printf("%d\n", i);
} else if( i >= 10 && i < 20) {
printf("%d\n", i*10);
} else if( i >= 20) {
printf("%d\n", i*100);
}
i++;
}
getch();
}
<참고> [123쪽] (예제 2)번에서 "%d" 를 "%ld"로 바꿔서 찍어야 정확함.
***********************************************************************
<4> do while 사용법 (순환문)
***********************************************************************
do- while문의 완전한 사용 예가 [125쪽]에 나와 있다. 형태는
while과 유사하다 그러나 이 문장이 while문 과 다른 점은, 프로그램이 일
단은 do 를 거치고 내려와서 밑에 있는 while 과 비교한다는 것이다. 따라서
이 문장은 처음 내려오는 동안에 무조건 한 살을 더 먹을 수 있다는 것이다.
그 차이밖에 없다. 그리고 실제로 많이 쓰이지는 않지만 쓰면 표현이 아주
간단하게 되는 경우가 있다.
<문제> do while문을 써서 1 부터 100 까지 더하는 프로그램을 짜 보세요.
<문제> 위의 while() 사용법의 <문제2> 를 do while() 으로 고쳐 써 보세요
<문제> [125쪽]의 (예제 1)이 while과 do-while문의 차이를 선명하게 보여줍
니다.이 문제를 직접 풀어보세요.(소스는 따로 제공된 파일에 있음)
****************************< 끝마치며 >******************************
수고 하셨습니다.
***********************************************************************