[Powered by Google Translate] [Walkthrough - Problem Set 2] [Zamyla Chan - Sveučilište Harvard] [Ovo je CS50. CS50.TV] U redu. Pozdrav, svima, i dobrodošli na Walkthrough dva. Prvo, želim da vam čestitam na završnu pset jedan. Znam da je to moglo biti malo teško za neke od vas, mogao biti vaš prvi računalni program koji ste napisali, ali samo zapamtite da na kraju, kad se osvrnuti na kraju semestra, ćete pogledati pset jedan, a vi ćete reći: "Hej, ja mogao učiniti da se u pet minuta." Pa znate i povjerenja da će na kraju ove ćete sigurno pronaći pset jedna vrlo jednostavna. No, za sada je to veliki uspjeh, i čestitke za dobivanje učinio. Sada, također brzo napomena prije nego što smo dobili u mesa prohod. Ja samo želim da brzo umu da sam ponekad neće imati dovoljno vremena tijekom Walkthroughs proći kroz svaki način radi problema skup i radije samo možda usredotočiti na jedan ili dva vrste implementacije, načina na koje bi mogao to učiniti. Ali to ne znači da ste zabranjeno raditi na drugi način. Tu su često, kao i kod računalne znanosti, brojni načini obavljanja stvari, i tako definitivno slobodno koristiti neku drugu vrstu rješenja nego što sam mogao predstavljena. [Pset 2: kripto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Odsjek Pitanja - 1. Cezar - 2. Vigenere] U redu. Dakle Problem postaviti dva: kripto je zabavno jednom. Opet, sa svakim pset ćete početi s dijelom pitanja koji će se provoditi u odjeljcima s dodijeljenom nastave kolega. Nećemo ići kroz njih preko prohod, ali definitivno će vam pomoći dovršiti pset. Dakle, prvi dio problema setu je Cezar. I tako se u Cezara netko će proći vam ključ s cijelim brojem, i vi ćete kodirati niz teksta koji su vam pružiti te ih vratiti šifriranu stvar. Ako je itko gledao Božićna priča, tu je primjer da postoji. Onda drugi dio problema setu je Vigenere, što je više naprednih šifriranje tehnika. I tako ćemo se kodirati komad teksta, osim umjesto sa samo jednim cijeli, mi zapravo idemo ga kodirati s ključnom riječi koje će korisnik nam može dati. Ok, tako da je prvi alat u alatni danas zapravo će biti ažuriranju aparata. Na raspravu bismo vidjeli stvari poput: "Zašto ne ovaj posao?" "Zašto ne Submit 50 posao?" i često rješenje je zapravo samo ažurirati svoj uređaj. I tako, ako ste samo pokrenuti u prozor terminala u vašem aparata sudoku igra yum-y - to je zastava rekavši da, ažurirati sve - ažuriranje, onda tvoj uređaj će se ažurirati ako je potrebno biti. I to ne boli, ako ste već na najnoviju verziju uređaja. Tada će samo reći nema novih ažuriranja dostupna i možete nastaviti raditi zajedno. No, to je dobro za izvršenje čak svaki put kada otvorite aparat jer mi smo još uvijek jako puno - ponekad ako dođemo u bug - to popravljajući u aparatu. Dakle, pobrinite se da imate najnoviju verziju uređaja i pokrenuti kako ažurirati postoji. U redu. Dakle, budući da imamo posla sa slovima i mijenja, enciphering stvari, idemo stvarno želite postati najbolji prijatelji s našim ASCII tablici. Postoje brojni one online, ako vam. Možda čak napraviti svoj vlastiti. Uglavnom, sa svakim slovom i svakom broju i svaki lik je broj povezan s njima, pa to je dobro vidjeti njihove ASCII vrijednosti uz stvarne pismu. To definitivno će vam pomoći u problemu setu. Jedna stvar koja me stvarno pomogao u ovom problematikom set bio je zapravo ga ispisati, i kao što sam prolazio, ja bi zapravo privući na njega, napisati: "Ako ovo mora ići tamo, onda ..." Vrsta izvući na njega te ga obilježavati, postali najbolji prijatelji sa svojim ASCII tablice. Onda imamo nekoliko drugih alata na raspolaganju. Ovaj put umjesto zapravo pitajući korisnika za sve svoje ulaza idemo napraviti kombinaciju. Mi ćemo ih pitati za neki ulaz, ali mi smo također ćeš samo koristiti argumente naredbenog retka. Dakle, kada su pokrenuti svoj program, obično ti kažeš. / Halo, na primjer, ako vaš program je hello.c. No, ovaj put, umjesto samo govoreći da oni mogu staviti riječi, argumenti poslije. I tako ćemo koristiti sve što prođe u nas kao ulaz, kao i, tako da se kreće izvan samo navelo na cijeli, ali također koriste argumente naredbenog retka. A onda ćemo ići u polja i gudače, koji ćemo biti koristeći puno kao dobro. Evo samo primjer jedne mini ASCII tablici. Kao što sam rekao, svako slovo odgovara broju, i tako se upoznate s tim. To će doći u ruci. I kasnije, kada smo počeli raditi neke ASCIIMath bavi brojevima - dodavanjem, oduzimanjem ih - onda definitivno dobro da se odnosi na ove ljestvice. Dakle, ovdje je primjer Cezarova šifra - nešto što ste možda igrao s. To je samo kotač. U suštini, tu je vanjski abeceda i onda je unutarnji abeceda. Dakle, ovdje je primjer Cezarova šifra, ali s ključem od 0. U osnovi, usklađen je s A, B usklađen je s B, pa sve do Z. Ali onda reći da smo htjeli tipku 3, za primjer. Tada bismo rotirati unutarnji kotač, tako da sada poravnava s D, itd. I tako je to u suštini ono što ćemo učiniti. Mi nemamo kotač, ali što ćemo učiniti je naš program vrsta pomak abecedu zajedno s nama određenu količinu brojeva. Dakle, kao što sam rekao prije, idemo da se bave naredbenog retka argumente kao i dobivanje integer. Dakle, način na koji će korisnik pokrenuti Caesar program je govoreći. / Caesar , a zatim unesete broj nakon toga. I taj broj predstavlja ključ, prijenosa, koliko puta idete da se rotirajući unutarnji kotač svog Cezarova šifra. I tako vidite ovdje primjer. Ako smo ušli slova od A do L u našem Cezarova šifra, onda bi se ulaz D kroz O, jer da je svako slovo pomiče preko tri puta, baš kao primjer kotač koji sam vam pokazao. Dakle, ako ste unijeli, na primjer, ovo je CS50! onda bi također premjestiti sve od slova. I to je važna stvar u oba cara i Vigenere je da ćemo preskočiti bilo koji ne-slova. Dakle, svi prostori, likovi, itd, brojevi, idemo ih zadržati isti. Mi samo idemo prebaciti pisma u ovom slučaju. Dakle, kao što vidite na volanu, imamo samo slova na raspolaganju nama, tako da samo želimo prebaciti pisma i šifriranje slova. Dakle, prva stvar za učiniti, vidjeli ste da je običaj za Cezara u problemu postaviti dva je pokrenuti Cezar, a zatim unesite broj kada ga pokrenete u terminalu. Dakle, ono što trebamo napraviti je da nekako taj ključ i pristup. I tako želimo da se nekako vidi da će to biti drugi argument naredbenog retka. Prvi će biti. / Caesar, a sljedeći će biti ključni broj. Dakle, prije nego što smo imali int main (void) za početak naše C programe. Idemo piling leđa sloj malo i zapravo se vidi da umjesto donošenja u praznini našem glavnom funkcijom mi zapravo bave dvije parametara. Imamo int argc nazivom, a zatim niz žice zove argv. Dakle argc je cijeli broj, i to predstavlja broj argumenata donesenih u svom programu. A onda argv je zapravo popis argumenata donesenih. Svi argumenti su žice, i tako argv predstavlja niz, popis, u nizovima. Ajmo pričati o nizovima malo. Nizovi su u suštini nova struktura podataka. Imamo Ints, mi smo u parovima, imamo konce, a sada imamo polja. Nizovi su strukture podataka koje mogu držati više vrijednosti istog tipa, tako bitno, popis bez obzira na tip želite. U suštini, ako ste htjeli popis brojeva sve u jednom varijablom, onda će stvoriti novu varijablu koja je tipa int niz. Dakle, polja su nula-indeksirani, što znači da je prvi element niza je na indeksu 0. Ako polje je duljine 4, kao u ovom primjeru, onda tvoj zadnji element koji će biti na indeksu 3, što je 4-1. Dakle, stvoriti niz, što će učiniti ovako nešto. Recimo da je htio dvostruki niz. To vrijedi i za bilo koju vrstu podataka tipa, ipak. Dakle, recimo da želite dvostruki niz. Recimo da želite nazvati spremnik. Baš kao što bi bilo koji drugi inicijalizirati dvojnika, što će reći dvaput, a zatim ime, ali ovaj put smo stavili uglate zagrade, a zatim broj će biti duljina niza. Imajte na umu da u nizovima mi nikada ne možete promijeniti dužinu, tako da uvijek morate definirati i odabrati koliko okvire, koliko je vrijednosti vaša niz će se održati. Dakle, postaviti različite vrijednosti u vašoj polje, vi ćete koristiti ovu sljedeću sintaksu, kao što možete vidjeti na slajdu. Imate spremnik indeks 0 će biti postavljen na 1,2, spremnik indeks 1 komplet za 2,4, itd. Tako da sada smo pregledali polja malo, ajmo natrag na argc i argv. Mi znamo da je argv je sada niz žice. Dakle, kada korisnik prolazi u - kažu oni pokretanju programa - oni kažu. / Pozdrav David Malan, Što će program učiniti za vas već zapravo doći do onoga što argc i argv su. Dakle, ne morate brinuti o tome. Argc u ovom slučaju će biti 3 jer vidi tri različita riječi odvojene razmacima. I tako onda je polje u ovom slučaju, prvi indeks će biti. / Halo, Sljedeći David, pored jednog Malan. Da li itko odmah vidjeti što se odnos između argv,  polje, a argc je? Da. Mi ćemo ući da je u primjeru u args.c. Hajdemo vidjeti možemo li iskoristiti odnos između dva. Ovdje možete naći da je u aparatu zadani program otvoriti. C datoteke je ponekad Emacs. No, mi želimo da se bave gedit, tako što možete učiniti je da desni klik na C datoteci, idite na Properties, Open S, a zatim odaberite gedit, postavljena kao zadano, i sada je vaš program bi trebao otvoriti u gedit umjesto Emacs. Savršeno. Dakle, ovdje imam program koji želim isprintati svaki argument naredbenog retka. Dakle, bez obzira na korisničke ulazi, želim biti ga vratiti ih na novi redak. Dakle, ono što je struktura koja možemo koristiti za iteraciju više nešto - nešto što vjerojatno koristiti u vašem pset 1? Ako želite ići kroz određenog broja stvari? >> [Student] Za petlje. Za petlje. Točno. Dakle, počnimo s for petlje. Imamo za int i = 0. Ajmo početi sa standardnom inicijalizacije varijabli. Ja ću ostaviti uvjet za set i onda reći i + +, ide raditi stvari tamo. U redu. Dakle, misleći natrag argv, ako argv je popis argumenata donesenih u programu i argc je broj argumenata u programu, onda to znači da je u suštini argc duljina argv, desno, jer tu će biti onoliko argumenata kao vrijednosti argc. Dakle, ako želimo ponoviti nad svaki element u argv, idemo želite svakom trenutku pristupiti varijablu u argv na određenom indeksu. To može biti zastupljena s tim, zar ne? Ova varijabla ovdje predstavlja posebnu niz u ovom slučaju jer to je niz polje - osobito string na tom određenom indeksu. Ono što želimo učiniti, u ovom slučaju želimo da ga isprintati, pa recimo printf. A sada argv je niz, pa želimo staviti da rezervirano mjesto tamo. Želimo novu liniju samo da izgleda dobro. Dakle, ovdje imamo za petlju. Mi nemamo stanje još. Tako sam počinje na 0, a onda svaki put to će ispisati zadani niz u tom indeksu u polju. Dakle, kada ne želimo da se zaustavi ispis elemenata u nizu? Kad smo završili, zar ne? Kad smo došli do kraja niza. Dakle, mi ne želimo da prelazi prošlosti duljine niza, a mi već znamo da ne treba da se zapravo aktivno saznati što duljina argv je jer je dao za nas, i što je to? Argc. Točno. Dakle, želimo učiniti ovaj broj procesa argc puta. Nisam u pravom imeniku. U redu. Sada ćemo napraviti argumenata. Nema pogreške, što je super. Dakle, neka je samo pokrenuti args. Što se to događa da se vrate u nas? To samo će ga ispisati natrag. "Vi unesene args u program, a ja ću ga dati natrag na vas." Dakle, recimo da želimo reći args onda foo bar. Pa onda ga ispisuje natrag do nas. Sve u redu? Dakle, tu je primjer kako možete koristiti argc i argv znajući da argc predstavlja duljinu argv. Pobrinite se da nikada ne sa nizovima pristup jednom izvan duljine niza jer C definitivno će vikati na tebe. Vi ćete dobiti nešto što se zove segmentacija kriv, koja nikada nije zabavno, u osnovi govoreći da pokušavate pristupiti nešto da ne postoji, ne pripadaju vama. Tako bi bili sigurni, a posebno s nula-kazala, ne želimo da - Kao na primjer, ako imamo niz duljine 4, da niz indeks 4 ne postoji, jer smo počeli na 0, na nultom indeksu. Ona će postati druga priroda baš kao i za petlje, kada smo započeli na 0. Dakle, samo to na umu. Vi ne želite ikada pristupiti indeks niza koji je izvan vašeg dosega. Tako možemo vidjeti kako sada možemo vrsta pristupa naredbenog retka argumente koji su prošli u. Ali, kao što ste vidjeli string, argv je zapravo niz polje. Dakle, to zapravo nije cijeli broj, no u Cezara želimo baviti brojeva. Srećom, tu je funkcija stvorena za nas da se zapravo može pretvoriti string u cijeli broj. Također ovdje mi se ne bave korisničkog unosa gdje smo ih je navelo za ulaz ovdje za ključ, tako da zapravo ne može reprompt i reći, "Oh, daj mi još jedan cijeli, kažu, ako je to ne vrijedi." Ali mi još uvijek ne treba da provjerite za pravilno korištenje. U Cezara oni su dozvoljeni samo da prođe u jednom broju, i tako oni moraju pokrenuti. / Cezara i onda oni moraju vam dati broj. Dakle argc mora biti određeni broj. Koji broj da bi se, ako oni moraju proći vam. / Cezara i zatim ključ? Što je argc? >> [Student] 2. >> Dvije. Točno. Dakle, želite da biste bili sigurni da argc je dva. Inače osnovi odbijaju pokrenuti program. U glavnom to je funkcija koja kaže int main, pa onda smo uvijek u dobrom 0 praksa povratka na kraju uspješnog programa. Dakle, ako, recimo, oni vam dati tri argumente naredbenog retka umjesto 2 ili vam dati jedan primjer, a zatim ono što ćete učiniti je da ćete želite da provjerite da , a zatim se vratiti jednom rekao, ne, ja ne mogu nastaviti s ovim programom. [Student] Tu ne može biti prostor u vašem tekstu. >> Oprostite što? [Student] Tu ne može biti prostor u tekstu koji pokušavate šifriranje. Ah! U odnosu na tekst koji smo težak za šifriranje, koja zapravo dolazi kasnije kad smo dati taj tekst. Dakle, upravo sada smo samo prihvaćanjem kao zapovjednim argumenata stvarni broj, Stvarni pomak za Caesar enkripcijom. [Student] Zašto vam je potrebno dvoje, za razliku od samo jednog argc? Tu je definitivno jedan broj. Točno. Razlog zašto trebamo 2 za argc umjesto jednog je zato što kada pokrenete program i reći. / caesar ili. / halo, koji zapravo broji kao argument naredbenog retka. Pa onda da je već zauzima jedan i tako onda smo inputting 1 pomoćni. Dakle, ti si unosom zapravo niz u argument naredbenog retka. Što želite učiniti, za Cezara želimo baviti cijeli, tako da možete koristiti ovu funkciju atoi. I u osnovi, da prođe to u nizu, a onda će vam vratiti integer ako je moguće da bi taj string u cijeli broj. Sada se sjetiti kada smo se bave printf ili GetString, stvari kao što je to, smo uključiti knjižnice koje su specifične za nas. Dakle, na početku smo započeli s hash tag standardni I / O,. H, tako nešto. Pa, atoi nije unutar jedne od tih knjižnica, tako da ono što moramo učiniti je moramo uključiti pravo knjižnicu za to. Dakle sjetiti natrag Walkthrough jedan gdje sam se raspravljalo o priručnika funkciju. Možete upisati čovjeka u vašem terminalu, a zatim slijedi ime funkcije. I tako da će dovesti do cijeli popis njegove uporabe, ali, kao i to će dovesti do kojih knjižnica koja pripada. Dakle, ja ću ostaviti da vas koristiti priručnik funkciju atoi i shvatiti što knjižnica morate uključiti da bi mogli koristiti atoi funkcije. Tako smo dobili ključ, a sada je u pitanju dobivanje običan tekst, i to tako da zapravo će biti sfaust gdje zatražiti. Mi se bavila GetInt i GetFloat, i tako u istom duhu idemo se bave GetString. No, u ovom slučaju ne trebate učiniti bilo učiniti dok ili dok petlje provjeriti. GetString definitivno će nam dati niz, i mi idemo za šifriranje god korisnik nam daje. Dakle, možete pretpostaviti da su svi ovi korisnika unesene žice su točne. Izvrsno. Pa onda kad imaš tipku i jednom imaš tekst, Sada ono što je ostalo je da imate kodirati u čistim. Samo brzo da pokrije više žargon, cisti je ono što vam daje upute, i šifrirana je ono što im se vrate. Dakle, žice, da bi mogli proći kroz zapravo slovo po slovo jer imamo pomak svako slovo, mi razumijemo da konce, ako smo vrsta oguliti leđa sloja, vidimo da su oni samo jako popis likova. Jedan dolazi nakon druge. I tako možemo liječiti konce kao polja jer su nizovi znakova. Dakle, recimo da imate niz nazivom tekst, i unutar tog varijablu tekst je pohranjen Ovo je CS50. Zatim tekst na indeksu 0 će biti glavni T, indeks 1 bi h, itd. A onda s polja, u argc primjer u args.c, Vidjeli smo da smo morali ponoviti tijekom niz i tako smo se morali ponoviti od i = 0 do ja je manje od duljine. Dakle, trebamo neki način figuring out ono duljina naše string ako ćemo ponoviti preko njega. Srećom opet, tu je funkcija tu za nas, iako je kasnije u CS50 definitivno ćete biti u stanju provesti i napraviti svoj vlastiti funkciju koji se može izračunati duljinu niza. No, za sada ćemo koristiti string duljine, tako strlen. Možete proći u nizu, a onda će se vratiti vam int koji predstavlja duljinu niza. Pogledajmo primjer kako bismo mogli biti u mogućnosti ponoviti više svaki lik u nizu i učiniti nešto s tim. Ono što želimo učiniti je ponoviti više svaki karakter niza, i što želimo učiniti je ispisati smo natrag svaki lik jedne strane 1 osim što dodati nešto pokraj njega. Dakle, počnimo s for petlje. Int i = 0. Mi ćemo ostaviti prostor za uvjet. Želimo ponoviti dok smo do kraja niza, zar ne? Pa što onda funkcija nam daje duljinu niza? [Nečujno učenik odgovor] To je dužina od argumenata naredbenog retka. No, za niz želimo koristiti funkciju koja nam daje duljinu niza. Tako da je dužina niza. I tako onda morate proći u nizu na njega. To treba znati što string to treba izračunati duljinu. Dakle, u ovom slučaju imamo posla s niz s. Izvrsno. Pa onda ono što želimo učiniti, ajmo printf. Sada, želimo da se bave likovima. Želimo ispisati svaki pojedini lik. Kada želite da ispisati plovak, koju će koristiti rezervirano mjesto kao% f. Uz int bi koristili% d. I tako slično, s karakterom koristite% C reći ću se ispisuje karakter koji je pohranjen unutar varijable. Dakle, imamo ovo, i neka je dodati razdoblje i prostor za njega. Koji lik smo koristite? Mi ćemo biti koristeći god lik smo na u nizu. Pa onda idemo da se koristi nešto s nizom, ali želimo da se pristup određeni karakter tamo. Dakle, ako je samo niz polja, kako onda možemo pristupiti elemente polja? Imamo one uglate zagrade, a zatim smo stavili indeks tamo. Dakle, imamo uglate zagrade. Naš indeks u ovom slučaju mi ​​samo mogu koristiti. Točno. Dakle, ovdje mi govoriš da ćemo biti tiskanje znaka slijedi točkom i prostoru, i taj lik će biti ith pismo u našem niza s.. Samo ću spasiti da. Ok. Sada ću pokrenuti niz duljine. Dakle, imali smo niz nazivom OMG, a sada je još više naglašeno. Isto tako, ajmo reći da smo zapravo žele dobiti niz od korisnika. Kako bismo mogli to učiniti? Prije, kako smo dobili int? Mi smo rekli GetInt, zar ne? Ali to nije int, pa ajmo GetString. Učinimo string duljine. Ovdje nismo unijeti određenu brz. Dakle, ne znam. Ja ću staviti svoje ime ovdje i tako onda ja mogu učiniti jedna od onih stvari gdje sam dodijeliti riječ za svako slovo ili nešto slično. Cool. Tako da je dužina niza. Dakle, vratili smo se caru. Imamo nekoliko alata kako bismo ponoviti tijekom niza, kako smo pristupili svaki pojedini element. Dakle, sada možemo vratiti na programu. Kao što sam spomenuo prije, u ASCII tablici, vaš najbolji prijatelj, ćeš vidjeti brojeve koji su povezani sa svakim slovom. Dakle, ovdje reći da je naša cisti je sam vrtoglavicu! Onda svaki od tih znakova će imati broj i ASCII vrijednost povezane s njom, čak apostrof, čak i prostor, čak i uskličnik, tako da ćete želite zadržati na umu. Tako recimo naše tipku da korisnik uključeni u njihov argument naredbenog retka je šest. To znači da za prvo slovo, što je sam, koji je predstavljen 73, Želite li se vratiti na njih bez obzira na pismo predstavlja ASCII vrijednost 73 + 6. U ovom slučaju to bi bilo 79. Sada želimo ići na sljedeći znak. Dakle, sljedeći u indeksu 1. čistim bi biti apostrof. Ali zapamtite samo želimo da kodirati slova. Dakle, želimo biti sigurni da je apostrof zapravo ostaje ista, da mi ne mijenjaju od 39 do 45 što god je. Želimo ga zadržati kao apostrof. Dakle, želimo se sjetiti samo kodirati slova jer želimo sve druge simbole ostati nepromijenjena u našem programu. Još jedna stvar koja želimo je očuvati kapitalizaciju. Dakle, kada imate veliko slovo, to bi trebalo ostati kao velika slova. Lowercases treba ostati kao malim slovima. Dakle, neke korisne funkcije moći nositi sa samo enciphering slova i držati očuvanje kapitalizaciju stvari je isalpha, isupper, islower funkcije. I tako su funkcije koje vraćaju vam Boolean vrijednost. Uglavnom, istina ili laž. Je li ovo veliko? Je li ovo alfanumerički? Je li ovo pismo, u suštini. Dakle, ovdje su tri primjera kako bi koristili tu funkciju. Uglavnom, da bi mogao testirati je li vrijednost vraća vas tu funkciju je istinita ili lažna temelji se na taj ulaz. Ili ne kodirati nešto ili ga Cipher ili bi bili sigurni da je to veliko, itd. [Student] Može li samo objasniti one malo više i kako ih koristiti? >> Da, to je sigurno. Dakle, ako gledamo unatrag, ovdje imamo kapital I, zar ne? Dakle, mi znamo da sam ide u O jer sam + 6 je O. No, mi želimo biti sigurni da je O će biti glavni O. Tako je u osnovi, to je vrsta će promijeniti naš ulaz. Dakle, da li je to veliko ili neće vrsta promijeniti način na koji smo se s njima nositi. Dakle, ako mi koristimo isupper funkciju na tom indeksu, tako isupper ("ja"), koji se vraća za nas prave, tako da smo znali da je gornja. Pa onda na temelju toga, kasnije ćemo ići u formuli da ćete biti koristeći prebaciti stvari u Cezara, pa onda u osnovi, postoji će biti malo drugačija formula ako je to veliko za razliku od mala slova. Smisla? Da. Bez brige. Razgovarao sam malo o dodavanju 6 na pismu, koje ne sasvim smisla osim kad smo vrsta shvatiti da su ti likovi su vrste međusobno s brojeva. Ono što mi radimo je da smo vrsta korištenja implicitnog lijevanje. Mi ćemo ići u lijevanje malo kasnije o tome gdje se vrijednost i da se to pretvorilo u neku drugu vrstu nego što je prvotno bilo. No, s ovim pset ćemo moći vrsta naizmjenično koristiti znakove i njihove odgovarajuće cjelobrojne vrijednosti. Dakle, ako ste jednostavno spakirati lik sa samo jednostrukim navodnicima, onda ćete biti u mogućnosti da rade s njim s brojeva, koje se bave s njom kao cijeli broj. Dakle, kapital C odnosi se na 67. Mala f odnosi do 102. Opet, ako želite znati te vrijednosti, pogled na vaše ASCII tablice. Dakle, idemo u nekim primjerima kako biste mogli oduzeti i dodati, kako ste zapravo stvarno može raditi s tim likovima, koristite ih naizmjenično. Ja bih rekao da ASCIIMath će izračunati dodavanje karaktera na cijeli a zatim prikazuje rezultanta karakter kao i rezultanta ASCII vrijednost. I tako ovdje govorim - hrapavi bave ovom dijelu poslije - ali u osnovi, ja govorim da korisnik treba reći pokretanje ASCIIMath zajedno s ključem, i ja sam rekao da se taj ključ će biti broj s kojima ćemo dodati ovaj lik. Dakle, ovdje primijetiti da je od sam tražeći ključ, jer sam tražio da oni daju mi ​​jedna stvar, Ja samo želim prihvatiti. / Asciimath i ključ. Dakle, ja ću zahtijevati da argc je jednaka dva. Ako nije, onda ću se vratiti jednom, a program će se zatvoriti. Dakle, govorim ključ neće biti prvi komandna linija argumenti, to će biti drugi, a kao što vidite ovdje, Ja ću okrenuti da u cijeli broj. Onda ću postaviti znak da se r. Uočite da tip varijable Chr je zapravo cijeli. Način na koji sam u mogućnosti koristiti r kao cijeli broj je ga encasing s tim jednostruke navodnike. Dakle, natrag na naš printf izjavi gdje imamo rezervirano za nekog lika i onda rezervirano za cijeli broj, lik predstavlja Chr, a cijeli je ključ. I tako onda idemo u rezultatu dodajte dvije zajedno. Tako ćemo dodati r + god Ključ je, i onda ćemo ispisati rezultat toga. Dakle, budimo asciimath. To je do danas, pa neka je samo pokrenuti asciimath. Oh, ali vidite, to ne učiniti ništa, jer nismo zapravo dati ključ. Dakle, kada se upravo vratio jedan, naš glavni funkcije, to se upravo vratio natrag do nas. Pa onda ajmo proći u ključu. Netko mi dati broj. >> [Student] 4. 4. Ok. Dakle, r porastao za 4 će nam dati V, što odgovara ASCII vrijednosti 118. Pa onda to nekako ima smisla da - Zapravo, mogu li vas pitati, što mislite ASCII vrijednost od r je li r + 4 118? Zatim, da, r je 114. Dakle, ako pogledate na ASCII tablici onda, naravno, vidjet ćete da je r predstavlja 114. Dakle, sada znamo da možemo dodati prirodni brojevi do likova, ovo izgleda prilično jednostavna. Mi smo samo ćemo ponoviti tijekom niza kao što smo vidjeli u primjeru prije. Mi ćemo provjeriti je li to pismo. Ako je tako, onda ćemo ga prebaciti na bilo koji ključ je. Prilično jednostavno, osim kada dođete do ovako, vidiš da je z, zastupana po 122, onda će vam dati drugačiji karakter. Mi zapravo žele ostati unutar naše abecede, zar ne? Dakle, moramo shvatiti neki način vrste omatanje oko. Kada dođete do Zed i želite povećati u određenom broju, ne želite ići u izvan ASCII abecede dijelu; Želite li završiti natrag sve do A. No, imajte na umu da ste još uvijek čuva slučaj. Dakle, znajući da slova ne mogu postati simboli baš kao simbola se ne događa da se mijenja, kao dobro. U posljednjem pset svakako nije potrebno, ali izbor je provesti svoj pohlepni pset pomoću modul funkciju. Ali sada mi zapravo ćete morati koristiti modul, pa neka je samo ići preko ove malo. U osnovi, kada imate x modulu y, koji vam daje ostatak x podijeljenih po y. Ovdje su neki primjeri ovdje. Imamo 27% 15. Uglavnom, kada oduzmete 15 od 27 onoliko puta koliko je moguće bez uzimajući negativna onda ćete dobiti 12 lijevo preko. Dakle, to je vrsta kao u matematici kontekstu, ali kako možemo zapravo koristiti ovaj? To će biti korisno za naše wrapover. Za to, recimo samo da sam pitao sve vas podijeliti u tri skupine. Ponekad možete to učiniti u skupinama i tako nešto. Recimo sam rekao: "Dobro, želim da svi mogu podijeliti u tri." Kako bi ste to učinili? [Nečujno učenik odgovor] Da, točno. Count off. Ok. Ajmo zapravo to učiniti. Želite li početi? [Studenti računajući off] 1, 2, 3, 4. Ali ne zaboravite ... >> [Student] Oh, žao mi je. To je stvarno dobra stvar. Rekli ste četiri, ali zapravo želimo vam reći jedan, jer samo želimo tri skupine. Dakle, kako - Ne, to je stvarno dobar primjer, jer kako se onda može reći jedan? Što je odnos između 4 i 1? Pa, 4 mod 3 1. Dakle, ako ste i dalje, te će biti dva. Dakle, imamo jedan, dva, tri, 1, 2. Opet, ti si zapravo 5. osoba. Kako znate da kažem dvije umjesto pet? Kažeš 5 mod 3 2. Želim vidjeti koliko skupine 3 su lijevo preko, onda što bi ja sam I tako onda ako smo nastavili duž cijele sobe, onda bismo vidjeli da smo uvijek zapravo primjenom mod funkciju za sebe na vrsta odbrojati. To je više vrsta materijalne primjer kako biste mogli koristiti modulo jer siguran sam da je većina od nas vjerojatno su prošli kroz taj proces gdje smo morali računati off. Sva pitanja o modulu? To će biti prilično važno razumjeti koncepte ovo, pa želim da biste bili sigurni vi razumjeti. [Student] Ako ne postoji ostatak, to vam je stvarni broj? Ako jedan od prvih tri od njih su to učinili, to će im dati ono što oni zapravo bili, ili bi to dali im [nečujno] >> To je dobro pitanje. Kada nema ostatak za modulo - tako da imate šest mod 3 - da zapravo vam daje natrag 0. Mi ćemo razgovarati o tome malo kasnije. Oh yeah, na primjer, 3. osoba - 3 mod 3 je zapravo 0, ali je rekla tri. Dakle, to je vrsta kao unutarnju ulova, na primjer, kao ok, ako mod je 0 onda ću biti treći čovjek. No, mi ćemo ući u vrste kako bismo se htjeli baviti ono 0 je kasnije. Dakle, sada smo nekako imaju način mapiranja Zed na desnoj pismu. Dakle, sada smo prošli kroz tih primjera, smo vrsta vidjeti kako Cezar bi mogli raditi. Možete vidjeti dva pisma, a zatim ih možete vidjeti kreće. Tako ćemo pokušati izraziti da u smislu formule. Ova formula je zapravo dao za vas u spec., ali neka je vrsta izgled kroz ono što svaka varijabla znači. Naš krajnji rezultat će biti šifrirana. Dakle, to govori da ith karakter šifrirana će odgovarati ith karaktera čistim. To ima smisla jer želimo uvijek biti podstava tih stvari. Dakle, to će biti ith karakter šifrirana plus k, koji je naš ključni - da ima smisla - i onda imamo ovaj mod 26. Sjetite se kada smo imali Zed nismo htjeli da se u karakteru, pa smo htjeli da ga mod i vrsta folijom oko abecede. Nakon Zed li će ići, B, C, D, dok je dobio pravi broj. Tako znamo da Zed, ako + 6, bi nam f jer nakon Zed dolazi a, b, c, d, e, f. Dakle, sjetimo se sigurno znamo da je Zed + 6 će nam dati f. U ASCII vrijednosti, z 122 i f je 102. Dakle, moramo pronaći neki način izrade našu Caesar formulu nam dati 102 nakon uzimanja u 122. Dakle, ako mi samo primijeniti ovu formulu, ('z' + 6)% 26, koja zapravo vam daje 24 jer 122 + 6 128; 128% 26 daje vam 24 ostatak. No, to ne znači stvarno f. To definitivno nije 102. To je također ne 6. slovo abecede. Dakle, očito, moramo imati neki način ugađati ovo malo. U odnosu na redovne abecede, znamo da je z 26. slovo i f je šesti. Ali mi smo u informatici, pa idemo indeksa na 0. Pa onda umjesto z je broj 26, idemo reći da je broj 25 jer je 0. Dakle, sada idemo primijeniti ovu formulu. Imamo z predstavlja 25 + 6, koji vam daje 31. I 31 mod 26 daje vam 5 kao ostatak. To je savršen, jer znamo da je f 5. slovo u abecedi. No, to još uvijek nije f, zar ne? To još uvijek nije 102. Dakle za ovaj pset, izazov će biti pokušava saznati odnos između pretvaranje između tih ASCII vrijednostima i abecednom indeksu. U suštini, ono što ćete želite učiniti, želite započeti s ASCII vrijednostima, ali onda želite nekako prevesti u abecednom indeksu onda izračunati što pismo bi trebao biti - u osnovi, ono što njegov abecedni indeks od šifra lika - onda prevesti natrag u ASCII vrijednostima. Dakle, ako ste bič svoj ASCII tablicu, a zatim pokušajte pronaći odnose između, recimo, 102 i 5 ili 122 i 25 godina. Dobili smo naš ključ od argumenata naredbenog retka, mi smo stečen čistim, mi smo ga enciphered. Sada svi smo lijevo učiniti je ispisati ga. Mogli smo to učiniti nekoliko različitih načina. Što možemo učiniti je zapravo ispis kao što smo ići zajedno. Kao što smo ponoviti preko znakove u nizu, jednostavno smo mogli samo ispisati pravu onda kada smo ga izračunati. Alternativno, možete se također može pohraniti ga u niz i imaju niz znakova i na kraju ponoviti tijekom tog cijelog niza i isprintati. Dakle, imate nekoliko mogućnosti za to. I zapamtite da% c će biti rezervirano za ispis karakter. Dakle, tu imamo Cezar, a sada smo prešli na Vigenere, koja je vrlo slična caru, ali samo malo složenije. Dakle, u suštini s Vigenere se da ćeš biti prolazi u ključnoj riječi. Dakle, umjesto broja, ti si idući u imati niz, i to tako da će se ponašati kao ključnu riječ. Tada, kao i obično, ti si idući u dobiti brz za niz od korisnika i onda ga kodirati i zatim im dati šifrirana leđa. Dakle, kao što sam rekao, to je vrlo sličan Cezara, osim umjesto pomicanja do određenog broja, broj zapravo će se promijeniti svaki put od karaktera do karaktera. Da predstavljati taj stvarni broj pomak, to je zastupao tipkovnice slova. Dakle, ako ste unijeli u smjeni od, na primjer, onda koji bi odgovarao pomak 0. Dakle, to je opet vratiti u abecednom indeksu. Što bi moglo biti korisno ako ste vidjeli da smo zapravo se bave ASCII vrijednostima kao i slova, kao i abecednom indeksu, možda pronaći ili napraviti svoj vlastiti ASCII tablicu koja prikazuje abecedni indeks od 0 do 25, kroz z, i ASCII vrijednosti, tako da možete vidjeti vrste odnosa i ocrtati i pokušati pronaći neke obrasce. Isto tako, ako ste bili prebacuje na određenom stupnju f - i to je bilo malih ili velikih slova f - onda koji bi odgovarao pet. Jesmo li dobro tako daleko? Formula za Vigenere je malo drugačija. Uglavnom, vidjet ćete da je to samo kao Cezara, osim umjesto samo k imamo k indeks j. Primijetite da nismo koristim jer u suštini, dužinu ključnu riječ nije nužno duljinu našeg šifrirana. To će biti jasnije malo kad vidimo primjer da imam malo kasnije. Uglavnom, ako pokrenuti program s ključnom riječi o ohai, onda to znači da svaki put, ohai će biti vaš pomak. Dakle, ovisno o tome što je položaj koji su u ključnoj riječi, ideš prebaciti svoju određenu šifrirana karakter tog iznosa. Opet, baš kao i Cezara, želimo biti sigurni da ćemo sačuvati kapitalizaciju stvari a mi samo kodirati slova, a ne znakova ili prostorima. Dakle osvrnuti na Cezara na funkcije koje ste svibanj imati koristi, Način na koji ste se odlučili kako prebaciti stvari, i primijeniti da bi vaš program ovdje. Dakle, ajmo map ovo. Imamo čistim da smo stečen od korisnika iz GetString govoreći Ovaj ... je CS50! Onda imamo ključnu riječ u ohai. Prve četiri likovi su prilično jednostavne. Mi znamo da je T će biti pomaknut za o, onda h će biti pomaknut za sat, ja će biti pomaknut za. Ovdje možete vidjeti da predstavlja 0, pa onda na kraju vrijednost je zapravo isto pismo kao i prije. Tada je pomaknuta ja. Ali onda imate ove razdoblja ovdje. Mi ne želimo da kodirati, pa onda mi to ne mijenjati ništa i samo isprintati razdoblje nepromijenjen. [Student] Ja ne razumijem kako ti znaš da je to pomaknuta - Gdje vi - >> Oh, žao mi je. Na vrhu Ovdje možete vidjeti da je argument naredbenog retka ohai ovdje, da će to biti ključna. I tako u osnovi, vi ste biciklizam preko likova u ključnoj riječi. [Student] Dakle, o će se prebacuje isti - Dakle, o odgovara određenom broju u pismu. [Student] Točno. Ali gdje ste dobili CS50 dio od? Oh. To je u GetString gdje ste kao: "Daj mi niz za kodiranje." [Student] Oni će vam dati taj argument za pomak prema i onda ćete tražiti svoj prvi niz. >> Da. Dakle, kada su pokrenuti program, oni će uključiti ključnu riječ u svojim argumentima naredbenog retka kad ga pokrenuti. Onda nakon što ste provjerili da su oni zapravo sam vam dao jedan, a ne više, a ne manje onda ćeš ih potaknuti na žici, kažu, "Daj mi niz." Dakle, to je mjesto gdje se u ovom slučaju da ste s obzirom da ovo ... je CS50! Pa onda ćeš koristiti da i koristiti ohai i ponoviti više. Primijetite da ovdje preskočio kriptiranje razdoblja, ali u smislu naše pozicije za ohai, sljedeći jedne koristili smo o. U ovom slučaju to je malo teže vidjeti, jer to je 4, pa neka je i dalje malo. Samo držati sa mnom ovdje. Onda smo ja i S, koje su zatim prevedeni po o i h respektivno. Onda imamo prostor, pa onda znamo da se ne ide na šifrirati prostore. Ali primijetite da umjesto odlaska u ovom mjestu upravo ovdje, smo kriptiranje po - ne znam ako se može vidjeti da je - upravo ovdje. Dakle, to nije kao što je zapravo predodređen, kažu, o ide ovdje, h ide ovdje, ide ovdje, sam ide ovdje, o, h, a, I, o, h,, i. Vi ne to učiniti. Vi samo prebaciti svoju poziciju u ključnoj riječi kada znate da ste zapravo će biti šifriranjem stvarni pismo. Znači li to da vrsta ima smisla? Ok. Dakle, samo neki podsjetnici. Vi želite da biste bili sigurni da ste samo unaprijed na sljedeći pismu u ključnoj riječi ako lik u čistim je pismo. Pa recimo da smo na o.. Primjećujemo da sljedeći znak, ja indeks čistim, je broj, na primjer. Onda mi ne unaprijed J, indeks za našu riječ, sve dok ne dosegnemo još jedno pismo. Opet, također želite da provjerite da li su spustili na početku ključnu riječ kad ste na kraju njega. Ako vidite ovdje smo na ja, sljedeći mora biti o. Dakle, želite pronaći neki način da bude u mogućnosti spustili na početku ključnoj riječi svaki put da dođete do kraja. I tako opet, kakav operatora je koristan u tom slučaju za omatanje oko? Kao iu prebrojavanja off primjer. [Student] posto znak. >> Da, posto znak, koji je po modulu. Dakle modulu će doći u ruci ovdje kad želite završiti tijekom indeks u vašem ohai. I samo brzo savjet: Pokušajte se sjetiti umatanje preko ključnu riječ malo kao računajući isključen, gdje ako postoji tri skupine, 4. osoba, njihov broj da je je 4 mod 3, što je oko 1. Dakle, probati i mislim da je to na taj način. Kao što ste vidjeli u formuli, gdje god imate CI i onda pi ali onda kJ, želite da biste bili sigurni da ćete pratiti one. Ne trebate zvati ga ja, ne morate da ga zovu j, ali želite da biste bili sigurni da ćete pratiti na poziciji da si to u svom čistim kao i na poziciju da si to u svom ključnu riječ jer oni nisu nužno će biti isti. Ne samo ključnu riječ - to bi mogao biti potpuno drugačiji od vašeg duljina čistim. Također, svoj cisti, postoje brojevi i znakovi, tako da to ne ide savršeno podudaraju se zajedno. Da. [Student] Ima li funkcija za promjenu slučaj? Mogu li promijeniti kapitalu A? >> Da, tu je definitivno. Možete provjeriti - Vjerujem da je toupper, sve jedna riječ. Ali kad pokušavate šifra stvari i sačuvati tekst, to je najbolje u osnovi imaju odvojena slučaja. Ako je to veliko, onda želite pomak prema tome jer u formuli, kad se pogleda unatrag kako moramo vrsta pokretu naizmjenično između ASCII način predstavlja brojeve i stvarna abecedni indeks, želimo biti sigurni tu će biti neka vrsta uzorak da ćete koristiti. Još jedna napomena o obrascu, zapravo. Ti ćeš definitivno se bave s brojevima. Pokušajte ne koristiti magiju brojeva, što je primjer stilu. Dakle, recimo da želite svaki nešto vremena smjene po vole - Ok, tako da savjet, drugi spojler je kad idete da se kreće nešto za određeni iznos, pokušajte da ne predstavljaju da je stvarni broj nego probati i vidjeti ako možete koristiti ASCII vrijednost, koja će vrsta više smisla. Još jedna napomena: Zato što smo se bave formulama, iako vaš TF će vrsta znati što uzorak možda koristite, najbolje u komentarima vrste objasniti logiku, kao, "Ja sam koristeći ovaj obrazac, jer ..." i vrsta objasniti uzorak jezgrovito u svoje komentare. [To je prohod 2] Ako ne postoje sva ostala pitanja, onda ću ostati ovdje malo. Sretno s pset 2: kripto i hvala što ste došli. [Student] Hvala. >> Hvala. [Mediji Offline uvod]