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

اختبر قدراتك في C/CPP - الحلقة الثانية, الجزء الثالث

مغلق
بدأه Snack3r في 5 سبتمبر 2012 · 11 رد · 916 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

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

أجزاء الحلقة الثانية ستكون مُرتبة حسب الصعوبة إن شاء الله.

الإختبار الثاني (الجزء الثالث ) :

كيف نعلن عن :

  • مؤشر لمصفوفة مكونة من 3 عناصر float.
  • مؤشر لمصفوفة تحتوي على 5 مؤشرات int.
  • جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void.
  • جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int.
  • جدول يحوي أربع مؤشرات لدالة تستقبل كوسيط مؤشر من نوع int و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر int.

سأضع حل السؤال بعد الإنتهاء من عرض المحاولات.

2
#2

بسم الله الرحمن الرحيم ....

لنبدأ ...

  • مؤشر لمصفوفة مكونة من 3 عناصر float.
    float a[3];
    float*b=a;

  • مؤشر لمصفوفة تحتوي على 5 مؤشرات int.
    int*b[5];
    int**c=b;

  • جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void.
    void*c[5];
    for(int i=0;i<5;i++)
    	c=new void[3];

  • جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int.
    int* func()
    {
    	int z[5];
    	return z;
    }
    int*(*v)()[5];
    for(int i=0;i<5;i++)
    v=func;

  • جدول يحوي أربع مؤشرات لدالة تستقبل كوسيط مؤشر من نوع int و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر int.
    int* func()
    {
    	int z[5];
    	return z;
    }
    int*(*v)()[5];
    for(int i=0;i<5;i++)
    v=func;
    
    int*(*v)(int*,int)[4];
    for(int i=0;i<5;i++)
    v=func;

نتابع غداً .. فأبي سيشن حرباً علي بسبب الوقت الذي أقضيه أمام الحاسوب .... تجاوزت 12 ساعة .. والبارحة 16 ساعة ...

على أي حال ... جزاك الله خيراً ...

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

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 5 سبتمبر 2012 في 19:53

#3

محاولة 1/

  • مؤشر لمصفوفة مكونة من 3 عناصر float.
  • float *f = new float[3];

  • مؤشر لمصفوفة تحتوي على 5 مؤشرات int.
  • int *mi = new int[5];

  • جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void.
  • void *mv[5][3];

  • جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int.
  • void *mf[5];
    for(int i =0; i < 5; i++)
     mf = new (int*(*)());

  • جدول يحوي أربع مؤشرات لدالة تستقبل كوسيط مؤشر من نوع int و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر
  • void *mf2[5];
    for(int i =0; i < 5; i++)
     mf2 = new (int*(*)(int*,int));

    [سبحان الله و بحمده, سبحان الله العظيم]

    #4
    أحمد الشنقيطي كتب:

    السلام عليكم

    الحلقة الأولى.

    الحلقة الثانية - الجزء الأول.

    الحلقة الثانية - الجزء الثاني.

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

    أجزاء الحلقة الثانية ستكون مُرتبة حسب الصعوبة إن شاء الله.

    الإختبار الثاني (الجزء الثالث ) :

    كيف نعلن عن :

    • مؤشر لمصفوفة مكونة من 3 عناصر float.
    • مؤشر لمصفوفة تحتوي على 5 مؤشرات int.
    • جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void.
    • جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int.
    • جدول يحوي أربع مؤشرات لدالة تستقبل كوسيط مؤشر من نوع int و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر int.

    سأضع حل السؤال بعد الإنتهاء من عرض المحاولات.

    وعليكم السلام أخ أحمد

    بسم الله نبدأ

    مؤشر لمصفوفة مكونة من 3 عناصر float.

    float (*p) [3];

    متأكد بنسبة 100/100happy.gif

    مؤشر لمصفوفة تحتوي على 5 مؤشرات int.

    int **p[5];

    صحيح بنسبة 90/100

    جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void.

    void *p[5][1][3];

    جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int.

    int (*p [5]) (void); //  int دالة تُعيد مؤشر لمصفوفة من 5 عناصر

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

    int (*p [5]) (int*,int); //int. دالة تستقبل كوسيط مؤشر من نوع  و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر

    والله أعلم وبالتوفي للجميع

    تم تعديل هذه المشاركة بواسطة مومو (momo) في 6 سبتمبر 2012 في 00:44

    i love you mama

    #5

    1. مؤشر لمصفوفة مكونة من 3 عناصر float :

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

    • مؤشر لمصفوفة مكونة من 3 عناصر float :
      float array[3];
      float *ptrArray = array;


    • مصفوفة مؤشرات مكونة من 3 عناصر float :
      float (*ptrArray)[3];
      Or
      float *ptrArray = new float[3];

    2. مؤشر لمصفوفة تحتوي على 5 مؤشرات int :

    المصفوفة في هذه الحالة ستكون مصفوفة مؤشرات و المؤشر الذي يشير إليها سيكون مؤشر لمؤشر :

    int *array[5];
    int **ptrArray = array;

    أما هذه الكتابة int **p[5] فتعني مصفوفة تحوي 5 مؤشرات لمؤشرات من نوع int.

    3. جدول مُكون من 5 مصفوفات أحادية البعد, كل مصفوفة جزئية تحتوي على 3 مؤشرات من نوع void :

    هناك طريقتان لفعل هذا الأمر, إما أن ننشئ مصفوفة A أحادية البعد لمؤشرات void, تحوي خمس عناصر حيث سيشير كل عنصر من A إلى مصفوفة من 3 مؤشرات void, (كما فعل الأخ مصطفى).

    أو ننشى مباشرة مصفوفة ثنائية البعد لمؤشرات void, مُكونة من 5 صفوف و 3 أعمدة, (كما فعل الأخ ياسين).

    4. جدول يحتوي على 5 مؤشرات لدالة تُعيد مؤشر لمصفوفة من 5 عناصر int :

    typedef int* MonTypeDeFonction();
    
    MonTypeDeFonction monTableauDeFonction[100];
    
    int* func(){
         int z[5];
         return z;
    }
    
    for(int i=0;i<5;i++)
    monTableauDeFonction = func;

    أو هكذا :

    int* (*fPtr[]) () = {func, func, func, func, func};

    5. جدول يحوي أربع مؤشرات لدالة تستقبل كوسيط مؤشر من نوع int و متغير صحيح و تعيد مؤشر لمصفوفة من 5 عناصر int :

    نفس الفكرة السابقة إلا أن توقيع الدالة في هذه الحالة سيكون :

    int* Func(int*, int)
    #6

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

    عندي سؤال .

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

    أولاً .... ما هذا الجدول أول مرة اسمع فيه ,,,,

    ثانياً ... لم أفهم حلك ... أنا لم أستعمل typedef من قبل ...

    ثالثاً... هل حلي صحيح ؟؟

    int* func()
    {
            int z[5];
            return z;
    }
    int*(*v)()[5];
    for(int i=0;i<5;i++)
    v=func;

    تحياتي

    تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 6 سبتمبر 2012 في 11:22

    #7
    اقتباس
    ما هذا الجدول أول مرة اسمع فيه

    الجدول و المصفوفة يُمثلان نفس الشيء, فقط أردت استخدام كلمة "جدول" حتى لا أكرر كلمة "مصفوفة".

    اقتباس
    لم أفهم حلك ... أنا لم أستعمل typedef من قبل

    typedef عبارة عن كلمة محجوزة مُسبقا, تُستخدم لإنشاء أسماء مستعارة للأنواع الموجودة في اللغة و طريقة استخدامها تكون بكتابة الكلمة ثم نوع البيانات متبوعا بالاسم المستعار هكذا:

    Typedef DataType AliaseName

    انظر الأمثلة :

    typedef int VECTEUR[3];
    typedef void * POINTEUR;
    typedef struct { int value; } INTVALUE;
    VECTEUR u, v; /* int u[3], int v[3]; */
    POINTEUR p1, p2; /* void * p1, * p2; */
    INTVALUE n; /* struct { int value; } n; */

    أيضا, تفيدنا typedef في الإعلان عن بنية تشير إلى نفسها :

    typedef struct node {
        char * item;
        struct node * next;
    } node_t;

    أو للحصول على قوائم مترابطة أو بنى شجرية :

    typedef struct node * node_p;
    
    typedef struct node {
        char * item;
        node_p next;
    } node_t;

    اقتباس
    هل حلي صحيح للسؤال الرابع ؟

    نعم, و حل الأخ ياسين أيضا صحيح, لكن لي تحفظات على حل الأخ مومو :blush:

    #8

    جاء في كلامك أخي أحمد

    أحمد الشنقيطي كتب:

    • مصفوفة مؤشرات مكونة من 3 عناصر float :
      float (*ptrArray)[3];
      Or
      float *ptrArray = new float[3];

    2. مؤشر مصفوفة تحتوي على 5 مؤشرات int :

    int *array[5];
    int **ptrArray = array;

    عكست الإثنين

    . مؤشر لمصفوفة مكونة من 3 عناصر float :

    سيكون بهذا الشكل

    float (*p) [3];

    والنص واضح في هذه المسألة

    اقتباس
    Quand on déclare int (*p3)[3]; on obtient un pointeur de tableau de 3 int en mémoire, et rien d'autre.

    2. مصفوفة تحتوي على 5 مؤشرات int :

    سيكون هكذا

    int *p[5];

    النص

    اقتباس
    Quand on déclare int *t3[3]; on obtient trois pointeurs de int en mémoire, et rien d'autre.

    وبإمكانك التأكد من نفسك بزيارتك لهذه الصفحة Déclaration de tableau et pointeurblush.gif والله أعلم

    أحمد الشنقيطي كتب:

    لكن لي تحفظات على حل الأخ مومو :blush:

    بالنسبة لمؤشرات الدوال هذه هي أول بداية لي مع هذا النوع من المؤشرات

    ولم أتمرن بشكل جيد في استعمالها . happy.gif

    موفق بإذن الله

    تم تعديل هذه المشاركة بواسطة مومو (momo) في 6 سبتمبر 2012 في 12:11

    i love you mama

    #9

    أفهم من الأمثلة التالية :

    typedef int VECTEUR[3];
    typedef void * POINTEUR;
    typedef struct { int value; } INTVALUE;
    VECTEUR u, v; /* int u[3], int v[3]; */
    POINTEUR p1, p2; /* void * p1, * p2; */
    INTVALUE n; /* struct { int value; } n; */

    من المثال الثاني والثالث عملها مشابه ل#define

    أما المثال الأول فهو طريقة جديدة بالنسبة لي ... أعجبتني laugh.gif

    typedef struct node {
        char * item;
        struct node * next;
    } node_t;

    ألا يكفي أن نكتب:

    struct node {
        char * item;
        node * next;
    } node_t;

    والمثال الأخير :

    typedef struct node * node_p;
    
    typedef struct node {
        char * item;
        node_p next;
    } node_t;

    يكافئ :

    struct node {
        char * item;
        node * next;
    } node_t;

    هل كل ماذكرته صحيح ...

    شكراً لك ..

    #10
    أحمد الشنقيطي كتب:

    مصفوفة مؤشرات مكونة من 3 عناصر float :

    float *ptrArray = new float[3];

    أنا أظن أن ذلك التصريح هو عن مصفوفة بثلاث عناصر float و ليست مصفوفة مؤشرات

    هالكود المفروض صحيح

    float f;
    ptrArray[0] = f;

    لكن لو كانت مصفوفة مؤشرات كان يكون هالكود صحيح في حين أنه خاطئ:

    ptrArray[0] = &f;

    و حتى تكون مصفوفة مؤشرات من ثلاث عناصر, نصرح كالتالي:

    float **ptrArray = new float*[3];

    أنا أتكلم بدون التجريب على كومبايلر يعني ممكن أكون مخطئ.

    تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 6 سبتمبر 2012 في 16:43 — السبب: تنسيق المشاركة.

    [سبحان الله و بحمده, سبحان الله العظيم]

    #11
    اقتباس
    عكست الإثنين

    أخي momo, أنت تخلط ما بين مصفوفة مؤشرات و مؤشر لمصفوفة مؤشرات :)

    لنأخذ المثال التالي :

    اقتباس
    مصفوفة تحتوي على 5 مؤشرات int, سيكون هكذا int *p[5]

    هذا صحيح, لكن أنتَ كتبتَ في محاولتك الأصلية :

    اقتباس
    مؤشر لمصفوفة تحتوي على 5 مؤشرات int يكون int **p[5]

    و هذا الإعلان خاطئ ! لأن الكتابة السابقة تُمثل مصفوفة تحوي 5 مؤشرات لمؤشرات من نوع int و ليس مؤشر إلى مصفوفة مؤشرات :)

    أيضا, أنا أختلف معك في طريقة التعريف ! و بالتحديد في مسألة "استقلالية البيانات" (Data independence).

    عندما أقول مؤشر يشير إلى مصفوفة فهذا يعني مبدئيا, وجود مؤشر منفرد و مصفوفة منفردة ثم بعد ذلك نُسند عنوان المصفوفة إلى المؤشر و بالتالي في هذه الحالة يمكننا تغيير عنوان المؤشر كيفما نشاء لأنه مستقل عن المصفوفة. أما عندما ندمج المؤشر مع المصفوفة في إعلان واحد, فلن يكون بإمكاننا تغيير عنوان المؤشر لأن البيانات ستكون مرتبطة فيما بينها و بالتالي لا يمكننا عزلها عن بعضها البعض.

    كمثال بسيط, المؤشر ptrArray يُشير إلى المصفوفة array التي تحوي 5 مؤشرات int :

    #include <stdio.h>
    
    int main() {
        int a = 1, b = 2, c = 3, d = 4, e = 5;
        int *p1 = &a, *p2 = &b, *p3 = &c, *p4 = &d, *p5 = &e;
    
        int *array[5] = {p1, p2, p3, p4, p5};
        int **ptrArray = array;
    
        for (int i = 0; i < 5; i++)
            printf("%d\t", **ptrArray++);
    
        return 0;
    }

    @مصطفى

    اقتباس
    هل كل ماذكرته صحيح ...

    صحيح إلى حد ما ! :)

    لأنه بتركك لــ typedef ستفقد العديد من المزايا خصوصا عند التعامل مع "البيانات المختلطة" أو "المؤشرات العائمة" ..

    تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 6 سبتمبر 2012 في 16:35 — السبب: Mise à jour

    #12

    تم منح النقاط للمشاركات المفيدة و حذف الردود الغير مفيدة, حفاظا على تنسيق الموضوع.

    يُغلق.

    أراكم في الجزء الرابع من الحلقة الثانية.

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

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