JavaRush /Java Blogu /Random-AZ /Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühaz...
Masha
Səviyyə

Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr)

Qrupda dərc edilmişdir
5 və 6 mühazirələr üçün cs50 tapşırıqları CS50 mühazirələri buradadır: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Bu materialda 3 tapşırıq, onlar haqqında nəzəri məlumatlar və fəaliyyət üçün təlimat var.

Məqsədlər

• Funksiyalara və kitabxanalara daha dərindən keçin • Kriptoqrafiya ilə tanış olun, bir neçə sadə şifrə tətbiq edin

Əlavə materiallar

https://reference.cs50.net/ - təlim zamanı istifadə olunan kitabxana funksiyalarının izahı. İngiliscə. http://computer.howstuffworks.com/c.htm səhifələr 11 – 14 və 39

Hazırlıq

update50 İş sahəsi versiyanızın yeni olduğundan əmin olmaq üçün cs50.io saytına daxil olun . Təsadüfən terminal pəncərəsini bağlasanız, Görünüş menyusuna keçin və Konsol elementinin yanında işarənin olduğundan əmin olun (yoxdursa yoxlayın). Harvard CS50: 2-ci həftə tapşırıqları (5 və 6-cı mühazirələr) - 1 Terminal pəncərəsinin çərçivəsindəki yaşıl dairənin içərisində (+) üzərinə klikləyin, Yeni Terminal seçin . Harvard CS50: 2-ci həftə tapşırıqları (5 və 6-cı mühazirələr) - 2 İşçi kataloqu yaradın: Qeyd edək ki, mkdir~/workspace/pset2mkdir ~/workspace/pset2 arasında boşluq var . Xülasə etmək üçün, ~ kök kataloqu deməkdir, ~/workspace kök qovluğunda iş sahəsi adlı qovluqdur, ~/workspace/pset2 ~/workspace daxilində pset2 adlı qovluqdur . İndi işə salın: yeni qovluğa keçmək üçün. Komanda xətti belə görünür: Bir şey səhv olarsa, addımları təkrarlayın. Siz həmçinin son bir neçə əmri xronoloji ardıcıllıqla görmək üçün əmrə zəng edə bilərsiniz . Siz həmçinin kursorunuzu komanda xəttinə yerləşdirə və bütün əmrləri sonuncu daxil ediləndən birinciyə qədər ardıcıllıqla görmək üçün klaviaturanızdakı yuxarı oxu basa bilərsiniz. Aşağı düyməsini istifadə edərək geri qayıda bilərsiniz. Yeri gəlmişkən, hər dəfə eyni əmrləri yazmaq əvəzinə, artıq yazdığınız əmrləri vərəqləyib Enter düyməsini sıxaraq yenidən icra edə bilərsiniz. Devidin mühazirələrində məhz bunu etdiyini görmüsünüz. İkinci həftənin tapşırıqları pset2 -də saxlanmalıdır . cd ~/workspace/pset2username:~/workspace/pset2 $history

Tapşırıq 0. İnisiallaşdırma

Gəlin xətlərə daha yaxından nəzər salaq. Baş hərflər.c faylında istifadəçinin adını tələb edən proqram yazın (GetString funksiyasından istifadə edərək adı sətir kimi alırıq) və sonra adın (və ya adların) və soyadın ilk hərflərini boşluq qoymadan böyük hərflə göstərin, nöqtələr və ya digər simvollar, yalnız sətir lenti ilə ( \n ). Güman edirik ki, istifadəçilər yalnız hərflər (kiçik və ya böyük hərf və ya hər ikisi) və sözlər arasında bir boşluq daxil edirlər. Nəzərə alın ki, Joseph Gordon-Levitt, Conan O'Brien və ya David J. Malan adlı uşaqlar proqramdan istifadə etməyəcəklər. Proqramın düzgün işləməsini yoxlamaq üçün check50-ə zəng edin: CS50 heyəti tərəfindən hazırlanmış proqramın icrası ilə oynamaq istəyirsiniz? Xətti yazın: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Kriptoqrafiya
Kriptoqrafiya, informasiyanın şifrələnməsi və deşifrə edilməsi elmi... Əslində, şifrəli mesajlar qədim zamanlardan mövcud olub və ordular tərəfindən gizli mesajların ötürülməsi üçün istifadə olunurdu. Yaxşı, indi Facebook və digər şəbəkələrdə parollarınız şifrələnmiş formada saxlanılır.

Tapşırıq 1. Salam, Sezar!

Nəzəri məlumat
Ən sadə şifrələrdən birini - Roma imperatorunun adını daşıyan Sezar şifrəsini öyrənəcəyik. Bu şifrədə mətnin hər hərfi başqası ilə əvəz olunur ki, bu da əlifbada daha aşağı hərflərin sabit sayıdır. Bu sabit sayda hərflər açar adlanır . Beləliklə, 1-ci düymə latın hərfini D hərfinə, Z isə dövr ərzində A hərfinə çevirir. Əgər açar 3-dürsə, C hərfi F-ə, Z isə C-yə çevriləcək. Nümunələr: biz Sezar şifrəsindən istifadə edirik. pişik sözünün açarı 5. c -> h a -> f t -> y Caesar (cat, 5) = hfy Açar = 7, söz = kompüter c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 3 Sezar şifrəsi sadədir, lakin təəssüf ki, etibarsızdır (bunlar bir-biri ilə əlaqəli şeylərdir!): İngilis əlifbası üçün cəmi 25 şifrələmə variantı var, hətta kompüter olmadan da bütün seçimlərdən keçmək asandır. Bununla belə, Sezar şifrəsi tez-tez Vigenère şifrəsi kimi digər şifrələrdə bir addım kimi istifadə olunur (bununla bağlı növbəti paraqrafda daha çox məlumat verilir). Sezar şifrəsini “riyaziləşdirək”. Açıq mətni p hərfi ilə işarə edək, pi mətndə i nömrəli mövqedə olan p hərfidir. Gizli açar hərfi k, c hərfini şifrəli mətn, ci hərfini isə i mövqeyində olan şifrəli mətn adlandıraq. Sonra düsturdan istifadə edərək şifrənin hər hərfini hesablaya bilərsiniz: ci = (pi + k) % 26 Bu rəsmiləşdirməyə alışın, o, alqoritmi proqramlaşdırmağa imkan verir və şifrənin mənasını dəqiq və yığcam şəkildə ifadə edir. Əgər k = 13 açarı və orijinal p mətni "Ovaltininizi mütləq içdiyinizə əmin olun!"-dursa, bu, əldə etdiyimiz şifrədir: Or fher gb qevax lbhe Binygvar! Qeyd edək ki, O (şifrə mətnindəki ilk hərf) B hərfindən 13 mövqe dəyişdirilir ( orijinal mətndə birinci hərf). R hərfi ilə eyni şey (şifrələmədə ikinci hərf) e-dən (orijinaldakı ikinci hərf) 13 hərf köçürülür. Şifrələmədəki üçüncü hərf, f, s-dən 13 hərflə (orijinalda üçüncü), burada z-dən a-a qədər bir dairədə gedirik. 13 açarı olan Sezar şifrəsinin ROT13 xüsusi adı var . Simmetrikdir: onu iki dəfə tətbiq edərək, orijinal mətnə ​​qayıdırıq. Əlbəttə ki, ROT26 da var, bu ümumiyyətlə super təhlükəsizdir, ancaq fikirlərinizi aydın ifadə etməsəniz =).
Vəziyyət
Caesar.c faylına Sezar şifrəsindən istifadə edərək mətni şifrələyən proqramı yazın. Proqrama giriş kimi bir komanda xətti arqumenti təqdim edin: mənfi olmayan tam ədəd. Sadəlik üçün onu k adlandıraq. İstifadəçi proqramı heç bir əmr xətti arqumenti olmadan və ya birdən çox arqumentlə icra edərsə, proqram şikayət etməli və 1 dəyərini qaytarmalıdır (səhvlər adətən belə işarələnir): return 1; Bütün digər hallarda proqram istifadəçidən mətni tələb edir. şifrələmək üçün, sonra k düyməsi ilə şifrələnmiş mətni göstərir (yəni, dövr ərzində k mövqeyi sağa sürüşdürülmüşdür). Mətndə ingilis əlifbasından kənar simvollar varsa, proqram onları dəyişdirmir. Şifrə mətni çap etdikdən sonra proqram çıxır, main 0 qaytarır: return 0; Əgər main açıq şəkildə sıfırı qaytarmırsa, onu avtomatik qaytarır (int əslində əsasın qaytarılması növüdür, lakin daha çox başqa vaxt). Konvensiyaya (proqramlaşdırmada yaxşı forma qaydaları) uyğun olaraq, səhvi göstərmək üçün açıq şəkildə 1 qaytarırsınızsa, proqramın uğurla başa çatması üçün göstərici kimi 0-ı da qaytarmalısınız. İngilis əlifbasında cəmi 26 hərf olsa da, k 26-dan böyük ola bilər. Əslində, k = 27 açarı k = 1 ilə eyni nəticəni verəcək, lakin siz istifadəçiyə istənilən mənfi olmayan rəqəmi daxil etməsinə icazə verməlisiniz. 2^31 – 26-dan çox (int-ə uyğun olmalıdır). Proqram həmçinin nəzərə almalıdır ki, kiçik hərflər kiçik hərflərlə, böyük hərflər isə böyük hərflərlə şifrələnir. Haradan başlayaq? Tətbiq arqument sətirində birbaşa k dəyərini qəbul etməli olduğundan, bizim əsas funksiya başlığı belə görünür: int main(int argc, string argv[]) 6-cı fəsildən bilirsiniz ki, argv sətirlər massividir. Massiv idman zalında bir sıra şkaflar kimi düşünülə bilər. Onların hər birinin gizli mənası var. Bizim vəziyyətimizdə, hər bir hüceyrənin içərisində string birinci şkafı açmaq üçün argv[0] istifadə edirik, ikincisi - argv[1] və s. kimi bir arqument var. Əgər n qıfılımız varsa, o zaman argv[n - 1] nöqtəsində dayanmalıyıq, çünki argv[n] artıq mövcud olmadığından (yaxud mövcuddur, lakin başqasına məxsusdur, ona toxunmamaq daha yaxşıdır). Beləliklə, k arqumentinə aşağıdakı kimi daxil ola bilərsiniz: string k = argv[1]; Biz inanırıq ki, orada həqiqətən bir şey var! Xatırladaq ki, argc argv-də sətirlərin sayına bərabər olan int dəyişənidir. Bu o deməkdir ki, xananı açmağa çalışmazdan əvvəl argc dəyərini yoxlamaq daha yaxşıdır, çünki onun mövcud olmadığı ortaya çıxa bilər. İdeal olaraq argc = 2. Bu niyə belədir? Inside argv[0] adətən proqramın adıdır. Yəni, argc həmişə ən azı 1-dir. Amma bizim proqramımız istifadəçiyə k komanda xətti arqumentini təqdim etməlidir, buna görə də argc = 2. Təbii ki, istifadəçi əmr satırına birdən çox arqument daxil edərsə, argc də böyüyür və edə bilər. 2-dən böyük olmalıdır Əgər istifadəçi sətirə tam ədəd daxil edərsə, bu, daxil edilmiş dəyərin avtomatik olaraq int kimi saxlanacağı anlamına gəlmir. Daha doğrusu, YOXDUR. Tam olaraq int kimi görünsə belə, simli olacaq! Beləliklə, sətri özümüz int-ə çevirməliyik. Xoşbəxtlikdən, bu məqsəd üçün nəzərdə tutulmuş atoi adlı bir funksiya var. Onun sintaksisi belədir: int k = atoi(argv[1]); Qeyd edək ki, k int tiplidir, ona görə də onunla hesab edə bilərsiniz. Bu funksiya ilə istifadəçinin tam ədəd və ya məsələn, foo daxil olub-olmamasından narahat olmaq lazım deyil: bu halda atoi 0 qaytaracaq. Atoi funksiyası stdlib.h kitabxanasında elan olunub , ona görə də # əmin olun. onu proqramın əvvəlinə daxil edin. Bu funksiyanı cs50.h kitabxanasına daxil etdiyimiz üçün kod bu olmadan tərtib ediləcək . Bununla belə, doğma kitabxanalara etibar etmək daha yaxşıdır. Beləliklə, siz k int kimi saxladınız. İndi mətn daxil etməyi xahiş edək. Əgər siz ilk həftənin tapşırıqlarını etmisinizsə, siz artıq GetString adlı CS50 kitabxana funksiyası ilə tanışsınız. O, bizə kömək edəcək. Siz k və ilkin mətni aldıqdan sonra şifrələməyə başlayaq. Xülasə etmək üçün, siz sətirdəki bütün simvolları təkrarlaya və onları aşağıdakı döngədən istifadə edərək çap edə bilərsiniz: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Başqa sözlə, argv sətirlər massivi olduğu kimi, string də simvollar massividir. Buna görə də, argv-də fərdi sətirləri əldə etmək kimi fərdi sətir elementlərinə daxil olmaq üçün kvadrat mötərizələrdən istifadə edə bilərik. Əlbəttə ki, simvolların hər birini çap etmək üçün kriptoqrafik heç bir şey yoxdur. Və ya texniki olaraq, k = 0 olduqda. Amma biz Sezara öz mətnini şifrələməkdə kömək etməliyik! Salam, Sezar! Strlen-dən istifadə etmək üçün başqa bir kitabxana daxil etməlisiniz . Bəzi doğrulama testlərini avtomatlaşdırdığımız üçün proqram tam olaraq belə davranmalıdır: atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! ilə yanaşı , siz ctype.hstdlib.h kitabxanalarında digər gözəl funksiyaları tapa bilərsiniz . Bunun üçün linki izləyin və orada bir az dolaşın. Məsələn, isdigit aydın şəkildə maraqlı bir şeydir =). Z-dən A-ya (və ya z-dən a-ya) gedərkən % modul operatorunu unutmayın.C dilində.Həmçinin cədvəli öyrənin , o, yalnız hərflər üçün deyil, ASCII simvollarını göstərir. Proqramın check50 ilə düzgün işlədiyini yoxlamaq üçün aşağıdakıları edin: check50 2015.fall.pset2.caesar caesar.c Əgər siz CS50 işçisi tərəfindən hazırlanmış kodla oynamaq istəyirsinizsə, əmri yerinə yetirin: ~cs50/pset2/caesar Yeri gəlmişkən, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Tapşırıqın təhlili
  1. Açarı alın
  2. Mətn əldə edin
  3. Şifrələyin
  4. Şifrələnmiş mesajı göstərin
1. Biz əsas funksiyanı formalaşdırırıq ki, istifadəçi komanda xəttinə açarı daxil etsin və açarın düzgünlüyünü yoxlasın. int main(int argc, string argv[]) argc: • int • komanda xəttinə daxil edilən arqumentlərin sayı • argc = 2 olarsa, hər şey qaydasındadır. Əgər yoxsa, təlimatı çap edin və proqramı bağlayın. • argc = 2 olarsa, açarın tam ədəd olub-olmadığını yoxlayırıq • Argv sətirlər massividir, ona daxil edilmiş arqumentləri olan siyahı Massiv müxtəlif xanalarda eyni tipli müxtəlif verilənləri ehtiva edən verilənlər strukturudur. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 4 Məsələn, istifadəçi blastoff Team Rocket sətirinə daxil oldu, sonra: Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 5 atoi() funksiyasından istifadə edərək nəticədə alınan ədədi tam ədədə çevirdik. Əgər bu mümkün deyilsə, funksiya 0 qaytaracaq. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 6 2. İstifadəçidən mətni soruşun. Bu sadədir: istifadəçinin daxil etdiyi hər şey sətirdir. 3. Şifrələmə. Alqoritm sadədir, amma hansı hərflərin bir-birinin ardınca gəldiyini kompüterə necə izah etmək olar? ASCII cədvəlini xatırlamağın vaxtı gəldi! Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 7 Bununla belə, sətirdə sadəcə hərflərdən çox ola bilər... Sətirlərin dəyişdirilməsinə keçməzdən əvvəl təsəvvür edin ki, yalnız bir simvolu dəyişmək lazımdır. Biz işarələri və ya rəqəmləri deyil, ilkin mətndən hərfləri dəyişmək istəyirik. Biz nə etməliyik? Əvvəlcə bu simvolun əlifbada olub olmadığını yoxlamaq lazımdır. Bu isalpha() funksiyasından istifadə etməklə edilə bilər . Əgər simvol əlifbadadırsa, bu funksiya doğru və əks halda yalanı qaytarır. Daha iki faydalı funksiya - isupper()islower() hərf müvafiq olaraq böyük və ya kiçik hərf olarsa doğru qaytarır. Beləliklə: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Əgər isalpha doğru qaytarırsa, düymədən istifadə edərək bu simvolu dəyişdirməliyik. Nümunə olaraq CS50 köməkçisi Zamili proqramını nəzərdən keçirək və təhlil edək. Ola bilsin ki, 'A' aydın bir hərf olduğu halda niyə tam ədəddir? Belə çıxır ki, simvollar və tam ədədlər bir-birini əvəz edir. A hərfini tək dırnaq içərisində qoyaraq onun ASCII kodunu int-də əldə edə bilərsiniz. Ehtiyatlı olun: tək dırnaqlara ehtiyacınız var; onlar olmadan tərtibçi simvol deyil, A adlı dəyişəni axtaracaq. Sonra sətirdə hərfin ASCII koduna açar dəyəri əlavə edirik və onları tam dəyişəndə ​​saxlayırıq. Nəticə int olsa belə, printf ifadəsi simvollar üçün %c yertutandan istifadə edir. Beləliklə, proqram tam nəticə ilə əlaqəli simvolu çap edir. İkinci halda, biz %d yer tutucudan istifadə edərək nömrəni göstəririk. Bu kodu cs50 IDE-ə daxil edib onunla oynaya bilərsiniz. Asciimath-ın müxtəlif açarlar üçün necə işlədiyini yoxlayaq. Gəlin 25 dəyərini götürək, aşağıdakı şəkli görəcəyik: İndi isə açar 26 olsun: Bizdə [, heç A hərfi yox.Bu, Z-dən sonra gələn ASCII simvoludur. iş. Hərflərimiz bitən kimi əlifbanın əvvəlinə qayıtmaq üçün şifrə düsturundan istifadə etməliyik. Unutmayın, yuxarıda yazmışdıq: /* * 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);Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 8Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 9ci = (pi + k) % 26 Şifrə mətnində ci rəqəmi i hərfi olduğu halda, pi açıq mətndə i hərfi, k açar və %26 26-ya (və ya “modul 26”) bölmənin qalan hissəsidir. Bu düsturu Y hərfinə tətbiq edək. k = 2 götürək. ('Y' + 2) %26 'Y' hərfinin ASCII kodunu = 89 hesablayın. Sonra ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 Amma bu, bizə lazım olan A hərfinin ASCII qiyməti deyil, 65. İndi əlifbanın hər hərfinə sıra ilə 0-dan 25-ə qədər qiymət verək. Bu halda Y = 24. (24+2)%26 = 0 A hərfi məhz belə bir indeksə malikdir. Beləliklə, bu düstur hərflərin ASCII qiymətlərinə deyil, əlifba sırası indeksinə aiddir. Şifrələnmiş simvolu çap etmək üçün onun ASCII dəyərinə ehtiyacınız olacaq. Və ASCII dəyəri ilə əlifbadakı rəqəm arasında necə keçid edəcəyinizi anlayın. Bir simvolun düsturunu tapdıqdan sonra onu klaviaturadan daxil edilmiş sətirdəki hər hərfə tətbiq etməliyik. Ancaq bunlar hərflər olsa! Və unutmayın ki, böyük və kiçik hərflər fərqli mənalar tələb edir. Burada yuxarı və aşağı funksiyalar kömək edir. Biri böyük hərflər, digəri kiçik hərflər üçün iki düsturunuz ola bilər, funksiyalar hansını tətbiq edəcəyinizi seçməyə kömək edəcək. Bir sətirdəki hər bir simvola düsturu necə tətbiq etmək olar? Unutmayın ki, sətir sadəcə simvollar massividir. Strlen funksiyası (sətir uzunluğu) döngədə təkrarlamaların sayını təyin etməyə kömək edəcək .Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 10

Tapşırıq 2. Parlez-vous français?

Nəzəriyyə
Vigenère şifrəsi Sezar şifrəsindən bir qədər təhlükəsizdir: o, açar kimi bir sözdən istifadə edir və tezlik analizi və ya kobud gücdən istifadə etməklə əl ilə sındırmaq çətindir. Açarın hər hərfi bir nömrə yaradır və nəticədə hərfləri dəyişdirmək üçün bir neçə düymə əldə edirik. Nümunə: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 11 Mesajdakı hərflərin sayı açara bölünmürsə, açarın son tətbiqində onun yalnız bir hissəsindən istifadə edirik: Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 12 Ofsetin dəyərini tapmaq üçün biz donuz açarımızın hər hərfinin mövqelərindən istifadə edirik. əlifbada (a-dan z-ə qədər). Biz əsl proqramçılar kimi sıfırdan hesablayırıq. Və orijinal mətndəki hər bir hərf, Sezar şifrəsində olduğu kimi, verilmiş bir nömrə ilə dəyişdirilir, lazım olduqda Z-dən sonra əlifbanın əvvəlinə qaytarılır. Beləliklə, M 1 hərəkət edəcək, birinci e ümumiyyətlə hərəkət etməyəcək, ikincisi isə 2 mövqe ilə hərəkət edəcək. Aşağıda orijinal mesajı, yazılı açarı və onun tətbiqinin nəticəsini görürsünüz. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 13 Vigenère şifrəsi, əlbəttə ki, daha güclüdür, lakin açarın uzunluğunu bilirsinizsə, onu sındırmaq olduqca asandır. Onu necə müəyyən etmək olar? Orijinal mətn kifayət qədər uzundursa, onda bəzi sözlər bir neçə dəfə görünəcək, onda siz bəzi təkrarları görəcəksiniz: Siz Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 14 həmçinin kobud güc tətbiq edə bilərsiniz, lakin bir çox seçim var: 26^n – 1 burada n naməlum açarın uzunluğudur . Amma adətən bu çox olur. Düzdür, bu, kompüter üçün problem deyil. İndi isə şifrənin riyaziyyatı: p bəzi mətn, k açar söz, kj açarın j-ci hərfi, pi orijinal mətndə i nömrəsi, ci şifrələmədə i hərfi olsun . Sonra: ci = (pi + kj) % 26
Məşq edin
Vəziyyət Vigenere şifrəsindən istifadə edərək mesajı şifrələyən vigenere.c proqramını yazın. Proqram girişinə bir əmr xətti arqumenti təqdim edirik: İngilis əlifbasının hərflərindən ibarət olan k açar sözü. Tətbiq birdən çox arqumentlə və ya əlifbaya daxil olmayan arqumentlə işə salınarsa, səhv məlumatını göstərmək və proqramı dayandırmaq lazımdır. Yəni, əsas 1-i qaytaracaq - bu halda avtomatik testlərimiz burada hər şeyin yaxşı olduğunu başa düşəcək və bu şərt nəzərə alınır. Hər şey qaydasındadırsa, proqram yuxarıda əldə etdiyimiz k açarı ilə şifrələdiyimiz p mətn sətirini tələb etməyə davam etməli, nəticəni çap etməli və 0 dəyərini qaytararaq proqramı tamamlamalıdır. Aydınlaşdırma Əmin olmaq lazımdır ki, açarda k A və a simvolları 0, B və b 1, ..., Z və z 25 kimi təyin olunur. Proqram Vigenère şifrəsini yalnız p mətninin hərflərinə tətbiq etməlidir. Qalan simvollar (rəqəmlər, durğu işarələri, boşluqlar) dəyişdirilmədən çıxarılmalıdır. Əgər alqoritm k simvolunu əlifbada olmayan i-ci p simvoluna tətbiq etmək niyyətindədirsə , həmin j-ci simvolu mətndəki növbəti əlifba simvoluna tətbiq edin; siz sadəcə onu tərk edib k-da başqa xarakterə keçə bilməzsiniz. Nəhayət, proqram p hərfinin hərfini saxlamalıdır .
Hardan başlayacağınızı bilmirsiniz?
Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 15
CS50 kurs köməkçisi Zamilyadan bəzi məsləhətlər
Xoşbəxtlikdən, proqram Sezar şifrəsinə çox bənzəyir, yalnız açar tam deyil, sətirdir. Əgər siz Roma hökmdarının adının şifrəsini uğurla tətbiq etmisinizsə, bu, ikinci tapşırıq üçün əla başlanğıc ola bilər. Siz yəqin ki, artıq başa düşmüsünüz ki, açar kimi bir hərf olan Vigenère şifrəsi Sezar şifrəsi ilə eynidir. Vigenère alqoritmi Sezar ilə eyni addımlardan istifadə edir:
  1. Açarı alın
    • kod söz ikinci komanda xətti arqumentidir argv[1]
    • əlifbada olmalıdır: isalpha funksiyası
  2. Mətn əldə edin
  3. Şifrələyin
  4. Şifrə mətnini çap edin
Beləliklə, argv[1] ikinci əmr xətti arqumentinin əlifba simvollarına aid olub olmadığını yoxlayaq. Biz bunu artıq tanış olan isalpha istifadə edərək edirik . Açar düzgündürsə, istifadəçidən sətir alırıq və şifrələməyə başlayırıq. Vigenere şifrə düsturu Sezar şifrəsi düsturuna bənzəyir. Hərfi müvafiq şifrə ofsetinə necə çevirmək olar? ASCII cədvəlindən istifadə edərək dəyərləri müqayisə etməyə çalışın. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 16 Çox güman ki, cədvəldəki ardıcıllıqlardan istifadə edərək hərflər və onların əlifba indeksləri arasında nümunə tapa biləcəksiniz. İstədiyiniz nəticəni əldə etmək üçün bir hərfi digərindən necə çıxaracağınızı anladınızmı? Böyük və kiçik hərflər üçün ofsetlər eynidir, ona görə də kiçik hərflər və böyük hərflər üçün ayrı-ayrılıqda ofset təyin etmək üçün iki oxşar düstur təyin etməli olacaqsınız. Həmçinin unutmayın ki, mətn döngəsi ingiliscə olmayan simvolları nəzərə almamalıdır. Və məktub qutusunu saxlamağı unutmayın. Şifrə düsturuna baxsanız: ci = (pi + kj) % 26 iki indeks dəyişənini, i və j görəcəksiniz. Biri mövqeyi mənbə mətndə, digəri açarda saxlayır. Mətniniz açardan uzundursa, açardakı indeks açarın sonundan əvvələ doğru gedir. Bunu necə etmək olar? Modul bölmə əməliyyatından istifadə! Əməliyyatın nəticəsi iki ədədin bölünməsinin qalan hissəsidir. Proqramlaşdırmada bu əməliyyatın praktik faydaları sadəcə olaraq çox böyükdür! Təsəvvür edin ki, böyük bir insan qrupunu üç alt qrupa bölmək lazımdır. Bunun bir yolu onlardan birinci, ikinci, üçüncü üçün pul tələb etməkdir. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 17 Yəni birinci şəxs birinci qrupa, ikinci şəxs ikinciyə, üçüncü üçüncüyə, dördüncü yenə birinciyə və s. Eyni əməliyyatı yerinə yetirmək üçün modul bölməsindən istifadə edə bilərsiniz. Gəlin eyni üç qrupu sıfırdan nömrələyək. Bunu necə etmək olar: Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 18 Əgər indeks götürsəniz və onu modula maksimum dəyərə bölsəniz, nəticə heç vaxt həmin dəyərdən böyük və ya ona bərabər olmayacaq. Açar sözü başlanğıca qaytarmaq üçün bu prinsipi sınayın! Yalnız qrupa görə çeşidləmək əvəzinə açar sözün indeksinə ehtiyacınız var ki, əsas uzunluğu keçmədən düzgün hərfi əvəz edə biləsiniz. Kodunuzun bəzi testlərini avtomatlaşdırdığımız üçün proqram aşağıda göstərildiyi kimi davranmalıdır: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Şifrə mətnini əl ilə hesablamaqdan başqa proqramı başqa necə test edə bilərsiniz? Biz mehribanıq: bunun üçün biz devigenere proqramını yazdıq . Bir və yalnız bir əmr satırı arqumenti (açar söz) tələb edir və onun işi şifrəli mətni daxil etmək və açıq mətni qaytarmaqdır. Çalışın: ~cs50/pset2/devigenere k Burada k açar sözdür. Əgər check50 istifadə edərək proqramınızın düzgünlüyünü yoxlamaq istəyirsinizsə, işləyin: check50 2014.fall.pset2.vigenere vigenere.c Və bizim vigenere tətbiqimizi qiymətləndirmək istəyirsinizsə, yazın: ~cs50/pset2/vigenere

Kodunuzu necə doğrulamaq və işarələri əldə etmək olar

Diqqət! Yalnız tapşırıqların düzgünlüyünü yoxlamaq sizin üçün vacibdirsə, cs50check istifadə edin. Əgər siz edx platformasında qiymətlər əldə etmək istəyirsinizsə, aşağıda təsvir olunan prosedura əməl edin. Nəzərə alın ki, bu prosedur tapşırıqları yoxlamaq üçün eyni cs50check-dən istifadə edir. Yeganə fərq odur ki, o, nəticələri yadda saxlayır və ümumi balı hesablayır.
  1. CS50 IDE- ə daxil olun
  2. CS50 IDE-nin fayl brauzerinin yerləşdiyi yuxarı sol küncün yaxınlığında (terminal pəncərəsində deyil) pset2 qovluğunda yerləşən inisial hərfləri.c faylına sağ klikləyin və Yüklə üzərinə klikləyin . Brauzerin baş hərfləri.c yüklədiyini görməlisiniz .
  3. Sezar üçün təkrarlayın.c .
  4. vigenere.c üçün təkrarlayın .
  5. Ayrı bir pəncərədə və ya tabda CS50 Submit -ə daxil olun
  6. Ekranın yuxarı sol küncündə Təqdim et işarəsinə klikləyin .Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 19
  7. Sol tərəfdəki qovluqlar siyahısında Problem Set 2 qovluğuna , sonra Yeni Təqdimat Yüklə düyməsini klikləyin . Sağdadır. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 20
  8. Görünən ekranda Fayl əlavə et ... düyməsini sıxın. Kompüterinizdən faylları seçmək üçün bir pəncərə açılacaq. Harvard CS50: 2-ci həftənin tapşırıqları (5 və 6-cı mühazirələr) - 21
  9. Baş hərfləri saxladığınız qovluğa gedin.c . O, çox güman ki, Yükləmələr qovluğunda və ya brauzerinizin defolt olaraq faylları yerləşdirdiyi yerdə yerləşir. Baş hərflər.c tapdığınız zaman onu seçmək üçün üzərinə bir dəfə klikləyin, sonra Açıq düyməsini basın.
  10. Yenidən Fayl əlavə et klikləyin .
  11. caesar.c tapın və açın.
  12. vigenere.c faylı üçün də eyni şeyi edin .
  13. Yükləməyə başlayın. Fayllarınız CS50 serverlərinə yüklənəcək .
  14. Görünən ekranda Fayl Seçilməmiş pəncərəni görməlisiniz . Siçan kursorunu sola aparsanız, yüklənmiş faylların siyahısını görəcəksiniz. Təsdiq etmək üçün onların hər birinə klikləyin. Əgər bir şeydən əmin deyilsinizsə, eyni addımları təkrarlayaraq faylları yenidən yükləyə bilərsiniz. Bunu 2016-cı ilin sonuna qədər istədiyiniz qədər edə bilərsiniz.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION