[Powered by Google Translate] [Tjedan 3]
[David J. Malan - Sveučilište Harvard]
[Ovo je CS50. - CS50.TV]
Dopustite mi da nas usmjeriti u smjeru gdje smo stali zadnji put,
koji je počeo razmišljati malo više nego o sintaksi
i pokušava razmišljati malo manje o svim sitnice
koji traje malo vremena za aklimatizirati na dosad u smislu zarezom
i zagrade i vitičastim zagradama,
početi uzimati stvari malo na višoj konceptualnoj razini
tako da su problemi sada smo početi rješavati u idućih nekoliko tjedana
će uključivati ​​mnogo više u višoj razini konceptualne probleme
i malo manje u sintaktička kao što ste dobili vaše noge mokre
i vaše ruke prljave s nekim od sintakse od ovih posljednjih nekoliko tjedana.
>> Dakle, podsjetimo da je prošlog tjedna smo uveli taj pojam niz.
I niz u engleskom se može opisati kao što? >> [Nečujno učenik odgovor]
Molim?
Zbirka? >> [Nečujno učenik odgovor] >> Dobro, dobro.
Zbirka predmeta. Dakle, vidjeli smo polja u nule.
Ako se dogodilo koristiti za pset 0 jedna od nule na popisima koji možete povući stvari
poput naranče i banane u, inventara sorti,
to je vrsta kao što je polje.
A onda više tehnički, u kontekstu stvarnog računala,
Niz je jednostavno granični komad memorije.
Drugim riječima, imate byte, a zatim još jedan byte, a zatim još jedan byte, a zatim još jedan bajt,
i ako ste bili privući one bajtova u slici,
oni će se vratiti natrag na leđa na leđa. To je ono što mi podrazumijevamo pod graniče.
>> Dakle, to je bajt broj 1, zatim dva, zatim tri.
To ne znači da se ovdje, ovdje, ovdje, ovdje.
Niz je granični komad 0 ili više bajtova.
Dakle, ono što su oni korisni za?
Podsjetimo smo imali ovu vrstu ishitreno primjer za pohranu tuđe kviz razreda u programu
izračunati prosječnu komentar za neki tečaj,
a podsjetimo se da bismo mogli početi pisati taj program deklariranje varijable quiz1.
Tada bismo mogli imati još jedan varijablu nazvanu quiz2.
Ali ako je bilo tri kvizova u ovoj klasi, quiz4.
Ili, ako postoji tjedni kviz, to će biti quiz5, quiz6, quiz7.
Tako da bi sve ove varijable proglasio unutar glavna
ili negdje drugdje u svom programu,
i problem s tom pristupu, lako premda je samo kopirati i zalijepiti,
je to samo vrlo brzo postaje nezgrapan.
Ne daj Bože da zapravo imaju 30 ili 50 kvizova kvizovima.
Ako je kao srednjoškolski stil dnevnog pop kviz,
onda samo imaju smiješno dugačak popis varijable se proglasio,
i to samo vrlo brzo izmakne kontroli.
To je ružna, to je teško održavati, to je tako puno lakše napraviti slovoslagač
ako se jedan broj upisao negdje u svom programu.
>> Tako smo uveli pojam niz umjesto.
I podsjetiti da smo provodi ovaj program radi malo nešto ovako.
Pusti me u današnjem Izvor tri ponedjeljak imeniku
i otvoriti niz, što smo vidjeli zadnji put.
I iako je bilo par novih C trikova ovdje,
među njima pojam konstanta,
Podsjetimo da smo proglasili više pliva u suštini pomoću ovu sintaksu:
plovak, zatim naziv varijable, onda ćemo koristiti četvornih aparatić stvarno prvi put,
i ono što smo učinili unutar tih četvornih aparatić učinkovito je staviti broj.
No, umjesto stavljanja broj, ja sam stavio ovu slovom riječ, kvizova.
A što je motivacija za stavljanje slovom riječ poput kvizova
, a zatim pomoću retka 17 trik ovdje zapravo dati da jedan broj?
Što je motivacija tamo? Da.
>> [Nečujno učenik odgovor] >> Točno.
Ako želimo promijeniti tu vrijednost 2, imamo samo ga promijeniti u jednom mjestu
jer smatraju - Ja ni ne sjećam što je ovaj program nije točno,
ali ako samo to obrano vidite kvizovi, kvizovi.
Vidite kvizove, ovdje više KVIZOVI.
Dakle, ako nismo imali to konstanta, ovo korištenje oštra definirati,
bismo upisali 2, zatim 2, zatim 2, zatim 2, što je u redu. To će biti samo kao točne.
Ali pretpostavimo da će iduće godine imamo tri kvizove u CS50.
Dakle, moram ići i ažurirati kôd, moram ga rekompiliranje,
ali problem je ako sam nešto glupo, kao da sam izlaziti jednom spomenuti dva
i zaboraviti priključiti tri, cijeli program bi mogao vrlo dobro razbiti.
Dakle, mi samo tražimo za nevolje.
>> Dakle, pojam konstanta je sve o faktoringu iz nekog komada podataka,
da li je string ili char ili float ili što god,
i proglašavajući ga jednom mjestu, tako da možete lakše ga promijeniti u budućnosti.
I to je također, iskreno, malo lakše čitati, jer ako samo mislite o tome sada,
to je kvizovi, ili čak smo mogli preimenovati to nešto poput NUMBER_OF_QUIZZES
ili nešto precizniji.
Kod samo postaje očito malo više, kao što se to radi,
i pitaš se malo manje ono broj 2 bi se moglo dogoditi da znači.
Tako je konstanta imala ništa bitno s polja.
Niz je uveden putem tih četvornih aparatić.
>> Dakle, primijetiti da u skladu 23 smo pitati korisnika, "Kakvi su bili vaši rezultati kviz?"
Onda imamo samo ovu petlju koja navodno traži korisnika za svojim ocjenama. Kako?
To ponovi 0-2. A ja kažem dvije, jer kvizove u svim kape je trenutno dva.
Dakle, to ponovi od 0 do 2, a zatim ga ispisuje Kviz # nešto nešto,
, a zatim koristi GetFloat dobiti vrijednost od korisnika.
Dakle, primijetite to je samo drugi novi komad sintakse od prošle srijede.
Ako želite spremiti nešto na određenom mjestu u tom nizu,
opet koristiti uglate zagrade.
>> Dakle, tu je malo dihotomije ovdje.
Prvi put kada koristite uglate zagrade
ga koristiti za određivanje koliko je velika želite da se polje.
Ali ovaj sljedeći kontekst ovdje gdje smo ponovno zaposliti ove uglate zagrade
znači gdje u tom polju ne želite staviti neku vrijednost?
A razlika ovdje se može zaključiti iz konteksta.
Obavijest ovdje imamo vrstu podataka, onda ćemo imati ime varijable,
onda imamo četvornih aparatić sa brojem unutra, zarezom. To je to.
Tako da je deklaracija.
To je kao da smo učinili nešto poput plovka Grade1; float grade2;
ali opet, to se vrlo brzo prerasta u način previše copy, paste,
pa umjesto da samo to pojednostavljeno kao takva,
što znači da od sada imamo ocjenu koja se može pohraniti na nosač 0,
imamo još jedan razred koji se može pohraniti na nosač 1,
ali što ako sam glupan i, na primjer, moj petlja ide tako daleko -
na primjer, ja bi ovo manje od ili jednako,
koja opoziv bio izvor prethodnog bug -
što zapravo znači da se na neki treći slučajnog iteracije ovoj petlji
Ja koristiti konzolu dva. Efektivno, što bi se moglo dogoditi ovdje? Molim?
[Student] To će biti zamijenjen. >> Je li će biti zamijenjen?
Što će biti zamijenjeni?
Ovo je doslovno rekao zamijeniti ono što je na lokaciji 2 s povratnom vrijednosti GetFloat.
No, problem je koliko je velik polje u ovom trenutku u priči?
[Nečujno učenik odgovor] >> Niz je još samo dvije veličine
jer polju, kao i bilo koje varijable, proglašen je prvi, prije nego što smo ga koristili,
a mi naveden ovdje zbog toga stalno da imam dvije ocjene koje ću staviti.
>> Ali zapamtite, računalni znanstvenici početi računajući od 0.
Dakle, prvi mjesto u tom nizu je nosač 0.
Sljedeći location je 1. Ova stvar je ikada tako nešto previše na stranu.
Dakle, drugim riječima, ako sam zapravo imao taj niz -
i da vidim koliko dobro to surađuje ovdje za nas -
ako imam niz koji sam jednostavno sam nacrtana kako slijedi
i ja sam izdvojila prostor za dva elementa, možda ću nacrtati ovo ovako u memoriji
gdje je to velika bijela platno.
To je samo RAM-a imam u mom računalu, koncert RAM-a, dva nastupa RAM, bez obzira,
ali ove dvije kutije sada pojedinačno predstavljaju plovak, 32 bita.
Dakle, ako sam stavio jedan broj ovdje kao 1,0, onda sam stavio još jedan broj ovdje kao 3,2
ali onda sam napraviti nosač dva, to je poput stavljanja nešto ovdje.
I kao što slika pokazuje, ne postoji ništa tamo.
To je vrsta kao ničijoj zemlji jer nisam pitao operativni sustav
da mi ovaj treći kviz.
Ako sam htjela da treći kviz, trebao sam imala predumišljaj
pitati operativni sustav za njega objavljujući KVIZOVI da neće biti 2
ali umjesto da jednaka 3.
>> Dakle, drugim riječima, slika da smo učinkovito imati pri ruci izgleda ovako ovdje.
To je opet ničija zemlja. Mi bolje ne probati pisanje vrijednosti ovdje.
Ali opet, jer znanstvenici računala brojati od 0,
kada govorimo o ovoj lokaciji u nizu, koji je trebao biti mjesto 0,
ovo je trebao biti mjesto 1, a to uopće ne postoji
jer mi samo upitani operativni sustav za dvije takvim mjestima.
Dakle, one od vas s prethodnom programskom iskustva iz drugih jezika
Možda znate da to nije uvijek slučaj s polja ili stvari zove vektori.
Umjesto toga, možete jednostavno držati dodajući i dodavanjem i dodavanjem stvari na polja,
koji, iskreno, nismo imali tu sposobnost u nule, a ipak mi se čini da su ga dao ovdje
jer sa C programiranje ste mnogo jasnije.
To je samo vi i računalo upravo sada, a računalo samo će učiniti
što reći na to.
Dakle, ako ste samo reći da vam dvije splavi preko linije 22 ovdje,
to je sve što ćeš dobiti natrag iz operativnog sustava: prostor za dva.
>> Tako su sve svoje programe će povremeno biti lud s obzirom na poljima.
Ovo je samo vrsta prirodi zvijeri kojim smo svi mi pogrešiv,
te u nekom trenutku ćete vrlo vjerojatno indeks izvan granica svoje polje.
A to je samo fancy način govoreći da je otišao u konzolu nešto
i nešto je jednostavno previše velik broja. Vi otišao izvan granica svoje polje.
Ali sada je to naopako.
Ostatak ovog programa ima stvarno ništa suštinski način veze s polja.
To je sve samo o nekom jednostavnom aritmetikom za računanje prosjeka.
Dakle, imamo ovdje u ovo za petlju ovdje prvi varijabla zove sum da mi inicijalizira na 0.
Onda smo ponoviti od 0 do dva i opet smo dodati da je zbrajanja varijabli
ith razreda, tako da nosač 0 tada nosač jedan.
I onda, kao što će učiniti u osnovnoj školi kako bi izračunali prosjek,
mi jednostavno uzeti taj iznos, podijelite ga sa ukupnim brojem od kvizova,
i onda za dobru mjeru zovemo funkciju ovdje zove kolo.
>> Sada, kao stranu, što je stvar s ovim usputna int na liniji 34?
To bi moglo doći do već u dijelu, nisu zapravo govorio o tome službeno ovdje,
ali što je to u int parens vjerojatno radiš? >> [Nečujno učenik odgovor]
Da, to se odnosi na casting ili typecasting,
što znači uzimanje jedne vrste podataka i pretvoriti ga u drugu.
Ne možete to učiniti sa svim vrstama podataka, jer ponekad to će biti malo čudno.
No, u tom slučaju, ako povratak vrijednost rundi je plovak
jer, nakon svega, ja sam uzimajući plovak i dijeljenjem s brojem 2 kao,
Ja ću dobiti natrag plovak.
Ali razreda ljudi školske stvarno ne želite znati da je njihov prosjek je bio 93,4
jer ćete shvatiti da su ikad tako blizu tog 95 zaokruživanje točke.
>> Dakle, želimo da umjesto toga koristiti int zaokružiti sve do najbliže int,
koja je u ovom slučaju će biti 94 bez točke nakon njega.
Dakle, to je samo malo matematički trik.
A mi ćemo se vratiti na ovaj pojam lijevanje, jer to će imati implikacije,
ako niste otkrili, već za dva problema postaviti.
Dakle, niz tada, možete misliti - to će me nasmijati cijeli dan.
To izgleda ovako ako nacrtati sliku o njemu,
ali ključ je da veličina je također izabrao vas
kada ga zatražiti od operativnog sustava.
Sva pitanja onda na polja? Da.
[Nečujno učenik pitanje]
Ah, dobro pitanje.
Pitanje je što se događa s nulte 0 u polju? To ne postoji u tom kontekstu.
To postoji samo u kontekstu žice, što smo o doći u samo trenutak.
No, za niz, kao u ovom slučaju, sve što dobivate je ono što tražim operativni sustav za.
>> I kao stranu, da ne bi to biti nejasno,
Ja stalno govoriš pitate operacijski sustav, pitajte operativni sustav.
Operativni sustav, kao što vjerojatno znate, Mac OS, Windows, Linux.
Kada zovete funkcije poput GetFloat
ili ste progla varijable kao razredima,
Na kraju dana možete učinkovito traže da netko drugi da vam to sjećanje
jer mi kao želja programera
nemam pojma kako zapravo dobili fizički pristup memoriji.
Ali netko radi: operativni sustav.
Dakle, osim nas predstavlja s lijepim ikona i izbornika i mape i kao
koji možete vidjeti na radnoj površini, da li Mac ili PC,
operacijski sustavi također učiniti nisku razinu zemaljski stvari,
visoko tehničko osoblje za upravljanje gigabajt
ili dva gigabajta memorije koju imaju, upravljanje procesora koji imate, i tako dalje.
Dakle, kada ste pisanja koda,
ste stvarno spaja na svoj operativni sustav u tom smislu.
Ja ću morati smanjiti da. U redu.
>> Ostala pitanja o nizovima?
No? Ok.
Dakle, tranzicija, naravno, iz polja je zapravo na temu koja je malo poznato.
I mi smo gledali sve tako kratko na ovom posljednjem trenutku previše.
To je niz primjera iz srijedu.
Ovaj niz primjera bio je prilično jednostavan program,
i zapravo sam ga pojednostavljeno nekoliko redaka za današnje potrebe.
Sve to čini u skladu 19 je dobiti niz od korisnika, sprema ga u varijablu naziva je.
Tada se u liniji 22 nadalje je očito je da je tisak string jedan lik po liniji.
No, kako se to radi?
Mi smo deklariranje varijable ja, postavljanje jednaka 0,
i to je sve stara navika sada.
Mi ne vidio ovo do srijede, ali možete vrsta zaključiti iz imena
strlen samo vraća ono kad s. dao? Duljina niza.
Dakle, ako sam proći ga niz, citat-završiti citat David,
nadamo se da će se vratiti k meni broj 5 zbog Davida.
Dakle, to je njegova svrha u životu je da se niz, bilo teško kodira vas
ili u ovom slučaju priključen kao varijablu, kao argument,
i to figure out što je duljina tog niza je.
>> Dakle, ovdje sada smo posudio neki zapis iz prethodnog kviz primjer.
To nema nikakve veze s plovcima, nema nikakve veze s kvizovima,
ali ispada da je mali bijeli laž smo vam govorim jer tjednu 1
je da niz zapravo ne postoji u C.
String na kraju dana je zapravo samo polje.
To je niz bajtova, pa bajt bajt bajt bajt, koji je opoziv samo 8 bita,
pa komad memorije, komad memorije, komad memorije, komad memorije.
A način na koji se provodi niz
je stavljanjem prvi znak ovdje,
onda ovdje, onda ovdje, onda evo, vratio se natrag na leđa u memoriji računala.
Dakle, ako ste htjeli sricati riječ kao ZDRAVO, ti bi stavio jedan H znakova,
zatim E, onda L tada L, onda O - pet znakova u ukupno - negdje u računala RAM-a.
No, ključni detalj ovdje je da oni će se vratiti natrag na leđa uz leđa,
tik jedna s drugom.
Kad kad kažem s [i], što na engleskom jeziku je to mi daje?
Što je [i] predstavljaju u ovom slučaju? Da.
>> [Student] i ti lik u nizu. >> Točno. I ti lik u nizu.
Sada, ja će započeti u 0 po mom for petlje ovdje,
ali to je dobro, jer sve počinje brojati od 0.
Dakle, s [0] će predstavljati slovo H u riječi kao što su ZDRAVO,
S [1] će predstavljati pismo kao E u riječi kao što su ZDRAVO, i tako dalje.
I ono što mi se čini da se radi o svakoj iteraciji ove petlje
je privremeno pohranjivanje ith lik u varijablu zove c, što je samo char,
i onda smo ispis c
tako da na kraju dana što ovaj program čini je sljedeći.
Ako odem u izvorni direktorij i ja napraviti string1 i ja ići naprijed i pokrenuti string1,
i onda sam upišite riječ kao ZDRAVO, Enter, sve je to ipak ispisati ovaj jedan lik u isto vrijeme.
>> Dakle, tu je prilika za doradu ovdje.
Nekako sam raditi više poslova, iako je sve jasnije možda na taj način, nego što je potrebno.
Koja linija koda ovdje mogu vjerojatno baciti uopce? Da.
Linija 24. U skladu 24 sam deklariranje varijable c.
Ja sam pohranu ith karakter je u njemu, ali onda sam koristeći c ovdje.
Dakle, ja sam koristeći c, tako da se osjećam kao da ne mogu samo baciti liniju 24 daleko.
[Nečujno učenik komentar] >> Točno.
Dakle, kada je u pitanju razgovor o dizajnu programa,
primijetiti ovaj blagi pojednostavljenje koda, što je jednako čitljiv,
ali shvatite da je samo varijabla, njegov je tip podataka polja,
tako da s [i] samo će se odmah vratiti na vas ith znakova u tom nizu.
A ako želite ga ispisati, to je u redu.
Vi samo morati koristiti% c jer niste ispis niz,
ste tiskanje lik u nizu, i to također ima učinak ispis ith karakter.
I sjećam jedina razlika stvarno od prošlog tjedna s pomoću printf
je da, dok u tjednima prošlosti bismo učiniti nešto super jednostavno
kao% s rezervirano onda je ime niza ovdje,
Sada smo u ronjenju malo dublje ispod haube i govori,
ne ispisati niz, ispisati jedan znak u njoj.
>> Dakle, možemo učiniti nešto malo drugačiji jer ovdje postoji jedna druga - nije bug
jer ovaj program je u pravu, ali ja radim nešto glupo
koje sam spomenuo nakratko u srijedu.
No, misleći natrag, kako bi ovaj program dizajn biti poboljšana i dalje? Da.
[Nečujno učenik odgovor] >> Oh, dobro.
Tako se prisjetiti da smo uveli drugi varijablu nazvanu n posljednje vrijeme,
koji izgleda kao da se sami kontradiktorne, jer moj cilj drugi prije
bio je samo baciti varijablu kao nepotrebno,
ali podsjećaju da je u srijedu smo zapravo je to učinio.
Promijenio sam za petlje da zapravo imaju zarez ovdje, onda n = strlen,
i onda ovdje sam ja <n, onda sam moje koracima.
Što je temeljna dobit da sam postizanje promjenom moje inicijalizacije na to
i moj uvjet da to sada? >> [Nečujno učenik odgovor] >> Točno.
Nisam podsjećajući strlen opet i opet i opet, jer se prisjetiti kako je za petlje radova.
Čak i ako oni počnu da se više komplicirano izgleda,
Podsjetimo da je stvar prije prvog zareza je inicijalizacija, koja se događa jednom.
Uvjet je, međutim, u sredini,
i to dobiva provjeriti svaki put kada se ide kroz petlju.
>> Dakle, to je glupo da se pitate računalu isto pitanje opet i opet -
Što je duljina HELLO? Što je duljina HELLO? Što je duljina HELLO? -
jer kao što ćemo vidjeti danas i srijedu, ovo je definitivno će potrajati,
i to nije jako dobro iskoristiti vrijeme, jer shvatiti duljinu niza
zapravo potrebno malo truda.
To nije trenutna, kao što je to u nekim jezicima.
Dakle, promjenom to n, cijena plaćam je ono?
Mi gledamo trade-off ovdje.
Ja mogu uštedjeti vrijeme ne postavljam isto pitanje prokletu opet i opet,
ali to ide na trošak mi nešto, što je ono?
>> [Student] Ti izgubiti određenu količinu memorije. >> Točno. To će me stajati neko sjećanje.
Dakle, u ovom slučaju to košta me što?
Još 32 bita, jer n je samo int, kao implicira riječi int ovdje.
No, je li to u redu?
Iskreno, to je vjerojatno u redu, jer ako mislite o tome,
više string, više vremena ću se troši
jer strlen će se zove opet i opet i opet
za svaku iteraciju petlje.
I ovih dana, moj Mac ima dva nastupa RAM, ovih dana 4 gigs od RAM ponekad.
Mislim da si mogu priuštiti četiri od tih bajtova zapravo ubrzati stvari.
No, to će biti trade-off i tema stvarno u programiranju i informatike
od nikada stvarno uzimajući ništa besplatno.
Ako želite poboljšati nešto ovdje, morate platiti za to u drugoj ruci nekako.
Prostor u odnosu na vrijeme u ovom slučaju.
>> Dakle, to je sve dovelo do prema nečemu grobni ovako,
koji, kao što ste vjerojatno shvatili do sada, zapravo kaže?
[Nečujno učenik odgovor] >> Da, tako je to, budite sigurni da pije svoj Ovaltine,
zapravo koristi algoritam pod nazivom ROT13, ROT 1-3,
što samo znači okretati sve od slova 13 mjesta,
što znači voditi, a zatim dodajte 13 do njega i točka, točka, točka
sve do 13. pismu gostima, učiniti istu stvar za BiH i za C i za D i tako dalje.
I tako, ako smo zapravo pretvoriti ovo ovdje koristi pomak od 13 mjesta,
ćemo se vratiti na ono malo što je imao Ralphie, koji je, Budite sigurni da pijete svoj Ovaltine.
No, za sada problema postaviti dva, u standardnom izdanju najmanje,
moraš vrste ne to sami enciphering,
i moramo nekako uzeti u ulazu kao što je ovaj i šifriranje ili dešifriranje ga ga.
>> Dakle, koji od tih osnova kakve nas dovodi do tu priliku?
Idemo pogledati ovaj treći primjer ovdje.
Prije svega, to se zove ASCII. Što ASCII ne odnosi natrag?
American Standard Code za informiranje razmjenu,
što je stvarno dug put govoreći što? Što je ASCII?
[Nečujno učenik odgovor] >> Što je to? >> [Student] Lik karta. >> Lik karta.
To samo mapira brojeve slovima, jer svijet ima standardizirani
što će se brojke predstavljaju ono slova, tako da svatko od nas može koristiti računala
i naši programi su sve samo kompatibilni kada je u pitanju ispis stvari na zaslonu.
Tako se prisjetiti da je 65 dogodi da predstavljaju 97 dogodi da predstavljaju mala slova.
I tako je taj jednostavan program ovdje ASCII je uzimanje prednost od te činjenice -
da svijet zna da kapital je 65 - a to je samo ispis mapiranje.
>> Dakle, prije nego što smo zaroniti u ovom kodeksu, dopustite mi da umjesto otvoriti prozor terminala.
Dopustite mi ići naprijed i učiniti ASCII, a zatim neka je samo pokrenuti ovu stvar samo pokvariti izlaz.
I to samo čini: stvarno veliki grafikon koji samo govori mi sve različitih kodova
za sve od raznih slova.
Dakle, super jednostavan program, ali nisam imao na hard kod tih 52 linije proizvodnje:
26 velikih slova, 26 malih.
Umjesto toga, ja sam to učinio programatski s nekoliko petlje.
Obavijest što sam učinio ovdje.
Ja ponovljena od ja je 65 dana do 65 + 26 jer sam htio ispisati iz 26 slova
u engleskoj abecedi, ja + + na svakoj iteraciji, a sada primjetiti to opet.
To je ponavljanje našeg prijatelja typecasting
pri čemu se pretvoriti jedan tip podataka u drugu
jer ono što želim učiniti u ovom konkretnom programu?
Želim računati brojčano jer to je kako sam odrastao prebrojavanje - 65, 66, 67, i tako dalje -
ali ja ne želim ispisati samo brojeve.
Želim ispisati pismo nakon čega slijedi broj.
Želim ispisati A: broj, B: broj, ali ja to mogu s istim točnim varijable.
Tako sam isprintati% c kao rezervirano mjesto za nekog lika,
% D kao rezervirano mjesto za znamenku ili broj.
Što onda sam čep u za one dvije rezervirana mjesta?
Prvi put sam plug u znak protuvrijednosti ja, a onda sam isprintati ja sama.
>> Dakle primijetiti previše radi.
Baš kao što ja mogu baciti na plovak na int
kako bi se ići iz stvarnog broja na cijeli broj,
Ovdje mogu otići iz int u char, koji je malo čudno -
ne sasvim map na stvarnom svijetu - ali u računalima
char je samo broj ispod haube,
tako da smo se ikada tako eksplicitno ovdje na računalu, govori,
printf, isprintati ne ja kao 65, ispisati ih kao numeričke protuvrijednosti.
A što se ispostavilo da tehnički ne morate čak ni to.
Što sam radila maloprije izrijekom lijevanje
određivanjem što tip podataka Želim otići iz te.
Ali primijetite da već imam ovaj c rezerviranog%
i ovaj drugi% c rezervirano ovdje.
Iako to nije int, računalo shvaća da char,
to je samo int ispod haube.
>> Dakle, ako sam zapravo rekompiliranje to i repriza ASCII programa,
primijetiti da još uvijek samo radi jer računalo shvaća da je ta prepiska.
Sada, to je važnije za napraviti eksplicitnu casting u svijetu plovaka za Ints
jer ste zapravo stvaranje izračunatog odluku:
baciti sve iza decimalne točke.
Ovdje je stvarno ništa baciti, jer lik je samo broj,
a niz je samo niz znakova.
Dakle, kada dođe vrijeme za provedbu neke šifriranje ili dešifriranje,
kako to da mi zapravo može prevesti nešto poput ove gluposti u,
Budite sigurni da pijete svoj Ovaltine?
Što ako znamo upravo sada - uzmimo kao pretpostavku - da je ključ,
broj koji smo rotirajući svih tih pismima, je broj 13?
Tako smo otišli iz slovom B sve do Ø na početku rečenice,
Budite sigurni da pijete svoj Ovaltine, jer ako mi je činiti B
i onda sam ići C, D, E, F, G, H, I, J, K, L, M, N, O,
to je razlog zašto šifriranje slovo B postaje O
jer sam samo dodao 13 za njega.
>> Dakle, ako želim dešifrirati ovo, ja zapravo morati uzeti O, a zatim oduzmite 13 od njega.
Ili, iskreno, jer je 26 slova u abecedi, ovo je predivno simetrično,
možemo samo dodati 13, a mi ćemo se vratiti na slovo B.
No, kako idete o provedbi ovako nešto u Cezara
ili stvarno manipulira konce u cjelini?
Ako slovo B je ono broj?
Što je slovo B? Dakle, to je 66, zar ne?
Dakle, ako pismo je 65, a slovo B je 66,
pa 66, a sve što morate učiniti je dodati 13 na njega, i to mi daje 79.
A ako ćemo ići u naš mali varati list, 79 doista maps na O.
>> No, tu je malo kutak slučaju ovdje.
Što je, kažu, slovo Z?
Ako mi 66 + 25 da biste dobili sve do kraja abecede, mi smo na 91.
91 + 13 mi daje 104, i pogodite što?
104 ne jednaka je veliko slovo.
Vratimo se malo varati list ovdje.
Ako sam reprizu ovaj program u aparat, najave da 104, ako sam se vratiti na prozor terminala,
104 je očito mala h.
Dakle, trebamo neku ključnu trik ovdje kako bi bili sigurni da kada ćemo početi na Z
a mi dodajemo 13 na njega ne želimo samo držati kovanje naprijed za većim i većim brojevima.
Što mi stvarno želite učiniti?
Želite zaokrenuti.
>> Tako ispada, kao što ste vidjeli vjerojatno u dijelu sada ili u spec. problema skup sama
shvatio da je ovaj drugi operator u C koji je također znak postotka,
ali dok smo koristili% ovdje navesti rezervirano,
znam da je, posebno za problema setu 2, tu je i nešto ovako:
int x = y% z.
Neka mi samo predstaviti kao vrlo generički oblik ove.
Postotak znači što u programskom jeziku? >> [Student] modulo.
Modulo, što je fancy način govoreći ostatak.
Iako postoji mala razlika s definicijom tamo,
to znači podijeliti y po z, ali ne vrati rezultat te podjele;
umjesto toga, vrati ostatak.
>> Dakle, ako je y zapravo 3 i z je zapravo 2, 3 podijeljeno 2 je 1 s ostatkom od 1,
pa što ne x zapravo jednaki u ovom scenariju? 1.
To je kao jednostavan, low-level ideja.
Potrebno je malo vremena da biste dobili svoj um omotan oko njega
jer to je vjerojatno bila dok budući da čak morali brinuti o ostacima
i zapravo ih koristiti za nešto svrhovito,
ali u ovom slučaju jednostavna činjenica da možete otići iz velikog broja kao 3
na relativno malom broju kao dva i onda zaokrenuti učinkovito
pomoću ostatak na manju vrijednost kao jedan će biti neprocjenjiva trik
da možemo koristiti i za nešto poput Cezara i ove druge stvar Vigenere
Problem je u postavljena dva, ali to će biti ponavljajući trik tijekom semestra.
Ova jednostavna, jednostavna ideja samo uzimanje ostatak u cjelini
će nam omogućiti da zaokrenuti.
I kao što smo počeli igrati s više polja, kao što smo počeli igrati s više memorije sama,
to će postati sve više i više moćan trik.
>> Dakle, sva pitanja onda na ASCII ili predstavljanje žice kao polja?
A mi ćemo ga uzme jedan usjek dalje. Da.
[Nečujno učenik pitanje] >> Dobro pitanje.
Što to znači kada varijabla ima zvjezdicu ispred njega?
Dopustite mi da odgodi odgovoriti da je u svakom detalju,
ali to se odnosi na temu poznate kao pokazivač.
Pointeri imaju veze s memorije, a mi smo zapravo danas
uzimajući prvi korak prema tom razgovoru,
ali za sada, neka mi se pretvarati da zvijezda ne postoji
a mi ćemo i dalje zove žice žice umjesto char *,
koji ste vjerojatno vidjeli prije, a ja ću staviti na zaslonu u samo jednom trenutku kao teaser.
Dakle, mi ćemo se vratiti na to u način više detalja nego mnogi od vas vjerojatno će vam se svidjeti.
Na kraju, ne danas. Da.
>> [Nečujno učenik pitanje]
U kojem kontekstu ne morate dati znak za lik? >> [Student] Aha.
Dakle, po defaultu, ako ne stavite +, samo pozitivni brojevi se pretpostavlja.
Dakle, ako samo napisati broj 1, to je pozitivan jedan.
Ako zaista želite da navedete negaciju vrijednosti,
doslovno morati učiniti -1 na tipkovnici.
No, to vjerojatno nije vaša pitanja. >> [Nečujno učenik odgovor]
>> Dobro pitanje. Ok.
Dakle, to ima veze, pretpostavljam, s nekom vrstom buga ste naletjeli
zato što su pretvaranje cijeli broj do znaka
ali nekako negativnost upleo,
pa lik je upravo došao iz munged nekako.
Dakle, za sada, dopustite mi da pojednostavljuju malo dok smo došli natrag u ovakvom temom.
Za sada, mislim na stvari na taj način - i to je pojednostavljivanje.
No, u svijetu cijeli broj, imate koliko bitova na raspolaganju?
Imate 32 bita.
I dosad smo razgovarali o ukupnom broju cijelih li, dakle, može predstavljati
je oko 4 milijarde dolara u ukupno jer imate 32 bita,
tako da je 2 do 32, tako da je oko 4 milijarde dolara.
No, vidjeli smo tjedan ili dva prije da ne stvarno imati niz brojeva
od 0 na do 4 milijarde dolara.
Raspon umjesto ide od otprilike negativnog 2000000000 na pozitivan 2000000000.
Ali to onda postavlja pitanje, kako ti predstavljaju pojam negativne 2000000000
a kamoli negativna 1?
Za sada, možemo pojednostavljuju i samo reći da ćemo koristiti lijevom malo
od tih 32 bita, a ako je to jedna je negativan broj,
a ako je 0 to je pozitivan broj.
Problem s tom pojednostavljenog prikaza negativnih brojeva
je da, ako su namjerno biti pametan i pokušava pretvoriti od karaktera do broja
ili obratno, ne postoji takva stvar kao negativan lik.
U svijetu ASCII, koji koristi samo 8 bita, sve osam od tih bitova materije,
i lijevom malo ima veze s negativnosti.
I samo da bude jasno, kad kažem lijevom bita,
Podsjetimo da kad smo radili naše malo vezane uz primjere u prvom tjednu
Podsjetimo da mi je nacrtao stvari poput 1001101, nešto poput ovoga.
Kad kažem lijevom malo, samo sam doslovno znači jedan da pišete sve više ulijevo.
Dakle, u svijetu likova ne postoji pojam negativnosti,
tako da lijevom malo zapravo ima veze s ASCII, nema nikakve veze sa negativnosti.
>> Dakle, to zvuči kao - i izvan konteksta teško je odgovoriti točno -
ali nekako, koda je zbunjujuće da lijevom malo što predstavlja negativnu vrijednost
kad je stvarno bio dio karaktera u pitanju.
I opet, ja sam pretjeranog pojednostavljivanja jer računala zapravo nešto malo ljubitelj
nego samo mijenja tu lijevom malo na jedan za negativnim predznakom u odnosu na 0.
Oni umjesto toga, ako ste znatiželjni Googleu, koristiti nešto obično zove dva je komplement,
što je malo sofisticiraniji od pristupa
ali ideja je u konačnici isto.
>> Dakle, u kratko, to je imalo veze sa činjenicom da su masaži broj do znaka
ili obrnuto, ali vaš broj nije bio upoznat s činjenicom
da jedan od tih bitova imala značaj u brojčanom svijetu.
To nije slučaj u svijetu znakova.
Ali, to zvuči kao da fiksna, u kojem slučaju sporno sada. Ostala pitanja.
Ok.
Dakle, do sada, sve programe koje smo pisanim su se ulaz možda od korisnika
u obliku funkcija kao GetInt, GetString,
ili ako ste bili čitanje naprijed u raznim knjigama ili online referencama,
vi sami mogli koristiti funkcije poput scanf koji, iskreno, mi koristimo u CS50 knjižnici.
Ali u tjedan ili dva, mi zapravo ću vam pokazati kako CS50 knjižnica provodi
tako da možemo uzeti one kotače trening off uopce.
>> No, ispostavilo se da je još jedan način da biste dobili informacije od korisnika.
U stvari, mi sami smo bili koriste argumente naredbenog retka
za nekoliko tjedana sada.
Svaki put smo pokrenuti jeka ili smo pokrenuti napraviti,
nismo samo upisali zveka, Enter, nismo upisali napraviti, Enter.
Što smo obično napisana nakon riječi zveka na našem terminalu prozora promptu?
[Student] Naziv datoteke. >> Naziv datoteke, zar ne?
Hello.c ili mario.c ili bilo relevantno ime datoteke je.
I u tom smislu što ste stvarno učinio je da ste utjecali na ponašanje zveka
jer sigurno su ljudi koji su pisali zveka imao pojma da malo ste stari
bio idući u napisati program koji se zove mario.c godina kasnije.
Tako da je morao nekako utjecati na ponašanje tog programa,
i taj program zveka morao biti napisan na takav način da se može prihvatiti ulaz od vas
dodavanjem riječi na brz prije nego što korisnik klikne Enter.
>> Tako ispada da je za neko vrijeme bili smo proglašenja gotovo sve naše programe
za početak ovako - int main (void) - i onda smo otišli naprijed
i počeo pisati naš kod.
A mogli bismo imati neke oštre uključuje na vrhu datoteke,
ali gotovo svi naši programi do sada su počeli s ovim
iako možda ste vidjeli u poglavlju, u knjigama, online reference
da to ne zapravo biti nevažeće.
Drugi legitiman oblik za to da se je int argc, a zatim niz argv [].
Dakle, sada što se to podrazumijeva?
Ispada da argc, što je ljudski konvencija - što bi se moglo nazvati ovu foo,
ali to bi samo biti puno manje jasno čitateljima -
argc samo je argument za funkciju zove glavni koja predstavlja što?
Što argc stajati za one poznato?
>> [Nečujno učenik odgovor] >> Da, broj argumenata ili argument računati.
To je kao jednostavan kao taj.
Koliko argumenti su prošli na ovom programu?
Što to znači?
Ako na naredbenog retka sam pokrenuti nešto ovako - zveka mario.c--
argc kada sam pogodio Upišite se događa da se na vrijednosti, pomalo zbunjujuće, dva.
Tako ispada da je argc je argument računati,
ali zbog povijesnih razloga, ime samog programa uključena je u toj točki.
Dakle argc je dva kad sam napisao jeka mario.c.
Što argv sadržavati?
Prije svega, argv izgleda kao niz, ali nije sasvim
jer kao što je prošle srijede i sve više danas,
ove uglatim zagradama označavaju što? To je niz.
Nema broj u polju, te da bi smisla intuitivno
jer su ljudi koji su pisali zveka godina sigurno nije imao pojma
Koliko riječi ljudi poput nas ne bi upisati na brz prije nego udaranje Enter.
>> Dakle, u ovom slučaju ovdje su proglašeni funkcija Glavni kao uzimanje niz argumenata,
0 ili više argumenata.
Oni ne znaju unaprijed koliko postoje,
tako da je namjerno ne broj unutar tih uglatih zagrada.
No, činjenica da su uglate zagrade su tu govore računalo,
Očekujemo niz.
Argv je samo stenogram notacija za argument vektora.
Vektor je fancy način govoreći niz,
i niz je fancy način govoreći popis ili zbirku.
Dakle, to samo znači da, ako ste napisali glavni ovako
umjesto sviđa kako smo to radili u posljednjih nekoliko tjedana,
vaš program sada ima moć da prihvati argumente naredbenog retka
tako da više ne moraš pisati mario, a zatim pritisnite Enter,
zatim upišite u nizu za koliko blokovi visoka želite piramida se,
zatim pritisnite Enter ponovo.
Mi ni ne treba koristiti GetString više ili GetInt ili GetFloat za taj tvar.
Mi samo možemo očekivati ​​korisniku upišite te riječi na brz sama
baš kao i autori zveka odlučio da će to biti jako neugodno Program
ako se sastaviti svoj kôd prvo upisali zveka, pritisnite Enter,
onda mi je rekao da korisnik, molimo upišite naziv datoteke koju želite prevesti,
onda ćemo upisati mario.c i pritisnite Enter.
Ali to je upravo ono što smo radili za naše korisnike posljednjih nekoliko tjedana.
Mi koristimo GetString i čekamo dok program radi da ih pita za ulaz.
To više ne mora biti slučaj.
>> Dakle, u ovom primjeru ovdje, sada imamo niz argv,
i ovo je previše pojednostavljivanje,
trening naplatci koji će vrlo brzo ispasti.
To je više pravilan način pisanja ovaj alternativni deklaraciju glavni
jer ispada da je ono što smo zadržati poziv string zapravo ima zvijezdu,
Zvjezdica, u svojoj stvarnoj definiciji, ali to samo izgleda komplicirano,
to je zbunjujuće na prvi, tako da smo pojednostaviti tako da samo stvaranje sinonim sorti
u CS50 knjižnici koji mapira char * ovog više user-friendly riječi nizu.
>> Dakle, neka je zapravo pokušati to onda. Dopustite mi ići naprijed i otvoriti gedit ovdje.
Pusti me naprijed i otvoriti argv od jednog.
Ovaj program je očito ispisuje argumente, ali u engleskim terminima,
gledanjem na ovom kodeksu, što to učinite točnije?
Ako sam tip u naredbi a.out foo bar, što dobiva tiskan u mom crno-bijeli prozor?
A.out foo bar, Enter.
Idi naprijed. Da. >> [Nečujno učenik odgovor]
Dobar. Dakle a.out, nova linija, foo, nova linija, bar, nova linija.
Zašto je to? Mi svakako može potvrditi samo trenutak.
To je vrsta mekani liniju koda.
To samo ispisuje novu liniju samo kako bi stvari ljepše na zaslonu.
Ovo je petlja koja Ponavljanje od 0 na do argc,
i to je povećavanjem na svakoj iteraciji + +.
Dakle, to je sada rekao ispisati niz, kao implicira to% s..
Argv [i] je prilično ista ideja iz prethodnog primjera.
Koristili smo pozvati varijablu s., a sada se to zove, samovoljno, argv.
To znači ispisati ith argument da je upisali u naredbeni redak,
i onda nakon toga cijela stvar je učinio, samo za dobru mjeru ispisati još jednu novu liniju.
>> Tako ćemo vidjeti. Dopustite mi otvoriti prozor terminala.
Dopustite mi sastaviti argv od 1, a sada neka mi pokrenuti argv od 1, Enter. Hmm. Ok.
Ajmo pokrenuti foo bar. Zanimljivo. Baz.
A ako ste se ikada zapitali zašto sam pisati ovo,
to je samo i glupa informatika konvencija.
Svijet često treba samo verbalne rezervirana mjesta za riječi.
Dakle, ako želite razgovarati o nekim generičkim nizu,
računalni znanstvenici samo imaju tendenciju da kažu foo kada im je potrebno riječ slučajnim odabirom,
onda oni kažu bar ako je potrebno drugi riječ slučajnim odabirom,
onda oni kažu baz ako im je potrebno trećina riječ, onda oni kažu qux ako im je potrebno četvrtine riječ,
i onda postoji velika vjerska rasprava online kao na ono što dolazi nakon qux,
tako da možete Googleu da shvatiti što druga proizvoljna riječ treba biti.
No, to ne znači da su se uopće,
iako foo bar, ako Google da, da ne imaju smisla,
koja je dio etimologiji ovdje.
>> Dakle, sve to radi onda se ispisuje jedan od tih nizova po liniji.
Dakle, ako sam umjesto toga, međutim, želio da se malo ljubitelj,
Pretpostavljam da nisam htio ispisati svaki niz po liniji;
Htio sam ispisati svaki lik iz svakog niza po liniji.
Kako sam mogao to učiniti umjesto?
Što trebam promijeniti o ovom programu, ako želim ispisati ne svaku riječ
ali želim ispisati svaku riječ slovo po slovo po slovo,
onda sljedeći riječ slovo po slovo po slovo?
Kako ćemo kombinirati ove ideje tako daleko? Da.
[Student]% c. >> Redu. Tako smo negdje treba% c.
Dobro, jer ne želim ispisati cijele nizove, želim ispisati znakove. Što još?
>> [Nečujno učenik odgovor] >> Zanimljivi.
Dakle, trebamo neku vrstu drugoj dimenziji ovdje sada
jer mislim argv kao polje, ali to je niz žice.
No, kao i od, kao, 15 minuta prije, što je niz? To je niz znakova.
Pa stvarno, argv je niz niz znakova,
niz polja znakova.
Tako ispada da možemo koristiti samo više četvornih nosača notacije. Tako ćemo to učiniti.
U vrhu ove petlje na liniji 19, ja ću ponoviti od I do argc,
ali onda ću to učiniti:
za - Ja ne mogu koristiti sada.
Trebam još varijablu jer želim ponoviti više riječi
ali onda i preko slova u riječi
pa sam vrsta ima vertikalnu os i vodoravne osi, svojevrsnom konceptualno.
Dakle, int j dobiva 0, onda želim da to j dok je j manje nego - a ja ću očistiti ovaj gore u malo.
Kako sam ponoviti preko pisama u nizu? Učinili smo to maloprije.
Strlen od argv [i]. Dobar.
I opet, ja sam što malo neučinkovitost ovdje ne stvara n ili što god,
ali mi ćemo se vratiti na to.
>> Dakle, sada j + +. Sada moram alineje dalje ovdje.
Što ja sada želite ispisati na svakoj iteraciji?
[Nečujno učenik odgovor] >> Dakle [i] će mi dati riječ.
[I] [j], vrsta poput matrice.
Oni od vas s matematikom-y podrijetla,
mi smo vrsta indeksiranje još dublje u ovoj matrici ili ovaj nizom polja,
ovaj 2-dimenzionalne strukture.
Dakle, sada ćemo vidjeti što se ovdje događa. Dopustite mi da otvori svoj veći prozor terminala.
Dopustite mi ponoviti da od argv od jednog.
I ja sam zeznuo ovdje, što je dobra pouka, jer sam previše zaboravio da to učinite.
Implicitno proglašenja C Library funkciju 'strlen' tipa 'nepotpisani -
Ja uopće ne znam što ostatak tog sredstva, ali vidio sam to i prije,
implicitno proglašenja.
Kad vidimo tu pogrešku, što to obično znači?
>> [Nečujno učenik odgovor] >> Zaboravio sam knjižnicu do vrha. Ali čekaj malo.
Obično sam zeznuo jer sam zaboravio CS50 knjižnicu, ali da je tamo.
Obično sam zeznuo jer sam zaboravila standardni I / O.
A iskreno, ne morate čak ni to. Mi ne koristite GetString danas.
Dakle, ono što sam ja nedostaje?
Tu je još jedan knjižnica koja sada trebamo koristiti povremeno zove string.h,
i to je samo još jedan knjižnica koja ima više funkcija koje nisu u standardnoj I / O.
>> Dakle, vratimo se na moje veliko prozor terminala.
Ok. Sada, kvragu, valjda sam bio u krivu. Sam bio koristeći CS50 knjižnicu.
Tako možemo popraviti u bilo dva načina.
Možemo uzeti kotače trening off upravo sada i upravo to učiniti,
ili neka je vrsta zadržati taj pojednostavljenje samo za sada, zalijepite ovaj u leđa,
riješiti taj problem, a sada ide natrag u terminal prozoru.
Dakle, da bude jasno, u CS50 knjižnica nije samo funkcija,
to je također ključna niz, što je razlog zašto to pogreška se upravo dogodilo.
>> Dakle, ovdje mi ići. Sredio sam obje knjižnice pitanja. Upišite. Dobar.
Argv od 1, foo bar, Enter. Izvrsna.
Tako sada imamo svako slovo svake riječi ispisane jedan po retku,
koji ne čine za vrlo zanimljiv program,
ali obavijest sada imamo sposobnost ne samo Ponavljanje preko riječi
ali i više pojedinačnih slova u riječi, što zvuči jako poznato
čak najjednostavniji aplikacijama kao što su izokretanje slova u nizu kao što je ovaj.
Idemo naprijed i uzeti našu 5-minutni predah ovdje.
A kad se vratimo, bit ćemo početi govoriti o učinkovitosti
s kojima možemo učiniti te stvari bolje.
>> U redu. Mi smo natrag.
Zahvaljujući jednom od naših TFS koji igra puno bananagrams,
mi zapravo imamo hrpu znakova s ​​nama danas ovdje
fizički inkarniran s tim malim plastičnim komada,
i neka mi predlažemo da to prazan bijeli škriljevca ovdje predstavlja RAM u mom računalu -
laptop, desktop, bilo što - i tu izgleda kao puno toga
jer ako ćemo početi cijepanje se ovaj RAM u malim byte veličine komada,
ajmo reći da je samovoljno nešto da veličina i da mutno predstavlja -
tamo idemo, i neka je smanjivanje malo ovdje -
ajmo reći nešto da veličina predstavlja jednu bajt.
Tako smo doista može stati cijela hrpa bajtova ili znakova unutar ove memorije,
kao što sugerira relativne veličine ovdje.
>> Dakle, pretpostavimo da sada cilj je alocirati memoriju za niz.
Kako se to zapravo radi?
U programima smo pisali, obično ste koristili GetString,
ali sada, jasno, tu je ovo drugi kanal preko kojeg možemo dobiti korisničkog unosa u argv
putem naredbenog retka argumente.
No, ono što se stvarno događa ispod haube?
Ispada da mi zovemo - ajmo dođite natrag GetString - funkcijsku GetString
u CS50 knjižnici, korisnik zatraži niza,
korisnik upiše u nekom riječju - ajmo ga nazvati HELLO.
I mi smo bili rekavši za posljednjih nekoliko tjedana da povratak vrijednost GetString
je u stvari niz, kao što je riječ Hello.
>> No, ono što je GetString stvarno radi?
Kao korisnik upiše u ZDRAVO, Enter, GetString je figuring out,
ok, koliko znakova je to? Ovaj je H-E-L-L-O.
Dakle, treba izdvojiti, to treba pitati operativni sustav - Linux u ovom slučaju -
za najmanje pet bajtova za pohranu HELLO.
A što je onda nastavlja raditi nakon što se vrati one 5 bajtova iz operativnog sustava
je nokautirati HELLO natrag na leđa natrag na leđa.
I tako ono što je stvarno vratio iz GetString je komad podataka koji izgleda ovako.
Ali to je malo netočna jer ispada da to nije tako jednostavno
kao samo čuvanje HELLO u memoriji računala
jer pretpostavljam da je moj program koji pišem u C onda zove GetString opet,
i pored riječ korisnik upiše u je BYE, BYE.
Pa, moram stati da riječ BYE negdje u memoriji.
Ja ne mogu izmlatiti HELLO.
Na primjer, ne želim računalo samo za početak prepisati ovako
izvorna riječ, jer ja još uvijek mogu koristiti riječ HELLO u varijablu
negdje drugdje u mom programu.
>> Dakle, B-Y-E ima završiti negdje drugdje u sjećanju.
Ali konvencija obično je da će se sljedeći niz ćete izdvojiti
Vjerojatno, ali ne uvijek, ide završiti na sljedeću dostupnu memoriju lokaciji.
A ako nisam pitao operativni sustav za bilo koju memoriju
od zadnjeg puta sam nazvao GetString, izgledi su riječ BYE
će završiti odmah nakon riječi HELLO u sjećanju.
No, u ovom trenutku možda i može vidjeti gdje potencijalni problem.
Budući da su sljedeći komadi memorije, sljedeći byte da su samo besplatno -
očistiti bijelu listu - u memoriji računala su tik do HELLO,
ona se osjeća kao prvog niza sam pitao za možda iznenada sada promijeniti
jer sam u suštini sam promijenio da HELLOBYE
umjesto nekako demarcing početak bye i kraj HELLO.
>> Tako ispada da je ono što se stvarno događa ispod haube,
koje ste možda u kratkim online referenci ili odjeljak ili knjige
ili uopće ne samo još je da je zapravo namjerna razgraničenja
između riječi u memoriju računala.
A u stvari, u ovom slučaju ovdje, nego samo staviti BYE tik do HELLO,
umjesto toga, računalo stavlja poseban karakter, posebna null karakter, da se tako izrazim,
koji je predstavljen s marker s kosom crticom 0.
Dakle, ne duljimo, podsjetiti da su likovi predstavljeni u ASCII.
ASCII je samo mapiranje između brojeva i slova,
a većina tih pisama početi oko 65 za glavnog A,
ali ispada da sigurno može predstavljati broj 0 kao cijeli ili u binarnom,
i ispada svijet odlučio davno, davno, "Znate što?"
"Idemo rezervat broj 0 kao ne predstavlja nikakve znakove na tipkovnici -
"Nema slova, brojevi, nema ni interpunkcije. 0 je posebna."
"To će biti posebna null karakter, a mi ćemo ga pisati kao \ 0".
Razlika se ako smo samo pisali 0, 0 je lik.
Sjetite se da postoje ASCII kodovi za 0, za jedan, za dva, za tri
jer je lik 0 je različit od broja 0.
A možete vidjeti da ako pogledate natrag iz tjedna 1 kad smo prvi put razgovarali o ASCII,
0 i 1 i 2 i 3 pa sve do devet imali svoje ASCII kodova.
Oni nisu, slučajno, 0 do 9. Oni su vrlo različiti.
Dakle 0 samo znači "Ja sam poseban", a \ 0 znači, doslovno, "Ja nisam 0 karakter."
"Ja sam to posebna vrijednost, null karakter."
Tako sam zapravo treba još jedan od njih jer ja ne mogu napraviti istu grešku dva puta.
>> Dakle, nakon riječi bye mi također ćete trebati još jedan od tih null znakova.
Dopustite mi da zgrabite moje pero ovdje i neka mi brzo izvući drugu \ 0
tako da nakon što sam pitao operativni sustav za dvije žice
preko GetString slijedi drugi poziv na GetString,
to je ono što je zapravo u sjećanju.
Dakle, kad se vratim niz, ja sam stvarno uzimajući natrag da
i kad sam se sljedeći niz, ja sam stvarno uzimajući leđa to.
Dakle, ovo postavlja pitanje, strlen, prije svega, što bi ga vratiti?
Kad sam nazvati strlen na niz s te je bila riječ HELLO da korisnik upisao u,
što si mi očito reći duljina Hello je prije nekoliko minuta?
To je pet, zar ne? H-E-L-L-O. I to je doista kako strlen djela.
To vraća ono što normalan čovjek bi očekivao duljinu niza se.
No, u stvarnosti, koliko je velik niz znakova koji se pohranu halo?
To je zapravo šest.
Dakle, strlen ne spominje tu činjenicu na vas.
Ali ispod haube računalo zaista koristi šest bajtova za pohranu 5-pismo riječ,
i to je istina, bez obzira koliko dugo je riječ.
Uvijek će biti posebna null prestanak lik na kraju niza
da Demarc svoju ukupnu dužinu.
>> Dakle, ako ste sada osoba provedbi strlen 20, 30 godina,
kako idete o provedbi strlen sebe?
Mi uzeti zdravo za gotovo da ne postoji, baš kao što uzimamo zdravo za gotovo da je printf postoji,
ali ako HELLO je riječ u pitanju
i što imam u sjećanju je nešto što izgleda ovako,
ako je to reimplement strlen jer ste bili zamoljeni da
ili zato što, iskreno, ako niste znali strlen postojao -
ste imali roll ovaj jedan na svoju vlastitu - kako si mogao provesti strlen
kada je dobio nešto što izgleda ovako?
Sada znamo da je niz polje, možemo ponoviti preko svake od pojedinih likova
koristite nešto poput - Idemo pokušati to učiniti na letjeti.
>> Pusti me u aparat. Dopustite mi da stvori novu datoteku, strlen.c.
Dopustite mi da ide naprijed i sada ne uključuju stdio.h, tako da imamo pristup printf.
Pusti me učiniti int main (void). Oh. Samo ću to učiniti na moj posjedovati za sada onda. [Nasmijao]
Hvala Vam.
To je ono što ja radim. U redu.
Dakle, prije nego što sam se okrenuo na zaslonu, ja upisali sve to.
A sad ono što ću učiniti je sljedeće:
printf ("Daj mi niz:")
To je samo pahuljasto upute.
Sada neka mi učiniti niz s = GetString.
Već sam morati napraviti promjenu sada.
Ja sam koristeći CS50 knjižnicu odjednom, pa neka mi ići naprijed i upišite u cs50.h.
A sad ajmo to: printf ("Duljina je:% d, strlen [s] -
i nisam učinio još. Što još moram dodati da ovaj program?
>> [Student] string.h. >> String.h.
Dakle, za sada, mi smo koristeći strlen, pa budimo sigurni prevodilac zna gdje je,
tako malo zdrav razum ček.
Ja sam uzimajući niz u skladu osam, au skladu 9 sam ispis njegovu duljinu s% d.
Dakle, idemo naprijed i otvoriti ovaj gore.
Mi smo napraviti strlen - sastavlja ok -
strlen - neka mi povećali - Enter, H-E-L-L-O, Enter. Duljina je pet.
>> Ok, tako strlen čini se da rade, ali svijet je znao da.
Dakle, ajmo sada provesti strlen sebe kako slijedi.
Dopustite mi iskoristiti ovu knjižnicu daleko.
Mi više ne imati pristup string.h jer nisam ni znao da postoji.
Ali to je u redu, jer ja mogu provesti strlen sebe
i to se zove niz ulaz,
i sad moram shvatiti duljinu tog niza.
Pa kako mogu to učiniti?
Što ako mi je činiti - neka se vidi kako to učiniti - Što želite učiniti?
>> [Nečujno učenik odgovor] >> Ok.
Dakle, možemo to učiniti u hrpa načina. Dopustite mi da pokušam uzeti ovaj pristup.
Dopustite mi dati sebi int varijablu ja, pa sam počinje na 0.
I dopustite mi da kažem ovo: dok je ulaz [i] nije jednako onome što? \ 0.
Tako ispada, kao i kod slučaja sa svim znakovi kad ih pisali doslovno u programu,
morate koristiti jednostruke navodnike, a ne navodnicima.
Dakle, ako sam pisali pismo je, ja bih to učiniti, slovo B, ja bih to učiniti.
To, s druge strane, biti string, a ne pojedinac lik.
>> Dakle, želim \ 0 doslovno. Što želim učiniti u ovoj petlji?
Zapravo, trebam još varijablu, tako int duljina dobiva 0.
Čak i ako nisu bili sigurni zašto smo počeli način na koji smo radili,
sada da idemo dolje ove ceste, što želim raditi na liniji 9?
duljina + + i onda ovdje dolje na liniji 10, povratak duljine.
Pa kako se strlen provodi?
To je zapravo provodi vjerojatno ovako.
Možda osoba koristi za petlje, možda učiniti dok petlja - tko zna?
Mi smo stvarno bih pogledati ispod haube na stvarni izvornog koda
u nekoj datoteci naziva string.c vjerojatno.
>> No, ovdje ćemo razmišljati o tome što radim.
Ja sam deklariranje varijable sam nazvao, postavljanje je jednaka 0.
I onda sam izjavljujući drugu varijablu nazvanu duljinu, postavljajući ga jednaka 0.
Tada sam rekao, dok ith lik u ulazu nije jednaka posebnim null karaktera, \ 0,
povećajte duljinu.
Ali čim ith lik je ovaj poseban karakter, ono što se događa na petlji?
To kratki spojevi. Ona zaustavlja, što znači da smo onda odmah vratiti duljinu.
>> Dakle, ako nisam zabrljati, idemo naprijed i natrag na moj prozor terminala.
Dopustite mi da rekompiliranje. I doista sam zeznuo.
Nekompatibilni redeklariranje knjižnica funkcije strlen.
Tako sam bio težak da biste dobili previše pametan za moje vlastito dobro ovdje.
Prevodilac zapravo zna da je funkcija zove strlen
iako nismo uključeni u knjižnicu. To je u redu. God.
Mi smo samo ćemo surađivati ​​onda. Ajmo preimenovati ovu duljinu.
Dopustite mi promijeniti iskoristiti za duljinu ovdje, a to će učiniti zveka sretniji.
Kao na stranu, jer neke od tih funkcija su tako prokleto zajedničko -
strlen, prinf - oni zapravo imaju neku vrstu posebnog statusa.
I tako jek samo zna malo nešto posebno o njima.
To nije uvijek slučaj s većinom funkcija, tako da je razlog zašto smo se vikao na.
>> Dopustite mi da pokušam ponovno. Srećom, to je radio to vrijeme.
Pa sada neka mi pokrenuti svoju strlen program.
Daj mi niz: H-E-L-L-O, Enter. I ja sam zeznuo.
Zašto? >> [Nečujno učenik odgovor] >> Točno.
Dakle, imam ja ovdje jako lijepo izgleda beskonačnu petlju
jer iako sam povećavanjem duljine na svakoj iteraciji
što sam ja očito ne radiš? Nisam ja povećavanjem. Ok. Jednostavno popraviti. Da?
Ok. No Sada bismo bježe od neke druge zajedničke greškom gdje trebam nosače.
A iskreno, ovaj broj počinje izgledati ružno,
pa ćemo uzeti nož na čišćenje to se u ovom trenutku.
Ali sada sam povećavanjem i duljinu i ja.
Iskreno, ja već vidim priliku za poboljšanje ovdje, ali mi ćemo se vratiti na to.
>> Pa sada neka samo pazite da smo barem napredak.
To se dogodilo na neki od vas, i ja sam zanemario spomenuti to unaprijed.
Kada nemate nesreću scenariju kao što je ovaj, kako ste riješili taj
kratko ponovno aparata ili računala ili zatvaranje prozora?
To je zapravo jednostavan.
Kontrola C će poslati ovaj mali mrkva simbol C, te da samo prestane većinu programa.
Ako imate stvarno loš beskonačnu petlju koja ispisuje stvari beskonačno mnogo puta,
ponekad možda ćete morati pogoditi kontrolu C tisuću puta da bi ga zapravo ga čuti.
Dakle, samo shvatiti sada, jer ja ne ispisuje ništa, koji je bio vrlo jednostavan.
I tehnički, jednom je dovoljno, ali ja dobiti nestrpljivi i ja obično pogodio ga da mnogo puta.
>> Dakle strlen. Daj mi niz: HELLO. Je li će raditi ovaj put?
Ok. Druga uobičajena pogreška. Jeste da rekompiliranje.
To je bilo namjerno, da je jedan. U redu.
Dakle strlen, H-E-L-L-O, Enter. Izvrsna.
Tako sada imamo strlen na pet.
Dakle, doslovno smo reimplemented taj kotač.
Pa sada neka počiste ovo gore, jer to ne bi me impresionirao
s dizajnom mom kodu.
Što možemo jasno eliminirati u ovom programu za čišćenje ovo gore?
[Nečujno učenik odgovor] >> Da. Doslovno, mi smo liječenju ja i dužinu identično.
Pa zašto ne bismo dobili pametan i reći dok dužina?
Umjesto toga, neka je samo nazvati duljina za početak, to inicijalizirati na 0
jer po defaultu niz nema duljinu dok smo odgonetnuti što je to.
>> Sada smo to učinili, a sada je to prilično elegantan programa.
Jedna varijabla. Ja ga očistiti, to stroži.
Dakle, sad idemo nazad na moj prozor terminala. Idemo naprijed i pokrenuti ovo.
Napravite strlen. Izgleda dobro. Trčanje strlen opet, Enter.
Daj mi niz: HELLO, Enter. I čini se da radi kao 5.
Sada, da bude jasno, da nisam napisao, na primjer, HELLO u jednom nizu
i onda BYE u drugu, sigurno može imati više riječi.
Ako izraz zapravo sam htjela upisati nije ZDRAVO, ali, na primjer,
Hello World, obavijest da je ono što mi ne bi je ova situacija ovdje, zar ne?
To bi značilo da je to dvoje žice.
Vi svakako može imati znakove razmaknicu, pa ako mi zapravo upisali u dužem frazu
kao Hello World, što smo stvarno imati u memoriji
izgleda malo nešto takvo postoji.
>> U redu. Sva pitanja onda o zastupljenosti ovdje žice?
No? U redu.
Zato sam rekao ranije da zovete strlen i opet namjerno kao da
vjerojatno nije najbolja ideja jer si idući u biti događaj puno rada
opet i opet i opet.
Doista, kakav posao je potrebno za odgonetanje duljinu niza, očito?
Morate početi na početku i onda gledaj, gledaj, gledaj, gledaj, gledaj
dok se konačno vidjeti taj poseban karakter, na kojem trenutku, ah, sad znam duljinu.
Dakle ranije, kada smo imali strlen se zove opet i opet i opet,
Zato sam predložio da je glupo, jer opet, da niz izgleda kao da.
To se neće promijeniti svaki put kada iteraciju kroz neku petlju,
tako radite nepotreban posao.
U isto vrijeme, trebali biste znati, što na stranu, da prevodiocima kao jeka ovih dana
su razvili tijekom mnogih godina,
i prevodilac pisci, programeri, su prilično pametna.
I tako ispada da zveka i drugim prevodiocima zapravo može shvatiti da,
ok, da, pisao strlen u vašem stanju,
što tehnički znači da bismo ga nazvati opet i opet i opet.
Ali pametni prevodiocima zapravo mogu optimizirati one vrste loših odluka korisnika
iz svog koda zadovoljštinu stvari.
>> Dakle, samo ne shvaćaju da je ponekad prevodilac je pametniji od nas
i da će vrsta sakriti vlastite pogreške.
No, svakako, kada je u pitanju problematična skupova i slično,
Ne treba razmišljati o tim fundamentalno pogrešnim dizajnerske odluke
potencijalno iz jednostavnog razloga da ćemo biti događaj način više posla
nego što zapravo trebate učiniti. No, kako je mnogo više posla?
U slučaju Hello World, počnimo generalizirati veličinu ovog problema.
Što je duljina problema ili veličine problema
kada je riječ korisnik upisali u je HELLO?
To je očito pet, možda šest. Plus ili minus jedan. God.
To je tako blizu samo ćemo ga zovu pet.
>> Dakle, ono što je veličina problem ovdje kad pokušava shvatiti duljinu HELLO?
To je 1, 2, 3, 4, 5, a možda i 6 za posljednjeg znaka, ali neka je generalizirati da kao n.
Dakle, n, samo varijabla n je ono što računalni znanstvenici obično će koristiti
opisati veličinu problema, a problem pri ruci je koliko dugo je HELLO?
Koliko vremena strlen uzeti?
Potrebno je na red n koraka, gdje je svaki korak znači pogledati karaktera,
Pogledajmo karaktera, pogled na lik.
I mi smo imali ovu raspravu dok leđa, broj operacija nešto traje.
Prvi dan razredu smo svi nespretno stand up,
i onda svi počeli uparivanje off jedni s drugima
kako bi zapravo računati idealno koliko ljudi bili u sobi.
I mi smo također učinili još jedna stvar kojom ako sam to učinio umjesto stare škole način
od tek počinje 1, 2, 3, 4, 5, 6 i tako dalje,
da je previše, veličina tog problema bio je veličine n. Bilo je n ljudi u sobi.
Ali ja sam mogao ubrzati da se, zar ne? Ocjena ime škole sam mogao početi računajući na 2s.
2, 4, 6, 8, 10, 12. I da se osjeća tako puno brže, i doista je.
To je doslovno dvostruko brže, ali opet, ako je još 400 ljudi ušla u ovoj sobi
odjednom, ti algoritmi bi se još 400 ili možda 200 koraka.
>> No, s druge strane, ako smo stvarno dobili pametna, a mi umjesto da imamo sve vas sami računati,
prisjetiti kako je to algoritam radio.
Vi ste svi ustali. Dopustite mi da brzo naprijed na to.
Vi ste svi ustali, što u paru off, onda pola vas sjeo,
pola vas sjeo, pola od vas sjeo,
i na svakoj iteraciji ove petlje od tjedan dana 0, mi prepolovljena problem pri ruci
i otišao do n / 2, a zatim n / 4, a zatim n / 8.
A implikacija toga je da ako još 400 ljudi hodaju u sobu, nije velika stvar,
to će nam trebati jedan rundu, a ne 400 više rundi, a ne 200 više krugova.
I tako se priča mi je rekao, a leđa morao napraviti malo nešto s tim.
Ova crvena crta je ovdje linearno, to je ravno, a to je označeno kao n
jer kao veličina problema raste,
ako je vaš algoritam ili program s kojim ste rješavanje je potrebno n koraka,
možemo ga ucrtati kao pravac u kojem se održava više vremena veći veličine problema.
I twosies pristup, računajući dvije, četiri, šest, osam, još uvijek ravna crta, samo malo bolje.
To traje malo manje vremena, tako da je žuta linija je ispod crvene linije točke za točku.
>> No, čak i bolje je to sveti gral smo zvali logaritamska vrijeme
gdje čak i ako opet smo udvostručiti broj ljudi u sobi,
smo udvostručiti veličinu tog telefonskog imenika od prvog dana klasi,
nije velika stvar, to traje još 1 stranicu suzu, ima jedan više sjeo
kako bi se riješio problem koji je dvostruko veći.
I tako razgovor smo sada dobili početi da se
kako mi zapravo riješiti probleme učinkovito
ako uzmemo u obzir najjednostavniji problema kao što je ovaj?
Pretpostavimo da imamo osam vrata iza kojih su neki brojevi,
a svaki od tih brojeva nije sortiran na bilo koji način,
oni su samo slučajni cijeli, iza tih vrata,
i mi postaviti pitanje kako idete o pronalaženju broj - tko zna -
7 iza tih vrata?
Što bi ti, ljudski, učiniti kako bi se pronašli mi broj 7
ako opet svaka od njih su vrata i vidjeti vrijednost morate otvoriti vrata?
Što bi vaš algoritam se možda?
>> [Nečujno učenik odgovor] >> Dakle, početi s lijeve i otvoriti vrata, otvoriti vrata, otvoriti vrata.
A u najgorem slučaju, koliko dugo će to nam se pronaći broj 7?
I opet, oni nisu sortirani, pa to nije tako lako kao, dobro, ja ću otvoriti vrata 7..
To bi nas mogla odvesti, maksimalno, 8 korake.
U najgorem slučaju, sedam je slučajno na samom kraju linije vrata,
tako da smo mogli imati probati sve n vrata.
Dakle, opet smo ovdje, čini se da su linearni algoritam.
U stvari, mi je to učinio samo par godina.
Jedan od vaših prethodnika bio izazvan s upravo ova
gdje nismo imali digitalnu verziju, umjesto toga imao ploču
s nekim komada papira na njemu.
I ono što sam mislio da ću učiniti je uzeti brzo se osvrnuti na to kako je otišao,
jedan od najboljih, a možda najviše nezgodnih prilika na pozornici
imati demonstraciju ovdje na Sanders.
Imali smo dva reda brojeva.
Mi samo ćemo gledati na ono što se događa ovdje sa Seanom za sam vrh ovih redaka.
Ako nitko nikada volonteri u CS50,
imali smo Sean blagoslov da bi to na kameri,
tako da on zna da su stotine ljudi su gledajući ovaj sada već godinama.
No, Sean učinio nevjerojatan posao - ili on učinio -? Na zapravo pronalaženje nam određeni broj.
>> Dakle, neka je vidjeti kako je riješen ovaj algoritam, tako da ćemo nastaviti ovaj razgovor prije dugo
kako ćemo naći stvari učinkovito.
[Malan na video] ja sam skriven iza tih vrata broj 7,
ali tucked daleko u nekim od tih vrata te su ostali bez negativni brojevi,
i vaš cilj je da razmišljaju o tom gornjem redu brojeva samo kao niz
ili samo slijed papirića s brojevima iza njih,
i vaš cilj je, samo pomoću gornji niz ovdje, naći mi broj sedam.
I mi se onda ide na kritike kako idete o tome radi. >> Redu.
[Malan] Pronađite nam broj 7, molim vas.
[Smijeh]
[Malan] Ne [smijeh]
5, 19, 13, [smijeh]. To nije trik pitanje.
1.
[Smijeh]
U ovom trenutku vaš rezultat nije vrlo dobar, tako da možda i zadržati ide. [Smijeh]
3.
Idi na. Iskreno, ja ne mogu pomoći, ali pitam se što čak i razmišljate o tome. [Smijeh]
Samo gornji red, tako da imaš tri lijevo. Pa me naći sedam.
[Studenti mrmljajući]
[Malan] 17.
[Studenti mrmljajući]
[Malan] 7! [Pljesak]
>> Dakle, u srijedu ćemo zaroniti u to i više sofisticirane algoritme za pronalaženje stvari.
Za sada ćemo vas ostaviti s Sean i vidimo se u srijedu.
[CS50.TV]