" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 책 알려주는 남자 :: '프로그래밍/쉽게 풀어쓴 C언어 Express' 카테고리의 글 목록 (2 Page)

10장 Exercise


1. 배열이 10개의 원소를 가진다면 첫 번째 원소의 배열 번호는?     ②0


2. 배열 char[5][6]은 총 몊개의 원소를 가지는가?        ③30


3. 다음 중 잘못 선언된 배열을 모두 선택하라.    ③, ④ (변수, 실수는 배열의 크기가 될 수 없다.)


4. int a[100]={10}; 으로 선언된 배열에서 a[99]의 초기값은 무엇인가?    ①0


5. int a[2][2] = {1, 2, 3, 4}에서 a[1][1]의 초기값은?        ①1


6. 프로그램의 오류를 전부 수정하라.

#define MAX_SIZE 3

int main(void)
{

int a[MAX_SIZE]={0, 1, 2, 3};
int b[3.0];

for(i=0; i<=MAX_SIZE; i++)
        b[i]=a[i];

return 0;

}

 #define MAX_SIZE 3

int main(void)
{

int a[MAX_SIZE]={0, 1, 2};
int b[3];

for(i=0; i<=MAX_SIZE; i++)
        b[i]=a[i];

return 0;

}


7. 

  (a) 배열로 수정

float grade[3];

 (b) 입력 대신 배열 초기값 설정

float grade[3]={10.0, 20.0, 30.0}

 (c) 평균함수 이용


#include <stdio.h>


float get_average(float a[], int n);


int main()

{

float grade[3] = {10.0, 20.0, 30.0};

printf("학생들의 평균: %f", get_average(grade, 3));

return 0;

}

float get_average(float a[], int n)

{

int i;

float sum=0;

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

        sum += a[i];

return sum/n;

}

 (d) 분포표 출력

#include <stdio.h>

int main()

{

int i, people[10] = {0};

float grade[3] = {10.0, 20.0, 30.0};


for(i=0; i<3; i++) {

if (grade[i]>=91 && grade[i]<=100) people[9]++;

else if(grade[i]>=81) people[8]++;

else if(grade[i]>=71) people[7]++;

else if(grade[i]>=61) people[6]++;

else if(grade[i]>=51) people[5]++;

else if(grade[i]>=41) people[4]++;

else if(grade[i]>=31) people[3]++;

else if(grade[i]>=21) people[2]++;

else if(grade[i]>=11) people[1]++;

else if(grade[i]>=0) people[0]++; }

printf("점수대 인원수\n");

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

   printf("%d-%d   %d\n", i*10+1, i*10+10, people[i]); 

return 0;

}



8. 잘못된 부분 수정

(a)

int main(void)

{

int grade[10][60];

compute_avg(grade);

}

int compute_avg(int array[][]){...}

 

 int main(void)

{

int grade[10][60];

compute_avg(grade);

}

int compute_avg(int array[][60]){...}


cf. 다차원 배열의 경우 1차원 배열과 비슷하나 다만 첫 번째 인덱스를 제외한 나머지 인덱스의 범위를 적어주어야한다

 (b)

float test[10];

scanf("%f", test[0]);

 float test[10];

scanf("%f", &test[0]);

 (c)

int main(void)

{

int x, y;

int test[10][5];

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

for(y=0; y<10; y++)

test[x][y]=0;

return 0;

}

 int main(void)

{

int x, y;

int test[5][10];

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

for(y=0; y<10; y++)

test[x][y]=0;

return 0;

}



블로그 이미지

얼음꿀차

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

,

10장 Summary


배열 원소에 붙여져 있는 번호를 인덱스(index) 또는 첨자(subscript)라고 한다.

배열 a의 i번째 원소는 a[i]와 같이 참조한다.

int a[10];과 같이 선언된 배열에서 사용할 수 있는 인덱스의 값은 0에서 9까지이다.

정수형 배열 a[6]을 선언하고 1, 2, 3, 4, 5, 6으로 초기화하는 문장은 int a[6] = {1, 2, 3, 4, 5, 6};과 같다.

배열의 크기를 주지 않고 초기값(1, 2, 3, 4, 5, 6)의 개수로 배열의 크기를 결정하려면 int a[] = {1, 2, 3, 4, 5, 6}와 같이 선언한다.
// #define SIZE 3 이고 int a[SIZE] = {1, 2, 3} 이면 컴파일 오류다!

배열 a의 크기를 자동적으로 계산하려면 수식 sizeof(배열)/sizeof(배열원소);을 사용한다.

초기값의 개수가 배열 원소의 개수보다 적은 경우에는 나머지 원소들은 0값으로 초기화 된다.

int a[3][5][2]와 같이 정의된 배열에서 원소의 총개수는30(3*5*2)이다.

배열을 함수의 인수로 보내면 원본이 전달된다.
("값의 호출에 의한" 매개변수 복사가 아님, 배열 원소를 인수로 하여 함수호출하면 복사본이 전달된다.) 

배열을 함수의 인수로 전달할 때 원본 배열의 변경을 금지하고 싶으면 const 지정자을 매개 변수 앞에 붙인다.

하나의 배열을 다른 배열로 통째로 대입하거나 비교할 수 있는가? 즉 배열a[]와 배열b[]가 있을 때 다음과 같은 문장이 가능한가?



틀린 예시 (대입, 비교)

 바른예시 (대입, 비교)

int a[10], b[10];

a=b;

if(a==b) 
      printf("같음");

 int i, a[10], b[10];

 for(i=0; i<10; i++)
 {
      if (a[i] == b[i])
            printf("같음");
 }

 int a[SIZE] = {1, 2, 3, 4, 5};
 int b[SIZE] = {1, 2, 3, 4, 5};

 if (a==b)
      printf("같습니다");
 else
      printf("다릅니다");

 int a[SIZE] = {1, 2, 3, 4, 5};
 int b[SIZE] = {1, 2, 3, 4, 5};

 for(i=0; i<SIZE; i++)
 {
      if(a[i] != b[i])
       {   
           printf("다릅니다");
           break;
       }
 }



배열의 크기가 음수, 실수, 변수이거나 비어있으면 컴파일 오류다. (단, #define을 통한 기호 상수는 가능하다)

배열을 초기화할 때 일부만 주면 나머지 원소들은 0으로 초기화된다.

블로그 이미지

얼음꿀차

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

,

9장 Programming


1.

(a) 정적 지역 변수 사용

#include <stdio.h>


int add(int x, int y);

int sub(int x, int y);

int mul(int x, int y);

int dvd(int x, int y);


int main()

{

int x, y;

char op;

while(1) 

{

printf("연산을 입력하시오: ");

scanf("%d %c %d", &x, &op, &y);

switch(op)

{

case '+' : printf("연산 결과: %d\n", add(x, y)); break;

case '-' : printf("연산 결과: %d\n", sub(x, y)); break; 

case '*' : printf("연산 결과: %d\n", mul(x, y)); break; 

case '/' : printf("연산 결과: %d\n", dvd(x, y)); break; 

}

}

}


int add(int x, int y)

{

static int count=0;

count++;

printf("덧셈은 총 %d번 실행되었습니다\n", count);

return x+y;

}


int sub(int x, int y)

{

static int count=0;

count++;

printf("뺄셈은 총 %d번 실행되었습니다\n", count);

return x-y;

}


int mul(int x, int y)

{

static int count=0;

count++;

printf("곱셈은 총 %d번 실행되었습니다\n", count);

return x*y;

}


int dvd(int x, int y)

{

static int count=0;

count++;

printf("나눗셈셈은 총 %d번 실행되었습니다\n", count);

return x/y;

}


(b) 전역 변수 사용

#include <stdio.h>


static int count_add=0;

static int count_sub=0;

static int count_mul=0;

static int count_dvd=0;

int add(int x, int y);

int sub(int x, int y);

int mul(int x, int y);

int dvd(int x, int y);


int main()

{

int x, y;

char op;

while(1) 

{

printf("연산을 입력하시오: ");

scanf("%d %c %d", &x, &op, &y);

switch(op)

{

case '+' : printf("연산 결과: %d\n", add(x, y)); break;

case '-' : printf("연산 결과: %d\n", sub(x, y)); break; 

case '*' : printf("연산 결과: %d\n", mul(x, y)); break; 

case '/' : printf("연산 결과: %d\n", dvd(x, y)); break; 

}

}

}


int add(int x, int y)

{

count_add++;

printf("덧셈은 총 %d번 실행되었습니다\n", count_add);

return x+y;

}


int sub(int x, int y)

{

count_sub++;

printf("뺄셈은 총 %d번 실행되었습니다\n", count_sub);

return x-y;

}


int mul(int x, int y)

{

count_mul++;

printf("곱셈은 총 %d번 실행되었습니다\n", count_mul);

return x*y;

}


int dvd(int x, int y)

{

count_dvd++;

printf("나눗셈셈은 총 %d번 실행되었습니다\n", count_dvd);

return x/y;

}




2.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int get_dice_face(int x);

void main()
{
int x;
srand((unsigned)time(NULL));
get_dice_face(x);
}

int get_dice_face(int x)
{
int i;
static int count1=0;
static int count2=0;
static int count3=0;
static int count4=0;
static int count5=0;
static int count6=0;
for(i=1; i<=1000; i++)
{
x=rand()%6+1;
if(x==1) count1++;
if(x==2) count2++;
if(x==3) count3++;
if(x==4) count4++;
if(x==5) count5++;
if(x==6) count6++;
if(i%100==0)
printf("%d %d %d %d %d %d\n", count1, count2, count3, count4, count5, count6);
}
return x;
}


3.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


int get_random(void);


void main()

{

printf("%d\n", get_random());

printf("%d\n", get_random());

printf("%d\n", get_random());

}


int get_random()

{

static int inited=0;

if(inited==0)

{

printf("초기화\n");

srand((unsigned)time(NULL));

inited=1;

}

}



4.

#include <stdio.h>


double recursive(double n);


int main()

{

double n;

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

scanf("%lf", &n);

printf("recursive(%.0lf)의 결과: %.4lf", n, recursive(n));

 

}


double recursive(double n)

{

if (n==1)

return 1.0;

else

return 1.0/n + recursive(n-1);

}



5.

#include <stdio.h>


void save (int amount);

void draw (int amount);

int money=0;


void main()

{

int n, amount;

do 

{

printf("메뉴를 선택하세요: 저축(1), 인출(2), 종료(3): ");

scanf("%d", &n);

if(n==1)

{

printf("저축할 금액: ");

scanf("%d", &amount);

save(amount);

}

else if(n==2)

{

printf("인출할 금액: ");

scanf("%d", &amount);

draw(amount);

}

else if (n==3)

break;

else

printf("잘못 입력하셨습니다.\n");

} while(1);

}


void save(int amount)

{

money += amount;

printf("현재 잔액은 %d입니다.\n", money);

}


void draw(int amount)

{

if (money>=amount)

{

money -= amount;

printf("현재 잔액은 %d입니다.\n", money);

}

else

{

printf("잔액이 부족합니다.\n");

money=money;

printf("현재 잔액은 %d입니다.\n", money); 

}

}



6.

#include <stdio.h>


int get_tri_number(int n);


void main()

{

int n;

printf("입력하시오: ");

scanf("%d", &n);

printf("해당 삼각수의 값은 %d이다.", get_tri_number(n));

}


int get_tri_number(int n)

{

if(n==1)

return 1;

else

return n + get_tri_number(n-1);

}



7.

#include <stdio.h> //  순환함수 사용한 경우 


int recursive (int n, int k);


void main()

{

int n, k;

printf("nCk 중 n과 k의 값을 차례대로 입력하시오: ");

scanf("%d %d", &n, &k);

printf("이항계수의 값은 %d이다.", recursive(n, k));

}


int recursive (int n, int k)

{

if ( k==0 || k==n)

return 1;

else 

return recursive(n-1, k-1) + recursive (n-1, k);

}




#include <stdio.h> //  반복함수 사용한 경우 


int F_1(int x);

int F_2 (int x, int y);


void main()

{

int n, k, result;

printf("nCk 중 n과 k의 값을 차례대로 입력하시오: ");

scanf("%d %d", &n, &k);

if ( k==0 || k==n)

result = 1;

else  // nCk를 n!/(n-k)!/k! 로 식 전환

result = F_1(n-1)/F_1(k-1)/F_2(n, k) + F_1(n-1)/F_1(k)/F_2(n-1, k);

printf("이항계수의 값은 %d이다.", result);

}


int F_1(int x) // n!과 k!로 쓰임

{

int i, f=1;

if (x==1)

return 1;

else

{

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

f = f*i;

return f; 

}

}


int F_2(int x, int y) // (n-k)! 로 쓰임

{

int i, f=1;

if ( x-y ==1 || x-y <1)

return 1;

else

{

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

f = f*i;

return f; 

}

}



8.

#include <stdio.h>


void show_digit(int n);


void main()

{

int n;

printf("입력하시오: ");

scanf("%d", &n);

show_digit(n);

}


void show_digit(int n)

{

if (n<10)

printf("%d ", n);

else

{

show_digit(n/10);

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

}

}


블로그 이미지

얼음꿀차

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

,

 9장 Exercise


1.

(a) int number;           지역 변수, 자동 변수

(b) double radio;         전역 변수, 자동 변수    

(c) register int index;    지역 변수, 레지스터 변수

(d) extern int counter;  전역 변수, 외부 참조 변수

(e) static int setting;     지역 변수, 정적 변수


2.

int a               전역 변수, 프로그램 시작부터 종료까지, 외부연결

static int b      정적 전역 변수, 프로그램 시작부터 종료까지, 내부연결

extern int c      외부참조 변수, 프로그램 시작부터 종료까지, 외부연결

int d              지역 변수, main 시작부터 종료까지, 무연결

register int e    지역  레지스터 변수, main 시작부터 종료까지, 무연결

static int f        정적 지역 변수, main 시작부터 프로그램 종료까지, 무연결

int g                지역 변수, main 시작부터 종료까지, 무연결


3.

(a) #####    i가 전역변수이므로 main의 for가 아닌 f의 for에 따라 반복됨

(b) 10          지역 변수와 전역 변수가 만나면 지역 변수가 먼저지만,
                f함수는 값을 반환하지 않아서 전역 변수인 n=10이 출력된다.

(c) 3\n2        지역 변수와 전역 변수가 만나면 지역 변수가 우선이다.

(d) 0\n1        정적변수이기 때문에 값이 초기화되지 않고 누적되어 출력된다.



4.

(a) register 변수는 지역 변수만 가능하다.

(b) 순환되지 않으므로 n을 n-1로 바꾸어야 한다.



5.

(a)                                                  (b)

5                                                    5

4                                                    4

3                                                    3

2                                                    2    

1                                                    1

0                                                    0

16가 반환됨(0일때 1반환)            2*(2*(2*(2*(2*(2*2+1)+1)+1)+1)+1)+1  = 95 반환



6.

#include <stdio.h>


int main()

{

int n, r=1, i;

printf("입력하시오: ");

scanf("%d", &n);

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

{

if(n==0)

r = r + 1;

else

r = r + i;

}

printf("%d", r);

}


블로그 이미지

얼음꿀차

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

,

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 반환형 으로 정의되어야 한다.


블로그 이미지

얼음꿀차

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

,

7장 Programming


1.

(a)

#include <stdio.h> //while 


int main()

{

int i=1, sum=0;

while(i<=100)

{

if(i%3==0)

sum = sum + i;

i++;

}

printf("1부터 100사이의 모든 3의 배수의 합은 %d입니다.", sum);

return 0;

}


(b)

#include <stdio.h> // for


int main()

{

int i, sum=0;

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

{

if(i%3==0)

sum = sum + i;

}

printf("1부터 100사이의 모든 3의 배수의 합은 %d입니다.", sum);

return 0;

}


(c)

#include <stdio.h> // do..while

int main()

{

int i=1, sum=0;

do

{

if(i%3==0)

sum = sum + i;

i++;

} while(i<=100);

printf("1부터 100사이의 모든 3의 배수의 합은 %d입니다.", sum);

return 0;

}


2.

#include <stdio.h>


int main()

{

int x, sum;

while ( scanf("%d", &x) !=EOF)

{

sum = sum + x;

}

printf("정수의 합은 %d입니다.", sum);

return 0;

}


3.

#include <stdio.h>


int main()

{

int x, y, z;

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

{

for (y=0; y<8-x; y++)

printf(" ");

for (z=0; z<x; z++)

printf("*");

printf("\n");

}

return 0;

}


4.

#include <stdio.h>


int main()

{

int x,y,z;

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

scanf("%d", &x);

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

{

for (z=1; z<=y; z++)

printf("%d", z);

printf("\n");

}

return 0; 

}


5.

#include <stdio.h>


int main()

{

int x, y;

printf("카운터의 초기값을 입력하시오 :");

scanf("%d", &x);

for (y=x; y>=1; y--)

printf("%2d", y);

printf("(경고 벨소리)%c", '\a'); 

}


6.

#include <stdio.h>


int main()

{

int x, y, z;

char c;

printf("**************\n");

printf("A---- Add\n");

printf("S---- Subtract\n");

printf("M---- Multiply\n");

printf("D---- Divide\n");

printf("Q---- Quit\n");

printf("**************\n");

do

{

printf("연산을 선택하시오 : ");

scanf("%c", &c);

if(c=='Q')

break;

printf("두수를 공백으로 분리하여 입력하시오: ");

scanf("%d %d", &x, &y);

fflush(stdin);

switch(c)

{

case 'A': 

z=x+y;

printf("연산의 결과는 %d입니다\n", z); break;

case 'S':

z=x-y;

printf("연산의 결과는 %d입니다\n", z); break;

case 'M':

z=x*y;

printf("연산의 결과는 %d입니다\n", z); break;

case 'D':

z=x/y;

printf("연산의 결과는 %d입니다\n", z); break;

}

} while(1);

return 0;


7.

#include <stdio.h>


int main()

{

int x, y;

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

{

for (y=2; x>y; y++)

{

if(x%y == 0)

break;

}

if (x==y)

{

printf("%d ", x);

}

}

return 0;

}

<참고 : is_prime 함수이용한 소수판별기>

#include <stdio.h>


int is_prime(int);

int get_integer(void);


main()

{

int n, result;

n = get_integer();

result = is_prime(n);

if (result == 1)

printf("%d은 소수입니다.\n", n);

else

printf("%d은 소수가 아닙니다.\n", n);

return 0;

}


int get_integer(void)

{

int n;

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

scanf("%d", &n);

return n;

}


int is_prime(int n)

{

int divisors = 0, i;

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

{

if (n%i == 0)

divisors++;

}

return (divisors == 2);

}

 

8.

#include <stdio.h>

int main()
{
 int x,y;
 
 while(1)
 {
  printf("막대의 높이 (종료: -1): ");
  scanf("%d", &x);
  
  if(x==-1)
   break;
  for(y=1; y<=x; y++)
  { 
   printf("*");
  }
  printf("\n");
 }  
 return 0;
}

9.

#include <stdio.h> //선if 후계산

int main()
{
 int x, sum=0;
 
 for(x=1; ; x++)
 {
  if(sum>10000)
   break; 
  else
   sum = sum + x;
 }
 printf("1부터 %d까지의 합은 %d입니다.", x-1-1, sum-(x-1));
}

또는

#include <stdio.h> // 선계산 후if, 가장 나은 방법

int main()
{
 int x, sum=0;
 
 for(x=1; ; x++)
 {
  sum = sum + x;
  
  if(sum>10000)
   break; 
 }
 printf("1부터 %d까지의 합은 %d입니다.", x-1, sum-x);
}

또는

#include <stdio.h>

int main()
{
 int x=0, sum=0;
 
 while(1)
 {
  sum = sum + x;
  
  if(sum>10000)
   break; 
   x++;
 }
 printf("1부터 %d까지의 합은 %d입니다.", x-1, sum-x);
}

 

10.

#include <stdio.h>

int main()
{
 int r, n, i, result=1;
 
 printf("실수의 값을 입력하시오: ");
 scanf("%d", &r);
 printf("거듭제곱횟수를 입력하시오: ");
 scanf("%d", &n);
 
 for(i=1; i<=n; i++)
  result = result *r;
 
 printf("결과값은 %d", result);
}

 

11.

#include <stdio.h>

int main()
{
 int i, n, result=0;
 
 printf("n의 값을 입력하시오: ");
 scanf("%d", &n);
 
 for (i=1; i<=n; i++)
  result = result + i*i;
  
 printf("계산값은 %d입니다.", result);
}

 

12.

#include <stdio.h> // a 출력방법

int main()
{
 int a=0, b=1, c, i, n;
 
 printf("몇 번째 항까지 구할까요? ");
 scanf("%d", &n);
 
 for(i=0; i<=n; i++)
 {
  printf("%d ", a);
  c=a+b;
  a=b;
  b=c;
 }
}

또는

#include <stdio.h> // c 출력방법

int main()
{
 int a=0, b=1, c, i, n;
 
 printf("몇 번째 항까지 구할까요? ");
 scanf("%d", &n);
 
 printf("%d %d ", a, b);
 for(i=1; i<n; i++)
 {
  c=a+b;
  printf("%d ", c);
  a=b;
  b=c;
 }
}

 

13.

#include <stdio.h>

int main()
{
 int n, r, i, result=1;
 
 printf("n의 값: ");
 scanf("%d", &n);
 printf("r의 값: ");
 scanf("%d", &r);
 
 for(i=n; i>=n-r-1; i--)
  result = result*i;
  
 printf("순열의 값은 %d입니다.", result);
}

 

14.

 #include <stdio.h>


int main()

{

int i=1, n, x;

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

scanf("%d", &n);

do

{

x = n/i%10;

printf("%d", x);

i = i*10;

} while(i<n);

return 0;

}

블로그 이미지

얼음꿀차

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

,

7장 Exercise


1.
①조건식의 값이 1일 때만 참으로 간주한다.
    -> 조건식이 0이 아닌 양의 정수는 모두 참이다.
②반복루프가 중첩된 경우, break는 하나의 반복루프만 벗어날 수 있다(O)
③do..while문에서 조건식의 값이 거짓이면 한 번도 수행되지 않는다.
    -> 무조건 한 번은 실행하고 조건을 검사한다.
④for 문에서 초기식, 조건식, 증감식이 전부 비어 있으면 안 된다.
    -> 있을 수는 있으나 무한루프가 발생된다.
⑤for 문 안에 다른 for 문이 들어갈 수 있다(O)


2. ①, ③, ④


3. 0번
break문이 printf문보다 앞서기 때문에 출력하기 전에 루프에서 빠져나와서 한 번도 출력되지 않는다. 만약 printf문이 break문보다 앞선다면 x=5일 때, 한 번 출력되고 루프에서 빠져나온다.


4.

(a)     (b)    (c)     (d)    (e) *********    (f) 54321
0       0      0      10
3       3      2       9
6       6      4       8
9       9      6       ...
                8       2
                         1
                         0


5.

(a)

int i=10;
while(i>=0)
{
printf("%d\n", i);
i--;
}

(b)

int i;
for(i=10; i>=0; i-=3)
{
printf("%d\n", i);
}


6.    (a)11    (b)10


7.

(a) 기초식, 조건식, 증감식 중 증감식이 빠져있다. 증감식이 빠지면 무한루프가 발생한다. %d를 추가해야한다.

(b) 조건식과 증감식이 합쳐져 있다. 합쳐진 증감식은 조건식과 합쳐도 되고 그렇지 않아도 괜찮다. %d를 추가해야한다. while 구문에 ;를 삭제해야한다.

(c) i-- 를 i++ 로 바꾸어야 한다.

(d) 없음

(e) 기초식을 지정해주어야 무한루프가 발생하지 않는다.


8.

(a)

#include <stdio.h>


int main()

{

int i, sum;

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

sum = sum + i*i +1;

printf("%d\n", sum);

return 0;

}


(b)

#include <stdio.h>


int main()

{

int i, j, sum;

for(i=10; i<=30; i++)

{

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

sum = sum + i*j;

}

printf("%d\n", sum);

return 0;

}



블로그 이미지

얼음꿀차

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

,