امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
کلاس ماتريس
نویسنده پیام
adameh_bahal آفلاین
كاربر تک ستاره
*

ارسال‌ها: 59
موضوع‌ها: 14
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 35
( 8 تشکر در 6 ارسال )
ارسال: #1
کلاس ماتريس
توی کلاس ماتريس زير اگه متغير ها private باشند کلاس چه تغييری ميکنه و اينکه بايد توابعی اضافه بشه؟
تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد؟

class matris
{
public:
double** data;
int rowsize,colsize;
public:matris(int row,int col)
{
data=new double[row][col];
}
public:matris add(matris m1)
{
if((rowsize!=m1.rowsize) || (colsize!=m1.colsize)
cout<<"error";
else
{
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
for (int j=0;j<rowsize;j++)
{
m3.data[i][j]=data[i][j]+m1.data[i][j];
}
return m3;
}
}

}

main()
{
matris m1(3,4);
}
۰۸-خرداد-۱۳۸۸, ۰۹:۴۶:۵۱
ارسال‌ها
پاسخ
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #2
RE: کلاس ماتريس
سلام!
این کد شما چندتا اشکال عجیب داره !
غیر از پرانتز و براکت و سمی کولون و . . . تعریف دینامیکی آرایه دو بعدی اونطوری نیست ! یعنی با تعریف دینامیک آرایه یه یعدی فرق می کنه. یه مثال :

کد:
int** var;
int m = 3;
int n = 4;
var=new int*[m];
for(int i=0;i<m;i++)
    *(var+i)=new int[n];

من کد شما شما رو اصلاح کردم :

کد:
#include <iostream>
using namespace std;
class matris
{
public:
    double** data;
    int rowsize,colsize;
    public:matris(int row,int col)
    {
        data=new double*[row];
        for(int i=0;i<row;i++)
            *(data+i)=new double[col];
    }
    public:matris add(matris m1)
    {
        if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
        {
            cout<<"error";
        }
        else
        {
            matris m3(rowsize,colsize);
            for (int i=0;i<rowsize;i++)
            {
                for (int j=0;j<rowsize;j++)
                {
                    m3.data[i][j]=data[i][j]+m1.data[i][j];
                }
            }
            return m3;
        }
    }

};

int main()
{
    matris m1(3,4);
    return 0;
}
احتمالا این کلاس کامل نیست دیگه . . . چون اگه تابع add یه شی matris بر می گردونه پس حداقل یه اپراتور friend تساوی با تایع سازنده با پارامتر matris می خواد. اگه اینطوری نوشتی اون قسمتی هم که add ارور میده میتونی یه ماتریس با درایه های صفر بسازی جمع کنی و بعد خروجی بدی.

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
(آخرین ویرایش در این ارسال: ۰۸-خرداد-۱۳۸۸, ۱۱:۴۶:۱۰، توسط محمد حسینی.)
۰۸-خرداد-۱۳۸۸, ۱۱:۴۳:۳۱
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal, mahlla
adameh_bahal آفلاین
كاربر تک ستاره
*

ارسال‌ها: 59
موضوع‌ها: 14
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 35
( 8 تشکر در 6 ارسال )
ارسال: #3
RE: کلاس ماتريس
(۰۸-خرداد-۱۳۸۸, ۱۱:۴۳:۳۱)Sp!d3rm4n نوشته است: سلام!
این کد شما چندتا اشکال عجیب داره !
غیر از پرانتز و براکت و سمی کولون و . . . تعریف دینامیکی آرایه دو بعدی اونطوری نیست ! یعنی با تعریف دینامیک آرایه یه یعدی فرق می کنه. یه مثال :

کد:
int** var;
احتمالا این کلاس کامل نیست دیگه . . . چون اگه تابع add یه شی matris بر می گردونه پس حداقل یه اپراتور friend تساوی با تایع سازنده با پارامتر matris می خواد. اگه اینطوری نوشتی اون قسمتی هم که add ارور میده میتونی یه ماتریس با درایه های صفر بسازی جمع کنی و بعد خروجی بدی.

درسته اين کلاس کامل نيست و در واقع توابع هم به صورت پاسکال تعريف شدن
حالا شما در مورد استفاده از متغير های private و رفع مشکل خروجی تابع add ميشه منو راهنمايی کنيد?
۰۸-خرداد-۱۳۸۸, ۱۵:۵۳:۳۷
ارسال‌ها
پاسخ
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #4
RE: کلاس ماتريس
ببخشید ! private رو یادم رفت !
اگه متغیرها رو private تعریف کنی دیگه از بیرون کلاس نمی تونی بهشون دسترسی پیدا کنی.
اگه public باشن شما تو تابع main میتونید اینو بنویسین.
کد:
matris m1(3,4);
m1.data[1][2] = 3;
از تابع main درایه 1,2 رو برابر صفر قرار دادیم. ولی اگه private بود نمیشد این کار رو کرد و شما باید یه تابع پابلیک تو کلاس برای مقداردهی تعریف می کردید. خلاصه هرچیزی که private تعریف کنید فقط تو بلوک کلاس در دسترسه.
خروجی رو هم که گفتم. ارور بخاطر اینه که شما از دستور return استفاده نکردی. این راه حل به ذهن من میزسه.

کد:
cout<<"error";
matris m3(rowsize,colsize);
for (int i=0;i<rowsize;i++)
{
    for (int j=0;j<rowsize;j++)
    {
        m3.data[i][j]=data[i][j]+0;
    }
}
return m3;

بعید میدونم راهی باشه که تابع خروجی نده. چون توابعی که بعدش اون خروجی رو به عنوان ورودی لازم دارن به مشکل میخورن !

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۸-خرداد-۱۳۸۸, ۱۷:۰۷:۵۵
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal
adameh_bahal آفلاین
كاربر تک ستاره
*

ارسال‌ها: 59
موضوع‌ها: 14
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 35
( 8 تشکر در 6 ارسال )
ارسال: #5
RE: کلاس ماتريس
(۰۸-خرداد-۱۳۸۸, ۱۷:۰۷:۵۵)Sp!d3rm4n نوشته است: ببخشید ! private رو یادم رفت !
اگه متغیرها رو private تعریف کنی دیگه از بیرون کلاس نمی تونی بهشون دسترسی پیدا کنی.
اگه public باشن شما تو تابع main میتونید اینو بنویسین.
کد:
matris m1(3,4);
m1.data[1][2] = 3;
از تابع main درایه 1,2 رو برابر صفر قرار دادیم. ولی اگه private بود نمیشد این کار رو کرد و شما باید یه تابع پابلیک تو کلاس برای مقداردهی تعریف می کردید. خلاصه هرچیزی که private تعریف کنید فقط تو بلوک کلاس در دسترسه.
خروجی رو هم که گفتم. ارور بخاطر اینه که شما از دستور return استفاده نکردی. این راه حل به ذهن من میزسه.


بعید میدونم راهی باشه که تابع خروجی نده. چون توابعی که بعدش اون خروجی رو به عنوان ورودی لازم دارن به مشکل میخورن !

ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
۰۸-خرداد-۱۳۸۸, ۱۸:۱۶:۱۷
ارسال‌ها
پاسخ
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #6
RE: کلاس ماتريس
نقل قول: ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
خب private تعریف کنید. مشکلی پیش نمیاد. همه توابعی که تو کلاس تعریف می کنید به اعضای private دسترسی دارن.
نقل قول: در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
من که گفتم . . . ! با صفر جمع کنید و به عنوان خروجی بدید.
کد:
#include <iostream>
using namespace std;
class matris
{
private:
    double** data;
    int rowsize,colsize;
public:
    matris(int row,int col)
    {
        data=new double*[row];
        for(int i=0;i<row;i++)
            *(data+i)=new double[col];
    }
    matris add(matris m1)
    {
        if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
        {
            cout<<"error";
            matris m3(rowsize,colsize);
            for (int i=0;i<rowsize;i++)
            {
                for (int j=0;j<rowsize;j++)
                {
                    m3.data[i][j]=data[i][j]+0;
                }
            }
        }
        else
        {
            matris m3(rowsize,colsize);
            for (int i=0;i<rowsize;i++)
            {
                for (int j=0;j<rowsize;j++)
                {
                    m3.data[i][j]=data[i][j]+m1.data[i][j];
                }
            }
            return m3;
        }
    }

};

int main()
{
    matris m1(3,4);
    return 0;
}

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۸-خرداد-۱۳۸۸, ۱۹:۵۹:۱۸
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal
adameh_bahal آفلاین
كاربر تک ستاره
*

ارسال‌ها: 59
موضوع‌ها: 14
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 35
( 8 تشکر در 6 ارسال )
ارسال: #7
RE: کلاس ماتريس
(۰۸-خرداد-۱۳۸۸, ۱۹:۵۹:۱۸)Sp!d3rm4n نوشته است:
نقل قول: ولی من ميخوام با private تعريف کنم و توابعش رو اضافه کنم آيا امکانش هست؟
خب private تعریف کنید. مشکلی پیش نمیاد. همه توابعی که تو کلاس تعریف می کنید به اعضای private دسترسی دارن.
نقل قول: در مورد خروجی هم نميخام خروجی نده فقط ميخوام اين مشکل رو که گفتم بر طرف کنم:
"تو تابع add اگه 2 تا ماتريس هم سايز نباشن تابع نميتونه خروجی برگردونه و خطا برميگردونه برای رفع اين مشکل بايد چيکار کرد"
من که گفتم . . . ! با صفر جمع کنید و به عنوان خروجی بدید.

ممنون که وقت ميزاريد و پاسخ ميديد
در مورد private کردن متغير ها ميشه يه تابع و نحوه ی دسترسی بهش رو مثال بزنيد من متوجه بشم?
در مورد خروجی هم دقيق متوجه نشدم که چطوری با اضافه کردن صفر ديگه error نميگيره؟
(آخرین ویرایش در این ارسال: ۰۸-خرداد-۱۳۸۸, ۲۰:۱۸:۵۵، توسط adameh_bahal.)
۰۸-خرداد-۱۳۸۸, ۲۰:۱۸:۰۰
ارسال‌ها
پاسخ
تشکر شده توسط : محمد حسینی
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #8
RE: کلاس ماتريس
این کد رو ببینید :
کد:
#include <iostream>
using namespace std;
class matris
{
private:
    double** data;
    int rowsize,colsize;
public:
    matris(int row,int col)
    {
        data=new double*[row];
        for(int i=0;i<row;i++)
            *(data+i)=new double[col];
    }
    matris add(matris m1)
    {
        if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
        {
            cout<<"error";
            return *this;
        }
        else
        {
            matris m3(rowsize,colsize);
            for (int i=0;i<rowsize;i++)
            {
                for (int j=0;j<rowsize;j++)
                {
                    m3.data[i][j]=data[i][j]+m1.data[i][j];
                }
            }
            return m3;
        }
    }
    void assign(int i, int j, double value)
    {
        data[i][j] = value;
    }

};

int main()
{
    matris m1(3,4);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            m1.assign(i, j, i+j);
    return 0;
}

چون عضو داده ای data رو private تعریف کردیم پس دیگه نمیشه مستقیم از خارج کلاس (مثل تابع main) اونو مقدار دهی کرد. یعنی این کد اشتباهه :
کد:
int main()
{
    matris m1(3,4);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            m1.data[i][j] = i+j;
    return 0;
}

بجاش یه تابع public تو کلاس تعریف کردیم برای مقداردهی به data. چون تو تابع به توابع private دسترسی داریم. درواقع بجای اینکه مستقیم به data دسترسی داشته باشیم یه تابع public تعریف کردیم برای مقدار دادن . . . تابع assign

در مورد خروجی هم وقتی اندازه ماتریس ها برابر نباشه نمیتونیم جمعشون کنیم و چیزی برای خروجی نداریم. درحالی که تابع باید یه خروجی به از نوع ماتریس داشته باشه. حالا من یه ماتریس درست کردم و درایه هاش رو با صفر جمع کردم و به عنوان خروجی دادم. یعنی ماتریس تغییر نکرد. اصلا میتونستید با صفر جمع نکنید. هدف فقط این بود که تابع یه چیزی برگردونه. یه راه حل دیگش هم استفاده از return *this هست. یعنی همون شیی صدا زننده تابع برگردونده بشه. تو این حالت هم ماتریس تغییری نمیکنه.
موفق باشید

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۸-خرداد-۱۳۸۸, ۲۳:۲۸:۳۹
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal
adameh_bahal آفلاین
كاربر تک ستاره
*

ارسال‌ها: 59
موضوع‌ها: 14
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 35
( 8 تشکر در 6 ارسال )
ارسال: #9
RE: کلاس ماتريس
(۰۸-خرداد-۱۳۸۸, ۲۳:۲۸:۳۹)Sp!d3rm4n نوشته است: این کد رو ببینید :

چون عضو داده ای data رو private تعریف کردیم پس دیگه نمیشه مستقیم از خارج کلاس (مثل تابع main) اونو مقدار دهی کرد. یعنی این کد اشتباهه :

بجاش یه تابع public تو کلاس تعریف کردیم برای مقداردهی به data. چون تو تابع به توابع private دسترسی داریم. درواقع بجای اینکه مستقیم به data دسترسی داشته باشیم یه تابع public تعریف کردیم برای مقدار دادن . . . تابع assign

در مورد خروجی هم وقتی اندازه ماتریس ها برابر نباشه نمیتونیم جمعشون کنیم و چیزی برای خروجی نداریم. درحالی که تابع باید یه خروجی به از نوع ماتریس داشته باشه. حالا من یه ماتریس درست کردم و درایه هاش رو با صفر جمع کردم و به عنوان خروجی دادم. یعنی ماتریس تغییر نکرد. اصلا میتونستید با صفر جمع نکنید. هدف فقط این بود که تابع یه چیزی برگردونه. یه راه حل دیگش هم استفاده از return *this هست. یعنی همون شیی صدا زننده تابع برگردونده بشه. تو این حالت هم ماتریس تغییری نمیکنه.
موفق باشید
به عنوان سؤال آخر Biggrin
اگه من بخوام اپراتور جمع و مساوی رو برای اين کلاس بارگزاری اضافه کنم به شکلی که همچين عبارتی:
matris m1(3,4),m2(3,4),m3(3,4
m3=m1+m2
معتبر باشه چيکار بايد انجام بدم؟

ممنون
۰۹-خرداد-۱۳۸۸, ۰۸:۰۷:۵۲
ارسال‌ها
پاسخ
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #10
RE: کلاس ماتريس
سلام !

الان هیچ کامپایلری تو دست و بالم نیست ! اینو تو نت پد نوشتم امیدوارم جواب بده. اینا رو باید تو کلاس تعریف کنید.
کد:
friend martris& operator+ (matris& m1, matris& m2)
{
    if (m1.rowsize == m2.rowsize && m1.colsize == m2.colsize)
    {
        matris m3(m1.rowsize, m1.colsize);
        for (int i = 0; i < m1.rowsize; i++)
            for (int j = 0; j < m1.col size; j++)
                m3.data[i][j] = m1.data[i][j] + m2.data[i][j];
        return m3;
    }
}

friend void operator= (matris& m1, matris& m2)
{
    if (m1.rowsize == m2.rowsize && m1.colsize == m2.colsize)
    {
        matris m3(m1.rowsize, m1.colsize);
        for (int i = 0; i < m1.rowsize; i++)
            for (int j = 0; j < m1.col size; j++)
                m1.data[i][j] = m2.data[i][j];
    }
}

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۹-خرداد-۱۳۸۸, ۰۹:۰۱:۳۶
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #11
RE: کلاس ماتريس
کد:
#include <iostream>
using namespace std;
class matris
{
private:
    double** data;
    int rowsize,colsize;
public:
    matris(int row,int col)
    {
        data=new double*[row];
        for(int i=0;i<row;i++)
            *(data+i)=new double[col];
    }
    matris add(matris m1)
    {
        if((rowsize!=m1.rowsize) || (colsize!=m1.colsize))
        {
            cout<<"error";
            return *this;
        }
        else
        {
            matris m3(rowsize,colsize);
            for (int i=0;i<rowsize;i++)
            {
                for (int j=0;j<rowsize;j++)
                {
                    m3.data[i][j]=data[i][j]+m1.data[i][j];
                }
            }
            return m3;
        }
    }
    void assign(int i, int j, double value)
    {
        data[i][j] = value;
    }

    friend matris operator +(matris& m1, matris& m2)
    {
        if (m1.rowsize == m2.rowsize && m1.colsize == m2.colsize)
        {
            matris m3(m1.rowsize, m1.colsize);
            for (int i = 0; i < m1.rowsize; i++)
                for (int j = 0; j < m1.colsize; j++)
                    m3.data[i][j] = m1.data[i][j] + m2.data[i][j];
            return m3;
        }
    }

    matris operator =(matris& m)
    {
        if (rowsize == m.rowsize && colsize == m.colsize)
        {
            for (int i = 0; i < m.rowsize; i++)
                for (int j = 0; j < m.colsize; j++)
                    data[i][j] = m.data[i][j];
            return *this;
        }
    }
};

int main()
{
    matris m1(3,4);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            m1.assign(i, j, 1);

    matris m2(3,4);
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            m2.assign(i, j, 1);

    matris m3(3,4);
    m3 = m1 + m2;
    return 0;
}

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۹-خرداد-۱۳۸۸, ۲۳:۰۴:۱۸
ارسال‌ها
پاسخ
تشکر شده توسط : adameh_bahal


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  ارتباط دو زبان c و ++C و ایجاد آبجکت از کلاس در C salehjg 3 3,742 ۲۴-اردیبهشت-۱۳۹۵, ۱۶:۰۸:۱۷
آخرین ارسال: salehjg
  مقدار دهی textbox در کلاس c# aleas 0 2,627 ۲۸-اسفند-۱۳۹۱, ۱۸:۰۲:۵۱
آخرین ارسال: aleas
  کلاس شی و ارایه پویا fgcosoft 0 2,218 ۰۷-دى-۱۳۹۱, ۲۱:۵۶:۴۲
آخرین ارسال: fgcosoft
Question کلاس DateTime در C++ javaweb 0 2,457 ۱۷-آذر-۱۳۹۱, ۱۱:۱۳:۴۵
آخرین ارسال: javaweb
Rolleyes ماتريس اسپارس يا ماتريس خلوت The.Ghost 0 3,138 ۰۶-اردیبهشت-۱۳۹۱, ۱۳:۳۷:۵۵
آخرین ارسال: The.Ghost
  کتابخانه با کلاس ها m.saba 1 3,526 ۰۷-اردیبهشت-۱۳۹۰, ۲۳:۳۵:۵۳
آخرین ارسال: mhd.group
  تابع مخرب کلاس mojtabamalaekeh 7 11,106 ۱۹-اردیبهشت-۱۳۸۹, ۱۹:۳۰:۵۳
آخرین ارسال: dreamvbfox
Rolleyes مشل با یه کلاس مشتق شده mig 2 3,464 ۱۷-فروردین-۱۳۸۹, ۱۹:۰۴:۱۳
آخرین ارسال: محمد حسینی
  کمک در مورد کلاس ماتریس Nariman619 4 6,219 ۰۷-آبان-۱۳۸۸, ۱۰:۱۱:۳۴
آخرین ارسال: mehrdad372
  کلاس اعداد مختلط وبارگزاری اضافه اپراتورهای جمع وتفريق adameh_bahal 9 17,822 ۱۵-خرداد-۱۳۸۸, ۲۰:۳۷:۴۴
آخرین ارسال: محمد حسینی

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS