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

مساعدة في المصفوفات !

بدأه iDream في 31 يناير 2012 · 11 رد · 731 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندي بروجكت في مادة البرمجة ، والمطلوب مني ، اني أرتب مصفوفة تصاعديا وتنازليا ، وأحسب أكبر وأصغر عدد في المصفوفة ..

وحساب بعض الأشياء الأخرى و الحمدلله عملتها .

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

مثلا:

المصفوفة اللي عندي هيا :

1

2

5

7

3

8

بعد كدا المستخدم ادخل رقم : " 5 "

الجواب المفروض يكون

Number " 5" would be placed in location : 3

=============================

فـ ممكن تساعدوني في كود لعمل المطلوب مني ؟؟

وجزاكم الله ألف خير : )

..

#2

أخى الكريم

ممكن ترفق المثال حتى نتمكن من ادخال التعديل بالشكل المناسب ....

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

ربما تقصد هذه :

#include<stdio.h>
#define true 1
#define false 0

int main(void){

    char array[]  = {1,2,5,7,3,8};
    int lookup;

    printf("Number?: ");
    scanf("%d", &lookup);

    int counter = 0;
    int isexist = false;

    while( array[counter] != sizeof(array) ){

        if( array[counter] == lookup ){
            printf("Number '%d' would be placed in location : %d\n", lookup, counter + 1);
            isexist = true;
            break;
        }
        counter++;
    }

    if( isexist == false )
        printf("'%d' doesn't exist!\n", lookup);

}

$ ./mainNumber?: 5
Number '5' would be placed in location : 3
$ ./main
Number?: 222
'222' doesn't exist!
$
#4
Mr.B كتب:

ربما تقصد هذه :

#include<stdio.h>
#define true 1
#define false 0

int main(void){

    char array[]  = {1,2,5,7,3,8};
    int lookup;

    printf("Number?: ");
    scanf("%d", &lookup);

    int counter = 0;
    int isexist = false;

    while( array[counter] != sizeof(array) ){

        if( array[counter] == lookup ){
            printf("Number '%d' would be placed in location : %d\n", lookup, counter + 1);
            isexist = true;
            break;
        }
        counter++;
    }

    if( isexist == false )
        printf("'%d' doesn't exist!\n", lookup);

}

$ ./mainNumber?: 5
Number '5' would be placed in location : 3
$ ./main
Number?: 222
'222' doesn't exist!
$

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

أخى الكريم هناك خطأ منطقى فى الكود السابق وهو شرط حلقة while , هذا الشرط متحقق دائماً لأنه لاتوجد قيمة داخل المصفوفة السابقة تساوي حجم المصفوفة وبالتالى لن يخرج من الحلقة وسوف تتعدى قيمة counter القيمة المسموح بها

وهى تعدى قيمة مكان أخر عنصر فى المصفوفة.

حيث أن عدد عناصر المصفوفة هو 6 عناصر وبما أن تلك المصفوفة من نوع char فكل عنصر من عناصر المصفوفة يحجز حجم 1byte فى الذاكرة وبالتالى حجم تلك المصفوفة الذى تشغلة فى الذاكرة هو 6byte

وبالتالى أى مصفوفة من نوع char حجمها المعطى بالدالة ()sizeof يساوى عدد عناصر تلك المصفوفة.

ولكى يكون الشرط صحيحاً يمكن أن تضعة على الصورة التالية :

while( counter < sizeof(array) ){
2

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#5

سامحوني ع التأخير ..

جزاكم الله ألف ألف خير ..

والله يجعل مساعدتكم في موازين حسناتكم ..

..

#6
 char array[]  = {1,2,5,7,3,8};

انتبه أخي الكريم, المصفوفة عددية و ليست مصفوفة محارف ! :)

int isexist = false;

من الأفضل أن يكون نوع المتغير isexist منطقيا bool

اقتباس
هناك خطأ منطقى فى الكود السابق

+1 على التصحيح.

اقتباس
ولكى يكون الشرط صحيحاً يمكن أن تضعة على الصورة التالية :

while( counter < sizeof(array) ){

أخي أحمد, من قال لك أن حجم العناصر المُخزنة خارج المصفوفة أقل دائما من حجم المصفوفة نفسها ؟؟ :)

شرط التوقف الذي وضعه الأخ غير صحيح بالمرة لأنه لا توجد علاقة بين حجم عناصر المصفوفة و العناصر المجاورة !

لا توجد أي طريقة لمعرفة نهاية "المصفوفة العددية", لازم يكون هناك متغير يحوي طول المصفوفة و إلا فالكود خاطئ :)

بالنسبة لي, أُفضل أن يكون الكود هكذا :

#include<stdio.h>

int isExist(int *Array, int size, int key) {
    for (int i = 0; i < size; i++)
        if (*(Array + i) == key)
            return i + 1;
    return -1;
}

int main() {
    int lookup, found, arr[] = {1, 2, 5, 7, 3, 8};
    printf("Number ? : ");
    scanf("%d", &lookup);
    found = isExist(arr, 6, lookup);
    if (found >= 0)
        printf("Number %d would be placed in location : %d\n", lookup, found);
    else
        printf("'%d' doesn't exist!\n", lookup);
    return 0;
}
#7
اقتباس
أخي أحمد, من قال لك أن حجم العناصر المُخزنة خارج المصفوفة أقل دائما من حجم المصفوفة نفسها ؟؟ :)

تقصد داخل المصفوفة!

نعم أخى أنا وضعت علامة أقل من لأن المصفوفة تبدأ العد من الصفر ليس لأن عدد عناصر المصفوفة أقل من حجمها , فحجم المصفوفة يساوى عدد عناصرها فى حالة المصفوفة الحرفية لأن كل حرف يشغل حجم 1byte

اقتباس
لا توجد أي طريقة لمعرفة نهاية "المصفوفة العددية", لازم يكون هناك متغير يحوي طول المصفوفة و إلا فالكود خاطئ :)

إليك تلك الطريقة أخى الكريم :

sizeof(arr)/sizeof(arr[0])

هذا بشكل عام على إفتراض أن المصفوفة من نوع عدد صحيح int يكون الكود كالتالى :

sizeof(arr)/sizeof(int)

أو

sizeof(arr)/4

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#8

أتفق معك في أن حجم كل عنصر من عناصر المصفوفة أقل تماما من حجم المصفوفة الكلية و لكنني أختلف معك في صحة هذا الشرط :

while( array[counter] < sizeof(array) )

لأنه قد يتسبب في حدوث الــ Overflow.

عند وصولك إلى آخر عنصر من المصفوفة, في الخطوة الموالية سيتم الخروج من المساحة المُخصصة للمصفوفة لأنك لم تضع شرط على العداد counter ! :)

إذا كان حجم العنصر الموالي لآخر عنصر من عناصر المصفوفة أقل من حجم المصفوفة, سيدخل البرنامج إلى مساحة مُخصصة لبرنامج آخر .. Overflow :wink:

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 22 فبراير 2012 في 15:35

#9
اقتباس
while( array[counter] < sizeof(array) )

أخى الكريم أنا لم أكتب الشرط هكذا ولكن كتبه بهذه الصورة :

اقتباس
while( counter < sizeof(array) ){

وهذا الكود لن يحدث به Overflow مطلقاً لأنه عند وصول قيمة العداد لقيمة حجم المصفوفة الحرفية سوف يخرج من تنفيذ حلقة while لعدم تحقق الشرط.

يمكنك مراجعت المشاركة الرابعة حتى يتضح لك ما كنت أعنيه.

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#10
اقتباس
أخى الكريم أنا لم أكتب الشرط هكذا ولكن كتبه بهذه الصورة :

while( counter < sizeof(array) ){

وهذا الكود لن يحدث به Overflow مطلقاً لأنه عند وصول قيمة العداد لقيمة حجم المصفوفة الحرفية سوف يخرج من تنفيذ حلقة while لعدم تحقق الشرط.

باعتبار أن المصفوفة من int فإن sizeof(array) = 24

عند وصول قيمة العداد counter لقيمة حجم المصفوفة => نكون قد وصلنا إلى :

array[24]

ألا ترى أنه تم تجاوز المساحة المُخصصة للمصفوفة array ؟؟ :)

بالمناسبة, إذا أردت حساب الطول الفعلي لمصفوفة من نوع int فيمكنك كتابة :

int size = sizeof(arr) / sizeof(int);

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 22 فبراير 2012 في 19:24

#11
اقتباس
أخى الكريم أنا لم أكتب الشرط هكذا ولكن كتبه بهذه الصورة :

while( counter < sizeof(array) ){

وهذا الكود لن يحدث به Overflow مطلقاً لأنه عند وصول قيمة العداد لقيمة حجم المصفوفة الحرفية :D سوف يخرج من تنفيذ حلقة while لعدم تحقق الشرط.

وكما أسلفت الحديث سابقاً إذا كانت المصفوفة من نوع عدد صحيح int نقوم بإستخدام هذا الكود لإيجاد عدد عناصر المصفوفة بالتصبيق على المسال السابق إن كانت المصفوفة من نوع عدد صحيح int سيكون على الشكل التالى :

 while( counter < sizeof(array)/sizeof(int){
1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

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