윤시여 2022. 6. 25. 15:35

6번

순환기법을 이용하여 지수값을 계산하는 함수 power(int base, int power_raised)를 작성하고 테스트해보자. power(2, 3)이 호출되면 2^3을 계산하여 반환한다. 







워낙 시도를 많이해서 약 10트만에 성공했다. 
그러한 이유로 실패했던 코드들의 캡처가 없다. 
이 문제 하나로만 풀다가 쉬다가 1시간을 넘게 반복했기 때문이다. 

교재 397쪽의 팩토리얼 순환을 응용했다. 
처음에는 모든 제어 경로에서 값을 반환하지 않습니다. 오류가 떴는데, power_raised가 1 이하일 때의 값 없이 if와 base*power(base, power_raised-1)만을 이용했기 때문이다. 

power_raised<=1가 무슨 의미를 가졌는지 이해할 수 없었지만 정상적으로 코드가 작동하는 것을 보면서 power_raised에서 1을 계속 빼서 1이 되면 base만을 호출함으로써 순환을 끝내는 역할을 수행한다는 것을 이해할 수 있었다. 
더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int power(int, int);

int main(void)
{
int base, power_raised;

printf("밑수:");
scanf("%d", &base);

printf("지수:");
scanf("%d", &power_raised);

printf("%d", power(base, power_raised));

return 0;
}

int power(int base, int power_raised)
{
if (power_raised <= 1)
return base;

else
return (base * power(base, power_raised - 1));

}

 

7번

순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가 1234이면 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나ㅓ지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를들어서 4ㅡㄹ 출력하고 나머지 123을 가지고 다시 같은 함수를 순환 호출한다. 1234를 10으로 나누면 123이 되고 4는 123를 10으로 나눈 나머지이다. 

 



이진법의 형식을 그대로 따오면 된다. 
아랫부분의 힌트가 큰 도움이 된다. 
이번에는 런 타임 스택 오버플로우가 에러로 떴는데, 반복될 구간을 정해주지 않은 까닭에 함수가 무한히 작동되어서 생긴 오류였다. 
더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void show_digit(int);

int main(void)
{
int x;
printf("정수를 입력하시오: ");
scanf("%d", &x);

show_digit(x);

}
void show_digit(int x)
{
if (x > 0)
{
show_digit(x / 10);
printf("%d  ", x % 10);
}

}

 

8번

주어진 정수가 몇 개의 자리수를 가지고 있는지를 꼐산하는 프로그램을 순환을 이용하여 작성해보자. 예를 들어서 12345의 경우에는 5가 출력된다. 

 

1트 이번만큼은 실수를 기록해야겠다




순환될 때마다 프린트문이 실행되어서 5가 5번, n자리수 인 경우 n이 n번 호출되는 문제가 발생했다. 

 

2트




이를 해결하기 위해서 print문을 main함수로 이전시키고, a 값을 return 해주는 함수를 만들었다.

정확하게 해결된 원리를 설명할 수는 없지만 ... return은 함수의 값을 반환해주는 장치로 생각이 되므로.. 하나의 값 만을 들고 나올 수 있게 해준다고 이해가 된다. 

printf : 이러한 a를 출력해줄게요! 
return: 이번 함수 처리 결과, 결과값은 a입니다. 

이런 느낌이다... 
더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int number(int);

int main(void)
{
int x;

printf("정수를 입력하시오: ");
scanf("%d", &x);

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

}

int number(int x)
{
static int a=1;
int b = x / 10;

if (b >= 1)
{
a++;
number(b);
return a;
}


else
return a;
}

 

9번

앞의 문제와 유사한 문제이다. 자리수의 합계를 계산하는 프로그램을 순환을 이용하여 작성해보자. 예를 들어서 123의 경우에는 6이 출력된다. 

 

날아갔다

복붙해서 살린다.




12로 예를 들어보자

add(12)
a=2, b=1이므로 2+add(1)이 된다. 

add(1)
a=1, b=0이므로 a, 즉 1을 반환한다. 

따라서 
add(12) = 2+1=3을 반환해준다. 


더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int add(int);

int main(void)
{
int x;

printf("정수를 입력하시오: ");
scanf("%d", &x);

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

return 0;
}

int add(int x)
{
int a, b;
a = x % 10;
b = x / 10;

if (b >= 1)
return(a + add(b));

else
return a;
}

 

12번

순환 호출을 이용하여 피보나치 수열을 계산해보자. 피보나치 수열이란 다음과 같이 정의되는 수열이다. 

 

1트

 

2트

오래 고민했는데 드디어 필이 왔다. ==이다. 제발 맞으면 좋겠다.

빙고! 

책에서 9까지만 했는데, 원하면 더 많이도 할 수 있다. 

바로 이렇게

더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int fib(int);

int main(void)
{
int x=0;
while (x < 10)
{
printf("fib(%d) = %d\n", x, fib(x));
x++;
}

return 0;
}

int fib(int x)
{
if (x == 0)
return x;

else if (x == 1)
return 1;

else
return (fib(x - 2) + fib(x - 1));
}

 

 

6월 4일 과제 3번 수정

https://one-enough.tistory.com/50?category=1012824 

 

0604 과제는 어렵다

먼저 과제를 시작하기 전에 개념이 잘 이해 안가서 책에 나온 예제를 그대로 배껴보았다. 정적 지역 변수 (static int scount)는 자동 지역 변수와 달리 함수의 호출이 끝나도 값이 소멸되지 않아 이

one-enough.tistory.com

check 하나만 써서 할 수 있게 바꾸는 거였는데 생각보다 시행착오가 많았다. 






먼저 지난번 과제에서는 (대체 어떤 흐름인 거지?) 한 번만에 맞추는 경우에 바로 어서오세요! 가 아니라 비밀번호를 묻는 문구가 한 번 더 출력이 되었다. 이는 check()가 한 번 더 소환되는 과정에서 생긴 오류인데, 나는 이걸 파악하지 못했다. 

이번에도 사실 5번 이상 시도를 하면서 같은 문제로 애를 먹었다. 가장 중요한 부분은 check가 한 번만 실행되도록 하는 것이었다. 

가령 int c = check()로 설정하고 if(check() == 1)로 한다면, check를 판단하기 위해서 check()가 두 번 실행돼 한 번에 맞춰도 두 번 물어보는 일이 똑같이 발생했다. 

그래서 do while문을 사용했다. 왜 switch 문을 쓰지 않느냐는 얘기를 들은 것도 같은데... t가 3보다 작은 동안 c=check()고 이를 판단하는 if와 else 문을 사용하면 해결이다. 
더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int PASSWORD = 1234;
int check();

int main(void)
{
static int t = 0;
int c;

do
{
c = check();

if (c == 1)
{
t++;
}

else
{
printf("어서오세요!");
return 0;
}
} while (t < 3);


if (t == 3)
{
printf("로그인 시도횟수 초과");
return 0;
}

}

int check()
{
int x;

printf("비밀번호: ");
scanf("%d", &x);

if (x == PASSWORD)
return 0;

else
return 1;
}

 

스위치문을 이용해서도 해보았다. 
작동 잘 된다. 
더보기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int PASSWORD = 1234;
int check();

int main(void)
{
static int t = 0;
int c;

do
{
c = check();

switch (c)
{
case 1:
t++;
break;
default:
printf("어서오세요!");
return 0;
break;
}

} while (t < 3);


if (t == 3)
{
printf("로그인 시도횟수 초과");
return 0;
}

}

int check()
{
int x;

printf("비밀번호: ");
scanf("%d", &x);

if (x == PASSWORD)
return 0;

else
return 1;
}

 

사실 코로나 함수 과제가 남았다는 걸 잘 알고 있다.

그러나 일단.. 밥 먹고 논문을 볼 생각이다. 

낮에 수업한다고 했으니 정말 제출하고 와야겠다.