ROB BOWDEN: Szia, én vagyok Rob Bowden, és beszéljünk quiz0. Szóval, az első kérdés. Ez az a kérdés, ahol Ön kódolásához szükséges szám 127 bináris izzók. Ha akarta, akkor nem a rendes átalakítás származó bi-- vagy a decimális bináris. De ami talán megy hogy egy csomó időt. Úgy értem, akkor rájövünk, hogy, OK, 1 ott 2 van ott, 4. ott, 8 ott. Könnyebb út, 127 128 mínusz egy. Ez a bal oldali izzó a 128 bit. Tehát 127 tényleg csak minden A többi izzók, mivel ez a bal szélső izzó mínusz 1. Ez azt a kérdést. Kérdés egy. Tehát 3 bit tudsz képvisel 8 különböző értékeket. Akkor miért 7 a legnagyobb nem-negatív decimális egész akkor képvisel? Nos, ha csak 8 különböző értéket képviselnek, akkor mi leszünk képviselő a 0-tól 7. 0 vesz fel az egyik értéket. Kérdés kettő. Az n bit, hány különböző értékeket képviselt? Tehát n bit, van 2 lehetséges értékeket minden bit. Tehát van 2 lehetséges értéke az első bit, 2 lehetséges értékei a második, 2 lehetséges, hogy a harmadik. És ez 2-szer 2-szer 2-es és végül a válasz 2 n. Kérdés három. Mi 0x50 bináris? Úgy emlékszem, hogy a hexadecimális nagyon egyszerű átalakítás bináris. Tehát itt, csak meg kell nézni az 5, és a 0 függetlenül. Szóval mi 5 bináris? 0101, ez az 1 bit és 4 bit. Mi 0. bináris? Nem bonyolult. 0000. Tehát csak őket össze, és ez a teljes szám binárisan. 01.010.000. És ha akartam, lehetett vegye le, hogy a legbaloldalibb nulla. Ez lényegtelen. Szóval akkor alternatívaként, mi van 0x50 tizedes? Ha akarta, akkor could-- ha kényelmesebb a bináris, meg tudná venni, hogy a bináris válasz és átalakítani, hogy a tizedes át. Vagy tudnánk emlékezni hogy hexadecimális. Annak érdekében, hogy a 0 a 0-ik helyen, és Az 5 van a 16 az első helyen. Tehát itt, van 5-ször 16-a első, plusz 0 alkalommal 16 a nulla, 80. És ha nézte a cím arra a kérdésre, ez volt a CS 80, ami egyfajta tipp, hogy a válasz erre a problémára. Kérdés öt. Van ez a Scratch script, ami 4-szer ismétlődő mogyoróvaj zselé. Szóval hogyan most kódot, hogy a C? Nos, mi a here-- részt merész az egyetlen olyan része kellett végrehajtani. Tehát van egy 4 hurok, ami hurkolás 4 alkalommal, printf-nek mogyoróvaj zselé, az új vonal, mint a probléma kér. Kérdés hat másik Scratch probléma. Látjuk, hogy mi vagyunk a hurok örökre. Azt mondod, hogy az i változó majd megnő i 1. Most akarom, hogy a C. Van többféle módon tudtuk volna ezt. Itt történt, hogy a kódot örökre hurok a while (true). Így kijelentjük i változó, csak mint volt változó i Scratch. Állapítsa meg az i változó, és örökre while (true), akkor mondjuk az i változó. Így printf% én-- vagy lehetett volna használni:% d. Azt mondjuk, hogy a változó, és akkor megnöveljük, i ++. Kérdés hét. Most akarok valami nagyon hasonlót Mario pont c a problémás beállított egy. Azt akarjuk, hogy nyomtatni ezeket hashtags, szeretnénk nyomtatni öt három téglalap ilyen hash-eket. Szóval, hogyan fogjuk csinálni? Nos, kapsz egy egész csomó kód, és csak kell kitölteni a nyomtatási rács funkciót. Szóval, mit PrintGrid néz ki? Hát te vagy az elmúlt szélesség és a magasság. Tehát egy külső 4 hurok, ami loop át az összes a sorok az e rács, amit szeretnénk kinyomtatni. Aztán ott van az inter beágyazott 4 hurok, ez a nyomtatás az egyes oszlop. Így minden sorban, mi nyomtatásra minden oszlop, egy hash. Aztán a végén a sor akkor nyomtasson egy új sort, hogy menjen a következő sor. És ez az egész hálózatra. Kérdés nyolc. A függvény mint PrintGrid azt mondta, hogy van egy mellékhatás, de nem a visszatérés érték. Magyarázza meg a különbséget. Szóval ez támaszkodik te emlékezve mi a mellékhatás is. Nos, a visszatérés value-- tudjuk PrintGrid nem van visszatérési értéke, mivel itt azt mondja semmis. Tehát bármi, ami visszaadja void nem igazán vissza semmit. Tehát mi a mellékhatás? Nos, a jelentkező mellékhatások bármit, ami a fajta is fennáll miután a függvény véget ér hogy nem tért vissza, és ez nem csak a bemenet. Így, például, mi talán megváltoztat egy globális változót. Ez lenne egy mellékhatás. Ebben a konkrét esetben, egy Nagyon fontos mellékhatás nyomtatja a képernyőre. Így ez egy mellékhatás hogy PrintGrid van. Nyomtatunk ezeket a dolgokat a képernyőn. És tudod gondolni hogy mellékhatásként, mivel ez a valami, után is fennáll ez a funkció véget ér. Ez valami körén kívül eső ezt a funkciót, ami végül alatt megváltozott, az tartalmát a képernyőn. Kérdés kilenc. Tekintsük az alábbi program, amelyhez sorszámok adtak a a vita kedvéért. Tehát ezt a programot csak hívás getString, tárolás Ez a változó s parancsot, majd kinyomtatná a változó s. OK. Szóval, miért vonalon van jelen. #include CS50 pont h. Miért van szükségünk a #include CS50 pont h? Nos, mi a hívás GetString funkció, és getString meghatározása A CS50 könyvtárban. Tehát, ha nem is #include CS50 pont h, kapnánk, hogy az implicit nyilatkozat A getString függvény hiba a fordító. Tehát meg kell, hogy tartalmazza a library-- kell, hogy tartalmazza a header file, vagy pedig a fordító nem fog elismerik, hogy getString létezik. Magyarázd meg, miért kettesen van jelen. Tehát szabványos io pont h. Ez pontosan ugyanaz mint a korábbi probléma, kivéve helyett foglalkozik GetString, beszélünk printf. Tehát, ha nem mondjuk meg kell hogy tartalmazzák a standard io pont h, akkor nem lesz képes használja a printf függvény, mert a fordító Nem tud róla. Why-- mi a jelentősége A semmissé sorban négy? Tehát itt van int main (void). Ez csak annyit mondok, hogy Nem kapok semmilyen parancsot a fő érvek. Ne feledje, hogy azt mondhatjuk, int Fő int argc karakterlánc argv zárójelben. Tehát itt csak azt mondani, hogy érvénytelen figyelmen kívül hagyják parancssori paramétereket. Magyarázza, tekintettel a memória, pontosan mi getString sorban hat vissza. GetString visszatér a blokk memória, egy sor karaktert. Ez tényleg visszatér a mutató az első karaktert. Ne feledje, hogy a húr egy char kategóriájú. Így s egy mutató az első karakter bármilyen a húr hogy a felhasználó a billentyűzeten keresztül bevitt. És, hogy a memória előfordul, hogy malloced, hogy a memória a kupac. 13. kérdés. Tekintsük az alábbi program. Szóval az egész programot csinál A printf-nek 1 osztva 10-zel. Tehát, amikor összeállítják és végre, ez a program 0.0 kimenetek, bár 1 osztva 10 0.1. Miért van ez 0.0? Nos, ez azért van, mert Az egész osztály. Így 1 egész szám, 10 egy egész szám. Tehát 1 osztva 10 minden kezelik egészek, és a C, mikor mi egész osztály, mi csonkolni bármely tizedes pont. Tehát 1 osztva 10 0, és akkor próbálunk nyomtatni, hogy mivel a float, így nulla nyomtatva a float 0.0. És ez az, amiért kap 0.0. Tekintsük az alábbi program. Most már a nyomtatás 0.1. Tehát nem egész osztály, mi csak a nyomtatás 0,1, de mi azt nyomtatás 28 tizedesjegy pontossággal. És hogy ez 0,1000, egy egész csomó A nulla, 5 5 5, bla-bla-bla. Tehát a kérdés az, hogy miért csinálja nyomtatni, hogy ahelyett, hogy pontosan 0,1? Tehát az ok itt van most lebegőpontos pontatlanság. Ne feledje, hogy a float csak 32 bites. Tehát csak akkor jelenthet véges lebegőpontos értékek azok 32 bit. Hát van végül végtelenül sok lebegőpontos értékek, és van végtelen sok úszó pont értékek 0 és 1 közötti, és mi nyilvánvalóan képesek jelentenek még több értéket, mint ezt. Tehát van, hogy áldozatokat képes képviselni legtöbb értékeket. Tehát az érték, mint a 0.1, látszólag nem tudjuk pontosan, hogy a képviselt. Tehát ahelyett, hogy képviselő 0,1 mi az legjobb, amit képviselni ezt 0.100000 5 5 5. És ez elég közel, de a sok alkalmazás Önnek nem kell aggódnia lebegőpontos pontatlanság, mert egyszerűen nem képviseli összes lebegő pontokat pontosan. 15. kérdés. Tekintsük az alábbi kódot. Mi csak a nyomtatás 1 plusz 1. Tehát nincs trükk itt. 1 plusz 1 értékeli a 2. és akkor mi a nyomtatás azt. Ez mindig csak 2. 16. kérdés. Most már a nyomtatás a karakter 1 + 1 a karakter. Szóval, miért nem ez nyomtassa ugyanaz a dolog? Nos, a karakter 1 és a karakter 1, a karakter ASCII értéke 1-nek 49. Tehát ez valójában azt mondja: 49 plusz 49, és végül ez fog nyomtatni 98. Szóval ez nem nyomtat 2. 17. kérdés. Töltse ki a végrehajtás A páratlan alatt oly módon, hogy a függvény értéke igaz, ha n páratlan, és hamis, ha n páros. Ez egy nagy cél A mod operátor. Így vesszük érv n, ha n mod 2 egyenlő 1-gyel, valamint ez azt jelenti, hogy n megosztott 2 volt a maradék. Ha n osztva 2 volt a maradék, ami azt jelenti, hogy n páratlan, ezért vissza igaz. Különben visszatérünk hamis. Azt is lehetett volna n mod 2értéke nulla, return false, különben vissza igaz. Tekintsük a rekurzív függvény alatt. Így ha n értéke kisebb, mint, vagy egyenlő 1-gyel, vissza 1, else return f n-szer n-mínusz 1. Szóval mi ez a funkció? Nos, ez csak a faktoriális függvény. Ezt szépen képviselteti magát n faktoriális. Tehát kérdés 19 most, szeretnénk ezt rekurzív függvény. Azt szeretnénk, hogy az iteratív. Szóval hogyan lehet csinálni? Nos, a személyzet megoldás, és megint ott van többféle módon lehetett volna hogy kezdjük ezzel int termék értéke 1. És a jelen A hurok, megyünk kell szorozni a termék, hogy végül a végén a teljes faktoriális. Így int i = 2, i kisebb vagy egyenlő n, i ++. Lehet, hogy vajon miért az i értéke 2. Nos, ne feledje, hogy itt van, hogy győződjön meg arról, mi alap esetben helyes. Így ha n értéke kisebb, mint, vagy egyenlő 1, mi csak vissza 1. Tehát itt, kezdjük az i = 2. Nos, ha én is 1, akkor a-- vagy ha n volt 1, akkor az a hurok nem végrehajtani egyáltalán. És mi lenne most visszatérés termék, amely 1 lehet. Hasonlóképpen, ha n voltak valami kisebb 1-- ha voltak: 0, 1 negatív, whatever-- mi lenne még visszatér az 1., amely pontosan a rekurzív verzió csinál. Most, ha n értéke nagyobb, 1-nél, akkor megyünk tenni legalább egy iterációs hurok. Mondjuk n értéke 5, akkor vagyunk fog tenni a termék értéke 2-szer. Tehát most a termék 2. Most fogunk csinálni termék értéke 3 alkalommal. Most 6. Termék idő értéke 4, most már 24. Termék idők = 5, most már a 120. Így aztán végül, mi vissza 120, amely helyesen 5 faktoriális. 20. kérdés. Ez az, ahol meg kell adnia Ebben a táblázatban az adott algoritmus, bármi, amit látott, hogy illik ezek algoritmikus futás Néha ezek aszimptotikus futási idő. Tehát mi egy olyan algoritmus, amely az omega 1, de a nagy O n? Tehát lehet végtelenül Sok válasz van. Az egyik, hogy láttunk talán leginkább gyakran csak lineáris keresést. Így a legjobb esetben forgatókönyv, a tétel vagyunk keres a kezdve a lista és így az omega 1 lépésben, Az első dolog, amit ellenőrizni, mi csak azonnal vissza hogy megtaláltuk az elemet. A legrosszabb forgatókönyv esetén, az elem a végén, vagy az elem nem szerepel a listában egyáltalán. Tehát meg kell keresni A teljes lista, minden n elemeket, és ezért ez az o n. Tehát most már valami, ami mindkét omega n log n, és nagy O n log n. Nos, a legfontosabb dolog láttunk itt összeolvad sort. Szóval merge sort, ne feledd, végül a Theta n log n, ahol théta van definiálva és ha mind az omega nagy-O jelentése azonos. Mindkét n log n. Mi valami, ami omega n, és O n négyzeten? Nos, megint ott van Több lehetséges választ. Itt történetesen mondjuk buborék sort. Beillesztése sort is itt dolgozik. Ne feledje, hogy a buborék rendezés van, hogy az optimalizálás ahol, ha tudja, hogy a teljes lista anélkül, hogy ezt bármilyen csereügyletek, akkor, nos, akkor azonnal vissza, hogy a a lista sorrendje kezdeni. Így a legjobb esetben, ez csak omega n. Ha nem csak a szép rendezett lista kezdeni, akkor már O n négyzetes swap. És végül, van választék sort n négyzet, mind az omega és a nagy O. 21. kérdés. Mi egész túlcsordulás? Hát ismét, hasonlóan a korábbi, már csak véges sok bit hogy képviselje egy egész szám, így talán 32 bit. Tegyük fel, hogy van egy előjeles egész. Majd végül a legmagasabb pozitív szám tudjuk képviselni értéke 2-től 31-ig a mínusz 1. És mi történik, ha megpróbáljuk akkor növeljük, hogy egész szám? Nos, mi menni 2 és a 31 mínusz 1, egészen a negatív 2 a 31. Tehát ez az egész túlcsordulás ha folyamatosan növekvõ, és végül nem lehet fog semmilyen magasabb, és ez csak pakolások egészen vissza körül negatív értéket. Mi a helyzet a puffer túlcsordulás? Így a puffer overflow-- emlékszem, mi az a puffer. Ez csak egy darab memória. Olyasmi, mint a tömb egy puffer. Tehát egy puffer túlcsordulás, amikor megpróbál hozzáférni memória túl a vége, hogy a tömb. Tehát, ha van egy tömb méret 5 és megpróbálja elérni array konzol 5. vagy 6. vagy tartó konzol 7 vagy bármi túl végén, vagy akár bármi below-- tömb tartó negatív 1-- mind ezek puffer túlcsordulás. Te megható memória rossz módon. 23. kérdés. Tehát ezt meg kell végrehajtására strlen. És azt mondani, hogy akkor vállalnak s nem lesz nulla, így nem kell nem minden csekket null. És van több módon tehetett volna ezt. Itt csak hogy az egyszerű. Kezdjük egy számláló, n. n értéke számlálás, hogy hány karakter van. Szóval 0-val kezdődnek, és akkor végighaladni a teljes lista. Az s konzol 0 egyenlő a null terminátor karakter? Emlékezz keresünk A null terminátor karakter annak meghatározására, milyen hosszú a karakterlánc. Ez fog megszüntetni minden vonatkozó húr. Szóval s konzol 0 egyenlő A null terminátor? Ha nem, akkor megyünk nézd s konzol 1, s 2 konzol. Mi folyamatosan megy, amíg meg nem megtalálja a null terminátor. Ha találtunk, akkor n tartalmazza a teljes hossza a húr, és mi csak vissza azt. 24. kérdés. Tehát ez az egyik, ahol kell, hogy a kereskedelmi le. Tehát az egyik dolog, jó egy út, de mi módon ez rossz? Tehát itt, merge sort hajlamos gyorsabb, mint a buborék rendezés. Azt mondta, hogy-- is, ott Több válasz itt. De a legfontosabb az, hogy buborék fajta az omega n egy rendezett lista. Ne feledje, hogy asztali láttunk korábban. Így buborék rendezi omega a n, a legjobb forgatókönyv ez tudja, hogy csak megy át A listában egyszer, meg hé ez a dolog már válogatni, és vissza. Merge sort, nem számít, milyen te, az omega n log n. Tehát rendezett lista, buborék sort lesz gyorsabb. Most mi a linkelt listák? Tehát egy láncolt lista fejlődik és csökken hogy illeszkedjen a sok elem szükséges. Azt mondta, így hogy-- általában a közvetlen összehasonlítás lesz a kapcsolt bejegyzés egy tömb. Így, bár tömbök könnyen nőnek és zsugorodnak hogy illeszkedjen a sok elemet szükség szerint, a láncolt lista összehasonlítva egy array-- egy tömb közvetlen elérésű. Mi lehet index bármilyen különleges eleme a tömb. Tehát egy láncolt lista, nem tudjuk csak megy az ötödik elem, van, hogy áthalad a kezdetektől amíg eljutunk az ötödik elem. És ez fog megakadályoz bennünket abban, csinál valamit, mint a bináris keresés. Apropó bináris keresés, bináris keresés általában gyorsabb, mint a lineáris keresés. Azt mondta, hogy-- így egy lehetséges dolog az, hogy nem tud bináris keresés a kapcsolt listákon, akkor csak csinálni tömbök. De talán még ennél is fontosabb, nem tudsz bináris keresés egy tömb, nincs rendezve. Upfront szükség lehet rendezni a tömb, és csak ezután lehet te bináris keresés. Tehát, ha a dolog nem rendezett kezdeni, akkor lineáris keresés lehet gyorsabb. 27. kérdés. Tehát úgy a program az alábbi, melyik lesz a következő dia. És ez az, ahol vagyunk szeretne majd kifejezetten kimondja, az értékeket a különböző változók. Szóval nézzük meg azt. Tehát egy vonal. Van int x = 1. Ez az egyetlen dolog, ami történt. Tehát egy sor, látjuk mi táblázat, hogy y, a, b, és az összes tmp elsötétült. Tehát mi x? Nos, csak meg 1-gyel egyenlő. Aztán sorban két, jól, azt látjuk, hogy az y értéke 2, és a tábla már kitöltött nekünk. Így x értéke 1, és y értéke 2. Most, három sorban, mi most belül a swap funkció. Mit tettünk át cserélni? Mentünk ampersand x a, és y-jel a b. Ha a probléma korábban kijelentette, hogy az x címét a 0x10, és a címe y 0x14. Így a és b értéke egyenlő 0x10 és 0x14, ill. Most három sorban, mi az x és y? Nos, semmi sem változott x és y körülbelül ezen a ponton. Annak ellenére, hogy belül a fő verem keret, még mindig ugyanaz értékeket korábban. Mi nem módosították memóriát. Így x értéke 1, y értéke 2. Rendben van. Így most azt mondtuk, int tmp megegyezik a csillag. Tehát négy sorban, minden ugyanaz, kivéve a tmp. Mi nem változtak meg értékek semmit, kivéve tmp. Hozunk tmp megegyezik a csillag. Mi az a csillag? Nos, a pontokat x, így a csillag fog egyenlő x, ami 1. Tehát minden másolt le, és tmp értéke 1. Most a következő sorban. Csillag csillag egyenlő b. Tehát vonal five-- ismét jól, minden ugyanaz, kivéve a bármilyen csillag van. Mi az a csillag? Nos, csak azt mondta a csillag x. Szóval változó x egyenlő csillag b. Mi az a csillag b? y. b pont y. Tehát csillag b y. Szóval beállítást x = y, és minden más ugyanaz. Tehát azt látjuk, a következő sorban, hogy x ma 2., és a többiek csak másolja le. Most a következő sorban, csillag b egyenlő tmp. Nos, mi csak azt mondta, csillag b y, így építünk y egyenlő tmp. Minden más ugyanaz, így minden lesz másolva le. Mi beállítás y egyenlő tmp, ami egy, és minden más ugyanaz. Most végre sor hét. Vagyunk vissza a fő funkciója. Mi után csere befejeződött. Elvesztettük a, b, és tmp, de végül mi nem változik meg értékek semmit ezen a ponton, mi csak másolja az x és y le. Úgy látjuk, hogy az x és y most 2 és 1 helyett az 1. és 2. A sikeresen végrehajtott csere. 28. kérdés. Tegyük fel, hogy találkozik hibaüzenetek alatt munkaidőben jövőre a CA vagy TF. Tanácsot, hogyan kell rögzíteni minden egyes ilyen hibákat. Így undefined reference to getString. Miért lehet, látod ezt? Nos, ha a diák használ GetString a saját kódját, azok megfelelő hash tartalmazza CS50 pont h tartalmazza a CS50 könyvtár. Nos, mit ők kell rögzíteni a hibát? Meg kell csinálni egy kötőjel lcs50 a parancsot, ha ők összeállítása. Tehát, ha nem adja át csengés dash lcs50, ők nem megy, hogy a tényleges kód, amely megvalósítja getString. 29. kérdés. Értelemszerűen nyilvánításáról könyvtári funkció strlen. Hát ez most, de még nem megtette a megfelelő hash tartalmazza. Ebben a konkrét esetben a header file meg kell tartalmaznia a húr pont h, beleértve húr pont h most A student-- most a fordító hozzáfér a nyilatkozatok strlen, és tudja, hogy a kódot használja STRLEN helyesen. 30. kérdés. Több százalék konverziók mint az adatok érveket. Szóval, mi ez? Nos, ne feledjük, hogy ezek a százalékos signs-- hogyan ők vonatkozó printf. Így printf talán percent-- talán valami nyomtatni mint százalék i backslash n. Vagy talán nyomtatni, mint a százalék i, hely, százalék i, hely, százalék i. Így minden egyes ilyen százalék jelek, szükségünk van át a változó végén printf. Tehát, ha azt mondjuk, hogy printf zárójel százalék i Backslash n közel zárójel, nos, azt mondjuk, hogy mi vagyunk a nyomdába egy egész, de akkor nem adja át printf egy egész szám, hogy ténylegesen nyomtatni. Tehát itt nagyobb százalék konverzió, mint az adatok érveket? Ez mondja, hogy van egy csomó százalék, és nincs elég változó ténylegesen töltse ki e százalékos. És akkor biztosan, a kérdés 31, biztosan elveszett 40 bájt egy blokk. Tehát ez egy Valgrind hiba. Ez azt mondja, hogy valahol a kódban, van egy elosztás, amely a 40 bytes nagy így malloced 40 bájt, és soha nem szabadult meg. Legvalószínűbb, hogy csak meg kell találni memóriavesztés, és találni, ahol meg kell Ebben a mondatban szabad memória. És 32. kérdés, érvénytelen írása 4-es méretű. Ez megint egy Valgrind hiba. Ez nem kell tennie A memóriavesztés most. Ez a legtöbb likely-- Úgy értem, hogy valami érvénytelen memória jogokat. És valószínűleg ez valami egyfajta puffer túlcsordulás. Ha van egy tömb, talán egy egész sor, és hagyja, hogy a azt mondják, hogy az 5-ös méret, és megpróbálja megérinteni tömb tartó 5. Tehát, ha próbál írni a érték, hogy ez nem egy darab memória hogy valóban van hozzáférése, és így fogsz kapni ezt a hibát, mondván érvénytelen írása 4-es méretű. Valgrind fog felismerni te megpróbálta megérinteni a memória nem megfelelő. És ez azt quiz0. Vagyok Rob Bowden, és ez CS50.