" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 책 알려주는 남자 :: '#C언어' 태그의 글 목록

9장 Summary


변수가 가지고 있는 속성은 범위, 생존시간, 연결이다.

범위scope : 어떤 범위에서 사용이 가능한가
생존시간lifetime : 메모리상에서 얼마나 오랫동안 존재하는가
연결linkage : 서로 다른 영역에 있는 변수들을 연결

지역 변수는 함수 또는 블록 안에 정의되는 변수이다.

지역 변수가 선언된 블록이 종료되면 지역변수는 사라지게(소멸하게) 된다.

지역 변수의 초기값은 쓰레기값garbage value이다.

함수의 매개변수도 지역 변수의 일종이다.

전역 변수는 함수의 외부에 선언되는 변수이다.

전역 변수의 초기값은 0이다.

똑같은 이름의 전역 변수와 지역 변수가 있다면 지역 변수가 전역 변수보다 우선시 된다.

지역 변수를 정적 변수로 만들려면 static지정자를 앞에 붙인다.

변수를 CPU 내부의 레지스터에 저장시키는 지정자는 register이다.

컴파일러에게 변수가 외부에 선언되어 있다고 알리는 지정자는 extern이다.

함수가 자기 자신을 호출하는 것을 순환 호출이라고 한다.

지역 변수를 프로그램이 실행되는 동안 계속 유지되는 변수로 만드는 키워드는 static이다.


블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

8장 Programming


1.

#include <stdio.h>


int even(int n);

int absolute(int n);

int sign(int n);


void main()

{

int n;

printf("정수를 입력하시오: ");

scanf("%d", &n);

if(even(n) == 0)

printf("even()의 결과: 홀수\n");

else if(even(n) == 1)

printf("even()의 결과: 짝수\n");

else if(even(n) == 2)

printf("even()의 결과: 0\n");

else

printf("even()의 결과: 음수\n"); 

if(absolute(n) == 1)

printf("absolute()의 결과: %d\n", n);

else

printf("absolute()의 결과: %d\n", n*(-1));

if (sign(n) == 1)

printf("sign()의 결과: 양수\n");

else if (sign(n) == 0)

printf("sign()의 결과: 0\n");

else 

printf("sign()의 결과: 음수\n"); 

}


int even(int n)

{

if (n%2 == 1) return 0;

else if (n == 0) return 2;

else if (n%2 ==0) return 1;

else return -1;

}


int absolute(int n)

{

if (n>=0) return 1;

else return -1;

}


int sign(int n)

{

if (n>0) return 1;

else if (n=0) return 0;

else return -1;

}


2.

#include <stdio.h>


double f_to_c(double f);

void main()

{

double f;

printf("화씨 온도를 입력하시오: ");

scanf("%lf", &f);

printf("썹씨 온도는 %lf도입니다.", f_to_c(f));

}


double f_to_c(double f)

{

double c;

c = 5.0/9.0*(f-32);

return c;

}


3.

#include<stdio.h>

#define PI 3.14


double cal_area(double radius);


void main()

{

double radius;

printf("원의 반지름을 입력하시오: ");

scanf("%lf", &radius);

printf("원의 면적은 %lf입니다", cal_area(radius));

}


double cal_area(double radius)

{

double v;

v = PI*radius*radius;

return v;

}


4.

#include<stdio.h>


int get_tax(int income);


void main()

{

int income;

printf("소득을 입력하시오(만원)");

scanf("%d", &income);

printf("소득세는 %d만원입니다.", get_tax(income)); 

}


int get_tax(int income)

{

int t;

if(income <= 1000)

t = income*0.08;

else 

t = income*0.1;

return t;

}


5.

#include <stdio.h>

#include <math.h>

#define PI 3.141592


double sin_degree(double degree);


void main()

{

double degree;

for(degree=0; degree<=180; degree = degree +15)

printf("sin(%d)의 값은 %lf\n", (int)degree, sin_degree(degree));

}


double sin_degree(double degree)

{

double r;

r = sin(PI*degree/180);


return r;

}


6.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int b_rand(int x);


void main()

{

int x, i;

srand(time(NULL));

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

printf("%d ", b_rand(x));

}


int b_rand(int x)

{

x = rand()%2;

return x;

}


7.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int b_rand(int x);


void main()

{

int x, y;

char z;

srand(time(NULL));

do

{

printf("앞면 또는 뒷면(1 또는 0): ");

scanf("%d", y);

if(b_rand(x)==y)

printf("맞았습니다.\n");

else

printf("틀렸습니다.\n");

printf("계속하시겠습니까?(y 또는 n)");

scanf("%c", &z);

printf("\n");

} while(z=='y');

}


int b_rand(int x)

{

x = rand()%2;

return x;

}


8.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


double f_rand(double x);


void main()

{

double x; 

int i;

srand(time(NULL));

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

printf("%lf ", f_rand(x));

}


double f_rand(double x)

{

x = rand()/(double)RAND_MAX*1;

return x;

}


짤막 토막지식! - rand()/ (float or double)RAND_MAX

rand : 내부에 정의되어 있는 테이블에서 현재 시드에 맞는 수를 반환하는 함수

RAND_MAX : rand 함수로 반활될 수 있는 수의 최대값 (0x7fff) , 주로 rand 함수를 통해 0.0 ~ 1.0의 실수를 랜덤하게 반환받기 위해 사용한다

기존 공식인 'rand()%최대값 +1' 은 정수 난수밖에 구할 수 없고, 별도의 계산식을 통해 실수 난수를 구할 수 있다. 

RAND_MAX는 rand로 구해질 수 있는 최대값이며, 이 값을 rand 함수의 반환값에 나누면 0~1 사이의 값이 나오게 된다. 여기에 최대값을 곱하면, 0~최대값 사이의 난수를 구할 수 있다. 이 방식은 %를 이용한 방식보다 부하가 덜하며, 보다 랜덤한 수를 얻을 수 있다.


9.

#include <stdio.h>


int print_value(int x);


void main()

{

int x;

while(1)

{

printf("값을 입력하시오(종료는 음수): ");

scanf("%d", &x);

print_value(x);

if (x<0)

break;

}

}


int print_value(int x)

{

int i;

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

printf("*");

printf("\n");

return i;

}


10.

#include <stdio.h>


int is_multiple(int n, int m);


void main()

{

int n, m;

printf("첫번째 정수를 입력하시오: ");

scanf("%d", &n);

printf("두번째 정수를 입력하시오: ");

scanf("%d", &m);

if(is_multiple(n, m) == 1)

printf("%d는 %d의 배수입니다.", n, m);

else

printf("%d는 %d의 배수가 아닙니다.", n, m);

}


int is_multiple(int n, int m)

{

if (n%m == 0)

return 1;

else

return 0;

}


11. 

#include <stdio.h>

#include <math.h>


double get_distance(double x1, double y1, double x2, double y2);


void main()

{

double x1, y1, x2, y2;

printf("첫번째 점의 좌표를 입력하시오:(x, y) ");

scanf("%lf %lf", &x1, &y1);

printf("두번째 점의 좌표를 입력하시오:(x, y) ");

scanf("%lf %lf", &x2, &y2);

printf("두점 사이의 거리는 %lf입니다.", get_distance(x1, y1, x2, y2)); 

}


double get_distance(double x1, double y1, double x2, double y2)

{

double d;

d = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

return d;

}


12.

#include <stdio.h>


int is_prime();


void main()

{

printf("2부터 100사이의 소수를 출력합니다.\n");

is_prime();

}


int is_prime()

{

int i, x;

for(x=2; x<=100; x++)

{

for(i=2; i<=x; i++)

{

if(i==x)

printf("%d ", x);

else if (x%i==0)

break;

}

}

}


13.

#include <stdio.h>


double factorial(int n);


void main()

{

int n;

printf("어디까지 계산할까요: ");

scanf("%d", &n);

printf("오일러의 수는 %lf입니다.", factorial(n));

}


double factorial(int n)

{

double e=1, result=1, i;

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

{

result = result*i;

e = e + 1/result;

}

return e;

}


14.

#include <stdio.h>


int is_leap(int n);


void main()

{

int n;

printf("연도를 입력하시오: ");

scanf("%d", &n);

if(is_leap(n)==1)

printf("%d년은 366일입니다.\n", n); 

else if(is_leap(n)==0)

printf("%d년은 365일입니다.\n", n);

}


int is_leap(int n)

{

if (n%4==0 && n%100!=0 || n%400==0)

return 1;

else

return 0;

}


15.

#include <stdio.h>


int round(double f);


void main()

{

double f;

printf("실수를 입력하시오: ");

scanf("%lf", &f);

round(f);

}


int round(double f)

{

f = (int)(f+0.5);

printf("반올림한 값은 %lf입니다.", f);

return f;

}


16.

#include <stdio.h>

#define e 0.000001


double f_abs(double x);

double f_min(double x, double y);

double f_equal(double x, double y);


void main()

{

double x, y;

printf("실수를 입력하시오: ");

scanf("%lf", &x);

printf("실수를 입력하시오: ");

scanf("%lf", &y);

if(f_equal(x, y) == 1)

printf("두 개의 실수는 서로 같음");

else if(f_equal(x, y) == 0)

printf("두 개의 실수는 서로 다름");

}


double f_abs(double x)

{

if(x<0)

return -x;

else

return x;

}


double f_min(double x, double y)

{

if (x>y)

return y;

else

return x;

}


double f_equal(double x, double y)

{

double z;

z = f_abs(x-y) / f_min(f_abs(x), f_abs(y));

if (z<e)

return 1;

else

return 0; 

}


17.

#include <stdio.h>


void print_menu(void);

int check_menu_number(int x);


void main()

{

int x;

while(check_menu_number(x)<2)

{

print_menu();

scanf("%d", &x);

if(check_menu_number(x)==1)

continue;

else if(check_menu_number(x)==0)

printf("%d번 메뉴가 선택되었습니다.\n", x);

break;

}


void print_menu()

{

printf("1. 햄버거\n");

printf("2. 치즈버거\n");

printf("3. 샌드위치\n");

printf("4. 종료\n");

printf("원하는 메뉴를 선택하시오: ");

}


int check_menu_number(int x)

{

if (1<=x && x<=3)

return 0;

else if(x==4)

return 2;

else 

return 1;

}

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

8장 Exercise


1. ①

① 원형 정의 대신 함수 설명이 main()보다 먼저 나온다면 원형 정의를 하지 않아도 된다.
② 매개 변수가 없는 경우에는 그 자리를 void로 채운다.


2.


3. 전부

①, ② 자료형의 부재
③ 변수 이름의 부재
④ void는 한번만 쓴다


4.


5.

(a) 1.72  (abs는 정수를, fabs는 실수를 인수로 받아 절대값을 반환함)    (b) 1     (c) 2


6.

(a) 0~9     (b) 2~6


7. 

(a) y = log10(x) + e(x);

(b) y = sin(x) + sqrt(x*x-2*a) + pow(2, 10);


8.

(a) void print_error(int n)

(b) double larger_of(double x, double y)

(c) void side_effect(void)


9. 

int f(void) -> return 10+20;
void g(int, int) -> return;
double h(double, int) -> return 1.0;


10.

int f(int n);

printf("%d", f(10));

return result;


11.

(a) y-> double y  // 자료형의 부재

(b) (int) -> int

(c) (int) -> int

(d) radius, pi -> float radius, float pi // 자료형의 부재


12.

수정 전 

수정 후 

 #include <stdio.h>   

int main(void)

{

int i, n, sum=0;

printf("정수를 입력하시오: ");

scanf("%d", &n);

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

sum += i;

printf("0부터 %d까지의 합은 %d입니다.\n", n, sum);

return 0;

}

 #include <stdio.h>

int sum(int i);    // 함수 원형정의

int main(void) 

{

      int i, n, sum=0;

printf("정수를 입력하시오: ");

scanf("%d", &n);

sum = sum(i);  // 함수 호출

printf("0부터 %d까지의 합은 %d입니다.\n", n, sum);

return 0;

}

int sum(int i)      //함수 정의

{

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

         sum += i;

     return sum;

}


13.


 

수정 전 

수정 후 

비고 

 a 

 int half_of(int x);

 int half_of(int x) 

 함수 정의 단계다 

 b

 print_message(3); 

 print_message(); 

 print_message 함수는 매개변수와 반환값이 없다. 3을 리턴하려하기 때문에 오류 발생 

 c

 double half_of(int);

 double half_of(double);

 자료형을 통일시킨다

 d

 (-)

 return sum; 

 반환형인데 return이 없다 

 e

 return x+y+z;

 (-) 

 매개변수와 반환형이 없으므로 return 이 존재하면 오류 발생



블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

8장 Summary


square() 함수 앞에 적어주는 int는 square() 함수가 int 형의 데이터를 반환한다는 의미이다.

square() 함수를 호출할 때 전달하는 데이터를 함수의 반환형 이라고 한다.

square() 함수에서 외부로 전달되는 데이터를 받는 변수를 매개변수 라고 한다.

함수를 크게 분류하면 프로그래머가 작성하는 사용자 정의 함수와 컴파일러에서 지원되는 라이브러리 함수로 나눌 수 있다.

함수 몸체는 중괄호 기호로 시작하고 중괄호 기호로 종료한다. 

함수가 반환할 수 있는 값의 개수는 매개변수의 개수 이다.

함수가 값을 반환하지 않는다면 반환형은 void 반환형 으로 정의되어야 한다.


블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,