实验十实验报告
——姜志达
1.实验目的
(1) 掌握运算符重载的定义及实现。 (2) 掌握具有运算符重载的应用。
2.实验设备
硬件环境:微型计算机 软件环境:
操作系统: Windows 语言环境: Visual C++
3.预习要求
学习教材有关运算符重载的内容,对基本运算符重载及特殊运算符重载有充分的理解。对实验基本要求应在上机实验前仔细阅读,程序应事先编制完成,上机时录入调试,同时还应设计相应的测试用例集,检查程序的正确性、可靠性、完备性和容错能力。
4.实验内容
(1)将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。另外有一个类型转换函数int(),用来将类类型向整型转换。程序中的两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。
#include \"iostream.h\"
#include \"string.h\" #include \"conio.h\"
class binary { //定义二进制类
char bits[16]; //二进制字模数组 public:
binary(char *); //字符串参数构造函数 binary(int); //整型参数构造函数
friend binary operator +(binary,binary); //重载“+” friend binary operator -(binary,binary); //重载“-”
operator int(); //类类型转换函数 void print(); };
binary::binary(char *num) {
int isrc=strlen(num)-1; //字符串长度-1为最低位 int idest=15;
while(isrc>=0 && idest>=0)
bits[idest--]=(num[isrc--]=='0'?'0':'1'); // 逐位赋值 while(idest>=0) bits[idest--]='0'; // 空高位值0 }
binary::binary(int num) {
for(int i=15; i>=0;i--)
{ bits[i]=( (1) ); //求余数
num>>=1; //移位,相当于整除2 } }
binary operator +(binary n1, binary n2) {
unsigned carry=0; unsigned value; binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)+( (2) )+carry; res.bits[i]=(value%2==0?'0':'1'); carry=value>>1; }
return res; }
binary operator -(binary n1, binary n2) {
unsigned borrow=0; int value;
binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)-(n2.bits[i]=='0'?0:1)+borrow; res.bits[i]=(value==-1||value==1?'1':'0');
borrow=(value==-1||borrow!=0&&(value==0||value==1)?1:0); }
return res; }
binary::operator int() {
unsigned value=0;
for(int i=0; i<=15; i++)
value=( (3) )+(bits[i]=='0'?0:1); return value; }
void binary::print() {
char str[17];
strncpy(str,bits,16); str[16]='\\0'; cout<main() {binary n1=\"1011\"; binary n2=int(n1)+15; binary n3=n1-binary(7); n1.print(); n2.print(); n3.print();
cout<[基本要求] 阅读下列程序,根据题意要求在处填上合适的内容完成程序。
上机录入、调试上面程序。
运行程序,纪录并分析运行结果是否正确。 [分析与思考]
将 + 、 - 运算符定义为binary类的成员函数。
重载运算符 ~ 、 & 、 | 分别将二进制数按位取反、数按位与及按位或。
(2)编写一个集合类,重载+(并集)、-(差集)、*(交集)、<<(输出)、>>(输入)等函数。
5.实验过程
解:
(1)num%2==0?'0':'1' (2)n2.bits[i]=='0'?0:1 (3)value*2
6.分析与思考
注:由于一些问题不会处理,思考题没能做出来,参,尽力理解后完成的。
解:
1、
#include #include #include using namespace std;class binary {
char bits[16]; public:
binary(char *); binary(int);
binary operator +(binary); binary operator -(binary); operator int(); void print(); };
binary::binary(char *num) {
int isrc=strlen(num)-1; int idest=15;
while(isrc>=0 && idest>=0)
bits[idest--]=(num[isrc--]=='0'?'0':'1'); while(idest>=0) bits[idest--]='0'; }
binary::binary(int num) {
for(int i=15; i>=0;i--)
{ bits[i]=(num%2==0?'0':'1'); num>>=1; }
}
binary binary::operator +(binary n) {
unsigned carry=0; unsigned value; binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(bits[i]=='0'?0:1)+(n.bits[i]=='0'?0:1)+carry; res.bits[i]=(value%2==0?'0':'1'); carry=value>>1; }
return res; }
binary binary::operator -(binary n) {
unsigned borrow=0; int value;
binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(bits[i]=='0'?0:1)-(n.bits[i]=='0'?0:1)+borrow; res.bits[i]=(value==-1||value==1?'1':'0');
borrow=(value==-1||borrow!=0&&(value==0||value==1)?1:0); }
return res; }
binary::operator int() {
unsigned value=0;
for(int i=0; i<=15; i++)
value=( value*2)+(bits[i]=='0'?0:1); return value; }
void binary::print() {
char str[17];
strncpy(str,bits,16); str[16]='\\0'; cout<}int main() {
binary n1=\"1011\"; binary n2=int(n1)+15; binary n3=n1-binary(7); n1.print(); n2.print(); n3.print();
cout<2、#include #include #include using namespace std; class binary {char bits[16]; public:
binary(char *); binary(int);
friend binary operator +(binary,binary); friend binary operator -(binary,binary); friend binary operator|(binary,binary); friend binary operator &(binary,binary); binary operator ~(); operator int(); void print(); };
binary::binary(char *num) {
int isrc=strlen(num)-1; int idest=15;
while(isrc>=0 && idest>=0)
bits[idest--]=(num[isrc--]=='0'?'0':'1'); while(idest>=0) bits[idest--]='0'; }
binary::binary(int num) {
for(int i=15; i>=0;i--)
{ bits[i]=(num%2==0?'0':'1'); num>>=1; } }
binary operator +(binary n1, binary n2) {
unsigned carry=0; unsigned value; binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)+(n2.bits[i]=='0'?0:1)+carry; res.bits[i]=(value%2==0?'0':'1'); carry=value>>1; }
return res; }
binary operator -(binary n1, binary n2) {
unsigned borrow=0; int value;
binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)-(n2.bits[i]=='0'?0:1)+borrow; res.bits[i]=(value==-1||value==1?'1':'0');
borrow=(value==-1||borrow!=0&&(value==0||value==1)?1:0); }
return res; }
binary operator |(binary n1,binary n2) {
int value;
binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)+(n2.bits[i]=='0'?0:1); if (value==0) res.bits[i]='0';
else res.bits[i]='1'; }
return res; }
binary operator &(binary n1,binary n2) {
int value;
binary res=\"0\";
for(int i=15; i>=0; i--) {
value=(n1.bits[i]=='0'?0:1)+(n2.bits[i]=='0'?0:1); if (value==2) res.bits[i]='1'; else res.bits[i]='0'; }
return res; }
binary binary::operator ~() {
int i;
for(i=0;i<=15;i++) {
if(bits[i]=='0') bits[i]='1'; else break; }
for(i=15;i>=0;i--) {
if(bits[i]=='1') bits[i]='0'; else bits[i]='1'; }
return bits;}
binary::operator int() {
unsigned value=0;
for(int i=0; i<=15; i++)
value=( value*2)+(bits[i]=='0'?0:1); return value;} void binary::print() {
char str[17];
strncpy(str,bits,16); str[16]='\\0';
cout<binary n1=\"1011\"; binary n2=int(n1)+8; binary n3=n2|n1; binary n4=n1&n2;binary n5=\"101011\"; ~n5;
n1.print(); n2.print(); n3.print(); n4.print(); n5.print();
cout<getch(); return 1; }