[Powered by Google Translate] [Recenzija] [Kviz 0]
>> [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Josip Ong] [Sveučilište Harvard]
>> [Ovo je CS50.] [CS50.TV]
>> Hej, svatko.
Dobro došli na pregled sjednice za kviz 0, koji se održava u srijedu.
Što ćemo učiniti večeras, ja sam s tri druga TFS,
i zajedno ćemo proći kroz pregled onoga što smo učinili u tijeku do sada.
To neće biti 100% sveobuhvatan, ali to bi trebao dati bolju ideju
od onoga što već imate dolje i ono što još treba proučiti prije srijede.
I slobodno podići ruku s pitanjima kao što ćemo zajedno,
ali imajte na umu da također ćemo imati malo vremena na kraju-
ako prođemo s nekoliko minuta da slobodno učiniti opća pitanja,
pa imajte to na umu, i tako ćemo početi početkom tjedna s 0.
>> [Kviz 0 pregled!] [Dio 0] [Lexi Ross] Ali prije nego što nam je činiti da pričajmo o
logistika u kvizu.
>> [Logistika] [Kviz se odvija u srijedu 10/10 u zamjenu za predavanje]
>> [(Vidi http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf za detalje)] To je na srijeda, 10. listopada.
>> To je ove srijede, a ako idete na ovaj URL ovdje,
koji je također dostupan s CS50.net-tu je link na njega-
možete vidjeti informacije o tome gdje ići na temelju
Vaše prezime ili škola pripadnosti, kao i
to govori o točno što kviz će pokriti i vrste pitanja koja ste idući u dobiti.
Imajte na umu da ćete također imati priliku za pregled za kviz u odjeljku,
tako da TFS treba ide preko nekih problema praksi,
i to je još jedna dobra prilika za vidjeti gdje se još uvijek treba učiti za kviz.
Počnimo na početku s komadićima 'n' Bytes.
Sjeti se malo je samo 0 ili 1,
a bajt je skup od 8 tih bitova.
Pogledajmo ove zbirke bitova ovdje.
Trebali bismo biti u mogućnosti shvatiti koliko bita postoje.
Gdje smo računati postoji samo osam od njih, osam 0 ili 1 jedinice.
A budući da je 8 bita, to je jedan byte,
i neka ga pretvoriti u heksadecimalni.
Heksadecimalni je baza 16, a to je prilično lako pretvoriti
broj u binarnom sustavu, što je što je to, na broj u heksadecimalnom.
Sve mi je gledamo grupe 4,
i mi smo ih pretvoriti u odgovarajući heksadecimalnom znamenkom.
Mi smo započeli s desne najviše skupini 4, tako da 0011.
To će biti jedan jedan i jedan dva, pa zajedno čini tri.
A onda pogledajmo druge bloka 4.
1101. To će biti jedan jedan, jedan 4, a jedan 8.
Zajedno da će biti 13, što čini D.
A mi ćemo se sjetiti da je u heksadecimalnom smo ne samo ići 0 do 9..
Idemo 0 do F, tako da nakon 9, 10 odgovara,
11. B, et cetera gdje je F 15.
Ovdje 13 je D,
tako da pretvoriti ga u decimalni sve što radimo je zapravo
liječiti svaku poziciju kao snage 2.
To je jedna 1, jedan dva, nula 4s, nula 8s, jedan 16, et cetera,
i to je malo teško izračunati u glavi, ali ako ćemo ići na sljedeći slajd
možemo vidjeti odgovor na to pitanje.
>> U suštini idemo preko pravo vratiti na lijevoj strani,
i mi smo množenjem svake znamenke s odgovarajućim moći dva.
I zapamtite, za heksadecimalnom smo označavaju ove brojeve s 0x na početku
tako da mi to ne brkati s decimalnim brojem.
Nastavljajući dalje, to je ASCII tablica,
i ono što ćemo koristiti ASCII je da će karta iz znakova na brojčane vrijednosti.
Sjetite u kriptografiji pset smo napravili veliku korištenje ASCII tablici
kako bi se koristiti različite metode kriptografije,
Caesar i Vigenère šifra, pretvoriti različite slova
u nizu prema ključu danom od strane korisnika.
Pogledajmo malo ASCII matematici.
Gledajući na 'P' + 1, u znak obliku koji će biti P,
i sjetite se da '5 '≠ 5.
A kako bi točno smo pretvoriti između tih dvaju oblika?
To je zapravo nije previše teško.
Da bi dobili 5 oduzmemo '0 '
jer postoji pet mjesta između '0 'i '5'.
Kako bi se ići na drugi način samo smo dodali 0,
pa to je nešto kao redoviti aritmetike.
Samo zapamtite da kada nešto ima citati oko njega to je znak
i tako se odnosi na vrijednost u ASCII tablice.
Preseljenje u više opće informatike temama.
Naučili smo što je algoritam i koliko mi koristimo programiranje
implementirati algoritme.
Neki primjeri algoritama su nešto stvarno jednostavan kao
provjere da li je broj čak i čudno.
Za to smo se sjetiti mod broj po dvije i provjerite je li rezultat je 0.
Ako je tako, to je čak. Ako ne, to je čudno.
I to je primjer zaista osnovni algoritam.
>> Malo više uključeni jedan je binarno pretraživanje,
koje ćemo ići preko kasnije u žalbenom sjednici.
I programiranje je pojam koji koristimo za uzimanje algoritam
i pretvoriti ga kodirati računalo može pročitati.
2 primjeri programiranja je Scratch,
što je ono što smo učinili u tjednu 0.
Iako mi zapravo ne tip iz kôd je način provedbe
ovaj algoritam, koji se ispisuje brojeve 1-10,
i ovdje mi učiniti isto u jeziku C programiranje.
To su funkcionalno ekvivalentne, samo napisan u različitim jezicima ili sintakse.
Mi smo tada naučili o Boolean izraza,
i boolean je vrijednost koja je ili istinita ili lažna,
i ovdje često boolean izraza
ući uvjeta, pa ako (x ≤ 5),
dobro, već smo postavili x = 5, tako da stanje ide na procjenu da vrijedi.
A ako je to istina, bez obzira na broj je ispod stanju
će se vrednovati po računalu, tako da niz će se ispisati
na standardni izlaz, i pojma stanju
odnosi se na ono što je unutar zagrada u ako izjavi.
Zapamtite sve operatore.
Zapamtite da je && i | | kada pokušavamo kombinirati dva ili više uvjeta,
== Ne = biste provjerili jesu li dvije stvari su jednake.
Sjetite se da je = za dodjelu dok == je boolean operator.
≤, ≥, a zatim konačnu dva su samorazumljivo.
Opći pregled Booleova logika ovdje.
I boolean izraza su također važni u petlji,
koje ćemo ići preko sada.
Naučili smo oko tri vrste petlji tako daleko u CS50, za, dok je, i to dok.
I to je važno znati da, dok za većinu svrhe
zapravo možemo koristiti bilo koju vrstu petlje općenito
postoje određene vrste svrhe ili zajedničkih uzoraka
u programiranju koji su posebno poziv za jedan od tih petlji
da bi ga najučinkovitiji ili elegantne ga kodirati na taj način.
Idemo na ono što svaki od tih petlji tendenciju da se koristiti za najčešće.
>> U for petlji smo uglavnom već znate koliko puta želimo ponoviti.
To je ono što smo stavili u stanju.
Jer, i = 0, i <10, na primjer.
Mi već znamo da želimo učiniti nešto 10 puta.
Sada, za while petlje, općenito mi ne nužno
znam koliko puta želimo se petlja pokrenuti.
Ali znamo nekakvu uvjetom da želimo da
uvijek biti istinita ili lažna uvijek biti.
Na primjer, dok je postavljen.
Recimo da je boolean varijablu.
Iako je istina da želimo kod ocijeniti,
pa malo više rastezljiva, malo više općenito nego za petlje,
ali bilo za petlje također može pretvoriti u while petlji.
Konačno, učiniti dok petlje, koja može biti najzahtjevnijim shvatiti odmah,
često se koristi kada želimo procijeniti kôd prvi
prije prvi put smo provjeriti stanje.
Zajedničko korištenje slučaj za napraviti, a petlja
kada želite dobiti korisničkog unosa, a vi znate što želite pitati korisnika
za ulaz barem jednom, ali ako oni ne daju vam dobar ulaz odmah
želite zadržati moleći ih dok oni vam dati dobar ulaz.
To je najčešći korištenje ne while petlja,
i pogledajmo stvarnoj strukturi tih petlji.
Oni obično uvijek imaju tendenciju da slijedite ove obrasce.
>> Na za petlju unutar imate tri komponente:
inicijalizacija, obično nešto poput int i = 0 gdje je i brojač,
stanje, u kojem želimo reći pokrenuti ovo za petlju dok ovo stanje još uvijek drži,
Kao što sam <10, i onda konačno, ažuriranja, što je kako smo povećavati
brojač varijabla u svakoj točki u petlji.
Uobičajena stvar vidjeti postoji samo i + +,
što znači da sam povećavati po 1 svaki put.
Također bi mogao učiniti nešto slično i + = 2,
što znači dodati dvije do i svaki put kada ide kroz petlju.
I onda je to samo odnosi na bilo koda koji zapravo radi kao dio petlje.
A za while petlji, ovaj put smo zapravo imaju inicijalizacije izvan petlje,
tako da za primjer, recimo da mi pokušavamo učiniti istu vrstu petlje kao što sam upravo opisao.
Mi bismo rekli int i = 0 prije petlje počinje.
Tada bismo mogli reći dok ja <10 to učinili,
tako da se isti blok koda kao i prije,
i ovaj put ažuriranje dio koda, na primjer, i + +,
zapravo ide unutar petlje.
I na kraju, za to vrijeme, to je slično while petlje,
ali moramo se sjetiti da je kod će ocijeniti jednom
prije nego je uvjet provjeren, tako da to čini puno više smisla
ako pogledate to u redu vrha do dna.
U učiniti dok petlja kod ocjenjuje prije nego što čak i pogled na while uvjet,
a while petlji provjerava prvi.
Izjave i varijable.
Kada želimo stvoriti novu varijablu smo prvi put ga želite inicijalizirati.
>> Na primjer, int bar inicijalizira varijable bar,
ali to ne dati mu vrijednost, tako što je bara vrijednost sada?
Mi ne znamo.
To bi mogao biti neki smeća vrijednost koja je prethodno pohranjen u memoriji postoji,
i ne želimo koristiti tu varijablu
dok mi zapravo dati mu vrijednost,
pa smo ga proglasiti ovdje.
Onda smo inicijalizirati da bude 42 u nastavku.
Sada, naravno, znamo da to može biti učinjeno na jednoj liniji, int bar = 42.
Ali samo da se jasno više koraka koji se događa,
deklaracija i inicijalizacija se događa odvojeno ovdje.
To se događa na jednom koraku, a sljedeći, int baz = bar + 1,
ova izjava u nastavku, koji se povećava baz, tako da na kraju ovog bloka koda
ako smo ispisali vrijednost Baz da će to biti 44
jer smo proglasiti i inicijalizirati biti jedan> bara,
i onda smo ga povećavati još jednom s + +.
Išli smo preko ovog lijepog kratko, ali to je dobro imati opće
razumijevanje onoga što teme i događaji su.
Mi uglavnom je to učinio u nule,
tako da se možete sjetiti niti kao više sekvenci koda
prikazivati ​​u isto vrijeme.
U stvarnosti, to vjerojatno ne radi u isto vrijeme,
ali vrsta apstraktno možemo razmišljati o tome na taj način.
>> U Scratch, na primjer, imali smo više sprites.
To bi mogao biti drugačiji kod izvršenja u isto vrijeme.
Moglo bi biti hodanje dok je drugi nešto kaže
u drugom dijelu na zaslonu.
Događaji su još jedan način izdvajanjem logiku
između različitih elemenata kodu,
i ispočetka bili smo u mogućnosti da simuliraju događaje pomoću emitiranje,
i to je zapravo Kada sam primite, ne kad čujem,
ali u suštini to je način za prijenos informacija
iz jedne u drugu sprite.
Na primjer, možda ćete htjeti prenositi utakmicu više,
i kada je drugi vilenjak prima igra više,
ona reagira na određeni način.
To je važno razumjeti model za programiranje.
Samo da ide preko osnovnog tjednu 0, što smo otišli na tako daleko,
pogledajmo ovaj jednostavan C program.
Tekst može biti malo mali od ovdje, ali ja ću ići preko njega jako brzo.
Mi smo, uključujući dvije zaglavlja datoteke na vrhu, cs50.h i stdio.h.
Mi smo tada se definiraju stalno zove ograničenje biti 100.
Mi smo tada ste provedbi našu glavnu funkciju.
Budući da ne koristite argumente naredbenog retka ovdje moramo staviti prazninu
kao argumente za glavni.
Vidimo int iznad glavni. To je povratni tip, pa se vratiti 0 na dnu.
I mi smo pomoću CS50 knjižnice funkciju dobiti int
pitati korisnika za ulaz, a mi smo ga spremiti u ovoj varijablu x,
pa smo proglasiti x gore, a mi smo ga inicijalizirati sa x = GetInt.
>> Mi smo tada provjerite da li je korisnik dao nam dobar ulaz.
Ako je ≥ GRANICA želimo vratiti pogreške kod jednog i ispisati poruku o pogrešci.
I na kraju, ako korisnik nam je dao dobar ulaz
idemo na trgu broj i ispisati taj rezultat.
Samo kako bi bili sigurni da su oni svi pogodak dom
možete vidjeti etikete različitih dijelova koda ovdje.
Spomenuo sam konstantne, zaglavlje datoteke.
Oh, int x. Pobrinite se sjetiti da je lokalna varijabla.
To je u suprotnosti s globalnom varijablom, što ćemo govoriti o
Malo kasnije u žalbenom sjednici,
i mi smo pozivom knjižnice funkciju printf,
pa ako nismo uključeni stdio.h header datoteku
ne bismo mogli nazvati printf.
I ja vjerujem da je strelica dobio odsječen ovdje se ukazuje na% d,
što je oblikovanje niz u printf.
Ona kaže isprintati ovu varijablu kao broj,% d.
I to je to za tjedan 0.
Sada Lucas se ide dalje.
Hej, dečki. Moje ime je Lucas.
Ja sam student u najboljem kući na kampusu, Mather,
i ja ću razgovarati malo o tjednu 1 i 2,1.
[Tjedan 1 i 2,1!] [Lucas Freitas]
Kao Lexi je rekao, kada smo počeli prevođenju koda od nule u C
jedna od stvari koje smo primijetili je da ne možete samo
pisati svoj kod i pokrenuti ga koristite zelenu zastavu više.
Zapravo, morate koristiti neke korake kako bi vaš C program
postala izvršna datoteka.
Uglavnom ono što učiniti kada pišete program je da
li prevesti svoju ideju na jeziku koji kompajler može razumjeti,
pa kad pišete program u C
što radiš zapravo piše nešto da je vaš kompajler će razumjeti,
i onda prevodilac će prevesti taj kod
u nešto što će vaše računalo razumije.
>> A stvar je, vaše računalo je zapravo vrlo glup.
Računalo se samo mogu razumjeti 0s i 1s,
tako da je zapravo u prvim računalima ljudi obično programiran
pomoću 0s i 1s, ali ne više, hvala Bogu.
Mi ne moramo pamtiti sekvence za 0S i 1S
za for petlje ili za while petlje i tako dalje.
To je razlog zašto smo prevodilac.
Što prevodilac čini se da u osnovi prevodi C koda,
u našem slučaju, na jeziku koji će vaše računalo razumije,
koja je predmet kod, a kompajler da smo pomoću
zove se jeka, tako da je ovo zapravo simbol za zveka.
Kad imate svoj program, morate učiniti dvije stvari.
Prvo, morate sastaviti svoj program, a zatim ćete pokrenuti vaš program.
Za sastaviti svoj program imate puno mogućnosti da to učini.
Prvi je to učiniti zveka program.c
u kojem programu je ime svog programa.
U tom slučaju možete vidjeti oni su samo govoreći: "Hej, sastaviti svoj program."
Vi ne govorite "Želim taj naziv za svoj program" ili ništa.
>> Druga opcija je davanje imena na svoj program.
Možete reći zveka-o i onda ime koje želite
izvršnu datoteku da se zove kao i onda program.c.
A također možete napraviti napraviti program, i vidjeti kako je u prvih dvaju slučajeva
Stavio sam. C, au trećem sam samo programe?
Da, zapravo ne bi trebalo staviti. C kada koristite napraviti.
Inače prevodilac zapravo događa vikati na tebe.
A isto tako, ne znam, ako vi ne zaboravite,
ali puno puta mi se također koristi-lcs50 ili-lm.
To se zove povezivanja.
To samo govori prevodilac koje ćete koristiti one knjižnice tamo,
pa ako želite koristiti cs50.h zapravo morati upisati
jeka program.c-lcs50.
Ako to ne učinite, prevodilac se neće znati
koristite li one funkcije u cs50.h.
I kada želite pokrenuti vaš program imate dvije opcije.
Ako je zveka program.c niste dati ime svom programu.
Morate ga pokrenuti korištenjem. / A.out.
A.out je standardni ime koje zveka daje svoj program, ako ne dati mu ime.
Inače ćeš učiniti. / Programa ako je dao ime svom programu,
i ako je napraviti program za ime koje program će se
već će se programirati isto ime kao c datoteku.
Zatim smo razgovarali o tipovima podataka i podataka.
>> Uglavnom tipovi podataka su ista stvar kao male kutijice koje koriste
za pohranu vrijednosti, tako da tipovi podataka su zapravo samo kao Pokemon.
Oni dolaze u svim veličinama i vrstama.
Ja ne znam da li analogija smisla.
Podaci veličina zapravo ovisi o stroju arhitekture.
Svi podaci veličine da ću pokazati ovdje
zapravo su za 32-bitni stroj, što je slučaj našeg aparata,
ali ako ste zapravo kodiranja svoj Mac ili u Windowsima također
Vjerojatno ćeš imati 64-bitni stroj,
pa ne zaboravite da su podaci veličine da ću pokazati ovdje
su za 32-bitni stroj.
Prvi onaj koji smo vidjeli je int,
što je prilično jednostavan.
Možete koristiti int pohraniti cijeli broj.
Također smo vidjeli karakter, char.
Ako želite koristiti slovo ili simbol malo ste vjerojatno će koristiti char.
Char ima 1 bajt, što znači 8 bita, kao Lexi, rekao je.
Uglavnom imamo ASCII tablicu koja ima 256
moguće kombinacije 0S i 1s,
i onda kad upišete char to će prevesti
lik koji ulazi ste broj koji imate u ASCII tablici, kao Lexi, rekao je.
Također imamo plovak, koje ćemo koristiti za pohranjivanje decimalnih brojeva.
Ako želite izabrati 3,14, na primjer, idete na korištenje plovak
ili dvaput da ima više preciznosti.
Plovak ima 4 bajta.
Bračni ima 8 bajtova, pa je jedina razlika je preciznost.
Također smo dugo da se koristi za integers,
i možete vidjeti za 32-bitni stroj int i dugo imati istu veličinu,
tako da se to zapravo ne smisla koristiti dugo u 32-bitnom stroju.
>> Ali ako koristite Mac i 64-bitni stroj, zapravo dugo je veličine 8,
tako da stvarno ovisi o arhitekturi.
Za 32-bitni stroj to ne bi imalo smisla koristiti dugo stvarno.
A onda dugo dugo, s druge strane, ima 8 bajtova,
tako da je vrlo dobra, ako želite imati više cijeli.
I na kraju, imamo niz, što je zapravo char *,
koji je pokazivač na char.
To je vrlo jednostavno mislim da je veličina niza će biti poput
broj znakova da ste tamo,
ali zapravo char * sama
ima veličinu od pokazivač na char, koji je 4 bajta.
Veličina je char * je 4 bajta.
Nije bitno ako imate malu riječ ili slovo ili ništa.
To će biti 4 bajta.
Također smo naučili nešto o lijevanje,
pa kao što možete vidjeti, ako imate, na primjer, program koji kaže
int x = 3, a zatim printf ("% d", x / 2)
Imate li vi znate što će to ispisati na ekranu?
>> Netko? >> [Studenti] 2.
1. >> 1, Da.
Kada to učinite 3/2 to će dobiti 1,5,
ali budući da smo koristeći cijeli će to ignorirati decimalni dio,
i ti ćeš imati jedan.
Ako ne želite da se to dogodi što možete učiniti, primjerice,
se proglasiti plovak y = x.
Onda x koji se koriste da se 3 sada će biti 3,000 uy.
I onda možete ispisati y / 2.
Zapravo, ja bi trebao imati dva. tamo.
To će učiniti 3.00/2.00,
i ti si idući u dobiti 1,5.
I mi imamo ovu 0,2 f samo pitati za dva decimalna jedinica u decimalnom dijelu.
Ako imate 0,3 f to će imati zapravo 1,500.
Ako je to dvoje to će biti 1,50.
Također imamo ovaj slučaj ovdje.
Ako to ne učinite plovak x = 3,14 i onda vi printf x
ćete dobiti 3,14.
A ako to ne učinite x = int X,
što znači liječiti x kao int i ispisati x sada
ćeš imati 3,00.
Ima li to smisla?
Zato vas prvi liječenju x kao cijeli broj, tako da ste ignoriranje decimalni dio,
i onda ste tiskanje x.
I na kraju, možete to učiniti,
int x = 65, a zatim proglasiti char c = x,
i onda ako ispisati c ste zapravo ide da biste dobili
, Tako da u osnovi ono što radite ovdje
je prevodio cijeli u karakteru,
baš kao ASCII tablica radi.
Također smo razgovarali o matematičkim operatorima.
Većina od njih su prilično jednostavan, tako +, -, *, /,
i također smo razgovarali o mod, koji je ostatak podjele dva broja.
Ako imate 10% 3, na primjer,
to znači podijeliti 10 do 3, a ono što je ostatak?
To će biti jedan, tako da je zapravo vrlo korisno za puno programa.
Za Vigenère i Cezara sam prilično siguran da svi od vas koristi mod.
O matematici operatorima, biti vrlo oprezni kada kombiniranjem * i /.
>> Na primjer, ako učinite (3/2) * 2 što ćete dobiti?
[Studenti] 2.
Da, 2, jer je 3/2 će biti 1,5,
ali budući da radite poslovanje između dviju cjelobrojnih
ste zapravo samo će razmotriti jedan,
, a zatim 1 * 2 će biti 2, tako da se vrlo, vrlo oprezni
kad radiš aritmetiku s brojeva jer
možda ćete dobiti da 2 = 3, u tom slučaju.
I također biti vrlo oprezni o prvenstva.
Obično bi trebao koristiti zagrade kako bi bili sigurni da znate što radite.
Neki korisni prečaci, naravno, jedan je ja + + ili ja + = 1
ili pomoću + =.
To je ista stvar kao i radiš i = i + 1.
Također mogu učiniti - ili ja - = 1,
što je ista stvar kao i = i -1,
nešto vi koristite puno u za petlje, barem.
Također, za *, ako koristite * = a ako to ne učinite, na primjer,
ja * = 2 je ista stvar kao govoreći i = i * 2,
i ista stvar za podjelu.
Ako to ne učinite i / = 2 to je ista stvar kao i = i / 2.
>> Sada o funkcijama.
Vi saznao da su funkcije vrlo dobra strategija za spremanje koda
dok ste programiranje, pa ako želite da obavljaju isti zadatak
u kodu i opet, vjerojatno želite koristiti funkciju
samo tako da ne morate kopirati i zalijepiti kôd iznova i iznova.
Zapravo, glavna je funkcija, a kad sam vam pokazati format funkciji
ćeš vidjeti da je to prilično očito.
Mi također koristiti funkcije iz neke knjižnice,
na primjer, printf, GetIn, koji je od CS50 knjižnice,
i druge funkcije kao što su toupper.
Sve one funkcije zapravo se provode u drugim knjižnicama,
i kada ste stavili one tether datoteke u početku svog programa
pričaš možete molim vas dajte mi kod za tih funkcija
pa nemam ih provesti po sebi?
A također možete napisati svoje vlastite funkcije, tako kada počnete programiranje
shvatit ćete da knjižnice nemaju sve funkcije koje vam je potrebno.
Za posljednjeg pset, na primjer, napisali smo izvući, otimati i pregledna,
i to je vrlo, vrlo važno biti u stanju napisati funkcije
jer oni su korisni, a mi ih koristiti sve vrijeme u programiranju,
i to štedi puno koda.
Oblik funkcije je ovo jedan.
Imamo povratnu tip u početku. Što je povratni tip?
To je samo kad je funkcija će vratiti.
Ako imate neku funkciju, na primjer, faktorski,
koji će se izračunati faktorijel cijeli broj,
Vjerojatno će to vratiti integer također.
Tada je povratni tip će biti int.
Printf zapravo ima prazninu povratni tip
jer niste vraća ništa.
Vi samo tiskanje stvari na zaslonu
i odvikavanje funkciju nakon toga.
Tada imate naziv funkcije koje možete izabrati.
Trebali bi biti malo razuman, kao što ne odabrati ime kao xyz
ili kao x2f.
Pokušajte čine ime koje ima smisla.
>> Na primjer, ako je faktorijel, reći faktorijel.
Ako je funkcija koja će izvući nešto, ime je privući.
I onda imamo parametre, koji se također zove argumenti,
koji su poput sredstava da funkcija treba
iz kôda obavljati svoju zadaću.
Ako želite izračunati faktorijel broja
vjerojatno trebate imati broj izračunati faktorijel.
Jedan od argumenata da idete da je broj sama.
I onda se događa nešto učiniti i vratiti vrijednost na kraju
osim ako je to praznina funkcija.
Pogledajmo jedan primjer.
Ako želim napisati funkciju koja sažima sve brojeve u niz brojeva,
prije svega, povratak tip će biti int
jer imam niz brojeva.
I onda ću imati funkcije imena poput sumArray,
i onda će se niz sama, na int nums,
i onda je duljina niza tako da znam koliko brojevi moram zbrojiti.
Onda moram inicijalizirati varijablu nazvanu iznos, na primjer, za 0,
i svaki put vidim element u polju sam trebao dodati svemu, tako da sam učinio za petlju.
Baš kao Lexi rekao, ti int i = 0, i <duljina i ja + +.
A za svaki element u polju sam zbroj + = nums [i],
i onda sam se vratio iznos, tako da je vrlo jednostavan, a to štedi puno koda
ako koristite ovu funkciju mnogo puta.
Tada mi je uzeo pogledati uvjetima.
Imamo li, inače, i drugo, ako.
Hajdemo vidjeti što je razlika između njih.
Bacite pogled na ove dvije kodova. Koja je razlika između njih?
Prvi je, u osnovi, šifre želim reći
ako je broj +, -, ili 0.
Prva kaže da ako je> 0 onda je pozitivno.
Ako je = 0 do tada je 0, a ako je <0 tada je negativna.
>> A drugi je taj ako, drugo ako drugdje.
Razlika između dva je da je ovo jedan zapravo ide
provjerite je li> 0, <0 ili = 0 tri puta,
pa ako imate broj 2, na primjer, da će doći ovdje i reći
if (x> 0), a to će reći da, tako sam ispisati pozitivno.
No, iako znam da je> 0 i to ne će biti 0 ili <0
Ja još uvijek idem napraviti je 0, to je <0,
tako da sam zapravo idem unutar oklijevanja da nisam imao na
jer sam već znamo da to ne ide kako bi zadovoljio bilo koji od ovih uvjeta.
Ja mogu koristiti ako drugi ako drugi izjavu.
To je u osnovi kaže da ako je x = 0 ja ispisali pozitivno.
Ako to nije, ja ću također testirati.
Ako to dvoje ne idem to učiniti.
Uglavnom, ako sam imao x = 2 što će reći
if (x> 0), da, tako ispiši.
Sada znam da je> 0 i da je zadovoljan prvi ako
Nisam čak će pokrenuti ovaj kod.
Kod teče brže, zapravo, tri puta brže ako koristite to.
Također smo naučili o i i ili.
Neću ići kroz to, jer Lexi već razgovarali o njima.
To je samo && i | | operatora.
>> Jedino ću reći da je biti oprezan kada imate tri uvjeta.
Koristite zagrade, jer to je vrlo zbunjujuće kada imate stanje
i još jedan ili drugi.
Koristite zagrade samo da bi bili sigurni da su Vaši uvjeti smisla
jer u tom slučaju, na primjer, možete zamisliti da
to može biti prvi uvjet i jedan ili drugi
ili dvije uvjeti u kombinaciji i
ili treći, pa samo budite oprezni.
I konačno, razgovarali smo o prekidača.
Prekidač je vrlo korisno kada imate varijablu.
Recimo da imate varijablu kao n
koji može biti 0, 1, ili 2, a za svaki od tih slučajeva
ti si idući u obaviti zadatak.
Možete reći prebaciti varijablu, a to ukazuje na to da
vrijednost onda je kao vrijednost1 ću to učiniti,
i onda sam razbiti, što znači da ne idem gledati na bilo koju od ostalih slučajeva
jer smo već zadovoljni taj slučaj
i onda vrijednost2 i tako dalje, i ja također mogu imati prekidač zadani.
To znači da ako to ne zadovoljava bilo slučajeva da sam imao
da ću raditi nešto drugo, ali to je opcionalno.
To je sve za mene. Sada ćemo imati Tommy.
U redu, ovo će biti tjedan 3-ish.
Ovo su neke od tema koje će se pokrivaju, kripto, opseg polja, et cetera.
Samo brzi riječ o Crypto. Nećemo čekić ovaj dom.
>> Učinili smo to u pset dva, ali za kviz pobrinite se da znate razliku
između Caesar šifra i Vigenère šifrirane,
kako i od onih šifre posla i što ga je kao da šifriranje
i dešifriranje teksta pomoću one dvije šifre.
Podsjetimo, Cezarova šifra jednostavno rotira svaki lik za isti iznos,
pazeći da MORH po broju slova u abecedi.
I Vigenère šifra, s druge strane, rotira svaki lik
različitom iznosu, pa umjesto da govori
Svaki lik rotirati po tri Vigenère izmjenjivat će svaki lik
različitom iznosu, ovisno o nekoj ključnoj riječi
gdje svako slovo u ključnu riječ predstavlja neki drugi iznos
rotirati jasan tekst.
Idemo prvi razgovor o promjenjivom opsegu.
Postoje dvije različite vrste varijabli.
Imamo lokalne varijable, a to će se definirati
izvan glavne ili izvan bilo funkciji ili bloku,
a to će biti dostupna bilo gdje u svom programu.
Ako imate neku funkciju, a tu funkciju je while petlja
velika globalna varijabla je dostupna svugdje.
Lokalna promjenljiva, s druge strane, je opfateno na mjesto gdje je definirano.
>> Ako imate funkciju ovdje, na primjer, imamo ovu funkciju g,
i unutar g je varijabla ovdje zove y,
a to znači da je to lokalna varijabla.
Iako je ova varijabla naziva y
i to se zove varijabla y ove dvije funkcije
nemam pojma što svaki drugi je lokalni varijable su.
S druge strane, ovdje govorimo int x = 5,
a to je izvan opsega bilo funkciju.
To je izvan opsega glavna, tako da je ovo globalna varijabla.
To znači da unutar tih dviju funkcija kad kažem x - ili x + +
Ja sam pristupaju istom x čemu to y, a to y su različite varijable.
To je razlika između globalne varijable i lokalne varijable.
Što se tiče dizajna tiče, ponekad je vjerojatno bolja ideja
držati varijable lokalne god možete eventualno
budući da hrpa globalnih varijabli može dobiti stvarno zbunjujuće.
Ako imate hrpu funkcija sve mijenjanja istu stvar
možda zaboraviti što ako je ova funkcija slučajno modificira ovo globalno,
i ovaj drugi funkcija ne znaju o tome,
i to ne dobiti prilično zbunjujuće kao što ste dobili više koda.
Imajući varijable lokalne god možete eventualno
je samo dobar dizajn.
Polja, zapamtite, jednostavno su popisi elemenata istog tipa.
Unutar CI ne može imati popis kao jedan, 2,0, halo.
Mi jednostavno ne možemo to učiniti.
>> Kada smo proglasi niz u C sve elemente moraju biti istog tipa.
Ovdje imam niz tri integers.
Ovdje imam duljinu niza, ali ako ja sam samo to proglašenja u ovoj sintaksi
gdje sam navesti što sve od elemenata ne tehnički je potrebna ova tri.
Prevodilac je dovoljno pametan shvatiti koliko je velika polja bi trebala biti.
Sada kada želim dobiti ili postavite vrijednost niz
ovo je sintaksa za to.
To će zapravo mijenjati drugi element niza, jer, ne zaboravite,
Numeracija počinje na 0, a ne na jednoj.
Ako želim čitati tu vrijednost mogu reći nešto poput int x = array [1].
Ili ako želim postaviti tu vrijednost, kao što radim ovdje,
Ja mogu reći array [1] = 4.
To vrijeme pristupa elemente svog indeksa
ili njihov položaj ili gdje su u nizu,
i da popis počinje na 0.
Možemo također imaju polja od polja,
i to se zove multi-dimenzionalni niz.
Kada imamo multi-dimenzionalni niz
to znači da možemo imati nešto poput redaka i stupaca,
i to je samo jedan od načina vizualizacije ovo ili razmišljanja o tome.
Kad imam multidimenzionalnu niz to znači da ću početi siromaštvo
više od 1 indeks, jer ako imam mrežu
Jednostavno govoreći ono red ste u ne daje nam broj.
To je stvarno samo će nam dati popis brojeva.
Recimo ja imam ovaj niz ovdje.
Imam niz zove mrežu, a ja govorim to je dva reda i tri stupca,
pa to je jedan od načina da ga vizualizaciju.
Kad kažem želim da se element na [1] [2]
to znači da, jer su redovi a zatim kolumne
Ja ću skočiti na red jednom otkad sam rekao jednom.
>> Onda ću doći ovamo na stupcu 2, a ja ću doći vrijednosti šest.
Smisla?
Multi-dimenzionalni nizovi, zapamtite, tehnički su samo niz polja.
Mi možemo imati polja za polja u polja.
Možemo zadržati ide, ali stvarno jedan način razmišljati o
kako je to biti izložena i što se događa je da ga vizualizirati
u mreži kao što je ovaj.
Kada smo proći polja na funkcijama, oni će se ponašati
malo drugačije nego kada smo proći redovite varijabli funkcije
kao što prolazi jedan int ili plutaju.
Kada smo proći u int ili char ili bilo koji od ovih drugih podataka tipova
samo mi je uzeo pogledati ako funkcija mijenja
Vrijednost te varijable da promjena ne ide s propagandom naših gore
pozivatelju funkcije.
Uz niz, s druge strane, to će se dogoditi.
Ako sam proći u niz neke funkcije i da funkcija mijenja neki od elemenata,
kad dođem do funkcije da ga se zove
moja niz sada će biti drugačiji, a vokabular za to
je nizovi su prošli pozivanjem, kao što ćemo kasnije vidjeti.
To se odnosi na to kako pokazivače rada, gdje je ove osnovne vrste podataka,
S druge strane, prenose po vrijednosti.
>> Možemo misliti da je kao presnimavanje neke varijable, a zatim prolazi u kopiji.
Nije bitno ono što radimo s tom varijablom.
Zove funkcija neće biti svjesni da je to promijenilo.
Nizovi su samo malo drugačiji u tom pogledu.
Na primjer, kao što smo upravo vidjeli, glavna je jednostavno funkcija
koji se može uzeti u dva argumenta.
Prvi argument je glavna funkcija je argc, ili broj argumenata,
a drugi argument je pozvao argv,
i one su stvarne vrijednosti tih argumenata.
Recimo imam program pod nazivom this.c,
i ja reći da je ovo, a ja ću pokrenuti to na naredbenog retka.
Sada da prođe u nekim argumentima da moj program se zove ovaj,
Mogao bih reći nešto slično. / Ovo je cs 50.
To je ono što možemo zamisliti David učiniti svaki dan na terminalu.
No, sada je glavna funkcija unutar tog programa
ima tih vrijednosti, pa argc je 4.
To bi moglo biti malo zbunjujuće, jer stvarno mi samo ti prolazi u CS 50.
To je samo tri.
Ali zapamtite da je prvi element argv ili prvi argument
je naziv funkcije same.
Dakle, to znači da imamo 4 stvari ovdje,
a prvi element će biti. / ovo.
I to će biti predstavljeni kao niz.
Tada su preostali elementi su ono što smo upisali u nakon naziva programa.
Dakle, samo kao stranu, kao što smo vjerojatno vidjeli u pset 2,
sjetite se da je string 50. ≠ se prirodni 50.
Dakle, ne možemo reći nešto poput "int x = argv tri. '
>> To je jednostavno ne ide smisla, jer je to niz, a to je cijeli broj.
Dakle, ako želite pretvoriti između dva zapamtite, idemo
imaju tu čarobnu funkciju zvanu atoi.
To traje niz i vraća cijeli broj predstavlja unutar tog niza.
Tako da je lako napraviti pogrešku na kvizu,
samo razmišljam da je to automatski će biti točna vrsta.
No, samo znam da je to uvijek će biti nizovi
čak i ako je string sadrži samo cijeli broj ili karakter ili plutaju.
Dakle, sada ćemo govoriti o prikazivati ​​vrijeme.
Kada imamo sve te algoritme koji rade sve te lude stvari,
postaje jako korisno postaviti pitanje, "Kako dugo su se?"
Zastupnici smo da je s nečim što se zove asimptotski zapis.
Dakle, to znači da - dobro, recimo dajemo naš algoritam
neki stvarno, stvarno, stvarno veliki ulaz.
Želimo postaviti pitanje: "Kako dugo će to trajati?
Koliko koraka će ga odvesti našu algoritam za pokretanje
kao funkcija veličine ulaza? "
Dakle, prvi put možemo opisati pokrenuti vrijeme je sa velikim O.
I to je naš najgori slučaj trčanje vrijeme.
Dakle, ako želimo sortirati niz, i mi dati naš algoritam niz
to je u silaznom redoslijedu, kada bi trebao biti u uzlaznom redoslijedu,
to će biti najgori slučaj.
To je naša gornja granica u maksimalnoj dužini vremena naš algoritam će se.
S druge strane, ovo Ω će opisati najbolji slučaj, trčanje vremena.
Dakle, ako smo dati već sortiran niz na sortiranje algoritma,
koliko dugo će to trajati to sortirati?
A to, onda, opisuje donju granicu prikazivati ​​vrijeme.
Dakle, ovdje su samo neke riječi koje opisuju neke zajedničke pokrenute puta.
To su u uzlaznom redoslijedu.
Najbrže vrijeme rada imamo se zove konstantna.
>> To znači da bez obzira koliko elementi dajemo naš algoritam,
bez obzira koliko je velika naša polje je, to sortiranje
ili što god radimo na polju uvijek će se isti iznos od vrijeme.
Tako možemo izjavljujete da samo s jednom, što je konstanta.
Također smo gledali logaritamske vrijeme izvođenja.
Dakle, nešto poput binarnog pretraživanja je logaritamska,
gdje smo smanjiti problem na pola svaki put
i onda se stvari jednostavno dobiti veći od tamo.
A ako ste ikada pisanju O bilo faktorijalnim algoritma,
vjerojatno ne bi trebalo uzeti u obzir ovaj kao dan posao.
Kad usporedimo pokrenute puta važno je imati na umu ove stvari.
Dakle, ako sam algoritam koji je O (n), a netko drugi
je algoritam O (2n) to su zapravo asimptotski ekvivalent.
Dakle, ako možemo zamisliti n biti veliki broj kao eleventy milijardi:
pa kad smo uspoređujući eleventy milijarde na nešto poput eleventy milijardi + 3,
naglo 3 zapravo ne čine veliku razliku više.
Zato ćemo za početak s obzirom da se ove stvari biti jednaka.
So stvari poput tih konstanti ovdje, tamo je 2 x to, ili dodavanjem 3,
ovo su samo konstante, a to će pasti gore.
Dakle, to je razlog zašto sve tri od tih vožnji vremena su isti kao i govoreći da su O (n).
Isto tako, ako imamo dvije druge run puta, recimo O (n ³ + 2n ²), možemo dodati
+ N, + 7, a onda imamo još jedan run vremena to je samo O (n ³).
opet, to su ista stvar, jer to - to nisu isti.
To su iste stvari, žao mi je. Dakle, to su isti, jer
this n ³ će dominirati this 2n ².
>> Ono što nije ista stvar je ako smo pokrenuti puta kao O (n ³) i O (n ²)
jer je to n ³ je puno veći nego ove n ².
Dakle, ako imamo eksponentima, odjednom to počne važno,
ali kad smo tek bave čimbenicima kao što smo mi ovdje,
onda to neće bitno jer se ide samo ispadne.
Idemo pogledati neke od algoritama smo do sada vidjeli
i govoriti o njihovom radnom vremenu.
Prvi put u potrazi za brojem u popisu, koji smo vidjeli, bio linearan pretraživanje.
A provedba linearnog potrazi je super jednostavan.
Moramo samo popis, a mi ćemo gledati na svaki element u popisu
dok smo pronašli broj tražimo.
Dakle, to znači da je u najgorem slučaju, to O (n).
A najgore ovdje slučaj mogao biti, ako je element
zadnji element, a zatim pomoću linearne pretraživanje moramo gledati na svakog pojedinog elementa
dok ne dođemo do posljednjeg, kako bi znali da je to zapravo u popisu.
Ne možemo samo dati do pola puta i reći: "To je vjerojatno ne postoji."
S linearno pretraživanje moramo gledati na cijelu stvar.
Najbolji slučaja trčanje vrijeme, s druge strane, je konstanta
jer u najboljem slučaju element tražimo je samo prvi na popisu.
Dakle, to će nam trebati upravo jedan korak, bez obzira koliko je velik je popis
ako smo u potrazi za prvi element, svaki put.
>> Dakle, kada ste traženje zapamtite, to ne zahtijeva da naš popis biti riješeno.
Jer mi jednostavno idemo gledati preko svakog pojedinog elementa, a to uopće nije važno
što bi ti elementi su u.
Više inteligentni algoritam za pretraživanje je nešto poput binarnog pretraživanja.
Zapamtite, provedba binarnog pretraživanja je kad idete
držati obličje na sredini popisa.
I zato tražimo na sredini, tražimo da se popis sortira
inače ne znamo gdje je srednji je, a mi moramo gledati preko
cijeli popis da biste ga pronašli, a onda u tom trenutku mi smo samo gubljenje vremena.
Dakle, ako imamo sortirani popis i mi naći sredinu, idemo usporediti sredinu
na element tražimo.
Ako je prevelik, onda možemo zaboraviti desnu polovicu
jer znamo da ako je naš element je već previsoka
i sve na desnoj strani tog elementa je čak i veći,
onda mi ne trebamo gledati tamo više.
Gdje s druge strane, ako je naš element je preniska,
znamo sve na lijevoj strani tog elementa je također prenizak,
tako da se to zapravo ne smisla gledati tamo, bilo.
Na taj način, na svakom koraku i svaki put gledamo sredinu popisa,
idemo smanjiti naš problem na pola jer odjednom mi znamo
cijela hrpa brojeva koji ne može biti jedan tražimo.
>> U pseudocode bi to izgledati nešto kao što je ovaj,
i zato smo rezanja popisa u pola svaki put,
naši najgorem slučaju mali vremenski skokovi iz linearno na logaritamski.
Tako iznenada imamo log-u koracima kako bi se pronašli element u popisu.
Najbolji-slučaj trčanje vrijeme, iako je još uvijek konstantna
jer sada, neka je samo reći da je element tražimo je
Uvijek je točno sredina na izvornom popisu.
Tako možemo rasti naš popis velika kao što želimo, ali ako je element tražimo je u sredini,
onda samo će nam trebati jedan korak.
Tako da je razlog zašto smo O (log n) i Ω (1) ili konstanta.
Ajmo zapravo pokrenuti binarni pretraživanje na ovom popisu.
Pa recimo da smo u potrazi za element 164.
Prva stvar koju ćemo učiniti je pronaći tačku ove liste.
To samo tako dogodi da midpoint će pasti između tih dvaju brojeva,
pa neka je samo proizvoljno reći, svaki put midpoint pada između dva broja,
neka je samo zaokružiti.
Trebamo samo kako bi bili sigurni smo to učinili svaki korak na putu.
Dakle, mi ćemo zaokružiti, a mi ćemo reći da 161 je sredinom našem popisu.
So 161 <164, i svaki element na lijevoj 161
Također je <164, tako da znamo da to ne ide kako bi nam pomogli na sve
za početak u potrazi ovamo jer element tražimo ne može biti tamo.
Dakle, ono što možemo učiniti je možemo samo zaboraviti o toj cijeloj lijevoj polovici popisa,
i sada u obzir samo iz desne strane 161 pa nadalje.
>> Pa opet, to je srednji, neka je samo zaokružiti.
Sada 175 je prevelika.
Dakle, mi znamo da ne ide kako bi nam pomogli u potrazi ovdje ili ovdje,
pa možemo samo bacanjem koje daleko, i na kraju ćemo pogoditi 164.
Sva pitanja o binarnom traženja?
Idemo od traženja kroz već sortirane liste
zapravo uzimanje popis brojeva u bilo kojem redoslijedu
i što taj popis u uzlaznom redoslijedu.
Prvi algoritam gledali smo zvali balon vrsta.
I to će biti jednostavnije od algoritama smo vidjeli.
Bubble sorta kaže da kada bilo dva elementa unutar popisa su izvan mjesta,
što znači da je veći broj na lijevoj manjim brojem,
onda ćemo ih zamijeniti, jer to znači da će popis biti
"Više sortiraju" nego što je bio prije.
I mi smo samo će nastaviti taj proces opet i opet i opet
dok na kraju elementi vrsta balona na njihovu ispravnu lokaciju i imamo sortirani popis.
>> Run vrijeme će to biti O (n ²). Zašto?
Pa, zato što u najgorem slučaju, idemo uzeti svaki element, a
idemo završiti uspoređujući ga svaki drugi element u popisu.
No, u najboljem slučaju, imamo već sortiran popis, bubble sorta je
samo će proći kroz jednom, reći: "Ne. Nisam napravila nikakve zamjene, tako da sam učinio."
Dakle, tu imamo najbolji slučaj, trčanje vremena Ω (n).
Ajmo pokrenuti mjehurić vrsta na popisu.
Ili prvi, neka je samo pogledati neke pseudocode jako brzo.
Želimo reći želimo pratiti, u svakom iteracija petlje,
pratiti hoće li ili ne možemo mijenjati nikakve elemente.
Dakle razlog za to je, da ćemo prestati kad nismo zamijenili nikakve elemente.
Tako je na početku našeg petlje nismo zamijenili ništa, pa ćemo reći da je lažna.
Sada, idemo proći kroz popis i usporediti elemente i. elementa i + 1
a ako je to slučaj da postoji veći broj lijevo od manjeg broja,
onda smo tek će ih zamijeniti.
>> A onda ćemo se sjetiti da smo zamijenili element.
To znači da moramo proći kroz popis barem jedan više vremena
jer stanje u kojem smo prestali kada je cijeli popis već sortiran,
znači nismo napravili nikakve zamjene.
Zato je naš uvjet ovdje dolje je ', dok su neki elementi su zamijenili. "
Dakle, sada neka je samo pogledati ovo prikazivati ​​na popisu.
Imam popis 5,0,1,6,4.
Bubble vrsta će početi skroz na lijevoj strani, a to će se usporediti
I elementi, tako da od 0 do i + 1, što je element 1.
To će reći, i 5> 0, ali sada je pet s lijeve strane,
tako da moram zamijeniti 5 i 0.
Kad sam ih zamijeniti, odjednom sam dobiti ovaj drugi popis.
Sada 5> 1, pa ćemo ih zamijeniti.
5 nije> 6, tako da ne moramo ništa učiniti ovdje.
Ali 6> 4, tako da ćemo morati mijenjati.
Opet, moramo pokrenuti kroz cijeli popis na kraju otkriti
da su od reda, a mi ih zamijeniti,
iu ovom trenutku moramo pokrenuti kroz popis 1 više vremena
kako bi bili sigurni da je sve u svojoj redu, au ovom trenutku mjehurić kakve je završio.
Drugačiji algoritam za uzimanje neke elemente te ih sortiranje je izbor vrsta.
Ideja odabira vrste je da ćemo izgraditi sortirani dio popisa
1 elementa na vrijeme.
>> A način na koji ćemo učiniti da je izgradnjom lijevu segment popisu.
I u osnovi, svaki - na svakom koraku, idemo uzeti najmanji element smo lijevo
koji nije sortirani još, a mi ćemo ga premjestiti u taj poredani segmentu.
To znači da moramo stalno pronaći minimalnu Unsorted elementa
i onda se taj minimalni elemenat te ga zamijeniti s bilo
lijevo-većina element koji nije riješeno.
Run vrijeme će to biti O (n ²), jer u najgorem slučaju
trebamo usporediti svaki jedan element koji bi svaki drugi element.
Budući da smo rekavši da ako počnemo na lijevoj polovici liste, trebamo
proći kroz cijelu desnu segmentu pronaći najmanji element.
A onda, opet, trebamo ići preko cijelog pravo segment i
zadržati ide preko toga iznova i iznova i iznova.
To će biti n ². Mi ćemo morati za petlje unutar drugog za petlje
što sugerira n ².
U najboljem slučaju misli, ajmo reći da smo mu dati već sortiran popis;
mi zapravo ne učiniti ništa bolje nego n ².
Jer izbor vrsta nema načina znajući da
minimalni element je samo jedan Ja se dogoditi da se gleda.
To još uvijek treba kako bi bili sigurni da je to zapravo minimalna.
>> A jedini način kako bi bili sigurni da je to minimum, koristeći ovaj algoritam,
je da pogledate na svakom pojedinom elementu opet.
Pa stvarno, ako ga dati - ako vam odabira Poredaj već sortiran popis,
to neće učiniti bilo bolje nego dajući mu popis koji nije sortirani još.
Usput, ako se dogodi da se u slučaju da nešto je O (nešto)
i omega nešto, možemo samo reći više jezgrovito da je θ nečega.
Dakle, ako vidite da se bilo gdje, to je ono što to samo znači.
>> Ako je nešto theta n ², to je i veliki O (n ²) i Ω (n ²).
So najboljem slučaju i najgorem slučaju, to ne čine razliku,
algoritam će učiniti istu stvar svaki put.
Dakle, to je ono što pseudocode za izbor vrste mogao izgledati.
Mi smo u osnovi ćeš reći da želim ponoviti tijekom popisa
s lijeva na desno, a na svakoj iteraciju petlje, idem premjestiti
minimalni elemenat u ovom sortirani dijelu liste.
I kad sam premjestiti nešto postoji, ja nikada ne treba gledati u tom elementu opet.
Jer čim sam zamijeniti element u na lijevom segmentu popisu, to razvrstani
jer radimo sve što je u uzlaznom redoslijedu pomoću minimuma.
Dakle, mi je rekao, ok, mi smo na sam položaj, a mi moramo gledati na sve elemente
s desne strane ja kako bi se pronašli minimum.
Dakle, to znači da želimo gledati iz I + 1 na kraju popisa.
A sada, ako je element koji mi trenutno gledamo u manje od našeg minimum tako daleko,
koja, zapamtite, mi smo početkom minimalnu off samo biti
god Element smo trenutno na; ću pretpostaviti da je minimalna.
Ako nađem element koji je manji od toga, onda ću reći, ok,
dobro, ja sam pronašao novi minimum.
Ja ću se sjetiti gdje je taj minimum.
>> Tako sada, nakon što sam prošao kroz to pravo nerazvrstani segmentu,
Ja mogu reći da ću zamijeniti minimalnu elementa s elementom koji je u sam položaju.
To će izgraditi svoj popis, moj razvrstani dio popisa s lijeva na desno,
a mi nikada ne trebamo gledati na elementu ponovno nakon što je u tom dijelu.
Nakon što smo ga zamijenili.
Tako ćemo pokrenuti izbor vrsta na ovom popisu.
Plava je element ovdje će biti ja, a crveni element će biti minimalni element.
Tako sam počinje skroz na lijevoj strani popisa, pa na pet.
Sada moramo pronaći minimalnu Unsorted element.
Dakle, mi kažu 0 <5, pa 0 je moj novi minimalna.
>> Ali ja ne mogu zaustaviti, jer iako možemo prepoznati da 0 je najmanji,
moramo pokrenuti kroz svaki drugi element popisa kako bi bili sigurni.
Dakle 1 je veći, šest je veća, 4 veća.
To znači da nakon što gleda na sve ove elemente, sam određuje 0 najmanja.
Dakle, ja ću zamijeniti 5 i 0.
Jednom sam zamijeniti da ću dobiti novi popis, a ja znam da ja nikada ne treba gledati u tom 0 opet
jer jednom sam ga zamijenio, ja sam ga izdvojiti, a mi smo gotovi.
Sada to samo tako dogodi da je plava element je opet 5,
i trebamo gledati na 1, 6 i 4 kako bi se utvrdilo da je jedan
je najmanji minimalni element, pa ćemo zamijeniti jedan i pet.
Opet, moramo gledati na - usporediti 5 do 6 i 4,
i mi ćemo zamijeniti 4 i 5, i na kraju, usporedite
te dvije brojke i mijenjati ih dok ne dođemo našu sortirani popis.
Sva pitanja o odabiru vrste?
Ok. Idemo do posljednjeg temu ovdje, a to je rekurzije.
>> Rekurzije, zapamtite, je li to doista meta stvar gdje funkcija
puta sebe naziva.
Dakle, u nekom trenutku, dok je naša fuction opetovano se zove,
postoji potreba da se neke točke na kojoj smo zaustaviti se zove.
Jer ako to ne učinimo, onda smo tek će nastaviti raditi zauvijek,
i naš program samo ne ide prekinuti.
Mi to nazivamo stanje baza slučaj.
A osnovni slučaj, kaže, umjesto poziva funkciju ponovno,
Samo ću se vratiti neku vrijednost.
Dakle, nakon što smo se vratili vrijednost, prestali smo se zove,
, a ostatak od poziva koje smo napravili do sada također može vratiti.
Suprotnost osnovnom scenariju je rekurzivna slučaj.
A to je kada želimo napraviti još jedan poziv na funkciju koju smo trenutno u.
I mi smo vjerojatno, iako ne uvijek, želite koristiti različite argumente.
>> Dakle, ako imamo funkciju pod nazivom f i f upravo zvao uzeti jedan argument,
a mi samo zadržati poziv f (1), f (1), f (1), i to samo tako dogodi da
the argument jednog pada u rekurzivni slučaju, mi smo još uvijek nikada neće prestati.
Čak i ako imamo osnovni slučaj, moramo biti sigurni da na kraju idemo hit koji osnovnog scenarija.
Mi ne samo zadržati ostanak u ovom slučaju rekurzivni.
Općenito, kada smo se zovu, mi vjerojatno će imati drugačiji argument svaki put.
Ovdje je stvarno jednostavan rekurzivna funkcija.
Dakle, to će izračunati faktorijel broja.
Do vrh ovdje imamo osnovni slučaj.
U slučaju da n ≤ 1, nećemo zvati faktorijel opet.
Idemo da se zaustavi, a mi se samo ćeš se vratiti neku vrijednost.
Ako to nije istina, onda idemo pogoditi naše rekurzivna slučaj.
Obavijest da se ovdje nismo samo zove faktorijel (n), jer to ne bi bilo vrlo korisno.
Mi ćemo pozvati faktorijel nešto drugo.
>> I tako da možete vidjeti, na kraju ako bismo proći faktorski (5) ili nešto,
idemo zvati faktorijel (4) i tako dalje, i na kraju ćemo pogoditi ovaj osnovni slučaj.
Dakle, ovo izgleda dobro. Idemo vidjeti što se događa kada smo zapravo pokrenuti ovo.
Ovo je stog, a recimo da je glavni će pozvati ovu funkciju s argumentom (4).
Tako jednom faktorijel vidi i = 4, faktorijel će se zvati.
Sada, odjednom, imamo faktorijel (3).
Dakle, ove funkcije će držati raste dok na kraju smo pogodak naš osnovni scenarij.
U ovom trenutku, povratak vrijednost to je povratak (nx povratak vrijednost toga),
povratak vrijednost je ovo nx povratak vrijednost toga.
Na kraju moramo pogoditi neki broj.
Na vrhu ovdje, možemo reći povratak jednog.
To znači da nakon što smo se vratili taj broj, možemo pop ovo off stog.
Dakle, to faktorijel (1) se obavlja.
Kad jednom vraća, ovaj faktorijel (1) vraća, ovaj povratak na jedan.
Povratak vrijednost toga, zapamtite, bio je nx povratak vrijednost toga.
Dakle, odjednom, taj čovjek zna da želim vratiti dva.
>> Tako zapamtite, vratiti vrijednost to je samo nx povratna vrijednost se ovdje.
Tako sada možemo reći 3 x 2, i konačno, ovdje možemo reći
to samo će biti 4 x 3 x 2.
I jednom kada je taj povrat, dobili smo dolje na jednu integer unutrašnjosti glavni.
Sva pitanja o rekurzije?
U redu. Dakle, tu je više vremena za pitanja na kraju,
ali sada Josip pokrit će preostale teme.
>> [Josip Ong] U redu. Dakle, sada kada smo razgovarali o recursions,
pričajmo malo o tome što spajanje vrsta je.
Spoji vrsta je u osnovi još jedan način sortiranja popis brojeva.
A kako se to radi je, uz spajanje kakve imate popis, a ono što mi radimo je
kažemo, ajmo podijeliti to u dvije polovice.
Mi smo prvi put će pokrenuti spajanje vrsta ponovno na lijevoj polovici,
onda ćemo pokrenuti spajanje vrsta na desnoj polovici,
i da nam daje sada dvije polovice koje su raspoređene, a sada ćemo kombinirati one polovice zajedno.
To je malo teško vidjeti bez primjer, pa ćemo proći kroz prijedloge i vidjeti što se događa.
Dakle, početi s ovog popisa, mi ga podijeliti na dva dijela.
Mi smo mali spojiti vrsta na lijevoj polovici prvi.
Tako da je lijeva polovica, a sada smo ih izvoditi kroz ovaj popis opet
koji dobiva prošao u spajanje vrste, a zatim gledamo, opet,
Na lijevoj strani tog popisa, a mi pokrenuti spajanje vrsta na njega.
Sada smo se dolje na popisu dva broja,
i sada lijeva polovica je samo jedan element koji dugo, a mi ne možemo
podijeliti popis koji je samo jedan element koji u poluvremenu, tako da smo samo reći, jednom smo 50,
što je samo jedan element, to je već riješeno.
>> Nakon što smo učinili s tim, možemo vidjeti što možemo
premjestiti na desnoj polovici ove liste,
i 3 također razvrstani, i tako sada da su obje polovice ovog popisa razvrstani
možemo pridružiti te brojeve natrag zajedno.
Tako smo pogledati 50 i 3; 3 je manji od 50, tako to ide u prvi, a zatim 50 dolazi u.
Sada, što je učinio, a mi se vratiti do tog popisa i vrsta To je pravo pola.
42 je da je vlastiti broj, tako da je već riješeno.
Dakle, sada smo usporediti ove 2 i 3 je manji od 42, tako da se stavi u prvi,
Sada 42 dobiva staviti u, a 50 se stavi u.
Sada, koji je sortiran, idemo sve na putu natrag do vrha, 1337 i 15.
Pa, mi smo sada gledati na lijevoj polovici ove liste; 1337 je sama po sebi tako da je izdvojiti i isto sa 15.
Dakle, sada smo kombinirati ove dvije brojeva sortirati to da je izvorni popis, 15 <1.337,
tako to ide u prvi, a zatim 1337 ide u.
I sada smo razvrstani u oba poluvremena na izvornom popisu do vrha.
I sve što morate učiniti je kombinirati ove.
Mi gledamo na prvih dvaju brojeva ovom popisu, 3 <15, tako to ide u sortiranja niza prvi.
15 <42, tako to ide u. Sada, 42 <1.337, koji ide u.
50 <1.337, tako to ide u. I primijetiti da smo upravo uzeo 2 broja s ovog popisa.
Dakle, mi ne samo izmjenične između dva popisa.
Mi samo tražimo na početku, a mi smo vodeći element
to je manji, a zatim ga stavite u naš niz.
Sada smo spojili sve poluvremena, a mi smo gotovi.
>> Sva pitanja oko spajanja vrsta? Da?
[Studentski] Ako je cijepanje u različite grupe, zašto jednostavno ne ga podijeliti jednom
i imate 3 i 2 u skupini? [Ostatak pitanje nerazumljivo]
Razlog - pa je pitanje, zašto ne možemo ih samo spojiti na tom prvom koraku nakon što smo ih imati?
Razlog možemo to učiniti, početi na lijevom većini elemenata obje strane,
i onda uzeti manji jedan i stavite ga u, jest da mi znamo da to
pojedinačni popisi su u razvrstanih naloga.
Dakle, ako sam u potrazi na lijevoj većini elemenata oba poluvremena,
Znam da ćemo biti najmanji elementi tih popisa.
Tako sam ih možete staviti u najmanji element spotova ovog velikog popisa.
S druge strane, ako gledam one dvije liste u drugoj razini tamo,
50, 3, 42, 1337 i 15, oni nisu sortirani.
Dakle, ako sam pogled na 50 i 1337, ja ću staviti 50 u mom popisu prvi.
No, to zapravo ne smisla, jer tri je najmanji element od svih onih.
Dakle, jedini razlog možemo napraviti ovaj korak je kombiniranje jer su naši popisi već su razvrstani.
Koji je razlog zašto moramo sići sve do dna
jer kad imamo samo jedan broj, znaš da jedan broj
i sama je već razvrstani popis.
>> Ima li pitanja? No?
Kompleksnost? Pa, možete vidjeti da je na svakom koraku postoji kraj brojevi,
a možemo podijeliti popis na pola dnevnika n puta,
što je, gdje smo dobili ovaj dnevnik n x n složenost.
I vidjet ćete najbolji slučaj za spajanje kakve je n log n, i to samo tako dogodi
da je najgori slučaj, ili Ω tamo, također je n prijavite n.
Nešto treba imati na umu.
Premještanje na, ajmo na neki super osnovnom datoteku I / O.
Ako ste gledali na Scramble, primijetit ćete da je imao nekakvu sustava
gdje se može pisati log datoteku, ako ste pročitali kroz koda.
Idemo vidjeti kako biste mogli učiniti.
Pa, imamo fprintf, koje možete misliti samo kao printf,
ali samo ispisa u datoteku umjesto, a time i ž na početku.
Ova vrsta koda ovdje, što to je, kao što ste mogli vidjeti u Scramble,
to ide kroz 2-dimenzionalnog polja ispis iz red ono što su brojevi.
U ovom slučaju, printf ispisuje na vašem terminalu ili ono što mi zovemo standardni izlaz dijelu.
>> I sada, u ovom slučaju, sve što morate učiniti je zamijeniti printf s fprintf,
ga reći što datoteke želite ispisati, au ovom slučaju to je samo ga ispisuje na tu datoteku
umjesto da ga ispisuje na terminalu.
Pa, onda postavlja pitanje: Odakle smo dobili ovu vrstu datoteke iz, zar ne?
Mi smo prošli prijavite u ovom fprintf fuction, ali nismo imali pojma gdje je došao iz.
Pa, rano u kodu, ono što smo imali je bio ovaj komad koda ovamo,
koji u osnovi kaže da otvorite datoteku naziva log.txt.
Što nam je činiti nakon toga je moramo biti sigurni da je datoteka je zapravo otvorena uspješno.
Dakle, to bi moglo uspjeti zbog više razloga, nemate dovoljno prostora na vašem računalu, na primjer.
Dakle, to je uvijek važno učiniti prije nego što sve operacije s datotekom
da smo provjerili da li da je datoteka otvorena uspješno.
Pa što da je, to je argument za fopen, dobro, možemo otvoriti datoteku na mnoge načine.
Ono što možemo učiniti je, možemo proći ona w, što znači nadjačati datoteku ako to već izlazi,
Možemo proći A, koje se dodaje na kraju datoteke, umjesto da ga preskakanja,
ili možemo odrediti r, što znači, ajmo otvoriti datoteku samo za čitanje.
Dakle, ako se program pokušava napraviti nikakve promjene u datoteci,
vikati na njih i ne dopustiti da ih to učiniti.
Konačno, nakon što smo gotovi sa spisom, učinio radi operacije na njemu,
trebamo kako bi bili sigurni smo zatvorite datoteku.
I tako je na kraju svog programa, od vas će proći ih opet
ovo datoteku koju ste otvorili, a samo ga zatvoriti.
Dakle, ovo je nešto važno da imate kako biste bili sigurni što učiniti.
Tako zapamtite možete otvoriti datoteku, onda možete pisati u datoteku,
učiniti poslovanje u spisu, ali onda morate zatvoriti datoteku na kraju.
>> Sva pitanja o osnovnom datoteku I / O? Da?
[Studentski pitanje, nerazumljivo]
Upravo ovdje. Pitanje je, gdje je to log.txt file pojaviti?
Pa, ako ste samo dati log.txt, on ga stvara u istom direktoriju kao i izvršna.
Dakle, ako ti si - >> [Studentski pitanje, nerazumljivo]
Da. U istoj mapi, ili u istom direktoriju, kao što ga zovu.
Sada memorije, stog i hrpa.
Pa kako je memorija izneseno u računalu?
Pa, možete zamisliti memorije kao svojevrsno ovom bloku ovdje.
A u sjećanju mi ​​imamo ono što se zove hrpu zapela tamo, i stog koji je tamo dolje.
I hrpa raste prema dolje i stog raste prema gore.
Dakle, kao što je spomenuto Tommy - oh, dobro, i mi imamo ove druge četiri segmenta koji ću dobiti u drugi -
Kao što je Tommy rekao ranije, znate kako njegovi funkcije zovu i zovu jedni druge?
Oni izgraditi ovu vrstu stog okvira.
Pa, ako je glavni pozivi foo, foo dobiva staviti na stog.
Foo poziva, bar bi je staviti na hrpu, i da se stavi na hrpu poslije.
I kao što su se vratili, oni svaki se skinut snop.
Što svaki od tih lokacija i memorije držite?
Pa, na vrhu, koji je tekst segment sadrži samog programa.
Dakle strojnom kodu, da je tamo, nakon što sastaviti svoj program.
Dalje, bilo inicijaliziran globalne varijable.
>> Tako ćete imati globalne varijable u svom programu, a vi kao recimo, a = 5,
da se stavi u tom segmentu, a odmah ispod toga,
imate nepokrenute globalne podatke, koje je samo int,
ali ne kažu da je jednaka ništa.
Shvatite to su globalne varijable, tako da su oni izvan glavne.
Dakle, to znači sve globalne varijable koje su deklarirane, ali se ne ponište.
Dakle, ono što je u gomili? Memorija dodijeljena koristeći malloc, što ćemo dobiti u malo.
I na kraju, s hrpom imate lokalne varijable
i sve funkcije koje bi se moglo nazvati u bilo kojem od njihovih parametara.
Posljednja stvar, ne stvarno morati znati što učiniti varijable okruženja,
ali kad god pokrenete program, postoji nešto povezana, kao što su
to je ime osobe koja je tekla program.
I to će biti vrsta na dnu.
U smislu memorijske adrese, koji su heksadecimalni vrijednosti,
vrijednosti u gornjem početka na 0, a oni idu skroz do dna.
U tom slučaju, ako ste na 32-bitnom sustavu,
Adresa na dnu će biti 0x, nakon čega slijedi af, jer to je 32 bita,
što je 8 bajtova, au ovom slučaju osam bajtova odgovara 8 heksadecimalni znamenki.
Dakle, ovdje ćete imati, kao, 0xffffff, i tamo ćeš imati 0.
Dakle, ono što su pokazivače? Neki od vas možda nisu obuhvaćeni to u dijelu prije.
ali mi nije ići preko njega u predavanju, tako da pokazivač je samo vrsta podataka
koji pohranjuje, umjesto nekakvoj vrijednosti kao što su 50, pohranjuje adresu nekom mjestu u memoriji.
Poput onog memorije [nerazumljivo].
Dakle, u ovom slučaju, ono što smo je, imamo pokazivač na cijeli broj ili int *,
i sadrži ovu heksadecimalni adresu 0xDEADBEEF.
>> Dakle, ono što imamo je, sada, ovaj pokazivač bodova na nekom mjestu u memoriji,
i to je samo, vrijednost 50 je u ovom memorijske lokacije.
Na nekim 32-bitne sustave, na svim 32-bitnim sustavima, upućuje zauzimaju 32 bita ili 4 bajta.
Ali, na primjer, na 64-bitni sustav, pokazivači su 64 bita.
Dakle, to je nešto što ćete želite imati na umu.
Dakle, na kraju-bitnom sustavu, pokazivač je kraj bita dugo.
Pokazivači su vrsta teško probaviti bez dodatne stvari,
pa ajmo kroz primjer dinamička dodjela memorije.
Što dinamička dodjela memorije radi za vas, ili ono što mi zovemo malloc,
to vam omogućuje da dodijeliti neku vrstu podataka izvan seta.
Dakle, taj podatak je svojevrsna više stalnih za vrijeme trajanja programa.
Jer kao što znate, ako proglasiti x unutar jedne funkcije i da funkcija vraća,
više nemate pristup podacima koje je pohranjenih u x.
Što upućuje činimo je da neka nam pohranu memorije ili pohraniti vrijednosti
u drugom dijelu memorije, naime hrpa.
Sada kada smo se vratili izvan funkcije, dok imamo pokazivač
na toj lokaciji u memoriji, onda ono što možemo učiniti je možemo samo gledati na vrijednosti tamo.
Pogledajmo primjer: Ovo je naša memorija izgleda opet.
I mi imamo tu funkciju, glavni.
Što je to ipak - ok, tako jednostavno, zar ne -? Int x = 5, to je samo varijabla na stog u glavni.
>> S druge strane, sada smo proglasiti pokazivač koji poziva funkcijske giveMeThreeInts.
I tako sada idemo u ovoj funkciji, a mi stvaramo novu stog okvir za njega.
Međutim, u ovom stog okvir, izjavljujemo int * temp,
koji je u mallocs tri integers za nas.
Dakle, veličina int će nam dati koliko bajtova to int je,
i malloc nam daje da mnogi bajtova prostora na hrpi.
Dakle, u ovom slučaju, stvorili smo dovoljno prostora za tri brojeva,
i hrpa je put do tamo, što je razlog zašto sam ga izvući više gore.
Nakon što smo učinili, mi vratiti ovdje, trebate samo tri Ints vratio,
i vraća adresu, u ovom slučaju više gdje da je memorija.
I mi smo postavili pokazivač = prekidač, i tamo imamo samo jedan pokazivač.
No, ono što je funkcija vraća se slaže ovdje i nestaje.
Dakle temperatura nestaje, ali mi i dalje održavati adresu gdje
te tri cijela broja su unutar mreže.
Dakle, u ovoj postavi, pokazivači su opfateno lokalno za složenom okvira,
ali memorije na koje se odnose je u hrpi.
>> Ima li to smisla?
[Studentski] Možete li to ponoviti? >> [Josip] Da.
Dakle, ako sam se vratiti samo malo, vidjet ćete da je temperatura dodijeljeno
dio memorije na hrpi do tamo.
Dakle, kada je ova funkcija, giveMeThreeInts vraća, to stog ovdje će nestati.
I s njim bilo od varijabli, u ovom slučaju, to pokazivač koji je dodijeljen u složenom okvira.
To će nestati, ali budući da smo se vratili temp
i mi postaviti pokazivač = temperatura, pokazivač sada će ukazati istu memoriju mjestu kao temperatura bila.
Tako sada, iako smo izgubili temp, da lokalna pokazivača,
mi još uvijek zadržati memorijsku adresu ono što je pokazujući na unutrašnjost te varijable pointer.
Pitanja? To može biti neka vrsta zbunjujuće temu ako niste otišli preko njega u sekciji.
Možemo, vaš TF definitivno će ići preko njega i naravno možemo odgovoriti na pitanja
na kraju pregled sjednice za to.
No, to je neka vrsta kompleksnu temu, i imam više primjera koje će se prikazati
koje će pomoći u rasvjetljavanju što upućuje zapravo jesu.
>> U ovom slučaju, pokazivači su ekvivalent polja,
tako da sam samo mogu koristiti ovaj pokazivač kao istu stvar kao int niz.
Tako sam indeksiranje u 0, a mijenja prvi cijeli broj 1,
mijenja drugi cijeli do 2, i 3. cijeli do 3.
Dakle, više na pokazivače. Pa, prisjetimo Binky.
U ovom slučaju smo dodijeljen pokazivač, ili ćemo proglašen pokazivač,
ali u početku, kad sam tek proglašen pokazivač, to ne ukazuje na bilo gdje u memoriji.
To je samo smeće vrijednosti unutar nje.
Dakle, ja nemam pojma gdje je to pokazivač pokazuje na.
To ima adresu koja je samo ispunjen 0-a i jedan je gdje je u početku bio proglašen.
Ja ne mogu ništa učiniti s tim dok sam nazvati malloc na njemu
i onda mi daje malo prostora na hrpi gdje mogu staviti vrijednosti unutra.
Onda opet, ne znam što je unutar ove memorije.
Dakle, prva stvar koju moram učiniti je provjeriti je li sustav imao dovoljno memorije
da mi vrati jedan cijeli na prvom mjestu, što je razlog zašto sam to provjeriti.
Ako pokazivač je nula, to znači da ona nije imala dovoljno prostora ili neke druge pogreške,
pa ja bi trebao izaći iz mog programa.
Ali ako je to učinio uspjeti, sada mogu koristiti taj pokazivač
i ono * pokazivač ipak slijedi gdje je adresa
gdje ta vrijednost je, a to ga postavlja jednak 1.
Dakle, ovdje, mi smo provjere da li da je sjećanje postojala.
>> Jednom kada znate da postoji, možete staviti u nju
što vrijednost koju želite staviti u njega, u ovom slučaju jedan.
Nakon što smo učinili s njim, morate osloboditi taj pokazivač
jer moramo vratiti na sustav koji memorijskoj da ste pitali za na prvom mjestu.
Budući da računalo ne zna kad završimo s tim.
U ovom slučaju mi ​​smo ga izričito govori, ok, mi smo gotovi s tim memorije.
Ako neki drugi proces treba ga neki drugi program to treba, slobodno ići naprijed i uzeti ga.
Što možemo učiniti je možemo samo dobiti adresu lokalnih varijabli na setu.
Dakle, int x je unutar složenom okviru glavni.
A kad smo koristiti ovaj ampersand, to i operater, što to je
to traje x, a x je samo neki podaci iz memorije, ali to ima adresu.
Ona je smještena negdje. Tako je poziv & x, što to znači je to nam daje adresu x.
Na taj način, mi smo izradu pokazivač točku gdje je x u sjećanju.
Sada mi samo ne nešto poput * x, idemo dobiti pet leđa.
Zvijezda se zove to dereferencing.
Možete slijediti adresu i dobijete vrijednost toga tamo pohranjena.
>> Ima li pitanja? Da?
[Studentski] Ako to ne učinite 3-zašiljeni stvar, to još uvijek sastaviti?
Da. Ako to ne učinite 3-pointer stvar, ona i dalje će sastaviti,
ali ja ću vam pokazati što se događa u drugi, i bez da radi,
to je ono što mi zovemo otjecanje memorije. Vi ne daje sustav pri
natrag svoju memoriju, pa nakon nekog vremena program će se akumulirati
memorije da to ne koristite, i ništa drugo ne može ga koristiti.
Ako ste ikada vidjeli Firefox s 1,5 milijuna kilobajta na računalu,
u task manager, to je ono što se događa.
Imate memorijsku curenja u programu da se ne rješava.
Pa kako se kazaljka aritmetička rad?
Pa, pokazivač aritmetička je vrsta od poput indeksiranje u polju.
U ovom slučaju, imam pokazivač, i što mi je činiti je sam napraviti pokazivača točku na prvi element
ovog niza brojeva 3 koje sam dodijeljenih.
I što sad radim, zvijezda pokazivač samo mijenja prvi element u popisu.
Star pokazivač 1 boda više ovdje.
Dakle, pokazivač je ovdje, pokazivač jedan je ovdje, pokazivač 2 je ovdje.
>> Dakle, samo dodavanjem jedne je ista stvar kao i kretanje po ovom polju.
Ono što mi radimo jest, kada radimo pokazivač jednom ste dobili adresu ovamo,
i kako bi dobili vrijednost u ovdje, stavi zvijezdu iz cijelog izraza
to dereference.
Dakle, u ovom slučaju, ja sam postavljanje prvog mjesta u ovom polju na jednoj,
drugi položaj do 2, i treće mjesto na 3.
Onda ono što ja radim ovdje je sam ispis naš pokazivač 1,
koji samo mi daje dvije.
Sada sam povećavanjem pokazivač, tako da pokazivač jednak pokazivač 1,
koji ga pomiče naprijed.
I tako sada, ako sam isprintati pokazivač 1, pokazivač jedna je sada 3,
koja je u ovom slučaju ispisuje tri.
A kako bi slobodnom nešto, pokazivač da sam ga dati
mora biti ukazujući na početku niza koji sam dobio natrag iz malloc.
Dakle, u ovom slučaju, ako bih pozvati tri ovdje, to ne bi bilo dobro,
jer se nalazi u sredini polja.
Imam za oduzimanje doći do izvornog mjesta
početna prvi put ugledali prije nego što sam ga osloboditi.
Dakle, ovdje je više uključeni primjer.
U ovom slučaju, mi smo izdvajanja 7 znakove u nizu znakova.
>> I u ovom slučaju ono što mi radimo je da smo petlje u odnosu na prvi šest od njih,
i mi smo ih postavljanja do Z.
Dakle, za int i = 0, i> 6, i + +,
Dakle, pokazivač + ja samo će nam dati, u ovom slučaju,
pokazivač, pokazivač 1, 2 pokazivač, pokazivač 3, i tako dalje i tako dalje u petlji.
Što će to učiniti je da dobije tu adresu, dereferences da biste dobili vrijednost,
i promjene koje vrijednost za Z.
Tada je na kraju zapamtite ovo je string, zar ne?
Svi nizovi moraju završiti sa završnim null karakter.
Dakle, ono što mi je činiti u pokazivač 6 stavim null terminator lik u.
A sad ono što ja zapravo radim ovdje provodi printf za niz, zar ne?
>> Dakle, kada printf ne sada kada je došla do kraja niza?
Kada ga pogodi nulte ukida karakter.
Dakle, u ovom slučaju, moje izvorne pokazivač pokazuje na početku ovog niza.
Ja ispisati prvi lik iz. Ja ga premjestiti preko jednog.
Ja ispisati taj lik iz. Ja ga premjestiti.
I ja sam zadržati to dok sam doći do kraja.
A sada pokazivač kraj * će dereference to i dobiti null ukida karakter natrag.
I tako moj while petlja radi samo kada je vrijednost nije null završni lik.
Dakle, sada sam izaći iz ove petlje.
I tako, ako sam oduzmite 6 iz ovog pokazivača,
Vraćam sve do početka.
Zapamtite, ja sam to, jer moram ići na početak kako bi ga oslobodili.
>> Dakle, znam da je puno. Ima li kakvih pitanja?
Molim vas, da?
[Studentski pitanje nerazumljivo]
Može li se reći da je glasniji? Oprostite.
[Studentski] Na posljednjem slajdu neposredno prije oslobodio pokazivač,
gdje su ti zapravo mijenja vrijednost pokazivača?
[Josip] Dakle, ovdje. >> [Student] Oh, u redu.
[Josip] Dakle, imam pokazivač minus minus, desno,
koja se kreće stvar povratak, a onda sam ga oslobodi,
jer ovo pokazivač mora biti ukazao na početku niza.
[Studentski] Ali to ne bi bilo potrebno da ste prestali nakon tog liniji.
[Josip] Dakle, ako sam prestao nakon toga, to će se smatrati otjecanje memorije,
jer nisam pokrenuti besplatno.
[Studentski] ja [nerazumljivo] nakon prva tri linije gdje ste imali pokazivač 1 [nerazumljivo].
[Josip] Aha. Dakle, ono što je pitanje postoji?
Oprostite. Ne, ne. Idi, idi, molim te.
[Studentski] Dakle, niste mijenja vrijednost pokazivača.
Vi ne bi morao učiniti pokazivač minus minus.
[Josip] Da, točno.
Dakle, kad radim pokazivač 1 i 2 upustvo,
Ja ne radim pokazivač jednak pokazivač jednom.
Dakle, pokazivač samo ostaje ukazujući na početku niza.
To je samo kad radim plus plus da postavlja vrijednost natrag u pokazivač,
da je to zapravo kreće to zajedno.
U redu.
Više pitanja?
>> Opet, ako je to neka vrsta neodoljiv, to će biti pokrivena u sjednici.
Pitajte kolega nastave o tome, i mi možemo odgovoriti na pitanja na kraju.
I obično mi se ne sviđa to učiniti minus stvar.
To mora zahtijevati mene praćenje koliko sam pomak u polju.
Dakle, u cjelini, to je samo objasniti kako radi pokazivač aritmetika.
Ali ono što mi obično željeli učiniti je da smo željeli stvoriti kopiju pokazivačem
i onda ćemo koristiti taj primjerak kada smo se kreće u nizu.
Dakle, u tih slučaju da koristite kopija za ispis cijeli niz,
ali mi nemamo učiniti kao pokazivač minus šest ili pratiti koliko smo se preselili u ovo,
samo zato jer znamo da je naša izvorna točka i dalje je ukazao na početku popisa
i sve što smo promijenili je to kopija.
Dakle, u cjelini, mijenjati kopije originalnog pokazivača.
Nemojte pokušati nešto poput - nemojte mijenjati originalne kopije.
Pokušavajući izmijeniti samo kopija originala.
Dakle, možete primijetiti kada smo proći niz u printf
nemate staviti zvijezdu ispred njega kao što smo učinili s ostalim dereferences, zar ne?
Dakle, ako vam ispisati cijeli niz% s. očekuje je adresa,
iu tom slučaju pokazivač ili u ovom slučaju kao niz znakova.
>> Likovi, char * s, i polja su ista stvar.
Pointer je znakova, a karakter polja su ista stvar.
I tako, sve što morate učiniti je proći pokazivač.
Mi ne moramo položiti u kao * pokazivač ili nešto slično.
Dakle, polja i pokazivače su ista stvar.
Kada radite nešto poput x [y] ovdje za niz,
ono što radi ispod haube je to rekao, ok, to je znak polje,
tako da je pokazivač.
I tako x su ista stvar,
pa što je to ipak dodaje y za x,
što je ista stvar kao i kretanje naprijed u sjećanju da je mnogo.
I sad x + y daje nam nekakvu adresu,
i mi dereference adresu ili slijediti strelicu
gdje to mjesto u memoriji, a dobili smo vrijednost od tog mjesta u memoriji.
Dakle, kako se radi o dvije potpuno ista stvar.
To je samo sintaktička šećer.
Oni učiniti istu stvar. Oni su samo različiti syntactics za drugoga.
>> Dakle, ono što može poći krivo s pokazivačima? Kao, puno. Ok. Dakle, loše stvari.
Neke loše stvari koje možete učiniti ne provjere da li vaš poziv malloc vraća null, zar ne?
U tom slučaju, ja tražim da sustav mi dati - što je to broj?
Kao dvije milijarde puta četiri, jer je veličina cijeli broj je 4 bajta.
Ja sam ga tražeći poput 8000000000 bajtova.
Naravno moj računalo neće biti u mogućnosti dati mi toliko memorije leđa.
I nismo provjerili je li to nula, pa kad smo ga pokušati dereference tamo -
slijediti strelicu na mjesto gdje će to - mi nemamo tu memoriju.
To je ono što mi zovemo dereferencing null pokazivač.
I to u suštini uzrokuje da segfault.
Ovo je jedan od načina na koji možete segfault.
Ostali loše stvari koje možete učiniti - oh dobro.
To je dereferencing null pokazivač. Ok.
Ostali loše stvari - dobro, to popraviti samo stavi ček tamo
da provjerava je li pokazivač null
i izlaz iz programa ako se dogodi da malloc vraća null pokazivač.
To je xkcd strip. Ljudi ga sada razumijem. Vrsta.
>> Dakle, memorija. I ja sam otišao preko toga.
Mi pozivamo malloc u petlji, ali svaki put mi zovemo malloc
gubimo trag gdje se ova kazaljka pokazuje da,
jer smo ga clobbering.
Dakle, početni poziv na malloc daje mi sjećanje ovamo.
Moje pokazivač upućuje na to.
Sada, ja to ne oslobodi, tako da sada zovem malloc opet.
Sada to ukazuje ovamo. Sada moja memorija pokazuje ovamo.
Ukazujući ovamo. Ukazujući ovamo.
Ali ja sam izgubio trag od adrese svih memorije ovamo da bih izdvojila.
I tako sad ja nemam referencu na njih više.
Dakle, ja ne mogu osloboditi ih izvan tog kruga.
I tako bi se riješili ovako nešto,
ako ste zaboravili slobodne memorije i dobijete Osipanje memorije,
Morate osloboditi memoriju unutar ove petlje jednom ste učinili s njim.
Pa, to je ono što se događa. Znam puno vas mrzim to.
Ali sada - yay! Možete dobiti kao 44.000 kilobajta.
Dakle, vi ga osloboditi na kraju petlje,
i da će se samo osloboditi memoriju svaki put.
U osnovi, vaš program nema curenja memorije više.
>> A sada nešto drugo što možete učiniti je osloboditi dio memorije koji ste tražili dvaput.
U ovom slučaju, malloc nešto, promijenite svoju vrijednost.
Možete ga oslobodi jednom, jer si rekao da su učinili s njim.
Ali onda smo ga oslobodili opet.
To je nešto što je jako loše.
To ne ide na početku segfault,
ali nakon što dok to ne dvostruko oslobađajući Ova kvari svoj hrpa strukturu,
i da ćete naučiti nešto više o tome, ako se odlučite uzeti klasa poput CS61.
No, bitno je nakon nekog vremena vaše računalo će se zbuniti
o tome što memorijska mjesta gdje su i gdje je pohranjen -
gdje su podaci pohranjeni u memoriji.
I tako oslobađajući pokazivač dva puta je loša stvar koju ne želim učiniti.
>> Druge stvari koje mogu poći krivo ne koristi sizeof.
Dakle, u tom slučaju vam malloc 8 bajtova,
i to je ista stvar kao i dvije brojeva, zar ne?
Dakle, to je sasvim sigurno, ali je to?
Pa, kao Lucas govorio o na različitim arhitekturama,
integeri su različitih duljina.
Dakle, na aparatu koji ste koristili, cijeli, oko 4 bajta,
ali na nekom drugom sustavu mogle bi biti 8 bajtova ili bi mogli biti 16 bajtova.
Dakle, ako sam koristiti ovaj broj ovamo,
ovaj program može raditi na aparatu,
ali to neće dodijeliti dovoljno memorije na nekom drugom sustavu.
U ovom slučaju, to je ono što sizeof operator koristi za.
Kad mi zovemo sizeof (int), što je ovo ipak
to nam daje veličinu cijeli na sustavu da je program pokrenut.
Dakle, u ovom slučaju, sizeof (int) će se vratiti 4 na nešto poput aparata,
i sada će ovo 4 * 2, što je 8,
što je samo iznos prostora potrebnog za dvije brojeva.
Na drugom sustavu, ako int je kao 16 bajtova ili 8 bajtova,
to je samo ide da se vrati dovoljno bajtova za pohranu taj iznos.
>> I na kraju, tvorevina.
Dakle, ako ste htjeli pohraniti sudoku ploču u znak sjećanja, kako bismo mogli to učiniti?
Možda misle kao varijable za prvu stvar,
varijabla za drugog stvar, varijabla za treći stvar,
varijabla za četvrti stvar - loše, zar ne?
Dakle, jedan poboljšanja možete napraviti na vrhu je to napraviti 9 x 9 polja.
To je u redu, ali što ako ste htjeli povezati druge stvari s sudoku brodu
sviđa ono poteškoća odbora je,
ili, na primjer, ono što je vaš rezultat je, ili koliko vremena to uzima li riješiti ovaj forum?
Pa, što možete učiniti je da možete stvoriti struct.
Ono što sam zapravo govorim je sam definiranja ovu strukturu ovamo,
i ja sam definiranje Sudoku odbora koji se sastoji od ploče koja je 9 x 9.
>> I ono što je ona ima upućuje na ime razini.
Ona također ima X i Y, koji su koordinate gdje sam sada.
To je također vrijeme provedeno [nerazumljivo], a to je ukupan broj poteza koje sam do sada unesene.
I tako, u ovom slučaju, ja mogu grupirati hrpu podataka u samo jednoj strukturi
umjesto da ga kao leti okolo poput različitih varijabli
da ja stvarno ne mogu pratiti.
A to nam omogućuje da imaju samo lijepe sintaksu za kakve pozivom različite stvari unutar ovog struct.
Ja samo mogu učiniti board.board, a ja dobiti sudoku ploču natrag.
Board.level, sam se kako tvrd je.
Board.x i board.y daj mi koordinate gdje sam mogao biti na brodu.
I tako sam pristup ono što mi zovemo polja u struct.
To definira sudokuBoard, što je tip koji imam.
I sad smo ovdje. Imam varijablu pod nazivom "zajednica" tipa sudokuBoard.
I tako sada ja mogu pristupiti sva polja koja čine ovu strukturu ovamo.
>> Sva pitanja o tvorevina? Da?
[Studentski] Za int x, y, što proglašen i na jednoj liniji? >> [Josip] Aha.
[Studentski] Dakle, mogli ste upravo to učiniti sa svima njima?
Kao u X, Y zarez puta da su ukupni?
[Josip] Da, svakako bi mogao to učiniti, ali razlog zbog kojeg sam stavio xiy na istoj liniji -
i pitanje je zašto možemo samo to učiniti na istoj liniji?
Zašto ne bismo samo stavi sve to na istoj liniji je
x i y su međusobno povezani,
i to je samo stilski točnije, u smislu,
jer to je grupiranje dvije stvari na istoj liniji
da kao vrsta odnose na istu stvar.
I ja sam samo podijeliti ove apart. To je samo stil stvar.
To funkcionalno čini nikakve razlike.
Bilo koja druga pitanja o tvorevina?
Možete definirati Pokédex s struct.
Pokémon ima broj i to je pismo, vlasnik, tipa.
A onda, ako imate niz Pokemona, možete čine Pokédex, zar ne?
Ok, cool. Dakle, pitanja o tvorevina. Oni su vezane uz tvorevina.
>> Konačno, GDB. Što GDB neka vam je činiti? To vam omogućuje ispravljanje svoj program.
A ako niste koristili gdb, ja bih preporučuje gledajući kratki
i samo ono što ide preko GDB je, kako raditi s njim, kako bi ga koristiti,
i testirati ga na programu.
I tako ono što GDB vam omogućuje da učinite je to omogućuje stanku [nerazumljivo] Gore vaš program
i praktičan linija.
Na primjer, želim pauzu izvršenja na liniji kao tri moje programa,
i dok sam na liniji 3 mogu ispisati sve vrijednosti koje su tu.
I tako ono što mi zovemo kao pauziranje u skladu
je mi zovemo ovo stavljanjem točke prekida na toj liniji
i onda možemo ispisati varijable na državnoj programa u to vrijeme.
>> Mi smo tada može od tamo korak kroz program line-by-line.
A onda možemo pogledati stanje stog na vrijeme.
I tako bi se koristiti gdb, ono što mi radimo je zovemo zveka na C datoteci,
ali moramo proći to-ggdb zastavu.
A kad smo gotovi s tim smo samo pokrenuti gdb na proizašlog izlazne datoteke.
I tako da ćete dobiti neki kao masu teksta kao što je ovaj,
ali stvarno sve što morate učiniti je upisati naredbe na početku.
Break glavni stavlja točke prekida na glavni.
Popis 400 navodi linija koda oko liniji 400.
I tako u tom slučaju možete samo pogledati oko sebe i reći, oh,
Želim postaviti točke prekida na liniji 397, što je ova linija,
a zatim vaš program radi u tom koraku, a to će se slomiti.
To će pauzirati tamo, i možete ispisati, primjerice, vrijednost niska ili visoka.
I tako postoji hrpa naredbi koje trebate znati,
i to Slideshow će ići gore na web stranici,
pa ako baš želite referencirati ove ili vole ih staviti na svoje Šalabahteri, slobodno.
>> Cool. To je kviz pregled 0, a mi ćemo držati oko, ako imate bilo kakvih pitanja.
U redu.
>> [Pljesak]
>> [CS50.TV]