2014-02-16 3 views
0

좋아, 얘들 아, 이건 숙제가 되었어. 제출 되었으니 나는 78 :을 받았다. 교수님이 내 이메일을 보내 주셨습니다. 지금 여기 있습니다.분수 감소 C 프로그램

코드의 첫 번째 부분은 분수를 가장 낮은 형식으로 줄이기로되어 있으며 최대 공통 분모가 10을 초과하는 경우를 제외하고는 작동합니다. 이것은 C 클래스에 대한 소개이며 경험이 거의 없습니다. C와 그 특이성. 어떤 도움 /지도/아이디어가있는 GCD 문제 ..? 당신은 무조건 당신의 감소 루프에 break, 그래서 한 번 이상 당신이 결코 루프 더

#include <stdio.h> 

int main (void) 
{ 
int num; 
int den; 
int x; 
int y; 
int i; 
int a; 
int n; 
int w; 
int j; 

printf("\n *************Question 1 *************** \n"); 
printf("Please enter the numerator: "); 
scanf("%d", &num); 
printf("Please enter the denominator: "); 
scanf("%d", &den); 
printf("The fraction entered is: \n %d/%d \n", num, den); 
if (num > den) 
x=den; 
else 
    x=num; 
for(i=x; i>=1; i--){ 
     if(num % i == 0 && den % i == 0){ 
         printf("This fraction can be reduced! \n"); 
       num = num/i; 
       den = den/i; 
        printf("The reduced fraction is %d/%d \n \n", num, den); break;} 
     else 
      printf("This fraction cannot be reduced any further \n"); 
       break; 
} 
printf("\n ***************Question 2****************** \n"); 
printf("Please enter a number and I will print the even squares up to your input "); 
scanf("%d", &n); 
for (w=1; w<=n; w++) 
     if (w*w%2 == 0 && w*w <= n) 
printf("%d \n", w*w); 

printf("Question 5 test... please enter 10.3 then 5 then 6 "); 
scanf("%d%f%d",&i,&x,&j); 
printf("%d %f %d \n",i,x,j); 

return 0; 
} 
+3

2. 당신은에 대한 + 1 얻을 명제)가 숙제이고 우리에게 유클리드에 의해 설명되었다 b) 귀하 뭔가를 시도했다. 그러나 다른 코드를 들여 쓰기를하십시오 –

+1

아마도 코드의 가독성이 낮아서 22 퍼센트의 추가 포인트를 많이 잃어 버렸을 것입니다. 가독성의 중요성을 절대로 과소 평가하지 마십시오. 또한 변수의 이름을 더 의미있게 지정하는 것이 좋을 것이며 코드가 수행해야하는 작업이나 수행해야 할 작업을 나타내는 주석이 전혀 없습니다. –

답변

4

. 루프의 마지막에 break을 넣으면 안됩니다. 즉, "우리가 gcd를 찾았는지 아니면 이 아니고 제수가 발견되어이 작동하지 않으면 멈추지 않아야합니다."라는 의미입니다.

 else 
      printf("This fraction cannot be reduced any further \n"); 
       break; 

당신이 printf와 그룹 break 의도 :

+0

@EricPostpischil 당신이 옳아 (서식을 지정하면 코드를 읽기가 어렵게됩니다), 어느 쪽이든 무조건 부러집니다. – hobbs

+0

감사합니다! 나는 임무를 꼼짝 않고 몇 시간을 보냈다. 내 "else"문을 완전히 삭제 한 후 코드가 완벽하게 작동합니다. else 문은 내 코드가 루프를 반복하지 못하게합니다. 당신의 도움을 주셔서 감사합니다 –

1

이 코드에서 것으로 보인다

 else 
     { 
      printf("This fraction cannot be reduced any further \n"); 
       break; 
     } 

그러나, 어느 쪽이 올바르지 않습니다. 루프의 첫 번째 반복은 if의 then 절을 수행하여 부분을 줄이고 루프를 종료하거나 else 절을 ​​수행 한 다음 중단합니다 (breakprintf과 그룹화되어 있는지 여부에 관계없이).). 첫 번째 반복이 분수를 감소시키지 않으면 루프를 계속할 의도가 있습니다. 이를 수행하려면 else, printfbreak이 루프에 없어야합니다.

대신 루프가 완료 될 때까지 반복을 계속 실행할 수 있도록해야 중 하나를 다음 절에서 break 성공적인 감소를 종료하거나 for 문에서 제어 표현식은 루프를 종료하기 때문에, i가 0이되면 있기 때문에 .

루프가 끝나면 i이 0인지 테스트 할 수 있습니다. 이렇게하면 감소가 수행되어 (그리고 break이 실행 되었기 때문에) 루프가 종료되었는지 또는 루프가 모든 반복을 소모했기 때문에 알 수 있습니다. 후자의 경우, 그러한 메시지를 인쇄하려면 분수를 줄일 수 없다는 메시지를 인쇄 할 수 있습니다.

중요한 기술은 루프가 실행되는 방식을 검사하여 이와 같은 문제를 디버깅하는 방법을 배우는 것입니다. 디버거에서 프로그램을 단계별로 실행하거나 printf 문을 삽입하여 루프의 각 반복에서 일어나는 일을보고 할 수 있습니다. 이것은 루프가 입력에 관계없이 하나의 반복 만 실행한다는 것을 나타냅니다.

덧붙여 말하자면 잠재적 인 약수가 발견 될 때까지 테스트하는 것보다 훨씬 더 나은 분수 감소 알고리즘이 있습니다. 약 2천3백년 오래되어 요소, 책 (장) VII, 1

0
for(i=x; i>1; i--) 
{ 
    if(num % i == 0 && den % i == 0) 
    { 
     break; 
    } 
} 
if (i > 1) 
{ 
    printf("This fraction can be reduced! \n"); 
    num = num/i; 
    den = den/i; 
    printf("The reduced fraction is %d/%d \n \n", num, den); 
} 
else 
    printf("This fraction cannot be reduced any further \n");