人!
我被告知要创建下一个代码作为家庭作业。 如果你编译它 - 你可以轻松地看到它的目的。现在,我的问题是是否有办法缩短它(我是C的新手)。我必须使用结构和结构指针。这似乎是一个蹩脚的问题 - 对不起。 同样,我想知道是否可以打电话给#34; 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 = "
s = ∑
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;
}
答案 0 :(得分: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(")
希望它有所帮助!
答案 1 :(得分:1)
这是错误的。它能减少21/49的分数吗?它看起来不像。 reducer功能并不总是返回。在reducer函数中,您需要计算更高和更高的分母(提示:使用while循环),直到它不再被分割为止。
主递归有效。但这是一个非常糟糕的做法,往往会陷入混乱的错误代码中。如果在递归之后在return 0
之前放置任何内容,代码将开始表现得很疯狂。请改用while或while ... while循环。
此外,您可以避免主函数中的某些变量。