2014-02-16 38 views
0

好吧伙计们,所以这是一个家庭作业,但它已被提交,我收到了78:。我的教授尚未回复我的帮助电子邮件所以我现在在这里。分数减少C程序

代码的第一部分应该是将分数减少到最低的形式,它的工作原理除非当最大公分母大于10时。这是C类的介绍,我几乎没有经验与C和它的特殊性。任何有关GCD问题的帮助/指导/想法..?

#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

你对得到一个+ 1)告诉我们它是家庭作业,由欧几里德描述b)您尝试过一些东西。但请在缩进 –

+1

处有另一个,由于代码的易读性较低,您可能会损失大部分额外的22个百分点。永远不要低估可读性的重要性。另外,你最好更有意义地给你的变量命名,并且根本没有评论来表明你的代码是/应该做什么。 –

回答

4

break无条件地在你的简循环,所以你永远循环不止一次。你不应该在循环结束时使用break,这意味着“我们是否找到了gcd,或者我们发现一个除数不是工作,停止寻找。”

+0

@EricPostpischil你是对的(格式化使代码难以阅读),但无论如何它无条件地打破。 – hobbs

+0

谢谢!经过几个小时的盯着任务,我发现了这一点。删除我完整的“其他”声明后,我的代码工作得很好。 else语句阻止我的代码重复循环。谢谢你的帮助 –

1

这很可能是,在此代码:

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

您打算组breakprintf

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

然而,无论哪种方式不正确。正如所写,循环的第一次迭代将执行if的then-clause,这会减少分数并退出循环,或执行else子句然后中断(break是否与printf分组或不分组)。如果第一次迭代不减少分数,则您的意图是循环继续。为此,elseprintfbreak根本不应该在循环中。

相反,你应该允许循环继续执行迭代,直到它完成要么是因为当时的子句中的break有成功的减少终止,或因为for语句中的控制表达式结束循环,当i达到零。

循环后,您可以测试i是否为零。这将告诉你循环是否因为执行了缩减而结束(并且执行了break),或者因为循环耗尽了所有迭代。在后一种情况下,如果您希望打印此类消息,则可以打印消息,指出不能缩小分数。

一个重要的技能是通过检查循环的执行方式来学习调试这样的问题。您可以通过在调试器中单步调试程序或插入printf语句来报告循环的每次迭代中发生的情况。这将显示循环只执行一次迭代,而不管输入如何。

顺便说一句,有一个更好的算法来减少分数比测试潜在的除数,直到找到一个。这是约2300年老在元素,书(章)七,命题1和2

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");