[Powered by Google Translate] [Walkthrough - Set Problema 2]
[Zamyla Chan - Universitatea Harvard]
[Acest lucru este CS50. CS50.TV]
Bine. Bună ziua, tuturor, si bun venit la Walkthrough 2.
În primul rând, vreau să vă felicit pentru finisare PSET 1.
Știu că ar fi putut fi un pic greu pentru unii dintre voi,
ar fi putut fi primul program de computer care ai scris,
dar amintiți-vă doar că, la sfârșitul acestui, atunci când te uiți înapoi la sfârșitul semestrului,
te vei uita la PSET 1 și vei spune, "Hei, am fi putut face asta în 5 minute."
Deci, știu și au încredere că, la sfârșitul acestui veți găsi cu siguranță un PSET destul de simplu.
Dar pentru moment este o mare realizare, si felicitari pentru obtinerea făcut.
Acum, de asemenea, o notă de rapid înainte de a intra în carne de walkthrough.
Vreau doar să fac o scurtă notă pe care am, uneori, nu va avea timp suficient
în timpul walkthroughs pentru a merge prin fiecare singur mod de a face set de probleme
și să se concentreze mai degrabă doar poate pe 1 sau 2 fel de implementări,
moduri în care ai putea face acest lucru.
Dar asta nu este de a spune că este interzis de a face în alt fel.
Există de multe ori, ca și în informatică, numeroase moduri de a face lucrurile,
și astfel se simt cu siguranta liber să utilizați un alt tip de soluție decât poate am prezentat.
[PSET 2: Crypto - Zamyla Chan - zamyla@cs50.net]
[Pset2 - 0. O Secțiunea de întrebări - 1. Cezar - 2. Vigenere]
Bine. Deci, problema set 2: Crypto este o distracție unul.
Din nou, cu fiecare PSET veți începe cu o secțiune de întrebări
care va fi realizată în secțiunile cu colegul tău de predare alocate.
Noi nu suntem de gând să treacă prin acestea pe walkthrough,
dar ele cu siguranta vor ajuta să completați PSET.
Deci, prima parte a setului problema este Cezar.
Și astfel, în Cezar cineva va trece o cheie cu un număr întreg,
și vă va cripta un șir de text pe care le va oferi
și să le dea înapoi un lucru criptat.
Dacă cineva urmărit o poveste de Crăciun, există un exemplu de faptul că există.
Apoi, a doua parte a setului problema este Vigenere,
care este o tehnica de criptare mai avansat.
Și așa vom codifica o bucată de text,
cu excepția cazului în schimb, cu doar un singur număr întreg, de fapt, suntem de gând să-l codifica
cu un cuvânt cheie care utilizatorul ne va oferi.
Ok, deci primul instrument din caseta de instrumente de astăzi este, de fapt va fi actualizarea aparatului.
Pe forumul de discuții ne-ar vedea lucruri de genul, "De ce nu acest lucru?"
"De ce nu se supune 50 de lucru?"
și, adesea, soluția este de fapt doar pentru a actualiza aparatul.
Și așa, dacă aveți doar într-o fereastră terminal sudo în aparatul dumneavoastră yum-y -
asta e un steag spune da, actualizat totul - de actualizare,
apoi aparatul va actualiza dacă e nevoie.
Și nu strica daca deja sunt la cea mai recentă versiune a aparatului.
Apoi va spune doar nu noi actualizări disponibile și puteți continua să lucreze de-a lungul.
Dar acest lucru este bun pentru a executa chiar și de fiecare dată când deschideți aparatul
pentru ca suntem inca foarte mult -
uneori, daca ajungem intr-un bug - fixându-l în aparat.
Deci, asigurați-vă că aveți cea mai recentă versiune a aparatului
și executați actualizarea acolo.
Bine. Deci, din moment avem de a face cu litere se schimba, enciphering lucruri,
am de gând să doriți cu adevărat să devină cei mai buni prieteni cu graficul nostru ASCII.
Există numeroase sunt cele on-line, în cazul în care veți găsi. Poate chiar să faceți propriile dvs..
Practic, cu fiecare literă și fiecare număr și fiecare caracter
există un număr asociate cu acestea,
si asa ca e bine sa vezi valorile lor ASCII alături de scrisoarea real.
Acest lucru va ajuta cu siguranta in setul problema.
Un lucru care ma ajutat în acest set problemă a fost pentru a imprima de fapt l,
si cum am fost trece prin, aș trage pe ea, de fapt,
scrie, "Daca acest lucru trebuie să meargă până acolo, atunci ..."
Un fel de desena pe ea și marcați-l în sus, devin cei mai buni prieteni cu tabelul ASCII.
Apoi, avem câteva instrumente la dispoziție de alte noastră.
De data aceasta în loc să se efectiv de utilizare pentru toate de intrare a acestora
vom face o combinație.
Mergem să-i solicite unele de intrare,
dar, de asemenea, ne vom folosi doar argumente în linia de comandă.
Așa că atunci când se execută programul lor, de obicei, spui / salut., De exemplu,
în cazul în care programul a fost hello.c.
Dar de data aceasta în loc de a spune doar că, acestea pot pune cuvinte, argumente după aceea.
Și așa am de gând să folosească tot ce le trece în la noi ca input-ul lor, precum și,
astfel încât se deplasează dincolo de determinat pentru întreg, dar, de asemenea, folosind argumente în linia de comandă.
Și apoi vom merge in tablouri si snur, pe care vom fi folosind o mulțime la fel de bine.
Iată doar un exemplu de 1 tabela ASCII mini.
Așa cum am spus, fiecare literă corespunde unui număr,
și familiarizați-vă astfel cu asta. Acesta va veni la îndemână.
Și mai târziu, când vom începe să faci ceva de-a face cu ASCIIMath numere -
adunarea, scăderea ei - atunci cu siguranta bun pentru a se referi la acest tabel.
Deci, aici e un exemplu de cifru Cezar - ceva care le-ați jucat cu.
Acesta este doar o roată. În esență, există un alfabet exterior și apoi există un alfabet interior.
Deci, aici este un exemplu de cifru Cezar, dar cu o cheie de la 0.
În esență, A este aliniat cu A, B, este aliniat cu B, tot drumul până la Z.
Dar apoi spun am vrut o cheie de 3, de exemplu.
Apoi, ne-ar roti roata interioară, astfel încât acum se aliniază cu un D, ​​etc
Și astfel încât acesta este în esență, ceea ce am de gând să fac.
Noi nu avem o roată, dar ceea ce am de gând să faceți este să facă programul nostru
fel de schimbare alfabetul, împreună cu noi o anumită sumă de numere.
Deci, după cum am spus mai înainte, vom fi de-a face cu argumente de linie de comandă
precum si obtinerea un întreg.
Deci, modul în care un utilizator va rula programul Caesar este prin a spune. / Cezar
și apoi introducând un număr de după aceea.
Și că numărul reprezintă cheia, shift,
de câte ori ai de gând să se rotească roata interioară a cifrul lui Cezar dumneavoastră.
Și așa te văd aici un exemplu.
Dacă am intrat în litere de la A la L cifru Cezar noastră,
atunci ar intrare D prin O, pentru că e în fiecare scrisoare deplasat de peste 3 ori,
la fel ca exemplu de roata care ți-am arătat.
Deci, dacă ați introdus, de exemplu, Acest lucru este CS50!
atunci s-ar muta, de asemenea, toate scrisorile.
Si asta e un lucru important atât în ​​Cezar și Vigenere
este că vom sări peste orice litere non-.
Deci, orice spatii, caractere, etc, numere, vom pentru a le menține aceeași.
Suntem doar de gând să schimbe literele în acest caz.
Deci, după cum vedeți în roata, avem doar litere disponibile pentru noi,
așa că doresc doar pentru a schimba literele și cripta scrisorile.
Deci, primul lucru de făcut, ați văzut că utilizarea de Cezar în problema set 2
este de a rula Cezar și apoi introduceți un număr, atunci când îl rulați în terminal.
Deci, ceea ce trebuie să facem este de a obtine cumva acea cheie și de acces.
Și așa vrem să vedem într-un fel o să fie de-a doua linie de comandă argumentul.
Primul va fi / Cezar., Iar următoarea va fi numărul de tasta.
Deci, înainte de am avut int main (void) pentru a porni programele noastre C.
Vom coaja de spate un strat de un pic
și vedea de fapt că în loc de a trece în vid să funcționeze nostru principal
avem de-a face de fapt cu 2 parametri.
Avem un int argc și numit apoi o serie de siruri de caractere numit argv.
Deci, argc este un număr întreg,
și reprezintă numărul de argumente trecute în programul tău pentru a.
Și apoi argv este de fapt lista de argumente trecute.
Toate argumentele sunt siruri de caractere, și așa mai argv reprezintă o matrice, o listă, de siruri de caractere.
Hai sa vorbim despre matrici un pic.
Matrice sunt în esență, o structură de date nouă.
Avem Ints, am dublu, avem siruri de caractere, iar acum avem tablouri.
Matricile sunt structuri de date care poate conține mai multe valori de același tip,
astfel, în esență, o listă de orice tip dorit.
În esență, în cazul în care ai vrut-o listă de numere întregi All in 1 este variabilă,
atunci ar crea o nouă variabilă, care a fost de tip int matrice.
Deci, matrice sunt zero indexate, ceea ce înseamnă că primul element al array este la indicele 0.
Dacă matricea este de lungime 4, ca în acest exemplu, atunci elementul ultima ta ar fi la indexul 3,
care este de 4 - 1.
Deci, pentru a crea matrice, v-ar face ceva de genul asta.
Spuneți că ați vrut-o matrice dublu.
Acest lucru este valabil pentru orice tip de tip de date, totuși.
Deci spui ca vrei o matrice dublu. Să presupunem că doriți să-l numesc căsuța poștală.
La fel ca tine ar initializa orice altă dublă,
v-ar spune dublu și apoi numele, dar de data aceasta am pus între paranteze drepte,
și apoi numărul nu va fi lungimea de matrice.
Rețineți că, în matrice nu putem schimba niciodată lungime,
astfel încât să aibă întotdeauna să definească și să aleagă câte cutii,
câte valori matrice dvs. este de gând să dețină.
Deci, pentru a stabili valori diferite în matrice ta, ai de gând să utilizați această sintaxă text,
după cum puteți vedea pe diapozitiv.
Ai index 0 căsuța poștală va fi setat la 1,2,
Indicele căsuța poștală 1 set cu 2,4, etc
Deci, acum că ne-am revizuit un pic tablouri, hai să ne întoarcem la argc și argv.
Stim ca argv este acum un tablou de siruri de caractere.
Deci, atunci când un utilizator trece în - spun ei execută un program -
spun ei. / Bună ziua David Malan,
ce programul va face pentru tine deja este de fapt veni cu ceea ce argc și argv sunt.
Deci, nu aveți nevoie să vă faceți griji despre asta.
Argc, în acest caz, ar fi de 3, pentru că vede 3 cuvinte distincte separate prin spații.
Și așa, atunci matrice în acest caz, primul indice ar trebui să fie / Bună ziua.,
următoarea David, următoarea Malan.
Are cineva vedea imediat ce relația dintre argv,
matrice, și argc este?
Da. Vom ajunge în faptul că într-un exemplu în args.c.
Să vedem dacă putem profita de relația dintre 2.
Aici s-ar putea găsi că, în aparatul implicit cererea
pentru a deschide fișiere. c este uneori Emacs.
Dar am dori să se ocupe cu gedit, astfel încât ceea ce poți face este puteți să faceți clic dreapta pe fișierul dumneavoastră C,
du-te la Properties, Open With, și alege apoi gedit, Setați ca implicit,
iar acum programul ar trebui să deschidă în gedit loc de Emacs.
Eveniment.
Deci, aici am un program care doresc să imprime fiecare argument de linie de comandă.
Deci orice utilizator intrări, vreau să se întoarcă în esență, o înapoi pentru a le pe o linie nouă.
Deci, ce este o structură care să le putem folosi pentru a itera peste ceva -
ceva ce, probabil, folosit și în 1 PSET ta?
Dacă vrei să mergi printr-un număr stabilit de lucruri? >> [Elev] Pentru bucla.
Pentru bucla. Exact. Așa că să începem cu bucla for.
Avem pentru int i = 0. Să începem doar cu o variabilă initializare standard.
Am de gând să plece condiție pentru un set și apoi spune i + +, de gând să faci lucrurile acolo.
Bine.
Deci, gândire înapoi la argv, dacă argv este lista de argumente trecute în programul de la
și argc este numarul de argumente în program,
atunci înseamnă că argc este în esență o lungime de argv, drept,
pentru că nu vor să fie cât mai multe argumente ca valoarea argc.
Deci, dacă vrem să itera peste fiecare element din argv,
am de gând să doriți să acceseze de fiecare dată variabilă în argv, la indicele dat.
Care pot fi reprezentate cu asta, nu?
Această variabilă reprezintă aici șirul special în acest caz
pentru că este o matrice șir - șir special, de la acel index dat.
Ceea ce vrem să facem, în acest caz, vrem să-l imprimați, așa că hai să spunem printf.
Și acum argv este un șir, așa vrem să afișezi că substituent acolo.
Ne dorim o nouă linie doar pentru a face să arate bine.
Deci, aici avem o buclă pentru. Noi nu avem încă condiție.
Asa ca am incepe de la 0, apoi de fiecare dată când va imprima șir dat
la faptul că indicele special în matrice.
Așa că atunci când vrem să oprim imprimând elemente din matrice?
Când am terminat, nu? Când am ajuns la sfârșitul matrice.
Deci, nu vrem să depășească trecutul lungimea de matrice,
si noi deja știm că nu trebuie să efectiv găsi activ ce lungimea de argv este
, deoarece este dat pentru noi, și ce-i asta? Argc. Exact.
Așa că vrem să facem acest număr argc proces de ori.
Eu nu sunt în directorul corect.
Bine.
Acum, hai să facem args. Nu există erori, ceea ce este minunat.
Deci, hai sa ruleze doar args.
Ce este acest gând să se întoarcă la noi? Este doar o să-l imprimați din nou.
"Ai introduse args în program; am de gând să-l dea înapoi la tine."
Deci, haideți să spunem că vreau să spun args, apoi foo bar.
Deci, atunci îl tipărește înapoi la noi. În regulă?
Deci nu este un exemplu de modul în care puteți utiliza argc și argv
știind că argc reprezintă lungimea de argv.
Asigurați-vă că nu face vreodată cu acces matrice cea de dincolo de lungimea matrice
deoarece C cu siguranta vor striga la tine.
Veți obține ceva numit o eroare de segmentare,
care nu este distractiv, de fapt spui că încercați să îl accesați ceva
că nu există, nu vă aparține.
Deci, asigurați-vă că, și în special cu zero indexare, nu vrem să -
Ca de exemplu, în cazul în care avem o serie de lungime 4,
că indicele matrice 4 nu există pentru că vom începe de la 0, de la zero index.
Acesta va deveni oa doua natura la fel ca pentru bucle când vom începe de la 0.
Așa că ține doar că în minte.
Tu nu vrei să acceseze vreodată indicele de o matrice care este dincolo de puterea ta.
Deci, putem vedea acum cum putem fel de acces
argumentele liniei de comandă, care sunt transmise inch
Dar, după cum ați văzut șir, argv este de fapt o matrice șir.
Deci, nu e de fapt un întreg încă, dar în Cezar vrem să se ocupe de numere întregi.
Din fericire, există o funcție creată pentru noi, care poate converti de fapt, un șir de la un număr întreg.
De asemenea, aici nu avem de-a face cu datele introduse de utilizator în cazul în care ne le-a determinat
pentru intrare aici pentru cheie, astfel încât nu putem reprompt de fapt, și spune,
"Oh, da-mi un alt număr întreg, spun, dacă nu e valid."
Dar avem nevoie de încă pentru a verifica utilizarea corectă.
În Cezar sunt permise doar pentru a trece în 1 numar,
și astfel ei trebuie să ruleze / Cezar. și apoi ei trebuie să vă dau un număr.
Deci, argc trebuie să fie un anumit număr.
Ce număr ar fi că în cazul în care trebuie să treacă tine / Cezar. Și apoi o cheie?
Ce este argc? >> [Elev] 2. Doi >>. Exact.
Deci, doriți să vă asigurați că argc este 2.
În caz contrar, refuză practic pentru a rula programul.
În principal este o funcție care spune int principal,
Și apoi am mereu la 0 bună practică retur, la sfârșitul unui program de succes.
Deci, dacă, să zicem, ei vă dau 3 argumente în linia de comandă în loc de 2
sau dau 1, de exemplu, atunci ce vei face e veți dori să verificați că
și a reveni apoi o spun, nu, eu nu pot continua cu acest program.
[Elev] Nu poate fi un spațiu în text. Scuză-mă >>?
[Elev] Nu poate fi un spațiu în textul pe care încercați să criptați.
Ah!
În ceea ce privește textul pe care noi încercăm să cripta, care de fapt vine mai târziu
când ne dau acel text.
Deci, acum suntem doar accepta ca argumente de comandă numărul real,
schimbare reală pentru criptare Cezar.
[Elev] De ce ai nevoie de 2, spre deosebire de doar 1 argc? Există cu siguranță un număr.
Corect. Motivul pentru care am nevoie de 2 pentru argc în loc de 1
se datorează faptului că atunci când executați un program și să spună. / Cezar sau / Bună ziua.,
că de fapt contează ca un argument de linie de comandă.
Deci, care deja ocupă 1 și așa, apoi vom introducerea 1 suplimentar.
Deci, te introducerea de fapt, un șir în argumentul linia de comanda.
Ce vrei să faci, pentru Cezar dorim a face cu un număr întreg,
astfel încât să puteți folosi această funcție atoi.
Și, practic, tu treci într-un șir și apoi se va întoarce înapoi un număr întreg
în cazul în care este posibil să se facă că într-un întreg șir.
Acum imi amintesc cand avem de a face cu lucruri printf sau getString, cum ar fi faptul că,
includem bibliotecile care sunt specifice pentru noi.
Deci, la început am începe cu un hash tag standard de I / O, H,. Ceva de genul asta.
Ei bine, nu este atoi în una dintre aceste biblioteci,
Deci, ceea ce trebuie să facem este să avem includă dreptul de bibliotecă pentru asta.
Deci, amintesc înapoi la Walkthrough 1 unde am discutat despre funcția manuală.
Tastați om în terminalul dumneavoastră și apoi urmat de numele unei funcții.
Și așa, care va aduce o listă întreagă de utilizare a acestuia,
dar la fel de bine se va aduce la care biblioteca care aparține.
Asa ca las asta la tine pentru a utiliza funcția manuală cu atoi
și dau seama care biblioteca trebuie să includă pentru a putea utiliza funcția atoi.
Deci, ne-am luat cheia și acum este vorba de text simplu,
și astfel că de fapt va fi introduse de utilizator în cazul în care vă cere.
Ne-am ocupat cu GetInt și GetFloat, și astfel, în aceeași ordine de idei
vom face cu getString.
Dar în acest caz nu avem nevoie de a face orice do în timpul sau în timp ce bucle pentru a verifica.
GetString va da cu siguranta ne un șir de caractere,
și am de gând să cripta orice utilizator ne-o dă.
Deci, se poate presupune că toate aceste siruri de caractere introduse de utilizator sunt corecte.
Mare.
Deci, odată ce ați luat cheia și după ce ați luat textul,
Acum, ceea ce a mai rămas este ca trebuie sa cifrare plaintext.
Doar pentru a acoperi rapid peste jargonul, plaintext este ceea ce utilizatorul ți-o dă,
și textul cifrat este ceea ce vă întoarceți la ele.
Deci, siruri de caractere, pentru a putea trece prin efectiv literă cu literă
pentru că trebuie să schimbe în fiecare scrisoare,
Noi înțelegem că siruri de caractere, dacă ne un fel de coaja înapoi strat,
vom vedea că acestea sunt într-adevăr doar o listă de caractere.
Una vine după alta.
Și astfel putem trata siruri de caractere ca matrice, deoarece acestea sunt matrice de caractere.
Deci, să spunem că aveți un șir de nume de text,
și în care textul este variabilă este stocat Aceasta este CS50.
Apoi, textul de la indicele 0 ar fi un T de capital, indice 1 ar fi h, etc
Și apoi cu matrice, în exemplul argc în args.c,
am văzut că am avut pentru a itera peste o matrice
și astfel am avut de a repeta de la i = 0 până i este mai mică decât lungimea.
Deci, avem nevoie de un mod de a imaginind ce lungimea șirului nostru este
dacă am de gând să itera peste el.
Din fericire, din nou, există o funcție acolo pentru noi, deși mai târziu în CS50
vei fi cu siguranta capabil să pună în aplicare și să facă funcția ta
care poate calcula lungimea unui șir.
Dar de acum vom folosi lungimea șirului, așa strlen.
Ai treci într-un șir, și apoi se va întoarce vă un int care reprezintă lungimea șirului tău.
Să ne uităm la un exemplu de modul în care am putea fi capabili de a repeta peste fiecare caracter într-un șir
și de a face ceva cu asta.
Ceea ce vrem să facem este itera peste fiecare caracter din șir,
și ceea ce vrem să facem este ne imprima inapoi fiecare personaj 1 până la 1
cu excepția vom adăuga ceva de lângă ea.
Așa că să începem cu bucla for. Int i = 0.
Vom lăsa spațiu pentru starea.
Dorim să itera până când vom ajunge la sfârșitul șirului, nu?
Deci, atunci ceea ce ne dă funcția de lungimea șirului?
[Răspuns studentul neauzit]
Asta e lungimea argumentele de linie de comandă.
Dar pentru un șir dorim să utilizați o funcție care ne dă lungimea șirului.
Deci, asta e lungimea șirului.
Și da, atunci va trebui să treci într-un șir să-l.
Este nevoie să știe ce șir are nevoie pentru a calcula lungimea.
Deci, în acest caz, avem de-a face cu sfoară uri.
Mare.
Deci, atunci ceea ce vrem sa facem, hai să printf.
Acum, vrem să se ocupe de caractere. Dorim să imprime fiecărui caracter individual.
Când doriți să imprimați un float, ar trebui să utilizați substituentul ca f%.
Cu o int v-ați putea folosi d%.
Și astfel în mod similar, cu un caracter utilizați c% să spun că voi fi imprimarea unui caracter
care este stocat în interiorul unei variabile.
Deci avem acest lucru, și să adăugați o perioadă de un spațiu și de la ea.
Care sunt caractere folosim?
Vom folosi orice caracter suntem la a șir.
Deci, atunci vom folosi ceva cu sfoară,
dar vrem să fie accesarea anumit caracter acolo.
Deci, dacă un string este doar o matrice, atunci cum putem accesa elementele de matrice?
Avem aceste paranteze pătrate, iar apoi am pus indicele acolo.
Deci avem paranteze pătrate. Indexul nostru, în acest caz, putem folosi doar i. Exact.
Deci, aici ne spunem că vom fi imprimarea unui caracter, urmat de un punct și un spațiu,
și acest caracter va fi scrisoarea i-lea din s. șir nostru.
Mă duc pentru a salva asta. Bine.
Acum am de gând să ruleze lungimea șirului.
Deci, am avut un șir numit OMG, iar acum este accentuat și mai mult.
În mod similar, să spunem că, de fapt doriți să obțineți un șir de utilizator.
Cum am putea face acest lucru?
Înainte de a, cum am ajuns o int?
Am spus GetInt, nu? Dar acest lucru nu este int, deci hai să getString.
Să facem lungimea șirului. Aici nu am introduce un prompt de specific.
Deci, eu nu știu.
Am de gând să pun numele meu aici și așa, atunci eu pot face unul din acele lucruri
în cazul în care am atribui un cuvânt pentru fiecare scrisoare sau ceva de genul asta. Mișto.
Deci, asta e lungimea șirului.
Deci, ne-am întors la Cezar.
Avem câteva instrumente pe modul în care ne repeta peste un string,
cum ne accesa fiecare element în parte.
Deci, acum putem să ne întoarcem la programul.
Așa cum am menționat mai înainte, în tabelul ASCII, cel mai bun prieten,
te duci pentru a vedea numerele care sunt asociate cu fiecare literă.
Deci, spune aici plaintext noastră este că sunt amețit!
Apoi, fiecare dintre aceste caractere este de gând să aibă un număr și valoare ASCII asociate cu acesta,
chiar apostrof, chiar și spațiul, chiar semn de exclamare,
astfel încât veți dori să păstrați în minte.
Deci, spune cheia noastră că utilizatorul incluse în argumentul lor linia de comanda este de 6.
Asta înseamnă că pentru prima scrisoare, care este I, care este reprezentat de 73,
doriți să se întoarcă la ei orice scrisoare este reprezentat de valoarea ASCII de 73 + 6.
În acest caz, care ar fi 79.
Acum vrem să mergem la următorul caracter.
Deci, următoarea în indicele 1 din plaintext ar fi apostrof.
Dar amintiți-vă vrem doar să codifica litere.
Așa că vrem să vă asigurați că apostrof rămâne de fapt același,
că noi nu se schimba de la 39 la 45 este tot.
Ne dorim să-l păstrați ca un apostrof.
Așa că vrem să ne amintim să Numai cifrare literele
pentru ca ne dorim toate celelalte simboluri pentru a rămâne neschimbate în programul nostru.
Un alt lucru pe care ne-o dorim este de a păstra capitalizare.
Deci, atunci când aveți o majusculă, acesta ar trebui să rămână ca o majusculă.
Minusculelor ar trebui să rămână la fel de mici.
Deci, unele funcții utile pentru a fi în măsură să se ocupe numai cu litere enciphering
și să păstreze conservarea capitalizarea de lucruri
Este funcțiile isalpha, isupper, islower.
Și astfel încât acestea sunt funcții care returnează o valoare booleană.
Practic, adevărat sau fals. Este aceasta o majusculă? Este aceasta alfanumeric?
Este aceasta o scrisoare, în esență.
Deci, aici sunt 3 exemple de modul în care v-ați putea folosi această funcție.
Practic, ai putea testa dacă valoarea returnată la tine de faptul că funcția este adevărată sau falsă
bazează pe faptul că de intrare.
Ori faci ceva care nu codifica sau cifrate l sau asigurați-vă că este scris cu majuscule, etc
[Elev] Poți explica doar pe cei un pic mai mult și cum le folosesc? Da >>, pentru sigur.
Deci, dacă ne uităm înapoi, aici avem un capital eu, nu?
Deci știm că am merge la O pentru că am + 6 este O.
Dar vrem să ne asigurăm că O este mergi la a fi un O. de capital
Deci, practic, că este un fel de a merge pentru a schimba intrarea noastră.
Deci, dacă este majusculă sau nu va fi un fel de a schimba modul în care avem de a face cu ea.
Deci, dacă vom folosi funcția isupper pe acel index special,
astfel isupper ("I"), care se întoarce pentru noi adevărat, așa că știm că e superioară.
Deci, atunci bazat pe faptul că, mai târziu, vom merge într-o formulă
că veți fi utilizați pentru a comuta lucrurile în Cezar,
Deci, practic, acolo va fi o formulă ușor diferită dacă e scris cu majuscule
spre deosebire de litere mici. Asigurați-simț?
Da. Nu vă faceți griji.
Am vorbit un pic despre adăugarea 6 la o scrisoare, care nu face destul de sens
cu excepția cazului când un fel de înțeles că aceste caractere
sunt un fel de interschimbabile cu numere întregi.
Ce facem noi este că un fel de turnare utilizare implicite.
Vom merge în turnarea un pic mai târziu, în cazul în care luați o valoare și îl transforma într-un alt tip
decât a fost inițial.
Dar cu această PSET vom fi capabili de a utiliza alternativ un fel de caractere
și corespunzătoare acestora valori întregi.
Deci, dacă vă înveli pur și simplu un personaj cu doar ghilimele simple,
atunci vei fi capabil de a lucra cu ea cu numere întregi, care se ocupă cu ea ca un întreg.
Deci, C de capital se referă la 67. F litere mici se referă la 102.
Din nou, dacă vrei să știi aceste valori, uita-te la masa ta ASCII.
Așa că hai să mergem în câteva exemple de modul în care s-ar putea fi capabil de a scădea și se adaugă,
cum poți lucra de fapt, într-adevăr cu aceste personaje, le folosesc alternativ.
Eu spun că ASCIIMath va calcula adăugarea unui caracter la un întreg
și apoi afișează caracterul rezultant, precum și valoarea rezultantă ASCII.
Și așa că aici vreau să spun - se ocupă cu această parte Vom mai târziu -
dar în esență, spun că utilizatorul ar trebui să spun ASCIIMath ruleze, împreună cu o cheie,
și eu spun că această cheie va fi numărul de
cu care vom adăuga acest personaj.
Deci, observați că, de aici, eu cer o cheie,
de vreme ce eu cer ca ei să-mi dea un lucru,
Vreau doar să accepte / asciimath. Și o cheie.
Așa că am de gând să ceară ca argc este egal cu 2.
Dacă nu e, atunci am de gând să se întoarcă 1 și programul va ieși.
Deci, eu spun cheie nu va fi prima linie de comandă argumentul,
o să fie al doilea, și așa cum vedeți aici,
Am de gând să rândul său, că într-un număr întreg.
Apoi, am de gând să se stabilească un caracter pentru a fi r..
Observați că tipul de variabila Chr este de fapt un întreg.
Modul în care am putea folosi r ca un întreg este, prin încadrarea cu aceste ghilimele simple.
Deci, înapoi la declarația noastră printf în cazul în care avem un substituent pentru un caracter
și apoi un substituent pentru un număr întreg,
caracter este reprezentat de Chr, iar întreg este cheia.
Și așa, atunci vom adăuga în rezultatul 2, împreună.
Deci, vom adăuga r + orice tasta este,
și apoi vom imprima rezultatul asta.
Deci, hai sa facem asciimath. Este până la data de, așa că hai să ruleze doar asciimath.
Oh, dar vezi, nu face nimic pentru că nu a dat de fapt o cheie.
Deci, atunci când sa întors la doar 1, functia principala noastră, aceasta tocmai sa întors înapoi la noi.
Deci, atunci să treacă într-o cheie. Cineva mi dea un număr. >> [Elev] 4.
4. Bine.
Deci, r crescut cu 4 este de gând să ne dea v, care corespunde valorii de 118 ASCII.
Deci, atunci un fel de logic ca -
De fapt, pot să vă întreb, ce crezi că valoarea ASCII a r este dacă r + 4 este 118?
Atunci da, r este 114.
Deci, daca te uiti pe tabel ASCII, apoi, destul de sigur, veți vedea că r este reprezentat de 114.
Deci, acum că știm că putem adăuga numere întregi la caractere, acest lucru pare destul de simplu.
Suntem doar de gând să itera peste un șir ca și cum am vazut intr-un exemplu înainte.
Vom verifica dacă e o scrisoare.
Dacă este, atunci vom schimba prin orice cheie este.
Destul de simplu, cu excepția cazului când ajungi să-i placă acest lucru,
veți vedea că Z, reprezentată de 122, atunci s-ar da un caracter diferit.
Noi de fapt, doresc să rămână în alfabetul nostru, nu?
Deci, avem nevoie să aflăm un fel de fel de ambalaj în jurul valorii de.
Când ajungeți Zed și doriți să crească cu un anumit număr,
nu vrei să mergi în secțiunea dincolo de alfabetul ASCII;
doriți să-și încheie înapoi tot drumul spre A.
Dar tineti minte ce te păstrând caz.
Deci, știind că scrisorile nu poate deveni simboluri
la fel ca simbolurile nu sunt de gând să se schimbe, de asemenea.
În ultimul PSET cu siguranta ai nevoie pentru a nu,
ci o opțiune a fost de a pune în aplicare PSET dvs. lacomi cu ajutorul funcției modulul.
Dar acum suntem de fapt de gând să nevoie de a utiliza modulul,
așa că hai să mergem pe acest bit un pic.
În esență, atunci când aveți x modulo y, care vă oferă restul de x împărțit la y.
Iată câteva exemple aici. Avem 27% 15.
Practic, atunci când scade 15 din 27 de câte ori este posibil, fără negativ
, atunci veți primi 12 stânga peste.
Deci, asta e un fel de, în contextul matematica, dar cum putem folosi de fapt acest lucru?
Acesta va fi util pentru wrapover nostru.
Pentru aceasta, să spunem că am rugat pe toți să împartă în 3 grupuri.
Uneori, ai face acest lucru în grupuri și ceva de genul asta.
Spune-am spus, "Bine, vreau ca toți să fie împărțită în 3."
Cum ai putea face asta?
[Răspuns studentul nu se aude] Da, exact. Numără off. Bine.
Să facem asta, de fapt. Nu doriți să începeți?
[Elevii de numărare off] 1, 2, 3, 4.
Dar amintiți-vă ... >> [Elev] Oh, îmi pare rău.
Asta e un punct foarte bun.
Ai spus 4, dar noi, de fapt vreau să spun 1, deoarece vrem doar 3 grupuri.
Deci, cum - Nu, asta e un exemplu foarte bun, deoarece atunci cum ar putea să vă spun o?
Care este relația dintre 4 si 1?
Ei bine, 4 Mod 3 este 1.
Deci, dacă veți continua, v-ar fi 2.
Deci avem 1, 2, 3, 1, 2.
Din nou, tu ești de fapt, persoana cincea. Cum știi să spui 2 în loc de 5?
Tu spui 5 Mod 3 este 2.
Vreau să văd cât de multe grupuri de 3 sunt lăsate peste, atunci ce ordine am I.
Și astfel, atunci, dacă am continuat de-a lungul intreaga camera,
atunci vom vedea că suntem mereu aplicarea de fapt, funcția de mod de a ne
la fel de conta off.
Asta e un fel mai mult de exemplu concret despre cum ați putea folosi modulo
Sunt sigur că majoritatea dintre noi, probabil, au trecut prin acest proces
în cazul în care am avut de a conta pe.
Orice întrebări cu privire la modulo?
Acesta va fi destul de importantă pentru a înțelege conceptele de acest lucru,
așa că am dori să asigurați-vă că înțelegeți voi.
[Elev] În cazul în care nu există nici un rest, nu-l dau numărul real?
Dacă unul dintre cele 3 primul dintre ele l-au făcut, ar fi dat ceea ce ei le-au fost de fapt,
sau ar fi dat [neauzit] >> E o întrebare bună.
Atunci când nu există nici restul pentru modulo - astfel încât să spunem că aveți 6 Mod 3 -
că de fapt te dă înapoi 0.
Vom vorbi despre asta un pic mai târziu.
Oh, da, de exemplu, 3rd person - 3 mod 3 este de fapt 0, dar ea a spus 3.
Deci, asta e un fel de o captură interior, de exemplu,
cum ar fi în regulă, dacă este 0, atunci mod am de gând să fie 3rd person.
Dar o vom face intr-un fel de modul în care am putea dori să se ocupe cu ceea ce 0 este mai târziu.
Deci, acum avem cumva o modalitate de cartografiere Zed la scrisoarea dreapta.
Deci, acum am trecut prin aceste exemple,
am un fel de a vedea cum ar putea funcționa Cezar.
Veți vedea cele 2 alfabete și apoi le vezi schimbare.
Așa că hai să încercăm și să exprime faptul că, în ceea ce privește formula de.
Această formulă este, de fapt dat la tine în spec.,
dar hai sa un fel de privire prin ceea ce înseamnă fiecare variabilă.
Rezultatul final este nostru va fi cifrat.
Deci asta spune că personajul lea a cifrat
este de gând să corespundă caracterului lea al plaintext.
Asta are sens, deoarece vrem să fie garnitură întotdeauna aceste lucruri.
Așa că va fi caracterul lea al cifrat plus k, care este cheia noastră -
care face sens - iar apoi vom avea acest mod 26.
Amintiți-vă înapoi, atunci când am avut zed
nu am vrut să intru în personaj, asa ca am vrut sa-l modez
și tipul de folie in jurul alfabetul.
După ce v-ar Zed mergi la a, b, c, d, până când a ajuns la numărul corect.
Deci știm că Zed, în cazul în care + 6, ne-ar da f pentru că, după Zed vine a, b, c, d, e, f.
Așa că haideți să ne amintim știm sigur că Zed + 6 este de gând să ne dea f.
În valori ASCII, z este 122 și f este 102.
Așa că trebuie să găsim o cale de a face formula noastră Cezar să ne dea 102
după luarea în 122.
Deci, dacă vom aplica această formulă doar,% ('z' + 6) 26, care de fapt îți dă 24
deoarece 122 + 6 este 128; 128% 26 vă oferă 24 restul.
Dar asta nu înseamnă că într-adevăr f. Asta nu e sigur 102.
Asta nu e, de asemenea, scrisoarea 6 în alfabetul.
Deci, evident, trebuie să avem un fel de tweaking acest bit un pic.
În ceea ce privește alfabet regulat, știm că z este litera 26 și f este al 6-lea.
Dar suntem în informatică, așa că o să indice la 0.
Deci, atunci în loc de z reprezintă numărul 26, vom spune că e numărul 25
deoarece o este 0.
Deci, acum să se aplice această formulă.
Avem Z reprezentat de 25 + 6, care vă oferă 31.
26 și 31 mod vă oferă 5 ca un rest.
Asta e perfect pentru că știm că f este litera 5 în alfabetul.
Dar aceasta încă nu este f, corect? Încă nu este de 102.
Deci, atunci pentru acest PSET, o provocare va fi încercarea de a afla relația
între conversia între aceste valori ASCII și index alfabetic.
În esență, ceea ce veți dori să faceți, vreți să începeți cu valorile ASCII,
dar apoi doriți să traduceți cumva că într-un index alfabetic
apoi calcula ce scrisoarea ar trebui să fie - în esență, ceea ce indicele alfabetic este
a caracterului cifru - să traducem atunci că înapoi la valorile ASCII.
Așa că, dacă scoți tabel ASCII, apoi încercați și de a găsi relațiile dintre, să zicem, 102 și 5
sau 122 și 25.
Am primit cheia noastră de argumentele de linie de comandă, am ajuns plaintext,
l-am cifrate.
Acum, tot ce ne-am lăsat să faceți este să-l imprimați.
Am putea face acest lucru un cuplu de moduri diferite.
Ce am putea face este de fapt imprima ca vom merge de-a lungul.
Așa cum am repeta de-a lungul șir de caractere în,
am putea pur și simplu imprima doar dreptul, atunci când l-am calcula.
Alternativ, ai putea stoca, de asemenea, într-o matrice si au o serie de caractere
iar la sfârșitul itera peste care întreaga gamă și imprima-l.
Deci, aveți câteva opțiuni pentru asta.
Și amintiți-vă că% c va fi substituent pentru imprimarea unui caracter.
Deci nu avem Cezar, iar acum trecem la Vigenere,
care este foarte similar cu Cezar, dar doar puțin mai complexă.
Deci, în esență, cu Vigenere este ai de gând să fie într-un cuvânt cheie care trece.
Deci, în loc de un număr, ai de gând să aibă un șir,
și astfel încât va acționa în calitate de cuvinte cheie.
Apoi, ca de obicei, ai de gând să obțineți un prompt pentru un șir de utilizator
și cifrare, apoi ea și apoi să le dea înapoi cifrat.
Deci, după cum am spus, e foarte asemănător cu Cezar, cu excepția în loc de a trece printr-un anumit număr,
numărul este de fapt va schimba de fiecare dată la un personaj la.
Pentru a reprezenta numarul real de a schimba, este reprezentată de literele de pe tastatură.
Deci, dacă introduceți într-o schimbare de o, de exemplu, atunci care ar corespunde la o schimbare de la 0.
Deci, este din nou înapoi la index alfabetic.
Care ar putea fi util dacă te vezi cu care suntem de fapt, de-a face cu valorile ASCII
precum și scrisorile, precum și indicele alfabetic,
poate găsi sau a vă face propriul tabel ASCII care prezinta index alfabetic de la 0 până la 25,
la A la Z, iar valorile ASCII, astfel încât să puteți vedea un fel de relație
și schița și să încercați și de a găsi unele modele.
În mod similar, în cazul în care ați fost trecerea de la instanță anumite prin f -
și acest lucru este fie f litere mici sau majuscule -, atunci care ar corespunde la 5.
Suntem bine pana acum?
Formula pentru Vigenere este un pic diferit.
Practic, veți vedea că e la fel ca Caesar,
cu excepția în loc de doar k avem k indicele j.
Observați că nu suntem i folosind, deoarece, în esență, lungimea cuvântului cheie
nu este neapărat lungimea cifrat noastre.
Acest lucru va fi un pic mai clar atunci când vom vedea un exemplu că am un pic mai târziu.
Practic, dacă aveți o programul dvs. cu un cuvânt cheie de ohai,
atunci înseamnă că de fiecare dată, ohai va fi tura.
Deci, în funcție de ceea ce vă aflați în poziția de cuvinte cheie,
ai de gând să transfere dvs. anumite caractere text cifrat de această sumă.
Din nou, la fel ca și Caesar, vrem să ne asigurăm că vom păstra capitalizarea de lucruri
și am codifica numai litere, nu caractere sau spații.
Deci, uite înapoi la Cezar de funcțiile pe care le-ați folosit,
modul în care te-ai decis cum să schimbe lucrurile, și să aplice acest program de la dvs. aici.
Deci, hai sa harta asta.
Avem un text clar pe care l-am primit de la utilizator la getString
spun acest lucru ... este CS50!
Atunci avem un cuvânt cheie de ohai.
Primele 4 caractere sunt destul de simple.
Stim ca T va fi mutat cu o,
atunci h se va fi mutat de h, i se va fi mutat de către o.
Aici vei vedea că o reprezintă 0,
astfel încât, atunci valoarea finală este de fapt doar aceeași scrisoare ca înainte.
Atunci s este deplasată cu i.
Dar atunci aveți aceste perioade aici.
Noi nu vrem să codifica că, așa atunci nu ne schimba cu nimic
și imprima doar din perioada de neschimbat.
[Elev] Eu nu înțeleg cum știi că acest lucru este deplasată de - Unde ai - >> Oh, imi pare rau.
În partea de sus aici veți vedea că linia de comandă argumentul ohai aici,
care va fi cuvântul cheie.
Și așa, practic, te cu bicicleta de-a lungul caracterele din cuvântul cheie.
[Elev] Deci, o are de gând să se deplaseze aceeași -
Deci, o corespunde un anumit număr din alfabet.
[Elev] Corect. Dar de unde ai luat partea de la CS50?
Oh. Asta e în getString unde esti ca, "Dă-mi un șir pentru a codifica."
[Elev] Au de gând să vă dau acest argument pentru a schimba prin
și apoi veți cere șir prima ta. Da >>.
Așa că atunci când executați programul, au de gând să includă cuvinte cheie
în argumentele lor în linia de comandă atunci când îl rulați.
Apoi, odată ce ați verificat că le-am dat de fapt 1 și nu mai mult, nu mai puțin,
atunci ai de gând să le solicite un șir, să zicem, "Dă-mi un șir."
Deci, asta e în cazul în care, în acest caz, le-am dat acest ... este CS50!
Deci ai de gând să utilizați și de a folosi ca ohai si repeta peste.
Observați că aici am sarit peste criptarea perioade,
dar în ceea ce privește poziția noastră pentru ohai, următorul am folosit o.
În acest caz, e un pic mai greu pentru a vedea pentru că e 4,
Așa că să continuăm un pic. Doar stai cu mine aici.
Apoi, avem i și lui, care sunt apoi tradusă de către o si h, respectiv.
Atunci avem un spațiu, și așa mai apoi știm că nu sunt de gând să cifrare spațiile.
Dar observați că în loc de a merge la o în acest loc chiar aici,
suntem criptarea de o - nu știu dacă poți vedea că - chiar aici.
Deci nu e ca tine de fapt predeterminat, sa zicem, o merge aici, h merge aici,
A merge aici, am merge aici, o, h, a, i, o, h, a, i. Tu nu faci asta.
Ai schimba doar poziția dumneavoastră în cuvinte cheie
când știi că ai de gând să fie de fapt o scrisoare de criptare real.
Oare acest tip de sens?
Bine.
Deci, doar unele memento-uri.
Doriți să vă asigurați că ați avansa doar la scrisoarea următoare, în cuvântul dvs. cheie
în cazul în care personajul tău este în text clar o scrisoare.
Deci spune că suntem la o.
Am observat că următorul caracter, indicele i de plaintext, este un număr, de exemplu.
Atunci nu ne avansa j, indicele pentru a cuvintelor cheie, până când vom ajunge la o altă scrisoare.
Din nou, tu, de asemenea, doriți să vă asigurați că ați curbat la începutul cuvântului cheie
când ești la sfârșitul anului acesta.
Dacă vedeți aici, suntem la I, următorul trebuie să fie o.
Deci, doriți să găsiți o cale de a fi în măsură să curbat la începutul cuvântului cheie
de fiecare dată când ajunge la final.
Și astfel, din nou, ce fel de operator este utilă în acest caz, pentru ambalaj în jurul valorii de?
Ca și în numărarea oprit exemplu.
[Elev] sut semn. Da >>, semnul procent, care este modulo.
Deci, modulo va veni la îndemână aici, atunci când doriți să treacă peste indicele din ohai ta.
Și doar un indiciu rapid: Incearca sa te gandesti la ambalaj pe cuvinte cheie un pic ca pe numărare,
în cazul în care în cazul în care există 3 grupuri, 4-a persoană,
numărul lor, că ei au spus a fost de 4 Mod 3, care a fost de 1.
Deci, încercați și cred că de felul acesta.
După cum ați văzut în formulă, ori de câte ori aveți CI și apoi pi dar apoi kj,
doriți să vă asigurați că vă păstrați evidența acestora.
Nu aveți nevoie pentru a apela l-am, nu aveți nevoie pentru a apela-l j,
dar doriți să vă asigurați că vă păstrați evidența poziția pe care ești puțin în text clar ta
precum și poziția pe care ești puțin în cuvântul dvs. cheie
deoarece acestea nu sunt în mod necesar va fi aceeași.
Nu numai cuvinte cheie - ar putea fi o lungime complet diferit decât plaintext ta.
De asemenea, plaintext dumneavoastră, există numere și caractere,
așa că nu se va potrivi perfect împreună. Da.
[Elev] Există o funcție pentru a schimba?
Poți schimba o la capital A? Da >>, există cu siguranță este.
Puteți verifica afară - Cred că e toupper, totul cuvânt 1.
Dar atunci când sunteți încercarea de a cifru lucruri și să păstreze textul,
e cel mai bine pentru a avea practic cazuri separate.
Dacă e un majuscule, apoi doriți să schimbe prin prezenta
deoarece în formula ta, atunci cand te uiti inapoi cum trebuie să ne fel de du-te
alternativ între modul de reprezentare ASCII a numerelor
și efectivă indicele alfabetic, vrem să ne asigurăm
acolo va fi un fel de tipar pe care ai de gând să utilizați.
O altă notă privind modelul, de fapt.
Ai de gând să fi cu siguranta de-a face cu numere.
Încercați să nu folosiți numere magice, care este un exemplu de stil.
Deci, presupunem că doriți să ceva de fiecare schimbare de timp de către dori -
Ok, deci aluzie, un alt spoiler este atunci când ai de gând să fie ceva schimbarea
de către o anumită sumă, încercați să nu pentru a reprezenta cu un număr real
ci mai degrabă încercați și a vedea dacă puteți utiliza valoarea ASCII, care va face un fel de mai mult sens.
O altă notă: Pentru ca avem de-a face cu formule,
chiar dacă TF dvs. va ști ce fel de model s-ar putea folosi,
cel mai bine la tipul tau de comentarii explice logica, cum ar fi,
"Sunt folosind acest model, deoarece ..." și un fel de a explica succint modelul în comentariile tale.
[Aceasta a fost pas cu pas 2] În cazul în care nu există nici alte întrebări, atunci voi sta aici pentru un pic.
Noroc cu PSET dvs. 2: Crypto si multumesc ca ai venit.
[Elev] Multumesc. Multumesc >>.
[Media intro Offline]