1 00:00:00,000 --> 00:00:10,920 >> [Musik Spela] 2 00:00:10,920 --> 00:00:14,680 >> DAVID J MALAN: Okej, välkommen tillbaka till CS50. 3 00:00:14,680 --> 00:00:16,500 Detta är början på vecka två. 4 00:00:16,500 --> 00:00:18,940 Ett ord från en av våra vänner på campus - 5 00:00:18,940 --> 00:00:22,620 om du är intresserad, eventuellt, antingen nu eller i någon framtida sikt 6 00:00:22,620 --> 00:00:25,670 ens, en gång mer bekväm, undervisning mittskolastudenter en lite 7 00:00:25,670 --> 00:00:27,680 något om datavetenskap, göra huvudet till denna URL. 8 00:00:27,680 --> 00:00:32,360 De är i särskilt behov just nu av lärare, särskilt om du har 9 00:00:32,360 --> 00:00:34,700 hade viss exponering mot datavetenskap. 10 00:00:34,700 --> 00:00:38,060 >> Så minns att förra gången, introducerade vi några datatyper i C, och 11 00:00:38,060 --> 00:00:40,590 du kanske har börjat få din händerna smutsiga med dessa hittills 12 00:00:40,590 --> 00:00:41,940 i problem som en. 13 00:00:41,940 --> 00:00:43,230 Och vi hade en röding. 14 00:00:43,230 --> 00:00:49,100 Så i något tekniska termer, vad är en röding som ni vet det idag? 15 00:00:49,100 --> 00:00:51,050 >> Så det är ett tecken, men låt oss vara mer exakt nu. 16 00:00:51,050 --> 00:00:53,735 Vad menar vi med karaktär eller enskilda röding? 17 00:00:53,735 --> 00:00:56,700 18 00:00:56,700 --> 00:00:59,500 En icke-numerisk karaktär - 19 00:00:59,500 --> 00:01:00,670 så inte nödvändigtvis. 20 00:01:00,670 --> 00:01:04,580 Det visar sig att även tal, även skiljetecken och bokstäver är 21 00:01:04,580 --> 00:01:06,980 representerade med dessa data typ som är känd som en char. 22 00:01:06,980 --> 00:01:09,440 Så det är inte nödvändigtvis alfabetisk. 23 00:01:09,440 --> 00:01:11,100 Yeah? 24 00:01:11,100 --> 00:01:12,275 >> Så det är ett ASCII-tecken. 25 00:01:12,275 --> 00:01:15,510 Så om du tänker tillbaka på vecka noll, när Vi hade vårt byte av volontärer 26 00:01:15,510 --> 00:01:19,150 komma upp och antingen hålla sina händer upp eller inte allt stod de bitar. 27 00:01:19,150 --> 00:01:22,450 Men kollektivt som en grupp av åtta, de utgjorde ett byte. 28 00:01:22,450 --> 00:01:26,030 Och vi infört begreppet ASCII vid denna föreläsning, är som helt enkelt en 29 00:01:26,030 --> 00:01:28,170 mappning mellan siffror och bokstäver. 30 00:01:28,170 --> 00:01:32,010 Och ASCII-användningsområden, som dessa människor underförstådda, åtta bitar 31 00:01:32,010 --> 00:01:33,660 för att representera ett tecken. 32 00:01:33,660 --> 00:01:36,890 >> Så därför, om åtta bitar kan vart tar den ena av två värden - 33 00:01:36,890 --> 00:01:38,010 noll eller en - 34 00:01:38,010 --> 00:01:40,280 Det innebär att det fanns två möjligheter för denna person - 35 00:01:40,280 --> 00:01:41,230 noll eller en - 36 00:01:41,230 --> 00:01:44,070 två för den personen, två för detta person, två för detta. 37 00:01:44,070 --> 00:01:47,450 Så totalt två gånger två gånger två gånger två gånger två - 38 00:01:47,450 --> 00:01:49,700 så två den åttonde totalt. 39 00:01:49,700 --> 00:01:54,320 Så det finns ett totalt antal tecken 256 möjligt att du kan 40 00:01:54,320 --> 00:01:55,750 representera med åtta bitar. 41 00:01:55,750 --> 00:01:59,210 >> Nu, de av er som talar Asian språk kanske vet att det finns mer 42 00:01:59,210 --> 00:02:02,620 tecken i världen än bara När och B och Cs och Ds. 43 00:02:02,620 --> 00:02:06,130 Och faktiskt, inte räcker ASCII inte för många språk i världen. 44 00:02:06,130 --> 00:02:07,760 Men mer om det en annan gång. 45 00:02:07,760 --> 00:02:11,240 För nu, vet att i C om du vill att representera en bokstav, en bit av 46 00:02:11,240 --> 00:02:15,780 skiljetecken, eller bara något tecken i naturen, använder vi en röding. 47 00:02:15,780 --> 00:02:18,240 Och det är en byte eller åtta bitar. 48 00:02:18,240 --> 00:02:19,690 >> Vad sägs om en int? 49 00:02:19,690 --> 00:02:20,780 Tja, är en int ett heltal. 50 00:02:20,780 --> 00:02:23,175 Hur många bitar, om ni minns, var ett heltal typiskt? 51 00:02:23,175 --> 00:02:25,930 52 00:02:25,930 --> 00:02:27,512 Någon minns? 53 00:02:27,512 --> 00:02:29,600 Så det är normalt 32. 54 00:02:29,600 --> 00:02:32,120 Det beror faktiskt på datorn som du använder. 55 00:02:32,120 --> 00:02:35,770 Men i apparaten, och i en hel del datorer, det är 32 bitar eller fyra 56 00:02:35,770 --> 00:02:37,140 bytes - åtta gånger fyra. 57 00:02:37,140 --> 00:02:39,790 Och ints bara används för att lagra siffror, antingen negativa, 58 00:02:39,790 --> 00:02:41,610 positiv eller noll. 59 00:02:41,610 --> 00:02:45,250 >> Och om du har 32 bitar och du bara bryr sig om positiva tal, kan 60 00:02:45,250 --> 00:02:48,960 någon ungefärlig hur många möjliga heltal en dator kan representera från 61 00:02:48,960 --> 00:02:51,820 noll på upp? 62 00:02:51,820 --> 00:02:56,130 Så det skulle vara två till 32, vilket är ungefär fyra miljarder. 63 00:02:56,130 --> 00:02:59,720 Så dessa befogenheter två kommer att vara återkommande teman i datavetenskap. 64 00:02:59,720 --> 00:03:03,930 Som vi ska se, de är ganska bekvämt att jobba med även om det inte är helt 65 00:03:03,930 --> 00:03:05,790 lätt att göra matten i ens huvud. 66 00:03:05,790 --> 00:03:07,000 >> Så vi ska säga ungefär fyra miljarder. 67 00:03:07,000 --> 00:03:08,620 Nu, en lång lång - 68 00:03:08,620 --> 00:03:09,770 du kan typ av gissning. 69 00:03:09,770 --> 00:03:10,480 Det är längre än en int. 70 00:03:10,480 --> 00:03:12,440 Hur många bitar? 71 00:03:12,440 --> 00:03:14,250 Så 64 bitar eller åtta byte. 72 00:03:14,250 --> 00:03:17,480 Det betyder bara att du kan representera ens större siffror, större positiv eller 73 00:03:17,480 --> 00:03:19,160 större negativa tal. 74 00:03:19,160 --> 00:03:20,060 >> Och hur flyta? 75 00:03:20,060 --> 00:03:22,260 Det är ett flyttal värde på 32 bitar. 76 00:03:22,260 --> 00:03:25,180 Detta är bara ett reellt tal, något med en decimal. 77 00:03:25,180 --> 00:03:30,100 Men om du behöver istället fler platser efter decimalkommat eller om du vill 78 00:03:30,100 --> 00:03:33,720 representera ett större antal med några fraktion efter det, kan du använda en 79 00:03:33,720 --> 00:03:36,260 dubbel, vilket är 64 bitar. 80 00:03:36,260 --> 00:03:38,240 >> Men det är en intressant takeaway här. 81 00:03:38,240 --> 00:03:42,890 Så om ints begränsas av 32 bitar och även långa longs begränsas av 64 82 00:03:42,890 --> 00:03:46,180 bitar, den sortens väcker frågan, vad händer om du verkligen vill räkna 83 00:03:46,180 --> 00:03:48,790 högre än 4 miljarder för en int? 84 00:03:48,790 --> 00:03:50,330 Tja, använder du bara en lång lång. 85 00:03:50,330 --> 00:03:54,200 Men vad händer om du vill räkna högre än två till den 64: e, ge eller ta? 86 00:03:54,200 --> 00:03:55,810 >> Nu, det är ett stort antal. 87 00:03:55,810 --> 00:03:59,250 Men så småningom, kanske du faktiskt bryr sig om dessa typer av värderingar, 88 00:03:59,250 --> 00:04:03,070 speciellt om du använder en databas och börja samla massor 89 00:04:03,070 --> 00:04:06,190 och massor av uppgifter och tilldela unika nummer på varje exemplar av dessa uppgifter. 90 00:04:06,190 --> 00:04:07,430 Så vi har typ av ett problem. 91 00:04:07,430 --> 00:04:10,700 Och på samma sätt, med flyttal värden - flöten eller dubbel - 92 00:04:10,700 --> 00:04:14,290 Om du har bara ett ändligt antal bitar, hur många totala antalet kunde du 93 00:04:14,290 --> 00:04:16,980 möjligen representerar? 94 00:04:16,980 --> 00:04:19,540 >> Tja, det är mindre tydligt när man innebära ett decimalkomma. 95 00:04:19,540 --> 00:04:20,899 Men det är ju ändliga. 96 00:04:20,899 --> 00:04:24,390 Om du har ett ändligt antal bitar, ett ändligt antal människor, en ändlig 97 00:04:24,390 --> 00:04:27,350 antal glödlampor, säkert du kan endast representera ett ändligt antal 98 00:04:27,350 --> 00:04:28,510 flyttal. 99 00:04:28,510 --> 00:04:33,170 Men hur många reella tal är deras i världen? 100 00:04:33,170 --> 00:04:33,680 Det finns en oändlig. 101 00:04:33,680 --> 00:04:37,280 Så det är lite av ett problem eftersom vi inte har en oändlig mängd 102 00:04:37,280 --> 00:04:39,970 minne eller RAM inne i våra datorer. 103 00:04:39,970 --> 00:04:41,780 Så några utmanande saker kan hända. 104 00:04:41,780 --> 00:04:43,900 >> Så låt oss gå vidare och prova att uttrycka detta här. 105 00:04:43,900 --> 00:04:46,240 Låt mig gå vidare och öppna upp gedit. 106 00:04:46,240 --> 00:04:50,360 Jag ska gå vidare och spara en fil kallas "floats0.c" bara för att vara 107 00:04:50,360 --> 00:04:54,630 överensstämmelse med ett exempel som är tillgängliga på nätet, om du vill. 108 00:04:54,630 --> 00:04:58,080 Och jag ska gå vidare och definiera det som följer - 109 00:04:58,080 --> 00:05:01,540 Jag ska gå vidare och säga, int huvudsakliga tomrum, som vi ofta gör. 110 00:05:01,540 --> 00:05:07,190 >> Och sedan i detta program, kommer jag att förklarar mig en flottör, så en 32-bitars 111 00:05:07,190 --> 00:05:09,700 variabel kallas f, godtyckligt. 112 00:05:09,700 --> 00:05:13,910 Och då ska jag lagra i det Jag vet inte, en tiondel, så 0.1. 113 00:05:13,910 --> 00:05:16,590 Så jag ska uttrycka det som en dividerat med 10, vilket är helt 114 00:05:16,590 --> 00:05:17,790 legitimt i C. 115 00:05:17,790 --> 00:05:20,460 >> Och sedan på den andra raden, bara jag vill skriva ut det värdet. 116 00:05:20,460 --> 00:05:22,950 Så minns att vi kan använda det välbekanta printf. 117 00:05:22,950 --> 00:05:25,420 Vi vill inte att använda% i för en int. 118 00:05:25,420 --> 00:05:28,360 Vi vill använda% f för en flottör. 119 00:05:28,360 --> 00:05:33,080 Och sen ska jag göra backslash N, Stäng citat, kommatecken, f, semikolon. 120 00:05:33,080 --> 00:05:34,400 >> Så här är mitt program. 121 00:05:34,400 --> 00:05:35,820 Det finns redan en bugg. 122 00:05:35,820 --> 00:05:38,640 Har någon för vilken det klickade redan vill peka åtminstone 123 00:05:38,640 --> 00:05:40,220 en bugg som jag 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 Jag glömde "# include" på topp, symptom de som om jag försöker 127 00:05:47,860 --> 00:05:50,490 sammanställa detta kommer att vara att kompilatorn kommer att skrika på mig, 128 00:05:50,490 --> 00:05:52,770 säger odefinierad symbol eller något om detta. 129 00:05:52,770 --> 00:05:55,360 Det förstår inte något gillar printf. 130 00:05:55,360 --> 00:05:59,380 >> Så jag kommer att göra "# include ", Spara filen. 131 00:05:59,380 --> 00:06:00,400 Och nu är det i bättre form. 132 00:06:00,400 --> 00:06:02,690 Men jag kommer också att peka ut en ny detalj i dag. 133 00:06:02,690 --> 00:06:08,620 Förutom att ange plats innehavare som% f% i% s, kan du 134 00:06:08,620 --> 00:06:12,320 ibland påverka beteendet av den platshållare. 135 00:06:12,320 --> 00:06:15,540 Till exempel i fallet med en flytande poängvärde, om jag bara vill 136 00:06:15,540 --> 00:06:22,200 att visa en decimal efter period, kan jag göra egentligen 0.1F. 137 00:06:22,200 --> 00:06:26,830 Så med andra ord, separera jag f och procenttecknet med 0,1, bara 138 00:06:26,830 --> 00:06:30,200 träffande printf, kanske du har en hel massa siffror efter decimalkommat 139 00:06:30,200 --> 00:06:30,930 punkt för mig. 140 00:06:30,930 --> 00:06:32,870 Men jag vill bara se en av dem. 141 00:06:32,870 --> 00:06:36,280 >> Så jag ska gå vidare nu och spara detta program, gå in i min terminal 142 00:06:36,280 --> 00:06:41,870 fönster, och jag kommer att gå vidare och typ gör float 0 anger. 143 00:06:41,870 --> 00:06:44,930 Jag ser att något kryptiska linje som kommer att börja göra mer meningsfullt när vi 144 00:06:44,930 --> 00:06:46,900 retas isär denna och nästa vecka. 145 00:06:46,900 --> 00:06:50,480 Nu ska jag gå vidare och kör float noll. 146 00:06:50,480 --> 00:06:52,020 Och, fan. 147 00:06:52,020 --> 00:06:54,880 >> Så det finns en bugg här av någon anledning. 148 00:06:54,880 --> 00:07:02,490 Jag är ganska säker på att en tiondel, eller ett delat med 10, inte är 0,0. 149 00:07:02,490 --> 00:07:04,590 Kanske är jag bara inte ser vid tillräckligt många siffror. 150 00:07:04,590 --> 00:07:08,580 Så varför inte jag säga två .2 att se två decimaler i stället för bara en. 151 00:07:08,580 --> 00:07:11,810 Låt mig gå tillbaka till mitt terminalfönster här och slog upp ett par gånger för att 152 00:07:11,810 --> 00:07:12,840 se min historia. 153 00:07:12,840 --> 00:07:15,910 Gör flyta noll igen, och sedan upp igen. 154 00:07:15,910 --> 00:07:17,730 Och nu in. 155 00:07:17,730 --> 00:07:20,000 >> Och nu är jag ganska säker på att detta är fel. 156 00:07:20,000 --> 00:07:23,030 Och jag kunde göra tre och fyra, och jag är förmodligen kommer att fortsätta att se nollor. 157 00:07:23,030 --> 00:07:24,880 Så var är felet? 158 00:07:24,880 --> 00:07:27,910 Ett delat med 10 bör vara 0,1. 159 00:07:27,910 --> 00:07:30,310 Någon vill ta en stab på vad den grundläggande frågan är? 160 00:07:30,310 --> 00:07:32,400 Yeah? 161 00:07:32,400 --> 00:07:33,420 De är båda heltal. 162 00:07:33,420 --> 00:07:33,920 Så vad? 163 00:07:33,920 --> 00:07:37,820 Så med ett delat med 10, det är vad jag gör i aritmetik. 164 00:07:37,820 --> 00:07:41,185 Och jag får 0.1. 165 00:07:41,185 --> 00:07:41,660 >> Yeah. 166 00:07:41,660 --> 00:07:43,240 Och så är det faktiskt den frågan. 167 00:07:43,240 --> 00:07:46,700 När du tar ett heltal i en dator och du delar den med ett annat heltal, 168 00:07:46,700 --> 00:07:50,430 datorn som standard kommer att antar att du vill ha ett heltal. 169 00:07:50,430 --> 00:07:54,620 Problemet dock, naturligtvis, är att 0,1 inte är ett heltal. 170 00:07:54,620 --> 00:07:55,680 Det är ett reellt tal. 171 00:07:55,680 --> 00:07:59,610 Och så vad datorn gör genom standard är det bara kastar bort 172 00:07:59,610 --> 00:08:01,070 allt efter decimalkommat. 173 00:08:01,070 --> 00:08:03,380 Det avrunda inte ner eller upp i sig. 174 00:08:03,380 --> 00:08:06,480 Det kastar bara bort allt efter decimalkommat. 175 00:08:06,480 --> 00:08:07,430 Och nu som är vettigt. 176 00:08:07,430 --> 00:08:09,740 För nu är vi klart kvar med noll. 177 00:08:09,740 --> 00:08:10,250 >> Men vänta en minut. 178 00:08:10,250 --> 00:08:11,840 Jag ser en int noll. 179 00:08:11,840 --> 00:08:14,910 Jag faktiskt ser 0,00. 180 00:08:14,910 --> 00:08:16,340 Så hur gör förena jag detta nu? 181 00:08:16,340 --> 00:08:22,850 Om man delat med 10 är noll, men jag är se 0.00, är ​​där det blir 182 00:08:22,850 --> 00:08:24,250 omvandlas tillbaka till ett reellt tal? 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 Exakt. 186 00:08:30,630 --> 00:08:35,600 >> Så här uppe i linje fem, när jag faktiskt lagra den 0,1, som sedan 187 00:08:35,600 --> 00:08:39,549 trunkeras till noll, insidan av en flottör, det är faktiskt motsvarar 188 00:08:39,549 --> 00:08:42,100 lagra det inte som en int, men, faktiskt, som ett flöte. 189 00:08:42,100 --> 00:08:46,540 Dessutom, jag använder sedan printf till uttryckligen skriva det numret till två 190 00:08:46,540 --> 00:08:49,740 decimaler även om det kanske inte egentligen vara något. 191 00:08:49,740 --> 00:08:51,020 >> Så denna typ av suger, eller hur? 192 00:08:51,020 --> 00:08:53,640 Tydligen kan man inte göra matte, åtminstone inte på denna nivå 193 00:08:53,640 --> 00:08:55,600 precision, i en dator. 194 00:08:55,600 --> 00:08:56,930 Men säkert finns det en lösning. 195 00:08:56,930 --> 00:09:00,410 Vad är det enklaste fix kunde vi kanske göra, även bara intuitivt här 196 00:09:00,410 --> 00:09:01,130 lösa detta? 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 Vänd heltalen in - 200 00:09:06,574 --> 00:09:06,976 Yeah. 201 00:09:06,976 --> 00:09:10,420 Även om jag inte är helt säker på vad som är verkligen händer här, om det 202 00:09:10,420 --> 00:09:13,440 grunden har att göra med dessa båda är ints, ja, varför gör inte jag 203 00:09:13,440 --> 00:09:18,230 göra att 10,0, vilket gör detta 1.0, spara om den. 204 00:09:18,230 --> 00:09:20,990 Låt mig gå tillbaka till botten och kompilera om. 205 00:09:20,990 --> 00:09:23,030 Låt mig nu repris. 206 00:09:23,030 --> 00:09:23,420 Och där - 207 00:09:23,420 --> 00:09:27,690 Nu har jag fått min en tiondel representerade som 0,10. 208 00:09:27,690 --> 00:09:28,420 >> Okej. 209 00:09:28,420 --> 00:09:29,220 Så det är inte dåligt. 210 00:09:29,220 --> 00:09:31,730 Och låt mig påpeka ett annat sätt vi kunde ha löst detta. 211 00:09:31,730 --> 00:09:35,580 Låt mig faktiskt rulla tillbaka i tiden till när vi hade detta som en 212 00:09:35,580 --> 00:09:36,680 tionde nyss. 213 00:09:36,680 --> 00:09:40,800 Och låt mig gå vidare och spara om den här filen som ett annat filnamn, bara för att 214 00:09:40,800 --> 00:09:41,750 har en liten checkpoint. 215 00:09:41,750 --> 00:09:43,450 Så det var version ett. 216 00:09:43,450 --> 00:09:45,520 Och låt mig nu gå vidare och göra ytterligare en version. 217 00:09:45,520 --> 00:09:48,540 Vi kallar denna version två noll indexerat. 218 00:09:48,540 --> 00:09:51,280 >> Och jag ska istället göra detta - vet du vad? 219 00:09:51,280 --> 00:09:54,400 Lägga prick noll fungerar i det här fallet. 220 00:09:54,400 --> 00:09:56,060 Men antar att man var en variabel. 221 00:09:56,060 --> 00:09:57,680 Förmodade 10 var en variabel. 222 00:09:57,680 --> 00:10:00,680 Med andra ord, antar att jag inte kunde bara hårt-kod 0,0 vid slutet 223 00:10:00,680 --> 00:10:02,340 av denna aritmetiska uttryck. 224 00:10:02,340 --> 00:10:05,820 Tja, kan jag faktiskt göra något inom parentes kallas gjutning. 225 00:10:05,820 --> 00:10:11,920 Jag kan kasta som heltal 10 till en flottör, och jag kan kasta det heltal man till en 226 00:10:11,920 --> 00:10:12,800 flyta, liksom. 227 00:10:12,800 --> 00:10:17,190 Då matten som kommer att göras effektivt 1,0 delat med 10,0, 228 00:10:17,190 --> 00:10:19,250 vars resultat går if som tidigare. 229 00:10:19,250 --> 00:10:26,130 Så om jag kompilerar detta som gör flöten 2, och nu flyter 2, får jag samma 230 00:10:26,130 --> 00:10:27,020 svara, liksom. 231 00:10:27,020 --> 00:10:29,640 >> Så detta är en ganska krystat exempel att lösa detta problem 232 00:10:29,640 --> 00:10:31,400 genom att införa gjutning. 233 00:10:31,400 --> 00:10:34,410 Men i allmänhet, är gjutning kommer att bli en kraftfull sak, särskilt för 234 00:10:34,410 --> 00:10:38,180 problem som två i en veckas tid, då du vill konvertera en datatyp till 235 00:10:38,180 --> 00:10:41,800 en annan att i slutet av dagen är representerade på samma sätt. 236 00:10:41,800 --> 00:10:44,970 Vid slutet av dagen, varenda som vi har pratat om hittills är 237 00:10:44,970 --> 00:10:46,710 bara ints under huven. 238 00:10:46,710 --> 00:10:48,950 Eller om det är för låg nivå för dig, de är bara siffror 239 00:10:48,950 --> 00:10:49,750 under huven. 240 00:10:49,750 --> 00:10:52,850 Även tecken, igen, minns från vecka noll, är siffror 241 00:10:52,850 --> 00:10:53,990 under huven. 242 00:10:53,990 --> 00:10:57,240 >> Vilket vill säga, kan vi konvertera mellan olika typer av tal om 243 00:10:57,240 --> 00:10:58,060 de är bara bitar. 244 00:10:58,060 --> 00:11:01,020 Vi kan konvertera mellan siffror och märker om de är bara 245 00:11:01,020 --> 00:11:02,580 bitar, och vice versa. 246 00:11:02,580 --> 00:11:07,170 Och gjutning på detta sätt är en mekanism i programmering som gör att du med våld 247 00:11:07,170 --> 00:11:10,970 ändra en datatyp till en annan. 248 00:11:10,970 --> 00:11:14,570 Tyvärr är det inte så enkelt som jag skulle ha velat. 249 00:11:14,570 --> 00:11:19,220 >> Jag kommer att gå tillbaka till flöten 1, var som de enklare, mer 250 00:11:19,220 --> 00:11:22,830 okomplicerad med 0,0 lades till varje. 251 00:11:22,830 --> 00:11:25,260 Och precis som en snabb repetition, låt mig gå vidare och kompilera 252 00:11:25,260 --> 00:11:27,670 detta, gör flottörer 2 - 253 00:11:27,670 --> 00:11:30,300 Tyvärr är detta göra flottörer 1. 254 00:11:30,300 --> 00:11:32,050 Och nu ska vi köra flottörer 1. 255 00:11:32,050 --> 00:11:34,810 Och i botten, märker att jag får faktiskt 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 inte än. 258 00:11:37,280 --> 00:11:40,000 Nu ska jag bli lite nyfiken, och jag kommer att gå tillbaka till min 259 00:11:40,000 --> 00:11:41,620 printf uttalande och säga, vet du vad? 260 00:11:41,620 --> 00:11:44,090 Jag skulle vilja bekräfta att detta är verkligen en tiondel. 261 00:11:44,090 --> 00:11:47,890 Och jag kommer att vilja se detta till, säg, fem decimaler. 262 00:11:47,890 --> 00:11:48,570 Det är inte ett problem. 263 00:11:48,570 --> 00:11:52,020 Jag ändrar två till fem, Jag kompilerar med make. 264 00:11:52,020 --> 00:11:53,770 Jag kör det som flyter 1. 265 00:11:53,770 --> 00:11:54,990 Ser ganska bra. 266 00:11:54,990 --> 00:11:58,570 Min Sanity kontroller kan sluta där, men Jag börjar bli lite mer äventyrligt. 267 00:11:58,570 --> 00:12:00,330 Jag ska byta från 0,5 till 0,10. 268 00:12:00,330 --> 00:12:03,440 Jag vill se 10 siffror efter den decimal. 269 00:12:03,440 --> 00:12:09,060 >> Och jag ska gå vidare och kompilera detta och köra flyter 1. 270 00:12:09,060 --> 00:12:13,060 Jag slags ånger ha testat detta vidare eftersom min matte är inte så 271 00:12:13,060 --> 00:12:14,320 korrigera längre, verkar det. 272 00:12:14,320 --> 00:12:15,630 Men vänta lite, kanske det är bara en lyckträff. 273 00:12:15,630 --> 00:12:17,810 Kanske datorn agerar lite konstigt. 274 00:12:17,810 --> 00:12:21,810 Låt mig gå vidare och göra 20 decimaler och försäkra mig om att jag vet 275 00:12:21,810 --> 00:12:22,540 hur man gör matten. 276 00:12:22,540 --> 00:12:23,460 Jag vet hur man programmerar. 277 00:12:23,460 --> 00:12:26,960 Gör flottörer 1, kompilera, och fan. 278 00:12:26,960 --> 00:12:31,110 Det är verkligen, verkligen få långt från märket. 279 00:12:31,110 --> 00:12:32,490 >> Så vad händer här? 280 00:12:32,490 --> 00:12:36,050 Intuitivt, baserat på våra antaganden tidigare om storleken på datatyper, 281 00:12:36,050 --> 00:12:38,040 vad ska hända här under huven? 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 Exakt. 285 00:12:43,590 --> 00:12:46,480 Om du vill ha denna mycket precision, och som är ett fan av mycket av precision - 286 00:12:46,480 --> 00:12:48,770 20 nummer efter decimalkommat. 287 00:12:48,770 --> 00:12:51,990 Du kan omöjligen utgöra en godtyckligt antal såvida du inte har en 288 00:12:51,990 --> 00:12:52,930 godtyckligt antal bitar. 289 00:12:52,930 --> 00:12:54,190 Men vi gör inte. 290 00:12:54,190 --> 00:12:57,200 För en flottör, har vi bara 32 bitar. 291 00:12:57,200 --> 00:13:02,260 >> Så om 32 bitar kan endast permuteras i ett sätt - precis som våra människor på, scen 292 00:13:02,260 --> 00:13:05,780 händerna upp eller ner - i ett ändligt antal sätt, det finns bara ett begränsat antal 293 00:13:05,780 --> 00:13:08,640 av reella tal kan representera med dessa bitar. 294 00:13:08,640 --> 00:13:10,500 Och så att datorn till slut kommer att behöva 295 00:13:10,500 --> 00:13:11,730 börjar slarva. 296 00:13:11,730 --> 00:13:15,500 Datorn kan dölja dessa uppgifter från oss för lite tid. 297 00:13:15,500 --> 00:13:18,880 Men om vi börjar peta på siffrorna och ser längre och längre vid 298 00:13:18,880 --> 00:13:23,220 släpande nummer i heltal, då vi börjar att se att det är 299 00:13:23,220 --> 00:13:26,480 faktiskt approximera tanken på en tiondel. 300 00:13:26,480 --> 00:13:29,860 >> Och så visar det sig, tragiskt, det finns ett oändligt antal siffror 301 00:13:29,860 --> 00:13:35,060 Vi kan inte representeras exakt i en dator, åtminstone med en ändlig 302 00:13:35,060 --> 00:13:38,030 antal bitar, en ändlig mängden RAM-minne. 303 00:13:38,030 --> 00:13:41,210 Nu tyvärr, detta ibland har verkliga konsekvenser. 304 00:13:41,210 --> 00:13:45,980 Om människor inte riktigt uppskattar detta eller typ av tar för givet 305 00:13:45,980 --> 00:13:48,310 att deras dator kommer bara göra det de säger att det ska göra och inte 306 00:13:48,310 --> 00:13:51,430 förstå dessa underliggande representation detaljer - 307 00:13:51,430 --> 00:13:55,290 som, uppriktigt sagt, i vissa språk är dolda för användaren, till skillnad från i C - 308 00:13:55,290 --> 00:13:56,500 några dåliga saker kan hända. 309 00:13:56,500 --> 00:13:58,650 >> Och vad jag trodde vi skulle göra är att ta ett steg tillbaka. 310 00:13:58,650 --> 00:14:00,420 Och det handlar om en åtta minuters video. 311 00:14:00,420 --> 00:14:04,200 Det luftade för några år sedan, och det ger insikter faktiskt vad kan gå 312 00:14:04,200 --> 00:14:09,290 fel när du underrepresenterade uppskatta dessa typer av detaljer i mycket alltför 313 00:14:09,290 --> 00:14:10,080 verkliga världen. 314 00:14:10,080 --> 00:14:12,965 Om vi ​​kunde dämpa belysningen under några minuter. 315 00:14:12,965 --> 00:14:14,360 >> Högtalare 1: Vi återvänder nu till teknik 316 00:14:14,360 --> 00:14:17,160 katastrofer på Modern Marvels. 317 00:14:17,160 --> 00:14:18,680 >> Datorer - 318 00:14:18,680 --> 00:14:21,340 vi har kommit allt för att acceptera ofta frustrerande problem 319 00:14:21,340 --> 00:14:23,170 att gå med dem. 320 00:14:23,170 --> 00:14:27,570 Buggar, virus och buggar programvara är små priser att betala för 321 00:14:27,570 --> 00:14:28,960 bekvämlighet. 322 00:14:28,960 --> 00:14:32,040 Men i high-tech och high-speed militära och rymdprogram 323 00:14:32,040 --> 00:14:38,650 ansökningar, den minsta problemet kan förstoras till katastrof. 324 00:14:38,650 --> 00:14:44,480 >> Den 4 juni 1996 beredda forskare att lansera en obemannad Ariane 5-raket. 325 00:14:44,480 --> 00:14:48,700 Det medförde vetenskapliga satelliter utformad för att fastställa exakt hur 326 00:14:48,700 --> 00:14:53,250 jordens magnetfält interagerar med solvinden. 327 00:14:53,250 --> 00:14:57,540 Raketen byggdes för den europeiska Rymdorganisationen och lyfte från sin 328 00:14:57,540 --> 00:14:59,906 anläggning på kusten i Franska Guyana. 329 00:14:59,906 --> 00:15:03,660 >> JACK GANSSLE: Vid ca 37 sekunder in flygningen, märkte de först 330 00:15:03,660 --> 00:15:04,910 något var fel. 331 00:15:04,910 --> 00:15:08,130 Munstyckena var svängbar i ett sätt som de borde verkligen inte. 332 00:15:08,130 --> 00:15:12,380 Cirka 40 sekunder in i flygningen, tydligt att fordonet var i trubbel. 333 00:15:12,380 --> 00:15:14,400 Och det är då de gjorde en Beslutet att förstöra den. 334 00:15:14,400 --> 00:15:18,520 Utbudet säkerhetsansvarig, med enorma tarmar, tryckte på knappen, 335 00:15:18,520 --> 00:15:23,900 sprängde raketen innan den kunde blivit en fara för den allmänna säkerheten. 336 00:15:23,900 --> 00:15:27,810 >> Högtalare 1: Detta var jungfruresa av den 5 Ariane, och dess undergång 337 00:15:27,810 --> 00:15:32,020 skedde på grund av en inbäddad fel i raketens programvaran. 338 00:15:32,020 --> 00:15:33,980 >> JACK GANSSLE: Problemet om Ariane var att det fanns ett antal 339 00:15:33,980 --> 00:15:36,390 att erforderliga 64 bitar för att uttrycka. 340 00:15:36,390 --> 00:15:39,420 Och de ville att konvertera till ett 16-bitars nummer. 341 00:15:39,420 --> 00:15:43,130 De antas att antalet var aldrig kommer att vara mycket stort, att de flesta av 342 00:15:43,130 --> 00:15:46,810 dessa siffror i 64-bitars Antalet var nollor. 343 00:15:46,810 --> 00:15:48,270 De hade fel. 344 00:15:48,270 --> 00:15:51,380 >> Högtalare 1: Oförmågan hos en programvara program för att acceptera den typ av 345 00:15:51,380 --> 00:15:55,350 nummer som genereras av en annan var vid roten av misslyckande. 346 00:15:55,350 --> 00:15:59,970 Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. 347 00:15:59,970 --> 00:16:03,980 Ariane 4 raket hade varit mycket framgångsrik, så mycket av programvaran 348 00:16:03,980 --> 00:16:07,480 skapas för det var också används i Ariane 5. 349 00:16:07,480 --> 00:16:11,980 >> PHILIP Coyle: Det grundläggande problemet var att Ariane 5 var snabbare, 350 00:16:11,980 --> 00:16:13,720 accelererat snabbare. 351 00:16:13,720 --> 00:16:17,250 Och mjukvaran hade inte stod för det. 352 00:16:17,250 --> 00:16:20,770 >> SPEAKER 1: Förstörelsen av raketen var en enorm ekonomisk katastrof, 353 00:16:20,770 --> 00:16:24,200 allt på grund av en minut programvarufel. 354 00:16:24,200 --> 00:16:27,820 Men detta var inte första gången på uppgifter omställningsproblem hade plågat modern 355 00:16:27,820 --> 00:16:30,620 raketteknologi. 356 00:16:30,620 --> 00:16:34,480 >> JACK GANSSLE: Under 1991, med början av det första Gulfkriget, Patriot 357 00:16:34,480 --> 00:16:38,610 missil upplevt en liknande slag av ett antal konvertering problem. 358 00:16:38,610 --> 00:16:44,910 Som ett resultat, var 28 amerikanska soldater dödade och cirka 100 andra skadades 359 00:16:44,910 --> 00:16:48,600 när Patriot, som var tänkt att skydda mot inkommande Scuds, 360 00:16:48,600 --> 00:16:51,630 misslyckats med att avfyra en missil. 361 00:16:51,630 --> 00:16:55,110 >> Högtalare 1: När Irak invaderade Kuwait och Amerika lanserade Desert Storm i 362 00:16:55,110 --> 00:17:00,570 början av 1991, Patriot batterier utplacerades för att skydda Saudiarabien 363 00:17:00,570 --> 00:17:04,760 och Israel från irakiska Scud missiler. 364 00:17:04,760 --> 00:17:09,720 Patriot är ett amerikanskt medium-range surface-to-air system som tillverkas av 365 00:17:09,720 --> 00:17:11,569 Raytheon företaget. 366 00:17:11,569 --> 00:17:16,410 >> THEODORE POSTOL: Storleken på Patriot interceptor i sig är ungefär 367 00:17:16,410 --> 00:17:17,710 20-meter lång. 368 00:17:17,710 --> 00:17:20,800 Och den väger ca 2000 pounds. 369 00:17:20,800 --> 00:17:22,940 Och det bär en stridsspets på ca - 370 00:17:22,940 --> 00:17:24,905 Jag tror det är ungefär 150 pounds. 371 00:17:24,905 --> 00:17:31,030 Och stridsspetsen sig är en högexplosiva som har 372 00:17:31,030 --> 00:17:33,270 fragment runt den. 373 00:17:33,270 --> 00:17:37,490 Höljet på stridsspetsen är konstruerad att agera som hagel. 374 00:17:37,490 --> 00:17:40,720 >> Högtalare 1: De missiler genomförs fyra per container och transporteras 375 00:17:40,720 --> 00:17:43,050 genom en semi trailer. 376 00:17:43,050 --> 00:17:47,490 >> PHILIP Coyle: The Patriot anti-missil Systemet går tillbaka på 377 00:17:47,490 --> 00:17:50,710 minst 20 år nu. 378 00:17:50,710 --> 00:17:54,350 Den var ursprungligen avsedd som luftvärnssystem missil till 379 00:17:54,350 --> 00:17:56,190 skjuta ner fientliga flygplan. 380 00:17:56,190 --> 00:18:02,490 I det första Gulfkriget, då det kriget kom, ville armén för att använda den 381 00:18:02,490 --> 00:18:05,535 att skjuta ner Scuds, inte flygplan. 382 00:18:05,535 --> 00:18:09,310 Den irakiska flygvapnet var inte så mycket av ett problem. 383 00:18:09,310 --> 00:18:12,450 Men armén var orolig Scuds. 384 00:18:12,450 --> 00:18:15,950 Och så de försökte uppgradera Patriot. 385 00:18:15,950 --> 00:18:18,750 >> Högtalare 1: Fånga upp en fiende missil färdas i Mach fem var 386 00:18:18,750 --> 00:18:20,890 kommer att vara utmanande nog. 387 00:18:20,890 --> 00:18:25,590 Men när Patriot var rusade in tjänsten, var armén inte medveten om en 388 00:18:25,590 --> 00:18:31,710 Irakiska modifiering som gjorde deras Scuds nästan omöjligt att slå. 389 00:18:31,710 --> 00:18:35,240 >> THEODORE POSTOL: Vad hände är de Scuds som var 390 00:18:35,240 --> 00:18:36,570 kommer in var instabila. 391 00:18:36,570 --> 00:18:37,532 De vinglar. 392 00:18:37,532 --> 00:18:43,220 Anledningen till detta var irakierna, i För att få 600 mil ur ett 393 00:18:43,220 --> 00:18:47,530 300-kilometer-range missil, tog vikten av den främre stridsspets. 394 00:18:47,530 --> 00:18:49,290 De gjorde stridsspets ljusare. 395 00:18:49,290 --> 00:18:53,110 Så nu Patriot försöker att komma på Scud. 396 00:18:53,110 --> 00:18:56,470 Och för det mesta, den överväldigande majoriteten av tiden, skulle det bara 397 00:18:56,470 --> 00:18:58,730 flyga genom Scud. 398 00:18:58,730 --> 00:19:01,760 >> Högtalare 1: När Patriot systemet operatörer insåg Patriot missade 399 00:19:01,760 --> 00:19:06,690 sitt mål, detonerade de patrioterna stridsspets för att undvika eventuell 400 00:19:06,690 --> 00:19:10,300 olycksoffer, om den fick att falla till marken. 401 00:19:10,300 --> 00:19:14,540 >> THEODORE POSTOL: Det var vad de flesta människor såg som stora eldklot på himlen 402 00:19:14,540 --> 00:19:20,350 och missförstådd som fångar av Scud stridsspetsar. 403 00:19:20,350 --> 00:19:23,320 >> Högtalare 1: Även i natt himlen Patriots verkade vara framgångsrikt 404 00:19:23,320 --> 00:19:27,530 förstöra Scuds, vid Dhahran där kunde vara något misstag om dess 405 00:19:27,530 --> 00:19:29,140 prestanda. 406 00:19:29,140 --> 00:19:34,180 Där förlorade Patriot radarsystem koll på ett inkommande Scud och aldrig 407 00:19:34,180 --> 00:19:36,380 lanserades på grund av en programvara fel. 408 00:19:36,380 --> 00:19:39,890 409 00:19:39,890 --> 00:19:42,700 >> Det var israelerna som först upptäckte att ju längre systemet 410 00:19:42,700 --> 00:19:48,020 var på, desto större tidsavvikelse blev på grund av en klocka 411 00:19:48,020 --> 00:19:50,470 inbäddade i systemets dator. 412 00:19:50,470 --> 00:19:54,640 >> JACK GANSSLE: Cirka två veckor före Tragedin i Dhahran, israelerna 413 00:19:54,640 --> 00:19:58,440 rapporteras till Försvarsdepartementet att systemet var att förlora tid. 414 00:19:58,440 --> 00:20:01,280 Efter ca åtta timmars drift, de märkte att systemet är 415 00:20:01,280 --> 00:20:03,530 bli märkbart mindre exakt. 416 00:20:03,530 --> 00:20:07,710 Försvarsdepartementet svarade med träffande alla Patriot batterierna 417 00:20:07,710 --> 00:20:10,500 att inte lämna de system på under en längre tid. 418 00:20:10,500 --> 00:20:12,430 De sa aldrig vad en lång tid var. 419 00:20:12,430 --> 00:20:13,330 Åtta timmar? 420 00:20:13,330 --> 00:20:13,810 10 timmar? 421 00:20:13,810 --> 00:20:14,990 1000 timmar? 422 00:20:14,990 --> 00:20:17,150 Ingen visste. 423 00:20:17,150 --> 00:20:20,220 >> Högtalare 1: The Patriot Batteriet stationerad vid barackerna på Dhahran 424 00:20:20,220 --> 00:20:24,660 och dess bristfälliga interna klockan hade varit på över 100 timmar på natten 425 00:20:24,660 --> 00:20:27,470 25 februari. 426 00:20:27,470 --> 00:20:31,770 >> JACK GANSSLE: Det spårade tid till en noggrannhet på ungefär en tiondels sekund. 427 00:20:31,770 --> 00:20:34,480 Nu, är en tiondel av en sekund en intressant siffra eftersom det inte kan vara 428 00:20:34,480 --> 00:20:39,940 uttryckt i binär exakt, vilket innebär det kan inte uttryckas exakt i 429 00:20:39,940 --> 00:20:42,500 varje modern digital dator. 430 00:20:42,500 --> 00:20:46,920 Det är svårt att tro, men använda detta som ett exempel. 431 00:20:46,920 --> 00:20:49,000 Låt oss ta numret en tredjedel. 432 00:20:49,000 --> 00:20:53,150 En tredjedel kan inte uttryckas i decimal exakt. 433 00:20:53,150 --> 00:20:57,500 En tredjedel är 0,333 gå på för oändligheten. 434 00:20:57,500 --> 00:21:02,270 Det finns inget sätt att göra det med absolut noggrannhet i decimal. 435 00:21:02,270 --> 00:21:05,370 Det är precis samma typ av problem som hände i Patriot. 436 00:21:05,370 --> 00:21:09,880 Ju längre systemet sprang, den värsta tiden felet blev. 437 00:21:09,880 --> 00:21:13,840 >> Högtalare 1: Efter 100 timmars drift, felet i tiden var bara 438 00:21:13,840 --> 00:21:16,140 ungefär en tredjedel av en sekund. 439 00:21:16,140 --> 00:21:20,800 Men i termer av att en missil färdas i Mach fem, resulterade det i 440 00:21:20,800 --> 00:21:24,410 ett tracking error över 600 meter. 441 00:21:24,410 --> 00:21:27,670 Det skulle vara ett fatalt misstag för soldaterna vid Dhahran. 442 00:21:27,670 --> 00:21:33,450 >> THEODORE POSTOL: Vad hände är en Scud lanseringen upptäcktes i början av 443 00:21:33,450 --> 00:21:34,280 varning satelliter. 444 00:21:34,280 --> 00:21:38,550 Och de visste att Scud skulle komma i deras allmänna riktning. 445 00:21:38,550 --> 00:21:41,000 De visste inte om det skulle komma. 446 00:21:41,000 --> 00:21:43,900 >> Högtalare 1: Det var nu upp till radarn komponent av Patriot-systemet 447 00:21:43,900 --> 00:21:48,910 försvara Dhahran att lokalisera och hålla koll på inkommande fientliga missiler. 448 00:21:48,910 --> 00:21:50,580 >> JACK GANSSLE: Radarn var mycket smart. 449 00:21:50,580 --> 00:21:53,770 Det skulle faktiskt spåra positionen för den Scud och sedan förutsäga var det 450 00:21:53,770 --> 00:21:57,160 förmodligen skulle bli nästa gång radarn skickade en puls ut. 451 00:21:57,160 --> 00:21:58,870 Det kallades området grinden. 452 00:21:58,870 --> 00:22:04,020 >> THEODORE POSTOL: Sen när Patriot beslutar tillräckligt med tid har gått för att gå 453 00:22:04,020 --> 00:22:09,420 tillbaka och kontrollera nästa läge för Detta objekt som upptäckts, går det tillbaka. 454 00:22:09,420 --> 00:22:14,450 Så när det gick tillbaka till fel plats, ser det då inget objekt. 455 00:22:14,450 --> 00:22:18,200 Och den beslutar att det inte fanns något föremål, det var ett falsklarm, och 456 00:22:18,200 --> 00:22:19,680 droppar spåret. 457 00:22:19,680 --> 00:22:22,970 >> Högtalare 1: Den inkommande Scud försvann från radarskärmen, och 458 00:22:22,970 --> 00:22:26,050 sekunder senare det mitt framför näsan in i kasernerna. 459 00:22:26,050 --> 00:22:31,950 Den Scud dödade 28 och var den sista sköt under det första Gulfkriget. 460 00:22:31,950 --> 00:22:37,700 Tragiskt, kom den uppdaterade programvaran på Dhahran följande dag. 461 00:22:37,700 --> 00:22:41,800 Programvaran fel hade fastställts, stänga ett kapitel i den oroliga 462 00:22:41,800 --> 00:22:43,690 historia Patriot missil. 463 00:22:43,690 --> 00:22:46,780 464 00:22:46,780 --> 00:22:50,710 >> Patriot är egentligen en förkortning för fasstyrda spårning 465 00:22:50,710 --> 00:22:51,960 Skärningspunkt Target. 466 00:22:51,960 --> 00:22:54,650 467 00:22:54,650 --> 00:23:00,840 >> DAVID J MALAN: Okej, så en nyktra exempel, för att vara säker. 468 00:23:00,840 --> 00:23:03,430 Och lyckligtvis är dessa lägre nivå buggar är inte något som vi kommer 469 00:23:03,430 --> 00:23:06,220 typiskt att uppskatta, verkligen inte med några av våra 470 00:23:06,220 --> 00:23:07,360 tidigaste av programmen. 471 00:23:07,360 --> 00:23:10,450 Snarare, de flesta av de buggar kommer du Mötet kommer att vara logiskt i naturen, 472 00:23:10,450 --> 00:23:12,900 syntaktisk i naturen varigenom koden fungerar inte rätt. 473 00:23:12,900 --> 00:23:14,140 Och du vet att det ganska snabbt. 474 00:23:14,140 --> 00:23:16,850 >> Men framför allt när vi kommer till slutet av terminen, det kommer att 475 00:23:16,850 --> 00:23:20,620 blivit mer och mer av en möjlighet att verkligen tänka till om designen 476 00:23:20,620 --> 00:23:22,960 av ditt program och den underliggande representation 477 00:23:22,960 --> 00:23:24,520 där också, av data. 478 00:23:24,520 --> 00:23:28,010 Till exempel kommer vi att presentera MySQL, vilket är en populär databas motor 479 00:23:28,010 --> 00:23:30,850 som du kan använda med webbplatser för att lagra data på bakändan. 480 00:23:30,850 --> 00:23:34,630 Och du måste börja att besluta I slutet av terminen inte bara vad 481 00:23:34,630 --> 00:23:38,790 typer av data längs dessa linjer för att använda men exakt hur många bitar att använda, 482 00:23:38,790 --> 00:23:42,740 om du vill lagra datum som datum och tider som tider, och även 483 00:23:42,740 --> 00:23:46,890 saker som hur stor vill du ha den unika ID: n för att vara för, säg, användare 484 00:23:46,890 --> 00:23:47,680 i din databas. 485 00:23:47,680 --> 00:23:51,210 >> I själva verket, om någon av er har haft Facebook står för en ganska lång tid, 486 00:23:51,210 --> 00:23:53,680 och du vet hur man får tillgång till ditt användar-ID - 487 00:23:53,680 --> 00:23:57,930 vilket visar ibland upp i din profilens webbadress om du inte har valt en 488 00:23:57,930 --> 00:24:02,070 smeknamn för URL, eller om du har använda Facebooks Graph API, den 489 00:24:02,070 --> 00:24:05,510 allmänt tillgängliga API med vilket du kan be Facebook för rådata - 490 00:24:05,510 --> 00:24:07,580 du kan se vad din numeriska ID är. 491 00:24:07,580 --> 00:24:10,880 Och några år sedan, Facebook huvudsak tvungen att byta från att använda 492 00:24:10,880 --> 00:24:15,980 motsvarande ints att använda långa länge eftersom tiden som användarna kommer 493 00:24:15,980 --> 00:24:19,780 och gå och skapa massor av konton och falska konton, även de mycket enkelt 494 00:24:19,780 --> 00:24:24,630 kunde uttömma något som en 4 miljarder möjliga värde som en int. 495 00:24:24,630 --> 00:24:28,340 >> Så mer om dessa typer av frågor på vägen, liksom. 496 00:24:28,340 --> 00:24:30,750 Okej, så det var gjutning. 497 00:24:30,750 --> 00:24:31,670 Det var otydligt. 498 00:24:31,670 --> 00:24:32,730 Ett par snabba meddelanden. 499 00:24:32,730 --> 00:24:35,710 Så avsnitten börjar formellt denna kommande Söndag, måndag, tisdag. 500 00:24:35,710 --> 00:24:39,080 Du kommer att höra via e-post senare denna vecka om din sektion uppdrag. 501 00:24:39,080 --> 00:24:42,570 Och du kommer också här på den punkten hur att ändra din sektion om din 502 00:24:42,570 --> 00:24:45,660 schema har nu ändrats eller din komfortnivå har nu förändrats. 503 00:24:45,660 --> 00:24:49,380 Samtidigt P-set ett och hacker man är beror denna torsdag med möjlighet att 504 00:24:49,380 --> 00:24:52,450 förlänga denna tidsfrist per den specifikationer till fredag 505 00:24:52,450 --> 00:24:53,830 i ett typiskt sätt. 506 00:24:53,830 --> 00:24:57,500 >> Inse att inkluderas med problemet uppsättning specifikationer instruktioner om 507 00:24:57,500 --> 00:25:02,770 hur man använder CS50 apparaten, gör, samt några CS50 specifika verktyg 508 00:25:02,770 --> 00:25:06,540 som 50 stil, som kan ge dig med återkoppling dynamiskt på 509 00:25:06,540 --> 00:25:10,230 kvaliteten på din kod stil och även kolla 50, vilket kan ge dig 510 00:25:10,230 --> 00:25:13,160 dynamisk återkoppling på ditt kodens korrekthet. 511 00:25:13,160 --> 00:25:16,850 Förlåt att vi fortfarande strykning ut några kinks med check 50. 512 00:25:16,850 --> 00:25:21,490 Några av dina klasskamrater som fick börja runt 04:00 på fredag ​​kväll när 513 00:25:21,490 --> 00:25:25,130 spec gick upp har märkt sedan några buggar som vi arbetar 514 00:25:25,130 --> 00:25:29,010 igenom, och ber om ursäkt för alla som har upplevt onödiga frustrationer. 515 00:25:29,010 --> 00:25:30,340 Felet är mitt. 516 00:25:30,340 --> 00:25:34,080 Men vi ska följa upp CS50 diskutera när det är löst. 517 00:25:34,080 --> 00:25:35,700 >> Så ett ord om poängen själva. 518 00:25:35,700 --> 00:25:38,990 Så det kommer att bli en vecka eller två innan du börjar få feedback på problemsamlingar 519 00:25:38,990 --> 00:25:40,640 eftersom du inte ännu har en undervisning karl. 520 00:25:40,640 --> 00:25:44,510 Och även då kommer vi att börja utvärdera C problemet uppsättningar innan vi 521 00:25:44,510 --> 00:25:46,970 gå tillbaka och utvärdera scratch så att du får mer relevanta 522 00:25:46,970 --> 00:25:48,150 återkoppling snabbare. 523 00:25:48,150 --> 00:25:51,870 Men i allmänhet per kursplanen, CS50 problemsamlingar utvärderas längs 524 00:25:51,870 --> 00:25:53,580 efter fyra axlar - 525 00:25:53,580 --> 00:25:55,760 omfattning, korrekthet, design och stil. 526 00:25:55,760 --> 00:25:59,210 >> Scope kommer att bli ett antal typiskt mellan noll och fem som 527 00:25:59,210 --> 00:26:01,830 fångar hur mycket av pjäs som du bet av. 528 00:26:01,830 --> 00:26:03,750 Vanligtvis vill du att detta ska vara fem. 529 00:26:03,750 --> 00:26:05,300 Du åtminstone försökt allt. 530 00:26:05,300 --> 00:26:09,330 Och märker att det är en multiplikativ faktor så att göra endast en del av 531 00:26:09,330 --> 00:26:12,520 problembild är inte den bästa strategin. 532 00:26:12,520 --> 00:26:15,610 >> Under tiden, mer uppenbara är vikten av korrekthet - 533 00:26:15,610 --> 00:26:18,620 bara är ditt program stämmer med respektera specifikationen? 534 00:26:18,620 --> 00:26:21,510 Detta viktas medvetet mer hårdare än de andra två axlarna medelst en 535 00:26:21,510 --> 00:26:24,450 faktor tre eftersom vi inser som normalt du kommer att tillbringa en 536 00:26:24,450 --> 00:26:28,600 mycket mer tid att jaga ned en del buggar, få din kod till arbete, då du 537 00:26:28,600 --> 00:26:31,540 är indentering det och välja lämpliga variabelnamn och 538 00:26:31,540 --> 00:26:33,800 vill, är som i den andra änden av spektrumet av stil. 539 00:26:33,800 --> 00:26:36,160 >> Det är inte att säga stil är inte viktigt, och vi ska predika det över 540 00:26:36,160 --> 00:26:37,920 tid både i föreläsningar och i avsnitten. 541 00:26:37,920 --> 00:26:40,520 Style hänvisar till estetik av din kod. 542 00:26:40,520 --> 00:26:43,980 Har du valt väl namngivna variabler som är korta men något 543 00:26:43,980 --> 00:26:44,680 beskrivande? 544 00:26:44,680 --> 00:26:47,840 Är din kod indragen som du har sett i föreläsning och på ett sätt som är förenligt 545 00:26:47,840 --> 00:26:49,070 med stil 50? 546 00:26:49,070 --> 00:26:51,220 >> Slutligen är mönsterrätt där i mitten. 547 00:26:51,220 --> 00:26:54,090 Design är det svårare en att sätta en fingret på eftersom det är mycket mer 548 00:26:54,090 --> 00:26:55,000 subjektiv. 549 00:26:55,000 --> 00:26:58,610 Men det är kanske det viktigaste av de tre axlarna i form av pedagogiska 550 00:26:58,610 --> 00:27:02,050 värde över tiden och att detta kommer att vara undervisningen stipendiatens möjlighet att 551 00:27:02,050 --> 00:27:04,110 förse dig med kvalitativ feedback. 552 00:27:04,110 --> 00:27:08,100 Sannerligen, i CS50 fastän vi har dessa formler och ställningar, i slutet 553 00:27:08,100 --> 00:27:11,350 av dagen dessa är mycket medvetet mycket små hinkar - punktvärden 554 00:27:11,350 --> 00:27:13,460 mellan noll och tre och noll och fem. 555 00:27:13,460 --> 00:27:17,800 Vi försöker inte att dra mycket grova linjer mellan problemsamlingar eller mellan 556 00:27:17,800 --> 00:27:21,490 studenter utan snarare fokusera så mycket som vi kan på kvalitativa, longhand 557 00:27:21,490 --> 00:27:25,490 återkoppling, antingen maskinskriven eller verbalt från din undervisning karl, 558 00:27:25,490 --> 00:27:27,050 du får känna ganska bra. 559 00:27:27,050 --> 00:27:32,340 >> Men i allmänhet, de är vikterna att de olika axlarna kommer att ha. 560 00:27:32,340 --> 00:27:35,480 Under tiden också, det är värt att hålla i ihåg att du inte bör anta att en 561 00:27:35,480 --> 00:27:38,870 tre av fem är en 60% och därför grovt misslyckas. 562 00:27:38,870 --> 00:27:41,410 Tre är medvetet tänkt att vara slags mitten av vägen bra. 563 00:27:41,410 --> 00:27:43,480 Om du får treor på början av terminen, det är 564 00:27:43,480 --> 00:27:46,340 faktiskt tänkt att vara ett bra ställe att börja. 565 00:27:46,340 --> 00:27:50,510 Om du får tvåor, mässor, det finns definitivt en del arbete för att betala lite 566 00:27:50,510 --> 00:27:53,250 mer uppmärksamhet, för att ta tillvara av sektioner och kontorstider. 567 00:27:53,250 --> 00:27:54,590 >> Om du får fyror och femmor, bra. 568 00:27:54,590 --> 00:27:57,430 Men egentligen, hoppas vi att se banor bland studenter - mycket 569 00:27:57,430 --> 00:28:00,575 individualiserad per elev, men börjar terminen här i form av 570 00:28:00,575 --> 00:28:04,100 de två till tre intervall men slutar här uppe i 4:56 sortiment. 571 00:28:04,100 --> 00:28:05,440 Det är vad vi egentligen letar efter. 572 00:28:05,440 --> 00:28:09,590 Och vi håller i minnet deltat som du uppvisar mellan vecka noll och vecka 573 00:28:09,590 --> 00:28:12,170 12 när jag gör kvaliteter. 574 00:28:12,170 --> 00:28:16,380 Det spelar ingen roll för oss absolut hur du rättvis i början om din 575 00:28:16,380 --> 00:28:19,330 bana är verkligen uppåt och stark. 576 00:28:19,330 --> 00:28:24,000 >> Akademisk hederlighet - så låt mig sätta på min allvarligare röst för bara ett ögonblick. 577 00:28:24,000 --> 00:28:28,510 Så här kursen har skillnaden av skicka fler studenter än någon annan 578 00:28:28,510 --> 00:28:30,950 i historien till annonsen styrelse, tror jag. 579 00:28:30,950 --> 00:28:34,220 Vi har liksom tappat räkningen på detta punkt i hur ofta detta händer. 580 00:28:34,220 --> 00:28:37,090 Och det är inte för att elever i 50 är något mer oärligt än deras 581 00:28:37,090 --> 00:28:38,690 klasskamrater håll. 582 00:28:38,690 --> 00:28:42,800 Men inser också att vi är mycket bra på att upptäcka denna typ av sak. 583 00:28:42,800 --> 00:28:45,920 >> Och det är den fördel som en datavetenskap klassen har i att vi 584 00:28:45,920 --> 00:28:49,110 kan och vi jämför alla elever Problemet ställer parvis mot varje 585 00:28:49,110 --> 00:28:51,470 andra, inte bara i år men alla tidigare år. 586 00:28:51,470 --> 00:28:55,080 Vi har förmågan, liksom elever i klassen, till Google och hitta koden 587 00:28:55,080 --> 00:28:57,440 på webbplatser som github och diskussionsforum. 588 00:28:57,440 --> 00:29:00,840 Det finns absolut lösningar på CS50: s p-set flyter runt där. 589 00:29:00,840 --> 00:29:02,710 Men om du kan hitta dem, vi kan hitta dem. 590 00:29:02,710 --> 00:29:07,130 Och allt detta är mycket automatiserad och enkelt och tråkigt för oss att hitta. 591 00:29:07,130 --> 00:29:10,990 >> Men jag vill betona, också, att kursens akademisk hederlighet policy är 592 00:29:10,990 --> 00:29:13,960 mycket tänkt att vara mycket motsatsen till den andan. 593 00:29:13,960 --> 00:29:17,506 I själva verket, i år har vi omformulerats saker i kursplanen för att vara här, prick 594 00:29:17,506 --> 00:29:19,790 dot dot, med närmare i kursplanen. 595 00:29:19,790 --> 00:29:22,860 Men det övergripande temat i kursen verkligen är att vara rimligt. 596 00:29:22,860 --> 00:29:26,160 Vi inser att det finns en betydande mängd pedagogiska 597 00:29:26,160 --> 00:29:30,550 värde i samarbeta, i viss utsträckning, med klasskamrater, där du 598 00:29:30,550 --> 00:29:33,700 två eller tre eller fler är stående vid en whiteboard 599 00:29:33,700 --> 00:29:35,670 whiteboard, så att tala, dina idéer - 600 00:29:35,670 --> 00:29:39,480 skriva ut pseudokod i bilder, diagramming vad ska Mario vara om 601 00:29:39,480 --> 00:29:41,350 du skulle skriva det första i pseudokod. 602 00:29:41,350 --> 00:29:43,240 Vad bör giriga algoritm - 603 00:29:43,240 --> 00:29:46,100 hur ska den bete sig per problem ställer man? 604 00:29:46,100 --> 00:29:50,440 >> Och så inser att beteendet att vi uppmuntrar är mycket 605 00:29:50,440 --> 00:29:51,470 mycket längs dessa linjer. 606 00:29:51,470 --> 00:29:53,890 Och i kursplanen, ser du en massa kulor under ett 607 00:29:53,890 --> 00:29:57,740 rimlig kategori och en inte rimligt kategori som hjälper oss att hjälpa 608 00:29:57,740 --> 00:30:00,740 du svepa dig runt där Vi drar den linjen. 609 00:30:00,740 --> 00:30:04,340 Och i allmänhet, en hygglig tumregel är att om du kämpar för att lösa 610 00:30:04,340 --> 00:30:07,990 en del buggar och din vän eller klasskamrat sitter bredvid dig, är det 611 00:30:07,990 --> 00:30:11,530 rimligt för dig att visa honom eller henne din kod och säga hej, kan du hjälpa 612 00:30:11,530 --> 00:30:13,700 mig räkna ut vad som går fel här? 613 00:30:13,700 --> 00:30:17,110 >> Vi brukar inte anamma den motsatta sidan. 614 00:30:17,110 --> 00:30:20,730 Det är inte ett korrekt svar för din vän eller klasskamrat här för att säga, åh, 615 00:30:20,730 --> 00:30:22,510 titta bara på mig och figur den ut från det. 616 00:30:22,510 --> 00:30:24,400 Det är en slags orimlig. 617 00:30:24,400 --> 00:30:27,750 Men att ha någon annan, en annan hjärna, ett annat par ögon ser på 618 00:30:27,750 --> 00:30:31,620 skärmen eller titta på din kod Och säg, är du säker på att du vill 619 00:30:31,620 --> 00:30:32,760 att ha en slinga här? 620 00:30:32,760 --> 00:30:34,800 Eller är du säker på att du vill att semikolon här? 621 00:30:34,800 --> 00:30:37,090 Eller åh, innebär att felmeddelandet detta. 622 00:30:37,090 --> 00:30:39,580 De är mycket rimliga och uppmuntrade beteenden. 623 00:30:39,580 --> 00:30:44,010 >> De fall som jag syftade på tidigare koka ner till när eleverna är 624 00:30:44,010 --> 00:30:47,350 sent på natten gör dåligt omdöme beslut och skicka e-post sin kod till 625 00:30:47,350 --> 00:30:50,130 någon annan eller bara säga, Här är det i Dropbox eller 626 00:30:50,130 --> 00:30:51,610 Googla sent på natten. 627 00:30:51,610 --> 00:30:54,880 Och så skulle jag uppmuntra och ber er, om du inte har de oundvikliga 628 00:30:54,880 --> 00:30:58,450 stunder av stress, du stöta upp mot deadline, har du ingen sen 629 00:30:58,450 --> 00:31:01,490 dag eftersom det är redan fredag ​​vid den punkt, maila kursens huvuden eller 630 00:31:01,490 --> 00:31:02,330 själv direkt. 631 00:31:02,330 --> 00:31:04,790 Säg, lyssna, jag är på min bristningsgränsen här. 632 00:31:04,790 --> 00:31:06,660 Låt oss ha en konversation och räkna ut det. 633 00:31:06,660 --> 00:31:10,400 Tillgripa banan eller något annat inte rimligt beteende är aldrig 634 00:31:10,400 --> 00:31:13,070 lösning, och alltför många av dina klasskamrater är inte längre här på 635 00:31:13,070 --> 00:31:15,150 campus på grund av det dåliga omdöme. 636 00:31:15,150 --> 00:31:17,840 Men det är mycket lätt att undgå den linjen. 637 00:31:17,840 --> 00:31:22,950 >> Och här är en liten bild för att heja dig från Reddit så att nu 638 00:31:22,950 --> 00:31:25,720 allt kommer att vara OK. 639 00:31:25,720 --> 00:31:30,210 >> Så en snabb resumé, då, om där vi slutade. 640 00:31:30,210 --> 00:31:33,690 Så förra veckan, minns att vi introducerar förhållanden, inte i Scratch 641 00:31:33,690 --> 00:31:34,880 men i C denna gång. 642 00:31:34,880 --> 00:31:38,300 Och det fanns några nya syntax men egentligen inga nya idéer i sig. 643 00:31:38,300 --> 00:31:42,630 Vi hade booleska uttryck som vi kunde eller tillsammans med två vertikala 644 00:31:42,630 --> 00:31:46,490 barer eller och tillsammans med två et-tecken, säger att både vänster 645 00:31:46,490 --> 00:31:49,990 och rätten måste vara sant för att verkställa. 646 00:31:49,990 --> 00:31:53,150 Sedan hade vi växlar, som vi såg på kort, men jag föreslår är verkligen 647 00:31:53,150 --> 00:31:56,830 bara annorlunda syntax för att uppnå samma slags mål om du vet i 648 00:31:56,830 --> 00:31:59,270 förväg vilka dina ärenden kommer att bli. 649 00:31:59,270 --> 00:32:00,160 >> Vi tittade på slingor. 650 00:32:00,160 --> 00:32:03,340 En for-slinga är kanske den vanligaste, eller åtminstone en som människor 651 00:32:03,340 --> 00:32:05,330 typiskt nå för instinktivt. 652 00:32:05,330 --> 00:32:08,240 Även om det ser lite kryptiskt, du kommer att se många, många exempel på detta 653 00:32:08,240 --> 00:32:11,590 Snart som du har redan i slutet av förra veckan. 654 00:32:11,590 --> 00:32:14,280 Medan slingor kan på liknande sätt uppnå samma sak. 655 00:32:14,280 --> 00:32:17,550 Men om du vill göra någon uppräkning eller uppdatering av 656 00:32:17,550 --> 00:32:20,230 variabla värden, måste du göra det mer manuellt än 657 00:32:20,230 --> 00:32:22,440 för slinga tillåter innan. 658 00:32:22,440 --> 00:32:25,310 Och sedan finns det gör-while-slinga, som tillåter oss att göra något på 659 00:32:25,310 --> 00:32:28,460 minst en gång under något annars är sant. 660 00:32:28,460 --> 00:32:31,550 Och det är särskilt bra för program eller för spel där du vill 661 00:32:31,550 --> 00:32:33,810 att fråga användaren om något minst en gång. 662 00:32:33,810 --> 00:32:37,110 Och sedan om han eller hon inte samarbetar, du kanske vill göra det 663 00:32:37,110 --> 00:32:38,420 igen och igen. 664 00:32:38,420 --> 00:32:41,270 >> Med variabler, under tiden, vi hade linjer av koden så här, vilket skulle kunna 665 00:32:41,270 --> 00:32:41,950 vara två linjer. 666 00:32:41,950 --> 00:32:44,830 Du kan deklarera en int kallas räknare, semikolon. 667 00:32:44,830 --> 00:32:47,660 Eller så kan du bara deklarera och definiera det, så att säga. 668 00:32:47,660 --> 00:32:49,950 Ge det ett värde på samma gång. 669 00:32:49,950 --> 00:32:51,890 >> Och sedan slutligen, pratade vi om funktioner. 670 00:32:51,890 --> 00:32:54,270 Och detta var ett bra exempel på den meningen att den illustrerar 671 00:32:54,270 --> 00:32:55,840 två typer av funktioner. 672 00:32:55,840 --> 00:32:59,030 En är GetString (), som, återigen, får en sträng från användaren. 673 00:32:59,030 --> 00:33:02,040 Men GetString () är ganska intressant, så långt som vi har använt det, 674 00:33:02,040 --> 00:33:05,620 eftersom vi har alltid använt det med något på den vänstra sidan av en 675 00:33:05,620 --> 00:33:06,600 likhetstecken. 676 00:33:06,600 --> 00:33:09,830 Det vill säga att GetString () returnerar ett värde. 677 00:33:09,830 --> 00:33:11,970 Den returnerar naturligtvis en sträng. 678 00:33:11,970 --> 00:33:15,130 Och sedan på vänster sida, är vi helt enkelt spara den strängen inuti en 679 00:33:15,130 --> 00:33:16,580 variabel som heter namn. 680 00:33:16,580 --> 00:33:21,100 >> Det är annorlunda, i en mening, från printf eftersom printf, åtminstone i vår 681 00:33:21,100 --> 00:33:23,540 användning här, inte återvänder någonting. 682 00:33:23,540 --> 00:33:24,960 Som en parentes, det gör det återvändande något. 683 00:33:24,960 --> 00:33:26,380 Vi bara struntar i vad det är. 684 00:33:26,380 --> 00:33:29,090 Men det har vad kallas en biverkan. 685 00:33:29,090 --> 00:33:31,840 Och vad är det bieffekt i varje fall vi har sett hittills? 686 00:33:31,840 --> 00:33:34,720 Vad gör printf? 687 00:33:34,720 --> 00:33:37,780 Den skriver något på skärmen, visar text eller siffror eller något 688 00:33:37,780 --> 00:33:38,380 på skärmen. 689 00:33:38,380 --> 00:33:41,170 Och det är bara anses vara en biverkning eftersom det inte riktigt räcka 690 00:33:41,170 --> 00:33:41,900 den tillbaka till mig. 691 00:33:41,900 --> 00:33:44,770 Det är inte ett svar inuti en svart låda som jag sedan kan 692 00:33:44,770 --> 00:33:46,130 nå in och greppa. 693 00:33:46,130 --> 00:33:49,160 Det är bara att göra det på egen hand, mycket som Colton var ansluten till denna 694 00:33:49,160 --> 00:33:52,560 svart låda förra veckan, och han på något sätt magiskt ritade på tavlan 695 00:33:52,560 --> 00:33:54,500 utan mig faktiskt inblandad. 696 00:33:54,500 --> 00:33:55,560 Det skulle vara en bieffekt. 697 00:33:55,560 --> 00:33:59,100 Men om jag hade faktiskt att nå tillbaka i här och säga, åh, här är strängen 698 00:33:59,100 --> 00:34:02,040 från användaren, som skulle vara ett returvärde. 699 00:34:02,040 --> 00:34:05,650 >> Och hittills har vi bara använt funktioner att andra människor har skrivit. 700 00:34:05,650 --> 00:34:09,219 Men vi kan faktiskt göra dessa typer av saker själva. 701 00:34:09,219 --> 00:34:12,730 Så jag kommer att gå in i CS50 apparaten igen. 702 00:34:12,730 --> 00:34:16,020 Låt mig avsluta den flik som vi hade öppna en stund sedan. 703 00:34:16,020 --> 00:34:18,530 Och låt mig gå vidare och Skapa en ny fil. 704 00:34:18,530 --> 00:34:22,400 Och jag ska gå vidare och kalla detta en positive.c. 705 00:34:22,400 --> 00:34:24,770 Så jag vill göra något med positiva tal här. 706 00:34:24,770 --> 00:34:27,219 Så jag kommer att gå vidare och göra 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 Låt oss inte göra samma misstag som tidigare. 710 00:34:34,280 --> 00:34:40,020 Int main (void), öppen lockigt stag, stängde klammerparentes. 711 00:34:40,020 --> 00:34:41,639 >> Och nu vill jag göra följande. 712 00:34:41,639 --> 00:34:44,600 Jag vill skriva ett program som insisterar på att användaren ger 713 00:34:44,600 --> 00:34:46,770 mig ett positivt heltal. 714 00:34:46,770 --> 00:34:50,969 Så det finns ingen GetPositiveInt funktion i CS50 biblioteket. 715 00:34:50,969 --> 00:34:52,610 Det finns bara getInt (). 716 00:34:52,610 --> 00:34:55,790 Men det är OK eftersom jag har konstruktioner med vilka jag kan ålägga en 717 00:34:55,790 --> 00:34:59,360 lite mer begränsning för det värdet. 718 00:34:59,360 --> 00:35:00,990 Jag skulle kunna göra något sådant. 719 00:35:00,990 --> 00:35:02,780 >> Så int n - 720 00:35:02,780 --> 00:35:04,920 och om du skriver tillsammans, bara att inse Jag kommer att gå tillbaka och 721 00:35:04,920 --> 00:35:06,430 ändra vissa saker i ett ögonblick - 722 00:35:06,430 --> 00:35:09,960 så int n är lika getInt (). 723 00:35:09,960 --> 00:35:11,780 Och det kommer att sätta en int insidan av n.. 724 00:35:11,780 --> 00:35:13,830 Och låt mig vara en mer beskrivande. 725 00:35:13,830 --> 00:35:23,270 Låt mig säga något som jag kräver att du ger mig ett positivt heltal. 726 00:35:23,270 --> 00:35:23,550 >> Okej. 727 00:35:23,550 --> 00:35:25,250 Så bara lite instruktioner. 728 00:35:25,250 --> 00:35:26,270 Och nu vad kan jag göra? 729 00:35:26,270 --> 00:35:29,840 Tja, vet jag redan från min enkla villkor eller filialer, precis som jag 730 00:35:29,840 --> 00:35:36,100 hade i Scratch, kunde jag säga något vilja om n är mindre än eller lika med 731 00:35:36,100 --> 00:35:44,460 noll, då jag vill göra något vilja, är det inte positivt. 732 00:35:44,460 --> 00:35:45,560 Och då kunde jag göra - 733 00:35:45,560 --> 00:35:47,310 OK, men jag vill verkligen få det int. 734 00:35:47,310 --> 00:35:52,020 Så jag kunde gå upp här och jag kunde typ av Kopiera och strecksats här. 735 00:35:52,020 --> 00:35:52,570 Och sedan, OK. 736 00:35:52,570 --> 00:35:56,990 Så om n är mindre än eller lika med noll göra detta. 737 00:35:56,990 --> 00:35:58,900 >> Nu, tänk om användaren inte samarbetar? 738 00:35:58,900 --> 00:36:01,560 Jo, då kommer jag att låna detta här. 739 00:36:01,560 --> 00:36:03,130 Och sedan går jag in här och här och här. 740 00:36:03,130 --> 00:36:06,420 Så detta är helt klart inte lösningen, eller hur? 741 00:36:06,420 --> 00:36:07,810 Eftersom det finns inget slut i sikte. 742 00:36:07,810 --> 00:36:13,100 Om jag vill kräva att användaren ger mig ett positivt heltal, kan jag 743 00:36:13,100 --> 00:36:14,150 faktiskt få int. 744 00:36:14,150 --> 00:36:15,620 Jag kan då kontrollera om det int. 745 00:36:15,620 --> 00:36:18,570 Men då jag vill kolla upp det igen och kolla upp det igen och kolla upp det igen. 746 00:36:18,570 --> 00:36:21,680 Så uppenbarligen, vad är bättre konstruktion för att använda här? 747 00:36:21,680 --> 00:36:22,840 Okej, så någon form av loop. 748 00:36:22,840 --> 00:36:25,430 >> Så jag kommer att bli av nästan all denna. 749 00:36:25,430 --> 00:36:27,320 Och jag vill få detta int minst en gång. 750 00:36:27,320 --> 00:36:28,890 Så jag ska säga göra - 751 00:36:28,890 --> 00:36:32,110 och jag ska komma tillbaka till medan bara ett ögonblick - 752 00:36:32,110 --> 00:36:33,050 nu, gör vad? 753 00:36:33,050 --> 00:36:35,860 Jag kommer att göra 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 är ganska bra. 756 00:36:37,250 --> 00:36:39,750 Och nu hur ofta gör Jag vill göra det här? 757 00:36:39,750 --> 00:36:45,770 >> Låt mig uttrycka det printf insidan av slingan så jag kan kräva och om igen, 758 00:36:45,770 --> 00:36:46,740 om så behövs. 759 00:36:46,740 --> 00:36:49,720 Och vad vill jag här medan tillstånd att göra? 760 00:36:49,720 --> 00:36:53,870 Jag vill fortsätta göra detta medan det är fallet? 761 00:36:53,870 --> 00:36:54,125 Yeah. 762 00:36:54,125 --> 00:36:55,390 N är mindre än eller lika med noll. 763 00:36:55,390 --> 00:36:58,180 Så redan, vi har betydligt städas här koden upp. 764 00:36:58,180 --> 00:37:00,700 Vi har lånat en mycket enkel konstruktion - gör-while-slinga. 765 00:37:00,700 --> 00:37:04,690 Jag har stulit bara de viktiga linjerna av kod som jag började att kopiera och 766 00:37:04,690 --> 00:37:05,960 klistra, vilket var inte klokt. 767 00:37:05,960 --> 00:37:09,790 Och så nu ska jag faktiskt klistra det här och bara göra det en gång. 768 00:37:09,790 --> 00:37:12,990 >> Och nu vad jag vill göra på Alldeles i slutet av detta program? 769 00:37:12,990 --> 00:37:16,810 Jag ska bara säga något enkelt gillar, tack för - och 770 00:37:16,810 --> 00:37:18,980 Jag ska göra% i för int - 771 00:37:18,980 --> 00:37:23,270 omvänt snedstreck n, komma, och sedan plugin i N, semikolon. 772 00:37:23,270 --> 00:37:23,910 >> Okej. 773 00:37:23,910 --> 00:37:27,290 Så låt oss se vad som händer nu när jag kör det här programmet. 774 00:37:27,290 --> 00:37:30,600 Jag kommer att gå vidare och gör positivt. 775 00:37:30,600 --> 00:37:30,880 Damn. 776 00:37:30,880 --> 00:37:31,600 Några fel. 777 00:37:31,600 --> 00:37:32,960 Så låt mig rulla tillbaka upp till den första. 778 00:37:32,960 --> 00:37:34,020 Arbeta inte igenom dem baklänges. 779 00:37:34,020 --> 00:37:37,000 Arbeta igenom dem uppifrån och ned lest de kaskad och endast 780 00:37:37,000 --> 00:37:38,630 en sak är fel. 781 00:37:38,630 --> 00:37:42,532 Implicit deklaration av Funktionen getInt (). 782 00:37:42,532 --> 00:37:43,020 Yeah. 783 00:37:43,020 --> 00:37:44,420 Så det var inte tillräckligt. 784 00:37:44,420 --> 00:37:46,760 Jag slags gjort samma misstag men lite annorlunda den här gången. 785 00:37:46,760 --> 00:37:51,940 Jag behöver inte bara omfatta stdio.h men också cs50.h, vilket inkluderar 786 00:37:51,940 --> 00:37:56,770 så kallade deklarationer får int, vilket undervisa apparaten, eller lär 787 00:37:56,770 --> 00:37:58,760 C vad getInt () är. 788 00:37:58,760 --> 00:37:59,550 >> Så låt mig spara om. 789 00:37:59,550 --> 00:38:02,040 Jag kommer att ignorera de andra fel eftersom jag kommer att hoppas att de är 790 00:38:02,040 --> 00:38:05,210 något sätt relaterade till felet Jag fast redan. 791 00:38:05,210 --> 00:38:08,710 Så låt mig gå vidare och kompilera med göra positiva, Enter. 792 00:38:08,710 --> 00:38:09,020 Damn. 793 00:38:09,020 --> 00:38:09,985 Tre fel, ändå. 794 00:38:09,985 --> 00:38:12,650 Låt mig rulla upp till den första. 795 00:38:12,650 --> 00:38:14,320 Oanvända variabeln n.. 796 00:38:14,320 --> 00:38:15,850 Vi har inte sett det här förut. 797 00:38:15,850 --> 00:38:17,200 Och även detta är ett lite kryptiskt. 798 00:38:17,200 --> 00:38:18,850 Detta är utsignalen från kompilatorn. 799 00:38:18,850 --> 00:38:23,610 Och vad det markerade linjen det - positive.c :9:13 - 800 00:38:23,610 --> 00:38:28,960 säger, det säger på rad nio av positive.c, på 13: e tecknet, 801 00:38:28,960 --> 00:38:31,510 13th kolumnen, du gjorde detta misstag. 802 00:38:31,510 --> 00:38:34,230 >> Och framför allt, det säger me oanvända variabeln n. 803 00:38:34,230 --> 00:38:35,790 Så låt oss se - 804 00:38:35,790 --> 00:38:37,150 line nio. 805 00:38:37,150 --> 00:38:40,430 Jag använder n i den meningen att Jag ger det ett värde. 806 00:38:40,430 --> 00:38:44,200 Men vad kompilatorn inte gillar är att jag inte synes använder den. 807 00:38:44,200 --> 00:38:45,560 Men vänta lite, jag använder det. 808 00:38:45,560 --> 00:38:48,170 I linje 11, jag använder det här. 809 00:38:48,170 --> 00:38:52,430 Men om jag bläddra ner ytterligare vid positive.c :11 - 810 00:38:52,430 --> 00:38:56,230 så vid linjen 11, tecken 12, den kompilatorn säger till mig, användning av 811 00:38:56,230 --> 00:38:58,670 svartarbete identifierare n. 812 00:38:58,670 --> 00:39:02,760 >> Så odeklarerade betyder att jag måste specificeras inte det som en 813 00:39:02,760 --> 00:39:04,970 variabel med datatypen. 814 00:39:04,970 --> 00:39:05,500 Men vänta en minut. 815 00:39:05,500 --> 00:39:09,150 Jag gjorde exakt som i linje nio. 816 00:39:09,150 --> 00:39:11,100 Så någon är verkligen förvirrad här. 817 00:39:11,100 --> 00:39:14,900 Det är antingen mig eller kompilatorn eftersom i linje nio, igen, jag förklarar en 818 00:39:14,900 --> 00:39:18,650 int n, och jag tilldela det returnera värdet av getInt (). 819 00:39:18,650 --> 00:39:22,930 Då jag använder den variabeln n i linje 11 och kontrollera om dess värde är mindre 820 00:39:22,930 --> 00:39:24,050 än eller lika med noll. 821 00:39:24,050 --> 00:39:27,430 Men detta är tydligen dåliga och trasiga varför? 822 00:39:27,430 --> 00:39:30,630 823 00:39:30,630 --> 00:39:32,490 Säg det igen? 824 00:39:32,490 --> 00:39:35,690 >> Ah, jag måste förklara n innan kommer in i slingan. 825 00:39:35,690 --> 00:39:36,370 Men varför? 826 00:39:36,370 --> 00:39:39,830 Jag menar, föreslog vi bara lite sen att det är bra att deklarera variabler 827 00:39:39,830 --> 00:39:43,600 alla på en linje och sedan tilldela dem ett visst värde. 828 00:39:43,600 --> 00:39:46,790 En global variabel - låt oss återkomma denna idé på bara ett ögonblick. 829 00:39:46,790 --> 00:39:48,690 Varför vill du att jag ska sätta den utanför slingan? 830 00:39:48,690 --> 00:40:03,170 831 00:40:03,170 --> 00:40:03,830 Det är. 832 00:40:03,830 --> 00:40:06,780 Exakt. 833 00:40:06,780 --> 00:40:09,610 >> Så, om än något bakvända, Låt mig sammanfatta. 834 00:40:09,610 --> 00:40:13,510 När du deklarerar n insidan av do-blocket där - 835 00:40:13,510 --> 00:40:16,320 specifikt insidan av dessa klammerparenteser - 836 00:40:16,320 --> 00:40:19,210 att variabeln n har vad kallas en räckvidd - 837 00:40:19,210 --> 00:40:23,210 unrelated till vårt poängsystem i kurs - men har en räckvidd som är 838 00:40:23,210 --> 00:40:25,190 begränsat till de klammerparenteser. 839 00:40:25,190 --> 00:40:28,460 Med andra ord, oftast om du deklarerar en variabel inuti en uppsättning av 840 00:40:28,460 --> 00:40:33,370 Klammerparenteserna fastslagit att variabeln endast insidan av dessa klammerparenteser. 841 00:40:33,370 --> 00:40:37,320 Så genom denna logik ensam, även om Jag har förklarat n i linje nio, det 842 00:40:37,320 --> 00:40:41,910 huvudsak försvinner från tillämpningsområdet, försvinner från minnet, så att säga, 843 00:40:41,910 --> 00:40:43,370 när jag slog linje 11. 844 00:40:43,370 --> 00:40:47,370 Eftersom linje 11, tyvärr, är utanför dessa klammerparenteser. 845 00:40:47,370 --> 00:40:51,540 >> Så jag tyvärr inte kan åtgärda detta genom att gå tillbaka till vad jag gjorde det innan. 846 00:40:51,540 --> 00:40:53,370 Du kanske först göra detta. 847 00:40:53,370 --> 00:40:56,370 Men vad är du nu inte gör cykliskt? 848 00:40:56,370 --> 00:40:58,260 Du är uppenbarligen inte får int cykliskt. 849 00:40:58,260 --> 00:41:01,320 Så vi kan lämna getInt (), och vi bör lämna getInt () inuti 850 00:41:01,320 --> 00:41:04,420 loop eftersom det är vad vi vill pester användaren för och om igen. 851 00:41:04,420 --> 00:41:08,660 Men det räcker att gå upp till linjen, säg, sex. 852 00:41:08,660 --> 00:41:10,150 Int n, semikolon. 853 00:41:10,150 --> 00:41:12,990 Ge det inte ett värde ännu eftersom du behöver inte bara ännu. 854 00:41:12,990 --> 00:41:16,220 >> Men nu här nere, varsel - detta skulle vara ett mycket enkelt misstag. 855 00:41:16,220 --> 00:41:19,440 Jag vill inte att skugga min tidigare försäkran om n. 856 00:41:19,440 --> 00:41:22,830 Jag vill använda n som faktiskt existerar. 857 00:41:22,830 --> 00:41:25,780 Och så nu i linje 10, Jag tilldelar n ett värde. 858 00:41:25,780 --> 00:41:28,580 Men i linje sex, förklarar jag n.. 859 00:41:28,580 --> 00:41:32,940 Och så kan jag eller kan jag inte använda det i linje 12 nu? 860 00:41:32,940 --> 00:41:37,120 Jag kan på grund mellan vilka lockigt hängslen är n förklaras nu? 861 00:41:37,120 --> 00:41:38,770 Den ena upp här på rad fem. 862 00:41:38,770 --> 00:41:40,330 Till en här på rad 14. 863 00:41:40,330 --> 00:41:49,770 Så om jag nu zooma ut, spara filen, gå backa in och kör make positivt, det 864 00:41:49,770 --> 00:41:50,820 sammanställt denna gång. 865 00:41:50,820 --> 00:41:51,940 Så det är redan framsteg. 866 00:41:51,940 --> 00:41:53,640 Snedstreck. . / Positiv, Enter. 867 00:41:53,640 --> 00:41:56,060 >> Jag kräver att ni ger mig ett positivt heltal. 868 00:41:56,060 --> 00:41:57,750 Negativt 1. 869 00:41:57,750 --> 00:41:59,020 Negativ 2. 870 00:41:59,020 --> 00:42:00,680 Negativt 3. 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 Och tack för att man är vad nu tryckt. 874 00:42:05,130 --> 00:42:07,400 >> Låt mig prova något annat, av nyfikenhet. 875 00:42:07,400 --> 00:42:09,600 Jag blir tillsagd att ange ett heltal. 876 00:42:09,600 --> 00:42:12,870 Men vad händer om jag skriver istället i lamm? 877 00:42:12,870 --> 00:42:14,460 Så ni ser nu en annan prompt - 878 00:42:14,460 --> 00:42:15,350 försöka igen. 879 00:42:15,350 --> 00:42:17,670 Men ingenstans i min kod skrev jag försöka igen. 880 00:42:17,670 --> 00:42:22,320 Så där, förmodligen, är detta nytt försök uppmana kommer från, skulle du säga? 881 00:42:22,320 --> 00:42:23,540 Ja, från getInt () själv. 882 00:42:23,540 --> 00:42:26,650 Så en av de saker CS50: s personal gör för dig, åtminstone i dessa första 883 00:42:26,650 --> 00:42:30,400 veckor, vi har skrivit en viss mängd av felkontroll för att säkerställa att om 884 00:42:30,400 --> 00:42:34,260 du kallar getInt (), kommer du åtminstone få tillbaka en int från användaren. 885 00:42:34,260 --> 00:42:35,460 Du kommer inte få en sträng. 886 00:42:35,460 --> 00:42:36,440 Du kommer inte få en röding. 887 00:42:36,440 --> 00:42:39,660 Du kommer inte få något helt annat. 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 inte vara positivt. 890 00:42:41,890 --> 00:42:42,770 Det kan inte vara negativt. 891 00:42:42,770 --> 00:42:44,550 Vi gör inga garantier kring detta. 892 00:42:44,550 --> 00:42:48,960 Men vi kommer att besvära användaren att försöka igen, försöka igen, försöka igen tills han eller hon faktiskt 893 00:42:48,960 --> 00:42:49,810 samarbetar. 894 00:42:49,810 --> 00:42:53,085 Likaså om jag gör 1,23, det är inte en int. 895 00:42:53,085 --> 00:42:58,400 Men om jag skriver in, säg, 50, som ger mig ett värde som jag ville. 896 00:42:58,400 --> 00:42:59,050 >> Okej. 897 00:42:59,050 --> 00:43:01,380 Så inte illa. 898 00:43:01,380 --> 00:43:04,780 Eventuella frågor om vad vi har just gjort? 899 00:43:04,780 --> 00:43:07,930 Nyckeln takeaway är att vara tydlig, inte så mycket slingan, som vi har sett 900 00:43:07,930 --> 00:43:10,880 innan även om vi inte riktigt använde det, men frågan om omfattningen, där 901 00:43:10,880 --> 00:43:17,045 variabler kan endast kan endast användas inom någon specificerad omfattning. 902 00:43:17,045 --> 00:43:19,830 >> Okej, låt mig ta upp förslaget du gjort tidigare, att en 903 00:43:19,830 --> 00:43:20,860 global variabel. 904 00:43:20,860 --> 00:43:24,880 Som en parentes, visar det sig att en annan lösning på detta problem, men 905 00:43:24,880 --> 00:43:28,880 typiskt en felaktig lösning eller en dåligt utformad lösning, är att 906 00:43:28,880 --> 00:43:31,670 deklarera din variabel som vad är kallas för en global variabel. 907 00:43:31,670 --> 00:43:34,610 Nu är jag typ av att överträda min definition av tillämpningsområdet eftersom det finns 908 00:43:34,610 --> 00:43:37,680 inga Klammerparenteserna högst upp och själva botten av en fil. 909 00:43:37,680 --> 00:43:40,190 Men konsekvenserna av att är det nu i linje fyra, 910 00:43:40,190 --> 00:43:41,710 n är en global variabel. 911 00:43:41,710 --> 00:43:44,460 Och som namnet antyder, är det bara tillgängliga överallt. 912 00:43:44,460 --> 00:43:45,790 >> Scratch har faktiskt dessa. 913 00:43:45,790 --> 00:43:48,650 Om du använde en variabel, kanske ni minns du var tvungen att välja om det är för 914 00:43:48,650 --> 00:43:50,780 här spriten eller för alla sprites. 915 00:43:50,780 --> 00:43:54,270 Tja, är alla sprites bara tydligare sätt att säga global. 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, riktigt bra fråga. 919 00:44:10,990 --> 00:44:14,310 >> Så minns att i den allra första versionen av min kod, när jag felaktigt 920 00:44:14,310 --> 00:44:17,700 deklareras och definieras n i linje nio - 921 00:44:17,700 --> 00:44:19,980 Jag förklarade det som en variabel och jag gav det ett värde med 922 00:44:19,980 --> 00:44:21,160 tilldelningsoperatorn - 923 00:44:21,160 --> 00:44:22,520 Detta gav mig två fel. 924 00:44:22,520 --> 00:44:26,560 Ett, det faktum att n inte användes, och två, att i linje 11 925 00:44:26,560 --> 00:44:27,770 det bara inte förklarades. 926 00:44:27,770 --> 00:44:31,120 Så det första jag gjorde inte adress på den tiden. 927 00:44:31,120 --> 00:44:35,130 Det är inte helt fel att deklarera en variabel, men inte använda den. 928 00:44:35,130 --> 00:44:38,540 Men en av de saker vi har gjort i den CS50 apparaten, medvetet, 929 00:44:38,540 --> 00:44:43,340 pedagogiskt, är att vi har skrivit upp förväntningar kompilatorn att göra 930 00:44:43,340 --> 00:44:46,970 Se till att du gör saker som inte bara korrekt men riktigt korrekt. 931 00:44:46,970 --> 00:44:51,520 >> För om du deklarera en variabel som n och aldrig använda den, eller använda den 932 00:44:51,520 --> 00:44:53,700 korrekt, vad är det där? 933 00:44:53,700 --> 00:44:55,650 Det tjänar verkligen inget syfte. 934 00:44:55,650 --> 00:44:58,980 Och det är väldigt lätt över tiden, om du inte konfigurera din egen dator 935 00:44:58,980 --> 00:45:01,960 här sättet, att bara ha kod som har små rester här, rester där. 936 00:45:01,960 --> 00:45:04,390 Och sedan månader senare du ser tillbaka och du är som, varför är denna linje av 937 00:45:04,390 --> 00:45:05,060 koden där? 938 00:45:05,060 --> 00:45:07,940 Och om det finns ingen bra anledning, det gynnar inte du eller dina kollegor 939 00:45:07,940 --> 00:45:10,650 väg att behöva snubblar över det då. 940 00:45:10,650 --> 00:45:12,540 >> Som en parentes, där är det kommer från? 941 00:45:12,540 --> 00:45:16,410 Tja, minns att varje gång vi sammanställa program, är allt det här 942 00:45:16,410 --> 00:45:17,380 som skrivs ut. 943 00:45:17,380 --> 00:45:18,350 Så vi ska återkomma till detta. 944 00:45:18,350 --> 00:45:22,230 Men återigen, är att göra ett verktyg som automatiserar processen med att sammanställa genom 945 00:45:22,230 --> 00:45:24,830 kör själva kompilatorn kallas klang. 946 00:45:24,830 --> 00:45:27,650 Denna sak, vi kommer så småningom se, har att göra med felsökning med en speciell 947 00:45:27,650 --> 00:45:29,060 program som kallas debugger. 948 00:45:29,060 --> 00:45:32,150 Detta har att göra med att optimera kod - mer om det i framtiden. 949 00:45:32,150 --> 00:45:33,620 Std = C99 - 950 00:45:33,620 --> 00:45:37,870 Detta betyder bara använda 1999 års version av C. C har funnits ännu längre än 951 00:45:37,870 --> 00:45:40,830 det, men de gjorde några trevliga ändringar 10 plus år sedan. 952 00:45:40,830 --> 00:45:42,690 >> Och här är de relevanta sådana. 953 00:45:42,690 --> 00:45:45,880 Vi säger att allt som tidigare skulle ha varit en varning 954 00:45:45,880 --> 00:45:48,560 Ett fel hindrar eleven från sammanställningen. 955 00:45:48,560 --> 00:45:51,400 Och väggorgan göra det för en hel massa saker, inte 956 00:45:51,400 --> 00:45:53,060 bara relaterade till variabler. 957 00:45:53,060 --> 00:45:54,700 Och låt mig rulla till I slutet av denna linje. 958 00:45:54,700 --> 00:45:56,430 Och även detta kommer vi så småningom komma tillbaka till. 959 00:45:56,430 --> 00:45:59,040 Detta är uppenbarligen känt av filen jag sammanställa. 960 00:45:59,040 --> 00:46:02,160 Detta påminner om namnet på filen Jag utmatning som namnet 961 00:46:02,160 --> 00:46:04,070 min Runnable program. 962 00:46:04,070 --> 00:46:08,970 Detta-lcs50 betyder bara använda CS50 bibliotek, och alla nollor och ettor som 963 00:46:08,970 --> 00:46:12,390 personalen skrev och sammanställt tidigare detta år, integrera 964 00:46:12,390 --> 00:46:13,490 dem i mitt program. 965 00:46:13,490 --> 00:46:16,130 >> Och någon som vet vad-LM är? 966 00:46:16,130 --> 00:46:18,150 Det är den matematiska biblioteket, vilket är bara det även om du är 967 00:46:18,150 --> 00:46:19,320 inte göra någon matte. 968 00:46:19,320 --> 00:46:22,620 Det är bara automatiskt tillgänglig oss göra. 969 00:46:22,620 --> 00:46:26,540 >> Nåväl, låt mig göra ett annat exempel här genom att öppna upp en ny fil. 970 00:46:26,540 --> 00:46:30,560 Och låt mig spara den här som string.c. 971 00:46:30,560 --> 00:46:37,980 Det visar sig att när vi talar om uppgifter typer idag, det finns ännu mer 972 00:46:37,980 --> 00:46:40,630 händer under huven än vad vi har sett hittills. 973 00:46:40,630 --> 00:46:42,290 Så låt mig snabbt göra en snabb program. 974 00:46:42,290 --> 00:46:44,510 Inkludera stdio.h. 975 00:46:44,510 --> 00:46:45,730 Och jag ska spara den. 976 00:46:45,730 --> 00:46:48,110 Och du vet, låt mig inte göra det samma misstag om och om igen. 977 00:46:48,110 --> 00:46:50,540 Inkludera cs50.h. 978 00:46:50,540 --> 00:46:54,870 Och låt mig gå vidare nu och gör int main (void). 979 00:46:54,870 --> 00:46:58,790 >> Och nu vill jag bara göra ett program som gör detta - deklarera en sträng 980 00:46:58,790 --> 00:47:03,610 heter er och få en sträng från användaren. 981 00:47:03,610 --> 00:47:05,820 Och låt mig göra lite instruktionerna här - 982 00:47:05,820 --> 00:47:09,960 snälla ge mig en sträng - så användaren vet vad de ska göra. 983 00:47:09,960 --> 00:47:13,190 Och sedan ner här nedanför detta, Jag vill göra följande - 984 00:47:13,190 --> 00:47:16,060 för int i blir noll. 985 00:47:16,060 --> 00:47:18,580 Återigen, datavetare typiskt börja räkna på noll, men vi kunde 986 00:47:18,580 --> 00:47:20,340 gör att man, om vi verkligen ville. 987 00:47:20,340 --> 00:47:27,240 Nu ska jag göra jag är mindre än strängen längd 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 igen, det är kortfattat eftersom det är lättare att skriva, även om det är en 991 00:47:31,650 --> 00:47:32,590 lilla kryptiska. 992 00:47:32,590 --> 00:47:35,290 >> Det är en funktion vi har inte använt innan men bokstavligen gör det - 993 00:47:35,290 --> 00:47:37,810 tillbaka till mig ett nummer som representerar längden på strängen 994 00:47:37,810 --> 00:47:38,690 som användaren skrivit. 995 00:47:38,690 --> 00:47:41,740 Om de skrev i hej, skulle återvända fem eftersom det finns fem 996 00:47:41,740 --> 00:47:42,890 bokstäver i Hello. 997 00:47:42,890 --> 00:47:45,390 Då, på varje iteration av denna slinga, jag plus plus. 998 00:47:45,390 --> 00:47:49,170 Så återigen, en standard konstruktion även om du är inte riktigt alltför bekväma eller 999 00:47:49,170 --> 00:47:50,420 förtrogen med det ännu. 1000 00:47:50,420 --> 00:47:53,220 >> Men nu på varje iteration av denna slinga, märker vad jag ska göra. 1001 00:47:53,220 --> 00:47:56,690 Jag vill gå vidare och skriva ut ut ett enstaka tecken - 1002 00:47:56,690 --> 00:47:59,940 så% c backslash n på en ny rad. 1003 00:47:59,940 --> 00:48:00,990 Och då, vet du vad jag vill göra? 1004 00:48:00,990 --> 00:48:05,090 Oavsett ordet är att användaren skriver in, liksom hej, jag vill skriva ut 1005 00:48:05,090 --> 00:48:09,530 H-E-L-L-O, ett tecken per rad. 1006 00:48:09,530 --> 00:48:13,080 Med andra ord, jag vill komma på enskilda tecken i en sträng, 1007 00:48:13,080 --> 00:48:16,770 varigenom hittills en sträng har bara varit en sekvens av tecken. 1008 00:48:16,770 --> 00:48:21,690 >> Och det visar sig jag kan göra s, konsol, Jag, nära fästet, stäng 1009 00:48:21,690 --> 00:48:23,580 parentes, semikolon. 1010 00:48:23,580 --> 00:48:25,640 Och jag måste göra en sak. 1011 00:48:25,640 --> 00:48:30,570 Det är i en fil som heter string.h att strlen deklareras. 1012 00:48:30,570 --> 00:48:33,190 Så om jag vill använda denna funktion, Jag måste tala om för kompilatorn, 1013 00:48:33,190 --> 00:48:34,450 räknar med att använda den. 1014 00:48:34,450 --> 00:48:37,040 Låt mig nu gå vidare och göra Programmet heter strängen. 1015 00:48:37,040 --> 00:48:39,150 Dot, snedstreck, sträng. 1016 00:48:39,150 --> 00:48:40,130 >> Vänligen ge mig en sträng. 1017 00:48:40,130 --> 00:48:40,900 Jag ska gå vidare och skriva det. 1018 00:48:40,900 --> 00:48:43,040 Hej, i versaler, Enter. 1019 00:48:43,040 --> 00:48:47,390 Och nu märker jag ut detta ett tecken efter den andra. 1020 00:48:47,390 --> 00:48:51,450 Så den nya detalj här är att en sträng, vid slutet av dagen, kan vara 1021 00:48:51,450 --> 00:48:54,810 nås genom dess individuella tecken genom att införa den fyrkantiga 1022 00:48:54,810 --> 00:48:55,840 hakparenteser. 1023 00:48:55,840 --> 00:48:59,090 Och det beror på en rad nedanför huven är verkligen en sekvens av 1024 00:48:59,090 --> 00:48:59,810 tecken. 1025 00:48:59,810 --> 00:49:02,010 Men vad är snyggt om dem är i datorns RAM-minne - 1026 00:49:02,010 --> 00:49:05,300 Mac, PC, oavsett vad det är - de är bokstavligen 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å individnivå, intill bytes i minnet. 1029 00:49:09,920 --> 00:49:13,210 >> Så om du vill komma på åttonde sådan byten, vilket i denna slinga skulle vara 1030 00:49:13,210 --> 00:49:16,900 fäste noll, fäste en, fäste två, fäste tre, fäste fyra - 1031 00:49:16,900 --> 00:49:18,890 att noll är indexerade fram till fem - 1032 00:49:18,890 --> 00:49:23,330 som kommer att skriva ut H-E-L-L-O på en egen rad. 1033 00:49:23,330 --> 00:49:26,320 >> Nu, som en teaser, låt mig visa dig möjliga saker kommer du så småningom att bli 1034 00:49:26,320 --> 00:49:31,950 kunna förstå, åtminstone med några nära ser. 1035 00:49:31,950 --> 00:49:35,610 För en, vad vi ingår i dagens exempel, om du vill, är faktiskt 1036 00:49:35,610 --> 00:49:38,300 en av de allra första jailbreaks för iPhone. 1037 00:49:38,300 --> 00:49:40,800 Jailbreaking innebär sprickbildning telefonen så att du faktiskt kan använda den på ett 1038 00:49:40,800 --> 00:49:43,380 annat transportföretag eller install din egen mjukvara. 1039 00:49:43,380 --> 00:49:45,660 Och du kommer att märka detta ser helt kryptiskt, mest troligt. 1040 00:49:45,660 --> 00:49:46,520 Men titta på det här. 1041 00:49:46,520 --> 00:49:50,420 Den iPhone var tydligen knäckt med en for-loop, en om tillstånd, ett annat 1042 00:49:50,420 --> 00:49:52,580 tillstånd, ett gäng funktioner Vi har inte sett. 1043 00:49:52,580 --> 00:49:54,230 >> Och igen, kommer du inte på första anblicken förmodligen 1044 00:49:54,230 --> 00:49:55,620 förstå hur detta fungerar. 1045 00:49:55,620 --> 00:49:58,940 Men allt som vi liksom ta för givet i våra moderna liv 1046 00:49:58,940 --> 00:50:02,040 faktiskt tenderar att minska även i viss av dessa grundprinciper som vi har varit 1047 00:50:02,040 --> 00:50:02,820 tittar på. 1048 00:50:02,820 --> 00:50:06,680 Låt mig gå vidare och öppna en andra program, holloway.c. 1049 00:50:06,680 --> 00:50:08,970 Så detta är också något du borde egentligen inte vet. 1050 00:50:08,970 --> 00:50:12,440 Även ingen personal eller jag kunde antagligen lista ut det genom att titta på 1051 00:50:12,440 --> 00:50:15,450 det eftersom det var någons kod som överlämnades till vad som är 1052 00:50:15,450 --> 00:50:19,630 historiskt känd som en förvrängd C tävling, där du skriver ett program 1053 00:50:19,630 --> 00:50:24,670 som sammanställer och går men är så jävla kryptiskt ingen människa kan förstå vad 1054 00:50:24,670 --> 00:50:27,530 det kommer att göra tills de kör faktiskt det. 1055 00:50:27,530 --> 00:50:29,940 >> Så ja, om man tittar på det här kod, ser jag en switch. 1056 00:50:29,940 --> 00:50:30,870 Jag ser stora. 1057 00:50:30,870 --> 00:50:33,800 Jag ser dessa hakparenteser innebär någon form av en matris. 1058 00:50:33,800 --> 00:50:35,970 Önskar någon att gissa vad detta program faktiskt 1059 00:50:35,970 --> 00:50:37,220 gör om jag kör 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 Bra gjort. 1064 00:50:44,690 --> 00:50:48,090 Så bara personalen och jag kan inte räkna ut vad dessa saker gör. 1065 00:50:48,090 --> 00:50:51,670 >> Och nu sist, låt mig gå vidare och öppna upp ett annat program. 1066 00:50:51,670 --> 00:50:53,440 Detta - 1067 00:50:53,440 --> 00:50:55,550 igen, vi gör källkoden tillgängliga på nätet - detta är bara 1068 00:50:55,550 --> 00:50:57,480 slags vacker att titta på. 1069 00:50:57,480 --> 00:50:59,750 Allt de gjorde är drabbade space bar ganska lite. 1070 00:50:59,750 --> 00:51:01,320 Men detta är riktiga koden. 1071 00:51:01,320 --> 00:51:04,790 Så om du tror att det är ganska, om vi kör faktiskt detta vid prompten, 1072 00:51:04,790 --> 00:51:08,970 småningom kommer du att se hur vi kan göra saker som denna. 1073 00:51:08,970 --> 00:51:14,008 >> Så vi lämnar dig på den anteckning och se dig på onsdag. 1074 00:51:14,008 --> 00:51:18,440 >> [Musik Spela] 1075 00:51:18,440 --> 00:51:23,380 >> Högtalare 2: Vid nästa CS50, TFS iscensätta ett myteri. 1076 00:51:23,380 --> 00:51:24,112 >> SPEAKER 3: Där är han. 1077 00:51:24,112 --> 00:51:25,362 Få honom! 1078 00:51:25,362 --> 00:51:29,912 1079 00:51:29,912 --> 00:51:32,074 >> [Musik Spela]