▩ Call By Value를 이용한 함수로의 데이터 전달 방법


   - Call By Value로 사용되는 데이터타입은 원시데이터 타입인 char, short int, int, float... 수

     치 형태의 데이터 전부 해당
     ※ 문자열이나 주소 형태의 데이터는 Call By Reference입니다.

1. EXE 프로그램의 Memory 사용영역(System Memory Model)
   - 기본적으로 64Kb의 조각 메모리를 5가지 단계의 방법으로 사용하는 모델을 가지고 있습

     니다.
┌────────────┐CS: Code Segment
│[코드 영역]                   │
│C의 Source가 등록되는  │
│영역, 각종 함수             │
├────────────┤DS: Data Segment
│[Data 영역]                   │
│static변수,                     │
│static 메소드 저장          │
│한번 초기화가 진행되면  │
│재 초기화가 발생안됨     │
├────────────┤SS: Stack Segment
│[Stack 영역]                  │
│함수가 사용하는 영역     │
│함수 안에서 선언되는     │
│지역변수가 선언,           │
│함수 처리가 끝나면        │
│메모리가 자동으로         │
│회수됨, 지역변수 삭제    │
├────────────┤
│[Heap 영역]                  │
│malloc() 함수를 이용해   │
│동적으로 메모리를 할당 │
│하는 영역                      │
│개발자 필이 메모리        │
│해야만 함                      │
└────────────┘

 

2. Call By Value 방식을 이용한 데이터의 전달, 메뉴 코드를 입력받아 메뉴 문자열을 출력하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 void print_menu(char m) {
   switch(m) {
      case 'F' :
        printf("\nFile MENU\n");
        break;
      case 'E' :
        printf("\nEdit MENU\n");
        break;
      case 'H' :
        printf("\nHelp MENU\n");
        break;
      default :
        printf("\n잘못된 입력입니다.\n");
   }
 }

 main() {
   char c;
   printf("메뉴 코드를 입력하세요 : ");
   if((c=getch()) >= 97) c -= 32;

   while(c!='X') {
     print_menu(c);
     printf("메뉴코드를 입력하세요. 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }


3. 입력된 값의 제곱값을 구하는 프로그램
 #include <stdio.h>
 #include <conio.h>

 long int sqr(int i) {
   long int res;

   if(i>0) {
     res=(long)i *(long)i;
     return res;
   }
   else if(i==0)
     return 0;
   else
     return -1;
 }

 main() {
   int a;
   char c;

   printf("시작하려면 ENTER를 누르세요.\n");
   c=getch();
   while(c!='X') {
     printf("\n계산하려는 숫자를 입력하세요 : ");
     scanf("%d", &a);
     printf("%d의 제곱은 %ld입니다.\n", a, sqr(a));
     printf("계속하려면 아무키나 누루세요, 종료하려면 X를 누르세요.");
     if((c=getch()) >= 97) c -= 32;
   }
   printf("\n프로그램을 종료합니다.");
   getch();
 }




4. 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아 총점은 tot(kor, eng, mat) 함수에

   서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서 출력하는 프로그램을 만들어 보

  시오.

 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}

/*
소스영역    Stack영역
--------    ---------
main()      int kor   90 -┐
               int eng   90 │
               int mat   90  │
---------   ---------  │
tot()         int kor ←-─┘90 복사    
               int eng
               int mat
               int tot
---------   ---------
ave()       int kor
              int eng
              int mat
              float ave
*/



▷ 아래처럼 학점이 출력되는 프로그램으로 수정하세요. (90~100: A, 80~89: B, 70~79:C, 60~69: D, 59이하:F)

국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

과목: 국어    영어    수학    총점    평균
-------------------------------------------
점수: 85      90      90      265      88.3
학점: B       A       A     



▩ 함수의 설계


1. 지하철 승차권 판매 함수 설계
#include <stdio.h>
#include <conio.h>

//처리 로직 시작 함수 void sale(점검중|판매중)
void sale(int k);

//목적지 입력 함수
int target(); 

//동전 금액 입력 void coin(목적지 금액)
void coin(int kum);

//승차권 인쇄
//void print_ticket(목적지 금액,입력 금액);
void print_ticket(int kum, int tot);

void main(){
    int k;  //1:판매중, 2:점검중 구분

    sale(1);  
    getch();
}

void sale(int k){
    int sw=1;
    if (k == 0){
        printf("판매기 점검중\n");   
        return;
    }

    if (k == 1){
        printf("판매기 작동중\n");
        while(sw){
            sw=target();
        }
    }

}

int target(){
    int kum;  //금액 입력
    int sw=1; //0: 정상 금액, 1: 비정상 금액
   
    printf("                  승차권                      \n");
    printf("----------------------------------------------\n");   
    printf("승차권: 700 750 800 850 900 950 1000 1050 1100\n\n");

    while(sw){
        printf("목적지에 해당하는 금액을 눌러 주세요. ");
        scanf("%d", &kum);

        if (kum==9999) {
            printf("\n점검중입니다.\n");
            return 0;
        }else if (kum < 700){
            printf("700원 이하 승차권은 없습니다.\n");
        }else if (kum > 1100) {
            printf("1100원을 초과하는 승차권은 없습니다.\n");
        }else if (kum % 50) {
            printf("승차권은 50원 단위입니다.\n");
        }else{
            sw=0;
        }
    }
    coin(kum);
    return 1;
}

void coin(int kum){
    int sw=1;  //0: 정상 금액, 1: 비정상 금액
    int tot=0; //입력한 금액의 합계
    int in;    //금액을 입력 받는 변수
   
    printf("\n\n");
    printf("입력 가능 화폐(동전/지폐 가능)\n");
    printf("------------------------------\n");   
    printf("종 류: 10 50 100 500 1000\n\n");

    while(sw){
        printf("금액 투입!!!. ");
        scanf("%d", &in);

        if (in < 10){
            printf("10원 이하 금액은 사용할 수 없습니다.\n");
        }else if (in > 1000) {
            printf("1000원을 초과하는 지폐는 사용할 수 없습니다.\n");
        }else if (in % 10) {
            printf("입력 금액은 10원 단위까지 가능합니다.\n");
        }else{
            tot = tot+in;
            if( tot >= kum) sw=0;
            printf("\n현재 입금한 금액:%5d\n", tot);
        }
    }
    print_ticket(kum, tot);
}

void print_ticket(int kum, int tot){
    printf("\n\n");
    printf("%5d원 금액의 승차권이 발매 되었습니다.\n", kum);
    printf("남은 잔액은 %5d원 입니다.\n", tot-kum);
    printf("지하철을 이용해 주셔서 감사합니다.!!!\n\n");
}

Posted by 나비:D
:
BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :