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

مشكلة بحاجة إلى حل
في لعبة الخربشة، يقوم اللاعبون بإنشاء كلمات لتسجيل النقاط، وعدد النقاط هو مجموع قيم النقاط لكل حرف في الكلمة.
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 3 | 3 | 2 | 1 | 4 | 2 | 4 | 1 | 8 | 5 | 1 | 3 | 1 | 1 | 3 | 10 | 1 | 1 | 1 | 1 | 4 | 4 | 8 | 4 | 10 |
على سبيل المثال، إذا أردنا تسجيل كلمة "CODE"، فسنلاحظ أن "C" يستحق 3 نقاط، و"O" يستحق نقطة واحدة، و"D" يستحق نقطتين، و"E" يستحق نقطة واحدة. بجمع هذه النقاط، نحصل على أن "CODE" يساوي 7 نقاط.
في ملف يسمى scrabble.c في مجلد يسمى scrabble، قم بتنفيذ برنامج في لغة C يحدد الفائز في لعبة قصيرة تشبه لعبة Scrabble. يجب أن يطلب برنامجك الإدخال مرتين: مرة واحدة ليقوم "اللاعب 1" بإدخال كلمته ومرة واحدة ليقوم "اللاعب 2" بإدخال كلمته. بعد ذلك، اعتمادًا على اللاعب الذي يسجل أكبر عدد من النقاط، يجب أن يطبع برنامجك إما Player 1 wins!، أو Player 2 wins!، أو Tie! (في حالة حصول اللاعبين على نقاط متساوية).
تجريبي
نصائح وتلميحات
اكتب بعض الشيفرة التي تعلم أنه سيتم تجميعها
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
}
لاحظ أنك قمت الآن بتضمين بعض ملفات الرأس التي ستمنحك الوصول إلى الوظائف التي قد تساعدك في حل هذه المشكلة.
اكتب بعض الشيفرة الزائفة قبل كتابة المزيد من الشيفرة
إذا لم تكن متأكدًا من كيفية حل المشكلة نفسها، فقم بتقسيمها إلى مشكلات أصغر ربما يمكنك حلها أولاً. على سبيل المثال، هذه المشكلة ليست سوى عدد قليل من المشاكل:
- مطالبة المستخدم بكلمتين
- احسب نتيجة كل كلمة
- اطبع الفائز
دعنا نكتب بعض الأكواد الزائفة كتعليقات لتذكيرك بفعل ذلك:
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
// Prompt the user for two words
// Compute the score of each word
// Print the winner
}
قد تحتوي بعض المشكلات في مجموعات المشكلات، مثل هذه المشكلة، على حرق (مثل المشكلة التالية) والتي سترشدك في النهاية إلى الحل بأكمله. على الرغم من أنه يُسمح لك باستخدام هذا الرمز، إلا أننا نشجعك بشدة على تجربة الأشياء بنفسك أولاً! لن تحتوي المشكلات الأخرى في مجموعة المشكلات على هذا النوع من الإرشادات التفصيلية، وعادةً ما تكون المشكلة التي تحتوي على "الحرق الكامل" بمثابة نسخة تمهيدية للمشكلة الأكبر التي ستحتاج إلى معالجتها لاحقًا.
تحويل الشيفرة الكاذب إلى كود
أولاً، فكر في كيفية مطالبة المستخدم بكلمتين. أذكر ذلك get_string، إحدى الوظائف في مكتبة CS50، يمكنها مطالبة المستخدم بسلسلة.
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
// Prompt the user for two words
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Compute the score of each word
// Print the winner
}
فكر بعد ذلك في كيفية حساب نتيجة كل كلمة. نظرًا لأن خوارزمية التسجيل نفسها تنطبق على كلتا الكلمتين، فلديك فرصة جيدة لذلك التجريد. هنا سوف نحدد وظيفة تسمى compute_score يأخذ سلسلة تسمى word، كمدخل، ثم يعود wordنتيجة ك int.
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int compute_score(string word);
int main(void)
{
// Prompt the user for two words
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Compute the score of each word
int score1 = compute_score(word1);
int score2 = compute_score(word2);
// Print the winner
}
int compute_score(string word)
{
// Compute and return score for word
}
انتقل الآن إلى التنفيذ compute_score. لحساب نقاط الكلمة، عليك أن تعرف قيمة النقطة لكل حرف في الكلمة. يمكنك ربط الحروف وقيم نقاطها بـ مصفوفة. تخيل مجموعة من 26 intق، تم الاتصال به POINTS، حيث يكون الرقم الأول هو قيمة النقطة لـ "A"، والرقم الثاني هو قيمة النقطة لـ "B"، وهكذا. من خلال الإعلان عن مثل هذه المصفوفة وتهيئتها خارج أي دالة منفردة، يمكنك التأكد من إمكانية الوصول إلى هذه المصفوفة من قبل أي دالة، بما في ذلك compute_score.
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Points assigned to each letter of the alphabet
int POINTS[] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
int compute_score(string word);
int main(void)
{
// Prompt the user for two words
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Compute the score of each word
int score1 = compute_score(word1);
int score2 = compute_score(word2);
// Print the winner
}
int compute_score(string word)
{
// Compute and return score for word
}
للتنفيذ compute_score، حاول أولاً العثور على قيمة النقطة لحرف واحد word.
- تذكر أنه للعثور على الحرف الموجود في الفهرس
nلسلسلة ما،s، يمكنك الكتابةs[n]. هكذاword[0]، على سبيل المثال، سيعطيك الحرف الأول منword. - الآن، تذكر أن أجهزة الكمبيوتر تمثل الأحرف باستخدام ASCII، وهو معيار يمثل كل حرف كرقم.
- تذكر أيضًا أن الفهرس 0 لـ
POINTS,POINTS[0]، يمنحك قيمة النقطة 'A'. فكر في كيفية تحويل التمثيل الرقمي للحرف "A" إلى فهرس لقيمته النقطية. الآن، ماذا عن الحرف اللاتيني'a'؟ ستحتاج إلى تطبيق تحويلات مختلفة على الأحرف الكبيرة والصغيرة، حتى تتمكن من العثور على الوظائفisupperوislowerليكون مفيدًا لك. - ضع في اعتبارك أن الشخصيات الموجودة لا يجب إعطاء الحروف صفر نقطة. على سبيل المثال،
!يساوي 0 نقطة.
إذا كان بإمكانك حساب قيمة واحد حرف في word، من المحتمل أنه يمكنك استخدام حلقة لجمع نقاط بقية الشخصيات. بمجرد تجربة ما ورد أعلاه بنفسك، ضع في اعتبارك هذا التلميح (الكاشف تمامًا!) أدناه.
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Points assigned to each letter of the alphabet
int POINTS[] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
int compute_score(string word);
int main(void)
{
// Prompt the user for two words
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Compute the score of each word
int score1 = compute_score(word1);
int score2 = compute_score(word2);
// Print the winner
}
int compute_score(string word)
{
// Keep track of score
int score = 0;
// Compute score for each character
for (int i = 0, len = strlen(word); i < len; i++)
{
if (isupper(word[i]))
{
score += POINTS[word[i] - 'A'];
}
else if (islower(word[i]))
{
score += POINTS[word[i] - 'a'];
}
}
return score;
}
أخيرًا، أكمل الخطوة الأخيرة للرمز المستعار: طباعة الفائز. أذكر أن أ
يمكن استخدام عبارة if للتحقق مما إذا كان الشرط صحيحًا، وأن الاستخدام الإضافي لـ
يمكن لـ else if أو else التحقق من الشروط (الحصرية) الأخرى.
if (/* Player 1 wins */)
{
// ...
}
else if (/* Player 2 wins */)
{
// ...
}
else
{
// ...
}
وبمجرد تجربة ما ورد أعلاه، فلا تتردد في إلقاء نظرة خاطفة على التلميح (أو بالأحرى الحل الكامل!) أدناه.
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Points assigned to each letter of the alphabet
int POINTS[] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
int compute_score(string word);
int main(void)
{
// Prompt the user for two words
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Compute the score of each word
int score1 = compute_score(word1);
int score2 = compute_score(word2);
// Print the winner
if (score1 > score2)
{
printf("Player 1 wins!\n");
}
else if (score1 < score2)
{
printf("Player 2 wins!\n");
}
else
{
printf("Tie!\n");
}
}
int compute_score(string word)
{
// Keep track of score
int score = 0;
// Compute score for each character
for (int i = 0, len = strlen(word); i < len; i++)
{
if (isupper(word[i]))
{
score += POINTS[word[i] - 'A'];
}
else if (islower(word[i]))
{
score += POINTS[word[i] - 'a'];
}
}
return score;
}
كيفية الاختبار
يجب أن يتصرف برنامجك وفقًا للأمثلة أدناه.
$ ./scrabble
Player 1: Question?
Player 2: Question!
Tie!
$ ./scrabble
Player 1: red
Player 2: wheelbarrow
Player 2 wins!
$ ./scrabble
Player 1: COMPUTER
Player 2: science
Player 1 wins!
$ ./scrabble
Player 1: Scrabble
Player 2: wiNNeR
Player 1 wins!
صحة
check50 cs50/problems/2026/x/scrabble
النمط
style50 scrabble.c
كيفية الإرسال
في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك، والإجابة على المطالبات التي تظهر أيضًا.
submit50 cs50/problems/2026/x/scrabble