1 00:00:00,000 --> 00:00:10,920 >> [MUSIC Playing] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J MALAN: Okay, velkommen tilbage til CS50. 3 00:00:14,680 --> 00:00:16,500 Dette er starten på uge to. 4 00:00:16,500 --> 00:00:18,940 Et ord fra en af ​​vores venner på campus - 5 00:00:18,940 --> 00:00:22,620 hvis du er interesseret, eventuelt, enten nu eller i en fremtidig periode 6 00:00:22,620 --> 00:00:25,670 endnu en gang mere komfortabel, undervisning middle school studerende en lidt 7 00:00:25,670 --> 00:00:27,680 noget om datalogi, gør hovedet til denne webadresse. 8 00:00:27,680 --> 00:00:32,360 De er særligt behov lige nu for lærere, især hvis du har 9 00:00:32,360 --> 00:00:34,700 havde nogle eksponering for datalogi. 10 00:00:34,700 --> 00:00:38,060 >> Så minde om, at sidste gang, vi introducerede et par datatyper i C, og 11 00:00:38,060 --> 00:00:40,590 du måske er begyndt at få din hænder beskidte med disse hidtil 12 00:00:40,590 --> 00:00:41,940 i problemet indstillet en sådan. 13 00:00:41,940 --> 00:00:43,230 Og vi havde en char. 14 00:00:43,230 --> 00:00:49,100 Så i noget tekniske termer, hvad er en char som du kender det i dag? 15 00:00:49,100 --> 00:00:51,050 >> Så det er et tegn, men lad os være mere præcis nu. 16 00:00:51,050 --> 00:00:53,735 Hvad forstår vi ved tegn eller individuelle char? 17 00:00:53,735 --> 00:00:56,700 18 00:00:56,700 --> 00:00:59,500 En ikke-numerisk karakter - 19 00:00:59,500 --> 00:01:00,670 så ikke nødvendigvis. 20 00:01:00,670 --> 00:01:04,580 Det viser sig, at selv numre, selv tegnsætning og breve er 21 00:01:04,580 --> 00:01:06,980 repræsenteret med disse data skriv kendt som en char. 22 00:01:06,980 --> 00:01:09,440 Så det er ikke nødvendigvis alfabetisk. 23 00:01:09,440 --> 00:01:11,100 Ja? 24 00:01:11,100 --> 00:01:12,275 >> Så det er en ASCII-tegn. 25 00:01:12,275 --> 00:01:15,510 Så hvis du tænker tilbage på uge nul, når vi havde vores byte af frivillige 26 00:01:15,510 --> 00:01:19,150 komme op og enten holde deres hænder op eller ikke alle, de repræsenterede bits. 27 00:01:19,150 --> 00:01:22,450 Men kollektivt som en gruppe af otte, de repræsenterede en byte. 28 00:01:22,450 --> 00:01:26,030 Og vi introducerede begrebet ASCII på det foredrag, blot der er en 29 00:01:26,030 --> 00:01:28,170 kortlægning mellem tal og bogstaver. 30 00:01:28,170 --> 00:01:32,010 Og ASCII anvendelser, som dem mennesker underforståede, otte bits 31 00:01:32,010 --> 00:01:33,660 at repræsentere en karakter. 32 00:01:33,660 --> 00:01:36,890 >> Så derfor, hvis otte bits kan hver især på én af to værdier - 33 00:01:36,890 --> 00:01:38,010 nul eller én - 34 00:01:38,010 --> 00:01:40,280 det betyder der var to muligheder for den pågældende person - 35 00:01:40,280 --> 00:01:41,230 nul eller én - 36 00:01:41,230 --> 00:01:44,070 to for denne person, to for dette person to for denne ene. 37 00:01:44,070 --> 00:01:47,450 Så i alt to gange to gange to gange to gange to - 38 00:01:47,450 --> 00:01:49,700 så to den ottende i alt. 39 00:01:49,700 --> 00:01:54,320 Så der er en samlede antal tegn 256 muligt, at du kan 40 00:01:54,320 --> 00:01:55,750 repræsentere med otte bits. 41 00:01:55,750 --> 00:01:59,210 >> Nu de af jer, der taler asiatiske sprog kan vide, at der er mere 42 00:01:59,210 --> 00:02:02,620 tegn i verden end blot As og Bs og Cs og Ds. 43 00:02:02,620 --> 00:02:06,130 Og ja, er ASCII ikke tilstrækkeligt for en masse af verdens sprog. 44 00:02:06,130 --> 00:02:07,760 Men mere om det en anden gang. 45 00:02:07,760 --> 00:02:11,240 For nu, ved, at i C, hvis du ønsker at repræsentere et brev, et stykke 46 00:02:11,240 --> 00:02:15,780 tegnsætning, eller bare noget tegn i naturen, bruger vi en char. 47 00:02:15,780 --> 00:02:18,240 Og det er en byte eller otte bits. 48 00:02:18,240 --> 00:02:19,690 >> Hvad med en int? 49 00:02:19,690 --> 00:02:20,780 Tja, en int er et heltal. 50 00:02:20,780 --> 00:02:23,175 Hvor mange bits, hvis du husker, var et heltal typisk? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Enhver tilbagekaldelse? 53 00:02:27,512 --> 00:02:29,600 Så det er typisk 32. 54 00:02:29,600 --> 00:02:32,120 Det faktisk afhænger af computeren at du bruger. 55 00:02:32,120 --> 00:02:35,770 Men i apparatet, og i en masse computere, er det 32 ​​bit eller fire 56 00:02:35,770 --> 00:02:37,140 bytes - otte gange fire. 57 00:02:37,140 --> 00:02:39,790 Og ints bare bruges til opbevaring numre, enten negative, 58 00:02:39,790 --> 00:02:41,610 positive eller nul. 59 00:02:41,610 --> 00:02:45,250 >> Og hvis du har fået 32 ​​bit, og du kun pleje om positive tal, kan 60 00:02:45,250 --> 00:02:48,960 nogen ballpark hvor mange mulige heltal en computer kan repræsenterer, fra 61 00:02:48,960 --> 00:02:51,820 nul på op? 62 00:02:51,820 --> 00:02:56,130 Så det ville være to til 32, som er omtrent fire milliarder. 63 00:02:56,130 --> 00:02:59,720 Så disse beføjelser to kommer til at være tilbagevendende temaer i datalogi. 64 00:02:59,720 --> 00:03:03,930 Som vi kan se, de er helt praktisk til at arbejde med, selvom det ikke er helt 65 00:03:03,930 --> 00:03:05,790 let at gøre det math i ens hoved. 66 00:03:05,790 --> 00:03:07,000 >> Så vi vil sige omkring fire milliarder. 67 00:03:07,000 --> 00:03:08,620 Nu en lang lang - 68 00:03:08,620 --> 00:03:09,770 du kan slags gæt. 69 00:03:09,770 --> 00:03:10,480 Det er længere end en int. 70 00:03:10,480 --> 00:03:12,440 Hvor mange bits? 71 00:03:12,440 --> 00:03:14,250 Så 64 bits eller otte bytes. 72 00:03:14,250 --> 00:03:17,480 Det betyder bare, du kan repræsentere selv større tal, større positiv eller 73 00:03:17,480 --> 00:03:19,160 større negative tal. 74 00:03:19,160 --> 00:03:20,060 >> Og hvad flyde? 75 00:03:20,060 --> 00:03:22,260 Det er en floating point værdi af 32 bit. 76 00:03:22,260 --> 00:03:25,180 Dette er blot et reelt tal, noget med et komma. 77 00:03:25,180 --> 00:03:30,100 Men hvis man i stedet har brug for flere steder efter kommaet, eller du ønsker at 78 00:03:30,100 --> 00:03:33,720 repræsentere et større antal med nogle fraktion efter det, kan du bruge en 79 00:03:33,720 --> 00:03:36,260 dobbelt, hvilket er 64 bit. 80 00:03:36,260 --> 00:03:38,240 >> Men der er en interessant takeaway her. 81 00:03:38,240 --> 00:03:42,890 Så hvis int'er er begrænset af 32 bits og selv lange længes er begrænset af 64 82 00:03:42,890 --> 00:03:46,180 bits, den slags rejser spørgsmålet, hvad nu hvis du rent faktisk ønsker at tælle 83 00:03:46,180 --> 00:03:48,790 højere end 4 milliarder for en int? 84 00:03:48,790 --> 00:03:50,330 Nå, du bare bruge en lang lang. 85 00:03:50,330 --> 00:03:54,200 Men hvad nu hvis du ønsker at tælle højere end to til den 64., give eller tage? 86 00:03:54,200 --> 00:03:55,810 >> Nu, det er et enormt antal. 87 00:03:55,810 --> 00:03:59,250 Men til sidst, du kan faktisk bekymrer sig om den slags værdier, 88 00:03:59,250 --> 00:04:03,070 især hvis du bruger en database og begynder at indsamle masser og masser 89 00:04:03,070 --> 00:04:06,190 og masser af data og tildele unikke tal til hvert stykke af disse data. 90 00:04:06,190 --> 00:04:07,430 Så vi slags har et problem. 91 00:04:07,430 --> 00:04:10,700 , Og ligeledes med flydende komma værdier - flåd eller doubler - 92 00:04:10,700 --> 00:04:14,290 hvis du kun har et begrænset antal bits, hvor mange samlede tal kunne du 93 00:04:14,290 --> 00:04:16,980 muligvis repræsentere? 94 00:04:16,980 --> 00:04:19,540 >> Tja, det er mindre klart, når du involvere et komma. 95 00:04:19,540 --> 00:04:20,899 Men det er sikkert begrænset. 96 00:04:20,899 --> 00:04:24,390 Hvis du har et endeligt antal bits, et endeligt antal mennesker, et endeligt 97 00:04:24,390 --> 00:04:27,350 Antallet af pærer, helt sikkert du kan kun repræsenterer et endeligt antal 98 00:04:27,350 --> 00:04:28,510 kommeværdier. 99 00:04:28,510 --> 00:04:33,170 Men hvor mange reelle tal er deres i verden? 100 00:04:33,170 --> 00:04:33,680 Der er en uendelig. 101 00:04:33,680 --> 00:04:37,280 Så det er lidt af et problem, fordi vi ikke har en uendelig mængde af 102 00:04:37,280 --> 00:04:39,970 hukommelse eller RAM inde i vores computere. 103 00:04:39,970 --> 00:04:41,780 Så nogle udfordrende ting kan ske. 104 00:04:41,780 --> 00:04:43,900 >> Så lad os gå videre og prøve at udtrykke dette her. 105 00:04:43,900 --> 00:04:46,240 Lad mig gå videre og åbne op gedit. 106 00:04:46,240 --> 00:04:50,360 Jeg har tænkt mig at gå videre og gemme en fil kaldet "floats0.c" bare for at være 107 00:04:50,360 --> 00:04:54,630 overensstemmelse med et eksempel, der er tilgængelige online, hvis du gerne vil. 108 00:04:54,630 --> 00:04:58,080 Og jeg har tænkt mig at gå videre og definere det som følger - 109 00:04:58,080 --> 00:05:01,540 Jeg har tænkt mig at gå videre og sige, int main tomrum, som vi ofte gør. 110 00:05:01,540 --> 00:05:07,190 >> Og så i dette program, vil jeg erklære mig en float, så en 32-bit 111 00:05:07,190 --> 00:05:09,700 variabel kaldet f, vilkårligt. 112 00:05:09,700 --> 00:05:13,910 Og så jeg har tænkt mig at gemme i det Jeg ved det ikke, en tiendedel, så 0.1. 113 00:05:13,910 --> 00:05:16,590 Så jeg har tænkt mig at udtrykke, at som én divideret med 10, hvilket er helt 114 00:05:16,590 --> 00:05:17,790 legitime i C. 115 00:05:17,790 --> 00:05:20,460 >> Og så på den anden linje, jeg simpelthen ønsker at udskrive denne værdi. 116 00:05:20,460 --> 00:05:22,950 Så minde om, at vi kan bruge den velkendte printf. 117 00:05:22,950 --> 00:05:25,420 Vi ønsker ikke at bruge% i for en int. 118 00:05:25,420 --> 00:05:28,360 Vi ønsker at bruge% f for en svømmer. 119 00:05:28,360 --> 00:05:33,080 Og så vil jeg tænkt mig at gøre backslash n, tæt citat, komma, f, semikolon. 120 00:05:33,080 --> 00:05:34,400 >> Så her er mit program. 121 00:05:34,400 --> 00:05:35,820 Der er allerede én fejl. 122 00:05:35,820 --> 00:05:38,640 Er der nogen, for hvem denne klikket vil allerede pege mindst 123 00:05:38,640 --> 00:05:40,220 én fejl jeg har lavet? 124 00:05:40,220 --> 00:05:42,470 Ja? 125 00:05:42,470 --> 00:05:42,800 Ja. 126 00:05:42,800 --> 00:05:47,860 Jeg glemte "# include" på top, de symptom på som, hvis jeg forsøger at 127 00:05:47,860 --> 00:05:50,490 kompilere dette vil være, at compiler vil råbe på mig, 128 00:05:50,490 --> 00:05:52,770 siger udefineret symbol eller noget i den retning. 129 00:05:52,770 --> 00:05:55,360 Det betyder ikke forstå noget gerne printf. 130 00:05:55,360 --> 00:05:59,380 >> Så jeg har tænkt mig at gøre "# include "Gemme filen. 131 00:05:59,380 --> 00:06:00,400 Og nu er det i bedre form. 132 00:06:00,400 --> 00:06:02,690 Men jeg vil også pege ud én ny detalje i dag. 133 00:06:02,690 --> 00:06:08,620 Ud over at angive sted holdere som% f% i% s, kan du 134 00:06:08,620 --> 00:06:12,320 undertiden påvirke adfærden af denne pladsholder. 135 00:06:12,320 --> 00:06:15,540 For eksempel, i tilfælde af en variabel pointværdi, hvis jeg kun vil 136 00:06:15,540 --> 00:06:22,200 at vise én decimal efter periode, kan jeg rent faktisk gør 0.1f. 137 00:06:22,200 --> 00:06:26,830 Så med andre ord, adskille jeg f og procenttegn med 0,1, bare 138 00:06:26,830 --> 00:06:30,200 fortæller printf, har du måske en hel masse tal efter kommaet 139 00:06:30,200 --> 00:06:30,930 punkt for mig. 140 00:06:30,930 --> 00:06:32,870 Men jeg kun ønsker at se en af ​​dem. 141 00:06:32,870 --> 00:06:36,280 >> Så jeg har tænkt mig at gå videre nu og spar dette program, skal du gå ind i min terminal 142 00:06:36,280 --> 00:06:41,870 vinduet, og jeg har tænkt mig at gå videre og type gør float 0, ind. 143 00:06:41,870 --> 00:06:44,930 Jeg kan se, at noget kryptiske linje, vil begynde at give mere mening, da vi 144 00:06:44,930 --> 00:06:46,900 drille det fra hinanden i denne uge og næste. 145 00:06:46,900 --> 00:06:50,480 Nu vil jeg gå videre og køre float nul. 146 00:06:50,480 --> 00:06:52,020 Og, fandens. 147 00:06:52,020 --> 00:06:54,880 >> Så der er en anden fejl her for nogle grund. 148 00:06:54,880 --> 00:07:02,490 Jeg er temmelig sikker på, at en tiendedel eller én divideret med 10, er ikke 0.0. 149 00:07:02,490 --> 00:07:04,590 Måske er jeg bare ikke ser ved nok cifre. 150 00:07:04,590 --> 00:07:08,580 Så hvorfor ikke siger jeg to .2 at se to decimaler stedet for blot én. 151 00:07:08,580 --> 00:07:11,810 Lad mig gå tilbage til min terminal vindue her og ramt op et par gange for at 152 00:07:11,810 --> 00:07:12,840 se min historie. 153 00:07:12,840 --> 00:07:15,910 Gør flyde nul igen, og derefter op igen. 154 00:07:15,910 --> 00:07:17,730 Og nu ind. 155 00:07:17,730 --> 00:07:20,000 >> Og nu er jeg temmelig sikker på det er forkert. 156 00:07:20,000 --> 00:07:23,030 Og jeg kunne gøre tre og fire, og jeg er sandsynligvis kommer til at holde se nuller. 157 00:07:23,030 --> 00:07:24,880 Så hvor er fejlen? 158 00:07:24,880 --> 00:07:27,910 Én divideret med 10, bør være 0,1. 159 00:07:27,910 --> 00:07:30,310 Nogen ønsker at tage et stik på, hvad det grundlæggende spørgsmål er? 160 00:07:30,310 --> 00:07:32,400 Ja? 161 00:07:32,400 --> 00:07:33,420 De er begge heltal. 162 00:07:33,420 --> 00:07:33,920 Og hvad så? 163 00:07:33,920 --> 00:07:37,820 Så med et divideret med 10, der er hvad jeg gør i matematik. 164 00:07:37,820 --> 00:07:41,185 Og jeg får 0.1. 165 00:07:41,185 --> 00:07:41,660 >> Ja. 166 00:07:41,660 --> 00:07:43,240 Og så er det faktisk, at spørgsmålet. 167 00:07:43,240 --> 00:07:46,700 Når du tager et heltal i en computer og du dividere det med et andet heltal, 168 00:07:46,700 --> 00:07:50,430 computeren som standard vil antage, at du vil have et heltal. 169 00:07:50,430 --> 00:07:54,620 Problemet er dog, selvfølgelig, er at 0,1 ikke er et heltal. 170 00:07:54,620 --> 00:07:55,680 Det er et reelt tal. 171 00:07:55,680 --> 00:07:59,610 Og så hvad computeren gør ved Standard er det bare smider væk 172 00:07:59,610 --> 00:08:01,070 alt efter kommaet. 173 00:08:01,070 --> 00:08:03,380 Det betyder ikke runde ned eller op per se. 174 00:08:03,380 --> 00:08:06,480 Det bare smider alt væk efter kommaet. 175 00:08:06,480 --> 00:08:07,430 Og nu det giver mening. 176 00:08:07,430 --> 00:08:09,740 Fordi nu er vi helt klart tilbage med nul. 177 00:08:09,740 --> 00:08:10,250 >> Men vent et øjeblik. 178 00:08:10,250 --> 00:08:11,840 Jeg kan ikke se en int nul. 179 00:08:11,840 --> 00:08:14,910 Jeg faktisk ser 0,00. 180 00:08:14,910 --> 00:08:16,340 Så hvordan kan jeg forene det nu? 181 00:08:16,340 --> 00:08:22,850 Hvis man divideret med 10 er nul, men jeg er se 0.00, hvor er det at få 182 00:08:22,850 --> 00:08:24,250 konverteres tilbage til et reelt tal? 183 00:08:24,250 --> 00:08:25,500 Ja. 184 00:08:25,500 --> 00:08:29,850 185 00:08:29,850 --> 00:08:30,630 Præcis. 186 00:08:30,630 --> 00:08:35,600 >> Så op her på linje fem, da jeg faktisk gemme det 0,1, som derefter 187 00:08:35,600 --> 00:08:39,549 trunkeret til nul, inde i en float, det er faktisk svarer til 188 00:08:39,549 --> 00:08:42,100 lagre den ikke som en int, men ja, som en float. 189 00:08:42,100 --> 00:08:46,540 Desuden, jeg derefter bruge printf til udtrykkeligt udskrive dette nummer til to 190 00:08:46,540 --> 00:08:49,740 decimaler selvom der måske faktisk ikke være nogen. 191 00:08:49,740 --> 00:08:51,020 >> Så denne slags stinker, right? 192 00:08:51,020 --> 00:08:53,640 Tilsyneladende kan du ikke gøre matematik, i det mindste på dette niveau af 193 00:08:53,640 --> 00:08:55,600 præcision, i en computer. 194 00:08:55,600 --> 00:08:56,930 Men sikkert er der en løsning. 195 00:08:56,930 --> 00:09:00,410 Hvad er den enkleste fix kunne vi måske gøre, bare intuitivt her 196 00:09:00,410 --> 00:09:01,130 løse dette? 197 00:09:01,130 --> 00:09:02,380 Ja? 198 00:09:02,380 --> 00:09:04,700 199 00:09:04,700 --> 00:09:06,574 Drej heltal ind - 200 00:09:06,574 --> 00:09:06,976 ja. 201 00:09:06,976 --> 00:09:10,420 Selvom jeg ikke er helt sikker på, hvad der er virkelig foregår her, hvis det 202 00:09:10,420 --> 00:09:13,440 fundamentalt har at gøre med disse både være ints, ja, hvorfor ikke jeg 203 00:09:13,440 --> 00:09:18,230 gør at 10,0, hvilket gør dette 1.0, gem filen. 204 00:09:18,230 --> 00:09:20,990 Lad mig gå ned til bund og rekompilering. 205 00:09:20,990 --> 00:09:23,030 Lad mig nu køre. 206 00:09:23,030 --> 00:09:23,420 Og der - 207 00:09:23,420 --> 00:09:27,690 Nu har jeg fået min en tiendedel repræsenteret 0,10. 208 00:09:27,690 --> 00:09:28,420 >> Ok. 209 00:09:28,420 --> 00:09:29,220 Så det er ikke dårligt. 210 00:09:29,220 --> 00:09:31,730 Og lad mig påpege en anden vej vi kunne have løst dette. 211 00:09:31,730 --> 00:09:35,580 Lad mig faktisk rulle tilbage i tiden til, når vi havde dette som en 212 00:09:35,580 --> 00:09:36,680 tiendedel et øjeblik siden. 213 00:09:36,680 --> 00:09:40,800 Og lad mig gå videre og gem denne fil som et andet filnavn, for blot at 214 00:09:40,800 --> 00:09:41,750 har en lille checkpoint. 215 00:09:41,750 --> 00:09:43,450 Så det var udgave én. 216 00:09:43,450 --> 00:09:45,520 Og lad mig nu gå videre og gøre én mere versionen. 217 00:09:45,520 --> 00:09:48,540 Vi kalder denne udgave to zero indekseret. 218 00:09:48,540 --> 00:09:51,280 >> Og jeg har tænkt mig at stedet gøre det - ved du hvad? 219 00:09:51,280 --> 00:09:54,400 Tilføjelse dot nul fungerer i dette tilfælde. 220 00:09:54,400 --> 00:09:56,060 Men formoder, at man var en variabel. 221 00:09:56,060 --> 00:09:57,680 Formodes 10 var en variabel. 222 00:09:57,680 --> 00:10:00,680 Med andre ord, formoder, at jeg ikke kunne bare hårdt kode .0 ved udgangen 223 00:10:00,680 --> 00:10:02,340 af denne aritmetiske udtryk. 224 00:10:02,340 --> 00:10:05,820 Tja, jeg kan faktisk gøre noget i parentes kaldes støbning. 225 00:10:05,820 --> 00:10:11,920 Jeg kan kaste, at heltal 10 til en float, og jeg kan kaste, at heltal en til en 226 00:10:11,920 --> 00:10:12,800 flyde, samt. 227 00:10:12,800 --> 00:10:17,190 Så matematik, der kommer til at ske effektivt 1.0 divideret med 10,0, 228 00:10:17,190 --> 00:10:19,250 resultatet heraf går if som før. 229 00:10:19,250 --> 00:10:26,130 Så hvis jeg kompilere det som gør flåd 2., og nu flyder 2, får jeg den samme 230 00:10:26,130 --> 00:10:27,020 besvare, samt. 231 00:10:27,020 --> 00:10:29,640 >> Så dette er en temmelig kunstig eksempel, at løse dette problem 232 00:10:29,640 --> 00:10:31,400 ved at indføre støbning. 233 00:10:31,400 --> 00:10:34,410 Men generelt er casting kommer til at være en kraftfuld ting, især for 234 00:10:34,410 --> 00:10:38,180 Problemet indstille to i en uges tid, hvor du ønsker at konvertere en datatype 235 00:10:38,180 --> 00:10:41,800 andet, at ved udgangen af ​​dagen er repræsenteret på den samme måde. 236 00:10:41,800 --> 00:10:44,970 Ved slutningen af ​​dagen, hver enkelt ting, vi har talt om hidtil er 237 00:10:44,970 --> 00:10:46,710 bare ints under hætten. 238 00:10:46,710 --> 00:10:48,950 Eller hvis det er for lavt niveau for dig, de er bare tal 239 00:10:48,950 --> 00:10:49,750 under hætten. 240 00:10:49,750 --> 00:10:52,850 Selv tegn, igen, husker fra uge nul, er tal 241 00:10:52,850 --> 00:10:53,990 under hætten. 242 00:10:53,990 --> 00:10:57,240 >> Hvilket vil sige, vi kan konvertere mellem forskellige typer af numre, hvis 243 00:10:57,240 --> 00:10:58,060 de er bare bits. 244 00:10:58,060 --> 00:11:01,020 Vi kan konvertere mellem numrene og breve, hvis de er bare 245 00:11:01,020 --> 00:11:02,580 bits, og vice versa. 246 00:11:02,580 --> 00:11:07,170 Og støbning på denne måde er en mekanisme i programmering, der lader dig magt 247 00:11:07,170 --> 00:11:10,970 ændre en datatype til en anden. 248 00:11:10,970 --> 00:11:14,570 Desværre er det ikke så ligetil som jeg kunne have ønsket. 249 00:11:14,570 --> 00:11:19,220 >> Jeg har tænkt mig at gå tilbage til flåd 1, som var enklere, mere 250 00:11:19,220 --> 00:11:22,830 ligetil med .0 Tilføjet til hver. 251 00:11:22,830 --> 00:11:25,260 Og ligesom en opfrisket, lad mig gå videre og kompilere 252 00:11:25,260 --> 00:11:27,670 dette, skal flåd 2 - 253 00:11:27,670 --> 00:11:30,300 Beklager, det er at gøre flåd 1.. 254 00:11:30,300 --> 00:11:32,050 Og lad os nu køre flåd 1.. 255 00:11:32,050 --> 00:11:34,810 Og i bunden, bemærk at jeg faktisk får 0.1. 256 00:11:34,810 --> 00:11:36,165 Så problem løst. 257 00:11:36,165 --> 00:11:37,280 >> Men ikke endnu. 258 00:11:37,280 --> 00:11:40,000 Jeg er nu kommer til at få en smule nysgerrig, og jeg har tænkt mig at gå tilbage til mit 259 00:11:40,000 --> 00:11:41,620 printf erklæring og sige, ved du hvad? 260 00:11:41,620 --> 00:11:44,090 Jeg vil gerne bekræfte, at denne er virkelig en tiendedel. 261 00:11:44,090 --> 00:11:47,890 Og jeg har tænkt mig at ønsker at se denne til,, siger fem decimaler. 262 00:11:47,890 --> 00:11:48,570 Det er ikke et problem. 263 00:11:48,570 --> 00:11:52,020 Jeg ændre to til fem, Jeg kompilere med lave. 264 00:11:52,020 --> 00:11:53,770 Jeg køre det som flyder 1.. 265 00:11:53,770 --> 00:11:54,990 Ser temmelig godt. 266 00:11:54,990 --> 00:11:58,570 Mine fornuftighedskontroller kan ende der, men Jeg får lidt mere eventyrlystne. 267 00:11:58,570 --> 00:12:00,330 Jeg har tænkt mig at ændre 0,5-0,10. 268 00:12:00,330 --> 00:12:03,440 Jeg ønsker at se 10 cifre efter det decimal. 269 00:12:03,440 --> 00:12:09,060 >> Og jeg har tænkt mig at gå videre og kompilere dette og køre svæver 1.. 270 00:12:09,060 --> 00:12:13,060 Jeg slags beklagelse have testet dette længere, fordi min matematik er ikke så 271 00:12:13,060 --> 00:12:14,320 korrigere længere, det forekommer. 272 00:12:14,320 --> 00:12:15,630 Men vent et øjeblik, måske det er bare et lykketræf. 273 00:12:15,630 --> 00:12:17,810 Måske computer fungerer en lille smule mærkeligt. 274 00:12:17,810 --> 00:12:21,810 Lad mig gå videre og gøre 20 decimaler og berolige mig selv, at jeg kender 275 00:12:21,810 --> 00:12:22,540 hvordan man gør matematik. 276 00:12:22,540 --> 00:12:23,460 Jeg ved, hvordan man programmerer. 277 00:12:23,460 --> 00:12:26,960 Foretag flåd 1, rekompilere og helvede. 278 00:12:26,960 --> 00:12:31,110 Det er virkelig, virkelig komme langt fra mærket. 279 00:12:31,110 --> 00:12:32,490 >> Så hvad sker der her? 280 00:12:32,490 --> 00:12:36,050 Intuitivt er baseret på vores antagelser tidligere om størrelsen af ​​datatyper 281 00:12:36,050 --> 00:12:38,040 hvad der skal ske her under hætten? 282 00:12:38,040 --> 00:12:39,290 Ja? 283 00:12:39,290 --> 00:12:43,000 284 00:12:43,000 --> 00:12:43,590 Præcis. 285 00:12:43,590 --> 00:12:46,480 Hvis du ønsker denne meget præcision, og det er en pokkers af en masse præcision - 286 00:12:46,480 --> 00:12:48,770 20 numre efter kommaet. 287 00:12:48,770 --> 00:12:51,990 Du kan umuligt udgøre en vilkårligt antal medmindre du har en 288 00:12:51,990 --> 00:12:52,930 vilkårligt antal bits. 289 00:12:52,930 --> 00:12:54,190 Men det gør vi ikke. 290 00:12:54,190 --> 00:12:57,200 For en svømmer, har vi kun 32 bit. 291 00:12:57,200 --> 00:13:02,260 >> Så hvis 32 bit kan kun ionbyttet i en måde - ligesom vores mennesker på, scene 292 00:13:02,260 --> 00:13:05,780 hænderne op eller ned - i et begrænset antal måder, er der kun et begrænset antal 293 00:13:05,780 --> 00:13:08,640 af reelle tal, du kan repræsentere med disse bit. 294 00:13:08,640 --> 00:13:10,500 Og så computeren sidst er nødt til at 295 00:13:10,500 --> 00:13:11,730 begynde at skære hjørner. 296 00:13:11,730 --> 00:13:15,500 Computeren kan skjule disse detaljer fra os for en lille smule tid. 297 00:13:15,500 --> 00:13:18,880 Men hvis vi begynder at stikke på tallene og ser længere og længere på 298 00:13:18,880 --> 00:13:23,220 efterstillede tal i hele tal, så vi begynder at se, at det er 299 00:13:23,220 --> 00:13:26,480 faktisk tilnærme idé på en tiendedel. 300 00:13:26,480 --> 00:13:29,860 >> Og så viser det sig, tragisk, er der et uendeligt antal numre 301 00:13:29,860 --> 00:13:35,060 Vi kan ikke repræsentere netop i en computer, i det mindste med en endelig 302 00:13:35,060 --> 00:13:38,030 Antallet af bits, et endeligt mængden af ​​RAM. 303 00:13:38,030 --> 00:13:41,210 Nu desværre, det til tider har virkelige verden konsekvenser. 304 00:13:41,210 --> 00:13:45,980 Hvis folk ikke helt sætte pris på denne eller slags tager for givet, 305 00:13:45,980 --> 00:13:48,310 at deres computer bare vil gøre, hvad de fortæller det til at gøre, og ikke 306 00:13:48,310 --> 00:13:51,430 forstå disse underliggende repræsentation detaljer - 307 00:13:51,430 --> 00:13:55,290 som ærligt talt, i nogle sprog er skjult for brugeren, i modsætning til C - 308 00:13:55,290 --> 00:13:56,500 nogle dårlige ting kan ske. 309 00:13:56,500 --> 00:13:58,650 >> Og hvad jeg troede, vi ville gøre er at tage et skridt tilbage. 310 00:13:58,650 --> 00:14:00,420 Og det er omkring en otte-minutters video. 311 00:14:00,420 --> 00:14:04,200 Det blev sendt for et par år siden, og det giver indblik i faktisk hvad der kan gå 312 00:14:04,200 --> 00:14:09,290 galt, når du under-værdsætte disse former for detaljer i meget alt for 313 00:14:09,290 --> 00:14:10,080 virkelige verden. 314 00:14:10,080 --> 00:14:12,965 Hvis vi kunne dæmpe lyset i et par minutter. 315 00:14:12,965 --> 00:14:14,360 >> SPEAKER 1: Vi vender nu tilbage til teknik 316 00:14:14,360 --> 00:14:17,160 katastrofer på Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Computere - 318 00:14:18,680 --> 00:14:21,340 vi har alle kommet til at acceptere ofte frustrerende problemer 319 00:14:21,340 --> 00:14:23,170 der går med dem. 320 00:14:23,170 --> 00:14:27,570 Bugs, vira og software glitches er små priser til at betale for 321 00:14:27,570 --> 00:14:28,960 bekvemmelighed. 322 00:14:28,960 --> 00:14:32,040 Men i high-tech og high-speed militær og rumprogram 323 00:14:32,040 --> 00:14:38,650 applikationer, den mindste problem kan forstørres i katastrofen. 324 00:14:38,650 --> 00:14:44,480 >> Den 4. juni 1996 udarbejdet forskerne at lancere en ubemandet Ariane 5 raket. 325 00:14:44,480 --> 00:14:48,700 Det var i færd videnskabelige satellitter til formål at skabe præcist, hvordan 326 00:14:48,700 --> 00:14:53,250 Jordens magnetfelt interagerer med solvind. 327 00:14:53,250 --> 00:14:57,540 Raketten blev bygget til det europæiske Rumorganisation og løftes fra dets 328 00:14:57,540 --> 00:14:59,906 facilitet på kysten Fransk Guyana. 329 00:14:59,906 --> 00:15:03,660 >> JACK GANSSLE: I omkring 37 sekunder inde flyvningen, de først bemærket 330 00:15:03,660 --> 00:15:04,910 noget gik galt. 331 00:15:04,910 --> 00:15:08,130 Dyserne blev dreje i en måde, de burde virkelig ikke. 332 00:15:08,130 --> 00:15:12,380 Ca. 40 sekunder inde i flyvningen, klart køretøjet var i knibe. 333 00:15:12,380 --> 00:15:14,400 Og det er, når de lavede en beslutning om at ødelægge det. 334 00:15:14,400 --> 00:15:18,520 Sortimentet sikkerhed officer med enorme tarme, trykkede på knappen, 335 00:15:18,520 --> 00:15:23,900 sprængte raketten før den kunne blive en fare for den offentlige sikkerhed. 336 00:15:23,900 --> 00:15:27,810 >> SPEAKER 1: Dette var den jomfrurejse af Ariane 5 og dens ødelæggelse 337 00:15:27,810 --> 00:15:32,020 fandt sted på grund af en indbygget fejl i rakettens software. 338 00:15:32,020 --> 00:15:33,980 >> JACK GANSSLE: Problemet på Ariane var, at der var en række 339 00:15:33,980 --> 00:15:36,390 det krævede 64 bits til at udtrykke. 340 00:15:36,390 --> 00:15:39,420 Og de ønskede at konvertere til en 16-bit tal. 341 00:15:39,420 --> 00:15:43,130 De antog, at antallet var aldrig vil være meget stor, at de fleste af 342 00:15:43,130 --> 00:15:46,810 disse cifre i 64-bit Antallet var nuller. 343 00:15:46,810 --> 00:15:48,270 De var forkert. 344 00:15:48,270 --> 00:15:51,380 >> SPEAKER 1: Den manglende evne af et software program til at acceptere den slags 345 00:15:51,380 --> 00:15:55,350 tal, som genereres af en anden var ved roden af ​​den manglende. 346 00:15:55,350 --> 00:15:59,970 Softwareudvikling var blevet en meget kostbare del af ny teknologi. 347 00:15:59,970 --> 00:16:03,980 Ariane 4 raket havde været meget succes, så meget af softwaren 348 00:16:03,980 --> 00:16:07,480 skabt for det var også anvendes i Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP COYLE: Det grundlæggende problem var at Ariane 5 var hurtigere, 350 00:16:11,980 --> 00:16:13,720 fremskyndes hurtigere. 351 00:16:13,720 --> 00:16:17,250 Og softwaren ikke havde tegnede sig for det. 352 00:16:17,250 --> 00:16:20,770 >> SPEAKER 1: Ødelæggelsen af ​​raketten var en enorm økonomisk katastrofe, 353 00:16:20,770 --> 00:16:24,200 alle på grund af et minut softwarefejl. 354 00:16:24,200 --> 00:16:27,820 Men dette var ikke første gang data konvertering problemer var plaget moderne 355 00:16:27,820 --> 00:16:30,620 raketteknologien. 356 00:16:30,620 --> 00:16:34,480 >> JACK GANSSLE: I 1991 med starten af den første Golfkrig, Patriot 357 00:16:34,480 --> 00:16:38,610 missil oplevet en lignende art en række konvertering problem. 358 00:16:38,610 --> 00:16:44,910 Som følge heraf var 28 amerikanske soldater dræbt og omkring 100 andre såret 359 00:16:44,910 --> 00:16:48,600 når Patriot, som skulle at beskytte mod indkommende Scuds, 360 00:16:48,600 --> 00:16:51,630 undladt at affyre et missil. 361 00:16:51,630 --> 00:16:55,110 >> SPEAKER 1: Når Irak invaderede Kuwait, og America lancerede Desert Storm i 362 00:16:55,110 --> 00:17:00,570 begyndelsen af ​​1991, Patriot missil-batterier blev indsat for at beskytte Saudi-Arabien 363 00:17:00,570 --> 00:17:04,760 og Israel fra irakisk Scud missilangreb. 364 00:17:04,760 --> 00:17:09,720 The Patriot er et amerikansk mellemdistance overflade-til-luft-system fremstillet af 365 00:17:09,720 --> 00:17:11,569 Raytheon selskab. 366 00:17:11,569 --> 00:17:16,410 >> THEODORE POSTOL: Størrelsen af ​​Patriot opfanger selv er groft 367 00:17:16,410 --> 00:17:17,710 20-meter lang. 368 00:17:17,710 --> 00:17:20,800 Og det vejer omkring 2000 pounds. 369 00:17:20,800 --> 00:17:22,940 Og det bærer et sprænghoved på omkring - 370 00:17:22,940 --> 00:17:24,905 Jeg synes det er omkring 150 pounds. 371 00:17:24,905 --> 00:17:31,030 Og sprænghoved selv er en højeksplosive der har 372 00:17:31,030 --> 00:17:33,270 fragmenter omkring det. 373 00:17:33,270 --> 00:17:37,490 Den beklædning i sprænghoved er konstrueret at optræde som hagl. 374 00:17:37,490 --> 00:17:40,720 >> SPEAKER 1: missiler udføres fire pr beholder og transporteres 375 00:17:40,720 --> 00:17:43,050 af en sættevogn. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP COYLE: The Patriot anti-missil systemet går tilbage til 377 00:17:47,490 --> 00:17:50,710 mindst 20 år nu. 378 00:17:50,710 --> 00:17:54,350 Det var oprindeligt designet som en luftforsvar missil 379 00:17:54,350 --> 00:17:56,190 nedskyde fjendtlige fly. 380 00:17:56,190 --> 00:18:02,490 I den første Golfkrig, når denne krig kom, hæren ønskede at bruge det 381 00:18:02,490 --> 00:18:05,535 at nedskyde Scuds, ikke fly. 382 00:18:05,535 --> 00:18:09,310 Den irakiske luftvåben var ikke så meget af et problem. 383 00:18:09,310 --> 00:18:12,450 Men hæren var bekymret Scuds. 384 00:18:12,450 --> 00:18:15,950 Og så de forsøgte at opgradere Patriot. 385 00:18:15,950 --> 00:18:18,750 >> SPEAKER 1: Aflytning en fjende missil rejser på mach fem var 386 00:18:18,750 --> 00:18:20,890 vil være udfordrende nok. 387 00:18:20,890 --> 00:18:25,590 Men da Patriot blev hastet ind service, hæren var ikke klar over en 388 00:18:25,590 --> 00:18:31,710 Irakiske modifikation, der gjorde deres Scuds næsten umuligt at ramme. 389 00:18:31,710 --> 00:18:35,240 >> THEODORE POSTOL: Hvad skete er Scuds der var 390 00:18:35,240 --> 00:18:36,570 kommer var ustabil. 391 00:18:36,570 --> 00:18:37,532 De var slingrende. 392 00:18:37,532 --> 00:18:43,220 Grunden til dette var irakerne, i For at få 600 km ud af en 393 00:18:43,220 --> 00:18:47,530 300-kilometer-range missil tog vægt af den forreste sprænghoved. 394 00:18:47,530 --> 00:18:49,290 De gjorde sprænghoved lysere. 395 00:18:49,290 --> 00:18:53,110 Så nu Patriot forsøger at komme på Scud. 396 00:18:53,110 --> 00:18:56,470 Og det meste af tiden, den overvældende størstedelen af ​​den tid, det ville bare 397 00:18:56,470 --> 00:18:58,730 flyve ved Scud. 398 00:18:58,730 --> 00:19:01,760 >> SPEAKER 1: Når Patriot-systemet operatører indså Patriot savnet 399 00:19:01,760 --> 00:19:06,690 sit mål, de detonerede Patriots sprænghoved for at undgå mulig 400 00:19:06,690 --> 00:19:10,300 tab, hvis det blev tilladt at falde til jorden. 401 00:19:10,300 --> 00:19:14,540 >> THEODORE POSTOL: Det var, hvad de fleste folk så som store ildkugler på himlen 402 00:19:14,540 --> 00:19:20,350 og misforstået som aflytninger af Scud sprænghoveder. 403 00:19:20,350 --> 00:19:23,320 >> SPEAKER 1: Selv om i nat himmel Patrioter syntes at være vellykket 404 00:19:23,320 --> 00:19:27,530 ødelægge Scuds på Dhahran der kunne ikke fejl om dens 405 00:19:27,530 --> 00:19:29,140 ydeevne. 406 00:19:29,140 --> 00:19:34,180 Der, Patriot radarsystem tabt styr på en indkommende Scud og aldrig 407 00:19:34,180 --> 00:19:36,380 iværksat på grund af en software-fejl. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Det var israelere, der først opdagede at jo længere systemet 410 00:19:42,700 --> 00:19:48,020 var på, jo større tidssammenfald forfaldt til et ur 411 00:19:48,020 --> 00:19:50,470 indlejret i systemets computer. 412 00:19:50,470 --> 00:19:54,640 >> JACK GANSSLE: Omkring to uger før tragedie i Dhahran, israelerne 413 00:19:54,640 --> 00:19:58,440 indberettes til forsvarsministeriet at systemet var ved at miste tid. 414 00:19:58,440 --> 00:20:01,280 Efter omkring otte timers drift, bemærkede de, at systemet er 415 00:20:01,280 --> 00:20:03,530 bliver mærkbart mindre nøjagtige. 416 00:20:03,530 --> 00:20:07,710 Forsvarsministeriet reagerede ved fortæller alle de Patriot batterier 417 00:20:07,710 --> 00:20:10,500 at ingen af ​​systemerne på i lang tid. 418 00:20:10,500 --> 00:20:12,430 De har aldrig sagt, hvad en lang tid var. 419 00:20:12,430 --> 00:20:13,330 Otte timer? 420 00:20:13,330 --> 00:20:13,810 10 timer? 421 00:20:13,810 --> 00:20:14,990 1000 timer? 422 00:20:14,990 --> 00:20:17,150 Ingen vidste det. 423 00:20:17,150 --> 00:20:20,220 >> SPEAKER 1: The Patriot batteri stationeret på kasernen på Dhahran 424 00:20:20,220 --> 00:20:24,660 og dets mangelfulde interne ur havde været på mere end 100 timer på natten 425 00:20:24,660 --> 00:20:27,470 25. februar. 426 00:20:27,470 --> 00:20:31,770 >> JACK GANSSLE: Det spores tid til en nøjagtighed på omkring en tiendedel af et sekund. 427 00:20:31,770 --> 00:20:34,480 Nu, en tiendedel af et sekund er en interessant nummer, fordi det ikke kan være 428 00:20:34,480 --> 00:20:39,940 udtrykt i binær nøjagtigt, hvilket betyder det ikke kan udtrykkes nøjagtigt 429 00:20:39,940 --> 00:20:42,500 enhver moderne digital computer. 430 00:20:42,500 --> 00:20:46,920 Det er svært at tro, men bruge dette som et eksempel. 431 00:20:46,920 --> 00:20:49,000 Lad os tage nummer en tredjedel. 432 00:20:49,000 --> 00:20:53,150 En tredjedel kan ikke udtrykkes i decimal nøjagtigt. 433 00:20:53,150 --> 00:20:57,500 En tredjedel er 0,333 går på til uendeligt. 434 00:20:57,500 --> 00:21:02,270 Der er ingen måde at gøre det med absolutte nøjagtighed i decimal. 435 00:21:02,270 --> 00:21:05,370 Det er præcis den samme slags problemer der skete i Patriot. 436 00:21:05,370 --> 00:21:09,880 Jo længere systemet kørte den værst tiden fejlen blev. 437 00:21:09,880 --> 00:21:13,840 >> SPEAKER 1: Efter 100 timers drift, fejlen i tid var kun 438 00:21:13,840 --> 00:21:16,140 omkring en tredjedel af et sekund. 439 00:21:16,140 --> 00:21:20,800 Men med hensyn til målretning et missil rejser på mach fem, det resulterede i 440 00:21:20,800 --> 00:21:24,410 en tracking error på over 600 meter. 441 00:21:24,410 --> 00:21:27,670 Det ville være en fatal fejl for soldaterne ved Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> THEODORE POSTOL: Hvad skete der er en Scud lancering blev opdaget i begyndelsen af 443 00:21:33,450 --> 00:21:34,280 advarsels-satellitter. 444 00:21:34,280 --> 00:21:38,550 Og de vidste, at Scud kom i deres generelle retning. 445 00:21:38,550 --> 00:21:41,000 De vidste ikke, hvor det kommer. 446 00:21:41,000 --> 00:21:43,900 >> SPEAKER 1: Det var nu op til radaren komponent af Patriot-systemet 447 00:21:43,900 --> 00:21:48,910 forsvare Dhahran at lokalisere og holde styr på de indkommende fjendtlige missil. 448 00:21:48,910 --> 00:21:50,580 >> JACK GANSSLE: Radaren var meget smart. 449 00:21:50,580 --> 00:21:53,770 Det ville faktisk spore positionen af Scud og derefter forudsige, hvor det 450 00:21:53,770 --> 00:21:57,160 sandsynligvis ville være den næste gang radaren sendte en puls ud. 451 00:21:57,160 --> 00:21:58,870 Der blev kaldt intervallet gate. 452 00:21:58,870 --> 00:22:04,020 >> THEODORE POSTOL: Så når Patriot beslutter er gået tid nok til at gå 453 00:22:04,020 --> 00:22:09,420 tilbage og tjekke det næste sted for dette opdagede objekt, det går tilbage. 454 00:22:09,420 --> 00:22:14,450 Så når det gik tilbage til den forkerte sted, er det så ikke ser nogen objekt. 455 00:22:14,450 --> 00:22:18,200 Og det beslutter, at der ikke var nogen genstand, det var en falsk afsløring og 456 00:22:18,200 --> 00:22:19,680 dråber sporet. 457 00:22:19,680 --> 00:22:22,970 >> SPEAKER 1: Det kommende Scud forsvandt fra radar skærmen, og 458 00:22:22,970 --> 00:22:26,050 sekunder senere smækkede ind i kasernen. 459 00:22:26,050 --> 00:22:31,950 Den Scud dræbte 28 og var den sidste fyret under den første Golfkrig. 460 00:22:31,950 --> 00:22:37,700 Tragisk, den opdaterede software ankom ved Dhahran den følgende dag. 461 00:22:37,700 --> 00:22:41,800 Den software fejl var blevet fastsat, lukke et kapitel i den urolige 462 00:22:41,800 --> 00:22:43,690 historie Patriot missil. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot er faktisk et akronym for Trinvis Array SPORING 465 00:22:50,710 --> 00:22:51,960 Skæring Target. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J MALAN: Okay, så en ædru eksempel, for at være sikker. 468 00:23:00,840 --> 00:23:03,430 Og heldigvis er disse lavere niveau bugs er ikke noget, vi vil 469 00:23:03,430 --> 00:23:06,220 typisk at værdsætte, bestemt ikke med nogle af vores 470 00:23:06,220 --> 00:23:07,360 tidligste af programmerne. 471 00:23:07,360 --> 00:23:10,450 Snarere, de fleste af de fejl vil du møde vil være logisk i naturen, 472 00:23:10,450 --> 00:23:12,900 syntaktisk i naturen, hvorved kode fungerer bare ikke rigtigt. 473 00:23:12,900 --> 00:23:14,140 Og du ved det temmelig hurtigt. 474 00:23:14,140 --> 00:23:16,850 >> Men især når vi kommer til slutningen af ​​semestret, det kommer til at 475 00:23:16,850 --> 00:23:20,620 bliver mere og mere af en mulighed for at virkelig tænke hårdt om design 476 00:23:20,620 --> 00:23:22,960 af dine programmer og de underliggende repræsentation 477 00:23:22,960 --> 00:23:24,520 der også, af data. 478 00:23:24,520 --> 00:23:28,010 For eksempel, vil vi introducere MySQL, som er et populært database motor 479 00:23:28,010 --> 00:23:30,850 som du kan bruge med hjemmesider til gemme data på bagenden. 480 00:23:30,850 --> 00:23:34,630 Og du bliver nødt til at begynde at afgøre, på slutningen af ​​semestret ikke kun, hvad 481 00:23:34,630 --> 00:23:38,790 typer af data langs disse linjer at bruge men præcis hvor mange bits til at bruge, 482 00:23:38,790 --> 00:23:42,740 hvorvidt du ønsker at gemme datoer som datoer og tidspunkter som tider, og også 483 00:23:42,740 --> 00:23:46,890 ting som hvor stor vil du have entydige id'er til at være for, siger, brugerne 484 00:23:46,890 --> 00:23:47,680 i din database. 485 00:23:47,680 --> 00:23:51,210 >> Faktisk haft, hvis nogle af jer har Facebook tegner sig for temmelig lang tid, 486 00:23:51,210 --> 00:23:53,680 og du ved, hvordan du får adgang til til din bruger-id - 487 00:23:53,680 --> 00:23:57,930 som undertiden dukker op i din profil URL, medmindre du har valgt en 488 00:23:57,930 --> 00:24:02,070 kaldenavn for den webadresse, eller hvis du har brugte Facebooks Graph API, den 489 00:24:02,070 --> 00:24:05,510 offentligt tilgængelig API, som du kan bede Facebook for rådata - 490 00:24:05,510 --> 00:24:07,580 kan du se, hvad din numerisk id er. 491 00:24:07,580 --> 00:24:10,880 Og for nogle år siden, Facebook væsentlige måttet ændre fra at bruge 492 00:24:10,880 --> 00:24:15,980 svarer til int'er at bruge lang lang, fordi over tid som brugere kommer 493 00:24:15,980 --> 00:24:19,780 og gå og skabe masser af konti, og falske konti, selv de meget let 494 00:24:19,780 --> 00:24:24,630 var i stand til at udtømme noget som en 4 milliarder mulig værdi som en int. 495 00:24:24,630 --> 00:24:28,340 >> Så mere på den slags spørgsmål ned ad vejen,. samt 496 00:24:28,340 --> 00:24:30,750 Okay, så det var casting. 497 00:24:30,750 --> 00:24:31,670 Det var upræcist. 498 00:24:31,670 --> 00:24:32,730 Et par hurtige meddelelser. 499 00:24:32,730 --> 00:24:35,710 Så sektioner formelt begynder denne kommende Søndag, mandag, tirsdag. 500 00:24:35,710 --> 00:24:39,080 Du vil høre via e-mail senere i denne uge at din afdeling opgave. 501 00:24:39,080 --> 00:24:42,570 Og du vil også her på det punkt, hvor at ændre din afdeling, hvis din 502 00:24:42,570 --> 00:24:45,660 tidsplan er nu ændret eller din komfort niveau er nu ændret. 503 00:24:45,660 --> 00:24:49,380 Imens P-set én og hacker man er grund denne torsdag med mulighed for at 504 00:24:49,380 --> 00:24:52,450 forlænge fristen pr specifikationer til fredag 505 00:24:52,450 --> 00:24:53,830 i en typisk måde. 506 00:24:53,830 --> 00:24:57,500 >> Indse, at følger med problemet sæt specifikationer er instruktioner om 507 00:24:57,500 --> 00:25:02,770 hvordan man bruger CS50 apparat, gør, samt nogle CS50 konkrete værktøjer 508 00:25:02,770 --> 00:25:06,540 agtig stil 50, der kan give dig feedback dynamisk på 509 00:25:06,540 --> 00:25:10,230 kvaliteten af ​​din kode stil og også tjek 50, der kan give dig 510 00:25:10,230 --> 00:25:13,160 dynamisk feedback på din kodens korrekthed. 511 00:25:13,160 --> 00:25:16,850 Tilgiv, at vi stadig strygning ud et par kinks med checken 50 år. 512 00:25:16,850 --> 00:25:21,490 Et par af dine klassekammerater, der gjorde begynde omkring 04:00 fredag ​​aften, når 513 00:25:21,490 --> 00:25:25,130 spec gik op have bemærket siden et par bugs, som vi arbejder 514 00:25:25,130 --> 00:25:29,010 igennem, og undskyldninger for alle, der har oplevet uberettigede frustrationer. 515 00:25:29,010 --> 00:25:30,340 Fejlen er min. 516 00:25:30,340 --> 00:25:34,080 Men vi vil følge op på CS50 diskutere, hvornår der er løst. 517 00:25:34,080 --> 00:25:35,700 >> Så et ord på scoringer selv. 518 00:25:35,700 --> 00:25:38,990 Så det vil være en uge eller to, før du begynder at få feedback på problemet sæt 519 00:25:38,990 --> 00:25:40,640 fordi du endnu ikke har en undervisning fyr. 520 00:25:40,640 --> 00:25:44,510 Og selv da, vil vi begynde at evaluere C problemet sæt, før vi 521 00:25:44,510 --> 00:25:46,970 gå tilbage og evaluere bunden så at du får mere relevant 522 00:25:46,970 --> 00:25:48,150 tilbagemeldinger hurtigere. 523 00:25:48,150 --> 00:25:51,870 Men generelt per pensum, CS50 problem sæt evalueres langs 524 00:25:51,870 --> 00:25:53,580 efter fire akser - 525 00:25:53,580 --> 00:25:55,760 rækkevidde, korrekthed, design og stil. 526 00:25:55,760 --> 00:25:59,210 >> Scope vil være en række typisk mellem nul og fem, 527 00:25:59,210 --> 00:26:01,830 indfanger hvor meget af stykke, som du smule. 528 00:26:01,830 --> 00:26:03,750 Typisk, vil du have dette at være fem. 529 00:26:03,750 --> 00:26:05,300 Du i det mindste prøvet alt. 530 00:26:05,300 --> 00:26:09,330 Og mærke det er en multiplikativ faktor således at gøre kun en del af 531 00:26:09,330 --> 00:26:12,520 Problemet sæt er ikke den bedste strategi. 532 00:26:12,520 --> 00:26:15,610 >> I mellemtiden mere indlysende er det vigtigheden af ​​korrekthed - 533 00:26:15,610 --> 00:26:18,620 bare dit program korrekt med respekt til specifikationen? 534 00:26:18,620 --> 00:26:21,510 Det vægtes bevidst mere hårdere end de to andre akser ved en 535 00:26:21,510 --> 00:26:24,450 faktor tre, fordi vi anerkender der typisk du kommer til at tilbringe en 536 00:26:24,450 --> 00:26:28,600 meget mere tid jagter ned nogle bugs, få din kode for at arbejde, så er du 537 00:26:28,600 --> 00:26:31,540 er indrykke den og vælge passende variable navne og 538 00:26:31,540 --> 00:26:33,800 gerne, der er på den anden ende af spektret af stil. 539 00:26:33,800 --> 00:26:36,160 >> Det er ikke til at sige stil er ikke vigtigt, og vi vil prædike det over 540 00:26:36,160 --> 00:26:37,920 gang både i foredrag og i sektioner. 541 00:26:37,920 --> 00:26:40,520 Stil refererer til æstetik af din kode. 542 00:26:40,520 --> 00:26:43,980 Har du valgt vel-navngivne variabler der er korte, men noget 543 00:26:43,980 --> 00:26:44,680 beskrivende? 544 00:26:44,680 --> 00:26:47,840 Er din kode indrykket som du har set i foredrag og på en måde, 545 00:26:47,840 --> 00:26:49,070 med stil 50? 546 00:26:49,070 --> 00:26:51,220 >> Endelig er designet til højre der i midten. 547 00:26:51,220 --> 00:26:54,090 Design er jo sværere en til at sætte en finger på, fordi det er meget mere 548 00:26:54,090 --> 00:26:55,000 subjektive. 549 00:26:55,000 --> 00:26:58,610 Men det er måske den vigtigste af De tre akser i form af pædagogisk 550 00:26:58,610 --> 00:27:02,050 værdi over tid, og at dette vil være undervisningen stipendiatens mulighed for at 551 00:27:02,050 --> 00:27:04,110 give dig kvalitativ feedback. 552 00:27:04,110 --> 00:27:08,100 Ja, i CS50 selvom vi har disse formler og scoringer, som ultimo 553 00:27:08,100 --> 00:27:11,350 af dagen disse er meget bevidst meget små spande - kommaværdier 554 00:27:11,350 --> 00:27:13,460 mellem nul og tre og nul og fem. 555 00:27:13,460 --> 00:27:17,800 Vi forsøger ikke at trække meget grove linjer mellem problem sæt eller mellem 556 00:27:17,800 --> 00:27:21,490 studerende, men snarere fokusere så meget som Vi kan på kvalitative, hånden 557 00:27:21,490 --> 00:27:25,490 feedback, enten maskinskrevet eller verbale fra netop din undervisning fyr, 558 00:27:25,490 --> 00:27:27,050 du får at vide ganske godt. 559 00:27:27,050 --> 00:27:32,340 >> Men i almindelighed er dem vægtene at de forskellige akser skal have. 560 00:27:32,340 --> 00:27:35,480 I mellemtiden også, det er værd at holde i imod, at man ikke bør antage, at en 561 00:27:35,480 --> 00:27:38,870 tre ud af fem er en 60% og derfor groft svigter. 562 00:27:38,870 --> 00:27:41,410 Tre er bevidst menes at være slags midten af ​​vejen godt. 563 00:27:41,410 --> 00:27:43,480 Hvis du får treere på semesterstart, det er 564 00:27:43,480 --> 00:27:46,340 faktisk beregnet til at være en god sted at begynde. 565 00:27:46,340 --> 00:27:50,510 Hvis du får toere, messer, er der absolut noget arbejde til at betale lidt 566 00:27:50,510 --> 00:27:53,250 mere opmærksomhed, for at drage fordel afsnit og kontortid. 567 00:27:53,250 --> 00:27:54,590 >> Hvis du får fours og femmere, store. 568 00:27:54,590 --> 00:27:57,430 Men virkelig, vi håber at se baner blandt de studerende - meget 569 00:27:57,430 --> 00:28:00,575 individualiseret per elev, men starter semestret her slags 570 00:28:00,575 --> 00:28:04,100 de to til tre rækkevidde, men slutter heroppe i de fire til fem rækkevidde. 571 00:28:04,100 --> 00:28:05,440 Det er, hvad vi virkelig søger. 572 00:28:05,440 --> 00:28:09,590 Og vi huske deltaet, som du udviser mellem uge nul og uge 573 00:28:09,590 --> 00:28:12,170 12, når jeg laver kvaliteter. 574 00:28:12,170 --> 00:28:16,380 Det betyder ikke noget for os helt hvordan du retfærdigt i starten, hvis din 575 00:28:16,380 --> 00:28:19,330 bane er faktisk opad og stærk. 576 00:28:19,330 --> 00:28:24,000 >> Akademisk ærlighed - så lad mig sætte på min mere alvorlig stemme for bare et øjeblik. 577 00:28:24,000 --> 00:28:28,510 Så dette kursus har sondringen for sende flere studerende end nogen anden 578 00:28:28,510 --> 00:28:30,950 i historien til annoncen bord, tror jeg. 579 00:28:30,950 --> 00:28:34,220 Vi har slags mistet optælling på dette punkt, hvor ofte dette sker. 580 00:28:34,220 --> 00:28:37,090 Og det er ikke fordi de studerende i 50 er mere uærlig end deres 581 00:28:37,090 --> 00:28:38,690 klassekammerater andetsteds. 582 00:28:38,690 --> 00:28:42,800 Men indser også, at vi er meget gode til at opdage den slags ting. 583 00:28:42,800 --> 00:28:45,920 >> Og det er den fordel, at en datalogi klasse har i, at vi 584 00:28:45,920 --> 00:28:49,110 kan, og vi sammenligne alle elever Problemet sætter parvise imod enhver 585 00:28:49,110 --> 00:28:51,470 anden, ikke kun i år men alle tidligere år. 586 00:28:51,470 --> 00:28:55,080 Vi har evnen, ligesom studerende i klassen, Google og finde koden 587 00:28:55,080 --> 00:28:57,440 på websteder som github og diskussionsfora. 588 00:28:57,440 --> 00:29:00,840 Der er absolut løsninger på CS50 s p-sæt flyder rundt der. 589 00:29:00,840 --> 00:29:02,710 Men hvis du kan finde dem, vi kan finde dem. 590 00:29:02,710 --> 00:29:07,130 Og alt dette er meget automatiseret og nemt og trist for os at finde. 591 00:29:07,130 --> 00:29:10,990 >> Men jeg vil gerne understrege, også, at de Uddannelsens faglige ærlighed politik 592 00:29:10,990 --> 00:29:13,960 meget betød at være meget det modsatte af denne ånd. 593 00:29:13,960 --> 00:29:17,506 Faktisk dette år har vi omformuleret tingene i pensum at være denne, dot 594 00:29:17,506 --> 00:29:19,790 dot dot med flere detaljer i pensum. 595 00:29:19,790 --> 00:29:22,860 Men det overordnede tema i kurset er virkelig at være rimelig. 596 00:29:22,860 --> 00:29:26,160 Vi anerkender, at der er en betydelig mængde af pædagogisk 597 00:29:26,160 --> 00:29:30,550 værdi i samarbejdende, til en vis grad, med klassekammerater, hvor du 598 00:29:30,550 --> 00:29:33,700 to eller du tre eller du flere er stående på et hvidt bord 599 00:29:33,700 --> 00:29:35,670 whiteboarding, så at tale, dine ideer - 600 00:29:35,670 --> 00:29:39,480 at skrive pseudokode i billeder, diagrammering hvad skal Mario være, hvis 601 00:29:39,480 --> 00:29:41,350 du skulle skrive det første i pseudokode. 602 00:29:41,350 --> 00:29:43,240 Hvad skal grådige algoritme - 603 00:29:43,240 --> 00:29:46,100 hvordan skal den opfører per Problemet sætter en? 604 00:29:46,100 --> 00:29:50,440 >> Og så indse, at adfærden at vi tilskynder er meget 605 00:29:50,440 --> 00:29:51,470 meget langs disse linjer. 606 00:29:51,470 --> 00:29:53,890 Og i pensum, vil du se en hel masse kugler under en 607 00:29:53,890 --> 00:29:57,740 rimelig kategori og en ikke rimeligt kategori, der hjælper os med at hjælpe 608 00:29:57,740 --> 00:30:00,740 du pakke dit sind omkring hvor vi trækker denne linje. 609 00:30:00,740 --> 00:30:04,340 Og generelt, en anstændig tommelfingerregel er, at hvis du kæmper for at løse 610 00:30:04,340 --> 00:30:07,990 nogle fejl og din ven eller klassekammerat sidder ved siden af ​​dig, det er 611 00:30:07,990 --> 00:30:11,530 rimeligt for dig at vise ham eller hende din kode og sige, hey, kan du hjælpe 612 00:30:11,530 --> 00:30:13,700 mig regne ud, hvad der går galt her? 613 00:30:13,700 --> 00:30:17,110 >> Vi typisk ikke omfavne den modsatte side. 614 00:30:17,110 --> 00:30:20,730 Det er ikke et korrekt svar til din ven eller klassekammerat her for at sige, åh, 615 00:30:20,730 --> 00:30:22,510 bare se på mine og tal det ud fra det. 616 00:30:22,510 --> 00:30:24,400 Det er slags urimeligt. 617 00:30:24,400 --> 00:30:27,750 Men efter at have en anden, en anden hjerne, et andet par øjne ser på 618 00:30:27,750 --> 00:30:31,620 skærmen, eller se på din kode og sige, er du sikker på du vil 619 00:30:31,620 --> 00:30:32,760 at have en løkke her? 620 00:30:32,760 --> 00:30:34,800 Eller er du sikker på du vil at semikolon her? 621 00:30:34,800 --> 00:30:37,090 Eller åh, det fejlmeddelelsen betyder dette. 622 00:30:37,090 --> 00:30:39,580 De er meget rimelige og opmuntret adfærd. 623 00:30:39,580 --> 00:30:44,010 >> De sager, som jeg hentydede til tidligere koges ned til, når eleverne er 624 00:30:44,010 --> 00:30:47,350 sent på aftenen gør dårlig dømmekraft beslutninger og emailing deres kode til 625 00:30:47,350 --> 00:30:50,130 en anden eller bare at sige, her, det er i Dropbox eller 626 00:30:50,130 --> 00:30:51,610 Googling sent om natten. 627 00:30:51,610 --> 00:30:54,880 Og så vil jeg opmuntre og beder dig, hvis du har dem uundgåelige 628 00:30:54,880 --> 00:30:58,450 øjeblikke af stress, du ramlede mod deadline, har du ingen sent 629 00:30:58,450 --> 00:31:01,490 dag, da det er allerede fredag ​​på det punkt, email kursets hoveder eller 630 00:31:01,490 --> 00:31:02,330 selv direkte. 631 00:31:02,330 --> 00:31:04,790 Sig, lytte, jeg er på min bristepunktet her. 632 00:31:04,790 --> 00:31:06,660 Lad os få en samtale og regne det ud. 633 00:31:06,660 --> 00:31:10,400 Ty til internettet eller en anden ikke rimelig adfærd er aldrig 634 00:31:10,400 --> 00:31:13,070 løsning, og alt for mange af dine klassekammerater er ikke længere her på 635 00:31:13,070 --> 00:31:15,150 campus på grund af, at dårlig dømmekraft. 636 00:31:15,150 --> 00:31:17,840 Men det er meget nemt at nederdel denne linje. 637 00:31:17,840 --> 00:31:22,950 >> Og her er et lille billede til at juble dig fra Reddit så der nu 638 00:31:22,950 --> 00:31:25,720 alt vil være OK. 639 00:31:25,720 --> 00:31:30,210 >> Så en hurtig resumé, så af, hvor vi slap. 640 00:31:30,210 --> 00:31:33,690 Så i sidste uge, minde om, at vi indfører betingelser, ikke i Scratch 641 00:31:33,690 --> 00:31:34,880 men i C denne gang. 642 00:31:34,880 --> 00:31:38,300 Og der var nogle nye syntaks, men virkelig ingen nye ideer selv. 643 00:31:38,300 --> 00:31:42,630 Vi havde boolske udtryk, vi kunne eller sammen med to lodrette 644 00:31:42,630 --> 00:31:46,490 barer eller og sammen med to ampersands, siger, at både venstre 645 00:31:46,490 --> 00:31:49,990 og retten skal være sandt for at dette kan udføre. 646 00:31:49,990 --> 00:31:53,150 Derefter havde vi switches, som vi kiggede ved kortvarigt, men jeg foreslår, er virkelig 647 00:31:53,150 --> 00:31:56,830 bare forskellige syntaks for at nå samme slags mål, hvis du kender i 648 00:31:56,830 --> 00:31:59,270 forhånd, hvad dine sager vil være. 649 00:31:59,270 --> 00:32:00,160 >> Vi kiggede på sløjfer. 650 00:32:00,160 --> 00:32:03,340 En for-løkke er måske den mest almindelige, eller i det mindste den ene, at folk 651 00:32:03,340 --> 00:32:05,330 typisk nå til instinktivt. 652 00:32:05,330 --> 00:32:08,240 Selvom det ser lidt kryptisk, du vil se mange, mange eksempler på denne 653 00:32:08,240 --> 00:32:11,590 inden længe, ​​som du har allerede i slutningen af ​​sidste uge. 654 00:32:11,590 --> 00:32:14,280 Mens sløjfer kan ligeledes opnå det samme. 655 00:32:14,280 --> 00:32:17,550 Men hvis du ønsker at gøre nogen optælling eller ajourføring af 656 00:32:17,550 --> 00:32:20,230 variable værdier, er du nødt til gøre det mere manuelt end 657 00:32:20,230 --> 00:32:22,440 for loop før tillader. 658 00:32:22,440 --> 00:32:25,310 Og så er der den do-while løkke, som giver os mulighed for at gøre noget ved 659 00:32:25,310 --> 00:32:28,460 mindst én gang, mens noget ellers er sandt. 660 00:32:28,460 --> 00:32:31,550 Og det er især god til programmer eller til spil, hvor du ønsker 661 00:32:31,550 --> 00:32:33,810 til at bede brugeren for noget mindst én gang. 662 00:32:33,810 --> 00:32:37,110 Og så, hvis han eller hun ikke samarbejder, du måske ønsker at gøre det 663 00:32:37,110 --> 00:32:38,420 igen og igen. 664 00:32:38,420 --> 00:32:41,270 >> Med variable, i mellemtiden havde vi linjer kode som dette, der kunne 665 00:32:41,270 --> 00:32:41,950 være to linjer. 666 00:32:41,950 --> 00:32:44,830 Du kunne erklære en kaldet int tæller, semikolon. 667 00:32:44,830 --> 00:32:47,660 Eller du kan bare erklære og definere det, så at sige. 668 00:32:47,660 --> 00:32:49,950 Give det en værdi på samme tid. 669 00:32:49,950 --> 00:32:51,890 >> Og så endelig, talte vi om funktioner. 670 00:32:51,890 --> 00:32:54,270 Og dette var en nice eksempel på den forstand, at det illustrerer 671 00:32:54,270 --> 00:32:55,840 to typer funktioner. 672 00:32:55,840 --> 00:32:59,030 Ene er getString (), som igen får en streng fra brugeren. 673 00:32:59,030 --> 00:33:02,040 Men getString () er lidt interessant, så vidt vi har brugt det, 674 00:33:02,040 --> 00:33:05,620 fordi vi altid har brugt det med noget på venstre side af en 675 00:33:05,620 --> 00:33:06,600 lighedstegn. 676 00:33:06,600 --> 00:33:09,830 Det vil sige, at getString () returnerer en værdi. 677 00:33:09,830 --> 00:33:11,970 Den returnerer naturligvis en streng. 678 00:33:11,970 --> 00:33:15,130 Og derefter på den venstre side, er vi simpelthen gemme denne streng inde i en 679 00:33:15,130 --> 00:33:16,580 variabel kaldet navn. 680 00:33:16,580 --> 00:33:21,100 >> Det er anderledes, i en vis forstand, fra printf fordi printf, mindst i vores 681 00:33:21,100 --> 00:33:23,540 forbrug her ikke vender tilbage noget. 682 00:33:23,540 --> 00:33:24,960 Som en sidebemærkning, betyder det tilbagevenden noget. 683 00:33:24,960 --> 00:33:26,380 Vi bare ligeglad, hvad det er. 684 00:33:26,380 --> 00:33:29,090 Men det har, hvad der er kaldes en bivirkning. 685 00:33:29,090 --> 00:33:31,840 Og hvad er det bivirkning i alle tilfælde, vi har set hidtil? 686 00:33:31,840 --> 00:33:34,720 Hvad betyder printf gøre? 687 00:33:34,720 --> 00:33:37,780 Den udskriver noget til skærmen, displays tekst eller tal eller noget 688 00:33:37,780 --> 00:33:38,380 på skærmen. 689 00:33:38,380 --> 00:33:41,170 Og det er bare betragtes som en bivirkning fordi det ikke er rigtig at uddele 690 00:33:41,170 --> 00:33:41,900 det tilbage til mig. 691 00:33:41,900 --> 00:33:44,770 Det er ikke et svar inde i en sort boks, som jeg derefter kan 692 00:33:44,770 --> 00:33:46,130 nå ind og få fat. 693 00:33:46,130 --> 00:33:49,160 Det er bare at gøre det på sin egen, meget ligesom Colton var tilsluttet dette 694 00:33:49,160 --> 00:33:52,560 black box i sidste uge, og han eller anden måde magisk var trække på tavlen 695 00:33:52,560 --> 00:33:54,500 uden mig faktisk involveret. 696 00:33:54,500 --> 00:33:55,560 Det ville være en bivirkning. 697 00:33:55,560 --> 00:33:59,100 Men hvis jeg havde faktisk at nå tilbage i her og sige, åh, her er strengen 698 00:33:59,100 --> 00:34:02,040 fra brugeren, ville det være en tilbagevenden værdi. 699 00:34:02,040 --> 00:34:05,650 >> Og hidtil har vi kun anvendte funktioner at andre mennesker har skrevet. 700 00:34:05,650 --> 00:34:09,219 Men vi kan faktisk gøre disse slags ting selv. 701 00:34:09,219 --> 00:34:12,730 Så jeg har tænkt mig at gå ind i CS50 apparat igen. 702 00:34:12,730 --> 00:34:16,020 Lad mig slutte den fane, vi havde åbne for et øjeblik siden. 703 00:34:16,020 --> 00:34:18,530 Og lad mig gå videre og oprette en ny fil. 704 00:34:18,530 --> 00:34:22,400 Og jeg har tænkt mig at gå videre og kalder dette ene positive.c. 705 00:34:22,400 --> 00:34:24,770 Så jeg ønsker at gøre noget med positive tal her. 706 00:34:24,770 --> 00:34:27,219 Så jeg har tænkt mig at gå videre og gøre int - 707 00:34:27,219 --> 00:34:28,000 sorry - 708 00:34:28,000 --> 00:34:31,840 # Include. 709 00:34:31,840 --> 00:34:34,280 Lad os ikke gøre det samme fejl som før. 710 00:34:34,280 --> 00:34:40,020 Int main (void), åben curly klampe, lukket klammeparentes. 711 00:34:40,020 --> 00:34:41,639 >> Og nu vil jeg gøre følgende. 712 00:34:41,639 --> 00:34:44,600 Jeg vil skrive et program, der insisterer på, at brugeren giver 713 00:34:44,600 --> 00:34:46,770 mig et positivt heltal. 714 00:34:46,770 --> 00:34:50,969 Så der er ingen GetPositiveInt funktion i CS50 biblioteket. 715 00:34:50,969 --> 00:34:52,610 Der er kun GetInt (). 716 00:34:52,610 --> 00:34:55,790 Men det er OK, fordi jeg har den konstruktioner, som jeg kan pålægge en 717 00:34:55,790 --> 00:34:59,360 lidt mere pres på denne værdi. 718 00:34:59,360 --> 00:35:00,990 Jeg kunne gøre noget som dette. 719 00:35:00,990 --> 00:35:02,780 >> Så int n - 720 00:35:02,780 --> 00:35:04,920 og hvis du skriver sammen, bare indse Jeg har tænkt mig at gå tilbage og 721 00:35:04,920 --> 00:35:06,430 ændre nogle ting i et øjeblik - 722 00:35:06,430 --> 00:35:09,960 så int n lig GetInt (). 723 00:35:09,960 --> 00:35:11,780 Og det kommer til at sætte en int indersiden af ​​n.. 724 00:35:11,780 --> 00:35:13,830 Og lad mig være en mere beskrivende. 725 00:35:13,830 --> 00:35:23,270 Lad mig sige noget som jeg forlanger, at du give mig et positivt heltal. 726 00:35:23,270 --> 00:35:23,550 >> Ok. 727 00:35:23,550 --> 00:35:25,250 Så bare en lille smule af instruktioner. 728 00:35:25,250 --> 00:35:26,270 Og nu, hvad kan jeg gøre? 729 00:35:26,270 --> 00:35:29,840 Nå, jeg allerede kender fra min simple betingelser eller filialer, ligesom jeg 730 00:35:29,840 --> 00:35:36,100 havde i Scratch, kunne jeg sige noget gerne, hvis n er mindre end eller lig med 731 00:35:36,100 --> 00:35:44,460 nul, så jeg ønsker at gøre noget gerne, det er ikke positivt. 732 00:35:44,460 --> 00:35:45,560 Og så kunne jeg gøre - 733 00:35:45,560 --> 00:35:47,310 OK, men jeg virkelig ønsker at få det int. 734 00:35:47,310 --> 00:35:52,020 Så jeg kunne gå op her, og jeg kunne slags af eksemplar dette og led dette. 735 00:35:52,020 --> 00:35:52,570 Og så, OK. 736 00:35:52,570 --> 00:35:56,990 Så hvis n er mindre end eller lig med nul gøre dette. 737 00:35:56,990 --> 00:35:58,900 >> Hvad nu, hvis brugeren ikke samarbejder? 738 00:35:58,900 --> 00:36:01,560 Nå, så jeg har tænkt mig at låne dette her. 739 00:36:01,560 --> 00:36:03,130 Og så går jeg ind her og her og her. 740 00:36:03,130 --> 00:36:06,420 Så dette er tydeligvis ikke løsningen, right? 741 00:36:06,420 --> 00:36:07,810 Fordi der er ingen ende i sigte. 742 00:36:07,810 --> 00:36:13,100 Hvis jeg ønsker at kræve, at brugeren giver mig et positivt heltal, kan jeg 743 00:36:13,100 --> 00:36:14,150 faktisk få int. 744 00:36:14,150 --> 00:36:15,620 Jeg kan så kontrollere, om denne int. 745 00:36:15,620 --> 00:36:18,570 Men så vil jeg tjekke det igen og tjekke det igen og tjekke det igen. 746 00:36:18,570 --> 00:36:21,680 Så selvfølgelig, hvad er bedre konstruere at være ved hjælp her? 747 00:36:21,680 --> 00:36:22,840 Okay, så en form for løkke. 748 00:36:22,840 --> 00:36:25,430 >> Så jeg har tænkt mig at slippe næsten alt dette. 749 00:36:25,430 --> 00:36:27,320 Og jeg ønsker at få denne int mindst én gang. 750 00:36:27,320 --> 00:36:28,890 Så jeg har tænkt mig at sige gøre - 751 00:36:28,890 --> 00:36:32,110 og jeg vil vende tilbage til mens der i bare et øjeblik - 752 00:36:32,110 --> 00:36:33,050 nu, gør hvad? 753 00:36:33,050 --> 00:36:35,860 Jeg har tænkt mig at gøre int n får GetInt (). 754 00:36:35,860 --> 00:36:36,080 OK. 755 00:36:36,080 --> 00:36:37,250 Så det er temmelig godt. 756 00:36:37,250 --> 00:36:39,750 Og nu, hvor ofte gør Jeg ønsker at gøre dette? 757 00:36:39,750 --> 00:36:45,770 >> Lad mig sætte printf indersiden af ​​løkken så jeg kan forlange igen og igen, 758 00:36:45,770 --> 00:36:46,740 hvis nødvendigt. 759 00:36:46,740 --> 00:36:49,720 Og hvad vil jeg det mens betingelse for at gøre? 760 00:36:49,720 --> 00:36:53,870 Jeg ønsker at holde gør dette mens det er tilfældet? 761 00:36:53,870 --> 00:36:54,125 Ja. 762 00:36:54,125 --> 00:36:55,390 N er mindre end eller lig med nul. 763 00:36:55,390 --> 00:36:58,180 Så allerede vi har betydeligt rengøres denne kode op. 764 00:36:58,180 --> 00:37:00,700 Vi har lånt en meget enkel konstruktion - gør-while-løkke. 765 00:37:00,700 --> 00:37:04,690 Jeg har stjålet bare de vigtige linjer kode, at jeg begyndte at kopiere og 766 00:37:04,690 --> 00:37:05,960 indsætning, som ikke var klogt. 767 00:37:05,960 --> 00:37:09,790 Og så nu vil jeg faktisk indsætte det her og bare gøre det én gang. 768 00:37:09,790 --> 00:37:12,990 >> Og nu, hvad ønsker jeg at gøre på slutningen af ​​dette program? 769 00:37:12,990 --> 00:37:16,810 Jeg vil bare sige noget simpelt gerne, tak for - og 770 00:37:16,810 --> 00:37:18,980 Jeg vil gøre% i for int - 771 00:37:18,980 --> 00:37:23,270 backslash n, komma og derefter plug in n, semikolon. 772 00:37:23,270 --> 00:37:23,910 >> Ok. 773 00:37:23,910 --> 00:37:27,290 Så lad os se, hvad der sker nu når jeg køre dette program. 774 00:37:27,290 --> 00:37:30,600 Jeg har tænkt mig at gå videre og gør positiv. 775 00:37:30,600 --> 00:37:30,880 Damn. 776 00:37:30,880 --> 00:37:31,600 Et par fejl. 777 00:37:31,600 --> 00:37:32,960 Så lad mig rulle tilbage op til den første. 778 00:37:32,960 --> 00:37:34,020 Må ikke arbejde gennem dem baglæns. 779 00:37:34,020 --> 00:37:37,000 Arbejde gennem dem fra toppen og ned at de ikke kaskade, og kun 780 00:37:37,000 --> 00:37:38,630 én ting være forkert. 781 00:37:38,630 --> 00:37:42,532 Implicit erklæring funktion GetInt (). 782 00:37:42,532 --> 00:37:43,020 Ja. 783 00:37:43,020 --> 00:37:44,420 Så det var ikke nok. 784 00:37:44,420 --> 00:37:46,760 Jeg slags lavet den samme fejl, men lidt anderledes denne gang. 785 00:37:46,760 --> 00:37:51,940 Jeg skal ikke kun omfatte stdio.h men også cs50.h, som omfatter 786 00:37:51,940 --> 00:37:56,770 såkaldte erklæringer om at få int, hvilket undervise apparatet eller lærer 787 00:37:56,770 --> 00:37:58,760 C hvad GetInt () er. 788 00:37:58,760 --> 00:37:59,550 >> Så lad mig gemme!. 789 00:37:59,550 --> 00:38:02,040 Jeg har tænkt mig at ignorere de andre fejl fordi jeg har tænkt mig at håbe, at de er 790 00:38:02,040 --> 00:38:05,210 anden måde relateret til fejlen Jeg har allerede fast. 791 00:38:05,210 --> 00:38:08,710 Så lad mig gå videre og kompilere med make positive, Enter. 792 00:38:08,710 --> 00:38:09,020 Damn. 793 00:38:09,020 --> 00:38:09,985 Tre fejl, stadig. 794 00:38:09,985 --> 00:38:12,650 Lad mig rulle op til den første. 795 00:38:12,650 --> 00:38:14,320 Ubrugte variabel n.. 796 00:38:14,320 --> 00:38:15,850 Vi har ikke set det før. 797 00:38:15,850 --> 00:38:17,200 Og også dette er lidt kryptisk. 798 00:38:17,200 --> 00:38:18,850 Dette er outputtet af compileren. 799 00:38:18,850 --> 00:38:23,610 Og hvad der fremhævede linje der - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 siger, det siger on line ni af positive.c, på den 13. karakter, 801 00:38:28,960 --> 00:38:31,510 13. kolonne, du har lavet denne fejl. 802 00:38:31,510 --> 00:38:34,230 >> Og i særdeleshed, er det at fortælle mig ubrugt variabel n.. 803 00:38:34,230 --> 00:38:35,790 Så lad os se - 804 00:38:35,790 --> 00:38:37,150 linie ni. 805 00:38:37,150 --> 00:38:40,430 Jeg bruger n i den forstand, Jeg giver det en værdi. 806 00:38:40,430 --> 00:38:44,200 Men hvad compileren ikke kan lide, er at jeg ikke tilsyneladende bruger det. 807 00:38:44,200 --> 00:38:45,560 Men vent et øjeblik, jeg bruger det. 808 00:38:45,560 --> 00:38:48,170 På linje 11, jeg bruger det her. 809 00:38:48,170 --> 00:38:52,430 Men hvis jeg rulle ned yderligere på positive.c :11 - 810 00:38:52,430 --> 00:38:56,230 så ved linie 11, tegn 12, den compiler fortæller mig, brug af 811 00:38:56,230 --> 00:38:58,670 kaldenavn n. 812 00:38:58,670 --> 00:39:02,760 >> Så sort betyder, at jeg har ikke specificeret det som en 813 00:39:02,760 --> 00:39:04,970 variabel med en datatype. 814 00:39:04,970 --> 00:39:05,500 Men vent et øjeblik. 815 00:39:05,500 --> 00:39:09,150 Jeg gjorde præcis det på linje ni. 816 00:39:09,150 --> 00:39:11,100 Så nogen er virkelig forvirret her. 817 00:39:11,100 --> 00:39:14,900 Det er enten mig eller compiler, fordi på linje ni, igen jeg erklære en 818 00:39:14,900 --> 00:39:18,650 int n, og jeg tildele det returnere værdien af ​​GetInt (). 819 00:39:18,650 --> 00:39:22,930 Så jeg bruger denne variabel n på linje 11 og kontrollere, hvis dens værdi er mindre 820 00:39:22,930 --> 00:39:24,050 end eller lig med nul. 821 00:39:24,050 --> 00:39:27,430 Men det er tilsyneladende dårlige og brudt hvorfor? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Sig det igen? 824 00:39:32,490 --> 00:39:35,690 >> Ah, jeg nødt til at erklære n før ind i løkken. 825 00:39:35,690 --> 00:39:36,370 Men hvorfor? 826 00:39:36,370 --> 00:39:39,830 Jeg mener, vi netop foreslået en smule siden, at det er fint at erklære variabler 827 00:39:39,830 --> 00:39:43,600 alle på én linje og derefter tildele dem en vis værdi. 828 00:39:43,600 --> 00:39:46,790 En global variabel - lad os vende tilbage til denne idé i bare et øjeblik. 829 00:39:46,790 --> 00:39:48,690 Hvorfor vil du have mig til at sætte den ud af løkken? 830 00:39:48,690 --> 00:40:03,170 831 00:40:03,170 --> 00:40:03,830 Det er. 832 00:40:03,830 --> 00:40:06,780 Præcis. 833 00:40:06,780 --> 00:40:09,610 >> Så, omend noget ulogisk, lad mig opsummere. 834 00:40:09,610 --> 00:40:13,510 Når du erklærer n inde af gør blokken der - 835 00:40:13,510 --> 00:40:16,320 specifikt inde i de krøllede parenteser - 836 00:40:16,320 --> 00:40:19,210 denne variabel n har, hvad der er kaldes en rækkevidde - 837 00:40:19,210 --> 00:40:23,210 relateret til vores pointsystem i kursus - men har en rækkevidde, der er 838 00:40:23,210 --> 00:40:25,190 begrænset til de krøllede parenteser. 839 00:40:25,190 --> 00:40:28,460 Med andre ord, hvis du typisk erklærer en variabel inde i et sæt 840 00:40:28,460 --> 00:40:33,370 krøllede parenteser, at variable eksisterer kun indersiden af ​​disse krøllede parenteser. 841 00:40:33,370 --> 00:40:37,320 Så ved denne logik alene, men selv Jeg har erklæret n på linje ni, det 842 00:40:37,320 --> 00:40:41,910 væsentlige forsvinder fra anvendelsesområdet forsvinder fra hukommelsen, så at sige, 843 00:40:41,910 --> 00:40:43,370 med den tid, jeg ramte linie 11. 844 00:40:43,370 --> 00:40:47,370 Fordi linje 11, desværre, er uden for disse krøllede parenteser. 845 00:40:47,370 --> 00:40:51,540 >> Så jeg kan desværre ikke løse dette ved gå tilbage til, hvad jeg gjorde det før. 846 00:40:51,540 --> 00:40:53,370 Du kan i første omgang gøre det. 847 00:40:53,370 --> 00:40:56,370 Men hvad er du nu ikke laver cyklisk? 848 00:40:56,370 --> 00:40:58,260 Du naturligvis ikke at få int cyklisk. 849 00:40:58,260 --> 00:41:01,320 Så vi kan forlade GetInt (), og vi skal forlade GetInt () inde i 850 00:41:01,320 --> 00:41:04,420 loop fordi det er hvad vi ønsker at forpeste brugeren om igen og igen. 851 00:41:04,420 --> 00:41:08,660 Men det er tilstrækkeligt til at gå op til linje, siger seks. 852 00:41:08,660 --> 00:41:10,150 Int n, semikolon. 853 00:41:10,150 --> 00:41:12,990 Må ikke give det en værdi endnu, fordi du behøver ikke at bare endnu. 854 00:41:12,990 --> 00:41:16,220 >> Men nu hernede, varsel - det ville være en meget nem fejltagelse. 855 00:41:16,220 --> 00:41:19,440 Jeg ønsker ikke at skygge min tidligere erklæring n. 856 00:41:19,440 --> 00:41:22,830 Jeg ønsker at bruge n som rent faktisk eksisterer. 857 00:41:22,830 --> 00:41:25,780 Og så nu i linje 10, Jeg tildeler n en værdi. 858 00:41:25,780 --> 00:41:28,580 Men på linje seks, erklærer I n. 859 00:41:28,580 --> 00:41:32,940 Og så kan jeg eller kan jeg ikke bruge det i linje 12 nu? 860 00:41:32,940 --> 00:41:37,120 Jeg kan, fordi mellem hvilke krøllet seler er n erklæret nu? 861 00:41:37,120 --> 00:41:38,770 Den ene op her på linje fem. 862 00:41:38,770 --> 00:41:40,330 Til en her på linie 14.. 863 00:41:40,330 --> 00:41:49,770 Så hvis jeg nu zoome ud, skal du gemme denne fil, gå tilbage i og køre gøre positive, det 864 00:41:49,770 --> 00:41:50,820 udarbejdet denne gang. 865 00:41:50,820 --> 00:41:51,940 Så det er allerede fremskridt. 866 00:41:51,940 --> 00:41:53,640 Slash. . / Positive, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Jeg forlanger, at du giver mig et positivt heltal. 868 00:41:56,060 --> 00:41:57,750 Negativ 1.. 869 00:41:57,750 --> 00:41:59,020 Negativ 2.. 870 00:41:59,020 --> 00:42:00,680 Negativ 3.. 871 00:42:00,680 --> 00:42:01,760 Nul. 872 00:42:01,760 --> 00:42:03,000 One. 873 00:42:03,000 --> 00:42:05,130 Og tak for den ene er hvad der nu er udskrevet. 874 00:42:05,130 --> 00:42:07,400 >> Lad mig prøve noget andet, ud af nysgerrighed. 875 00:42:07,400 --> 00:42:09,600 Jeg bliver bedt om at indtaste et heltal. 876 00:42:09,600 --> 00:42:12,870 Men hvad nu hvis jeg i stedet skrive i lam? 877 00:42:12,870 --> 00:42:14,460 Så du nu se en anden prompt - 878 00:42:14,460 --> 00:42:15,350 prøv igen. 879 00:42:15,350 --> 00:42:17,670 Men ingen steder i min kode jeg skriver prøv igen. 880 00:42:17,670 --> 00:42:22,320 Så hvor formentlig, er det prøve igen bede kommer fra, ville du sige? 881 00:42:22,320 --> 00:42:23,540 Ja, fra GetInt () selv. 882 00:42:23,540 --> 00:42:26,650 Så en af ​​de ting, CS50 personale gør for dig, i det mindste disse første par 883 00:42:26,650 --> 00:42:30,400 uger har vi skrevet nogle beløb af fejlkontrol til at sikre, at hvis 884 00:42:30,400 --> 00:42:34,260 du kalder GetInt (), vil du i det mindste komme tilbage en int fra brugeren. 885 00:42:34,260 --> 00:42:35,460 Du vil ikke få en streng. 886 00:42:35,460 --> 00:42:36,440 Du vil ikke få en char. 887 00:42:36,440 --> 00:42:39,660 Du vil ikke få noget helt andet. 888 00:42:39,660 --> 00:42:40,510 Du får en int. 889 00:42:40,510 --> 00:42:41,890 >> Nu kan det ikke være positiv. 890 00:42:41,890 --> 00:42:42,770 Det er måske ikke være negativ. 891 00:42:42,770 --> 00:42:44,550 Vi giver ingen garantier omkring dette. 892 00:42:44,550 --> 00:42:48,960 Men vi vil forpeste brugeren for at prøve igen, prøve igen, prøve igen, indtil han eller hun faktisk 893 00:42:48,960 --> 00:42:49,810 samarbejder. 894 00:42:49,810 --> 00:42:53,085 Tilsvarende, hvis jeg gør 1,23, det er ikke en int. 895 00:42:53,085 --> 00:42:58,400 Men hvis jeg skriver i, siger, 50, der giver mig en værdi, som jeg ønskede. 896 00:42:58,400 --> 00:42:59,050 >> Ok. 897 00:42:59,050 --> 00:43:01,380 Så ikke dårligt. 898 00:43:01,380 --> 00:43:04,780 Eventuelle spørgsmål om, hvad vi lige har gjort? 899 00:43:04,780 --> 00:43:07,930 Nøglen takeaway er, at være klar, ikke så meget løkke, som vi har set 900 00:43:07,930 --> 00:43:10,880 før selvom vi har ikke rigtig brugt det, men spørgsmålet om omfanget, hvor 901 00:43:10,880 --> 00:43:17,045 variable kan kun kan kun bruges inden nogle nærmere angivet omfang. 902 00:43:17,045 --> 00:43:19,830 >> Okay, lad mig tage fat forslaget du har lavet tidligere, at en 903 00:43:19,830 --> 00:43:20,860 global variabel. 904 00:43:20,860 --> 00:43:24,880 Som en sidebemærkning viser det sig, at en anden løsning på dette problem, men 905 00:43:24,880 --> 00:43:28,880 typisk en forkert opløsning eller en dårligt designet løsning, er at 906 00:43:28,880 --> 00:43:31,670 erklære din variabel som, hvad der er kaldes en global variabel. 907 00:43:31,670 --> 00:43:34,610 Nu er jeg slags krænke min definition af muligheder, fordi der er 908 00:43:34,610 --> 00:43:37,680 ingen krøllede parenteser allerøverst og selve bunden af ​​en fil. 909 00:43:37,680 --> 00:43:40,190 Men konsekvenserne af denne er det nu i overensstemmelse fire, 910 00:43:40,190 --> 00:43:41,710 n er en global variabel. 911 00:43:41,710 --> 00:43:44,460 Og som navnet antyder, er det bare tilgængelig overalt. 912 00:43:44,460 --> 00:43:45,790 >> Scratch har faktisk disse. 913 00:43:45,790 --> 00:43:48,650 Hvis du har brugt en variabel, kan du huske du skulle vælge, hvis det er for 914 00:43:48,650 --> 00:43:50,780 dette sprite eller for alle sprites. 915 00:43:50,780 --> 00:43:54,270 Tja, alle sprites er bare tydeligere måde at sige global. 916 00:43:54,270 --> 00:43:55,520 Ja? 917 00:43:55,520 --> 00:44:09,690 918 00:44:09,690 --> 00:44:10,990 Ah, virkelig godt spørgsmål. 919 00:44:10,990 --> 00:44:14,310 >> Så huske, at i den allerførste udgave af min kode, da jeg forkert 920 00:44:14,310 --> 00:44:17,700 erklæret og defineret n på linje ni - 921 00:44:17,700 --> 00:44:19,980 Jeg erklærede det som en variabel og jeg gav det en værdi med 922 00:44:19,980 --> 00:44:21,160 opgaven operatør - 923 00:44:21,160 --> 00:44:22,520 dette gav mig to fejl. 924 00:44:22,520 --> 00:44:26,560 Én, at n ikke er blevet anvendt, og to, at i linie 11 925 00:44:26,560 --> 00:44:27,770 Det var bare ikke deklareret. 926 00:44:27,770 --> 00:44:31,120 Så den første jeg gjorde ikke adresse på det tidspunkt. 927 00:44:31,120 --> 00:44:35,130 Det er strengt taget ikke en fejl at erklære en variabel, men ikke bruge det. 928 00:44:35,130 --> 00:44:38,540 Men en af ​​de ting, vi har gjort i Den CS50 apparat, bevidst, 929 00:44:38,540 --> 00:44:43,340 pædagogisk, er vi skrevet op forventninger til compiler til at gøre 930 00:44:43,340 --> 00:44:46,970 sikker på, at du laver tingene ikke bare korrekt, men virkelig korrekt. 931 00:44:46,970 --> 00:44:51,520 >> Fordi hvis du erklære en variabel ligesom n og aldrig bruger det, eller bruger det 932 00:44:51,520 --> 00:44:53,700 korrekt, så hvad det gør der? 933 00:44:53,700 --> 00:44:55,650 Det er virkelig tjener ikke noget formål. 934 00:44:55,650 --> 00:44:58,980 Og det er meget nemt over tid, hvis du ikke konfigurerer din egen computer i 935 00:44:58,980 --> 00:45:01,960 denne måde, at bare have kode, der har små rester her, rester der. 936 00:45:01,960 --> 00:45:04,390 Og så måneder senere du se tilbage og du er ligesom, hvorfor er denne linje af 937 00:45:04,390 --> 00:45:05,060 kode der? 938 00:45:05,060 --> 00:45:07,940 Og hvis der ikke er nogen god grund, er det gavner ikke dig eller dine kolleger 939 00:45:07,940 --> 00:45:10,650 ned ad vejen til at snuble over det dengang. 940 00:45:10,650 --> 00:45:12,540 >> Som en sidebemærkning, hvor er , som kommer fra? 941 00:45:12,540 --> 00:45:16,410 Nå, minde om, at hver gang vi kompilere program, alle disse ting er 942 00:45:16,410 --> 00:45:17,380 blive udskrevet. 943 00:45:17,380 --> 00:45:18,350 Så vi vil vende tilbage til dette. 944 00:45:18,350 --> 00:45:22,230 Men igen, gør er et hjælpeprogram, automatiserer processen med udarbejdelse af 945 00:45:22,230 --> 00:45:24,830 kører faktiske compiler kaldet klang. 946 00:45:24,830 --> 00:45:27,650 Denne ting, vil vi i sidste ende se, har at gøre med debugging med en speciel 947 00:45:27,650 --> 00:45:29,060 program kaldet debugger. 948 00:45:29,060 --> 00:45:32,150 Dette har at gøre med at optimere kode - mere om det i fremtiden. 949 00:45:32,150 --> 00:45:33,620 Std = C99 - 950 00:45:33,620 --> 00:45:37,870 dette betyder bare bruge 1999-udgaven af C. C har været omkring endnu længere end 951 00:45:37,870 --> 00:45:40,830 det, men de gjorde nogle nice ændringer 10 plus år siden. 952 00:45:40,830 --> 00:45:42,690 >> Og her er de relevante virksomheder. 953 00:45:42,690 --> 00:45:45,880 Vi siger gøre noget, tidligere ville have været en advarsel 954 00:45:45,880 --> 00:45:48,560 en fejl forhindrer eleven fra kompilering. 955 00:45:48,560 --> 00:45:51,400 Og vægorganer gøre det for en hel masse ting, ikke 956 00:45:51,400 --> 00:45:53,060 netop relateret til variable. 957 00:45:53,060 --> 00:45:54,700 Og så lad mig rulle til slutningen af ​​denne linie. 958 00:45:54,700 --> 00:45:56,430 Og også dette vi vil i sidste ende komme tilbage til. 959 00:45:56,430 --> 00:45:59,040 Dette er naturligvis navnet filen jeg kompilering. 960 00:45:59,040 --> 00:46:02,160 Det minder om navnet på filen Jeg udsender som navnet 961 00:46:02,160 --> 00:46:04,070 min kørbar program. 962 00:46:04,070 --> 00:46:08,970 Dette-lcs50 betyder blot bruge CS50 bibliotek og eventuelle nuller og ettaller, der 963 00:46:08,970 --> 00:46:12,390 personalet skrev og kompileret tidligere dette år, integrerer 964 00:46:12,390 --> 00:46:13,490 dem ind i mit program. 965 00:46:13,490 --> 00:46:16,130 >> Og nogen vide, hvad-lm er? 966 00:46:16,130 --> 00:46:18,150 Det er den matematiske bibliotek, som er der bare selvom du 967 00:46:18,150 --> 00:46:19,320 ikke gør nogen math. 968 00:46:19,320 --> 00:46:22,620 Det er bare automatisk forudsat os ved at gøre. 969 00:46:22,620 --> 00:46:26,540 >> Nå, lad mig gøre et andet eksempel her ved at åbne en ny fil. 970 00:46:26,540 --> 00:46:30,560 Og lad mig gemme denne ene som string.c. 971 00:46:30,560 --> 00:46:37,980 Det viser sig, at når vi taler om data typer i dag, er der endnu mere 972 00:46:37,980 --> 00:46:40,630 foregår under hætten end vi har set hidtil. 973 00:46:40,630 --> 00:46:42,290 Så lad mig hurtigt gøre en hurtig program. 974 00:46:42,290 --> 00:46:44,510 Medtag stdio.h. 975 00:46:44,510 --> 00:46:45,730 Og jeg vil gemme det. 976 00:46:45,730 --> 00:46:48,110 Og du ved, jeg ikke gør så lad samme fejl igen og igen. 977 00:46:48,110 --> 00:46:50,540 Medtag cs50.h. 978 00:46:50,540 --> 00:46:54,870 Og lad mig gå videre nu og gør int main (void). 979 00:46:54,870 --> 00:46:58,790 >> Og nu vil jeg bare ønsker at gøre et program der gør dette - erklære en streng 980 00:46:58,790 --> 00:47:03,610 kaldet s og få en streng fra brugeren. 981 00:47:03,610 --> 00:47:05,820 Og lad mig gøre lidt vejledningen her - 982 00:47:05,820 --> 00:47:09,960 bedes du give mig en snor - så brugeren ved, hvad de skal gøre. 983 00:47:09,960 --> 00:47:13,190 Og så hernede under dette, Jeg ønsker at gøre følgende - 984 00:47:13,190 --> 00:47:16,060 til int i bliver nul. 985 00:47:16,060 --> 00:47:18,580 Igen, dataloger typisk begynder at tælle ved nul, men vi kunne 986 00:47:18,580 --> 00:47:20,340 gør, at man, hvis vi virkelig ønskede. 987 00:47:20,340 --> 00:47:27,240 Nu vil jeg lave jeg er mindre end strengen længde sek. 988 00:47:27,240 --> 00:47:28,430 Så strlen - 989 00:47:28,430 --> 00:47:29,510 S-T-R-L-E-N - 990 00:47:29,510 --> 00:47:31,650 igen, det er kortfattet, fordi det er nemmere at skrive, selvom det er en 991 00:47:31,650 --> 00:47:32,590 lidt kryptisk. 992 00:47:32,590 --> 00:47:35,290 >> Det er en funktion, vi har ikke brugt før, men bogstaveligt gør det - 993 00:47:35,290 --> 00:47:37,810 tilbage til mig et tal, der repræsenterer længden af ​​strengen 994 00:47:37,810 --> 00:47:38,690 at brugeren har indtastet. 995 00:47:38,690 --> 00:47:41,740 Hvis de har skrevet i hej, det ville vende tilbage fem, fordi der er fem 996 00:47:41,740 --> 00:47:42,890 bogstaver i Hello. 997 00:47:42,890 --> 00:47:45,390 Derefter på hver iteration af denne løkke, jeg plus plus. 998 00:47:45,390 --> 00:47:49,170 Så igen en standard konstruere selvom du er ikke helt for godt eller 999 00:47:49,170 --> 00:47:50,420 fortrolig med det endnu. 1000 00:47:50,420 --> 00:47:53,220 >> Men nu hver iteration af denne løkke, mærke til, hvad jeg har tænkt mig at gøre. 1001 00:47:53,220 --> 00:47:56,690 Jeg ønsker at gå videre og udskrive ud af en enkelt karakter - 1002 00:47:56,690 --> 00:47:59,940 så% c backslash n på en ny linje. 1003 00:47:59,940 --> 00:48:00,990 Og så ved du hvad jeg ønsker at gøre? 1004 00:48:00,990 --> 00:48:05,090 Uanset ordet er at brugeren skriver i, ligesom hej, jeg ønsker at udskrive 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, ét tegn pr linje. 1006 00:48:09,530 --> 00:48:13,080 Med andre ord, vil jeg til at komme på enkelte tegn i en streng, 1007 00:48:13,080 --> 00:48:16,770 hvorved indtil nu en streng har netop været en sekvens af tegn. 1008 00:48:16,770 --> 00:48:21,690 >> Og det viser sig, jeg kan gøre s, konsol I tæt beslag, luk 1009 00:48:21,690 --> 00:48:23,580 parentes, semikolon. 1010 00:48:23,580 --> 00:48:25,640 Og jeg behøver at gøre én ting mere. 1011 00:48:25,640 --> 00:48:30,570 Det er i en fil kaldet string.h at strlen deklareres. 1012 00:48:30,570 --> 00:48:33,190 Så hvis jeg ønsker at bruge denne funktion, Jeg har brug for at fortælle compiler, 1013 00:48:33,190 --> 00:48:34,450 forventer at bruge det. 1014 00:48:34,450 --> 00:48:37,040 Lad mig nu gå videre og gøre det program kaldet strengen. 1015 00:48:37,040 --> 00:48:39,150 Dot, skråstreg, streng. 1016 00:48:39,150 --> 00:48:40,130 >> Giv mig en streng. 1017 00:48:40,130 --> 00:48:40,900 Jeg vil gå videre og skrive det. 1018 00:48:40,900 --> 00:48:43,040 Hej, i alle caps, Enter. 1019 00:48:43,040 --> 00:48:47,390 Og nu mærke til jeg har udskrevet dette et tegn efter den anden. 1020 00:48:47,390 --> 00:48:51,450 Så den nye detalje her er, at en streng, ved slutningen af ​​dagen, kan være 1021 00:48:51,450 --> 00:48:54,810 tilgås ved hjælp af dens individuelle tegn ved at indføre pladsen 1022 00:48:54,810 --> 00:48:55,840 beslag notation. 1023 00:48:55,840 --> 00:48:59,090 Og det er fordi en streng nedenunder hætten er faktisk en sekvens af 1024 00:48:59,090 --> 00:48:59,810 tegn. 1025 00:48:59,810 --> 00:49:02,010 Men hvad er pæne om dem er i computerens RAM - 1026 00:49:02,010 --> 00:49:05,300 Mac, pc, uanset hvad det er - de er bogstaveligt tilbage til tilbage til tilbage - 1027 00:49:05,300 --> 00:49:06,225 H-E-L-L-O - 1028 00:49:06,225 --> 00:49:09,920 på individuelt, der støder op bytes i hukommelsen. 1029 00:49:09,920 --> 00:49:13,210 >> Så hvis du ønsker at få ram på den ottende byte, som i denne sløjfe ville være 1030 00:49:13,210 --> 00:49:16,900 beslag nul, beslag én, konsol to, beslag tre beslag fire - 1031 00:49:16,900 --> 00:49:18,890 der er nul indekseret indtil fem - 1032 00:49:18,890 --> 00:49:23,330 der vil udskrive H-E-L-L-O på sin egen linje. 1033 00:49:23,330 --> 00:49:26,320 >> Nu, som en teaser, så lad mig vise dig slags ting, du vil i sidste ende blive 1034 00:49:26,320 --> 00:49:31,950 stand til at forstå, i det mindste med nogle close leder. 1035 00:49:31,950 --> 00:49:35,610 For én, vi hvad indeholdt i dagens eksempler, hvis du gerne vil, er faktisk 1036 00:49:35,610 --> 00:49:38,300 en af ​​de allerførste jailbreaks til iPhone. 1037 00:49:38,300 --> 00:49:40,800 Jailbreaking betyder revner telefonen så du kan faktisk bruge det på en 1038 00:49:40,800 --> 00:49:43,380 anden transportvirksomhed eller installere din egen software. 1039 00:49:43,380 --> 00:49:45,660 Og du vil bemærke dette ser helt kryptisk, mest sandsynligt. 1040 00:49:45,660 --> 00:49:46,520 Men se på dette. 1041 00:49:46,520 --> 00:49:50,420 IPhone var tilsyneladende revnet med en for-løkke, en hvis betingelse, en ellers 1042 00:49:50,420 --> 00:49:52,580 tilstand, en flok af funktioner vi har ikke set. 1043 00:49:52,580 --> 00:49:54,230 >> Og igen, vil du ikke første øjekast formentlig 1044 00:49:54,230 --> 00:49:55,620 forstå, hvordan dette virker. 1045 00:49:55,620 --> 00:49:58,940 Men alt det, vi slags tage for givet i vores moderne liv 1046 00:49:58,940 --> 00:50:02,040 faktisk tendens til at reducere endog til en vis af disse fundamentale vi har været 1047 00:50:02,040 --> 00:50:02,820 ser på. 1048 00:50:02,820 --> 00:50:06,680 Lad mig gå videre og åbne en andet program, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Så dette også er noget, du burde ikke rigtig kender. 1050 00:50:08,970 --> 00:50:12,440 Selv ingen af ​​personale eller jeg kunne formentlig finde ud af dette ved at se på 1051 00:50:12,440 --> 00:50:15,450 det, fordi det var en kode der blev indgivet til, hvad der er 1052 00:50:15,450 --> 00:50:19,630 historisk kendt som en korrumperet C konkurrence, hvor du skriver et program 1053 00:50:19,630 --> 00:50:24,670 der kompilerer og kører, men er så pokkers kryptisk intet menneske kan forstå, hvad 1054 00:50:24,670 --> 00:50:27,530 det kommer til at gøre, indtil de faktisk køre den. 1055 00:50:27,530 --> 00:50:29,940 >> Så ja, hvis man ser på dette kode, ser jeg en switch. 1056 00:50:29,940 --> 00:50:30,870 Jeg ser main. 1057 00:50:30,870 --> 00:50:33,800 Jeg ser disse firkantede parenteser indebærer en form for en matrix. 1058 00:50:33,800 --> 00:50:35,970 Er der nogen der ønsker at gætte, hvad dette program faktisk 1059 00:50:35,970 --> 00:50:37,220 gør, hvis jeg kører Holloway? 1060 00:50:37,220 --> 00:50:39,940 1061 00:50:39,940 --> 00:50:40,750 Ja. 1062 00:50:40,750 --> 00:50:43,050 OK. 1063 00:50:43,050 --> 00:50:44,690 Godt gået. 1064 00:50:44,690 --> 00:50:48,090 Så kun de ansatte, og jeg kan ikke regne ud af, hvad disse ting gør. 1065 00:50:48,090 --> 00:50:51,670 >> Og nu endelig, lad mig gå videre og åbne op et andet program. 1066 00:50:51,670 --> 00:50:53,440 Denne ene - 1067 00:50:53,440 --> 00:50:55,550 igen, vil vi gøre kildekoden tilgængelig online - det ene er bare 1068 00:50:55,550 --> 00:50:57,480 slags smuk at se på. 1069 00:50:57,480 --> 00:50:59,750 Alt, hvad de gjorde, er ramt space bar ganske lidt. 1070 00:50:59,750 --> 00:51:01,320 Men dette er virkeligt kode. 1071 00:51:01,320 --> 00:51:04,790 Så hvis du tror, ​​det er smuk, hvis vi faktisk køre dette på prompt, 1072 00:51:04,790 --> 00:51:08,970 sidste ende vil du se, hvordan vi kan gøre ting som dette. 1073 00:51:08,970 --> 00:51:14,008 >> Så vi vil forlade dig på dette notat og se dig på onsdag. 1074 00:51:14,008 --> 00:51:18,440 >> [MUSIC Playing] 1075 00:51:18,440 --> 00:51:23,380 >> SPEAKER 2: På det næste CS50, TFS iscenesætte et mytteri. 1076 00:51:23,380 --> 00:51:24,112 >> SPEAKER 3: Der er han. 1077 00:51:24,112 --> 00:51:25,362 Få ham! 1078 00:51:25,362 --> 00:51:29,912 1079 00:51:29,912 --> 00:51:32,074 >> [MUSIC Playing]