ROB Bowden: Bok, ja sam Rob Bowden, i razgovarajmo o quiz0. Dakle, prvo pitanje. To je pitanje u kojoj što je potrebno da kod broja 127 u binarnom žarulje. Ako ste htjeli, mogli ste obaviti redovitu pretvorbe od bi-- ili, od decimale do binarni. Ali to vjerojatno događa uzeti puno vremena. Mislim, mogao shvatiti da je, U redu, 1 je tamo, 2 tamo, 4 je tamo, 8 je tamo. Lakši način, 127 128 minus jedan. To lijevom žarulja je 128-bitni. Dakle 127 stvarno baš sve od ostalih žarulja, budući da je lijevom žarulja minus 1. To je to za to pitanje. Pitanje jedno. Tako je s 3 bita možete predstavlja 8 različitih vrijednosti. Zašto, dakle, 7 najvećih ne-negativni decimale broj možete predstavlja? Pa, ako mi samo možemo predstavlja 8 različitih vrijednosti, onda ono što ćemo biti što predstavlja 0 do 7. 0 zauzima jednu od vrijednosti. Pitanje dva. S n bitova, koliko različita Vrijednosti se predstavljate? Dakle, s n bitova, imate 2 Moguće vrijednosti za svaki zalogaj. Dakle, imamo 2 moguće vrijednosti za Prva bitna, 2 moguće vrijednosti za sekundu, 2 moguće za trećinu. I tako to 2 puta 2 puta 2, i konačnici odgovor je 2 do n. Pitanje tri. Što je 0x50 u binarnom? Pa sjetite se da heksadecimalni ima vrlo jednostavno pretvaranje u binarnom. Pa evo, samo trebamo gledati na 5 i 0 samostalno. Dakle, što je 5 u binarnom? 0101, to je 1 bitni i 4 bita. Što je 0 u binarnom? Nije zahtjevno. 0000. Dakle, samo ih staviti zajedno, i to je puna broj u binarnom. 01010000. A ako ste htjeli ste mogli skinu tu krajnjem lijevom nuli. To je nebitno. Dakle alternativno, ono što je 0x50 u decimale? Ako ste htjeli, što could-- ako ste udobnije s binarnom, možete poduzeti da binarni odgovor i pretvoriti to u decimale. Ili smo samo mogli sjetiti da heksadecimalni. Tako da je 0 u 0-og mjesta, a 5 u 16 na prvom mjestu. Pa evo, imamo 5 puta 16 na Prvo, plus 0 puta 16 na nulu, je 80. A ako ste pogledali Naslov na pitanje, to je bio CS 80, što je vrsta upućuju na odgovor na ovaj problem. Pitanje pet. Imamo tu Scratch skriptu, što je ponavlja 4 puta kikiriki maslac mliječ. Pa kako ćemo sada kôd koji u C? Pa, mi here-- imaju ulogu u bold je jedini dio koji je morao provesti. Dakle, imamo 4 petlje koji je petlje 4 puta, printf-ing maslac od kikirikija mliječ, s novom linijom kao problem traži. Pitanje šest, drugi ispočetka problema. Vidimo da smo u zauvijek petlji. Mi tvrdimo varijablu ja A onda sam povećavati za 1. Sada želimo to učiniti u C. Postoje više načina bismo mogli su to učinili. Ovdje mi se dogodilo da kod zauvijek petlje kao vrijeme (pravog). Tako smo proglasiti varijable i, jednostavno kao što smo imali promjenjivu sam se ispočetka. Proglasiti varijablu ja, i zauvijek dok je (istina), možemo reći varijablu sam. Pa printf% i-- ili ste mogli ste koristili% d. Kažemo da je varijabla i zatim ga povećavati, i ++. Pitanje sedam. Sada želimo napraviti nešto vrlo slično Mario dot c od problema postaviti jednu. Želimo ispisati ove izraze s oznakom #, želimo ispisati pet po tri pravokutnika tih hashes. Pa kako ćemo to učiniti? Pa, mi vam dati cijeli hrpa koda, a vi samo moraju ispuniti u funkciji ispisa mrežu. Pa što ne PrintGrid izgledati? Pa ti si prošlost širina i visina. Dakle, imamo vanjsko 4 petlje, koja je petlje nad svim redovima ovo Rešetka da želimo ispisati. Onda imamo među ugniježđenu 4 petlju, to je tisak tijekom svakog stupca. Dakle, za svaki red, mi ispisati za svaki stupac, jedna mljeveno meso. Onda na kraju reda smo ispisali Jedan novi redak da ide u sljedeći redak. I to je to za cijelu mrežu. Pitanje osam. Funkcija kao što PrintGrid je rekao da ima nuspojava, ali ne i povratak vrijednost. Objasnite razliku. Dakle, to se oslanja na koju sjećanja ono nuspojava je. Pa, povratak value-- znamo PrintGrid ne ima povratnu vrijednost, budući Ovdje se kaže nevažeće. Dakle, sve što se vraća void zapravo ne vrati ništa. Dakle, što je nuspojava? Pa, nuspojava je sve što vrsta i dalje postoji nakon funkcija krajevima koji nije bio samo vratio, i to je bio ne samo od ulaza. Tako, na primjer, mogli bismo promijeniti globalnu varijablu. To će biti nuspojava. U ovom konkretnom slučaju, vrlo važna nuspojava ispisuje na zaslon. Tako da je nuspojava da PrintGrid ima. Tiskamo ove stvari na zaslonu. A možete misliti da kao nuspojava, jer to je nešto što ustraje nakon što je ova funkcija završava. To je nešto izvan dosega ove funkcije koje u konačnici se mijenja, Sadržaj zaslona. Pitanje devet. Razmislite program u nastavku, na koje brojeve redaka su dodani za radi rasprave. Tako je u ovom programu smo samo nazivajući GetString, pohranjivanja u ovom promjenjivom s, a zatim ispis tu varijablu s. U redu. Dakle objasniti zašto linija je jedna prisutna. #include cs50 točka h. Zašto trebamo #include cs50 točkica h? Pa mi smo zovete GetString funkciju, i GetString definiran u cs50 knjižnici. Dakle, ako nismo imali #include cs50 točka h, bismo dobili tu implicitnu izjavu od GetString funkcije pogreške iz prevodilac. Dakle, moramo uključiti library-- moramo uključiti zaglavlje datoteke, Inače prevodilac neće priznati da GetString postoji. Objasnite zašto je prisutna dva retka. Dakle standardni io točka h. To je točno isti kao i prethodne problema, osim umjesto da se bave GetString, govorimo o printf. Dakle, ako mi nije rekao nam je potrebno uključiti standardnu ​​IO točkica h, onda ne bismo mogli koristiti funkcije printf, jer prevodilac ne bi znali o tome. Why-- koje je značenje od poništiti u skladu četiri? Dakle, ovdje imamo int glavni (prazninu). To samo govori da smo ne uzimajući bilo koji naredbenog retka Argumenti za glavni. Sjetite se da bismo mogli reći int Glavni int argc niz argv zagrade. Dakle, ovdje ćemo samo reći da se praznina kažemo ignoriraju argumente naredbenog retka. Objasnite, s obzirom na memoriju, točno ono GetString u skladu šest vraća. GetString se vraća blok memorije, niz znakova. To je stvarno povratka pokazivač na prvi znak. Ne zaboravite da je niz char zvijezda. Dakle, s je pointer na prvi lik u bilo struna da je korisnik unio na tipkovnici. I to se događa memorija se malloced, tako da je memorija u gomili. Pitanje 13. Razmislite program u nastavku. Dakle, sve je to program radi je printf-ing 1 podijeljen s 10. Dakle, kada sastaviti i izvršen, ovaj program izlazi 0.0, iako 1 podijeljeno s 10 je 0,1. Pa zašto je to 0.0? Pa, to je zato što cijelog broja podjele. Pa je cijeli broj 1, 10 je cijeli broj. Dakle 1 podijeljen s 10, svega tretira kao brojeva, i C, kada radimo cijeli broj podjela, smo izrezati bilo decimalne točke. Dakle 1 podijeljeno s 10 je 0, a onda pokušavamo ispisati da kao plovak, tako nula tiskana kao float je 0.0. I to je razlog zašto smo dobili 0.0. Razmislite program u nastavku. Sada smo ispisa 0.1. Dakle, nema cijeli broj podjela, mi samo tiskanje 0,1, ali smo ga ispisujete 28 decimalnih mjesta. I što smo dobili ovu 0,1000, cijela hrpa nula, 5 5 5, bla bla bla. Dakle, pitanje je zašto to radi ispisati da je, umjesto da točno 0.1? Dakle, razlog je ovdje sada pomičnim zarezom nepreciznost. Ne zaboravite da plutaju je samo 32 bita. Dakle, možemo samo predstavlja konačan broj od pomičnim zarezom vrijednosti s tim 32 bita. Pa postoji konačnici beskonačno mnogi pomičnim zarezom vrijednosti, a tu je beskonačno mnogo pluta točka u vrijednosti između 0 i 1, a mi smo očito u stanju predstavlja još više vrijednosti nego to. Dakle, moramo napraviti žrtve biti u mogućnosti da predstavljaju većinu vrijednosti. Dakle, kao što je vrijednost 0,1, očito ne možemo predstavljati da je točno. Dakle, umjesto što predstavlja 0,1 mi najbolje što može predstavljati ovaj 0.100000 5 5 5. I to je prilično blizu, ali za puno aplikacija morate brinuti o pomičnim zarezom nepreciznost, jer mi jednostavno ne može predstavljati Svi plutajuće točke točno. Pitanje 15. Razmislite kod ispod. Mi samo ispisivanje 1 plus 1. Dakle, ne postoji trik ovdje. 1 i 1 do 2 procjenjuje i onda smo tiskanje to. To samo ispisuje 2. Pitanje 16. Sada smo ispis karakter 1 plus 1 znak. Pa zašto to ne ispisati istu stvar? Pa lik 1 plus znak 1, 1 lik ima ASCII vrijednost 49. Dakle, ovo je stvarno kaže 49 plus 49, a u konačnici to će ispisati 98. Dakle, to ne ispisuje 2. Pitanje 17. Ispunite provedbu odd dolje tako da funkcija vraća vrijedi ako n je neparan i lažna ako je n je još. To je velika svrha za mod operatora. Dakle, uzmemo našu argument n, ako je n mod 2 jednako 1, te to znači da je n podijeljeni od 2 imao ostatak. Ako n podijeljen 2 imao ostatak, koji znači da je n neparan, pa smo se vratili istinito. Inače smo se vratili lažna. Također se može učiniti n mod 2 jednako nula, return false, drugi povratak istina. Razmislite rekurzivne funkcije u nastavku. Dakle, ako je n manji od ili jednaki 1, povratak 1, drugi povratak n puta f n minus 1. Pa što je to funkcija? Pa, to je samo faktorijalni funkcija. To je lijepo zastupljena kao n faktorijalnim. Dakle, pitanje je sada 19, želimo iskoristiti ovu rekurzivni funkciju. Želimo da bude iterativan. Pa kako ćemo to učiniti? Pa za osoblje rješenje, i opet postoji više načina mogli ste učinili da počnemo s ovim proizvodom int jednak 1. I tijekom ove za petlju, idemo se množenjem proizvod u konačnici završiti s punim faktorijalnim. Tako je za int i iznosi 2, ja se manji od ili jednak N, i ++. Možda se pitate zašto sam jednak 2. Pa, sjetite se da se ovdje moramo pobrinite naš osnovni scenarij je ispravan. Dakle, ako je n manji ili jednak na 1, mi samo vraća 1. Dakle ovdje ćemo početi na sam jednak 2. Pa ako sam bila 1, a zatim the-- ili ako je n su 1, zatim za petlju neće izvršiti na sve. I tako bismo samo Povratak proizvod, koji je 1. Slično tome, ako su n ništa manje od 1-- ako su 0, negativna 1, whatever-- bismo uvijek se vraća 1, što je upravo ono što rekurzivna verzija radi. Sada, ako je n veći od 1, onda ćemo napraviti barem jednu iteracija te petlje. Pa recimo da je n 5, onda smo uraditi puta proizvoda iznosi 2. Dakle, sada je proizvod 2. Sada idemo raditi puta proizvoda iznosi 3. Sada je 6. Proizvod iznosi 4 puta, sada je 24. Proizvod puta iznosi 5, sada je 120. Pa onda u konačnici, mi smo se vraćaju 120, što je točno 5 faktorijalnim. Pitanje 20. Ovo je jedna u kojoj morate ispuniti U ovoj tablici sa svakom algoritmu, sve što smo vidjeli, da uklapa ove algoritamski trčanje puta ove asimptotička puta vožnji. Dakle, ono što je algoritam koji je omega 1, no veliki O n? Tako bi moglo biti beskonačno mnoge odgovore ovdje. Onaj koji smo vidjeli vjerojatno većina Često je samo linearno pretraživanje. Dakle, u najboljem slučaju Scenarij, stavka smo tražite u počevši od popisa i tako omega od 1 koraka, Prva stvar koju smo provjerili, samo smo se odmah vratili da smo pronašli stavke. U najgorem slučaju, predmet je na kraju, ili opcija nije na popisu uopće. Zato moramo tražiti cijeli popis, svi n elementi, i to je razlog zašto je o n. Dakle, sada je nešto što je i Omega n log n, a veliki O n log n. Pa najrelevantnija stvar vidjeli smo ovdje stapaju vrsta. Dakle, spajanje vrsta, zapamtite, je u konačnici Theta n log n, gdje je definiran theta ako oba Omega, a veliki O su isti. Oba n log n. Što je nešto što je Omega N, O i N squared? Pa, opet postoji više mogućih odgovora. Ovdje ćemo se dogoditi reći mjehur vrsta. Ubacivanje kakve će također raditi ovdje. Zapamtite da mjehur vrsta ima tu optimizaciju gdje, Ako ste u mogućnosti da biste dobili kroz cijeli popis bez potrebe za napraviti bilo swaps, onda, dobro, možemo se odmah vratiti da Popis je izdvojiti za početak. Dakle, u najboljem slučaju, to je samo omega n. Ako to nije samo lijepo razvrstani popis za početak, onda imamo O n kvadrat swaps. I na kraju, imamo izbor kakav za n kvadrat, i omega i veliki O. Pitanje 21. Što je broj preljeva? Pa opet, slično kao i ranije, imamo samo konacno mnogo bitova da predstavlja cijeli broj, pa možda 32 bita. Recimo da imamo potpisan cijeli broj. Onda u konačnici najviše pozitivan broj možemo zastupati 2 do 31 minus 1. Dakle, što će se dogoditi ako pokušamo zatim povećajte taj cijeli broj? Pa, idemo otići od 2 do 31 minus 1, pa sve do negativnog 2 do 31. Dakle, to je cijeli broj preljeva kad bi povećavati, i na kraju ne možete dobiti bilo više i to samo obaviti sve na putu natrag oko negativnu vrijednost. Što o buffer overflow? Tako tampon overflow-- sjetiti što je tampon. To je samo komad memorije. Nešto kao niz je tampon. Tako buffer overflow je kad pokušate pristupiti memorije nakon kraja tog polja. Dakle, ako imate Niz veličine 5 i vama pokušati pristupiti array držač 5 ili 6 nosač ili nosač 7, ili bilo što izvan Kraj, ili čak ništa below-- niz zagrada negativna 1-- svi oni su tampon prelijeva. Vi ste dira sjećanje na loše načine. Pitanje 23. Dakle, u ovoj vam je potrebno provesti strlen. A mi vam kažem da možete Pretpostavljam e neće biti nula, tako da ne morate učiniti bilo ček na nulu. A postoji više načina mogao si to učinio. Ovdje ćemo samo uzeti jednostavan. Počinjemo s pulta, n. n je računajući koliko znakova postoje. Tako smo započeli na 0, a onda smo ponoviti tijekom cijelog popisa. Je li s nosač 0 jednaka null terminator lik? Zapamtite tražimo null terminator znak kako bi se utvrdilo koliko je naš struna. To će prekinuti bilo relevantno niz. Tako je s nosača 0 jednaka na null terminator? Ako nije, onda ćemo pogled na e nosača 1, s 2 nosača. Mi zadržati ide dok ne pronaći nultu terminator. Kada smo ga pronašli, a zatim n sadrži Ukupna duljina niza, a mi samo možemo vratiti to. Pitanje 24. Dakle, to je onaj gdje ste moraju napraviti trade off. Dakle, jedna stvar je dobro u jednom način, ali na koji način je to loše? Pa evo, neka vrsta spajanja sklon biti brži od mjehurića vrste. Nakon što je rekao that-- dobro, postoji su više odgovora ovdje. No, glavno je da mjehurić vrsta je omega n za sortiranog popisa. Sjetite se da smo upravo vidjeli tablicu ranije. Dakle balon sortira omega n, najbolji scenarij je da je u stanju samo ići preko Lista jednom, utvrdilo hej ova stvar već razvrstani, i povratak. Spoji vrsta, bez obzira na sve što učiniti, je omega n log n. Dakle, za sortiranog popisa, balon kakve će biti brži. Sada što o povezani liste? Dakle, popis povezani može rasti i smanjiti da stane što više elemenata po potrebi. Rekavši kako that-- obično izravna usporedba će biti povezani popis s nizom. Dakle, iako nizovi mogu lako rasti i smanjivati da stane što više elemenata po potrebi, povezani popis u odnosu na array-- an Niz je slučajni pristup. Možemo indeks u bilo Posebno element niza. Tako je za popis povezani, ne možemo Samo idite na petom elementu, moramo proći od početka dok ne dođemo do petog elementa. I to će nas spriječiti radiš nešto poput binarnog pretraživanja. Govoreći o binarnom pretraživanje, binarno pretraživanje teži da bude brži od linearnog pretraživanja. Nakon što je rekao that-- Dakle, jedna stvar je moguće je da ne možete učiniti binarna potražiti na povezanim popisima, možete samo to učiniti na polja. No, vjerojatno je još važnije, ne možete napraviti binarno pretraživanje na polje koje nije razvrstano. Unaprijed možda ćete morati razvrstati polje, a tek onda može vi binarno pretraživanje. Dakle, ako je vaša stvar nije sortirati za početak, onda linearno pretraživanje može biti brži. Pitanje 27. Dakle, razmislite program u nastavku, koji će biti u sljedećem slajdu. A to je onaj gdje smo će htjeti izričito vrijednosti za razne varijable. Pa pogledajmo kako. Tako se postroje jedan. Imamo int x jednak 1. To je jedino što se dogodilo. Tako je na jednoj liniji, možemo vidjeti u našim stol, da Y, a, b, i svi su TMP onesvijestio. Dakle, ono što je x? Pa mi samo ga postaviti jednak 1. A onda se postroje dva, dobro, vidimo da je y je postavljen na 2, a stol je već popuniti za nas. Dakle, x je 1, a Y je 2. Sada, tri linije, sad smo unutar funkcije zamjenu. Što smo proći mijenjati? Prošli smo ampersand x za i znak za struju y za b. Gdje je problem ranije izjavio da adresu x je 0x10, i adresu y je 0x14. Dakle, a i b su jednaki 0x10 i 0x14, respektivno. Sada na liniji tri, što su X i Y? Pa, ništa se nije promijenilo o x i y u ovom trenutku. Iako su unutar glavnog dimnjaka okvira, oni još uvijek imaju isti Vrijednosti su činili prije. Nismo mijenjati bilo memorije. Dakle, x je 1, y je 2. U redu. Dakle, sada smo rekli int tmp jednaka zvijezda. Tako je na liniji četiri, svega je isto osim tmp. Nismo promijenili sve vrijednosti ništa osim tmp. Mi smo postavljanje tmp jednak zvijezda. Što je zvijezda? Pa, a bodovi se x, Tako zvijezda ide na jednaku x, što je 1. Dakle, sve što se kopira dolje, a TMP postavljena na 1, Sada sljedeći redak. Star je jednako star b. Dakle, po liniji five-- i opet, sve je isti, osim što god star je. Što je zvijezda? Pa, samo mi je rekao zvijezda je x. Tako smo mijenjaju x na jednako zvjezdica b. Što je zvijezda b? y. b ukazuje na y. Pa star je b y. Tako smo postavljanje x jednak y, a sve ostalo je isto. Dakle, vidimo se u sljedećem redu da x je sada 2, a ostali su samo prepisao. Sada u sljedećem retku, zvijezda b jednak tmp. Pa, samo mi je rekao zvijezda b y, tako da smo postavljanje y jednak tmp. Sve ostalo je isto, tako da sve dobiva prepisao. Mi smo postavljanje y jednak MPT, što je jedan, a sve ostalo je isto. Sada napokon, linije sedam. Vratili smo se u glavnoj funkciji. Mi smo nakon Swap završi. Mi smo izgubili A, B, i tmp, ali u konačnici smo se ne mijenjaju sve vrijednosti ništa u ovom trenutku, mi samo kopirati X i Y dolje. A vidimo da su x i y Sada 2 i 1 umjesto 1 i 2. Swap je uspješno izvršen. Pitanje 28. Pretpostavimo da naiđete poruke o pogreškama u nastavku tijekom radnog vremena iduće godine kao CA ili TF. Savjetovati kako popraviti svaki od tih pogrešaka. Dakle, nedefinirano spominjanje GetString. Zašto možda ćete vidjeti ovo? Pa, ako učenik koristi GetString u svom kodu, oni uredno hašiš uključene cs50 točka h uključiti cs50 knjižnicu. Pa, što im je činiti potrebno popraviti tu pogrešku? Oni trebaju napraviti crtica lcs50 na naredbenog retka kada su sastavljanju. Dakle, ako oni ne prolaze jeka crtica lcs50, oni su neće imati stvarne Kod koji provodi GetString. Pitanje 29. Implicitno izjavljujući Funkcija knjižnica strlen. Pa ovo sada, oni nisu obaviti odgovarajuće mljeveno meso su. U ovom konkretnom slučaju, zaglavlje datoteke što im je potrebno uključiti se niz točkica h, uključujući i gudački dot h, sada student-- sada prevodilac ima pristup izjave strlen, a zna da kodu pravilno koriste strlen. Pitanje 30. Više posto pretvorbi od podataka argumenata. Pa što je ovo? Pa sjetite se da su ti posto signs-- kako su oni relevantni za printf. Tako je u printf možemo percent-- možemo ispisati nešto kao posto sam kose crtice n. Ili možemo ispisati kao posto i, Prostor, posto ja, prostor, posto ja. Dakle, za svaku od tih posto znakovi, trebamo proći varijablu na kraju printf. Dakle, ako kažemo printf zagr posto ja backslash n bliske zagrada, dobro, možemo reći da smo će ispisati cijeli broj, ali onda mi ne prođe printf broj zapravo ispisati. Dakle ovdje više posto pretvorbi od podatkovnih argumenata? To govori da imamo cijela hrpa postotaka, a mi nemamo dovoljno varijabli zapravo popuniti u tim postocima. A onda definitivno, za pitanje 31, definitivno izgubio 40 bajta u jednom blokova. Dakle, to je pogreška Valgrind. To govori da je negdje u kodu, imate raspodjelu koja je 40 bajtova velika tako da malloced 40 bajtova, i nikada ga oslobodio. Najvjerojatnije trebate samo pronaći neki otjecanje memorije, i naći mjesto gdje trebate osloboditi ovaj blok memorije. I pitanje 32, nevažećim pisati veličine 4. Opet je to pogreška Valgrind. To ne morate učiniti s curenja memorije sada. To je, većina likely-- Mislim, to je neka vrsta nevažećih memorijskih prava. I vjerojatno je to neka svojevrsni buffer overflow. Gdje imate niz, možda cijeli niz, i neka je kažu da je veličine 5, a vi pokušajte dotaknuti array držač 5. Dakle, ako pokušate napisati na to vrijednost, to nije dio memorije da zapravo imate pristup, a tako da ćeš dobiti ovaj greška, govoreći nevažeći pisati veličine 4. Valgrind će prepoznati da ste pokušavajući dotaknuti memorije neprimjereno. I to je to za quiz0. Ja sam Rob Bowden, a to je CS50.