1580, 9/79 회원가입  로그인  
   geniusevil
   http://www.cyworld.com/01028852864
   geniusevil의 가벼운 c언어 배우기 3

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=456 [복사]


댓글에서 저의 경솔함을 느끼고 삭제한후 다시 올립니다.
댓글을 보시고 기분나쁘셨던 분들께 죄송하고..    '--;' 님에게 사과드립니다.
그리고 약간의 글 수정도 했습니다. 문제가 된다면 다시 지적해주시면 감사하겠습니다



---------------------------------------------------

오늘도 geniusevil의 가벼운 C언어를 이어나갑니다 ^^

3일째입니다. 2일째를 안보고 오신분은 1일째,2일째 다 보고 오시길..

어제 배운 내용 요약해보도록 하지요.

- 2일째 내용 요약 -

변수유형        키워드                범위

정수                int(2바이트)        -32768 ~ 32767

short정수        short(2바이트)        -32768 ~ 32767        

긴 정수                long(4바이트)        -214748368 ~ 214748367

문자                char(1바이트)        -128 ~ 127

부호없는정수        unsigned int        0 ~ 65535

부호없는문자        unsigned char        0 ~ 255

부호없는긴정수        unsigned long        0 ~ 4294967295

단정도부동소수점 float(4바이트)        1.2E-38 ~ 3.4E38^1

배정도부동소수점 double(8바이트) 2.2E-308 ~ 1.8E308^2

변환지정자
%d         정수 (int,short)

%ld         긴 정수 (long)

%f         부동소수점 (float)

%lf        배정도부동소수점 (double)

%c        문자 한개 (char)

%s        문자열 (char의 배열)

%u        부호가 없는 정수 (unsigned int)

%lu        부호가 없는 긴 정수 (unsigned long)

scanf() : 사용자로부터 입력을 받는 함수.

if() : 조건문이 참이면 {} 안을 실행한다
else if() : if가 거짓이고 else if 조건문이 참이면 {} 안을 실행한다
else () : 둘 다 거짓이면 else를 실행한다

기호상수 : #define 상수명 상수값  ,  const int 상수명 = 값;
상수 값을 상수명으로 정의한다.

--------------------------------------------복습끝.

2일째에서 덧셈,뺄셈,곱셈,나눗셈중 무얼 할까 선택했던것을 기억하나요? :)
if를 이용해서 sep이라는 변수에 담긴 숫자에 따라 1이 저장되어있으면 덧셈, 2가 저장되어있으면 뺄셈 이런식으로 선택을 했지요.

그런데 c언어에는 이런 선택 역할을 해주는 함수가 있답니다. switch 함수지요.
if는 switch문에 비해 가독성 및 보수 면에서 비효율적입니다. 가독성이란 프로그램 소스를 보는 사람들이 보고 이해하기 쉬운것입니다
가독성면에서 switch가 효율적이라 할수있지요.

어제 했던 계산기 예제를 switch를 사용해서 만들어보겠습니다.

아참! 숙제도 냈었죠? 나눗셈의 답을 소수점으로 출력하기 그것의 답도 여기서 나옵니다 ^^

예제5
   0: #include <stdio.h>
   1:
   2: main()
   3: {
   4:         int sep;
   5:         float first, second, dival;        //처음값,둘째값,나머지를 소수형 변수로 선언
   6:         float val;         //나올 값을 소수형 변수로 선언
   7:
   8:         printf("--------------------------------------\n");
   9:         printf("두수 계산기입니다. 계산방식을 고르세요\n");
  10:         printf("덧셈:1  뺄셈:2  곱셈:3  나눗셈:4  ->");
  11:         scanf("%d", &sep);
  12:         printf("--------------------------------------\n");
  13:
  14:         printf("첫번째 수를 입력하세요 ->");
  15:         scanf("%f", &first);
  16:         printf("두번째 수를 입력하세요 ->");
  17:         scanf("%f", &second);
  18:
  19:         printf("\n");
  20:
  21:         switch (sep)
  22:         {
  23:         case 1 :
  24:                 val = first + second;
  25:                 break;                // switch함수는 케이스안에 break를 넣어줘야한다.
  26:         case 2 :
  27:                 val = first - second;
  28:                 break;
  29:         case 3 :
  30:                 val = first * second;
  31:                 break;
  32:         case 4 :
  33:                 val = first / second;
  34:                 break;
  35:         }
  36:         printf("--------------------------------------\n");
  37:         printf("답은 %.1f입니다.", val);      // float형 변수를 소수점 1자리까지 출력
  38:         printf("\n--------------------------------------\n");
  39: }

프로그램 설명 : 소수점이 출력되고 스위치를 사용한 두 수 계산기

21행 - 35행까지가 switch함수입니다 ^^
switch (선택받은 번호가 들어있는 변수)
{                         // 중괄호로 switch 함수의 범위를 지정한다
        case 번호 :
        내용
        break;
        case 번호 :
        내용
        break;
}

식으로 쓰입니다. 번호 부분엔 char함수로 된 글자가 들어갈수도 있습니다.

선택받은 번호가 들어있는 변수에 2가 들어가있다면. case 2 : 를 찾아가서 case 2의 내용을 실행한 후 break; 문을 만나서 빠져나오게 됩니다.

break;문은 switch문과 친구라고 할수있습니다. 거의 언제나 붙어다니지요.
switch는 객관적으로 보면 case 번호: 의 내용만 실행하는게 아니라 case 번호의 위치로 이동한다고 할 수 있습니다. 이동해서 아래로 내려가면서 다 실행된다면 스위치 기능이 아니지요. 예제5를 예로들면 case 2가 선택됐다면 case 2부터 case 3 case 4가 다 실행되겠지요. 그럼 스위치 문의 기능이 아닌 반쪽 짜리리 기능이됩니다.

그것을 스위치로 만들기 위해 break;가 들어갑니다. break;의 기능은 '중괄호를 빠져나간다' 입니다.

예를들어 case 2가 선택되서 case 2를 실행하고 break;를 만나서 switch문의 중괄호를 빠져나가면 case 2만 실행되겠지요.


37행에서 val 변수를 출력하는 변환지정자가 조금 이상하죠 ^^? %.1f는 처음보는건데.. 하시는분 계시겠지요.
%.1f는 '소수점 1자리 까지 출력하라' 라는 명령입니다. 변환지정자의 특수기능은 아래 꼭 외워야할것! 에서 설명합니다.

이해 하시겠죠.. ? ^^

.
.
.
.
.

- 꼭 외워야 할 것! -

변환지정자의 특수옵션

%4d - 칸을 4칸으로 잡는다        출력 예: '  11'

%-4d - 칸을 4칸으로 잡고 왼쪽정렬 한다          출력 예: '11  '

%09 - 전체 칸을 9칸으로 잡고 빈공간을 0으로 채움     출력 예: '000000011'

%+d - 부호붙임                 출력 예: '+11 , -11'

%.2f - 소수점 이하 2자리 출력                출력 예: '5.43'

%7.2f - 칸을 7칸으로 잡고 소수점 2자리 출력         출력 예: '    5.43'






음.. 이제 선택문도 끝났고.. 반복문이라는것이 있습니다.
조건이 참일때에 내용을 실행하고 다시 조건을 검사해서 참이면 다시 실행하는 함수인데요.
while, for, do while등이 있습니다.

예제 6
   0: #include <stdio.h>
   1:
   2: main()
   3: {
   4:         int val, i;
   5:
   6:         printf("100 이하의 숫자를 입력하시오");
   7:         scanf("%d", &val);
   8:
   9:         if (val > 100)
  10:                 val = 100;
  11:
  12:         printf("\n");
  13:
  14:         i = 1;
  15:
  16:         while (i <= val)
  17:         {
  18:                 printf("%d ", i);
  19:                 i++;
  20:         }
  21: }

프로그램 설명 : 최대값을 입력받고 그 이하의 자연수를 모두 출력한다.

14행 - 20행을 보시면 while문의 사용법을 아실겁니다.
while(조건문)
{
        내용
}                     // 다시 조건문으로 가서 검사

이런식으로 쓰는데 조건문이 참이면 내용을 실행하고 또 다시 조건문을 검사합니다.
그런식으로 조건문이 거짓이 될때까지 계속 실행이 되지요.

위 프로그램을 예로 들면 14행에서 i에 1을 담았지요. 그리고 while문에 와서

그런데..

  14:         i = 1;
  15:
  16:         while (i <= val)
  17:         {
  18:                 printf("%d ", i);
  19:                 i++;
  20:         }

요 문장을 딱 두줄로 해결하는 방법이 있습니다.

바로 for문을 쓰면되지요.

for (i=0; i<=val; i++)
{
        printf("%d ", i);
}

이렇게 쓰셔도 똑같은 효과를 발휘합니다.

for문은
for(초기식; 조건문; 증가식)
{
        내용
}

으로 구성이 되는데 초기식은 i = 0; 처럼 변수에 값을 배정하는 문입니다.
조건문은 i < 10; 처럼 비교문처럼 조건이 참이면 중괄호 {} 안의 내용을 실행합니다.

중괄호 안을 실행하고 나서 증가식을 실행하는데 증가식은 i++ , --a등과 같이 1을 증가시키는 연산이 들어갑니다.

증가식 후에 다시 조건문을 검사해서 조건이 참이면 또 중괄호 {}안의 내용을 실행합니다. 이것이 반복되다가 조건문이 거짓인 경우를 만나면 건너뛰게 되는 것이지요.

i = 1;
while (i <= val)
{
        printf("%d ", i);
        i++;
}



for (i=0; i<=val; i++)
{
        printf("%d ", i);
}

는 같습니다.

이해 가시겠죠 ^^?





예제7
   0: #include <stdio.h>
   1: #include <conio.h>
   2:
   3: main()
   4: {
   5:         int sel;
   6:         char a;
   7:         do
   8:         {
   9:                 printf("종료 할것인지 말것인지 묻는 소스\n");
  10:                 printf("y,Y를 누를경우 재시작, n,N을 누를경우 종료\n");
  11:                 printf("그 외 나머지 키를 누르면 재질문\n");
  12:                 do
  13:                 {
  14:                 sel = 2;
  15:                 printf("\n계속 하시려면 Y , 끝내시려면 N을 누르세요\n ->");
  16:                 a = getch();
  17:                 putch(a);
  18:                 printf("\n");
  19:                 } while (a != 'Y' && a != 'y' && a != 'N' && a != 'n');
  20:                 if (a == 'Y' || a == 'y')
  21:                         sel = 1;
  22:                 else if (a == 'N' || a == 'n')
  23:                         sel = 0;
  24:                 } while (sel == 1);
  25: }

프로그램 설명 : 계속 할것인지 끝낼것인지 묻고 그에따른 행동을 하는 프로그램

주의! : getch와 putch의 사용방법의 미묘한 차이를 헤깔리지 않도록 노력한다.

이번에 배울 내용은 반복문의 마지막인 do while입니다.
do while 은 do의 중괄호 {}의 내용을 한번 실행하고 아래의 while에서 조건을 검사한 뒤 참이면 재실행, 거짓이면 넘어갑니다.

while과의 차이점은 while은 처음부터 조건을 검사하고 실행,비실행 유무를 결정하는것에 비해 do while은 적어도 한번은 실행된다는 점입니다.

위의 소스를 보면 do while의 사용법을 대충 터득하실수 있을텐데요.

7행 - 24행 까지가 do while입니다. 그런데 do while안에 또 do while이 있지요? 이런것도 가능하답니다.

일단 어려우실수 있으니 하나하나 해석해보도록 하겠습니다.

일단 7행에서 do를 만나서 괄호 안으로 들어간 뒤 printf의 내용을 출력합니다.

그리고 12행에서 do를 만나서 괄호 안으로 들어갑니다. sel이라는 변수에 2를 집어넣고 printf함수를 만나 질문을 출력합니다.

그리고 getch()함수로 a의 값을 받는데요.
getch()함수는 글자나 숫자를 한개 받는 함수입니다. a = getch(); 라고 하면 문자나 숫자 하나를 받아서 a 변수에 넣는것이지요.
여기서는 y나 n을 받는 역할을 합니다.

그리고 그 아래 putch(a);는 a변수의 내용을 출력합니다. 그 이유는 getch()의 경우 사용자가 입력한 값을 모니터에 보여주지 않기 때문에 사용자가 뭘 눌렀는지 모르는 경우가 있거든요. 그것을 방지하기 위해 putch();함수를 써줍니다.

그리고 do 문이 끝나고 while 조건문에서 여기 부분 중요합니다!

a != 'Y' && a != 'y' && a != 'N' && a != 'n'

이것을 해석하면 a는 'Y'와 같지 않고 그리고 a는 'y'와 같지 않고 그리고 a는 'N'과 같지않고 그리고 a는 'n'과 같지않으면 참입니다. 뭔말인지 모르시겠다구요? 흠;;..

쉽게 말하자면 사용자가 입력한것이 Y,y,N,n중에 하나가 아닐시에 다시 do를 실행하여 질문을 다시 받는것입니다.

만약 Y,y,N,n중 하나를 입력했다면 do while을 빠져나가서 20행으로 가겠지요.
여기 있는 복잡한 비교문은 논리 연산자라 하여 아래에 꼭 외워야 할것! 에서 설명합니다.

그리고 20행에서 a == 'Y' || a == 'y'는 이렇게 해석합니다.

a가 'Y'와 같다 또는 a가 'y'와 같다.

입니다. 이것도 쉽게설명하면 사용자가 입력한게 y이거나 Y이면 참이 되어 if의 괄호 안을 실행합니다.

참이면 이곳에서 sel에 1이 저장되게 되지요.

그리고 참이 아니면 괄호 안을 무시하고 그냥 지나가서 아래의 22행에서 또 else if를 만나 비교를 하지요.

여기서도 a가 n이이거나 또는 a가 N이면 sel에 0이 저장되게 됩니다.

그리고 아래로 내려와서 24행의 while문을 만나서 sel에 1이 저장되어있으면 맨 위의 do로 돌아가서 다시 실행하게 되고 sel이 1이 아니면 그냥 아래로 내려가서 프로그램을 끝내게 되지요.

이해가 되시겠죠 ^^?

.
.
.
.
.
.



- 꼭 외워야 할것! -

논리 연산자

&&        뜻: [그리고] 양쪽 항이 모두 참일때는 참                예) (a && b)

||         뜻: [또는] 양쪽 항 중에 하나만 참일때도 참        예) (a || b)

!        뜻: [논리부정] 연산자의 값이 거짓이면 참 참이면 거짓        예) ( !(a = 0) )






휴.. 3일째가 끝났네요.

예제 7의 프로그램의 경우는 많은 프로그램에 응용됩니다.

프로그램을 재실행할것인지 종료할것인지 묻는것은 많이 보셨을테지요 ^^.. 그런것들은 저렇게 구현합니다.

오늘은 많은것을 배운것 같은데요. 얼마나 많이 보느냐가 중요한게 아니고.. 얼마나 잘 이해하느냐가 중요합니다 ^^

많은 시간을 투자하고서라도 잘 이해하고 넘어갑시다.

다음 날에는 c언어의 핵심인 함수를 배우도록 하겠습니다 기대해주세여 ' - ' 부족한 강좌를 봐주시는 모든분들 감사합니다

이해가 안되시는게 있으시거나 질문하실게 있으시면 댓글이나 싸이홈피에 질문하세요 ^^


Copyrightⓒ2006 geniusevil( http://www.cyworld.com/01028852864 ) .All rights reserved
↑ 혹시나 퍼가시려면 ^^;;; 이 표시만 안지우시면 퍼가셔도 됩니다

  Hit : 10354     Date : 2006/01/19 04:18



    
ckdmsghcoh ㅠㅠ 우리geniusevil님에게 항의한사람 누구야! ㅠ.ㅠ 덕분에 이분 쫚올라가셧당 2006/01/19  
ckdmsghcoh 아참! 그리구 메일 보내주신거 감사합니다. 2006/01/19  
geniusevil 넵 :) 2006/01/19  
hr33 멋지십니다 이해가 쏵되요 ㅋㅋ 2006/01/20  
sajangcm 감사 하지만 스크롤의 압박이! 2006/01/26  
Hacker_tw 잘 봤습니다.... 2006/01/27  
궧꺈긿깞꺍궛 <a href="http://www.pink-swap.net/">궧꺈긿깞꺍궛</a><a href="http://www.love-is-bet.com/ntnt/access/">궩긿궚궧</a><a href="http://www.look-oppai.net/chbank/">塋θ쿉</a><a href="http://www.great-relation.com/ntnt/gyakuen/">넖也</a><a href="http://www.deai-houdai.com/">雅뷴┿</a><a href="http://www.zutto-issyo.com/">궩깢꺃</a><a href="http://www.ireteiiyo.com/">깏꺍깙</a><a href="http://www.deai-nohanazono.net/">궓꺆</a><a href="http://www.tumande.net/">궩긿궚궧</a><a href="http://www.kannkei-taisetu.com/">눣鴉싥걚</a><a href="http://www.milky11.com/">궩긿궚궧</a><a href="http://www.klikimi-te-linkut.com/dclub/">塋θ쿉</a><a href="http://www.ee29.net/">窯ⓧ퓱</a><a href="http://www.erokawa.biz/">궋꺂깉</a><a href="http://www.ee357.com/">궩긿궚궧</a><a href="http://www.koimonogatari.net/">藥ⓧ뭄</a><a href="http://www.hhh-clinic.com/">궓긿긽</a><a href="http://www.honnki-deai.com/dmo/">塋θ쿉</a><a href="http://www.poipoi-mail.biz/">塋θ쿉</a><a href="http://www.gongon117.com/">걡겂겚걚</a><a href="http://www.hhh-go.net/">궩깢꺃</a> 2008/10/24
1420   커널 업그레이드 방법[2]     빈대
01/04 8133
1419   geniusevil의 가벼운 c언어 배우기 1[30]     geniusevil
01/06 10260
1418   geniusevil의 가벼운 C언어 배우기 2[10]     geniusevil
01/09 9143
1417   2.4.x에서 2.6.x 로 컴파일 할때 주의할점[2]     dadmi29
01/09 8763
1416     [re] ckdmsghcoh님 답변[6]     geniusevil
01/09 6422
1415   하드웨어와 소프트웨어...그리고 불가능한일?[16]     아이프리드
01/11 9431
1414   리눅스 방화벽의 종류...[4]     bsjzzz
01/12 13637
1413   * 보안에 대한 주요 FAQ[8]     dl4815
01/14 10479
1412   [펌]로그지우기[12]     khas
01/18 11129
  geniusevil의 가벼운 c언어 배우기 3[7]     geniusevil
01/19 10353
1410   작업표시줄의 그룹화 갯수 지정하기![7]     kgt2001sus
02/02 7151
1409   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 1[11]     아이프리드
02/03 11357
1408   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 2     아이프리드
02/03 9554
1407   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 3[16]     아이프리드
02/03 12698
1406   리눅스에서 스타크래프트를 한다?[9]     jonginsir
02/08 13040
1405   [펌]Ptrace를 이용한 재미는 해킹.[4]     ^^
02/08 12481
1404   ping 강좌...[11]     kgt2001sus
02/13 9013
1403   간단한 그래픽 오버(지포스계열)[8]     nsh009
02/15 7950
1402   네이버지식인 [펌]xp 우리가 모르는것들1[4]     jbp1858
02/16 10796
1401   네이버지식인 [펌]xp 우리가모르는것들 2[1]     jbp1858
02/16 7672
[1][2][3][4][5][6][7][8] 9 [10]..[79]

Copyright 1999-2023 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com