ahmed.o.mohamed

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

12 ردود في هذا الموضوع

السلام عليكم

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

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

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

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

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

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

كيف نعلن عن :

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

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

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[i]=new void[3];

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

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

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

    int*(*v)(int*,int)[4];
    for(int i=0;i<5;i++)
    v[i]=func;

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

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

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

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

محاولة 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[i] = new (int*(*)());

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

void *mf2[5];
for(int i =0; i < 5; i++)
mf2[i] = new (int*(*)(int*,int));

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

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

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

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

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

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

كيف نعلن عن :

  • مؤشر لمصفوفة مكونة من 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)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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[i] = func;

أو هكذا :

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

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

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

int* Func(int*, int)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

عندي سؤال .

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

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

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

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

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

تحياتي

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

لم أفهم حلك ... أنا لم أستعمل 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:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

  • مصفوفة مؤشرات مكونة من 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)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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;

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

شكراً لك ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

float *ptrArray = new float[3];

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

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

float f;
ptrArray[0] = f;

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

ptrArray[0] = &f;

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

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

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

تم تعديل بواسطه أحمد الشنقيطي
تنسيق المشاركة.
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

عكست الإثنين

أخي 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 ستفقد العديد من المزايا خصوصا عند التعامل مع "البيانات المختلطة" أو "المؤشرات العائمة" ..

تم تعديل بواسطه أحمد الشنقيطي
Mise à jour
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

يُغلق.

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .