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

سؤال ضروري اكبر قيمتين

بدأه norhan ahmad في 1 أغسطس 2011 · 9 رد · 676 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلم عليكم

ارجوا المساعده

هاد كود بخرج اكبر قيمتين في ال array وهو 9,6 ولكن عندما نغيير رقم 6 الى 2 يصبح من المفروض ان يكون اكبر قيمتين 9,3 ولكن يبقى 9,2 فهو يحتفظ في اول رقم في ال array ويطبعها مهما كانت

وانا لا اريد غير اكبر قيمتين بالاعتماد على هاد الكود مهما تغييرت مكان الارقام

وشكرا لكم

#include<iostream>
using namespace std;



    int largest ( const int list [], int lowerindex, int upperindex)
    {
        int max;
        if (lowerindex==upperindex)
        return list [lowerindex];
        else
        {
            max=largest(list , lowerindex+1 , upperindex);
            if (list[lowerindex]>=max)
            return list [lowerindex];

            else
             cout<<  max;
           return  list [upperindex]>max;


            }
            }
            int main ()
            {
                int z;    
            int a[]={6,1,9,3};
    cout<<largest(a,0,3)<<endl;

    cin>>z;
                               }
#2

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

يعني لماذا تتم كل مرة عملية ترجيع المصفوفة نفسها ؟

اعتقد ان هذا السؤال مر علي قبل ايام وقمت بحله بطريقة اخرى ..

لكن بالنسبة لهذا الكود لم افهم المطلوب منه هل هو يحتوي على خطأ متعمد والمطلوب اكتشافه وتصليحه ؟

ام هو كود قمتي ببرمجته وحصلتي على نتيجة خاطئة كالتي تظهر بعد التنفيذ وتحتاجين الى تصليحه ؟

اذا كانت الحالة الاولى فسيكون من الجميل المتابعه والعمل واكتشاف المشكلة

لكن اذا كانت الحالة الثانية لا استبعد ان هنالك مشكلة اساسية مع الكود تجعله يعمل بشكل خاطئ ..

لي عودة مرة اخرى ..

تحياتي العطرة .

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#3

شكرا لاهتمامك

هو على الحالة الاولى التي ذكرتها

وشكرا

#4

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

ان المطلوب هو تصلیح "هذا الکود" فقط مهما كان عمله , فالخطأ هنا:

else
	cout<<  max;
	return  list [upperindex]>max;

و بعد التصحيح:

else
{
	cout<<  max;
	return  list [upperindex];
}

و اما ان كان المطلوب طبع اكبر رقمين "بالاعتماد" على "هذا الكود" فقط

فهذا بعد التصحيح ( algorithm الكود السابق خطأ ):

#include<iostream>
using namespace std;

int largest ( const int list [], int lowerindex, int upperindex, int& firstLargeNumber, int& secondLargeNumber)
{
	int max;

	if (lowerindex==upperindex)
	{
		firstLargeNumber=list[lowerindex];
		return firstLargeNumber;
	}
	else
	{
    	max=largest(list , lowerindex+1 , upperindex, firstLargeNumber, secondLargeNumber);
    	if (list[lowerindex]>=max)
		{
			secondLargeNumber=firstLargeNumber;
			firstLargeNumber=list[lowerindex];
			return firstLargeNumber; 	
		}
		else if (list[lowerindex]>secondLargeNumber)
		{
			secondLargeNumber = list[lowerindex];
			return  firstLargeNumber;  
		}
		else 
			return firstLargeNumber;
 	}
}


int main ()
{
	int z; 

	int firstLargeNumber;
	int secondLargeNumber;

	int a[]={2,1,9,3};
	largest ( a, 0, 3, firstLargeNumber, secondLargeNumber);
	cout<<firstLargeNumber<<" "<<secondLargeNumber;

	cin>>z;
}

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

و هناك طرق افضل بكثير من هذا

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

تم تعديل هذه المشاركة بواسطة موليان في 1 أغسطس 2011 في 14:29

..:: رَبِّ زِدْني عِلْمًا ::..

#5

شكرا جزيلا للاهتمام فهذا هو المطلوب فشكرا

لكن عندي سؤال

عندما قمت بتغيير الكود الى مايلي

else
{
	cout<<  max;
	return  list [upperindex];
}

اصبح يخرج اكبر قيمتين في ال array وهي 9,6 ولكن عندما اقوم بتغيير قيم ال array الى ما يلي

int a[]={2,1,9,7};

يجب ان يخرج القيمتين 9,7 ولكن عند تنفيذ البرنامج يخرج 9,7,7 فكيف اعالج مشكلة ال 7 الثانية فانا لا اريد تكرارها فقط اريد ان يظهر 9,7 دون تكرار العدد الثاني

شكرا مره اخرى

رمضان كريم

وتقبل الله طاعاتكم وشكرا

:clapping:

#6

السلام علیکم

كما قلت سابقا, هناك خطأ في algorithm الکود,

ان كان max اکبر من مقدار lowerindex فيطبع الـmax فورا وهذا ليس صحيح, يمكن يكون العدد الاكبر في بقية array.

و افضل طريقة التي تأتي ببالي الان هي طبع اكبر قيمتين في النهاية ( كما فعلت في ردي الاخير )

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

..:: رَبِّ زِدْني عِلْمًا ::..

#7

ولكن لي بسؤال اخير

اريد شرح الكود الذي كتبتيه للفهم وهو

#include<iostream>

using namespace std;

int largest ( const int list [], int lowerindex, int upperindex, int& firstLargeNumber, int& secondLargeNumber)

{

int max;

if (lowerindex==upperindex)

{

firstLargeNumber=list[lowerindex];

return firstLargeNumber;

}

else

{

max=largest(list , lowerindex+1 , upperindex, firstLargeNumber, secondLargeNumber);

if (list[lowerindex]>=max)

{

secondLargeNumber=firstLargeNumber;

firstLargeNumber=list[lowerindex];

return firstLargeNumber;

}

else if (list[lowerindex]>secondLargeNumber)

{

secondLargeNumber = list[lowerindex];

return firstLargeNumber;

}

else

return firstLargeNumber;

}

}

int main ()

{

int z;

int firstLargeNumber;

int secondLargeNumber;

int a[]={2,1,9,3};

largest ( a, 0, 3, firstLargeNumber, secondLargeNumber);

cout<<firstLargeNumber<<" "<<secondLargeNumber;

cin>>z;

}

شكرا مره اخرى

شكرا كثيرا على الاهتمام فقد استفدت كثيرا

#8

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

#9

احد التعديلات التي قمت بها كانت نتيجتها كما ظهرت لك وهي اكبر رقم مع ثاني رقم مكرر مرتين ..

والسبب كما قلت لكي سابقا الكود غير مفهوم ..

----------

بالنسبة للكود الثاني ..

اختلف قليلا مع الاخ موليان .. ليس للسبب الذي ذكرته انتي وهو اذا كان الكود صحيح ويعطي نتيجة لماذا لا ينصح به ..؟!

هذه نظرية خاطئة .. لانك يمكن ان تطبعي العددين مباشرة من دون اي دالة وينتهي كل شئ .. وفي نفس الوقت الكود يعمل .. فهل هذا صح ؟؟

لا ..

لكن سبب اختلافي معه هو ان الـ Pass By Reference يعتبر اسرع من Pass By Value لانه لن تتم هنالك عمليات Copying للقيم الموجودة داخل المتغير الى متغيرات Formal اخرى لتجري عليها التعديلات وبعد ذلك يتم ترجيعها .. خصوصا ان الكود المطلوب يحتاج الى هذه الطريقة ..

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

احييك على هذه الطريقة الصراحة عجبتني ..

هل انتي من كتبها ؟

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#10

السلام عليكم

شكرا كثيرا على اهتمامكم

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

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

وشكرا لكم

لكن سؤال ؟

لايمكن حذف رقم 7 الثاني وهو المكرر باي طريقه

شكرا

:thumb_up:

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