2011-12-20 59 views
1

人!制作长码较短

我被告知创建下一个代码作为作业。 如果你编译它 - 你很容易看到它的目的。现在,我的问题是是否有办法缩短它(我是C新手)。我必须使用结构体和结构体指针。这似乎是一个蹩脚的问题 - 对此感到遗憾。 同样,我想知道是否可以反复调用“main()”。

#include <stdio.h> 

typedef struct frac{ 
    int num; 
    int den; 
}; 

int reducer(struct frac *fi){ 
    if(fi->num == 0) return 0; 
    if(fi->den == 1) return 1; 
    if(fi->num % fi->den == 0){ 
     fi->num /= fi->den; 
     fi->den /= fi->den; 
     return reducer(fi); 
    } 
    if(fi->num % 2 == 0 && fi->den % 2 == 0){ 
     fi->num /= 2; 
     fi->den /= 2; 
     return reducer(fi); 
    } 
    else if(fi->num % 3 == 0 && fi->den % 3 == 0){ 
     fi->num /= 3; 
     fi->den /= 3; 
     return reducer(fi); 
    } 
} 

int main(){ 
    char c , tt; 
    struct frac one , two , multi , quot , sum , diff , *o , *t , *m , *q , *s , *d; 
    printf("Please, enter the first fraction, ieg. 3/8:\n"); 
    scanf("%d/%d%c" , &one.num , &one.den , &tt); 
    printf("Now the second fraction (numerator/denominator):\n"); 
    scanf("%d/%d%c" , &two.num , &two.den , &tt); 
    o = &one; 
    t = &two; 
    m = &multi; 
    q = &quot; 
    s = &sum; 
    d = &diff; 
    m->num = o->num * t->num; // product numerator 
    m->den = o->den * t->den; // product denominator 
    q->num = o->num * t->den; // quotient numerator 
    q->den = o->den * t->num; // quotient denominator and so on... 
    s->num = q->num + q->den; 
    s->den = m->den; 
    d->num = q->num - q->den; 
    d->den = m->den; 
    reducer(q); 
    reducer(m); 
    reducer(s); 
    reducer(d); 
    printf("%d/%d + %d/%d = %d/%d\n" , o->num , o->den , t->num , t->den , s->num , s->den); 
    printf("%d/%d - %d/%d = %d/%d\n" , o->num , o->den , t->num , t->den , d->num , d->den); 
    printf("%d/%d * %d/%d = %d/%d\n" , o->num , o->den , t->num , t->den , m->num , m->den); 
    printf("%d/%d : %d/%d = %d/%d\n" , o->num , o->den , t->num , t->den , q->num , q->den); 
    printf("\nWould you like to make another calculation? (y/n):\n"); 
    scanf("%c" , &c); 
    if(c == 121 || c == 89){ 
     return main(); 
    } 
    return 0; 
} 
+1

我*认为*这类问题属于codereview,而不是stackoverflow。不知道,但 – MByD 2011-12-20 16:46:46

+1

*如果你编译它 - 你很容易看到它的目的。*为什么我们应该?解释它是我们可以提供帮助的地方,而不是相反。 – Constantinius 2011-12-20 16:46:56

+1

我知道调用'main()'在C++中是非法的,但即使它在C中是允许的,这可能不是一个好主意,更不用说你这样做的理由是根本上有缺陷的,并且你应该有'for'或'while while'循环。 – 2011-12-20 16:47:01

回答

1

以下是一些建议:

  • 使用一个循环,而不是递归。这是更自然在这种情况下,它不会使堆成长与每一次迭代:

    int finish; 
    do 
    { 
        //... 
        printf("\nWould you like to make another calculation? (y/n):\n"); 
        scanf("%c" , &c); 
        finish = c != 121 && c == 89; 
    } 
    while (!finish) 
    
  • 您可以删除所有的指针声明,并直接与分数自己工作。

    multi.num = one.num * two.num; // product numerator 
    // ... 
    reducer(&quot) 
    

希望它能帮助!

1

这是错误的。它可以减少21/49分数吗?它看起来不像。减速器功能并不总是返回。在reducer函数中,您将需要计算越来越高的分母(提示:使用while循环),直到不能再分割为止。

主递归作品。但这是一个非常糟糕的做法,往往会以混乱的窃听代码结束。如果你在递归之前把任何东西放在return 0之前,你的代码就会开始变得疯狂。使用一段时间或做... while while循环。

此外,您可能会避免主函数中的一些变量。

+0

如果我有1/199982239283的一小部分 - 是否可以合理地制定一个更高和更高的分母循环? – 2011-12-20 17:07:49

+0

呃,实际上循环会转到min(num,den)。然而,如果你得到类似5367545/18367213的东西,这还是远远不够理想的。理想情况下,您应该实施LCM功能。 – 2011-12-20 17:16:54