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

أستفسار بخصوص الــ Queu

بدأه 3D3D في 9 ديسمبر 2011 · 5 رد · 925 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لي فتره أستفيد منكم بكل صدق كل شخص هنا له فضل علي بعد الله في السي بلس بلس ,,

سجلت اليوم وأتمنى تفيدوني بأستفساري ,,

انا عندي بروجكت لكن أبي أحله من جهدي بروجكتي يختلف جدا في طرحي لسؤال ’’

أستفساري هل يمكن أني أعبي داله القيو مباشره بأرقام من غير م يدخلها اليوزر ,,

ع سبيل المثال ,,

ال Array أقدر أحدد لها حجم وأعبيها من خلال التعريف{ A={2,4,5,6,6 وهكذا ,,

اللي في بالي ,,

أني راح أعبيها بهالشكل ,,

queue q1;
enqueu(2);
enqueu(4);
enqueu(6);

بتقولون أستخدمي فور أسهل علي التيتشر تقول لا ,,

اللي أبي أتأكد منه لو أستخدم طريقتي هذي صح ,,

لأاني بحثت بمواقع أجنبيه وقريت كتاب how to be pogram

ولا لقيت مضمون فكرتي اللي أبيها ,,

علماً ان الماده اللي أدرسها مالها علاقه بالسي بلس بلس وكتابة الأكواد ,,الماده اللي أدرسها ألقوريثم

#2

اختي العزيزة .. هنالك فرق بين المصفوفات وبين ما نسميه بالعربي الطوابير او انكليزيا Queue ..

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

المهم .. المصفوفة لها ميزة تميزها وتجعلها اسهل من باقي انواع هياكل البيانات Data Structure مثل Stack و Queue و Tree هي ان الخزن والوصول الى عنصر معين او حذف اي عنصر تكون اسهل من الباقي .. والسبب هي ان اي حلقة بسيطة تمكن المبرمج من الوصول الى عنصر او موقع فيها وحذفه او تعديله او القيام بما يشاء ...

بالنسبة للــ Queue ..معناه بالعربي الطابور .. مثل طابور الانتظار عند محطة الوقود .. السيارات تقف بطريقة منتظمة واول سيارة وصلت الى المحطة تكون اول سيارة عند انبوب ملأ الوقود .. هذا منطقي بالنسبة لنا في الحياة العادية ولكن في هياكل البيانات هذا نسميه First Come First Serve .. اي ان ما دخل اولا يعالج اولا .. ولا نستطيع الوصول والحذف بسهولة الى اي عنصر مالم نكن قد حذفنا العناصر التي دخلت قبله كلها .. وهذه هو جوهر الفرق بينها وبين المصفوفات ..

هذه مقدمة عامة عن الاثنين .. مجرد للمعلومية .. ولكن الان سأعود الى السؤال الاصلي ..

لايمكن الخزن في Queue مالم نكن نعرف Rear و Tail له .. ويمكن ترجمتها بالعربي الى الرأس والذيل للطابور .. وهذه هي المتغيرات الاساسية في اي طابور كما لدينا i , j التي اعتدنا عليها مع تصميم اي مصفوفة ذات بعدين .. ولكن هذه R, T عملها مختلف ..

عند الاضافة .. Enqueue

- R تزداد عند كل اضافة عنصر جديد الى الطابور .. بينما T يبقى على حاله لانه يمثل اول عنصر تمت اضافته .. والذي سيكون اول عنصر نستخرجه ( نحذفه ) ..

من هنا عرفنا ان هذه الدالة ستكون دالة لا ترجع شيئا او void .. والتي نسمها برمجيا بـ void ..

عند السحب او الحذف Dequeue

- T تزداد عند عملية استخراج او حذف عنصر من الطابور .. وبذلك سيكون R ثابت في هذه الحالة بينما T يزداد عند كل عملية حذف او استخراج ..

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

عند بداية البرنامج يجب ان تكون المتغيرات جميعها بالشكل التالي ..

[code] int r = 0; // rear
 int t = -1; // tail
 int n = 0;
 int length;
Object* que = new Object[length];

حيث que هي الطابور .. تم تعريفه على انه مجموعة متغيرات مع بعض ( او مصفوفة ) ولكن طريقة الخزن الى هذه المصفوفة تعتمد حسب مبدأ Fifo القادم اولا يعالج اولا ..

r الرأس

t الذيل

n عدد الارقام التي تم خزنها

length الحجم الكلي للمصفوفة فلايمكن ان نجعلها غير معلومة الحجم .. مثلا الحجم الكلي 100 ..

ليصبح لدينا الكود بالشكل التالي ..

 int r = 0; // back of the queue
 int t = -1; // front of the queue
 int n = 0;
 int length;
Object* que = new Object[length];

Enqueue(int num)
{
    if (t == r)
    {
        // If the rear = tail .. that means the queue is full .. show a msg .. 
        cout << " The Queue is Full - OverFlow .. "<< endl ;
    }
    else
    {
        // This code to add the object into the queue ..
        que[r] = num;
        r++;         
        rear = rear % length; 
        n++;
    }
}


Dequeue(int num)
{
    if (n == 0)
    {
       // That means the queue is empty , and we cann't remove any elemant .. 
       cout << " The Queue is empty - UnderFolow .. "<< endl ;
    }
    t++;
    t = t % length;
    n--;
}

ملاحظة ..

1- يتم استدعاء هذه الدوال ضمن الدالة الرئيسية main .. او من الممكن جعلها ضمن Class لتصميم واحد خاص بالQueue ..

2- لم اقم بتجربة الكود ولكنه عندي سابقا .. لست متأكدا من انه خالي من الاخطاء المنطقية .. لكن شكليا هو صحيح ويعطي النتيجة المطلوبة .. واي اشكال به من الممكن معالجته ان شاءلله ..

ايام الكلية كنت قد كتبت فئة خاصة لـ Queue بكل دواله الاساسية .. ولكن الصراحة هذا الكلام منذ 4 سنوات تقريبا فلا اتذكر اي هو الان ..

ارجو ان يكون الشرح واضح ..

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

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

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

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

نعم من الممكن ان تدخلين العناصر باي طريقة تشائين ..

مثل هذه الطريقة ..

queue q1[10] ;

for( i = 0 to n;i+=2)
q1.enqueue(i);

بهذه الصيغة البسيطة تم خزن العناصر من 0 - n بشكل الاعداد الزوجية ولا توجد اي مشكلة .. ولكن هذا يفترض انه تم بناء Class كامل خاص بالQueue ويحتوي على دوال الطباعة والاسترجاع ..

اقتباس
علماً ان الماده اللي أدرسها مالها علاقه بالسي بلس بلس وكتابة الأكواد ,,الماده اللي أدرسها ألقوريثم

وما تم شرحه اعلاه ماهو الا خوارزميات (:

اذا كنت قد فهمت المطلوب جيدا فهذا شرحي له .. واذا كان هنالك سوء فهم بالموضوع ارجو التوضيح لكي اعرف الاجابة ..

تحياتي العطرة ( مرة ثانية ) ..

تم تعديل هذه المشاركة بواسطة سنان محمد صالح في 10 ديسمبر 2011 في 01:51

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

#3

بغض النظر حصلت م أٌريد أو لم أحصله ,,

شكراً لك بمداد السماء وأكثر ,,

وجزاك ربي الجنان السبع ,,

ردك الأول افادني كثير والرب () ,,

ردك الثاني ,,

بالظبط هذا م كنت أقصده ,,

أنا أعلم انه بإمكاني أن اعمل مثل م تفضلت علي به ,,

لكن أنا لا أريد أن أستخدم داله for ولا أريد لليوزر أن يدخل أرقاما ,,

أريدها أن تخرج له ع سبيل المثال مباشره تخرج له هذه الأرقام {5,4,2,9,3,9,1,0} من ضمن البرنامج تخرج وليس اليوزر هو من يقوم بالأدخال ,,

رزقك ربي جميع م تتمنى ,,

#4

اختي لا شكر على واجب والحمدلله الان ارتحت انه كان مفيدا ..

بالنسبة لـــ

اقتباس
أنا أعلم انه بإمكاني أن اعمل مثل م تفضلت علي به ,,

لكن أنا لا أريد أن أستخدم داله for ولا أريد لليوزر أن يدخل أرقاما ,,

أريدها أن تخرج له ع سبيل المثال مباشره تخرج له هذه الأرقام {5,4,2,9,3,9,1,0} من ضمن البرنامج تخرج وليس اليوزر هو من يقوم بالأدخال ,,

بكل بساطة ما قد كتبته ( انتي ) بالرد الاول .. استخدمي ما كتبته لك لكن بدون For .. بالشكل التالي ..

queue q1[10] ;

q1.enqueue(2);
q1.enqueue(4);
q1.enqueue(6);
q1.enqueue(8);
q1.enqueue(10);

لكن لاحظي عند المسح يجب ان تكون الدالة مسندة الى متغير ..

x = q1.dequeue();

واذا اردتي سحب اكثر من عنصر ضعي السطر السابق اكثر من مرة على حسب العناصر المطلوب تفريغها ..

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

هنا لدي سؤال لك لاعرف هل وصلت المعلومةام لا ( اختبار ) ... ماذا سيكون محتوى x ؟!

تم تعديل هذه المشاركة بواسطة سنان محمد صالح في 10 ديسمبر 2011 في 15:43

1

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

#5

أن لم أٌخطئ ستكون 10 ,,

سنان شٌكراً ثم شكراً وشكرا,,

لن يفي الشكر لكن سأجزي بدعوات لك عند رب السماء ,,

جزاك المولى عني ألف خير ,,,

هذا م كنت أقصده إن لا طريقه لي سوى ان أملائها بهذه الطريقه ,,,

رعاك المولى وزادك ربي سعه من العلم ,,

الله يحرم أناملك من النار ,,

#6

اختي لا شكر على واجب ولكن هذه المرة لم ترحيني ..

الحل خاطئ مع الاسف ..

تذكري مسألة ( الداخل اولا يعالج اولا ) ...

اول قيمة لـ X = 2 .. لانها اول قيمة تم خزنها ...

واي شئ اخر ان شاءلله اكون موجود .. تحياتي العطرة ..

بالمناسبة .. لماذا كتبتي ::

اقتباس
إن لا طريقه لي سوى ان أملائها بهذه الطريقه ,,,

الا توجد هنالك تربط بين الارقام التي تريدين خزنها ؟!

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

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