usu*_*uck 7 c struct rational-numbers pointer-arithmetic fractions
对于我需要做的以下事情,我遇到了很大的困难:
a.声明包含有理数的数据结构.
湾 写f'xns将+, - ,*,/有理数.
所有f'xns必须传递3个参数,每个参数指向在a部分中声明的类型I的数据结构; 2个参数=操作数,第3个=结果.
C.编写一个f'xn,它将指向数据结构的指针作为参数,并返回数字的GCD.&denom.
d.使用c部分中的f'xn来编写一个将分数(有理数)减少到最低项的f'xn.传入指向分数的指针,并用f'xn修改分数.
即 写入输入和输出功能,以便用户可以以1/5的形式输入分数.
应允许用户输入任意数量的问题,程序应以最低的条件输出答案.
我是在正确的轨道上吗?我相信我有下降,但不是d,尤其是e.有人可以指导我或帮我纠正我的剧本吗?
int GCD (int numer, int denom)
{
int result;
while (denom > 0) {
result = numer % denom;
numer = denom;
denom = result;
}
return numer;
}
int getLCM (int numer, int denom)
{
int max;
max = (numer > denom) ? numer : denom;
while (1) {
if (max % numer == 0 && max % denom == 0)
break;
++max;
}
return max;
}
struct Fraction
{
int numer;
int denom;
};
typedef struct
{
int numer;
int denom;
};
Fraction
Fraction add_fractions (Fraction a, Fraction b)
{
Fraction sum;
sum.numer = (a.numer * b.denom) + (b.numer * a.denom);
sum.denom = a.denom * b.denom;
return sum;
}
Fraction subtract_fractions (Fraction a, Fraction b)
{
Fraction sum;
sum.numer = (a.numer * b.denom) - (b.numer * a.denom);
sum.denom = a.denom * b.denom;
return sum;
}
Fraction multiply_fractions (Fraction a, Fraction b)
{
Fraction sum;
sum.numer = (a.denom * b.denom);
sum.denom = (a.numer * b.numer);
return sum;
}
Fraction divide_fractions (Fraction a, Fraction b)
{
Fraction sum;
sum.numer = (a.denom * b.numer);
sum.denom = (a.numer * b.denom);
return sum;
}
int main ()
{
char response;
printf ("FRACTION ARITHMETIC PROGRAM\n");
printf ("Enter your problem (example 2/3 + 1/5):\n");
scanf (, &problem);
if (denom == 0 || denom < 0) {
printf ("Illegal input!!\n");
printf ("Another problem (y/n)? ");
scanf ("%c%*c", &response);
} else {
printf ("The answer is ");
printf ("Another problem (y/n)? ");
scanf ("%c%*c", &response);
}
while ((response == 'y') || (response == 'Y')) {
printf ("\nWould you like to play again?\n");
scanf ("%c%*c", &response);
}
while ((response == 'n') || (response == 'N'))
printf ("Goodbye and thank you");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
删除typedef后编辑感谢评论回复:
struct Fraction {
int numer;
int denom;
};
struct Fraction add_fractions (struct Fraction a, struct Fraction b)
{
struct Fraction sum;
sum.numer = (a.numer * b.denom) + (b.numer * a.denom);
sum.denom = a.denom * b.denom;
return sum;
}
struct Fraction subtract_fractions (struct Fraction a, struct Fraction b)
{
struct Fraction sum;
sum.numer = (a.numer * b.denom) - (b.numer * a.denom);
sum.denom = a.denom * b.denom;
return sum;
}
struct Fraction multiply_fractions (struct Fraction a, struct Fraction b)
{
struct Fraction sum;
sum.numer = (a.denom * b.denom);
sum.denom = (a.numer * b.numer);
return sum;
}
struct Fraction divide_fractions (struct Fraction a, struct Fraction b)
{
struct Fraction sum;
sum.numer = (a.denom * b.numer);
sum.denom = (a.numer * b.denom);
return sum;
}
Run Code Online (Sandbox Code Playgroud)
您的代码的一些注释:
LCM(a,b) = a * b / GCD(a,b)计算来lcm = (a/gcb) * b降低溢出风险(感谢 @nm 的简化形式)"%d/%d"具有结构体两个成员的输入和输出格式怎么样?最后但并非最不重要的一点是,"%c%*c"获取 ay/n 问题答案的格式是可能的,但很危险:您可能会得到前面输入的换行符!fgets选择面向行的输入(使用+ sscanf)或自由格式输入(使用scanf或)之一fscanf并坚持下去。%1s进入achar response[2]更安全...
并在评论中仔细写下您只处理积极的理性或注意符号!这样的细节可能会让图书馆的用户相当生气……更不用说吹毛求疵的老师了(Jonathan Leffler的作品)。