Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

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

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    40

    Post 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. #2
    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. #3
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Đâ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. #4
    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. #5
    Ngày gia nhập
    01 2008
    Bài viết
    40

    Trích dẫn Nguyên bản được gửi bởi huynguyen Xem bài viết
    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. #6
    Ngày gia nhập
    01 2008
    Bài viết
    40

    Post 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. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    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 0lengthx++){
              
    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 istreamoperator >> (istream &isBinary &ob);
        
    friend ostreamoperator << (ostream &osBinary &ob);
        
        
    void convert_to_decimal();
        
    void convert_to_binary();
        
        
    Binary operator + (Binaryob);
        
        
    int take_power(int degreeint 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 00lengthx++, 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 lengthvalue != && >= 0x--){
        
    integer[x] = value 10;
      }
    }

    /*Destructor*/
    Binary::~Binary()
    {
      
    delete[] integer;
    }

    /*Functional function*/
    void Binary::convert_to_binary()
    {
      
    int real 0;
      for(
    int x length-1>= 0x--){
        
    real real integer[length-1-x]*take_power(x10);
      }
      
      
    length take_binary_length(real);
      
    delete[] integer;
      
    integer = new int[length];
      
      for(
    int x 0length && real != 0x++){
        
    integer[length-1-x] = real 2;
        
    real real 2;
      }
    }

    void Binary::convert_to_decimal()
    {
      
    int decimal 0;
      for(
    int x length-1>= 0x--){
        
    decimal decimal integer[(length-1)-x]*take_power(x2);
      }
      
      
    length take_decimal_length(decimal);
      
    delete[] integer;
      
    integer = new int[length];

      for(
    int x 0length && decimal != 0x++){
        
    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 0lengthx++){
          
    integer[x] = original.integer[x];
        }
      }
      return *
    this;//enable cascading
    }

    Binary::Binary(const Binary &copy):length(copy.length)
    {
      
    integer = new int[length];
      for(
    int x 0lengthx++)
        
    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>= 0x--){
        
    left left integer[length-1-x]*take_power(x10);
      }
      
      
    int right 0;
      for(
    int x ob.length-1>= 0x--){
        
    right right ob.integer[ob.length-1-x]*take_power(x10);
      }
      
    /*-----------------End []------------------------------------------*/
      
      
    int sum right left;
      
    Binary temp;
      
    temp.length take_decimal_length(right+left);
     
      for(
    int x 0temp.length && sum != 0x++){
        
    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 degreeint num)
    {
      
    int result 1;
      for(
    int x 1<= degreex++){
        
    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;
    }

    istreamoperator >> (istreaminputBinaryob)
    {
      
    cout << "Enter length of Binary number : ";
      
    input >> ob.length;
      
    ob.integer = new int[ob.length];
      for(
    int x 0ob.lengthx++){
        
    cout << "Element (0,1) [" << << "] = ";
        
    input >> ob.integer[x];
        
    cout << '\n';
      }
      
      return 
    input;
    }

    ostreamoperator << (ostreamoutputBinaryob)
    {
      
    output << '\n';
      for(
    int x 0ob.lengthx++){
        
    output << ob.integer[x] << setw(2);
      }
      return 
    output;

    Main.cpp
    PHP Code:
    int main()
    {
      
    Binary Acin >> A;
      
    Binary Bcin >> B;
      
    Binary C;
     
      
    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. #8
    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. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    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. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    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>= 0x--){
        if(
    isdigit(sstring[x]))
          
    num num + (sstring[tmp_length-1-x] - '0')*take_power(x10);
      }
      
      
    length take_binary_length(num);
      
    integer = new int[length];
      for(
    int x 0length && num != 0x++){
        
    integer[length-1-x] = num 2;
        
    num num 2;
      }
     


Các đề tài tương tự

  1. Liên thông trung cấp nghề,cao đẳng nghề lên đại học chính quy 2012
    Gửi bởi cafetrungnguyen trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-07-2012, 02:03 PM
  2. Trả lời: 0
    Bài viết cuối: 02-08-2011, 03:26 PM
  3. Nhập ký tự đầu tiên của một nghề sẽ xuất ra nghề đó bằng việc sử dụng enum?
    Gửi bởi sasadudu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 05-03-2011, 09:25 PM

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