:: 게시판
:: 이전 게시판
|
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다. 통합 규정을 준수해 주십시오. (2015.12.25.)
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
17/04/12 21:37
함수는 진짜 함순데 compute_ex가 e^x의 x를 실제로 받아서 e^x를 계산하겠다는 겁니다.
기본적으로 compute_e랑 비슷하지만 분자만 x^n으로 바꿔주면 되겠죠. x^n을 어떻게 할지는 k값에 따라 n을 정해주면 될 거 같은데 잘 생각해보세요
17/04/12 21:43
돌려보세요 크크 당연히 무한루프로 안돌아가겠죠. 문제에서도 given your own limitation이라고 하니 적당히 제한을 거시면 될거같네요
17/04/12 21:44
e 계산하는 함수부터 이상하네요.
우선 for(시작식;조건식;증감식) 문법은 지켜주셔야되구요. 저렇게 돌리면 무한루프 도는데다가 k에 그냥 대입하시면 마지막 n일때 1/n!값이 저장돼서 의미도 없어요. k값에 증가연산자(+=) 쓰셔야 sum이 됩니다. 문제 보면 n값을 임의로 지정하라고 돼있으니까, i를 1부터 n까지 k += 1/fact(i) 더해주시고 e^x 구하는건 다항함수 pow(x,i)를 사용해보세요. 사용법은 www.cplusplus.com에서 pow를 검색하시면 됩니다.
17/04/12 21:54
아 그리고 이건 일반적인 팁인데
한꺼번에 코드를 다짜고 컴파일하지 마시고 중간중간에 컴파일 해가면서 공부하세요. 초반에는 신택스 에러도 많이나고 무한루프도 돌리고 메모리할당도 어렵고 포인터도 헷갈리고... 컴파일이 안되거나 예상치 못한 값이 나올때가 많거든요. 그럴때는 의심되는 부분을 주석으로 바꿔가면서 어디가 잘못됐는지 확인하면서 코딩하는게 수월해요.
17/04/12 21:44
a,b 번의 for loop 도 이상한데요;
a 번 같은 경우는 int k=1; for(int i = n; i>0;i--){ k*=i; } 같이 해주어야 합니다. 변수 선언을 하면 초기화가 필요하고 for loop 에 반복하는 변수 같은 경우 새로 선언해 주는 편이 안정적입니다.
17/04/12 21:45
e^x 계산은... return value용 변수를 하나와 중간 계산값 저장용 변수를 하나씩 선언 해 놓은 후, for루프를 돌며 매 루프마다 return value에 중간 계산값을 더해주는 방식으로 풀이가 가능하겠죠.
for 루프 1회에는 return value에 1을 더해줍니다. for 루프 2회에는 1에다가 x를 곱하고 1로 나눠준 값을 return value에 더해주고, 중간 계산값에 기록합니다. for 루프 3회에는 중간 계산값에다가 또 x를 곱하고 1+1 값으로 나눠준 값을 return value에 더해주고, 중간 계산값에 새로 기록합니다. for 루프 4회에는 중간 계산값에다가 또 x를 곱하고 1+1+1 값으로 나눠준 값을 return value에 더해주고, 중간 계산값에 새로 기록합니다. . . . unlimite하게는 더하지 못한다 했으니, 사전에 지정한 횟수만큼만 더하도록 for 루프를 설정해줍니다. 이게 말로 설명하자니 좀 답답한데...for루프를 어떻게 이용할지 결정하셔야 합니다. 각 항마다 더해줄지, for루프를 반복할때마다 x를 곱해줄지 등등..
17/04/12 22:31
e^x 구하는 부분을 pow 함수 이용해서
double compute_ex(double x) { double k; double sum=1; for (k = 10; k >= 1; k--) { sum += pow(x, k) / fact(k); } return sum; } 요런식으로 생각해봤습니다. 횟수는 10번으로 지정했구요. 나머지부분은 약간씩 수정하여서 최종적으로 #include <stdio.h> #include <math.h> int fact(int n) { int k; for (k = 1; n >= 1; n--); { k *= n; } return k; } double compute_e() { int k; int n = 1; for (k = 1; n <= 10; n++) { k += 1 / fact(n); } return k; } double compute_ex(double x) { double k; double sum=1; for (k = 10; k >= 1; k--) { sum += pow(x, k) / fact(k); } return sum; } int main() { int a; double x; printf("a! = ? input a :"); scanf("%d", &a); printf("e^x = ? input x :"); scanf("%lf", &x); printf("na! = %d n", fact(a)); printf("e = %lf n", compute_e()); printf("e^%.lf = %lf n", x, compute_ex(x)); return 0; } 이렇게 해봤는데 일단 빌드는 성공해서 실행이 되는데 힌트에서 주어진대로 5, 3을 넣어봤더니 a! 구하는 도중에 윈도우 작동 중지되면서 오류가 나네요...
17/04/12 22:51
int fact(int n)
{ int k; for (k = 1; n >= 1; n--); { k *= n; } return k; } 함수가 int fact(int n) { [ int k = 1; ] [ for (int i = n; i >= 1; i--); ] { k *= i; } return k; } 로 수정되어야 합니다. 나머지 for문은 스스로 넣어보세요 흐흐
17/04/12 23:09
ㅠㅠ흐 신경써주셔서 감사한데 i가 정의 되지 않았다는 오류가 납니다....
for문 초기화 조건에 넣으면서 선언한 걸로 생각이 되는데요.
17/04/12 22:20
for문의 사용법 뿐만 아니라
interger (int)와 real number (float, double)도 이해가 조금 더 필요해보입니다. http://200315193.tistory.com/825 for loop는 연산과정에서는 덧셈을 하면 sigma연산, 곱셈을 하면 팩토리얼연산이라고 생각하면 됩니다. 뭐 그외에 응용하면 여러가지가 가능하긴 한데 일단은 말이죠... int sum = 0; for(int i = 0; i <= n; ++i) sum += i; 라는 문장은 sigma(i=0~n) i 라고 생각하시면 됩니다. int sum = 3; sigma(i=0~n) 2*i+3을 for 문으로 표현한다고 하면 for(int i = 0; i <= n; ++i) sum += 2*i; 이구요 sigma(i=0~n) f(i)는 for(int i = 0; i <= n; ++i) sum += f(i);가 되겠죠 또한, 나중에 하시게 될 수도 있을듯 한데 적분연산은 for문을 조금만 응용하면 됩니다.
|