PDA

View Full Version : اشکالی اساسی در مورد نوشتن یک class



daneshjo IT
یک شنبه 20 خرداد 1386, 14:14 عصر
سلام.

من در رابطه با نوشتن class ماتریس n*n اشکالی داشتم.
قبل از اینکه سوالاتم را بپرسم در رابطه با این code بگم که: علت اینکه از دو constructor استفاده شده این است که.اگر کاربر هیچ مقداری را برای n وارد نکرد به صورت پیش فرض یک ماتریس 100*100 به صورت پویا ساخته شود.(البته در فراخوانی این دو constructor با توجه به این توضیح چگونه باید عمل کنم؟)
اشکال های من :
1)وقتی که در constructor این کلاس مقدار n را از کاربر گرفتم و ماتریس را به صورت پویا ساختم چگونه مقدار n را به method های این class ارجاع بدهم؟؟؟
در این قطعه code که من نوشتم در جاهایی که از n استفاده کردم error میگیرد؟

2)در برنامه main هنگامی که methode هایی را که مقداری را به عنوان ورودی میگیرند(مثلا methode :motegharen()) را اگر بخواهم فراخوانی کنم .چگونه این کار را باید انجام بدهم؟
3)در مورد ارجاع دادن ماتریس a به methodهای این کلاس,نمیدونستم که چه چگونه ارجاع بدم کاری که انجام دادم درسته؟؟؟؟
منتظر راهنماییتون می باشم.




#include<iostream.h>
#include<conio.h>
#include<stdio.h>
class sqmatrix
{
friend ostream &operator<<(ostream & output,const sqmatrix & a);
friend istream &operator>>(istream & input,const sqmatrix & a);
private:
int n;
int**a;
public:
sqmatrix( int n);
sqmatrix();
int motegharen(int a,n);
//************************************************** ******
sqmatrix :: sqmatrix(int n)
{
cout<<"enter n :";
cin>>n;
int **a=new int *[n];
for(int i=1;i<=n;i++)
a[i-1]=new int[i];
}
//************************************************** ******
sqmatrix :: sqmatrix()
{
a=new int*[100];
for (int i=0;i<100;i++)
a[i]=new int[100];
}
//************************************************** *
istream &operator>>(istream &input,const sqmatrix & a)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
input>>a[i][j];
return (input);
}
//************************************************** **
ostream &operator<<(ostream &output,const sqmatrix & a)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
output<<a[i][j];
cout<<endl;
return(output);
}
//************************************************** ***
int sqmatrix:: motegharen(int a,n)
{
int i,j;
for( i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]!=a[j][i]){
cout<<" Motegharen : False"<<endl;
return 0;
}
cout<<" Motegharen : True" <<endl;
return 0;
}
//************************************************** ******
int main()
{
sqmatrix b;
b.motegharen(int);
getch();
return 0;
{

daneshjo IT
یک شنبه 20 خرداد 1386, 14:16 عصر
البته ببخشید که این سوالم این قدر طولانی شد

emad_67
یک شنبه 20 خرداد 1386, 17:55 عصر
)وقتی که در constructor این کلاس مقدار n را از کاربر گرفتم و ماتریس را به صورت پویا ساختم چگونه مقدار n را به method های این class ارجاع بدهم؟؟؟

احتیاجی به ارجاع n نیست در همون سازنده که n رو از کار بر گرفتید اونو داخل n خود کلاس بریزید به این صورت


sqmatrix :: sqmatrix(int x)
{
n=x;
a=new int *[n];
for(int i=0;i<n;i++)
a[i]=new int[n];
}

در مورد اون سازنده دوم هم باید مقدار n رو 100 بزارید
در مورد ایراداتی هم در مورد n میگیره به خطر اینه که شما در توابع << و >> به صورت مستقیم می خواستین به n دسترسی پیدا کنید چون این توابع friend هستند و شیء کلاس باید برای انها ارسال شود پس باید از طریق همون شیء به اعضای اون ها هم دسترسی پیدا کرد


2)در برنامه main هنگامی که methode هایی را که مقداری را به عنوان ورودی میگیرند(مثلا methode :motegharen()) را اگر بخواهم فراخوانی کنم .چگونه این کار را باید انجام بدهم؟

این تابع چه مقداری رو باید لز ورودی بگیره و چه کاری باید انجام بده؟


)در مورد ارجاع دادن ماتریس a به methodهای این کلاس,نمیدونستم که چه چگونه ارجاع بدم کاری که انجام دادم درسته؟؟؟؟

باز هم میگم احتیاجی به ارجاع نیست چون خود توابع عضو به اعضا pivate کلاس دسترسی دارند اصلا یکی از دلایلی که از کلاس استفاده میکنن اینه از انتقال پارامتر ها به توابع جلوگیری بشه
برنامتون رو هم اصلاح کردم یعنی syntax error نداره ولی ایرادات منطقی رو نمیدونم


#include<iostream.h>
#include<conio.h>
#include<stdio.h>
class sqmatrix
{
friend ostream &operator<<(ostream & output,const sqmatrix &);
friend istream &operator>>(istream & input,const sqmatrix &);
private:
int n;
int**a;
public:
sqmatrix( int n);
sqmatrix();
int motegharen();
};
//************************************************** ******
sqmatrix :: sqmatrix(int x)
{
n=x;
a=new int *[n];
for(int i=0;i<n;i++)
a[i]=new int[n];
}
//************************************************** ******
sqmatrix :: sqmatrix()
{
n=100;
a=new int*[n];
for (int i=0;i<n;i++)
a[i]=new int[n];
}
//************************************************** *
istream &operator>>(istream &input,const sqmatrix & obj)
{
for(int i=0;i<obj.n;i++)
for(int j=0;j<obj.n;j++)
input>>obj.a[i][j];
return (input);
}
//************************************************** **
ostream &operator<<(ostream &output,const sqmatrix & obj)
{
for(int i=0;i<obj.n;i++)
for(int j=0;j<obj.n;j++)
output<<obj.a[i][j];
cout<<endl;
return(output);
}
//************************************************** ***
int sqmatrix::motegharen()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]!=a[j][i])
{
cout<<" Motegharen : False"<<endl;
return 0;
}
cout<<" Motegharen : True" <<endl;
return 0;
}
//************************************************** ******
int main()
{
sqmatrix b;
b.motegharen();
getch();
return 0;
}

daneshjo IT
یک شنبه 20 خرداد 1386, 21:27 عصر
در این قطعه code به چند اشکال برخوردم؟
1)اینکه اگر من n را در constructor این کلاس به صورت زیر بگیرم:



sqmatrix :: sqmatrix(int x)


{


cout<<"enter n:"<<endl;

cin>>x;

n=x;
a=newint *[n];
for(int i=0;i<n;i++)
a[i]=newint[n];
}





در این حال برنامه بدون گرفتن n و عناصر ماتریس مقدار false را برای من برمیگرداند.


2)اگر هم nرا به صورت زیر بگیرم:



cout<<"enter n:"<<endl;
cin>>x;
sqmatrix obj(x);

مقدار n را از من میگیرد ولی باز هم عناصر ماتریس را از من نمیگیرد و مقدار false را برمیگرداند.


3)چگونه بارگذاری operator های >>,<< را در برنامه main فراخوانی کنم؟؟؟؟؟؟

emad_67
یک شنبه 20 خرداد 1386, 22:41 عصر
اصلا نیازی نیست که که n رو در سازنده از ورودی بگیرید چون شما تابع سازنده رو به این صورت تعریف کردین



sqmatrix :: sqmatrix(int x)

یعنی سازنده باید یه مقدار عددی رو بگیره که این هم باید از طریق main بهش داده بشه
منظور از اینکه میگین مقدار false رو بر مگردونه چیه؟


)چگونه بارگذاری operator های >>,<< را در برنامه main فراخوانی کنم؟؟؟؟؟؟

برای استفاده از عملگر های overload شده میتونی اینجوری بنویسی
این تابع main رو به جای main در اون سورسی رو که من اصلاحش کردم بذار تا نتیجه رو ببینی


void main()
{
int n;
cout<<"enter n:"<<endl;
cin>>n;
sqmatrix obj(n);
cout<<"enter "<<n*n<<" numbers:";
cin>>obj;
cout<<obj;
}

در واقع وقتی مینویسی


cin>>obj

کامپایلر میاد اونو به این شکل در نظر میگیره


operator>>(cin,obj)

که منتهی به فراخوانی تابع بارگذاری شده << میشه

daneshjo IT
دوشنبه 21 خرداد 1386, 02:05 صبح
درقطعه کد سوال بالا چه ماتریس متقارن باشد و چه ماتریس متقارن نباشد مقدار false را برای ما برمیگرداند؟نمی دونم اشکالش کجاست؟؟؟
من کد mainبرنامه و methode motegharen رادوباره میذارم بقیه برنامه همانند صورت سوالم است تغیری ندادم




intsqmatrix::motegharen()
{
int i,j;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)
if(a[i][j]!=a[j][i])
return 0;
return 1;
}
//************************************************** ******
voidmain()
{

clrscr();
int n;
sqmatrix b;
cout<<"enter n:"<<endl;
cin>>n;
sqmatrix obj(n);
cout<<"enter "<<n*n<<" numbers:";
cin>>obj;
cout<<obj;
if(b.motegharen()==0)
printf("\n MOTEGHAREN: FALSE\n");
else
printf("\n MOTEGHAREN: TRUE\n");
getch();

}

emad_67
دوشنبه 21 خرداد 1386, 08:48 صبح
شما باید تو حلقه for مقدار i رو از 0 شروع کنی نه از 1 یعنی


int sqmatrix::motegharen()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]!=a[j][i])
return 0;
return 1;
}

daneshjo IT
دوشنبه 21 خرداد 1386, 12:25 عصر
این قسمت کد را درست کردم اما باز هم false را برمیگرداند؟
اشکالش چیه؟:متفکر:

emad_67
دوشنبه 21 خرداد 1386, 13:56 عصر
این قسمت کد را درست کردم اما باز هم false را برمیگرداند؟
اشکالش چیه؟

مشکلی نداره من اجرلش کردم و درس جواب داد