ROB Bowden: Živjo, jaz sem Rob Bowden, in kaj je govoril o quiz0. Torej, prvo vprašanje. To je vprašanje, kjer ste potrebovali za kodiranje številke 127 v binarnih žarnice. Če bi želeli, bi lahko storiti redno konverzijo od bi-- ali iz decimalnega v binarni. Ampak to je verjetno, da bo vzeti veliko časa. Mislim, lahko ugotovimo, da je OK, 1 je tam, 2 je tam, 4 je v tam, 8 je notri. Lažji način, 127 je 128 minus ena. Da Skrajna leva žarnica je 128-bit. Torej, 127 je res prav vse drugih žarnic, saj to je skrajno levi žarnica minus 1. To je to, za to vprašanje. Eno vprašanje. Torej s 3 bitov lahko predstavljajo 8 različni vrednosti. Zakaj, potem, je 7 največja nenegativna desetiško celo lahko predstavlja? No, če smo lahko le predstavljajo 8 različne vrednosti, potem kaj bomo, da bo predstavlja 0 do 7. 0 zavzame eno od vrednot. Vprašanje dva. Z n bitov, koliko se razlikuje vrednosti, ki jih lahko predstavlja? Torej, z n bitov, imate 2 Možne vrednosti za vsakega nekaj. Torej imamo 2 možne vrednosti Prvi bit, 2 možne vrednosti za sekundo, 2 mogoče za tretjino. In tako, da je 2-krat 2-krat 2, in na koncu je odgovor 2 do n. Vprašanje tri. Kaj je 0x50 v binarno? Torej, ne pozabite, da je v šestnajstiškem zelo enostavna pretvorba v binarno. Torej, tukaj, smo morali gledati 5 in 0 neodvisno. Torej, kaj je 5 v binarno? 0101, to je 1 bit in 4 bit. Kaj je 0 v dvojiškem? Ni zapleteno. 0000. Torej, samo jih skupaj, in da je polno število v binarno. 01010000. In če si hotel si lahko vzlet to najbolj levi nič. To je nepomembno. Torej, potem pa, kaj je 0x50 na decimalko? Če boste želeli, vam could-- če ste bolj zadovoljni z binarno, ti bi lahko to binarno odgovor in spremeniti, da na decimalko. Ali pa samo ne pozabite, da šestnajstiški. Tako da je 0 v 0-tem mestu, in 5 je v 16 do prvega kraja. Torej, tukaj imamo 5 krat 16 do Prvi, plus 0 krat 16 na nič, 80. In če si pogledal Naslov na vprašanje, je bilo CS 80, ki je bil nekako namig za odgovor na ta problem. Vprašanje pet. Imamo to scratch scenarij, ki je ponavljanje 4-krat žele arašidovo maslo. Torej, kako bomo zdaj koda v C? No, mi here-- imajo vlogo pri bold je edini del, ki ga je imel za izvedbo. Torej imamo 4 zanke, ki je zanka 4 krat, printf-ing arašidovo maslo žele, z novo linijo kot problem zahteva. Vprašanje šest, druga Scratch problem. Vidimo, da smo v večno zanko. Mi praviš spremenljivo i in nato povečevanje i s 1. Zdaj želimo narediti, da obstajajo v C. več načinov smo lahko naredili to. Tu se je zgodilo, da kodo večno zanko kot while (true). Tako izjavljamo variabilnega i, samo kot smo imeli spremenljivo jaz v nič. Razglasi spremenljivko i, in za vedno while (true), rečemo spremenljivko i. Torej printf% i-- ali pa bi jih uporabiti% d. Pravimo, da je spremenljivka, in nato prirastek, i ++. Vprašanje sedem. Zdaj želimo narediti nekaj zelo podobnega Mario dot c od problema nastaviti enega. Želimo, da natisnete te oznake tem, želimo natisniti pet za tri pravokotnik teh haše. Torej, kako bomo to naredili? No, smo vam celoten kup kode, in si morajo izpolniti funkcijo print omrežja. Torej, kaj PrintGrid izgledal? No, ti si preteklost širina in višina. Torej imamo zunanjo 4 zanka, ki je zanka nad vsemi vrstami ta omrežje, ki ga želimo natisniti. Potem imamo med ugnezdeno 4 zanke, da je tisk v vsakem stolpcu. Torej, za vsako vrsto, tiskamo za vsak stolpec, single hash. Nato na koncu vrstice tiskamo Enotna nova linija, da gredo v naslednjo vrstico. In to je to, za celotno omrežje. Vprašanje osem. Funkcija kot PrintGrid je dejal, da imajo stranske učinke, ne pa vrnitev vrednost. Pojasnite razliko. Torej, to se zanaša na vas spomnimo kaj stranski učinek. No, vrnitev value-- vemo PrintGrid ne imajo povratno vrednost, saj Tukaj piše neveljavne. Torej kaj, da se vrne void v resnici ne vrne ničesar. Torej, kaj je stranski učinek? No, stranski učinek je vse, kar nekako ne izgine Po koncu funkcijskih da ni bil pravkar vrnil, in to ni bilo samo od vhodov. Tako, na primer, bi lahko spremeniti globalno spremenljivko. Da bi bil stranski učinek. V tem konkretnem primeru, zelo pomembni stranski učinek izpisuje na zaslon. Tako, da je stranski učinek da PrintGrid ima. Tiskamo te stvari na zaslonu. In si lahko zamislite ki kot stranski učinek, saj to je nekaj, kar ponavlja, ko se konča ta funkcija. To je nekaj, kar spada na področje te funkcije, ki na koncu se spremenili, vsebina zaslona. Vprašanje devet. Razmislite program spodaj, na katere številke vrstic Dodani so bili za sake razprave. Torej, v tem programu smo pravkar kliče GetString, jo shranite V to spremenljivko s, in nato natisnete to spremenljivko s. OK. Torej, razloži, zakaj je prva vrstica prisotna. #include CS50 dot h. Zakaj moramo #include CS50 dot h? Pa smo kličeš GetString funkcijo, in GetString je definirano v knjižnici CS50. Torej, če nismo imeli #include CS50 dot h, bomo dobili, da je implicitno izjavo napake funkcije GetString od prevajalnika. Zato moramo vključiti library-- moramo vključiti datoteko glave, ali pa prevajalnik ne bo priznavajo, da GetString obstaja. Pojasnite, zakaj je druga vrstica prisotna. Torej standardno io pika h. To je popolnoma enaka kot prejšnji problem, razen, namesto da se ukvarjajo z GetString, govorimo o printf. Torej, če mi ni povedal, da potrebujemo vključuje standardni io dot h, potem ne bi mogli uporabiti funkcijo printf, ker prevajalnik ne bi vedel o tem. Why-- kaj je pomen za ničen v skladu s štirimi? Torej, tukaj imamo int main (praznino). To je samo rekel, da smo niso dobili nobenega ukazno vrstico Glavni argumenti. Ne pozabite, da lahko rečemo, int Glavni int argc niz argv nosilci. Torej, tukaj smo pravkar rekel, nična, da smo zanemarjamo argumente ukazne vrstice. Pojasnite, v zvezi s spominom, točno kaj GetString v skladu šest vrne. GetString se vrača blok spomin, nabor znakov. To je res vrača kazalec na prvi znak. Ne pozabite, da je niz char zvezda. Torej y je kazalec na prvi lik v katerikoli niz je da uporabnik vnese preko tipkovnice. In da je spomin se zgodi, da se malloced, tako, da je pomnilnik v kup. Vprašanje 13. Razmislite o programu spodaj. Tako da vse ta program počne je printf-ing 1 deljeno z 10. Torej pri zbiranju in izvajajo ta program izhodi 0.0, čeprav 1 deljeno z 10 je 0,1. Torej, zakaj je 0.0? No, to pa zato, ker za deljenje celih. Torej 1 je celo število, 10 je celo število. Torej 1 deljeno z 10, vse se obravnava kot cela števila, in C, ko bomo deljenje celih števil, smo skrajšajte vsako decimalno vejico. Torej 1 deljeno z 10 je 0, nato pa skušamo za tiskanje, ki kot likvidna sredstva, zato nič natisnjena kot likvidna sredstva, je 0,0. In zato smo dobili 0,0. Razmislite o programu spodaj. Zdaj smo tiskanje 0.1. Tako da ni celo število delitev, smo samo tiskanje 0,1, vendar smo ga za tiskanje na 28 decimalnih mest. In smo dobili to 0,1000, cel kup ničel, 5 5 5, blah blah blah. Torej je vprašanje, zakaj to počne tukaj tiskanje, da namesto natanko 0,1? Torej razlog, tukaj je zdaj plavajočo vejico nenatančnosti. Ne pozabite, da je plovec samo 32 bitov. Tako bomo lahko predstavlja le končno število s plavajočo vejico s tistimi 32 bitov. No, tam je na koncu neskončno veliko plavajočo vejico, in tam je neskončno mnogo plavajoči točkovne vrednosti v med 0 in 1, in smo očitno sposobni predstavljajo še več vrednosti, kot to. Zato moramo žrtvovati za lahko predstavljajo večino vrednosti. Tako vrednost kot 0,1, očitno ne moremo predstavljati, da je točno. Torej, namesto, ki predstavlja 0,1 delamo najboljše, kar lahko predstavlja to 0.100000 5 5 5. In to je zelo blizu, vendar za veliko aplikacij boste morali skrbeti plavajočo vejico nenatančnosti, ker preprosto ne moremo predstavljati vse plavajoče točke natančno. Vprašanje 15. Razmislite kodo spodaj. Mi samo tiskanje 1 plus 1. Torej ni trik tukaj. 1 plus 1 ovrednoti na 2, in Nato smo tiskanjem da. To preprosto natisne 2. Vprašanje 16. Zdaj smo natisnili značaja 1 plus 1 znak. Torej, zakaj se to ne počne natisniti isto stvar? No znak 1 plus znak 1 znak 1 ima ASCII vrednost 49. Torej, to se pravi: 49 plus 49, in navsezadnje to se bo tiskanje 98. Tako da to ne natisne 2. Vprašanje 17. Dokončati izvedbo čudno spodaj tako da funkcija vrne true, če n je čudno, in false, če je n celo. To je velik cilj za mod operaterja. Torej vzamemo argumenta n, če je n mod 2 enaka 1, ter to pomeni, da je n razdelimo z 2 imel preostanek. Če je n 2, deljeno s še eno preostalem, da pomeni, da je n liho, zato smo se vrnili res. Else vrnemo false. Lahko so tudi storili n mod 2 enaka nič, vrne false, sicer vrne true. Razmislite rekurzivno funkcijo spodaj. Torej, če je n manj kot ali enaka 1, vrne 1, drugje donos n krat f n minus 1. Torej, kaj je ta funkcija? No, to je samo faktorski funkcija. To je lepo zastopana kot n fakulteto. Torej, vprašanje je sedaj 19, želimo Ob tej rekurzivno funkcijo. Želimo, da bi se ponavlja. Torej, kako to storimo? Tudi za zaposlene raztopina, in spet tam več načinov, kako bi lahko naredili da smo začeli s tem int izdelka enaka 1. In ves ta zanko, gremo da se pomnoži proizvod na koncu končajo s polnim fakulteto. Torej za int i je enak 2, i manjša ali enaka n, i ++. Morda se sprašujete, zakaj sem enak 2. No, ne pozabite, da imamo tu na poskrbite, da je naša osnovna pravilna. Torej, če je n manj kot ali enaka 1, smo le vračajo 1. Torej, tukaj smo začeli na i je enak 2. No, če bi bil jaz 1, nato the-- ali če so n 1, nato pa za zanko ne bi izvršitev sploh. In tako bi mi prav Vračilo izdelek, ki je 1. Podobno, so bili, če je n nič manj kot 1-- če bi bilo 0, negativna 1, whatever-- še vedno bi se vrača 1, kar je točno to, kar rekurzivni različica počne. Zdaj, če je n večji od 1, nato pa si bomo narediti vsaj eno iteracija te zanke. Torej, recimo, da je n 5, nato pa smo storili večkrat izdelkov enak 2. Torej, zdaj je izdelek 2. Zdaj bomo storili krat izdelka enaka 3. Zdaj je 6. Krat izdelka enaka 4, zdaj pa je 24. Krat izdelka enaka 5, zdaj je 120. Torej v končni fazi, smo se vračajo 120, ki je pravilno 5 fakulteto. Vprašanje 20. To je tista, v kateri ste morali izpolniti v tej tabeli s danem algoritmu vse, kar smo videli, da prilega te algoritmično tek krat ti asimptotske časi delovanja. Torej, kaj je algoritem, ki je omega 1, a big O n? Tako bi lahko prišlo do neskončno več odgovorov tukaj. Tisti, ki smo videli verjetno najbolj Pogosto je samo linearno iskanje. Torej v najboljšem primeru scenarij, postavka smo išče je na začetek seznama in tako z omega od 1 korakov, Prva stvar, ki jo želite preveriti, smo samo takoj vrniti da smo našli postavko. V najslabšem primeru, postavka je na koncu, ali element ni na seznamu sploh. Zato moramo iskati Celoten seznam, vse n elemente, in to je razlog, zakaj je o n. Torej, sedaj pa je nekaj, kar je tako omega n log n in big O n log n. No, najbolj pomembna stvar smo videli tu zlivanjem. Torej z zlivanjem, se spomnite, navsezadnje Theta n log n, kjer je theta opredeljen če sta oba omega in velik O isti. Tako n log n. Kaj je nekaj, kar je omega n in O n na kvadrat? No, spet tam več možnih odgovorov. Tu se zgodi, da rečem mehurček vrste. Vstavitev nekako bi tudi deloval. Ne pozabite, da mehurček vrste ima to optimizacijo kjer, če ste sposobni, da bi dobili skozi celoten seznam ne da bi morali storiti morebitne zamenjave, potem, no, bomo lahko takoj vrne, da Seznam je bil razvrščen na začetku. Torej v najboljšem primeru to je samo omega n. Če to ni samo lepo razporejene seznam za začetek, potem imamo O n kvadrat zamenjavami. In končno, imamo izbire vrste za n kvadrat, tako omega in velika O. Vprašanje 21. Kaj je celo overflow? No spet, podobna prej, imamo le finitely veliko bitov da predstavljajo celo število, tako da morda 32 bitov. Recimo, da imamo podpisano celo število. Nato pa na koncu najvišje pozitivno število moremo predstavljati 2 do 31 minus 1. Torej, kaj se zgodi, če skušamo nato prirastek to celo? No, bomo šli od 2 do 31 minus 1, vse tja do negativnega 2 do 31. Torej, to je celo overflow ko boste obdržali povečevanje, in na koncu ne moreš dobili koli višje in to samo obloge vso pot nazaj okoli negativno vrednost. Kaj pa buffer overflow? Torej buffer overflow-- spomnite, kaj je buffer. To je samo kos pomnilnika. Nekaj ​​podobnega array je buffer. Torej buffer overflow je, ko ko skuša dostopiti do pomnilnika po koncu tega niza. Torej, če imate matrika velikosti 5 in vas poskušali dostopati matrike nosilec 5 ali 6 nosilec ali nosilec 7, ali kaj dlje konec, ali pa celo nič below-- matrika nosilec negativen 1-- vseh tistih, ki so varovalni preplavljena. Ste dotika spomin na slabe načine. Vprašanje 23. Tako da v tem tistega, ki ga potrebujete izvajati strlen. In vam povem, da si lahko prevzame s ne bo null, tako da ne bi bilo treba storiti vse ček za nično. In obstaja več načinov lahko bi to naredil. Tu vzemite enostavna. Začnemo s števcem, n. n je Računamo, koliko znakov obstaja. Tako smo začeli na 0, nato pa smo Ponovil skozi celoten seznam. Je y nosilec 0 enaka null terminator lik? Zapomni si iščemo null terminator znak določiti, kako dolgo je naša niz je. To se dogaja, da prekine vse pomembne niz. Torej je s oklepaj 0 enaka na null terminator? Če ni, potem si bomo poglej ov nosilec 1, e 2 konzoli. Še naprej bomo, dokler ne bomo najti null terminator. Ko smo ga našli, potem n vsebuje Skupna dolžina niza, in bomo lahko samo, da se vrnete. Vprašanje 24. Torej, to je tista, v kateri ste morali narediti kompromis. Torej, ena stvar, ki je dobra v enem način, vendar na kakšen način je to slabo? Torej, tukaj, z zlivanjem nagiba k hitreje kot nekakšen mehurček. Ob dejal that-- dobro, tam je več odgovorov tukaj. Ampak glavno pa je, da mehurček vrste je omega n za urejenem seznamu. Ne pozabite, da tabelo smo pravkar videli prej. Torej bubble razvrsti omega n, najboljši scenarij je, da je lahko samo iti čez Seznam enkrat, določi hej ta stvar je že razporejene in povratka. Zlivanjem, ne glede na to, kaj boste to storili, je omega n log n. Torej za razvrščen seznam mehurček nekako se dogaja, da se hitreje. Kaj pa zdaj povezan sezname? Tako lahko povezani seznam raste in krčila da se prilega toliko elementov, kot je potrebno. Ob dejal, da that-- običajno neposredna primerjava se bo povezana seznam s paleto. Torej, čeprav lahko nizi hitro raste in krčila da se prilega kot mnoge elemente kot je potrebno, povezani seznam primerjavi z array-- AN Niz ima naključni dostop. Mi lahko kazalo v katero koli Zlasti element matrike. Tako za povezani seznam, ne moremo pojdite na peti element, moramo prečkati od začetka dokler ne pridemo do petega elementa. In to se dogaja, da nam preprečujejo delaš nekaj podobnega binarno iskanje. Ko že govorimo o binarni iskanje, binarno iskanje kaže, da je hitreje kot linearno iskanje. Ob dejal that-- tako, ena možna stvar je, da ne moreš narediti binarno iskanje na povezanih seznamov, lahko to stori le na nizi. Verjetno pa je še pomembneje, ne moreš narediti binarno iskanje na paleto, ki ni razvrščena. Vnaprej boste morda morali razvrstiti matrika, in šele nato lahko vam binarno iskanje. Torej, če je vaša stvar, ki je ne urejene tako, da začnete z, potem bi linearna iskanje hitrejše. Vprašanje 27. Tako menijo program spodaj, ki bo v naslednji diapozitiv. In to je tista, v kateri smo želeli izrecno navesti vrednosti za različne spremenljivke. Tako da je pogled na to. Torej liniji. Imamo int x enak 1. To je edina stvar, ki se je zgodilo. Torej na prvi liniji, vidimo v našem tabela, da y, b, in TMP vse Stemnilo ven. Torej, kaj je x? Pa smo le nastavljena enaka 1. In potem vrstico dve, no, vidimo, da je y nastavljen na 2, in miza je že izpolniti za nas. Torej je x 1 in je y 2. Zdaj, linija tri, smo zdaj znotraj funkcije zamenjavi. Kaj se peljemo, da bi zamenjali? Smo opravili znak pove x za in znaka & y za b. Če težava prej navedla, da naslov x je 0x10 in naslov y je 0x14. Torej in b sta enaka 0x10 in 0x14 oz. Zdaj na liniji tri, kaj sta x in y? No, se ni nič spremenilo okoli x in y na tej točki. Čeprav oni znotraj glavnega dimnika okvirjem, imajo še vedno enaka Vrednosti so naredili prej. Nismo spreminjali spomin. Torej je x 1, y 2. Vse je v redu. Torej, zdaj smo rekli int tmp enaka zvezda. Torej na liniji štiri, vse je enaka, razen za tmp. Nismo spremenili nobene vrednosti ničesar razen tmp. Postavljamo tmp enak zvezda. Kaj je zvezda? No, a kaže na x, torej zvezda bo enaka x, ki je 1. Torej je vse kopira navzdol, in je TMP nastavljen na 1. Zdaj naslednji vrstici. Star je enaka zvezda b. Torej po liniji five-- dobro spet vse je enaka, razen glede zvezda je. Kaj je zvezda? No, mi je pravkar dejal zvezda je x. Tako da smo spreminjanje x do enakega zvezdic b. Kaj je zvezda b? y. b točke na y. Torej zvezda je b y. Tako da smo nastavitev x enak y, in vse ostalo je isto. Tako vidimo v naslednji vrstici, ki je zdaj x 2, in ostali so samo kopirali navzdol. Zdaj v naslednjo vrstico, zvezda b enaka tmp. No, mi je pravkar dejal zvezda b je y, tako da smo nastavitev y enaka tmp. Vse ostalo je enako, da dobi vse kopirali navzdol. Mi nastavitev y enak NTU, ki je on, in vse ostalo je enako. Zdaj končno, linija sedem. Vrnili smo se v glavno funkcijo. Mi smo po swap končan. Izgubili smo A, B, in tmp, toda na koncu smo se ne spreminja katerokoli vrednost karkoli na tej točki, smo samo kopirajte X in Y navzdol. In vidimo, da sta X in Y zdaj 2 in 1 namesto 1 in 2. Swap je uspešno izvedena. Vprašanje 28. Denimo, da ste naleteli na sporočila o napakah Spodaj v času uradnih ur prihodnje leto kot CA ali TF. Svetuje, kako popraviti vsako od teh napak. Torej undefined sklicevanje na GetString. Zakaj lahko vidite to? No, če študent uporablja GetString v svojem kodeksu, so Hash ustrezno vključeni CS50 dot h vključuje knjižnico CS50. No, kaj so morali to popraviti? Morajo storiti pomišljaj lcs50 na ukazni vrstici, ko si ponovno prevesti. Torej, če ne preide Jek dash lcs50, oni ne dogaja, da imajo dejansko kodo, ki izvaja GetString. Vprašanje 29. Implicitno razglasi Funkcija knjižnica strlen. No to sedaj, pa niso narejeno pravilno hash vključujejo. V tem konkretnem primeru je datoteka glava morajo vključiti, je niz dot h, vključno godalni dot h, zdaj student-- sedaj prevajalnik ima dostop do Izjave strlen, in ve, da kodo uporablja strlen pravilno. Vprašanje 30. Več odstotka konverzije od argumentov podatkov. Torej, kaj je to? Dobro se spominjam, da so ti odstotkov signs-- kako oni so pomembni za printf. Torej, v printf bi mi percent-- smo lahko natisnete nekaj kot odstotek i n poševnica nazaj. Ali bi lahko tiskamo kot odstotno i, prostor, odstotka i, prostor, odstotka i. Torej za vsakega od tistih, znaki za odstotek, se moramo prenesti spremenljivko konec printf. Torej, če rečemo printf paren odstotkov i n poševnica nazaj tesne paren, dobro, smo rekli, da smo tiskanjem celo število, potem pa mi ne gre printf število dejansko natisniti. Tako da tukaj več odstotkov pretvorbe od argumentov podatkov? Ki je rekel, da imamo cel kup odstotkih, in nimamo dovolj spremenljivk dejansko izpolnite v teh odstotkih. In potem zagotovo, pri vprašanju 31, dokončno izgubil 40 bajtov v enem blokov. Tako da je to napaka Valgrind. To se pravi, da nekje v kodi, imate dodelitev, ki je 40 bajta velika, tako da malloced 40 bajtov, in nikoli ga osvobodili. Najverjetneje morate samo da bi našli nekaj pomnilnika, in našli, če boste morali sprostiti ta blok pomnilnika. In vprašanje 32, neveljavna write velikosti 4. Tudi to je napaka Valgrind. To pa ni treba narediti v spomin razpoka zdaj. To je najbolj likely-- Mislim, da je nekakšen neveljavnih pravic pomnilnik. In najverjetneje je to nekaj neke vrste buffer overflow. Kjer imate niz, morda celo paleto in dovolimo, pravijo, da je velikosti 5, in si poskusite dotik matrično nosilec 5. Torej, če boste poskušali pisati, da vrednost, ki ni kos pomnilnika da ste dejansko imajo dostop do informacij in tako da boste dobili to napako, rekoč neveljavno pisanje velikosti 4. Valgrind se dogaja, da priznajo, da ste poskušamo dotakniti spomin neprimerno. In to je to za quiz0. Jaz sem Rob Bowden, in to je CS50.