الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كثيرات الحدود واللينكد ليست

مغلق
بدأه برق ورعد في 17 أبريل 2006 · 4 رد · 1,598 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

[ السلام عليكم

اخواني عندي برنامج ابغى اكتبه بلغة c++ باستخدام تركيبة القائمة المرتبطة (linked list)وظيفة هالبرنامج انه ندخل له كثيرة حدود فيطبع لنا كثيرة الحدود مع حذف الحد الذي يساوي صفر يعني مثلا ندخل له

5x^2+6x^3+3x^2+0x^4+7x^1+8x^0

فيطبع لنا على الشاشة

8x^2+6x^3+7x+8

انا فكرت بكتابة الكود لكن عجزت اكمل ..واتمنى انكم تساعدوني وهذي افكاري بحل البرنامج اذا فيه خطأ ياليت توضحونه وياليت تساعدوني باكمال كتابة الكود مع الشرح لو تكرمتوا..

طبعا بالبداية نسوي التركيبة وتحتوي على متغيرين القوة والمعامل وكذلك مؤشر يؤشرالى عقدة مجاورة ثم وبعد الاعلان عن التركيبة نعلن عن مؤشر من نوع التركيبة بحيث يكون هذا المؤشر GLOBAL لاننا سوف نستخدمه في جميع الدوال

1-اول شي نطلب عدد حدود كثيرة الحدود وهذي سهلة (عدد الحدود متغير GLOBALلاننا قد نستخدمه في جميع الدوال)

2-ننشئ قائمة مرتبطة فارغة اي ان المؤشر يشير الى فراغNULL

3 _بعد ذلك نطبع على الشاشه انه تم انشاء القائمة

4_قراءة عنصري كل عقدة في القائمه(القوة والمعامل) ابتداء بالعقدة الاولى عن طريق دوران نهايته عدد حدود كثيرة الحدود ثم نرسل العناصر الى دالة بحيث يكون عمل هذه الدلة تضيف عقدة من الامامالى القائمة المتصلة بما ان كثيرة الحدود هذه عبارة عن جمع فالاضافة من الامام او الخلف او الوسط لا يؤثرINSERT_IN_FRONT

5_بعد ذلك نستدعي دالة تبحث عن اي معامل =0 في كل عقدة اي ان هذه الدلة سوف تتلقى المعامل فاذا وجدت معاملا داخل العقدة =0 فانها سوف تستدعي دالة اخرى تقوم بحذف هذه العقدة التي معاملها =0 لان ذلك يعني ان العقدة كلها =0الدالة التي تبحث عن المعامل صفر ستحتوي على دوران من 0 الى اقل من عدد الحدود وفي كل دورة تختبر المعامل اذا هو يساوي صفر فانها ستستدعي دالة الحذف واذا المعامل لا يساوي صفر فانها ستكمل الدوران بحثا عن معاملا في العقد =0

6- دالة الحذف السابقة تستوجب ان عدد الحلقات سينقص في كل مرة تستدعىn--;

7-دالة تبحث عن قوى متساوية لتجمع معامليهايعني 7س^2+3س^2=10س^2 يعني هالدالة سوف تستقبل قوة وتعمل دوران من 0الى اقل من عدد العقد وفي كل مرة سوف تسأل ما اذا كان قوة العقدة =القوة التي ارسلت اليها ام لا

اذا كان قوة العقدة التي تحت الاختبار =العنصر المرسل اليها فانها تستدعي دالة تضيف عقدة جديدة بحيث ان معامل هذه العقدة =حاصل جمع المعاملين وقوة هذه العقدة =القوة المرسلة اليها ثم نعود لدلة البحث فان كانت دالة البحث قد استدعت دالة الاضافة فانها تستدعي دالة لحذف اي عقدة اسها =الاس المرسل لدالة البحث

8_في كل مرة نستدعي دالة الحذف عدد العقد يقلn--; وفي كل مرة نستدعي دالة الاضافة عدد العقد يزيدn++; وهكذا

9_دالة الطباعة وهي اخر دالة تستدعى في المين وهذه الدالة تطبع كثيرة الحدود بعد حذف اي حد =0 وكذلك بعد جمع معاملات ذات القوة المتشابهة هذه الدالة ستحتووي على دوران من i=0 الى n واذا كان الاس =1 ماراح تطبع الاس واذا كان الاس=0 ماراح تطبع xولا الاس اتمنى انكم فهمتون زين واذا فيه اي نقطة مو واضحةياليت تسألون

هذي بداياتي

#include<iostream.h>
void insert(int ,int );
void creat();

struct node
{
	int x,y;
	node*next;
};

 node *mynode;

void creat()
{mynode=NULL;};

void insert(int a,int b)
{
	node*p= new node;
	p->x=a;
	p->y=b;
	p->next =mynode;
	mynode=p;

}




void main ()
{ 
	int i ,n,a,b;
	cout <<"please enter how many node you will manipulation"<<endl;
	cin>>n;
	creat();
cout<<"NODE IS CREATED"<<endl;
for (i=0;i<n;i++)
{
	cout<<"a=";
	cin>>a;
	cout <<"b=";
	cin>>b;
	insert(a,b);
}
}
#2
اقتباس
3 _بعد ذلك نطبع على الشاشه انه تم انشاء القائمة

بعد ما يدخل القيم أطبعلة الرسالة دى

اقتباس
_بعد ذلك نستدعي دالة تبحث عن اي معامل =0 في كل عقدة اي ان هذه الدلة سوف تتلقى المعامل فاذا وجدت معاملا داخل العقدة =0 فانها سوف تستدعي دالة اخرى تقوم بحذف هذه العقدة التي معاملها =0 لان ذلك يعني ان العقدة كلها =0الدالة التي تبحث عن المعامل صفر ستحتوي على دوران من 0 الى اقل من عدد الحدود وفي كل دورة تختبر المعامل اذا هو يساوي صفر فانها ستستدعي دالة الحذف واذا المعامل لا يساوي صفر فانها ستكمل الدوران بحثا عن معاملا في العقد =0

ممكن....أو أبحث داخل الlinkedlist عن الnode اللى العقدة =0 ومنها أجيب عدد الnodes واستدعى دالة الحذف بذلك العدد.

اقتباس
6- دالة الحذف السابقة تستوجب ان عدد الحلقات سينقص في كل مرة تستدعىn--;

عن أخذ القيمة أو عمل passing للقيمة للدالة ولتكن

void Extract(int item)

وبعد كدة أمشى بtwo pointers على الlinkedlist بلوب كما موضح

prt =FirstNode   //can get it by using head pointer to first nodes.;
prevptr = 0;

while(ptr != 0 && ptr->x != item)
{
 prevptr = ptr;
ptr = ptr->next;
}

أذا كان الptr ==0 معنى كدة ان الlinkedlist لا يوجد بها أى عناصر أو بها عناصر ولكن الx for all nodes != 0

وهكذا مع إضافة بعض الاكواد حتى تعمل الدالة بشكل صحيح

اقتباس
7-دالة تبحث عن قوى متساوية لتجمع معامليهايعني 7س^2+3س^2=10س^2 يعني هالدالة سوف تستقبل قوة وتعمل دوران من 0الى اقل من عدد العقد وفي كل مرة سوف تسأل ما اذا كان قوة العقدة =القوة التي ارسلت اليها ام لا

اذا كان قوة العقدة التي تحت الاختبار =العنصر المرسل اليها فانها تستدعي دالة تضيف عقدة جديدة بحيث ان معامل هذه العقدة =حاصل جمع المعاملين وقوة هذه العقدة =القوة المرسلة اليها ثم نعود لدلة البحث فان كانت دالة البحث قد استدعت دالة الاضافة فانها تستدعي دالة لحذف اي عقدة اسها =الاس المرسل لدالة البحث

تمام وفى حالة الاضافة يتم حذف تلك الnode كما انت قلت :)

جميل تفكير حلو ياريت نشوف كتابة الكود منك :) وبالتوفيق بأذن الله

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#3

هذا الكود كتبته وأتمنى تستفيد منه واذا احتجت لشرح لأي شي انا حاضر

ملاحظة الكود يحتوي على دوال اضافيه اتمنى تفيدك

#include <iostream>
using namespace std;

class term
{
public:
	double coefficient;
	int exponent;
	term *next;
	term(double,int,term * = 0);
};
term::term(double c,int e,term *n)
{
	coefficient = c;
	exponent = e;
	next = n;
}

class polynomial
{
	term *head;
	void insertLast(double,int);
public:
	polynomial(){head = 0;};
	polynomial(polynomial &);
	bool insert(double,int);
	bool empty(){return head==0;};
	void clear();
	void print();
	double value(double);
	polynomial operator+(polynomial &);
	polynomial operator-(polynomial &);
	polynomial operator*(polynomial &);
	polynomial& operator=(polynomial &);


};

polynomial& polynomial::operator=(polynomial &s)
{
  clear();

	term* p= s.head;
	while(p != 0)
	{
  insertLast(p->coefficient,p->exponent);
  p = p->next;
	}
	return *this;
}



void polynomial::clear()
{
	term *p;
	while(head != 0)
	{
  p = head;
  head = head->next;
  delete p;
	}
}

polynomial::polynomial(polynomial &s)
{
	head = 0;

	term* p= s.head;
	while(p != 0)
	{
  insertLast(p->coefficient,p->exponent);
  p = p->next;
	}
} 
void polynomial::insertLast(double c,int e)
{

	if(head == 0)
  head = new term(c,e,head);
	else
	{
  term* p = head;
  while(p->next != 0)
 	 p = p->next;
  p->next = new term(c,e);
	}
}


bool polynomial::insert(double c,int e)
{
	if(head == 0)
	{
  head = new term(c,e,head);
  return true;
	}
	if(head->exponent<e)
	{
  head = new term(c,e,head);
  return true;
	}

	term *p = head->next;
	term *q = head;

	while(p != 0  && p->exponent != e)
	{
  q = p;
  p = p->next;
	}
	if(p != 0 )
	{
  p->coefficient += c;
  return true;
	}
	else
	{
	p = head->next;
	q = head;

	while(p != 0  && p->exponent > e)
	{
  q = p;
  p = p->next;
	}
	q->next = new term(c,e,p);
	return true;
	}
}


void polynomial::print()
{
	term *p = head;
	while(p != 0)
	{
  cout <<p->coefficient;
  if(p->exponent != 0)
 	 cout <<"X^" << p->exponent << " ";
  if(p->next != 0)
 	 if(p->next->coefficient >= 0)
 	 cout << "+";
  p = p->next;
	}
	cout << endl;
}


double polynomial::value(double x)
{
	double l;
	double sum = 0;
	term *p = head;

	while(p != 0)
	{
  l = 1;
  for(int j=0;j<p->exponent;j++)
 	 l *= x;
  sum += (p->coefficient * l);
  p = p->next;
	}
	return sum;
}


polynomial polynomial::operator +(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0 && q->exponent != p->exponent)
 	 q = q->next;
  if(q != 0)
 	 l2.insert(p->coefficient+q->coefficient,p->exponent);
  else
 	 l2.insert(p->coefficient,p->exponent);

  q = l.head;
  p = p->next;
	}
	return l2;
}


polynomial polynomial::operator -(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0 && q->exponent != p->exponent)
 	 q = q->next;
  if(q != 0)
 	 l2.insert(p->coefficient-q->coefficient,p->exponent);
  else
 	 l2.insert(p->coefficient,p->exponent);

  q = l.head;
  p = p->next;
	}
	return l2;
}

polynomial polynomial::operator *(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0)
  {
  l2.insert(p->coefficient*q->coefficient,p->exponent+q->exponent);
  q = q->next;
  }
  q = l.head;
  p = p->next;
	}
	return l2;
}




int main()
{
	int choice;
	int e,v;
	double c;
	polynomial p;
	do
	{
  cout << "Choose:" << endl;
  cout << "1- Prog #1" << endl;
  cout << "2- Prog #2" << endl;
  cout << "3- Exit" << endl;
  cout << "enter your choice:";
  cin >> choice;
	if(choice == 1)
	do
	{
  cout << "choose:" << endl;
  cout << "1- Insert a new term" << endl;
  cout << "2- Display a polynomial" << endl;
  cout << "3- Clear the polynomial" << endl;
  cout << "4- Display the polynomial value" << endl;
  cout << "5- Exit menue\n" << endl;
  cout << "Enter your choice:";
  cin >> choice;
  if(choice == 1)
  {
 	 cout << "enter exponent:";
 	 cin >> e;
 	 cout << "enter coefficient:";
 	 cin >> c;
 	 p.insert(c,e);
  }
  else
 	 if(choice == 2)
    p.print();
 	 else
 	 
    if(choice == 3)
   	 p.clear();
    else
    
   	 if(choice == 4)
   	 {
      cout << "enter the value:";
      cin >> v;
      cout << "the value is: " << p.value(v) << endl;
   	 }
	}while(choice != 5);
	else
  if(choice == 2)
  {
 	 polynomial p1,p2,p3;
 	 p2.insert(2,4);
 	 p2.insert(1,3);
 	 p2.insert(-2.5,0);
 	 p1.insert(3.4,4);
 	 p1.insert(3,3);
 	 p1.insert(6,5);
 	 p1.insert(2.5,0);
 	 cout << " The p1 is : ";
 	 p1.print();
 	 cout << " The p2 is : ";
 	 p2.print();
 	 cout << endl;
 	 cout << "The sum is : ";
 	 p3 = p1+p2;
 	 p3.print();
 	 p3.clear();
 	 cout << endl;
 	 cout << "The subtract is : ";
 	 p3 = p1-p2;
 	 p3.print();
 	 p3.clear();
 	 cout << endl;
 	 cout << "The multiply is : ";
 	 p3 = p1*p2;
 	 p3.print();
 	 cout << endl;
  }
	}while(choice != 3);


 	 

	return 0;
}

abofahad5515@hotmail.com

#4

هذا الكود كامل بعد اضافة الدالة التي تمسح الأصفار والديستركتر

#include <iostream>
using namespace std;

class term
{
public:
	double coefficient;
	int exponent;
	term *next;
	term(double,int,term * = 0);
};
term::term(double c,int e,term *n)
{
	coefficient = c;
	exponent = e;
	next = n;
}

class polynomial
{
	term *head;
	void insertLast(double,int);
public:
	polynomial(){head = 0;};
	polynomial(polynomial &);
	~polynomial();
	bool insert(double,int);
	bool empty(){return head==0;};
	void clear();
	void print();
	double value(double);
	polynomial operator+(polynomial &);
	polynomial operator-(polynomial &);
	polynomial operator*(polynomial &);
	polynomial& operator=(polynomial &);
	void removeZeroTerms();

};

void polynomial::removeZeroTerms()
{

	while(head != 0 && head->coefficient == 0)
	{
  term *r = head;
  head = head->next;
  delete r;
	}
	term *p = head;
	term *q = 0;
	term *s = 0;

	while(p != 0)
	{
  if(p->coefficient == 0)
  {
 	 q->next = p->next;
 	 s = p;
 	 p = p->next;
 	 delete s;
  }
  else
  {
 	 q = p;
 	 p = p->next;
  }
	}
}


polynomial::~polynomial()
{
	while(!empty())
	{
	term *p = head;
	head = head->next;
	delete p;
	}
}

polynomial& polynomial::operator=(polynomial &s)
{
  clear();

	term* p= s.head;
	while(p != 0)
	{
  insertLast(p->coefficient,p->exponent);
  p = p->next;
	}
	return *this;
}



void polynomial::clear()
{
	term *p;
	while(head != 0)
	{
  p = head;
  head = head->next;
  delete p;
	}
}

polynomial::polynomial(polynomial &s)
{
	head = 0;

	term* p= s.head;
	while(p != 0)
	{
  insertLast(p->coefficient,p->exponent);
  p = p->next;
	}
} 
void polynomial::insertLast(double c,int e)
{

	if(head == 0)
  head = new term(c,e,head);
	else
	{
  term* p = head;
  while(p->next != 0)
 	 p = p->next;
  p->next = new term(c,e);
	}
}


bool polynomial::insert(double c,int e)
{
	if(head == 0)
	{
  head = new term(c,e,head);
  return true;
	}
	if(head->exponent<e)
	{
  head = new term(c,e,head);
  return true;
	}

	term *p = head->next;
	term *q = head;

	while(p != 0  && p->exponent != e)
	{
  q = p;
  p = p->next;
	}
	if(p != 0 )
	{
  p->coefficient += c;
  return true;
	}
	else
	{
	p = head->next;
	q = head;

	while(p != 0  && p->exponent > e)
	{
  q = p;
  p = p->next;
	}
	q->next = new term(c,e,p);
	return true;
	}
}


void polynomial::print()
{
	term *p = head;
	while(p != 0)
	{
  cout <<p->coefficient;
  if(p->exponent != 0)
 	 cout <<"X^" << p->exponent << " ";
  if(p->next != 0)
 	 if(p->next->coefficient >= 0)
 	 cout << "+";
  p = p->next;
	}
	cout << endl;
}


double polynomial::value(double x)
{
	double l;
	double sum = 0;
	term *p = head;

	while(p != 0)
	{
  l = 1;
  for(int j=0;j<p->exponent;j++)
 	 l *= x;
  sum += (p->coefficient * l);
  p = p->next;
	}
	return sum;
}


polynomial polynomial::operator +(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0 && q->exponent != p->exponent)
 	 q = q->next;
  if(q != 0)
 	 l2.insert(p->coefficient+q->coefficient,p->exponent);
  else
 	 l2.insert(p->coefficient,p->exponent);

  q = l.head;
  p = p->next;
	}
	return l2;
}


polynomial polynomial::operator -(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0 && q->exponent != p->exponent)
 	 q = q->next;
  if(q != 0)
 	 l2.insert(p->coefficient-q->coefficient,p->exponent);
  else
 	 l2.insert(p->coefficient,p->exponent);

  q = l.head;
  p = p->next;
	}
	return l2;
}

polynomial polynomial::operator *(polynomial &l)
{
	term *p = head;
	term *q = l.head;
	polynomial l2;
	while(p != 0)
	{
  while(q != 0)
  {
  l2.insert(p->coefficient*q->coefficient,p->exponent+q->exponent);
  q = q->next;
  }
  q = l.head;
  p = p->next;
	}
	return l2;
}




int main()
{
	int choice;
	int e,v;
	double c;
	polynomial p;
	do
	{
  cout << "Choose:" << endl;
  cout << "1- Prog #1" << endl;
  cout << "2- Prog #2" << endl;
  cout << "3- Exit" << endl;
  cout << "enter your choice:";
  cin >> choice;
	if(choice == 1)
	do
	{
  cout << "choose:" << endl;
  cout << "1- Insert a new term" << endl;
  cout << "2- Display a polynomial" << endl;
  cout << "3- Clear the polynomial" << endl;
  cout << "4- Display the polynomial value" << endl;
  cout << "5- Remove zero terms" << endl;
  cout << "6- Exit menu\n" << endl;
  cout << "Enter your choice:";
  cin >> choice;
  if(choice == 1)
  {
 	 cout << "enter exponent:";
 	 cin >> e;
 	 cout << "enter coefficient:";
 	 cin >> c;
 	 p.insert(c,e);
  }
  else
 	 if(choice == 2)
    p.print();
 	 else
 	 
    if(choice == 3)
   	 p.clear();
    else
    
   	 if(choice == 4)
   	 {
      cout << "enter the value:";
      cin >> v;
      cout << "the value is: " << p.value(v) << endl;
   	 }
   	 else
      if(choice == 5)
     	 p.removeZeroTerms();
	}while(choice != 6);
	else
  if(choice == 2)
  {
 	 polynomial p1,p2,p3;
 	 p2.insert(2,4);
 	 p2.insert(1,3);
 	 p2.insert(-2.5,0);
 	 p1.insert(3.4,4);
 	 p1.insert(3,3);
 	 p1.insert(6,5);
 	 p1.insert(2.5,0);
 	 cout << " The p1 is : ";
 	 p1.print();
 	 cout << " The p2 is : ";
 	 p2.print();
 	 cout << endl;
 	 cout << "The sum is : ";
 	 p3 = p1+p2;
 	 p3.print();
 	 p3.clear();
 	 cout << endl;
 	 cout << "The subtract is : ";
 	 p3 = p1-p2;
 	 p3.print();
 	 p3.clear();
 	 cout << endl;
 	 cout << "The multiply is : ";
 	 p3 = p1*p2;
 	 p3.print();
 	 cout << endl;
  }
	}while(choice != 3);


 	 

	return 0;
}

abofahad5515@hotmail.com

#5

مشكورين اخواني وجزاكم الله الف خير

لكن ياليت تدرون علي من خلال هذا الرابط ولكم دعوة صادقة

/index.php?showtopic=93574

هذا الموضوع مغلق.

مواضيع مشابهة