JavaRush /בלוג Java /Random-HE /הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6)
Masha
רָמָה

הרווארד CS50: מטלות שבוע 2 (הרצאות 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 כדי לוודא שגרסת סביבת העבודה שלך מעודכנת. אם בטעות סגרת את חלון הטרמינל, עבור לתפריט View וודא שיש סימן ביקורת ליד הפריט Console (בדוק אם הוא לא). הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 1 לחץ על (+), בתוך העיגול הירוק במסגרת חלון המסוף, בחר מסוף חדש . הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 2 צור ספריית עבודה: mkdir ~/workspace/pset2 שימו לב שיש רווח בין mkdir לבין ~/workspace/pset2 . לסיכום, ~ פירושו ספריית השורש, ~/workspace היא תיקיה שנקראת workspace בתוך ספריית השורש, ~/workspace/pset2 היא ספרייה בשם pset2 בתוך ~/workspace . כעת הפעל: cd ~/workspace/pset2 כדי לעבור לספרייה החדשה. שורת הפקודה נראית בערך כך: username:~/workspace/pset2 $ אם משהו לא בסדר, חזור על השלבים. אתה יכול גם לקרוא לפקודה history כדי להציג את הפקודות האחרונות בסדר כרונולוגי. אתה יכול גם למקם את הסמן בשורת הפקודה וללחוץ על החץ למעלה במקלדת כדי להציג את כל הפקודות בסדר מהפקודות שהוזנו לאחרונה לראשונות. בעזרת כפתור למטה תוכל לחזור אחורה. אגב, במקום להקליד את אותן הפקודות בכל פעם, תוכלו לגלול בין הפקודות שכבר הקלדתם ולבצע אותן שוב בלחיצה על Enter. אולי שמתם לב שדיוויד עושה בדיוק את זה בהרצאותיו. יש לשמור את המשימות של השבוע השני ב- pset2 .

משימה 0. אתחול

בואו נסתכל מקרוב על השורות. בקובץ initials.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
קריפטוגרפיה
קריפטוגרפיה, מדע ההצפנה ופענוח המידע... למעשה, מסרים מוצפנים היו קיימים עוד מימי קדם, ושימשו את הצבאות להעברת מסרים סודיים. ובכן, כעת הסיסמאות שלך בפייסבוק וברשתות אחרות מאוחסנות בצורה מוצפנת.

משימה 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: מטלות שבוע 2 (הרצאות 5 ו-6) - 3 צופן קיסר הוא פשוט, אבל, למרבה הצער, לא אמין (אלה דברים קשורים זה לזה!): עבור האלפבית האנגלי יש רק 25 אפשרויות הצפנה, קל לעבור על כל האפשרויות גם בלי מחשב. עם זאת, צופן הקיסר משמש לעתים קרובות כשלב בצפנים אחרים, כגון צופן Vigenère (עוד על כך בפסקה הבאה). בואו "נעשה מתמטיקה" את צופן הקיסר. נסמן את הטקסט הפשוט באות p, pi היא האות בטקסט p שנמצאת במיקום מספר i. הבה נקרא למפתח הסודי אות k, c לטקסט הצפנה, ו- ci האות בטקסט הצפנה שנמצאת בעמדה i. לאחר מכן תוכלו לחשב כל אות של הצופן באמצעות הנוסחה: ci = (pi + k) % 26 תתרגלו לפורמליזציה הזו, היא מאפשרת לתכנת את האלגוריתם ומבטאת את משמעות הצופן בצורה מדויקת ותמציתית. אם המפתח k = 13 והטקסט המקורי p הוא "הקפד לשתות את ה-Ovaltine שלך!", זה הצופן שאנו מקבלים: Or fher gb qevax lbhe Binygvar! שימו לב ש-O (האות הראשונה בטקסט הצופן) מוזזת ב-13 מיקומים מהאות B (ה האות הראשונה בטקסט המקורי). אותו דבר עם האות r (האות השנייה בהצפנה) מוזז 13 אותיות מ-e (האות השנייה במקור). האות השלישית בהצפנה, f, מוזזת ב-13 אותיות מ-s (השלישית במקור), כאן אנחנו עוברים במעגל מ-z ל-a. לצופן קיסר עם מפתח 13 יש את השם המיוחד ROT13 . הוא סימטרי: מיישמים אותו פעמיים, אנו חוזרים לטקסט המקורי. כמובן, יש גם ROT26, זה בדרך כלל סופר מאובטח, אבל רק אם אתה לא מביע את המחשבות שלך בצורה ברורה =).
מַצָב
כתוב בקובץ caesar.c תוכנית המצפינת טקסט באמצעות צופן קיסר. ספק ארגומנט שורת פקודה אחד כקלט לתוכנית: מספר שלם לא שלילי. לשם הפשטות, בואו נקרא לזה k. אם המשתמש מפעיל את התוכנית ללא ארגומנטים של שורת פקודה או עם יותר מארגומנט אחד, היישום צריך להתלונן ולהחזיר את הערך 1 (כך בדרך כלל מסומנים שגיאות): return 1; בכל שאר המקרים, התוכנית מבקשת מהמשתמש להזין את הטקסט כדי להצפין, ולאחר מכן מציג את הטקסט המוצפן באמצעות מקש k (כלומר, מיקומי k הוסט ימינה לאורך המחזור). אם הטקסט מכיל תווים שהם מחוץ לאלפבית האנגלי, התוכנית לא משנה אותם. לאחר הדפסת הטקסט הצופן האפליקציה יוצאת, main מחזירה 0: return 0; אם main לא מחזירה אפס במפורש, היא מחזירה אותו אוטומטית (int הוא למעשה סוג ההחזרה של main, אבל עוד על זה בפעם אחרת). על פי המוסכמה (כללי הצורה הטובה בתכנות), אם אתה מחזיר במפורש 1 כדי לציין שגיאה, אז אתה צריך גם להחזיר 0 כמצביע על סיום מוצלח של התוכנית. למרות שיש רק 26 אותיות באלפבית האנגלי, k יכול להיות גדול מ-26. בעיקרו של דבר, המפתח k = 27 ייתן את אותה תוצאה כמו k = 1, אבל אתה צריך לאפשר למשתמש להזין כל מספר לא שלילי שלא עולה על 2^31 - 26 (זה חייב להתאים ל-int). כמו כן, על התוכנית לקחת בחשבון שאותיות קטנות מוצפנות באותיות קטנות, ואותיות רישיות מוצפנות באותיות רישיות. איפה אנחנו מתחילים? מכיוון שהיישום חייב לקבל את הערך של k ישירות במחרוזת הארגומנט, כותרת הפונקציה הראשית שלנו נראית כך: int main(int argc, string argv[]) מפרק 6, אתה יודע ש- 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 בעצמנו. למרבה המזל, יש פונקציה בשם atoi המיועדת למטרה זו. התחביר שלו הוא: 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: מטלות שבוע 2 (הרצאות 5 ו-6) - 4 לדוגמה, המשתמש הזין את המחרוזת blastoff Team Rocket, ואז: הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 5 באמצעות הפונקציה atoi() אנו ממירים את המספר המתקבל למספר שלם. אם זה לא אפשרי, הפונקציה תחזיר 0. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 6 2. בקש מהמשתמש להזין טקסט. זה פשוט: כל מה שהמשתמש מזין הוא מחרוזת. 3. הצפנה. האלגוריתם פשוט, אבל איך אפשר להסביר למחשב אילו אותיות באות בזו אחר זו? זה הזמן לזכור את טבלת ASCII! הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 7 עם זאת, יכולים להיות יותר מסתם אותיות במחרוזת... לפני המעבר לשינוי מחרוזות, דמיינו שאתם צריכים לשנות רק תו אחד. אנחנו רוצים לשנות את האותיות מהטקסט הראשוני, לא את הסימנים או המספרים. מה אנחנו צריכים לעשות? ראשית עלינו לבדוק אם התו הזה נמצא באלפבית. ניתן לעשות זאת באמצעות הפונקציה isalpha() . אם התו נמצא באלפבית, פונקציה זו מחזירה אמת ושקר אחרת. שתי פונקציות שימושיות נוספות - isupper() ו- islower() מחזירות true אם האות היא אות גדולה או קטנה, בהתאמה. לפיכך: 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: מטלות שבוע 2 (הרצאות 5 ו-6) - 8הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 9ci = (pi + k) % 26 כאשר ci היא האות מספר i בטקסט ההצפנה, pi היא האות מספר i בטקסט הפשוט, k הוא המפתח, ו-%26 הוא שאר החלוקה ב-26 (או "מודולו 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 למספר באלפבית. לאחר שהבנו את הנוסחה של תו אחד, עלינו ליישם אותה על כל אות במחרוזת המוזנת מהמקלדת. אבל רק אם אלו אותיות! וזכור, אותיות גדולות ואותיות קטנות דורשות משמעויות שונות. זה המקום שבו הפונקציות isupper ו-islower מועילות. ייתכן שיש לך שתי נוסחאות, האחת לאותיות גדולות, והשנייה לאותיות קטנות, פונקציות יעזרו לך לבחור איזו מהן ליישם. כיצד להחיל נוסחה על כל תו בודד במחרוזת? זכור שמחרוזת היא רק מערך של תווים. הפונקציה strlen (אורך מחרוזת) תעזור לך לקבוע את מספר האיטרציות בלולאה .הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 10

משימה 2. Parlez-vous français?

תֵאוֹרִיָה
צופן Vigenère בטוח יותר מצופן קיסר: הוא משתמש במילה כמפתח וקשה לפיצוח ידני באמצעות ניתוח תדרים או כוח גס בלבד. כל אות של המפתח יוצרת מספר, וכתוצאה מכך נקבל מספר מפתחות להזזת אותיות. דוגמה: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 11 אם מספר האותיות בהודעה אינו מתחלק במפתח, אנו משתמשים רק בחלק ממנו ביישום האחרון של המפתח: הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 12 כדי למצוא את הערך לקיזוז, אנו משתמשים במיקומים של כל אות במפתח הבייקון שלנו באלפבית (מא' עד ת'). אנחנו סופרים מאפס, כמו מתכנתים אמיתיים. וכל אות בטקסט המקורי מוזז במספר נתון, כמו בצופן קיסר, חוזר, במידת הצורך, אחרי Z לתחילת האלפבית. אז M יזוז ב-1, ה-e הראשון לא יזוז בכלל, והשני יזוז ב-2 עמדות. למטה אתה רואה את ההודעה המקורית, המפתח הכתוב ואת התוצאה של היישום שלה. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 13 צופן Vigenère הוא, כמובן, חזק יותר, אבל אם אתה יודע את אורך המפתח, זה די קל לשבור. איך לזהות אותו? אם הטקסט המקורי ארוך מספיק כדי שכמה מילים יופיעו בו כמה פעמים, אז תראה כמה חזרות: אתה הרווארד CS50: מטלות שבוע 2 (הרצאות 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 על התו ה-th p שאינו מופיע באלפבית, החל את תו המפתח ה-j על התו האלפביתי הבא בטקסט; אתה לא יכול פשוט לעזוב את זה ולעבור לדמות אחרת ב-k. לבסוף, על התוכנית לשמר את האותיות של כל אות ב- p .
לא יודעים מאיפה להתחיל?
הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 15
הנה כמה טיפים של זמיליה, עוזרת קורס CS50
למרבה המזל, התוכנית דומה מאוד לצופן קיסר, רק שהמפתח הוא מיתר ולא מספר שלם. אם יישמת בהצלחה את צופן השם של השליט הרומי, זו יכולה להיות התחלה מצוינת למשימה השנייה. בטח כבר הבנתם שצופן Vigenère עם אות אחת כמפתח זהה לצופן קיסר. האלגוריתם של Vigenère משתמש באותם שלבים כמו קיסר:
  1. קח את המפתח
    • מילת קוד היא ארגומנט שורת הפקודה השני argv[1]
    • חייב להיות באלפבית: פונקציית isalpha
  2. קבל טקסט
  3. הצפין
  4. הדפס טקסט צופן
אז, בואו נבדוק את הארגומנט השני של שורת הפקודה argv[1] כדי לראות אם הוא שייך לתווים אלפביתיים. אנו עושים זאת באמצעות ה- isalpha המוכר ממילא . אם המפתח נכון, אנו מקבלים מחרוזת מהמשתמש ומתחילים בהצפנה. נוסחת צופן Vigenère דומה לנוסחת צופן קיסר. איך ממירים אות לקיזוז הצופן המתאים? נסה להשוות את הערכים באמצעות טבלת ASCII. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 16 סביר להניח שתוכל למצוא תבנית בין האותיות לאינדקס האלפביתי שלהן באמצעות הרצפים בטבלה. הבנתם איך להחסיר אות אחת מאחרת כדי לקבל את התוצאה הרצויה? ההסטות לאותיות גדולות ואותיות קטנות זהות, לכן תצטרך להגדיר שתי נוסחאות דומות כדי לקבוע את ההיסט לאותיות קטנות ובנפרד לאותיות גדולות. זכור גם שלולאת הטקסט צריכה להתעלם מתווים שאינם אנגלים. ואל תשכחו לשמר את המקרה של אותיות. אם תסתכל על נוסחת הצופן: ci = (pi + kj) % 26 תראה שני משתני אינדקס, i ו-j. אחד שומר את המיקום בטקסט המקור, השני במפתח. אם הטקסט שלך ארוך מהמפתח, האינדקס על המקש עובר מסוף המפתח בחזרה להתחלה. איך לעשות את זה? שימוש בפעולת חלוקת מודולו! התוצאה של הפעולה היא שארית החלוקה של שני מספרים. היתרונות המעשיים של פעולה זו בתכנות הם פשוט עצומים! תארו לעצמכם שצריך לחלק קבוצה גדולה של אנשים לשלוש תת-קבוצות. אחת הדרכים לעשות זאת היא לבקש מהם לשלם עבור הראשון, השני, השלישי. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 17 כלומר, האדם הראשון שייך לקבוצה הראשונה, השני לשני, השלישי לשלישי, הרביעי לראשון שוב, וכן הלאה. אתה יכול להשתמש בחלוקת מודולו כדי לבצע את אותה פעולה. בואו נמנה את אותן שלוש קבוצות מאפס. הנה איך לעשות את זה: הרווארד CS50: מטלות שבוע 2 (הרצאות 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 , היכן שדפדפן הקבצים שלו נמצא (לא בחלון המסוף), לחץ לחיצה ימנית על קובץ initials.c שלך שנמצא בספריית pset2 ולחץ על הורד . אתה אמור לראות שהדפדפן טען את initials.c .
  3. חזור על קיסר.ג.
  4. חזור על vigenere.c .
  5. בחלון או כרטיסייה נפרדים, היכנס ל- CS50 Submit
  6. לחץ על סמל שלח בפינה השמאלית העליונה של המסך. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 19
  7. ברשימת התיקיות משמאל, לחץ על ספריית ערכת בעיות 2 ולאחר מכן לחץ על כפתור העלה הגשה חדשה . זה מימין. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 20
  8. במסך שמופיע, לחץ על כפתור הוסף קבצים .... ייפתח חלון לבחירת קבצים מהמחשב שלך. הרווארד CS50: מטלות שבוע 2 (הרצאות 5 ו-6) - 21
  9. נווט לתיקיה שבה אתה שומר ראשי תיבות.c . סביר להניח שהוא ממוקם בתיקיית ההורדות שלך או בכל מקום שהדפדפן שלך שם קבצים כברירת מחדל. כאשר אתה מוצא את initials.c , לחץ עליו פעם אחת כדי לבחור בו ולאחר מכן לחץ על פתח.
  10. לחץ שוב על הוסף קבצים .
  11. מצא את caesar.c ופתח אותו.
  12. עשה את אותו הדבר עבור הקובץ vigenere.c .
  13. לחץ על התחל העלאה. הקבצים שלך יועלו לשרתי CS50 .
  14. במסך שמופיע, אתה אמור לראות את החלון לא נבחר קובץ . אם תזיז את סמן העכבר שמאלה, תראה רשימה של קבצים שהורדת. לאישור, לחץ על כל אחד מהם. אם אינך בטוח לגבי משהו, תוכל להעלות מחדש את הקבצים על ידי חזרה על אותם שלבים. אתה יכול לעשות זאת כמה פעמים שתרצה עד סוף 2016.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION