JavaRush /مدونة جافا /Random-AR /Harvard CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و6)
Masha
مستوى

Harvard CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و6)

نشرت في المجموعة
واجبات cs50 للمحاضرتين 5 و 6 محاضرات CS50 موجودة هنا: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . تحتوي هذه المادة على 3 مهام ومعلومات نظرية عنها ودليل للعمل.

الأهداف

• تعمق في الوظائف والمكتبات. • تعرف على التشفير، وقم بتنفيذ بعض الأصفار البسيطة

مواد إضافية

https://reference.cs50.net/ - شرح وظائف المكتبة المستخدمة أثناء التدريب. باللغة الإنجليزية. http://computer.howstuffworks.com/c.htm الصفحات 11 – 14 و 39

تحضير

قم بتسجيل الدخول إلى cs50.io update50 للتأكد من تحديث إصدار مساحة العمل لديك. إذا قمت بإغلاق نافذة الوحدة الطرفية عن طريق الخطأ، فانتقل إلى القائمة "عرض" وتأكد من وجود علامة اختيار بجوار عنصر وحدة التحكم (حددها إذا لم تكن كذلك). هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 1 انقر على (+)، داخل الدائرة الخضراء الموجودة في إطار نافذة الوحدة الطرفية، حدد New Terminal . هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 2 إنشاء دليل عمل: mkdir ~/workspace/pset2 لاحظ أن هناك مسافة بين mkdir و ~/workspace/pset2 . للتلخيص، ~ يعني الدليل الجذر، ~/workspace هو مجلد يسمى مساحة العمل داخل الدليل الجذر، ~/workspace/pset2 هو دليل يسمى pset2 داخل ~/workspace . قم بتشغيل الآن: cd ~/workspace/pset2 للتغيير إلى الدليل الجديد. يبدو سطر الأوامر كما يلي: username:~/workspace/pset2 $ إذا حدث أي خطأ، كرر الخطوات. يمكنك أيضًا استدعاء أمر history لعرض الأوامر القليلة الأخيرة بالترتيب الزمني. يمكنك أيضًا وضع المؤشر على سطر الأوامر والضغط على السهم لأعلى على لوحة المفاتيح لعرض جميع الأوامر بالترتيب من آخر إدخال إلى الأول. باستخدام الزر السفلي يمكنك العودة. بالمناسبة، بدلاً من كتابة نفس الأوامر في كل مرة، يمكنك التمرير عبر الأوامر التي كتبتها بالفعل وتنفيذها مرة أخرى بالضغط على Enter. ربما لاحظت أن ديفيد يفعل هذا بالضبط في محاضراته. يجب حفظ مهام الأسبوع الثاني في pset2 .

المهمة 0. التهيئة

دعونا نلقي نظرة فاحصة على الخطوط. في الملف الأولي.c ، اكتب برنامجًا يطلب اسم المستخدم (باستخدام وظيفة GetString نحصل على الاسم كسلسلة) ثم يعرض الأحرف الأولى من الاسم الأول (أو الأسماء) واسم العائلة بأحرف كبيرة بدون مسافات، فترات أو أحرف أخرى، فقط مع تغذية السطر ( \n ). نحن نفترض أن المستخدمين يدخلون الحروف فقط (أحرف صغيرة أو كبيرة أو كليهما) بالإضافة إلى مسافة واحدة بين الكلمات. ضع في اعتبارك أن الأشخاص الذين يُدعى جوزيف جوردون ليفيت أو كونان أوبراين أو ديفيد جي مالان لن يستخدموا البرنامج. للتحقق من التشغيل الصحيح للبرنامج، اتصل بـ check50: هل تريد اللعب بتنفيذ البرنامج الذي أعده موظفو CS50؟ اكتب السطر: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
التشفير
التشفير، علم تشفير وفك رموز المعلومات... في الواقع، الرسائل المشفرة موجودة منذ القدم، وكانت تستخدمها الجيوش لنقل الرسائل السرية. حسنًا، يتم الآن تخزين كلمات المرور الخاصة بك على Facebook والشبكات الأخرى بشكل مشفر.

المهمة 1. السلام عليك يا قيصر!

المعلومات النظرية
سوف ندرس واحدة من أبسط الأصفار - تشفير قيصر، الذي سمي على اسم الإمبراطور الروماني. في هذه التشفيرة، يتم استبدال كل حرف من النص بحرف آخر، وهو عدد ثابت من الحروف الأقل في الأبجدية. ويسمى هذا العدد الثابت من الحروف بالمفتاح . لذلك، المفتاح 1 يحول الحرف اللاتيني C إلى الحرف D، وZ خلال الدورة إلى A. إذا كان المفتاح 3، فإن الحرف C سيتحول إلى F، وZ إلى C. أمثلة: نستخدم تشفير قيصر مع مفتاح 5 على كلمة القط. c -> h a -> f t -> y Caesar (cat, 5) = hfy المفتاح = 7، الكلمة = الكمبيوتر c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 3 تشفير قيصر بسيط، ولكن، للأسف، غير موثوق به (هذه أشياء مترابطة!): بالنسبة للأبجدية الإنجليزية، لا يوجد سوى 25 خيار تشفير، ومن السهل المرور عبر جميع الخيارات حتى بدون جهاز كمبيوتر. ومع ذلك، غالبًا ما يتم استخدام تشفير قيصر كخطوة في تشفيرات أخرى، مثل تشفير فيجينير (المزيد حول ذلك في الفقرة التالية). دعونا "نحسب" تشفير قيصر. دعنا نشير إلى النص العادي بالحرف p، pi هو الحرف الموجود في النص p الموجود في الموضع رقم i. دعنا نسمي حرف المفتاح السري k، وc بالنص المشفر، وci بالحرف الموجود في النص المشفر الموجود في الموضع i. ثم يمكنك حساب كل حرف من التشفير باستخدام الصيغة: ci = (pi + k) % 26 التعود على هذا التشكيل، فهو يسمح لك ببرمجة الخوارزمية والتعبير عن معنى التشفير بدقة وإيجاز. إذا كان المفتاح k = 13 والنص الأصلي p هو "تأكد من شرب أوفالتينك!"، فهذا هو التشفير الذي حصلنا عليه: Or fher gb qevax lbhe Binygvar! لاحظ أن O (الحرف الأول في النص المشفر) تم إزاحته 13 موضعًا من الحرف B (الحرف الأول في النص المشفر). الحرف الأول في النص الأصلي). نفس الشيء مع الحرف r (الحرف الثاني في التشفير) تم إزاحته 13 حرفًا من e (الحرف الثاني في الأصل). الحرف الثالث في التشفير، f، تم إزاحته بمقدار 13 حرفًا من s (الثالث في الأصل)، هنا نتحرك في دائرة من z إلى a. تشفير قيصر ذو المفتاح 13 له اسم خاص ROT13 . إنه متماثل: بتطبيقه مرتين نعود إلى النص الأصلي. بالطبع، هناك أيضًا ROT26، وهذا آمن للغاية بشكل عام، ولكن فقط إذا لم تعبر عن أفكارك بوضوح =).
حالة
اكتب في الملف caesar.c برنامج يقوم بتشفير النص باستخدام تشفير قيصر. قم بتوفير وسيطة سطر أوامر واحدة كمدخل للبرنامج: عدد صحيح غير سالب. للتبسيط، دعونا نسميها ك. إذا قام المستخدم بتنفيذ البرنامج بدون وسيطات سطر الأوامر أو باستخدام أكثر من وسيطة واحدة، فيجب على التطبيق تقديم شكوى وإرجاع القيمة 1 (هذه هي الطريقة التي يتم بها الإشارة إلى الأخطاء عادةً): return 1; في جميع الحالات الأخرى، يطالب البرنامج المستخدم بالنص للتشفير، ثم يعرض النص المشفر باستخدام المفتاح k (أي، تم نقل مواضع k إلى اليمين على طول الدورة). إذا كان النص يحتوي على أحرف خارج الأبجدية الإنجليزية، فإن البرنامج لا يغيرها. بعد طباعة النص المشفر، يخرج التطبيق، ويعود main 0: return 0; إذا لم يُرجع main الصفر بشكل صريح، فإنه يُرجعه تلقائيًا (int هو في الواقع نوع الإرجاع الرئيسي، ولكن المزيد عن ذلك في وقت آخر). وفقًا للاتفاقية (قواعد الشكل الجيد في البرمجة)، إذا قمت بإرجاع 1 بشكل صريح للإشارة إلى خطأ، فيجب عليك أيضًا إرجاع 0 كمؤشر إلى إكمال البرنامج بنجاح. على الرغم من أن هناك 26 حرفًا فقط في الأبجدية الإنجليزية، إلا أن k يمكن أن يكون أكبر من 26. بشكل أساسي، سيعطي المفتاح k = 27 نفس نتيجة k = 1، ولكن عليك السماح للمستخدم بإدخال أي رقم غير سالب ليس تتجاوز 2^31 – 26 (يجب أن تتناسب مع int). ويجب أن يأخذ البرنامج في الاعتبار أيضًا أن الأحرف الصغيرة يتم تشفيرها بأحرف صغيرة، والأحرف الكبيرة يتم تشفيرها بأحرف كبيرة. من اين نبدأ؟ نظرًا لأن التطبيق يجب أن يقبل قيمة k مباشرة في سلسلة الوسائط، فإن رأس الوظيفة الرئيسية لدينا يبدو كما يلي: int main(int argc, string argv[]) من الفصل السادس، تعلم أن argv عبارة عن مصفوفة من السلاسل. يمكن اعتبار المصفوفة بمثابة صف من الخزائن في صالة الألعاب الرياضية. كل واحد منهم لديه بعض المعنى المخفي. في حالتنا، يوجد داخل كل خلية وسيطة مثل string لفتح الخزانة الأولى، نستخدم argv[0]، والثانية - argv[1]، وهكذا. إذا كان لدينا أقفال n، فنحن بحاجة إلى التوقف عند argv[n - 1]، نظرًا لأن argv[n] لم يعد موجودًا (أو موجودًا، ولكنه ينتمي إلى شخص آخر، فمن الأفضل عدم لمسه). حتى تتمكن من الوصول إلى الوسيطة k مثل هذا: string k = argv[1]; ونحن نعتقد أن هناك حقا شيء هناك! تذكر أن argc هو متغير int يساوي عدد الصفوف في argv. هذا يعني أنه من الأفضل التحقق من قيمة argc قبل محاولة فتح الخلية، لأنه قد يتبين أنها غير موجودة. من الناحية المثالية argc = 2. لماذا يحدث هذا؟ عادةً ما يكون داخل argv[0] اسم البرنامج. وهذا يعني أن argc دائمًا ما يكون على الأقل 1. لكن برنامجنا يحتاج إلى المستخدم لتوفير وسيطة سطر الأوامر k، وبالتالي، argc = 2. وبطبيعة الحال، إذا أدخل المستخدم أكثر من وسيطة واحدة في سطر الأوامر، فإن argc ينمو أيضًا ويمكنه تكون أكبر من 2 إذا أدخل المستخدم عددًا صحيحًا في سلسلة، فهذا لا يعني أنه سيتم تخزين القيمة المدخلة تلقائيًا كقيمة int. بتعبير أدق، لن يحدث ذلك. ستكون سلسلة، حتى لو كانت تبدو تمامًا مثل int! لذلك نحن بحاجة إلى تحويل السلسلة إلى int بأنفسنا. لحسن الحظ، هناك وظيفة تسمى أتوي مصممة لهذا الغرض. بناء الجملة الخاص به هو: int k = atoi(argv[1]); لاحظ أن k من النوع int، لذا يمكنك إجراء العمليات الحسابية به. باستخدام هذه الوظيفة، لا داعي للقلق بشأن ما إذا كان المستخدم قد أدخل عددًا صحيحًا أو، على سبيل المثال، foo: في هذه الحالة، ستُرجع atoi 0. تم الإعلان عن وظيفة atoi في مكتبة stdlib.h ، لذا تأكد من # إدراجه في بداية البرنامج. سيتم تجميع الكود بدون ذلك، نظرًا لأننا قمنا بالفعل بتضمين هذه الوظيفة في مكتبة cs50.h. ومع ذلك، فمن الأفضل أن تثق في المكتبات المحلية. لقد قمت بتخزين k كـ int. الآن دعونا نطلب إدخال النص. إذا قمت بمهام الأسبوع الأول، فأنت بالفعل على دراية بوظيفة مكتبة CS50 التي تسمى GetString. سوف تساعدنا. بعد أن تلقيت k والنص الأولي، فلنبدأ بالتشفير. للتلخيص، يمكنك تكرار جميع أحرف السلسلة وطباعتها باستخدام الحلقة التالية: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } بمعنى آخر، تمامًا كما أن argv عبارة عن مصفوفة من السلاسل، فإن السلسلة عبارة عن مصفوفة من الأحرف. لذلك، يمكننا استخدام الأقواس المربعة للوصول إلى عناصر السلسلة الفردية بنفس طريقة الحصول على سلاسل فردية في argv. بالطبع، لا يوجد شيء تشفيري فيما يتعلق بطباعة كل حرف. أو، من الناحية الفنية، عندما يكون k = 0. ولكن يجب علينا مساعدة قيصر على تشفير النص الخاص به! يحيى القيصر! لاستخدام strlen، تحتاج إلى تضمين مكتبة أخرى . نظرًا لأننا نقوم بأتمتة بعض اختبارات التحقق من الصحة، فيجب أن يتصرف البرنامج تمامًا كما يلي: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! بالإضافة إلى atoi ، يمكنك العثور على وظائف رائعة أخرى في مكتبات ctype.h و stdlib.h . للقيام بذلك، اتبع الرابط وابحث هناك قليلاً. على سبيل المثال، من الواضح أن isdigit شيء مثير للاهتمام =). عند الانتقال من Z إلى A (أو من z إلى a)، لا تنس عامل التشغيل %في لغة C. ادرس الجدول أيضًا ، فهو يعرض أحرف ASCII ليس للأحرف فقط. للتأكد من أن البرنامج يعمل بشكل صحيح مع check50 ، قم بما يلي: check50 2015.fall.pset2.caesar caesar.c وإذا كنت مهتمًا باللعب بالكود الذي أنشأه موظفو CS50، فقم بتشغيل الأمر: ~cs50/pset2/caesar بالمناسبة، uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
تحليل المهمة
  1. الحصول على المفتاح
  2. الحصول على النص
  3. تشفير
  4. عرض رسالة مشفرة
1. نقوم بتشكيل الوظيفة الرئيسية بحيث يقوم المستخدم بإدخال المفتاح في سطر الأوامر والتحقق من صحة المفتاح. int main(int argc, string argv[]) argc: • int • عدد الوسائط التي تم إدخالها في سطر الأوامر • إذا كان argc = 2 فكل شيء على ما يرام. إذا لم يكن الأمر كذلك، فاطبع التعليمات وأغلق البرنامج. • إذا كان argc = 2، فإننا نتحقق مما إذا كان المفتاح عددًا صحيحًا. • Argv عبارة عن مصفوفة من السلاسل، وقائمة تحتوي على وسائط تم إدخالها فيها. المصفوفة عبارة عن بنية بيانات تحتوي على بيانات مختلفة من نفس النوع في خلايا مختلفة. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 4 على سبيل المثال، أدخل المستخدم سلسلة إطلاق Team Rocket، ثم: هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 5 باستخدام الدالة atoi()، نقوم بتحويل الرقم الناتج إلى عدد صحيح. إذا لم يكن ذلك ممكنًا، فسترجع الدالة 0. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 6 2. اطلب من المستخدم إرسال نص. الأمر بسيط: كل ما يدخله المستخدم هو سلسلة. 3. التشفير. الخوارزمية بسيطة، ولكن كيف يمكنك أن تشرح للكمبيوتر الحروف التي تأتي واحدة تلو الأخرى؟ حان الوقت لتذكر جدول ASCII! هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 7 ومع ذلك، يمكن أن يكون هناك أكثر من مجرد أحرف في السلسلة... قبل الانتقال إلى تغيير السلاسل، تخيل أنك تحتاج إلى تغيير حرف واحد فقط. نريد تغيير الحروف من النص الأولي، وليس العلامات أو الأرقام. ماذا علينا ان نفعل؟ نحتاج أولاً إلى التحقق مما إذا كان هذا الحرف موجودًا في الأبجدية. يمكن القيام بذلك باستخدام الدالة isalpha() . إذا كان الحرف بالأبجدية، فستُرجع هذه الدالة الصواب والخطأ بخلاف ذلك. هناك وظيفتان مفيدتان أخريان - isupper () و islower () تُرجعان صحيحًا إذا كان الحرف كبيرًا أو صغيرًا، على التوالي. وبالتالي: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true إذا عادت isalpha إلى القيمة true، فنحن بحاجة إلى تغيير هذا الحرف باستخدام المفتاح. دعونا نفكر ونحلل كمثال برنامج الزاميلي، مساعد CS50. قد تتساءل لماذا يعتبر "A" عددًا صحيحًا عندما يكون حرفًا واضحًا. اتضح أن الرموز والأعداد الصحيحة قابلة للتبديل. من خلال وضع الحرف A بين علامتي اقتباس مفردتين، يمكنك الحصول على رمز ASCII الخاص به بتنسيق int. كن حذرًا: أنت بحاجة إلى علامات الاقتباس المفردة، وبدونها، سيبحث المترجم عن متغير اسمه A، وليس عن رمز. ثم نضيف في السطر قيمة المفتاح إلى رمز ASCII للحرف ونخزنها في متغير عدد صحيح. حتى لو كانت النتيجة int، فإن عبارة printf تستخدم العنصر النائب %c للأحرف. لذلك يقوم البرنامج بطباعة الحرف المرتبط بنتيجة العدد الصحيح. في الحالة الثانية، نقوم بعرض الرقم باستخدام العنصر النائب %d. يمكنك إدخال هذا الرمز في cs50 IDE واللعب به. دعونا نتحقق من كيفية عمل asciimath لمفاتيح مختلفة. لنأخذ القيمة 25، سنرى الصورة التالية: والآن ليكن المفتاح 26: حصلنا على [، وليس الحرف A على الإطلاق، إنه مجرد حرف ASCII التالي بعد Z. لذا فإن إضافة المفتاح ببساطة لن عمل. نحتاج إلى استخدام صيغة تشفير للعودة إلى بداية الأبجدية بمجرد نفاد الحروف. تذكر أننا كتبنا بالفعل أعلاه: /* * asciimath.c * by Zamyla Chan * * Calculates the addition of a char and an integer, * and displays both the resultant character and its * ASCII value. * * Usage: ./asciimath key [char] * */ #include #include #include int main(int argc, string argv[]) { if (argc != 2) { printf("print the key next time \n"); return 1; } // key is the second command line argument int key = atoi(argv[1]); //преобразование строки в int int letter = 'A'; printf("\nCalculating '%c' + %d...\n", letter, key); int result = (letter + key); printf("The ASCII value of %c is %d.\n\n", result, result); return 0; } int result = (letter + key);هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 8هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 9ci = (pi + k) % 26 حيث ci هو الحرف رقم i في النص المشفر، وpi هو الحرف رقم i في النص العادي، وk هو المفتاح، و%26 هو باقي القسمة على 26 (أو "modulo 26"). دعونا نطبق هذه الصيغة على الحرف Y. خذ k = 2. احسب ('Y' + 2) %26 رمز ASCII للحرف 'Y' = 89. ثم ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 ولكن هذه ليست قيمة ASCII للحرف A التي نحتاجها، وهي 65. الآن دعونا نعطي كل حرف من الحروف الأبجدية قيمة من 0 إلى 25 بالترتيب. في هذه الحالة، Y = 24. (24+2)%26 = 0 يحتوي الحرف A على مثل هذا الفهرس. وبالتالي، تشير هذه الصيغة إلى الفهرس الأبجدي للأحرف، وليس إلى قيم ASCII الخاصة بها. لطباعة حرف مشفر، ستحتاج إلى قيمة ASCII الخاصة به. واكتشف كيفية التبديل بين قيمة ASCII ورقم في الأبجدية. بمجرد أن نكتشف صيغة حرف واحد، نحتاج إلى تطبيقها على كل حرف في السلسلة المدخلة من لوحة المفاتيح. ولكن فقط إذا كانت هذه رسائل! وتذكر أن الحروف الكبيرة والأحرف الصغيرة تتطلب معاني مختلفة. هذا هو المكان الذي تصبح فيه الوظائف العلوية والسفلية مفيدة. قد يكون لديك صيغتان، إحداهما للأحرف الكبيرة والأخرى للأحرف الصغيرة، وستساعدك الوظائف في اختيار الصيغة التي تريد تطبيقها. كيفية تطبيق صيغة على كل حرف في سلسلة؟ تذكر أن السلسلة هي مجرد مجموعة من الأحرف. ستساعدك الدالة strlen (طول السلسلة) في تحديد عدد التكرارات في الحلقة.هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 10

المهمة 2. Parlez-vous français؟

نظرية
تعد تشفير Vigenère أكثر أمانًا إلى حد ما من تشفير Caesar: فهي تستخدم كلمة كمفتاح ويصعب فكها يدويًا باستخدام تحليل التردد أو القوة الغاشمة وحدها. كل حرف من المفتاح يولد رقما، ونتيجة لذلك نحصل على عدة مفاتيح لتحويل الحروف. مثال: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 11 إذا كان عدد الحروف في الرسالة غير قابل للقسمة على المفتاح، فإننا نستخدم جزءًا منه فقط في التطبيق الأخير للمفتاح: هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 12 للعثور على قيمة الإزاحة، نستخدم مواضع كل حرف من مفتاحنا المقدد في الأبجدية (من الألف إلى الياء). نحن نعد من الصفر، مثل المبرمجين الحقيقيين. ويتم إزاحة كل حرف في النص الأصلي برقم معين، كما هو الحال في تشفير قيصر، مع العودة، إذا لزم الأمر، بعد Z إلى بداية الأبجدية. وبالتالي فإن M سوف يتحرك بمقدار 1، والأول e لن يتحرك على الإطلاق، والثاني سيتحرك بمقدار موضعين. أدناه ترى الرسالة الأصلية والمفتاح المكتوب ونتيجة تطبيقه. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 13 إن تشفير Vigenère أقوى بالطبع، ولكن إذا كنت تعرف طول المفتاح، فمن السهل جدًا كسره. كيفية التعرف عليه؟ إذا كان النص الأصلي طويلًا بما يكفي بحيث تظهر بعض الكلمات عدة مرات فيه، فسترى بعض التكرار: يمكنك هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 14 أيضًا استخدام القوة الغاشمة، ولكن هناك العديد من الخيارات: 26^n – 1 حيث n هو طول المفتاح غير المعروف . ولكن عادة ما يكون هذا كثيرًا. صحيح أن هذه ليست مشكلة للكمبيوتر. والآن رياضيات التشفير: دع p يكون بعض النص، k هو الكلمة الأساسية، kj هو الحرف j من المفتاح، pi هو الحرف رقم i في النص الأصلي، ci هو الحرف i رقم في التشفير . ثم: ci = (pi + kj) % 26
يمارس
الحالة اكتب برنامج vigenere.c الذي يقوم بتشفير الرسالة باستخدام تشفير Vigenere. نقوم بتوفير وسيطة سطر أوامر واحدة لإدخال البرنامج: الكلمة الأساسية k، والتي تتكون من حروف الأبجدية الإنجليزية. إذا تم تشغيل التطبيق باستخدام أكثر من وسيطة واحدة أو باستخدام وسيطة غير مضمنة في الأبجدية، فمن الضروري عرض معلومات الخطأ وإنهاء البرنامج. وهذا هو، سيعود Main 1 - في هذه الحالة، ستفهم اختباراتنا التلقائية أن كل شيء على ما يرام هنا، ويتم أخذ هذا الشرط في الاعتبار. إذا كان كل شيء على ما يرام، فيجب أن يستمر البرنامج في طلب سلسلة نصية p، والتي نقوم بتشفيرها باستخدام المفتاح k الذي تم الحصول عليه أعلاه، وطباعة النتيجة وإكمال البرنامج، وإرجاع القيمة 0. توضيح من الضروري التأكد من ذلك في المفتاح k يتم تعيين الأحرف A وa كـ 0، وB وb كـ 1، ... وZ وz كـ 25. يجب أن يطبق البرنامج تشفير Vigenère فقط على أحرف النص p. يجب إخراج الأحرف المتبقية (الأرقام وعلامات الترقيم والمسافات) دون تغيير. إذا كانت الخوارزمية ستقوم بتطبيق الحرف jth k على الحرف i p غير الموجود في الأبجدية، فقم بتطبيق الحرف الرئيسي j على الحرف الأبجدي التالي في النص؛ لا يمكنك تركها والانتقال إلى حرف آخر في k. وأخيرا، يجب أن يحافظ البرنامج على حالة كل حرف في p .
لا أعرف من أين تبدأ؟
هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و6) - 15
فيما يلي بعض النصائح من Zamilya، مساعد دورة CS50
ولحسن الحظ، فإن البرنامج يشبه إلى حد كبير تشفير قيصر، فقط المفتاح عبارة عن سلسلة وليس عددًا صحيحًا. إذا نجحت في تنفيذ تشفير اسم الحاكم الروماني، فقد تكون هذه بداية رائعة للمهمة الثانية. ربما تكون قد أدركت بالفعل أن تشفير Vigenère الذي يتكون من حرف واحد كمفتاح هو نفس تشفير قيصر. تستخدم خوارزمية Vigenère نفس خطوات قيصر:
  1. الحصول على المفتاح
    • كلمة الكود هي وسيطة سطر الأوامر الثانية argv[1]
    • يجب أن يكون بالأبجدية: دالة isalpha
  2. الحصول على النص
  3. تشفير
  4. طباعة النص المشفر
لذلك، دعونا نتحقق من وسيطة سطر الأوامر الثانية argv[1] لمعرفة ما إذا كانت تنتمي إلى أحرف أبجدية. نحن نفعل هذا باستخدام isalpha المألوف بالفعل . إذا كان المفتاح صحيحًا، فإننا نتلقى سلسلة من المستخدم ونبدأ بالتشفير. تشبه صيغة تشفير Vigenère صيغة تشفير قيصر. كيف يمكنك تحويل حرف إلى إزاحة التشفير المقابلة؟ حاول مقارنة القيم باستخدام جدول ASCII. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و6) - 16 على الأرجح، ستتمكن من العثور على نمط بين الحروف ومؤشراتها الأبجدية باستخدام التسلسل الموجود في الجدول. هل اكتشفت كيفية طرح حرف من حرف آخر للحصول على النتيجة المرجوة؟ إزاحات الأحرف الكبيرة والصغيرة هي نفسها، لذا سيتعين عليك تحديد صيغتين متشابهتين لتحديد إزاحة الأحرف الصغيرة وبشكل منفصل للأحرف الكبيرة. تذكر أيضًا أن حلقة النص يجب أن تتجاهل الأحرف غير الإنجليزية. ولا تنسى أن تحافظ على حالة الحروف. إذا نظرت إلى صيغة التشفير: ci = (pi + kj) % 26 سترى متغيرين للمؤشر، i وj. أحدهما يحفظ الموضع في النص المصدر، والآخر في المفتاح. إذا كان النص أطول من المفتاح، فسينتقل الفهرس الموجود على المفتاح من نهاية المفتاح إلى البداية. كيف افعلها؟ باستخدام عملية تقسيم modulo! نتيجة العملية هي باقي قسمة رقمين. إن الفوائد العملية لهذه العملية في البرمجة هائلة بكل بساطة! تخيل أنه يجب تقسيم مجموعة كبيرة من الأشخاص إلى ثلاث مجموعات فرعية. إحدى الطرق للقيام بذلك هي أن تطلب منهم دفع ثمن الأول والثاني والثالث. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 17 أي أن الشخص الأول ينتمي إلى المجموعة الأولى، والثاني إلى الثاني، والثالث إلى الثالث، والرابع إلى الأول مرة أخرى، وهكذا. يمكنك استخدام قسمة modulo لإجراء نفس العملية. دعونا نرقم نفس المجموعات الثلاث من الصفر. وإليك كيفية القيام بذلك: هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 18 إذا أخذت فهرسًا وقسمته على القيمة القصوى، فلن تكون النتيجة الناتجة أكبر من أو تساوي تلك القيمة أبدًا. جرب هذا المبدأ لإعادة الكلمة الرئيسية إلى البداية! فقط بدلاً من الفرز حسب المجموعة، فإنك تحتاج إلى فهرس الكلمة الأساسية حتى تتمكن من إزاحة الحرف الصحيح دون تجاوز طول المفتاح. نظرًا لأننا نقوم بأتمتة بعض اختبارات التعليمات البرمجية الخاصة بك، فيجب أن يتصرف البرنامج كما هو موضح أدناه: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz كيف يمكنك اختبار البرنامج إلى جانب حساب النص المشفر يدويًا؟ نحن طيبون: لهذا كتبنا برنامج devigenere . يستغرق الأمر وسيطة سطر أوامر واحدة فقط (كلمة رئيسية)، وتتمثل مهمتها في أخذ النص المشفر كمدخل وإرجاع النص العادي. قم بتشغيله: ~cs50/pset2/devigenere k حيث k هي الكلمة الأساسية. إذا كنت تريد التحقق من صحة برنامجك باستخدام check50، فقم بتشغيل: check50 2014.fall.pset2.vigenere vigenere.c وإذا كنت تريد تقييم تنفيذ vigenere الخاص بنا، فاكتب: ~cs50/pset2/vigenere

كيفية التحقق من صحة التعليمات البرمجية الخاصة بك والحصول على العلامات

انتباه! إذا كان من المهم بالنسبة لك التحقق من صحة المهام فقط، فاستخدم cs50check. إذا كنت ترغب في الحصول على درجات على منصة edx، فاتبع الإجراء الموضح أدناه. ضع في اعتبارك أن هذا الإجراء يستخدم نفس cs50check للتحقق من المهام. والفرق الوحيد هو أنه يتذكر النتائج ويحسب النتيجة الإجمالية.
  1. تسجيل الدخول إلى CS50 IDE
  2. بالقرب من الزاوية العلوية اليسرى لـ CS50 IDE ، حيث يوجد متصفح الملفات الخاص به (وليس في النافذة الطرفية)، انقر بزر الماوس الأيمن على ملف originals.c الموجود في دليل pset2 وانقر فوق Download . يجب أن ترى أن المتصفح قد قام بتحميل الأحرف الأولى.c .
  3. كرر ل Caesar.c .
  4. كرر ل vigenere.c .
  5. في نافذة أو علامة تبويب منفصلة، ​​قم بتسجيل الدخول إلى إرسال CS50
  6. انقر على أيقونة إرسال في الزاوية اليسرى العليا من الشاشة. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و6) - 19
  7. في قائمة المجلدات الموجودة على اليسار، انقر فوق دليل مجموعة المشاكل 2 ، ثم انقر فوق الزر تحميل إرسال جديد . انها على اليمين. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 20
  8. على الشاشة التي تظهر، انقر فوق الزر "إضافة ملفات ...". سيتم فتح نافذة لاختيار الملفات من جهاز الكمبيوتر الخاص بك. هارفارد CS50: واجبات الأسبوع الثاني (المحاضرتان 5 و 6) - 21
  9. انتقل إلى المجلد الذي تحتفظ فيه بالاسم الأولي.c . من المرجح أن يكون موجودًا في مجلد التنزيلات لديك أو في أي مكان يضع فيه متصفحك الملفات افتراضيًا. عندما تجد originals.c ، انقر عليه مرة واحدة لتحديده، ثم انقر فوق Open.
  10. انقر فوق إضافة ملفات مرة أخرى.
  11. ابحث عن موقع caesar.c وافتحه.
  12. افعل نفس الشيء بالنسبة لملف vigenere.c .
  13. انقر فوق بدء التحميل. سيتم تحميل ملفاتك إلى خوادم CS50 .
  14. على الشاشة التي تظهر، يجب أن تشاهد نافذة No File Selected . إذا قمت بتحريك مؤشر الماوس إلى اليسار، فسترى قائمة بالملفات التي تم تنزيلها. للتأكيد، انقر على كل واحد منهم. إذا لم تكن متأكدًا من شيء ما، يمكنك إعادة تحميل الملفات عن طريق تكرار نفس الخطوات. يمكنك القيام بذلك عدة مرات كما تريد حتى نهاية عام 2016.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION