[Powered by Google Translate] David J. MALAN: U redu.
Ovo je CS50, a to je kraj tjedna dva.
Ako očekujete da ćete biti gladni oko tog vremena sutra, znam da ćemo
da sazove kao male skupine sutra, četvrtak, 13:15.
Tu je ovaj URL ovdje ako želite RSVP.
Prostor je ograničen, pa molimo oprosti ako oblik je popunio po vremenu
ispunite ovo.
Drugi URL ipak da bi moglo biti od interesa je to.
>> Dakle, u samo oko mjesec dana, tečaj će biti dostupan
sve više šire putem EDX, preko kojeg ljudi na internetu će biti
moći pratiti zajedno, sudjelovati u tijeku prilično aktivno, u stvari.
Oni će se koristiti CS50 CS50 Appliance i raspraviti i najveći dio
razni softverski alati koji smo već koriste ovaj semestar.
A jedna od inicijativa bismo željeli da se na kao eksperiment ove godine
je da se vidi koliko sadržaj možemo prevesti u drugi govori i
pisani jezici.
Dakle, ako ste možda imaju interes za sudjelovanje u ovom projektu, pri čemu
ćemo pružiti engleskog transkripte i titlova za tečaj je
predavanja i kratke hlače i seminari i profili i slično -
ako tečno ili pisati tečno neki drugi jezik, što bi
volim vas sudjelovati u ovom projektu, u kojem ste se na jedan ili više od
videa ih prevodio na jezik znate prilično dobro.
Da vam dati osjećaj sučelja, tu je ova web-based korisničko sučelje
da ćemo se pomoću koje će stvoriti bitno je UI ovako.
To je mene učeći neke Halloween prije.
I na desnoj strani tamo u crnoj pored tih vremenskih pečata,
ćete vidjeti razne stvari koje su došle iz usta taj dan.
A onda ispod nje, vi ćete biti u mogućnosti prevesti na neki drugi jezik.
Točno ono što je mapiranje između, u ovom slučaju, engleski
i, recimo, španjolski.
Dakle, to je zapravo vrlo user-friendly alat.
Možete premotati i brzo naprijed vrlo lako s prečaca na tipkovnici.
Dakle, ako želite sudjelovati u ovom eksperimentu i imati svoje riječi
vidjeli i pročitali potencijalno tisuća ljudi vani, nemojte se osjećati
besplatno sudjelovati.
>> Sada jedna riječ o mačića od ponedjeljka, da smo poslali pretjerano
zastrašujuće poruke.
Da li shvatiti da kao radno vrijeme predložiti i kao dijelovi sugeriraju,
Dizajn je naravno jako puno da su učenici surađuju i
govori da rade kroz problema setovima i problemima zajedno.
I doista linija samo svodi na, opet, rad u konačnici
treba dostaviti trebao biti vaš vlastiti.
I tako je, sasvim iskreno - u uredovno vrijeme, to je sasvim normalno -
to totalno se očekuje, čak i - da se razgovor s nekim
prijatelji pored vas.
Ako on ili ona se bori s nekim temu, a ti si kao, oh, dobro neka
mi vam dati uvid u neke linije koda koji sam napisao.
To je u redu.
To se događa.
I to je jako pogodno, mislim, s procesom učenja.
Gdje je linija, opet, dobiva prešao je kada je glava vrsta naginje nad
ovdje daleko previše sekundi ili minuta za koji stvarno imaju samo
bio deblokadi prilika za svog prijatelja.
I svakako, kada se stvari mijenjaju putem e-maila i ispuštanje i
kao, tamo je linija.
Dakle, svim sredstvima, osjećaju ugodno i osjećaju ohrabreni za razgovor s prijateljima
i kolege o psets i još mnogo toga.
I samo shvatiti da ono što u konačnici predati stvarno treba biti
proizvod vaše stvaranje, a ne netko drugi.
>> Dakle, u istoj venu cuddly stvorenja, možda
znam ovog momka ovdje.
Dakle, ovo je horrifically sladunjav film iz godina.
Svatko ovdje vidio Spaceballs?
U redu.
Dakle, dobar broj ovdje.
Dakle, ovo je naš predivno akademski način uvođenja danas u konačnici
pojam kriptografije.
I tako jedan od domena specifičnih problema za pset 2, koji će doći
iz kasnog sutra navečer, je zaroniti u svijet kriptografije, koji
je umjetnost šifriranjem ili remećenje informacije.
I to u konačnici odnosi na svijet sigurnosti.
>> Sada sigurnosti za većinu nas dolazi u obliku prilično svjetovnim mehanizama.
Svi od nas imaju korisnička imena i lozinke.
A svi mi imamo jako loš korisnička imena i lozinke, najvjerojatnije.
Ako je vaša lozinka je isti na više stranica, to vjerojatno nije
najbolja ideja, kao što ćemo raspraviti prema semestra kraja.
Ako je vaša lozinka je napisan na sticky note - nije šala - na vašem
monitor, da previše ne nužno i najbolji dizajn, ali vrlo česta
fenomen.
A ako ne koristite kriptografiju za šifriranje vaše lozinke, oni su
posebno osjetljivi.
Dakle, ako mislite da ste se super pametan vlasništvo skriveni Word
dokumentirati negdje na tvrdom disku koji ima sve svoje lozinke, ali
to je u mapu da nitko ne ide gledati u, da previše nije vrlo
siguran mehanizam.
I tako ono što pset 2 će uvesti je ova umjetnost kriptografije i
remećenje informacije, tako da su stvari poput lozinki
sve više siguran.
Dakle, kao motivirati ovu vrlo stvarna problem s vrlo ne-stvarnom svijetu
scenarij, dopustite mi da vam predstaviti jedan od naših omiljenih spotova ovdje od toga
film, Spaceballs.
>> [Video reprodukciju]
-Kaciga, što đavo, što se događa?
Što radiš s mojom kćeri?
-Dopustite mi da vam predstavim briljantni mladi plastični kirurg, dr. Philip
Schlotkin, najveći nos posao čovjek u cijeli
svemir i Beverly Hills.
-Vaše Veličanstvo.
-Nos posao?
Ne razumijem.
Ona je već imao operaciju nosa.
To je slatko 16 sadašnjosti.
-Ne, to nije ono što mislite.
To je puno, puno gora.
Ako ne daj mi kombinaciju zračnog štita, dr. Schlotkin će
dati svoju kćer natrag svog starog nos.
-Ne!
Odakle vam to?
-U redu.
Reći ću.
-Ne, tata, br.
Vi ne morate.
-Nema pravo, dragi moj.
Ja ću propustiti svoj novi nos.
Ali neću reći im kombinaciju bez obzira.
-Vrlo dobro.
Dr. Schlotkin, učiniti vaš najgori.
-Moj zadovoljstvo.
-Ne!
Čekaj, čekaj.
Reći ću.
-Znao sam da će to raditi.
U redu, daj mi.
-Kombinacija je jedna.
-Jedan.
-Dvije.
-Tri
-Tri.
-Četiri.
-Pet
-Pet.
-Tako je kombinacija je jedan, dva, tri, četiri, pet.
To je najgluplji kombinacija koju sam ikad čuo u životu.
To je vrsta stvar bi idiot imati na svojoj prtljazi.
-Hvala, vaše veličanstvo.
-Što si učinio?
-Ja isključen zid.
-Ne, nisi.
Vi isključen cijeli film.
-Mora da sam pritisnuo pogrešnu tipku.
-Pa, stavite ga na leđa.
Stavite film na leđa.
-Da, gospodine.
Da, gospodine.
-Idemo, Erna.
Dođite, Gretchen.
Naravno da znam ja još uvijek ćete morati vam naplatiti za to.
-Pa, nije to rade?
Gdje je vrata?
-To je radio, gospodine.
Imamo kombinaciju.
-Izvrsno.
Sada možemo uzeti svaki zadnji dašak svježeg zraka iz planeta Druidia.
Što je kombinacija?
-Jedan, dva, tri, četiri, pet.
-Jedan, dva, tri, četiri, pet?
-Da.
-To je nevjerojatno.
Imam istu kombinaciju na svoju prtljagu.
Pripremite SpaceBall jedan za hitnu odlaska.
-Da, gospodine.
-I promijeniti kombinaciju svoju prtljagu.
-Ow!
[END video reprodukciju]
>> David J. MALAN: nevjerojatna film sada treba sve vidjeti.
Dakle, u kontekstu ovdje je da s nesigurnim podacima dolazi priliku
to šifriranje i da ga otimati.
I tako to, na primjer, je primjer šifrirane poruke.
To zapravo govori nešto na engleskom jeziku.
Ali to očito nije u potpunosti jasno.
I mi ćemo doći puni krug danas zafrkavati, osim što je to tajna
Poruka je ovdje.
No, u stvarnom svijetu računala, stvari uopće ne izgledaju kao da bi mogli
biti engleski izrazi.
Na primjer, to je ono što bi mogli naći na standardnom Linux ili Mac ili
Unix računalo u datoteku koja je nekad davno nazvao lozinka datoteku.
Danas, to je bio premješten na drugim mjestima.
No, ako pogledate na pravom mjestu na sustavu, vidjet ćete ne samo vaš
korisničko ime ili da od drugih ljudi u sustavu, ali vidjet ćete
kodiran verzija njihovog lozinkom.
Doista, riječ kripta postoji sugerira da sljedeća stvar je šifriran.
I ova serija naizgled slučajnih slova i znakova i brojeva i
slično se može dešifrirati samo općenito znajući neke tajnu -
tajna riječ, tajni broj.
I tako je doista, umjetnost kriptografije konačnici svodi na povjerenje nekih
sortiranje i znajući nešto što netko drugi ne.
Mi ćemo istražiti to malo detaljnije i danas u pset doći.
>> A sada riječ o pass / fail.
Dakle, posebno, kao što neki od vas su zaronili u pset 1, aparata, a
vrlo novi svijet za sebe, shvatio da frustracije i
zbunjenost i samo tehničke teškoće se očekuje.
Pogotovo s prvim pset, gdje postoji samo toliko nova, samo dobivanje
upoznati s ls i cd i svih tih kompliciranih naredbi u novom okruženju.
I to je odvojen od stvarnog materijala i sama programiranje.
Dakle shvatiti, također, da postoje sigurno radno vrijeme koje postoje kao
potpornu strukturu.
Sekcije početi ovaj dolazak nedjelja.
Ali što je najvažnije, ako ste osjećaj samo da to nije
svijet za vas, shvatite da je to zapravo samo ne uzeti vremena.
A da nije za ovu priliku godina za mene uzimanje klase
proći / ne, iskreno, ja nikad ne bi ni kročiti u učionici.
I možete promijeniti ovo gore dok, recimo, peti ponedjeljak tečaja.
Dakle, ako ste na rubu sada, shvatite da umjesto glave u neki drugi
Vode uopce, svakako ne smatram samo mijenja proći / ne.
Opet, ne postoji stvarno ta kultura ovdje na Harvardu uzimanja stvari
proći / uspjeti jer svi stvarno želi postići ili overachieve.
Ali iskreno, ovo je prekrasan način pokušava nešto da se ne bi mogli
biti upoznat s tobom.
A vi ćete završiti radi u većini slučajeva sasvim fino, možda
puno na svoj iznenađenje.
I u više konkretnim uvjetima, što mislim proći / ne općenito ne,
posebno kao što ste možda doživjeli s pset 0, ako ste stavili
u 10 sati, 15 sati, 25 sati u nekom pset - i vi ste samo lupanje
glavu uza zid,
i to je sve super kasno u noć,
ali ste uzeli pset kao 90% na putu,
znate da jednostavno ne mogu shvatiti jednu stvar -
proći / ne stvarno potrebno rub off klase kao što je ovaj, gdje možete sortirati
od sretno reći ok, znam da to nije savršen.
Ali ja sam radila moje dupe off na ovo.
Prilično sam zadovoljan gdje je završio.
I da će ispuniti očekivanja za pass / fail.
Dakle, ne to na umu.
>> U redu.
Dakle, one od vas koji su se borili za korištenje Harvard University Wi-Fi znati
da postoji CS50 SSID, Wi-Fi veza plutajući oko koje
možda imati više sreće za.
To je malo ironično da lozinka za to - ako želite probati
spajanja na ovo za boljim brzinama i javite nam ako to nije bolje -
jedan, dva, tri, četiri, pet, sve do osam, jer je osam
sigurniji od pet.
Dakle, ako vam je potrebna Wi-Fi lozinku, povezati CS50 bežično ovdje.
Jedan, dva, tri, četiri, pet, šest, sedam, osam.
A post na CS50 Raspravljajte ako još uvijek imate problema s povezivanjem s prekidima,
a mi ćemo pustiti ovlasti koje se znaju za taj prostor.
>> U redu.
Tako brzo zadirkivač, pogotovo za one od vas koji su ventilator dječaci i djevojčice
od svih stvari Apple.
Ono što sam iskopao od prije nekoliko godina vratio je ovu sliku ovdje, ilock.c, samo da
vrsta napraviti konkretniji i složeniji neke od više osnovnih C
programi smo pisali.
Tako sam otvorio ovu sliku, ilock.c.
To je dostupan na stranici predavanja za danas.
Na lijevoj strani, vidjet ćete dugo popis funkcija.
Dakle, čovjek koji je napisao ovo napisao gore puno funkcija,
više nego samo glavni.
On se koristi cijela hrpa knjižnicama ovdje.
A ako ćemo početi listanje, što je to zapravo je vrlo
prvi je, vjerujem, ispucati za originalni iPhone.
Kada ste htjeli jailbreak izvorni iPhone, što znači untether
to iz AT & T i zapravo instalirati poseban softver na njega i raditi stvari
da Apple ne želi da ljudi učiniti -
dobro, netko uzeo vremena za shvatiti točno kako bi mogli eksploatirati
softver nedostatke, pogreške, kukci, u Appleovim softverom.
I tako je rođen ilock.c.
To ako ga sastavio na računalu i instalirati na iPhone toj
bio povezan s računalom putem, recimo, USB kabel, to će vam dati
upravne ili korijen privilegije na vašem iPhone i neka vam je činiti prilično
što god želite.
>> I tako je bilo to fascinantno mačka i miš igra između Apple i
Ostatak svijeta posebno jer su se, poput mnogih tvrtki, pokušati zaključati
njihove stvari dolje, tako da možete učiniti samo s njim što namjeravaju.
No, zahvaljujući ljudima kao što je ovaj i njihovo razumijevanje niske razine
pojedinosti i, u ovom slučaju, C programiranje i puno poznatih konstrukata
da smo počeli igrati sa, vi ste u mogućnosti da se stvarno utjecati
hardver na način što vidite stane, a ne nužno neki korporativni entitet.
Tako na primjer, nemam pojma što se sve ovo radi.
Ali GetVersion zvuči prilično jednostavan.
I to izgleda ovako je funkcija da je ta osoba napisala.
Uzmi neku cjelobrojnu kao argument, ne vraća ništa, ali
Čini se da petlja s for petlje ovdje i ako stanje, ako je uvjet,
razbiti, i nekako se odnosi na brojeve verzija.
Ako mi se pomaknite prema dolje -
iako mnoge od tih ključnih riječi će biti novi, a tu je
cijeli niz funkcija u ovdje nikada nismo vidjeli i nikada ne može vidjeti preko
tijek nastave -
Na kraju dana, slijedi ista pravila i logike da smo bili
igrati s tako daleko.
Dakle, ovo je daleko prestara za ispucati svoj iPhone 3S 4ke ili će uskoro 5s, ovih dana,
ali znam da je to sve jako puno izvedeni iz ovog svijeta da smo
zaronio.
>> Tako ćemo pogledati malo više jednostavnom primjeru.
Ovo je jedna, samo da bi se grijao s nekom sintaksom i neki drugi podaci
Vrsta da smo razgovarali o, ali nisu stvarno vidio u C. Dakle, ovo je
file zove positive1.c.
I po komentarima na vrhu, to samo zahtijeva da korisnik pružiti
pozitivan broj.
Dakle, to je primjer ne-while petlje, koja je lijepo za korisnički interaktivne
programi gdje vam je potrebno da korisniku reći nešto učiniti.
A ako oni ne surađuju, vi vikati na njih ili odbiti njihov doprinos.
Slučaj u točki, ja ću to učiniti linije 19 do 24, tako dugo dok korisnik ima
nije mi dao pozitivan broj.
Sada je ovaj detalj ovdje na liniji 18, zašto sam proglasiti n iznad cijela ova
petlje konstrukt za razliku tik do linije 22, gdje sam
zapravo stalo da se n?
Da?
[Nečujan]
>> David J. MALAN: Da, tako da je ovo pitanje opsega.
I u laik pojam, što se odnose na opseg?
Da?
[Nečujan]
David J. MALAN: Možete li govoriti malo glasnije?
ZVUČNIK 1: Gdje možete pristupiti određenu varijablu.
David J. MALAN: Savršeno.
Gdje možete pristupiti određenu varijablu.
I općenito, pravilo dosad je bio da je opseg nekih
varijabla je definirana posljednjim vitičastih zagrada koje ste vidjeli.
I tako, u ovom slučaju, ako sam napravio pogrešku tvrdeći n na liniji 22,
da linija će raditi.
Ja bih dobiti int, i ja bih ga stavio u tu varijablu n u skladu 22.
No, što linija koda sada bi imao pojma što pričam?
Dakle, 25, i to ispada 24, kao dobro, jer u ovom slučaju, to je izvan
od vitičastih zagrada.
Dakle, samo malo smetnja, ali vrlo lako riješiti jednostavno izjavljujući
varijabla izvan funkcije sama.
>> Sada ćemo vidjeti kasnije danas, možete ići korak dalje.
A čak bi mogao dobiti malo lijen -
a to je da se ne preporuča se, općenito -
ali čak mogao dobiti lijen i staviti varijablu na globalnoj razini, da se tako izrazim, ne
unutar funkcije, a ne unutar petlje, ali u spisu sama, izvan
svih funkcija ste napisali, kao što sam učinio ovdje na liniji 15.
No, to se općenito frowned.
Ali shvatite ovo je rješenje ponekad do drugih problema, kao što ćemo
na kraju vidjeti.
Dakle, za sada, mi ćemo ga ostaviti kao što je ovaj.
Ali neka je vidjeti ako mi može prepisati to samo za početak izražavanje sebe
malo drugačije.
>> Dakle, ovaj program, samo da bude jasno, je positive1.
Dopustite mi da ide naprijed i ovdje u mom terminal prozoru napraviti positive1, Enter.
Sastavlja, ok.
Idem pokrenuti positive1, pritisnite Enter.
Zahtijevam da li mi dati pozitivan cijeli broj.
Reći ću -1.
To nije uspjelo.
0, 99, koji izgleda kao da rade.
Možda ne najrigoroznije testiranje.
No, barem je lijepo razum ček da smo na pravom putu.
Pa sada neka mi ići naprijed i otvoriti verziju dva za to.
I ono što je drugačije već?
Ona provodi istu stvar.
No, ono što je iskakanja kao jasno različite ovom trenutku?
Da, tako to bool u zelenom.
Gedit je istaknuo u zelenom ovu ključnu poznat kao bool,
koja je vrsta podataka.
To ne dolazi ugrađen u svim verzijama C. Trebate uključiti
specifična knjižnica.
U našem slučaju, ja uključen CS50 knjižnicu, tako da smo
imati pristup bool.
No, u skladu 18, mi se čini da imaju Boolean vrijednost ovdje zove zahvalni.
Tako sam mogao nazvati ovaj ništa.
Ali ja to nazvao zahvalni samo vrsta prenijeti neke semantičke značenje.
Dakle, u početku na liniji 18, ja sam očito nije zahvalan jer
Boolean vrijednost zahvalni inicijaliziran na false u skladu 18.
A onda čini ono što sam učinio ovdje u linijama 21 do 23 je upravo sam
vrsta prepisivati ​​moj logiku.
Dakle, ne funkcionalno drukčiji.
No, u skladu 22 sada, mogu provjeriti ako int korisnik pružio je veći od
0, onda sam jednostavno promijenite vrijednost zahvalni istina.
A zašto mi to učiniti?
Budući da je u skladu 25, očito, idem provjeriti stanje.
Učinite ovu petlju dok zahvalna je lažna.
>> Dakle, ja predlažem ovo kao alternativa verziji jedan, jer to je najmanje
malo više intuitivno, možda.
To je malo više utemeljena na engleskom jeziku.
Dakle, učiniti sljedeće dok niste zahvalni ili dok zahvalna je lažna.
I ovaj put, previše, ja očito ne zanima da zapamtite ono što korisnik unese
u zbog najave nema varijabla n.
Pa zapravo, ja -
malo bijelog laž postoji.
Funkcionalno, program je malo drugačija nakon što smo dobili na dnu
to jer nisam sjećanja na ono što je n.
Ali ja sam htjela pokazati ovdje da, iako smo vidjeli i GetInt
GetString se koristi i na desnoj strani znakom jednakosti tako daleko, tako da
Prisjetimo se vrijednost, tehnički, to nije nužno potrebno.
Ako iz bilo kojeg razloga jednostavno ne briga za spremanje vrijednosti, samo želite
provjeriti vrijednost, primijetiti da možemo jednostavno napisati ovo kao GetInt otvoren
zagr, blizu zagr.
To je funkcija će vratiti vrijednost, kao da smo bili govori.
To će vam vratiti int.
I tako, ako ste mentalno mislim da se to dogodi, kad sam upisati 99, GetInt
vraća broj 99.
I tako konceptualno, to je kao da mi je kod su zapravo to.
Dakle, ako 99 je doista veći od 0, tada zahvalni postaje istina.
Zatim linija 25 shvaća ooh, mi smo učinili jer sam sada zahvalni.
I u skladu 26, mi jednostavno reći, hvala za pozitivan cijeli broj, bez obzira na to
dogodilo se.
>> Sada ćemo napraviti malu sintaktičkih šećer ovdje, da se tako izrazim.
Hajdemo vidjeti možemo li počistiti ovu liniju 25 sa ovom trećem i posljednjem varijance
u positive3.
Dakle primjetiti jedina razlika sada je ono linija koda?
Da, 25 godina.
I nismo si stvarno vidio ovaj trik samo još.
Ali nismo vidjeli uskličnik na ponedjeljak, što označava što?
Dakle, ne, ili negacija.
Tako se Boolean vrijednost i okrenuti svoju vrijednost.
Istina postaje laž.
Lažna postaje istina.
Dakle, ovo, ja bih predložiti, je čak i malo više od intuitivno način
pisanje koda, jer sam još uvijek inicijalizirati zahvalan lažna.
Ja još uvijek učiniti sljedeće.
Postavio sam zahvalan istina kad dođe vrijeme.
No, sada možete zaista samo prevesti ovaj kod verbalno lijeva na desno,
dok ne zahvalni.
Zbog prasak, ili uskličnik, označava pojam ne, pa dok
nije zahvalna.
>> Pa opet, ne bismo uveli neke nove koncepte po sebi.
Razgovarali smo o logičke natrag kada smo igrali s nule.
Ali shvatite sada možemo samo početi pisati našu kôda
mnogo različitih načina.
Dakle, posebno u pset1, ako ste vrsta bore shvatiti način na
napisati neki program, izgledi su da ste u sreću, jer postoji će biti bilo
broj rješenja koje se mogu dogoditi na.
Na primjer, ovo je samo tri za čak najjednostavniji programa.
U redu.
I sad sjetiti u ponedjeljak, ostavili smo na ovoj bilješci sa povratnih vrijednosti.
Tako je za vrlo prvi put, pisali smo program koji ne samo da imaju glavni,
ona također ima svoju vlastitu prilagođenu funkciju da sam napisao ovdje.
Dakle, u skladu 31 kroz 34, ja sam provela kocke funkciju.
To nije složen.
To je samo puta prije puta, u ovom slučaju.
No, ono što je važno o tome da je uzimam ulaz u obliku i
Sam vraća izlaz u obliku puta puta a.
>> Dakle, sada imam sposobnost, baš kao i ja se s printf sama, nazvati
ova funkcija pozivom na kocke funkciju.
A kocka funkcija uzima neki ulaz.
A kocka funkcija vraća neku izlaz.
I tako s druge strane, printf upravo učinio nešto.
To nisu vratili ništa da mi stalo - iako, kao
stranu, to ne vratiti vrijednost.
Vi samo općenito ga ignorirati.
Printf upravo učinio nešto.
Ona je imala nuspojava ispis na zaslonu.
Za razliku od ovdje, imamo kocke funkciju, koja
zapravo vraća nešto.
>> Dakle, ovo je općenito -
za one upoznati s tim, to je prilično jednostavan ideja.
No, za one manje upoznati s ovom idejom prolazi u ulaza i dobivanje
natrag izlaza, pokušajmo samo nešto super jednostavna.
Je li itko ugodno dolazi na pozornicu nakratko?
Morate biti udoban s kamerom na vas, kao dobro.
Da.
Dobro, što je vaše ime?
KEN: Ken.
David J. MALAN: Ken.
U redu, Ken.
Dođi gore.
Dakle, Ken će biti funkcija sorti ovdje.
I neka je ići naprijed i učiniti.
Idemo malo fancy.
Drago mi je.
Dobrodošli na središnjoj pozornici.
U redu.
Ajmo pogoditi ovaj gumb ovdje.
U redu.
Dakle ovdje imate modernu školsku ploču.
A što sam je glavna funkcija, na primjer.
I nemam iPad u ruci.
Ja stvarno ne sjećam kako - dobro, zapravo, ne mogu reći da.
Ja ne stvarno imati dobar rukopis.
I stoga, želim da nešto ispisati na zaslonu za mene.
>> Dakle, ja sam se glavni program.
I ja ću vam reći da je ovo imati ga pisati u mom piletina nule i
onda prolazi vam ulaz.
Dakle, kao blesav, iako je ova vježba je pojam funkcije i pozivajući
funkcija i vraćanje funkcije zapravo svodi na to.
Ja sam glavni.
Upravo sam napisao printf ("nešto") na zaslonu.
Ja sam trčanje ovaj program.
I čim printf dobiva zove, to traje jedan argument - ili jedan parametar,
ponekad -
između dvostrukih navodnika.
Ovdje je taj argument.
Ja sam ga prolazi na Kena.
Sada je crna kutija napisao neki broj godina koji očito
samo zna kako ispisati stvari na zaslonu.
>> Dakle, izvršavati.
To nije loše.
Dakle, vrlo dobro.
Tako sada Ken je učinio izvršenja.
Da li je potrebno predati mi ništa natrag?
Dakle, nije da smo vidjeli dosad.
Opet, printf zapravo ne vraća broj.
No, mi ćemo zanemariti činjenicu da za sada jer mi nikad ga koristi.
Dakle, to je to za Kena.
I tako sada glavni vraća za izvršenje -
Glavni preuzima kontrolu programa ponovo jer tu liniju koda,
printf, radi izvršenja.
I idemo o našem putu izvršenja bilo druge linije su tu.
>> U redu.
Dakle, sada idemo pokušati malo drugačiji primjer.
I ovaj put sam ovdje, neka prvi jasan zaslon ovdje.
I ovaj put, mi ćemo učiniti cubing funkciju.
No, ovaj put, ja očekujem izlaznu vrijednost.
Dakle, idemo naprijed i to učiniti.
Dakle, sada imam liniju koda koji kaže x = kocka (x).
Tako zapravo let's -
linija koda, podsjetimo, izgleda ovako.
x = kocke (x).
Pa kako će to raditi?
Dakle, idemo naprijed i dati vam bijeli zaslon opet.
I ja ću napisati sada dolje vrijednosti x, što je u ovom trenutku u
Vrijeme se događa da se, recimo, dva, da bi ga jednostavno.
Dakle, ja sam napisao dolje na komad papira vrijednost 2,
što je moja vrijednost x.
Ja ga predati na Kena.
KEN: I ja sam samo napisati odgovor?
David J. MALAN: Da, ajmo samo napisati odgovor.
Ok.
I sad on mora vratiti mi nešto.
Dakle -
savršena.
Lijepo segue.
>> Dakle, sada mi je ruke unatrag vrijednost 8, u ovom slučaju.
A što da radim s njim?
Pa, zapravo, da vidimo.
Get to pravo.
Što ću učiniti s njom?
Sada ću uzeti tu vrijednost i zapravo ga pohraniti u onima
Isti bitova u memoriji.
Ali primijetite, ja sam vrsta bori ovdje.
Ja sam malo zbunjen, jer gdje sam zapravo napisati vrijednost x?
Jer ono što sam upravo učinio je fizički ruka Ken komad papira
da je vrijednost 2, koji je bio x.
I doista, to je upravo ono što se događa.
Tako ispada da kad zoveš funkciju, a da prođe u argumentu
sviđa "Hello World" ili da prođe u argument kao dva, općenito, ti si
prolazi u kopiju tog argumenta.
I tako kao što sam zapisao broj dva ovdje i predao ga Ken, da mora
znači da još uvijek imam kopiju vrijednosti 2 negdje.
Jer doista, sad da sam se vratio vrijednost 8, moram se vratiti u
RAM-a i zapravo napiši 8 gdje sam nekada imao broj dva.
>> Dakle, vizualno zapamtite ovu ideju prolazi u doslovno
Kopija vrijednosti.
Ken svoje, mi pruži natrag nešto - u ovom slučaju,
vrijednost kao 8.
I onda moram nešto učiniti s tom vrijednosti, ako sam
želim ga zadržati.
Dakle, sve to će biti sve previše upoznat prije dugo.
Hvala vam toliko za ovaj demo ovdje, Kena.
U redu.
Vrlo dobro učinio.
Dakle, neka je vidjeti kako se to u konačnici odnosi na neke od funkcija
pozivom da smo radili ovdje.
Pa neka mi ići naprijed i vratiti nas u cubing primjer ovdje.
I primijetiti da ako želimo da se zapravo početi uzimati ovo dalje, idemo
morati biti svjesni činjenice da je broj x koji je se donesenim u
ovdje je drugačije od onoga što se zapravo prenosi u funkciju.
Pa opet, ovo je donio primjerak će postati vrlo
germane u samo trenutak.
>> Tako ćemo pogledati nešto što ne sasvim rade upravo gostiju.
Ja ću ići naprijed i otvoriti trećine lud primjer, koji
je manjkav po prirodi.
I to se zove buggy3, a provodi zamjene funkciju.
Dakle, ovdje imamo glavnu funkciju da je x i y samovoljno pokrenutog na
1 i 2, respektivno.
Mogli bismo koristiti GetInt, ali samo mi treba jednostavan vježbe.
Dakle, teško je kodirana kao jedan i dva.
U linijama 21 i 22, što je očito isprintati X i Y, jedan po retku.
Zatim, na liniji 23, tvrdim ja sam zamjene tih vrijednosti, dot, dot, dot.
Ja očito pozvati funkciju u skladu 24 zove zamjena
koja traje dva argumenta.
To je potpuno čitljiv za funkcije uzeti dva argumenta.
Vidjeli smo printf to već.
Dakle, zamjena očito traje xiy.
I kao što mu ime sugerira, ja se nadam da će to
zamijeniti ove dvije vrijednosti.
Pa onda ja tvrdim na liniji 25, zamijenili.
I ja ispišite xiy pod pretpostavkom da
oni doista smo zamijenili.
Ali, ako sam zapravo pokrenuti ovaj program -
neka mi otvoriti prozor terminala.
Dopustite mi da buggy3.
Kao što ime sugerira, ovo ne ide na dobro završiti.
Jer kada sam pogodio Enter, primijetiti da je x 1.
y je 2.
I još na kraju programa, oni su još uvijek, u stvari, isto.
>> Dakle, na temelju demonstracije samo sada s Kenom, što se zapravo događa?
Pa, neka je roniti u ovom swapu funkciji.
To je super kratka.
To je samo nekoliko linija koda dugo.
No, ono što je temeljni problem temelji se na jednostavnom priča
ovdje s Kenom?
Zašto je zamjena slomljena?
[Nečujan]
Točno.
Tako smo pohranu na kopiju, a ne varijabla sama.
Drugim riječima, swap navodno traje dva argumenta, int.
I to se zove samovoljno i b.
I ovdje, ja sam prošao u X i Y, koji su redom 1 i 2.
Ali ja nisam doslovno prolazi u x.
Nisam doslovno prolazi u y.
Ja sam prolazeći kopiju x i kopiju y.
To je kao gotovo kao da ste kopirati i zalijepiti u zamjenu vrijednosti koje
želite to zapravo manipulirati.
Dakle, ako je to slučaj, kada sam, program početi izvršavanju
linija 35, a zatim 36 -
kad dođem na liniji 37, u ovom trenutku u priči, što je vrijednost?
U ovom trenutku u priči, linije 37, što je vrijednost u ovom trenutku?
Dakle, to je samo trebao biti jedan.
Točno?
Budući x donesen kao prvi argument.
I ova funkcija samo proizvoljno poziva svoj prvi argument,.
Slično je y, drugi argument.
A to je samo proizvoljno pozivom drugi argument b.
>> Sada ova dihotomija zapravo prilično jednostavno objašnjeno.
Razmislite o tome.
Nitko od nas su se susreli osobu koja je napisao printf.
Dakle, sigurno, on ili ona nema pojma što naši varijable 30 godina kasnije se ide
da se zove.
Dakle, mora postojati razlika između onoga što nazivamo varijable u
Funkcije pišete i ono što nazivamo varijable u funkcijama koje ste
pozivom ili korištenjem.
Dakle, drugim riječima, ja sam napisao moje varijable kao xiy.
Ali ako netko drugi je napisao swap funkciju, on ili ona svakako
ne bi znali što moji varijable će biti pozvan.
Dakle, shvatite da je to razlog zašto ste ovu dvojnost imena.
Tehnički, mogao sam to učiniti slučajno.
No, oni će i dalje biti donesen kao kopija.
To bi bila samo čista slučajnost estetski ako toj osobi koja je napisala
Swap je koristiti ista imena.
>> U redu.
Dakle, u ovom trenutku u priči, linije 37, je jedna.
b je 2.
I sada sam nastaviti kako bi ih zamijeniti.
Pa prije svega, dopustite mi da zapravo to učiniti mnogo više jednostavno.
Ne znam što ti tri linije koda su radili.
Dopustite mi samo to učiniti.
b dobiva.
dobiva b..
Gotovo.
Zašto je to slomljen, logično?
To je vrsta intuitivnog stvar, zar ne?
Tako postaje b.
I b postaje.
No, problem je u tome da čim linije 37 izvršava, što je
vrijednost i B?
Isto, 1.
Budući da ste razbijen, da se tako izrazim, ti si se promijenio b jednaka.
Tako jednom linije 37 je pogubljen, to je super.
Sada imate dvije kopije broj 1 unutar ove funkcije.
Pa onda kada kažeš u skladu 38, dobiva b, dobro, ti si vrsta pijan.
Budući da ste samo dodjeljivanjem 1 do 1.
Vi ste vrsta izgubila vrijednost koju stalo.
>> Dakle, u originalnoj verziji to primijetiti ono što sam učinio.
Ja umjesto imao trećine liniju koda koji je izgledao ovako.
Izjavljujem privremenu varijablu - tmp je vrlo čest naziv
za privremenu varijablu.
To je int jer mora odgovarati što želim napraviti kopiju.
Ja pohraniti kopiju unutrašnjosti tmp. Tako jednom linije 37 je pogubljen,
vrijednost je -
brzo razum ček -
1.
Vrijednost b je 2.
I vrijednost tmp je 1.
Dakle, sada sam izvršiti liniju 38.
Tako jednom linija 38 izvršava, preuzima vrijednosti b.
I b je dva.
Tako je sada dvije.
Tako u ovom trenutku u priči, je 2, b je 2,
i tmp je 1.
Dakle, sada logično, mi može samo pasti MPT je vrijednost u b..
I mi smo gotovi.
>> Tako smo riješiti taj problem.
Nažalost, kad sam pokrenuti ovaj program u ovom obliku, to zapravo ne zamijene
bilo vrijednosti.
Ali da bude jasno, zašto?
Sredio sam logički problem od samo trenutak prije.
Ali opet, ako sam pokrenuti ovaj program, x i y ostaju nepromijenjene do kraja
programski izvršenje.
[Nečujan]
David J. MALAN: Pa nismo vratili ništa.
Dakle, to je istina.
No, ispostavilo se da je malo problem ovdje, jer do sada,
Jedino što smo bili u mogućnosti vratiti je jedna stvar.
A to je ograničenje C. Možete samo vratiti stvarno jedna vrijednost,
u kojem slučaju, ja sam vrsta zaglavi ovdje
jer bih se mogao vratiti na novu vrijednost x ili bih se mogao vratiti
nova vrijednost y.
No, želim i leđa.
Dakle povratka nije jednostavno rješenje ovdje.
No, problem je fundamentalno zašto?
Što smo zapravo zamijenili?
a i b.
No, i b su kopije X i Y, što znači da smo upravo učinio sve ovo
raditi - samo smo proveli kao tri minute govori o zamjeni
funkcija i sva tri od ovih varijabli.
I to je super, savršeno točno u izolaciji.
Ali i B opseg samo je u tim linijama ovdje.
Dakle, baš kao i za petlju, ako proglasi cijeli sam unutra za
petlja - Isto tako, ako ste proglašenja i b unutar funkcije koje
ste napisali, oni vrijede samo unutar te funkcije.
Što znači čim swap učinio izvršenja i idemo iz linije 24 do
linija 25, x i y nisu uopće promijenio.
Vi samo izgubiti puno vremena zamjene kopije varijabli.
>> Tako ispada da je rješenje za to je zapravo ne-očigledan.
To nije sasvim dovoljan za povratak vrijednosti, jer možemo
samo vratiti jednu vrijednost.
I ja stvarno ne želim mijenjati i xiy u isto vrijeme.
Tako ćemo se vratiti na to.
Ali za sada, shvatite da je problem u osnovi proizlazi iz činjenice
da a i b su kopije.
I oni su u svom djelokrugu.
Pa, hajdemo pokušati riješiti to na neki način.
Dopustite mi zapravo dođite ovamo i otvoriti, recimo, četvrta varijanta
toga, buggy4.
A što je to?
To je slično, ali jednostavniji problem pogledati prije nego što smo se rana na
ga rješava.
Ovaj program se zove prirast.
I to očito inicijalizira je x cijeli broj 1 na liniji 18.
I onda zahtjevu x je 1.
I onda tvrde povećavanjem, dot, dot, dot.
I onda nazvati prirast.
Ali onda u redovima 22 i 23, ja tvrdim da je bio porastao.
Tvrdim x je sada ono što je, dva vjerojatno.
>> No, ovaj program je lud.
U čemu je problem?
Da?
[Nečujan]
David J. MALAN: Točno.
Dakle, x je proglašen očito na liniji 18.
To je u glavnom u vitičastim zagradama.
Dakle, jednostavan odgovor je da, dobro, x postoji ovdje.
To ne postoji u liniji 32.
Dakle, ovaj program zapravo uopće neće sastaviti.
Prevodilac, kad sam pokušati sastavljanja ovog zakona, ide vikati na mene
o nekim neprijavljenog identifikator ili nešto u tom smislu.
U stvari, pokušajmo.
Ovo je napraviti buggy4.
Tu je.
Koristite neprijavljenog identifikator x u skladu 32.
A zapravo, budimo precizniji danas ovdje, tako da je to korisno u
radno vrijeme i kod kuće.
Primijetit ćete da je to malo šifrirano napisano.
No, činjenica da zveka ima vikao na nas, rekavši
buggy4.c: 32:5, je zapravo korisno.
To znači da je pogreška na liniji 32 u znaka pet.
Dakle, jedan, dva, tri, četiri, pet.
To je, u stvari, gdje je problem.
I također treba imati na umu pri radnog vremena i kod kuće, ja sam sretan ovdje.
Imam jedan pogrešku.
To će biti relativno lako popraviti.
Ali ako se cijeli ekran pun neodoljiv poruka o pogrešci, opet,
shvatiti da najniži jedna samo može biti simptomatična
najviši one.
Dakle, uvijek juriti dolje svoje greške odozgo prema dolje.
Jer postoji samo može biti tratinčica lanca efekt koji vas upućuje
imaju način više problema nego što zapravo rade.
>> Dakle, kako bismo mogli popraviti ako mi je cilj povećavati x?
Što je to?
Ok.
Dakle, možemo napraviti x globalno.
Ajmo uzeti prečac koji sam upozorio ranije.
Ali pakao, samo mi treba brzo popraviti.
Pa recimo samo int x ovdje.
To čini x globalno.
Dakle, sada glavni ima pristup do njega.
I prirast ima pristup do njega.
I tako me pusti naprijed i sastaviti to sada.
Napravite buggy4, Enter.
Čini se da sastaviti sada.
Ajmo pokrenuti buggy4, a čini se da se zapravo radi.
Sada je to jedna od tih stvari -
učiniti kao što sam rekao, ne kao ja, kao što sam učinio ovdje.
Jer u cjelini, naši programi će dobiti puno više zanimljiv i
puno više od toga.
A ako je vaš rješenje životnih problema je samo ah, staviti sve
varijable na vrhu datoteke, vrlo brzo učiniti programi dobiti
horrifically teško upravljati.
Ona dobiva teže smisliti nove varijable imena.
Ona dobiva teže shvatiti što varijabla radi što.
>> I tako u cjelini, to nije dobro rješenje.
Pa hajdemo to učiniti bolje.
Mi ne želimo koristiti globalnu varijablu ovdje.
Ja ne želim povećavati x.
Tako sam mogao očito -
Na kraju dana, to je poput glupog priče, jer smo upravo to učiniti.
Ali ako nisam znao o tom operateru, ili nisam smjela
ga promijeniti u glavni sama, kako drugi ne bi mogao sam provesti Kena ovamo, to
Vrijeme ne kocka, ali povećajte?
Kako mogu promijeniti tu stvar ovdje?
Da.
[Nečujan]
David J. MALAN: Dobro, dobro.
Pa zašto ne bih proći x?
I onda umjesto da ga vrate, zašto ne bih baš ne vraćaju x + 1?
Sada, par više stvari moraju promijeniti ovdje.
Ja sam na pravom putu.
Što još trebam Tweak?
Netko drugi.
Da?
[Nečujan]
David J. MALAN: Trebam promijeniti povratnu vrstu prirasta
jer to ne poništava.
Void znači ništa se nije vratio se.
Ali, jasno, sada je to.
Dakle, to treba promijeniti int biti u skladu s onim
Ja sam zapravo vraćaju.
>> Sada je nešto drugo još uvijek lud ovdje.
Da?
[Nečujan]
David J. MALAN: Dakle trebam povećavati x?
[Nečujan]
David J. MALAN: Ah, tako da moram proći x.
Dakle, moram to učiniti ovdje.
Dakle prototip, moram promijeniti ovaj ovdje.
Dakle, to mora postati int.
To mora postati -
hmm.
Ja sam zapravo imaju bug ovdje dolje.
Ajmo riješiti ovo jednom prvi.
Što bi to zapravo biti?
Dakle, to je dobio biti int nešto.
To bi mogao biti x.
Ali iskreno, ako počnete poziva sve svoje varijable x, to je idući u dobiti
sve manje i manje jasno što je što.
Dakle, neka je samo proizvoljno odabrati neku drugu konvenciji imenovanja za moju
pomoćne funkcije, funkcije pišem.
Mi ćemo to nazvati.
Ili bismo mogli nazvati - nazovimo ga even_number biti čak i precizniji.
Pa onda moram vratiti ono što je broj plus 1.
I sada moram promijeniti jednu drugu stvar ovdje i jedan
Druga stvar ovdje.
Što moram promijeniti na liniji 21 prvi?
Moram ga dodijeliti x.
Pa ja ne mogu samo pozvati inkrementalni x.
Moram se sjetiti odgovor promjenom vrijednost od x na
lijeve strane.
I premda x je sada na lijevo i desno, to je potpuno u redu, jer
desnoj strani dobiva pogubili prvi onda dobiva plopped u lijevo
ruka stvar, x, u ovom slučaju.
I onda na kraju, to je lako popraviti sada.
Ovo je samo trebao odgovarati što je dolje.
Interesi broj.
>> U redu.
Dakle, cijela hrpa promjena za stvarno glupo funkciji.
No predstavnik stvari koje mi se sve ćete želite učiniti.
Tako bi buggy4.
Ja sam zeznuo negdje.
Bože moj.
Pet pogrešaka u, kao, šest-line program.
Dakle, ono što je krivo na liniji 18, lik 5?
U redu.
Dakle, moram proglasiti ovaj int.
U redu.
Tako ćemo vidjeti, hrpu drugih pogrešaka.
O moj bože.
19, 18, 21.
Ali opet, neka je samo jasan zaslon -
Kontrola L ovdje - i re-run zveka.
Dakle, pet problema je zapravo samo da je jedan.
Dakle, sada idemo pokrenuti buggy4, Enter.
Uh.
x je porastao ispravno.
>> U redu.
Sva pitanja o tome kako za povećanje broja?
Da?
ZVUČNIK 2: Zašto je to da možete samo promijeniti x na broj u varijablu
imenovati i to ću znati što znači?
David J. MALAN: Dobro pitanje.
Kako to da ja mogu samo promijeniti x broju i program će znati
odmah?
Pa opet, mislim da je to ovaj apstrakcije.
Dakle, ako sam glavni i Ken je inkrementalni, iskreno, ne zanima me
što Ken poziva svoju ipad.
Ne zanima me što on naziva sve što ima veze s njegovom provedbom
ove funkcionalnosti.
Dakle, ovo je provedba detalj koji sam, uglavnom, ne
morati brinuti o tome.
I tako jednostavno mijenja dosljedno unutar funkcije, broj ovdje
i broj ovdje, sve je to traje tako dugo kao što sam rekompiliranje.
To je vrsta kao i ako mislite o tome - mnogi od nas, one od vas s vozača
licence koji ste protjerani, ili ako čak sam odvezao u automobilu -
većina nas nema pojma kako se auto radi ispod haube.
I doslovno, ako vam se otvoriti haubu, većina nas - uključujući i mene -
se ne događa da znam što gledamo.
Nešto kao možda ćete osjetiti sa stvari kao što je ovaj sada.
Ali mi stvarno ne moraju brinuti kako automobil radi.
Mi ne moramo brinuti što sve šipke i klipova i kablova unutar mjesta
automobil zapravo rade.
>> Dakle, nešto poput onoga što vi zovete klip ne smeta
ovdje u ovom slučaju.
Sve ideja.
Da?
[Nečujan]
David J. MALAN: Ako je bilo više koristi od varijabilnog Xa trenutak prije,
ti, programer, morat će ih promijeniti posvuda.
Ili ste doslovno mogli učiniti File, Izbornik, a zatim Pronađi / Zamijeni,
nešto slično.
No, ti si idući u morati napraviti tih promjena sebe.
Morate biti dosljedna.
[Nečujan]
David J. MALAN: Posebno bi kao ovdje?
Ako je ovo bila int drugi broj?
Da.
Dakle, kako je bitno kada se zove funkciju.
Dakle, ako sam se zovete prirast ovdje s nečim zarez nešto,
postoji izravna mapiranje.
Prvi varijabla, bez obzira na to zove, je napravio kopiju prvi
Argument ovamo.
Nažalost, to ne bi trebao biti zagrada.
Drugi argument linije se s jednom drugom.
>> Tako bi, da je bitno.
U redu.
Žao mi je dug put kako do njih doći.
Ostala pitanja?
U redu.
Dakle, neka je vidjeti ako ne možemo slikati sliku o tome što se zapravo događa
ovdje ispod haube, da se tako izrazim.
Dakle, ovo je pravokutnik koji bi mogli predstavljati memoriju računala.
Dakle, čak i ako nemate pojma koliko memorije radi ili koliko RAM-radovi, barem
Pretpostavljamo da imate grozdovima to ovih dana.
Imaš megabajta njega.
Imaš gigabajta njega.
A mi znamo iz tjedna nule da bajt je samo ono što?
8 bita.
Točno, pa osam nula i one.
Dakle, ako vaše računalo ima koncert RAM-a, dva nastupa RAM ovih dana, imate
milijardi ili 2000000000 bajtova memorije, ili otprilike 8000000000 ili 16000000000
bita, unutar vašeg računala.
Sada za razliku od malog vunasta Willy primjer, to nije magnetski čestice
obično više.
Sve u prijenosnicima najmanje, to je solid state diskova, SSD-ovi, da
Jednostavno nemaju pokretnih dijelova.
To je sve elektronički.
To je sve struja temelji.
Dakle, mislim, ipak, ovog pravokutnika kao samo predstavlja jedan ili dva
gigabajta memorije koju imaju.
>> Dakle, to je komad memorije.
Sada svijet informatike ima neku vrstu podijelila s komadima
memorija raditi različite stvari.
Tako na primjer, ako je to vaše računalo RAM - kako je predložio
pravokutnik tamo - Ispada da je po konvenciji, na vrhu vašeg RAM-a, tako
govoriti, općenito je ono što se zove tekst segmentu.
Oni su nula i one koje ste sastavio.
Dakle, kada smo gledali ispod haube na ono a.out je, sve
su nula i one -
kada pokrenete program, te nula i one se učitava s tvrdog
pogon na nešto što se zove RAM-a.
I u RAM, oni stavili na vrhu.
Sada međuvremenu, imate i druge stvari.
Inicijalizirane podaci, nepokrenute podataka.
Te dvije swaths sjećanja odnose se na globalne varijable, koje
ne često koriste.
Ali ponekad, ako to učinite, oni završiti tamo gore, kao dobro.
Zatim tu je neke druge stvari.
Okoliš varijable, koje nećemo potrošiti puno vremena na.
Ali onda dvije važne stvari koje će se vratiti u cijelom ovom
semestar, stog i hrpa.
>> Dakle, većina računala memorije rezerviran kada je pokrenut program
nešto što se zove snop i nešto što se zove hrpu.
I nećemo razgovarati o hrpi danas, ali ćemo
govoriti o stog.
I stoga je značilo da dočarati vizualni poput blagovaonici
obrok ladice u Mather doma, ili gdje god vam se dogoditi da se, gdje je
blagovaonica osoblje očistite ih svaki dan.
Oni ih stog gore od poda na gore.
A slično je u memoriji, tu je ova ideja stavljanja nešto na
stog, stavljajući nešto na hrpu, stavljajući nešto na hrpi.
A što mi znači ova?
Pa, neka je uvećali samo u donjoj polovici ove slike, vaše računalo je
RAM-a, predložiti sljedeće.
Ispada da kad pokrenete program kao što je a.out ili bok, bez obzira na
Program je u tome što ste napisali,
opet, ta nula i one se učitava s tvrdog diska - što je
dugotrajno skladištenje, ostaje čak i kada povući utikač -
učitava u RAM.
RAM je brže od tvrdih diskova.
To je manje od tvrdih diskova.
Ali to je gdje programi živjeti dok god ih izvodi.
>> Dakle, dvostruko kliknuti program na Mac ili PC - to je učitati iz
hard disk u RAM.
Čim se to učita u RAM, su nula i one idu na način vrhu,
tzv tekst segmentu.
Ali onda čim se vaš program zapravo počinje prikazivati, glavni
Funkcija se zove.
A glavni, kao što smo vidjeli, često ima lokalne varijable.
I to je Ints i gudače i znakovi i slično.
Dakle, ako vaš program koji ste napisali ili program koji ste
dvokliknuli koristiti neke varijable unutar glavna, oni završiti na
dnu vašeg stog memorije, da se tako izrazim.
Sada više konkretno, što to zapravo znači?
To samo znači da, ako smo išli na broj stvari -
ako idemo na broj bajtova RAM na računalu, primijetiti da
to bi moglo biti byte nula broj.
To bi moglo biti byte broj jedan, dva, tri, četiri, pet, šest, sve
način do sviđa -
2000000000 će biti sve gore na vrhu.
Dakle, drugim riječima, kada govorimo o RAM-a ili memorije u smislu bajtovima, to
samo znači da je netko odlučio što će prebrojiti svaki
ti komadi memorije.
>> Dakle, kada vam je potrebno 32 bita za int, ili trebate osam bitova za char, gdje je
oni završiti u sjećanju?
Pa konceptualno, oni samo završiti na dnu ove
stvar se zove snop.
No, ono što je zanimljivo sada kada je glavni poziva funkcija.
Pretpostavimo funkciju pod nazivom foo, samo proizvoljna ime.
Što se događa je glavni je na dnu ovog stog memorije.
Foo sada staviti na vrhu glavni u sjećanju.
Dakle, sve lokalne varijable koje foo je završiti neku vrstu konceptualno iznad
onima u glavni.
Ako foo zove drugi funkciju zvanu bar one varijable završiti ovdje.
Ako bar zove nešto drugo, ovdje, ovdje, ovdje.
Dakle, ono što je zanimljivo o pokretanju programa je u tome što vi zovete funkcije,
i kao one funkcije poziva funkcije, kao i one funkcije poziva funkcije,
da podigne ovu hrpu funkcija u memoriji.
I samo jednom funkcija vraća ne počnete dobivanje tog memoriju natrag.
Dakle, jedan od najlakših načina da ponestane memorije računalnog programa je
napisati funkcije koje nikada ne vrate.
>> Tako na primjer, neka je pokazati koliko s
namjerno lud programa.
Pusti me naprijed i nemojte # include , int main (void).
I ja ću to učiniti dok (2> 1), koji vjerojatno neće nikada
promijeniti na nas.
I neka mi sada ići naprijed i učiniti printf.
Zapravo, to će biti manje vizualno zanimljiva.
Ajmo to učiniti.
Za int (i = 0; i> 0).
Ajmo napraviti takvu pogrešku, i + +.
I nemojmo printf ovdje.
Ajmo vježbati ono što sam propovijedao.
Popijmo metodu ovdje.
Void zbor, a mi ćemo reći int i.
A onda ću reći, printf -
oh, hajdemo napraviti ovo više zanimljiv.
Ajmo zapravo ne ispisivati ​​ništa at svi.
Ajmo to učiniti.
Chorus (i).
>> U redu.
Dakle, ovo je lud, jer zašto?
Ja izmišljam kao što sam ići jer je program zapravo ne učiniti ništa
od interesa.
No, to nije cilj.
Cilj je napisati program čiji je glavna funkcija što radi, očito?
Se poziva.
I zapravo, ne trebamo petlju.
Ajmo još pojednostaviti to samo kako ne bi izgubili iz vida stvarno
Temeljni bug.
Glavni pozivi zbor pjevati neki refren.
Tada sam učinio nešto glupo, a ja sam imao refren zborski poziva, jer sam preuzela
netko drugi će ga provesti možda.
I sad to ne ide sastaviti još.
Trebam učiniti što?
Trebam prototip, zapamtite.
Dakle, moram imati ovdje void refren (int i);.
>> Pa sad, ako odem ovdje dolje -
zapravo, ajmo koristiti veći prozor.
Idemo naprijed i napraviti refren.
Korištenje neidentificiranog declarer ja.
Oh, to je glupo.
Mi ne trebamo argument.
Ajmo to učiniti.
Želja mi je počeo ovaj način.
To bi bilo puno lakše program za pisanje.
Dakle postoji.
Sada idemo do mog prozora terminala, ponovno pokrenuti zveka.
I ovdje mi ići.
To je bilo jako brzo.
Što se zapravo dogodilo baš, iako?
Pa, sada ću dodati ispisa linija, tako da možemo vidjeti.
Dakle, dopustite mi da kažem printf, recimo, ja sam ovdje.
Ok, nema varijabli, mi ćemo ga ostaviti kao što je to.
Dopustite mi da ponovno pokrenuti napraviti.
Dopustite mi da ponovno mali zbor.
I hajde.
Imajte ide.
Kao na stranu, zašto je ne srušio još?
Segmentacija kriv dogodilo superbrzo prije.
[Nečujan]
David J. MALAN: Točno.
Tako je potrebno vrijeme za ispis.
Potrebno je samo više rada na računalu strane.
I to je to.
Segmentacija kriv.
>> Dakle primijetiti koliko brzo programi pokrenuti.
Ako ne ispisuje ništa, super brzo.
Ali mi još uvijek imamo ovu segmentacije grešku jer ono što se događa?
Pa, ako mislite o tome kako vaše računalo 'pamćenje je iznio, to
dogoditi da bude glavna.
Ali ovdje -
ajmo samo nazovite ovaj refren, a nazovimo ovu refren.
I sad, ako ja moje estetiku pravo, ovo je samo htio reći refren,
zbor, zbor, zbor, zbor, zbor, zbor, oglas nauseum.
I na kraju, ono što će se dogoditi?
Ako velika slika doslovno je ovo, što se upravo događa konceptualno?
Stog prekoračenja hrpi.
Ili još gore, samo prekoračenje sve, uključujući tekst segmentu, koji je
su nula i one koji predstavljaju svoj program.
Ukratko, to je samo super, super loše.
Točno?
Vaš program spiralu izvan kontrole.
Vi koristite način više memorije nego što namjerava sve zbog glupo
pogreška, u ovom slučaju.
Ili, u ovom slučaju, vrlo namjerno učinio funkcija se zove.
Sada to nije sve loše.
Funkcije se pozivaju zapravo ima veliku moć
kada ga koristite pravilno.
Nisam ga se pravilno koristi ovdje.
>> Dakle, to nije sve loše.
No, činjenica da sam nikada zapravo zaustaviti sebe nazivajući je temeljni
Slabost ovdje ovog programa.
Dakle, gdje ćemo uz sve ovo?
Pa, što se stvarno događa?
Kad sam nazvati prirast funkcije, kao što smo radili u tim primjerima,
Imam vrijednost kao jedan koji sam proći u.
Ja proći u kopiji broj jedan.
Dakle, sljedeće će se dogoditi.
Dakle, idemo u prirasta primjer.
A ovaj tip upravo ovdje.
Dakle, ovdje je ono što se zapravo događa.
Kada sam nazvao prirasta, a ja proći u x, slikovito što je
ovdje događa je to -
ako imam vrijednost jednog pohranjene ovdje, a ja sam zapravo nazvati prirasta, koji
sada se zove refren -
da, to me bacanje izvan ovdje.
Dakle, nazovimo ovaj prirast.
I ne znamo što je to sljedeća funkcija će biti.
Dakle, ono što se zapravo događa je ovdje negdje u glavnom, imam komad
memorije koja je spremanje broj 1.
Kad sam nazvati prirasta, ja sam koristeći drugi komad memorije, ali sada sam
imaju kopiju 1.
Kad sam povećajte tu vrijednost, to postaje 2 - užasno napisan na
zaslon ovdje.
Ali onda, što će se dogoditi čim prirasta vraća?
Ova memorija samo dobiva vrati na operativnom sustavu, što znači sve
ste učinili ništa korisno.
Onaj koji je izvorno bio sadržan u glavnom je još uvijek zapravo postoji.
>> Dakle, gdje ćemo s tim?
Pa, ispada da se u memoriji imate to natrag na leđa slijed
bajtova koje možete staviti stvari unutra
I ispada da smo već vidjeli nešto što uključuje stavljanjem
stvari vratiti natrag na leđa na leđa.
Što je string, temelji se na tjedan jedan, a sada tjedan dva?
Dakle, to je samo skup znakova.
Tako ispada, baš kao što možete staviti brojeve u memoriji, slično možete
staviti znakove u sjećanju.
A kad ćemo početi stavljanjem znakova u memoriji natrag na leđa na leđa
natrag, ispada da koriste najjednostavnije stvari kao što je za petlje ili
petlja dok je, možemo ponoviti -
s lijeva na desno preko znakova u nizu -
i početi ih masirati u različite likove uopce.
Mogla postati B. B mogao postati C. Tako da u konačnici, možemo uzeti
Hrvatski rečenica koja zapravo ima smisla i pretvoriti svaki od onih
Slova jednom na vrijeme šetnjom kroz naše memorije računala lijevo
Pravo da se zapravo šifriranje.
>> Tako ćemo uzeti našu pet minuta pauze ovdje, i kad smo se vratiti, mi ćemo
započeti ovaj proces remećenje informacije.
>> U redu.
Dakle, prije nego što smo zaroniti u nekim kripto i te stvari naziva polja, neka mi
stanka za sva pitanja jer se osjećam kao da sam stvarno vrsta zbrkane neke od
tim temama.
Tako ćemo popraviti sada, ako možemo.
Tako smo samo razgovarali o povratnih vrijednosti.
Razgovarali smo o argumentima.
I razgovarali smo o tom pojmu, koji ćemo se vratiti u narednim tjednima
dolaze, od gledanja memoriju kao cijela hrpa tih složenom
ladice, da se tako izrazim.
Od dna na gore, tako da svaka ladica da se stavi na stog predstavlja
funkcija koja trenutno se zove.
Ima li pitanja?
Pa o tome - neka mi probati molba pitanje.
Držim da pokvari, ali sada it's - you've svi vidjeli dječakovo lice.
Dakle, mi ćemo se vratiti na to.
>> Pa neka mi postaviti pitanje ovdje.
Dopustite mi da pojednostaviti ovaj leđa na ono što je bilo prije neke naše ranije Q & A.
A činjenica da je prirast ima otvorenu zagradu, int broj, zatvoren
zagrada.
Što int broj predstavlja?
[Nečujan]
David J. MALAN: argument.
Ok, ali ono što je argument?
[Nečujan]
David J. MALAN: Žao mi je, što je to?
ZVUČNIK 3: Nešto što prođe u.
David J. MALAN: Ok.
Dakle, nešto što prođe u.
I općenito, to je samo ulaz.
Ako pišete funkciju i tu funkciju je svrha u životu je učiniti
nešto malo drugačiji svaki put kada ga koristiti, onda je jedini način za
da se to dogodi stvarno čini da bi se to osigurati sa ulaza, tako da se
može napraviti nešto drugačije s tim input svaki put.
>> Dakle, potrebno je navesti dvije stvari kada funkcija uzima ulaza.
Morate navesti ime koje želite dati taj ulaz, isključivo
svoju praktičnost, tako da se može odnositi na njega u funkciji koju
sami pišete, kao što sam učinio ovdje u liniji 32.
No, također je potrebno da odredite svoj tip jer je C programski jezik
samo da zahtijeva
da, ako želite varijablu, morate reći računalu što
data type je,
u velikom dijelu, tako da se ne zna koliko bita
izdvojiti za tu varijablu.
Budući da bi to moglo biti šest -
Žao nam je, to neće biti šest.
To može biti 16 godina.
To može biti osam.
To može biti 32, čak 64.
No, računalo treba znati.
Sada int na lijevoj strani predstavlja ono što je, za razliku?
[Nečujan]
David J. MALAN: Što je to?
[Nečujan]
David J. MALAN: tip funkcije i, točnije,
Vrsta svoje proizvodnje.
Točno.
Dakle, dok je stvar u zagradi predstavlja njegov ulaz, ako ih ima,
stvar s lijeve strane predstavlja svoj izlaz.
I u ovom slučaju, prirast očito vraća int.
I tako int je povratni tip ove funkcije.
>> Što to znači da se vrate?
Doslovno, koristite ključne povratak.
I onda ako je ono što se vraćaju s desne strane ključnu riječ
cijeli broj, onda je to doista u skladu s onim što smo obećali.
Vi ne bi mogao učiniti nešto ovako -
Pozdrav, svijet -
jer je niz.
Očito to nije cijeli broj.
Dakle, u kratko, teret je stvarno na nas, programer, biti specifičan kao
za što smo se vraćaju i onda zapravo ide o tome povratka.
A onda bi tad više jasno kontekst -
tamo je opet.
Kontekst -
veliko iznenađenje dolaze u samo jednom trenutku.
Kontekst ovdje sada da vaše računalo 'pamćenje je, opet,
gigabajt, dva gigabajta, što god.
Možda je to i više.
Možda je manje.
No, računalo ga pogleda kao da različite dijelove.
Nešto ide tamo dolje.
Nešto drugo ide gore.
Različite stvari ide u sredini.
I danas, mi samo početi govoriti ovu priču.
>> No, vratit ćemo se na ovaj tijekom vremena.
Za sada, samo komad memorije mi stvarno stalo je tekst segment
jer to samo predstavlja nula i one
da zveka je outputted.
Dakle, kada ste pokrenuti naredbu na tipkovnici kao a.out, ili dvostruka
kliknite ikonu na Mac OS ili Windows, vaš program je učitan s tvrdom
voziti u RAM.
I to je plopped na vrhu vašeg računala RAM-a, da se tako izrazim.
Sada u međuvremenu, kao i vaš program počinje prikazivati ​​i glavni dobiva pozvao u
Program je napisao ili program Microsoft ili Apple pisao, bilo koja od njezinih
lokalne varijable završiti tamo dolje na dnu vašeg računala memorije.
Ali ako glavna zove drugi funkciju koja sama po sebi ima varijable ili
argumenti, oni završiti iznad nje.
A ako je to funkcija poziva nešto, oni završiti iznad nje,
iznad njega, iznad njega.
I samo jednom funkcija se obavlja izvršenje radi hrpu ladica, tako
govoriti, početi da se niže i niže.
A to je ono što se tada, u malom, objašnjava zašto je, kada nazovete kocka -
ili nazovete prirast -
god prolazi u kopiju vrijednosti.
A što to znači slikovito je da doslovno pišeš
broj 1 u drugom dijelu memorije, mijenja da 1 do 2, u slučaju
prirast -
ili na 8, u slučaju kocke -
i onda bacanje da sjećanje daleko čim prirasta ili kocka
funkcija vraća.
>> Pitanje.
[Nečujan]
David J. MALAN: Gdje - globalne varijable su pohranjene u ono što je
Trenutno zove inicijalizirati podatke ili nepokrenute podataka.
Razlika je u tome, ako imate globalnu varijablu, a vi ga dodijeliti
Odmah vrijednost sa znaka jednakosti, to završi na vrhu postoji.
A ako ste samo reći int x zarez bez vrijednosti, to završi blago
niža u RAM jednostavno konvenciji.
Ostala pitanja.
U redu.
>> Dakle, ova slika će se vratiti kao što smo dobili više snažan s onim što možemo učiniti
s računalom.
Ali za sada, neka je imaju kratak uvod u kriptografiju, specifična vrsta
kriptografija da ne riješiti sve svjetske probleme, ali ne rješava
su neki od njih.
U ovom slučaju ovdje, imamo nešto što se zove kriptografija s tajnim ključem.
I kriptografija s tajnim ključem, kao što ime sugerira, proizlazi svoju sigurnost
iz tajnosti.
Tako na primjer, ako ste se vratili u osnovnoj školi, a vi ste prolazu
mala tajna ljubavno pismo na dječaka ili djevojčicu koju drobljenje na - ako
htjela proći da se kroz publiku, vjerojatno ne bi napisati
kao bilješka na engleskom ili bilo što vaš materinji jezik je, štoviše, da
Možda ga kodirati.
Ili možda samo im poslati SMS poruku ovih dana.
No, možda zapravo prođe im notu cijelom razredu.
A za to sigurno, tako da vaši prijatelji i nastavnike
ne znam što ti pišeš, možda ćete doći do prilično jednostavan
Algoritam -
Mlada iako bi moglo biti -
samo otimati riječi.
Dakle, umjesto pisanja, možda ćete napisati B. Umjesto B, možda ćete napisati
C. Umjesto C, možda ćete napisati D, i tako dalje.
Ili ste mogli doći do više sofisticirane prijevodu slova
različitim slovima.
No, kvaka je dječak ili djevojčica na koju šaljete ovu poruku treba
znati nešto.
Što je ono što, očito?
Sviđa mi se, ono što vaša tajna je.
Kao što je to mapiranje između kao i BS i CS i DS?
Je li to samo dodao jedan, da tako kažemo, da svaki od slova otići iz
A do točke B, B i C?
Je li to složeniji od toga?
Dakle, vi i vaš simpatiju trebaju imati ovu tajnu informaciju.
No, tu je vrsta ulova-22 ovdje.
Ako je ovo vrlo prvi put šaljete ovo ljubavno pismo kroz
klase, kako je to dječak ili djevojčica će znati što je tajna, čak je?
Dakle tajni ključ kripto ne riješiti sve svjetske probleme.
I tu je zapravo odnos koji ćemo se vratiti prema
Semestar je kraj.
>> Isto tako, imate nitko od nas vjerojatno ikada poslan -
slično, ne većina nas ne zna nekoga da radi, na primjer, na
Amazon.com.
Pa ipak, mnogi od nas vjerojatno su kupili stvari na Amazon.com.
I mi smo učili pretpostaviti da ti e-commerce
transakcije su sigurne.
Točno?
URL vjerojatno kaže https.
Tu je možda glupo lokota ikona negdje.
Postoji neka vrsta kriptografije osiguravanje vaše podatke o kreditnoj kartici
između vas i Amazon.com.
Pa ipak, ako kriptografija uključuje znajući neke tajne, a još ne znam
znam nikoga na Amazonu, a ja sam sigurno nije dogovoreno bilo kakve
tajna s nekim na Amazonu, kako je moje računalo ili moj preglednik to?
Pa, ispada da je druge vrste kriptografije ukupno da rješavaju
taj problem.
No, za danas, mi ćemo se fokusirati na jednostavan jedan, gdje možete organizirati u
unaprijed znati neke tajne, kao što je plus jedan ili nekom mapiranje između kao i BS.
>> A proces kriptografije općenito uključuje ovo.
Imate neki običan tekst, prikazano ovdje na lijevoj strani.
Možete ga pokrenuti kroz neku vrstu algoritma ili postupka
za to kriptiranje.
Možda je to samo postaje B, B postaje C. I onda ćete završiti s
šifra teksta.
U međuvremenu, nakon što svoju simpatiju prima na znanje tajnu, on ili ona mora onda
dešifriranje to po pravilu unazad da algoritam kako bi dobili
natrag na običan tekst.
Sada postoje fizički inkarnacije to.
Na primjer, to je mala tajna dekoder prsten.
A ovo je prsten u smislu da postoje dvije biranja ovdje.
Na vanjskom rubu ove stvari, tu je slova od A do Z,
iako su u slučajnim redoslijedom.
I iznutra, tu je zapravo neki brojevi, kao da s ovom
prsten, možete pretvoriti vrsta izvana, ali ne iznutra kako bi se redati
brojevi s pismima.
I u isječak ste o kako bi vidjeli - od kojih neki možda ste vidjeli 24/7
oko božićne sezone iz filma pod nazivom Božićna priča.
Vidjet ćete da je malo Ralphie je bio toliko željan shvatiti ono malo siroče
Annie tajna poruka bila mu da je komunicirao, mislim, u
obliku numeričkih poruka na serijske kutije.
A ti morao akumulirati sve malo kartice koje ste dobili
u žitarica okvir.
Morao si ih poslati u.
Vi morali vratiti tajni dekodera prsten, tako da napokon mogu shvatiti
što je mapiranje između slova i brojki,
ili slova i slova.
Tako sam vam dati ovaj kratki isječak iz A Christmas Story motivirati pset 2 i
naša rasprava, u ovom trenutku, od polja.
Dakle, ovdje imamo Ralphie.
>> [Video reprodukciju]
-Bilo da je poznat svima i raznovrstan da Ralph Parker imenuje se
član Little Orphan Annie Secret Circle i ima pravo na sve
se počasti i beneficije događa s njima.
-Potpisan, Little Orphan Annie.
Supotpisali, Pierre Andre!
U tinte!
Priznanja i beneficije, već u dobi od devet.
Hajde, idemo s njim.
Ne trebam sav taj jazz o krijumčara i gusara.
-Slušajte sutra navečer za zaključni avanturu Crna
Gusarski brod.
Sada je vrijeme za Annie tajne poruke za vas članovi
od Secret Circle.
Zapamtite, djeca, samo članovi Annie Secret Circle može dekodirati
Annie tajna poruka.
Zapamtite, Annie je ovisno o vama.
Postavite svoje igle do B2.
Ovdje je poruka.
12, 11 -
-Ja sam u mom prvom tajnom sastanku.
-14, 11, 18, 16 -
-Pierre je bio u velikoj glasa večeras.
Mogao bih reći da je večerašnji poruka je jako važno.
-3, 25.
To je poruka od Annie sama.
Zapamtite, nemojte reći nikome.
-90 Sekundi kasnije, ja sam u samo prostoriju u kući gdje je dječak od devet
mogao sjediti u privatnost i dekodirati.
Aha, B. sam otišao na drugu.
E. Prva riječ je biti.
S. je dolazio lakše sada.
U.
-Oh, hajde, Ralphie.
Moram ići.
-Ja ću biti dolje, ma.
-Ajme čudo.
-T, O. Budite sigurni da.
Budite sigurni da što?
Što je Little Orphan Annie pokušava reći?
Budite sigurni da što?
-Ralphie!
Randy je dobio to ići.
Hoćete li izaći?
-U redu, ma.
Ja ću biti van.
-Ja sam sve bliže sada.
Napetost je bila strašna.
Što je to?
Sudbina planeta može držati u ravnoteži.
-Ralphie!
Randy je dobio to ići.
-Ja ću biti pravo iz, za plakanje naglas.
-Ajme, gotovo je.
Moji prsti letjeli.
Moj um je bio čelika zamka.
Svaka pora vibrira.
To je gotovo jasno.
Da, da, da, da.
-Budite sigurni da pijete svoj Ovaltine.
Ovaltine?
Bijedan komercijalni?
Kurvin sin.
[END video reprodukciju]
>> David J. MALAN: Dakle, tu imamo kriptografiju.
Pa kako se u računalu možemo ići o primjeni ili
predstavlja stvari kao što je ovaj?
Pa, trebamo način izražavanja sebe malo više nego fleksibilno
naši varijable dosad su dozvoljeni.
Mi smo imali Ints.
Mi smo imali znakova.
Mi smo imali pliva i dubl i nekoliko drugih.
No, oni su pojedini komadi memorije koja stvarno ne dozvoljavaju nam da
izraziti stvari kao što su riječi i rečenica i fraza.
Doista, mi smo pozvani takve stvari konce.
Ali mi je obećao da je to zapravo samo pojednostavljenje u CS50
knjižnica da smo s namjerom da guliti natrag.
>> I tako krenimo učiniti da se ovdje.
Pusti me naprijed i otvoriti datoteku -
sve ove datoteke dostupni su kao i obično online -
zove array.c riješiti problem nevezano za gudače, ali da se boje
slika ovdje kako bismo mogli koristiti nešto zove niz.
Niz je tip podataka.
To je tip varijable, vrsta, koja ima više manjih vrsta podataka
unutar nje natrag na leđa natrag na leđa.
Tako na primjer, ako želimo napisati mali program koji vam daje svoj
kviz prosjek za naravno kao i 50 koji ima dva kvizove, mogao bi vrlo lako
napisati ovaj program - temelji ni na neke od prošlotjednog materijala -
pomoću GetInt i par varijabli.
Interesi quiz1, int quiz2, i to je prilično jednostavan.
To je možda 10, 20 linija koda, max, provesti program koji traži
Korisnik za dvije kviz rezultate i zatim izračunava njihov prosjek dodavanjem
zajedno, dijeljenjem po dva, a zatim ispisa rezultata.
Vjerojatno smo mogli učiniti da prilično lako sada nakon
neki broj minuta.
>> No, problem je u tome da pretpostavimo da je 50 imala tri ili četiri kvizova.
Pretpostavimo da ste htjeli koristiti isti program za klasu koja je imala
tjedno kvizova.
Razmislite o razredu koji je tjednik kvizovi.
Ako je kao 16 ili tako tjedana u semestru, sada imate 16 varijable -
int quiz1, int quiz2, int quiz3, int quiz4.
Čim počnete vidjeti ovu redundantnost, to kopiranje i lijepljenje
koda, to bi trebalo početi da želite tamo bili bolji način.
I hvala bogu, jer matrica, tu je.
Tako ćemo to učiniti.
Prvo, neka mi predstaviti vrlo jednostavnu stvar da nismo ste koristili do sada,
ali vidjet ćete ga povremeno u kodu.
To je ono što se općenito zove konstanta.
Dakle, to je konstanta u smislu da ta vrijednost ne mijenja.
Ljudska konvencija pri izradi konstanta koristiti sav kapital
slova, samo tako da se stvarno ističe u kodu.
A posebna ključna riječ koju koriste u C # define.
Dakle, ako vam kažem # define, zatim razmak, a zatim riječ koju želite koristiti za
Konstanta je ime, a zatim vrijednost konstantna.
Dakle, obavijesti, ovo je drugačiji od dodjele nešto u varijablu.
Nema znaka jednakosti.
Nema zarez.
To je ono što je općenito poznat kao preprocesor direktive, ali više na
da drugi put.
>> Za sada, to stvara nepromjenjiva vrijednost zove KVIZOVI čija stvarna
brojčana vrijednost je 2.
Pa gdje ste vidjeli kvizovi, kvizovi, kvizovi tijekom ove datoteke, to je
samo broj 2.
Sada, ako gledam glavni sada, hajdemo vidjeti kako se to radi.
Isprva, to izgleda malo zagonetan.
Ali to je sve stvari iz tjedna jedan.
Pitajte korisnika za ocjenama.
Kako ćemo to učiniti?
Pa, u skladu 22 -
ovo je stvarno sočan dio -
Ja proglasiti plovak, ali ne samo jedan float.
Ja sam izjavljuje, nego niz pomičnim zarezom vrijednosti.
To varijabla će biti pozvani razreda, kao podrazumijeva ovdje.
Ali samo dio nove sintakse onda su ti četvornih nosači, činjenica
da sam rekao plutaju razreda, a zatim otvorite zagradu i onda broj.
Obavijest, ako je to konstanta, to je baš kao što smo to učinili.
To znači hej računalo, dajte mi dvije splavi, i ajmo kolektivno nazivaju
ih razreda.
To je u suprotnosti s puno više zamoran proces kao što je ovaj.
Float Grade1, plutaju grade2, i tako dalje.
Dakle, niz nam omogućuje da provedbu tu ideju, ali mnogo manje messily, u
na takav način da možemo napisati jedan redak koda umjesto, recimo, 16 za 16
tjedan semestar.
Dakle, ja ne želim da teško kod dvije, jer ako mislite o tome sada
logično - Pretpostavljam da iduće godine CS50 promjene 3 kvizovi umjesto.
I ja sam imao broj dva ovdje.
Imao sam broj dva ovdje.
To postaje vrlo zamorno i vrlo lako zeznuti i da slučajno promijeniti
jedna vrijednost 3 i propustiti neke druge vrijednosti dva.
Dakle, ja ću umjesto apstraktne to daleko i koristiti ovu konstantu koja, kao i njegova
ime sugerira, nikada ne mijenja.
A sada, bez obzira na to da li imamo različite kvizove ove godine ili sljedeće, ja
samo da ga promijeniti na jednom mjestu, ovdje na vrhu.
>> Dakle, to je sve što je konstanta.
U međuvremenu, novi konceptualni značajka je da je niz.
Dakle uglatih zagrada mi dati toliko pliva i mi omogućuje kolektivno
zovu ih razreda ovdje.
Dakle, sada ćemo vidjeti što ću učiniti.
Ovdje u skladu 24 je početak za petlju.
Ovo je stvarno ništa fancy.
To je samo pomoću kvizova umjesto tvrdog kodiranom broju.
Ali nema ništa intelektualno drukčiji postoji od prošlog tjedna.
Ovo je samo printf.
Dakle printf ("kviz broj% d od% d"), jer samo želim isprintati daj mi kviz
broj jedan od dva, a zatim dva dva.
Dakle, ovo je čisto estetski stvar.
No, najzanimljiviji dio je sada u redu 27.
Kako bi se popunila u jednoj od dviju rezerviranih s pomičnim zarezom
vrijednost, što opet koristiti uglate zagrade.
U ovom slučaju, ja sam pomoću jer to za petlje je započeo s ja izjednačavanje
ono vrijednost, očito?
0.
>> Dakle, na prvoj iteraciji ove petlje, to je kao da ja
ovo napisao u kodu.
No, na drugoj iteraciji ove petlje, to je kao da ja
ovo napisao u mom kodu.
No, činjenica da sam koristeći varijablu je savršen, jer, kao što sam naziv
sugerira, to je različite svoju vrijednost na svakoj iteraciji.
Dakle, ja sam za punjenje tom obilju jedno mjesto na vrijeme.
Što to polje izgleda?
Pa, razlog zbog kojeg sam nacrtao ovo super jednostavan pravokutnik na zaslonu ovdje
prije nego što je iz tog razloga.
Niz je samo komad memorije slijedi drugi komad memorije,
slijedi drugi komad memorije, i tako dalje.
Dakle, ako moj polje je veličine 2, u ovom slučaju ovdje, sve bih raditi po
upisivati ​​u mojim kviz rezultate, sviđa mi se ovdje.
Dobio sam 100 na ovom jednom.
A onda sam dobio 99 na ovom jednom.
Onda ova memorija možda čak i ne mogu koristiti jer sam samo pitao
računalo za niz veličine dva.
Ti kvadrati su još uvijek tamo.
Točno?
Vi još uvijek imate dva gigabajta RAM-a, čak i ako ste samo
molba za dva kola.
Dakle, ideja iza polja je da računalo traje samo komad memorije
a zatim razdijeliti manjih komada natrag na leđa natrag na leđa.
I tako to je sve niz je.
To je granični komad memorije, unutar kojih možete staviti stvari.
>> Sada se to dogodi onda napraviti samo neki dosadan aritmetiku.
Ako sam dođite ovdje, ovo je mjesto gdje sam tada ponoviti preko polja.
Ja se s zbroja svih vrijednosti u polju.
I onda sam koristiti okrugli funkciju ovdje zapravo
Ukratko podijeljena kvizovima.
No, dopustite mi mahati moje ruke na to kao svojevrsno dovoljno aritmetike za sada.
No, sve što radi za mene konačnici je računanje prosjeka.
Tako je prvi kviz plus drugi kviz, podijeljena dva, a zatim ispis
to je kao int.
>> Ali neka je sada prijelaz na drugi primjer zove string1,
koji oslikava sličnu sliku, ali pomoću žice.
Pusti me naprijed i pojednostaviti to samo na trenutak.
I oprosti uvlačenje za sada.
Obavijest u skladu 19. ovoga primjer, ja dobiti niz od korisnika.
No, ono što sam primijetio pored radim u redovima 22 naprijed.
Ja sam zapravo Ponavljanje iz i do - i to je novi trik -
strlen, dužina niza.
To je funkcija koja dolazi s C da ako prođe ga niz, što govori
vi koliko su likovi u tom nizu.
To je sve.
Činjenica da je strlen umjesto niza duljine je samo zato što je
više sažet.
Prije 30 godina, ljudi volio pisati stvari kao jezgrovito moguće.
Tako smo zadržao tu konvenciju ovdje.
i + + samo znači da sam povećavati u svakoj iteraciji.
I sada primijetiti, što je jako zanimljivo.
Dakle, u skladu 24, kažem računalo, daj mi znak, osam
bita, i to nazvati c.
No, ono što je ovaj na desnoj strani govori?
U engleskom jeziku, što znači da predstavljaju?
[Nečujan]
David J. MALAN: Točno.
Daj mi prvi znak u nizu.
Ili općenito, daj mi i-ti znak u polju.
I shvatiti da je važno da sada kao računalnih znanstvenika, mi smo zapravo
računajući od 0.
Vi nemate diskrecije sada početi raditi ovo.
Sada imate da se ponašaju u skladu s računalom očekivanjima i
brojati od nule, jer [0] će biti prvi
lik u nizu.
[1] će biti drugi.
[2] će biti treći, i tako dalje.
Dakle, ovaj program, ako sam ga sastaviti - to je, opet, string1.
>> Tako bi string1.
I sada sam pokrenuti string1 u mom prozor terminala.
To je čekao ulaz, tako da ću upisati, recimo, Davida.
Upišite.
A sada ga ispisuje David svi na različitim linijama, jer
primijetiti ono što radim.
Ja sam ispis jednog znaka na vrijeme.
Sada nećemo ići u detalje o tome danas.
Ali Izbrisao sam trenutak prije ove provjere ovdje.
Ispada da ako korisnik ispravno, suparnički, ili samo
zbunjen, što zapravo može uspjeti dati niz neke dužine.
Ako pogodak pogrešnu tipku na tipkovnici, što može dati
ne string uopće.
Ili ako ste zlonamjerni, možete pokušati zalijepiti u gigabajt vrijedi od
esej ispuniti ovaj niz.
A ako računalo ponestane memorije, ispada da idemo
da se vratim ovu posebnu vrijednost zove null.
Dakle, za sada, samo znam da je ovo posebna vrijednost zove nulta da
će nam omogućiti da provjerite kada smo iz memorije, između ostalog.
>> Ali, ako sam otvoriti sada string2, primijetit jedan razliku ovdje.
Obavijest jedna razlika ovdje s string2.
S string2, to za petlje je malo drugačija.
Dopustite mi izbrisati ugašenih, tako da možemo govoriti o onima drugi put.
No, ono što je drugačije u for petlji ovaj put?
I mogu se vratiti na prethodni primjer.
Tako da je verzija dva.
Ova je verzija jednog.
Jedan, dva, jedan dva.
Dakle, strlen poziv je gdje?
To je u prvom dijelu za petlju.
Bilo misli o tome zašto radim ovo?
Da.
[Nečujan]
David J. MALAN: Dakle, mi ne poziva funkcija svaki put.
Točno.
Podsjetimo iz petlje za koje su oni super jednostavna nakon što vrsta
Razumijem da je to inicijalizacija,
stanje, a ažuriranje.
Problem je u tome što se događa stanje na svaki
iteracija petlje.
I tako u ovom primjeru ovdje, ono što je loše o činjenici
da je ovo moje stanje?
Vi zovete strlen opet i opet i opet.
Ali jednom sam upisali u DAVID, duljina tog niza je pet.
I to se neće promijeniti na svakom iteracija petlje jer
niz je još D-A-V-I-D. Dakle, ovo je naznaka na ono što će postati
sve važnija ideja poznat kao dizajna odluke, gdje je - samo ne
napraviti računalo učiniti nepotreban posao.
>> Sada samo kao doušnik pregled pset 2, pset 2 u standardnom izdanju je
će vam izazov da se zapravo provesti neki broj šifre, neke
broj algoritme šifriranja, tako da možete i šifriranje i dešifriranje
tajne poruke, baš kao i jedan Ralphie postoji dekodirati.
U hakerske izdanju pset 2, idemo ići malo dalje.
Mi ćemo predati vam datoteku iz stvarnog računalnog sustava koji sadrži
cijela hrpa korisničkih imena i lozinki stvarnih šifrirane i izazov
za haker izdanje će biti ispucati one lozinke i slici
od čega kriptografske ili ono što je tajna koristi da se zapravo
generirati one lozinke.
A mi ćemo to učiniti pomoću novu značajku ovdje o C da ću dati
samo demo, poznat kao naredbenog retka argumente.
>> Tako ispada, kao što neki od vas možda vidio u dijelu ili u udžbenicima,
Glavna ne mora uvijek biti nevažeće u zagradama.
Ispada da glavna također može pisati ovako, s dva argumenta,
argc i argv, gdje argc je broj riječi koje upišete nakon
programski ime na naredbenog retka.
I argv je stvarni riječi.
I kao uglatim zagradama tamo sugeriraju, argv je očito polje.
To će biti niz nakon niza nakon niza u sjećanju.
Dakle, ono što ćemo biti u mogućnosti to učiniti, počevši s pset 2, je
nešto kao što je ovaj.
Ako sam napraviti argv1, koji je primjer vratit ćemo se u ponedjeljak, i pokrenuti
to, primijetiti da to ne čini ništa učiniti još.
To samo ispisuje svoje ime.
Ali ako kažem zbogom klase, obavijest da je ovaj program očito ponovi
tijekom svake od riječi koje su upisali u redak.
A način na koji ćemo dobiti pristup riječi koje korisnik ima
upisali na brz je promjenom glavni, počevši od ovog vikenda, od int
glavni (void) na int main (argc, argv).
I tako će biti rođen argumente naredbenog retka.
I jednom kada se stvarno sofisticiran na to, vi ćete biti u mogućnosti pisati
stvarno trippy programi, kao što je ovaj jedan ovdje, koja ide iznad i izvan
neke od funkcionalnosti koje smo učinili do sada, ali sve vrlo moćan.
>> Dakle, ostavit ćemo to s tim na zaslonu.
A mi ćemo vas vidjeti u ponedjeljak.