一个.声明包含有理数的数据结构.
湾写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; };FractionFraction 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;}
删除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;}解决方法 您的代码的一些评论:
>你没有完全遵循你的要求,因为当需要获取指向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).
总结以上是内存溢出为你收集整理的C分数算术全部内容,希望文章能够帮你解决C分数算术所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)