تمرين من المصدر الأصلي · تطبيق عملي

هذا الإصدار من ماريو

استخدم الشرح العربي للفهم، واعتمد صفحة CS50 الأصلية مرجعًا نهائيًا للمواصفات والتسليم.

جلسة دراسة مقترحة: حتى 60 دقيقةالجهد الكلي التقريبي: 120 دقيقة · أكمل من حيث توقفت لاحقًا.Week 1
محاور هذه الخطوة
  • C
  • المترجم
  • الأنواع
  • الدوال

ترجمة آلية تحت المراجعة

هذا الإصدار من ماريو

المصدر الأصلي

قائمة تنفيذ التمرين

تُحفظ علامات هذه القائمة على هذا الجهاز والمتصفح فقط. أنشئ حسابًا مفعّلًا لحفظ إنجاز التمرين في مسارك.

ماريو

محتوى خارجي من YouTube

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

فتح المصدر

مشكلة بحاجة إلى حل

قرب نهاية العالم 1-1 في Nintendo سوبر ماريو بروس.، يجب على ماريو أن يصعد إلى هرم الطوب المحاذي لليمين، كما هو موضح أدناه.

screenshot of Mario jumping up a right-aligned pyramid

في ملف يسمى mario.c في مجلد يسمى mario-less، قم بتنفيذ برنامج في لغة C يعيد إنشاء هذا الهرم باستخدام التجزئة (#) للطوب، كما في أدناه:

       #
      ##
     ###
    ####
   #####
  ######
 #######
########

لكن اطلب من المستخدم إجراء int للارتفاع الفعلي للهرم، بحيث يمكن للبرنامج أيضًا إخراج أهرامات أقصر كما هو موضح أدناه:

  #
 ##
###

أعد مطالبة المستخدم، مرارًا وتكرارًا حسب الحاجة، إذا لم تكن مدخلاته أكبر من 0 أو لا int تمامًا.

تلميحات
  • تذكر أنه يمكنك الحصول على int من مستخدم لديه get_int، والذي تم الإعلان عنه في cs50.h.
  • تذكر أنه يمكنك طباعة ملف string مع printf، والذي تم الإعلان عنه في stdio.h.

تجريبي

نصيحة

اكتب بعض الشيفرة التي تعلم أنه سيتم تجميعها

على الرغم من أن هذا البرنامج لن يفعل أي شيء، إلا أنه يجب على الأقل أن يترجم معه make!

#include <cs50.h>
#include <stdio.h>

int main(void)
{

}
اكتب بعض الشيفرة الزائفة قبل كتابة المزيد من الشيفرة

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

  1. اطلب من المستخدم معرفة ارتفاع الهرم
  2. اطبع هرمًا بهذا الارتفاع

لذا اكتب بعض الرموز الزائفة كتعليقات تذكرك بفعل ذلك:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Prompt the user for the pyramid's height

    // Print a pyramid of that height
}
تحويل الشيفرة الكاذب إلى كود

أولاً، فكر في كيفية مطالبة المستخدم بتحديد ارتفاع الهرم. يذكر أن أ تعتبر حلقة do while مفيدة عندما تريد القيام بشيء ما مرة واحدة على الأقل، وربما مرارًا وتكرارًا، كما هو موضح أدناه:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
}

ثانيًا، فكر في كيفية طباعة هرم بهذا الارتفاع، من الأعلى إلى الأسفل. لاحظ كيف أن الصف الأول يجب أن يحتوي على قالب طوب واحد، والصف الثاني يجب أن يحتوي على قالبين، وهكذا. من المحتمل أنك ستحتاج إلى حلقة، كما هو موضح أدناه، حتى لو لم تكن (حتى الآن!) متأكدًا مما يجب وضعه في تلك الحلقة. لذا أضف المزيد من الشيفرة شبه البرمجية كتعليق في الوقت الحالي:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
    for (int i = 0; i < n; i++)
    {
        // Print row of bricks
    }
}

كيف تتم طباعة هذا الصف من الطوب؟ حسنًا، ألن يكون رائعًا لو كانت هناك وظيفة تسمى print_row يمكنه فعل ذلك؟ لنفترض أن هناك:

#include <cs50.h>
#include <stdio.h>

void print_row(int bricks);

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
    for (int i = 0; i < n; i++)
    {
        // Print row of bricks
    }
}

void print_row(int bricks)
{
    // Print row of bricks
}

يمكننا بعد ذلك استدعاء هذه الوظيفة من mainكما في الأسفل:

#include <cs50.h>
#include <stdio.h>

void print_row(int bricks);

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
    for (int i = 0; i < n; i++)
    {
        // Print row of bricks
        print_row(i + 1);
    }
}

void print_row(int bricks)
{
    // Print row of bricks
}

لماذا i + 1، رغم ذلك؟

دعونا ننفذ الآن print_row:

#include <cs50.h>
#include <stdio.h>

void print_row(int bricks);

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
    for (int i = 0; i < n; i++)
    {
        // Print row of bricks
        print_row(i + 1);
    }
}

void print_row(int bricks)
{
    for (int i = 0; i < bricks; i++)
    {
        printf("#");
    }
    printf("\n");
}

لماذا \n في النهاية، رغم ذلك؟

لسوء الحظ، هذا الرمز يطبع هرمًا بمحاذاة إلى اليسار، لكنك تحتاج إلى هرم بمحاذاة إلى اليمين! ربما ينبغي علينا طباعة بعض المساحات الفارغة قبل بعض الطوب، لنقلها إلى اليمين؟ دعونا نتغير print_row على النحو التالي حتى يتمكن من طباعة كليهما:

#include <cs50.h>
#include <stdio.h>

void print_row(int spaces, int bricks);

int main(void)
{
    // Prompt the user for the pyramid's height
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1);

    // Print a pyramid of that height
    for (int i = 0; i < n; i++)
    {
        // Print row of bricks
    }
}

void print_row(int spaces, int bricks)
{
    // Print spaces

    // Print bricks
}

تبقى بعض الشيفرة شبه البرمجيةة الآن في كليهما main و print_row، حتى نترككم!

وفكر فيما إذا كان بإمكانك أخذ بعض الشيفرة في الاعتبار main إلى أ get_height تعمل أيضًا على إرجاع الدالة int أنت بحاجة إليه!

الإرشادات التفصيلية

محتوى خارجي من YouTube

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

فتح المصدر

كيفية الاختبار

هل يعمل الشيفرة الخاص بك كما هو محدد عند إدخالك:

  • -1 أو أرقام سلبية أخرى؟
  • 0?
  • 1 أو أرقام إيجابية أخرى؟
  • حروف أم كلمات؟
  • لا يوجد إدخال على الإطلاق، عندما تضغط على Enter فقط؟

صحة

check50 cs50/problems/2026/x/mario/less

النمط

style50 mario.c

كيفية الإرسال

في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك، والإجابة على المطالبات التي تظهر أيضًا.

submit50 cs50/problems/2026/x/mario/less

أنهيت التطبيق؟

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

حفظ إنجاز التمرين

يمكنك قراءة الدورة كاملة دون حساب. يصبح حفظ التقدم متاحًا بعد تفعيل الحساب، ويبقى محفوظًا بعد انتهاء العضوية.

العودة إلى جميع التمارين