▩ 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");
}