ROB BOWDEN: Tere, ma olen Rob Bowden, ja räägime quiz0. Niisiis, esimene küsimus. See on küsimus, kus teil on vaja kodeerida number 127 binaarne pirnid. Kui soovid, võid teha regulaarselt konverteerimine alates bi-- või alates koma kahekomponentsete. Aga see ilmselt läheb võtta palju aega. Ma mõtlen, et sa võiksid aru saada, et OK, 1 on olemas, 2 on olemas, 4 on seal, 8 on seal. Lihtsam viis, 127 on 128 miinus üks. See vasakpoolsema lamp on 128-bit. Nii et 127 on tõesti ainult kõik teiste lampide sest see on kõige vasakpoolsema lambipirn miinus 1. Ongi sellele küsimusele. Küsimus üks. Nii 3 bitti saate moodustavad 8 erinevat väärtusi. Miks siis on 7 suurima mittenegatiivne koma täisarv saab esindada? Noh, kui me suudame ainult moodustavad 8 erinevat väärtuste siis mida me ei kavatse olla esindava on 0 kuni 7. 0 kulub üks väärtusi. Teine küsimus. Mis n bitti, mitu erinevat väärtusi saab te esindate? Niisiis, n bitti, siis on 2 võimalikud väärtused iga bitt. Nii et meil on 2 võimalikud väärtused esimese biti, 2 võimalikku väärtust Teise, 2 võimalik kolmanda. Ja nii see on 2 korda 2 korda 2, ja lõpuks vastus on 2 kuni n. Küsimus kolm. Mis 0x50 binaarne? Seega pidage meeles, et kuueteistkümnendsüsteemis on väga lihtne teisendamine binaarne. Nii et siin me lihtsalt peame vaatama 5 ja 0 iseseisvalt. Mis on 5 binaarne? 0101, see on 1 bit ja 4 bit. Mis on 0 binaarne? Ei ole keeruline. 0000. Nii lihtsalt neid koos, ja see on täielik number kahendsüsteemis. 01010000. Ja kui sa tahad, võid sa startida, et kõige vasakpoolsema null. See on oluline. Nii siis alternatiivina mis on 0x50 kümnendsüsteemis? Kui sa tahad, siis could-- kui sa oled rohkem rahul binaarne, siis võiks võtta, et binaarne vastus ja muuta seda arvesse koma. Või me võiks lihtsalt meeles et kuueteistkümnendsüsteemis. Nii et 0 on 0-nda koha ja 5 on 16 kuni esimese koha. Nii et siin on meil 5 korda 16 esimene pluss 0 korda 16. null, 80. Ja kui sa vaatasid Pealkirjas esitatud küsimusele, see oli CS 80, mis oli omamoodi vihjet vastus sellele probleemile. Küsimus viis. Meil on see Scratch script, mis on korrates 4 korda maapähklivõi kapslites. Niisiis, kuidas me nüüd koodi, mis on C? Noh, meil on siin-- osa rasvases on ainus osa, mida tuli rakendada. Nii et meil on 4 silmust, mis on silmukoiminen 4 korda printf-se maapähklivõi želee uue liini probleemi küsib. Küsimus kuus, teine ​​Scratch probleem. Me näeme, et oleme igavesti silmus. Me räägid muutuja i ja siis incrementing i poolt 1. Nüüd tahame seda teha C. On mitmel moel võiksime seda teinud. Siin juhtus koodi igavesti silmus nagu while (true). Nii et me kuulutab muutuja i, lihtsalt nagu meil oli muutuja i Scratch. Tunnistada muutuja i ja igavesti while (true), ütleme muutuja i. Nii printf% i-- või võid olen kasutanud% d. Me ütleme, et muutuva ja siis juurdekasvu see, i ++. Küsimus seitse. Nüüd tahame teha midagi väga sarnast Mario dot c probleemsete määrata ühe. Me soovime printida need hashtags, me tahame, et printida viis kolme ristküliku nende räsi. Niisiis, kuidas me saame seda teha? Noh, anname kogu hunnik koodi, ja sa lihtsalt pea täitma trükivõrgustik funktsiooni. Mis siis PrintGrid välja näeb? Noh sa oled varem laius ja kõrgus. Nii et meil on välimise 4 loop, mis on silmukoiminen üle kõik read käesoleva grid, et me tahame välja printida. Siis on meil inter-astmeline 4 silmuse, see on trükkimise üle igas veerus. Nii et igas reas, me trükkida igas veerus, ühe hash. Siis lõpus reas me printida ühe uue liini, et minna järgmisele reale. Ja ongi kogu võrku. Küsimus kaheksa. Funktsioon nagu PrintGrid on öelnud, et on kõrvaltoime, kuid mitte tagasi väärtus. Selgitage vahet. Nii et see sõltub sinust mäleta mida kõrvaltoime on. Noh, tagasi value-- me teame PrintGrid ei on tagastatav väärtus, sest Siin on öeldud, tühine. Nii et midagi, mis tagastab void ei ole tegelikult tagasi midagi. Mis on kõrvalmõju? Noh, kõrvaltoime on midagi, mis justkui ei kao pärast funktsiooni otsad mis ei olnud just tagasi, ja see ei olnud just alates sisendeid. Nii näiteks, me võiksime muuta globaalne muutuja. See oleks kõrvaltoime. Sellisel juhul väga oluline kõrvaltoime trükib ekraanile. Nii et on kõrvaltoime et PrintGrid on. Trükime neid asju ekraanil. Ja sa ei mõtle et kuna kõrvalmõjuna sest see on midagi, mis püsib pärast seda funktsiooni lõpeb. See on midagi väljapoole Selle funktsiooni, mis lõpuks on muutunud, sisu ekraanile. Küsimus üheksa. Mõtle programmi alla, mille liini numbrid on lisatud Huvides arutelu. Nii et selles programmis oleme lihtsalt kutsudes getString, talletades seda See muutuja s ja seejärel trükkimine muutuja s. OK. Niisiis, miks rida üks on olemas. #include CS50 dot h. Miks me peame # include CS50 dot h? Noh me helistades GetString funktsiooni ja getString on määratletud aastal CS50 raamatukogu. Nii et kui meil ei oleks #include CS50 dot h, saaksime, et kaudne deklaratsioon Euroopa getString funktsioon viga alates tõlkija. Seega on meil vaja lisada library-- vajame lisada päises faili muidu kompilaator ei tunnistama, et getString olemas. Selgitage, miks rida kaks on kohal. Nii standard io dot h. See on täpselt sama nagu eelmises ülesandes, välja arvatud asemel tegelevad GetString, me räägime printf. Nii et kui me ei öelnud, peame lisada standard io dot h, siis me ei saaks kasutada printf funktsiooni sest kompilaatori ei tea midagi. Miks-- mida tähendab on tühine rida neli? Nii et siin on meil int main (void). See on lihtsalt öeldes, et me ei saa mingit käsurea argumente peamine. Pea meeles, et me võiksime öelda, int Peamine int argc string argv sulgudes. Nii et siin me lihtsalt öelda void öelda, et me eirad käsurea argumente. Selgitage, seoses mälu, täpselt mida getString kooskõlas kuus tulu. GetString on tagasi ploki mälu, array tähemärki. See on tõesti tagastamine kursor esimene märk. Pea meeles, et string on char täht. Nii s on viit esimest märgi mis tahes string on et kasutaja sisestatud klaviatuuri. Ja see mälu juhtub olema malloced, nii, et mälu on hunnik. 13. küsimus. Mõtle programmi alla. Nii et kõik see programm teeb on printf-se 1 jagatud 10. Nii et kui on koostatud ja teostatakse käesoleva programmi väljundid 0.0, kuigi 1 jagatud 10 on 0,1. Miks on nii, 0.0? Noh, see on sellepärast, täisarv rajoon. Nii 1 on täisarv, 10 on täisarv. Nii et 1 jagatud 10, kõik käsitatakse täisarvud, ja C, kui me teeme täisarv rajoonis me kärpima iga koma. Nii 1 jagatud 10 0, ja siis me üritame printida, et float, nii null trükkida float on 0,0. Ja see on põhjus, miks me saada 0,0. Mõtle programmi alla. Nüüd oleme trükkimine 0.1. Seega ei ole täisarv rajoonis me lihtsalt printimisel 0,1, kuid me printimine 28 komakohta. Ja me saame selle 0.1000, terve hunnik nulli, 5 5 5, blah blah blah. Nii et küsimus on selles, miks seda teeb printida, et selle asemel täpselt 0,1? Nii et põhjus, miks siin on nüüd ujukoma ebatäpsus. Pea meeles, et float on ainult 32 bitti. Nii saame esindada vaid piiratud arv ujukoma väärtused nende 32 bittides. Noh seal on lõpuks lõpmatult palju murdarve, ja seal on lõpmata palju ujuva punkti väärtused 0 ja 1 vahel, ja me ilmselt võimalik esindada veelgi väärtused kui see. Nii et me peame tegema ohverdusi olema võimeline esindama Kõige väärtusi. Nii väärtus nagu 0,1, ilmselt Me ei saa esindada, et täpselt. Seega selle asemel, mis esindab 0,1 teeme saame kõige paremini esindada selles 0.100000 5 5 5. Ja see on üsna lähedal, kuid jaoks palju rakendusi sa ei pea muretsema ujukoma ebatäpsus, sest me lihtsalt ei saa esindada kõik ujuvad punktid täpselt. 15. küsimus. Mõtle turvakood. Me lihtsalt printimisel 1 pluss 1. Seega ei ole trikk. 1 pluss 1 hindab kuni 2 ja siis me printimisel seda. See lihtsalt prindib 2. 16. küsimus. Nüüd oleme trükkimine iseloomu 1 pluss iseloomu 1. Kuidas see ei printida sama asi? Noh iseloomu 1 pluss märk 1, iseloomu 1 on ASCII väärtus 49. Nii et see on tõesti öelda, 49 pluss 49, ja lõpuks see saab printida 98. Nii et see ei prindi 2. 17. küsimus. Viia lõpule paaritu allpool sellisel viisil et funktsioon tagastab true, kui n on paaritu ja vale, kui n on paarisarv. See on suur eesmärk jaoks mod operaator. Nii et me võtame argument n, Kui n mod 2 võrdub 1, ning see tähendab, et n jagatud 2 olid ülejäänud. Kui n jagatud 2 oli ülejäänud, et tähendab, et n on paaritu, nii et me naasta tõsi. Else me tagasi vale. Samuti oleks võinud teha n mod 2 võrdsete null, tagastab false, muidu tagastab tõsi. Mõtle rekursiivne funktsioon allpool. Seega, kui n on väiksem või võrdne 1, tagastab 1, muidu tagastamise n korda f n miinus 1. Mis siis on see funktsioon? Noh, see on lihtsalt faktoriaali funktsiooni. See on kenasti esindatud kui n faktoriaal. Nii et küsimus 19 nüüd tahame seda rekursiivne funktsioon. Me tahame, et see korduv. Niisiis, kuidas me seda teeme? Noh töötajatele lahusega ja uuesti seal mitmel moel saad võinud teha et hakkame seda int toode võrdub 1. Ja kogu selle silmus, me läheme tuleb korrutades toote lõppkokkuvõttes lõpuks täielik faktoriaali. Nii int i võrdub 2, i väiksem või võrdne n, i ++. Sa võid olla ei tea, miks ma võrdub 2. Noh, pea meeles, et siin on meil veenduge, et meie baasi puhul on õige. Seega, kui n on väiksem või võrdne 1, me lihtsalt naasmist 1. Nii et siin me algavad i võrdub 2. Noh, kui ma oleksin 1, siis the-- või kui n oli 1, siis silmus ei täita üldse. Ja nii me oleks lihtsalt tagastamise toote, mis on 1. Samamoodi, kui n olid midagi alla 1-- kui see oleks 0, negatiivne 1 whatever-- me tahaks ikkagi naasevad 1 mis on täpselt see, mida rekursiivne versioon teeb. Nüüd, kui n on suurem kui 1, siis me läheme teha vähemalt üks iteratsiooni see silmus. Ütleme, et n on 5, siis me oleme kavatse teha toode korda võrdub 2. Nüüd toode on 2. Nüüd me ei kavatse teha Toodete korda võrdub 3. Nüüd on 6. Toote korda võrdub 4, nüüd on 24. Toote korda võrdub 5, nüüd on 120. Siis lõpuks, me naasmist 120, mis on korrektselt 5 faktoriaal. 20. küsimus. See on see, kus sa pead täitma Selles tabelis koos mis tahes algoritm, midagi, mida me oleme näinud, et sobib nende algoritmilise perspektiivis Kohati need asümptootiliseks perspektiivis korda. Mis siis on algoritm, mis on omega 1, kuid suur O n? Nii ei saa olla lõpmatult palju vastuseid siin. Üks, mis me oleme näinud ilmselt kõige sageli on lihtsalt lineaarne otsing. Nii et parimal juhul stsenaariumi kirje oleme otsin on alustades nimekirja ja nii omega 1 etappe, Esimene asi, mida me kontrollime, me lihtsalt kohe tagasi mis me leidsime objekt. In halvimal juhul, objekt on lõpus, või objekt ei ole nimekirjas üldse. Nii et me peame otsima kogu nimekiri kõik n elemente, ja see on põhjus, miks see o n. Nüüd on see midagi, mis on nii omega n log n, ja suur O n log n. Noh kõige olulisemad asi oleme näinud siin on liita omamoodi. Nii Mestimissortimine, pea meeles, Lõppkokkuvõttes on teeta n log n, kus teeta on määratletud kui mõlemad omega ja suured O on sama. Nii n log n. Mis on midagi, mis on omega n ja O n ruudus? Noh, jälle seal mitu võimalikku vastust. Siin juhtub öelda mull sorteerida. Lisatakse omamoodi ka siin töötada. Pea meeles, et mull omamoodi on, et optimeerida, kui kui teil on võimalus saada läbi kogu nimekiri ilma et oleks vaja teha iga vahetuslepingud, siis, noh, saame kohe tagasi, et loetelu on järjestatud alustada. Nii et parimal juhul see on lihtsalt omega n. Kui see ei ole lihtsalt kenasti järjestatud loetelu alustada, siis meil on O n ruudus vahetustehinguid. Ja lõpuks on meil valik sorteeri n ruudus, nii omega ja suur O. 21. küsimus. Mis on täisarv ülevool? Hästi taas sarnane varem meil on ainult finitely palju bitte kuni täisarv, et äkki 32 bitti. Oletame, et meil on allkirjastatud täisarv. Siis lõpuks kõrgeima positiivne arv saame esindada on 2 kuni 31 miinus 1. Mis juhtub, kui me püüame siis juurdekasvu et täisarv? Noh, me läheme 2 kuni 31 miinus 1, kõik viis kuni negatiivne 2 kuni 31. Nii et see täisarv ülevool on kui te ei hoia suurendamist, ja lõpuks sa ei saa saa midagi suurem ja see lihtsalt wrapid kogu tee tagasi ümber negatiivse väärtusega. Aga buffer overflow? Nii puhver overflow-- mäletad, mida on puhvri. See on lihtsalt patakas mälu. Midagi massiiv on puhver. Nii buffer overflow on siis, kui püüad pääseda mälu tähtaja möödumisest, et massiivi. Nii et kui teil on massiivi suurus 5 ja te üritada pääsu massiivi sulg 5 või sulg 6 või sulg 7 või midagi peale lõpus või isegi midagi below-- massiivi sulg negatiivne 1-- kõik need on puhver üle ajama. Sa puudutad mälu halb viisil. Küsimus 23. Nii et see, mida vaja rakendada strlen. Ja me öelda, et sa ei saa eeldada s ei ole null, nii et sa ei pea teha mis tahes kontrollimisi for null. Ja seal on mitu võimalust sa oleks võinud teha seda. Siin me lihtsalt võtta selge. Alustame counter, n. n on lugedes, kui palju märke on. Nii et hakkame 0, ja siis me itereerima kogu nimekirja. Kas te sulg 0 võrdub null terminaator iseloomu? Pea meeles, me otsime null terminaator iseloomu et määrata, kui kaua meie string. See läheb lõpetada kõik asjakohased string. Nii on s sulg 0 võrdse et null terminaator? Kui see ei ole, siis me ei kavatse vaadata s sulg 1, s sulg 2. Hoiame läheb kuni me leida null terminaator. Kui oleme leidnud, siis siis n sisaldab kogupikkus string, ja me saame lihtsalt tagasi seda. Küsimus 24. Nii et see on see, kus te pead tegema kompromiss. Nii et üks asi on hea ühes Muide, kuid mil viisil on see halb? Nii et siin, liita omamoodi kipub kiirem mull sorteerida. Olles seda öelnud selle-- hästi, siis on mitu vastust siin. Kuid peamine on see, et mull omamoodi on omega n jaoks sorteeritud nimekirja. Pea meeles, et tabel me just nägime. Nii mull sorteerib omega n, mis oleks parim stsenaarium on see võimalik lihtsalt minna üle nimekiri kord kindlaks hey see asi on juba sorteeritud ja tagasi. Mestimissortimine, ükskõik mida sa teed, on omega n log n. Nii sorteeritud nimekirja, mull sorteeri läheb kiiremaks. Nüüd kuidas ahelloendid? Nii ahelloend võib kasvada ja kahaneb sobitada nii palju elemente nagu vaja. Olles seda öelnud selle-- nii tavaliselt otsene võrdlus saab olema seotud nimekirja koos hulga. Nii et kuigi massiive saab kasva ja kahaneb sobitada nii palju elemente kui vaja, ahelloend võrreldes array-- massiiv on ligi pääsema. Saame indeks ühessegi eriti massiivi element. Nii ahelloend, me ei saa minge viies element, meil läbida algusest kuni saame viiendale element. Ja see läheb meid takistada midagi nagu binaarne otsing. Rääkides binaarne otsing, binaarne otsing kipub olema kiirem kui lineaarne otsing. Olles seda öelnud selle-- Niisiis, üks võimalik asi on see, et te ei saa teha binaarne otsi ahelloendid, saab ainult teha seda massiivid. Aga ilmselt veelgi olulisem, sa ei saa binaarne otsing massiivi, mis ei ole järjestatud. Ettemaksu peate sorteeri massiiv, ja alles siis saab sa binaarne otsing. Nii et kui sinu asi ei ole sorteeritud alustada, siis lineaarne otsing võiks olla kiirem. Küsimus 27. Nii leiavad programmi alla, mis saab olema järgmise slaidi. Ja see on see, kus me oleme tahame seda selgesõnaliselt väärtused erinevate muutujad. Nii et vaatame seda. Nii liinile üks. Meil on int x võrdub 1. See on ainuke asi, mis juhtus. Nii real üks, näeme meie tabelis, et y, a, b ja tmp on kõik Mustaks värvitud. Mis on x? Noh me lihtsalt seadke see võrdub 1. Ja siis liinile kaks, noh, näeme, et y on seatud 2 ja laud on juba täidetakse meile. Nii x on 1 ja y on 2. Nüüd joon kolm, me oleme nüüd sees swap funktsiooni. Mida me edasi vahetada? Me sooritanud ampersand x ja-märk y b. Kui probleem varem märkis, et aadress x on 0x10 ja aadress y on 0x14. Nii ja b on võrdne 0x10 ja 0x14 võrra. Nüüd joon kolm, siis mis on x ja y? Noh, midagi ei ole muutunud umbes x ja y selles punktis. Kuigi nad on sees peamine freimi, nad ikkagi sama väärtused nad tegid varem. Oleme modifitseerimata tahes mälu. Nii x on 1, y on 2. Hea küll. Nii et nüüd me ütlesime int tmp võrdne täht. Nii real neli, kõik on sama, välja arvatud tmp. Me ei ole muutnud väärtused midagi peale tmp. Me millega tmp võrdne täht. Mis on täht? Noh, punktid x, siis täht läheb võrdne x, mis on 1. Nii et kõik on kopeeritud alla ja tmp on 1. Nüüd järgmisel real. Star võrdub star b. Nii realt five-- jälle hästi, kõik on samad, välja arvatud mis tahes täht on. Mis on täht? Noh, me just ütles staar on x. Nii et me muutuvas x võrdsele star b. Mis on täht b? y. b punktide y. Nii täht b on y. Nii et me milles x on võrdne y, ja kõik muu on sama. Nii näeme järgmisel real, et x on nüüd 2, ja ülejäänud on lihtsalt kopeeritud maha. Nüüd järgmisel real, star b võrdub tmp. Noh, me just ütles staar b on y, nii et me oleme milles y on võrdne tmp. Kõik muu on sama, nii et kõik saab kopeeritud maha. Me milles y on võrdne tmp, mis on üks ja kõik muu on sama. Nüüd lõpuks, liin seitse. Oleme tagasi põhiülesanne. Oleme pärast swap on lõppenud. Me oleme kaotanud, b ja tmp, kuid lõppkokkuvõttes oleme ei muutu üldse väärtusi midagi selles punktis, me lihtsalt kopeerida x ja y maha. Ja me näeme, et x ja y on nüüd 2 ja 1 asemel 1 ja 2. Swap on edukalt täidetud. Küsimus 28. Oletame, et sul tekib veateated Allpool tööajal järgmisel aastal, kui CA või TF. Soovitage, kuidas määrata igale neist vigadest. Nii määratlemata viide getString. Miks võiks sa näed seda? Noh, kui õpilane kasutab GetString oma koodi nad on korralikult Hash lisatud CS50 dot h lisada CS50 raamatukogu. Noh, mida nad vaja määrata see viga? Nad peavad tegema kriips lcs50 juures käsurea kui nad koostamiseks. Nii et kui nad ei liigu rõkkama kriips lcs50, nad ei kavatse olla tegelik kood, mis rakendab getString. Küsimus 29. Kaudselt kuulutatakse raamatukogu funktsiooni strlen. Noh see nüüd, nad ei ole teha õige hash hulka. Sel juhul päisefailis nad peavad sisaldama, on string dot h, ja sealhulgas string dot h, nüüd student-- nüüd koostaja on juurdepääs deklaratsioonide strlen, ja ta teab, et oma koodi kasutab strlen õigesti. Küsimus 30. Rohkem protsenti konverteerimine kui andmed argumente. Nii et mis see on? Mäletan hästi, et need protsenti signs-- kuidas nad olulised printf. Nii printf võiksime percent-- me võime printida midagi nagu protsenti i längkriipsu n. Või me võiksime trükkida nagu protsenti i, ruumi protsenti i, ruumi protsenti i. Nii on iga kõnealuse protsenti märke, peame sooritama muutuva lõpus printf. Nii et kui me ütleme printf paren protsenti i längkriipsu n lähedal paren, noh, ütleme, et me oleme trükkimineku täisarv, aga siis me ei liigu printf täisarv tegelikult printida. Nii et siin enam protsenti tulemusi kui andmed argumendid? See ütleb, et meil on terve hulk protsentides, ja meil ei ole piisavalt muutujad tegelikult täita neid protsente. Ja siis kindlasti, et küsimus 31, lõplikult kaotanud 40 baiti ühes plokke. Nii et see on Valgrind viga. See on selge, et kuskil oma koodi, teil on jaotus, mis on 40 baiti suur, et sa malloced 40 baiti, ja sa ei vabanenud ta. Tõenäoliselt sa lihtsalt vaja leida mõned Mälulekke ja leida, kui teil on vaja tasuta selle ploki mälu. Ja küsimus 32 kehtetuks kirjutada suuruse 4. Jällegi on see Valgrind viga. Seda ei pea tegema mäluvool nüüd. See on kõige likely-- Ma mõtlen, et see on mingi vigane mälu õigusi. Ja kõige tõenäolisem see on mingi omamoodi buffer overflow. Kui teil on massiiv, võibolla täisarv massiiv, ja olgem öelda, et see suurus 5, ja sa proovige puudutada massiivi sulg 5. Nii et kui sa püüad kirjutada, et väärtus, see pole tükk mälu et sa tegelikult juurdepääsu ja et sa lähed, et saada selle vea, öeldes vale kirjutada suuruse 4. Valgrind läheb tunnistama oled püüdes puudutada mälu sobimatult. Ja see on see quiz0. Ma olen Rob Bowden ja see on CS50.