1 00:00:00,000 --> 00:00:10,920 >> [Musikk spilles] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J MALAN: All right, velkommen tilbake til CS50. 3 00:00:14,680 --> 00:00:16,500 Dette er begynnelsen av uke to. 4 00:00:16,500 --> 00:00:18,940 Et ord fra en av våre venner på campus - 5 00:00:18,940 --> 00:00:22,620 hvis du er interessert, muligens, enten nå eller i noen fremtidig sikt 6 00:00:22,620 --> 00:00:25,670 selv, en gang mer behagelig, undervisning midt skoleelever litt 7 00:00:25,670 --> 00:00:27,680 noe om informatikk, gjøre hodet til denne nettadressen. 8 00:00:27,680 --> 00:00:32,360 De er særlig behov akkurat nå av lærere, spesielt hvis du har 9 00:00:32,360 --> 00:00:34,700 hadde noen eksponering for informatikk. 10 00:00:34,700 --> 00:00:38,060 >> Så husker at forrige gang, introduserte vi noen datatyper i C, og 11 00:00:38,060 --> 00:00:40,590 du har kanskje begynt å få hendene skitne med disse så langt 12 00:00:40,590 --> 00:00:41,940 i problemet satt en. 13 00:00:41,940 --> 00:00:43,230 Og vi hadde en røye. 14 00:00:43,230 --> 00:00:49,100 Så i noe tekniske termer, hva er en røye som du kjenner det i dag? 15 00:00:49,100 --> 00:00:51,050 >> Så det er et tegn, men la oss være mer presis nå. 16 00:00:51,050 --> 00:00:53,735 Hva mener vi med karakter eller individuelle røye? 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 seg at selv tall, selv tegnsetting og bokstaver er 21 00:01:04,580 --> 00:01:06,980 representert med disse dataene skriv kjent som en røye. 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 Yeah? 24 00:01:11,100 --> 00:01:12,275 >> Så det er et ASCII-tegn. 25 00:01:12,275 --> 00:01:15,510 Så hvis du tenker tilbake til uke null, når vi hadde vår byte av frivillige 26 00:01:15,510 --> 00:01:19,150 komme opp og enten holde hendene opp eller ikke alle, representerte de bits. 27 00:01:19,150 --> 00:01:22,450 Men samlet som en gruppe av åtte, de representerte en byte. 28 00:01:22,450 --> 00:01:26,030 Og vi introduserte begrepet ASCII på den forelesning, som er rett og slett en 29 00:01:26,030 --> 00:01:28,170 kartlegging mellom tall og bokstaver. 30 00:01:28,170 --> 00:01:32,010 Og ASCII bruker, som disse menneskene underforståtte, åtte bits 31 00:01:32,010 --> 00:01:33,660 for å representere et tegn. 32 00:01:33,660 --> 00:01:36,890 >> Så derfor, hvis åtte bits kan hvert ta på en av to verdier - 33 00:01:36,890 --> 00:01:38,010 null eller en - 34 00:01:38,010 --> 00:01:40,280 Det betyr at det var to muligheter for denne personen - 35 00:01:40,280 --> 00:01:41,230 null eller en - 36 00:01:41,230 --> 00:01:44,070 to for denne person to for denne person, to for denne. 37 00:01:44,070 --> 00:01:47,450 Så totalt to ganger to ganger to ganger to ganger to - 38 00:01:47,450 --> 00:01:49,700 så to den åttende totalt. 39 00:01:49,700 --> 00:01:54,320 Så det er et totalt antall tegn 256 mulig at du kan 40 00:01:54,320 --> 00:01:55,750 representere med åtte bits. 41 00:01:55,750 --> 00:01:59,210 >> Nå, de av dere som snakker Asiatisk språk kan vite at det er mer 42 00:01:59,210 --> 00:02:02,620 tegn i verden enn bare As og Bs og Cs og Ds. 43 00:02:02,620 --> 00:02:06,130 Og ja, gjør ASCII ikke være tilstrekkelig for en rekke språk i verden. 44 00:02:06,130 --> 00:02:07,760 Men mer om det en annen gang. 45 00:02:07,760 --> 00:02:11,240 For nå vet at i C hvis du vil for å representere et bokstav, et stykke 46 00:02:11,240 --> 00:02:15,780 tegnsetting, eller bare noe karakter i naturen, bruker vi en røye. 47 00:02:15,780 --> 00:02:18,240 Og det er én byte eller åtte bits. 48 00:02:18,240 --> 00:02:19,690 >> Hva med en int? 49 00:02:19,690 --> 00:02:20,780 Vel, er en int et heltall. 50 00:02:20,780 --> 00:02:23,175 Hvor mange biter, hvis du husker, var et heltall vanligvis? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Noen tilbakekallingen? 53 00:02:27,512 --> 00:02:29,600 Så det er typisk 32. 54 00:02:29,600 --> 00:02:32,120 Det avhenger faktisk på datamaskinen som du bruker. 55 00:02:32,120 --> 00:02:35,770 Men i apparatet, og i mange datamaskiner, er det 32 ​​bits eller fire 56 00:02:35,770 --> 00:02:37,140 byte - åtte ganger fire. 57 00:02:37,140 --> 00:02:39,790 Og ints bare brukes til lagring tall, enten negative, 58 00:02:39,790 --> 00:02:41,610 positiv eller null. 59 00:02:41,610 --> 00:02:45,250 >> Og hvis du har 32 bits og du bare bryr seg om positive tall, kan 60 00:02:45,250 --> 00:02:48,960 noen ballpark hvor mange mulige heltall en datamaskin kan representere fra 61 00:02:48,960 --> 00:02:51,820 null på opp? 62 00:02:51,820 --> 00:02:56,130 Derfor ville det være to til det 32, som er omtrent fire milliarder. 63 00:02:56,130 --> 00:02:59,720 Så disse makter to kommer til å være tilbakevendende tema i informatikk. 64 00:02:59,720 --> 00:03:03,930 Som vi vil se, de er ganske praktisk å jobbe med, selv om det ikke er helt 65 00:03:03,930 --> 00:03:05,790 lett å gjøre regnestykket i ens hode. 66 00:03:05,790 --> 00:03:07,000 >> Så vi vil si om lag fire milliarder. 67 00:03:07,000 --> 00:03:08,620 Nå, en lang lang - 68 00:03:08,620 --> 00:03:09,770 du kan slags gjetning. 69 00:03:09,770 --> 00:03:10,480 Det er lenger enn en int. 70 00:03:10,480 --> 00:03:12,440 Hvor mange biter? 71 00:03:12,440 --> 00:03:14,250 Så 64 bits eller åtte bytes. 72 00:03:14,250 --> 00:03:17,480 Dette betyr bare at du kan representere selv større tall, større positiv eller 73 00:03:17,480 --> 00:03:19,160 større negative tall. 74 00:03:19,160 --> 00:03:20,060 >> Og hva med flyte? 75 00:03:20,060 --> 00:03:22,260 Det er et flyttall verdi av 32 biter. 76 00:03:22,260 --> 00:03:25,180 Dette er bare et reelt tall, noe med en desimal. 77 00:03:25,180 --> 00:03:30,100 Men hvis du i stedet trenger flere steder etter desimaltegnet eller du ønsker å 78 00:03:30,100 --> 00:03:33,720 representerer et større tall med noen brøkdel etter det, kan du bruke en 79 00:03:33,720 --> 00:03:36,260 double, som er 64 bits. 80 00:03:36,260 --> 00:03:38,240 >> Men det er en interessant takeaway her. 81 00:03:38,240 --> 00:03:42,890 Så hvis ints er begrenset av 32 biter og selv lange longs er begrenset av 64 82 00:03:42,890 --> 00:03:46,180 bits, den slags ber spørsmålet, hva om du faktisk ønsker å telle 83 00:03:46,180 --> 00:03:48,790 høyere enn 4 milliarder for en int? 84 00:03:48,790 --> 00:03:50,330 Vel, du bare bruke en lang lang. 85 00:03:50,330 --> 00:03:54,200 Men hva hvis du ønsker å telle høyere enn to til 64th, gi eller ta? 86 00:03:54,200 --> 00:03:55,810 >> Nå, det er et stort antall. 87 00:03:55,810 --> 00:03:59,250 Men til slutt, kanskje du faktisk bryr seg om slike verdier, 88 00:03:59,250 --> 00:04:03,070 spesielt hvis du bruker en database og begynner å samle masse 89 00:04:03,070 --> 00:04:06,190 og masse data og tilordne unike tall til hver del av disse dataene. 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 på samme måte, med flyttall verdier - flyter eller dobler - 92 00:04:10,700 --> 00:04:14,290 hvis du har bare et endelig antall bits, hvor mange totalt tall kunne du 93 00:04:14,290 --> 00:04:16,980 muligens representere? 94 00:04:16,980 --> 00:04:19,540 >> Vel, det er mindre klart når du innebære et desimaltegn. 95 00:04:19,540 --> 00:04:20,899 Men det er sikkert begrenset. 96 00:04:20,899 --> 00:04:24,390 Hvis du har et endelig antall biter, et endelig antall mennesker, en endelig 97 00:04:24,390 --> 00:04:27,350 antall lyspærer, sikkert du kan bare representere et endelig antall 98 00:04:27,350 --> 00:04:28,510 flytpunktverdier. 99 00:04:28,510 --> 00:04:33,170 Men hvor mange reelle tall er deres i verden? 100 00:04:33,170 --> 00:04:33,680 Det er en uendelig. 101 00:04:33,680 --> 00:04:37,280 Så det er litt av et problem fordi vi ikke har en uendelig mengde 102 00:04:37,280 --> 00:04:39,970 minne eller RAM innsiden av våre datamaskiner. 103 00:04:39,970 --> 00:04:41,780 Så noen utfordrende ting kan skje. 104 00:04:41,780 --> 00:04:43,900 >> Så la oss gå videre og prøve å uttrykke dette her. 105 00:04:43,900 --> 00:04:46,240 La meg gå videre og åpne opp gedit. 106 00:04:46,240 --> 00:04:50,360 Jeg kommer til å gå videre og lagre en fil kalt "floats0.c" bare for å være 107 00:04:50,360 --> 00:04:54,630 forenlig med et eksempel som er tilgjengelig på nettet, hvis du ønsker. 108 00:04:54,630 --> 00:04:58,080 Og jeg kommer til å gå videre og definerer det slik - 109 00:04:58,080 --> 00:05:01,540 Jeg kommer til å gå videre og si, int viktigste tomrom, som vi ofte gjør. 110 00:05:01,540 --> 00:05:07,190 >> Og så i dette programmet, kommer jeg til å erklære meg en dupp, så en 32-bit 111 00:05:07,190 --> 00:05:09,700 variabel kalt f, vilkårlig. 112 00:05:09,700 --> 00:05:13,910 Og så skal jeg lagre i det Jeg vet ikke, en tidel, så 0,1. 113 00:05:13,910 --> 00:05:16,590 Så jeg kommer til å uttrykke det som en dividert med 10, er som perfekt 114 00:05:16,590 --> 00:05:17,790 legitimt i C. 115 00:05:17,790 --> 00:05:20,460 >> Og deretter på den andre linjen, er det bare jeg ønsker å skrive ut denne verdien. 116 00:05:20,460 --> 00:05:22,950 Så husker at vi kan bruke det kjente printf. 117 00:05:22,950 --> 00:05:25,420 Vi ønsker ikke å bruke% i for en int. 118 00:05:25,420 --> 00:05:28,360 Vi ønsker å bruke% f for en flåte. 119 00:05:28,360 --> 00:05:33,080 Og så skal jeg gjøre backslash n, nær sitat, komma, f, semikolon. 120 00:05:33,080 --> 00:05:34,400 >> Så her er mitt program. 121 00:05:34,400 --> 00:05:35,820 Det er allerede en bug. 122 00:05:35,820 --> 00:05:38,640 Har noen for hvem dette klikket allerede ønsker å peke på minst 123 00:05:38,640 --> 00:05:40,220 en bug jeg har gjort? 124 00:05:40,220 --> 00:05:42,470 Yeah? 125 00:05:42,470 --> 00:05:42,800 Yeah. 126 00:05:42,800 --> 00:05:47,860 Jeg glemte "# include" på toppen, symptom de som hvis jeg prøver å 127 00:05:47,860 --> 00:05:50,490 kompilere dette kommer til å være at kompilatoren kommer til å kjefte på meg, 128 00:05:50,490 --> 00:05:52,770 sier udefinert symbol eller noe om dette. 129 00:05:52,770 --> 00:05:55,360 Det forstår ikke noe liker printf. 130 00:05:55,360 --> 00:05:59,380 >> Så jeg kommer til å gjøre "# include ", Lagre filen. 131 00:05:59,380 --> 00:06:00,400 Og nå er det i bedre form. 132 00:06:00,400 --> 00:06:02,690 Men jeg er også tenkt å peke ut en ny detalj i dag. 133 00:06:02,690 --> 00:06:08,620 I tillegg til å angi stedet holdere som% f% i% s, kan du 134 00:06:08,620 --> 00:06:12,320 noen ganger påvirke atferden av at plassholderen. 135 00:06:12,320 --> 00:06:15,540 For eksempel, i tilfelle av en flytende poengverdi, om jeg bare vil 136 00:06:15,540 --> 00:06:22,200 å vise en desimal etter periode, kan jeg faktisk gjøre 0.1F. 137 00:06:22,200 --> 00:06:26,830 Så med andre ord, skiller jeg f og prosenttegnet med 0,1, bare 138 00:06:26,830 --> 00:06:30,200 forteller printf, har du kanskje en hel haug av tall etter kommaet 139 00:06:30,200 --> 00:06:30,930 peke for meg. 140 00:06:30,930 --> 00:06:32,870 Men jeg bare ønsker å se en av dem. 141 00:06:32,870 --> 00:06:36,280 >> Så jeg kommer til å gå videre nå og spar dette programmet, gå inn i terminalen min 142 00:06:36,280 --> 00:06:41,870 vindu, og jeg kommer til å gå videre og type gjør float 0, angir. 143 00:06:41,870 --> 00:06:44,930 Jeg ser at noe kryptiske linje som vil begynne å være mer fornuftig som vi 144 00:06:44,930 --> 00:06:46,900 erte den fra hverandre denne uken og neste. 145 00:06:46,900 --> 00:06:50,480 Nå skal jeg gå videre og kjøre float null. 146 00:06:50,480 --> 00:06:52,020 Og, faen. 147 00:06:52,020 --> 00:06:54,880 >> Så det er en annen bug her en eller annen grunn. 148 00:06:54,880 --> 00:07:02,490 Jeg er ganske sikker på at en tidel, eller én delt på 10, er ikke 0,0. 149 00:07:02,490 --> 00:07:04,590 Kanskje jeg bare ikke ser på nok sifre. 150 00:07:04,590 --> 00:07:08,580 Så hvorfor ikke jeg si to 0,2 for å se to desimaler i stedet for bare ett. 151 00:07:08,580 --> 00:07:11,810 La meg gå tilbake til min terminal vindu her og slo opp et par ganger for å 152 00:07:11,810 --> 00:07:12,840 se min historie. 153 00:07:12,840 --> 00:07:15,910 Gjør flyte null igjen, og deretter opp igjen. 154 00:07:15,910 --> 00:07:17,730 Og nå inn. 155 00:07:17,730 --> 00:07:20,000 >> Og nå er jeg ganske sikker på at dette er feil. 156 00:07:20,000 --> 00:07:23,030 Og jeg kunne gjøre tre og fire, og jeg er sannsynligvis kommer til å fortsette å se nuller. 157 00:07:23,030 --> 00:07:24,880 Så hvor er feilen? 158 00:07:24,880 --> 00:07:27,910 En delt på 10 bør være 0,1. 159 00:07:27,910 --> 00:07:30,310 Noen ønsker å ta en stikke på hva det grunnleggende problemet er? 160 00:07:30,310 --> 00:07:32,400 Yeah? 161 00:07:32,400 --> 00:07:33,420 De er begge heltall. 162 00:07:33,420 --> 00:07:33,920 Hva så? 163 00:07:33,920 --> 00:07:37,820 Så med ett delt på 10, som er hva jeg gjør i aritmetikk. 164 00:07:37,820 --> 00:07:41,185 Og jeg får 0,1. 165 00:07:41,185 --> 00:07:41,660 >> Yeah. 166 00:07:41,660 --> 00:07:43,240 Og så er det faktisk det problemet. 167 00:07:43,240 --> 00:07:46,700 Når du tar et heltall i en datamaskin og du deler den med et annet heltall, 168 00:07:46,700 --> 00:07:50,430 maskinen som standard kommer til å anta at du ønsker et heltall. 169 00:07:50,430 --> 00:07:54,620 Problemet skjønt, er selvfølgelig at 0.1 ikke er et heltall. 170 00:07:54,620 --> 00:07:55,680 Det er et reelt tall. 171 00:07:55,680 --> 00:07:59,610 Og så hva maskinen gjør ved Standard er det bare kaster bort 172 00:07:59,610 --> 00:08:01,070 alt etter desimaltegnet. 173 00:08:01,070 --> 00:08:03,380 Det betyr rundt ikke ned eller opp per se. 174 00:08:03,380 --> 00:08:06,480 Det bare kaster bort alt etter desimaltegnet. 175 00:08:06,480 --> 00:08:07,430 Og nå som er fornuftig. 176 00:08:07,430 --> 00:08:09,740 Fordi nå er vi klart igjen med null. 177 00:08:09,740 --> 00:08:10,250 >> Men vent litt. 178 00:08:10,250 --> 00:08:11,840 Jeg ser ikke en int null. 179 00:08:11,840 --> 00:08:14,910 Jeg er faktisk å se 0.00. 180 00:08:14,910 --> 00:08:16,340 Så hvordan forene jeg dette nå? 181 00:08:16,340 --> 00:08:22,850 Hvis man delt på 10 er null, men jeg er se 0.00, er hvor det blir 182 00:08:22,850 --> 00:08:24,250 konverteres tilbake til et reelt tall? 183 00:08:24,250 --> 00:08:25,500 Yeah. 184 00:08:25,500 --> 00:08:29,850 185 00:08:29,850 --> 00:08:30,630 Nettopp. 186 00:08:30,630 --> 00:08:35,600 >> Så her oppe i fem linje, når jeg faktisk lagre som 0.1, som deretter 187 00:08:35,600 --> 00:08:39,549 avkuttet til null, på innsiden av en flottør det er effektivt tilsvarer 188 00:08:39,549 --> 00:08:42,100 lagrer det ikke som en int men, Faktisk, som en flottør. 189 00:08:42,100 --> 00:08:46,540 Dessuten er jeg så bruke printf til eksplisitt skrive ut dette antallet til to 190 00:08:46,540 --> 00:08:49,740 desimaler, selv om det kan faktisk ikke være noen. 191 00:08:49,740 --> 00:08:51,020 >> Så dette slags suger, ikke sant? 192 00:08:51,020 --> 00:08:53,640 Angivelig du ikke kan gjøre matte, i det minste på dette nivået av 193 00:08:53,640 --> 00:08:55,600 presisjon, i en datamaskin. 194 00:08:55,600 --> 00:08:56,930 Men sikkert det er en løsning. 195 00:08:56,930 --> 00:09:00,410 Hva er den enkleste løsning vi kunne kanskje gjøre, selv bare intuitivt her 196 00:09:00,410 --> 00:09:01,130 løse dette? 197 00:09:01,130 --> 00:09:02,380 Yeah? 198 00:09:02,380 --> 00:09:04,700 199 00:09:04,700 --> 00:09:06,574 Snu heltall inn - 200 00:09:06,574 --> 00:09:06,976 ja. 201 00:09:06,976 --> 00:09:10,420 Selv om jeg ikke er helt sikker på hva som er egentlig skjer her, hvis det 202 00:09:10,420 --> 00:09:13,440 fundamentalt har å gjøre med disse både være ints, vel, hvorfor gjør ikke jeg 203 00:09:13,440 --> 00:09:18,230 gjør at 10,0, noe som gjør dette 1,0, lagre filen. 204 00:09:18,230 --> 00:09:20,990 La meg gå tilbake til bunn og rekompilere. 205 00:09:20,990 --> 00:09:23,030 La meg nå reprise. 206 00:09:23,030 --> 00:09:23,420 Og der - 207 00:09:23,420 --> 00:09:27,690 nå har jeg fått min en tidel representert som 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årlig. 210 00:09:29,220 --> 00:09:31,730 Og la meg peke ut en annen måte vi kunne ha løst dette. 211 00:09:31,730 --> 00:09:35,580 La meg faktisk rulle tilbake i tid til når vi hadde dette som en 212 00:09:35,580 --> 00:09:36,680 tiende et øyeblikk siden. 213 00:09:36,680 --> 00:09:40,800 Og la meg gå videre og resave denne filen som et annet filnavn, bare for å 214 00:09:40,800 --> 00:09:41,750 har et lite sjekkpunkt. 215 00:09:41,750 --> 00:09:43,450 Så det var en versjon. 216 00:09:43,450 --> 00:09:45,520 Og nå la meg gå videre og gjøre en mer versjonen. 217 00:09:45,520 --> 00:09:48,540 Vi kaller denne versjonen to zero indeksert. 218 00:09:48,540 --> 00:09:51,280 >> Og jeg skal i stedet gjøre dette - vet du hva? 219 00:09:51,280 --> 00:09:54,400 Legge dot null fungerer i dette tilfellet. 220 00:09:54,400 --> 00:09:56,060 Men antar at man var en variabel. 221 00:09:56,060 --> 00:09:57,680 Ment 10 var en variabel. 222 00:09:57,680 --> 00:10:00,680 Med andre ord, antar at jeg ikke kunne bare hard-koden 0,0 på slutten 223 00:10:00,680 --> 00:10:02,340 av denne aritmetiske uttrykk. 224 00:10:02,340 --> 00:10:05,820 Vel, kan jeg faktisk gjøre noe i parentes kalt casting. 225 00:10:05,820 --> 00:10:11,920 Jeg kan kaste som heltall 10 til en flåte, og jeg kan kaste som heltall en til en 226 00:10:11,920 --> 00:10:12,800 flyte, så vel. 227 00:10:12,800 --> 00:10:17,190 Så regnestykket som kommer til å skje er effektivt 1,0 delt på 10,0, 228 00:10:17,190 --> 00:10:19,250 hvor resultatet går i f som før. 229 00:10:19,250 --> 00:10:26,130 Så hvis jeg rekompilere dette som gjør flyter 2, og nå flyter to, får jeg det samme 230 00:10:26,130 --> 00:10:27,020 svarer, så vel. 231 00:10:27,020 --> 00:10:29,640 >> Så dette er en ganske konstruert eksempel å løse dette problemet 232 00:10:29,640 --> 00:10:31,400 ved å innføre casting. 233 00:10:31,400 --> 00:10:34,410 Men generelt, er casting kommer til å være en kraftig ting, spesielt for 234 00:10:34,410 --> 00:10:38,180 Problemet satt to i en ukes tid, når du ønsker å konvertere en datatype til 235 00:10:38,180 --> 00:10:41,800 hverandre at på slutten av dagen representeres på tilsvarende måte. 236 00:10:41,800 --> 00:10:44,970 På slutten av dagen, hver eneste ting vi har snakket om så langt er 237 00:10:44,970 --> 00:10:46,710 bare ints under panseret. 238 00:10:46,710 --> 00:10:48,950 Eller hvis det er for lavt nivå for du, de er bare tall 239 00:10:48,950 --> 00:10:49,750 under hetten. 240 00:10:49,750 --> 00:10:52,850 Selv tegn, igjen, husker fra uke null, er tall 241 00:10:52,850 --> 00:10:53,990 under hetten. 242 00:10:53,990 --> 00:10:57,240 >> Det vil si, vi kan konvertere mellom ulike typer tall hvis 243 00:10:57,240 --> 00:10:58,060 de er bare biter. 244 00:10:58,060 --> 00:11:01,020 Vi kan konvertere mellom tall og bokstaver hvis de er bare 245 00:11:01,020 --> 00:11:02,580 biter, og vice versa. 246 00:11:02,580 --> 00:11:07,170 Og støping på denne måten er en mekanisme i programmering som lar deg tvangsflyttet 247 00:11:07,170 --> 00:11:10,970 endre en datatype til en annen. 248 00:11:10,970 --> 00:11:14,570 Dessverre er dette ikke så enkelt som jeg kan ha likt. 249 00:11:14,570 --> 00:11:19,220 >> Jeg kommer til å gå tilbake til flottører 1, som var enklere, mer 250 00:11:19,220 --> 00:11:22,830 grei en med 0,0 lagt på hver. 251 00:11:22,830 --> 00:11:25,260 Og akkurat som en rask repetisjon, la meg gå videre og rekompilere 252 00:11:25,260 --> 00:11:27,670 dette, må flyter 2 - 253 00:11:27,670 --> 00:11:30,300 beklager, dette gjør flyter en. 254 00:11:30,300 --> 00:11:32,050 Og nå skal vi kjøre flyter en. 255 00:11:32,050 --> 00:11:34,810 Og i bunnen, merker at jeg faktisk får 0,1. 256 00:11:34,810 --> 00:11:36,165 Så løste problemet. 257 00:11:36,165 --> 00:11:37,280 >> Men ikke ennå. 258 00:11:37,280 --> 00:11:40,000 Jeg er nå kommer til å bli litt nysgjerrig, og jeg kommer til å gå tilbake til min 259 00:11:40,000 --> 00:11:41,620 printf uttalelse og si, vet du hva? 260 00:11:41,620 --> 00:11:44,090 Jeg vil gjerne bekrefte at dette er virkelig en tidel. 261 00:11:44,090 --> 00:11:47,890 Og jeg kommer til å ønske å se dette til, si, fem desimaler. 262 00:11:47,890 --> 00:11:48,570 Det er ikke et problem. 263 00:11:48,570 --> 00:11:52,020 Jeg endre to til fem, Jeg rekompilere med make. 264 00:11:52,020 --> 00:11:53,770 Jeg kjøre det som flyter en. 265 00:11:53,770 --> 00:11:54,990 Ser ganske bra. 266 00:11:54,990 --> 00:11:58,570 Min forstand sjekker kan ende der, men Jeg får en litt mer spennende. 267 00:11:58,570 --> 00:12:00,330 Jeg kommer til å forandre 0,5 til 0,10. 268 00:12:00,330 --> 00:12:03,440 Jeg vil se 10 sifre etter desimalplassen. 269 00:12:03,440 --> 00:12:09,060 >> Og jeg kommer til å gå videre og rekompilere dette og kjør flyter en. 270 00:12:09,060 --> 00:12:13,060 Jeg slags anger etter å ha testet dette videre fordi min matte er ikke så 271 00:12:13,060 --> 00:12:14,320 korrigere lenger, synes det. 272 00:12:14,320 --> 00:12:15,630 Men vent litt, kanskje det er bare et lykketreff. 273 00:12:15,630 --> 00:12:17,810 Kanskje maskinen opptrer litt rart. 274 00:12:17,810 --> 00:12:21,810 La meg gå videre og gjøre 20 desimaler og forsikre meg om at jeg vet 275 00:12:21,810 --> 00:12:22,540 hvordan du gjør regnestykket. 276 00:12:22,540 --> 00:12:23,460 Jeg vet hvordan man programmerer. 277 00:12:23,460 --> 00:12:26,960 Gjør flyter 1, rekompilere, og faen. 278 00:12:26,960 --> 00:12:31,110 Det er virkelig, virkelig får langt fra mark. 279 00:12:31,110 --> 00:12:32,490 >> Så hva er det som skjer her? 280 00:12:32,490 --> 00:12:36,050 Intuitivt, basert på våre forutsetninger tidligere om størrelsen på datatyper, 281 00:12:36,050 --> 00:12:38,040 hva som må skje her under panseret? 282 00:12:38,040 --> 00:12:39,290 Yeah? 283 00:12:39,290 --> 00:12:43,000 284 00:12:43,000 --> 00:12:43,590 Nettopp. 285 00:12:43,590 --> 00:12:46,480 Hvis du ønsker dette mye presisjon, og det er en pokker for mye presisjon - 286 00:12:46,480 --> 00:12:48,770 20 tall etter desimaltegnet. 287 00:12:48,770 --> 00:12:51,990 Du kan umulig representere en vilkårlig antall mindre du har en 288 00:12:51,990 --> 00:12:52,930 vilkårlig antall bits. 289 00:12:52,930 --> 00:12:54,190 Men vi gjør ikke det. 290 00:12:54,190 --> 00:12:57,200 For en dupp, vi har bare 32 bits. 291 00:12:57,200 --> 00:13:02,260 >> Så hvis 32 biter bare kan permuteres i en måte - akkurat som våre mennesker på, scene 292 00:13:02,260 --> 00:13:05,780 hendene opp eller ned - i et endelig antall måter, det er bare et endelig antall 293 00:13:05,780 --> 00:13:08,640 av reelle tall kan du representere med disse bitene. 294 00:13:08,640 --> 00:13:10,500 Og så maskinen til slutt er nødt til å 295 00:13:10,500 --> 00:13:11,730 begynne å kutte hjørner. 296 00:13:11,730 --> 00:13:15,500 Datamaskinen kan skjule disse detaljene fra oss for litt tid. 297 00:13:15,500 --> 00:13:18,880 Men hvis vi begynner poking på tallene og ser lenger og lenger på 298 00:13:18,880 --> 00:13:23,220 etterfølgende tall i hele tall, så vi begynner å se at det er 299 00:13:23,220 --> 00:13:26,480 faktisk tilnærmet den Ideen om en tidel. 300 00:13:26,480 --> 00:13:29,860 >> Og så viser det seg, tragisk, det er et uendelig antall tall 301 00:13:29,860 --> 00:13:35,060 vi kan ikke representere nettopp i en datamaskin, i det minste med et endelig 302 00:13:35,060 --> 00:13:38,030 antall biter, en endelig mengden RAM. 303 00:13:38,030 --> 00:13:41,210 Nå dessverre, dette noen ganger har reelle konsekvenser. 304 00:13:41,210 --> 00:13:45,980 Hvis folk ikke helt setter pris på dette eller slags ta for gitt det faktum 305 00:13:45,980 --> 00:13:48,310 at deres datamaskin vil bare gjøre det de forteller det de skal gjøre og ikke 306 00:13:48,310 --> 00:13:51,430 forstå disse underliggende representasjon detaljer - 307 00:13:51,430 --> 00:13:55,290 som oppriktig, i noen språk er skjult for brukeren, i motsetning til i C - 308 00:13:55,290 --> 00:13:56,500 noen dårlige ting kan skje. 309 00:13:56,500 --> 00:13:58,650 >> Og det jeg trodde vi ville gjøre er å ta et skritt tilbake. 310 00:13:58,650 --> 00:14:00,420 Og dette dreier seg om en åtte minutters video. 311 00:14:00,420 --> 00:14:04,200 Den ble sendt for noen år siden, og det gir innsikt i faktisk hva som kan gå 312 00:14:04,200 --> 00:14:09,290 galt når du under-verdsette disse typer detaljer i svært altfor 313 00:14:09,290 --> 00:14:10,080 virkelige verden. 314 00:14:10,080 --> 00:14:12,965 Hvis vi kunne dempe lysene i noen minutter. 315 00:14:12,965 --> 00:14:14,360 >> SPEAKER 1: Vi vender nå tilbake til prosjektering 316 00:14:14,360 --> 00:14:17,160 katastrofer på Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Datamaskiner - 318 00:14:18,680 --> 00:14:21,340 vi har alle kommet å akseptere ofte frustrerende problemer 319 00:14:21,340 --> 00:14:23,170 som går med dem. 320 00:14:23,170 --> 00:14:27,570 Bugs, virus og programvare glitches er en liten pris å betale for 321 00:14:27,570 --> 00:14:28,960 bekvemmelighet. 322 00:14:28,960 --> 00:14:32,040 Men i high-tech og high-speed militære og romprogram 323 00:14:32,040 --> 00:14:38,650 applikasjoner, den minste problemet kan foredles til katastrofe. 324 00:14:38,650 --> 00:14:44,480 >> 4. juni 1996, utarbeidet forskerne å lansere en ubemannet Ariane 5-raketten. 325 00:14:44,480 --> 00:14:48,700 Det var bærer vitenskapelige satellitter designet for å etablere nøyaktig hvordan 326 00:14:48,700 --> 00:14:53,250 Jordens magnetfelt samhandler med solvind. 327 00:14:53,250 --> 00:14:57,540 Raketten ble bygget for det europeiske Space Agency og tok av fra sin 328 00:14:57,540 --> 00:14:59,906 anlegget på kysten av Fransk Guyana. 329 00:14:59,906 --> 00:15:03,660 >> JACK GANSSLE: På ca 37 sekunder inn flyturen, de først lagt merke til 330 00:15:03,660 --> 00:15:04,910 noe gikk galt. 331 00:15:04,910 --> 00:15:08,130 Dysene ble svingbar i en måte de egentlig ikke burde. 332 00:15:08,130 --> 00:15:12,380 Rundt 40 sekunder inn i fly, klart kjøretøyet var i trøbbel. 333 00:15:12,380 --> 00:15:14,400 Og det er da de gjorde en Beslutningen om å ødelegge det. 334 00:15:14,400 --> 00:15:18,520 Utvalget verneleder, med enorm guts, trykket på knappen, 335 00:15:18,520 --> 00:15:23,900 blåste opp raketten før det kunne bli en fare for offentlig sikkerhet. 336 00:15:23,900 --> 00:15:27,810 >> SPEAKER 1: Dette var jomfruturen av Ariane 5, og dens ødeleggelse 337 00:15:27,810 --> 00:15:32,020 fant sted på grunn av en feil innebygd i raketten sin programvare. 338 00:15:32,020 --> 00:15:33,980 >> JACK GANSSLE: Problemet på Ariane var at det var et nummer 339 00:15:33,980 --> 00:15:36,390 som krevde 64 bits til å uttrykke. 340 00:15:36,390 --> 00:15:39,420 Og de ønsket å konvertere til et 16-bits nummer. 341 00:15:39,420 --> 00:15:43,130 De antok at tallet var aldri kommer til å bli veldig stor, at de fleste av 342 00:15:43,130 --> 00:15:46,810 disse sifrene i 64-bit nummer var nuller. 343 00:15:46,810 --> 00:15:48,270 De var galt. 344 00:15:48,270 --> 00:15:51,380 >> SPEAKER 1: Manglende evne ett programvare program for å ta imot den type 345 00:15:51,380 --> 00:15:55,350 tall generert av en annen var ved roten av svikt. 346 00:15:55,350 --> 00:15:59,970 Programvareutvikling hadde blitt en svært kostbare delen av ny teknologi. 347 00:15:59,970 --> 00:16:03,980 Ariane 4 raketten hadde vært veldig vellykket, så mye av programvaren 348 00:16:03,980 --> 00:16:07,480 opprettet for det var også brukes i Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP Coyle: Det grunnleggende problemet var at Ariane 5 var raskere, 350 00:16:11,980 --> 00:16:13,720 akselerert raskere. 351 00:16:13,720 --> 00:16:17,250 Og programvaren hadde ikke stod for det. 352 00:16:17,250 --> 00:16:20,770 >> SPEAKER 1: Ødeleggelsen av raketten var en stor økonomisk katastrofe, 353 00:16:20,770 --> 00:16:24,200 alt på grunn av en liten software-feil. 354 00:16:24,200 --> 00:16:27,820 Men dette var ikke første gang data konvertering problemer hadde plaget moderne 355 00:16:27,820 --> 00:16:30,620 rakett-teknologi. 356 00:16:30,620 --> 00:16:34,480 >> JACK GANSSLE: I 1991, med start av den første Gulf-krigen, Patriot 357 00:16:34,480 --> 00:16:38,610 rakett opplevd en lignende type av et nummer konvertering problem. 358 00:16:38,610 --> 00:16:44,910 Som et resultat ble 28 amerikanske soldater drept og rundt 100 andre såret 359 00:16:44,910 --> 00:16:48,600 når Patriot, som skulle for å beskytte mot innkommende scuds, 360 00:16:48,600 --> 00:16:51,630 ikke klarte å fyre av en rakett. 361 00:16:51,630 --> 00:16:55,110 >> SPEAKER 1: Når Irak invaderte Kuwait og America lanserte Desert Storm i 362 00:16:55,110 --> 00:17:00,570 1991 tidlig, Patriot missilbatteriene ble utplassert for å beskytte Saudi Arabia 363 00:17:00,570 --> 00:17:04,760 og Israel fra irakiske Scud rakettangrep. 364 00:17:04,760 --> 00:17:09,720 The Patriot er en amerikansk medium-range overflate-til-luft-system produsert ved 365 00:17:09,720 --> 00:17:11,569 Raytheon selskapet. 366 00:17:11,569 --> 00:17:16,410 >> THEODORE POSTOL: Størrelsen på Patriot interceptor selv er omtrent 367 00:17:16,410 --> 00:17:17,710 20 meter lang. 368 00:17:17,710 --> 00:17:20,800 Og den veier ca 2000 pounds. 369 00:17:20,800 --> 00:17:22,940 Og det bærer et stridshode av om - 370 00:17:22,940 --> 00:17:24,905 Jeg tror det er rundt 150 pounds. 371 00:17:24,905 --> 00:17:31,030 Og stridshodet i seg selv er en høy eksplosiv som har 372 00:17:31,030 --> 00:17:33,270 fragmenter rundt det. 373 00:17:33,270 --> 00:17:37,490 Dekselet av stridshodet er utformet å opptre som haggel. 374 00:17:37,490 --> 00:17:40,720 >> SPEAKER 1: Rakettene er gjennomført fire per container og fraktes 375 00:17:40,720 --> 00:17:43,050 av en semitrailer. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP Coyle: The Patriot anti-missil Systemet går tilbake på 377 00:17:47,490 --> 00:17:50,710 minst 20 år nå. 378 00:17:50,710 --> 00:17:54,350 Det ble opprinnelig utviklet som et luftforsvar rakett til 379 00:17:54,350 --> 00:17:56,190 skyte ned fiendtlige fly. 380 00:17:56,190 --> 00:18:02,490 I den første Gulf-krigen, da den krigen kom, ville hæren til å bruke den 381 00:18:02,490 --> 00:18:05,535 å skyte ned scuds, ikke fly. 382 00:18:05,535 --> 00:18:09,310 Den irakiske luftforsvaret var ikke så mye av 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 prøvde å oppgradere Patriot. 385 00:18:15,950 --> 00:18:18,750 >> SPEAKER 1: Avskjære en fiende rakett reiser på mach fem var 386 00:18:18,750 --> 00:18:20,890 kommer til å være utfordrende nok. 387 00:18:20,890 --> 00:18:25,590 Men da Patriot ble stormet inn service, var hæren ikke klar over en 388 00:18:25,590 --> 00:18:31,710 Irakiske modifikasjon som gjorde sitt Scuds nesten umulig å treffe. 389 00:18:31,710 --> 00:18:35,240 >> THEODORE POSTOL: Hva skjedde er de scuds som var 390 00:18:35,240 --> 00:18:36,570 kommer i var ustabil. 391 00:18:36,570 --> 00:18:37,532 De ble vingler. 392 00:18:37,532 --> 00:18:43,220 Grunnen til dette var irakere, i For å få 600 kilometer ut av en 393 00:18:43,220 --> 00:18:47,530 300-kilometer-range rakett, tok vekt ut av foran stridshode. 394 00:18:47,530 --> 00:18:49,290 De gjorde stridshodet lettere. 395 00:18:49,290 --> 00:18:53,110 Så nå Patriot prøver å komme på Scud. 396 00:18:53,110 --> 00:18:56,470 Og mesteparten av tiden, den overveldende mesteparten av tiden, ville det bare 397 00:18:56,470 --> 00:18:58,730 fly av Scud. 398 00:18:58,730 --> 00:19:01,760 >> SPEAKER 1: Når Patriot-systemet operatører innså Patriot savnet 399 00:19:01,760 --> 00:19:06,690 sitt mål, detonerte de Patriots stridshode for å unngå mulig 400 00:19:06,690 --> 00:19:10,300 tap hvis det ble tillatt å falle til bakken. 401 00:19:10,300 --> 00:19:14,540 >> THEODORE POSTOL: Det var det mest folk så som store ildkuler på himmelen 402 00:19:14,540 --> 00:19:20,350 og misforstått som avskjærer av Scud-stridshoder. 403 00:19:20,350 --> 00:19:23,320 >> SPEAKER 1: Selv i natt himmelen Patrioter syntes å være vellykket 404 00:19:23,320 --> 00:19:27,530 ødelegge scuds, i Dhahran det kunne være noen feil om sin 405 00:19:27,530 --> 00:19:29,140 ytelse. 406 00:19:29,140 --> 00:19:34,180 Der mistet Patriot radar system spore av et innkommende Scud og aldri 407 00:19:34,180 --> 00:19:36,380 startes på grunn av et programvare feil. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Det var israelerne som først oppdaget at jo lenger systemet 410 00:19:42,700 --> 00:19:48,020 var, jo større tidsavviket ble på grunn av en klokke 411 00:19:48,020 --> 00:19:50,470 innebygd i systemet datamaskin. 412 00:19:50,470 --> 00:19:54,640 >> JACK GANSSLE: Om to uker før tragedien i Dhahran, israelerne 413 00:19:54,640 --> 00:19:58,440 rapporteres til Forsvarsdepartementet at systemet var å miste tid. 414 00:19:58,440 --> 00:20:01,280 Etter ca åtte timer med løping, de la merke til at systemet er 415 00:20:01,280 --> 00:20:03,530 bli merkbart mindre nøyaktig. 416 00:20:03,530 --> 00:20:07,710 Forsvarsdepartementet svarte med fortelle alle Patriot batterier 417 00:20:07,710 --> 00:20:10,500 å ikke la systemene på i lang tid. 418 00:20:10,500 --> 00:20:12,430 De har aldri sagt hva en lang tid var. 419 00:20:12,430 --> 00:20:13,330 Åtte 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 visste. 423 00:20:17,150 --> 00:20:20,220 >> SPEAKER 1: The Patriot batteri stasjonert ved brakkene på Dhahran 424 00:20:20,220 --> 00:20:24,660 og dens mangelfulle interne klokke hadde vært på over 100 timer på natten av 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øyaktighet av omtrent en tiendedel av et sekund. 427 00:20:31,770 --> 00:20:34,480 Nå er en tiendedel av et sekund en interessant tall fordi det ikke kan være 428 00:20:34,480 --> 00:20:39,940 uttrykt i binære nøyaktig, noe som betyr det kan ikke uttrykkes nøyaktig 429 00:20:39,940 --> 00:20:42,500 alle moderne digitale datamaskin. 430 00:20:42,500 --> 00:20:46,920 Det er vanskelig å tro, men bruke dette som et eksempel. 431 00:20:46,920 --> 00:20:49,000 La oss ta nummer én tredjedel. 432 00:20:49,000 --> 00:20:53,150 En tredjedel kan ikke uttrykkes i desimal nøyaktig. 433 00:20:53,150 --> 00:20:57,500 En tredjedel er 0.333 kommer på for uendelig. 434 00:20:57,500 --> 00:21:02,270 Det er ingen måte å gjøre det med absolutt nøyaktighet i desimal. 435 00:21:02,270 --> 00:21:05,370 Det er akkurat samme type problem som skjedde i Patriot. 436 00:21:05,370 --> 00:21:09,880 Jo lenger systemet løp, den verste tiden feilen ble. 437 00:21:09,880 --> 00:21:13,840 >> SPEAKER 1: Etter 100 timers drift, feilen i tiden var bare 438 00:21:13,840 --> 00:21:16,140 om lag en tredjedel av et sekund. 439 00:21:16,140 --> 00:21:20,800 Men i form av rettet mot en rakett reiser på mach fem, resulterte det i 440 00:21:20,800 --> 00:21:24,410 en relativ volatilitet på over 600 meter. 441 00:21:24,410 --> 00:21:27,670 Det ville være en fatal feil for soldatene ved Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> THEODORE POSTOL: Hva har skjedd er en Scud lanseringen ble oppdaget av tidlig 443 00:21:33,450 --> 00:21:34,280 advarsel satellitter. 444 00:21:34,280 --> 00:21:38,550 Og de visste at Scud kom i deres generelle retning. 445 00:21:38,550 --> 00:21:41,000 De visste ikke hvor det kom. 446 00:21:41,000 --> 00:21:43,900 >> SPEAKER 1: Nå var det opp til radaren komponent av Patriot-systemet 447 00:21:43,900 --> 00:21:48,910 forsvare Dhahran å finne og holde spore av den innkommende fiendtlige missiler. 448 00:21:48,910 --> 00:21:50,580 >> JACK GANSSLE: Radaren var veldig smart. 449 00:21:50,580 --> 00:21:53,770 Det ville faktisk spore posisjonen til den Scud og deretter forutsi hvor det 450 00:21:53,770 --> 00:21:57,160 sannsynligvis ville være den neste gang radaren sendte en puls ut. 451 00:21:57,160 --> 00:21:58,870 Som ble kalt området gate. 452 00:21:58,870 --> 00:22:04,020 >> THEODORE POSTOL: Så når Patriot bestemmer nok tid har gått til å gå 453 00:22:04,020 --> 00:22:09,420 tilbake og sjekke neste sted for dette oppdagede objektet, går den tilbake. 454 00:22:09,420 --> 00:22:14,450 Så når det gikk tilbake til feil sted, ser det da ingen objekt. 455 00:22:14,450 --> 00:22:18,200 Og det bestemmer seg for at det var ingen objekt, det var en falsk deteksjon, og 456 00:22:18,200 --> 00:22:19,680 synker sporet. 457 00:22:19,680 --> 00:22:22,970 >> SPEAKER 1: Den innkommende Scud forsvant fra radarskjermen, og 458 00:22:22,970 --> 00:22:26,050 sekunder senere slengte inn i brakkene. 459 00:22:26,050 --> 00:22:31,950 The Scud drepte 28 og var den siste som sparken under den første Gulf-krigen. 460 00:22:31,950 --> 00:22:37,700 Tragisk nok kom den oppdaterte programvaren på Dhahran dagen etter. 461 00:22:37,700 --> 00:22:41,800 Programvaren feilen hadde blitt fikset, lukker ett kapittel i den urolige 462 00:22:41,800 --> 00:22:43,690 Historien om Patriot raketter. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot er faktisk et akronym for Gradvis Array sporing 465 00:22:50,710 --> 00:22:51,960 Skjæringspunktet av Target. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J MALAN: Greit, så en tankevekkende eksempel, for å være sikker. 468 00:23:00,840 --> 00:23:03,430 Og heldigvis, disse lavere nivå bugs er ikke noe som vi vil 469 00:23:03,430 --> 00:23:06,220 vanligvis nødt til å sette pris på, sikkert ikke med noen av våre 470 00:23:06,220 --> 00:23:07,360 tidligste av programmer. 471 00:23:07,360 --> 00:23:10,450 Heller, de fleste av feilene du vil møte vil være logisk i naturen, 472 00:23:10,450 --> 00:23:12,900 syntaktisk i naturen der koden virker bare ikke riktig. 473 00:23:12,900 --> 00:23:14,140 Og du vet ordet av det ganske fort. 474 00:23:14,140 --> 00:23:16,850 >> Men spesielt når vi kommer til slutten av semesteret, det kommer til å 475 00:23:16,850 --> 00:23:20,620 blitt mer og mer av en mulighet for å virkelig tenke hardt om design 476 00:23:20,620 --> 00:23:22,960 av programmene og den underliggende representasjon 477 00:23:22,960 --> 00:23:24,520 der også, av dataene. 478 00:23:24,520 --> 00:23:28,010 For eksempel, vil vi introdusere MySQL, som er en populær database motoren 479 00:23:28,010 --> 00:23:30,850 som du kan bruke med nettsteder for å lagre data på bakenden. 480 00:23:30,850 --> 00:23:34,630 Og du må begynne å bestemme på slutten av semesteret ikke bare hva 481 00:23:34,630 --> 00:23:38,790 typer data langs disse linjene til å bruke men nøyaktig hvor mange biter å bruke, 482 00:23:38,790 --> 00:23:42,740 om du ønsker å lagre datoer som datoer og klokkeslett som ganger, og også 483 00:23:42,740 --> 00:23:46,890 ting som hvor stor du vil at unike IDer til å være for, sier, brukerne 484 00:23:46,890 --> 00:23:47,680 i databasen. 485 00:23:47,680 --> 00:23:51,210 >> Faktisk, hvis noen av dere har hatt Facebook står for en stund, 486 00:23:51,210 --> 00:23:53,680 og du vet hvordan du får tilgang til din bruker-ID - 487 00:23:53,680 --> 00:23:57,930 som viser noen ganger opp i din profilens URL mindre du har valgt en 488 00:23:57,930 --> 00:24:02,070 kallenavn for URL, eller hvis du har brukte Facebooks Graf API, den 489 00:24:02,070 --> 00:24:05,510 offentlig tilgjengelig API som du kan be Facebook for rådata - 490 00:24:05,510 --> 00:24:07,580 du kan se hva din numerisk ID er. 491 00:24:07,580 --> 00:24:10,880 Og for noen år siden, Facebook hovedsak måtte endre fra å bruke 492 00:24:10,880 --> 00:24:15,980 tilsvarende ints å bruke lang lenge fordi over tid som brukerne kommer 493 00:24:15,980 --> 00:24:19,780 og gå og lage masse kontoer og falske kontoer, selv de er veldig lett 494 00:24:19,780 --> 00:24:24,630 var i stand til å eksos noe som en 4 milliarder mulig verdi som en int. 495 00:24:24,630 --> 00:24:28,340 >> Så mer på slike saker nedover veien, så vel. 496 00:24:28,340 --> 00:24:30,750 All right, så det var avstøpning. 497 00:24:30,750 --> 00:24:31,670 Det var imprecision. 498 00:24:31,670 --> 00:24:32,730 Et par korte beskjeder. 499 00:24:32,730 --> 00:24:35,710 Så deler formelt begynner førstkommende Søndag, mandag, tirsdag. 500 00:24:35,710 --> 00:24:39,080 Du vil høre via e-post senere denne uken som til seksjon oppdrag. 501 00:24:39,080 --> 00:24:42,570 Og du vil også her på det punktet hvor å endre delen hvis din 502 00:24:42,570 --> 00:24:45,660 planen er nå endret eller komfortnivå er nå endret. 503 00:24:45,660 --> 00:24:49,380 I mellomtiden P-set ett og hacker man er på grunn av dette torsdag med mulighet til å 504 00:24:49,380 --> 00:24:52,450 forlenge denne fristen per spesifikasjonene til fredag 505 00:24:52,450 --> 00:24:53,830 i en typisk måte. 506 00:24:53,830 --> 00:24:57,500 >> Innse at følger med problemet sett spesifikasjonene er instruksjoner om 507 00:24:57,500 --> 00:25:02,770 hvordan du bruker CS50 apparatet, må man, samt noen CS50 spesifikke verktøy 508 00:25:02,770 --> 00:25:06,540 som 50 stil, noe som kan gi deg med tilbakemeldinger dynamisk på 509 00:25:06,540 --> 00:25:10,230 kvaliteten på koden din stil og også sjekk 50, noe som kan gi deg 510 00:25:10,230 --> 00:25:13,160 dynamisk tilbakemelding på din koden er korrekt. 511 00:25:13,160 --> 00:25:16,850 Tilgi at vi fremdeles stryking ut noen få floker med sjekk 50. 512 00:25:16,850 --> 00:25:21,490 Noen av dine klassekamerater som fikk starte rundt fire AM fredag ​​kveld da 513 00:25:21,490 --> 00:25:25,130 spec gikk opp har lagt merke til siden da noen bugs som vi jobber 514 00:25:25,130 --> 00:25:29,010 gjennom, og unnskyldninger for alle som har opplevd utilbørlig frustrasjoner. 515 00:25:29,010 --> 00:25:30,340 Feilen er min. 516 00:25:30,340 --> 00:25:34,080 Men vi vil følge opp CS50 diskutere når det er løst. 517 00:25:34,080 --> 00:25:35,700 >> Så et ord på score selv. 518 00:25:35,700 --> 00:25:38,990 Så det blir en uke eller to før du begynner å få tilbakemelding på oppgavesett 519 00:25:38,990 --> 00:25:40,640 fordi du ennå ikke har en pedagogisk fyr. 520 00:25:40,640 --> 00:25:44,510 Og selv da vil vi begynne å vurdere C problemet setter før vi 521 00:25:44,510 --> 00:25:46,970 gå tilbake og vurdere scratch så at du får mer relevant 522 00:25:46,970 --> 00:25:48,150 tilbakemeldinger raskere. 523 00:25:48,150 --> 00:25:51,870 Men generelt per pensum, CS50 oppgavesett evalueres langs 524 00:25:51,870 --> 00:25:53,580 etter fire akser - 525 00:25:53,580 --> 00:25:55,760 omfang, riktighet, design og stil. 526 00:25:55,760 --> 00:25:59,210 >> Omfang kommer til å være en rekke typisk mellom null og fem som 527 00:25:59,210 --> 00:26:01,830 fanger opp hvor mye av brikke som du bet av. 528 00:26:01,830 --> 00:26:03,750 Vanligvis vil du at dette skal være fem. 529 00:26:03,750 --> 00:26:05,300 Du i det minste prøvd alt. 530 00:26:05,300 --> 00:26:09,330 Og legg merke til det er en multiplikativ faktor så at å gjøre bare en del av 531 00:26:09,330 --> 00:26:12,520 oppgavesettet er ikke den beste strategien. 532 00:26:12,520 --> 00:26:15,610 >> I mellomtiden, mer opplagt er viktigheten av korrekthet - 533 00:26:15,610 --> 00:26:18,620 bare er programmet riktig med respekt til spesifikasjonen? 534 00:26:18,620 --> 00:26:21,510 Dette er vektet bevisst mer tyngre enn de andre to akser ved en 535 00:26:21,510 --> 00:26:24,450 faktor på tre fordi vi anerkjenner som vanligvis du kommer til å tilbringe en 536 00:26:24,450 --> 00:26:28,600 mye mer tid jage ned noen bugs, å få koden til å fungere, så du 537 00:26:28,600 --> 00:26:31,540 er innrykk den og velge hensiktsmessige variabelnavn og 538 00:26:31,540 --> 00:26:33,800 som, er som i den andre enden av spekteret av stilen. 539 00:26:33,800 --> 00:26:36,160 >> Det er ikke å si stilen er ikke viktig, og vi vil forkynne det over 540 00:26:36,160 --> 00:26:37,920 tid både i forelesninger og i seksjoner. 541 00:26:37,920 --> 00:26:40,520 Stil refererer til estetikk av koden din. 542 00:26:40,520 --> 00:26:43,980 Har du valgt godt navngitte variabler som er korte, men noe 543 00:26:43,980 --> 00:26:44,680 beskrivende? 544 00:26:44,680 --> 00:26:47,840 Er koden innrykket som du har sett i forelesning og på en måte som er forenlig 545 00:26:47,840 --> 00:26:49,070 med stil 50? 546 00:26:49,070 --> 00:26:51,220 >> Endelig er designet rett der i midten. 547 00:26:51,220 --> 00:26:54,090 Design er det vanskeligere en å sette en fingeren på fordi det er mye mer 548 00:26:54,090 --> 00:26:55,000 subjektiv. 549 00:26:55,000 --> 00:26:58,610 Men det er kanskje det viktigste av de tre aksene i form av pedagogisk 550 00:26:58,610 --> 00:27:02,050 verdi over tid, og at dette vil være undervisningen stipendiat mulighet til å 551 00:27:02,050 --> 00:27:04,110 gi deg kvalitative tilbakemeldinger. 552 00:27:04,110 --> 00:27:08,100 Faktisk, i CS50 selv om vi har disse formlene og score, på slutten 553 00:27:08,100 --> 00:27:11,350 av dagen disse er meget bevisst svært små bøtter - punkt verdier 554 00:27:11,350 --> 00:27:13,460 mellom null og tre og null og fem. 555 00:27:13,460 --> 00:27:17,800 Vi prøver ikke å trekke svært grove linjer mellom oppgavesett eller mellom 556 00:27:17,800 --> 00:27:21,490 studenter, men heller fokusere så mye som vi kan på en kvalitativ, longhand 557 00:27:21,490 --> 00:27:25,490 tilbakemeldinger, enten skrevet eller muntlig fra din spesielle undervisningen stipendiat, 558 00:27:25,490 --> 00:27:27,050 du får vite ganske godt. 559 00:27:27,050 --> 00:27:32,340 >> Men generelt, de er vektene at de ulike akser må. 560 00:27:32,340 --> 00:27:35,480 I mellomtiden også, det er verdt å holde i oppmerksom på at du ikke bør anta at en 561 00:27:35,480 --> 00:27:38,870 tre ut av fem er en 60% og derfor grovt sviktende. 562 00:27:38,870 --> 00:27:41,410 Tre er bevisst ment å være liksom midt i veien godt. 563 00:27:41,410 --> 00:27:43,480 Hvis du får treere på begynnelsen av semesteret, det er 564 00:27:43,480 --> 00:27:46,340 faktisk ment å være en god sted å begynne. 565 00:27:46,340 --> 00:27:50,510 Hvis du får toere, messer, er det definitivt en del arbeid å betale litt 566 00:27:50,510 --> 00:27:53,250 mer oppmerksomhet, for å dra nytte av seksjoner og kontortid. 567 00:27:53,250 --> 00:27:54,590 >> Hvis du får firere og femmere, flott. 568 00:27:54,590 --> 00:27:57,430 Men egentlig, håper vi å se baner blant elevene - veldig 569 00:27:57,430 --> 00:28:00,575 individualisert per student, men starter semesteret her i form av 570 00:28:00,575 --> 00:28:04,100 de to til tre rekkevidde men slutter her oppe i 4-5 serien. 571 00:28:04,100 --> 00:28:05,440 Det er det vi virkelig ser etter. 572 00:28:05,440 --> 00:28:09,590 Og vi gjør oppmerksom på deltaet som du viser mellom uke null og uke 573 00:28:09,590 --> 00:28:12,170 12 når jeg gjør karakterer. 574 00:28:12,170 --> 00:28:16,380 Det spiller ingen rolle for oss helt hvordan du rettferdig i begynnelsen hvis 575 00:28:16,380 --> 00:28:19,330 banen er faktisk oppover og sterk. 576 00:28:19,330 --> 00:28:24,000 >> Akademisk redelighet - så la meg sette på min mer alvorlig stemme for bare et øyeblikk. 577 00:28:24,000 --> 00:28:28,510 Så dette kurset har æren av sende flere studenter enn noen annen 578 00:28:28,510 --> 00:28:30,950 i historien til annonsen styret, tror jeg. 579 00:28:30,950 --> 00:28:34,220 Vi har liksom mistet tellingen på dette poenget med hvor ofte dette skjer. 580 00:28:34,220 --> 00:28:37,090 Og det er ikke fordi elevene i 50 er noe mer uærlig enn deres 581 00:28:37,090 --> 00:28:38,690 klassekamerater andre steder. 582 00:28:38,690 --> 00:28:42,800 Men innser også at vi er veldig flinke på å oppdage denne typen ting. 583 00:28:42,800 --> 00:28:45,920 >> Og det er en fordel at en informatikk klasse har ved at vi 584 00:28:45,920 --> 00:28:49,110 kan og vi sammenligne alle studenter Problemet setter parvis mot alle 585 00:28:49,110 --> 00:28:51,470 andre, ikke bare i år men alle tidligere år. 586 00:28:51,470 --> 00:28:55,080 Vi har muligheten, som elevene i klassen, Google og å finne koden 587 00:28:55,080 --> 00:28:57,440 på nettsteder som github og diskusjonsfora. 588 00:28:57,440 --> 00:29:00,840 Det er absolutt løsninger til CS50 er p-sett flytende rundt der. 589 00:29:00,840 --> 00:29:02,710 Men hvis du kan finne dem, vi kan finne dem. 590 00:29:02,710 --> 00:29:07,130 Og alt dette er veldig mye automatisert og lett og trist for oss å finne. 591 00:29:07,130 --> 00:29:10,990 >> Men jeg vil understreke, også, at Kursets faglige ærlighet politikk er 592 00:29:10,990 --> 00:29:13,960 meget ment å være svært mye det motsatte av denne ånden. 593 00:29:13,960 --> 00:29:17,506 Ja, dette året vi har omformulert ting i pensum for å være dette, 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 egentlig er å være rimelig. 596 00:29:22,860 --> 00:29:26,160 Vi erkjenner at det er en betydelig mengde pedagogisk 597 00:29:26,160 --> 00:29:30,550 verdi i samarbeidende, i noen grad med klassekamerater, der du 598 00:29:30,550 --> 00:29:33,700 to, eller du tre eller du flere er stående på et hvitt bord 599 00:29:33,700 --> 00:29:35,670 whiteboarding, så å snakke, dine ideer - 600 00:29:35,670 --> 00:29:39,480 skrive ut pseudokode i bilder, diagram hva som bør 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 Hva bør den grådige algoritmen - 603 00:29:43,240 --> 00:29:46,100 hvordan skal det oppføre per Problemet setter en? 604 00:29:46,100 --> 00:29:50,440 >> Og så innser at atferden at vi oppfordrer er veldig 605 00:29:50,440 --> 00:29:51,470 mye langs disse linjene. 606 00:29:51,470 --> 00:29:53,890 Og i pensum, vil du se en hel haug med kuler under en 607 00:29:53,890 --> 00:29:57,740 rimelig kategori og en ikke rimelig kategori som hjelper oss hjelpe 608 00:29:57,740 --> 00:30:00,740 du vikle tankene dine rundt der vi trekke den linjen. 609 00:30:00,740 --> 00:30:04,340 Og generelt, en anstendig tommelfingerregel er at hvis du sliter med å løse 610 00:30:04,340 --> 00:30:07,990 noen feil og din venn eller klassekamerat sitter ved siden av deg, er det 611 00:30:07,990 --> 00:30:11,530 rimelig for deg å vise ham eller henne koden din og si hei, kan du hjelpe 612 00:30:11,530 --> 00:30:13,700 meg å finne ut hva som går galt her? 613 00:30:13,700 --> 00:30:17,110 >> Vi vanligvis ikke omfavne den motsatte side. 614 00:30:17,110 --> 00:30:20,730 Det er ikke et riktig svar for din venn eller klassekamerat her å si, oh, 615 00:30:20,730 --> 00:30:22,510 bare se på mine og tall det ut fra det. 616 00:30:22,510 --> 00:30:24,400 Det er liksom urimelig. 617 00:30:24,400 --> 00:30:27,750 Men å ha noen andre, en annen hjerne, et annet par øyne ser på 618 00:30:27,750 --> 00:30:31,620 skjermen eller se på koden din og si, er du sikker på at du vil 619 00:30:31,620 --> 00:30:32,760 å ha en sløyfe her? 620 00:30:32,760 --> 00:30:34,800 Eller er du sikker på at du vil at semikolon her? 621 00:30:34,800 --> 00:30:37,090 Eller oh, betyr at feilmeldingen dette. 622 00:30:37,090 --> 00:30:39,580 De er svært rimelig og oppmuntret atferd. 623 00:30:39,580 --> 00:30:44,010 >> Sakene som jeg ble berget tidligere koke ned til når elevene er 624 00:30:44,010 --> 00:30:47,350 sent på natten gjør dårlig dømmekraft beslutninger og e-post koden sin for å 625 00:30:47,350 --> 00:30:50,130 noen andre eller bare si: her, er det i Dropbox eller 626 00:30:50,130 --> 00:30:51,610 Googling sent på kvelden. 627 00:30:51,610 --> 00:30:54,880 Og så vil jeg oppfordre og bønnfaller dere, hvis du ikke har disse uunngåelige 628 00:30:54,880 --> 00:30:58,450 øyeblikk av stress, du dytter opp mot fristen, har du ingen sent 629 00:30:58,450 --> 00:31:01,490 dag siden det er allerede fredag ​​på det punkt, email kursets hoder eller 630 00:31:01,490 --> 00:31:02,330 meg direkte. 631 00:31:02,330 --> 00:31:04,790 Si, lytte, jeg er på min bristepunktet her. 632 00:31:04,790 --> 00:31:06,660 La oss ha en samtale og finne det ut. 633 00:31:06,660 --> 00:31:10,400 Ty til nettet eller noen andre ikke rimelig oppførsel er aldri den 634 00:31:10,400 --> 00:31:13,070 løsning, og for mange av din klassekamerater er ikke lenger her på 635 00:31:13,070 --> 00:31:15,150 campus på grunn av at dårlig dømmekraft. 636 00:31:15,150 --> 00:31:17,840 Men det er veldig lett å skjørt den linjen. 637 00:31:17,840 --> 00:31:22,950 >> Og her er et lite bilde for å heie deg opp fra Reddit slik at nå 638 00:31:22,950 --> 00:31:25,720 alt skal være OK. 639 00:31:25,720 --> 00:31:30,210 >> Så en rask oppsummering, da, av der vi slapp. 640 00:31:30,210 --> 00:31:33,690 Så forrige uke, husker at vi innfører forhold, ikke i Scratch 641 00:31:33,690 --> 00:31:34,880 men i c dette tidspunktet. 642 00:31:34,880 --> 00:31:38,300 Og det var noen ny syntaks, men egentlig ingen nye ideer per se. 643 00:31:38,300 --> 00:31:42,630 Vi hadde boolske uttrykk som vi kunne eller sammen med to vertikale 644 00:31:42,630 --> 00:31:46,490 barer eller og sammen med to -tegn, sier at både venstre 645 00:31:46,490 --> 00:31:49,990 og retten må være sant for at dette skal utføre. 646 00:31:49,990 --> 00:31:53,150 Da hadde vi svitsjer, som vi så på kort, men jeg foreslår er virkelig 647 00:31:53,150 --> 00:31:56,830 bare annerledes syntaks for å oppnå samme type mål hvis du vet på 648 00:31:56,830 --> 00:31:59,270 avansere hva dine saker kommer til å være. 649 00:31:59,270 --> 00:32:00,160 >> Vi så på sløyfer. 650 00:32:00,160 --> 00:32:03,340 En for-løkke er kanskje den vanligste, eller i det minste en som folk 651 00:32:03,340 --> 00:32:05,330 typisk nå for instinktivt. 652 00:32:05,330 --> 00:32:08,240 Selv om det ser litt kryptisk, vil du se mange, mange eksempler på dette 653 00:32:08,240 --> 00:32:11,590 før lenge, som du har allerede sent i forrige uke. 654 00:32:11,590 --> 00:32:14,280 Mens sløyfer kan likeledes oppnå det samme. 655 00:32:14,280 --> 00:32:17,550 Men hvis du ønsker å gjøre noen incrementation eller oppdatering av 656 00:32:17,550 --> 00:32:20,230 variable verdier, må du gjøre det mer manuelt enn 657 00:32:20,230 --> 00:32:22,440 for loop tillater før. 658 00:32:22,440 --> 00:32:25,310 Og så er det do-while loop, som tillater oss å gjøre noe på 659 00:32:25,310 --> 00:32:28,460 minst én gang mens noe ellers er sant. 660 00:32:28,460 --> 00:32:31,550 Og dette er spesielt bra for programmer eller for spill hvor du vil 661 00:32:31,550 --> 00:32:33,810 å be brukeren om noe minst en gang. 662 00:32:33,810 --> 00:32:37,110 Og hvis han eller hun ikke samarbeider, kan det være lurt å gjøre det 663 00:32:37,110 --> 00:32:38,420 igjen og igjen. 664 00:32:38,420 --> 00:32:41,270 >> Med variabler, i mellomtiden, hadde vi linjer av kode som dette, noe som kan 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 int kalt teller, semikolon. 667 00:32:44,830 --> 00:32:47,660 Eller du kan bare erklære og definere det, så å si. 668 00:32:47,660 --> 00:32:49,950 Gir den en verdi på samme tid. 669 00:32:49,950 --> 00:32:51,890 >> Og så til slutt, snakket vi om funksjoner. 670 00:32:51,890 --> 00:32:54,270 Og dette var en fin eksempel i den forstand at den illustrerer 671 00:32:54,270 --> 00:32:55,840 to typer funksjoner. 672 00:32:55,840 --> 00:32:59,030 En er GetString (), som, igjen, får en streng fra brukeren. 673 00:32:59,030 --> 00:33:02,040 Men GetString () er ganske interessant, så langt som vi har brukt det, 674 00:33:02,040 --> 00:33:05,620 fordi vi alltid har brukt det med noe på den venstre side av en 675 00:33:05,620 --> 00:33:06,600 likhetstegnet. 676 00:33:06,600 --> 00:33:09,830 Det vil si at GetString () returnerer en verdi. 677 00:33:09,830 --> 00:33:11,970 Den returnerer, selvfølgelig, en streng. 678 00:33:11,970 --> 00:33:15,130 Og deretter på venstre side, er vi bare sparer strengen innsiden av en 679 00:33:15,130 --> 00:33:16,580 variabel kalt navn. 680 00:33:16,580 --> 00:33:21,100 >> Dette er annerledes, på en måte, fra printf fordi printf, i hvert fall i vår 681 00:33:21,100 --> 00:33:23,540 bruk her, ikke returnerer noe. 682 00:33:23,540 --> 00:33:24,960 Som en side, gjør det tilbake noe. 683 00:33:24,960 --> 00:33:26,380 Vi har bare ikke bryr seg hva det er. 684 00:33:26,380 --> 00:33:29,090 Men den har det er kalt en bivirkning. 685 00:33:29,090 --> 00:33:31,840 Og hva er det bivirkning i alle tilfelle vi har sett så langt? 686 00:33:31,840 --> 00:33:34,720 Hva gjør printf? 687 00:33:34,720 --> 00:33:37,780 Den skriver noe til skjermen, skjermer tekst eller tall eller noe 688 00:33:37,780 --> 00:33:38,380 på skjermen. 689 00:33:38,380 --> 00:33:41,170 Og det er bare ansett som en bivirkning fordi det er egentlig ikke overlate 690 00:33:41,170 --> 00:33:41,900 den tilbake til meg. 691 00:33:41,900 --> 00:33:44,770 Det er ikke et svar på innsiden av en svart boks som jeg kan da 692 00:33:44,770 --> 00:33:46,130 komme inn og ta. 693 00:33:46,130 --> 00:33:49,160 Det er bare å gjøre det på egen hånd, mye som Colton ble plugget inn i dette 694 00:33:49,160 --> 00:33:52,560 svart boks i forrige uke, og han liksom magisk var tegning på tavla 695 00:33:52,560 --> 00:33:54,500 uten meg faktisk involvert. 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 faktisk måtte komme tilbake i her og si, oh, her er streng 698 00:33:59,100 --> 00:34:02,040 fra brukeren, som ville være en returverdi. 699 00:34:02,040 --> 00:34:05,650 >> Og så langt har vi bare brukte funksjoner at andre mennesker har skrevet. 700 00:34:05,650 --> 00:34:09,219 Men vi kan faktisk gjøre disse slags ting selv. 701 00:34:09,219 --> 00:34:12,730 Så jeg kommer til å gå inn i CS50 apparatet igjen. 702 00:34:12,730 --> 00:34:16,020 La meg lukke fanen som vi hadde åpne et øyeblikk siden. 703 00:34:16,020 --> 00:34:18,530 Og la meg gå videre og opprette en ny fil. 704 00:34:18,530 --> 00:34:22,400 Og jeg kommer til å gå videre og kalle dette en positive.c. 705 00:34:22,400 --> 00:34:24,770 Så jeg ønsker å gjøre noe med positive tall her. 706 00:34:24,770 --> 00:34:27,219 Så jeg kommer til å gå videre og gjøre int - 707 00:34:27,219 --> 00:34:28,000 beklager - 708 00:34:28,000 --> 00:34:31,840 # Include. 709 00:34:31,840 --> 00:34:34,280 La oss ikke gjøre det samme feil som før. 710 00:34:34,280 --> 00:34:40,020 Int main (void), åpen krøllete brace, lukket klammeparentes. 711 00:34:40,020 --> 00:34:41,639 >> Og nå ønsker jeg å gjøre følgende. 712 00:34:41,639 --> 00:34:44,600 Jeg ønsker å skrive et program som insisterer på at brukeren gir 713 00:34:44,600 --> 00:34:46,770 me et positivt heltall. 714 00:34:46,770 --> 00:34:50,969 Så det er ingen GetPositiveInt funksjon i CS50 biblioteket. 715 00:34:50,969 --> 00:34:52,610 Det er bare GetInt (). 716 00:34:52,610 --> 00:34:55,790 Men det er OK fordi jeg har konstruksjoner som jeg kan pålegge en 717 00:34:55,790 --> 00:34:59,360 litt mer begrensning på den verdien. 718 00:34:59,360 --> 00:35:00,990 Jeg kunne gjøre noe 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 innse Jeg kommer til å gå tilbake og 721 00:35:04,920 --> 00:35:06,430 endre noen ting i et øyeblikk - 722 00:35:06,430 --> 00:35:09,960 så int n er lik GetInt (). 723 00:35:09,960 --> 00:35:11,780 Og det kommer til å sette en int innsiden av n. 724 00:35:11,780 --> 00:35:13,830 Og la meg være en mer beskrivende. 725 00:35:13,830 --> 00:35:23,270 La meg si noe sånt Jeg krever at du gir meg et positivt heltall. 726 00:35:23,270 --> 00:35:23,550 >> OK. 727 00:35:23,550 --> 00:35:25,250 Så bare en liten bit av instruksjonene. 728 00:35:25,250 --> 00:35:26,270 Og nå hva kan jeg gjøre? 729 00:35:26,270 --> 00:35:29,840 Vel, jeg allerede vet fra min enkle forhold eller grener, akkurat som jeg 730 00:35:29,840 --> 00:35:36,100 hadde i Scratch, kunne jeg si noe som hvis n er mindre enn eller lik 731 00:35:36,100 --> 00:35:44,460 null, så jeg ønsker å gjøre noe liker, det er ikke positivt. 732 00:35:44,460 --> 00:35:45,560 Og da kunne jeg gjøre - 733 00:35:45,560 --> 00:35:47,310 OK, men jeg virkelig ønsker å få den int. 734 00:35:47,310 --> 00:35:52,020 Så jeg kunne gå opp her og jeg kunne slags på kopien dette og rykke 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 enn eller lik null gjøre dette. 737 00:35:56,990 --> 00:35:58,900 >> Nå, hva om brukeren ikke samarbeider? 738 00:35:58,900 --> 00:36:01,560 Vel, da jeg kommer til å låne dette her. 739 00:36:01,560 --> 00:36:03,130 Og så går jeg inn her og her og her. 740 00:36:03,130 --> 00:36:06,420 Så dette er helt klart ikke løsningen, rett? 741 00:36:06,420 --> 00:36:07,810 Fordi det er ingen ende i sikte. 742 00:36:07,810 --> 00:36:13,100 Hvis jeg ønsker å kreve at brukeren gir meg et positivt heltall, kan jeg 743 00:36:13,100 --> 00:36:14,150 faktisk få int. 744 00:36:14,150 --> 00:36:15,620 Da kan jeg se etter at int. 745 00:36:15,620 --> 00:36:18,570 Men da vil jeg sjekke det igjen og sjekk det igjen og sjekke det igjen. 746 00:36:18,570 --> 00:36:21,680 Så åpenbart, hva er bedre konstruere å bruke her? 747 00:36:21,680 --> 00:36:22,840 Greit, så en slags loop. 748 00:36:22,840 --> 00:36:25,430 >> Så jeg kommer til å bli kvitt av nesten alt av dette. 749 00:36:25,430 --> 00:36:27,320 Og jeg ønsker å få dette int minst én gang. 750 00:36:27,320 --> 00:36:28,890 Så jeg kommer til å si gjøre - 751 00:36:28,890 --> 00:36:32,110 og jeg vil komme tilbake til mens i bare et øyeblikk - 752 00:36:32,110 --> 00:36:33,050 Nå, hva? 753 00:36:33,050 --> 00:36:35,860 Jeg kommer til å gjø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 ganske bra. 756 00:36:37,250 --> 00:36:39,750 Og nå hvor ofte gjør Jeg ønsker å gjøre dette? 757 00:36:39,750 --> 00:36:45,770 >> La meg sette printf innsiden av løkken slik at jeg kan kreve igjen og igjen, 758 00:36:45,770 --> 00:36:46,740 hvis behovet være. 759 00:36:46,740 --> 00:36:49,720 Og hva ønsker jeg dette mens tilstanden å gjøre? 760 00:36:49,720 --> 00:36:53,870 Jeg vil fortsette å gjøre dette mens det er tilfelle? 761 00:36:53,870 --> 00:36:54,125 Yeah. 762 00:36:54,125 --> 00:36:55,390 N er mindre enn eller lik null. 763 00:36:55,390 --> 00:36:58,180 Så allerede, har vi betydelig renset denne koden opp. 764 00:36:58,180 --> 00:37:00,700 Vi har lånt en veldig enkel konstruere - den do-while-løkke. 765 00:37:00,700 --> 00:37:04,690 Jeg har stjålet bare de viktige linjene av koden at jeg begynte å kopiere og 766 00:37:04,690 --> 00:37:05,960 lime, var noe som ikke klok. 767 00:37:05,960 --> 00:37:09,790 Og så nå skal jeg faktisk lime det inn her og bare gjøre det en gang. 768 00:37:09,790 --> 00:37:12,990 >> Og nå hva ønsker jeg å gjøre på helt på slutten av dette programmet? 769 00:37:12,990 --> 00:37:16,810 Jeg vil bare si noe enkelt liker, takk for - og 770 00:37:16,810 --> 00:37:18,980 Jeg skal gjøre% i for int - 771 00:37:18,980 --> 00:37:23,270 backslash n, komma, og deretter plug in n, semikolon. 772 00:37:23,270 --> 00:37:23,910 >> OK. 773 00:37:23,910 --> 00:37:27,290 Så la oss se hva som skjer nå når jeg kjører dette programmet. 774 00:37:27,290 --> 00:37:30,600 Jeg kommer til å gå videre og gjør positive. 775 00:37:30,600 --> 00:37:30,880 Damn. 776 00:37:30,880 --> 00:37:31,600 Et par feil. 777 00:37:31,600 --> 00:37:32,960 Så la meg bla tilbake til den første. 778 00:37:32,960 --> 00:37:34,020 Ikke arbeid gjennom dem baklengs. 779 00:37:34,020 --> 00:37:37,000 Arbeide gjennom dem ovenfra og ned så de kaskade og bare 780 00:37:37,000 --> 00:37:38,630 en ting være feil. 781 00:37:38,630 --> 00:37:42,532 Implisitt deklarasjon av funksjon GetInt (). 782 00:37:42,532 --> 00:37:43,020 Yeah. 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 gjort samme feil, men litt annerledes denne gangen. 785 00:37:46,760 --> 00:37:51,940 Jeg må ikke bare omfatte stdio.h men også cs50.h, som inkluderer 786 00:37:51,940 --> 00:37:56,770 såkalte erklæringer få int, som undervise apparatet, eller lærer 787 00:37:56,770 --> 00:37:58,760 C hva GetInt () er. 788 00:37:58,760 --> 00:37:59,550 >> Så la meg resave. 789 00:37:59,550 --> 00:38:02,040 Jeg kommer til å ignorere de andre feil fordi jeg kommer til å håpe at de er 790 00:38:02,040 --> 00:38:05,210 noe relatert til feilen Jeg har allerede fikset. 791 00:38:05,210 --> 00:38:08,710 Så la meg gå videre og rekompilere med gjøre positive, Enter. 792 00:38:08,710 --> 00:38:09,020 Damn. 793 00:38:09,020 --> 00:38:09,985 Tre feil, likevel. 794 00:38:09,985 --> 00:38:12,650 La meg bla opp til første. 795 00:38:12,650 --> 00:38:14,320 Ubrukte variabelen n.. 796 00:38:14,320 --> 00:38:15,850 Vi har ikke sett dette før. 797 00:38:15,850 --> 00:38:17,200 Og også dette er litt kryptisk. 798 00:38:17,200 --> 00:38:18,850 Dette er resultatet av kompilatoren. 799 00:38:18,850 --> 00:38:23,610 Og hva som markerte linjen der - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 sier, er det å si på linje ni av positive.c, i det 13. tegnet, 801 00:38:28,960 --> 00:38:31,510 13. kolonne, du har gjort denne feilen. 802 00:38:31,510 --> 00:38:34,230 >> Og i særdeleshet, er det å fortelle meg ubrukt variabel n. 803 00:38:34,230 --> 00:38:35,790 Så la oss se - 804 00:38:35,790 --> 00:38:37,150 linje ni. 805 00:38:37,150 --> 00:38:40,430 Jeg bruker n i den forstand at Jeg gir det en verdi. 806 00:38:40,430 --> 00:38:44,200 Men hva kompilatoren ikke liker er at jeg ikke er tilsynelatende bruker det. 807 00:38:44,200 --> 00:38:45,560 Men vent litt, jeg bruker den. 808 00:38:45,560 --> 00:38:48,170 I tråd 11, jeg bruker det her. 809 00:38:48,170 --> 00:38:52,430 Men hvis jeg ruller ned ytterligere på :11 positive.c - 810 00:38:52,430 --> 00:38:56,230 så på linje 11, karakter 12, den kompilatoren forteller meg, bruk av 811 00:38:56,230 --> 00:38:58,670 undeclared identifikator n. 812 00:38:58,670 --> 00:39:02,760 >> Så uanmeldte betyr at jeg har ikke spesifisert 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 litt. 815 00:39:05,500 --> 00:39:09,150 Jeg gjorde akkurat som på linje ni. 816 00:39:09,150 --> 00:39:11,100 Så noen er veldig forvirret her. 817 00:39:11,100 --> 00:39:14,900 Det er enten meg eller kompilatoren fordi i tråd ni, igjen, jeg erklære en 818 00:39:14,900 --> 00:39:18,650 int n, og jeg tildele det returnere verdien av GetInt (). 819 00:39:18,650 --> 00:39:22,930 Så jeg bruker den variabelen n på linje 11 og sjekke om verdien er lavere 820 00:39:22,930 --> 00:39:24,050 enn eller lik null. 821 00:39:24,050 --> 00:39:27,430 Men dette er tydeligvis dårlig og ødelagt hvorfor? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Si det igjen? 824 00:39:32,490 --> 00:39:35,690 >> Ah, jeg må erklære n før går inn i sløyfen. 825 00:39:35,690 --> 00:39:36,370 Men hvorfor? 826 00:39:36,370 --> 00:39:39,830 Jeg mener, vi bare foreslått litt siden at det er greit å erklære variabler 827 00:39:39,830 --> 00:39:43,600 alt på én linje og deretter tildele dem noen verdi. 828 00:39:43,600 --> 00:39:46,790 En global variabel - la oss komme tilbake til at ideen om en liten stund. 829 00:39:46,790 --> 00:39:48,690 Hvorfor vil du ha meg til å sette den utenfor loopen? 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 Nettopp. 833 00:40:06,780 --> 00:40:09,610 >> Så, riktignok noe motstridende, la meg oppsummere. 834 00:40:09,610 --> 00:40:13,510 Når du erklærer n inne av gjør blokken der - 835 00:40:13,510 --> 00:40:16,320 spesifikt innside de klammeparentes - 836 00:40:16,320 --> 00:40:19,210 den variabelen n har det som er kalles et omfang - 837 00:40:19,210 --> 00:40:23,210 urelatert til vårt skåringssystemet i selvfølgelig - men har et omfang som er 838 00:40:23,210 --> 00:40:25,190 begrenset til de klammeparentes. 839 00:40:25,190 --> 00:40:28,460 Med andre ord, typisk hvis du deklarerer en variabel i et sett av en 840 00:40:28,460 --> 00:40:33,370 klammeparentes, finnes den variabelen bare innsiden av de klammeparentes. 841 00:40:33,370 --> 00:40:37,320 Så ved at logikken alene, selv om Jeg har erklært n på linje ni, det 842 00:40:37,320 --> 00:40:41,910 hovedsak forsvinner fra omfang, forsvinner fra hukommelsen, så å si, 843 00:40:41,910 --> 00:40:43,370 av den tiden jeg traff linjen 11. 844 00:40:43,370 --> 00:40:47,370 Fordi linjen 11, dessverre, er utenfor disse klammeparentes. 845 00:40:47,370 --> 00:40:51,540 >> Så jeg dessverre ikke kan fikse dette ved å kommer tilbake til hva jeg gjorde det før. 846 00:40:51,540 --> 00:40:53,370 Du kan ved første gjøre dette. 847 00:40:53,370 --> 00:40:56,370 Men hva er du nå ikke gjør syklisk? 848 00:40:56,370 --> 00:40:58,260 Du er tydeligvis ikke får den int syklisk. 849 00:40:58,260 --> 00:41:01,320 Så vi kan la GetInt (), og vi bør forlate GetInt () inne i 850 00:41:01,320 --> 00:41:04,420 løkke fordi det er det vi ønsker å plage brukeren til igjen og igjen. 851 00:41:04,420 --> 00:41:08,660 Men det gjør nok for å gå opp til linjen, sier seks. 852 00:41:08,660 --> 00:41:10,150 Int n, semikolon. 853 00:41:10,150 --> 00:41:12,990 Ikke gi den en verdi ennå fordi du trenger ikke å bare ennå. 854 00:41:12,990 --> 00:41:16,220 >> Men nå her nede, varsel - dette ville være en svært enkel feil. 855 00:41:16,220 --> 00:41:19,440 Jeg ønsker ikke å skygge min forrige erklæring av n. 856 00:41:19,440 --> 00:41:22,830 Jeg vil bruke n som faktisk eksisterer. 857 00:41:22,830 --> 00:41:25,780 Og så nå i linje 10, Jeg tildele n en verdi. 858 00:41:25,780 --> 00:41:28,580 Men i tråd seks, erklærer jeg n. 859 00:41:28,580 --> 00:41:32,940 Og så kan jeg eller kan jeg ikke bruke den i linje 12 nå? 860 00:41:32,940 --> 00:41:37,120 Jeg kan, fordi mellom hvilke krøllete bukseseler er n erklært nå? 861 00:41:37,120 --> 00:41:38,770 Den opp her på linje fem. 862 00:41:38,770 --> 00:41:40,330 Til en her på linje 14. 863 00:41:40,330 --> 00:41:49,770 Så hvis jeg nå zoome ut, lagre denne filen, går tilbake inn og kjøre gjøre positive, det 864 00:41:49,770 --> 00:41:50,820 sammen denne gangen. 865 00:41:50,820 --> 00:41:51,940 Så det er allerede fremgang. 866 00:41:51,940 --> 00:41:53,640 Slash. . / Positiv, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Jeg krever at du gir meg et positivt heltall. 868 00:41:56,060 --> 00:41:57,750 Negative en. 869 00:41:57,750 --> 00:41:59,020 Negativ to. 870 00:41:59,020 --> 00:42:00,680 Negativ tre. 871 00:42:00,680 --> 00:42:01,760 Zero. 872 00:42:01,760 --> 00:42:03,000 One. 873 00:42:03,000 --> 00:42:05,130 Og takk for den ene er hva er nå skrevet ut. 874 00:42:05,130 --> 00:42:07,400 >> La meg prøve noe annet, ut av nysgjerrighet. 875 00:42:07,400 --> 00:42:09,600 Jeg blir bedt om å skrive inn et heltall. 876 00:42:09,600 --> 00:42:12,870 Men hva om jeg i stedet skrive inn lam? 877 00:42:12,870 --> 00:42:14,460 Slik at du nå se en annen spør - 878 00:42:14,460 --> 00:42:15,350 prøv på nytt. 879 00:42:15,350 --> 00:42:17,670 Men ingen steder i koden min skrev jeg prøve på nytt. 880 00:42:17,670 --> 00:42:22,320 Så der, formodentlig, er dette nytt forsøk spør kommer fra, ville du si? 881 00:42:22,320 --> 00:42:23,540 Ja, fra GetInt () selv. 882 00:42:23,540 --> 00:42:26,650 Så en av de tingene CS50 ansatte gjør for deg, i alle fall i disse første par 883 00:42:26,650 --> 00:42:30,400 uker, er vi har skrevet noe beløp feilkontroll å sikre at hvis 884 00:42:30,400 --> 00:42:34,260 du kaller GetInt (), vil du i det minste få tilbake en int fra brukeren. 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 røye. 887 00:42:36,440 --> 00:42:39,660 Du vil ikke få noe helt annet. 888 00:42:39,660 --> 00:42:40,510 Du får en int. 889 00:42:40,510 --> 00:42:41,890 >> Nå kan det ikke være positive. 890 00:42:41,890 --> 00:42:42,770 Det kan ikke være negativ. 891 00:42:42,770 --> 00:42:44,550 Vi gir ingen garantier rundt det. 892 00:42:44,550 --> 00:42:48,960 Men vi vil plage brukeren til å prøve på nytt, prøve, prøve på nytt før han eller hun faktisk 893 00:42:48,960 --> 00:42:49,810 samarbeider. 894 00:42:49,810 --> 00:42:53,085 Tilsvarende, hvis jeg gjør 1.23, det er ikke en int. 895 00:42:53,085 --> 00:42:58,400 Men hvis jeg skriver i for eksempel 50, som gir meg en verdi som jeg ønsket. 896 00:42:58,400 --> 00:42:59,050 >> OK. 897 00:42:59,050 --> 00:43:01,380 Så ikke ille. 898 00:43:01,380 --> 00:43:04,780 Eventuelle spørsmål om hva vi nettopp har gjort? 899 00:43:04,780 --> 00:43:07,930 Nøkkelen takeaway være, for å være klar, ikke så mye loopen, som vi har sett 900 00:43:07,930 --> 00:43:10,880 før selv om vi har egentlig ikke brukt det, men spørsmålet om omfang, der 901 00:43:10,880 --> 00:43:17,045 variablene kan bare kan bare brukes innenfor noen bestemt omfang. 902 00:43:17,045 --> 00:43:19,830 >> Ok, la meg ta forslaget du har gjort tidligere, nemlig en 903 00:43:19,830 --> 00:43:20,860 global variabel. 904 00:43:20,860 --> 00:43:24,880 Som en side, viser det seg at en annen Løsningen på dette problemet, men 905 00:43:24,880 --> 00:43:28,880 typisk feil løsning eller en dårlig utformet løsning, er å 906 00:43:28,880 --> 00:43:31,670 deklarerer variabelen som hva som er kalles en global variabel. 907 00:43:31,670 --> 00:43:34,610 Nå er jeg slags brudd min definisjon av omfang fordi det finnes 908 00:43:34,610 --> 00:43:37,680 ingen klammeparentes på toppen og helt nederst på en fil. 909 00:43:37,680 --> 00:43:40,190 Men konsekvensen av at er at nå på linje 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 tilsier, er det bare tilgjengelig 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 brukte en variabel, kan du hente du måtte velge om det er for 914 00:43:48,650 --> 00:43:50,780 denne sprite eller for alle sprites. 915 00:43:50,780 --> 00:43:54,270 Vel, er alle sprites bare klarere måte å si globalt. 916 00:43:54,270 --> 00:43:55,520 Yeah? 917 00:43:55,520 --> 00:44:09,690 918 00:44:09,690 --> 00:44:10,990 Ah, virkelig godt spørsmål. 919 00:44:10,990 --> 00:44:14,310 >> Så husker at i den aller første versjonen av koden min, da jeg feilaktig 920 00:44:14,310 --> 00:44:17,700 erklært og definert n i tråd ni - 921 00:44:17,700 --> 00:44:19,980 Jeg erklærte det som en variabel og jeg ga det en verdi med 922 00:44:19,980 --> 00:44:21,160 tilordningsoperatoren - 923 00:44:21,160 --> 00:44:22,520 Dette ga meg to feil. 924 00:44:22,520 --> 00:44:26,560 Én, det faktum at n ikke ble brukt, og to, som i linje 11 925 00:44:26,560 --> 00:44:27,770 det bare ikke var deklarert. 926 00:44:27,770 --> 00:44:31,120 Så det første jeg gjorde ikke adressen på den tiden. 927 00:44:31,120 --> 00:44:35,130 Det er strengt tatt ikke en feil å erklære en variabel, men ikke bruke den. 928 00:44:35,130 --> 00:44:38,540 Men en av de tingene vi har gjort i den CS50 apparatet, bevisst, 929 00:44:38,540 --> 00:44:43,340 pedagogisk, er vi skrudde opp forventninger til kompilatoren å gjøre 930 00:44:43,340 --> 00:44:46,970 sikker på at du gjør ting ikke bare riktig, men egentlig riktig. 931 00:44:46,970 --> 00:44:51,520 >> Fordi hvis du erklære en variabel som n og aldri bruker den, eller bruker det 932 00:44:51,520 --> 00:44:53,700 riktig, så hva er det der? 933 00:44:53,700 --> 00:44:55,650 Det tjener virkelig ingen hensikt. 934 00:44:55,650 --> 00:44:58,980 Og det er veldig lett over tid, hvis du ikke konfigurere din egen datamaskin i 935 00:44:58,980 --> 00:45:01,960 denne måten, å bare ha kode som har små rester her, rester der. 936 00:45:01,960 --> 00:45:04,390 Og deretter måneder senere du se tilbake og du er som, hvorfor er denne linjen av 937 00:45:04,390 --> 00:45:05,060 kode der? 938 00:45:05,060 --> 00:45:07,940 Og hvis det er ingen god grunn, det gagner ikke deg eller dine kolleger 939 00:45:07,940 --> 00:45:10,650 nedover veien til å snuble over det da. 940 00:45:10,650 --> 00:45:12,540 >> Som en side, der er som kommer fra? 941 00:45:12,540 --> 00:45:16,410 Vel, husker at hver gang vi kompilere program, er alt dette ting 942 00:45:16,410 --> 00:45:17,380 som skrives ut. 943 00:45:17,380 --> 00:45:18,350 Så vi vil komme tilbake til dette. 944 00:45:18,350 --> 00:45:22,230 Men igjen, er å lage et verktøy som automatiserer prosessen med å sette sammen etter 945 00:45:22,230 --> 00:45:24,830 kjører selve kompilatoren kalt klang. 946 00:45:24,830 --> 00:45:27,650 Denne saken, vil vi til slutt se, har å gjøre med debugging med en spesiell 947 00:45:27,650 --> 00:45:29,060 program kalt debugger. 948 00:45:29,060 --> 00:45:32,150 Dette har å gjøre med å optimalisere kode - mer 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 betyr bare bruke 1999-versjonen av C. C har eksistert enda lenger enn 951 00:45:37,870 --> 00:45:40,830 det, men de gjorde noe hyggelig endringer 10 pluss år siden. 952 00:45:40,830 --> 00:45:42,690 >> Og her er de relevante seg. 953 00:45:42,690 --> 00:45:45,880 Vi sier at alt som tidligere ville ha vært en advarsel 954 00:45:45,880 --> 00:45:48,560 en feil hindrer student fra kompilering. 955 00:45:48,560 --> 00:45:51,400 Og vegg-del gjøre det til en hel haug av ting, ikke 956 00:45:51,400 --> 00:45:53,060 bare knyttet til variabler. 957 00:45:53,060 --> 00:45:54,700 Og så la meg bla til slutten av denne linje. 958 00:45:54,700 --> 00:45:56,430 Og også dette vil vi til slutt komme tilbake til. 959 00:45:56,430 --> 00:45:59,040 Dette er selvsagt navnet på filen jeg kompilering. 960 00:45:59,040 --> 00:46:02,160 Dette minner om navnet på filen Jeg sender ut som navnet 961 00:46:02,160 --> 00:46:04,070 av min kjørbart program. 962 00:46:04,070 --> 00:46:08,970 Dette-lcs50 betyr bare bruke CS50 bibliotek, og noen nuller og enere som 963 00:46:08,970 --> 00:46:12,390 de ansatte skrev og samlet tidligere dette året, integrere 964 00:46:12,390 --> 00:46:13,490 dem inn i programmet mitt. 965 00:46:13,490 --> 00:46:16,130 >> Og alle vet hva-lm er? 966 00:46:16,130 --> 00:46:18,150 Det er regnestykket biblioteket, som er bare der selv om du er 967 00:46:18,150 --> 00:46:19,320 ikke gjøre noe matte. 968 00:46:19,320 --> 00:46:22,620 Det er bare automatisk gitt til oss gjør. 969 00:46:22,620 --> 00:46:26,540 >> Vel, la meg gjøre en annen eksempel her ved å åpne opp en ny fil. 970 00:46:26,540 --> 00:46:30,560 Og la meg lagre dette som string.c. 971 00:46:30,560 --> 00:46:37,980 Det viser seg at når vi snakker om data typene i dag, det er enda mer 972 00:46:37,980 --> 00:46:40,630 skjer under panseret enn vi har sett så langt. 973 00:46:40,630 --> 00:46:42,290 Så la meg raskt gjøre en rask program. 974 00:46:42,290 --> 00:46:44,510 Inkluder stdio.h. 975 00:46:44,510 --> 00:46:45,730 Og jeg vil lagre det. 976 00:46:45,730 --> 00:46:48,110 Og du vet, la meg ikke gjøre det samme feil igjen og igjen. 977 00:46:48,110 --> 00:46:50,540 Inkluder cs50.h. 978 00:46:50,540 --> 00:46:54,870 Og la meg gå videre nå og gjøre int main (void). 979 00:46:54,870 --> 00:46:58,790 >> Og nå har jeg bare lyst til å gjøre et program som gjør dette - erklære en streng 980 00:46:58,790 --> 00:47:03,610 kalt s og får en streng fra brukeren. 981 00:47:03,610 --> 00:47:05,820 Og la meg gjøre litt instruksjonene her - 982 00:47:05,820 --> 00:47:09,960 vennligst gi meg en streng - så brukeren vet hva de skal gjøre. 983 00:47:09,960 --> 00:47:13,190 Og deretter ned her under dette, Jeg ønsker å gjøre følgende - 984 00:47:13,190 --> 00:47:16,060 for int får jeg null. 985 00:47:16,060 --> 00:47:18,580 Igjen, dataforskere typisk begynne å telle på null, men vi kunne 986 00:47:18,580 --> 00:47:20,340 gjør at en hvis vi virkelig ønsket. 987 00:47:20,340 --> 00:47:27,240 Nå skal jeg gjøre jeg er mindre enn strengen lengden på s. 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 igjen, det er konsis fordi det er lettere å skrive, selv om det er en 991 00:47:31,650 --> 00:47:32,590 litt kryptisk. 992 00:47:32,590 --> 00:47:35,290 >> Det er en funksjon vi har ikke brukt før, men bokstavelig talt gjør det - 993 00:47:35,290 --> 00:47:37,810 tilbake til meg et tall som representerer lengden av strengen 994 00:47:37,810 --> 00:47:38,690 at brukeren har skrevet. 995 00:47:38,690 --> 00:47:41,740 Hvis de har skrevet i hallo, ville den komme tilbake fem fordi det er fem 996 00:47:41,740 --> 00:47:42,890 bokstaver i hallo. 997 00:47:42,890 --> 00:47:45,390 Så, på hver iterasjon av denne sløyfen, jeg pluss pluss. 998 00:47:45,390 --> 00:47:49,170 Så igjen, en standard konstruere, selv om du er ikke helt for komfortabel eller 999 00:47:49,170 --> 00:47:50,420 kjent med den ennå. 1000 00:47:50,420 --> 00:47:53,220 >> Men nå på hver iterasjon av denne sløyfen, legge merke til hva jeg skal gjøre. 1001 00:47:53,220 --> 00:47:56,690 Jeg ønsker å gå videre og skrive ut et enkelt tegn - 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å, vet du hva jeg ønsker å gjøre? 1004 00:48:00,990 --> 00:48:05,090 Uansett hva ordet er at brukeren skriver inn i, som hei, jeg ønsker å skrive ut 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, ett tegn per linje. 1006 00:48:09,530 --> 00:48:13,080 Med andre ord, jeg ønsker å få på enkelte tegn i en streng, 1007 00:48:13,080 --> 00:48:16,770 der inntil nå en streng har bare vært en sekvens av tegn. 1008 00:48:16,770 --> 00:48:21,690 >> Og det viser seg at jeg kan gjøre s, brakett Jeg, i nærheten brakett, lukke 1009 00:48:21,690 --> 00:48:23,580 parentes, semikolon. 1010 00:48:23,580 --> 00:48:25,640 Og jeg trenger ikke å gjøre en ting. 1011 00:48:25,640 --> 00:48:30,570 Det er i en fil som heter string.h at strlen er deklarert. 1012 00:48:30,570 --> 00:48:33,190 Så hvis jeg vil bruke denne funksjonen, Jeg må fortelle kompilatoren, 1013 00:48:33,190 --> 00:48:34,450 forventer å bruke den. 1014 00:48:34,450 --> 00:48:37,040 Nå la meg gå videre og gjøre programmet heter streng. 1015 00:48:37,040 --> 00:48:39,150 Dot, slash, streng. 1016 00:48:39,150 --> 00:48:40,130 >> Vennligst gi meg en streng. 1017 00:48:40,130 --> 00:48:40,900 Jeg skal gå videre og skriver det. 1018 00:48:40,900 --> 00:48:43,040 Hei, i alle caps, Enter. 1019 00:48:43,040 --> 00:48:47,390 Og nå merker jeg har skrevet dette ett tegn etter den andre. 1020 00:48:47,390 --> 00:48:51,450 Så den nye detalj her, er at en streng, ved slutten av dagen, kan være 1021 00:48:51,450 --> 00:48:54,810 tilgjengelig ved hjelp av individuell dens tegn ved å innføre torget 1022 00:48:54,810 --> 00:48:55,840 brakett notasjon. 1023 00:48:55,840 --> 00:48:59,090 Og det er fordi en streng under panseret er faktisk en sekvens av 1024 00:48:59,090 --> 00:48:59,810 tegn. 1025 00:48:59,810 --> 00:49:02,010 Men det som pen om dem er i datamaskinens RAM - 1026 00:49:02,010 --> 00:49:05,300 Mac, PC, uansett hva det er - de er bokstavelig talt rygg mot rygg mot rygg - 1027 00:49:05,300 --> 00:49:06,225 H-E-L-L-O - 1028 00:49:06,225 --> 00:49:09,920 på individ-, tilstøtende byte i minnet. 1029 00:49:09,920 --> 00:49:13,210 >> Så hvis du ønsker å få på den åttende slik byte, som i denne sløyfe ville bli 1030 00:49:13,210 --> 00:49:16,900 brakett null, en brakett, to brakett, tre brakett, brakett fire - 1031 00:49:16,900 --> 00:49:18,890 som er null indeksert opp til fem - 1032 00:49:18,890 --> 00:49:23,330 som vil skrive ut H-E-L-L-O på sin egen linje. 1033 00:49:23,330 --> 00:49:26,320 >> Nå, som en teaser, la meg vise deg slags ting du etterhvert bli 1034 00:49:26,320 --> 00:49:31,950 i stand til å forstå, i det minste med noen stenger ute. 1035 00:49:31,950 --> 00:49:35,610 For en, hva vi inkludert i dagens eksempler, hvis du ønsker, er faktisk 1036 00:49:35,610 --> 00:49:38,300 en av de aller første jailbreaks for iPhone. 1037 00:49:38,300 --> 00:49:40,800 Jailbreaking betyr sprengning telefonen slik at du faktisk kan bruke den på en 1038 00:49:40,800 --> 00:49:43,380 annen operatør eller install din egen programvare. 1039 00:49:43,380 --> 00:49:45,660 Og du vil merke dette ser helt kryptisk, mest sannsynlig. 1040 00:49:45,660 --> 00:49:46,520 Men se på dette. 1041 00:49:46,520 --> 00:49:50,420 IPhone ble tydeligvis sprukket med en for loop, en hvis tilstand, et annet 1042 00:49:50,420 --> 00:49:52,580 tilstand, en haug av funksjoner vi har ikke sett. 1043 00:49:52,580 --> 00:49:54,230 >> Og igjen, vil du ikke på første øyekast trolig 1044 00:49:54,230 --> 00:49:55,620 forstå hvordan dette fungerer. 1045 00:49:55,620 --> 00:49:58,940 Men alt at vi liksom ta for gitt i våre moderne liv 1046 00:49:58,940 --> 00:50:02,040 faktisk en tendens til å redusere selv til noen av disse grunnleggende vi har vært 1047 00:50:02,040 --> 00:50:02,820 ser på. 1048 00:50:02,820 --> 00:50:06,680 La meg gå videre og åpne en andre program, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Så også dette er noe du burde egentlig ikke vite. 1050 00:50:08,970 --> 00:50:12,440 Selv ingen av de ansatte eller jeg kunne sannsynligvis finne ut av dette ved å se på 1051 00:50:12,440 --> 00:50:15,450 det fordi dette var noens kode som ble sendt til hva som er 1052 00:50:15,450 --> 00:50:19,630 historisk kjent som en uklar C konkurranse, der du kan skrive et program 1053 00:50:19,630 --> 00:50:24,670 som kompilerer og kjører, men er så jævla kryptisk ingen menneske kan forstå hva 1054 00:50:24,670 --> 00:50:27,530 det kommer til å gjøre før de faktisk kjøre den. 1055 00:50:27,530 --> 00:50:29,940 >> Så ja, hvis du ser på dette koden, ser jeg en bryter. 1056 00:50:29,940 --> 00:50:30,870 Jeg ser main. 1057 00:50:30,870 --> 00:50:33,800 Jeg ser disse klammer antyde annen form for en matrise. 1058 00:50:33,800 --> 00:50:35,970 Ønsker noen å gjette hva dette programmet faktisk 1059 00:50:35,970 --> 00:50:37,220 gjør hvis jeg kjø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 gjort. 1064 00:50:44,690 --> 00:50:48,090 Så bare de ansatte og jeg kan ikke finne ut hva disse tingene gjør. 1065 00:50:48,090 --> 00:50:51,670 >> Og nå til slutt, la meg gå videre og åpne opp ett annet program. 1066 00:50:51,670 --> 00:50:53,440 Dette - 1067 00:50:53,440 --> 00:50:55,550 igjen, vil vi gjøre kildekoden tilgjengelig på nettet - dette er bare 1068 00:50:55,550 --> 00:50:57,480 slags pen å se på. 1069 00:50:57,480 --> 00:50:59,750 Alt de gjorde er rammet space bar ganske mye. 1070 00:50:59,750 --> 00:51:01,320 Men dette er reell kode. 1071 00:51:01,320 --> 00:51:04,790 Så hvis du tror det er ganske, hvis vi faktisk kjøre dette ved ledeteksten, 1072 00:51:04,790 --> 00:51:08,970 til slutt vil du se hvordan vi kan gjøre ting som dette. 1073 00:51:08,970 --> 00:51:14,008 >> Så vi vil forlate deg på dette notatet og se deg på onsdag. 1074 00:51:14,008 --> 00:51:18,440 >> [Musikk spilles] 1075 00:51:18,440 --> 00:51:23,380 >> SPEAKER 2: Ved neste CS50, TFS iscenesette 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 >> [Musikk spilles]