Đề tài: Câu hỏi về định nghĩa chồng phép toán +

1. TCH
Thành viên chính thức
Ngày gia nhập
01 2008
Bài viết
40

Câu hỏi về định nghĩa chồng phép toán +

Code:
```#include <iostream.h>
#include <conio.h>
#include <math.h>

class nhiphan
{
int  *a;//mang dong de chua day np
int 	l;//chieu dai day np
public:
nhiphan (int n=0);
~nhiphan ();
friend istream& operator >> (istream& is, nhiphan& np);
friend ostream& operator << (ostream& os, nhiphan& np);
int doinpsangtp();
nhiphan doitpsangnp (int n);
nhiphan operator + (nhiphan& np );

};
//*********************************************
nhiphan::nhiphan (int n)
{
a=new int[n];// cap phat mang dong co n phan tu
l=n;
}
//*********************************************
nhiphan::~nhiphan()
{
delete a;
}
//**********************************************
int nhiphan::doinpsangtp()
{
int n=0;
for (int i=0;i<l;i++)
n=n+a[i] * pow (2,(l-i-1));
return n;
}
//**********************************************
nhiphan doitpsangnp (int n)
{
nhiphan x;
x.l=0;
do
{
x.a[x.l++]=n%2;
n=n/2;
}while (n!=0);
int m=0, r=x.l-1;
while (m<r) //ham nay dung de thay doi vi tri cua mang b[0] -> b [l]
{
int t=x.a[m];
x.a[m]=x.a[r];
x.a[r]=t;
m++;r--;
}
return x;
}
//**********************************************
istream& operator >> (istream& is, nhiphan& np)
{
cout<<"nhap chieu dai day: ";
is>>np.l;
np.a=new int[np.l];//cap phat mang dong co n phan tu
for (int i=0;i<np.l;i++)
do
{
is>>np.a[i];
if (np.a[i]!=0 && np.a[i]!=1)
cout <<"\n nhap sai\n";
}while (np.a[i]!=0 && np.a[i]!=1) ;
return is;
}
//***********************************************
ostream& operator <<  (ostream& os, nhiphan& np)
{
cout<<endl;
for (int i=0;i<np.l;i++)
os<<np.a[i];
return os;
}
//***********************************************
nhiphan nhiphan::operator + (nhiphan& np)
{
nhiphan y;
int m,n;
m=np.doinpsangtp ();
n=doinpsangtp();
y.doitpsangnp(m+n);
return y;
}

//***********************************************
void main()
{
nhiphan np1,np2,np;
cout <<"\n nhap so thap phan thu 1: \n"  ;
cin>>np1;
cout<<np1;
cout<<endl<<np1.doinpsangtp();
np1.~nhiphan();
cout <<"\n nhap so thap phan thu 2: \n"  ;
cin>>np2;
cout<<np2;
cout<<endl<<np2.doinpsangtp();
np2.~nhiphan();
np=np1+np2;
cout<<endl<<np;
getch();
}```
Đây là đoạn code để cộng 2 số nhị phân.
Mình đánh lệnh như trên thì bị báo lỗi khi thực hiện phép toán +, ko rõ tại sao mong mấy bạn giúp
Đã được chỉnh sửa lần cuối bởi Forlorn_hope : 02-01-2008 lúc 02:27 PM.

2. TCH
Thành viên chính thức
Ngày gia nhập
01 2008
Bài viết
40
Code:
```#include <iostream.h>
#include <stdio.h>
#include <conio.h>

class array
{
protected:
int n;//so phan tu cua mang;
int *data;
public:
array (int n=0);
~array();
array (const array& arr);         //phuong thuc sao chep
friend istream& operator >> (istream& is, array& arr);
friend ostream& operator << (ostream& os, array& arr);
int find (int a);
};
//************************************************
array::array (int n1)
{
n=n1;
data=new int [n1];
for (int i=0;i<n;i++)
data[i]=0  ;
}
//************************************************
array::~array ()
{
delete[] data;
}
//************************************************
array::array (const array& arr)
{
n=arr.n;
data=new int [n];
for (int i=0 ; i<n;i++)
data[i]=arr.data[i];
}
//************************************************
istream& operator >> (istream& is, array& arr)
{
for (int i=0;i<arr.n;i++)
{
cout<<endl<<"["<<i<<"]= ";
is>>arr.data[i];
}
return is;
}
//*******************************************

ostream& operator << (ostream& os, array & arr)
{
cout<<"\n cac phan tu cua mang: ";
for (int i=0; i<arr.n;i++)
os<<" "<<arr.data[i];
return os;
}
//*************************************************
int array::find (int a)
{
array arr;
cout<<"\nnhap so can tim: ";
cin>>a;
for (int i=0;i<arr.n;i++)
{
if(a==arr.data[i])
return 1;
else
return 0;
}
}

//*************************************************
void main()
{
int n,a;
cout<<"Nhap so phan tu cua mang: ";
cin>>n;
array arr1(n);
cout<<endl<<"nhap vao mang: ";
cin>>arr1;
cout<<arr1;
if (arr1.find(a)!=1)
cout<<"\n Tìm thấy";
else
cout<<"\n Ko tìm thấy";

arr1.~array();
getch();
}```
Đây là bài toán xây dựng mảng 1 chiều, cho mình hỏi luôn tại sao chổ hàm if (dòng in đậm) mình để như thế nó mới chịu xuất là đã tìm thấy. Còn nếu để if (arr1.find(a)==1) nó toàn báo ko tìm thấy. Mình biết chắc có lỗi nhưng ko biết chổ nào mong đc giúp.

------
Lần sau đặt code vào cặp thẻ tag nha bạn. ht961711
Đã được chỉnh sửa lần cuối bởi Forlorn_hope : 02-01-2008 lúc 02:29 PM.

3. Đây là bài toán xây dựng mảng 1 chiều, cho mình hỏi luôn tại sao chổ hàm if (dòng in đậm) mình để như thế nó mới chịu xuất là đã tìm thấy.
Giá trị của a là bao nhiêu?
Ko biết giá trị của a thì dĩ nhiên là bài toán nó gặp lỗi như bạn nói rồi.
Mình đánh lệnh như trên thì bị báo lỗi khi thực hiện phép toán +, ko rõ tại sao mong mấy bạn giúp
Cậu viết chồng toán tử khá phức tạp, thực chất ko phải là chồng toán tử mà vẫn chỉ là hàm mà thôi. Lỗi nằm ở dòng y.doitpsangnp(m+n);
Hàm này là 1 hàm có giá trị trả về chứ ko phải là void do đó ko thể gọi nó như 1 hàm void được. Cậu phải gán nó cho 1 biến khác chứ, hoặc ko thì cứ return y.doitpsangnp(m+n); là xong.
Cậu xem lại về cách viết chồng toán tử chứ viết vậy nhìn thấy nhức đầu lắm, càng viết càng thấy khó hiểu về chồng toán tử đó ^^

4. Power Member
Ngày gia nhập
08 2006
Nơi ở
TpHCM
Bài viết
202
//***********************************************
nhiphan nhiphan::operator + (nhiphan& np)
{
nhiphan y;
int m,n;
m=np.doinpsangtp ();
n=doinpsangtp();
y.doitpsangnp(m+n);
return y; <== return biến cục bộ đấy hả. Thế đã viết copy constructor chưa
}
//*************************************************
Code:
```int array::find (int a)
{
array arr;
cout<<"\nnhap so can tim: ";
cin>>a;
for (int i=0;i<arr.n;i++)
{
if(a==arr.data[i])
return 1;   // return
else
return 0; // return luôn, vậy vòng lặp này chỉ thực hiện 1 lần
}
}```
Đã được chỉnh sửa lần cuối bởi Forlorn_hope : 02-01-2008 lúc 02:30 PM.

5. TCH
Thành viên chính thức
Ngày gia nhập
01 2008
Bài viết
40
Nguyên bản được gửi bởi huynguyen
Cậu viết chồng toán tử khá phức tạp, thực chất ko phải là chồng toán tử mà vẫn chỉ là hàm mà thôi. Lỗi nằm ở dòng y.doitpsangnp(m+n);
Hàm này là 1 hàm có giá trị trả về chứ ko phải là void do đó ko thể gọi nó như 1 hàm void được. Cậu phải gán nó cho 1 biến khác chứ, hoặc ko thì cứ return y.doitpsangnp(m+n); là xong.
Cậu xem lại về cách viết chồng toán tử chứ viết vậy nhìn thấy nhức đầu lắm, càng viết càng thấy khó hiểu về chồng toán tử đó ^^
Vậy bạn có thể trình bày cho mình ý tưởng để làm bài cộng nhị phân này ko? Ý tưởng của mình là đổi số nhị phân sang thập phân, cộng tụi nó lại sau đó đổi ngược trở lại nhị phân nhưng ko đc :(. Thử luôn cách return doitpsangnp (m+n) rồi nhưng vẫn ko đc.
Thank u bạn đã giúp đỡ

6. TCH
Thành viên chính thức
Ngày gia nhập
01 2008
Bài viết
40

Câu hỏi về định nghĩa chồng phép toán +

Code:
```int array::find ()
{
array arr;
int a,i=0;
cout<<"\nnhap so can tim: ";
cin>>a;
do
{
if(a==arr.data[i])
{
return 1;
break;
}
else
i++;
} while (a!=arr.data[i]); \\bị báo lỗi
}

//*************************************************
void main()
{
int n;
cout<<"Nhap so phan tu cua mang: ";
cin>>n;
array arr1(n);
cout<<endl<<"nhap vao mang: ";
cin>>arr1;
cout<<arr1;
if (arr1.find()==1)
cout<<"\n Tìm thấy";
else
cout<<"\n Ko tìm thấy";

arr1.~array();
getch();
}```
Mình đã sửa sơ code bài này nhưng lại bị báo lỗi chổ vòng lập do-while. Cám ơn bạn nguyentuan2 đã chỉ ra chổ sai, đúng là mình sai ý tưởng chổ đó rồi, vì nếu giá trị tìm được mà ở giữa mảng thì khi tìm đến các giá trị tiếp theo ko đúng nó vẫn trả về 0 => vẫn ko tìm đc.
Đã được chỉnh sửa lần cuối bởi TCH : 02-01-2008 lúc 02:46 PM.

7. Bài số nhị phân của bạn viết rối quá, mình debug cho bạn 1 hồi thành ra viết lại từ đầu luôn. Góp ý cho bạn về cách đặt tên biến, chịu khó đặt nó dài thêm 1 tí và có ý nghĩa thì sau này có lấy ra sử dụng lại cũng dễ đọc hơn.
Binary.h
PHP Code:
``` #include <iostream> #include <cctype> // for isdigit() #include <iomanip> using namespace std; class Binary{      private :     int *integer; /*Array of Binary number*/     int length;  /*and Its length*/       public:     /*Default constructor*/        Binary():length(5){        integer = new int[length];        for(int x = 0; x < length; x++){           integer[x] = 0;        }     }        Binary(int value);//convert a value into Binary number(e.g Binary Ob(1313); )     Binary(const char *ss);//convert a string value (e.g Binary Ob("30131"); )     Binary(const Binary &original);//copy constructor     ~Binary();//destructor          /*overloading operator '=' */     Binary &operator = (const Binary &copy);     friend istream& operator >> (istream &is, Binary &ob);     friend ostream& operator << (ostream &os, Binary &ob);          void convert_to_decimal();     void convert_to_binary();          Binary operator + (Binary& ob);          int take_power(int degree, int num);     int take_decimal_length(int number);     int take_binary_length(int number); };  ```
Binary.cpp
PHP Code:
``` /*Conversion Constructor I*/ Binary::Binary(const char *ss) {    length = strlen(ss);   integer = new int[length];   for(int x = 0, y = 0; x < length; x++, y++){     if(isdigit(ss[y])){       integer[x] = ss[y] - '0';     }   } } /*Conversion Constructor II*/ Binary::Binary(int value) {   length = take_decimal_length(value);   integer = new int[length];   for(int x = length; value != 0 && x >= 0; x--){     integer[x] = value % 10;   } } /*Destructor*/ Binary::~Binary() {   delete[] integer; } /*Functional function*/ void Binary::convert_to_binary() {   int real = 0;   for(int x = length-1; x >= 0; x--){     real = real + integer[length-1-x]*take_power(x, 10);   }      length = take_binary_length(real);   delete[] integer;   integer = new int[length];      for(int x = 0; x < length && real != 0; x++){     integer[length-1-x] = real % 2;     real = real / 2;   } } void Binary::convert_to_decimal() {   int decimal = 0;   for(int x = length-1; x >= 0; x--){     decimal = decimal + integer[(length-1)-x]*take_power(x, 2);   }      length = take_decimal_length(decimal);   delete[] integer;   integer = new int[length];   for(int x = 0; x < length && decimal != 0; x++){     integer[length-1-x] = decimal % 10;     decimal = decimal / 10;   } } /*END*/ Binary &Binary::operator = (const Binary &original) {          if(&original != this){     if(length != original.length){       length = original.length;       delete []integer;       integer = new int[original.length];     }     for(int x = 0; x < length; x++){       integer[x] = original.integer[x];     }   }   return *this;//enable cascading } Binary::Binary(const Binary &copy):length(copy.length) {   integer = new int[length];   for(int x = 0; x < length; x++)     integer[x] = copy.integer[x]; } Binary Binary::operator + (Binary &ob) {   ob.convert_to_decimal();   convert_to_decimal();      /*----------------Take decimal number of 2 side--------------------*/   int left = 0;   for(int x = length-1; x >= 0; x--){     left = left + integer[length-1-x]*take_power(x, 10);   }      int right = 0;   for(int x = ob.length-1; x >= 0; x--){     right = right + ob.integer[ob.length-1-x]*take_power(x, 10);   }   /*-----------------End []------------------------------------------*/      int sum = right + left;   Binary temp;   temp.length = take_decimal_length(right+left);     for(int x = 0; x < temp.length && sum != 0; x++){     temp.integer[temp.length-1-x] = sum % 10;     sum = sum / 10;   }   temp.convert_to_binary();   return temp;//return copy of temp object } int Binary::take_power(int degree, int num) {   int result = 1;   for(int x = 1; x <= degree; x++){     result *= num;   }   return result; }        int Binary::take_decimal_length(int number) {   int count = 0;   do{     number = number / 10;     count++;   }while(number != 0);   return count; }      int Binary::take_binary_length(int number) {   int count = 0;   do{     number = number / 2;     count++;   }while(number != 0);   return count; } istream& operator >> (istream& input, Binary& ob) {   cout << "Enter length of Binary number : ";   input >> ob.length;   ob.integer = new int[ob.length];   for(int x = 0; x < ob.length; x++){     cout << "Element (0,1) [" << x << "] = ";     input >> ob.integer[x];     cout << '\n';   }      return input; } ostream& operator << (ostream& output, Binary& ob) {   output << '\n';   for(int x = 0; x < ob.length; x++){     output << ob.integer[x] << setw(2);   }   return output; }  ```
Main.cpp
PHP Code:
``` int main() {   Binary A; cin >> A;   Binary B; cin >> B;   Binary C;     C = A + B;   cout << C;     system("pause");   return 0; }  ```
Phần quá tải toán tử thực ra nó dễ, chỉ có cái syntax là màu mè hù doạ người ta thôi. Bạn chịu khó đọc kĩ là ok hết. Mình có viết lại hàm take_power thay cho hàm "pow" của thư viện #include <cmath>, không hiểu sao máy mình nó điên sao á, không dùng được nên mình viết lại luôn.

8. TQN
Newbie coder
Ngày gia nhập
09 2006
Bài viết
711
rox_rook code C++ rất good, coding style cũng rõ ràng, rành mạch. Tốt lắm.
Code trên của rox_rook có bug thì phải, do code dài nên tui không đọc hết, mà máy tui thì không có IDE nào để debug.
Vd: Binary A("10rox_rook") thì array integer sẽ có giá trị gì vậy ?

9. Cám ơn anh đã khen ngợi^^! Cái bug anh nói, nó sai thiệt hic hic, không hiểu sao nó bị tràn stack, em đang suy nghĩ để fix đây. Cám ơn anh đã nhắc em !

10. hì hì ! Em fix luôn cho em đây :^^
PHP Code:
``` /*Conversion Constructor I*/Binary::Binary(const char *sstring){   int num = 0;  int tmp_length = strlen(sstring);  for(int x = tmp_length-1; x >= 0; x--){    if(isdigit(sstring[x]))      num = num + (sstring[tmp_length-1-x] - '0')*take_power(x, 10);  }    length = take_binary_length(num);  integer = new int[length];  for(int x = 0; x < length && num != 0; x++){    integer[length-1-x] = num % 2;    num = num / 2;  } }  ```

Quyền hạn của bạn

• Bạn không thể gửi đề tài mới
• Bạn không thể gửi bài trả lời
• Bạn không thể gửi các đính kèm
• Bạn không thể chỉnh sửa bài viết của bạn