PDA

View Full Version : سوال: اشکال در کد



hafez1
یک شنبه 16 مهر 1391, 19:54 عصر
یه کد هست که داره لینک لیست هارو به کمک تمپلیت ها درس می کنه.که به صورت زیره.
قسمتcppبرنامه:



#include "mdll.h"
#include "iostream"
class my_app
{
public :
my_app ()
{
mdll<int> a ;
a.pushback(12);
a.pushfront(13);
a.pushfront(14);
mdll<double> b ;
mdll<mdll<int> > c ;
c.pushback(a);
a.pushfront(20);
a.pushfront(30);
c.pushback(a);
c.h->n->d.pushfront (45) ;
std::cout<<a.popfront()<<std::endl ;
}
} ;
my_app the_app ;
void main ( void )
{
}



قسمت .h برنامه.



#ifndef MDLL_H
#define MDLL_H
template <typename T> class mnode
{
public :
T d ;
mnode<T> * n ;
};
template <typename Z> class mdll
{
public :
mnode<Z> * h ;
mnode<Z> * t ;
mdll():h(0),t(0){}
void pushfront (Z d);
void pushback (Z d);
Z popfront ();
mdll(mdll<Z> const & x) ;
~mdll()
{
mnode<Z> * tmp = h ;
while ( tmp )
{
mnode<Z> * tmp2 = tmp->n ;
delete tmp ;
tmp = tmp2 ;
}
h = t = 0 ;
}
mdll<Z> & operator = (mdll<Z>const x )
{
this->~mdll ();
mnode<Z> * tmp = x.h ;
while ( tmp )
{
pushback(tmp->d);
tmp = tmp->n ;
}
return * this ;
}
};
template <typename T> void mdll<T>::pushfront(T d)
{
mnode<T> * tmp = new mnode<T> ;
tmp->d = d ;
tmp->n = h ;
h = tmp ;
if ( t == 0 ) t = h ;
}
template <typename T> void mdll<T>::pushback(T d)
{
if ( h == 0 )
{
pushfront(d);
return ;
}
mnode<T> * tmp = new mnode<T> ;
tmp->d = d ;
tmp->n = 0 ;
t ->n = tmp ;
t = tmp ;
}
template <typename S> S mdll<S>::popfront ()
{
if ( h == 0 )
throw "empty link list" ;
S d = h ->d ;
mnode<S> * tmp = h ;
h = h ->n ;
if ( h == 0 ) t = h ;
delete tmp ;
return d ;
}
template <typename T> mdll<T>::mdll(mdll<T> const & x):h(0),t(0)
{
mnode<T> * tmp = x.h ;
while ( tmp )
{
pushback(tmp->d);
tmp = tmp->n ;
}
}


#endif // MDLL_H






می خاستم دو قسمت به برنامه اضافه کنم.یکی سربارگذاری عملگر+.برای اضافه کردن دو لینک لیست به یکدیگر.ویکی sort کردن به صورت صعودی.

مسعود اقدسی فام
یک شنبه 16 مهر 1391, 21:22 عصر
اوپراتور = رو که سربارگذاری کردید. جمع رو هم می‌کردید دیگه!

کجای sort براتون ابهام داره؟

hafez1
یک شنبه 16 مهر 1391, 21:48 عصر
ممنون.جواب کامل و شاملی بود!!!!!!!!

one hacker alone
دوشنبه 17 مهر 1391, 15:34 عصر
شما نگفتین مشکلتون چیه و چه پیغامی میده فقط کد رو گذاشتین و معمولا ادم وقت نمیکنه بشینه کد رو تریس کنه لذا وقتی مشکلی در کد دارید دقیقا بگین کجای کار مشکل داره و از ماهیت نرم افزار هر چه بیشتر بگین وقت کمتری برای پی بردن به عملکرد کد نیاز هست

hafez1
دوشنبه 17 مهر 1391, 20:43 عصر
در واقع این کد هیچ اشکالی نداره.و بدون ارور اجرا می شه .من واسه اضافه کردن دو قسمت به برنامه مشکل دارم.یکی اپراتور +برای افزودن مثلا دو تا لینک لیست به هم.و یکی مرتب کردنش بصورت صعودی.
برای اپراتور +فکر کنم باید بیام آدرس اولین خونه از یکی از لینک لیستا رو بریزم تو آخرین خونه ی لینک لیست دوم . ولی کد کردن اینا برام سخته.
وبرای مرتب کردن باید اپراتور> رو سربارگذاری کرد این یکیوکه دیگه اصلا بلد نیسم

hafez1
دوشنبه 17 مهر 1391, 22:28 عصر
واسه قسمت اپراتور+این کد درسته؟


class Add
{ friend Add operator+(const Add&, const Add&);
Add operator*(const Add& a, const Add& b)
{
Add d(b.t=a.h);
return d;
}

amin1softco
دوشنبه 17 مهر 1391, 22:57 عصر
روال کلی sort کد زیر می شه خودت دیگه با تمپلیت ها پیادش کن :
t=h;
int counter=0;
while(t->next!=NULL)

{
t=t->next;
counter=counter+1;
}
for(int j=0; j<counter; j++)

{
t=h;
while(t->next!=NULL)

{
if(t->n > t->next->n)

{
int temp;
temp=t->next->n;
t->next->n=t->n;
t->n=temp;
} // End if
else
t=t->next;
} // End while
} // End for
برای سر بار گذاری عملگر جمع هم مگه add رو ننوشتی حالا اشاره گر لیست جدید رو بگیر و با یک حلقه تا انتهاش برو و به لیست قبلی اضافش کن همین!

hafez1
دوشنبه 17 مهر 1391, 23:25 عصر
فعلا اینو برای +تصحیح کردم.درست شد؟


class Add
{ friend Add operator+(const Add&, const Add&);
Add operator+(const Add& a, const Add& b)
{
mnode<T> * tmp = new mnode<T> ;
tmp=a.h;
while(a.tmp->n!=NULL)
{
tmp=a.tmp->n;
}
a.tmp->n=b.h;
return a;
}

این که a و b رو جایی تعریف نکردم مشکلی نداره؟

hafez1
دوشنبه 17 مهر 1391, 23:51 عصر
در مورد sort من توضیحتونو متوجه می شم ولی با تمپلیتا نمی تونم بنویسمش .آخه وقتی از تمپلیت استفاده می کنیم هر نوع داده ای داریم چی جوری می شه انواع مختلف داده رو مقایسه کرد؟در ضمن کجاش باید >رو سربارگذاری کنم؟

amin1softco
سه شنبه 18 مهر 1391, 09:00 صبح
#ifndef MDLL_H
#define MDLL_H


/*
تعریف یک کلاس برای گره های لیست پیوندی و از نوع تمپلیت
T
که مقدار در متغیر
d
از نوع تمپلیت تعریف شده است
یک اشاره گر از نوع همین کلاس
*/
template <typename T>
class mnode
{
public :
T d ;
mnode<T> * n ;
};


template <typename Z>
class mdll //تعریف یک کلاس برای عملیات لیست پیوندی و تعریف تملیت برای کار
{
public :
mnode<Z> * h ; //تعریف یک متغیر برای نگهداری ریشه لیست پیوندی
mnode<Z> * t ; // یک متغیر برای اشاره به هر گره در طول گردش در لیست
mdll():h(0),t(0){} // سازنده کلاس برای مقدار دهی صفر به متغیر ها

void pushfront (Z d); // تعریف تابع بدنه بعداً تعریف خواهد شد برای اضافه کردن نود در ابتدای صف که برگشتی ندارد
void pushback (Z d); // مثل قبلی اضافه کردن در انتها
Z popfront (); // تعریف تابعی که مقدار برگشتی آن از نوع زد است
void sort ();
mdll(mdll<Z> const & x) ; // تعریف یک تابع که مقدار ورودی آن از نوع ثابت و ارجاع است
~mdll()// نابودگر لیست برای پاک سازی حافظه
{
mnode<Z> * tmp = h ; // تعریف یک اشاره گر کمکی از نوع کلاس و مقدار دهی آن به متغیر ریشه که ابتدای لیست را نگه می داشت
while ( tmp ) // یک حلقه برای پیمایش لیست
{
mnode<Z> * tmp2 = tmp->n ;//بعد از خواندن هر گره اشاره گر گره بعدی در این متغیر ذخیره می شود
delete tmp ; // پاک سازی گره قبلی
tmp = tmp2 ; // جایگزین کردن اشاره گر ها به گره جدید
}
h = t = 0 ;// مقدار متغیر هایی که ریشه و اشاره به گره فعلی را نگه می داشتند به صفر و مقدار سازنده تغییر می کند.
}

mdll<Z> & operator = (mdll<Z>const x ) // سر بار گذاری عملگر تساوی و تعریف متغیر ایکس از نوع کلاس برای انتقال مقادیر به کلاس جدید
{
this->~mdll ();// گره جدید پاک سازی می شود.
mnode<Z> * tmp = x.h ;// تعریف یک اشاره گر کمکی از نوع کلاس و مقدار دهی آن به متغیر ریشه کلاس
while ( tmp ) // تا زمانی که متغیر کمکی نال نشده حلقه ادامه دارد
{
pushback(tmp->d); // اجرای تابع اضافه کردن به انتها
tmp = tmp->n ; // اشاره به گره بعدی برای پیمایش کامل لیست
}
return * this ; // برگشت گره کمکی تمپ به عنوان حاصل تساوی
}//پایان سربارگذاری عملگر تساوی


mdll<Z> operator + (const mdll<Z>& r ) // سر بار گذاری عملگر جمع و تعریف متغیر ار از نوع کلاس برای انتقال مقادیر به کلاس جدید
{

mnode<Z> * tmp = r.h ;// تعریف یک اشاره گر کمکی از نوع کلاس و مقدار دهی آن به متغیر ریشه کلاس
while ( tmp ) // تا زمانی که متغیر کمکی نال نشده حلقه ادامه دارد
{
pushback(tmp->d); // اجرای تابع اضافه کردن به انتها
tmp = tmp->n ; // اشاره به گره بعدی برای پیمایش کامل لیست
}
return * this ; // برگشت گره کمکی تمپ به عنوان حاصل
}//پایان سربارگذاری عملگر جمع


};//پایان بدنه کلاس

template <typename T>
void mdll<T>::pushfront(T d) //تعریف بدنه تابع اضافه کردن به ابتدا
{
mnode<T> * tmp = new mnode<T> ;// تعریف یک اشاره گر کمکی از نوع کلاس گره که عمل اختصاص فضا اینجا صورت میگیره
tmp->d = d ;// مقدار دهی متغیر گره با مقداری که به تابع ارسال شده
tmp->n = h ;//مقدار ریشه با این عملگر جایگزین شده
h = tmp ;// مقدار قبلی ریشه به این گره اشاره می کنه چون به ابتدای لیست اضافه می شه
if ( t == 0 ) t = h ; //اگر لیست خالی بود دو اشاره گر برابر می شوند
}

template <typename T>
void mdll<T>::pushback(T d) // تعریف تابه اضافه کردن به انتها
{
if ( h == 0 )
{
pushfront(d);
return ;
}
mnode<T> * tmp = new mnode<T> ;
tmp->d = d ;
tmp->n = 0 ;
t ->n = tmp ;
t = tmp ;
}
template <typename S>
S mdll<S>::popfront ()
{
if ( h == 0 )
throw"empty link list" ;
S d = h ->d ;
mnode<S> * tmp = h ;
h = h ->n ;
if ( h == 0 ) t = h ;
delete tmp ;
return d ;
}


template <typename S>
void mdll<S>::sort ()
{
t=h;
int counter=0;
while(t->n!=NULL)
{
t=t->n;
counter=counter+1;
}

for(int j=0; j<counter; j++)
{
t=h;
while(t->n!=NULL)
{
if(t->d > t->n->d)
{
T temp;
temp=t->n->d;
t->n->d=t->d;
t->d=temp;
}else
t=t->n;
} // End while
} // End for

}



template <typename T>
mdll<T>::mdll(mdll<T> const & x):h(0),t(0)
{
mnode<T> * tmp = x.h ;
while ( tmp )
{
pushback(tmp->d);
tmp = tmp->n ;
}
}


#endif// MDLL_H

ببین ما برای sort کردن خود کلاس گره را مقایسه نمی کنیم و عملگر < و > از قبل تعریف شده در بیشتر نوع های داده ایی البته فکر کنم بشه از عمل cast هم استفاده کرد من تا اینجاش رو نوشته دوباره میام یکمی روش کار می کنم.

mahak006
چهارشنبه 19 مهر 1391, 00:05 صبح
در مورد sort من توضیحتونو متوجه می شم ولی با تمپلیتا نمی تونم بنویسمش .آخه وقتی از تمپلیت استفاده می کنیم هر نوع داده ای داریم چی جوری می شه انواع مختلف داده رو مقایسه کرد؟در ضمن کجاش باید >رو سربارگذاری کنم؟

ببین عمل سورت کردن رو روی نود ها انجام میدی . و نیازی به سربارگذاری > و < نداره . چون اینا رو تو تابع سورت کننده می تونی به کار ببری و نود ها رو با هم مقایسه کنی .
در مورد تمپلیت هم بگم که اگر نود ها از نوع int یا float یا double یا هر نوع عددی تعریف بشن ، مقایسه انجام می شه . و اگر از نوع char باشن ، تو هر نود یک کارکتر قرار می گیره که وقتی > یا < می ذاری ، کامپایلر کد اسکی هر کدوم از کارکتر ها رو مقایسه می کنه و جواب رو برمیگردونه . که البته کد اسکی ، بر اساس پیشرفت حروف هست . یعنی مثلا کد اسکی A بزرگ تر از B هست ( اگه درست نوشته باشم . )

این روش پایین رو خودم تا حالا امتحان نکردم . ولی اگه میخوای بره هر نوع داده که جای تمپلیت هست ، یک نوع تابع مختلف با بقیه داشته باشی ، این روش رو امتحان کن . شاید جواب بده :


template <class type>
int mdll<int>::sort(....)
{.......}
template<class type>
float mdll<float>::sort(.....)
{.......}
template<class type>
char mdll<char>::sort(.....)
{.......}
.
.
.
.
.
.
.
.
.
.
.


البته اگه تو هر کدوم از توضیحات بالا اشتباهی هست ، خوشحال می شم بقیه دوستان تصحیح کنند .

amin1softco
چهارشنبه 19 مهر 1391, 20:34 عصر
خوب درسته به نظرم قانونیش همینه که شما میگی ولی به نظر همون عمل CAST رو که انجام بده بازم راحت تر باشه و نتیجه میده و این کد پست قبلی که گذاشتم SORT درست کار می کنه.

hafez1
چهارشنبه 19 مهر 1391, 22:19 عصر
اینم کد خودم واسه sort


template<typename T> void mdll::sort()
{
T val1,val2;
mnod*temp1=h;
mnode*temp2;
while(temp1)
{
temp2=h;
while(temp2->n)
{
val1=temp2->d;
val2=temp2->n->d;
if(val1>val2)
swap(temp2->d,temp2->n->d);
temp2=temp2->n;
}
temp1=temp1->n;
}
}

اینم تابع swap


swap(T &a1,T &a2)
{
T c=a1;
a1=a2;
a2=c;
}

amin1softco
پنج شنبه 20 مهر 1391, 07:01 صبح
فرق این دوتا چیه :
template<typename T> void mdll::sort()
{
mnod*temp1=h;
mnode*temp2;
while(temp1)
{
temp2=h;
while(temp2->n)
{
if(temp2->d > temp2->n->d){
T c=temp2->d;
temp2->d=temp2->n->d;
temp2->n->d=c;
}
temp2=temp2->n;
}
temp1=temp1->n;
}
}

بازم شما هنوز مشکل <> را حل نکردید..!

hafez1
شنبه 22 مهر 1391, 23:58 عصر
راسش نتونسم با سربارگذاری < بنویسم.
ولی فک کنم همینم جواب بده.