C 缩短长代码

C 缩短长代码,c,structure,C,Structure,人们 我被告知创建下一个代码作为家庭作业。 如果你编译它-你会很容易看到它的目的。现在,我的问题是是否有一种方法可以使它变短(我是C新手)。我必须使用结构和结构指针。这似乎是一个站不住脚的问题——对此表示抱歉。 另外,我想知道重复调用“main()”是否合适 #include <stdio.h> typedef struct frac{ int num; int den; }; int reducer( struct frac *fi ){ if( fi-

人们

我被告知创建下一个代码作为家庭作业。 如果你编译它-你会很容易看到它的目的。现在,我的问题是是否有一种方法可以使它变短(我是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;
}
#包括
类型定义结构压裂{
int-num;
int den;
};
整型减速器(结构压裂*fi){
如果(fi->num==0)返回0;
如果(fi->den==1)返回1;
如果(fi->num%fi->den==0){
fi->num/=fi->den;
fi->den/=fi->den;
回流减速机(fi);
}
如果(fi->num%2==0&&fi->den%2==0){
fi->num/=2;
fi->den/=2;
回流减速机(fi);
}
否则如果(fi->num%3==0&&fi->den%3==0){
fi->num/=3;
fi->den/=3;
回流减速机(fi);
}
}
int main(){
字符c,tt;
结构分形一、二、多、quot、和、差、*o、*t、*m、*q、*s、*d;
printf(“请输入第一个分数,ieg.3/8:\n”);
scanf(“%d/%d%c”、&one.num、&one.den、&tt);
printf(“现在是第二个分数(分子/分母):\n”);
scanf(“%d/%d%c”、&two.num、&two.den、&tt);
o=&1;
t=&2;
m=&multi;
q=”
s=&sum;
d=&diff;
m->num=o->num*t->num;//乘积分子
m->den=o->den*t->den;//产品分母
q->num=o->num*t->den;//商分子
q->den=o->den*t->num;//商分母等等。。。
s->num=q->num+q->den;
s->den=m->den;
d->num=q->num-q->den;
d->den=m->den;
减速器(q);
减速器(m);
减速器;
减速器(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(“\n是否要进行另一次计算?(y/n):\n”);
scanf(“%c”、&c);
如果(c==121 | | c==89){
返回main();
}
返回0;
}

以下是一些建议:

  • 使用循环而不是递归。在这种情况下,循环更自然,并且不会使堆栈随着每次迭代而增长:

    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)
    

希望有帮助!

这是错误的。它能减少分数21/49吗?看起来不像。减缩函数并不总是返回。在减缩函数中,您需要计算越来越高的分母(提示:使用while循环),直到它不能再被除

主递归是有效的。但这是一种非常糟糕的做法,往往会导致代码出现混乱的错误。如果在递归之后在
返回0
之前放置任何内容,则代码将开始表现出疯狂的行为。请使用while或do…while循环


此外,您可以避免在main函数中使用一些变量。

我认为这类问题属于codereview,而不是stackoverflow。不确定您是否编译了它-您会很容易看到它的用途。为什么要这样做?您有责任在我们可以帮助的地方解释它,而不是相反。我知道调用
main()在C++中是非法的,但是即使在C中允许,它也不是一个好主意,更不用说你的推理是有缺陷的,你应该有< <代码> > 或<>代码>而<代码> >循环。“包含在一个while循环中?@Constantinius你是对的。代码假设得到两个有理数,并用它们的约化值进行简单计算。如果我有一个分数1/199982239283-这是否是一个由越来越高的分母组成的循环合理?事实上,循环将转到min(num,den)。然而,如果您得到类似于5367545/18367213的数据,这仍然远远不够理想。理想情况下,您应该实现LCM功能。