1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 ROB Bowden: Hei, jeg er Rob Bowden, og la oss snakke om quiz0. 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> Så, det første spørsmålet. 5 00:00:14,545 --> 00:00:17,750 Dette er spørsmålet hvor du trengte å kode tallet 6 00:00:17,750 --> 00:00:21,270 127 i binær pærer. 7 00:00:21,270 --> 00:00:23,550 Hvis du ville, kunne du gjøre den vanlige konverteringen 8 00:00:23,550 --> 00:00:25,950 fra bi-- eller, fra desimal til binær. 9 00:00:25,950 --> 00:00:28,300 Men det er trolig kommer til å ta mye tid. 10 00:00:28,300 --> 00:00:31,750 Jeg mener, du kunne finne ut det, OK, en er der inne, er to der inne, 11 00:00:31,750 --> 00:00:33,650 4 er der inne, 8 er der inne. 12 00:00:33,650 --> 00:00:39,280 Enklere måte, er 127 128 minus én. 13 00:00:39,280 --> 00:00:42,013 Det lengst til venstre lyspære er den 128-bit. 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 Så 127 er egentlig bare alt av de andre lyspærer, 16 00:00:47,860 --> 00:00:51,420 siden det er lengst til venstre lyspære minus 1. 17 00:00:51,420 --> 00:00:52,800 Det er det for det spørsmålet. 18 00:00:52,800 --> 00:00:54,060 >> Spørsmål ett. 19 00:00:54,060 --> 00:00:56,710 Så med 3 biter du kan representerer 8 forskjellige verdier. 20 00:00:56,710 --> 00:01:01,000 Hvorfor da er 7 den største ikke-negative Desimalheltallet du kan representere? 21 00:01:01,000 --> 00:01:04,050 Vel, hvis vi kan bare representerer 8 forskjellige verdier, 22 00:01:04,050 --> 00:01:07,430 så hva vi kommer til å være representerer er 0 til 7. 23 00:01:07,430 --> 00:01:08,745 0 opptar en av verdiene. 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> Spørsmål to. 26 00:01:11,190 --> 00:01:14,610 Med n bits, hvor mange distinkte verdiene kan du representerer? 27 00:01:14,610 --> 00:01:19,080 Så, med n bits, har du to mulige verdier for hver bit. 28 00:01:19,080 --> 00:01:22,300 Så vi har to mulige verdier for den første biten, to mulige verdier 29 00:01:22,300 --> 00:01:24,450 for det andre, to mulig for den tredje. 30 00:01:24,450 --> 00:01:28,730 Og så det er 2 ganger 2 ganger 2, og til slutt svaret er 2 til n. 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> Spørsmål tre. 33 00:01:31,100 --> 00:01:33,450 Hva er 0x50 i binært? 34 00:01:33,450 --> 00:01:39,490 Så husk at heksadesimale har en veldig grei konvertering til binære. 35 00:01:39,490 --> 00:01:43,180 Så her, vi trenger bare å se på 5 og 0 uavhengig. 36 00:01:43,180 --> 00:01:45,110 Så hva er fem i binært? 37 00:01:45,110 --> 00:01:48,400 0101, det er en bit og 4 bit. 38 00:01:48,400 --> 00:01:49,900 Hva er 0 i binært? 39 00:01:49,900 --> 00:01:50,520 Ikke vanskelig. 40 00:01:50,520 --> 00:01:52,180 0000. 41 00:01:52,180 --> 00:01:54,970 Så bare sette dem sammen, og det er hele tall i binær. 42 00:01:54,970 --> 00:01:57,640 01010000. 43 00:01:57,640 --> 00:02:00,439 Og hvis du ønsket du kunne ta av det ytterste venstre null. 44 00:02:00,439 --> 00:02:01,105 Det er irrelevant. 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> Så da alternativt hva er 0x50 i desimal? 47 00:02:05,733 --> 00:02:08,649 Hvis du ville, could-- deg hvis du er mer komfortabel med det binære, 48 00:02:08,649 --> 00:02:11,340 du kan ta det binære svar og konvertere til desimal. 49 00:02:11,340 --> 00:02:13,870 Eller vi kunne bare huske som heksadesimale. 50 00:02:13,870 --> 00:02:21,140 Slik at 0 i 0-th sted, og 5 er den i det 16 til det første sted. 51 00:02:21,140 --> 00:02:25,990 Så her har vi 5 ganger 16 til først, pluss 0 ganger 16 til null, 52 00:02:25,990 --> 00:02:27,520 er 80. 53 00:02:27,520 --> 00:02:29,710 Og hvis du har sett på tittelen på spørsmålet, 54 00:02:29,710 --> 00:02:32,920 det var CS 80, som var en type hint til svaret på dette problemet. 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> Spørsmål fem. 57 00:02:35,420 --> 00:02:40,320 Vi har denne Scratch script, som er gjenta fire ganger peanøttsmør gelé. 58 00:02:40,320 --> 00:02:42,800 Så hvordan skal vi nå kode som i C? 59 00:02:42,800 --> 00:02:47,730 Vel, vi har her-- den delen i fet er den eneste delen man hadde å gjennomføre. 60 00:02:47,730 --> 00:02:51,950 Så vi har en 4 loop som er looping 4 ganger, printf-ing peanøttsmør gelé, 61 00:02:51,950 --> 00:02:53,910 med ny linje som problemet ber om. 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> Spørsmål seks, et nytt skrape problem. 64 00:02:57,490 --> 00:03:00,210 Vi ser at vi er i en evig loop. 65 00:03:00,210 --> 00:03:05,000 Vi sier variabelen i og deretter økes i med 1. 66 00:03:05,000 --> 00:03:09,580 Nå ønsker vi å gjøre det i C. Det er flere måter vi kunne ha gjort dette. 67 00:03:09,580 --> 00:03:12,840 Her skjedde vi å kode evig løkke som en while (true). 68 00:03:12,840 --> 00:03:16,600 Så vi erklærer variabelen i, bare som om vi hadde variabel jeg i Scratch. 69 00:03:16,600 --> 00:03:21,950 Deklarere variabelen i, og for alltid while (true), sier vi variabelen i. 70 00:03:21,950 --> 00:03:25,260 Så printf% I-- eller du kan har brukt% d. 71 00:03:25,260 --> 00:03:27,985 Vi sier at variabel, og deretter øke den, i ++. 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> Spørsmål sju. 74 00:03:30,830 --> 00:03:35,560 Nå ønsker vi å gjøre noe lignende Mario dot c fra oppgavesettet en. 75 00:03:35,560 --> 00:03:39,110 Vi ønsker å skrive ut disse hashtags, vi ønsker å skrive ut en fem 76 00:03:39,110 --> 00:03:40,700 med tre rektangel av disse hashes. 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 Så hvordan skal vi gjøre det? 79 00:03:43,162 --> 00:03:45,370 Vel, gir vi deg en hel haug med kode, og du bare 80 00:03:45,370 --> 00:03:47,560 må fylle ut utskrifts grid funksjonen. 81 00:03:47,560 --> 00:03:49,540 >> Så hvordan ser PrintGrid ut? 82 00:03:49,540 --> 00:03:51,480 Vel du er forbi Bredden og høyden. 83 00:03:51,480 --> 00:03:53,520 Så vi har en ytre 4 loop, som er looping 84 00:03:53,520 --> 00:03:57,650 i løpet av alle radene av denne grid som vi ønsker å skrive ut. 85 00:03:57,650 --> 00:04:01,250 Så har vi den inter-nestet 4 loop, det er å skrive over hver kolonne. 86 00:04:01,250 --> 00:04:06,210 Så for hver rad, vi skriver for hver kolonne, en enkelt hash. 87 00:04:06,210 --> 00:04:10,045 Så på slutten av raden vi skrive ut en enkelt ny linje for å gå til neste rad. 88 00:04:10,045 --> 00:04:11,420 Og det er det for hele rutenettet. 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> Spørsmål åtte. 91 00:04:13,675 --> 00:04:17,170 En funksjon som PrintGrid sies å ha en bivirkning, men ikke en retur 92 00:04:17,170 --> 00:04:17,670 verdi. 93 00:04:17,670 --> 00:04:19,209 Forklar forskjellen. 94 00:04:19,209 --> 00:04:23,080 Så dette er avhengig av deg å huske hva en bivirkning er. 95 00:04:23,080 --> 00:04:25,180 Vel, en retur value-- vi vet PrintGrid ikke 96 00:04:25,180 --> 00:04:28,180 har returverdi, siden akkurat her det står ugyldig. 97 00:04:28,180 --> 00:04:31,150 Så noe som returnerer ugyldig gjør egentlig ikke tilbake noe. 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 Så hva er bivirkning? 100 00:04:33,620 --> 00:04:36,620 Vel, er en bivirkning noe den slags vedvarer 101 00:04:36,620 --> 00:04:39,500 Etter at funksjonen endene det var ikke bare tilbake, 102 00:04:39,500 --> 00:04:41,340 og det var ikke bare fra inngangene. 103 00:04:41,340 --> 00:04:44,970 >> Så, for eksempel, kan vi endre en global variabel. 104 00:04:44,970 --> 00:04:46,590 Det ville være en bivirkning. 105 00:04:46,590 --> 00:04:49,000 I dette spesielle tilfelle, en svært viktig bivirkning 106 00:04:49,000 --> 00:04:51,070 skriver ut til skjermen. 107 00:04:51,070 --> 00:04:53,110 Så det er en bivirkning at PrintGrid har. 108 00:04:53,110 --> 00:04:54,980 Vi skriver ut disse tingene til skjermen. 109 00:04:54,980 --> 00:04:56,370 Og du kan tenke på at som en bivirkning, 110 00:04:56,370 --> 00:04:58,690 siden det er noe som vedvarer etter denne funksjonen slutter. 111 00:04:58,690 --> 00:05:01,481 Det er noe utenfor rammen av denne funksjon som til syvende og sist 112 00:05:01,481 --> 00:05:03,380 blir endret, innholdet på skjermen. 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> Spørsmål ni. 115 00:05:05,839 --> 00:05:07,880 Tenk programmet nedenfor, hvilken linje tall 116 00:05:07,880 --> 00:05:09,740 har blitt lagt til skyld diskusjonen. 117 00:05:09,740 --> 00:05:13,480 Så i dette programmet er vi bare ringer GetString, lagre den 118 00:05:13,480 --> 00:05:16,220 i denne variable s, og deretter skriver den variabelen s. 119 00:05:16,220 --> 00:05:16,720 OK. 120 00:05:16,720 --> 00:05:19,090 Så forklare hvorfor linjen man er til stede. 121 00:05:19,090 --> 00:05:20,920 #include CS50 dot h. 122 00:05:20,920 --> 00:05:23,820 Hvorfor trenger vi å #include CS50 dot h? 123 00:05:23,820 --> 00:05:26,180 Vel vi ringer GetString funksjon, 124 00:05:26,180 --> 00:05:28,840 og GetString er definert i CS50 biblioteket. 125 00:05:28,840 --> 00:05:31,600 Så hvis vi ikke har #include CS50 dot h, 126 00:05:31,600 --> 00:05:35,760 vi ville få det implisitt erklæring av GetString funksjonsfeil 127 00:05:35,760 --> 00:05:36,840 fra kompilatoren. 128 00:05:36,840 --> 00:05:40,110 Så vi må ta med library-- Vi må ta med header-fil, 129 00:05:40,110 --> 00:05:42,870 ellers vil kompilatoren ikke erkjenner at GetString eksisterer. 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> Forklar hvorfor linje to er til stede. 132 00:05:46,140 --> 00:05:47,890 Så standard io dot h. 133 00:05:47,890 --> 00:05:50,430 Det er akkurat det samme som forrige problem, 134 00:05:50,430 --> 00:05:53,310 bortsett fra i stedet for å håndtere GetString, vi snakker om printf. 135 00:05:53,310 --> 00:05:56,654 Så hvis vi ikke si at vi trenger til å omfatte standard io dot h, 136 00:05:56,654 --> 00:05:58,820 da vi ikke ville være i stand å bruke printf-funksjonen, 137 00:05:58,820 --> 00:06:00,653 fordi kompilatoren ville ikke vite om det. 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Why-- hvilken betydning av ugyldig på linje fire? 140 00:06:05,260 --> 00:06:08,010 Så her har vi int main (void). 141 00:06:08,010 --> 00:06:10,600 Det er bare å si at vi ikke får noen kommandolinje 142 00:06:10,600 --> 00:06:12,280 argumenter til main. 143 00:06:12,280 --> 00:06:17,390 Husk at vi kunne si int Hoved int argc streng argv parentes. 144 00:06:17,390 --> 00:06:20,400 Så her er vi bare si ugyldig å si at vi ignorerer kommandolinjeargumenter. 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> Forklare, med hensyn til hukommelse, akkurat hva GetString i kø seks returer. 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString returnerer en blokk med minne, en rekke tegn. 149 00:06:31,640 --> 00:06:34,870 Det er virkelig å returnere en Peker til det første tegnet. 150 00:06:34,870 --> 00:06:37,170 Husk at en streng er en char stjerne. 151 00:06:37,170 --> 00:06:41,360 Så s er en peker til den første karakter i hvilken strengen er 152 00:06:41,360 --> 00:06:43,510 at brukeren tastes inn på tastaturet. 153 00:06:43,510 --> 00:06:47,070 Og det minnet skjer for å være malloced, slik at minnet er i haugen. 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> Spørsmål 13. 156 00:06:50,450 --> 00:06:51,960 Tenk programmet nedenfor. 157 00:06:51,960 --> 00:06:55,579 Så alt dette programmet gjør er printf-ing 1 dividert med 10. 158 00:06:55,579 --> 00:06:57,370 Så når kompilert og henrettet, dette programmet 159 00:06:57,370 --> 00:07:01,170 utganger 0,0, selv om 1 dividert med 10 er 0,1. 160 00:07:01,170 --> 00:07:02,970 Så hvorfor er det 0.0? 161 00:07:02,970 --> 00:07:05,510 Vel, dette er fordi av heltallsdivisjon. 162 00:07:05,510 --> 00:07:08,580 So 1 er et helt tall, 10 er et helt tall. 163 00:07:08,580 --> 00:07:11,980 Så 1 dividert med 10, alt behandles som heltall, 164 00:07:11,980 --> 00:07:16,380 og i C, når vi gjør heltallsdivisjon, vi avkorte noen desimaltegn. 165 00:07:16,380 --> 00:07:19,590 Så 1 dividert med 10 0, og deretter vi prøver 166 00:07:19,590 --> 00:07:24,410 å skrive det som en dupp, så null skrives ut som en dupp er 0,0. 167 00:07:24,410 --> 00:07:27,400 Og det er derfor vi får 0,0. 168 00:07:27,400 --> 00:07:28,940 >> Tenk programmet nedenfor. 169 00:07:28,940 --> 00:07:31,280 Nå er vi skriver 0,1. 170 00:07:31,280 --> 00:07:34,280 Så ingen heltallsdivisjon, vi bare skriver ut 0,1, 171 00:07:34,280 --> 00:07:37,100 men vi skriver ut det til 28 desimaler. 172 00:07:37,100 --> 00:07:41,810 Og vi får dette 0,1000, en hel haug nuller, 5 5 5, blah blah blah. 173 00:07:41,810 --> 00:07:45,495 Så spørsmålet her er hvorfor det skrive ut at i stedet for nøyaktig 0,1? 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> Så grunnen her nå floating point unøyaktighet. 176 00:07:49,640 --> 00:07:53,410 Husk at en float er bare 32 bits. 177 00:07:53,410 --> 00:07:57,540 Så vi kan bare representere et endelig antall av flyttall verdier med de 32 178 00:07:57,540 --> 00:07:58,560 bits. 179 00:07:58,560 --> 00:08:01,760 Vel det er i siste instans uendelig mange flytverdier, 180 00:08:01,760 --> 00:08:04,940 og det er uendelig mange flytende punktverdier i mellom 0 og 1, 181 00:08:04,940 --> 00:08:07,860 og vi er selvsagt i stand til å representerer enda flere verdier enn det. 182 00:08:07,860 --> 00:08:13,230 Så vi må gjøre ofrene til være i stand til å representere de fleste verdier. 183 00:08:13,230 --> 00:08:16,960 >> Så en verdi som 0,1, tilsynelatende Vi kan ikke representere det akkurat. 184 00:08:16,960 --> 00:08:22,500 Så i stedet for å representere 0.1 gjør vi det beste vi kan representere dette 0.100000 5 5 185 00:08:22,500 --> 00:08:23,260 5. 186 00:08:23,260 --> 00:08:26,306 Og det er ganske nær, men for mange applikasjoner 187 00:08:26,306 --> 00:08:28,430 du trenger å bekymre deg floating point unøyaktighet, 188 00:08:28,430 --> 00:08:30,930 fordi vi ikke kan representere all flytende punkter nøyaktig. 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> Spørsmål 15. 191 00:08:33,380 --> 00:08:34,679 Tenk koden under. 192 00:08:34,679 --> 00:08:36,630 Vi bare utskrift 1 pluss 1. 193 00:08:36,630 --> 00:08:38,289 Så det er ingen triks her. 194 00:08:38,289 --> 00:08:41,780 1 pluss 1 evaluerer til 2, og så vi skriver det. 195 00:08:41,780 --> 00:08:42,789 Dette skriver bare to. 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> Spørsmål 16. 198 00:08:44,700 --> 00:08:49,450 Nå er vi skriver tegnet 1 pluss tegnet en. 199 00:08:49,450 --> 00:08:52,110 Så hvorfor gjør ikke dette skrive ut det samme? 200 00:08:52,110 --> 00:08:57,680 Vel tegnet en pluss tegnet 1, har tegnet en ASCII-verdi 49. 201 00:08:57,680 --> 00:09:04,840 Så dette er egentlig sier 49 pluss 49, og til slutt dette kommer til å skrive ut 98. 202 00:09:04,840 --> 00:09:06,130 Slik at dette ikke skrives 2. 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> Spørsmål 17. 205 00:09:09,271 --> 00:09:11,520 Fullfør gjennomføringen av odde nedenfor på en slik måte 206 00:09:11,520 --> 00:09:14,615 at funksjonen returnerer true hvis n er et oddetall og usann hvis n er jevn. 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 Dette er et flott formål for mod operatør. 209 00:09:19,330 --> 00:09:24,530 Så vi tar vårt argument n, dersom n mod 2 er lik 1, vel 210 00:09:24,530 --> 00:09:28,030 det betyr at n delt etter 2 hadde en rest. 211 00:09:28,030 --> 00:09:33,270 Hvis n dividert med 2 hadde en rest, som betyr at n er et oddetall, så vi returnere true. 212 00:09:33,270 --> 00:09:34,910 Annet vi return false. 213 00:09:34,910 --> 00:09:39,070 Du kunne også ha gjort n mod to likemenn null, return false, ellers returnere true. 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> Tenk den rekursive funksjonen nedenfor. 216 00:09:43,640 --> 00:09:46,920 Slik at hvis n er mindre enn eller lik 1, retur 1, 217 00:09:46,920 --> 00:09:50,430 else return n ganger f av n minus 1. 218 00:09:50,430 --> 00:09:52,556 Så hva er denne funksjonen? 219 00:09:52,556 --> 00:09:54,305 Vel, dette er bare faktoriell funksjon. 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 Dette er pent representert som n faktorer. 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> Så spørsmålet 19 nå, vi ønsker å ta denne rekursiv funksjon. 224 00:10:02,310 --> 00:10:04,530 Vi ønsker å gjøre det iterativ. 225 00:10:04,530 --> 00:10:05,874 Så hvordan gjør vi det? 226 00:10:05,874 --> 00:10:07,790 Vel for de ansatte -løsning, og igjen er det 227 00:10:07,790 --> 00:10:11,090 flere måter du kunne ha gjort som starter vi med dette int produktet 228 00:10:11,090 --> 00:10:11,812 er lik 1. 229 00:10:11,812 --> 00:10:13,520 Og i hele denne for loop, skal vi 230 00:10:13,520 --> 00:10:17,590 skal multiplisere produktet til slutt ende opp med den fullstendig faktoriell. 231 00:10:17,590 --> 00:10:21,870 Så for int i er lik 2, er jeg mindre enn eller lik n, i ++. 232 00:10:21,870 --> 00:10:24,130 >> Du lurer kanskje på hvorfor jeg er lik to. 233 00:10:24,130 --> 00:10:28,380 Vel, husk at her har vi å sørge for at vårt base case er riktig. 234 00:10:28,380 --> 00:10:32,180 Slik at hvis n er mindre enn eller lik til 1, vi bare tilbake en. 235 00:10:32,180 --> 00:10:34,830 Så over her, starter vi på i lik to. 236 00:10:34,830 --> 00:10:39,090 Vel, hvis jeg var en, deretter the-- eller hvis n var en, deretter for loop 237 00:10:39,090 --> 00:10:40,600 ville ikke utføre i det hele tatt. 238 00:10:40,600 --> 00:10:43,190 Og så ville vi bare retur produkt, som er en. 239 00:10:43,190 --> 00:10:45,920 Tilsvarende, dersom n var noe mindre enn 1-- 240 00:10:45,920 --> 00:10:49,290 om det var 0, negativ en, whatever-- vi vil fortsatt være tilbake 1, 241 00:10:49,290 --> 00:10:52,260 som er nøyaktig hva den rekursive versjonen gjør. 242 00:10:52,260 --> 00:10:54,660 >> Nå, dersom n er større enn 1, så vi kommer 243 00:10:54,660 --> 00:10:56,550 til å gjøre minst ett iterasjon av denne sløyfen. 244 00:10:56,550 --> 00:11:00,630 Så la oss si n er 5, så vi er kommer til å gjøre produkt ganger er lik to. 245 00:11:00,630 --> 00:11:02,165 Så nå produktet er 2. 246 00:11:02,165 --> 00:11:04,040 Nå skal vi gjøre produkt ganger er lik 3. 247 00:11:04,040 --> 00:11:04,690 Nå er det seks. 248 00:11:04,690 --> 00:11:07,500 Produkt ganger tilsvarer 4, nå er det 24. 249 00:11:07,500 --> 00:11:10,420 Produkt ganger tilsvarer fem, nå er det 120. 250 00:11:10,420 --> 00:11:16,730 Så til slutt returnerer vi 120, noe som er riktig 5 fakultetet. 251 00:11:16,730 --> 00:11:17,510 >> Spørsmål 20. 252 00:11:17,510 --> 00:11:22,480 Dette er en der du må fylle i denne tabell med hvilken som helst gitt algoritme, 253 00:11:22,480 --> 00:11:25,735 noe som vi har sett, at passer disse algoritmisk run 254 00:11:25,735 --> 00:11:28,060 ganger disse asymptotiske kjøretider. 255 00:11:28,060 --> 00:11:33,270 Så hva er en algoritme som er omega på 1, men big O av n? 256 00:11:33,270 --> 00:11:35,970 Så det kan være uendelig mange svar her. 257 00:11:35,970 --> 00:11:39,790 Den som vi har sett nok mest ofte er like lineær søk. 258 00:11:39,790 --> 00:11:42,050 >> Så i beste fall scenario, elementet vi er 259 00:11:42,050 --> 00:11:44,050 leter etter er på begynnelsen av listen 260 00:11:44,050 --> 00:11:47,400 og så på omega for en trinn, det første vi sjekker, 261 00:11:47,400 --> 00:11:49,740 vi bare umiddelbart returnere at vi fant elementet. 262 00:11:49,740 --> 00:11:52,189 I verste fall, elementet er ved slutten, 263 00:11:52,189 --> 00:11:53,730 eller varen ikke er på listen i det hele tatt. 264 00:11:53,730 --> 00:11:56,700 Så vi må søke hele listen, alle n 265 00:11:56,700 --> 00:11:58,480 elementer, og det er derfor det er o n. 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> Så nå er det noe som er både omega n log n, og store O n log n. 268 00:12:04,880 --> 00:12:08,650 Vel den mest relevante ting vi har sett her er flette slag. 269 00:12:08,650 --> 00:12:12,950 Så flette sortere, husker, er i siste instans Theta 270 00:12:12,950 --> 00:12:16,920 av n log n, der theta er definert dersom både omega og stort O er de samme. 271 00:12:16,920 --> 00:12:17,580 Både n log n. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Hva er noe som er omega av N, O og n kvadrerte? 274 00:12:21,970 --> 00:12:23,990 Vel, igjen er det flere mulige svar. 275 00:12:23,990 --> 00:12:26,440 Her vi tilfeldigvis si boble slag. 276 00:12:26,440 --> 00:12:28,840 Innsetting slags ville også fungere her. 277 00:12:28,840 --> 00:12:31,400 Husk at boble slags har som optimalisering der, 278 00:12:31,400 --> 00:12:34,630 hvis du er i stand til å få gjennom hele listen 279 00:12:34,630 --> 00:12:37,402 uten å behøve å gjøre eventuelle bytteavtaler, da, vel, 280 00:12:37,402 --> 00:12:40,110 Vi kan umiddelbart tilbake at listen ble sortert til å begynne med. 281 00:12:40,110 --> 00:12:43,185 Så i beste fall det er bare omega av n. 282 00:12:43,185 --> 00:12:45,960 Hvis det er ikke bare et pent sortert liste til å begynne med, 283 00:12:45,960 --> 00:12:48,270 så har vi O n squared bytteavtaler. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 Og til slutt, har vi valg liksom for n squared, både omega og stor O. 286 00:12:55,610 --> 00:12:56,850 >> Spørsmål 21. 287 00:12:56,850 --> 00:12:58,870 Hva er heltallsoverflyt? 288 00:12:58,870 --> 00:13:02,160 Vel igjen, i likhet med tidligere, vi bare har begrenset mange biter 289 00:13:02,160 --> 00:13:04,255 for å representere et helt tall, så kanskje 32 biter. 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 La oss si at vi har en signert heltall. 292 00:13:09,180 --> 00:13:12,800 Så til slutt den høyeste positivt tall vi kan representere 293 00:13:12,800 --> 00:13:15,910 er 2 til 31 minus en. 294 00:13:15,910 --> 00:13:19,370 Så hva skjer hvis vi prøver å deretter øke som heltall? 295 00:13:19,370 --> 00:13:25,320 Vel, vi kommer til å gå fra 2 til 31 minus 1, hele veien ned til negative 2 296 00:13:25,320 --> 00:13:26,490 til 31. 297 00:13:26,490 --> 00:13:29,470 Så dette heltallsoverflyt er når du holder økes, 298 00:13:29,470 --> 00:13:32,330 og til slutt kan du ikke få noe høyere, og det bare 299 00:13:32,330 --> 00:13:34,520 brytes hele veien tilbake rundt til en negativ verdi. 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> Hva med en buffer overflow? 302 00:13:37,779 --> 00:13:39,820 Så en buffer overflow-- huske hva en buffer er. 303 00:13:39,820 --> 00:13:41,000 Det er bare en del av minnet. 304 00:13:41,000 --> 00:13:43,350 Noe sånt som en matrise er en buffer. 305 00:13:43,350 --> 00:13:46,120 Så en buffer overflow er når du prøver å få tilgang til minnet 306 00:13:46,120 --> 00:13:47,880 utover slutten av denne matrisen. 307 00:13:47,880 --> 00:13:50,410 Så hvis du har en matrise av størrelse 5 og du 308 00:13:50,410 --> 00:13:53,700 forsøke å få tilgang matrise brakett 5 eller brakett 6 eller brakett 7, 309 00:13:53,700 --> 00:13:56,610 eller noe utover ende, eller til og med noe 310 00:13:56,610 --> 00:14:00,790 below-- rekke brakett negative 1-- alle av dem er buffer overflow. 311 00:14:00,790 --> 00:14:02,810 Du berører minne i dårlige måter. 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> Spørsmål 23. 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 Så i denne du trenger å implementere strlen. 316 00:14:09,100 --> 00:14:11,630 Og vi forteller deg at du kan anta s vil ikke være null, 317 00:14:11,630 --> 00:14:13,790 slik at du ikke trenger å gjøre noe sjekk på null. 318 00:14:13,790 --> 00:14:16,190 Og det er flere måter du kunne ha gjort dette. 319 00:14:16,190 --> 00:14:18,440 Her bare tar vi grei. 320 00:14:18,440 --> 00:14:21,780 Vi starter med en teller, n. n er telle hvor mange tegn det er. 321 00:14:21,780 --> 00:14:25,560 Så vi starter på 0, og da er vi iterere over hele listen. 322 00:14:25,560 --> 00:14:29,092 >> S er 0 brakett lik null terminator karakter? 323 00:14:29,092 --> 00:14:31,425 Husk at vi leter etter den avsluttende nulltegn 324 00:14:31,425 --> 00:14:33,360 å bestemme hvor lenge strengen er. 325 00:14:33,360 --> 00:14:35,890 Det kommer til å si opp noen relevant streng. 326 00:14:35,890 --> 00:14:39,400 Så er s brakett 0 lik til null terminator? 327 00:14:39,400 --> 00:14:42,850 Hvis det er det, så vi kommer til å se på s brakett 1, s brakett 2. 328 00:14:42,850 --> 00:14:45,050 Vi holder det gående til vi finne den avsluttende null. 329 00:14:45,050 --> 00:14:48,580 Når vi har funnet den, så n inneholder den totale lengde av strengen, 330 00:14:48,580 --> 00:14:49,942 og vi kan bare returnere det. 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> Spørsmål 24. 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 Så dette er en hvor du har å gjøre trade off. 335 00:14:56,050 --> 00:14:59,810 Så en ting er bra i ett måte, men på hvilken måte er det dårlig? 336 00:14:59,810 --> 00:15:02,980 Så her, slå sammen liksom en tendens til å være raskere enn boble slag. 337 00:15:02,980 --> 00:15:06,530 Når det er sagt at-- vel, det er flere svar her. 338 00:15:06,530 --> 00:15:12,930 Men det viktigste er at boble slags er omega for n for en sortert liste. 339 00:15:12,930 --> 00:15:14,950 >> Husk at bordet vi så tidligere. 340 00:15:14,950 --> 00:15:17,600 Så boble sorterer omega for n, den best case scenario 341 00:15:17,600 --> 00:15:20,010 er det er i stand til å bare gå over listen, når, bestemme 342 00:15:20,010 --> 00:15:22,270 hei denne saken er allerede sorteres, og retur. 343 00:15:22,270 --> 00:15:25,960 Flettesortering, uansett hva du gjør det, er omega n log n. 344 00:15:25,960 --> 00:15:29,200 Så for sortert liste, boble sorter kommer til å bli raskere. 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> Hva nå om knyttet lister? 347 00:15:32,430 --> 00:15:36,070 Så en lenket liste kan vokse og krympe til å passe så mange elementer som det er nødvendig. 348 00:15:36,070 --> 00:15:38,489 Etter å ha sagt at-- så vanligvis den direkte sammenligning 349 00:15:38,489 --> 00:15:40,280 kommer til å være en koblet liste med en matrise. 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 Så selv om arrays kan lett vokse og krympe 352 00:15:44,050 --> 00:15:47,130 å passe så mange elementer etter behov, en lenket liste 353 00:15:47,130 --> 00:15:49,600 sammenlignet med en array-- en matrise har random access. 354 00:15:49,600 --> 00:15:52,960 Vi kan indeksere inn i ethvert Spesielt element i matrisen. 355 00:15:52,960 --> 00:15:56,430 >> Så for en lenket liste, kan vi ikke bare gå til det femte elementet, 356 00:15:56,430 --> 00:16:00,260 vi har å traversere fra begynnelsen før vi kommer til det femte element. 357 00:16:00,260 --> 00:16:03,990 Og det kommer til å hindre oss i å gjør noe sånt binære søk. 358 00:16:03,990 --> 00:16:08,150 Snakker av binære søk, binære søk en tendens til å være raskere enn lineær søk. 359 00:16:08,150 --> 00:16:11,120 Etter å ha sagt at-- så, en mulig ting 360 00:16:11,120 --> 00:16:13,380 er at du ikke kan gjøre binær søke på lenkede lister, 361 00:16:13,380 --> 00:16:14,730 du kan bare gjøre det på arrays. 362 00:16:14,730 --> 00:16:18,030 Men sannsynligvis enda viktigere, du kan ikke gjøre binære søk 363 00:16:18,030 --> 00:16:20,690 på en matrise som ikke er sortert. 364 00:16:20,690 --> 00:16:23,990 Upfront du kanskje trenger å sortere rekken, og bare da kan 365 00:16:23,990 --> 00:16:25,370 du gjør binære søk. 366 00:16:25,370 --> 00:16:27,660 Så hvis noe ikke er sorterte til å begynne med, 367 00:16:27,660 --> 00:16:29,250 så lineær søk kan være raskere. 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> Spørsmål 27. 370 00:16:31,740 --> 00:16:34,770 Så vurdere programmet nedenfor, som vil være i neste lysbilde. 371 00:16:34,770 --> 00:16:37,790 Og dette er en der vi er kommer til å ønske å eksplisitt 372 00:16:37,790 --> 00:16:39,980 verdiene for de forskjellige variabler. 373 00:16:39,980 --> 00:16:41,990 Så la oss se på det. 374 00:16:41,990 --> 00:16:43,160 >> Så linje en. 375 00:16:43,160 --> 00:16:45,457 Vi har int x er lik 1. 376 00:16:45,457 --> 00:16:47,040 Det er det eneste som har skjedd. 377 00:16:47,040 --> 00:16:50,440 Så på linje én, ser vi i vår bord, som y, a, b, og tmp er alle 378 00:16:50,440 --> 00:16:51,540 mørklagt. 379 00:16:51,540 --> 00:16:52,280 Så hva er x? 380 00:16:52,280 --> 00:16:53,860 Vel vi bare sette den lik 1. 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 Og deretter linje to, vel, Vi ser at y er satt til 2, 383 00:16:58,770 --> 00:17:00,550 og bordet er allerede fylt ut for oss. 384 00:17:00,550 --> 00:17:03,040 Slik at x er 1 og y er 2. 385 00:17:03,040 --> 00:17:05,890 >> Nå, linje tre, er vi nå inne i swap-funksjonen. 386 00:17:05,890 --> 00:17:07,560 Hva gjorde vi passerer å bytte? 387 00:17:07,560 --> 00:17:11,609 Vi passerte ampersand x for en, og tegnet y for b. 388 00:17:11,609 --> 00:17:15,160 Hvor problemet tidligere uttalt at adressen av x 389 00:17:15,160 --> 00:17:17,520 er 0x10, og adressen y er 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Så a og b er lik 0x10 og 0x14, henholdsvis. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Nå på linje tre, hva er x og y? 394 00:17:26,250 --> 00:17:28,554 Vel, ingenting har endret seg ca x og y på dette punktet. 395 00:17:28,554 --> 00:17:30,470 Selv om de er inne i en hoved stack ramme, 396 00:17:30,470 --> 00:17:32,469 de har fortsatt den samme verdier de gjorde før. 397 00:17:32,469 --> 00:17:34,030 Vi har ikke endret noe minne. 398 00:17:34,030 --> 00:17:35,710 Så x er 1, y er 2. 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 OK. 401 00:17:37,050 --> 00:17:40,300 Så nå sier vi int tmp lik stjerne en. 402 00:17:40,300 --> 00:17:44,410 Så på linje fire, alt er den samme bortsett tmp. 403 00:17:44,410 --> 00:17:47,130 Vi har ikke endret noen verdier på noe bortsett tmp. 404 00:17:47,130 --> 00:17:49,230 Vi setter tmp lik stjerne en. 405 00:17:49,230 --> 00:17:50,620 Hva er stjerne en? 406 00:17:50,620 --> 00:17:56,240 Vel, noen punkter til x, så stjerne en kommer til lik x, som er en. 407 00:17:56,240 --> 00:18:00,080 Så alt er kopiert ned, og tmp er satt til 1. 408 00:18:00,080 --> 00:18:01,110 >> Nå er den neste linje. 409 00:18:01,110 --> 00:18:03,380 Stjerne en lik stjerners b. 410 00:18:03,380 --> 00:18:10,000 Så for linje five-- godt igjen, alt er den samme, bortsett fra hva stjerne en er. 411 00:18:10,000 --> 00:18:10,830 Hva er stjerne en? 412 00:18:10,830 --> 00:18:13,720 Vel, vi sa bare stjerne a er x. 413 00:18:13,720 --> 00:18:16,400 Så vi endrer x til lik stjerne b. 414 00:18:16,400 --> 00:18:18,960 Hva er stjerne b? y. b peker på y. 415 00:18:18,960 --> 00:18:21,030 Så stjerners b er y. 416 00:18:21,030 --> 00:18:25,140 Så vi setter x lik y, og alt annet er den samme. 417 00:18:25,140 --> 00:18:29,130 Så vi ser i neste rad at x er nå 2, og resten er bare kopiert ned. 418 00:18:29,130 --> 00:18:31,120 >> Nå i neste linje, lik stjerne b tmp. 419 00:18:31,120 --> 00:18:34,740 Vel, vi sa bare stjerne b er y, så vi setter y lik tmp. 420 00:18:34,740 --> 00:18:37,450 Alt annet er det samme, så alt blir kopiert ned. 421 00:18:37,450 --> 00:18:42,050 Vi setter y lik TMP, som er en, og alt annet er det samme. 422 00:18:42,050 --> 00:18:43,210 >> Nå endelig, linje sju. 423 00:18:43,210 --> 00:18:44,700 Vi er tilbake i den viktigste funksjonen. 424 00:18:44,700 --> 00:18:46,350 Vi er ute etter swap er ferdig. 425 00:18:46,350 --> 00:18:48,972 Vi har mistet en, b, og tmp, men til syvende og sist vi 426 00:18:48,972 --> 00:18:51,180 ikke endre noen verdier på noe punkt på dette, 427 00:18:51,180 --> 00:18:52,800 vi bare kopiere x og y ned. 428 00:18:52,800 --> 00:18:56,490 Og vi ser at x og y er Nå 2 og 1 stedet for 1 og 2. 429 00:18:56,490 --> 00:18:58,160 Rentebytteavtalen har lykkes henrettet. 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> Spørsmål 28. 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 Anta at du støter feilmeldingene 434 00:19:03,100 --> 00:19:06,790 nedenfor i kontortiden neste år som en CA eller TF. 435 00:19:06,790 --> 00:19:08,930 Advise hvordan du løser hver av disse feilene. 436 00:19:08,930 --> 00:19:11,160 Så udefinerte referanse til GetString. 437 00:19:11,160 --> 00:19:12,540 Hvorfor kan du se dette? 438 00:19:12,540 --> 00:19:15,380 Vel, hvis en student bruker GetString i koden sin, 439 00:19:15,380 --> 00:19:20,310 de gikk riktig hash inkludert CS50 dot h å inkludere CS50 biblioteket. 440 00:19:20,310 --> 00:19:22,380 >> Vel, hva gjør de trenger å fikse denne feilen? 441 00:19:22,380 --> 00:19:26,810 De trenger å gjøre en dash lcs50 på kommandolinje når de er kompilering. 442 00:19:26,810 --> 00:19:29,501 Så hvis de ikke passerer klang dash lcs50, de er 443 00:19:29,501 --> 00:19:32,000 ikke kommer til å ha den faktiske kode som implementerer GetString. 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> Spørsmål 29. 446 00:19:34,170 --> 00:19:36,190 Implisitt erklære bibliotek funksjon strlen. 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 Vel dette nå, de har ikke gjort riktig hash inkludere. 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 I dette spesielle tilfellet, header-fil de trenger for å inkludere er streng dot h, 451 00:19:45,410 --> 00:19:48,710 og med streng dot h, nå den student-- nå kompilatoren 452 00:19:48,710 --> 00:19:51,750 har tilgang til erklæringer strlen, 453 00:19:51,750 --> 00:19:54,120 og den vet at koden bruker StrLen riktig. 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> Spørsmål 30. 456 00:19:56,580 --> 00:20:00,240 Flere prosent konverter enn data argumenter. 457 00:20:00,240 --> 00:20:01,540 Så hva er dette? 458 00:20:01,540 --> 00:20:06,470 Husker godt at disse prosent signs-- hvordan de er relevante for printf. 459 00:20:06,470 --> 00:20:08,890 Så i printf kan vi percent-- vi kan skrive ut noe 460 00:20:08,890 --> 00:20:11,380 som prosent i backslash n. 461 00:20:11,380 --> 00:20:15,310 Eller vi kan skrive ut som prosent i, plass, prosent i, plass, prosent i. 462 00:20:15,310 --> 00:20:18,950 Så for hver av dem prosenttegn, trenger vi 463 00:20:18,950 --> 00:20:21,560 å passere en variabel ved slutten av printf. 464 00:20:21,560 --> 00:20:26,980 >> Så hvis vi sier printf paren prosent jeg backslash n nære paren, 465 00:20:26,980 --> 00:20:30,270 vel, sier vi at vi er kommer til å skrive ut et heltall, 466 00:20:30,270 --> 00:20:33,970 men da vi ikke passerer printf et heltall å faktisk skrive ut. 467 00:20:33,970 --> 00:20:37,182 Så her flere prosent konverteringer enn data argumenter? 468 00:20:37,182 --> 00:20:39,390 Det er å si at vi har en hel haug med prosenter, 469 00:20:39,390 --> 00:20:42,445 og vi ikke har nok variabler å faktisk fylle ut disse prosentene. 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> Og så definitivt, for spørsmål 31, definitivt mistet 40 bytes i en blokker. 472 00:20:50,010 --> 00:20:52,350 Så dette er en Valgrind feil. 473 00:20:52,350 --> 00:20:54,720 Dette er å si at et sted i koden din, 474 00:20:54,720 --> 00:20:59,010 du har en fordeling som er 40 bytes stor, så du malloced 40 bytes, 475 00:20:59,010 --> 00:21:00,515 og du aldri frigjort den. 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 Mest sannsynlig at du bare trenger å finne noen minnelekkasje, 478 00:21:05,140 --> 00:21:07,650 og finne ut hvor du må frigjøre denne minneblokk. 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> Og spørsmålet 32, ugyldig skrive av størrelse 4. 481 00:21:11,910 --> 00:21:13,250 Dette er igjen en Valgrind feil. 482 00:21:13,250 --> 00:21:15,440 Dette trenger ikke å gjøre med minnelekkasjer nå. 483 00:21:15,440 --> 00:21:20,750 Dette er, de fleste likely-- jeg mener, det er noen slags ugyldig minne rettigheter. 484 00:21:20,750 --> 00:21:23,270 Og mest sannsynlig er dette noen slags buffer overflow. 485 00:21:23,270 --> 00:21:26,560 Der du har en matrise, kanskje et heltall array, og la oss 486 00:21:26,560 --> 00:21:30,115 si det er av størrelse 5, og du prøve å ta matrise brakett 5. 487 00:21:30,115 --> 00:21:34,150 Så hvis du prøver å skrive til verdi, det er ikke en del av minnet 488 00:21:34,150 --> 00:21:37,440 at du faktisk har tilgang til, og så du kommer til å få denne feilen, 489 00:21:37,440 --> 00:21:39,272 sier ugyldig skrive av størrelse 4. 490 00:21:39,272 --> 00:21:42,480 Valgrind kommer til å kjenne deg er prøver å røre minne upassende. 491 00:21:42,480 --> 00:21:43,980 >> Og det er det for quiz0. 492 00:21:43,980 --> 00:21:47,065 Jeg er Rob Bowden, og dette er CS50. 493 00:21:47,065 --> 00:21:51,104