본문 바로가기

programming/c,c++

이것이 C언어다::13장

13장 변수의 영역과 데이터 공유

 

연습문제1

1. 3,4,5,6번
2.  30
3.  static
4. 20
5
#include<stdio.h>
double get_next();
double ary[] = { 0.1, 0.3, 0.5, 0.7, 0.9 };
int main()
{
 double res = 0;
 int i,size;

 size = sizeof(ary)/sizeof(ary[0]);
 for (i = 0; i < size; i++)
 {
  res += get_next();
 }
 printf("%.1lf\n", res);

 return 0;
}
double get_next()
{
 static int index;
 double num;
 num = ary[index];
 index++;

 return num;
}

 

 


연습문제2
1.  1번-주소를 전달하는 방법  2번- 값을 복사해서 전달하는 방법, 3번-주소를 반환하는 함수
2. 지역변수 n 의 주소를 반환해서 에러!
3. *pr=*pa+*pb;
4.
#include<stdio.h>
int quot(int a, int b, int *p);
int main()
{
 int a, b, res;

 printf("두 정수 입력: ");
 scanf("%d%d", &a, &b);

 if (quot(a,b,&res)==-1)
 {
  printf("0으로 나눌 수 없습니다!\n");
 }
 else
 {
  printf("%d를 %d로 나눈 몫은 %d입니다\n", a, b, res);
 }

 return 0;
}
int quot(int a, int b, int *p)
{
 if (b == 0)
 {
  return -1;
 }
 else
 {
  *p = a / b;
  return 1;
 }
}

 

5. 값을 바꿔야하는데 주소만 바꿔서 값 자체는 바뀌지 않았다.

 

도전문제1
#include<stdio.h>
void input_data(int *pa, int *pb);
void swap_data();
void print_data(int a, int b);
int a, b;
int main()
{
 input_data(&a, &b);
 swap_data();
 print_data(a,b);

 return 0;
}
void input_data(int *pa, int *pb)
{
 printf("두 정수 입력: ");
 scanf("%d %d", pa, pb);
}
void swap_data()
{
 int temp;
 temp = a;
 a = b;
 b = temp;
}
void print_data(int a, int b)
{
 printf("두 정수 출력: %d %d\n",a,b);
}

 

 

 

도전문제2

 

#include <stdio.h>

void set(int h, int m);

void show();

void move();

 

int hour, min;

int main()

{

int h, m, cnt, i;

 

printf("최초 시간과 분 입력(24시간) : ");

scanf("%d %d", &h, &m);

 

hour = h;

min = m;

 

set(h, m);

 

printf("경과 시간 입력() : ");

scanf("%d", &cnt);

for (i = 0; i<cnt; i++)

{

move();

}

show();

}

 

void set(int h, int m)

{

if (0 <= h && h<12)

printf("설정된 시간 : %02d:%02d(AM)\n", h, m);

else if (12 <= h && 23 >= h)

printf("설정된 시간 : %02d:%02d(PM)\n", h, m);

}

 

void move()

{

min++;

if (min == 60)

{

hour++;

if (hour == 24)   hour = 0;

min = 0;

}

}

 

void show()

{

if (0 <= hour && hour < 12)

printf("현재 시간 : %02d:%02d(AM)\n", hour, min);

else if (12 <= hour && 23 >= hour)

printf("현재 시간 : %02d:%02d(PM)\n", hour, min);

}

 

 


도전문제3


#include <stdio.h>
char *my_token(char *ps);
int main()
{
 char str[80];
 char *p;

 printf("문장 입력: ");
 gets(str);

 while ((p = my_token(str)) != NULL)

  printf("%s\n", p);
 
 return 0;
}
char *my_token(char *ps)
{
 static char *next;
 static int finish = 0;
 char *temp, *start;

 if (finish == 1) return '\0';

 if (next == '\0') start = ps;

 else start = next + 1;
 temp = start;

 while ((*temp != ' ') && (*temp != '\0'))
  temp++;

 if (*temp == '\0') finish = 1;
 else *temp = '\0';
 next = temp;

 return start;
}

 

 

 

추가문제

1.

 

자동(지역)변수

외부(전역)변수

정적자동변수

정적외부변수

선언위치

함수 내부

(블록 내부)

함수 밖에서 선언

함수 내부

(블록 내부)

함수 밖에서 선언

생존주기

함수가 시작할 때 메모리에 할당되고, 종료 시 회수되어 재활용 됨.

프로그램이 시작할 때 메모리에 할당되고, 끝날 때까지 존재.

프로그램이 시작할 때 메모리에 할당, 끝날 때까지 존재

프로그램 시작할 때 메모리에 할당, 끝날 때까지 존재.

접근범위

선언된 함수

프로그램 전체, 어느 함수라도 사용가능

블록 내부

선언된 파일 내에 모든 함수에서 접근가능

자동초기화 여부

X

O

O

O

초기값

쓰레기 값

0(zero)

0(zero)

0(zero)

장단점

-메모리 효율적 사용

-함수의 독립성 증가시키고 디버깅 효율 증가.

-쓰레기 값이 저장될 수 있고, 두 개 이상의 함수에서 데이터를 공유하기가 쉽지 않음.

-프로그래밍이 간편.

-프로그램 종료까지 메모리 유지

-소스 사이의 종속성 증가로 인해 수정이 힘들고 디버깅 까다로움

-함수가 반환되더라도 저장 공간이 계속 유지되므로 함수에 필요한 값 보관가능.

-프로그램이 끝날 때까지 저장 공간을 유지하며 특정 함수에만 쓰는 경우에 유용.

-사용범위 제한되어 선언된 지역 내에서만 접근 가능하므로 다른 함수의 접근 차단하여 전역변수 단점 해결

 

-사용범위가 블록내부로 제한되어 다른 함수의 접근을 차단함.

-전역 변수와 달리 외부 소스에서 이 변수를 사용할 수 없음.

 

 

2. 값에 의한 호출과 주소에 의한 호출을 설명하시오.

 

-값에 의한 호출: 호출할 때 변수의 값을 복사하여 인수로 준다. 저장 공간이 별도로 할당되어 저장되므로 값을 출력하는 경우, 연산하는 경우 등 호출된 함수의 변수 값을 변경하지 않아도 될 때 사용.
-주소에 의한 호출: 포인터 사용하여 변수의 주소를 넘기는 방법으로 하나의 저장 공간을 공유한다. 따라서 호출된 함수의 변수 값을 변경할 수 있다.

 

 

3.주소에 의한 호출을 사용해야하는 예를 설명하시오

CASE01.

호출한 함수에 있는 변수값을 바꿔야하는 경우 ‘값에 의한 호출’은 값이 바뀌지 않으므로(저장 공간이 독립적이어서 영향 없음) 포인터 사용하는 주소에 의한 호출을 사용해야한다.

 

함수예시)
#include<stdio.h>
void data_input(int *pa, int *pb);
int main()
{
 int a, b;

 data_input(&a, &b);
 printf("입력된 값 a: %d, b: %d\n", a, b);

 return 0;
}
void data_input(int *pa, int *pb)
{
 printf("두 정수 입력: ");
 scanf("%d %d", pa, pb);
}

 

 

 

CASE02.

함수의 리턴값이 2개 이상일 때

 

함수예시)

 

 

#include<stdio.h>

void input_data(int *px);

void get_minmax(int a, int b, int *pmax, int *pmin);

int main()

{

int a,b;

int max, min;

 

input_data(&a);

input_data(&b);

 

get_minmax(a,b,&max, &min);

printf("최댓값:%d,최솟값:%d\n", max, min);

 

return 0;

 

}

void input_data(int *px)

{

printf("정수 입력: ");

scanf("%d", px);

 

}

void get_minmax(int a,int b, int *pmax, int *pmin)

{

if (a > b)

{

*pmax = a;

*pmin = b;

}

else

{

*pmin = a;

*pmax = b;

}

}

 

CASE03.

매개변수를 배열로 선언할 때

함수예시)

 

#include<stdio.h>

void data_input(int *pa);

int get_max(int *pa);

int get_min(int *pa);

int main()

{

int ary[5];

int max, min;

 

data_input(ary);

max = get_max(ary);

min = get_min(ary);

printf("최댓값:%d, 최솟값:%d\n", max, min);

 

return 0;

}

void data_input(int *pa)

{

int i;

for (i = 0; i < 5; i++)

{

printf("정수 입력: ");

scanf("%d", pa+i);

}

}

int get_max(int *pa)

{

int i;

int max = *pa;

for (i = 1; i < 5; i++)

{

if (max < *(pa+i)) max = *(pa+i);

}

return max;

}

int get_min(int *pa)

{

int i, min = *pa;

for (i = 1; i < 5; i++)

{

if (min > *(pa + i)) min = *(pa + i);

}

return min;

}

'programming > c,c++' 카테고리의 다른 글

이것이 C언어다::17장  (0) 2020.03.26
이것이 C언어다::16장  (0) 2020.03.26
이것이 C언어다::12장  (0) 2020.03.26
이것이 C언어다::11장  (0) 2020.03.26
피드백)이것이C언어다::10장  (0) 2020.03.26