X
XADD
Перегрузил операцию сложения двух двоичных чисел но оно работает частично
Например если присвоить s1=111,s2=111, то s3=s1+s2=1110(вроде бы верно), далее пишу s3+s1=(1110+111) программа выдает s3=111 хотя должно быть 10101. Дебагом пользовался но не могу понять что не работает.
Например если присвоить s1=111,s2=111, то s3=s1+s2=1110(вроде бы верно), далее пишу s3+s1=(1110+111) программа выдает s3=111 хотя должно быть 10101. Дебагом пользовался но не могу понять что не работает.
C++:
#include <iostream>
#include <cmath>
#include <math.h>
using namespace std;
class Stroka
{
private:
char *String;
int SizeOfString;
public:
Stroka() {}
Stroka(const char *inString)
{
String = new char[strlen(inString)];
if (inString!=0) strcpy(String,inString);
cout << "String constructor" << endl;
}
Stroka(char ch)
{
String=new char[strlen(&ch)];
if (ch!=0) strcpy(String,&ch);
cout << "Symbol constructor" << endl;
}
Stroka (const Stroka& copy)
{
copy.String;
cout << "Copy constructor" << endl;
}
void GetClear ()
{
String="\0";
}
int GetLength ()
{
SizeOfString=strlen(String);
cout << SizeOfString << endl;
return SizeOfString;
}
void Show ()
{
cout << String << endl;
}
};
class BitStroka
{
private:
char *BitString;
int SizeOfBitString;
int Value;
public:
////-------------------
BitStroka() {BitString = new char[10]; SizeOfBitString=0; Value=0;}
////---------------------
//BitStroka(const BitStroka&);
BitStroka(const char *InBitString)
{
int iterator=0;
for (int i=0; i<strlen(InBitString);i++)
{
if (InBitString[i]=='0' || InBitString[i]=='1') {iterator++;}
if (iterator==strlen(InBitString))
{
BitString = new char[strlen(InBitString)];
strcpy(BitString,InBitString);
SizeOfBitString=strlen(InBitString);
Value=atoi(InBitString);
}
}
}
friend BitStroka& operator+(const BitStroka &op1, const BitStroka &op2)
{
BitStroka temp;
int *temp1;
int *temp2;
int *temp3;
if (op1.SizeOfBitString<op2.SizeOfBitString)
{
temp1 = new int[(op2.SizeOfBitString+1)];
temp2 = new int[(op2.SizeOfBitString+1)];
temp3 = new int[(op2.SizeOfBitString+1)];
for (int i=0;i<(op2.SizeOfBitString+1);i++)
{
temp1[i]=0;
temp2[i]=0;
}
for (int i=0;i<op1.SizeOfBitString;i++)
{
temp1[i+(op2.SizeOfBitString+1-op1.SizeOfBitString)]=op1.BitString[i]-'0';
}
for (int i=0;i<op2.SizeOfBitString;i++)
{
temp2[i+1]=op2.BitString[i]-'0';
}
int carry=0;
int temp4=0;
for (int i=op2.SizeOfBitString;i>=0;i--)
{
temp4=temp1[i]+temp2[i]+carry;
if (temp4>=2) {temp3[i]=temp4-2; carry=1;}
else {temp3[i]=temp4; carry=0;}
}
int j=0;
int k=1;
for (int i=op2.SizeOfBitString;i>=0;i--)
{
j+=temp3[i]*pow(10.0,k-1);
k++;
}
temp.Value=j;
cout << "First" << endl;
}
else
{
temp1 = new int[(op1.SizeOfBitString+1)];
temp2 = new int[(op1.SizeOfBitString+1)];
temp3 = new int[(op1.SizeOfBitString+1)];
for (int i=0;i<(op1.SizeOfBitString+1);i++)
{
temp1[i]=0;
temp2[i]=0;
temp3[i]=0;
}
for (int i=0;i<op2.SizeOfBitString;i++)
{
temp1[i+(op1.SizeOfBitString+1-op2.SizeOfBitString)]=op2.BitString[i]-'0';
}
for (int i =0;i<op1.SizeOfBitString;i++)
{
temp2[i+1]=op1.BitString[i]-'0';
}
int carry=0;
int temp4=0;
for (int i=op1.SizeOfBitString;i>=0;i--)
{
temp4=temp1[i]+temp2[i]+carry;
if (temp4>=2) {temp3[i]=temp4-2; carry=1;}
else {temp3[i]=temp4; carry=0;}
}
int j=0;
int k=1;
for (int i=op1.SizeOfBitString;i>=0;i--)
{
j+=temp3[i]*pow(10.0,k-1);
k++;
}
temp.Value=j;
cout << "Second" << endl;
}
return temp;
}
bool operator== (const BitStroka &op1)// Перегрузка функции сравнения
{
if (op1.Value==Value)
{
return true;
}
else
{
return false;
}
}
BitStroka& operator +=(const BitStroka &op1)//Функция присвоения
{
SizeOfBitString=op1.SizeOfBitString;
Value=op1.Value;
return *this;
}
void Show()
{
cout << Value << endl;
}
};
int main()
{
BitStroka s1("111");
BitStroka s2("111");
BitStroka s3("111");
s3=(s1+s2);
s3=(s3+s1);
s3.Show();
return 0;
}