C++学习的简单问题(二)
2013-04-09 00:19 liuzq2013 阅读(431) 评论(0) 收藏 举报实现一个表示分数的Fraction类。在该类中有两个数据成员分别用于存储分数的分子和分母。函数成员中包含一个设置分子和分母的函数assign(),转换成double 类型数值的函数convert(),交换分子和分母的函数invert()以及一个输出分数的函数print(),请注意输出结果格式:若分子分母同时为0,则输出字符串“#NAN”;若只有分母为0,则输出字符串“#INF”;其余情况输出最简分式,即最大公因子已被约去后的形式;当分子为0,分母为负数时,注意结果应输出0,而非“-0”。 第一步:首先通过枚举类型Flag来定义表示分值求值结果的状态,NORMAL表示两个非零数相除,NAN表示分子分母同时为0,INF表示分子不为0而分母为0。 enum Flag { NORMAL, NAN, INF }; 第二步:依据题意实现Fraction类。
class Fraction { // 请补充 double convert( Flag & flag ); }; 第三步:依据下列测试程序对所编写的Fraction类进行测试。 int main() { int num; // 分子 int den; // 分母 // 依次输入分子、分母 cin >> num >> den; Fraction z; z.assign( num, den ); cout << "z = "; z.print(); Flag flag; double val = z.convert(flag); switch(flag) { case NORMAL: cout << " = " << val << endl; break; case NAN: cout << " = #NAN" << endl; break; case INF: cout << " = #INF" << endl; break; default: break; } z.invert(); cout << "1/z = "; z.print(); cout << endl; return 0; }
示例1:
输入格式
0 -100
输出格式
z = 0/-1 = 0 1/z = -1/0 示例2:
输入格式
100 0
输出格式
z = 1/0 = #INF 1/z = 0/1 示例3:
输入格式
24 -36
输出格式
z = 2/-3 = -0.666667 1/z = -3/2
#include <iostream> using namespace std; enum Flag { NORMAL, NAN, INF, }; int abs(int a) { if(a<0) a=-a; return a; } int gcd(int m,int n) { int t; while(n>0) { t=n; n=m%n; m=t; } return m; } class Fraction { private: int num,den; public: Fraction() { num=1; den=1; } void assign(int n,int d) { num=n; den=d; } double convert( Flag & flag ) { if(num==0&&den==0) { flag=NAN; return -2; } else if(num!=0&&den==0) { flag=INF; return -1; } else { flag=NORMAL; if(num==0) return 0; return (double)num/den; } } void invert() { int temp; temp=num; num=den; den=temp; } void print() { if(num==0&&den==0) cout<<0<<"/"<<0; else if(num!=0&&den==0) cout<<(num/abs(num))<<"/"<<0; else { if(num==0) cout<<0<<"/"<<(den/abs(den)); else { int a=gcd(abs(num),abs(den)); if(num<0&&den<0) cout<<(abs(num)/a)<<"/"<<(abs(den)/a); else cout<<(num/a)<<"/"<<(den/a); } } } }; int main() { int num; // 分子 int den; // 分母 cin >> num >> den; Fraction z; z.assign( num, den ); cout << "z = "; z.print(); Flag flag; double val = z.convert(flag); switch(flag) { case NORMAL: cout << " = " << val << endl; break; case NAN: cout << " = #NAN" << endl; break; case INF: cout << " = #INF" << endl; break; default: break; } z.invert(); cout << "1/z = "; z.print(); cout << endl; return 0; }
作为一个学数学的,一开始竟然没反应过来0和任意正整数的最大公约数是那个数本身...也只有编程题才会涉及到到0和其它数的公约数...
浙公网安备 33010602011771号