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

في ملف يسمى 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)
{
}
اكتب بعض الشيفرة الزائفة قبل كتابة المزيد من الشيفرة
إذا لم تكن متأكدًا من كيفية حل المشكلة نفسها، فقم بتقسيمها إلى مشكلات أصغر ربما يمكنك حلها أولاً. على سبيل المثال، هذه المشكلة هي في الواقع مشكلتين:
- اطلب من المستخدم معرفة ارتفاع الهرم
- اطبع هرمًا بهذا الارتفاع
لذا اكتب بعض الرموز الزائفة كتعليقات تذكرك بفعل ذلك:
#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 أنت بحاجة إليه!
الإرشادات التفصيلية
لاحظ أن هذه الإرشادات تحدد أن برنامجك يجب أن يطالب المستخدم بارتفاع الهرم و إعادة- مطالبة إذا قام المستخدم بإدخال قيمة أقل من 1 أو أكبر من 8. تتطلب المواصفات فقط إعادة مطالبة المستخدم إذا قام بإدخال قيمة أقل من 1.
كيفية الاختبار
هل يعمل الشيفرة الخاص بك كما هو محدد عند إدخالك:
-
-1أو أرقام سلبية أخرى؟ -
0? -
1أو أرقام إيجابية أخرى؟ - حروف أم كلمات؟
- لا يوجد إدخال على الإطلاق، عندما تضغط على Enter فقط؟
صحة
check50 cs50/problems/2026/x/mario/less
النمط
style50 mario.c
كيفية الإرسال
في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك، والإجابة على المطالبات التي تظهر أيضًا.
submit50 cs50/problems/2026/x/mario/less