我需要为分配做以下事情,我遇到了很大困难:
一个.声明包含有理数的数据结构.
湾写f’xns会,–,*,/有理数.
所有f’xns必须传递3个参数,每个参数指向在a部分中声明的类型I的数据结构; 2个参数=操作数,第3个=结果.
C.编写一个f’xn,它将指向数据结构的指针作为参数,并返回数字的GCD. &安培; DENOM.
d.使用c部分中的f’xn编写一个将分数(有理数)减少到最低项的f’xn.传入指向分数的指针,并用f’xn修改分数.
即写入输入和输出功能,以便用户可以以1/5的形式输入分数.
一个.声明包含有理数的数据结构.
湾写f’xns会,–,*,/有理数.
所有f’xns必须传递3个参数,每个参数指向在a部分中声明的类型I的数据结构; 2个参数=操作数,第3个=结果.
C.编写一个f’xn,它将指向数据结构的指针作为参数,并返回数字的GCD. &安培; DENOM.
d.使用c部分中的f’xn编写一个将分数(有理数)减少到最低项的f’xn.传入指向分数的指针,并用f’xn修改分数.
即写入输入和输出功能,以便用户可以以1/5的形式输入分数.
我在正确的轨道上吗?我相信我有一个c-down,但不是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; }
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; }
解决方法
您的代码的一些评论:
>你没有完全遵循你的要求,因为当需要获取指向struct的指针时,GCD函数需要2个整数,并且你的函数将2个struct作为参数,当它们需要3个(指向)结构时返回另一个.
>你的GCD功能使用了一个很好的GCD实现(感谢Jonathan的评论),即使有些评论解释为什么对未来的读者会很好
>正如你在评论中所说,你应该在对它们进行操作之前减少有理数以避免不必要的溢出,并且在添加或减去有效性时,你应该使用denom的LCM出于同样的原因
>您的LCM算法很差.由于你的GCD很好,为什么不简单地使用:LCM(a,b)= a * b / GCD(a,b)计算为lcm =(a / gcb)* b以降低溢出风险(感谢@nm的简化形成)
> a / b的简化形式是’/ b’,其中’= a / GCD(a,b)和b’= b / GCD(a,b)
>对于输入和输出的“%d /%d”格式,结构的两个成员怎么样?
最后但并非最不重要的是,格式化“%c%* c”以获得对同一个问题的回答是可能但危险的:您可能会将前面输入的换行符转换为响应!选择一个面向行的输入(使用fgets sscanf)或自由格式输入(使用scanf或fscanf)并坚持使用它. %1s变成char响应[2]更安全……
并仔细写下评论,你只处理积极的理性或照顾标志!这样的细节可能会让图书馆的用户感到愤怒……更不用说挑剔老师了(credits为Jonathan Leffler).