JavaRush /Java Blog /Random-TL /Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 ...
Masha
Antas

Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6)

Nai-publish sa grupo
cs50 assignment para sa mga lecture 5 at 6 Narito ang mga lektura ng CS50: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Ang materyal na ito ay naglalaman ng 3 mga gawain, teoretikal na impormasyon tungkol sa mga ito at isang gabay sa pagkilos.

Mga layunin

• Maging mas malalim sa mga function at library • Maging pamilyar sa cryptography, magpatupad ng ilang simpleng cipher

Mga karagdagang materyales

https://reference.cs50.net/ - paliwanag ng mga function ng library na ginagamit sa panahon ng pagsasanay. Sa Ingles. http://computer.howstuffworks.com/c.htm mga pahina 11 – 14 at 39

Paghahanda

Mag-log in sa cs50.io update50 para matiyak na napapanahon ang bersyon ng iyong workspace. Kung hindi mo sinasadyang isara ang terminal window, pumunta sa View menu at tiyaking may checkmark sa tabi ng Console item (suriin ito kung hindi). Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 1 Mag-click sa (+), sa loob ng berdeng bilog sa frame ng terminal window, piliin ang Bagong Terminal . Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 2 Lumikha ng gumaganang direktoryo: mkdir ~/workspace/pset2 Tandaan na mayroong puwang sa pagitan ng mkdir at ~/workspace/pset2 . Upang recap, ~ ay nangangahulugan ng root directory, ~/workspace ay isang folder na tinatawag na workspace sa loob ng root directory, ~/workspace/pset2 ay isang direktoryo na tinatawag na pset2 sa loob ~/workspace . Ngayon tumakbo: cd ~/workspace/pset2 upang lumipat sa bagong direktoryo. Mukhang ganito ang command line: username:~/workspace/pset2 $ Kung may mali, ulitin ang mga hakbang. Maaari ka ring tumawag ng command history para tingnan ang huling ilang command sa magkakasunod na pagkakasunod-sunod. Maaari mo ring ilagay ang iyong cursor sa command line at pindutin ang pataas na arrow sa iyong keyboard upang tingnan ang lahat ng command sa pagkakasunud-sunod mula sa huling ipinasok hanggang sa una. Gamit ang down button maaari kang bumalik. Sa pamamagitan ng paraan, sa halip na i-type ang parehong mga utos sa bawat oras, maaari kang mag-scroll sa mga utos na nai-type mo na at isagawa muli ang mga ito sa pamamagitan ng pagpindot sa Enter. Maaaring napansin mo na eksaktong ginagawa ito ni David sa kanyang mga lektura. Ang mga gawain sa ikalawang linggo ay dapat i-save sa pset2 .

Gawain 0. Pagsisimula

Tingnan natin ang mga linya. Sa initials.c file, sumulat ng program na humihiling ng pangalan ng user (gamit ang GetString function na nakukuha natin ang pangalan bilang string) at pagkatapos ay ipapakita ang mga unang titik ng unang pangalan (o mga pangalan) at apelyido sa uppercase na walang mga puwang, mga tuldok o iba pang mga character, na may line feed lamang ( \n ). Ipinapalagay namin na ang mga user ay naglalagay lamang ng mga titik (mababa o malaki, o pareho) at isang puwang sa pagitan ng mga salita. Isaalang-alang na ang mga taong nagngangalang Joseph Gordon-Levitt, Conan O'Brien, o David J. Malan ay hindi gagamit ng programa. Upang suriin ang tamang operasyon ng programa, tawagan ang check50: Gusto mo bang makipaglaro sa pagpapatupad ng programa na inihanda ng kawani ng CS50? I-type ang linya: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Cryptography
Cryptography, ang agham ng pag-encrypt at pag-decipher ng impormasyon... Sa katunayan, ang mga naka-encrypt na mensahe ay umiral na mula pa noong sinaunang panahon, at ginamit ng mga hukbo upang magpadala ng mga lihim na mensahe. Well, ngayon ang iyong mga password sa Facebook at iba pang mga network ay naka-imbak sa naka-encrypt na form.

Gawain 1. Aba, Caesar!

Teoretikal na impormasyon
Pag-aaralan natin ang isa sa mga pinakasimpleng cipher - ang Caesar cipher, na pinangalanan sa emperador ng Roma. Sa cipher na ito, ang bawat titik ng teksto ay pinapalitan ng isa pa, na isang nakapirming bilang ng mga titik na mas mababa sa alpabeto. Ang nakapirming bilang ng mga titik na ito ay tinatawag na susi . Kaya, binago ng key 1 ang Latin na letrang C sa letrang D, at Z sa pamamagitan ng cycle sa A. Kung ang susi ay 3, ang letrang C ay magiging F, at Z sa C. Mga halimbawa: ginagamit namin ang Caesar cipher na may susi 5 sa salitang pusa. c -> h a -> f t -> y Caesar (cat, 5) = hfy Key = 7, word = computer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 3 Ang Caesar cipher ay simple, ngunit, sayang, hindi mapagkakatiwalaan (ito ay magkakaugnay na mga bagay!): para sa alpabetong Ingles mayroon lamang 25 na mga pagpipilian sa pag-encrypt, madaling dumaan sa lahat ng mga pagpipilian kahit na walang computer. Gayunpaman, ang Caesar cipher ay kadalasang ginagamit bilang isang hakbang sa iba pang mga cipher, tulad ng Vigenère cipher (higit pa tungkol doon sa susunod na talata). "I-mathematicize" natin ang Caesar cipher. Tukuyin natin ang plaintext sa pamamagitan ng letrang p, ang pi ay ang letra sa tekstong p na nasa posisyong numero i. Tawagin natin ang secret key letter k, c ang ciphertext, at ci ang letra sa ciphertext na nasa posisyon i. Pagkatapos ay maaari mong kalkulahin ang bawat titik ng cipher gamit ang formula: ci = (pi + k) % 26 Masanay sa pormalisasyon na ito, pinapayagan ka nitong i-program ang algorithm at ipahayag ang kahulugan ng cipher nang tumpak at maigsi. Kung ang key k = 13 at ang orihinal na tekstong p ay "Siguraduhing inumin ang iyong Ovaltine!", ito ang cipher na makukuha natin: Or fher gb qevax lbhe Binygvar! Tandaan na ang O (ang unang titik sa ciphertext) ay inilipat ng 13 posisyon mula sa titik B (ang unang titik sa orihinal na teksto) ). Ang parehong bagay sa letrang r (ang pangalawang titik sa encryption) ay inilipat ng 13 titik mula sa e (ang pangalawang titik sa orihinal). Ang pangatlong titik sa encryption, f, ay inilipat ng 13 titik mula sa s (ang pangatlo sa orihinal), dito tayo pumunta sa isang bilog mula z hanggang a. Ang Caesar cipher na may key 13 ay may espesyal na pangalan na ROT13 . Ito ay simetriko: paglalapat nito ng dalawang beses, bumalik tayo sa orihinal na teksto. Siyempre, mayroon ding ROT26, ang isang ito sa pangkalahatan ay super-secure, ngunit kung hindi mo malinaw na ipahayag ang iyong mga saloobin =).
Kundisyon
Sumulat sa file na caesar.c ng program na nag-e-encrypt ng text gamit ang Caesar cipher. Magbigay ng isang command line argument bilang input sa program: isang non-negative integer. Para sa pagiging simple, tawagin natin itong k. Kung ipapatupad ng user ang program nang walang mga argumento sa command line o may higit sa isang argumento, dapat magreklamo ang application at ibalik ang halaga 1 (ganito ang karaniwang pagtukoy ng mga error): return 1; Sa lahat ng iba pang mga kaso, sinenyasan ng program ang user para sa teksto upang i-encrypt, pagkatapos ay ipapakita ang text na naka-encrypt gamit ang key k (ibig sabihin, inilipat ang k na mga posisyon sa kanan kasama ang cycle). Kung ang teksto ay naglalaman ng mga character na nasa labas ng alpabetong Ingles, hindi binabago ng programa ang mga ito. Pagkatapos i-print ang ciphertext, lalabas ang application, main returns 0: return 0; Kung ang main ay hindi tahasang nagbabalik ng zero, awtomatiko itong ibinabalik (int ang talagang uri ng pagbabalik ng pangunahing, ngunit higit pa sa ibang pagkakataon). Ayon sa convention (ang mga patakaran ng magandang anyo sa programming), kung tahasan mong ibabalik ang 1 upang ipahiwatig ang isang error, dapat mo ring ibalik ang 0 bilang isang pointer sa matagumpay na pagkumpleto ng programa. Bagama't mayroon lamang 26 na letra sa alpabetong Ingles, ang k ay maaaring mas malaki sa 26. Sa esensya, ang key k = 27 ay magbibigay ng parehong resulta gaya ng k = 1, ngunit kailangan mong payagan ang user na magpasok ng anumang hindi negatibong numero na hindi lampas sa 2^31 – 26 (dapat itong magkasya sa int). Dapat ding isaalang-alang ng programa na ang mga maliliit na titik ay naka-encrypt sa maliliit na titik, at ang mga malalaking titik ay naka-encrypt sa malalaking titik. Saan tayo magsisimula? Dahil dapat tanggapin ng application ang halaga ng k nang direkta sa string ng argumento, ganito ang hitsura ng aming header ng pangunahing function: int main(int argc, string argv[]) Mula sa Kabanata 6, alam mo na ang argv ay isang hanay ng mga string. Ang array ay maaaring isipin bilang isang hilera ng mga locker sa isang gym. Ang bawat isa sa kanila ay may ilang kahulugan na nakatago. Sa aming kaso, sa loob ng bawat cell ay mayroong argumento tulad ng string Upang buksan ang unang locker, ginagamit namin ang argv[0], ang pangalawa - argv[1], at iba pa. Kung mayroon tayong mga n lock, kailangan nating huminto sa argv[n - 1], dahil ang argv[n] ay wala na (o umiiral, ngunit pag-aari ng iba, mas mabuting huwag natin itong hawakan). Kaya maaari mong ma-access ang k argument tulad nito: string k = argv[1]; Naniniwala kami na talagang mayroong isang bagay doon! Alalahanin na ang argc ay isang int variable na katumbas ng bilang ng mga row sa argv. Nangangahulugan ito na mas mahusay na suriin ang halaga ng argc bago subukang buksan ang cell, dahil maaaring lumabas na wala ito. Sa isip argc = 2. Bakit ganito? Sa loob ng argv[0] ay karaniwang ang pangalan ng programa. Iyon ay, ang argc ay palaging hindi bababa sa 1. Ngunit ang aming programa ay nangangailangan ng gumagamit na magbigay ng isang command line argument k, samakatuwid, argc = 2. Naturally, kung ang gumagamit ay nagpasok ng higit sa isang argumento sa command line, ang argc ay lumalaki din at maaari ay mas malaki sa 2 Kung ang user ay nagpasok ng isang integer sa isang string, hindi ito nangangahulugan na ang inilagay na halaga ay awtomatikong maiimbak bilang isang int. Mas tiyak, HINDI. Ito ay magiging isang string, kahit na mukhang eksaktong int! Kaya kailangan nating i-convert ang string sa int ating sarili. Sa kabutihang palad, mayroong isang function na tinatawag na atoi na dinisenyo para sa layuning ito. Ang syntax nito ay: int k = atoi(argv[1]); Tandaan na ang k ay may uri na int, kaya maaari kang gumawa ng arithmetic dito. Gamit ang function na ito, hindi mo kailangang mag-alala kung ang user ay maglalagay ng integer o, sabihin nating, foo: sa kasong iyon, ang atoi ay magbabalik ng 0. Ang atoi function ay idineklara sa stdlib.h library , kaya siguraduhing # isama ito sa simula ng programa. Ang code ay mag-compile nang wala ito, dahil naisama na namin ang function na ito sa cs50.h library . Gayunpaman, mas mabuting magtiwala sa mga katutubong aklatan. Kaya nakaimbak ka bilang isang int. Ngayon ay humingi tayo ng text input. Kung ginawa mo ang mga takdang-aralin sa unang linggo, pamilyar ka na sa CS50 library function na tinatawag na GetString. Tutulungan niya tayo. Pagkatapos mong matanggap ang k at ang paunang teksto, simulan natin ang pag-encrypt. Upang recap, maaari mong ulitin ang lahat ng mga character ng isang string at i-print ang mga ito gamit ang sumusunod na loop: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Sa madaling salita, tulad ng argv ay isang array ng mga string, ang string ay isang array ng mga character. Samakatuwid, maaari kaming gumamit ng mga square bracket upang ma-access ang mga indibidwal na elemento ng string sa parehong paraan tulad ng pagkuha ng mga indibidwal na string sa argv. Siyempre, walang cryptographic tungkol sa pag-print ng bawat isa sa mga character. O, technically, kapag k = 0. Ngunit kailangan nating tulungan si Caesar na i-encrypt ang kanyang text! Mabuhay, Caesar! Upang magamit ang strlen, kailangan mong magsama ng isa pang library . Dahil nag-o-automate kami ng ilang mga pagsubok sa pagpapatunay, ang programa ay dapat kumilos nang eksakto tulad nito: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Bukod sa atoi , makakahanap ka ng iba pang mga cool na function sa ctype.h at stdlib.h library . Upang gawin ito, sundin ang link at maghalungkat doon nang kaunti. Halimbawa, ang isdigit ay malinaw na isang bagay na kawili-wili =). Kapag pupunta mula Z hanggang A (o mula z hanggang a), huwag kalimutan ang tungkol sa modulo operator %sa wikang C. Pag-aralan din ang talahanayan , ipinapakita nito ang mga character na ASCII hindi lamang para sa mga titik. Upang suriin kung gumagana nang tama ang programa sa check50 , gawin ang sumusunod: check50 2015.fall.pset2.caesar caesar.c At kung interesado kang maglaro gamit ang code na ginawa ng kawani ng CS50, patakbuhin ang command: ~cs50/pset2/caesar Siya nga pala, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Pagsusuri ng gawain
  1. Kunin ang susi
  2. Kumuha ng text
  3. I-encrypt
  4. Magpakita ng naka-encrypt na mensahe
1. Binubuo namin ang pangunahing pag-andar upang maipasok ng gumagamit ang susi sa linya ng command at suriin ang susi para sa kawastuhan. int main(int argc, string argv[]) argc: • int • bilang ng mga argumentong ipinasok sa command line • kung argc = 2 ang lahat ay ok. Kung hindi, i-print ang pagtuturo at isara ang programa. • Kung ang argc = 2 ay susuriin natin kung ang susi ay isang integer • Ang Argv ay isang hanay ng mga string, isang listahan na may mga argumentong ipinasok dito Ang Array ay isang istraktura ng data na naglalaman ng iba't ibang data ng parehong uri sa iba't ibang mga cell. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 4 Halimbawa, ipinasok ng user ang string blastoff Team Rocket, pagkatapos ay: Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 5 Gamit ang atoi() function, iko-convert namin ang resultang numero sa isang integer. Kung hindi ito posible, ang function ay magbabalik ng 0. Harvard CS50: Linggo 2 Takdang-aralin (Mga Lektura 5 at 6) - 6 2. I-prompt ang user para sa text. Ito ay simple: lahat ng ipinasok ng user ay isang string. 3. Pag-encrypt. Ang algorithm ay simple, ngunit paano mo maipapaliwanag sa computer kung aling mga titik ang magkakasunod? Oras na para alalahanin ang talahanayan ng ASCII! Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 7 Gayunpaman, maaaring mayroong higit pa sa mga letra sa isang string... Bago magpatuloy sa pagpapalit ng mga string, isipin na kailangan mo lang baguhin ang isang character. Gusto naming baguhin ang mga titik mula sa unang teksto, hindi ang mga palatandaan o numero. Ano ang dapat nating gawin? Una kailangan nating suriin kung ang karakter na ito ay nasa alpabeto. Magagawa ito gamit ang isalpha() function . Kung ang karakter ay nasa alpabeto, ang function na ito ay nagbabalik ng true at false kung hindi. Dalawa pang kapaki-pakinabang na function - isupper() at islower() return true kung uppercase o lowercase ang letra, ayon sa pagkakabanggit. Kaya: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Kung ang isalpha ay bumalik na totoo, kailangan nating baguhin ang character na ito gamit ang key. Isaalang-alang at suriin natin bilang isang halimbawa ang programa ni Zamili, ang CS50 assistant. Maaaring nagtataka ka kung bakit ang 'A' ay isang integer kung ito ay malinaw na isang titik. Lumalabas na ang mga simbolo at integer ay mapagpapalit. Sa pamamagitan ng paglalagay ng letrang A sa mga solong panipi, makukuha mo ang ASCII code nito sa int. Mag-ingat: kailangan mo ng mga solong quote; kung wala ang mga ito, ang compiler ay maghahanap ng variable na pinangalanang A, hindi isang simbolo. Pagkatapos, sa linya ay idinaragdag namin ang pangunahing halaga sa ASCII code ng titik at iniimbak ang mga ito sa isang integer variable. Kahit na ang resulta ay isang int, ginagamit ng printf statement ang %c placeholder para sa mga character. Kaya ang programa ay nagpi-print ng character na nauugnay sa resulta ng integer. Sa pangalawang kaso, ipinapakita namin ang numero gamit ang %d placeholder. Maaari mong ilagay ang code na ito sa cs50 IDE at laruin ito. Tingnan natin kung paano gumagana ang asciimath para sa iba't ibang key. Kunin natin ang halagang 25, makikita natin ang sumusunod na larawan: At ngayon hayaan ang susi na maging 26: Nakuha natin ang [, at hindi ang letrang A. Ito ay ang susunod na karakter ng ASCII pagkatapos ng Z. Kaya ang pagdaragdag lamang ng susi ay hindi trabaho. Kailangan nating gumamit ng cipher formula upang bumalik sa simula ng alpabeto sa sandaling maubusan tayo ng mga titik. Tandaan, isinulat na namin sa itaas: /* * 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: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 8Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 9ci = (pi + k) % 26 Kung saan ang ci ay letrang numero i sa ciphertext, pi ang letrang numero i sa plaintext, k ang susi, at %26 ang natitirang bahagi ng dibisyon ng 26 (o “modulo 26”). Ilapat natin ang formula na ito sa letrang Y. Kunin ang k = 2. Kalkulahin ang ('Y' + 2) %26 ASCII code ng letrang 'Y' = 89. Pagkatapos ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Ngunit hindi ito ang halaga ng ASCII ng letrang A na kailangan natin, na 65. Ngayon, bigyan natin ang bawat titik ng alpabeto ng halaga mula 0 hanggang 25 sa pagkakasunud-sunod. Sa kasong ito, Y = 24. (24+2)%26 = 0 Ang titik A ay may ganoong index. Kaya, ang formula na ito ay tumutukoy sa alpabetikong index ng mga titik, hindi ang kanilang mga halaga ng ASCII. Upang mag-print ng naka-encrypt na character kakailanganin mo ang halaga ng ASCII nito. At alamin kung paano lumipat sa pagitan ng isang halaga ng ASCII at isang numero sa alpabeto. Kapag naisip na natin ang formula para sa isang character, kailangan nating ilapat ito sa bawat titik sa string na ipinasok mula sa keyboard. Ngunit kung ito ay mga titik lamang! At tandaan, ang malalaking titik at maliliit na titik ay nangangailangan ng iba't ibang kahulugan. Dito magagamit ang isupper at islower function. Maaaring mayroon kang dalawang formula, isa para sa malalaking titik, ang isa para sa maliliit na titik, ang mga function ay makakatulong sa iyong piliin kung alin ang ilalapat. Paano mag-aplay ng isang formula sa bawat solong character sa isang string? Tandaan na ang isang string ay isang hanay lamang ng mga character. Tutulungan ka ng strlen function (haba ng string) na matukoy ang bilang ng mga pag-ulit sa isang loop .Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 10

Gawain 2. Parlez-vous français?

Teorya
Ang Vigenère cipher ay medyo mas ligtas kaysa sa Caesar cipher: gumagamit ito ng isang salita bilang susi at mahirap i-crack nang manu-mano gamit ang frequency analysis o brute force na nag-iisa. Ang bawat titik ng susi ay bumubuo ng isang numero, at bilang isang resulta nakakakuha kami ng ilang mga susi para sa paglilipat ng mga titik. Halimbawa: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 11 Kung ang bilang ng mga titik sa mensahe ay hindi nahahati sa key, ginagamit lang namin ang bahagi nito sa huling aplikasyon ng key: Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 12 Upang mahanap ang halaga para sa offset, ginagamit namin ang mga posisyon ng bawat titik ng aming bacon key sa alpabeto (mula a hanggang z). Nagbibilang kami mula sa simula, tulad ng mga tunay na programmer. At ang bawat titik sa orihinal na teksto ay inilipat ng isang naibigay na numero, tulad ng sa Caesar cipher, na bumabalik, kung kinakailangan, pagkatapos ng Z sa simula ng alpabeto. Kaya't ang M ay lilipat ng 1, ang unang e ay hindi gagalaw, at ang pangalawa ay lilipat ng 2 posisyon. Sa ibaba makikita mo ang orihinal na mensahe, ang nakasulat na susi at ang resulta ng aplikasyon nito. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 13 Ang Vigenère cipher ay, siyempre, mas malakas, ngunit kung alam mo ang haba ng susi, ito ay medyo madaling masira. Paano ito makilala? Kung ang orihinal na teksto ay may sapat na haba na ilang beses na lumilitaw ang ilang salita dito, makikita mo ang ilang pag-uulit: Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 14 Maaari ka ring gumamit ng brute force, ngunit maraming mga opsyon: 26^n – 1 kung saan ang n ay ang haba ng hindi kilalang key . Ngunit kadalasan ito ay marami. Totoo, hindi ito problema para sa isang computer. At ngayon ang matematika ng cipher: Hayaan ang p ay ilang teksto, k ang keyword, kj ang j-th na letra ng susi, pi ang letrang numero i sa orihinal na teksto, ci ang letrang numero i sa encryption . Pagkatapos: ci = (pi + kj) % 26
Mag-ehersisyo
Kundisyon Sumulat ng program vigenere.c na nag-e-encrypt ng mensahe gamit ang Vigenere cipher. Nagbibigay kami ng isang argumento ng command line sa input ng programa: ang keyword na k, na binubuo ng mga titik ng alpabetong Ingles. Kung ang application ay inilunsad na may higit sa isang argumento o may argumentong hindi kasama sa alpabeto, kinakailangang magpakita ng impormasyon ng error at wakasan ang programa. Iyon ay, babalik ang pangunahing 1 - sa kasong ito, mauunawaan ng aming mga awtomatikong pagsusuri na maayos ang lahat dito, at ang kundisyong ito ay isinasaalang-alang. Kung ang lahat ay maayos, ang programa ay dapat magpatuloy upang humiling ng isang text string p, na aming ine-encrypt gamit ang key k na nakuha sa itaas, i-print ang resulta at kumpletuhin ang programa, ibabalik ang halaga na 0. Paglilinaw Kinakailangang tiyakin na sa susi k ang mga character na A at a ay itinalaga bilang 0, B at b bilang 1, ..., Z at z bilang 25. Dapat ilapat ng programa ang Vigenère cipher lamang sa mga titik ng tekstong p. Ang natitirang mga character (mga numero, mga bantas, mga puwang) ay dapat na output nang walang mga pagbabago. Kung ilalapat ng algorithm ang jth character na k sa ith character na p na wala sa alpabeto, ilapat ang jth key character na iyon sa susunod na alphabetic character sa text; hindi mo pwedeng iwanan na lang at lumipat sa ibang karakter sa k. Sa wakas, ang programa ay dapat panatilihin ang kaso ng bawat titik sa p .
Hindi alam kung saan magsisimula?
Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 15
Narito ang ilang mga tip mula sa Zamilya, CS50 course assistant
Sa kabutihang palad, ang programa ay halos kapareho sa Caesar cipher, tanging ang susi ay isang string sa halip na isang integer. Kung matagumpay mong naipatupad ang cipher ng pangalan ng pinunong Romano, maaari itong maging isang magandang simula para sa pangalawang gawain. Marahil ay napagtanto mo na na ang Vigenère cipher na may isang titik bilang susi ay kapareho ng Caesar cipher. Ang algorithm ng Vigenère ay gumagamit ng parehong mga hakbang tulad ng Caesar:
  1. Kunin ang susi
    • Ang codeword ay ang pangalawang command line argument argv[1]
    • dapat nasa alpabeto: isalpha function
  2. Kumuha ng text
  3. I-encrypt
  4. Mag-print ng cipher text
Kaya, tingnan natin ang pangalawang command line argument argv[1] para makita kung kabilang ito sa mga alphabetic na character. Ginagawa namin ito gamit ang pamilyar na isalpha . Kung tama ang key, makakatanggap kami ng string mula sa user at magsisimulang mag-encrypt. Ang Vigenère cipher formula ay katulad ng Caesar cipher formula. Paano mo iko-convert ang isang titik sa katumbas na cipher offset? Subukang ihambing ang mga halaga gamit ang talahanayan ng ASCII. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 16 Malamang, makakahanap ka ng pattern sa pagitan ng mga titik at ng kanilang mga alpabetikong indeks gamit ang mga sequence sa talahanayan. Naisip mo ba kung paano ibawas ang isang titik mula sa isa pa upang makuha ang ninanais na resulta? Ang mga offset para sa malalaking titik at maliliit na titik ay pareho, kaya kailangan mong tukuyin ang dalawang magkatulad na mga formula upang matukoy ang offset para sa maliliit na titik at magkahiwalay para sa malalaking titik. Tandaan din na dapat balewalain ng text loop ang mga hindi English na character. At huwag kalimutang i-preserve ang letter case. Kung titingnan mo ang formula ng cipher: ci = (pi + kj) % 26 makikita mo ang dalawang variable ng index, i at j. Ang isa ay nagse-save ng posisyon sa pinagmulang teksto, ang isa sa susi. Kung ang iyong teksto ay mas mahaba kaysa sa susi, ang index sa susi ay mapupunta mula sa dulo ng susi pabalik sa simula. Paano ito gagawin? Gamit ang modulo division operation! Ang resulta ng operasyon ay ang natitira sa dibisyon ng dalawang numero. Ang mga praktikal na benepisyo ng operasyong ito sa programming ay napakalaki! Isipin na ang isang malaking grupo ng mga tao ay kailangang hatiin sa tatlong subgroup. Ang isang paraan para gawin ito ay hilingin sa kanila na magbayad para sa una, pangalawa, pangatlo. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 17 Ibig sabihin, ang unang tao ay kabilang sa unang pangkat, ang pangalawa sa pangalawa, ang ikatlo sa ikatlo, ang ikaapat sa una muli, at iba pa. Maaari mong gamitin ang modulo division upang maisagawa ang parehong operasyon. Bilangin natin ang parehong tatlong grupo mula sa simula. Narito kung paano ito gawin: Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 18 Kung kukuha ka ng isang index at hahatiin ito ng modulo sa pinakamataas na halaga, ang magreresultang resulta ay hindi kailanman hihigit sa o katumbas ng halagang iyon. Subukan ang prinsipyong ito upang ibalik ang isang keyword sa simula! Sa halip na pag-uri-uriin ayon sa pangkat, kailangan mo ang index ng keyword upang mai-offset mo ang tamang titik nang hindi lalampas sa haba ng key. Dahil ino-automate namin ang ilang pagsubok ng iyong code, dapat kumilos ang program tulad ng ipinapakita sa ibaba: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Paano mo pa masusubok ang program bukod sa manu-manong pag-compute ng ciphertext? Kami ay mabait: para dito isinulat namin ang program devigere . Kailangan ng isa at isang argumento ng command line (keyword), at ang trabaho nito ay kumuha ng ciphertext bilang input at ibalik ang plaintext. Patakbuhin ito: ~cs50/pset2/devigenere k Kung saan k ang keyword. Kung gusto mong suriin ang kawastuhan ng iyong programa gamit ang check50, patakbuhin ang: check50 2014.fall.pset2.vigenere vigenere.c At kung gusto mong suriin ang aming pagpapatupad ng vigenere, i-type ang: ~cs50/pset2/vigenere

Paano i-validate ang iyong code at makakuha ng mga marka

Pansin! Kung mahalaga para sa iyo na suriin lamang ang kawastuhan ng mga gawain, pagkatapos ay gamitin ang cs50check. Kung gusto mong makakuha ng mga marka sa edx platform, sundin ang pamamaraang inilarawan sa ibaba. Tandaan, ang pamamaraang ito ay gumagamit ng parehong cs50check upang suriin ang mga gawain. Ang pagkakaiba lang ay naaalala nito ang mga resulta at kinakalkula ang kabuuang marka.
  1. Mag-login sa CS50 IDE
  2. Malapit sa kaliwang sulok sa itaas ng CS50 IDE , kung saan matatagpuan ang file browser nito (wala sa terminal window), i-right-click ang iyong initials.c file na matatagpuan sa direktoryo ng pset2 at i-click ang I-download . Dapat mong makita na ang browser ay nag-load ng mga inisyal.c .
  3. Ulitin para kay caesar.c .
  4. Ulitin para sa vigenere.c .
  5. Sa isang hiwalay na window o tab, mag-log in sa CS50 Submit
  6. Mag-click sa icon na Isumite sa kaliwang sulok sa itaas ng screen. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 19
  7. Sa listahan ng mga folder sa kaliwa, mag-click sa direktoryo ng Problema Set 2 , pagkatapos ay mag-click sa button na Mag-upload ng Bagong Pagsusumite . Nasa kanan. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 20
  8. Sa lalabas na screen, mag-click sa Add files ... na buton. Magbubukas ang isang window para sa pagpili ng mga file mula sa iyong computer. Harvard CS50: Linggo 2 Mga Takdang-aralin (Mga Lektura 5 at 6) - 21
  9. Mag-navigate sa folder kung saan mo itinatago ang mga inisyal.c . Malamang na matatagpuan ito sa iyong folder ng Mga Download o saanman inilalagay ng iyong browser ang mga file bilang default. Kapag nahanap mo ang initials.c , i-click ito nang isang beses upang piliin ito, pagkatapos ay i-click ang Buksan.
  10. I-click muli ang Magdagdag ng mga file .
  11. Hanapin ang caesar.c at buksan ito.
  12. Gawin ang parehong para sa vigenere.c file .
  13. I-click ang Simulan ang pag-upload. Ang iyong mga file ay ia-upload sa CS50 server .
  14. Sa screen na lalabas, dapat mong makita ang No File Selected window . Kung ililipat mo ang iyong mouse cursor sa kaliwa, makakakita ka ng listahan ng mga na-download na file. Upang kumpirmahin, mag-click sa bawat isa sa kanila. Kung hindi ka sigurado tungkol sa isang bagay, maaari mong muling i-upload ang mga file sa pamamagitan ng pag-uulit sa parehong mga hakbang. Magagawa mo ito nang maraming beses hangga't gusto mo hanggang sa katapusan ng 2016.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION