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

ما هو الخطأ في كود ال Linkedlist هذا ؟!

بدأه بيبيتو في 21 أكتوبر 2008 · 19 رد · 1,673 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

الاخوة الكرام

من خلال تجولي في هذا المنتدى الرائع والكريم

وجدت عددا كبيرا من الاخوة المبرمجين المتمكنين في البرمجة بلغة c++

وهذا ما شجعني كي أطرح المشكلة التي واجهتني في كود linked list

حيث ان هذه الـ linkedlist هي نصية

لا أعلم ما هي المشكلة فيها

لذا أرجو منكم مساعدتي جزاكم الله كل الخير



#include <assert.h>
#include <string.h>
#include <iostream.h>



struct Node

{

char *data;

Node *next;



Node() { data = NULL; next = NULL; }

~Node()

{

if (data != NULL) delete[] data;

}

void updateData( char * newdata)

{

if (newdata != NULL)

{

if (data != NULL) delete[] data;

data = new char[strlen( newdata) + 1];

strcpy(data, newdata);

}

}

};



class SinglyLinkedList

{

private:

Node *first_ptr;

public:

SinglyLinkedList();

~SinglyLinkedList();

void buildList( char* stringarray[], int arraylength);

void pr intList();

void deleteNode( char *searchdata);

void addNodeBefore( char *searchdata, char * newdata);

void addNodeAfter( char *searchdata, char * newdata);

int length();

bool isEmpty();

bool inList( char *searchdata);

long getIndex( char *searchdata);

void reverse();

void addNodeFirst( char* newdata);

void addNodeLast( char* newdata);



}



SinglyLinkedList::SinglyLinkedList()

{

first_ptr = NULL;

}



SinglyLinkedList::~SinglyLinkedList()

{

Node *current_ptr, *next_ptr;

current_ptr = first_ptr;



// remove elements from the list one by one, traversing starting from first

while (current_ptr != NULL)

{

next_ptr = current_ptr->next;

delete current_ptr;

current_ptr = next_ptr;

}

first_ptr = NULL; // reset first to NULL

}



bool SinglyLinkedList::isEmpty()

{

return first_ptr == NULL;

}



void SinglyLinkedList::buildList(char* stringarray[], int arraylength)

{

int i;

Node *new_ptr, *prev_ptr;


for (i=0; i<arraylength; i++)

{

new_ptr = new Node();

new_ptr->updateData( stringarray );

new_ptr->next = NULL;

if (first_ptr == NULL)

{

first_ptr = new_ptr;

prev_ptr = new_ptr;

}

else

{

prev_ptr->next = new_ptr;

prev_ptr = new_ptr;

}

}

}



void SinglyLinkedList::addNodeBefore(char *searchdata, char *newdata)

{

Node *new_ptr, *prev_ptr, *current;

current = first_ptr;

bool found = false;



while (current !=NULL && found ==false)

{

if (strcmp(current->data , searchdata)==0)

{

found = true;

}

else

{ prev_ptr= current;

current= current->next;



}



}

if (found == true)

{

new_ptr = new Node();

new_ptr->updateData( newdata);



if (first_ptr== current)

{

new_ptr->next = first_ptr;

first_ptr= new_ptr;

}

else

{

new_ptr->next = current;

prev_ptr ->next= new_ptr;

}



}



}



void SinglyLinkedList::addNodeAfter( char *searchdata, char * newdata)

{

Node * new_ptr, *current;

current = first_ptr;

bool found = false;

current= first_ptr;

while (current != NULL && found == false)

{

if (strcmp(current->data , searchdata)==0)

{ found = true;

}

else

{

current = current->next;

}

}



if (found == true)

{

new_ptr = new Node();

new_ptr->updateData( newdata);

new_ptr->next= current->next;

current->next = new_ptr;





}


}

void SinglyLinkedList::addNodeFirst( char * newdata)

{

Node * new_ptr;



new_ptr = new Node();

new_ptr->updateData( newdata);

new_ptr->next= first;

first = new_ptr;

}

void SinglyLinkedList::addNodeLast( char * newdata)

{

Node * new_ptr, current;

current= first;



while(current->next!=NULL)

current = current->next;



new_ptr = new Node();

new_ptr->updateData( newdata);

current->next= new_ptr;


}


void SinglyLinkedList:: deleteNode( char *searchdata)

{

Node *prev_ptr, *current;

current = first_ptr;

bool found = false;



while (current !=NULL && found == false)

{

if (strcmp(current->data ,searchdata)==0)

{

found = true;

}

else

{ prev_ptr= current;

current= current->next; }



}





if (found == true)

{





if (first_ptr == current)

{

first_ptr= current->next;

}

else

{

prev_ptr ->next= current->next;

}



delete current;

}



}



long SinglyLinkedList::getIndex( char *searchdata)

{

int index = 0;

Node *current_ptr;



current_ptr = first_ptr;

if (current_ptr == NULL)

return -1;

else

{

while (current_ptr != NULL)

{

if (strcmp(searchdata, current_ptr->data) == 0)

return index;

else

current_ptr = current_ptr->next;

index++;

}

}

return -1;

}



bool SinglyLinkedList::inList( char *searchdata)

{

Node *current_ptr;



current_ptr = first_ptr;

if (current_ptr == NULL)

return false;

else

{

while (current_ptr != NULL)

{

if (strcmp(searchdata, current_ptr->data) == 0)

return true;

else

current_ptr = current_ptr->next;

}

}

return false;

}



void SinglyLinkedList::pr intList()

{

Node *current_ptr;



current_ptr = first_ptr;

cout << "List Contents: " << endl;

if (current_ptr == NULL)

cout << " <EMPTY>" << endl;

else

{

while (current_ptr != NULL)

{

cout << " " << current_ptr->data << endl;

current_ptr = current_ptr->next;

}

}

}



int SinglyLinkedList::length()

{

Node *current_ptr;

int cnt;



current_ptr = first_ptr;

cnt = 0;

while (current_ptr != NULL)

{

cnt++;

current_ptr = current_ptr->next;

}

return cnt;

}



void SinglyLinkedList::reverse(){





if (first_ptr!=NULL) {

Node * current = first_ptr->next;

Node * newFirst=first_ptr;

newFirst->next= NULL;

Node * temp=first_ptr;



while (current!=NULL) {

temp = current->next;

current->next = newFirst;

newFirst = current;

current=temp;

}

first_ptr=newFirst;

}

}



void main()

{

SinglyLinkedList objSLL1;

char* strings[] = { "aa", "bb", "cc", "dd", "ff" };

int choice;

char* x;



do{

cout << endl

<< "|-------------------MAIN MENU-------------------|" << endl

<< "|Enter1 : To build linked list |" << endl

<< "|Enter2 : To print linked list |" << endl

<< "|Enter3 : To Display the length of linked list |" << endl

<< "|Enter4 : To Add to the first |" << endl

<< "|Enter5 : To Add to the last |" << endl

<< "|Enter6 : To Search in linked list |" << endl

<< "|Enter7 : To delete from linked list |" << endl

<< "|Enter8 : To Reverse linked list |" << endl

<< "|Enter9 : To Exit |" << endl

<< "|------------------MAIN MENU--------------------|" << endl;





cout<<"Enter Your Choice>>> ";

cin >> choice;



switch(choice)

{

case 1 :

cout << endl << "\t\t --<<<built linked list >>>--" << endl;

objSLL1.buildList( strings, 5 );

break;



case 2 :

cout << endl << "\t\t --<<<Print linked list >>>--" << endl;

objSLL1.printList();

break;



case 3 :

cout << endl << "\t\t --<<<length of linked list >>>--"

<< endl << "Length: " << objSLL1.length() << endl;

break;



case 4 :

cout << endl << "\t\t --<<<Add to the first of linked list >>>--" << endl

<< "Enter the item to add: ";

cin.getline(x,10);

objSLL1.addNodeFirst(x);

break;



case 5 :

cout << endl << "\t\t --<<<Add to the last of linked list >>>--" << endl

<< "Enter the item to add: ";

cin.getline(x,10);

objSLL1.addNodeLast(x);

break;



case 6 :

cout << endl << "\t\t --<<<Search in linked list >>>--" << endl

<< "Enter the item to search: ";

cin.getline(x,10);

objSLL1.addNodeLast(x);

break;



case 7 :

cout << endl << "\t\t --<<<Delete from linked list >>>--" << endl

<< "Enter the item to delete: ";

cin.getline(x,10);

objSLL1.deleteNode(x);

break;



case 8 :

cout << endl << "\t\t --<<<Reverse linked list >>>--" << endl;

objSLL1.reverse();

break;






case 9 :

cout << endl << "\t<<<<END OF PROGRAM>>>>" << endl;

break;



defualt:

cout << endl << "\t INVALID INPUT, TRY AGAIN (1-9) !" << endl;

}



}while(choice != 9 );



}

بارك الله فيكم جميعا

وجزاكم الله كل الخير

#2

ماشاء الله كل هذا كود :happy:

اولا الاخطاء الموجودة لديك اغلبها اخطاء في الصياغة , مثلا نسيت ان تضع فاصلة منقوطة بعد تعريف الكلاس , ايضا المتغير first لم يتم تعريفه في بعض الدوال مثل الدالة addNodeFirst

انظر اخي إلى هذه الدروس قد تفيدك وفيها شرح لاغلب العمليات التي تحتاجها .

الدرس الاول

الدرس الثاني

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

فعلا كود طويل ، واللى مطوله هي المسافات والأسطر الزياده ،،

على العموم هناك أخطاء بسيطه كما قال أخ Time1 ، هناك داله في الأسم يوجد مسافه pr intList ، وهناك خطأ نسيان فاصله ، وهناك خطأ في تعريف :

Node *x,y ;

طبعا الأسم مختلف ، لكن بنفس الشكل ، وحاليا y لا يعتبر مؤشر ..

Node *x,*y ;

هذi بعض التصليحات الخفيفه ، وأصبح يعمل بلا مشاكل ، لكن هناك خطأ وقت التشغيل ، أيضا لم أكمل تنسيقه ، عليك بتنسيق الكود وحذف المسافات الزياده حتى يسهل قرائته .

#include <assert.h>
#include <string>
#include <iostream>
using namespace std;

struct Node
{
	char *data;
	Node *next;

	Node() { data = NULL; next = NULL; }

	~Node()
	{
		if (data != NULL)  delete[] data;
	}

	void updateData( char * newdata)
	{
		if (newdata != NULL)
		{
			if (data != NULL)  delete[] data;
			data =  new  char[strlen( newdata) + 1];
			strcpy(data,  newdata);
		}
	}
};


class SinglyLinkedList
{
private:
	Node *first_ptr;
public:
	 SinglyLinkedList();
	~SinglyLinkedList();
	 void buildList( char* stringarray[],  int arraylength);
	 void printList();
	 void deleteNode( char *searchdata);
	 void addNodeBefore( char *searchdata,  char * newdata);
	 void addNodeAfter( char *searchdata,  char * newdata);
	 int length();
	 bool isEmpty();
	 bool inList( char *searchdata);
	 long getIndex( char *searchdata);
	 void reverse();
	 void addNodeFirst( char* newdata);
	 void addNodeLast( char* newdata);
};

SinglyLinkedList::SinglyLinkedList()
{
   first_ptr = NULL;
}

SinglyLinkedList::~SinglyLinkedList()
{
	Node *current_ptr, *next_ptr;
	current_ptr = first_ptr;

	// remove elements from the list one by one, traversing starting from first
	while (current_ptr != NULL)
	{
	  next_ptr = current_ptr->next;
	  delete current_ptr;
	  current_ptr = next_ptr;
	}

	first_ptr = NULL; // reset first to NULL
}

bool SinglyLinkedList::isEmpty()
{
   return first_ptr == NULL;
}

void SinglyLinkedList::buildList(char* stringarray[], int arraylength)
{
	int i;
	Node *new_ptr, *prev_ptr;

	for (i=0; i<arraylength; i++)
	{
		new_ptr = new Node();
		new_ptr->updateData( stringarray );
		new_ptr->next = NULL;
		if (first_ptr == NULL)
		{
			first_ptr = new_ptr;
			prev_ptr = new_ptr;
		}
		else
		{
			prev_ptr->next = new_ptr;
			prev_ptr = new_ptr;
		}
	}
}


void SinglyLinkedList::addNodeBefore(char *searchdata, char *newdata)
{
	Node *new_ptr, *prev_ptr, *current;
	current = first_ptr;
	bool found = false;

	while (current !=NULL && found ==false)
	{
		if (strcmp(current->data , searchdata)==0)
		{
			found = true;
		}
		else
		{ 
			prev_ptr= current;
			current= current->next;
		}	
	}
	if  (found ==  true)
	{
		new_ptr =  new Node();
		new_ptr->updateData( newdata);

		if (first_ptr== current)
		{
			new_ptr->next = first_ptr;
			first_ptr=  new_ptr;
		}
		else
		{
			new_ptr->next = current;
			prev_ptr ->next=  new_ptr;
		}
	}
}


void SinglyLinkedList::addNodeAfter( char *searchdata,  char * newdata)
{
	Node * new_ptr,  *current;
	current = first_ptr;
	bool found =  false;
	current= first_ptr;

	while (current != NULL && found ==  false)
	{
		if (strcmp(current->data , searchdata)==0)
		{ found =  true;
	   }

			 else

				{

				current = current->next;

				}

	}



if (found ==  true)

	{

			new_ptr =  new Node();

			 new_ptr->updateData( newdata);

			 new_ptr->next= current->next;

			current->next =  new_ptr;





	}


}

void SinglyLinkedList::addNodeFirst( char * newdata)
{
	Node * new_ptr;
	new_ptr =  new Node();
	new_ptr->updateData( newdata);
	new_ptr->next= first_ptr;
	first_ptr =  new_ptr;

}

void SinglyLinkedList::addNodeLast( char * newdata)

{

	Node * new_ptr, *current;

	current= first_ptr;



	while(current->next!=NULL)

		 current = current->next;



			new_ptr =  new Node();

			new_ptr->updateData( newdata);

			current->next= new_ptr;


}


void SinglyLinkedList:: deleteNode( char *searchdata)

{

	Node  *prev_ptr, *current;

	current = first_ptr;

	 bool found =  false;



	 while (current !=NULL && found == false)

	{

	 if (strcmp(current->data ,searchdata)==0)

		{

			found =  true;

		}

	 else

	{  prev_ptr= current;

		current= current->next; }



	}





	 if  (found ==  true)

		{





			 if (first_ptr == current)

				{

					first_ptr= current->next;

				}

			 else

				{

					prev_ptr ->next= current->next;

				}



			 delete current;

		}



}



long SinglyLinkedList::getIndex( char *searchdata)

{

	 int index = 0;

	Node *current_ptr;



	current_ptr = first_ptr;

	 if (current_ptr == NULL)

		 return -1;

	 else

	{

		 while (current_ptr != NULL)

		{

			 if (strcmp(searchdata, current_ptr->data) == 0)

				 return index;

			 else

				current_ptr = current_ptr->next;

			index++;

		}

	}

	 return -1;

}



bool SinglyLinkedList::inList( char *searchdata)

{

	Node *current_ptr;



	current_ptr = first_ptr;

	 if (current_ptr == NULL)

		 return  false;

	 else

	{

		 while (current_ptr != NULL)

		{

			 if (strcmp(searchdata, current_ptr->data) == 0)

				 return  true;

			 else

				current_ptr = current_ptr->next;

		}

	}

	 return  false;

}



void SinglyLinkedList::printList()

{

	Node *current_ptr;



	current_ptr = first_ptr;

	cout << "List Contents: " << endl;

	 if (current_ptr == NULL)

		cout << "	<EMPTY>" << endl;

	 else

	{

		 while (current_ptr != NULL)

		{

			cout << "	" << current_ptr->data << endl;

			current_ptr = current_ptr->next;

		}

	}

}



int SinglyLinkedList::length()

{

	Node *current_ptr;

	 int cnt;



	current_ptr = first_ptr;

	cnt = 0;

	 while (current_ptr != NULL)

	{

		cnt++;

		current_ptr = current_ptr->next;

	}

	 return cnt;

}



void SinglyLinkedList::reverse(){





	if (first_ptr!=NULL) {

		Node * current = first_ptr->next;

		Node * newFirst=first_ptr;

		newFirst->next= NULL;

		Node * temp=first_ptr;



		while (current!=NULL) {

			temp = current->next;

			current->next = newFirst;

			newFirst = current;

			current=temp;

		}

		first_ptr=newFirst;

	}

}



int main()

{

	SinglyLinkedList objSLL1;

	char* strings[] = { "aa", "bb", "cc", "dd", "ff" };

	int choice;

	char* x;



do{

	cout << endl

		 << "|-------------------MAIN MENU-------------------|" << endl

		 << "|Enter1  : To build linked list				 |" << endl

		 << "|Enter2  : To print linked list				 |" << endl

		 << "|Enter3  : To Display the length of linked list |" << endl

		 << "|Enter4  : To Add to the first				  |" << endl

		 << "|Enter5  : To Add to the last				   |" << endl

		 << "|Enter6  : To Search in linked list			 |" << endl

		 << "|Enter7  : To delete from linked list		   |" << endl

		 << "|Enter8  : To Reverse linked list			   |" << endl

		 << "|Enter9  : To Exit							  |" << endl

		 << "|------------------MAIN MENU--------------------|" << endl;





	cout<<"Enter Your Choice>>> ";

	cin >> choice;



switch(choice)

{

case 1 :

  cout << endl << "\t\t --<<<built linked list >>>--" << endl;

	objSLL1.buildList( strings, 5 );

  break;



case 2 :

  cout << endl << "\t\t --<<<Print linked list >>>--" << endl;

	objSLL1.printList();

  break;



case 3 :

  cout << endl << "\t\t --<<<length  of linked list >>>--"

	   << endl << "Length: " << objSLL1.length() << endl;

  break;



case 4 :

  cout << endl << "\t\t --<<<Add to the first of linked list >>>--" << endl

	<< "Enter the item to add: ";

  cin.getline(x,10);

	objSLL1.addNodeFirst(x);

  break;



case 5 :

  cout << endl << "\t\t --<<<Add to the last of linked list >>>--" << endl

	<< "Enter the item to add: ";

  cin.getline(x,10);

	objSLL1.addNodeLast(x);

  break;



case 6 :

  cout << endl << "\t\t --<<<Search in linked list >>>--" << endl

	<< "Enter the item to search: ";

  cin.getline(x,10);

	objSLL1.addNodeLast(x);

  break;



case 7 :

  cout << endl << "\t\t --<<<Delete from linked list >>>--" << endl

	<< "Enter the item to delete: ";

  cin.getline(x,10);

	objSLL1.deleteNode(x);

  break;



case 8 :

  cout << endl << "\t\t --<<<Reverse linked list >>>--" << endl;

	objSLL1.reverse();

  break;






case 9 :

   cout << endl << "\t<<<<END OF PROGRAM>>>>" << endl;

  break;



defualt:

  cout << endl << "\t INVALID INPUT, TRY AGAIN (1-9) !" << endl;

}



  }while(choice != 9 );


	return 0;
}

حتى تحل مشاكل RunTime ، أكتب داله main بسيطه وأختبر كل داله على حده حتى تكتشف الداله التي سببت لك الخطأ ، أو استخدم Dubbeger اذا كنت تستطيع ذلك ..

أيضا اقرأ الدروس السابقه في الوصله اعلاه ، وقارن بين تلك الدوال الدوال هنا لكي تكشف الخطأ ..

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4

السلام عليكم ورحمة الله وبركاته

بارك الله فيك أخي الكريم " time1 "

أعلم بأن الكود طويل جدا ولكن ما باليد من حيلة

فـ موضوع الـ linked list قد أرهقني للغاية

لذلك فـ إنني أحببت أن أعمل كود يحتوي الكثير من الدوال التي من الممكن أن تساعدني وأن تُفهمني الموضوع بشكل جيّد

وبعد الإستعانة بالعديد من الإخوة أمثالكم استطعت أن أفهم جزء كبير من هذا الموضوع

ولكن ما زالت بعض الصعوبات تواجهني

شكرا جزيلا لك

.............................

أخي الكريم " Wajdy Essam"

جزاك الله كل الخير

وبارك الله في عمرك وأعطاك من علمه المزيد والمزيد

الحمد لله قد عدّلت السؤال بشكل جيّد وعمل معي وتم تشغيله

كل الدوال تعمل بشكل جيّد وممتاز ما عدا تلك التي تتطلّب مني ادخال قيمة من الكيبورد

فـ إن هذا الخطأ يظهر ولم أفهم معناه

zLU12396.jpg

ثم تظهر شاشة أخرى بعد أن أضغط على OK

وهي التالية

ney12469.jpg

هل المشكلة في البرنامج الذي كتبته أنا

أم المشكلة في برنامج Borland C 5.02 الذي أستخدمه ؟؟؟

بارك الله فيكم جميعا وجزاكم الله كل الخير

#5

أخوي ،

الدوال التي تتطلب قيمه ، أنت بتدخلها عن طريق الداله ..

cin.getline(x,10);

وx معرفه هو مؤشر لchar :

char* x;

طيب وين المساحه المحجوزه والتي حتضع فيها البيانات !! لذلك رساله الخطأ تظهر ..قم بحجز مساحه أولا ثم أدخل القيمه في تلك المساحه ..

والسلام عليكم ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

Wajdy Essam كتب:
أخوي ،

الدوال التي تتطلب قيمه ، أنت بتدخلها عن طريق الداله ..

cin.getline(x,10);

وx معرفه هو مؤشر لchar :

char* x;

طيب وين المساحه المحجوزه والتي حتضع فيها البيانات !! لذلك رساله الخطأ تظهر ..قم بحجز مساحه أولا ثم أدخل القيمه في تلك المساحه ..

والسلام عليكم ،،

السلام عليكم ورجمة الله وبركاته

أخي الكريم " Wajdy Essam "

أشكرك على حسن تعاونك وعلى نشاطك الكريم والرائع

واسأل الله تعالى أن يعطيك المزيد والمزيد من علمه

بارك الله فيك

..........................

بالنسبة للمساحة التي يجب أن أحجزها ما هو قصدك بها ؟؟

بصراحة لم أفهم قصدك ولم أفهم كيف يجب علي أن أفعل ذلك ؟

موضوع الـ linked list معقد بالنسبة لي ومادة c++ لم أفهمها بشكل جيد

لذا أرجو منك المساعدة بالقليل وأن تُفهمني المقصود

أعذرني على كثرة غلبتي ولكن كل ما اطلبه هو أن أنهل من علمكم الكريم

لكَ كل التقدير والاحترام

#7
اقتباس
بالنسبة للمساحة التي يجب أن أحجزها ما هو قصدك بها ؟؟

التابع cin.getline الوسيط الاول يأخذ مؤشر لمصفوفة الحروف مثل :

char x[256];

, والثاني للعدد الاعلى من الحروف لتخزينها ,

getline (char* s, streamsize n );

اقتباس
موضوع الـ linked list معقد بالنسبة لي ومادة c++ لم أفهمها بشكل جيد

لو رجعت على منهجية الدروس التي وضعتها لك في المشاركة السابقة ستجد التشابه في آلية عمل الدوال , كذلك يوجد فيها شرح للعمليات الاساسية على القائمة , بعد ذلك بامكانك ابتكار ماتحتاجه من دوال ثانوية .

تم تعديل هذه المشاركة بواسطة time1 في 22 أكتوبر 2008 في 23:54

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#8

اخي وجدي يقصد هذا الاعلان

  1.  
  2. char* x; //مؤشر
  3. x=new char(10); // حجز مساحه لعشرة أحرف مثلا
  4.  

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 22 أكتوبر 2008 في 23:52

tvquran_6.gif

#9

اخي فهد لابد ان تستبدل الاقواس () بـ [ ]

تم تعديل هذه المشاركة بواسطة مجلـد جديـد في 23 أكتوبر 2008 في 01:12

#10
اقتباس
اخي فهد لابد ان تستبدل الاقواس () بـ [ ]

كليهما صحيح جرب ذلك.

tvquran_6.gif

#11

ليست نفسها , العملية ( ) في new تختلف عن العملية [ ]

تم تعديل هذه المشاركة بواسطة time1 في 23 أكتوبر 2008 في 14:52

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#12
اقتباس
ليست نفسها , العملية ( ) في new تختلف عن العملية [ ]

حيث في [] سننشىء مصفوفه في الذاكره heap -غير مهيئه بقيم- ، وسوف يرجع عنوان العنصر الأول ..

أما في () سوف ننشيء عنصر واحد في heap وقيمته هي القيمه المرسله ، وسوف يرجع لي عنوان ذالك العنصر ..

اليس كذلك ؟

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#13
Wajdy Essam كتب:

حيث في [] سننشىء مصفوفه في الذاكره heap -غير مهيئه بقيم- ، وسوف يرجع عنوان العنصر الأول ..

أما في () سوف ننشيء عنصر واحد في heap وقيمته هي القيمه المرسله ، وسوف يرجع لي عنوان ذالك العنصر ..

اليس كذلك ؟

بالتوفيق ،،

بلا :yes:

	int * scalar = new int(10);
	int * array  = new int[10];

تم تعديل هذه المشاركة بواسطة time1 في 23 أكتوبر 2008 في 15:11

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#14

إذن متى يكون إستخدام احداهما خاطئ؟

tvquran_6.gif

#15
اقتباس
إذن متى يكون إستخدام احداهما خاطئ؟

اذا استخدم احدهما في غير ماهو مخصص له .

بمعنى , عندما تريد حجز مصفوفة من العناصر بالتأكيد ستستخدم العملية [ ] , اما استخدامك للعملية ( ) فإنه سيقوم باعطاء قيمة للمتغير وليست المصفوفة الذي تم حجزه من خلال الconstructor , اذا لم يكن لنوع البيانات الذي ترغب ان تحجز منه constructor افتراضي فإنه المترجم سيعطيك خطأ .

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#16

قد يكون بينها إختلافات نعم لكن عند تطبيق الاكواد اعتقد انها تؤدي نفس الشئ !

الكود التالي يحجز بالطريقتين وينفذ الاخراج بنفس الطريقه للمتغيرين:

  1.  
  2. #include<iostream>
  3.  
  4. using namespace std;
  5. int main()
  6. {
  7. char name[]="how are you.";
  8. char* s;
  9. s=new char[5];
  10. char* d;
  11. d=new char(5);
  12. strcpy(s,name);
  13. strcpy(d,name);
  14.  
  15. while(*s)
  16. cout<<*s++;
  17. cout<<endl;
  18.  
  19. while(*d)
  20. cout<<*d++;
  21. cout<<endl;
  22.  
  23.  
  24. return 0;
  25. }
  26.  

tvquran_6.gif

#17

راجع اخي فهد هذه المشاركة ,ستساعدك ان شاء الله في تفسير مايحدث .

تم تعديل هذه المشاركة بواسطة time1 في 23 أكتوبر 2008 في 17:11

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#18

أخي time شكرا لك سوف اقراء الموضوع في الرابط على مهل .

tvquran_6.gif

#19

time1 كتب:
التابع cin.getline الوسيط الاول يأخذ مؤشر لمصفوفة الحروف مثل :

char x[256];

, والثاني للعدد الاعلى من الحروف لتخزينها ,

getline (char* s, streamsize n );

لو رجعت على منهجية الدروس التي وضعتها لك في المشاركة السابقة ستجد التشابه في آلية عمل الدوال , كذلك يوجد فيها شرح للعمليات الاساسية على القائمة , بعد ذلك بامكانك ابتكار ماتحتاجه من دوال ثانوية .

السلام عليكم ورحمة الله وبركاته

أخي " time1 " أشكرك جزيل الشكر على حسن تعاونك

بالنسبة للدروس التي قد وضعتها فأنا اقرأها واطبق ما فيها أول بأول

لكن يبدو أن المشكلة لدي في عمل main لبرامجك

بالعموم أنا ضعيف في مادة c++

لكن ان شاء الله سوف أتقوّى بفضل الله وبفضلكم

فهدالشلوي كتب:
اخي وجدي يقصد هذا الاعلان

  1. char* x; //مؤشر x=new char(10); // حجز مساحه لعشرة أحرف مثلا

  2.  

أشكرك جزيل الشكر أخي " فهدالشلوي "

قمت بنفس التعريف الذي وضعته

ووضعته في الـ main

لكن ظهرت مشكلة جديدة

حيث أنني عندما أريد أن أُدخل شيء فإنه عند تنفيذ أمر الإدخال .. يمر على الأمر وكأنه لاشيء حدث

يعني أنه ينفذ ولكن لا يدعني أُدخل أي قيمة

كل ما قمت به هو إضافة التعريف الذي أعطيتني اياه إلى الـ main()

أتمنى أن تساعدوني اخوتي بأسرع وقت

قد أكون أثقلتُ عليكم

ولكن كل ما أريده هو أن أصل إلى الطريق الصواب

أشكركم جميعا

#20
اقتباس
السلام عليكم ورحمة الله وبركاته

أخي " time1 " أشكرك جزيل الشكر على حسن تعاونك

بالنسبة للدروس التي قد وضعتها فأنا اقرأها واطبق ما فيها أول بأول

لكن يبدو أن المشكلة لدي في عمل main لبرامجك

بالعموم أنا ضعيف في مادة C++

لكن ان شاء الله سوف أتقوّى بفضل الله وبفضلكم

بالنسبة لعمل البرنامج الاساسي فهو في غاية السهولة , اذا كنت قد فهمت فعلا آلية عمل الدوال التي شرحتها فبإمكانك صناعة برنامجك عن طريق نسخ كود كل دالة ولصقه في مشروع , يبقى البرنامج الرئيسي مجرد عملية استدعاء للدوال , على سبيل المثال , الكود التالي سأقوم به بوضع دوال الاضافة ودالة عرض العناصر وسأقوم بتجربة ذلك البرنامج على عينة من البيانات :

#include<malloc.h>
#include<string>
#include<iostream.h>

struct node{
	int num;
	char name[10];
	node * next;
};
typedef node *node_ptr;
//Add FirstNode
void firstNode(node_ptr &first,int n,char name[10])
{
		if(first==NULL)
	{
		first=( node* )malloc(sizeof(node));
		first->num=n;
		strcpy(first->name,name);
		first->next=NULL;
	}
		else
		{
			cout<<"Error:";
		}
}

//addEnd
void append (node_ptr &first,int n,char name[10])
{
	node_ptr  p,q;
	p=first;
	while(p->next!=NULL)
	{

	p=p->next;
	}
		q=(node *)malloc(sizeof(node));
		q->num=n;
		strcpy(q->name,name);
		q->next=NULL;
	p->next =q;

}

//addFirst
void appfirst(node_ptr & first,int n ,char * name)
{
		node_ptr temp,q;
		q=first;
		temp=(node*) malloc(sizeof(node));
		temp->num=n;
		strcpy(temp->name,name);
		temp->next=q;
		first=temp;
}

//addMid
void appMid (node_ptr &first,int m,int n,char name[10])
{
	node_ptr  p,q;
	p=first;
	while(p->num!=m && p->next!=NULL)
	{  
	p=p->next;
	}
		q=(node *)malloc(sizeof(node));
		q->num=n;
		strcpy(q->name,name);
		q->next=p->next;
	p->next =q;
}

//Display
void Display(node_ptr&q)
{
	node_ptr p;
	p=q;
		while(p!=NULL)
	{
		cout<<p->name<<":"<<p->num<<endl;
	p=p->next;
	}
}

main()
{
	node_ptr q=NULL;

	firstNode(q,10,"Ali");//انشاء اول عقدة
	append(q,50,"Fahad");//اضافة عقة من الاخير
	appfirst(q,30,"Nasser");//اضافة عقدة من البداية
	appMid(q,10,90,"Sultan");//اضافة عقدة بالمنتصف بعد العقدة رقم 10


	Display(q);//عرض عناصر القائمة

	return 0;
}

جرب انشاء بيانات جديدة بواسطة الدوال السابقة , وجرب كتابة باقي العمليات المشروحة بالدرس الثاني وجربها على البيانات السابقة وانظر النتيجة .

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

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