회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 120

캠퍼스 C 강좌_26

펌웨어 & 코딩언어 구매수 0 2007.11.15 01:49:16
판매자 프리미엄 판매 납포인트 무료 평점 0점 / 총 0명 참여

***************************< 캠퍼스 C  강좌 >******************************
[제목] :
[코드] : campusc1-026 (초급)
[교재] : CAMPUS C (초급, Third edition)  [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
        이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄 수
        있습니다. 그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습니다.

[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
           천리안 : go campusc  
           나우콤 : go lcampc
           하이텔 ID : campusc
****************************<< 목 차 >>************************************
<1> 그래픽을 이용한 실용 프로그램을 짜기 과정  (계속)
        1> 들어가며
        2> scanf()를 이용한 입력
        3> gets()을 이용한 입력
        4> 순환기능(loop)를 첨가
        5> argc, argv를 이용한 입력

**************************< 내용 시작 >********************************
1> 들어가며
-----------------------------------------------------------------------
        이번 강좌에서는 "데이타를 입력"하는 관점에서  여러가지 방법을 알
아보겠다. 예제들은 지난  시간에 하던 것과 똑같은 것이지만,  요번에는 "입
력의 수단 및 방법"에 대한 각도에서 루틴을 새롭게 보기로 하자.
        프로그램을 "분석"하는 방법으로는  지금 우리가 하고 있는  처럼 아
래의 기준으로 나누어 보는 것도 하나의 방법이다.

        1. 입력 부분
        2. 출력 부분
        3. 컴퓨터 내부에서의 연산

        위의 항목을 내용적으로 보면 가장 중요한  부분은 역시, 3번 컴퓨터
내부에서의 연산따위가 가장  핵심이 되는 것이다. 입 출력이야  일종의 상품
포장과 같은 부분이라고도 할 수 있다.
        그러나 아시다시피,  사람이 입력하기  너무 힘들거나, 혹은  결과가
모니터에, 혹은 프린터 따위에 잘못 나타나면,  아무도 그걸보고 좋은 프로그
램이라고 말하지 않는다. 따라서 이런 부분도 너무 소홀히 해서는 곤란하다.
        따라서 기본적으로 알아야 할 입출력에 관한  사항을 익히는 것도 중
요하다.아래에서 알아 보자.
-----------------------------------------------------------------------
2> scanf()를 이용한 입력
-----------------------------------------------------------------------
        이 scanf() 함수는, 마치 마이크와  스피커가 반대의 역할을 하듯이,
printf() 함수와 반대의 역할을 한다.
        따라서 입력 함수 중에는 이 scanf() 함수  만큼 다양한 기능을 갖는
것도 없다. 이 기능은 언젠가 언급을 한 적이 있다.
        입력에 관한 한  이 scanf() 함수는 처리 못하는게 없다.  그리고 쓰
는 방법도 상당히 복잡한 것 같다. 그래서  혹시 초보자들은 "입력에 관한 것
이라면 이 함수 만 알면 두려울게 없겠다"고  생각하는 분이 있을지도 모르겠
다. 그러나 "입력" 이란 단어만 들어가면  scanf()를 떠올리는 따위의 생각은
곤란하다. 우리가 함수를 골라 쓰는데는 다음과 같은 기준이 있는 것이다.

        1. 물론 해당하는 기능을 충실히  수행해야 한다.(scanf() 같은 경우 
           는 데이타를 입력해서 읽어들이는 역할을 한다)
        2. 사용법이 간단해야 한다.
        3. 작고 빨리 돌아야 한다.

예를 들면 스트링을 입력하는데는 scanf("%s"...)를  쓰거나 gets()함수가 가
능하다. 이중에 하나를  고를 때는 위의 기준에 맞춰 고르는  것이 바람직 한
데, 초보자 들은  둘중에 과연 어떤게 빨리 도는지 판단을  못하는 사람이 있
을것 같다.
        사실 그런 문제를 단언해서 말하기는  곤란한데, 익숙해지다 보면 자
연히 그런 mind가 생기지 않나 싶다.
        외형적으로는 지금의  scanf()처럼 기능이 많으면 일단은  속도가 느
리고 큰 함수라고 봐야 한다. 함수 내부에서 당연히  if() 을 써서 기능을 가
려낼려고 시간을 끌지 않겠는가 ?
        따라서 "데이타  입력"의 수단으로 이  함수를 쓰는 것은 별로  좋지
않지만, (물론 경우에 따라서는 틀림) 그래도 어떤  불편한 점이 있는지 직접
느껴보기로 하자.
        지금 프로그램 부터는  람보의 "체중"을 1 일 단위로  입력하고 그것
을 최대한 한달동안  그릴 수 있도록 해 보겠다. 사실  체중이야 매일 변하지
는 않겠지만, 나중에 여러분 자신의 응용 프로그램을  짤 때 이용하시라는 생
각 에서이다.
예를 들면, 한달 간의 가계부, 매출, 입금,  인원 참석표 등등.. 한달간을 기
준으로 해서 그래프 처리를 할 일은 많이 있을것이다.
        따라서 아래에서는  최대한 31개 까지만  데이타를 입력할 수  있다.
그리고 scanf()를 이용하여  데이타를 읽어 들이는데, 사람이  직접 키보드에
서 입력을 하기 시작 하면, 온갖 희한한 경우가 다 생기는 법이다.
        이렇때 벌어지는  에러들을 어떻게 처리 하는가가  프로그램의 "안정
성"을 결정하는 것이다.
        이제 아래  프로그램을 잘라내서 직접  실행해 보고 기능을 이해  하
자. 그리고 그다음에  소스를 읽고 내용을 완전히 이해 하도록  하자. 그래야
자기가 직접 소스를 뜯어 고칠 수 있을 것이다.
        바뀐 부분은 "  <-- 요기 " 시리즈로 표시를 해놨다.  기존의 부분은
여태까지 해왔던 부분이니까 아실테고 표시 부분만 유심히 보기로 하자.
/*---------------------------------------*/
#include        <graphics.h>

#define BAR_BOTTOM      450

#define SCALE_TOP                50
#define SCALE_BOTTOM    BAR_BOTTOM

#define START_X          100
#define END_X                   600
#define SCALE_X          START_X - 20
#define NORMAL_COLOR     RED
#define OVERFLOW_COLOR   YELLOW
#define MAX_BARS                 31             /* <--- 요기 1 */
                                                /* 한달간 입력 */
int     bar_width;
int     bar_pattern = 1;
int     bar_color = RED;
int  bar_line_color = WHITE;
int  bar_depth = 15;
int     how_many_bar;
struct bar {
                                int     height, x ;
                };                      /* <--- 요기 2 */
                                        /* 초기화 값 없어짐     */
struct bar b[MAX_BARS + 1];             /* <--- 요기 3 */
                                     /* null 문자를 위해 "+ 1" 함*/

/*===================================================*/
main()
{
        int     graphdriver = DETECT;
        int     graphmode ;
        int     i;
        int     scaled_height;

        /*-----------------< data input >------------------*/
        clrscr();
        printf("<<< Type "non-digit key" for EXIT  >>>\n");

        for(i = 0; i <  MAX_BARS; i++)
                b[i].height = 0x00;           /* <-- 요기  "초기화"  */
                                        /* 외부 변수는 이미 0으로
                                          되있으나, 가시적 표현 */
                                        

        for(i = 0; i <  MAX_BARS; i++) {
            printf("enter 1'st data  : ");
            if( scanf("%d", &b[i].height) != 1)  /*<--정상 입력 확인*/
                        break;
        }
        how_many_bar = i;                       /* <-- 요기 4  */
                                        /* i는 현재 갯수 의미 */
        /*----------------------------------------*/

        initgraph(&graphdriver, &graphmode, "");

        setcolor(bar_line_color);
        draw_scale();

        calc_x_position();

        if(how_many_bar == 1) {                 /* <---  요기 5 */
                                                /* 이걸 한 이유는 ?  */
                bar_width = 50;
        } else {
                bar_width  = (b[1].x - b[0].x)/2;
        }

        for(i=0; b[i].height; i++) {        /* <--- 데이타의 끝 찾음 */
                                           /*  이런 표현 익숙 필요 */

                scaled_height   =   BAR_BOTTOM  -   (b[i].height/10.   *
((SCALE_BOTTOM - SCALE_TOP)/100.));
                bar_color = NORMAL_COLOR;
                if(scaled_height < SCALE_TOP) {
                        scaled_height = SCALE_TOP;
                        bar_color = OVERFLOW_COLOR;
                }
                setfillstyle(bar_pattern, bar_color);

                bar3d(b[i].x,   scaled_height,   b[i].x   +   bar_width,
BAR_BOTTOM, bar_depth,1);
        }

        getch();

        closegraph();
}
/*=======================================================*/
calc_x_position()
{
        int  i;

        for(i =0; i < how_many_bar; i++ ) {
                b[i].x =  START_X + (END_X  - START_X) / how_many_bar  *
i;
        }
}
/*=======================================================*/
draw_scale()
{
        int i;

        /*-----< vertical line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_TOP, SCALE_X , SCALE_BOTTOM);

        /*-----< horizontal line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_BOTTOM, END_X , SCALE_BOTTOM);

        for(i= 0; i < 10; i++ ) {
                moveto(SCALE_X  -  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
                lineto(SCALE_X  +  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
        }
}

        표현이  여러군데서  바뀐것을  알  수   있다.  그리고  이런식으로
scanf()를 쓰면 문제의 소지가 많은데 그중에 하나가 엔터키를 칠때이다.
        일반적으로 엔터키라는것은  일종의 "해라","go", "종결"  따위의 의
미이다. 즉 천리안 이나 하이텔을 들어갈 때  자기 I.D를 치고 엔터키를 치면
이름 입력이 끝났다는  뜻이다. 그러니까 "그다음은 프로그램아  네가 알아서
하라"는 뜻인데, 지금  같은 루틴에서는 엔터키를 치면 그런일을  안 한다.따
라서 이대로 실용적인 프로그램을 만드는 것은 좋지 않다.

<숙제1> 엔터키를 여러가지 상황에서 입력해 보라
<숙제2> 데이타를 100  200 300 400 (엔터키 치지 말고  한줄에) 입력하고 결
과를    보라.그리고 scanf()함수의 처리 방법을 일단 기억 하자
-----------------------------------------------------------------------
3> gets()을 이용한 입력
-----------------------------------------------------------------------
        이번에는 gets()를 사용하는데 이것을 이용하는  일반적인 절차는 이
렇다.
        1. 무조건 문자열(스트링)을 읽어 들인다.         --> gets() 이용
        2. 이 문자열을 숫자로 바꾸는  과정을 거친다.     --> atoi() 이용
 

        3. 사람이 착하게 숫자만 잘 골라친게 확인되면 이용한다.

절차가 더 복잡한 듯이 보일지도 모르겠다. 그러나  이 방법이 좀더 일반적인
방법이고 좋은 방법이라는 사실을 알고 아래를 역시 실행 하고 읽어 보라.
바뀐 부분은 역시 "<-- 요기" 로 표시를 해 놓았다.

/*------------------------*/
#include        <graphics.h>
#include        <stdlib.h>
#include        <stdio.h>

#define BAR_BOTTOM      450

#define SCALE_TOP                50
#define SCALE_BOTTOM    BAR_BOTTOM

#define START_X          100
#define END_X                   600
#define SCALE_X          START_X - 20
#define NORMAL_COLOR     RED
#define OVERFLOW_COLOR   YELLOW
#define MAX_BARS                 31

int     bar_width;
int     bar_pattern = 1;
int     bar_color = RED;
int  bar_line_color = WHITE;
int  bar_depth = 15;
int     how_many_bar;
struct bar {
                                int     height, x ;
                };
struct bar b[MAX_BARS + 1];

/*===================================================*/
main()
{
        int     graphdriver = DETECT;
        int     graphmode ;
        int     i, changed_number;
        int     scaled_height;
        char *input_string;

        /*-----------------< data input >------------------*/
        clrscr();
        printf("--------< Type non-digit for exit >-------\n");

        for(i = 0; i <  MAX_BARS; i++)
                b[i].height = 0x00;

        for(i = 0; i <  MAX_BARS; i++) {
                printf("enter 1'st data  : ");
                gets(input_string);             /* <---- 입력  */
                if( !(changed_number = atoi(input_string)))/*<-- 변환*/
                        break;
                b[i].height = changed_number;    /* 성공시 이용 */
        }
        how_many_bar = i;                       
        /*----------------------------------------*/

        initgraph(&graphdriver, &graphmode, "");

        setcolor(bar_line_color);
        draw_scale();

        calc_x_position();
        if(how_many_bar == 1) {
                bar_width = 50;
        } else {
                bar_width  = (b[1].x - b[0].x)/2;
        }

        for(i=0; b[i].height; i++) {

                scaled_height   =   BAR_BOTTOM  -   (b[i].height/10.   *
((SCALE_BOTTOM - SCALE_TOP)/100.));
                bar_color = NORMAL_COLOR;
                if(scaled_height < SCALE_TOP) {
                        scaled_height = SCALE_TOP;
                        bar_color = OVERFLOW_COLOR;
                }
                setfillstyle(bar_pattern, bar_color);

                bar3d(b[i].x,   scaled_height,   b[i].x   +   bar_width,
BAR_BOTTOM, bar_depth,1);
        }

        getch();

        closegraph();
}
/*=======================================================*/
calc_x_position()
{
        int  i;

        for(i =0; i < how_many_bar; i++ ) {
                b[i].x =  START_X + (END_X  - START_X) / how_many_bar  *
i;
        }
}
/*=======================================================*/
draw_scale()
{
        int i;

        /*-----< vertical line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_TOP, SCALE_X , SCALE_BOTTOM);

        /*-----< horizontal line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_BOTTOM, END_X , SCALE_BOTTOM);

        for(i= 0; i < 10; i++ ) {
                moveto(SCALE_X  -  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
                lineto(SCALE_X  +  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
        }
}

        바뀐 부분은 오로지 입력부분이고 숫자로  성공적으로 들어오고 나면
나머지는 달라질 부분이 없으므로 똑같다.
        여기서는 일단 scanf()를 쓸때의 문제점인  엔터키를 해결했다. 이런
처리법이 역시 자연스러운 것이다.

<숙제1> 데이타를 입력하고 enter key를 쳐보라
<숙제2> 데이타를 100  200 300 400 (엔터키 치지 말고  한줄에) 입력하고 결
과를    보라.그리고 gets() 함수의 처리 방법을 dlgogkwk

        이 경우에는 엔터키를 치면 평상시 우리의  습관에 맞게 잘 동작하는
걸 볼 수 있다. 따라서 어느정도 좋아졌다고 생각된다.
        위의 <숙제2>는 scanf()의 <숙제2>를 복사해온  것이다. 따라서 두개
의 결과를 비교해 볼 수 있을텐데, 즉 scanf()함수는 데이타를
        enter key :  100  200  300 (enter )
로 치면  한줄에서 데이타 3개(100,200,300)를 동시에  입력했다고 간주한다.
그러나 gets() 함수는  처음의 하나(100)만 데이타 입력으로 읽어  들이고 그
이후 (200, 300)은 무시를 해 버린다. 따라서  데이타 형태가 아래와 같이 될
수도 있다
        scanf() 쓸때 :  enter key : 100 200 300 400 500 (enter)

        gets() 쓸 때 :  enter key : 100 (enter)
                        enter key : 200 (enter)
                        enter key : 300 (enter)
                        enter key : 400 (enter)
                        enter key : 500 (enter)

        이런 형태는 재미있게도 하이텔과 천리안의  "편지 보내기" 방법에서
볼 수 있다. 천리안과 하이텔을 두개 쓰시는  분은 알텐데, 편지 보내는 방법
은 각각 다음과 같다.

<하이텔>에서
                받을 사람 : rambo limchungha mazinga (enter)

<천리안> 에서
                받을 사람 : rambo (enter)
                받을 사람 : limchungha (enter)
                받을 사람 : mazinga (enter)

        내가 소스를 직접  보지 못해서 뭐라고 말은 못하겠지만,  일단 외형
상으로 봐서는  scanf() 와 gets()을  쓰는 것 같은 형태이다.여러분은  어느
방법이 더 좋다고  보시는지 모르겠는데, 내 개인적인 습관으론  천리안 쪽이
편하고, 더 좋은 방법인것 같다.

<숙제> 각 입력  데이타의 합을 그래프의 오른쪽 끝 막대기  위치에 그리도록 
        수정하라.필요하면  눈금 조정선도 오른쪽  끝에 세우고 별도로 크기
        표시를 하라
<숙제> 한달간 수입 지출 내역을 처리 하도록 프로그램을 알아서 바꿔보라
-----------------------------------------------------------------------
4> 순환기능(loop)를 첨가
-----------------------------------------------------------------------
        실용적인 모습을  조금더 갖추기 위해서  loop 기능을 첨가  시켰다.
이 기능은 흔히 보는  "계속 하시겠습니까 ?( y/n) " 따위를  묻는 문장을 첨
가 시키고 그에 따른 순환 루틴을 첨가 시킨것이다.
        이런 반복  기능을 첨가 시키면  현재 한달짜리 그래프 기능을  12달
로 반복 해서 확장 시킬 수 있는 효과가 있을 것이다.
        역시 아래에 "요기"로  표시해 놓았으므로 살펴 보기 바란다.  이 기
능은 비교적 간단하다.
/*--------------------------------------*/
#include        <graphics.h>
#include        <stdlib.h>
#include        <stdio.h>

#define BAR_BOTTOM      450

#define SCALE_TOP                50
#define SCALE_BOTTOM    BAR_BOTTOM

#define START_X          100
#define END_X                   600
#define SCALE_X          START_X - 20
#define NORMAL_COLOR     RED
#define OVERFLOW_COLOR   YELLOW
#define MAX_BARS                 31

int     bar_width;
int     bar_pattern = 1;
int     bar_color = RED;
int  bar_line_color = WHITE;
int  bar_depth = 15;
int     how_many_bar;
struct bar {
                                int     height, x ;
                };
struct bar b[MAX_BARS + 1];

/*===================================================*/
main()
{
        int     graphdriver = DETECT;
        int     graphmode ;
        int     i, changed_number;
        int     scaled_height;
        char input_string[5];
        char ch;
        /*-----------------< data input >------------------*/
while(1) {                              /* <--- 요기 (무한루프)*/
        clrscr();
        printf("--------< Type non-digit for exit >-------\n");

        for(i = 0; i <  MAX_BARS; i++)
                b[i].height = 0x00;

        for(i = 0; i <  MAX_BARS; i++) {
                printf(" %d   일 체중 : ", i + 1);      /* <-- 요기 */
                gets(input_string);
                if( !(changed_number = atoi(input_string)))
                        break;
                b[i].height = changed_number;
        }
        how_many_bar = i;
        /*----------------------------------------*/
        initgraph(&graphdriver, &graphmode, "");

        setcolor(bar_line_color);
        draw_scale();

        calc_x_position();
        if(how_many_bar == 1) {
                bar_width = 50;
        } else {
                bar_width  = (b[1].x - b[0].x)/2;
        }

        for(i=0; b[i].height; i++) {

                scaled_height   =   BAR_BOTTOM  -   (b[i].height/10.   *
((SCALE_BOTTOM - SCALE_TOP)/100.));
                bar_color = NORMAL_COLOR;
                if(scaled_height < SCALE_TOP) {
                        scaled_height = SCALE_TOP;
                        bar_color = OVERFLOW_COLOR;
                }
                setfillstyle(bar_pattern, bar_color);

                bar3d(b[i].x,   scaled_height,   b[i].x   +   bar_width,
BAR_BOTTOM, bar_depth,1);
        }
        getch();
        closegraph();
        /*-----------< end of graphic mode >----------------*/

        printf("continue ? (y/n) : ");      /* <---  요기   */
        if(getch() != 'y')                  /* <---  요기(문제)  */
                break;
 }                                    /* <--- 요기 "무한루프" 끝  */

}
/*=======================================================*/
calc_x_position()
{
        int  i;

        for(i =0; i < how_many_bar; i++ ) {
                b[i].x =  START_X + (END_X  - START_X) / how_many_bar  *
i;
        }
}
/*=======================================================*/
draw_scale()
{
        int i;

        /*-----< vertical line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_TOP, SCALE_X , SCALE_BOTTOM);

        /*-----< horizontal line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_BOTTOM, END_X , SCALE_BOTTOM);

        for(i= 0; i < 10; i++ ) {
                moveto(SCALE_X  -  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
                lineto(SCALE_X  +  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
        }
}
<숙제> 위의 "요기(문제)" 부분에서 'y' 와  'Y'가 동시에 가능하도록 고쳐보

<숙제> 온갖 메뉴를 한글로 바꾸고 화면 배치도 자기 개성에 맞게  바꿔보라
<숙제> 1년간의 수입 지출 내역을 처리 하도록 프로그램을 알아서 바꿔보라
-----------------------------------------------------------------------
5> argc, argv를 이용한 입력
-----------------------------------------------------------------------
        새로운 입력의  수단으로 아래  나온것 같은 아규먼트  카운트(argc)
와 아규먼트 벡터(argv)를 이용할 수 있다.
        지금같은 체중 그리기  예제 에서는 별로 좋은 예가  아니지만, 이런
입력 방법도 꼭 쓰여야 할 때가 있다. 이런  경우는 이미 여러분이 너무 많이
쓰고 있는데, 경우를 살펴 보면
        1. 도스 상의 많은 명령에서 예를 들면
                c:\> copy a.hwp  b.hwp
                c:\> cd  dos
        2. 응용 프로그램에서도 "option" 이나 "switch"를 입력 할 때
                c:\> arj a xxx.arj xxx.hwp
        이런 방법은 기본적으로 알아야 하는 것  이므로 아래 방법을 관심있
게 보기로 하자
/*---------------------------------*/

#include        <graphics.h>
#include        <stdlib.h>
#include        <stdio.h>

#define BAR_BOTTOM      450

#define SCALE_TOP                50
#define SCALE_BOTTOM    BAR_BOTTOM

#define START_X          100
#define END_X                   600
#define SCALE_X          START_X - 20
#define NORMAL_COLOR     RED
#define OVERFLOW_COLOR   YELLOW
#define MAX_BARS                 31

int     bar_width;
int     bar_pattern = 1;
int     bar_color = RED;
int  bar_line_color = WHITE;
int  bar_depth = 15;
int     how_many_bar;
struct bar {
                                int     height, x ;
                };
struct bar b[MAX_BARS + 1];

/*===================================================*/
main(int argc, char  *argv[])                         /* <--- 요기  */
{
        int     graphdriver = DETECT;
        int     graphmode ;
        int     i, changed_number;
        int     scaled_height;
        char input_string[5];
        char ch;
        /*-----------------< data input >------------------*/
        clrscr();
        printf("--------< Type non-digit for exit >-------\n");

        for(i = 0; i <  MAX_BARS; i++)
                b[i].height = 0x00;

        for(i = 0; i <  argc; i++) {            /* <--- 요기   */
                                                /* 입력한 데이타 수 */
               if( !(changed_number = atoi(argv[i + 1]))) /* <--요기 */
                                           /* i + 1 부터 실제 체중임 */
                        break;
                b[i].height = changed_number;
        }
        how_many_bar = i;
        /*----------------------------------------*/

        initgraph(&graphdriver, &graphmode, "");

        setcolor(bar_line_color);
        draw_scale();

        calc_x_position();
        if(how_many_bar == 1) {
                bar_width = 50;
        } else {
                bar_width  = (b[1].x - b[0].x)/2;
        }

        for(i=0; b[i].height; i++) {

                scaled_height   =   BAR_BOTTOM  -   (b[i].height/10.   *
((SCALE_BOTTOM - SCALE_TOP)/100.));
                bar_color = NORMAL_COLOR;
                if(scaled_height < SCALE_TOP) {
                        scaled_height = SCALE_TOP;
                        bar_color = OVERFLOW_COLOR;
                }
                setfillstyle(bar_pattern, bar_color);

                bar3d(b[i].x,   scaled_height,   b[i].x   +   bar_width,
BAR_BOTTOM, bar_depth,1);
        }
        getch();
        closegraph();
        /*-----------< end of graphic mode >----------------*/

}
/*=======================================================*/
calc_x_position()
{
        int  i;

        for(i =0; i < how_many_bar; i++ ) {
              b[i].x = START_X + (END_X - START_X) / how_many_bar * i;
        }
}
/*=======================================================*/
draw_scale()
{
        int i;

        /*-----< vertical line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_TOP, SCALE_X , SCALE_BOTTOM);

        /*-----< horizontal line >-------------*/
        setcolor(WHITE);
        line(SCALE_X, SCALE_BOTTOM, END_X , SCALE_BOTTOM);

        for(i= 0; i < 10; i++ ) {
                moveto(SCALE_X  -  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
                lineto(SCALE_X  +  5, SCALE_TOP  +  i*  (SCALE_BOTTOM  -
SCALE_TOP)/10);
        }
}

이 argc,  argv 의 내용을 모르시는  분은 이차원 배열, 이차원  포인터 부분
공부를 해야 한다.
현재 argv[1] 부터 실제 "체중의 스트링"이  들어온다. 따라서 상황은 gets()
와 같다. 그러므로 입력 부분만 제외하면 나머지 부분은 다를것이 없다.
        그리고 참고로 argv는 "아규먼트 벡터" 라고  읽는데 "벡터" 라는 용
어는 고등학교 때  배우던 "스칼라" "벡터" 할 때의 그  단어인데, 컴퓨터 용
어로는 "번지수들의 집합"  들과 같은 의미이다. 간단하게   "번지수"를 의미
한다고 이해를 하자.
        지난번에 얘기한  메모리 절대 번지  수 0000: 0000은 인터럽트  "벡
터"지역 이라고 했는데, 이 벡터도 인터럽트  루틴들이 있는 "번지수"를 의미
하는 것이다.

"입력의 방법"에 대한 관점에서는 아래와 같은 3 가지가 있다.

        1. 사람이 입력(프로그램 내에서)
        2. argc, argv를 이용한 입력
        3. 파일에서의 입력
이 중에서도  3번이 가장 중요한 의미를  갖는다. 이 방법은 다음  시간 부터
다뤄 볼텐데, 지금  하고 있는 프로그램이 그대로 이용되므로  반드시 소스를
완전히 이해하고 있어야 한다.
<숙제> argc, argv  를 이용한 데이타 입력을  써서 역시 체중의 합을 오른쪽
끝 막대 위치에 그리는 프로그램을 작성하라.
****************************< 끝 마치며 >******************************
수고 하셨습니다
***********************************************************************

 


profile
바람도사호야 2008.10.15 23:52
좋은자료 감사합니다.^-^
profile
진진진 2010.06.09 17:43
좋은 자료 감사합니다.
profile
컴쟁이 2013.01.17 00:05
자료감사합니다
profile
시나브로69 2017.06.24 15:58
좋은 자료 감사합니다.
search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
118 강좌 & 팁 OP-amp의 특징과 설계시 주의사항 [3] 5P dmz1723 2019-06-24 15 362
117 강좌 & 팁 PCB 비용 절감을위한 기본 지침 [4] 무료 아크마 2018-06-17 0 715
116 강좌 & 팁 인쇄 회로 기판 (PCB)에 사용되는 개념과 용어 [6] 무료 아크마 2018-06-17 0 1192
115 강좌 & 팁 알티움을 유지보수하면 좋은 이유 (1) / Altium 17 Draftsman 무료 아크마 2018-01-06 0 271
114 강좌 & 팁 VHDL 기초이론 [2] 5P 태양인이제마 2017-12-26 14 287
113 강좌 & 팁 [국문번역] Programmable-Gain Transimpedance Amplifiers Maximize Dynamic Range in Spectroscopy Systems 5P 오로랏 2017-08-26 4 131
112 강좌 & 팁 이론상 가장 빠른 정렬 알고리즘 [1] 10P 오로랏 2017-08-26 4 362
111 강좌 & 팁 와이어 솔더링 노하우 [10] 5P 아그네스 2017-04-04 16 448
110 강좌 & 팁 vi Editor “Cheat Sheet” [2] 5P 아크마 2017-01-30 2 116
109 강좌 & 팁 AVR 기초강좌_1.보드에 프로그램 다운로드하기_퓨즈설정 [16] 무료 소중이 2010-05-18 0 3132
108 강좌 & 팁 미국 전선 규격 환산 5P 아크마 2012-12-30 2 241
107 강좌 & 팁 EMI 및 EMI 필터 설명, 설계, 주의사항 등 전반적인 내용 [1] 50P 솔개처럼 2016-12-16 8 306
106 강좌 & 팁 노이즈방지 PCB 설계법 [33] 5P 직장인 2016-07-21 31 761
105 강좌 & 팁 Fluorescent Lamps, Ballasts, and Fixtures [2] 5P 오로랏 2016-05-28 0 66
104 강좌 & 팁 [PCB설계] 전압에 따른 최소 도체 간격 & 패턴폭과 허용전류 & TH경에 따른 패턴폭 [6] 5P 킬유21 2015-11-06 13 555
103 강좌 & 팁 2015년 1월~2월에 진행을 하였던 모바일 로봇입니다. [1] 5P 한백금설 2015-05-14 8 460
102 강좌 & 팁 Rc Car를 이용하여 만든 자동주차시스템입니다. [3] 5P 한백금설 2015-05-14 5 627
101 강좌 & 팁 자작 라인 트레이서 [1] 무료 윤컴 2015-05-02 0 318
  • 누구도 자기가 하는 말이 다 뜻이 있어서 하는 것이 아니다. 그럼에도 자기가 뜻하는 바를 모두 말하는 사람은 거의 없다.
    - H.애덤즈
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.