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

لا تيم مناداه الدالة

مغلق
بدأه الحذر في 28 ديسمبر 2006 · 7 رد · 583 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

برنامجي هو ان تدخل اعداد عشوائية في array ثم ادخلها في دالة لكي يتم ترتيبها من الاصغر الى الاكبر

و انا اقوم في البرنامج بطباعة الarray قبل الترتيب و بعد الترتيب

لكن الغريب ان كل الاوامر قبل الدالة التي تقوم بالترتيب يتم تنفيذها لكن الدالة و الاوامر الي بعدها لا يتم تنفيذها

عملت Debug و مشيت مع البرنامج يطلع لي كل شي تمام لكن لما يوصل المؤشر الى الدالة يطلع لي :

---------------------------

Microsoft Visual C++

---------------------------

Unhandled exception in test the rand.exe: 0xC0000005: Access Violation.

---------------------------

OK

---------------------------

و ينهي ال Debug

ارجو الافادة

و هذا هو السورس كود

#include <iostream>
#include <string>
#include <cmath>
#include "bstree.h"


using namespace std;

void bubble_sort(int a[], int n)
{
	int i,j;
	bool sorted = false;

	for(i=n-1;(i>0) && !sorted;i++)
	{
		for(sorted = true,j=0;j<i;++j)
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
				sorted=false;
			}
	}
}

int main()
{
	int n=15;

int test[15];


	for(int i=0;i<n;i++)
	{
		test=rand();

	}

	for(i=0;i<n;i++)
	{
		cout << test;

		cout <<"\n";

	}
//////الى هنا  يتم تنفيذ كل شيء

	bubble_sort(test,n);//////////////////لا يتم مناداة الدالة و لا تنفيذ اي امر بعدها

	for(i=0;i<n;i++)
	{
		cout << test;

		cout <<"\n";

	}

	return 0;

}

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

I_can_always_make_you_smile_by_Praerion.jpg

#2

السلام عليكم

المشكله في هذه الجملة

for(i=n-1;(i>0) && !sorted;i++)

فيجب انقاص المتغير i بمقدار 1 اي i--

فكل لفة

for(sorted = true,j=0;j<i;++j)

ال i تزداد واحد واللوب الداخلي ستكبر كل مرة لفة واحدة يعني اول مرة

قيمة ال i =14 ثم 15 16 17 18 ......

swap(a[j],a[j+1]);

الى ان البرنامج get terminated بسبب ال swap method

والله أعلم طبعا

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#3

مشكور والله ما كتب منتبه ليها

بس على ما اعتقد ان البرنامج المفروض ما ينتهى و لا كيف

يعني المفروض انه يشتغل الى ملا لا نهايه

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

I_can_always_make_you_smile_by_Praerion.jpg

#4

سلااام..

- البرنامج لابد ينتهي لأنك محدد قيمة الn ب 15

- اذا كنت تبغاه ياخذ قيم عشوائية لحدعدد معين تقدر تكتب مثل ما كتبت بالضبط لكن تزيد عليه التالي...

 test=rand() % 10;

-بالنسبة لل i.. المستخدمة في الmain لا تنسى تعرفها int داخل اللوب بالذات لأنك مستخدم نف الحرف في أكثر من لوب..

-في دالة البوبل bobble ترى يا أخوي..قيمة i دائماً راح تساوي 14 n-1 لأنك ما بتغير في قيمتها..

فلازم تغير قيمة i..

for(i=n-1;(i>0) && !sorted;i--)

والبرنامج راح يمشي بإذن الله..أنا جربته..

بالتوفيق.. :)

تم تعديل هذه المشاركة بواسطة dantelllah في 29 ديسمبر 2006 في 05:59

What a Wonderful World

#5

السلام عليكم

حياك الله أخي الكريم الحذر

اقتباس
بس على ما اعتقد ان البرنامج المفروض ما ينتهى و لا كيف

يعني المفروض انه يشتغل الى ملا لا نهايه

أخي الكريم كلامك سليم

ولكن المشكلة والله أعلم انه الميثود swap تحاول التعديل علي عنصر من المصفوفة وليس محجوز له قيمة في الذاكره مثال

int arr[6];
arr[8]=10;

فسيحصل انتهاك للذاكرة ويغلق البرنامج

والله أعلم

اقتباس
في دالة البوبل bobble ترى يا أخوي..قيمة i دائماً راح تساوي 14 n-1 لأنك ما بتغير في قيمتها
أختي الكريمة dantelllah قيمة المتغير i ستزداد بمقدار واحد في كل دورة ستبدأ من n-1 14 ثم 15 ثم 16 وهكذا لاحظي ال i++

لو ان قيمتها ستظل 14 فلن يحصل انتهاك للذاكرة لأن اللوب الداخلي سيعدل على المصفوفة ضمن النطاق لأن j دائما ستكون اقل من 14 وطول المصفوفه هو 15 لاحظي الشرط الموجود في اللوب j<i والله أعلم :)

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 29 ديسمبر 2006 في 09:42

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#6

اهااا أخ محب الرسول..

صحيح كلامك..لأني لنا نقصت الi راح تصير لوب منتهية..

تبدا من 14 وتنتهي ب1...

هي المفروض ان اللوب تنتهي ولا لأ...اش المطلوب من البرنامج؟؟

اذا كان مفروض ينتهي بعدد معين n ويرتب من الاصغر للأكبرفهذا الكود يمشي..

for(i=0;i<n;i++)
	{
	  for(j=0;j<n;j++){
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
			}   
	  }
	  }

تحيــــاتي..

What a Wonderful World

#7

السلام عليكم

كل عام وانت بألف خير

وينعاد علينا و عليكوا بالصحة والسلامة ان شاء الله

dantelllah كتب:

اذا كان مفروض ينتهي بعدد معين n ويرتب من الاصغر للأكبرفهذا الكود يمشي..

كلام صحيح وسليم ولكن ليس دائما :(

ولكن اللوب يجب ان يبدأ من الأخر الى الأول لكي يتم المرور للوب المقارنة على كل عناصر المصفوفة ثم يتناصص واحد واحد اي يحضر العناصر من الأخر الى الأول

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

2,1,6,8,0

أذا مررنا من الأول الى الأخر فاننا سنعمل مقارنة لأخر عنصر في أخر لوب وسيكون اصغر منه وسنعمل له swap وسينتهي اللوب ولكن مكانه اصبح قبل الأخير!! اي الصفر سيكون مكانه الرابع بدل الأول

أما في الحلة الثانية فانه في أخر اللفة الأولى سيعمل swap للصفر مكان ال 8 وايضا في أخر اللفة الثانية مكان ال 6 حتى أخر لفة وسيكون ترتيبة الأول طبعا خلال اللفات يتم عمل swap للعناصر الأخرى

مثال

int a[]={2,1,5,3,8,-1,9,7,4,10,0};
int n=sizeof(a)/sizeof(*a);

try booth loops
1- for(i=n-1;i>0;i--)
2- for(i=0;i<n;i++)
	{
	  for(j=0;j<n;j++){
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
			}   
	  }
	  }
   for(i=0;i<n;i++)
	{
		cout << test;

		cout <<"\n";

	}

واذا لاحظت وجود المتغير sorted وجعل أحد شروط الخروج من اللوب

 for(i=n-1;i>0 && !sorted;i--)

لنفرض ان لدينا مصفوفة مكونة من عشرة عناصر ولكن من العنصر الخامس الى العاشر كانت مرتبة تصاعديا

واردنا ان نعمل ترتيب للمصفوفة

بالطريقة التي بالأعلى سيتم المرور على جميع العناصر مرارا وتكرارا حتى وان كانت مرتبة ويتكون الفات هي n-1 + n-2 + n-3 ....اي مضروب الn-1

فما الحل

الحل في استخدام متغير يخبرنا أذا تم اية عملة swap ام لا فأذا تمت عملية swap فذلك يدك انه هناك احتمالية وجود عناصر غير مرتبة اما أذا لم تتم أية عملية swap فذلك يدل على ان المقارنة دائما false اي انه لا يوجد عنصر اكبر من عنصر أخر موجود قبله اي ان حميع العناصر التالية مرتبة وخاهزة وما في داعي للمرور مرة أخرى والمقارنة على أشي فاضي

يتم تغيير قيمة هذا المتغير في حالتين

when the loop started the default sorted value will be true
thats mean the loop is sorted
for(sorted=true,j=0;j<i;j++)


sorted value will be changed to false when making swap 
mean that could be more items needs to be swapped
and the loops will continue looping
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
sorted=false;

أسف على طريقة شرحي بعرف انها بالمرة :wacko: ولكن ان شاء الله توصل الفكرة :unsure:

والله أعلم طبعا

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#8

يعطيك العاااافية على الشرح...الممتاز..

وبجرب البرنامج ان شاء الله ..لأني أغلب الأحيان أخطأ في عمليات الترتيب..

يمكن لأني أختار أسرع الطرق..التي تؤدي لروما...:)

لكن ان شاء الله لاااااااااااااااازم أحسن الsort عندي..

What a Wonderful World

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

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