1 //currency类
2
3 #include<iostream>
4 using namespace std;
5
6 enum signType { p = 1, m = -1 };//枚举
7
8 class currency
9 {
10 //enum signType { p, m };//枚举
11 public:
12 //构造函数
13 currency(signType theSign = p,
14 unsigned long theDollors = 0,
15 unsigned int theCents = 0);//如果此处有{},则此处为构造函数的定义,如果没有则定义放在类外部
16 //析构函数
17 ~currency()
18 {
19
20 }
21 void setValue(signType, unsigned long, unsigned long);
22 void setValue(double);
23 signType getSign();
24 unsigned long getDollors();
25 unsigned int getCents();
26 currency add(const currency &)const;
27 //此函数不改变传入的参数,所以有第一个const,此函数不改变调用此函数对象,所以有第二个const
28 currency & increment(const currency &);
29 void increment2(const currency &);
30 //此函数不改变传入的参数,所以加const。但是改变了调用此函数的对象。
31 void input();//输入值返回给调用对象
32 currency percent(double x);//返回调用对象的占比x
33 currency subtract(const currency& x);
34 currency multiply(double x);//返回调用对象的x倍
35 currency divide(double x);//返回调用对象的1/x倍
36 friend ostream & operator <<(ostream & output, const currency & x);
37 private:
38 /*
39 成员变量的初始化有两种方式:
40 1、列表初始化,是真正的初始化,效率高
41 2、在构造函数体内赋值,不是真正的初始化,效率较慢
42 常成员变量必须在构造函数的初始化列表中进行初始化
43 静态变量只能在类外初始化,且不加关键字static
44 */
45 signType sign;
46 unsigned long dollors;
47 unsigned int cents;
48 };//此处的分号不能忘记
49 currency::currency(signType theSign, unsigned long theDollors, unsigned int theCents)
50 {
51 setValue(theSign, theDollors, theCents);
52 }
53 void currency::setValue(signType theSign, unsigned long theDollors, unsigned long theCents)
54 {
55 if (theCents > 99)
56 throw("cent should be <99");
57 sign = theSign;
58 dollors = theDollors;
59 cents = theCents;
60 }
61 void currency::setValue(double theAmount)
62 {
63 if (theAmount > 0)
64 sign = p;
65 else
66 sign = m;
67 dollors = (unsigned long)theAmount;
68 cents = (theAmount - dollors + 0.001) * 100;
69 }
70 signType currency::getSign()
71 {
72 return (*this).sign;//注意this是一个指针,不能用this.sign,正确写法为this->sign或者(*this).sign,*比.优先级低,所以加()
73 }
74 unsigned long currency::getDollors()
75 {
76 return this->dollors;
77 }
78 unsigned int currency::getCents()
79 {
80 return this->cents;
81 }
82 currency currency::add(const currency & x)const
83 {
84 long a1, a2, a3;
85 currency result;
86 a1 = dollors * 100 + cents;
87 if (sign == m)
88 a1 = -a1;
89 a2 = x.dollors * 100 + x.cents;
90 if (x.sign == m)
91 a2 = -a2;
92 a3 = a1 + a2;
93 if (a3 < 0)
94 {
95 result.sign = m;
96 a3 = -a3;
97 }
98 else
99 {
100 result.sign = p;
101 }
102 result.dollors = a3 / 100;
103 result.cents = a3 - result.dollors * 100;
104 return result;
105 }
106 currency & currency::increment(const currency & x)
107 {
108 *this = this->add(x);
109 return *this;
110 }
111 void currency::increment2(const currency & x)
112 {
113 long a1, a2, a3;
114 a1 = dollors * 100 + cents;
115 if (sign == m)
116 a1 = -a1;
117 a2 = x.dollors * 100 + x.cents;
118 if (x.sign == m)
119 a2 = -a2;
120 a3 = a1 + a2;
121 if (a3 < 0)
122 {
123 this->sign = m;
124 a3 = -a3;
125 }
126 else
127 {
128 this->sign = p;
129 }
130 this->dollors = a3 / 100;
131 this->cents = a3 - this->dollors * 100;
132 }
133 void currency::input()//输入值返回给调用对象
134 {
135 double mon;
136 cout << "请输入金额:";
137 cin >> mon;
138 if (mon < 0)
139 sign = m;
140 else
141 sign = p;
142 dollors = (unsigned long)mon;
143 cents = (mon - dollors + 0.001) * 100;
144 }
145 currency currency::subtract(const currency& x)
146 {
147 currency result;
148 long a1, a2, a3;
149 a1 = dollors * 100 + cents;
150 if (sign == m)
151 a1 = -a1;
152 a2 = x.dollors * 100 + x.cents;
153 if (x.sign == m)
154 a2 = -a2;
155 a3 = a1 - a2;
156 if (a3 < 0)
157 result.sign = m;
158 else
159 result.sign = p;
160 if (a3 < 0)
161 a3 = -a3;
162 result.dollors = a3 / 100;
163 result.cents = a3 - result.dollors * 100;
164 return result;
165 }
166 currency currency::percent(double x)//返回调用对象的占比x
167 {
168 currency result;
169 result.sign = sign;
170 double mon = (dollors * 100 + cents)*x / 100;
171 result.dollors = mon / 100;
172 result.cents = mon - result.dollors * 100;
173 return result;
174 }
175 currency currency::multiply(double x)//返回调用对象的x倍
176 {
177 currency result;
178 double a;
179 if (x > 0)
180 result.sign = sign;
181 else
182 {
183 if (sign == p)
184 result.sign = m;
185 else
186 result.sign = p;
187 }
188 a = (dollors * 100 + cents)*x;
189 result.dollors = a / 100;
190 result.cents = a - result.dollors * 100;
191 return result;
192 }
193 currency currency::divide(double x)//返回调用对象的x倍
194 {
195 currency result;
196 double a;
197 if (x > 0)
198 result.sign = sign;
199 else
200 {
201 if (sign == p)
202 result.sign = m;
203 else
204 result.sign = p;
205 }
206 a = (dollors * 100 + cents) / x;
207 result.dollors = a / 100;
208 result.cents = a - result.dollors * 100;
209 return result;
210 }
211 ostream & operator <<(ostream & output, const currency & x)
212 {
213 output << " sign: " << x.sign << " dollors: " << x.dollors << " cents: " << x.cents << endl;
214 return output;
215 }
216 int main()
217 {
218 //测试setValue(m,dollors,cents)
219 currency c1;
220 c1.setValue(p, 3, 52);
221 cout << " c1 " << c1 << endl;
222 //测试构造函数
223 currency c2(m, 3, 52);
224 //测试setValue(double)
225 cout << " c2 " << c2 << endl;
226 currency c3;
227 c3.setValue(6.52);
228 cout << " c3 " << c3 << endl;
229 cout << " c3 " << c3.getSign() << c3.getDollors() << c3.getCents() << endl;
230 //测试add
231 currency c4;
232 c4 = c4.add(c3);
233 cout << " c4 " << c4 << endl;
234
235 //测试increment
236 currency c5;
237 c5.increment(c1);
238 cout << " c5 " << c5 << endl;
239
240 //测试increment2
241 currency c6;
242 c6.increment2(c2);
243 cout << " c6 " << c6 << endl;
244
245 //测试默认构造函数
246 currency c7;
247 cout << " c7 " << c7 << endl;
248
249 //测试input()
250 c7.input();
251 cout << " c7 " << c7 << endl;
252 //测试减法
253 currency c8 = c3.subtract(c1);
254 cout << " c8 " << c8 << endl;
255 //测试百分比
256 c8 = c1.percent(64.3);
257 cout << " c8 " << c8 << endl;
258 //测试乘法
259 c8 = c2.multiply(2.1);
260 cout << " c8 " << c8 << endl;
261 //测试除法
262 c8 = c1.divide(3.2);
263 cout << " c8 " << c8 << endl;
264
265 }