[Powered by Google Translate] [Odjeljak 4] [Manje Ugodno]
[Nate Hardison] [Sveučilište Harvard]
[Ovo je CS50.] [CS50.TV]
>> U redu, dobrodošli natrag u sekciji.
U ovotjednom dijelu ćemo učiniti nekoliko stvari.
Idemo u prvom setu rekapitulacija problema 2,
koji je skup i Caesar Vigenère problem.
A onda ćemo zaroniti u Kviz 0 pregled
i provesti malo vremena recapping što smo razgovarali o tome
u svakoj od predavanja do sada, a također ćemo napraviti nekoliko problema
iz prethodne godine kvizovima.
Na taj način vi imate dobar način da se pripremi za to.
>> Za početak, ja dignete nekoliko dobrih rješenja
za prethodni problema setu, problem Set 2, u ovom prostoru.
Ako ste vi svi pogodio ovaj link,
i ako kliknete moje ime i kliknite na mojoj prvoj reviziji
vidjet ćete caesar.c, što je točno ono što sam gleda.
Ajmo pričati o tome jako brzo.
Ovo je samo uzorak rješenje.
To ne mora nužno biti savršeno rješenje.
Postoji mnogo različitih načina da se ovo pišemo,
ali postoji nekoliko stvari koje sam htjela istaknuti
da sam vidio dok sam bio klasiranje, uobičajene pogreške koje mislim
ovo rješenje čini vrlo dobar posao rukovanje.
>> Prvi ima nekakvu naslovnom komentaru na vrhu.
Na linijama 1 do 7 vidite pojedinosti,
Što je točno taj program radi.
Dobra praksa kada pišete C koda
bez obzira je li vaš program je sadržana unutar jedne datoteke ili
da li je podijeljen na više datoteka je imati nekakvu
usmjeravajući komentar na vrhu.
To je i za ljude koji idu van i pisati kod u stvarnom svijetu.
Ovo je mjesto gdje će staviti informacije o autorskim pravima.
Ispod su # obuhvaća.
Na liniji 16 bilo je to # define, koje ćemo se vratiti u samo malo.
I onda kad je funkcija počinje, nakon glavne počinje,
jer ovaj program je sve bio sadržan u jednoj funkciji
vrlo prva stvar koja se događa, a to je vrlo idiomatski i tipično C programu
koji uzima u zapovjednoj liniji argumenti-je da se odmah provjerava
>> za argument count, argc.
Ovdje vidimo da je ovaj program očekuje dva argumente točno.
Zapamtite tu je da je prvi argument da je posebna
to je uvijek ime programa koji je se pokrenuti,
naziv izvršne datoteke.
I tako ono što ovaj radi je to sprječava korisnika izvodi program
s više ili manje argumenata.
Razlog želimo provjeriti za ovaj odmah je zato
mi zapravo ne može pristupiti ovom argv lepezu ovdje pouzdano
dok smo provjeriti da vidi koliko je velika.
>> Jedan od najčešćih pogrešaka sam vidio je ljudi odmah će ići u
i zgrabite argv [1].
Oni bi zgrabite ključ argument iz polja i učinite da sam provjeriti na njemu,
i onda bih napraviti test za argc, kao i sljedeći test,
hoće li ili ne prvi argument je doista cijeli u isto vrijeme,
i to ne uspije, jer u slučaju da ne postoje argumenti isporučene
ćete biti grabbing argument da je ne postoji ili pokušavaju uhvatiti jedan koji nije tamo.
>> Druga velika stvar koju treba primijetiti je da
uvijek želite ispisati nekakvu korisne poruke o pogrešci
korisniku na orijentirati ih.
Siguran sam da ste sve pokretati programe gdje odjednom se ruši,
i dobijete ovo smiješno malo dijalog koji pops gore i kaže:
nešto strašno zagonetna i možda vam daje kod pogreške ili nešto slično
da nema smisla.
To je mjesto gdje se stvarno želite dati nešto korisne
i usmjereni na korisnika, tako da kad ga pokrenuti idu "Oh," lice dlan.
"Znam točno što učiniti. Znam kako to popraviti."
>> Ako ne ispisati poruku, onda ćete završiti zapravo
ostavljajući korisniku da ide ispitati svoj izvorni kod
shvatiti što je pošlo po zlu.
Tu su i neki puta da ćete koristiti različite kodove pogrešaka.
Ovdje smo samo koristiti jedan reći da je bio pogreška,
došlo je do pogreške, došlo je do pogreške.
Veći programi, često programi koji se nazivaju drugim programima,
će se vratiti nekakav posebnim šiframa pogrešaka u različitim scenarijima
za programsko komunicirati ono što bi inače
samo koristiti lijep engleski poruku za.
Cool.
Kao što smo raditi prema dolje, možete vidjeti ćemo povući ključnu out.
Mi test da vidi ako je ključ odgovara.
Mi smo dobili poruku od korisnika.
Razlog mi to učiniti u ovoj učiniti dok petlja-a to je nešto što ćemo pokriti
u malo-ali ispada da ako upišete kontrolni D
kada ste dobili da GetString brz na terminalu
što to zapravo je to šalje poseban karakter
programu.
To se zove ELF ili kraj datoteke karaktera.
I u tom slučaju, naš niz poruka će biti nula,
tako da to nije nešto što smo provjeriti u problemu se postaviti.
>> No, kao što smo ići dalje, sada kada smo počeli razgovarati o pokazivače
i dinamička dodjela memorije na hrpi,
provjere null kad imate funkciju koja bi mogla
vratiti null, kao vrijednost je nešto što ćete želite da biste dobili u naviku radi.
To je ovdje prvenstveno za ilustraciju.
Ali kad vidim GetString u budućnosti,
tako da od problema Set 4 dana, da ćete želite imati na umu.
Opet, to nije pitanje za problem Set 3 ili jer mi nije ga pokriva još.
Konačno, možemo doći do tog dijela gdje smo dobili na glavni šifriranja petlje,
a tu su i par stvari događaju ovdje.
Prvo, mi iteraciju nad cijelu poruku niza sama.
Ovdje smo čuvali strlen poziv u stanju,
koji broj od vas su istaknuli nije velik put to ići.
Ispada, u ovom slučaju to je također nije velika,
dijelom zato što smo izmjenom sadržaj poruke sama
unutar for petlje, tako da ako imamo poruku da je 10 znakova,
Prvi put smo započeli da za petlju strlen će se vratiti što?
10.
>> Ali ako ćemo onda mijenjati poruku, reći ćemo mijenjati svoj peti karakter,
i bacamo u \ 0 lik u 5. poziciju,
na iteraciji strlen (poruka) neće vratiti ono što je učinio
Prvi put smo ponovljena,
ali umjesto toga će se vratiti pet jer smo bacili u tom null terminator,
i stringa je duljina je definirana
po položaju tog \ 0.
U ovom slučaju, to je odličan način da ide, jer smo ga mijenja u mjestu.
Ali primijetite da je to zapravo iznenađujuće jednostavan za šifriranje
ako možete dobiti matematika točna.
Sve što je potrebno je provjeriti je li ili nije slovo koje ste u potrazi na
je veliko ili malo slovo.
>> Razlog imamo samo provjeriti da i mi nemamo za provjeru
IS alfa slučaj je zato
ako je lik veliko ili ako je mala
onda je definitivno slovo abecede,
jer mi nemamo velikih i malih brojki.
Druga je stvar što radimo, a to je malo lukav-
je da smo izmijenjeni standardni Cezarova šifra formulu
da mi je dao u specifikaciji problema set.
Što je drugačije ovdje je da mi oduzmu
u slučaju velikih slova kapitala, a zatim smo dodali kapital A
natrag u na kraju.
>> Znam neke od vas su to učinili u svom kodu.
Je li itko od vas to učiniti u svojim podnescima?
Vi to učinio. Možete li objasniti što to znači, Sahb?
Po to oduzimanjem van, jer ste napravili mod odmah nakon njega,
morate ga uzeti, pa na taj način možete dobiti [kašlja] položaj.
A onda ga dodavati kasnije prebacio preko jednog koji ste željeli.
Da, točno.
Što Sahb rekao je da kada želimo dodati
naša poruka i naš ključni zajedno
i onda mod da mod da NUM_LETTERS,
ako mi ne ljestvici našu poruku u odgovarajuću 0-25 rasponu prvi,
onda bismo mogli završiti uzimajući stvarno čudan broj
jer su vrijednosti koje smo gleda kada gledamo poruke [i],
kada gledamo i ti lik našeg običnog SMS poruke,
je vrijednost negdje u ovom 65-122 rasponu
na temelju ASCII vrijednosti za velikim slovima A kroz malim slovom z.
I tako kad smo ga mod po 26 ili NUM_LETTERS,
budući da je naš # define u gornjem desnom kutu gore,
da će nam dati vrijednost koja je u rasponu 0-25,
i trebamo način da onda ljestvici da back up
i dobiti ga u odgovarajućem ASCII rasponu.
Najlakši način da to učinite je da samo skalirati sve dolje
u 0-25 raspona za početak,
a zatim pomak sve natrag na kraju.
>> Druga uobičajena pogreška da sam vidio ljude izvoditi u je da
ako zapravo ne učiniti ovo skaliranje odmah
i dodati poruku i ključ zajedno i dodati ih, kažu,
u char varijable, problem s tim
je od poruka [i] je relativno velik broj početi sa-
zapamtite da je barem 65, ako to je veliko lik-
ako imate veliku tipku, recimo, nešto poput 100,
i dodate one dvije zajedno u potpisali char ćete dobiti prelijevanje.
Ti ćeš dobiti vrijednost koja je veća od 127,
što je najveća vrijednost koja char varijabla može držati.
Opet, to je razlog zašto biste željeli raditi takve stvari na početak.
Neki ljudi dobio oko tog slučaja radeći ako drugdje i testiranje
da vidi da li će se prelijevati prije nego što to,
ali ovaj način dobiva oko toga.
I onda u tom rješenju mi ​​ispisati cijeli niz na samom kraju.
Drugi ljudi ispisuju znak na vrijeme. Obje su strašan.
U ovom trenutku, to vi imate pitanja, nikakve komentare o ovome?
Stvari koje vam se sviđaju, stvari koje se ne sviđaju?
>> Imao sam pitanje.
Možda sam to propustio tijekom objašnjenje, ali kako se ovaj program
preskočite prostore za spajanje na tipku duljini teksta?
Ovo je samo Cezarova šifra. >> Oprosti, jesam.
Da, vidjet ćemo da je.
U Cezarova šifra smo dobili okolo da zbog
mi samo zrcaljeno znakove.
Mi ih samo zakrenuti ako su velika slova ili mala slova.
Vi osjeća prilično dobro o tome?
Slobodno kopirajte ovaj dom, uzmi ga,
ga usporediti s onim što ste vi pisali.
Definitivno slobodno pošaljite na pitanja o tome previše.
I opet, shvatite da je cilj ovdje sa svojim problemom postavlja
nije da se vi napisati savršen kod za tvoj problem setovima.
To je iskustvo učenja. Da.
>> Povratak na učiniti dok petlja, ako je jednak null,
pa null samo znači ništa, oni samo pritisnite enter?
Nula je posebna vrijednost pokazivač,
i mi koristimo null kada želimo reći
imamo pokazivač varijablu koja pokazuje ništa.
I tako obično to znači da je ova varijabla, ovu poruku varijabla
je prazna, i ovdje, jer smo pomoću CS50 posebnu string tip,
što je CS50 tip niza?
Jeste li vidjeli što je to kada je David povukla sjenilo u predavanju?
To je funky-to je pokazivač, zar ne?
Dobro, da. >> To je char *.
I tako smo stvarno mogao zamijeniti ovu
ovdje s char * poruka,
i tako GetString funkcija, ako ne uspješno dobiti niz od korisnika,
ne može analizirati niz, a jedan slučaj u kojem se ne može analizirati niz
je ako korisnik unese kraja datoteke karaktera, kontrola D,
koji nije nešto što se obično učiniti, ali ako se to dogodi
tada funkcija će vratiti ovaj null vrijednost kao način govori
"Hej, nisam dobio niz."
Što će se dogoditi ako ne stavimo poruke = null,
što je nešto što nismo radili još?
Zašto bi to biti problem?
Jer znam da smo razgovarali malo u predavanju o memorijskim curenja.
Da, hajdemo to učiniti, pa da vidimo što će se dogoditi.
>> Basil je pitanje je što će se dogoditi ako ne zapravo imaju
ova poruka = ​​null test?
Ajmo dođite do vrha.
Vi možete komentirati ovo.
Zapravo, ja ću ga spremiti u reviziji.
To će biti Revizija 3.
Što ćete učiniti da pokrenete ovaj program je da ćete morati kliknuti na ovu ikonu zupčanika ovdje,
a vi ćete morati dodati argument za njega.
Morat ćete mu dati ključ argument jer želimo proći u argument naredbenog retka.
Ovdje ću dati broj tri. Sviđa mi tri.
Sada zumiranje natrag, trčanje program.
To je trčanje, sastavljanje, izgradnju.
Ovdje ćemo ići. To čeka da se zatraži.
Ako sam upisati nešto poput halo-gdje si da ide?
Oh, moj program je predugo za pokretanje. Bio sam jawing predugo.
Ovdje to ide.
Sada sam upisati u bok.
Mi vidimo da je to šifrira odgovarajući način.
Sada ono što će se dogoditi ako radimo brz GetString vratiti null?
Zapamtite, rekao sam da mi je to učinio pritiskom kontrolu D u isto vrijeme.
Ja ću dođite ovdje. Mi ćemo ga ponovno pokrenuti.
Građevinsko. Ima to ide.
Sada kada sam pogodio kontrolu D
Dobio sam ovu liniju koja kaže opt/sandbox50/bin/run.sh, Segmentacija kvara.
Jeste vi vidjeli da je prije?
>> [Studentski] Zašto nema->> Žao?
[Studentski] Zašto nema jezgra deponij u ovom slučaju?
Jezgra deponij je-pitanje je zašto je nema jezgra deponij ovdje?
Pitanje je da postoji svibanj biti, ali jezgra deponij je datoteka
da dobiva pohranjena na tvrdom disku.
U ovom slučaju smo onemogućen osnovne smeća
na radnom poslužitelju, tako da mi ne su ljudi SEG rasjedanja
i izgradnju tona temeljnih deponija.
No, možete dobiti jedan.
Temeljni deponijama su jedna od onih stvari koje se često može onemogućiti,
a ponekad to učinite.
Segmentaciju kriv, odgovoriti na vaše pitanje, bosiljak,
govori da smo pokušali pristupiti pokazivač
da nije bio postavljen ukazati na ništa.
Sjeti se Binky u videu kad Binky pokušava
ići pristupiti pokazivač koji ne pokazuje na nešto?
U ovom slučaju mislim da je tehnički pokazivač pokazuje na nešto.
To je ukazujući na null, koji je tehnički 0,
ali da definira se u segmentu koji nije dostupan
po svom programu, tako da ćete dobiti grešku segmentacije
jer niste pristup memoriju koja je u važećem segmentu
kao hrpa segmentu ili stog segment ili podataka segmentu.
Cool.
Bilo više pitanja o caru?
>> Idemo dalje. Pogledajmo reviziju dvije jako brzo.
To je Vigenère.
Ovdje u Vigenère
ćemo kroz ovaj jedan prilično brzo, jer, opet,
Vigenère i Cezar su vrlo slični.
Zaglavlje komentar je prije,
# Define je prije kako bi se izbjeglo korištenje ove magične brojeve.
Lijepo je stvar je reći da smo htjeli da se presele u
drugačije pismo ili nešto slično.
Umjesto da se ide ručno promijeniti sve 26-ih u kodu
bismo mogli promijeniti to 27 ili ga spustiti
ako smo koristili različite abecedu, različitih jezika.
Opet, imamo ovu provjeru argument count,
i stvarno gotovo da možete uzeti kao predložak.
Prilično mnogo svaki program možete pisati treba imati-
ako je potrebno naredbenog retka argumente-neki slijed linija
koji glasi ovako na samom početku.
To je jedan od prvih testova razum želite učiniti.
>> Evo što mi nije bila napravili smo sigurni da
ključna riječ je bila valjana, a to je bio drugi ček da jesmo.
Obavijest opet da smo odvojeni od ova argc i dva.
Imajte na umu da u ovom slučaju jedna stvar da smo morali napraviti je umjesto
korištenja na i. htjeli smo provjeriti cijeli niz,
i kako bi se učiniti da ste zapravo morati ići slovo po slovo
preko niza.
Nema dobar način da se zovu nešto o njemu
jer čak i, primjerice, da ću se vratiti 0
ako se ne može analizirati integer, tako da čak i ne rade.
Opet, lijepo poruka objasniti korisniku što se točno dogodilo.
Onda ovdje, opet, mi također preopterećena gdje
korisnik upiše u kontrolnoj D slučajnog karaktera.
>> A onda Charlotte je imao pitanje ranije o tome kako smo uspjeli preskočiti prostore
u našem nizu ovdje.
To je vrsta slično onome što smo učinili s Myspace programa
da smo napravili u poglavlju, a način na koji se radi
je da smo pratili broj pisama koje smo vidjeli.
Kao što smo hodali preko poruka nizu, kao što smo hodali preko lika po karakteru,
smo pratili indeks kao dio naše za petlje, a zatim smo također prati
broj slova, tako da ne sadrži posebne znakove, ne-znamenke, non-bijeli prostor
da smo vidjeli u zasebna varijabla.
I onda je ovo rješenje modificira tipku
da biste dobili stvarni ključ cijeli, i to da se na letu,
neposredno prije to onda ide za šifriranje stvarnu poruku karakter.
Postoje neka rješenja koja su savršeno previše velik
da bi izmijenili tipku gore pri testiranju za ključ valjanosti.
Osim pazeći da je lik i ključna
je slovo abecede je također pokazalo da je u cijeli
u 0-25 rasponu onda preskočiti što učiniti da se kasnije u ovo za petlju.
Opet, možete vidjeti ovdje ovo je stvarno isti broj
da smo koristili u Cezara u ovom trenutku.
Vi radite točno istu stvar, tako da je pravi trik je figuring out
kako pretvoriti riječ u cijeli broj.
>> Jedna stvar koja mi je ovdje da je malo gusta
je ponovili smo taj izraz, mislim da to može tako nazvati,
3 zasebna puta na linijama 58, 59 i 61.
Može li netko objasniti što je točno taj izraz ne?
To je pristup karakter, kao što ste rekli.
Da, to je [nečujno] lik u ključnoj riječi,
i tako je broj pisama vidio jer ste samo kreće zajedno
ključna riječ kada ste vidjeli pismo,
tako da će učinkovito preskočiti prostore i slično.
Da, točno.
I onda kad ste vidjeli ključne prazno samo mod tako da se presele natrag.
Točno. To je savršeno objašnjenje.
Što Kevin je da želimo indeks u ključnoj riječi.
Želimo dobiti num_letters_seen karakter, ako hoćete,
ali ako num_letters_seen premašuje duljinu ključne riječi,
način na koji smo se vratiti u odgovarajući raspon je mi koristimo mod operator
učinkovito zaokrenuti.
Na primjer, kao što je u Ukratko, naša ključna je slanina,
a to je pet slova.
No, vidjeli smo šest slova u našem običnom tekstu u ovom trenutku
i kodiran šest.
Mi ćemo završiti pristup num_letters_seen,
koji je 6, mod duljina ključne riječi, 5,
i tako ćemo dobiti jedan, i tako što ćemo napraviti je da ćemo
pristup prvu znakova unutar naše ključne riječi u tom trenutku.
>> U redu, bilo kakva pitanja o Vigenère
prije nego što smo prešli na?
Vi osjeća prilično dobro o tome?
Cool, super.
Želim da biste bili sigurni da su ti dečki uzimajući priliku vidjeti kod
da mi mislimo da izgleda dobro i imati priliku učiti od njega.
To će biti posljednja ćemo koristiti prostore za sada,
i idemo u tranziciji sada, a ja ću ići na cs50.net/lectures
tako možemo napraviti malo kviz pregled.
Najbolji način mislim početi raditi komentar pregled
je došao na ovaj Predavanja stranici, cs50.net/lectures,
, a ispod svakog od tjedan naslova, pa ako gledam ovdje u tjednu 0,
Vidim da imamo popis tema koje smo pokriven u tjednu 0.
>> Ako bilo koji od ovih tema čini upoznati vas
definitivno ćete ga poželjeti vratiti i švrljati skripte i eventualno
čak i prelistati predavanja, gledati ih opet ako želite
da biste dobili osjećaj za ono što se događa sa svakom od tih tema.
Reći ću dodatno ove godine jedan od cool sredstava smo dobili
je ove hlačice koje smo stvorili, a ako pogledate tjednu 0,
mi nemamo sve od tema, ali imamo dosta od njih,
neke od trickier one, tako da gledate ove gaćice opet
je dobar način da dođete do brzine.
Konkretno, ja ću staviti u plug za 3 na dnu, jer sam one.
Ali, ako ste se bori s binarnom, bita, hex, takve stvari,
binarni je veliko mjesto za početak.
ASCII je još jednom da je to dobro za pogledati previše.
Možete čak i gledati me na 1.5x brzina ako idem prespor za vas.
Budući da je pregled, slobodno to učiniti.
>> Samo za početak jako brzo, idemo proći kroz nekoliko tih problema kviz
Jednostavno brzo gubitaka kroz njih.
Na primjer, pogledajmo problema 16 koje sam dobio pravo ovdje na brodu.
Dobili smo sljedeće izračun u binarnom,
i želimo pokazati bilo kakav posao.
Ok, ja ću dati ovo metak.
Vi bi trebali slijediti zajedno s papira,
a mi ćemo to učiniti vrlo brzo.
Želimo to obaviti sljedeće izračun u binarnom.
Imam 00.110.010.
A ja ću dodati da je 00110010.
Za matematici genija sljedeće zajedno kod kuće,
ovo je učinkovito pomnoži sa dva.
Počnimo.
Mi ćemo slijediti isti dodatak algoritam koji radimo
kada smo dodali decimalne brojeve zajedno.
Stvarno jedina razlika je u tome što smo povratna petlja oko
kada imamo 1 + 1 umjesto jednom smo doći do 10.
>> Ako pođemo od desne, jako brzo, što je prva znamenka?
[Studentski] 0. >> [Nate H.] 0.
Velika, druga znamenka?
[Studentski] 1.
[Nate H.] Je li to jedan? 1 + 1?
[Studentski] 10.
[Nate H.] Točno, tako što je znamenka koja pišem neposredno ispod dvije one dodaju zajedno?
[Student] 1, 0, ili 0, a zatim nositi 1.
[Nate H.] 0 i nose jedan, točno.
Sljedeća jedan gore, bosiljak, ti ​​si gore.
Što je treći? >> [Bosiljak] 1.
[Nate H.] 1, savršen. Kevin?
[Kevin] 0. >> [Nate H.] 0, Charlotte?
[Charlotte] 0. >> [Nate H.] Da, i što da radim?
[Student] Spoj 1.
[Nate H.] A što da radim? I onda sam nositi jedan.
Savršeno, Sahb? >> [Sahb] Sada imate jedan.
[Nate H.] I trebam učiniti ništa ovdje?
[Sahb] Onda za sljedeću imate jedan zato što provodi nad jednom.
[Nate H.] Odlično, tako da ovdje možemo ga završiti.
Cool.
[Studentski] Zar 0 + 0 = 0?
0 + 0 = 0.
1 + 1, kao što ste rekli, je 10, ili 1, 0, radije.
10 je pogrešan naziv, jer mi je 10 znači da je broj 10,
i to je dosjetka kako smo ga predstavlja kad smo ga pisati.
Mi predstavljaju broj 2 do 1, 0, a broj 10 je malo drugačiji.
>> Što je vrsta lijepo o binarnom je da tamo stvarno ne da su mnogi
slučajevi morate naučiti.
Tu je 0 + 0 = 0, 0 + 1 = 1,
1 + 1 je 0, a zatim nositi 1,
a onda možete vidjeti ovdje na trećem stupcu iz prava
imali smo taj 1, 1, 1 i.
I 1 + 1 + 1 je 1,
i nositi još jednom.
Kada radite binarni toga, prilično jednostavna.
Ja bih napraviti par više njih na razum sami provjeriti
prije nego što krenete u, jer je to
vjerojatno nešto što ćemo vidjeti na kvizu.
Sada ćemo to učiniti sljedeći kao dobro.
Učinimo problema 17.
Mi ćemo pretvoriti sljedeće binarni broj u decimalni.
Imam 10100111001.
Sjeti se u binarnom video koji sam učinio
Hodao sam kroz par primjera, a ja sam pokazao kako
sve radi kada ste to radili u decimalama.
Kada radite u decimalnom reprezentacije Mislim da smo
u ovom trenutku u naše živote, tako tečno govori to da
to je prilično lako prijeći preko mehaniku kako se to zapravo radi.
>> Ali to učiniti brzo rekapitulacija, ako imam broj 137
to zapravo znači i opet, to je u decimalnom reprezentacije-
broj 137 u decimalni znači da imam jedan x 100 + 3 x 10 + 7 x 1.
To je sve ostati na zaslonu.
I onda ako pogledate ove brojeve ovdje,
100, 10 i 1, vidjet ćete da su oni zapravo sve ovlasti 10.
Imam 10 ², 10 ¹ i 10 na nulu.
Imamo sličnu vrstu stvar u binarnom,
osim da je naša baza, kao što smo ga zovu, je 2 umjesto 10.
Ove 10s da sam napisao ovdje dolje na dnu,
ovaj 10 ², 10 ¹, 10 do nula, 10 je naša baza,
i eksponent, 0, 1, ili 2,
Podrazumijeva se po položaju znamenka u broju koji smo pisali.
1, ako ćemo gledati na to, ovo je jedan u drugi položaj.
S 3 je u 1. položaju, a 7 je u 0. položaju.
To je kako smo dobili različite eksponentima u nastavku za naše baze.
>> Nakon svega ovoga hrapavi zapravo, znate što?
Mi ćemo učiniti-gdje si moja poništiti gumb ići?
Ima to ide.
Volim ovo poništiti stvar.
Nakon toga mislim barem za mene
najlakši način za početak pretvaranja binarni broj
ili heksadecimalni broj gdje baza je 16
a ne 10 ili 2 je ići naprijed i napisati
osnove i predstavnicima za sve brojeve u mom binarni broj na vrhu.
Ako počnemo s lijeva na desno i opet,
koja je vrsta counterintuitive,
Ja ću se vratiti na crno ovdje, imamo dva do 0. položaj,
a onda imamo dvije ¹, 2 ²,
i zatim 2 do 3, 2 do 4, 2 do 5, 6,
7, 8, 9, i 10.
Ove brojke sam pisani out su svi eksponenti.
Samo sam napisao baze ovdje u prvom 3 samo za prostor.
>> U ovom trenutku ja ću ići naprijed, a ja sam zapravo će izbrisati
stvari koje smo učinili u decimalu, ako je to u redu.
Svi ste je dobio to.
Oni od vas gleda online siguran sam da će biti u mogućnosti da me premotati ako želite.
Prebacivanje natrag na olovke.
Sada, ono što možemo učiniti, ako ti dečki nisu potpuno do brzine na svojim moćima 2,
to je totalno cool.
To se događa. Ja razumijem.
Jednom sam imao intervju za posao, gdje sam bio rekao da bi trebao znati sve ovlasti 2
gore kroz 2 do 30..
To nije posao koji sam dobio.
U svakom slučaju, vi možete ići naprijed i učiniti math ovdje,
ali s binarnom to zapravo ne smisla,
i niti smisla s decimalnom ili heksadecimalni bilo,
učiniti math gdje imate nula.
Možete vidjeti imam 0 ovdje, a ovdje 0, 0 ovdje, 0 ovdje, 0 ovdje, 0 ovdje.
Zašto bi to nema smisla raditi stvarni matematiku
izračunati odgovarajuću moć 2 za tu poziciju?
Točno, kao što su Charlotte rekao, to će biti 0.
Možda te uštedjeti vrijeme, ako izračuna ovlasti dvije nije tvoj jaka odijelo.
U ovom slučaju mi ​​samo treba da ga izračunati za dva do 0 što je-?
[Studentski] 1.
[Nate H.] 1, 2 na 3, koji je-?
[Studentski] 8. >> [Nate H.] 8.
2 4?
[Student] 2. Žao mi je, jednom.
[Nate H.] 2 u 4 je 16, točno.
2 na 5, Kevin? >> 32.
[Nate H.] 32, 2 na 8?
[Studentski] 32 x 8, 256.
[Nate H.] Savršeno.
I 2 na 10?
[Studentski] 1024.
[Nate H.] Da, 1024.
>> Nakon što smo dobili ove brojeve možemo zbroj ih sve gore.
I to je mjesto gdje je stvarno važno učiniti nekoliko stvari.
Jedan je ići sporo i provjerite svoj posao.
Možete reći da je jedan na kraju tog broja,
tako da sam definitivno trebao dobiti neparan broj kao moj rezultat,
jer su sve one druge će biti čak i brojevi
s obzirom da je to binarni broj.
Druga stvar koju treba učiniti je ako dođete do ove točke na testu
a vi ste ga piše ovako daleko
a ti ponestaje vremena
pogledati broj bodova da je ovaj problem vrijedan.
Ovaj problem, kao što možete vidjeti, ako sam okrenuti leđa na moj laptop jako brzo-
ovaj problem je vrijedan dva boda, tako da to nije vrsta toga
trebali biti prolazi kroz ako ste stvarno u stisci s vremenom.
No, mi ćemo se vratiti na iPad, a mi ćemo proći kroz njega jako brzo.
>> Volim raditi male brojeve prvi
jer sam naći da lakše.
Sviđa mi se 32 i 8, jer oni idu zajedno prilično lako, a mi smo dobili 50.
16 i 1 dobiva 17.
Tu smo dobili 57,
i onda možemo napraviti ostatak ove, tako da možemo napraviti 57, 156.
Hajde.
Čovječe, dobro, neka je vidjeti.
Imali smo 57, 256, i 1024.
U ovom trenutku, ja bih radije samo proći.
Ja nemam pojma. Ja očito trebati pročitati na to.
7, 6, 4, te dobiti 17.
1, 5, 5, 2, 13.
Tada smo dobili tri, a onda smo dobili jedan.
1337.
Uskršnje jaje, tko?
Svatko prepoznaje ovaj broj?
Chris prepoznaje broj. Što to znači, Chris?
[Chris] Leet.
Leet, pa ako pogledate ovo, to izgleda kao Leet.
Hacker stvari. Pazi za tu vrstu stvari na polovici ili kviz, a.
Ako ste vidjeli takve stvari i pitate "Huh"
da zapravo moglo značiti nešto.
Ne znam. David voli stavljajući ga u.
To je dobar način da se razum to provjeriti.
Kao ok, ja mogu vidjeti što se događa.
>> To je tjedan 0/Week jednom stvari.
Ako smo se vratili na naš laptop sada,
smanjivanje, i par drugih stvari.
Tu je ASCII, koji smo radili puno problema sa seta.
Taj pojam grada A. Što je to zapravo?
Znajući da je decimalni broj.
65 je ono što se mapirati u ASCII tablici,
i da je stoga kako računalo ga piše,
a to je kako smo bili uzimajući daleko sa zapravo pisanje
glavni lik i lik mala slova
u nekim od tih rješenja i problema postavlja da ste radili.
Par drugih stvari.
Imamo izjave, Boolean izraza, uvjeti, petlje, varijable i teme.
>> Oni sve čini da ima smisla za najveći dio?
Neki od ove terminologije je malo funky vremena na vrijeme.
Volim misliti i gubitka kao i za većinu dio nečega što završava sa zarezom.
Izjave poput x = 7, koji postavlja varijablu,
valjda se zove x = 7.
Vjerojatno x je tip koji može pohraniti broj 7,
tako da je int ili eventualno plovak ili kratka ili char,
nešto slično.
Boolean izraz koristi ove double jednak
i prasak jednak ili ne jednaka, manje od, veći od,
manje od ili jednako, sve takve stvari.
Uvjeti su onda, ako drugdje izjave.
Ja bih se sjetiti da se ne može imati drugo bez odgovarajuće ako.
Isto tako, ne možete imati drugo ako ne odgovara ako.
Petlje, podsjećaju na tri vrste petlji smo udaranja u vas
za posljednjih nekoliko sekcija i problematičnih seta.
Korištenje ne dok kad ste dobivanje korisničkog unosa,
koristite dok petlje do određenog stanja je istina,
, a zatim koristite one za petlje ako je potrebno
znati što iteracija petlje ste trenutno na je kako sam razmišljati o tome.
Ili, ako radite za svakog lika u nizu želim učiniti nešto,
za svaki element u polju želim učiniti nešto da taj element.
>> Teme i događanja.
To nismo pokriveni tako izričito u C,
ali zapamtite ovo od nule.
To je pojam imaju različite scenarije.
To je također i pojam emitiranje događaja.
Neki ljudi nisu koristili emitirati u svojim projektima u početku,
što je totalno cool,
ali to su dva različita načina rukovanja ovu veći problem zove konkurenciji,
koji je kako ti se programi za izvršenje
ili naizgled izvršiti u isto vrijeme?
Različiti zadaci trčanje, dok drugi poslovi su također prikazuju.
Ovo je način kako vaš operativni sustav čini se da rade.
To je razlog zašto, iako, primjerice,
Ja sam dobio moj preglednik trčanje, ja također mogu uključiti Spotify i igrati pjesmu.
To je više od idejnog stvar za razumjeti.
Ja bih pogledati nitima kratkim
ako želite saznati više o tome.
>> Hajdemo vidjeti, ja vjerujem da bi moglo biti
Problem na to u jednoj od njih.
Opet, mislim teme i događaji nisu nešto što ćemo pokriti u C
Upravo zato što je znatno teže nego u nule.
Vi ne bi trebali brinuti o njemu, ali definitivno razumiju koncepte,
shvatiti što se događa.
Prije nego što smo prešli na, sva pitanja na Tjednu 0 materijalni?
Svatko osjeća prilično dobro?
Razumijevanje varijable i što je varijabla?
>> Premještanje na. Tjedan 1.
Par stvari ovdje koje nisu posebno pokrivene
u kvizu pregledu nužno, a također su više konceptualne stvari koje treba razmišljati o tome.
Prvi je taj pojam od onoga izvornog koda, prevodioci i objektnog koda su.
Svatko? Bosiljak.
Je li objekt kodnog mislim koda je ono što ste stavili u zveka,
i objekt kod je ono zveka stavlja tako da je vaše računalo može pročitati program.
Točno.
Izvorni kod je C koda da ste zapravo upišite gore.
Objekt code je ono što ste dobili od zveka.
To je 0s i 1s u tom binarnom formatu.
Zatim što se događa kada imate hrpu objekata datoteka,
reći da ste sastavljanje projekt ili program koji koristi više datoteka izvornog koda,
koje po konvenciji su dati. C ekstenziju.
To je razlog zašto smo caesar.c, vigenère.c.
Ako ste pisanje Java programa možete im dati proširenje. Java.
Python programi imaju ekstenziju. PY često.
>> Kada imate više. C datoteke, što ih prevesti.
Jeka ispljune sve ovo binarni smeće.
Zatim, jer želite samo jednog programa
imate linker vezu svih tih predmeta datoteka zajedno
u jednom izvršnu datoteku.
To je ono što se događa kada koristite CS50 knjižnicu, na primjer.
The CS50 knjižnica je i to. H datoteka zaglavlja
da ste pročitali, da je # includecs50.h.
A onda je i posebna binarna datoteka knjižnica
, koji je bio sastavljen da je 0s i 1s,
i da-l zastava, pa ako se vratimo na naše prostore, a mi izgledaju jako brzo
na što se ovdje događa kada gledamo naš zveka zapovijedanja,
ono što mi imamo je ovo naš izvorni kod datoteka ovdje.
To su hrpa prevodilac zastave.
I onda na samom kraju, te-l zastave karika u
stvarne binarne datoteke za ove dvije knjižnice, CS50 knjižnica i onda matematika knjižnica.
>> Razumijevanje svaku vrstu datoteke 'svrhu
u kompilacijski proces je nešto što ćete želite biti u mogućnosti da
dati barem visoku razinu pregled.
Izvorni kod dolazi u. objekta broj izlazi.
Šifra objekta datoteka povezati, a vi dobiti lijepu, izvršnu datoteku.
Cool.
To je također mjesto gdje možete dobiti greška na više točaka
u izračunu procesu.
Ovo je mjesto gdje, na primjer, ako se uzmu ovu povezuje zastavu,
CS50 zastava, a vi ga izostaviti u prostore ili kad radite svoj kôd,
ovo je mjesto gdje ćete dobiti greška u fazi povezivanja,
i linker će reći: "Hej, što se zove funkcija GetString
da je u CS50 knjižnici. "
"Vi ste mi rekli da je u CS50 knjižnici, a ja ne mogu naći kod za njega."
To je mjesto gdje morate ga povezati u, a to je zasebna
iz prevodilac pogreške jer prevodilac gleda sintakse i takve stvari.
To je dobro znati što se događa kada.
>> Druge stvari znati.
Rekao bih vam svakako želite pogledati na kratko typecasting učinio Jordana
razumjeti što Ints su ispod haube,
što znakovi su ispod haube.
Kada govorimo o ASCII i mi zapravo pogledati ASCII tablice,
što to radi daje nam ispod haube izgled
na koliko se računalo zapravo predstavlja kapital i brojku 7
i zarez i upitnik.
Računalo također ima posebne načine predstavljaju
broj 7 kao cijeli broj.
Ona ima poseban način da predstavljaju broj 7 kao pomičnim zarezom broj,
i oni su vrlo različiti.
Typecasting je kako kažeš računalo "Hej, želim vam da pretvoriti
iz jedne reprezentacije u drugu reprezentacije. "
Zašto ne bismo pogledati to.
>> Također bih pogledati kratki o knjižnicama i na kratko prevodiocima.
Oni govore o procesu izrade,
što je knjižnica, i ići preko neke od tih pitanja koje ste mogli dobiti pitao.
Pitanja o tjedna 1 materijala?
Ima li kakvih teme u ovdje, čini se da zastrašiti želite pokriti?
Pokušavam puhati kroz većinu tih ranijih temama, tako da možemo doći do
upućuje i učiniti malo rekurzije.
Misli?
Bilo da pokrije?
Vrijeme je za neke čokolade možda?
Vi dečki rade kroz njega.
Ja ću držati ispijanje kave na mom.
Tjedan 2.
Dobro poziv, dobar poziv.
U tjednu dva razgovarali smo malo više o funkcijama.
>> U prvih nekoliko problematičnih seta nismo stvarno pisati nikakve funkcije na sve
osim što funkcija?
[Studentski] Glavni. >> Glavni, točno.
I tako smo vidjeli različite kostime koje nosi glavni.
Tu je onaj u kojem je potrebno bez argumenata,
a mi samo reći prazninu između zagradama,
i onda je onaj drugi gdje mi žele uzeti argumente naredbenog retka,
i kao što smo vidjeli, to je mjesto gdje imate int argc i argv string lepezu
ili sada da smo zapravo smo izloženi nizu biti char * da je
idemo ga početi pisati kao char * argv i onda zagrade.
U Problem Set 3, vi vidjeli gomilu funkcija,
i provodi hrpa funkcija, crtati, gledati, otimati.
Prototipova sve su napisane tu za vas.
>> Ono što sam želio govoriti o ovdje s funkcijama stvarno brzo
je da postoje tri dijelovi za njih kad god napisati funkciju.
Morate navesti povratni tip funkcije.
Morate navesti naziv funkcije, a zatim morate odrediti
the argument popis ili lista parametara.
Na primjer, ako bih napisati funkciju sumirati hrpa brojeva
, a zatim se vratiti na mene zbroj onoga što će biti moj povratak putovanja
ako sam htio da zaključimo prirodna broja, a zatim se vratiti iznos?
Tada je naziv funkcije.
Ako sam ići naprijed i pisati u zelenom, ovaj dio je povratni tip.
Ovaj dio je ime.
A onda u zagradi između
gdje dajem argumente,
često skraćeno kao args, ponekad se nazivaju parametri za parametara.
A ako imate jedan, samo navesti jedan.
Ako imate više možete razdvojiti jedan sa zarezom.
A za svaki argument ga dati dvije stvari koje su Kevin-?
[Kevin] Morate dati tip i onda ime.
A onda je ime, a ime je ime koje idete na korištenje
koje se odnose na taj argument unutar sum funkciji,
u funkciji koju trenutno pišete.
>> Vi ne morate, na primjer, ako ću sumirati,
recimo, niz cijelih brojeva-hrapavi učiniti int niz,
a ja ću osobno dati neke kovrčave aparatić tu-
onda kad sam proći niz na funkciju sum
Sam ga proći na prvoj poziciji u popis argumenata.
Ali polje koje sam prošla u ne mora imati ime arr.
Arr će biti kako sam se odnose na taj argument unutar tijela funkcije.
Druga je stvar da moramo uzeti u obzir,
a to je malo drugačiji od funkcija, ali mislim da je važna točka,
je da u C kada pišem funkciju ovako
kako znam koliko su elementi u tom nizu?
To je nešto od trik pitanje.
Razgovarali smo o tome malo u prošlotjednom dijelu.
Kako ću znati broj elemenata unutar polja u C?
Je li način?
>> Ispada da ne postoji način da se zna.
Morate ga proći odvojeno.
Tu je trik koji možete učiniti
ako ste u istoj funkciji u kojoj je polje bila prijavljena,
i radite s stog niz.
No, to radi samo ako ste u istoj funkciji.
Nakon što prođe niz na drugu funkciju, ili ako ste proglašeni niz
i staviti da niz na hrpu, koju ste koristili malloc
i da takve stvari, sve oklade su off.
Tada ćete zapravo morati proći oko
posebna argument ili drugi parametar
vam reći koliko je velika polja je.
U tom slučaju, ja bih htio koristiti zarez-Žao mi je, to će isključiti zaslon ovdje-
i ja bih proći u drugi argument
i to nazvati int len ​​za duljinu.
>> Jedna stvar koja bi mogla doći do na kvizu
vas traži da pisati ili provesti određenu funkciju zove nešto.
Ako mi ne daju vam prototip, tako da je cijela ova stvar ovdje,
cijeli ovaj nered se zove funkcije izjavu ili funkcije prototip,
ovo je jedna od prvih stvari koje ćete želite utvrditi, ako to nije dao
da vas odmah na kvizu.
Drugi trik sam saznao je da
kažu mi da vam dati prototip za funkciju, a mi reći, "Hej, moraš ga pisati."
Unutar vitičastih zagrada koje imate na kvizu
ako primijetite da je povratni tip i primijetite da povratni tip
je nešto drugo od praznine, što znači da funkcija ne vraća ništa,
onda jedna stvar koju definitivno želim učiniti je napisati
neka vrsta povratka izjavu na samom kraju funkciji.
Povratak, au ovom slučaju, mi ćemo staviti prazno jer želimo ispuniti u prazno.
Ali to dobiva li razmišlja na pravi način o tome kako ću pristupiti ovaj problem?
I to vas podsjeća da ćeš morati vratiti vrijednost
pozivatelju funkcije.
>> Da. >> [Studentski] Da li stil primijeniti kada smo pisanje koda na kvizu?
Kao što je uvlačenje i takve stvari? >> [Studentski] Aha.
Ne, ne toliko.
Mislim puno-to je nešto što ćemo pojasniti na kvizu na dan,
ali obično brige o # uključuje i takve stvari, to je vrsta izvana.
[Studentski] Trebate li komentirati svoj rukopisu kod?
Trebate li komentirati svoj rukopisu kod?
Komentiranje je uvijek dobro, ako ste zabrinuti za djelomični kredit
ili želite komunicirati svoju namjeru za greder.
Ali sam, opet, će pojasniti na kvizu i sama na kviz dana,
ali ja ne vjerujem da ćete se morati pisati komentare, br.
Obično ne, ali to je definitivno jedna od onih stvari gdje
možete komunicirati svoju namjeru, poput "Hej, ovo je mjesto gdje ću s njim."
A ponekad da mogu pomoći s djelomičnom kredit.
Cool.
>> Bosiljak.
[Bosiljak] Koja je razlika između izjavljuje, recimo, int Lang
u argumentima ili parametara u odnosu na deklariranje varijable unutar funkcije?
Wow, kava siđe dušnik.
[Bosiljak] Kao što stvari koje želite staviti u argumentima.
Da, to je veliko pitanje.
Kako odabrati što stvari koje želite staviti u argumente
u odnosu na što stvari koje treba učiniti unutar funkcije?
U ovom slučaju smo uključeni oboje ih kao argumente
jer oni su nešto što se tko će se koristiti zbroj funkcija
treba odrediti one stvari.
>> Zbroj funkcija, kao što smo razgovarali o tome, nema načina znajući
kako je veliki niz je to dobiva od svoje pozivatelja ili tko koristi zbroj funkciju.
To nema načina znajući koliko je velika da je niz.
Razlog prolazimo u ovom dužini ovdje kao argument
jer to je nešto što mi zapravo govorite pozivatelja funkcije,
tko će se koristiti zbroj funkcija, "Hej, ne samo da ćete morati dati nam niz
od Ints, također imate li nam reći koliko je velika polja koja ste nam dali je. "
[Bosiljak] Oni će oboje biti argumenata naredbenog retka?
Ne, to su stvarni argumenti da će proći u funkciju.
>> Dopustite mi napraviti novu stranicu ovdje.
[Bosiljak] Kao i ime će proći-
[Nate H.] Ako imam int main (void),
i ja ću staviti u mom povratku 0 ovdje dolje na dnu,
i reći želim pozvati zbroj funkciju.
Želim reći int x = suma ();
Da biste koristili funkciju zbroj moram proći u oba polja da želim sumirati
i duljina niza, tako da je to gdje
pretpostavku imao sam niz Ints,
da sam se int numbaz [] = 1, 2, 3,
vrsta uporabe koji sjeckan do sintaksu tamo,
onda ono što ću učiniti je zbroj bih želio da prođe u
i numbaz i broj 3
reći funkciju zbroj "Ok, ovdje je niz želim da zaključimo."
"Evo njegova veličina."
Ima li to smisla? Je li to odgovor na vaše pitanje?
>> Na mnoge načine to ne paralelno što radimo s glavni
kada imamo argumente naredbenog retka.
Program kao Cezarova šifra, na primjer, da je potrebno
zapovjedna linija argumenti ne bi mogli učiniti ništa.
To ne bi znali kako kodirati ako nije rekao to što je ključ za korištenje
ili ako to nije reći što ste htjeli niz za šifriranje.
Poticanje za ulaz, ovo je mjesto gdje imamo dvije različite mehanizme
za uzimanje ulaz u od korisnika, za uzimanje podatke od korisnika.
Za problem Set 1 vidjeli smo to GetInt, GetString, GetFloat način
od pitajući za ulaz, a to se zove koristite standardni ulazni stream.
To je malo drugačija.
To je nešto što možete učiniti u jednom trenutku, za razliku od
kada pozvati program, kada pokrenete program pokrenut.
Naredbenog retka argumente svi su naveli kada ste pokrenuli program pokrenut.
Mi smo bili miješanje dvije od tih.
Kada smo koristiti argumente za funkciju, to je slično kao naredbenog retka glavni argumenti.
To je kad se pozovete funkciju morate reći
točno ono što je potrebno kako bi se obavljaju svoje zadatke.
Još jedna dobra stvar za pogledati, a ja ću vam na to gledate u svoje slobodno vrijeme,
i to je bio pokriven u kvizu-bio je to pojam djelokruga
i lokalne varijable u odnosu na globalnim varijablama.
Učinite obratite pozornost na to.
>> Sada kada smo dobivanje na ovom drugih stvari,
u tjednu 3 smo počeli govoriti o potrazi i sortiranje.
Traženje i sortiranje, barem u CS50,
je vrlo uvod u neke od teoretskih dijelova računalnih znanosti.
Problem traženja, problem sortiranja
su veliki, kanonska problemi.
Kako vam određeni broj u niz milijardama brojeva?
Kako vam određeni naziv unutar telefonskog imenika
koja je pohranjena na vašem prijenosnom računalu?
I tako smo predstaviti ovaj pojam asimptotska premijerne puta
stvarno kvantificirati koliko dugo, koliko je teško to problem su,
koliko dugo su se riješiti.
U, vjerujem, 2011 u kvizu postoji problem koji mislim da zaslužuje
pokrivaju vrlo brzo, što je ova, problem 12.
O ne, to je Omega.
>> Ovdje govorimo o najbrže moguće vrijeme izvođenja
za određeni algoritam, a zatim najsporije moguće pokrenuti vrijeme.
Ovo Omega i O su zapravo samo kratice.
Oni Opisi Prečaci za reći
koliko brzo na najbolji mogući slučaju će naš algoritam mali,
i kako spor u najgorem mogućem slučaju će naš algoritam pokrenuti?
Ajmo napraviti nekoliko njih, a to su također pokriveni
u kratko asimptotska zapis, koji sam visoko preporučiti.
Jackson učinio jako dobar posao.
S binarnog pretraživanja, govorimo o binarnom pretraživanje kao što je algoritam,
a mi obično govorimo o tome u smislu njegovog velikog O.
Što je veliki O?
Što je najsporiji moguće pokrenuti vrijeme od binarnog traženja?
[Studentski] N ²?
Zatvori, pretpostavljam slično tome.
To je puno brže od toga.
[Studentski] Binarni? >> Da, binarno pretraživanje.
[Studentski] To je log n.
Prijavite n, tako što se prijavite n znači?
To poluvremena ga svake iteracije.
Točno, pa u najsporiji mogući slučaju,
recimo ako imate sortirani niz
od milijun brojeva i broj tražite
je bilo vrlo prvi element u polju ili posljednjeg elementa u polju.
Zapamtite, binarni algoritam za pretraživanje radi gleda na sredini elementa,
vidim ako je to utakmica koja ste u potrazi za.
Ako je tako, onda super, što ste ga našli.
>> U najbolji mogući slučaju, kako brzo se izvoditi binarnog pretraživanja?
[Studenti] 1.
1, to je konstanta vrijeme, velika O u jednom. Da.
[Studentski] imam pitanje. Kada kažeš prijavite n, što znači s obzirom na bazu 2, zar ne?
Da, tako da je druga stvar.
Kažemo log n, i mislim da kad sam bio u srednjoj školi
Uvijek sam pretpostavljala da je zapisnik bio baza 10.
Da, tako da, prijavite baza 2 obično je ono što ćemo koristiti.
Opet, ide natrag u binarnom traženju, ako ste u potrazi za bilo
element na samom kraju ili element na samom početku,
jer ti početi u sredini, a zatim ga bacite
god polovine ne zadovoljava kriterije da ste u potrazi za,
i idete na sljedeću poluvremena i sljedeći pol i sljedeću pol.
Ako sam u potrazi za najveći element u integer milijuna niz
Ja ću ga prepoloviti na većini zapisniku milijun puta
prije nego što sam konačno testirati i vidjeti da je element tražim
je najveći ili u najvišoj indeksa polja,
i da će se zapisnik n, prijavite od milijun puta.
>> Bubble vrsta.
Nemojte vi sjećate algoritam sortiranja mjehurić?
Kevin, možete li mi dati brzo rekapitulacija onoga što se dogodilo u algoritmu bubble sortiranje?
[Kevin] Uglavnom to ide kroz sve što je u popisu.
To izgleda na prve dvije.
Ako prvi je veći od drugog jedan ona ih swaps.
Zatim uspoređuje drugi i treći, istu stvar, zamjene,
Treća i četvrta, sve do kraja.
Veće brojevi će slijediti do kraja.
I nakon međutim mnogo petlje ste učinili.
Točno, tako što Kevin je da ćemo gledati veće brojeve
mjehurić do kraja niza.
Na primjer, ne možete smeta nam šetnju kroz ovaj primjer, ako je to naš niz?
[Kevin] Vi ćete uzeti dva i tri.
3 je veći od 2, tako da ih zamijene.
[Nate H.] Točno, pa smo zamijenili to, i tako smo dobili dvije, tri, šest, četiri i devet.
[Kevin] Onda usporediti tri i šest.
3 je manji od šest, tako da ih napuste,
i 6 i 4, da bih ih zamijeniti zato što je 4 manji od šest.
[Nate H.] Točno, pa sam se dva, tri, četiri, šest, devet.
[Kevin] A 9 je veći od šest, tako da ga napuste.
A ti bi se vratiti kroz nju opet.
>> [Nate H.] Jesam li ja učinio u ovom trenutku? >> [Kevin] Ne
A zašto ja ne učinjeno u ovom trenutku?
Budući da to izgleda kao moj polje je riješeno. Gledam na to.
[Kevin] Prođite kroz njega opet i pobrinite se da ne postoje više swaps
prije nego što u potpunosti ne može zaustaviti.
Točno, tako da ćete morati držati prolazi kroz i pobrinite se da ne postoje zamjene
koje možete napraviti u ovom trenutku.
To je zapravo samo sretan, kao što ste rekli, da smo završili
samo da bi jednom proći kroz te smo razvrstani.
No, za to se u općem slučaju mi ​​zapravo ćete to učiniti opet i opet.
A u stvari, to je bio primjer na najbolji mogući slučaju,
kao što smo vidjeli u problemu.
Vidjeli smo da je najbolji mogući slučaj je n.
Mi smo išli kroz polja jednog vremena.
Što je najgore moguće slučaj za ovog algoritma?
[Kevin] N ².
A što to izgledati? Što bi pogled niz kao da će uzeti vremena n ²?
[Kevin] [nečujno] razvrstani.
Točno, pa ako sam imao niz 9, 7, 6, 5, 2,
prvo devet bi mjehur skroz gore.
Nakon jedne iteracije ćemo imati 7, 6, 5, 2, 9.
Tada 7 bi mjehurić, 6, 5, 2, 7, 9, i tako dalje i tako dalje.
>> Morali bismo proći kroz cijeli niz n puta,
i zapravo možete dobiti nešto precizniji od toga
jer jednom smo se preselili 9 skroz gore u svom posljednjem mogućem položaju
znamo da nikada ne morate usporediti protiv tog elementa opet.
Nakon što smo početi bubbling od 7 do
znamo da možemo zaustaviti jednom sedam je pravo prije 9
budući da smo već usporedili 9 do njega.
Ako ste to učinili u pametan način to nije uistinu, mislim da puno vremena.
Nećeš usporediti sve moguće [nečujne] kombinacije
svaki put kad ide kroz svake iteracije.
Ali ipak, kad govorimo o tome gornja granica možemo reći da je
tražite na n ² usporedbe sve na putu kroz.
>> Vratimo se, a budući da smo počinju da se malo na kratko vrijeme
Rekao bih svakako trebao ići kroz ostatak ove tablice,
ispunite sve van.
Razmislite o primjerima. Razmislite o konkretnim primjerima.
To je jako zgodan i koristan za napraviti.
Ga izvući.
To je vrsta tablici da kao što ste proći kroz u informatici
vi stvarno trebali početi znati ove napamet.
To su vrste pitanja ćete dobiti u intervjuima.
To su vrste stvari koje su dobro znati,
i razmišljam o tim rubnim slučajevima, stvarno figuring out kako razmišljati o
znajući da je za balon sortirati najgori mogući niz
sortirati s koje je onaj koji je u obrnutom redoslijedu.
>> Upućuje. Pričajmo malo o pokazivače.
U posljednjih nekoliko minuta imamo ovdje
Znam da je to nešto zajedno s datotekom I / O tom je prilično nova.
Kada govorimo o pokazivače razlog želimo razgovarati o pokazivače
jer, jedna, kada radimo u C
mi smo stvarno na prilično niskoj razini u odnosu na većinu modernih programskih jezika.
Mi smo zapravo u mogućnosti da manipuliraju varijable u memoriji,
shvatiti gdje oni zapravo nalazi unutar našeg RAM-a.
Nakon što sam otišao na da se nastava operacijskih sustava vidjet ćete
da je to, opet, svojevrsna apstrakcija.
To je zapravo nije slučaj.
Imamo virtualne memorije koja se skriva te detalje od nas.
>> No, za sada se može pretpostaviti da kada imate program,
Na primjer, kada se početi prikazivati ​​svoj Cezarova šifra programa-
Ja ću se vratiti na moj ipad stvarno brzo-
da je na samom početku svog programa, ako imate, recimo,
4 gigabajta RAM-a na vašem prijenosnom računalu,
što se izdvojiti ovaj komad, a mi ćemo nazvati ovaj RAM-a.
I to počinje u mjestu idemo na poziv 0,
a završava na mjestu koje ćemo nazvati četiri gigabajta.
Ja stvarno ne mogu pisati. Čovjek, koji je hakirana.
Kada vaš program izvršava
operativni sustav urezuje RAM,
i to određuje različite segmente za različite dijelove svog programa da živite u.
Dolje ovdje ovo područje je vrsta ničijoj zemlji.
Kada ići gore malo dalje ovdje
imaš zapravo mjesto gdje
kod za svoje programske životima.
To stvarna binarni kod, da izvršna datoteka zapravo se učitava u memoriju
kada pokrenete program, a živi u kodu segmentu.
I kao što je vaš program izvršava procesor izgleda u ovom segmentu koda
shvatiti što je sljedeći upute?
Što je sljedeće linija koda moram izvršiti?
>> Tu je također i podaci segment, a to je gdje su oni string konstante
pohranjuju se da ste koristili.
I onda dalje tamo je ovo mjesto koje se zove gomila.
Mi pristupili memorije tamo pomoću malloc,
, a zatim prema samom vrhu svog programa
tu je stog,
i to je gdje smo bili igrajući za većinu od početka.
To nije u mjerilu ili ništa.
Puno je to vrlo stroj ovisan,
ovisan o operativnom sustavu, ali to je relativno kako se stvari blokovima gore.
Kada pokrenete program i proglasiti varijabla zove x-
Ja ću povući još jedan okvir dolje, a to će biti RAM-a, kao dobro.
I ja ću gledati.
Mi ćemo izvući nazubljene linije ukazuju na to je samo mali dio RAM-a
a ne sve to što smo izvući na vrhu.
>> Ako Izjavljujem integer varijable zvane x,
onda ono što sam zapravo dobiti je mapiranje
koji je pohranjen u tablici simbola mog programa
koji povezuje ime x na ovim prostorima memorije koje sam nacrtana
ovdje između vertikalnih rešetaka.
Ako imam liniju koda u mom programu koji kaže da je x = 7
procesor zna "Oh, ok, znam da je x živi na tom mjestu u memoriji."
"Ja ću ići naprijed i napisati 7 tamo."
Kako to znati što je to mjesto u memoriji?
Pa, da je sve učinjeno u vrijeme prevođenja.
Prevodilac brine o raspodjeli gdje svaka od varijabli ići
i stvaranje posebnog mapiranje odnosno povezuje točkice
između simbola i gdje to ide, varijabla je naziv
i gdje će živjeti u sjećanju.
No, ispada da zapravo možemo pristupiti u našim programima kao dobro.
To dobiva važno kada smo počeli govoriti o nekim strukturama podataka,
što je koncept koji ćemo predstaviti kasnije.
>> Ali za sada, ono što možete znati je da sam može stvoriti pokazivač na ovoj lokaciji, x.
Na primjer, mogu stvoriti varijablu pokazivača.
Kada smo stvoriti pokazivač varijablu koristimo zvijezda zapis.
U ovom slučaju, to govori da ću stvoriti pokazivač na int.
To je vrsta baš kao i svaka druga.
Dajemo mu varijablu kao y,
i onda smo ga postaviti jednako na adresu, na adresu.
U tom slučaju, možemo postaviti y ukazati na x
uzimajući adresu X, koji smo veze s ovim ampersand,
i onda smo krenuli y ukazati na njega.
Što to zapravo znači je, ako ćemo gledati na našem RAM
to stvara posebnu varijablu.
To će se zvati y,
i kad ova linija koda izvršava
to se zapravo događa stvoriti malo pokazivač koji mi obično izvlačenje kao strijela,
i to postavlja y ukazati na x.
Da.
[Studentski] Ako je x već pokazivač, da li bi samo napraviti
int * y = x, umjesto da se ampersand?
Da.
Ako je x već pokazivač, onda možete postaviti dva upućuje jednake jedni druge,
u kojem slučaju y ne ukazuju na x,
ali to bi ukazivalo na ono što je x pokazujući.
Nažalost, mi smo izvan vremena.
>> Ono što bih reći u ovom trenutku, možemo govoriti o ovom odsutan,
ali rekao bih početi raditi kroz ovaj problem, # 14.
Možete vidjeti da je već malo popuniti za vas ovdje.
Možete vidjeti da kad smo proglasiti dva pokazivača, int * x i y *,
i napomena da pokazujući * pored varijable je nešto što je učinjeno prošle godine.
Ispada da je to slično onome što radimo ove godine.
Nije bitno gdje ste pisati * Kada ste proglašenja pokazivač.
No, mi smo napisali * uz vrsti
jer, što ga čini vrlo jasno da ste deklariranje pokazivača varijablu.
Možete vidjeti da je proglašenje dva upućuje nam daje dvije kutije.
Evo kada smo postavili x jednak malloc
što to govori se poništaj sjećanje na hrpi.
Ova mala kutija ovdje, ovaj krug, nalazi se na hrpi.
X je pokazujući na njega.
Imajte na umu da je y se još uvijek ne pokazuje ništa.
Da biste dobili memorije za pohranu broj 42 u x.
mi bi koristiti ono zapis?
[Studentski] * x = 42.
Točno, * x = 42.
To znači slijediti strelicu i baciti 42 tamo.
Ovdje gdje smo postavili y i x y mi smo pokazujući x.
Opet, ovo je baš kao što je Kevin gdje smo postavili y jednak x..
Y ne ukazuje na x.
Umjesto toga, to je ukazujući na ono što je x ističući da kao dobro.
>> I onda napokon u ovoj posljednjoj kutiji postoje dvije moguće stvari koje smo mogli učiniti.
Jedan od njih je mogli bismo reći * x = 13.
Druga stvar je da smo mogli reći-Alex, znaš ono što smo mogli učiniti ovdje?
Moglo bi se reći * x = 13 ili-
[Studentski] Moglo bi se reći int štogod.
[Nate H.] Ako je ovo upućeno je kao int varijabla smo mogli učiniti.
Također smo mogli reći * y = 13 jer su oboje upućuju na isto mjesto,
tako da smo mogli koristiti bilo varijabla doći.
Da. >> [Studentski] Što bi to izgledati ako mi samo reći int x 13?
To će biti proglašenje novu varijablu nazvanu x, koji ne bi raditi.
Mi bi sudar jer smo proglasili x biti pokazivač ovdje.
[Studentski] Ako mi samo imao tu izjavu po sebi što bi to izgledati u smislu kruga?
Ako smo imali x = 13 onda ćemo imati okvir, i umjesto da ima strelicu
izlazi iz okvira ćemo ga izvući samo kao 13.
[Studentski] U okviru. Ok.
>> Hvala za gledanje, i sretno na kvizu 0.
[CS50.TV]