مقدار دهی تابع پویا با استفاده از کلاس ( رفع اشکل + کمک )

mamadshoshteri

New Member
سلام من این یه خطا رو هر کاری میکنم درست نمیشه فردا 8 صبح هم باید تحویل بدم اینو :cry: میشه اگه کسی هست اینجا کمک کنه ؟

سوال: آرايه ي يک بعدي پويا با استفاده از کلاس تعريف نموده به گونه اي که شامل سازنده معمولي ، سازنده ي کپي ، == ، = ، =+ ، * باشد

کد:
 #include<iostream.h>

class matrix{

         friend matrix operator *(matrix &r,matrix &r2);
         friend int operator ==(matrix &r,matrix &r2);
   public :
      matrix (int a=5) {
               size=a;
               arr=new int[size];
      }
      void setsize(int s){size=s;}
      int getsize(){return size;}
      void st() {
           cout<<"plz enter numbers: \n";
           for(int i=0;i<size;i++)
           { cout<<i+1<<": \t";cin>>arr[i];}   
           }
      matrix operator ++(){
           for(int i=0;i<size;i++)
             arr[i]++;
             return *this;
      }
      matrix  operator  ++(int){
               matrix temp(size);
               temp=*this;
               for(int i=0;i<size;i++)
                   arr[i]++;
                   return temp;
      }
      matrix  operator =(const matrix &r){
              size=r.size;
              for(int i=0;i<size;i++)
                  arr[i]=r.arr[i];
                  return *this;
      }
      matrix & operator  +=(const matrix & r){                 
              for(int i=0;i<size;i++)
              arr[i]=arr[i]+r.arr[i];
              return *this;
      }
   void show_arr(){
         cout<<" view inserted numbers in matrix: \n";
     for(int i=0;i<size;i++)
       {cout<<arr[i]<<" ";}
   }
  private :
      int size;
      int * arr;
};

matrix mat1,mat2,mat3;
bool cr_obj(){
    int obj_n,n;
    cout<<"Select Object you want to create ( 1 || 2 || 3 ): \n";
    cin>>obj_n;
    if(obj_n<1 || obj_n>3)return false;
    cout<<"select size for matrix: \n";  
    cin>>n;
    switch (obj_n){
       case 1:mat1.setsize(n);
          break;
       case 2:mat2.setsize(n);
          break;
       case 3:mat3.setsize(n);
          break; 
    }
}
void lod_menu(){
     cout<<"\n\t   Matrix Class \n ";
     cout<<"\n";
     cout<<"0.\t"<<"* set size of a matrix"<<endl;       
     cout<<"1.\t"<<"* set values for a matrix"<<endl;
     cout<<"2.\t"<<"* show values of a matrix"<<endl;
     cout<<"3.\t"<<"* compare two matrixes "<<endl;
     cout<<"4.\t"<<"* beat two matrixes "<<endl;
     cout<<"5.\t"<<"* sum two matrixes "<<endl; 
     cout<<"6.\t"<<"* ++  matrixes "<<endl;
     cout<<"7.\t"<<"* End "<<endl;       
     cout<<"\n"; 
}
void compair(){
     int n;
     cout<<"select matrix to compare(1,2 || 2,3 || 1,3)";
     cin>>n;
     if(n==1)
        if((mat1==mat2)==1)cout<<" matris 1 == matrix 2 \n";
           else cout<<" matris 1 != matrix 2 \n";
        else if(n==2)
           if((mat2==mat3)==1)cout<<" matris 2 ==matrix 3 \n";
           else cout<<" matris 2 != matrix 3 \n";
        else
           if((mat1==mat3)==1)cout<<" matris 1 ==matrix 3 \n";
           else cout<<" matris 1 != matrix 3 \n";
}
void ad(){
    int n;
    cout<<"select matrix to  add(1 || 2)";
    cin>>n;
    if(n==1)
       mat3+=mat1;
    else
       mat3+=mat2;
}
bool show(){
        int mat;
        cout<<"select 1 || 2 || 3 ? \n";
        cin>>mat;
        if(mat<1 || mat>3)return false;
        switch (mat ){
            case 1:mat1.show_arr();
                break;
            case 2:mat2.show_arr();
                break;
            case 3:mat3.show_arr();
                break;
            default:cout<<"wrong number!\n";
                break;                                 
        }              
} 
void star(){
    cout<<" mat3=mat1*mat2 \n";
    mat3=mat1*mat2;
}
bool st_values(){
    int mat;
    cout<<"select 1 || 2 || 3 ? \n";
    cin>>mat;
    if(mat<1 || mat>3)return false;
    switch (mat ){ 
        case 1:mat1.st();
              break;
        case 2:mat2.st();
              break;
        case 3:mat3.st();
              break;                       
        default:cout<<"wrong number!\n";
              break;                                 
    }
}
void plus(){
     int n;
     cout<<"select matrix to compare( 1 || 2 || 3 )";
     cin>>n;
     if(n==1)
        mat1++;
     else if(n==2)
        mat2++;
     else
        mat3++;
}

/////////////////////////////////////

int main(){
   int selectuser=0;
   int x; 
   while(1){
      lod_menu();
      cin>>selectuser;  
      if(selectuser<0 || selectuser>6)exit(0);
      switch (selectuser){
         case 0:cr_obj();
             break;
         case 1:st_values();
             break;
         case 3:compair();
             break;
         case 2:show();
             break;             
         case 4:star();
             break;
         case 5:ad();
             break;   
         case 6:plus();
             break;                   
         default: exit(0);         
      }
   }
   return 0;
}

//////////////////////////////////////////////


   matrix operator *( matrix &r,matrix &r2){          
          int min=r.size;
          if(r2.size<r.size)min=r2.size;
          matrix z(min);
          for(int i=0;i<min;i++)
              z.arr[i]=r.arr[i]*r2.arr[i];
          return z;
   }       
   int operator ==(matrix r1,matrix r2){           
           if(r1.size != r2.size)return 0;
           for(int i=0;i<r1.size;i++)
           if(r1.arr[i]!=r2.arr[i])return 0;
           return 1;   
   }
 
آخرین ویرایش:

the_king

مدیرکل انجمن
نکته ها :
1) اسم کلاس رو به array تغییر دادم، ماتریس یه آرایه دو بعدی است. اسم توابع و متن اعلان ها هم تغییر کرده.
2) همه عملگر ها رو friend تعریف نکنید، فقط عملگر هایی باید friend باشند که پارامتر اول شون از نوع خود
کلاس نیست، مثلا پارامتر اول شون ostream و istream است. وقتی پارامتر اول خودش از نوع array است، به همه
متغیر های private دسترسی دارد و نیازی به friend نیست.
تا حد امکان همه چیز باید خصوصی و انحصاری باشه، مگر اینکه ناچار باشید.
3) از عبارت های bool و false و true اجتناب کنید، استاندارد نیستند، بهتره از int و 0 و 1 (1 یا هر مقدار غیر 0)
استفاده کنید.
4) حافظه پویا ای که با new ساختید رو موقعی که دیگه لازمش ندارید همینطور به امان خدا رها نکنید، با []delete
حافظه اش را پیش از اتمام برنامه آزاد کنید.

کد:
#include <iostream.h>

class array
{
private :
    int* arr;
    int size;

public :
    friend istream& operator >>(istream&, array&);
    friend ostream& operator <<(ostream&, const array&);

    void setsize(int n)
    {
        if (size > 0)
            delete[] arr;
        size = n;
        if (size > 0)
        {
            arr = new int[size];
            for (int i = 0; i < size; i++)
                arr[i] = 0;
        }
    }

    ~array()
    {
        if (size > 0)
            delete[] arr;
    }

    array(int n = 5)
    {
        setsize(n);
    }

    int getsize()
    {
        return size;
    }

    array operator *(array &r)
    {
        int min = (size > r.size) ? r.size : size;
        array z(min);
        for (int i = 0; i < min; i++)
            z.arr[i] = arr[i] * r.arr[i];
        return z;
    }

    array operator ++()
    {
        for (int i = 0; i < size; i++)
            arr[i]++;
        return *this;
    }

    array operator ++(int)
    {
        array temp(size);
        temp = *this;
        for(int i = 0; i < size; i++)
            arr[i]++;
        return temp;
    }

    int operator ==(array &r)
    {
        if(size != r.size)
            return 0;
        for(int i = 0; i < size;i++)
            if(arr[i] != r.arr[i])
                return 0;
        return 1;
    }

    array& operator =(const array& r)
    {
        size = r.size;
        for(int i = 0; i < size; i++)
            arr[i] = r.arr[i];
        return *this;
    }

    array& operator +=(const array& r)
    {
        for(int i = 0; i < size; i++)
            arr[i] += r.arr[i];
        return *this;
    }
};

ostream& operator <<(ostream& output, const array& r)
{
    for (int i = 0; i < r.size; i++)
        output << "  a[" << i + 1 << "] = " << r.arr[i] << endl;
    return output;
}

istream& operator >>(istream& input, array& r)
{
    for (int i = 0; i < r.size; i++)
    {
        cout << "a[" << i + 1 << "] : ";
        input >> r.arr[i];
    }
    return input;
}

void load_menu()
{
     cout << "Array class :" << endl;
     cout << "  0) Setting size of an array" << endl;
     cout << "  1) Setting values of an array" << endl;
     cout << "  2) Displaying values of an array" << endl;
     cout << "  3) Comparing two arrays" << endl;
     cout << "  4) Multiplying two arrays" << endl;
     cout << "  5) Adding two arrays" << endl;
     cout << "  6) Increasing values of an array" << endl;
     cout << "  7) Exit" << endl;
     cout << endl;
}

array array1, array2, array3;

int create()
{
    int obj_n, n;
    cout << "Select the array you want to create ( 1 || 2 || 3 ):" << endl;
    cin >> obj_n;
    if ((obj_n < 1) || (obj_n > 3))
    {
        cout << "Wrong number!" << endl;
        return 0;
    }
    cout << "Select size for array : \n";
    cin >> n;
    switch (obj_n)
    {
        case 1:
            array1.setsize(n);
            break;
        case 2:
            array2.setsize(n);
            break;
        case 3:
            array3.setsize(n);
            break;
    }
    return 1;
}

int compare()
{
    int obj_n;
    cout << "Select arrays to compare (1,2 || 2,3 || 1,3):";
    cin >> obj_n;
    if ((obj_n < 1) || (obj_n > 3))
    {
        cout << "Wrong number!" << endl;
        return 0;
    }
    switch (obj_n)
    {
        case 1:
            if (array1 == array2)
                cout << " array1 == array2" << endl;
            else
                cout << " array1 != array2" << endl;
            break;
        case 2:
            if (array2 == array3)
                cout << " array2 == array3" << endl;
            else
                cout << " array2 != array3" << endl;
            break;
        case 3:
            if (array1 == array3)
                cout << " array1 == array3" << endl;
            else
                cout << " array1 != array3" << endl;
            break;
    }
    return 1;
}

void add(){
    int obj_n;
    cout << "Select the array to add (1 || 2)";
    cin >> obj_n;
    if(obj_n == 1)
    {
        cout << " array3 += array1" << endl;
        array3 += array1;
    }
    else
    {
        cout << " array3 += array2" << endl;
        array3 += array2;
    }
}

int show()
{
    int obj_n;
    cout << "Select array (1 || 2 || 3) :" << endl;
    cin >> obj_n;
    if ((obj_n < 1) || (obj_n > 3))
    {
        cout << "Wrong number!" << endl;
        return 0;
    }
    cout << "array" << obj_n << " :" << endl;
    switch (obj_n)
    {
        case 1:
            cout << array1;
            break;
        case 2:
            cout << array2;
            break;
        case 3:
            cout << array3;
            break;
    }
    return 1;
}

void multiply()
{
    cout << " array3 = array1 * array2" << endl;
    array3 = array1 * array2;
}

int setvalues()
{
    int obj_n;
    cout << "Select 1 || 2 || 3 :" << endl;
    cin >> obj_n;
    if ((obj_n < 1) || (obj_n > 3))
    {
        cout << "Wrong number!" << endl;
        return 0;
    }
    switch (obj_n)
    {
        case 1:
            cin >> array1;
            break;
        case 2:
            cin >> array2;
            break;
        case 3:
            cin >> array3;
            break;
    }
    return 1;
}

int increase()
{
    int obj_n;
    cout << "Select 1 || 2 || 3 :" << endl;
    cin >> obj_n;
    if ((obj_n < 1) || (obj_n > 3))
    {
        cout << "Wrong number!" << endl;
        return 0;
    }
    switch (obj_n)
    {
        case 1:
            cout << " array1++" << endl;
            array1++;
            break;
        case 2:
            cout << " array2++" << endl;
            array2++;
            break;
        case 3:
            cout << " array3++" << endl;
            array3++;
            break;
    }
    return 1;
}

int main()
{
    int item;
    while (1)
    {
        load_menu();
        cin >> item;
        if ((item < 0) || (item > 6))
            return 0;
        switch (item)
        {
            case 0:
                create();
                break;
            case 1:
                setvalues();
                break;
            case 3:
                compare();
                break;
            case 2:
                show();
                break;
            case 4:
                multiply();
                break;
            case 5:
                add();
                break;
            case 6:
                increase();
                break;
            default:
                return 0;
        }
    }
    return 0;
}
 

mamadshoshteri

New Member
سلام استاد دستت دردنکنه من مجبور شدم این برنامه رو ببرم اون برنامه که جواب نمیداد این حداقل ارور نداشت ولی نمیدونم چرا نتیجه نمیده مثلا من اول یه عدد میدم به عنوان طول آرایه بعد انکار میوفته تو حلقه بینهایت هیچ کاری نمیکنه هی عدد میگیره میشه یه نگاهش کنی ببینی چی رو حا انداختم استاده صبح میگفت یه چیزی جا انداختی ولی از بس هنگ بودم نفهمیدم چی میگه

کد:
#include<iostream.h>

    class array1
    {
    friend int operator ==(const array1&,const array1&);
    friend array1 operator*(const array1&,const array1&);
    public:
    array1()
    {
        for(int i=0;i<n;i++)
            a[i]=0;
    }
    array1(int n)
    {
        a=new int [n];
        for(int i=0;i<n;i++)
        cin>>a[i];
    }
    array1(const array1& r): a(r.a) {}
    array1& operator=(const array1&);
    array1 operator+=(const array1&);
    private:
    int *a,n;
    };

    int operator ==(const array1& x,const array1& y)
    {
        for(int i=0;i<sizeof( x.a)/sizeof(int);i++)
            if(x.a[i]!= y.a[i])
                return 0;
        return 1;
    }

    array1& array1::operator =(const array1& r)
    {
    a=r.a;
    return *this;
    }

    array1 operator *(const array1& x,const array1& y)
    {
        array1 ar;
        for(int i=0;i<sizeof( x.a)/sizeof(int);i++)
            ar.a[i]=x.a[i]*y.a[i];
        return ar;
    }

    array1 array1::operator +=(const array1& y)
    {
        array1 ar;
        for(int i=0;i<sizeof( y.a)/sizeof(int);i++)
            ar.a[i]=y.a[i]+ar.a[i];
        return ar;
    }


    void main()
    {
        int m;
        cin>>m;
        array1 a(m),b(m),c(m);
        a+=b;
        a=a*b;
        if (a==b)
            cout<<"equal"<<endl;
        else
            cout<<"No"<<endl;

    }

واقعا ممنون از لطفت اینقدر که من از شما سوال کردم و شما کمکم کردی استادم نمیکرد
 

the_king

مدیرکل انجمن
نکته ها :
1) عملگر هایی مثل == و * رو میشه هم با دو پارامتر و هم با یک پارامتر گرانبار کرد، اگه اجباری نداشتید بهتره
با یک پارامتر گرانبار کنید، چون هم کد تون ساده تر میشه و هم نیازی به friend نخواهید داشت.

2) در تابع سازنده بدون پارامتری که هنوز نه مقدار n مشخص است و نه آرایه a ایجاد شده اجرا کردن کد زیر
اشتباه است و ممکن است بخش ناخواسته ای از حافظه را تخریب کند، ممکن است n یک مقدار تصادفی
خیلی بزرگ مثل 27381 باشد :
کد:
    array1()
    {
        for(int i=0;i<n;i++)
            a[i]=0;
    }

3) در تابع سازنده هر بار که طول آرایه تعیین می شود از کاربر مقادیر را دریافت می کنید :
کد:
    array1(int n)
    {
        a=new int [n];
        for(int i=0;i<n;i++)
        cin>>a[i];
    }
این عمل در داخل عملگر های * و =+ انجام می شود و به همین دلیل است که به نظرتان یک حلقه بینهایت
ایجاد شده، ایراد از همین تابع سازنده است. نباید موقع ساختن کلاس کاربر را مجبور به وارد کردن مقادیر کنید.
برای گرفتن مقادیر از کاربر یک تابع دیگری تعریف کنید تا بصورت یک عمل اختیاری انجام شود، نه اجباری.

4) کد سازنده زیر یک ایراد دارد که استفاده از شیء در ادامه را مختل می کند :
کد:
        array1(int n)
        {
            a = new int [n];
            for(int i = 0; i < n; i++)
                a[i] = 0;
        }
متغیر n هم نام پارامتر تابع است و هم اسم یک متغیر خصوصی در کلاس، اما در کد بالا این مقدار در متغیر خصوصی
n ذخیره نشده است، بنابر این مقدار n کلاس همانطور که قبلا بوده خواهد ماند و با طول آرایه مطابقت نخواهد داشت.
باید مقدار متغیر محلی n که پارامتر ورودی تابع است در متغیر private کلاس ذخیره شود :
کد:
        array1(int n)
        {
[B][COLOR="Blue"]            this->n = n;[/COLOR][/B]
            a = new int [n];
            for(int i = 0; i < n; i++)
                a[i] = 0;
        }

5) این تابع عملگر دو ایراد دارد :
کد:
array1(const array1& r): a(r.a) {}
ایراد اول این است که a یک اشاره گر است، اگر مقدارش را از آرایه دیگری کپی کنید، محتویات آرایه کپی نمی شوند،
فقط آدرس آرایه کپی شده. هر تغییری که بعدا در مقادیر آرایه r.a داده شود، در این یکی هم تغییر می کند. مشکل
اینجا است که اگر کلاس r نابود شود آرایه a در این یکی هم نابود شده است. باید مقادیر داخل ارایه را کپی کنید
تا دو ارایه مستقل از هم باشند. فقط کپی کردن اشاره گر آرایه کار درستی نیست.

ایراد دوم این است که هیچ توجهی به متغیر n نکرده اید و مقدارش را متناسب با طول ارایه جدید تغییر نداده اید.
ممکن است آرایه جدید 4 عنصر داشته باشد ولی n مقدارش 10 باشد.
تابع زیر هم به همان دلیل بالا ایراد دارد :
کد:
array1& array1::operator =(const array1& r)
{
	a=r.a;
	return *this;
}

6) برای بدست آوردن طول آرایه از sizeof استفاده کردید، اگر هیچ اطلاعات دیگری در مورد آرایه نداشتید خوب
چاره دیگری نبود و مجبور بودید از sizeof استفاده کنید، اما شما که یک متغیر n در کلاس دارید، نیازی نیست
طول آرایه را با sizeof محاسبه کنید، می توانید مستقیما از n استفاده کنید.

7) در این تابع هیچ کاری به مقادیر آرایه a خود کلاس نداشتید، مقادیر آرایه جدید ar را با y.a جمع کردید، در حالی که
باید مقادیر a را با y.a جمع می کردید :
کد:
array1 array1::operator +=(const array1& y)
{
	array1 ar;
	for(int i=0;i<sizeof( y.a)/sizeof(int);i++)
		ar.a[i]=y.a[i]+ar.a[i];
	return ar;
}

کد:
#include<iostream.h>

class array1
{
    friend int operator ==(const array1&, const array1&);
    friend array1 operator*(const array1&, const array1&);

    public :
        array1()
        {
            n = 0;
        }

        array1(int n)
        {
            this->n = n;
            a = new int [n];
            for(int i = 0; i < n; i++)
                a[i] = 0;
        }

        void getdata()
        {
            for(int i = 0; i < n; i++)
            {
                cout << "a[" << i + 1 << "] : ";
                cin >> a[i];
            }
        }

        array1(const array1& r)
        {
            n = r.n;
            a = new int[n];
            for (int i = 0; i < n; i++)
                a[i] = r.a[i];
        }
        array1& operator =(const array1&);
        array1 operator +=(const array1&);

    private :
        int *a, n;
};

int operator ==(const array1& x,const array1& y)
{
    if (x.n != y.n)
        return 0;
    for(int i = 0; i < x.n; i++)
        if (x.a[i] != y.a[i])
            return 0;
    return 1;
}

array1& array1::operator =(const array1& r)
{
    n = r.n;
    for(int i = 0; i < n; i++)
        a[i] = r.a[i];
    return *this;
}

array1 operator *(const array1& x,const array1& y)
{
    int min = (x.n < y.n) ? x.n : y.n;
    array1 ar(min);
    for(int i = 0; i < min; i++)
        ar.a[i] = x.a[i] * y.a[i];
    return ar;
}

array1 array1::operator +=(const array1& y)
{
    int min = (n < y.n) ? n : y.n;
    array1 ar(min);
    for(int i = 0; i < min; i++)
        ar.a[i] = a[i] + y.a[i];
    return ar;
}


int main()
{
    int m;
    cin >> m;
    array1 a(m), b(m), c(m);
    a.getdata();
    b.getdata();
    a += b;
    a = a * b;
    if (a == b)
        cout << "equal" << endl;
    else
        cout << "No" << endl;
    return 0;
}
 

جدیدترین ارسال ها

بالا