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

[ تمت الإجابة ]كيف استخلص المنطق البرمجي ؟

بدأه student1011 في 27 أكتوبر 2013 · 6 رد · 1,149 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

أحد اجزاء البرنامج الذي اكتبه حالياً يحتوي على مشكلة لم اتمكن من تحدديها وحلها بالشكل الأمثل.

 

لتسهيل الموضوع: لنفرض وجود مصفوفة two-dimensional array من نوع integer .

 

int[] array = {1,1};

 

وأريد ان استخرج ال 4 حالات الممكنه (steps) وذلك ب إضافة الرقم 1 لكل dimension .

باختصار، أريد الحصول على التالي:

 

[1,2]

[2,1]

[2,2]

والحالة الاساسية [1,1]

 

حاليا، اقوم بذلك بشكل يدوي، عن طريق زيادة البعد الاول، ثم طباعه المصفوفة، ثم إرجاع القيم إلى حالتها الأصلية، ثم زيادة البعد الثاني وطباعه المصفوفة، ثم زيادة البعد الأول وطباعه المصفوفة.

 

المشكلة انه عند الانتقال الى 3 أبعاد ، فاحتاج الى كتابة العديد من الأسطر!

والمطلوب ان أعمل ذلك على مصفوفات ذات 5 ابعاد !

 

حاولت ان اقوم بعمل nested-loops لكن لم استطع الحصول على خوارزمية او منطق برمجي ..

 

هل بالامكان المساعدة؟

#2

توصلت الى حل مؤقت ، وهو ان اعمل check لقيمة الابعاد، فاذا كانت 5 مثلا اقوم بالتالي:

for (i=1 ; i<=2 ; i++ )
for( int j=1; j <=2 ; j++ )
for( int h=1 ; h <=2 ; h++ )
for( int t=1 ; t <=2 ; t++ )
for( int k=1 ; k <=2 ; k++ )

int[] array={i,j,h,t,k}

لكن لابد ان اتأكد قبل من المتغير d ، هل هو 1 ، او 2 ، او 3 ، او 4 ، او 5 .

لان عدد loops يتحدد من عدد الابعاد.

 

هل يمكن ان يكون البرنامج اكثر ديناميكيه ويتأقلم مع اي عدد d ؟

#3

السلام عليكم

 

اقتباس
والحالة الاساسية [1,1]

 

إذا كانت المصفوف ثنائية البعد من أربع عناصر فآخر عنصر فيها هو 1,1 !

 

اقتباس

باختصار، أريد الحصول على التالي:

[1,2]

[2,1]

[2,2]

 

حسب الكلام السابق لا يوجد عنصر الـ index بتاعو أكبر من 1,1 و إلا ستحصل على OverFlow لأن كل العناصر السابقة تقع خارج نطاق المصفوفة.

إلا إذا كان الهدف من السؤال هو التخلص من الصفر كبداية للترقيم و جعله واحد كما في الـ MATLAB مثلا لكن في هذه الحالة لا يوجد عنصر يحمل الـ index ذو الدليل 2,2 و إنما بكل بساطة 2,2 تُشير إلى 1,1 لا أكثر و لا أقل.

 

عموما, مثل هذه الأشياء يمكن حلها باستخدام الـ nested-loops أو الـ recursion.

 

 

 

 

تحياتي.

تم تعديل هذه المشاركة بواسطة Snack3r في 27 أكتوبر 2013 في 14:53

1
#4

أخي أنت تخلط بين عدد الأبعاد وبين عدد العناصر .. مصفوفة من أربع أبعاد ستكون مثل هذه :

int a[2][2][2][2];

أما مصفوفة فيها أربع عناصر ستكون :

int a[]={1,1,1,1};

أرجو الانتباه لذلك .. فهذا خطأ قاتل .

_____________________

بالنسبة لسؤالك

نعم عليك الحل باستخدام recursion أما الnested loops فهو حل مؤقت ... سيسبب مشاكل عند محاولة تطوير الكود ..

إليك خطوات حل مسألتك :

1- مصفوفة الحالة البدائية .. نمررها كوسيط للدالة .. ونمرر الوسيط الثاني رقم العنصر الذي نود البدء بتغييره .. وليكن صفرا ..  وعليك تمرير حجم المصفوفة والقيمة العظمى التي ترغب في الوصول اليها (في حالتك 2 )

2- في جسم الدالة نكتب :

    1- اذا كان رقم العنصر أكبر من حجم المصفوفة اخرج من الدالة .

    2- اذا كانت قيمة العنصر الذي نرغب بزيادته أكبر من القيمة العظمى فاخرج من الدالة .

    3- في حال لم يتحقق 1 أو 2 نقوم بعمل حلقة وحيدة : فيها استدعاء للدالة (عوديّة ) ونغيّر في الوسطاء ما يلي :

                        رقم العنصرالذي نود تغييره نزيده واحداً فقط .. والمصفوفة التي نرغب في تمريرها يتغير فيها العنصر المحدد بمتغيرالحلقة (من صفر إلى القيمة العظمى)

الكود التالي يوضح المثال .. اكتب الكود الخاص بك وأرفقه هنا من فضلك :)

#include<cstdio>
void Go(int arr[],int size,int max,int start)
{
    if(start>=size)
        return;
    if(arr[start]>max)
        return;
    int *arr2=new int[size];
    for(int i=0;arr2[start]<max;i++)
    {
        for(int j=0;j<size;j++)
            arr2[j]=arr[j];
        arr2[start]+=i;
        if(start==size-1)
            for(int k=0;k<size;k++)//print
                printf("%i%c",arr2[k],k+1==size?'\n':' ');
        Go(arr2,size,max,start+1);
    }
}
int main()
{
    int a[]={1,1,1,1};
    Go(a,4,2,0);
    return 0;
}

أنتظر محاولتك ..

بالتوفيق :)

1
#5

المعذرة اخي Snack على الخطأ ، نعم انا اقصد عدد العناصر .. بحيث كل عنصر يمثل (بالنسبة لي) dimension .

اشكرك على التوضيح.

 

شكرا اخي مصطفى على الرد ، باذن الله اجرب الكود ثم اخبركم بالنتائج.

#6
مصطفى 36a2 كتب:

#include<cstdio>
void Go(int arr[],int size,int max,int start)
{
    if(start>=size)
        return;
    if(arr[start]>max)
        return;
    int *arr2=new int[size];
    for(int i=0;arr2[start]<max;i++)
    {
        for(int j=0;j<size;j++)
            arr2[j]=arr[j];
        arr2[start]+=i;
        if(start==size-1)
            for(int k=0;k<size;k++)//print
                printf("%i%c",arr2[k],k+1==size?'\n':' ');
        Go(arr2,size,max,start+1);
    }
}
int main()
{
    int a[]={1,1,1,1};
    Go(a,4,2,0);
    return 0;
}

لا تنسَ الانتباه لتسربات الذاكرة memory leak :)

كل new يجب ربطها على الفور (بعد الانتهاء من استخدام الobject على الheap) بـdelete إلا إذا كنت تستخدم garbage collector :)

تم تعديل هذه المشاركة بواسطة A.S Hack في 28 أكتوبر 2013 في 11:20

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#7

نعم صدقت :)

تنقصنا عبارة

delete[]arr2;

بعد انتهاء حلقة for في التابع ..

دائما ما أهمل ذلك في البرامج الصغيرة :)

شكرا للتنبيه :)

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…