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

مشكلة بحاجة إلى حل
بطاقة الائتمان (أو الخصم) هي بالطبع بطاقة بلاستيكية يمكنك من خلالها الدفع مقابل السلع والخدمات. يُطبع على تلك البطاقة رقم يتم تخزينه أيضًا في قاعدة بيانات في مكان ما، بحيث عندما يتم استخدام بطاقتك لشراء شيء ما، يعرف الدائن من سيصدر فاتورة. هناك الكثير من الأشخاص الذين لديهم بطاقات ائتمان في هذا العالم، لذا فإن هذه الأرقام طويلة جدًا: تستخدم American Express أرقامًا مكونة من 15 رقمًا، وتستخدم MasterCard أرقامًا مكونة من 16 رقمًا، وتستخدم Visa أرقامًا مكونة من 13 و16 رقمًا. وهذه أرقام عشرية (من 0 إلى 9)، وليست أرقامًا ثنائية، مما يعني، على سبيل المثال، أن أمريكان إكسبريس يمكنها طباعة ما يصل إلى 10^15 = 1,000,000,000,000,000 بطاقة فريدة! (هذا، أم، كوادريليون.)
في الواقع، هذا شيء من المبالغة، لأن أرقام بطاقات الائتمان لها في الواقع بعض البنية الخاصة بها. تبدأ جميع أرقام أمريكان إكسبريس بالرقم 34 أو 37؛ تبدأ معظم أرقام MasterCard بالأرقام 51 أو 52 أو 53 أو 54 أو 55 (لديهم أيضًا بعض أرقام البداية المحتملة الأخرى التي لن نهتم بها في هذه المشكلة)؛ وتبدأ جميع أرقام Visa بالرقم 4. لكن أرقام بطاقات الائتمان تحتوي أيضًا على "المجموع الاختباري" المدمج فيها، وهي علاقة رياضية بين رقم واحد على الأقل وأرقام أخرى. يمكّن هذا المجموع الاختباري أجهزة الكمبيوتر (أو البشر الذين يحبون الرياضيات) من اكتشاف الأخطاء المطبعية (e.g.، عمليات النقل)، إن لم تكن الأرقام الاحتيالية، دون الحاجة إلى الاستعلام عن قاعدة بيانات، وهو الأمر الذي قد يكون بطيئًا. بالطبع، يمكن لعالم رياضيات غير أمين أن يصنع رقمًا مزيفًا يحترم مع ذلك القيد الرياضي، لذلك لا يزال البحث في قاعدة البيانات ضروريًا لإجراء فحوصات أكثر صرامة.
في ملف يسمى credit.c في مجلد يسمى credit، قم بتنفيذ برنامج في لغة C للتحقق من صحة رقم بطاقة الائتمان المحددة.
خوارزمية لوهن
إذن ما هي الصيغة السرية؟ حسنًا، تستخدم معظم البطاقات خوارزمية اخترعها هانز بيتر لون من شركة IBM. وفقًا لخوارزمية Luhn، يمكنك تحديد ما إذا كان رقم بطاقة الائتمان صالحًا (نحويًا) على النحو التالي:
- اضرب كل رقم آخر في 2، بدءًا من الرقم الثاني إلى الأخير، ثم قم بإضافة أرقام تلك المنتجات معًا.
- أضف المجموع إلى مجموع الأرقام التي لم يتم ضربها في 2.
- إذا كان الرقم الأخير للمجموع هو 0 (أو، بشكل أكثر رسمية، إذا كان المجموع 10 متطابقًا مع 0)، فإن الرقم صالح!
هذا أمر محير نوعًا ما، لذا دعونا نجرب مثالاً مع David’s Visa: 4003600000000014.
-
من أجل المناقشة، دعونا أولاً نضع خطًا تحت كل رقم آخر، بدءًا من الرقم الثاني إلى الأخير من الرقم:
4003600000000014
حسنًا، فلنضرب كل رقم من الأرقام التي تحتها خط في 2:
1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2
وهذا يعطينا:
2 + 0 + 0 + 0 + 0 + 12 + 0 + 8
الآن دعونا نضيف أرقام هذه المنتجات (i.e.، وليس المنتجات نفسها) معًا:
2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13
-
الآن دعونا نضيف هذا المجموع (13) إلى مجموع الأرقام التي لم يتم ضربها في 2 (بدءًا من النهاية):
13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20
-
نعم، الرقم الأخير في هذا المجموع (20) هو 0، لذا فإن بطاقة ديفيد شرعية!
لذلك، التحقق من صحة أرقام بطاقات الائتمان ليس بالأمر الصعب، ولكنه يصبح مملاً بعض الشيء يدويًا. دعونا نكتب البرنامج.
تفاصيل التنفيذ
في الملف المسمى credit.c في
دليل credit ، اكتب برنامجًا يطالب المستخدم برقم بطاقة الائتمان ثم يقوم بالإبلاغ (عبر printf) سواء كان رقم بطاقة American Express أو MasterCard أو Visa صالحًا، وفقًا لتعريفات تنسيق كل منها هنا. حتى نتمكن من أتمتة بعض اختبارات الشيفرة الخاصة بك، نطلب أن يكون السطر الأخير من إخراج البرنامج الخاص بك AMEX\n أو MASTERCARD\n أو VISA\n أو INVALID\nلا أكثر ولا أقل. من أجل التبسيط، قد تفترض أن إدخال المستخدم سيكون رقميًا بالكامل (i.e.، خاليًا من الواصلات، كما قد تتم طباعته على بطاقة فعلية) وأنه لن يحتوي على أصفار بادئة. ولكن لا تفترض أن مدخلات المستخدم سوف تتناسب مع int! الأفضل للاستخدام get_long من مكتبة CS50 للحصول على مدخلات المستخدمين. (لماذا؟)
ضع في اعتبارك الممثل أدناه لكيفية تصرف برنامجك عند تمرير رقم بطاقة ائتمان صالح (بدون واصلات).
$ ./credit
Number: 4003600000000014
VISA
الآن، get_long نفسه سوف يرفض الواصلات (والمزيد) على أي حال:
$ ./credit
Number: 4003-6000-0000-0014
Number: foo
Number: 4003600000000014
VISA
ولكن الأمر متروك لك لالتقاط المدخلات التي ليست أرقام بطاقة الائتمان (e.g.، رقم هاتف)، حتى لو كانت رقمية:
$ ./credit
Number: 6176292929
INVALID
اختبر برنامجك باستخدام مجموعة كاملة من المدخلات، الصالحة منها وغير الصالحة. (سنفعل ذلك بالتأكيد!) إليكم أ أرقام بطاقات قليلة الذي توصي PayPal باختباره.
إذا كان برنامجك يتصرف بشكل غير صحيح مع بعض المدخلات (أو لم يتم تجميعه على الإطلاق)، فقد حان الوقت لتصحيح الأخطاء!
الإرشادات التفصيلية
كيفية اختبار الشيفرة الخاص بك
يمكنك أيضًا تنفيذ ما يلي لتقييم صحة الشيفرة الخاصة بك باستخدام check50. ولكن تأكد من تجميعها واختبارها بنفسك أيضًا!
check50 cs50/problems/2026/x/credit
قم بتنفيذ ما يلي لتقييم نمط الشيفرة الذي تستخدمه style50.
style50 credit.c
كيفية الإرسال
في جهازك الطرفي، قم بتنفيذ ما يلي لإرسال عملك.
submit50 cs50/problems/2026/x/credit