#pragma once
2 #include <iostream>
3 using namespace std;
4 class INT;
5 ostream &operator<<(ostream &out,const INT &a);
6 INT & operator>>(istream &in,const INT &a);
7 INT operator - (const INT &a,const INT &b);
8 class INT
9 {
10 public:
11 INT(int X=0):x(X)
12 {
13 }
14 //双目运算符重载//
INT operator + (const INT & a);
16 INT operator * (const INT & a);
17 INT operator / (const INT & a);
18 INT operator % (const INT & a);
19 INT operator &&(const INT & a);
20 INT operator ||(const INT & a);
21 INT operator ==(const INT & a);
22 INT operator !=(const INT & a);
23 INT operator <<(const INT & a);
24 INT operator >>(const INT & a);
25 INT operator <(const INT & a);
26 INT operator >(const INT & a);
27 INT operator >=(const INT & a);
28 INT operator <=(const INT & a);
29 INT operator & (const INT & a);
30 INT operator | (const INT & a);
31 INT operator +=(const INT & a);
32 INT operator = (const INT & a);
33 INT operator -=(const INT & a);
34 INT operator /=(const INT & a);
35 INT operator *=(const INT & a);
36 INT operator %=(const INT & a);
37 INT operator ^ (const INT & a);//按位异或。
//单目运算符
39 INT operator ++(int);
40 INT operator ++();
41 INT operator !();
42 INT operator ~();
43 INT operator &();//这里没有地址,所以产生的是随机值。
44 INT operator ()(const INT & a);
45 friend INT operator - (const INT &a,const INT & b);
46 //输出输入流//
47 friend ostream & operator <<(ostream &out,const INT &a );
48 friend INT & operator >>(istream &in, INT &a);
49 private:
50 int x;
51 };
52 INT INT :: operator ()(const INT & a)
53 {
54 return INT(a.x);
55 }
INT INT :: operator & ()
57 {
58 return INT((int)&x);
59 }
60 INT INT :: operator ~ ()
61 {
62 return INT(~x);
63 }
64 INT INT :: operator ! ()
65 {
66 return (!x);
67 }
68 INT INT :: operator ++()
69 {
70 x++;
71 return INT(x);
72 }
73 INT INT :: operator ++(int)
74 {
75 INT a(x);
76 x++;
77 return a;
78 }
INT INT ::operator = (const INT & a)
80 {
81 return INT(x=a.x);
82 }
83 INT INT ::operator ^ (const INT & a)
84 {
85 return INT(x^a.x);
86 }
87 INT INT ::operator %= (const INT & a)
88 {
89 return INT(x%=(a.x));
90 }
91 INT INT ::operator *= (const INT & a)
92 {
93 return INT(x*=(a.x));
94 }
95 INT INT ::operator /= (const INT & a)
96 {
97 return INT(x/=(a.x));
}
99 INT INT ::operator -= (const INT & a)
100 {
101 return INT(x-=a.x);
102 }
103 INT INT ::operator += (const INT & a)
104 {
105 return INT(x+=a.x);
106 }
107 INT INT ::operator | (const INT & a)
108 {
109 return INT(x | a.x);
110 }
111 INT INT ::operator & (const INT & a)
112 {
113 return INT( x & (a.x) );
114 }
115 INT INT ::operator <= (const INT & a)
116 {
117 return INT(x<=a.x);
118 }
INT INT ::operator >= (const INT & a)
120 {
121 return INT(x>=a.x);
122 }
123 INT INT :: operator > (const INT & a)
124 {
125 return INT(x>a.x);
126 }
127 INT INT :: operator < (const INT & a)
128 {
129 return INT(x<a.x);
130 }
131 INT INT :: operator >> (const INT &a )
132 {
133 return INT( (x>>a.x) );
134 }
135 INT INT :: operator << (const INT & a)
136 {
137 return INT((x<<a.x));
138 }
139 INT INT :: operator != (const INT & a)
140 {
141 return INT(x != a.x);
142 }
INT INT :: operator == (const INT & a)
144 {
145 return INT(x == a.x);
146 }
147 INT INT :: operator || (const INT & a)
148 {
149 return INT( x || (a.x) );
150 }
151 INT INT :: operator && (const INT & a)
152 {
153 return INT(x&&(a.x));
154 }
155 INT INT :: operator % (const INT & a)
156 {
157 return INT(x%(a.x));
158 }
159 INT INT :: operator / (const INT & a)
160 {
161 return INT(x/(a.x));
162 }
163 INT INT::operator *(const INT &a)
164 {
165 return INT(x*(a.x));
166 }
INT & operator >> (istream &in, INT &a)
168 {
169 in >> (a.x);
170 return a;
171 }
172 INT operator - (const INT &a,const INT & b )
173 {
174 return INT(a.x-b.x);
175 }
176 INT INT::operator + (const INT &a)
177 {
178 return INT(x+a.x);
179 }
180 ostream & operator <<(ostream &out,const INT &a )
181 {
182 out<<a.x<<endl;
183 }
184
185 int get_sum(char ch)
186 {
187 if( (ch-'0')>=0 && (ch-'0')<=9 )
188 return 1;
189 else
190 return 0;
}
192 INT coverment(int x,char c,int y)
193 {
194 switch(c)
195 {
196 case '+':return INT(x+y); break;
197 case '-':return INT(x-y); break;
198 case '*':return INT(x*y); break;
199 case '/':return INT(x/y); break;
200 case '%':return INT(x%y); break;
201 case '&':return INT(x&y); break;
202 case '|':return INT(x|y); break;
203 case '<':return INT(x<y); break;
204 case '>':return INT(x>y); break;
205 case '=':return INT(x=y); break;
206 case '^':return INT(x^y); break;
207 }
208 }
209 INT CoverMent(int x,char c,char c1,int y)
210 {
211 switch(c)
{
213 case '&':return INT(x&&y); break;
214 case '|':return INT(x||y); break;
215 case '!':return INT(x!=y); break;
216 case '<':
217 switch(c1)
218 {
219 case '<': return INT(x<<y); break;
220 case '=': return INT(x<=y); break;
221 };
222 break;
223 case '>':
224 switch(c1)
225 {
226 case '>':return INT(x>>y); break;
227 case '=':return INT(x>=y); break;
228 };
229 break;
case '+':return INT(x+=y); break;
231 case '-':return INT(x-=y); break;
232 case '*':return INT(x*=y); break;
233 case '/':return INT(x/=y); break;
234 case '%':return INT(x%=y); break;
235 }
236 }
237 INT COVERMENT(char c,int x)
238 {
239 switch(c)
240 {
241 case '&':return INT((int)&x); break;
242 case '!':return INT(!x); break;
243 case '~':return INT(~x); break;
244 }
245 }
246
以上是INT.h文件,下面是INT.cpp文件
#include <iostream>
2 //#include <ctype.h>
3 #include "INT.h"
4 int main()
5 {
6 char *s1 = new char [20];
7 // cin>>s1;这里出现了一个错误,就是cin 读取输入的时候是以> 空格为一次读取标记号
8 std::cout<<"please input :"<<std::endl;
9 cin.getline(s1,20);
10 int a=0;
11 int b=0;
12 char ch1;
13 char ch2;
14 while(*s1 == ' ')
15 {
16 s1++;
17 }
18 if( get_sum(*s1) )
19 {
20 while( get_sum(*s1) )
21 {
22 a=a*10+(*s1-'0');
23 s1++;
}
25 while(*s1 == ' ')
26 {
27 s1++;
28 }
29 ch1 = *s1;
30 s1++;
31 while(*s1 == ' ')
32 {
33 s1++;
34 }
35 if( !get_sum(*s1) )
36 {
37 ch2 = *s1;
38 s1++;
39 while(*s1 != '\0')
40 {
41 b=b*10+(*s1-'0');
42 s1++;
43 }
44 INT d=CoverMent(a,ch1,ch2,b);
45 std::cout<<"result is :";
cout<<d<<endl;
47 }
48 else
49 {
50 while( *s1!= '\0' )
51 {
52 b=b*10+(*s1-'0');
53 s1++;
54 }
55 INT d=coverment(a,ch1,b);
56 std::cout<<"result is : ";
57 cout<<d<<endl;
58 }
59 }
60 else
61 {
62 ch1 = *s1;
63 s1++;
64 while(*s1 != '\0')
65 {
66 a = a*10 + (*s1-'0');
67 s1++;
68 }
69 INT d = COVERMENT(ch1,a);
cout<<d<<endl;
71 }
72 return 0;
73 }
做这个的时候遇到了一个问题就是,开始我用cin作为输入字符串的时候,比如说:3 + 2中间有很多空格,就达不到我的预期结果,后来我发现我遗忘了一个知识点就是cin的读取是以空格为结束标记的,所以我选择用cin.getline()来读取一行,'\n'被读取,且自动补全'\0:',而cin.get()则将'\n'留在了输入队列,如果再使用c.get()时会只读一个'\n'而导致结果不正确。