سلام دوستان خوبم.
یکی از تمرین های ساختمان داده ، برنامه ای هست که دو عبارت دوجمله ای رو دریافت کنه و به کمک لیست پیوندی حاصلجمعشونو حساب کنه.
برنامه ای که اینجا گذاشتم همین کاررو انجام میده.منتها من یک کم گسترشش دادم.امکانات برنامه اظافه کردن چند دوجمله ای ، پاک کردن ، نمایش ، ساده کردن ، و جمع دو عبارت هستن.یک کلاس برای ساختن گره node هست که نما و ضریب رو در خودش نگه میداره ، یک کلاس برای پیوند دادن این گره ها وساختن دو جمله ای و کلاس دیگر هم برای لیست کردن این دو جمله ای ها و امکانات دیگه هست.
برای ساده کردن دو جمله ای در یک حلقه for هر بار یکی از داده های node را با تمام node های دیگر مقایسه میکنیم و در صورت برابر بودن اندیس دوم آنها مجموع در یکی از node ها قرارمیگیرد و node دیگری پاک میشود.این تابع ساده کردن هست:(لطفا کپیش کنید تو نوت پد)
void list::sade()
{
node *p=first;
node *q,*r;
while(p->link!=NULL)
{
q=first;
while(q->link!=NULL)
{
r=q;
q=q->link;
if(p->nama==q->nama && q!=p)
{
p->zarib+=q->zarib;
r->link=q->link;
q->link=NULL;
q=r;
}
}
p=p->link;
}
}
برای جمع کردن هم همین کار انجام میشه البته این بار حاصل جمع ها در یک لیست دیگر از node ها قرار میگیرند.
while(a->link!=NULL)
{
plusslist.insert(a->zarib , a->nama);
a=a->link;
}
plusslist.insert(a->zarib , a->nama);
while(b->link!=NULL)
{
plusslist.insert(b->zarib , b->nama);
b=b->link;
}
plusslist.insert(b->zarib , b->nama);
plusslist.sade();
در روش دیگه با استفاده از آرایه ها میتونید عبارت رو بصورت رشته دریافت کنید و در یک آرایه نما ها و ضرایب رو قرار بدید.فقط یه تابع اسکن برای تشخیص اعداد و علامت ها میخواد که کار سختی نیست.نمونش تو برنامه ماشین حساب تو همین وبلاگه.امیدوارم بتونه بهتون کمک کنه.
سلام
خیلی ممنون
ممنون!
merC :*
:p