1 00:00:00,000 --> 00:00:00,000 2 00:00:00,000 --> 00:00:00,000 [MUSIKK] 3 00:00:00,000 --> 00:00:13,950 4 00:00:13,950 --> 00:00:16,240 >> DAVID J. MALAN: Greit, dette er CS50. 5 00:00:16,240 --> 00:00:18,010 Og dette er første uken. 6 00:00:18,010 --> 00:00:22,050 Så husker at siste gang i uke null, fokuserte vi på beregningsorientert tenkning. 7 00:00:22,050 --> 00:00:25,440 Og vi gått fra det å Scratch, et grafisk programmerings 8 00:00:25,440 --> 00:00:27,360 språk fra våre venner ved MIT Media Lab. 9 00:00:27,360 --> 00:00:31,730 >> Og med Scratch, gjorde vi utforske ideer som fungerer, og forhold, 10 00:00:31,730 --> 00:00:35,210 og looper og variabler, og selv hendelser og tråder, og mer. 11 00:00:35,210 --> 00:00:37,880 Og i dag, skal vi fortsette å bruke disse ideene, 12 00:00:37,880 --> 00:00:40,630 og virkelig ta dem for gitt, men oversette dem 13 00:00:40,630 --> 00:00:44,220 til et annet språk kjent som C. Nå C er en mer tradisjonell språk. 14 00:00:44,220 --> 00:00:46,020 Det er et lavere nivå språk, hvis du vil. 15 00:00:46,020 --> 00:00:47,300 >> Det er rent tekstlig. 16 00:00:47,300 --> 00:00:49,910 Og så ved første øyekast, er det alle kommer til å se ganske kryptisk 17 00:00:49,910 --> 00:00:51,430 hvis du aldri har programmert før. 18 00:00:51,430 --> 00:00:53,530 Vi kommer til å ha semikolon og parenteser, 19 00:00:53,530 --> 00:00:55,150 og klammeparentes, og mer. 20 00:00:55,150 --> 00:00:57,240 Men innser at selv men syntaksen er 21 00:00:57,240 --> 00:01:00,600 om å se litt uvant for de fleste av dere, se forbi det. 22 00:01:00,600 --> 00:01:03,220 Og prøv å se ideene det er faktisk kjent, 23 00:01:03,220 --> 00:01:06,750 fordi her i uke en hvilken Vi vil begynne å gjøre er å sammenligne, 24 00:01:06,750 --> 00:01:08,980 utgangspunktet, Skrap versus C. 25 00:01:08,980 --> 00:01:12,350 >> Så, for eksempel, husker at når vi gjennomført den første av våre programmer 26 00:01:12,350 --> 00:01:16,220 siste gang, hadde vi en blokk som så litt noe som dette-- når 27 00:01:16,220 --> 00:01:19,990 grønt flagg klikket, og da vi hadde ett eller flere puslebiter under den, 28 00:01:19,990 --> 00:01:22,150 i dette tilfellet, sier hello world. 29 00:01:22,150 --> 00:01:24,870 Så, ja, i Scratch, når jeg klikker det grønne flagget 30 00:01:24,870 --> 00:01:27,390 å kjøre mitt program, så å snakke, disse er 31 00:01:27,390 --> 00:01:29,520 blokkene som blir utført, eller løpe. 32 00:01:29,520 --> 00:01:32,230 Og spesielt Scratch sa, hallo, verden. 33 00:01:32,230 --> 00:01:35,377 >> Nå kunne jeg ha spesifisert forskjellige ord her. 34 00:01:35,377 --> 00:01:37,960 Men vi får se at, ja, mange av disse blocks-- og faktisk, 35 00:01:37,960 --> 00:01:41,880 i C mange functions-- kan være parametrized eller tilpasset 36 00:01:41,880 --> 00:01:43,150 å gjøre forskjellige ting. 37 00:01:43,150 --> 00:01:45,520 Faktisk, i C hvis vi ønsker å konvertere, nå, 38 00:01:45,520 --> 00:01:47,567 dette Scratch program til denne andre språk, 39 00:01:47,567 --> 00:01:49,650 vi kommer til å skrive et litt noe som dette. 40 00:01:49,650 --> 00:01:52,540 >> Riktignok er det noen ukjente syntaks det mest sannsynlig, int, 41 00:01:52,540 --> 00:01:54,380 og parentes, og ugyldig. 42 00:01:54,380 --> 00:01:57,740 Men printf-- selv om du ville tror det ville bare være print. 43 00:01:57,740 --> 00:02:00,120 Men print betyr print formatert, så vi vil snart se. 44 00:02:00,120 --> 00:02:02,140 Denne bokstavelig talt vil skrive ut til skjermen uansett 45 00:02:02,140 --> 00:02:05,990 er på innsiden av de parenteser, hvilken selvfølgelig i dette tilfellet er, hallo verden. 46 00:02:05,990 --> 00:02:09,290 >> Men du vil merke noen andre syntaks, noen doble anførselstegn, 47 00:02:09,290 --> 00:02:11,890 at de parenteser på slutten, den semikolon og lignende. 48 00:02:11,890 --> 00:02:15,027 Så det er en bit av overhead, så å si, både kognitivt 49 00:02:15,027 --> 00:02:17,860 og syntaktisk, at vi kommer til å huske lenge. 50 00:02:17,860 --> 00:02:20,720 Men innser at med praksis, dette vil begynne å hoppe ut på deg. 51 00:02:20,720 --> 00:02:24,920 >> Faktisk, la oss fokusere på at en funksjon specifically-- i dette tilfellet 52 00:02:24,920 --> 00:02:26,290 si hei verden. 53 00:02:26,290 --> 00:02:27,560 Så si er funksjonen. 54 00:02:27,560 --> 00:02:31,320 Hei, verden er dens parameter, eller argument, sin tilpasning. 55 00:02:31,320 --> 00:02:34,320 >> Og likeverdighet i C er bare kommer til å være denne linjen her, 56 00:02:34,320 --> 00:02:38,710 hvor printf tilsvarer, si, dobbelt sitert streng, hallo 57 00:02:38,710 --> 00:02:41,470 verden er ekvivalent selvsagt til hva som er i den hvite boksen der. 58 00:02:41,470 --> 00:02:45,680 Og backslash n, men litt merkelig og fraværende fra Scratch, 59 00:02:45,680 --> 00:02:49,380 rett og slett kommer til å ha den effekten vi vil se i en datamaskin, som min Mac eller en PC, 60 00:02:49,380 --> 00:02:51,660 for bare å flytte markøren til neste linje. 61 00:02:51,660 --> 00:02:53,970 Det er som å trykke Enter på tastaturet. 62 00:02:53,970 --> 00:02:55,580 >> Så får vi se det igjen før lenge. 63 00:02:55,580 --> 00:02:58,640 Men først, la oss ta en titt på denne annet eksempel i tilfellet med løkker. 64 00:02:58,640 --> 00:03:02,830 Vi hadde denne evig løkke siste gang, som var en rekke puslespillbrikker 65 00:03:02,830 --> 00:03:05,490 det gjorde noe bokstavelig talt forever-- i dette tilfellet 66 00:03:05,490 --> 00:03:08,360 si, hallo verden, hallo verden, hallo verden, hallo verden. 67 00:03:08,360 --> 00:03:10,350 Så det er en uendelig løkke av design. 68 00:03:10,350 --> 00:03:14,580 >> I C, hvis vi ønsker å implementere dette samme ideen, kan vi bare gjøre dette. 69 00:03:14,580 --> 00:03:19,570 Mens sant, printf hallo world-- nå stund, bare semantisk, type 70 00:03:19,570 --> 00:03:23,090 maner frem ideen om å gjøre noe igjen, og igjen, og igjen, 71 00:03:23,090 --> 00:03:23,980 og hvor lenge? 72 00:03:23,980 --> 00:03:27,990 Vel, true-- huske at sant er bare på eller én. 73 00:03:27,990 --> 00:03:30,660 >> Og sant er, selvfølgelig, alltid sant. 74 00:03:30,660 --> 00:03:33,060 Så det er litt av en meningsløs uttalelse bare si sant. 75 00:03:33,060 --> 00:03:36,890 Men ja, dette er bevisst, fordi hvis sant er bare alltid sant, 76 00:03:36,890 --> 00:03:40,850 enn mens sant bare antyder, hvis en litt indirekte, 77 00:03:40,850 --> 00:03:44,070 at følgende linjer med kode i mellom disse klammeparentes 78 00:03:44,070 --> 00:03:48,320 skulle bare kjøre igjen, og igjen, og igjen, og aldri stoppe. 79 00:03:48,320 --> 00:03:50,230 >> Men hvis du vil at sløyfe for å stoppe, så vi 80 00:03:50,230 --> 00:03:54,500 gjorde sist gang med noe sånt dette, gjentar følgende 50 ganger, 81 00:03:54,500 --> 00:03:57,700 i C kan vi gjøre det samme med hva som er kalt en for loop-- nøkkelordet 82 00:03:57,700 --> 00:03:59,330 ikke å være stund, men for. 83 00:03:59,330 --> 00:04:03,290 Og så har vi noen nye syntaks her, med int i lik 0, jeg mindre enn 50, 84 00:04:03,290 --> 00:04:03,880 i ++. 85 00:04:03,880 --> 00:04:05,430 Og vi vil komme tilbake til det. 86 00:04:05,430 --> 00:04:09,660 Men dette er rett og slett hvordan vi ville sette sett Scratch blokker 87 00:04:09,660 --> 00:04:13,079 til et sett av linjer med kode C. 88 00:04:13,079 --> 00:04:14,450 >> I mellomtiden, kan du vurdere variabler. 89 00:04:14,450 --> 00:04:16,540 Og, faktisk, vi bare så en et øyeblikk siden. 90 00:04:16,540 --> 00:04:21,220 Og i tilfelle av Scratch, hvis vi ønsket å erklære en variabel kalt jeg 91 00:04:21,220 --> 00:04:24,590 for å være i heltall, bare et nummer, og vi ønsker å sette den til en viss verdi, 92 00:04:24,590 --> 00:04:28,410 vi ville bruke denne oransje blokkere her-- satt jeg til 0. 93 00:04:28,410 --> 00:04:30,800 >> Og vi får se i dag og utover, akkurat som forrige uke, 94 00:04:30,800 --> 00:04:33,850 programmerere gjør nesten alltid begynne å telle fra null, egentlig 95 00:04:33,850 --> 00:04:34,950 av konvensjonen. 96 00:04:34,950 --> 00:04:37,250 Men også fordi tilbakekalling fra vår diskusjon av binære, 97 00:04:37,250 --> 00:04:39,990 færrest mulig representerer sammen med hvilket som helst antall bits 98 00:04:39,990 --> 00:04:41,640 bare kommer til å være 0 selv. 99 00:04:41,640 --> 00:04:45,190 Og så vil vi vanligvis starter initialisering selv våre variabler til 0. 100 00:04:45,190 --> 00:04:47,710 >> Og i C å gjøre det samme, vi kommer til å si int 101 00:04:47,710 --> 00:04:50,110 for heltall, jeg bare av konvensjonen. 102 00:04:50,110 --> 00:04:53,390 Jeg kunne ha kalt denne variabelen noe jeg vil, akkurat som i Scratch. 103 00:04:53,390 --> 00:04:57,770 Og så lik 0 bare fortredere verdien 0 fra høyre 104 00:04:57,770 --> 00:05:01,319 og setter den i variabelen, eller oppbevaringsboksen der, på venstre side. 105 00:05:01,319 --> 00:05:04,360 Og semikolon som vi vil see-- og vi har sett noen av disse already-- 106 00:05:04,360 --> 00:05:06,530 bare betyr slutten av tanken. 107 00:05:06,530 --> 00:05:09,430 Fortsett å gjøre noe annet på linjene som følger. 108 00:05:09,430 --> 00:05:11,330 >> Nå, hva om boolske uttrykk? 109 00:05:11,330 --> 00:05:14,320 Husk at i Scratch, disse var uttrykk 110 00:05:14,320 --> 00:05:16,740 som er enten sann eller false-- spørsmål, 111 00:05:16,740 --> 00:05:18,910 virkelig, som enten er sant eller usant. 112 00:05:18,910 --> 00:05:21,960 Så i tilfelle av Scratch, kanskje vi spørre et enkelt spørsmål som dette, 113 00:05:21,960 --> 00:05:24,586 er i mindre enn 50? 114 00:05:24,586 --> 00:05:25,710 Så i, igjen, er et helt tall. 115 00:05:25,710 --> 00:05:27,210 Kanskje vi bruker det i et skrape program 116 00:05:27,210 --> 00:05:29,310 å holde styr på en score eller noe sånt. 117 00:05:29,310 --> 00:05:33,810 Så denne syntaksen her i Scratch bare betyr, er jeg mindre enn 50? 118 00:05:33,810 --> 00:05:37,330 Vel, heldigvis, er noe enkel i C. Og for å oversette, 119 00:05:37,330 --> 00:05:41,780 dette vil vi bare si jeg mindre enn 50, ved hjelp av den kjente nøkkel 120 00:05:41,780 --> 00:05:42,850 på tastaturet. 121 00:05:42,850 --> 00:05:45,141 >> I mellomtiden, hvis du ønsket å si noe mer generelt, 122 00:05:45,141 --> 00:05:49,890 som, vel, er x mindre enn y der hver av x og y er i seg selv variabler? 123 00:05:49,890 --> 00:05:52,280 Vi kan gjøre det samme i C, så lenge vi har 124 00:05:52,280 --> 00:05:53,942 skapte disse variablene allerede. 125 00:05:53,942 --> 00:05:55,650 Og vi får se hvordan du gjøre det før lenge. 126 00:05:55,650 --> 00:05:58,590 Vi ville bare si x mindre enn y. 127 00:05:58,590 --> 00:06:00,530 >> Så du begynner å se noen likheter. 128 00:06:00,530 --> 00:06:03,490 Og de folkene som gjorde Scratch var sikkert 129 00:06:03,490 --> 00:06:05,250 inspirert av noen av disse grunnleggende ideer. 130 00:06:05,250 --> 00:06:10,350 Og du vil se denne typen Syntaksen i mange languages-- 131 00:06:10,350 --> 00:06:12,160 ikke bare Scratch, ikke bare C, men Python, 132 00:06:12,160 --> 00:06:14,790 og Javascript, og andre språk fortsatt. 133 00:06:14,790 --> 00:06:18,270 >> La oss vurdere en annen konstruksjon fra C, tanken om en tilstand, 134 00:06:18,270 --> 00:06:20,370 gjøre noe betinget. 135 00:06:20,370 --> 00:06:22,720 Hvis noe er sant, gjør dette. 136 00:06:22,720 --> 00:06:24,457 Hvis noe annet er sant, gjør det. 137 00:06:24,457 --> 00:06:27,040 Det er liksom programmerings tilsvarer et veiskille. 138 00:06:27,040 --> 00:06:29,730 Kanskje det er en to-veis gaffel, en tre-veis gaffel, eller mer. 139 00:06:29,730 --> 00:06:32,800 Og i Scratch, kan vi ha sett noe som dette. 140 00:06:32,800 --> 00:06:34,010 >> Så dette er en stor en. 141 00:06:34,010 --> 00:06:36,750 Men vurdere den relative Enkelheten av den logikk. 142 00:06:36,750 --> 00:06:44,010 Dersom x er mindre enn y, så si x er mindre enn y, annet hvis x er større enn y, 143 00:06:44,010 --> 00:06:46,230 så si x er større enn y. 144 00:06:46,230 --> 00:06:48,300 Og så, logisk, hvis du tenker tilbake til Scratch 145 00:06:48,300 --> 00:06:52,610 eller bare din egen menneskelige intuisjon, vel, hvis x er ikke større enn y og x 146 00:06:52,610 --> 00:06:57,000 er ikke mindre enn y, da selvfølgelig x kommer til å være lik y. 147 00:06:57,000 --> 00:06:59,690 Så i dette tilfellet ved hekke disse Skrape blokker, 148 00:06:59,690 --> 00:07:02,580 kan vi oppnå en tre måte veiskille? 149 00:07:02,580 --> 00:07:04,980 >> I mellomtiden, hvis vi ønsker å gjøre det i C, det uten tvil 150 00:07:04,980 --> 00:07:08,420 ser litt simpler-- minst når du blir kjent med syntaksen. 151 00:07:08,420 --> 00:07:12,050 Dersom x er mindre enn y, printf x er mindre enn y. 152 00:07:12,050 --> 00:07:16,140 Else if x er større enn y, printf x er større enn y. 153 00:07:16,140 --> 00:07:21,210 Else printf x er lik Y- og, igjen, med de skråstrek ender like 154 00:07:21,210 --> 00:07:24,160 for de nye linjene slik at hvis du faktisk kjørte denne typen program 155 00:07:24,160 --> 00:07:25,940 det ville bare flytte markøren til slutt 156 00:07:25,940 --> 00:07:28,100 til neste linje på skjermen. 157 00:07:28,100 --> 00:07:31,270 >> Nå, i mellomtiden Scratch hadde andre mer avanserte funksjoner, bare 158 00:07:31,270 --> 00:07:34,320 noen som vi kommer til å utgangspunktet flytte over til en verden av C. 159 00:07:34,320 --> 00:07:37,010 Og en av dem var kalt en liste i Scratch. 160 00:07:37,010 --> 00:07:39,100 Og dette var en spesiell type variabel som 161 00:07:39,100 --> 00:07:42,840 tillatt å lagre flere ting i den tilbake, mot rygg, og bakover, til rygg. 162 00:07:42,840 --> 00:07:45,540 >> I C, betyr det ikke har lister, per se, men noe 163 00:07:45,540 --> 00:07:48,090 som er mer generelt kalt arrays, selv om vi vil 164 00:07:48,090 --> 00:07:50,590 komme tilbake senere i semesteret å se på noe 165 00:07:50,590 --> 00:07:52,780 kalt en liste, eller egentlig en lenket liste. 166 00:07:52,780 --> 00:07:55,510 Men for nå, det nærmeste tilsvarende i C for oss 167 00:07:55,510 --> 00:07:57,345 kommer til å være noe kalles en matrise. 168 00:07:57,345 --> 00:07:59,740 Og en rekke er rett og slett en spesiell type av variabel 169 00:07:59,740 --> 00:08:03,160 som lar deg lagre data tilbake, til rygg, og bakover, mot rygg. 170 00:08:03,160 --> 00:08:05,840 >> Og, ja, i Scratch, hvis vi ønsket å få tilgang 171 00:08:05,840 --> 00:08:09,030 det første elementet i en matrise eller en list-- og jeg kommer til å kalle det, 172 00:08:09,030 --> 00:08:13,600 av konvensjonen, argv, argument vektor, men mer om det før lenge. 173 00:08:13,600 --> 00:08:17,090 Hvis jeg ønsker å få på det første elementet av argv, i en verden av Scratch 174 00:08:17,090 --> 00:08:20,930 du faktisk gjør vanligvis begynne å telle fra 1. 175 00:08:20,930 --> 00:08:22,850 >> Og så jeg kan få punkt 1 i argv. 176 00:08:22,850 --> 00:08:26,310 Det er bare hvordan MIT implementert oppfatningen av lister. 177 00:08:26,310 --> 00:08:29,860 Men i C, kommer jeg til å mer rett og slett bare si, argv, 178 00:08:29,860 --> 00:08:32,758 som igjen er navnet på mitt list-- eller for å være klar, en matrise. 179 00:08:32,758 --> 00:08:34,549 Og hvis jeg vil det første elementer, jeg kommer 180 00:08:34,549 --> 00:08:37,890 å bruke hakeparentes, som du kanskje ikke kan brukes under et tastatur. 181 00:08:37,890 --> 00:08:40,150 >> Men 0 betyr bare får meg først. 182 00:08:40,150 --> 00:08:42,160 Så på anledning og som tiden går, vi skal 183 00:08:42,160 --> 00:08:44,570 å begynne å se disse dikotomier mellom Scratch og C, 184 00:08:44,570 --> 00:08:46,070 hvor Scratch bruker det. 185 00:08:46,070 --> 00:08:47,670 Vi i C bruker 0 her. 186 00:08:47,670 --> 00:08:49,420 Men du vil raskt se når du forstår 187 00:08:49,420 --> 00:08:52,920 grunnlaget for hvert språk, at disse ting begynner å bli enda mer 188 00:08:52,920 --> 00:08:56,860 kjent gjennom praksis og praksis. 189 00:08:56,860 --> 00:08:59,700 >> Så la oss faktisk ser nå på et program. 190 00:08:59,700 --> 00:09:04,031 Her skal være den første av våre C kildekode for fullstendige programmer. 191 00:09:04,031 --> 00:09:06,280 Og programmet vi skal å tilby for vurdering 192 00:09:06,280 --> 00:09:09,340 er det en som er tilsvarende til at tidligere Scratch stykke. 193 00:09:09,340 --> 00:09:13,210 >> Så her har vi det er uten tvil den enkleste C program 194 00:09:13,210 --> 00:09:15,410 du kan skrive at faktisk gjør noe. 195 00:09:15,410 --> 00:09:18,250 Nå vil vi se fortiden, for nå har inkludere, 196 00:09:18,250 --> 00:09:21,190 standard io.h, og disse vinkel parentes, og int, og ugyldig, 197 00:09:21,190 --> 00:09:22,840 og klammeparentes og lignende. 198 00:09:22,840 --> 00:09:25,390 >> Og la oss bare fokusere på hvilken, i det minste intuitivt 199 00:09:25,390 --> 00:09:26,860 kan hoppe ut på deg allerede. 200 00:09:26,860 --> 00:09:30,300 Faktisk, viktigste, vet jeg ikke nødvendigvis vet hva dette er, 201 00:09:30,300 --> 00:09:34,580 men mye som Scratch hadde det da grønne flagget klikket puslespill brikke, 202 00:09:34,580 --> 00:09:39,070 så gjør C som programmeringsspråk har en hoved stykke kode som 203 00:09:39,070 --> 00:09:43,380 blir utført som standard. Og, ja, Det er bokstavelig talt kommer til å bli kalt hoved. 204 00:09:43,380 --> 00:09:44,720 >> Så hoved er en funksjon. 205 00:09:44,720 --> 00:09:48,720 Og det er en spesiell funksjon som eksisterer i C at når du kjører et program, 206 00:09:48,720 --> 00:09:52,720 det er hoved som blir drevet av misligholde. I en verden av Scratch, 207 00:09:52,720 --> 00:09:56,970 det var som regel når grønt flagg klikket som fikk kjøre som standard. 208 00:09:56,970 --> 00:10:01,130 >> I mellomtiden har vi sett dette før, printf eller print formatert, det er 209 00:10:01,130 --> 00:10:05,620 kommer til å være en funksjon som følger med C, sammen med en hel haug med andre, 210 00:10:05,620 --> 00:10:10,140 som vil fra tid og tid igjen, for å gjøre nøyaktig 211 00:10:10,140 --> 00:10:12,450 som navnet antyder, skrive ut noe. 212 00:10:12,450 --> 00:10:13,500 Hva ønsker vi å skrive ut? 213 00:10:13,500 --> 00:10:15,770 Vel, vil vi se at av omsluttende tegn 214 00:10:15,770 --> 00:10:18,680 som these-- hallo verden, backslash n i anførselstegn, 215 00:10:18,680 --> 00:10:23,040 vi kan fortelle printf nøyaktig hva du skal skrive ut på skjermen. 216 00:10:23,040 --> 00:10:26,430 >> Men for å gjøre som vi dessverre 217 00:10:26,430 --> 00:10:30,010 trenger å ta noe som er allerede kryptisk til oss mennesker, 218 00:10:30,010 --> 00:10:34,510 men minst det er noe readable-- skarp omfatter standard io.h, int, 219 00:10:34,510 --> 00:10:39,340 Hoved, ugyldig printf, all den magiske besvergelser vi nettopp så på skjermen. 220 00:10:39,340 --> 00:10:42,470 Men vi har faktisk til gå mer uforståelige likevel. 221 00:10:42,470 --> 00:10:47,140 Vi må først oversette koden at vi skriver til maskinkode. 222 00:10:47,140 --> 00:10:51,370 Og husker fra forrige uke at maskiner, minst de vi kjenner her, 223 00:10:51,370 --> 00:10:54,450 på slutten av dagen bare forstå nuller og enere. 224 00:10:54,450 --> 00:10:58,100 >> Og min Gud, hvis vi måtte skrive disse nuller og enere til faktisk program, 225 00:10:58,100 --> 00:11:01,260 det vil veldig, veldig raskt ta moro ut av noe. 226 00:11:01,260 --> 00:11:05,150 Men det viser seg, per i forrige uke, at disse mønstrene av nuller og enere 227 00:11:05,150 --> 00:11:06,400 bare har en spesiell betydning. 228 00:11:06,400 --> 00:11:08,500 I visse sammenhenger de kan bety tall. 229 00:11:08,500 --> 00:11:11,840 >> I noen sammenhenger kan de bety bokstaver eller farger, eller hvilket som helst antall 230 00:11:11,840 --> 00:11:14,710 andre abstraksjoner der på. 231 00:11:14,710 --> 00:11:18,450 Men akkurat som datamaskinen har en CPU, Central Processing Unit, 232 00:11:18,450 --> 00:11:20,390 eller hjernen i datamaskinen. 233 00:11:20,390 --> 00:11:22,240 Det er vanligvis Intel inne, fordi det er 234 00:11:22,240 --> 00:11:24,900 en av de største selskapene som gjør CPUer for datamaskiner. 235 00:11:24,900 --> 00:11:28,910 >> Vel, Intel prosessorer og andre rett og slett har bestemt på forhånd 236 00:11:28,910 --> 00:11:33,970 at visse mønstre av nuller og de skal bety konkrete ting. 237 00:11:33,970 --> 00:11:37,040 Visse mønstre av nuller og enere vil bety, skrive ut denne til skjermen, 238 00:11:37,040 --> 00:11:39,710 eller legge til disse to tallene, eller trekke disse to tallene, 239 00:11:39,710 --> 00:11:43,310 eller flytte denne delen av data fra min maskinens minne over her, 240 00:11:43,310 --> 00:11:47,870 eller hvilket som helst antall av andre meget lavt nivå, men til slutt nyttig, operasjoner. 241 00:11:47,870 --> 00:11:53,022 Men, heldigvis, vi mennesker ikke kommer til å trenge å vite dette detaljnivået. 242 00:11:53,022 --> 00:11:56,230 Faktisk, akkurat som forrige gang, der vi informasjon hentet igjen, og igjen, og igjen, 243 00:11:56,230 --> 00:11:58,930 bygning av meget lavt nivå primitiver som nuller og enere 244 00:11:58,930 --> 00:12:01,160 til høyere nivå konsepter som tall og bokstaver, 245 00:12:01,160 --> 00:12:04,330 og farger, og mer, så kan vi som programmerere 246 00:12:04,330 --> 00:12:07,080 stå på skuldrene til andre som har kommet før oss 247 00:12:07,080 --> 00:12:11,260 og bruke programvare som andre folk har skrevet før us-- 248 00:12:11,260 --> 00:12:14,340 nemlig programmer kalt kompilatorer. 249 00:12:14,340 --> 00:12:17,770 >> C er et språk som vanligvis utarbeidet, 250 00:12:17,770 --> 00:12:22,130 som betyr konvertert fra kildekoden til maskinkode. 251 00:12:22,130 --> 00:12:25,230 Spesielt hva dette betyr er at hvis du har din kilde 252 00:12:25,230 --> 00:12:29,530 kode som du selv skriver, så vi snart vil i løpet av et øyeblikk på skjermen, 253 00:12:29,530 --> 00:12:33,140 og du ønsker å konvertere den slutt til maskin code-- 254 00:12:33,140 --> 00:12:37,100 disse nuller og enere som bare din Mac eller PC 255 00:12:37,100 --> 00:12:41,230 understands-- du har en første mate at kildekoden i så 256 00:12:41,230 --> 00:12:46,340 inngang til en spesiell program kalt en kompilator, 257 00:12:46,340 --> 00:12:48,974 hvis utgang vi skal se er maskinkode. 258 00:12:48,974 --> 00:12:51,890 Og, ja, sist gang vi snakket om, virkelig, på slutten av dagen, 259 00:12:51,890 --> 00:12:52,610 problemløsning. 260 00:12:52,610 --> 00:12:53,360 Du har innganger. 261 00:12:53,360 --> 00:12:54,318 Og du har utganger. 262 00:12:54,318 --> 00:12:56,560 Og du har fått noen slag av algoritmen i midten. 263 00:12:56,560 --> 00:12:59,830 >> Algoritmer kan sikkert være implementert i software, 264 00:12:59,830 --> 00:13:02,900 som vi så med pseudo forrige uke og som vi vil se med selve koden 265 00:13:02,900 --> 00:13:03,490 denne uka. 266 00:13:03,490 --> 00:13:06,430 Og så en kompilator egentlig bare har et sett med algoritmer inne 267 00:13:06,430 --> 00:13:10,060 av det som vet hvordan de skal konvertere de spesielle søkeord, 268 00:13:10,060 --> 00:13:12,180 som hoved, og printf, og andre som vi bare 269 00:13:12,180 --> 00:13:17,620 så inn i mønstre av nuller og de som Intel Inside og andre CPUer 270 00:13:17,620 --> 00:13:20,020 faktisk forstår. 271 00:13:20,020 --> 00:13:22,460 Så hvordan gjør vi dette? 272 00:13:22,460 --> 00:13:24,470 Hvor får vi en kompilator? 273 00:13:24,470 --> 00:13:26,400 >> De fleste av oss her har en Mac eller en PC. 274 00:13:26,400 --> 00:13:29,152 Og du kjører Mac OS, eller Windows eller Linux eller Solaris, 275 00:13:29,152 --> 00:13:30,860 eller hvilket som helst antall annen operativsystemer. 276 00:13:30,860 --> 00:13:32,568 Og, ja, vi kunne gå ut på nettet 277 00:13:32,568 --> 00:13:35,710 og laste ned en kompilator for Mac eller PC 278 00:13:35,710 --> 00:13:37,360 for ditt operativsystem. 279 00:13:37,360 --> 00:13:39,617 Men vi vil alle være på forskjellige sider, så å si. 280 00:13:39,617 --> 00:13:41,450 Vi ville ha litt forskjellige konfigurasjoner. 281 00:13:41,450 --> 00:13:43,210 Og det ville ikke fungere likevel. 282 00:13:43,210 --> 00:13:45,280 Og, ja, i disse dager mange av oss ikke bruker 283 00:13:45,280 --> 00:13:47,516 programvare som kjører bare på våre bærbare datamaskiner. 284 00:13:47,516 --> 00:13:49,390 I stedet bruker vi noe som en nettleser som 285 00:13:49,390 --> 00:13:52,930 tillater oss å få tilgang til web-baserte applikasjoner i skyen. 286 00:13:52,930 --> 00:13:55,630 Og senere i semesteret, vi vil gjøre akkurat det. 287 00:13:55,630 --> 00:13:59,660 Vi vil skrive søknader eller programvare ved hjelp code-- ikke C, 288 00:13:59,660 --> 00:14:02,860 men andre språk som Python og JavaScript-- som kjører i skyen. 289 00:14:02,860 --> 00:14:05,860 >> Og for å gjøre det, vi oss selv i løpet av semesteret 290 00:14:05,860 --> 00:14:11,890 vil faktisk bruke en skybasert miljøet kjent som CS50 IDE. 291 00:14:11,890 --> 00:14:16,030 Dette er en web-basert programmering miljø, eller integrert utvikling 292 00:14:16,030 --> 00:14:20,610 miljø, IDE, som er bygget på toppen av noen åpen kildekode programvare kalt Cloud 9. 293 00:14:20,610 --> 00:14:22,966 Og vi har gjort noen pedagogisk forenklinger i det 294 00:14:22,966 --> 00:14:25,840 slik som å skjule visse funksjoner i de første ukene som vi ikke trenger, 295 00:14:25,840 --> 00:14:27,770 etter som du kan avsløre dem og gjøre mest 296 00:14:27,770 --> 00:14:29,400 alt du vil med miljøet. 297 00:14:29,400 --> 00:14:32,470 >> Og det gir oss også, til pre-installere bestemt programvare. 298 00:14:32,470 --> 00:14:35,330 Ting som en såkalt CS50 bibliotek, som vi vil snart se 299 00:14:35,330 --> 00:14:39,210 gir oss i C med noen tilleggsfunksjonalitet. 300 00:14:39,210 --> 00:14:44,392 Så hvis du går til, til slutt, CS50.io, vil du bli bedt om å logge inn, 301 00:14:44,392 --> 00:14:46,350 og når du gjør det og opprette en konto gratis, 302 00:14:46,350 --> 00:14:52,150 du vil være i stand til å få tilgang til en miljø som ser ut som dette. 303 00:14:52,150 --> 00:14:53,760 >> Nå er dette i standardmodus. 304 00:14:53,760 --> 00:14:55,650 Alt er fint og lys på skjermen. 305 00:14:55,650 --> 00:14:57,941 Mange av oss har en vane arbeider på CS50 stykke som er 306 00:14:57,941 --> 00:14:59,150 ganske sent i natt. 307 00:14:59,150 --> 00:15:02,400 Og så noen av dere kanskje foretrekker å slå den inn i nattmodus, så å si. 308 00:15:02,400 --> 00:15:05,550 >> Men, til slutt, hva du er kommer til å se i løpet av CS50 IDE 309 00:15:05,550 --> 00:15:08,340 er tre distinkte areas-- et område på venstre der 310 00:15:08,340 --> 00:15:12,604 filene dine kommer til å være i sky, et område øverst til høyre 311 00:15:12,604 --> 00:15:14,270 hvor koden skal være redigerbare. 312 00:15:14,270 --> 00:15:16,650 Du vil være i stand til å åpne enkelte kategoriene for ethvert program 313 00:15:16,650 --> 00:15:19,670 at du skriver dette semesteret inne av det øvre høyre hjørne. 314 00:15:19,670 --> 00:15:23,070 Og da mest arcanely, og likevel kraftfullt, 315 00:15:23,070 --> 00:15:26,610 kommer til å være denne tingen på bunn kjent som en terminalvindu. 316 00:15:26,610 --> 00:15:29,450 >> Dette er en gammel skole Command Line Interface, 317 00:15:29,450 --> 00:15:32,240 eller CLI, som gjør at du å utføre kommandoer 318 00:15:32,240 --> 00:15:35,260 på computer-- i dette tilfellet datamaskinen i cloud-- 319 00:15:35,260 --> 00:15:39,090 å gjøre ting som å kompilere koden din fra kildekoden til maskinkode, 320 00:15:39,090 --> 00:15:43,600 å kjøre programmer, eller for å starte web server, eller for å få tilgang til databasen, 321 00:15:43,600 --> 00:15:47,454 og en rekke andre teknikker at vi vil begynne å bruke før lenge. 322 00:15:47,454 --> 00:15:49,370 Men for å komme dit, er vi kommer til å faktisk ha 323 00:15:49,370 --> 00:15:51,240 å gå online og begynne å spille. 324 00:15:51,240 --> 00:15:54,399 Og for å gjøre det, la oss først begynne fiksing og triksing med hoved, 325 00:15:54,399 --> 00:15:55,940 og skrive den viktigste del av et program. 326 00:15:55,940 --> 00:15:59,170 Og la oss bruke denne funksjonen printf, som vi brukte tidligere, 327 00:15:59,170 --> 00:16:01,050 bare for å si noe. 328 00:16:01,050 --> 00:16:04,910 >> Så her er jeg allerede inne i CS50 IDE. 329 00:16:04,910 --> 00:16:05,930 Jeg har logget på forhånd. 330 00:16:05,930 --> 00:16:07,360 Og jeg fullstendig skjermet vinduet. 331 00:16:07,360 --> 00:16:09,670 Og så, til slutt, du også i kommende problemer 332 00:16:09,670 --> 00:16:12,960 vil følge tilsvarende trinn som vil gi elektronisk dokumentasjon. 333 00:16:12,960 --> 00:16:16,360 Så du trenger ikke å bekymre deg for absorberende hver lille tekniske trinn 334 00:16:16,360 --> 00:16:17,730 som jeg gjør her i dag. 335 00:16:17,730 --> 00:16:19,222 >> Men du vil få en skjerm som dette. 336 00:16:19,222 --> 00:16:20,430 Jeg måtte være i nattmodus. 337 00:16:20,430 --> 00:16:22,944 Og du kan lyse alt opp ved å deaktivere nattmodus. 338 00:16:22,944 --> 00:16:24,860 Og ved slutten av dag, kommer du til å se 339 00:16:24,860 --> 00:16:30,090 disse tre hoved areas-- filen Nettleseren til venstre, kode fanene opp toppen, 340 00:16:30,090 --> 00:16:32,430 og terminalvinduet på bunnen. 341 00:16:32,430 --> 00:16:34,890 >> La meg gå videre og skrive min første program. 342 00:16:34,890 --> 00:16:42,300 Jeg kommer til å preemptively gå til Fil, Lagre, og lagre filen min som hello.c. 343 00:16:42,300 --> 00:16:46,850 Faktisk, etter konvensjonen, et program vi skrive som er skrevet i C-språk 344 00:16:46,850 --> 00:16:49,739 skal hete noe dot c, etter konvensjonen. 345 00:16:49,739 --> 00:16:53,030 Så jeg kommer til å nevne det hello.c, fordi Jeg vil bare si hei til verden. 346 00:16:53,030 --> 00:16:54,820 Nå kommer jeg til å zoome ut og klikk på Lagre. 347 00:16:54,820 --> 00:16:58,180 Og alt jeg har her nå er en fane hvor kan jeg begynne å skrive kode. 348 00:16:58,180 --> 00:16:59,490 >> Dette er ikke til å kompilere. 349 00:16:59,490 --> 00:17:00,300 Det betyr ingenting. 350 00:17:00,300 --> 00:17:02,750 Og så selv om jeg konvertert dette til nuller og enere, 351 00:17:02,750 --> 00:17:05,390 CPU kommer til å ha noen anelse om hva som skjer rundt. 352 00:17:05,390 --> 00:17:14,170 Men hvis jeg skriver linjer som samsvarer opp med Cs conventions-- C vesen, 353 00:17:14,170 --> 00:17:20,150 igjen, language-- dette med syntaks som dette, printf hallo world-- og jeg har 354 00:17:20,150 --> 00:17:22,210 fått komfortabel med å gjøre dette over tid. 355 00:17:22,210 --> 00:17:24,510 Så jeg tror ikke jeg har gjort eventuelle skrivefeil. 356 00:17:24,510 --> 00:17:27,910 >> Men, uten unntak, den aller første gang du gjør dette, vil du. 357 00:17:27,910 --> 00:17:31,090 Og det jeg er i ferd med å gjøre kanskje veldig vel ikke fungere for deg første gang. 358 00:17:31,090 --> 00:17:33,610 Og det er helt OK, fordi akkurat nå 359 00:17:33,610 --> 00:17:37,662 kan bare se en hel masse newness, men over tid når du blir kjent 360 00:17:37,662 --> 00:17:39,870 med dette miljøet, og dette språket, og andre, 361 00:17:39,870 --> 00:17:42,370 vil du begynne å se ting som er enten riktig eller feil. 362 00:17:42,370 --> 00:17:44,369 >> Og dette er hva undervisning stipendiater og kurs 363 00:17:44,369 --> 00:17:48,780 assistenter får så god på over tid, er spotting feil eller feil i koden din. 364 00:17:48,780 --> 00:17:52,110 Men jeg hevder at det er ingen feil i denne koden. 365 00:17:52,110 --> 00:17:53,990 Så jeg ønsker nå å kjøre dette programmet. 366 00:17:53,990 --> 00:17:57,440 >> Nå på min egen Mac eller PC, jeg er i vane å dobbeltklikke ikoner 367 00:17:57,440 --> 00:17:59,350 når jeg ønsker å kjøre noen program. 368 00:17:59,350 --> 00:18:01,080 Men det er ikke den modellen her. 369 00:18:01,080 --> 00:18:04,570 I dette miljøet, som er CS50 IDE. 370 00:18:04,570 --> 00:18:07,192 Vi bruker en drifts system kalt Linux. 371 00:18:07,192 --> 00:18:09,900 Linux er minner om en annen operativsystem, generelt kjent 372 00:18:09,900 --> 00:18:10,850 som Unix. 373 00:18:10,850 --> 00:18:16,340 Og Linux er spesielt kjent for å ha en kommandolinje miljø, CLI. 374 00:18:16,340 --> 00:18:20,070 Nå, vi bruker en bestemt smaken av Linux kalt Ubuntu. 375 00:18:20,070 --> 00:18:22,770 Og Ubuntu er rett og slett en viss versjon av Linux. 376 00:18:22,770 --> 00:18:27,900 >> Men disse Linux er i disse dager gjør faktisk kommer med grafiske brukergrensesnitt. 377 00:18:27,900 --> 00:18:30,360 Og den vi tilfeldigvis skal bruke her er web-basert. 378 00:18:30,360 --> 00:18:32,735 Så dette kan se enda en litt forskjellig fra noe 379 00:18:32,735 --> 00:18:35,310 du selv kan ha sett eller kjøre i det siste. 380 00:18:35,310 --> 00:18:37,910 >> Så jeg kommer til å gå videre nå og gjøre følgende. 381 00:18:37,910 --> 00:18:40,950 Jeg har lagret filen som hello.c. 382 00:18:40,950 --> 00:18:47,350 Jeg kommer til å gå videre og typen clanghello.c Så klang 383 00:18:47,350 --> 00:18:49,850 for C-språk er en kompilator. 384 00:18:49,850 --> 00:18:51,952 Det er forhåndsinstallert i CS50 IDE. 385 00:18:51,952 --> 00:18:54,910 Og du kan absolutt laste ned og installere dette på din egen Mac eller PC. 386 00:18:54,910 --> 00:18:57,910 >> Men, igjen, ville du ikke ha alle pre-konfigurasjon gjort for deg. 387 00:18:57,910 --> 00:19:00,940 Så for nå, jeg er bare kommer til å kjøre clanghello.c. 388 00:19:00,940 --> 00:19:03,240 Og nå legger merke til denne syntaksen her vil til slutt 389 00:19:03,240 --> 00:19:06,930 skjønner bare si at jeg er i en mappe eller katalog som heter arbeidsområde. 390 00:19:06,930 --> 00:19:11,030 Dette dollartegn er bare konvensjonen etter mening, skriver dine kommandoer her. 391 00:19:11,030 --> 00:19:14,560 >> Det er det som kalles en rask, bare etter konvensjonen er dollartegn. 392 00:19:14,560 --> 00:19:19,130 Og hvis jeg går videre nå og klikk Skriv inn, ingenting synes å ha skjedd. 393 00:19:19,130 --> 00:19:20,930 Men det er faktisk en god ting. 394 00:19:20,930 --> 00:19:23,650 Jo mindre det skjer på skjermen, jo mer sannsynlig 395 00:19:23,650 --> 00:19:26,710 koden er riktig, minst syntaktisk. 396 00:19:26,710 --> 00:19:29,120 >> Så hvis jeg vil kjøre denne program, hva gjør jeg? 397 00:19:29,120 --> 00:19:33,770 Vel, det viser seg at Standard navn etter konvensjonen 398 00:19:33,770 --> 00:19:38,854 for programmer når du ikke angir et navn på programmet er bare a.out. 399 00:19:38,854 --> 00:19:41,270 Og denne syntaksen også, vil du bli kjent med før lenge. 400 00:19:41,270 --> 00:19:47,500 >> Dot slash bare betyr, hei, CS50 IDE, kjøre et program som heter a.out 401 00:19:47,500 --> 00:19:49,400 som er inne i min nåværende katalog. 402 00:19:49,400 --> 00:19:51,520 Det prikk betyr gjeldende katalog. 403 00:19:51,520 --> 00:19:55,040 Og vi får se hva andre slike sekvenser tegn betyr før lenge. 404 00:19:55,040 --> 00:19:58,430 >> Så her går vi, Enter, hallo verden. 405 00:19:58,430 --> 00:20:00,080 Og du vil legge merke til, at det som skjedde? 406 00:20:00,080 --> 00:20:01,580 Ikke bare gjorde det skrive ut hello world. 407 00:20:01,580 --> 00:20:05,990 Det er også flyttet markøren til neste linje. 408 00:20:05,990 --> 00:20:07,160 >> Og hvorfor var det? 409 00:20:07,160 --> 00:20:12,400 Hva var koden som vi skrev før som sørget for at markøren ville 410 00:20:12,400 --> 00:20:14,882 gå på neste linje? 411 00:20:14,882 --> 00:20:16,840 Morsom ting om en datamaskin er det bare kommer 412 00:20:16,840 --> 00:20:18,570 å gjøre bokstavelig det du ber den om. 413 00:20:18,570 --> 00:20:26,050 >> Så hvis du forteller det til printf hallo, komma, mellomrom, verden, tett sitat, 414 00:20:26,050 --> 00:20:29,090 Det er bokstavelig talt bare kommer å skrive ut disse tegnene. 415 00:20:29,090 --> 00:20:31,980 Men jeg hadde denne spesielle karakter på slutten, husker, backslash n. 416 00:20:31,980 --> 00:20:34,230 Og det er det sikret at karakteren gikk 417 00:20:34,230 --> 00:20:36,570 til neste linje på skjermen. 418 00:20:36,570 --> 00:20:38,097 >> Faktisk, la meg gå og gjøre dette. 419 00:20:38,097 --> 00:20:39,430 La meg gå videre og slett dette. 420 00:20:39,430 --> 00:20:41,180 Legg nå merke til at toppen av skjermen min er det 421 00:20:41,180 --> 00:20:42,890 litt rødt lys i fanen indikerer, 422 00:20:42,890 --> 00:20:45,047 hei, du har ikke lagret filen. 423 00:20:45,047 --> 00:20:47,880 Så jeg kommer til å gå videre med kontroll S eller kommando S, lagre filen. 424 00:20:47,880 --> 00:20:51,130 Nå goes-- det gikk for en moment-- grønn. 425 00:20:51,130 --> 00:20:53,760 Og nå er det tilbake til bare å være en nær ikon. 426 00:20:53,760 --> 00:21:01,860 >> Hvis jeg nå kjøre clanghello.c igjen, Enter, dot slash, a.out, Enter, 427 00:21:01,860 --> 00:21:04,110 vil du se at det fortsatt arbeidet. 428 00:21:04,110 --> 00:21:06,020 Men det er kanskje litt buggy. 429 00:21:06,020 --> 00:21:08,714 Akkurat nå, min prompt-- arbeidsområde, og da at dollartegn, 430 00:21:08,714 --> 00:21:10,880 og deretter min faktiske prompt-- er alle på samme linje. 431 00:21:10,880 --> 00:21:14,540 Så dette er absolutt en estetisk feil, selv om det er egentlig ikke en logisk feil. 432 00:21:14,540 --> 00:21:16,250 >> Så jeg kommer til å angre det jeg nettopp gjorde. 433 00:21:16,250 --> 00:21:18,560 Jeg kommer til å kjøre a.out. 434 00:21:18,560 --> 00:21:22,710 Merke til at jeg har lagt til linjeskift karakter tilbake. 435 00:21:22,710 --> 00:21:24,280 Jeg har lagret filen. 436 00:21:24,280 --> 00:21:31,630 >> Så jeg kommer til å kjøre a.out, og-- faen, en bug, en bug som betyr feil. 437 00:21:31,630 --> 00:21:35,020 Så feilen er at selv om Jeg har lagt den backslash n der, 438 00:21:35,020 --> 00:21:41,180 re-lagret, re-løp i programmet, virkemåten var den samme. 439 00:21:41,180 --> 00:21:42,640 Hvorfor skulle det være? 440 00:21:42,640 --> 00:21:43,910 >> Jeg mangler et skritt, ikke sant? 441 00:21:43,910 --> 00:21:47,620 Det viktig skritt tidligere var at du har to-- når du endrer kildekoden, 442 00:21:47,620 --> 00:21:49,610 det viser seg også kjøre den gjennom kompilatoren 443 00:21:49,610 --> 00:21:51,102 igjen slik at du får ny maskin kode. 444 00:21:51,102 --> 00:21:52,810 Og maskinkode, nuller og enere, 445 00:21:52,810 --> 00:21:56,260 kommer til å være nesten identiske, men ikke perfekt, fordi vi trenger, 446 00:21:56,260 --> 00:21:57,510 selvfølgelig, at ny linje. 447 00:21:57,510 --> 00:22:02,640 >> Så for å fikse dette, jeg kommer til å trenge å kjøre clanghello.c, enter, dot 448 00:22:02,640 --> 00:22:03,800 slash, a.out. 449 00:22:03,800 --> 00:22:08,402 Og nå, hallo verden er tilbake der jeg forventer at det skal være. 450 00:22:08,402 --> 00:22:09,610 Så dette er alt fint og bra. 451 00:22:09,610 --> 00:22:13,150 Men a.out er en ganske dum navn for en program, selv om det nå måtte være, 452 00:22:13,150 --> 00:22:16,530 for historiske grunner, default-- betyr montering utganger. 453 00:22:16,530 --> 00:22:20,780 >> Men la meg gå videre her og gjøre dette på en annen måte. 454 00:22:20,780 --> 00:22:24,760 Jeg vil ha min hello world program å faktisk bli kalt hei. 455 00:22:24,760 --> 00:22:28,320 Så hvis det var et ikon på min desktop, ville det ikke være a.out. 456 00:22:28,320 --> 00:22:29,730 Det ville bli kalt hei. 457 00:22:29,730 --> 00:22:33,660 >> Så for å gjøre dette, viser det seg som klang, som mange programmer, 458 00:22:33,660 --> 00:22:37,980 støtter kommandolinje argumenter, eller flagg, eller brytere, 459 00:22:37,980 --> 00:22:39,600 som bare påvirker dens adferd. 460 00:22:39,600 --> 00:22:45,160 Spesielt støtter klang en dash o flagg, som deretter tar en andre ord. 461 00:22:45,160 --> 00:22:48,190 I dette tilfellet, vil jeg vilkårlig, men rimelig, kaller det hallo. 462 00:22:48,190 --> 00:22:50,710 Men jeg kan kalle det noe Jeg vil, bortsett fra a.out, som 463 00:22:50,710 --> 00:22:52,390 ville være ganske tillegg til punktet. 464 00:22:52,390 --> 00:22:55,640 >> Og så bare oppgi navnet på filen jeg ønsker å kompilere. 465 00:22:55,640 --> 00:22:59,190 Så nå selv om i begynnelsen av kommandoen jeg har fortsatt klang, 466 00:22:59,190 --> 00:23:01,410 ved slutten av kommandoen Jeg har fortsatt filnavnet, 467 00:23:01,410 --> 00:23:05,520 Jeg har nå disse kommandolinje argumenter, disse flaggene som sier, 468 00:23:05,520 --> 00:23:11,180 oh, forresten, utgang-o, en fil kalt hallo, ikke standard a.out. 469 00:23:11,180 --> 00:23:13,810 >> Så hvis jeg trykker Enter nå, ingenting synes å ha skjedd. 470 00:23:13,810 --> 00:23:17,900 Og ennå, nå kan jeg gjøre dot slash hei. 471 00:23:17,900 --> 00:23:19,089 Så det er det samme programmet. 472 00:23:19,089 --> 00:23:21,380 De nuller og enere er identisk på slutten av dagen. 473 00:23:21,380 --> 00:23:24,210 >> Men de er i to annerledes files-- a.out, 474 00:23:24,210 --> 00:23:26,490 som er den første versjonen og bare tåpelig navngitt, 475 00:23:26,490 --> 00:23:30,250 og nå hei, som er en mye mer overbevisende navn på et program. 476 00:23:30,250 --> 00:23:33,195 Men, ærlig talt, jeg er aldri kommer til å huske dette igjen, 477 00:23:33,195 --> 00:23:34,070 og igjen, og igjen. 478 00:23:34,070 --> 00:23:36,411 Og, faktisk, som vi skriver mer kompliserte programmer, 479 00:23:36,411 --> 00:23:38,160 kommandoene du er nødt til å skrive 480 00:23:38,160 --> 00:23:40,920 kommer til å få enda mer komplisert likevel. 481 00:23:40,920 --> 00:23:41,940 >> Og ikke å bekymre deg. 482 00:23:41,940 --> 00:23:46,220 Det viser seg at mennesker før oss har innsett at de også 483 00:23:46,220 --> 00:23:47,530 hadde dette nøyaktig samme problem. 484 00:23:47,530 --> 00:23:50,900 Også de ikke liker å måtte skriver ganske lange, uforståelige kommandoer, 485 00:23:50,900 --> 00:23:52,200 enn si huske dem. 486 00:23:52,200 --> 00:23:56,070 Og så mennesker før oss har gjort andre programmer som gjør det enklere 487 00:23:56,070 --> 00:23:57,670 å kompilere programvare. 488 00:23:57,670 --> 00:24:01,609 >> Og, ja, en slik Programmet heter Make. 489 00:24:01,609 --> 00:24:03,150 Så jeg kommer til å gå videre og gjøre dette. 490 00:24:03,150 --> 00:24:05,691 Jeg kommer til å angre alt jeg gjorde på følgende måte. 491 00:24:05,691 --> 00:24:07,690 La meg skrive LS. 492 00:24:07,690 --> 00:24:10,980 Og du vil legge merke til tre things-- a.out, og en stjerne, hallo 493 00:24:10,980 --> 00:24:12,810 og en stjerne, og hello.c. 494 00:24:12,810 --> 00:24:14,730 Forhåpentligvis, bør dette være litt intuitiv, 495 00:24:14,730 --> 00:24:18,220 i den grad tidligere var det ingenting i dette arbeidsområdet. 496 00:24:18,220 --> 00:24:21,240 Det var ingenting som jeg hadde opprettet før vi startet klassen. 497 00:24:21,240 --> 00:24:22,840 >> Og jeg opprettet hello.c. 498 00:24:22,840 --> 00:24:24,544 Jeg deretter utarbeidet det, og kalte det a.out. 499 00:24:24,544 --> 00:24:27,460 Og da jeg samlet det igjen litt annerledes og kalte det hei. 500 00:24:27,460 --> 00:24:32,830 Så jeg har tre filer i denne katalogen, i denne mappen som heter arbeidsområde. 501 00:24:32,830 --> 00:24:35,005 Nå kan jeg se at så vel hvis jeg zoome ut faktisk. 502 00:24:35,005 --> 00:24:37,530 >> Hvis jeg zoomer ut her og se på det øverste høyre 503 00:24:37,530 --> 00:24:39,940 hjørne, som lovet venstre side av skjermen 504 00:24:39,940 --> 00:24:42,990 er alltid kommer til å vise deg hva som er i kontoen din, hva er 505 00:24:42,990 --> 00:24:44,790 innsiden av CS50 IDE. 506 00:24:44,790 --> 00:24:46,680 Og det er tre filer der. 507 00:24:46,680 --> 00:24:49,070 >> Så jeg ønsker å bli kvitt a.out og hei. 508 00:24:49,070 --> 00:24:51,275 Og som du kanskje forestille intuitivt, du 509 00:24:51,275 --> 00:24:53,400 kunne sortere av kontroll klikk eller høyreklikk på dette. 510 00:24:53,400 --> 00:24:54,590 Og denne lille menyen spretter opp. 511 00:24:54,590 --> 00:24:57,170 Du kan laste ned filen, kjører det, forhåndsvise det, oppdatere, endre navn, 512 00:24:57,170 --> 00:24:57,700 eller hva ikke. 513 00:24:57,700 --> 00:25:00,260 >> Og jeg kunne bare slette, og det ville gå bort. 514 00:25:00,260 --> 00:25:05,260 Men la oss gjøre ting med en kommando linjen for nå, for å få komfortable 515 00:25:05,260 --> 00:25:07,010 med dette, og gjøre følgende. 516 00:25:07,010 --> 00:25:12,345 Jeg kommer til å gå videre og ta a.out ved å skrive bokstavelig rma.out. 517 00:25:12,345 --> 00:25:14,890 Det viser seg, er kommandoen for fjerne eller slette noe, 518 00:25:14,890 --> 00:25:16,280 ikke fjerne eller slette. 519 00:25:16,280 --> 00:25:21,260 >> Det er mer konsist RM, bare for å spare deg noen tastetrykk, og trykk Enter. 520 00:25:21,260 --> 00:25:24,707 Nå skal vi være litt cryptically fjerne vanlig fil a.out. 521 00:25:24,707 --> 00:25:27,040 Jeg vet egentlig ikke hva en uregelmessig fil ville være enda. 522 00:25:27,040 --> 00:25:28,660 Men jeg ønsker ikke å fjerne det. 523 00:25:28,660 --> 00:25:30,150 >> Så jeg kommer til å skrive y for ja. 524 00:25:30,150 --> 00:25:31,940 Eller jeg kunne skrive det ut, og trykk Enter. 525 00:25:31,940 --> 00:25:33,440 Og, igjen, ingenting synes å skje. 526 00:25:33,440 --> 00:25:35,840 Men det er generelt en god ting. 527 00:25:35,840 --> 00:25:40,490 >> Hvis jeg skriver LS denne gangen, hva bør jeg se? 528 00:25:40,490 --> 00:25:44,930 Forhåpentligvis bare hei og hello.c. 529 00:25:44,930 --> 00:25:47,286 Nå, som en side, vil du merke dette stjerne, stjerne, 530 00:25:47,286 --> 00:25:48,660 det er på slutten av mine programmer. 531 00:25:48,660 --> 00:25:50,201 Og de er også dukke opp i grønt. 532 00:25:50,201 --> 00:25:53,970 Det er bare CS50 IDE måte av cluing deg inn i faktum 533 00:25:53,970 --> 00:25:55,280 at det ikke er kildekoden. 534 00:25:55,280 --> 00:25:58,880 Det er en kjørbar, et kjørbart program som du faktisk kan kjøre 535 00:25:58,880 --> 00:26:01,020 ved å gjøre dot slash, og da er det navnet. 536 00:26:01,020 --> 00:26:05,860 >> Nå, la meg gå videre og ta dette, rm hallo, Enter, fjerne vanlig 537 00:26:05,860 --> 00:26:08,010 fil hei, ja. 538 00:26:08,010 --> 00:26:11,180 Og nå hvis jeg skriver LS, vi er tilbake til hello.c. 539 00:26:11,180 --> 00:26:13,917 Prøv ikke å slette selve kildekoden. 540 00:26:13,917 --> 00:26:16,250 Selv om det er funksjoner bygget inn CS50 IDE der 541 00:26:16,250 --> 00:26:19,870 du kan gå gjennom revisjonshistorie og spole tilbake i tid hvis du ved et uhell 542 00:26:19,870 --> 00:26:23,660 slette noe, gjøre være oppmerksom som per disse meldingene ja eller nei, 543 00:26:23,660 --> 00:26:25,381 av hva du faktisk ønsker å gjøre. 544 00:26:25,381 --> 00:26:27,380 Og hvis jeg går opp til toppen venstre hjørne her, 545 00:26:27,380 --> 00:26:30,696 alt som gjenstår er hello.c. 546 00:26:30,696 --> 00:26:32,570 Så det er bunter av andre kommandoer som du 547 00:26:32,570 --> 00:26:37,550 kan utføre i verden av Linux, hvorav den ene er, igjen, Make. 548 00:26:37,550 --> 00:26:40,180 Og vi kommer til å gjøre mitt program nå som følger. 549 00:26:40,180 --> 00:26:43,270 >> I stedet for å gjøre klang, stedet for å gjøre klang-o, 550 00:26:43,270 --> 00:26:45,860 Jeg kommer til å rett og slett bokstavelig skriver, gjør hallo. 551 00:26:45,860 --> 00:26:49,630 Og nå legger merke til, er jeg ikke å skrive gjøre hello.c. 552 00:26:49,630 --> 00:26:50,910 Jeg skriver lage hei. 553 00:26:50,910 --> 00:26:54,840 >> Og dette programmet Gjør det kommer med CS50 IDE, og mer 554 00:26:54,840 --> 00:26:57,090 generelt med Linux, er et program som er 555 00:26:57,090 --> 00:26:59,120 kommer til å lage et program som heter Hallo. 556 00:26:59,120 --> 00:27:03,680 Og det kommer til å anta, etter konvensjonen, at hvis dette programmet kan bli gjort, 557 00:27:03,680 --> 00:27:09,030 det kommer til å bli gjort fra en kilde kode fil som slutter på dot c, hello.c. 558 00:27:09,030 --> 00:27:12,210 >> Så hvis jeg trykker Enter nå, merker at kommandoen som blir henrettet 559 00:27:12,210 --> 00:27:14,340 er faktisk enda lenger før enn før. 560 00:27:14,340 --> 00:27:16,670 Og det er fordi vi har forhåndskonfigurert CS50 IDE å ha 561 00:27:16,670 --> 00:27:19,878 noen ekstra funksjoner innebygd som vi trenger ikke ennå, men snart vil. 562 00:27:19,878 --> 00:27:23,470 Men det viktigste for å realisere Nå er jeg en Hei program. 563 00:27:23,470 --> 00:27:27,080 >> Hvis jeg skriver LS igjen, jeg ha en god dag program. 564 00:27:27,080 --> 00:27:32,070 Og jeg kan kjøre den med dot slash a.out, nei, 565 00:27:32,070 --> 00:27:35,590 fordi hele poenget med denne øvelsen var dot slash hei. 566 00:27:35,590 --> 00:27:38,089 Og nå har jeg min hello world program. 567 00:27:38,089 --> 00:27:39,880 Så fremover, vi er nesten alltid bare 568 00:27:39,880 --> 00:27:42,088 kommer til å kompilere våre programmer ved hjelp av kommandoen Make. 569 00:27:42,088 --> 00:27:45,300 Og så skal vi kjøre dem av dot slash, og programmet navn. 570 00:27:45,300 --> 00:27:49,610 Men skjønner det som gjør gjør for deg, er det i seg selv er ikke en kompilator. 571 00:27:49,610 --> 00:27:53,310 Det er bare en praktisk program som vet å utløse en kompilator 572 00:27:53,310 --> 00:27:56,470 å kjøre slik at du selv kan bruke den. 573 00:27:56,470 --> 00:28:00,220 >> Hvilke andre kommandoer eksisterer i Linux, og i sin tur CS50 IDE? 574 00:28:00,220 --> 00:28:03,107 Vi vil snart se at det er en CD-kommandoen Change Directory. 575 00:28:03,107 --> 00:28:05,190 Dette gjør at du i løpet av din kommandolinjegrensesnitt 576 00:28:05,190 --> 00:28:07,610 å bevege seg fremover, og tilbake, og åpne opp forskjellige mapper 577 00:28:07,610 --> 00:28:08,860 uten å bruke musen. 578 00:28:08,860 --> 00:28:12,470 >> LS vi så, som står for liste filene i gjeldende katalog. 579 00:28:12,470 --> 00:28:14,650 Gjør Dir, kan du sannsynligvis begynne å antyde 580 00:28:14,650 --> 00:28:18,150 hva disse betyr now-- lage katalog, Hvis du ønsker å opprette en mappe. 581 00:28:18,150 --> 00:28:21,270 RM for remove, RM Dir for fjerne directory-- og disse, 582 00:28:21,270 --> 00:28:24,160 igjen, er kommandolinjen ekvivalenter av hva du 583 00:28:24,160 --> 00:28:26,945 kunne gjøre i CS50 IDE med musen. 584 00:28:26,945 --> 00:28:28,820 Men du vil snart finne at noen ganger er det bare 585 00:28:28,820 --> 00:28:30,610 mye raskere å gjøre ting med et tastatur, 586 00:28:30,610 --> 00:28:33,690 og til slutt en mye kraftigere. 587 00:28:33,690 --> 00:28:36,440 >> Men det er vanskelig å argumentere for at noe vi har gjort så langt 588 00:28:36,440 --> 00:28:39,990 er alt som kraftig, når alle vi har sagt er, hallo verden. 589 00:28:39,990 --> 00:28:43,740 Og, faktisk, hardkodet jeg ord hallo verden inn i mitt program. 590 00:28:43,740 --> 00:28:45,530 Det er ingen dynamikk ennå. 591 00:28:45,530 --> 00:28:49,320 Scratch var en størrelsesorden mer interessant i forrige uke. 592 00:28:49,320 --> 00:28:51,220 >> Og så la oss komme dit. 593 00:28:51,220 --> 00:28:55,310 La oss ta et skritt mot at ved hjelp av noen av disse funksjonene. 594 00:28:55,310 --> 00:28:59,470 Så ikke bare C kommer med printf, og bunter av andre funksjoner 595 00:28:59,470 --> 00:29:01,850 noen som vi får se over tid, det gjør det ikke 596 00:29:01,850 --> 00:29:05,760 gjør det så lett rett ut av porten i å få brukerundersøkelser. 597 00:29:05,760 --> 00:29:08,140 >> Faktisk er en av svakhetene av språk som C, 598 00:29:08,140 --> 00:29:10,140 og selv Java og ennå andre, er at den ikke 599 00:29:10,140 --> 00:29:15,860 gjør det lett å bare få ting som heltall fra brukere eller strenger, ord, 600 00:29:15,860 --> 00:29:19,970 og uttrykk, enn si ting som flyt verdier eller reelle tall 601 00:29:19,970 --> 00:29:23,240 med desimaler, og virkelig lange tall, som vi snart se. 602 00:29:23,240 --> 00:29:27,000 Så denne listen over funksjoner her, disse er som andre Scratch brikkene 603 00:29:27,000 --> 00:29:31,090 at vi har forhåndsinstallert i CS50 IDE som vi vil bruke for et par uker 604 00:29:31,090 --> 00:29:34,010 som trening hjul slags, og slutt ta dem av, og se 605 00:29:34,010 --> 00:29:37,210 under panseret, kanskje, på hvordan disse tingene blir gjennomført. 606 00:29:37,210 --> 00:29:40,460 >> Men for å gjøre dette, la oss faktisk skrive et program. 607 00:29:40,460 --> 00:29:41,770 La meg gå videre nå. 608 00:29:41,770 --> 00:29:44,750 Og jeg kommer til å lage en ny fil ved å klikke på denne lille pluss, 609 00:29:44,750 --> 00:29:45,970 og klikke Ny fil. 610 00:29:45,970 --> 00:29:49,250 >> Jeg kommer til å spare dette neste en som, la oss si, string.c, 611 00:29:49,250 --> 00:29:50,750 fordi jeg ønsker å spille med strenger. 612 00:29:50,750 --> 00:29:53,990 Og streng i C er bare en sekvens av tegn. 613 00:29:53,990 --> 00:29:56,090 Så nå la oss gå videre og gjøre følgende. 614 00:29:56,090 --> 00:30:01,204 >> Inkluder standard IO.h-- og det viser seg standard IO, 615 00:30:01,204 --> 00:30:03,360 IO betyr bare inngang og utgang. 616 00:30:03,360 --> 00:30:05,920 Så det viser seg at denne linjen her er hva 617 00:30:05,920 --> 00:30:08,140 er det nærliggende for oss å bruke printf. 618 00:30:08,140 --> 00:30:10,410 Printf, selvfølgelig, produserer utdata. 619 00:30:10,410 --> 00:30:15,000 Så for å bruke printf, viser det ut må du ha denne linjen med kode 620 00:30:15,000 --> 00:30:16,040 på toppen av filen. 621 00:30:16,040 --> 00:30:18,456 >> Og vi vil komme tilbake til hva som virkelig betyr før lenge. 622 00:30:18,456 --> 00:30:20,400 Det viser seg at i noen C-program jeg skriver, 623 00:30:20,400 --> 00:30:23,640 Jeg har til å starte den med kode som ser slik ut. 624 00:30:23,640 --> 00:30:26,860 Og du vil legge merke til CS50 IDE, og annet integrert utvikling 625 00:30:26,860 --> 00:30:30,050 miljøer som det, skal prøve så godt 626 00:30:30,050 --> 00:30:31,780 de kan for å fullføre din tanke. 627 00:30:31,780 --> 00:30:35,930 Faktisk en stund siden om jeg angre hva jeg gjorde, jeg trykker på Enter. 628 00:30:35,930 --> 00:30:39,160 >> Jeg deretter traff åpent krøllete brace, trykk Enter igjen. 629 00:30:39,160 --> 00:30:40,430 Og det ferdig med min tanke. 630 00:30:40,430 --> 00:30:45,140 Det ga meg en ny linje, rykket ikke mindre for fine stilistiske grunner får vi se. 631 00:30:45,140 --> 00:30:48,559 Og da er det automatisk ga meg at klammeparentes å fullføre min tanke. 632 00:30:48,559 --> 00:30:50,600 Nå gjør det ikke alltid gjette hva du vil gjøre. 633 00:30:50,600 --> 00:30:53,620 Men i stor grad, gjør det spare deg noen tastetrykk. 634 00:30:53,620 --> 00:30:59,560 Så et øyeblikk siden, kjørte vi denne program-- hallo, verden, og deretter satt sammen det, 635 00:30:59,560 --> 00:31:00,460 og så løp den. 636 00:31:00,460 --> 00:31:01,867 Men det er ingen dynamikk her. 637 00:31:01,867 --> 00:31:03,700 Hva hvis vi ønsket å gjøre noe annerledes? 638 00:31:03,700 --> 00:31:07,630 Vel, hva om jeg ønsket å faktisk får en streng fra brukeren? 639 00:31:07,630 --> 00:31:11,250 Jeg kommer til å bruke et puslespill brikke heter nøyaktig at-- få streng. 640 00:31:11,250 --> 00:31:15,860 >> Det viser seg i C at når du ikke vil å gi innspill til en puslespill brikke, 641 00:31:15,860 --> 00:31:19,360 eller mer riktig til en funksjon, du bokstavelig talt bare gjøre åpen parentes, 642 00:31:19,360 --> 00:31:20,430 sluttparentes. 643 00:31:20,430 --> 00:31:25,540 Så det er som om det er ingen hvit boks til å skrive inn. 644 00:31:25,540 --> 00:31:27,720 Den sier blokken før hadde en liten hvit boks. 645 00:31:27,720 --> 00:31:29,660 Vi har ikke den hvite boksen nå. 646 00:31:29,660 --> 00:31:33,310 >> Men når jeg ringer get streng, jeg ønsker å sette resultatet et sted. 647 00:31:33,310 --> 00:31:37,680 Så en veldig vanlig paradigme i C er å kalle en funksjon, som få streng her, 648 00:31:37,680 --> 00:31:41,070 og deretter lagre returverdien. 649 00:31:41,070 --> 00:31:44,450 Det er resultatet av dens innsats i noe. 650 00:31:44,450 --> 00:31:47,630 >> Og hva er konstruere i programmering, 651 00:31:47,630 --> 00:31:53,450 enten i Scratch eller nå C, som vi kan bruke til å faktisk lagre noe? 652 00:31:53,450 --> 00:31:55,990 Kalte det en variabel, ikke sant? 653 00:31:55,990 --> 00:32:00,320 Og i Scratch, gjør vi ikke egentlig bryr seg hva som foregikk i variabler. 654 00:32:00,320 --> 00:32:02,170 >> Men i dette tilfellet, vi faktisk gjør. 655 00:32:02,170 --> 00:32:03,719 Jeg kommer til å si streng. 656 00:32:03,719 --> 00:32:05,510 Og så jeg kunne ringe dette noe jeg vil. 657 00:32:05,510 --> 00:32:08,340 Jeg kommer til å kalle det navn, får få streng. 658 00:32:08,340 --> 00:32:10,250 >> Og nå selv om du er litt ny på dette, 659 00:32:10,250 --> 00:32:11,984 merker at jeg mangler noen detaljer. 660 00:32:11,984 --> 00:32:13,150 Jeg glemmer et semikolon. 661 00:32:13,150 --> 00:32:14,400 Jeg trenger å fullføre denne tanken. 662 00:32:14,400 --> 00:32:17,480 Så jeg kommer til å flytte min markør, og traff semikolon der. 663 00:32:17,480 --> 00:32:19,130 Og hva har jeg nettopp gjort? 664 00:32:19,130 --> 00:32:21,440 I denne linjen med kode, nummer fem i øyeblikket, 665 00:32:21,440 --> 00:32:23,799 Jeg ringer get streng uten innganger. 666 00:32:23,799 --> 00:32:26,090 Så det er ingen liten hvit boksen som Lagre blokken har. 667 00:32:26,090 --> 00:32:28,590 >> Jeg sier bare, hei, datamaskin, få meg en streng. 668 00:32:28,590 --> 00:32:31,390 Likhetstegnet er egentlig ikke et likhetstegn, per se. 669 00:32:31,390 --> 00:32:33,790 Det er oppdraget operatør, noe som betyr, 670 00:32:33,790 --> 00:32:37,860 hei, datamaskin, flytte verdien fra høyre mot venstre. 671 00:32:37,860 --> 00:32:40,480 Og i den venstre, har jeg følgende. 672 00:32:40,480 --> 00:32:43,580 >> Hei, datamaskin, gi meg en string-- en sekvens av tegn. 673 00:32:43,580 --> 00:32:45,637 Og kaller den strengen navn. 674 00:32:45,637 --> 00:32:47,220 Og jeg trenger ikke engang å kalle det navn. 675 00:32:47,220 --> 00:32:49,970 >> Jeg kan kalle det, konvensjonelt, noe som S, 676 00:32:49,970 --> 00:32:52,900 mye som vi pleide jeg å kalle variabelen i. 677 00:32:52,900 --> 00:32:54,829 Men nå trenger jeg å gjøre noe med det. 678 00:32:54,829 --> 00:32:57,370 Det ville være ganske dumt å prøve å kompilere denne koden, kjører 679 00:32:57,370 --> 00:32:59,410 dette programmet, selv om Jeg får en streng, 680 00:32:59,410 --> 00:33:01,580 fordi det er fortsatt bare kommer til å si hei verden. 681 00:33:01,580 --> 00:33:06,140 >> Men hva om jeg ønsker å endre dette. 682 00:33:06,140 --> 00:33:07,940 Hvorfor jeg ikke gjøre dette? 683 00:33:07,940 --> 00:33:11,632 Prosent s, komma s. 684 00:33:11,632 --> 00:33:13,090 Og dette er en litt kryptisk likevel. 685 00:33:13,090 --> 00:33:15,560 >> Så la meg gjøre mine variabler mer tydelig. 686 00:33:15,560 --> 00:33:17,510 La meg nevne denne variabelen navn. 687 00:33:17,510 --> 00:33:20,230 Og la oss se om vi ikke kan erte hverandre hva som skjer her. 688 00:33:20,230 --> 00:33:22,770 >> Så på linje fem, jeg får en streng. 689 00:33:22,770 --> 00:33:25,620 Og jeg lagre denne strengen, hva brukeren har skrevet inn 690 00:33:25,620 --> 00:33:28,430 på hans eller hennes tastatur, i en variabel kalt navn. 691 00:33:28,430 --> 00:33:30,590 Og det viser seg at printf ikke bare 692 00:33:30,590 --> 00:33:34,220 ta ett argument i dobbeltrom sitater, en inngang i anførselstegn. 693 00:33:34,220 --> 00:33:39,100 >> Det kan ta to eller tre, eller flere, for eksempel at den andre eller tredje eller fjerde 694 00:33:39,100 --> 00:33:42,320 er alle navn på variabler, eller spesifikt verdier, 695 00:33:42,320 --> 00:33:48,610 som du ønsker å koble til, dynamisk, at strengen i anførselstegn. 696 00:33:48,610 --> 00:33:52,110 Med andre ord, hva ville være galt med dette? 697 00:33:52,110 --> 00:33:57,920 Hvis jeg bare sa hei navn, skråstrek n, lagres filen min, kompilert koden min, 698 00:33:57,920 --> 00:34:01,660 og kjørte dette, hva ville skje? 699 00:34:01,660 --> 00:34:05,139 >> Det er bare kommer til å si, hallo navn, bokstavelig talt N-A-M-E, 700 00:34:05,139 --> 00:34:07,900 som er litt dumt fordi det er ikke forskjellig fra verden. 701 00:34:07,900 --> 00:34:10,400 Så alt i anførselstegn er hva bokstavelig talt blir skrevet ut. 702 00:34:10,400 --> 00:34:12,520 Så hvis jeg vil ha en plassholder der, 703 00:34:12,520 --> 00:34:14,422 Jeg faktisk trenger å bruke noen spesiell syntaks. 704 00:34:14,422 --> 00:34:17,380 Og det viser seg hvis du leser dokumentasjon for printf-funksjonen, 705 00:34:17,380 --> 00:34:21,320 det vil fortelle deg at hvis du bruker prosent s, 706 00:34:21,320 --> 00:34:23,920 du kan erstatte en verdi som følger. 707 00:34:23,920 --> 00:34:27,190 >> Etter et komma etter det dobbel sitat, du bare 708 00:34:27,190 --> 00:34:29,179 skrive navnet på variabel som du vil 709 00:34:29,179 --> 00:34:33,790 å plugge inn i dette formatet kode, eller format Specifier, 710 00:34:33,790 --> 00:34:35,469 prosent er for strenger. 711 00:34:35,469 --> 00:34:39,190 Og nå hvis jeg har lagret filen min, Jeg går tilbake til min terminal. 712 00:34:39,190 --> 00:34:42,870 Og jeg skriver Gjør String, fordi, igjen, navnet på denne 713 00:34:42,870 --> 00:34:45,510 fil som jeg valgte før er string.c. 714 00:34:45,510 --> 00:34:48,510 >> Så jeg kommer til å si Gjør String, skriv. 715 00:34:48,510 --> 00:34:51,550 Oh my godhet, se på alle feilene vi har gjort allerede. 716 00:34:51,550 --> 00:34:55,540 Og dette er-- hva, dette er virkelig som en seks, syv linje program? 717 00:34:55,540 --> 00:34:57,790 Så det er her det kan veldig raskt bli overveldende. 718 00:34:57,790 --> 00:35:00,890 >> Denne terminalvindu har nå bare gulpe opp 719 00:35:00,890 --> 00:35:03,230 et stort antall feilmeldinger. 720 00:35:03,230 --> 00:35:07,560 Sikkert, jeg har ikke mer feil meldinger enn jeg har linjer med kode. 721 00:35:07,560 --> 00:35:08,680 Så hva er det som skjer? 722 00:35:08,680 --> 00:35:10,920 >> Vel, den beste strategien å gjøre når du 723 00:35:10,920 --> 00:35:13,710 støter en overveldende liste over feil som det, 724 00:35:13,710 --> 00:35:16,690 er bla tilbake, se etter kommandoen du bare løp, som i mitt tilfelle 725 00:35:16,690 --> 00:35:18,020 er å få streng. 726 00:35:18,020 --> 00:35:21,630 Se på hva gjør gjorde, og det er det lang klang kommando, ingen big deal der. 727 00:35:21,630 --> 00:35:22,950 >> Men den røde er dårlig. 728 00:35:22,950 --> 00:35:24,750 Grønn prøver å være milde og nyttig. 729 00:35:24,750 --> 00:35:26,140 Men det er fortsatt dårlig, i dette tilfellet. 730 00:35:26,140 --> 00:35:27,510 Men hvor er det ille? 731 00:35:27,510 --> 00:35:31,450 >> String.c, linje fem, karakter fem. 732 00:35:31,450 --> 00:35:32,930 Så dette er bare sunn konvensjonen. 733 00:35:32,930 --> 00:35:36,060 Noe kolon noe betyr linjenummer og tegnnummer. 734 00:35:36,060 --> 00:35:41,080 Feil bruk av svart identifikator streng. 735 00:35:41,080 --> 00:35:42,900 Mente du standard i? 736 00:35:42,900 --> 00:35:45,530 >> Så dessverre, klang prøver å være nyttig. 737 00:35:45,530 --> 00:35:46,850 Men det er feil, i dette tilfellet. 738 00:35:46,850 --> 00:35:49,350 Nei, klang, jeg mente ikke standard IO. 739 00:35:49,350 --> 00:35:51,070 Jeg mente at på linje en, ja. 740 00:35:51,070 --> 00:35:53,420 >> Men linjen fem er denne her. 741 00:35:53,420 --> 00:35:57,040 Og klang ikke forstå S-T-R-I-N-G. 742 00:35:57,040 --> 00:36:01,490 Det er en svart identifikator, en ord det bare aldri har sett før. 743 00:36:01,490 --> 00:36:05,730 Og det er fordi C, språket vi skriver kode i akkurat nå, 744 00:36:05,730 --> 00:36:08,070 ikke har variable kalles strenger. 745 00:36:08,070 --> 00:36:11,380 >> Det gjør ikke som standard støtte noe som kalles en streng. 746 00:36:11,380 --> 00:36:16,750 Det er en CS50 stykke slang, men meget vanlig. 747 00:36:16,750 --> 00:36:18,600 Men jeg kan fikse dette på følgende måte. 748 00:36:18,600 --> 00:36:22,090 >> Hvis jeg legger til en linje med kode til toppen av dette programmet, 749 00:36:22,090 --> 00:36:27,890 inkluderer CS50.h, som er en annen fil et eller annet sted inne i CS50 IDE, et sted 750 00:36:27,890 --> 00:36:30,820 på harddisken, så å si, av Ubuntu operativsystem 751 00:36:30,820 --> 00:36:33,590 at jeg kjører, som er filen som er 752 00:36:33,590 --> 00:36:38,740 skal lære drifts Systemet hva en streng er, bare 753 00:36:38,740 --> 00:36:41,930 som standard io.h er filen i operativsystemet som er 754 00:36:41,930 --> 00:36:44,430 kommer til å lære det hva printf er. 755 00:36:44,430 --> 00:36:46,810 >> Ja, vi ville ha fått en veldig lignende melding 756 00:36:46,810 --> 00:36:50,600 Hvis IO hadde innrømmet standard IO.h og prøvde å bruke printf. 757 00:36:50,600 --> 00:36:53,632 Så jeg kommer til å gå videre og bare Ta kontroll L for å tømme skjermen min. 758 00:36:53,632 --> 00:36:56,340 Eller du kan skrive klart og det vil bare fjerne terminalvinduet. 759 00:36:56,340 --> 00:36:58,020 Men du kan fortsatt bla tilbake i tid. 760 00:36:58,020 --> 00:37:01,100 >> Og jeg kommer til å kjøre Gjør String. 761 00:37:01,100 --> 00:37:03,660 Krysse fingrene denne gangen, Enter. 762 00:37:03,660 --> 00:37:05,380 Herregud, det fungerte. 763 00:37:05,380 --> 00:37:09,280 det viser meg en lang kryptisk kommando det er det som gjør generert via klang, 764 00:37:09,280 --> 00:37:10,460 men ingen feilmeldinger. 765 00:37:10,460 --> 00:37:12,460 Så skjønner, selv om kan du få helt 766 00:37:12,460 --> 00:37:14,480 overveldet med antall feilmeldinger, 767 00:37:14,480 --> 00:37:17,540 det bare kan være denne irriterende brus effekt, der klang ikke forstår 768 00:37:17,540 --> 00:37:19,620 en ting, noe som betyr at det da ikke forstår det neste ordet, 769 00:37:19,620 --> 00:37:20,560 eller neste linje. 770 00:37:20,560 --> 00:37:22,850 Og slik er det bare choker på koden din. 771 00:37:22,850 --> 00:37:24,440 Men fix kan være enkel. 772 00:37:24,440 --> 00:37:27,822 Og så alltid fokusere på aller første linje av produksjonen. 773 00:37:27,822 --> 00:37:29,530 Og hvis du ikke forstår det, bare se 774 00:37:29,530 --> 00:37:32,480 for søkeord som kan være ledetråder, og linjenummer, 775 00:37:32,480 --> 00:37:34,650 og tegnet, der at feilen kan være. 776 00:37:34,650 --> 00:37:40,328 >> Nå la meg gå videre og skrive dot slash, streng, skriv. 777 00:37:40,328 --> 00:37:44,340 Hm, det er ikke si hallo noe. 778 00:37:44,340 --> 00:37:46,210 Hvorfor? 779 00:37:46,210 --> 00:37:48,170 Vel, husker, der er det i gang? 780 00:37:48,170 --> 00:37:53,730 >> Det er nok fast i øyeblikket i en loop, om du vil, på linje seks, 781 00:37:53,730 --> 00:37:56,950 fordi Få String av design, skrevet av CS50 ansatte, 782 00:37:56,950 --> 00:38:00,350 er bokstavelig ment å bare sitte der venter, og venter, 783 00:38:00,350 --> 00:38:01,850 og venter på en streng. 784 00:38:01,850 --> 00:38:03,792 Alt vi mener med streng er menneskelig input. 785 00:38:03,792 --> 00:38:04,500 Så vet du hva? 786 00:38:04,500 --> 00:38:05,166 La meg gå videre. 787 00:38:05,166 --> 00:38:08,704 Og bare på et innfall, la meg skriver navnet mitt, David, skriv. 788 00:38:08,704 --> 00:38:10,120 Nå har jeg en mer dynamisk program. 789 00:38:10,120 --> 00:38:11,240 Det sa, hallo David. 790 00:38:11,240 --> 00:38:16,280 >> Hvis jeg går videre og kjøre dette igjen, la meg prøve si Zamila navn, skriv. 791 00:38:16,280 --> 00:38:17,940 Og nå har vi et dynamisk program. 792 00:38:17,940 --> 00:38:19,380 Jeg har ikke hard kodet verden. 793 00:38:19,380 --> 00:38:21,760 Jeg har ikke hardkodet navn eller David, eller Zamila. 794 00:38:21,760 --> 00:38:25,350 >> Nå er det mye mer som programmene vi vet, der hvis det ta innspill, 795 00:38:25,350 --> 00:38:27,870 det gir litt annen utgang. 796 00:38:27,870 --> 00:38:31,020 Nå, dette er ikke den beste brukeropplevelse, eller UX. 797 00:38:31,020 --> 00:38:33,000 Jeg kjører programmet. 798 00:38:33,000 --> 00:38:35,830 >> Jeg vet ikke hva jeg skal å gjøre, med mindre jeg faktisk se på 799 00:38:35,830 --> 00:38:37,290 eller huske kildekoden. 800 00:38:37,290 --> 00:38:39,640 Så la oss gjøre brukeren oppleve litt bedre 801 00:38:39,640 --> 00:38:41,240 med de enkleste ting. 802 00:38:41,240 --> 00:38:44,782 La meg gå tilbake til denne program, og bare si printf. 803 00:38:44,782 --> 00:38:48,870 >> Og la meg gå videre og si navn, tykktarm, og et mellomrom, og deretter et semikolon. 804 00:38:48,870 --> 00:38:51,170 Og bare for morro skyld, ingen tilbakeslag n. 805 00:38:51,170 --> 00:38:52,980 Og det er bevisst, fordi jeg ikke vil ha 806 00:38:52,980 --> 00:38:54,590 blir bedt om å gå til neste linje. 807 00:38:54,590 --> 00:38:58,800 >> Jeg vil i stedet gjøre dette, må strengen å rekompilere koden min til ny maskin 808 00:38:58,800 --> 00:39:00,980 kode dot slash streng. 809 00:39:00,980 --> 00:39:02,460 Ah, dette er mye penere. 810 00:39:02,460 --> 00:39:05,780 Nå har jeg faktisk vet hva maskinen vil jeg skal gjøre, gi den et navn. 811 00:39:05,780 --> 00:39:10,020 >> Så jeg kommer til å gå videre og skriv i Rob, enter, og hallo, Rob. 812 00:39:10,020 --> 00:39:13,640 Så, innser, dette er fortsatt, i enden av dagen, bare en ni linje program. 813 00:39:13,640 --> 00:39:15,090 Men vi har tatt disse baby trinn. 814 00:39:15,090 --> 00:39:18,380 >> Vi skrev en linje med hvilken vi var kjent, printf, hallo verden. 815 00:39:18,380 --> 00:39:19,980 Da vi løste en liten bit av det. 816 00:39:19,980 --> 00:39:21,560 Og vi faktisk brukt get streng. 817 00:39:21,560 --> 00:39:23,362 Og vi kastet den verdien i en variabel. 818 00:39:23,362 --> 00:39:26,070 Og da vi gikk videre og forbedret det videre med en tredje linje. 819 00:39:26,070 --> 00:39:29,220 Og dette iterativ prosess med skrive programvare er virkelig nøkkelen. 820 00:39:29,220 --> 00:39:33,420 I CS50, og i livet generelt, du bør generelt ikke sitte ned, 821 00:39:33,420 --> 00:39:36,800 har et program i tankene, og prøv å skrive hele greia på en gang. 822 00:39:36,800 --> 00:39:40,810 >> Den vil uunngåelig resultere i veien flere feil enn vi selv så her. 823 00:39:40,810 --> 00:39:44,070 Selv jeg, til denne dag, hele tiden gjøre andre dumme feil, 824 00:39:44,070 --> 00:39:47,480 er faktisk vanskeligere feil som er vanskeligere å finne ut. 825 00:39:47,480 --> 00:39:52,095 Men du vil gjøre flere feil desto mer linjer med kode du skriver på en gang. 826 00:39:52,095 --> 00:39:54,220 Og så denne praksisen med, skrive en liten bit av koden 827 00:39:54,220 --> 00:39:57,930 at du er komfortabel med, kompilere den, kjøre den, teste det mer generelt, 828 00:39:57,930 --> 00:40:01,370 deretter flytte on-- så akkurat som vi holdt lagdeling og lagdeling i forrige uke, 829 00:40:01,370 --> 00:40:04,190 å bygge fra noe veldig enkle til noe mer komplisert, 830 00:40:04,190 --> 00:40:05,200 gjøre det samme her. 831 00:40:05,200 --> 00:40:08,500 Ikke sitte ned, og prøver å skrive en hel problem. 832 00:40:08,500 --> 00:40:10,780 Egentlig ta disse baby trinn. 833 00:40:10,780 --> 00:40:15,100 >> Nå strenger er ikke alt at nyttig for seg selv. 834 00:40:15,100 --> 00:40:18,210 Vi hadde faktisk, ideelt sett, som å har noe annet i vår verktøykasse. 835 00:40:18,210 --> 00:40:20,990 Så la oss faktisk gjør akkurat det. 836 00:40:20,990 --> 00:40:24,900 >> La meg gå videre nå og piske opp et litt annet program. 837 00:40:24,900 --> 00:40:28,320 Og vi vil kalle dette int.c, for heltall. 838 00:40:28,320 --> 00:40:30,870 Jeg kommer til, på samme måte, inkluderer CS550.h. 839 00:40:30,870 --> 00:40:33,060 Jeg kommer til å omfatte standard IO. 840 00:40:33,060 --> 00:40:36,630 Og det kommer til å bli ganske vanlig i disse første dagene av klassen. 841 00:40:36,630 --> 00:40:39,050 >> Og jeg kommer til å klare meg selv med en hovedfunksjon. 842 00:40:39,050 --> 00:40:43,370 Og nå i stedet for å få en streng, la oss gå videre og få en int. 843 00:40:43,370 --> 00:40:49,285 La oss kalle det jeg, og kaller det få int, nære parens, semikolon. 844 00:40:49,285 --> 00:40:51,410 Og nå la oss gjøre noe med det, printf. 845 00:40:51,410 --> 00:40:56,190 >> La oss si noe sånt hei, backslash n, komma i. 846 00:40:56,190 --> 00:41:00,010 Så jeg ganske mye etterligne hva jeg gjorde bare et øyeblikk siden. 847 00:41:00,010 --> 00:41:01,660 Jeg har en plassholder her. 848 00:41:01,660 --> 00:41:05,150 Jeg har komma jeg her, fordi jeg vil ha å plugge jeg inn som plassholder. 849 00:41:05,150 --> 00:41:07,250 >> Så la oss gå videre og prøve kompilere dette programmet. 850 00:41:07,250 --> 00:41:10,060 Filen heter int.c. 851 00:41:10,060 --> 00:41:12,920 Så jeg kommer til å si, gjøre int, skriv. 852 00:41:12,920 --> 00:41:16,420 Oh my God, men ikke så farlig, ikke sant? 853 00:41:16,420 --> 00:41:17,230 Det er en feil. 854 00:41:17,230 --> 00:41:19,810 >> Det er en syntaktisk feil her slik at programmet ikke kan 855 00:41:19,810 --> 00:41:25,460 kompileres inne int.c, linje sju, karakter 27, feil format 856 00:41:25,460 --> 00:41:28,400 spesifiserer typen char stjerners, uansett hva det er. 857 00:41:28,400 --> 00:41:30,020 Men argumentet typen er int. 858 00:41:30,020 --> 00:41:33,110 >> Så også her, vi kommer ikke til to-- selv om i dag er mye av materialet, 859 00:41:33,110 --> 00:41:35,710 vi kommer til å overvelde deg med absolutt alle funksjonene til C, 860 00:41:35,710 --> 00:41:38,070 og programmering mer generelt, på bare disse første ukene. 861 00:41:38,070 --> 00:41:40,400 Så det er ofte kommer til å bli sjargong som du ikke er kjent. 862 00:41:40,400 --> 00:41:43,350 Og, faktisk er noe røye stjerne vi kommer til å komme tilbake til 863 00:41:43,350 --> 00:41:44,830 i en uke eller to tid. 864 00:41:44,830 --> 00:41:47,530 >> Men for nå, la oss se om vi kan analysere ord som er kjent. 865 00:41:47,530 --> 00:41:50,750 Formater-- så vi hørte format Specifier, format kode før. 866 00:41:50,750 --> 00:41:51,840 Det er velkjent. 867 00:41:51,840 --> 00:41:53,840 Type-- men argumentet har type int. 868 00:41:53,840 --> 00:41:55,980 Vent litt, er jeg en int. 869 00:41:55,980 --> 00:41:59,230 >> Kanskje prosent er faktisk har noen definert betydning. 870 00:41:59,230 --> 00:42:00,230 Og, ja, det gjør det. 871 00:42:00,230 --> 00:42:03,101 Et heltall, hvis du vil printf å erstatte det, 872 00:42:03,101 --> 00:42:05,350 du faktisk nødt til å bruke en annet format Specifier. 873 00:42:05,350 --> 00:42:06,890 Og du vil ikke vite dette med mindre noen fortalte deg, 874 00:42:06,890 --> 00:42:07,973 eller du hadde gjort det før. 875 00:42:07,973 --> 00:42:10,490 Men prosent i er hva kan være vanlige 876 00:42:10,490 --> 00:42:12,240 i printf for plugging i et heltall. 877 00:42:12,240 --> 00:42:14,920 Du kan også bruke prosent d for en desimal heltall. 878 00:42:14,920 --> 00:42:16,490 Men jeg er fin og enkel her. 879 00:42:16,490 --> 00:42:17,590 Så vi kommer til å gå med det. 880 00:42:17,590 --> 00:42:21,160 >> Nå la meg gå videre og reprise make int, Enter. 881 00:42:21,160 --> 00:42:23,328 Det er bra, ingen feil. 882 00:42:23,328 --> 00:42:27,260 Dot slash int-- OK, dårlig brukeropplevelse, fordi jeg ikke har fortalt meg selv 883 00:42:27,260 --> 00:42:27,760 hva å gjøre. 884 00:42:27,760 --> 00:42:28,426 Men det er fint. 885 00:42:28,426 --> 00:42:29,480 Jeg fanger på raskt. 886 00:42:29,480 --> 00:42:36,260 >> Og nå la meg gå videre og skriver i David, OK, Zamila, Rob. 887 00:42:36,260 --> 00:42:37,820 OK, så dette er en god ting. 888 00:42:37,820 --> 00:42:41,710 Denne gangen, jeg bruker en funksjon, en puslespillbrikke, kalt get int. 889 00:42:41,710 --> 00:42:44,230 Og det viser out-- og vi vil ser dette senere i term-- 890 00:42:44,230 --> 00:42:47,730 den CS50 ansatte har gjennomført få strengen på en slik måte 891 00:42:47,730 --> 00:42:50,350 at det vil bare fysisk få en streng for deg. 892 00:42:50,350 --> 00:42:54,340 >> Det har implementert get int i en slik måte at det bare vil 893 00:42:54,340 --> 00:42:55,590 få et heltall for deg. 894 00:42:55,590 --> 00:42:57,830 Og hvis du, det menneskelige, ikke samarbeider, er det 895 00:42:57,830 --> 00:43:00,590 bokstavelig talt bare kommer til å sier prøve, prøve, prøve på nytt, 896 00:43:00,590 --> 00:43:05,200 bokstavelig talt sitter der looping, inntil du tvinge med noen magiske tall, 897 00:43:05,200 --> 00:43:07,670 som 50, og hallo 50. 898 00:43:07,670 --> 00:43:11,440 >> Eller hvis vi kjører dette igjen og skriv inn 42, hallo 42. 899 00:43:11,440 --> 00:43:15,750 Og så get int funksjon innsiden av det puslebrikke 900 00:43:15,750 --> 00:43:19,050 er nok logikk, nok tanke, å finne ut, hva er et ord? 901 00:43:19,050 --> 00:43:20,330 Og hva er et tall? 902 00:43:20,330 --> 00:43:23,165 Bare akseptere, til slutt, tall. 903 00:43:23,165 --> 00:43:25,690 904 00:43:25,690 --> 00:43:30,230 >> Så det viser seg at dette er ikke alle som uttrykksfulle. 905 00:43:30,230 --> 00:43:30,910 så langt. 906 00:43:30,910 --> 00:43:33,690 Så, yay, sist gang vi gikk ganske raskt 907 00:43:33,690 --> 00:43:38,320 i gjennomførings spill og animasjon, og kunstneriske verk i bunnen av. 908 00:43:38,320 --> 00:43:42,260 Og her er vi være fornøyd med Hello World, og hallo 50. 909 00:43:42,260 --> 00:43:43,696 >> Det er ikke alle som inspirerende. 910 00:43:43,696 --> 00:43:46,070 Og, ja, disse første par eksempler vil ta litt tid 911 00:43:46,070 --> 00:43:47,510 å rampen opp i spenning. 912 00:43:47,510 --> 00:43:49,854 Men vi har så mye mer kontroll nå, faktisk. 913 00:43:49,854 --> 00:43:51,770 Og vi kommer til veldig raskt begynne lagdeling 914 00:43:51,770 --> 00:43:53,870 på toppen av disse grunnleggende primitive. 915 00:43:53,870 --> 00:43:56,370 >> Men først, la oss forstå hva begrensningene er. 916 00:43:56,370 --> 00:43:58,620 Faktisk er en av de tingene Scratch ikke lett 917 00:43:58,620 --> 00:44:00,990 la oss gjøre er å virkelig se under panseret, 918 00:44:00,990 --> 00:44:03,740 og forstå hva en datamaskinen er, hva den kan gjøre, 919 00:44:03,740 --> 00:44:05,250 og hva dens begrensninger er. 920 00:44:05,250 --> 00:44:08,580 Og, ja, at mangel på forståelse, potensielt, langsiktig 921 00:44:08,580 --> 00:44:12,520 kan føre til vår egen mistakes-- skriving bugs, skriving usikker programvare som 922 00:44:12,520 --> 00:44:13,880 blir hacket på noen måte. 923 00:44:13,880 --> 00:44:17,130 >> Så la oss ta noen skritt mot forstå denne litt bedre etter 924 00:44:17,130 --> 00:44:19,710 måte, sier følgende eksempel. 925 00:44:19,710 --> 00:44:23,550 Jeg kommer til å gå videre og implementere virkelig rask et program som heter Adder. 926 00:44:23,550 --> 00:44:25,134 Liker, la oss legge noen tall sammen. 927 00:44:25,134 --> 00:44:27,800 Og jeg kommer til å kode noen hjørner her, og bare kopiere og lime inn 928 00:44:27,800 --> 00:44:30,270 der jeg var før, bare slik at vi kan komme i gang raskere. 929 00:44:30,270 --> 00:44:33,090 Så nå har jeg fått de grunnleggende begynnelse av et program kalt Adder. 930 00:44:33,090 --> 00:44:34,670 >> Og la oss gå videre og gjøre dette. 931 00:44:34,670 --> 00:44:38,680 Jeg kommer til å gå videre og si, får intx få int. 932 00:44:38,680 --> 00:44:39,430 Og vet du hva? 933 00:44:39,430 --> 00:44:40,990 La oss gjøre en bedre brukeropplevelse. 934 00:44:40,990 --> 00:44:45,740 >> Så la oss bare si x er, og effektivt be brukeren om å gi oss x. 935 00:44:45,740 --> 00:44:50,600 Og så la meg gå videre og si, printf hva y er, denne gangen venter 936 00:44:50,600 --> 00:44:53,140 to verdier fra brukeren. 937 00:44:53,140 --> 00:44:59,759 Og så la oss bare gå videre og si, printf, er summen av x og y. 938 00:44:59,759 --> 00:45:01,300 Og nå har jeg ikke lyst til å gjøre prosent s. 939 00:45:01,300 --> 00:45:09,080 Jeg ønsker å gjøre prosent i, skråstrek n, og deretter plugge i sum verdi. 940 00:45:09,080 --> 00:45:10,620 >> Så hvordan kan jeg gå om du gjør dette? 941 00:45:10,620 --> 00:45:11,270 Vet du hva? 942 00:45:11,270 --> 00:45:12,840 Jeg vet hvordan du bruker variabler. 943 00:45:12,840 --> 00:45:15,140 La meg bare erklære en ny en, int z. 944 00:45:15,140 --> 00:45:16,770 >> Og jeg kommer til å ta en gjetning her. 945 00:45:16,770 --> 00:45:21,470 Hvis det er likhetstegn i denne språk, kanskje jeg kan bare gjøre x pluss y, 946 00:45:21,470 --> 00:45:23,660 så lenge jeg avslutte mitt tenkte med et semikolon? 947 00:45:23,660 --> 00:45:28,170 Nå kan jeg gå tilbake hit ned, koble z, føre denne tanken med et semikolon. 948 00:45:28,170 --> 00:45:33,160 Og la oss se nå, om disse sekvenser av lines-- x er få int. 949 00:45:33,160 --> 00:45:34,770 Y er få int. 950 00:45:34,770 --> 00:45:37,980 >> Legg til x og y, lagre verdien i z-- så, igjen, husk likhetstegnet 951 00:45:37,980 --> 00:45:38,560 er ikke lik. 952 00:45:38,560 --> 00:45:41,100 Det er oppdrag fra høyre til venstre. 953 00:45:41,100 --> 00:45:45,180 Og la oss skrive ut at summen av x og y er ikke bokstavelig z, 954 00:45:45,180 --> 00:45:46,830 men hva som er inne i z. 955 00:45:46,830 --> 00:45:50,090 Så la oss gjøre Adder - fine, ingen feil denne gangen. 956 00:45:50,090 --> 00:45:53,030 Dot slash Adder, skriv, x kommer til å være en. 957 00:45:53,030 --> 00:45:55,380 >> Y kommer til å være to. 958 00:45:55,380 --> 00:45:58,964 Og summen av x og y er 3. 959 00:45:58,964 --> 00:46:00,130 Så det er alt fint og bra. 960 00:46:00,130 --> 00:46:03,260 >> Så du kan tenke at matematikk bør arbeide i et program som dette. 961 00:46:03,260 --> 00:46:04,040 Men vet du hva? 962 00:46:04,040 --> 00:46:06,904 Er denne variabelen, linje 12, selv nødvendig? 963 00:46:06,904 --> 00:46:09,820 Du trenger ikke å komme i vane for bare å lagre ting på variabler 964 00:46:09,820 --> 00:46:10,980 bare fordi du kan. 965 00:46:10,980 --> 00:46:13,550 Og, faktisk, er det vanligvis anses som dårlig konstruksjon 966 00:46:13,550 --> 00:46:18,100 hvis du oppretter en variabel, kalt z i dette tilfellet, lagre noe i det, 967 00:46:18,100 --> 00:46:21,390 og deretter umiddelbart bruke det, men aldri igjen. 968 00:46:21,390 --> 00:46:24,700 Hvorfor gi noe navn som z hvis du er bokstavelig talt 969 00:46:24,700 --> 00:46:26,770 kommer til å bruke den ting bare en gang, og så 970 00:46:26,770 --> 00:46:29,380 proksimale til der du opprettet det i første omgang, 971 00:46:29,380 --> 00:46:31,052 så tett i form av linjer med kode? 972 00:46:31,052 --> 00:46:31,760 Så vet du hva? 973 00:46:31,760 --> 00:46:34,480 Det viser seg at C er ganske fleksibel. 974 00:46:34,480 --> 00:46:36,586 Hvis jeg faktisk ønsker å plug-in verdier her, 975 00:46:36,586 --> 00:46:38,210 Jeg trenger ikke å erklære en ny variabel. 976 00:46:38,210 --> 00:46:41,680 Jeg kunne bare plug-in x pluss y, fordi C forstår 977 00:46:41,680 --> 00:46:43,390 aritmetikk, og matematiske operatorer. 978 00:46:43,390 --> 00:46:47,140 >> Så jeg kan bare si, gjøre dette regnestykket, x pluss y, uansett hva disse verdiene er, 979 00:46:47,140 --> 00:46:50,780 plugge den resulterende heltall inn i strengen. 980 00:46:50,780 --> 00:46:53,730 Så dette kan være, men bare en linje kortere, 981 00:46:53,730 --> 00:46:58,480 en bedre utforming, et bedre program, fordi det er mindre kode, derfor 982 00:46:58,480 --> 00:46:59,921 mindre for meg å forstå. 983 00:46:59,921 --> 00:47:01,920 Og det er også bare renere, i den grad vi er ikke 984 00:47:01,920 --> 00:47:04,620 introdusere nye ord, nye symboler, som z, 985 00:47:04,620 --> 00:47:07,510 selv om de egentlig ikke tjene mye av en hensikt. 986 00:47:07,510 --> 00:47:12,890 >> Dessverre er ikke matematikk alle som pålitelige noen ganger. 987 00:47:12,890 --> 00:47:15,270 La oss gå videre og gjøre dette. 988 00:47:15,270 --> 00:47:18,200 Jeg kommer til å gå videre nå og gjøre følgende. 989 00:47:18,200 --> 00:47:27,650 >> La oss gjøre printf, prosent i pluss prosent Jeg skal være prosent i, backslash n. 990 00:47:27,650 --> 00:47:32,240 Og jeg kommer til å gjøre dette-- xyx pluss y. 991 00:47:32,240 --> 00:47:34,821 Så jeg skal bare skrive dette litt annerledes her. 992 00:47:34,821 --> 00:47:36,320 La meg bare gjøre en rask mental helse sjekk. 993 00:47:36,320 --> 00:47:37,986 Igjen, la oss ikke komme i forkant av oss selv. 994 00:47:37,986 --> 00:47:41,420 Gjør huggorm, dot slash huggorm. 995 00:47:41,420 --> 00:47:44,950 x er 1, y er 2, 1 pluss 2 er tre. 996 00:47:44,950 --> 00:47:45,870 Så det er bra. 997 00:47:45,870 --> 00:47:49,060 Men la oss komplisere dette nå litt, og opprette en ny fil. 998 00:47:49,060 --> 00:47:53,350 >> Jeg kommer til å kalle dette en, si, ints, flertall for heltall. 999 00:47:53,350 --> 00:47:55,980 La meg starte hvor jeg var et øyeblikk siden. 1000 00:47:55,980 --> 00:47:57,770 Men nå la oss gjøre et par andre linjer. 1001 00:47:57,770 --> 00:48:03,430 La meg gå videre og gjøre følgende, printf, prosent i minus prosent i, 1002 00:48:03,430 --> 00:48:08,959 er prosent i, komma x, komma yx minus y. 1003 00:48:08,959 --> 00:48:10,750 Så jeg gjør noe annerledes matematikk der. 1004 00:48:10,750 --> 00:48:11,624 La oss gjøre en annen. 1005 00:48:11,624 --> 00:48:16,610 Så prosent I tider prosent Jeg er prosent i, backslash n. 1006 00:48:16,610 --> 00:48:21,430 La oss plug-in x og y, og x ganger y. 1007 00:48:21,430 --> 00:48:24,530 Vi bruker stjerne på datamaskinen for tiden. 1008 00:48:24,530 --> 00:48:26,390 >> Du trenger ikke bruke x. x er variabelnavn her. 1009 00:48:26,390 --> 00:48:28,270 Du bruker stjernen for multiplikasjon. 1010 00:48:28,270 --> 00:48:29,020 La oss gjøre en mer. 1011 00:48:29,020 --> 00:48:34,580 Printf prosent jeg, fordelt med prosent i, er prosent i, 1012 00:48:34,580 --> 00:48:40,460 backslash n. xy delt på Y- så du bruker skråstrek i C 1013 00:48:40,460 --> 00:48:41,502 å gjøre divisjon. 1014 00:48:41,502 --> 00:48:42,460 Og la oss gjøre en annen. 1015 00:48:42,460 --> 00:48:47,920 1016 00:48:47,920 --> 00:48:55,240 Resten av prosent i, fordelt med prosent i, er prosent i. 1017 00:48:55,240 --> 00:48:59,550 xy-- og nå resten er det som er igjen. 1018 00:48:59,550 --> 00:49:02,980 Når du prøver å dele en Nevner i en teller, 1019 00:49:02,980 --> 00:49:05,570 hvor mye som er til overs som du kan ikke dele ut? 1020 00:49:05,570 --> 00:49:07,910 >> Så det er egentlig ikke, nødvendigvis, et symbol 1021 00:49:07,910 --> 00:49:09,470 vi har brukt i grunnskolen for dette. 1022 00:49:09,470 --> 00:49:13,830 Men det i C. Du kan si x modulo y, der 1023 00:49:13,830 --> 00:49:18,000 denne prosenttegn i denne context-- forveksling når du er inne 1024 00:49:18,000 --> 00:49:20,170 av doble anførselstegn, innsiden av printf, prosent 1025 00:49:20,170 --> 00:49:21,830 brukes som format Specifier. 1026 00:49:21,830 --> 00:49:25,420 >> Når du bruker prosent utenfor at i et matematisk uttrykk 1027 00:49:25,420 --> 00:49:29,910 det er modulo operatør for modulær arithmetic-- for vårt formål 1028 00:49:29,910 --> 00:49:33,650 her, betyr bare, hva er Resten av x delt på y? 1029 00:49:33,650 --> 00:49:36,130 Så x delt på y er x slash y. 1030 00:49:36,130 --> 00:49:38,220 Hva er resten av x dividert med y? 1031 00:49:38,220 --> 00:49:41,780 Det er x mod y, som programmerer ville si. 1032 00:49:41,780 --> 00:49:48,300 >> Så hvis jeg gjorde ingen feil her, la meg gå videre og gjøre ints, flertall, hyggelig, 1033 00:49:48,300 --> 00:49:50,010 og dot slash ints. 1034 00:49:50,010 --> 00:49:55,270 Og la oss gå videre og gjør, la oss si, 1, 10. 1035 00:49:55,270 --> 00:49:58,390 Greit, en pluss 10 er 11, sjekk. 1036 00:49:58,390 --> 00:50:01,240 1 minus 10 er negativ 9, sjekk. 1037 00:50:01,240 --> 00:50:03,420 >> 1 ganger 10 er 10, sjekk. 1038 00:50:03,420 --> 00:50:07,090 1 dividert med 10 er-- OK, vi hopper som en. 1039 00:50:07,090 --> 00:50:09,480 Resten av 1 dividert med 10 er en. 1040 00:50:09,480 --> 00:50:10,680 Det er riktig. 1041 00:50:10,680 --> 00:50:12,630 Men det er en feil her. 1042 00:50:12,630 --> 00:50:15,390 >> Så jeg satte min overlevere, ikke riktig. 1043 00:50:15,390 --> 00:50:16,670 Jeg mener, det er nær 0. 1044 00:50:16,670 --> 00:50:20,670 1 dividert med 10, du vet, hvis vi er kutte noen hjørner, sikker, er det null. 1045 00:50:20,670 --> 00:50:28,050 Men det burde egentlig være 1/10, 0,1 eller 0,10, 0,1000, og så videre. 1046 00:50:28,050 --> 00:50:30,600 >> Det burde egentlig ikke være null. 1047 00:50:30,600 --> 00:50:35,990 Vel, det viser seg at maskinen er gjør bokstavelig talt hva vi fortalte det til å gjøre. 1048 00:50:35,990 --> 00:50:39,460 Vi gjør regnestykket som x dividert med y. 1049 00:50:39,460 --> 00:50:44,680 Og både x og y, per linjene kode tidligere, er heltall. 1050 00:50:44,680 --> 00:50:50,440 >> Dessuten, på linje 15, er vi forteller printf, hei, printf plug-in 1051 00:50:50,440 --> 00:50:54,230 et heltall, plug-in et heltall, plug-in en integer-- spesifikt 1052 00:50:54,230 --> 00:50:57,580 x, og deretter y, og deretter x dividert med y. x og y er ints. 1053 00:50:57,580 --> 00:50:59,060 Vi er bra det. 1054 00:50:59,060 --> 00:51:01,250 >> Men hva er x dividert med x? 1055 00:51:01,250 --> 00:51:06,790 x dividert med y bør være, matematisk, 1/10, eller 0,1, 1056 00:51:06,790 --> 00:51:11,600 som er et reelt tall, et reelt tall ha potensielt desimaltegn. 1057 00:51:11,600 --> 00:51:13,230 Det er ikke et heltall. 1058 00:51:13,230 --> 00:51:18,290 >> Men hva er det nærmeste heltall til 1/10 eller 0.1? 1059 00:51:18,290 --> 00:51:21,114 Ja, den slags er null. 1060 00:51:21,114 --> 00:51:22,030 0.1 er som dette mye. 1061 00:51:22,030 --> 00:51:22,890 Og en er dette mye. 1062 00:51:22,890 --> 00:51:25,870 Så 1/10 er nærmere 0 enn det er til en. 1063 00:51:25,870 --> 00:51:30,800 >> Og så hva C gjør for us-- slags fordi vi fortalte det to-- 1064 00:51:30,800 --> 00:51:32,600 er avkorting som heltall. 1065 00:51:32,600 --> 00:51:40,540 Det tar verdien, som igjen er ment å være noe sånt som 0,1000, 1066 00:51:40,540 --> 00:51:41,800 0 og så videre. 1067 00:51:41,800 --> 00:51:45,320 Og det er avkorting alt etter desimaltegnet 1068 00:51:45,320 --> 00:51:47,510 slik at hele denne ting, fordi det ikke 1069 00:51:47,510 --> 00:51:51,910 passer inn i forestillingen om et heltall som er bare et tall som negativ 1, 0, 1, 1070 00:51:51,910 --> 00:51:55,830 opp og ned, kaster den bort alt etter desimaltegnet fordi du 1071 00:51:55,830 --> 00:51:59,020 kan ikke passe desimaltegn i et heltall per definisjon. 1072 00:51:59,020 --> 00:52:01,290 >> Så svaret her er null. 1073 00:52:01,290 --> 00:52:02,600 Så hvordan løser vi dette? 1074 00:52:02,600 --> 00:52:04,400 Vi trenger en annen løsning alle sammen. 1075 00:52:04,400 --> 00:52:06,880 Og vi kan gjøre dette, som følger. 1076 00:52:06,880 --> 00:52:12,820 >> La meg gå videre og opprette en ny fil, dette kalles floats.c. 1077 00:52:12,820 --> 00:52:16,500 Og lagre det her i samme katalog, float.c. 1078 00:52:16,500 --> 00:52:19,360 1079 00:52:19,360 --> 00:52:23,260 Og la meg gå videre og kopiere noen av koden fra tidligere. 1080 00:52:23,260 --> 00:52:27,690 >> Men i stedet for å få en int, la oss gjøre dette. 1081 00:52:27,690 --> 00:52:31,037 Gi meg en flyttall kalt x. hvor et flyt 1082 00:52:31,037 --> 00:52:33,370 Verdien er bare bokstavelig noe med en flytende punkt. 1083 00:52:33,370 --> 00:52:34,410 Det kan flytte til venstre, til høyre. 1084 00:52:34,410 --> 00:52:35,530 Det er et reelt tall. 1085 00:52:35,530 --> 00:52:38,050 >> Og la meg kalle ikke få int, men får flyte, 1086 00:52:38,050 --> 00:52:41,420 som også var blant menyen alternativer i C250 biblioteket. 1087 00:52:41,420 --> 00:52:43,220 La oss endre y til en flåte. 1088 00:52:43,220 --> 00:52:45,000 Så dette blir får flyte. 1089 00:52:45,000 --> 00:52:47,620 >> Og nå, ønsker vi ikke å koble ints. 1090 00:52:47,620 --> 00:52:53,130 Det viser seg at vi må bruke prosent f for float, prosent f for float, 1091 00:52:53,130 --> 00:52:54,560 og nå lagrer det. 1092 00:52:54,560 --> 00:53:01,220 Og nå, fingrene krysset, gjøre flyter, fine, dot slash flyter. 1093 00:53:01,220 --> 00:53:04,280 x kommer til å være en 1. y Kommer til å være 10 igjen. 1094 00:53:04,280 --> 00:53:08,240 >> Og, er hyggelig, OK min tillegg riktig. 1095 00:53:08,240 --> 00:53:10,240 Jeg hadde håpet på mer, men jeg glemte å skrive det. 1096 00:53:10,240 --> 00:53:13,250 Så la oss gå og fikse dette logisk feil. 1097 00:53:13,250 --> 00:53:16,280 >> La oss gå videre og ta tak i følgende. 1098 00:53:16,280 --> 00:53:18,080 Vi må bare gjøre litt kopiere og lime. 1099 00:53:18,080 --> 00:53:20,080 Og jeg kommer til å si minus. 1100 00:53:20,080 --> 00:53:21,890 >> Og jeg kommer til å si tider. 1101 00:53:21,890 --> 00:53:24,060 Og jeg kommer til å si delt. 1102 00:53:24,060 --> 00:53:28,240 Og jeg har ikke tenkt å gjøre modulo, som ikke er så germane her, 1103 00:53:28,240 --> 00:53:33,690 delt på f, og ganger plus-- OK, la oss gjøre dette igjen. 1104 00:53:33,690 --> 00:53:44,210 >> Gjør flyter, dot slash flyter, og 1, 10, og-- fin, nei, OK. 1105 00:53:44,210 --> 00:53:45,250 Så jeg er en idiot. 1106 00:53:45,250 --> 00:53:47,000 Så dette er veldig vanlig i informatikk 1107 00:53:47,000 --> 00:53:49,780 å gjøre dumme feil som dette. 1108 00:53:49,780 --> 00:53:53,100 >> For pedagogiske formål, hva jeg egentlig ønsket å gjøre 1109 00:53:53,100 --> 00:53:57,410 ble endre vitenskap her til pluss, minus, til tider, 1110 00:53:57,410 --> 00:54:01,140 og å dele, som du forhåpentligvis lagt merke til under denne øvelsen. 1111 00:54:01,140 --> 00:54:04,700 Så nå kan vi re-kompilere dette program, gjør dot slash flyter. 1112 00:54:04,700 --> 00:54:07,950 >> Og for tredje gang, la oss se om den oppfyller mine forventninger. 1113 00:54:07,950 --> 00:54:21,480 1, 10, enter, ja, OK, 1.000, delt på 10.000, er 0,100000. 1114 00:54:21,480 --> 00:54:24,952 Og det viser seg at vi kan kontrollere hvor mange Tallene er etter disse desimaler. 1115 00:54:24,952 --> 00:54:25,660 Vi har faktisk vil. 1116 00:54:25,660 --> 00:54:26,790 Vi vil komme tilbake til det. 1117 00:54:26,790 --> 00:54:28,440 >> Men nå, faktisk, er regnestykket riktig. 1118 00:54:28,440 --> 00:54:30,090 Så, igjen, hva er takeaway her? 1119 00:54:30,090 --> 00:54:33,050 Det viser seg at i C, er det ikke bare strings-- og faktisk 1120 00:54:33,050 --> 00:54:36,120 det er egentlig ikke, fordi vi legger de med CS50 biblioteket. 1121 00:54:36,120 --> 00:54:37,710 Men det er ikke bare ints. 1122 00:54:37,710 --> 00:54:38,990 >> Det er også flyter. 1123 00:54:38,990 --> 00:54:42,810 Og det viser seg en haug med andre data typer også, at vi vil bruke før lenge. 1124 00:54:42,810 --> 00:54:46,270 Det viser seg at hvis du ønsker et enkelt karakter, ikke en streng med tegn, 1125 00:54:46,270 --> 00:54:47,610 du kan bruke bare en røye. 1126 00:54:47,610 --> 00:54:52,350 >> Det viser seg at hvis du ønsker en bool, en boolsk verdi, sant eller usant bare, 1127 00:54:52,350 --> 00:54:56,840 takket være CS50 biblioteket, har vi tilsatt til C bool datatype i tillegg. 1128 00:54:56,840 --> 00:54:59,180 Men det er også til stede i mange andre språk også. 1129 00:54:59,180 --> 00:55:04,130 Og det viser seg at noen ganger trenger større tall da kommer som standard 1130 00:55:04,130 --> 00:55:05,210 med ints og flyter. 1131 00:55:05,210 --> 00:55:10,590 >> Og i virkeligheten er en dobbel et antall som bruker ikke 32 bits, men 64 bits. 1132 00:55:10,590 --> 00:55:14,990 Og en lang lang er et nummer som bruker ikke 32, bits, men 64 bits, 1133 00:55:14,990 --> 00:55:19,190 henholdsvis for flyttall verdier og heltall, henholdsvis. 1134 00:55:19,190 --> 00:55:22,780 Så la oss faktisk nå se dette i aksjon. 1135 00:55:22,780 --> 00:55:26,150 >> Jeg kommer til å gå videre her og piske opp en annen program. 1136 00:55:26,150 --> 00:55:32,020 Her kommer jeg til å gå videre og inkluderer CS50.h. 1137 00:55:32,020 --> 00:55:34,910 Og la meg gå, inkluderer standard IO.h. 1138 00:55:34,910 --> 00:55:37,320 >> Og du vil merke noe funky som skjer her. 1139 00:55:37,320 --> 00:55:40,592 Det er ikke fargekoding ting på samme måte som det gjorde før. 1140 00:55:40,592 --> 00:55:43,550 Og det viser seg, det er fordi jeg har ikke gitt noe et filnavn. 1141 00:55:43,550 --> 00:55:47,270 >> Jeg kommer til å kalle dette en sizeof.c, og traff Lagre. 1142 00:55:47,270 --> 00:55:51,039 Og legg merke til hva som skjer med min veldig hvit kode mot den sorte bakgrunnen. 1143 00:55:51,039 --> 00:55:52,830 Nå, i hvert fall det er noen lilla der inne. 1144 00:55:52,830 --> 00:55:54,490 Og det er syntaks markert. 1145 00:55:54,490 --> 00:55:57,700 >> Det er fordi, ganske enkelt, jeg har fortalte IDE hvilken type fil 1146 00:55:57,700 --> 00:56:01,060 det er ved å gi den et navn, og spesielt en filtype. 1147 00:56:01,060 --> 00:56:03,620 Nå, la oss gå videre og gjøre dette. 1148 00:56:03,620 --> 00:56:08,910 Jeg kommer til å gå videre og meget bare skrive ut following-- bool 1149 00:56:08,910 --> 00:56:11,080 er prosent LU. 1150 00:56:11,080 --> 00:56:12,950 >> Vi vil komme tilbake til som i løpet av et øyeblikk. 1151 00:56:12,950 --> 00:56:15,840 Og så kommer jeg til å utskriftsstørrelsen bool. 1152 00:56:15,840 --> 00:56:18,170 Og nå, bare for å spare meg selv litt tid, jeg er 1153 00:56:18,170 --> 00:56:20,280 kommer til å gjøre en hel haug av disse på en gang. 1154 00:56:20,280 --> 00:56:24,620 Og spesielt, jeg kommer til å endre dette til en char og røye. 1155 00:56:24,620 --> 00:56:27,760 Denne, kommer jeg til å endre til en dobbeltseng og en dobbel. 1156 00:56:27,760 --> 00:56:31,440 >> Denne, kommer jeg til å endre til en flåte og en flåte. 1157 00:56:31,440 --> 00:56:35,670 Denne, kommer jeg til å endre til en int og en int. 1158 00:56:35,670 --> 00:56:38,660 Og dette skal jeg å bytte til en lang lang. 1159 00:56:38,660 --> 00:56:40,840 Og det er fortsatt tar lang tid, lang lang. 1160 00:56:40,840 --> 00:56:44,572 >> Og så, til slutt, jeg ga meg selv én for mye, streng. 1161 00:56:44,572 --> 00:56:47,030 Det viser seg at i C, er det den spesielle operatør kalles 1162 00:56:47,030 --> 00:56:50,260 Størrelsen på det er bokstavelig talt skal, når det kjøres, 1163 00:56:50,260 --> 00:56:52,099 fortelle oss størrelsen på hver av disse variablene. 1164 00:56:52,099 --> 00:56:53,890 Og dette er en måte, nå, vi kan koble tilbake 1165 00:56:53,890 --> 00:56:57,140 til forrige ukes diskusjon av data og representasjon. 1166 00:56:57,140 --> 00:57:00,330 >> La meg gå videre og kompilere Størrelsen på dot slash størrelse. 1167 00:57:00,330 --> 00:57:01,210 Og la oss se. 1168 00:57:01,210 --> 00:57:05,210 Det viser seg at i C, spesifikt på CS50 IDE, 1169 00:57:05,210 --> 00:57:08,170 spesielt på operativsystemet Ubuntu, 1170 00:57:08,170 --> 00:57:11,100 som er en 64-bits operativsystem Systemet i dette tilfellet 1171 00:57:11,100 --> 00:57:14,189 en bool kommer til å bruker en byte av plass. 1172 00:57:14,189 --> 00:57:16,480 Det er slik størrelse måles, ikke i biter, men i byte. 1173 00:57:16,480 --> 00:57:18,690 Og husker at en byte er åtte bits. 1174 00:57:18,690 --> 00:57:22,030 Så en bool, selv om du teknisk bare trenger en 0 eller 1, 1175 00:57:22,030 --> 00:57:24,092 det er litt bortkastet hvordan vi har implementert det. 1176 00:57:24,092 --> 00:57:26,800 Det er faktisk kommer til å bruke en hel byte-- så nuller, er kanskje 1177 00:57:26,800 --> 00:57:31,050 alle de, eller noe sånt, eller bare en en blant åtte bits. 1178 00:57:31,050 --> 00:57:34,962 >> En røye, i mellomtiden, som brukes for en karakter som en Ascii tegn per forrige uke, 1179 00:57:34,962 --> 00:57:36,170 kommer til å være ett tegn. 1180 00:57:36,170 --> 00:57:42,340 Og som synkroniserer med våre forestillinger om det er ikke mer enn 256 bits-- snarere 1181 00:57:42,340 --> 00:57:45,360 synkroniserer opp med at det er ingen lengre enn 8 bits, som 1182 00:57:45,360 --> 00:57:47,450 gir oss så mange som 256 verdier. 1183 00:57:47,450 --> 00:57:49,680 En dobbel kommer til å være 8 byte eller 64 biter. 1184 00:57:49,680 --> 00:57:50,510 >> En flottør er 4. 1185 00:57:50,510 --> 00:57:51,690 En int er 4. 1186 00:57:51,690 --> 00:57:52,980 En lang, er lang 8. 1187 00:57:52,980 --> 00:57:54,716 Og en streng er åtte. 1188 00:57:54,716 --> 00:57:55,840 Men ikke bekymre deg for det. 1189 00:57:55,840 --> 00:57:57,340 Vi kommer til å skrelle tilbake det laget. 1190 00:57:57,340 --> 00:57:59,940 Det viser seg, strenger kan være lenger enn 8 byte. 1191 00:57:59,940 --> 00:58:02,310 >> Og, ja, vi har skrevet strenger allerede, hallo verden, 1192 00:58:02,310 --> 00:58:03,700 lenger enn 8 byte. 1193 00:58:03,700 --> 00:58:06,270 Men vi vil komme tilbake til som i løpet av et øyeblikk. 1194 00:58:06,270 --> 00:58:09,690 Men take away her er følgende. 1195 00:58:09,690 --> 00:58:15,320 >> Enhver datamaskin har bare en begrenset mye minne og plass. 1196 00:58:15,320 --> 00:58:17,860 Du kan bare lagre så mange filer på din Mac eller PC. 1197 00:58:17,860 --> 00:58:23,030 Du kan bare lagre så mange programmer i RAM som kjører på en gang, nødvendigvis, selv 1198 00:58:23,030 --> 00:58:26,360 med virtuelt minne, fordi du har en begrenset mengde RAM. 1199 00:58:26,360 --> 00:58:28,990 >> Og bare for å picture-- hvis du har aldri åpnet en laptop 1200 00:58:28,990 --> 00:58:31,300 eller bestilles ekstra minne for en datamaskin, du 1201 00:58:31,300 --> 00:58:33,670 kanskje ikke vet at Innsiden av datamaskinen 1202 00:58:33,670 --> 00:58:36,590 er noe som ser litt som dette. 1203 00:58:36,590 --> 00:58:40,540 Så dette er bare et vanlig selskap kalt Crucial som gjør RAM for datamaskiner. 1204 00:58:40,540 --> 00:58:43,620 Og RAM er der programmene leve mens de kjører. 1205 00:58:43,620 --> 00:58:46,630 >> Så på alle Mac eller PC, når du dobbelt Klikk et program, og det åpner opp, 1206 00:58:46,630 --> 00:58:48,921 og det åpner noen Word-dokument eller noe sånt, 1207 00:58:48,921 --> 00:58:51,764 den lagrer den midlertidig i RAM, fordi RAM er raskere 1208 00:58:51,764 --> 00:58:53,680 enn harddisken, eller din solid state disk. 1209 00:58:53,680 --> 00:58:56,600 Så det er bare der programmene gå å leve når de kjører, 1210 00:58:56,600 --> 00:58:58,060 eller når det er i bruk filer. 1211 00:58:58,060 --> 00:59:00,890 >> Så du har ting som ser som dette innsiden av den bærbare datamaskinen, 1212 00:59:00,890 --> 00:59:03,320 eller litt større ting innsiden av skrivebordet ditt. 1213 00:59:03,320 --> 00:59:07,440 Men nøkkelen er at du bare har en endelig antall av disse tingene. 1214 00:59:07,440 --> 00:59:11,230 Og det er bare en begrenset mengde maskinvare sitter på denne pult rett 1215 00:59:11,230 --> 00:59:11,730 her. 1216 00:59:11,730 --> 00:59:15,920 >> Så, sikkert, vi kan ikke lagre uendelig lange tall. 1217 00:59:15,920 --> 00:59:19,030 Og likevel, hvis du tenker tilbake til grunnskolen, hvor mange siffer kan 1218 00:59:19,030 --> 00:59:21,400 du må rett av et punktum? 1219 00:59:21,400 --> 00:59:24,680 For den saks skyld, hvor mange siffer kan du har til venstre for et desimaltegn? 1220 00:59:24,680 --> 00:59:26,300 Virkelig, uendelig mange. 1221 00:59:26,300 --> 00:59:30,840 >> Nå, vi mennesker kanskje bare vet hvordan å uttale millioner, 1222 00:59:30,840 --> 00:59:34,990 og milliarder, billion, og kvadrillion, og quintillion. 1223 00:59:34,990 --> 00:59:39,370 Og jeg presser grensene for min understanding-- eller my-- jeg forstår 1224 00:59:39,370 --> 00:59:41,110 tall, men min uttale av tall. 1225 00:59:41,110 --> 00:59:44,720 Men de kan få uendelig stor med uendelig mange Sifrene til venstre 1226 00:59:44,720 --> 00:59:47,050 eller til høyre for et desimaltegn. 1227 00:59:47,050 --> 00:59:50,040 >> Men datamaskiner har bare en begrenset mengde minne, 1228 00:59:50,040 --> 00:59:53,510 et endelig antall transistorer, en endelig antall lyspærer inne. 1229 00:59:53,510 --> 00:59:57,350 Så hva skjer når du går tom for plass? 1230 00:59:57,350 --> 00:59:59,620 Med andre ord, hvis du tenker tilbake til forrige uke 1231 00:59:59,620 --> 01:00:03,160 når vi snakket om tall seg å være representert i binær, 1232 01:00:03,160 --> 01:00:05,480 anta at vi har fått denne 8-bits verdi her. 1233 01:00:05,480 --> 01:00:08,290 >> Og vi har syv en og en 0. 1234 01:00:08,290 --> 01:00:10,827 Og anta at vi ønsker å legge en til denne verdien. 1235 01:00:10,827 --> 01:00:12,410 Dette er et virkelig stort tall akkurat nå. 1236 01:00:12,410 --> 01:00:16,610 >> Dette er 254, hvis jeg husker matematikk fra forrige uke rett. 1237 01:00:16,610 --> 01:00:19,480 Men hva hvis jeg endrer det lengst til høyre 0 til en 1? 1238 01:00:19,480 --> 01:00:22,800 Det hele tall, av Selvfølgelig blir åtte 1-tallet. 1239 01:00:22,800 --> 01:00:24,050 Så vi er fortsatt god. 1240 01:00:24,050 --> 01:00:27,204 >> Og som sannsynligvis representerer 255, men avhengig av kontekst 1241 01:00:27,204 --> 01:00:29,120 det kan faktisk representere et negativt tall. 1242 01:00:29,120 --> 01:00:31,240 Men mer om det en annen gang. 1243 01:00:31,240 --> 01:00:34,220 Dette føles som det er om så høyt som jeg kan telle. 1244 01:00:34,220 --> 01:00:35,290 >> Nå er det bare 8 bits. 1245 01:00:35,290 --> 01:00:38,170 Og min Mac, sikkert, har veien mer enn 8 biter av minne. 1246 01:00:38,170 --> 01:00:39,170 Men det har endelig. 1247 01:00:39,170 --> 01:00:43,230 Slik at den samme argument gjelder, selv om vi har flere av disse seg på skjermen. 1248 01:00:43,230 --> 01:00:47,020 >> Men hva skjer hvis du er lagre dette nummeret, 255, 1249 01:00:47,020 --> 01:00:49,290 og du vil telle en litt høyere? 1250 01:00:49,290 --> 01:00:51,600 Du ønsker å gå 255-256. 1251 01:00:51,600 --> 01:00:55,800 Problemet er selvfølgelig at hvis du begynne å telle på null som forrige uke, 1252 01:00:55,800 --> 01:00:59,670 du kan ikke telle så høyt 256, enn si 257, 1253 01:00:59,670 --> 01:01:02,584 enn si 258, m fordi det skjer når du legger til en 1? 1254 01:01:02,584 --> 01:01:05,000 Hvis du gjør den gamle barneskolen tilnærming, sette deg en 1 her, 1255 01:01:05,000 --> 01:01:08,150 og deretter en pluss en er to, men det er virkelig en null, bære deg på en, 1256 01:01:08,150 --> 01:01:09,695 bære en, bærer en. 1257 01:01:09,695 --> 01:01:12,620 Alle disse tingene, disse 1-tallet, gå til null. 1258 01:01:12,620 --> 01:01:17,820 Og du ender opp med, ja, som noen påpekt, en 1 på venstre side. 1259 01:01:17,820 --> 01:01:22,540 Men alt du kan faktisk ser og passer i minnet 1260 01:01:22,540 --> 01:01:27,960 er bare åtte 0-er, som er å si på et tidspunkt hvis du, en datamaskin, 1261 01:01:27,960 --> 01:01:32,490 prøvde å telle høyt nok opp, er du kommer til å vikle rundt, det ville virke, 1262 01:01:32,490 --> 01:01:35,850 til null, eller kanskje til og med negativ tall, som er enda mindre enn null. 1263 01:01:35,850 --> 01:01:37,260 >> Og vi kan slags se dette. 1264 01:01:37,260 --> 01:01:39,900 La meg gå videre og skrive en virkelig rask program her. 1265 01:01:39,900 --> 01:01:43,690 La meg gå videre og skrive et program som heter Flow. 1266 01:01:43,690 --> 01:01:49,980 Inkluder CS50.h inkluderer standard IO.h-- oh, 1267 01:01:49,980 --> 01:01:51,730 Jeg virkelig savnet min syntax highlighting. 1268 01:01:51,730 --> 01:01:54,440 Så la oss lagre dette som overflow.c. 1269 01:01:54,440 --> 01:01:57,084 >> Og nå int main void-- og før lenge, vil vi 1270 01:01:57,084 --> 01:01:59,500 komme tilbake til å forklare hvorfor vi holde skrive int main annullert. 1271 01:01:59,500 --> 01:02:02,080 Men for nå, la oss bare gjøre det, tar det for gitt. 1272 01:02:02,080 --> 01:02:06,200 La oss gi meg selv en int, og initialisere den til 0. 1273 01:02:06,200 --> 01:02:11,716 >> La oss da gjøre for int jeg få zero-- faktisk, la oss gjøre en uendelig loop 1274 01:02:11,716 --> 01:02:12,590 og se hva som skjer. 1275 01:02:12,590 --> 01:02:22,440 Mens sant, så la oss skrive ut n er prosent i, backslash n, plug-in n. 1276 01:02:22,440 --> 01:02:27,200 Men nå, la oss gjøre n får n pluss en. 1277 01:02:27,200 --> 01:02:29,660 >> Så med andre ord, på hvert gjentakelse av denne uendelig loop, 1278 01:02:29,660 --> 01:02:32,550 la oss ta n verdi, og legge en til det, og deretter 1279 01:02:32,550 --> 01:02:34,350 lagre resultatet tilbake i n til venstre. 1280 01:02:34,350 --> 01:02:37,150 Og, faktisk, har vi sett syntaks noe som dette, en kort stund. 1281 01:02:37,150 --> 01:02:39,730 En kul Trikset er stedet for å skrive ut alt dette, 1282 01:02:39,730 --> 01:02:42,770 du kan faktisk si en n pluss er lik en. 1283 01:02:42,770 --> 01:02:47,480 >> Eller hvis du virkelig ønsker å være fancy, du kan si n pluss pluss semikolon. 1284 01:02:47,480 --> 01:02:50,130 Men disse to sistnevnte er bare hva vi vil kalle syntaktisk sukker 1285 01:02:50,130 --> 01:02:50,790 for det første. 1286 01:02:50,790 --> 01:02:53,456 >> Det første er mer eksplisitt, helt greit, helt riktig. 1287 01:02:53,456 --> 01:02:55,470 Men dette er mer vanlig, vil jeg si. 1288 01:02:55,470 --> 01:02:57,210 Så vil vi gjøre dette for bare et øyeblikk. 1289 01:02:57,210 --> 01:03:01,685 >> La oss nå gjøre overløp, som lyder heller illevarslende, dot slash overløp. 1290 01:03:01,685 --> 01:03:04,380 1291 01:03:04,380 --> 01:03:09,852 La oss se, n begynner å bli ganske stor. 1292 01:03:09,852 --> 01:03:11,310 Men la oss tenke, hvor stor kan n få? 1293 01:03:11,310 --> 01:03:12,870 >> n er et int. 1294 01:03:12,870 --> 01:03:16,400 Vi så et øyeblikk siden med størrelsen på eksempel at en int er fire byte. 1295 01:03:16,400 --> 01:03:22,070 Vi vet fra forrige uke, er fire byte 32 biter, fordi 8 ganger 4, som er 32. 1296 01:03:22,070 --> 01:03:23,460 Det kommer til å bli 4 milliarder. 1297 01:03:23,460 --> 01:03:25,802 >> Og vi er opptil 800.000. 1298 01:03:25,802 --> 01:03:28,510 Dette kommer til å ta en evighet å telle så høyt som jeg muligens kan. 1299 01:03:28,510 --> 01:03:30,635 Så jeg kommer til å gå videre, som du kanskje før lenge, 1300 01:03:30,635 --> 01:03:34,910 og traff kontroll C-- ærlig, Kontroll C, mye, hvor kontroll C vanligvis 1301 01:03:34,910 --> 01:03:36,034 midler avbryte. 1302 01:03:36,034 --> 01:03:38,200 Dessverre, fordi denne kjører i skyen, 1303 01:03:38,200 --> 01:03:41,190 noen ganger skyen er spytter ut så mye ting, 1304 01:03:41,190 --> 01:03:44,180 så mye utgang, kommer det til å ta en liten stund for mine innspill 1305 01:03:44,180 --> 01:03:45,630 for å komme til nettskyen. 1306 01:03:45,630 --> 01:03:49,240 Så selv om jeg traff Kontroll C et par sekunder siden, 1307 01:03:49,240 --> 01:03:53,110 Dette er definitivt den siden Effekten av en uendelig loop. 1308 01:03:53,110 --> 01:03:56,070 >> Og så i slike tilfeller, er vi kommer til å la det være. 1309 01:03:56,070 --> 01:03:59,050 Og vi kommer til å legge til en annen terminalvindu over her 1310 01:03:59,050 --> 01:04:03,186 med pluss, som selvfølgelig ikke sånn, siden det er fortsatt tenker. 1311 01:04:03,186 --> 01:04:05,310 Og la oss gå videre og være litt mer fornuftig. 1312 01:04:05,310 --> 01:04:07,768 >> Jeg kommer til å gå videre og gjøre dette bare begrenset mange ganger. 1313 01:04:07,768 --> 01:04:10,047 La oss bruke en for loop, som jeg antydet tidligere. 1314 01:04:10,047 --> 01:04:10,630 La oss gjøre dette. 1315 01:04:10,630 --> 01:04:13,430 Gi meg en annen variabel int jeg får 0. 1316 01:04:13,430 --> 01:04:17,430 Jeg er mindre enn, la oss si, 64 i ++. 1317 01:04:17,430 --> 01:04:24,010 Og nå la meg gå videre og print ut n er prosent i, komma n. 1318 01:04:24,010 --> 01:04:27,547 Og så N- dette er fortsatt kommer til å ta en evighet. 1319 01:04:27,547 --> 01:04:28,130 La oss gjøre dette. 1320 01:04:28,130 --> 01:04:30,620 >> n blir n ganger 2. 1321 01:04:30,620 --> 01:04:34,140 Eller vi kan være fancy og gjøre tider lik 2. 1322 01:04:34,140 --> 01:04:37,120 Men la oss bare si n er lik seg selv, ganger 2. 1323 01:04:37,120 --> 01:04:39,321 Med andre ord, i denne ny versjon av programmet, 1324 01:04:39,321 --> 01:04:41,820 Jeg ønsker ikke å vente for alltid fra lignende 800 000 til 4000 millioner. 1325 01:04:41,820 --> 01:04:43,070 La oss bare få dette overstått. 1326 01:04:43,070 --> 01:04:44,920 >> La oss faktisk dobbelt n hver gang. 1327 01:04:44,920 --> 01:04:47,660 Som, husker, er dobling av det motsatte av ha, selvfølgelig. 1328 01:04:47,660 --> 01:04:50,035 Og mens forrige uke har vi noe igjen, og igjen, 1329 01:04:50,035 --> 01:04:52,200 og igjen, super rask, dobling vil sikkert 1330 01:04:52,200 --> 01:04:58,080 få oss fra en til størst mulig verdi som vi kan telle til med en int. 1331 01:04:58,080 --> 01:04:59,750 >> Så la oss gjøre akkurat dette. 1332 01:04:59,750 --> 01:05:01,720 Og vi vil komme tilbake til dette før lenge. 1333 01:05:01,720 --> 01:05:04,180 Men dette, igjen, er akkurat som gjentakelses blokken i Scratch. 1334 01:05:04,180 --> 01:05:05,600 Og du vil bruke dette før lenge. 1335 01:05:05,600 --> 01:05:10,170 >> Dette betyr bare telle fra null opp til, men ikke like, til 64. 1336 01:05:10,170 --> 01:05:14,285 Og på hver iterasjon av dette loop, bare holde økes i. 1337 01:05:14,285 --> 01:05:18,990 Så i ++ - og denne generelle konstruksjon på linje 7 er bare en super vanlig måte 1338 01:05:18,990 --> 01:05:22,290 for å gjenta noen linjer av kode, et antall ganger. 1339 01:05:22,290 --> 01:05:23,362 Hvilke linjer med kode? 1340 01:05:23,362 --> 01:05:25,570 Disse klammeparentes, som du kan ha sanket fra nå, 1341 01:05:25,570 --> 01:05:26,780 betyr, gjør du følgende. 1342 01:05:26,780 --> 01:05:29,510 >> Det er i like Scratch, når den har den gule blokkene 1343 01:05:29,510 --> 01:05:32,680 og andre farger den slags omfavne eller klem andre blokker. 1344 01:05:32,680 --> 01:05:34,750 Det er det de krøllete bukseseler gjør her. 1345 01:05:34,750 --> 01:05:40,200 Så hvis jeg fikk min syntaks right-- deg kan se gulrot symbol i C midler 1346 01:05:40,200 --> 01:05:42,706 det er hvor mange ganger jeg var prøver å løse dette problemet. 1347 01:05:42,706 --> 01:05:45,330 Så la oss bli kvitt det en helt, og lukk det vinduet. 1348 01:05:45,330 --> 01:05:46,520 Og vi kommer til å bruke den nye. 1349 01:05:46,520 --> 01:05:51,980 Gjør overløp, dot slash overløp, Enter, all right, 1350 01:05:51,980 --> 01:05:53,090 det ser dårlig i begynnelsen. 1351 01:05:53,090 --> 01:05:56,200 Men la oss bla tilbake i tid, fordi jeg gjorde dette 64 ganger. 1352 01:05:56,200 --> 01:05:58,700 >> Og legg merke til første gang, er n 1. 1353 01:05:58,700 --> 01:06:03,110 Andre gang, er n 2, deretter 4, deretter 8, deretter 16. 1354 01:06:03,110 --> 01:06:09,450 Og det virker som snarest Jeg får omtrent 1 milliard, 1355 01:06:09,450 --> 01:06:12,800 hvis jeg doble det igjen, at bør gi meg 2 milliarder. 1356 01:06:12,800 --> 01:06:14,980 Men det viser seg, er det rett på cusp. 1357 01:06:14,980 --> 01:06:18,930 >> Og slik er det faktisk renner over en int fra 1 milliard 1358 01:06:18,930 --> 01:06:23,514 til omtrent negative 2 milliarder, fordi et heltall, 1359 01:06:23,514 --> 01:06:25,430 i motsetning til tallene vi var forutsatt i forrige uke, 1360 01:06:25,430 --> 01:06:28,397 kan være både positiv og negativ i virkeligheten og i en datamaskin. 1361 01:06:28,397 --> 01:06:30,730 Og slik at i det minste en av disse biter effektivt stjålet. 1362 01:06:30,730 --> 01:06:34,190 Så vi egentlig bare har 31 bits, eller 2 milliarder mulige verdier. 1363 01:06:34,190 --> 01:06:38,220 >> Men for nå, er det takeaway ganske enkelt, uansett disse tallene er 1364 01:06:38,220 --> 01:06:42,280 og hva matematikk er, noe dårlig skjer til slutt, 1365 01:06:42,280 --> 01:06:46,980 fordi slutt du prøver å permutere biter en for mange ganger. 1366 01:06:46,980 --> 01:06:51,060 Og du effektivt gå fra alt En er å kanskje alle 0-tallet, eller kanskje 1367 01:06:51,060 --> 01:06:54,260 bare noen andre mønster som det klart, avhengig av sammenhengen, 1368 01:06:54,260 --> 01:06:56,342 kan tolkes som et negativt tall. 1369 01:06:56,342 --> 01:06:59,300 Og så vil det synes den høyeste jeg kan telle i dette spesielle programmet 1370 01:06:59,300 --> 01:07:01,210 er bare om lag 1 milliard. 1371 01:07:01,210 --> 01:07:02,760 Men det er en delvis løsning her. 1372 01:07:02,760 --> 01:07:03,480 Vet du hva? 1373 01:07:03,480 --> 01:07:07,600 >> La meg endre seg fra en int til en lang lang. 1374 01:07:07,600 --> 01:07:10,633 Og la meg gå videre her og say-- jeg kommer til å ha 1375 01:07:10,633 --> 01:07:12,290 å endre dette til en usignert lang. 1376 01:07:12,290 --> 01:07:16,860 Eller, la oss se, jeg aldri huske meg selv. 1377 01:07:16,860 --> 01:07:19,920 >> La oss gå videre og gjøre overløp. 1378 01:07:19,920 --> 01:07:21,860 Nei, det er ikke det, LLD, takk. 1379 01:07:21,860 --> 01:07:23,430 Så noen ganger klang kan være nyttig. 1380 01:07:23,430 --> 01:07:27,550 Jeg husker ikke hva formatet Specifier var i lang lang. 1381 01:07:27,550 --> 01:07:28,950 >> Men, ja, fortalte klang meg. 1382 01:07:28,950 --> 01:07:31,570 Green er en slags god, fortsatt betyr at du har gjort en feil. 1383 01:07:31,570 --> 01:07:33,190 Det gjetter at jeg mente LLD. 1384 01:07:33,190 --> 01:07:38,750 >> Så la meg ta det råd, en lang lange desimaltall, lagre det. 1385 01:07:38,750 --> 01:07:43,190 Og la meg kjøre den, dot slash overløp, Enter. 1386 01:07:43,190 --> 01:07:45,020 Og nå hva som er kult er dette. 1387 01:07:45,020 --> 01:07:49,140 >> Hvis jeg blar tilbake i tid, vil vi likevel starte telling på samme sted-- 1, 2, 4, 1388 01:07:49,140 --> 01:07:50,220 8, 16. 1389 01:07:50,220 --> 01:07:54,860 Legg merke til, får vi alle helt opp til 1 milliard. 1390 01:07:54,860 --> 01:07:57,070 Men da vi trygt komme til 2 milliarder. 1391 01:07:57,070 --> 01:08:01,300 >> Så får vi til 4 milliarder kroner, deretter 8 milliarder kroner, 17 milliarder. 1392 01:08:01,300 --> 01:08:03,340 Og vi går høyere, og høyere, og høyere. 1393 01:08:03,340 --> 01:08:05,740 Til slutt, dette også, pauser. 1394 01:08:05,740 --> 01:08:09,350 >> Til slutt, med en lang lang, som er den 64-bits verdi, ikke 1395 01:08:09,350 --> 01:08:13,660 en 32-biters verdi, hvis du teller for høyt, du vikle rundt 0. 1396 01:08:13,660 --> 01:08:16,410 Og i dette tilfelle skje til vi ende opp med et negativt tall. 1397 01:08:16,410 --> 01:08:17,550 >> Så dette er et problem. 1398 01:08:17,550 --> 01:08:20,439 Og det viser seg at dette Problemet er ikke alle som uforståelige. 1399 01:08:20,439 --> 01:08:23,060 Selv om jeg har bevisst indusert det med disse feilene, 1400 01:08:23,060 --> 01:08:26,149 det viser seg at vi ser det slags alt rundt oss, eller i det minste noen av oss gjør. 1401 01:08:26,149 --> 01:08:28,939 >> Så i Lego Star Wars, hvis du noen gang har spilt spillet, 1402 01:08:28,939 --> 01:08:33,830 det viser seg at du kan gå rundt bryte opp ting i LEGO verden, 1403 01:08:33,830 --> 01:08:36,640 og samle mynter, egentlig. 1404 01:08:36,640 --> 01:08:39,200 Og hvis du noen gang har spilt dette spillet altfor mye tid, 1405 01:08:39,200 --> 01:08:42,630 da dette ikke navngitte personen her gjorde, det totale antallet 1406 01:08:42,630 --> 01:08:46,700 mynter som du kan samle er, det ville virke, 4 milliarder. 1407 01:08:46,700 --> 01:08:48,240 >> Nå, med det er faktisk avrundet. 1408 01:08:48,240 --> 01:08:50,239 Så LEGO prøvde å holde ting brukervennlig. 1409 01:08:50,239 --> 01:08:53,779 De gjorde ikke det nøyaktig to til 32 makt, per i forrige uke. 1410 01:08:53,779 --> 01:08:55,310 Men 4000000000 er en grunn. 1411 01:08:55,310 --> 01:08:58,979 Det virker, basert på denne informasjonen, som LEGO, og selskapet som 1412 01:08:58,979 --> 01:09:02,624 gjort dette selve programvaren, besluttet at det maksimale antall mynter 1413 01:09:02,624 --> 01:09:04,540 brukeren kan akkumulere er faktisk 4 milliarder kroner, 1414 01:09:04,540 --> 01:09:12,069 fordi de valgte i koden sin å bruke ikke en lang lang, tilsynelatende, 1415 01:09:12,069 --> 01:09:16,140 men bare et tall, en usignert heltall, bare et positivt heltall, hvis 1416 01:09:16,140 --> 01:09:18,089 max verdi er omtrent det. 1417 01:09:18,089 --> 01:09:19,380 Vel, her er en annen morsom en. 1418 01:09:19,380 --> 01:09:23,500 Så i spillet Civilization, som noen av dere kan bli kjent med 1419 01:09:23,500 --> 01:09:26,660 det viser seg at år siden det var en feil i dette spillet der 1420 01:09:26,660 --> 01:09:28,750 hvis du har spilt rollen av Gandhi i spillet, 1421 01:09:28,750 --> 01:09:34,020 i stedet for ham å være veldig pasifist, stedet var utrolig, utrolig 1422 01:09:34,020 --> 01:09:36,399 aggressiv, i enkelte tilfeller. 1423 01:09:36,399 --> 01:09:40,529 Spesielt den måten at Civilization verker er at hvis du, spilleren, 1424 01:09:40,529 --> 01:09:44,680 vedta demokrati, din aggressivitet poengsum blir 1425 01:09:44,680 --> 01:09:48,130 dekrementert med to, så minus minus, og deretter minus minus. 1426 01:09:48,130 --> 01:09:50,569 >> Så du trekker 2 fra faktiske itera. 1427 01:09:50,569 --> 01:09:56,650 Dessverre, hvis din itera er innledningsvis en, og du trekker 2 fra det 1428 01:09:56,650 --> 01:09:59,050 etter å vedta demokrati som Gandhi her kanskje 1429 01:09:59,050 --> 01:10:02,200 har gjort, fordi han var veldig passive-- 1 på skalaen av aggressivitet. 1430 01:10:02,200 --> 01:10:04,830 Men om han vedtar demokrati, deretter han går fra en negativ en. 1431 01:10:04,830 --> 01:10:11,470 >> Dessverre var de ved hjelp av usignerte tall, 1432 01:10:11,470 --> 01:10:15,400 som betyr at de behandles med negativ tall som om de var positive. 1433 01:10:15,400 --> 01:10:19,780 Og det viser seg at positiv tilsvarende negativ en, 1434 01:10:19,780 --> 01:10:23,480 i typiske dataprogrammer, er 255. 1435 01:10:23,480 --> 01:10:27,250 Så hvis Gandhi vedtar demokrati har, og derfor 1436 01:10:27,250 --> 01:10:32,470 hans aggressivitet poengsum redusert, det faktisk ruller rundt til 255 1437 01:10:32,470 --> 01:10:35,470 og gjør ham til den mest aggressive karakter i spillet. 1438 01:10:35,470 --> 01:10:36,930 Så du kan google opp på dette. 1439 01:10:36,930 --> 01:10:39,380 Og det var faktisk en utilsiktet programmering bug, 1440 01:10:39,380 --> 01:10:43,010 men det er inngått helt lore siden den gang. 1441 01:10:43,010 --> 01:10:44,360 >> Det er alt morsomme og søte. 1442 01:10:44,360 --> 01:10:47,760 Mer skremmende er når selve virkelige verden enheter, og ikke spill, 1443 01:10:47,760 --> 01:10:48,820 har de samme feilene. 1444 01:10:48,820 --> 01:10:54,500 Faktisk bare et år siden kom en artikkel ut om Boeing 787 Dreamliner. 1445 01:10:54,500 --> 01:10:56,850 >> Og artikkelen først blikk leser litt uforståelige. 1446 01:10:56,850 --> 01:11:01,480 Men det sa dette, en programvare sårbarhet i Boeings 1447 01:11:01,480 --> 01:11:04,790 nye 787 Dreamliner jet har potensial til å forårsake piloter 1448 01:11:04,790 --> 01:11:07,220 å miste kontrollen over luftfartøyet, eventuelt 1449 01:11:07,220 --> 01:11:11,750 i mid-flight, de FAA tjenestemenn advart flyselskaper nylig. 1450 01:11:11,750 --> 01:11:14,520 Det var bestemmelsen som en modell 787 1451 01:11:14,520 --> 01:11:19,770 fly som har blitt drevet kontinuerlig i 248 dager 1452 01:11:19,770 --> 01:11:24,880 kan miste all vekselstrøm, AC, elektrisk kraft på grunn av generatoren 1453 01:11:24,880 --> 01:11:28,892 kontrollenheter, GCUs, samtidig går inn fail safe mode. 1454 01:11:28,892 --> 01:11:29,850 Det er litt for å miste meg. 1455 01:11:29,850 --> 01:11:35,390 Men memo oppgitt, OK, nå fikk jeg det, tilstanden var forårsaket av en programvare 1456 01:11:35,390 --> 01:11:38,590 motvirke interne til generatoren styre 1457 01:11:38,590 --> 01:11:44,860 enheter som vil overløp etter 248 dager med kontinuerlig strøm. 1458 01:11:44,860 --> 01:11:47,070 Vi foretar denne varsel for å hindre tap 1459 01:11:47,070 --> 01:11:49,300 av alle AC elektrisk makt, noe som kan resultere 1460 01:11:49,300 --> 01:11:50,980 i tap av kontroll over flyet. 1461 01:11:50,980 --> 01:11:55,380 >> Så, bokstavelig talt, er det noen heltall, eller noen tilsvarende datatype, 1462 01:11:55,380 --> 01:11:57,960 brukes i programvare i en faktisk fly 1463 01:11:57,960 --> 01:12:00,756 at hvis du holder flyet på lenge nok, som tilsynelatende 1464 01:12:00,756 --> 01:12:03,880 kan være tilfelle hvis du bare kjører dem hele tiden og aldri frakobling 1465 01:12:03,880 --> 01:12:06,810 flyet, synes det, eller la batteriene dør, 1466 01:12:06,810 --> 01:12:09,840 vil til slutt telle opp, og opp, og opp, og opp, og opp, og opp. 1467 01:12:09,840 --> 01:12:12,150 >> Og, av natur, en begrenset mengde minne 1468 01:12:12,150 --> 01:12:15,880 vil renne over, rulle tilbake til null eller noen negativ verdi, 1469 01:12:15,880 --> 01:12:19,920 en bivirkning av dette er det skremmende realistisk virkelighet 1470 01:12:19,920 --> 01:12:23,970 at flyet måtte trenge startes på nytt, effektivt, 1471 01:12:23,970 --> 01:12:27,290 eller kan falle enda verre, som den flyr. 1472 01:12:27,290 --> 01:12:29,230 Så slike problemer er fortsatt med oss, 1473 01:12:29,230 --> 01:12:33,130 even-- dette var en 2015 artikkel, desto mer skremmende 1474 01:12:33,130 --> 01:12:36,100 når du ikke nødvendigvis forstå, verdsette, eller forutse 1475 01:12:36,100 --> 01:12:38,640 slike feil. 1476 01:12:38,640 --> 01:12:42,030 >> Så det viser seg at det finnes en annen dårlig ting om data representasjon. 1477 01:12:42,030 --> 01:12:47,080 Det viser seg at selv flyter er slags feil, fordi flyter, også, 1478 01:12:47,080 --> 01:12:51,440 Jeg foreslo er 32 biter, eller kanskje 64 hvis du bruker en dobbel. 1479 01:12:51,440 --> 01:12:53,070 Men det er fortsatt begrenset. 1480 01:12:53,070 --> 01:12:57,070 >> Og fangsten er at hvis du kan sette et uendelig antall tall 1481 01:12:57,070 --> 01:12:59,460 etter desimaltegnet, det er ingen måte du 1482 01:12:59,460 --> 01:13:02,690 kan representere alle mulige tall som vi ble undervist 1483 01:13:02,690 --> 01:13:04,990 i grunnskolen kan eksistere i verden. 1484 01:13:04,990 --> 01:13:08,870 En datamaskin, i hovedsak, må velge et delsett av disse tallene 1485 01:13:08,870 --> 01:13:10,200 å representere nøyaktig. 1486 01:13:10,200 --> 01:13:12,450 >> Nå kan datamaskinen runde kanskje litt, 1487 01:13:12,450 --> 01:13:17,900 og kan tillate deg å omtrent butikken så mange du kan ønske deg. 1488 01:13:17,900 --> 01:13:20,940 Men akkurat intuitivt, hvis du ha et endelig antall biter, 1489 01:13:20,940 --> 01:13:24,560 du kan bare permutere dem i så mange begrensede måter. 1490 01:13:24,560 --> 01:13:26,570 Så du kan ikke muligens bruke et endelig antall 1491 01:13:26,570 --> 01:13:29,880 av permutasjon av biter, mønstre av nuller og enere, 1492 01:13:29,880 --> 01:13:32,940 for å representere en uendelig antall tall, 1493 01:13:32,940 --> 01:13:37,370 noe som antyder at datamaskiner kanskje meget vel være å lyve for oss noen ganger. 1494 01:13:37,370 --> 01:13:38,770 >> Faktisk, la oss gjøre dette. 1495 01:13:38,770 --> 01:13:41,239 La meg gå tilbake til CS50 IDE. 1496 01:13:41,239 --> 01:13:43,030 La meg gå videre og lage et lite program 1497 01:13:43,030 --> 01:13:47,940 kalt upresisjon, for å vise at datamaskiner er faktisk upresis. 1498 01:13:47,940 --> 01:13:51,910 >> Og la meg gå videre og begynne med noe av det koden fra før, 1499 01:13:51,910 --> 01:13:53,830 og nå bare gjøre følgende. 1500 01:13:53,830 --> 01:14:03,640 La meg gå videre og gjøre printf, prosent f, backslash n, 1 delt på 10. 1501 01:14:03,640 --> 01:14:07,430 Med andre ord, la oss dykke i dypere 1/10, som en og delt på 10. 1502 01:14:07,430 --> 01:14:09,760 Sikkert, kan en datamaskin representerer 1/10. 1503 01:14:09,760 --> 01:14:13,620 >> Så la oss gå videre og gjøre unøyaktighet. 1504 01:14:13,620 --> 01:14:14,390 La oss se. 1505 01:14:14,390 --> 01:14:16,210 Format angir Double. 1506 01:14:16,210 --> 01:14:18,160 Men argumentet har type int. 1507 01:14:18,160 --> 01:14:19,040 Hva skjer? 1508 01:14:19,040 --> 01:14:21,970 >> Åh, det er interessant så en lekse lært fra før. 1509 01:14:21,970 --> 01:14:26,050 Jeg sier hei, datamaskin showet meg en flåte med prosent f. 1510 01:14:26,050 --> 01:14:28,200 Men jeg gir det 2 ints. 1511 01:14:28,200 --> 01:14:31,120 Så det viser seg, kan jeg fikse dette i et par måter. 1512 01:14:31,120 --> 01:14:38,430 >> Jeg kunne bare slå ett til 1.0, og 10 til 10,0, noe som ville faktisk 1513 01:14:38,430 --> 01:14:42,390 har effekten av å konvertere dem inn floats-- fortsatt forhåpentligvis 1514 01:14:42,390 --> 01:14:43,180 samme nummer. 1515 01:14:43,180 --> 01:14:45,880 Eller det viser seg at det er noe vi vil se igjen før lenge. 1516 01:14:45,880 --> 01:14:47,170 Du kan kaste tallene. 1517 01:14:47,170 --> 01:14:49,880 >> Du kan bruke denne parentes uttrykk, kan du si, 1518 01:14:49,880 --> 01:14:52,560 hei, datamaskin, ta denne 10, som jeg vet er en int. 1519 01:14:52,560 --> 01:14:54,660 Men behandle den, vær så snill, som om det er en flåte. 1520 01:14:54,660 --> 01:14:56,680 Men dette føles unødvendig komplisert. 1521 01:14:56,680 --> 01:14:59,040 >> For vårt formål i dag, la oss bare bokstavelig 1522 01:14:59,040 --> 01:15:02,700 gjør dem flytende punkt verdier med et desimaltegn som dette. 1523 01:15:02,700 --> 01:15:07,060 La meg gå videre og reprise, gjør upresishet, god, dot slash 1524 01:15:07,060 --> 01:15:08,870 unøyaktighet, skriv. 1525 01:15:08,870 --> 01:15:10,990 OK, vi ser bra. 1526 01:15:10,990 --> 01:15:18,194 >> 1 delt på 10, ifølge min Mac her, er faktisk 0,100000. 1527 01:15:18,194 --> 01:15:21,360 Nå ble jeg undervist i grunnskolen der bør være et uendelig antall 0-er. 1528 01:15:21,360 --> 01:15:23,151 Så la oss i det minste prøve for å se noen av dem. 1529 01:15:23,151 --> 01:15:26,770 Det viser seg at printf er litt avansert fremdeles enn vi har brukt. 1530 01:15:26,770 --> 01:15:30,890 Det viser seg at du ikke trenger å spesifisere bare prosent f, eller bare prosent i. 1531 01:15:30,890 --> 01:15:33,830 Du kan faktisk spesifisere noen kontroll alternativer her. 1532 01:15:33,830 --> 01:15:36,470 >> Nærmere bestemt, jeg kommer å si hei, printf, 1533 01:15:36,470 --> 01:15:39,660 faktisk vise meg 10 desimaler. 1534 01:15:39,660 --> 01:15:40,820 Så det ser litt rart. 1535 01:15:40,820 --> 01:15:42,845 Men du sier prosent, dot, hvor mange tall 1536 01:15:42,845 --> 01:15:44,970 du ønsker å se etter desimaltegn og deretter f 1537 01:15:44,970 --> 01:15:48,340 for flat, bare fordi det er hva dokumentasjonen sier. 1538 01:15:48,340 --> 01:15:50,080 La meg gå videre og lagre det. 1539 01:15:50,080 --> 01:15:52,460 >> Og legg merke til også, jeg får lei av å måtte skrive ting. 1540 01:15:52,460 --> 01:15:55,900 Så jeg bare sette den opp og pil ned på mine nøkler her. 1541 01:15:55,900 --> 01:15:58,710 Og hvis jeg fortsetter å trykke opp, kan se alle kommandoene 1542 01:15:58,710 --> 01:16:01,090 som jeg gjorde, eller feil gjort. 1543 01:16:01,090 --> 01:16:04,630 >> Og jeg kommer til å gå videre nå og faktisk ikke bruke det, tydeligvis. 1544 01:16:04,630 --> 01:16:11,416 Gjør unøyaktig, dot slash imprecision-- så 1545 01:16:11,416 --> 01:16:13,290 hva jeg ble undervist i grunnskolen sjekker ut. 1546 01:16:13,290 --> 01:16:19,010 Selv om jeg skriver det ut til 10 desimal plasserer den faktisk er 0,10000. 1547 01:16:19,010 --> 01:16:19,840 Men vet du hva? 1548 01:16:19,840 --> 01:16:21,150 >> La oss få litt grådig. 1549 01:16:21,150 --> 01:16:23,990 La oss si, for eksempel, vis meg 55 poeng etter desimaltegnet. 1550 01:16:23,990 --> 01:16:26,160 La oss virkelig ta dette programmere for en snurr. 1551 01:16:26,160 --> 01:16:31,170 La meg remake det med make upresishet, dot slash, unøyaktighet. 1552 01:16:31,170 --> 01:16:32,390 >> Og her går vi. 1553 01:16:32,390 --> 01:16:34,420 Barndommen var en løgn. 1554 01:16:34,420 --> 01:16:48,410 Tilsynelatende, 1 dividert med 10 er faktisk 0.100000000000000005551115123-- 1555 01:16:48,410 --> 01:16:49,740 >> Hva skjer? 1556 01:16:49,740 --> 01:16:53,360 Vel, det viser seg, hvis du slags se langt nok ut i den underliggende 1557 01:16:53,360 --> 01:16:55,950 representasjon av dette nummer, er det faktisk 1558 01:16:55,950 --> 01:17:00,400 er ikke akkurat 1/10, eller 0,1 og et uendelig antall nuller. 1559 01:17:00,400 --> 01:17:01,630 Nå, hvorfor er det? 1560 01:17:01,630 --> 01:17:06,250 >> Også, selv om dette er en enkel nummer til oss mennesker, en delt med 10, 1561 01:17:06,250 --> 01:17:10,910 det er fortsatt en av uendelig mange tall som vi kunne tenke seg. 1562 01:17:10,910 --> 01:17:14,490 Men en datamaskin kan bare representere begrenset mange så tall. 1563 01:17:14,490 --> 01:17:18,710 Og så, effektivt, hva Datamaskinen viser oss er dens nærmeste 1564 01:17:18,710 --> 01:17:22,940 tilnærming til antall vi ønsker å tro er 1/10, 1565 01:17:22,940 --> 01:17:27,760 eller egentlig 0,10000 ad infinitum. 1566 01:17:27,760 --> 01:17:30,425 >> Snarere, skjønt, er dette så nær som det kan få. 1567 01:17:30,425 --> 01:17:32,300 Og, ja, hvis du ser under panseret, 1568 01:17:32,300 --> 01:17:37,050 som vi er her ved å se 55 sifre etter desimaltegnet, 1569 01:17:37,050 --> 01:17:39,990 vi faktisk se at virkeligheten. 1570 01:17:39,990 --> 01:17:42,610 Nå som en side, hvis du har noensinne sett movie-- 1571 01:17:42,610 --> 01:17:45,780 de fleste av dere sikkert haven't-- men Superman 3 for noen år siden, 1572 01:17:45,780 --> 01:17:49,500 Richard Pryor i hovedsak utnyttes dette realitet i hans selskap å stjele mye 1573 01:17:49,500 --> 01:17:53,500 av fraksjoner og fraksjoner av pennies, fordi company-- som jeg husker, 1574 01:17:53,500 --> 01:17:57,210 det har vært en while-- var i hovedsak kaste vekk alt som ikke passet 1575 01:17:57,210 --> 01:17:58,790 inn begrepet cent. 1576 01:17:58,790 --> 01:18:01,480 >> Men hvis du legger opp alle disse bitte, bitte små, små tall igjen, 1577 01:18:01,480 --> 01:18:04,960 og igjen, og igjen, kan du, som i hans tilfelle, gjør en god sum penger. 1578 01:18:04,960 --> 01:18:08,010 >> Den samme ideen ble dratt ut av en nyere, men likevel nå eldre 1579 01:18:08,010 --> 01:18:10,500 film, kalt Office Space, hvor gutta i den filmen, 1580 01:18:10,500 --> 01:18:13,501 gjorde det samme, skrudd den opp helt, endte opp med altfor mye 1581 01:18:13,501 --> 01:18:14,666 penger i sin bankkonto. 1582 01:18:14,666 --> 01:18:15,800 Det var veldig mistenkelig. 1583 01:18:15,800 --> 01:18:19,290 Men ved slutten av dagen, unøyaktighet er alt rundt oss. 1584 01:18:19,290 --> 01:18:22,240 >> Og som også kan være skremmende tilfelle. 1585 01:18:22,240 --> 01:18:25,590 Det viser seg at Superman 3 og Office Space til side, det 1586 01:18:25,590 --> 01:18:28,460 kan være noen svært reell verdens ramifications 1587 01:18:28,460 --> 01:18:32,290 av realitetene i upresise representasjon av data 1588 01:18:32,290 --> 01:18:34,770 at selv vi mennesker til denne dagen ikke nødvendigvis 1589 01:18:34,770 --> 01:18:38,230 forstår så godt som vi burde, eller husker så ofte som vi burde. 1590 01:18:38,230 --> 01:18:42,950 Og, ja, er følgende klipp fra en titt på noen svært virkelige verden 1591 01:18:42,950 --> 01:18:47,730 konsekvensene av hva som skjer hvis du ikke setter pris på unøyaktighet som 1592 01:18:47,730 --> 01:18:50,065 kan skje i tall representasjon. 1593 01:18:50,065 --> 01:18:51,300 >> [VIDEO PLAYBACK] 1594 01:18:51,300 --> 01:18:55,620 >> -Computers, Vi har alle kommet til å akseptere de ofte frustrerende problemer som 1595 01:18:55,620 --> 01:19:00,310 gå med mer testing bugs, virus, og programvare glitches, 1596 01:19:00,310 --> 01:19:03,130 for liten pris å betale for enkelhets skyld. 1597 01:19:03,130 --> 01:19:07,800 Men i high tech og høy hastighet militære og romprogram applikasjoner, 1598 01:19:07,800 --> 01:19:12,800 den minste kan problemet foredles til katastrofe. 1599 01:19:12,800 --> 01:19:18,900 >> På den 4 juni 1996, forskere forberedt å lansere en ubemannet Ariane 5 rakett. 1600 01:19:18,900 --> 01:19:21,220 Det var bærer vitenskapelig satellitter konstruert 1601 01:19:21,220 --> 01:19:24,600 å etablere nøyaktig hvordan Jordens magnetfelt samhandler 1602 01:19:24,600 --> 01:19:27,410 med solvind. 1603 01:19:27,410 --> 01:19:30,800 Raketten ble bygget for European Space Agency, 1604 01:19:30,800 --> 01:19:34,370 og løftet av fra sitt anlegg på kysten av Fransk Guyana. 1605 01:19:34,370 --> 01:19:37,540 >> -På Ca 37 sekunder inn flyturen, de første 1606 01:19:37,540 --> 01:19:39,270 la merke til noe gikk galt. 1607 01:19:39,270 --> 01:19:42,250 Dysene ble svinge i en måte de egentlig ikke burde. 1608 01:19:42,250 --> 01:19:46,580 Rundt 40 sekunder inn i fly, klart, bilen var i trøbbel. 1609 01:19:46,580 --> 01:19:48,850 >> Og det er når de har gjort en beslutning om å ødelegge det. 1610 01:19:48,850 --> 01:19:52,780 Utvalget verneleder, med enorm guts, trykket på knappen, 1611 01:19:52,780 --> 01:19:58,150 blåste opp raketten, før det kunne bli en fare for offentlig sikkerhet. 1612 01:19:58,150 --> 01:20:01,060 >> -Dette Var jomfru reise Ariane 5. 1613 01:20:01,060 --> 01:20:03,960 Og dens ødeleggelse tok sted på grunn av en feil 1614 01:20:03,960 --> 01:20:05,822 innebygd i raketten programvare. 1615 01:20:05,822 --> 01:20:08,280 -Den Problem på Ariane var at det var et tall som 1616 01:20:08,280 --> 01:20:10,600 kreves 64 bits for å uttrykke. 1617 01:20:10,600 --> 01:20:13,590 Og de ønsket å konvertere det til en 16-bits nummer. 1618 01:20:13,590 --> 01:20:15,610 De antok at nummer ble aldri kommer 1619 01:20:15,610 --> 01:20:20,980 å være meget stor, at de fleste sifre i en 64-bits tall var nuller. 1620 01:20:20,980 --> 01:20:22,440 De var galt. 1621 01:20:22,440 --> 01:20:25,060 >> -Den Manglende evne til en program for å ta imot 1622 01:20:25,060 --> 01:20:29,510 den type tall som genereres av en annen var ved roten av svikt. 1623 01:20:29,510 --> 01:20:34,350 Programvareutvikling hadde blitt en svært kostbare delen av ny teknologi. 1624 01:20:34,350 --> 01:20:38,140 Ariane rakett har vært veldig vellykket, så mye av programvaren 1625 01:20:38,140 --> 01:20:41,550 opprettet for den ble også brukes i Ariane 5. 1626 01:20:41,550 --> 01:20:47,940 >> -Den Grunnleggende problemet var at Ariane 5 var raskere, akselerert raskere. 1627 01:20:47,940 --> 01:20:51,450 Og programvaren hadde ikke sto for det. 1628 01:20:51,450 --> 01:20:55,060 >> -Den Ødeleggelse av raketten var en stor økonomisk katastrofe, 1629 01:20:55,060 --> 01:20:58,790 alt på grunn av en liten programvarefeil. 1630 01:20:58,790 --> 01:21:01,210 Men dette var ikke den første data konvertering problemer tids 1631 01:21:01,210 --> 01:21:04,820 hadde plaget moderne rakett-teknologi. 1632 01:21:04,820 --> 01:21:08,050 >> -I 1991, med start av den første Gulf-krigen, 1633 01:21:08,050 --> 01:21:10,570 patriot Missile opplevd en lignende type 1634 01:21:10,570 --> 01:21:12,800 av antall konvertering problem. 1635 01:21:12,800 --> 01:21:16,090 Og som et resultat av 28 personer, 28 amerikanske soldater, 1636 01:21:16,090 --> 01:21:19,080 ble drept, og om 100 andre såret, 1637 01:21:19,080 --> 01:21:22,780 når Patriot, som var ment for å beskytte mot innkommende scuds, 1638 01:21:22,780 --> 01:21:25,830 ikke klarte å avfyre ​​en rakett. 1639 01:21:25,830 --> 01:21:31,670 >> -Når Irak invaderte Kuwait, og Amerika lansert Desert Storm i begynnelsen av 1991, 1640 01:21:31,670 --> 01:21:35,780 Patriot Missile batteriene ble utplassert å beskytte Saudi Arabia og Israel 1641 01:21:35,780 --> 01:21:39,230 fra irakiske Scud rakettangrep. 1642 01:21:39,230 --> 01:21:43,810 The Patriot er en amerikansk mellomdistanse overflaten til luftsystem, produsert 1643 01:21:43,810 --> 01:21:45,770 av Raytheon selskapet. 1644 01:21:45,770 --> 01:21:52,340 >> -Den Størrelsen på Patriot interceptor selv er ca omtrent 20 fot lang. 1645 01:21:52,340 --> 01:21:55,230 Og den veier ca 2000 pounds. 1646 01:21:55,230 --> 01:21:59,320 Og det bærer et stridshode av om, Jeg tror det er omtrent 150 pounds. 1647 01:21:59,320 --> 01:22:03,930 Og stridshodet i seg selv en høy eksplosiv, som 1648 01:22:03,930 --> 01:22:07,330 har fragmenter rundt det. 1649 01:22:07,330 --> 01:22:11,680 Hylsteret av stridshodet er laget for å fungere som haggel. 1650 01:22:11,680 --> 01:22:14,110 >> -De Missiler er gjennomført fire per container, 1651 01:22:14,110 --> 01:22:17,130 og transporteres av en semitrailer. 1652 01:22:17,130 --> 01:22:24,930 >> -The Patriot anti-missilsystem går tilbake minst 20 år nå. 1653 01:22:24,930 --> 01:22:28,420 Det ble opprinnelig utviklet som et luftforsvar rakett 1654 01:22:28,420 --> 01:22:30,720 å skyte ned fiendtlige fly. 1655 01:22:30,720 --> 01:22:34,500 I den første Gulf-krigen, når den krigen kom, 1656 01:22:34,500 --> 01:22:39,745 Hæren ønsket å bruke den til å skyte ned scuds, ikke fly. 1657 01:22:39,745 --> 01:22:43,620 >> Den irakiske Air Force var ikke så mye av et problem. 1658 01:22:43,620 --> 01:22:46,670 Men hæren ble bekymret scuds. 1659 01:22:46,670 --> 01:22:50,170 Og så de prøvde å oppgradere Patriot. 1660 01:22:50,170 --> 01:22:52,800 >> -Intercepting En fiende rakett reiser på mach 5 1661 01:22:52,800 --> 01:22:55,830 skulle være utfordrende nok. 1662 01:22:55,830 --> 01:22:58,490 Men da Patriot ble styrtet inn i tjeneste, 1663 01:22:58,490 --> 01:23:02,860 Hæren var ikke klar over en Irakiske modifikasjon som gjorde 1664 01:23:02,860 --> 01:23:05,930 sine scuds nesten umulig å treffe. 1665 01:23:05,930 --> 01:23:10,740 >> -Hva Skjedde er scuds som skulle komme inn var ustabil. 1666 01:23:10,740 --> 01:23:11,692 De ble vingler. 1667 01:23:11,692 --> 01:23:14,910 Grunnen til dette var irakerne, for 1668 01:23:14,910 --> 01:23:18,280 å få 600 kilometer ut av en 300 kilometer 1669 01:23:18,280 --> 01:23:21,700 range rakett, tok vekt ut av frontstridshode. 1670 01:23:21,700 --> 01:23:23,390 De gjorde stridshodet lettere. 1671 01:23:23,390 --> 01:23:27,330 >> Så nå patriot er prøver å komme på Scud. 1672 01:23:27,330 --> 01:23:30,230 Og mesteparten av tiden, overveldende flertall av tiden, 1673 01:23:30,230 --> 01:23:32,940 det ville bare fly av Scud. 1674 01:23:32,940 --> 01:23:37,260 Når systemoperatørene Patriot innså Patriot savnet sitt mål, 1675 01:23:37,260 --> 01:23:41,690 de detonerte Patriot stridshode for å unngå mulige tap hvis det 1676 01:23:41,690 --> 01:23:44,570 ble tillatt å falle ned på bakken. 1677 01:23:44,570 --> 01:23:48,790 >> -Det Var hva folk flest så, de store ildkuler på himmelen, 1678 01:23:48,790 --> 01:23:54,550 og misforstått som avskjærer av Scud-stridshoder. 1679 01:23:54,550 --> 01:23:56,630 >> -Selv Om i natt himmel, Patriots dukket 1680 01:23:56,630 --> 01:24:00,370 å være vellykket ødelegge scuds, i Dhahran, 1681 01:24:00,370 --> 01:24:03,360 det kan være noen feil om ytelsen. 1682 01:24:03,360 --> 01:24:07,970 Der patriot radar system mistet oversikten over innkommende Scud, 1683 01:24:07,970 --> 01:24:10,721 og aldri lansert på grunn til en programvare feil. 1684 01:24:10,721 --> 01:24:14,090 1685 01:24:14,090 --> 01:24:18,940 Det var israelerne som først oppdaget at jo lenger var systemet på, 1686 01:24:18,940 --> 01:24:22,690 jo større tidsavvik ble, på grunn av en klokke innleiret 1687 01:24:22,690 --> 01:24:24,810 i systemet datamaskin. 1688 01:24:24,810 --> 01:24:28,210 >> -Om To uker før tragedien i Dhahran, 1689 01:24:28,210 --> 01:24:30,770 israelerne rapportert til Forsvarsdepartementet 1690 01:24:30,770 --> 01:24:32,590 at systemet var å miste tid. 1691 01:24:32,590 --> 01:24:35,360 Etter ca åtte timer eller løping, de la merke til at systemet 1692 01:24:35,360 --> 01:24:37,720 var blitt merkbart mindre nøyaktig. 1693 01:24:37,720 --> 01:24:41,900 Forsvarsdepartementet svarte med å fortelle alle Patriot batterier 1694 01:24:41,900 --> 01:24:44,950 å ikke la systemene på for en lang tid. 1695 01:24:44,950 --> 01:24:49,160 De sa aldri hva en lang tid var-- åtte timer, 10 timer, 1.000 timer. 1696 01:24:49,160 --> 01:24:51,360 Ingen visste. 1697 01:24:51,360 --> 01:24:53,380 >> -The Patriot batteri stasjonert ved brakkene 1698 01:24:53,380 --> 01:24:58,350 på Dhahran og dens feil interne klokke hadde vært på over 100 timer 1699 01:24:58,350 --> 01:25:01,670 på natten av 25 februar. 1700 01:25:01,670 --> 01:25:05,917 >> -Det Spores tid med en nøyaktighet av omtrent en tiendedel av et sekund. 1701 01:25:05,917 --> 01:25:08,000 Nå, en tidel av et sekund er et interessant tall, 1702 01:25:08,000 --> 01:25:11,920 fordi det ikke kan uttrykkes i binær nøyaktig som 1703 01:25:11,920 --> 01:25:16,820 betyr det ikke kan uttrykkes nøyaktig i enhver moderne digital datamaskin. 1704 01:25:16,820 --> 01:25:18,540 Det er vanskelig å tro. 1705 01:25:18,540 --> 01:25:21,210 >> Men bruker dette som et eksempel. 1706 01:25:21,210 --> 01:25:23,540 La oss ta nummer én tredjedel. 1707 01:25:23,540 --> 01:25:27,350 En tredjedel kan ikke bli uttrykt i desimal nøyaktig. 1708 01:25:27,350 --> 01:25:32,080 En tredjedel er 0,333 pågått i det uendelige. 1709 01:25:32,080 --> 01:25:36,480 >> Det er ingen måte å gjøre det med absolutt nøyaktighet i desimal. 1710 01:25:36,480 --> 01:25:39,560 Det er akkurat den type problem som skjedde i Patriot. 1711 01:25:39,560 --> 01:25:44,100 Jo lenger systemet løp, den verre tiden feilen ble. 1712 01:25:44,100 --> 01:25:48,890 >> -Etter 100 timers drift, feil i tiden var bare om lag en tredel 1713 01:25:48,890 --> 01:25:50,600 sekund. 1714 01:25:50,600 --> 01:25:54,210 Men når det gjelder å målrette en rakett reiser på mach 5, 1715 01:25:54,210 --> 01:25:58,710 Det resulterte i en relativ feil på over 600 meter. 1716 01:25:58,710 --> 01:26:02,120 Det ville være en fatal feil for soldatene på hva 1717 01:26:02,120 --> 01:26:08,940 skjedde det en Scud lansering var oppdaget av tidlig varsling satellitter 1718 01:26:08,940 --> 01:26:12,860 og de visste at Scud var Kommer i sin generelle retningen. 1719 01:26:12,860 --> 01:26:15,320 De visste ikke hvor det kom. 1720 01:26:15,320 --> 01:26:18,250 >> -Det Var nå opp til radaren komponent av Patriot-systemet 1721 01:26:18,250 --> 01:26:23,190 forsvare Dhahran å finne og holde spor av den innkommende fiendtlige missilet. 1722 01:26:23,190 --> 01:26:24,609 >> -Den Radar var veldig smart. 1723 01:26:24,609 --> 01:26:26,650 Det ville faktisk spore posisjonen til Scud, 1724 01:26:26,650 --> 01:26:30,350 og deretter forutse hvor det sannsynligvis vil være det neste gang radaren sendt 1725 01:26:30,350 --> 01:26:31,420 en puls ut. 1726 01:26:31,420 --> 01:26:33,110 Det ble kalt en rekke gate. 1727 01:26:33,110 --> 01:26:37,660 >> -Da, Når Patriot bestemmer nok tid har 1728 01:26:37,660 --> 01:26:42,450 vedtatt å gå tilbake og sjekke neste plassering for denne oppdagede objektet, 1729 01:26:42,450 --> 01:26:43,600 det går tilbake. 1730 01:26:43,600 --> 01:26:48,650 Så når det gikk tilbake til feil sted, ser det da ingen objekt. 1731 01:26:48,650 --> 01:26:52,160 Og det bestemmer seg for at det ikke var noen objekt, det var en falsk deteksjon, 1732 01:26:52,160 --> 01:26:53,930 og faller sporet. 1733 01:26:53,930 --> 01:26:57,030 >> -Den Innkommende Scud forsvant fra radarskjermen. 1734 01:26:57,030 --> 01:27:00,260 Og sekunder senere, slengte inn i festningen. 1735 01:27:00,260 --> 01:27:06,150 Den Scud drepte 28, og var den siste en avfyrt under den første Golfkrigen. 1736 01:27:06,150 --> 01:27:11,960 >> Tragisk nok den oppdaterte programvaren kom til Dhahran neste dag. 1737 01:27:11,960 --> 01:27:14,930 Programvaren feil hadde vært fast, lukking 1738 01:27:14,930 --> 01:27:19,806 ett kapittel i den urolige Historien om Patriot rakett. 1739 01:27:19,806 --> 01:27:20,729 >> [VIDEO PLAYBACK] 1740 01:27:20,729 --> 01:27:23,520 DAVID J. MALAN: Så dette er alt for si at disse problemene av overløp 1741 01:27:23,520 --> 01:27:25,860 og unøyaktighet er altfor reell. 1742 01:27:25,860 --> 01:27:26,920 Så hvordan kom vi hit? 1743 01:27:26,920 --> 01:27:28,895 Vi begynte med bare snakker om printf. 1744 01:27:28,895 --> 01:27:31,270 Igjen, denne funksjon som skriver noe til skjermen, 1745 01:27:31,270 --> 01:27:33,450 og vi introduserte etterpå noen andre funksjoner 1746 01:27:33,450 --> 01:27:34,945 fra den såkalte CS50 bibliotek. 1747 01:27:34,945 --> 01:27:36,910 Og vi vil fortsette å se disse i rett tid. 1748 01:27:36,910 --> 01:27:40,760 Og vi, spesielt brukt get streng, og få int, og nå får også flyte, 1749 01:27:40,760 --> 01:27:44,410 og atter andre fortsatt vil vi møte og bruker oss selv før lenge. 1750 01:27:44,410 --> 01:27:47,220 >> Men til tider, har vi allerede sett et behov 1751 01:27:47,220 --> 01:27:50,520 til å lagre hva disse funksjonene hånd tilbake? 1752 01:27:50,520 --> 01:27:52,920 De gi oss tilbake en streng, eller en int, eller en flåte. 1753 01:27:52,920 --> 01:27:56,070 Og noen ganger trenger vi å sette det streng, eller int eller float, et sted. 1754 01:27:56,070 --> 01:28:00,100 >> Og for å lagre disse tingene, husker bare som i Scratch, har vi variabler. 1755 01:28:00,100 --> 01:28:03,260 Men i motsetning til i Scratch, i C har vi faktiske typer 1756 01:28:03,260 --> 01:28:05,530 av variables-- data typer, flere generally-- 1757 01:28:05,530 --> 01:28:08,640 blant dem, en streng, en int, en flyte, og disse andre fortsatt. 1758 01:28:08,640 --> 01:28:12,321 >> Og så når vi erklære variabler i C, vi må erklære våre datatyper. 1759 01:28:12,321 --> 01:28:14,820 Dette er ikke noe vi vil må gjøre senere i semesteret 1760 01:28:14,820 --> 01:28:16,810 som vi overgangen til andre språk. 1761 01:28:16,810 --> 01:28:19,610 Men for nå, trenger vi til a priori på forhånd, 1762 01:28:19,610 --> 01:28:24,370 forklare til datamaskinen hva slags av variable ønsker vi å gi oss. 1763 01:28:24,370 --> 01:28:27,290 >> Nå, i mellomtiden, for å skrive ut slike datatyper, 1764 01:28:27,290 --> 01:28:29,570 vi har å fortelle printf hva du kan forvente. 1765 01:28:29,570 --> 01:28:32,450 Og vi så prosent s for strykere, og prosent i for heltall, 1766 01:28:32,450 --> 01:28:33,790 og noen få andre allerede. 1767 01:28:33,790 --> 01:28:37,237 Og de er rett og slett krav for visuell presentasjon 1768 01:28:37,237 --> 01:28:38,070 av denne informasjonen. 1769 01:28:38,070 --> 01:28:42,080 >> Og hver av disse kan faktisk være parametrized eller forskjøvet på noen måte, 1770 01:28:42,080 --> 01:28:45,370 Hvis du ønsker å ytterligere kontroll av utskriftstypen som du får. 1771 01:28:45,370 --> 01:28:49,604 Og, faktisk, viser det seg at ikke bare er det backslash n for en ny linje. 1772 01:28:49,604 --> 01:28:52,520 Det er noe annet som kalles omvendt skråstrek r for et linjeskift, som 1773 01:28:52,520 --> 01:28:54,360 er mer beslektet med en old school skrivemaskin, 1774 01:28:54,360 --> 01:28:57,690 og også Windows brukt i mange år. 1775 01:28:57,690 --> 01:28:59,690 >> Det er backslash t for faner. 1776 01:28:59,690 --> 01:29:03,170 Det viser seg at hvis du ønsker å dobbel sitat inne i en streng, 1777 01:29:03,170 --> 01:29:05,000 Husk at vi har brukt double quote dobbel 1778 01:29:05,000 --> 01:29:07,900 sitat på venstre og høyre ender av de strenger hittil. 1779 01:29:07,900 --> 01:29:09,420 Det ville synes å forvirre ting. 1780 01:29:09,420 --> 01:29:12,503 >> Hvis du ønsker å sette en dobbel sitat i midt i en string-- og, faktisk, 1781 01:29:12,503 --> 01:29:13,670 det er forvirrende å se. 1782 01:29:13,670 --> 01:29:17,120 Og så må du rømme, så å snakke, en dobbel sitat med noe 1783 01:29:17,120 --> 01:29:18,860 som, bokstavelig talt, backslash dobbel sitat. 1784 01:29:18,860 --> 01:29:20,230 Og det er noen andre fortsatt. 1785 01:29:20,230 --> 01:29:24,540 Og vi vil se mer av dem i faktisk bruk før lenge. 1786 01:29:24,540 --> 01:29:27,930 >> Så la oss nå overgang fra data, og representasjon, 1787 01:29:27,930 --> 01:29:30,820 og aritmetiske operatører, alle som ga oss noen bygning 1788 01:29:30,820 --> 01:29:32,070 blokker med å spille. 1789 01:29:32,070 --> 01:29:34,481 Men la oss nå faktisk gi oss resten av vokabular 1790 01:29:34,481 --> 01:29:36,230 at vi allerede hadde forrige uke med Scratch 1791 01:29:36,230 --> 01:29:39,350 ved å ta en titt på noen andre konstruksjoner i C-- ikke alle av dem. 1792 01:29:39,350 --> 01:29:41,680 Men ideene vi er om å se egentlig bare 1793 01:29:41,680 --> 01:29:45,610 å understreke oversettelsen fra ett språk, Scratch, til en annen, C. 1794 01:29:45,610 --> 01:29:48,470 >> Og over tid, vil vi plukke opp flere verktøy for vår verktøykasse, 1795 01:29:48,470 --> 01:29:49,820 så å si, syntaktisk. 1796 01:29:49,820 --> 01:29:54,190 Og, ja, vil du se at ideene er nå ganske kjent fra forrige uke. 1797 01:29:54,190 --> 01:29:55,200 Så la oss gjøre dette. 1798 01:29:55,200 --> 01:29:58,870 >> La oss gå videre og piske opp et program som faktisk bruker noen uttrykk, 1799 01:29:58,870 --> 01:30:00,720 en boolsk uttrykk. 1800 01:30:00,720 --> 01:30:02,810 La meg gå videre her og opprette en ny fil. 1801 01:30:02,810 --> 01:30:06,090 Jeg vil kalle dette condition.c. 1802 01:30:06,090 --> 01:30:09,350 >> La meg gå videre og inkluderer CS50 biblioteket. 1803 01:30:09,350 --> 01:30:12,640 Og la meg gå videre og omfatte standard IO.h for våre funksjoner, 1804 01:30:12,640 --> 01:30:14,690 og printf, og henholdsvis mer. 1805 01:30:14,690 --> 01:30:18,900 La meg gi meg selv at standardtekst av int main ugyldig, hvis forklaring vi vil 1806 01:30:18,900 --> 01:30:20,360 komme tilbake til i fremtiden. 1807 01:30:20,360 --> 01:30:23,820 >> Nå la meg gå videre og gi meg selv en int via get int. 1808 01:30:23,820 --> 01:30:25,970 Så la meg gå videre og gjøre dette. 1809 01:30:25,970 --> 01:30:30,150 Jeg ønsker å si om jeg er less-- la oss skille mellom positive, negative 1810 01:30:30,150 --> 01:30:31,260 eller nullverdier. 1811 01:30:31,260 --> 01:30:36,630 >> Så hvis jeg er mindre enn null, la meg bare har dette programmet bare si: 1812 01:30:36,630 --> 01:30:42,370 negativ, backslash n, annet hvis jeg er større enn null. 1813 01:30:42,370 --> 01:30:47,030 Nå er jeg selvsagt kommer til å si printf positiv, backslash n. 1814 01:30:47,030 --> 01:30:50,690 Og så ellers if-- jeg kunne gjøre dette. 1815 01:30:50,690 --> 01:30:53,410 >> Jeg kunne gjøre hvis jeg er lik 0. 1816 01:30:53,410 --> 01:30:55,840 Men jeg vil være å gjøre på Minst en feil allerede. 1817 01:30:55,840 --> 01:30:59,480 Husker at likhetstegnet er ikke lik, som vi mennesker vet det. 1818 01:30:59,480 --> 01:31:01,010 >> Men det er oppdraget operatør. 1819 01:31:01,010 --> 01:31:05,640 Og vi ønsker ikke å ta 0 på høyre og sette den i jeg til venstre. 1820 01:31:05,640 --> 01:31:11,810 Så for å unngå denne forvirringen, eller kanskje misbruk av likhetstegnet, 1821 01:31:11,810 --> 01:31:14,740 mennesker bestemte seg for noen år siden at i mange programmeringsspråk 1822 01:31:14,740 --> 01:31:18,000 når du ønsker å sjekke for likestilling mellom venstre og høyre, 1823 01:31:18,000 --> 01:31:19,635 du faktisk bruker lik likemenn. 1824 01:31:19,635 --> 01:31:21,010 Så du treffer likhetstegnet to ganger. 1825 01:31:21,010 --> 01:31:25,600 Når du vil tilordne fra høyre til venstre, bruker du et enkelt likhetstegn. 1826 01:31:25,600 --> 01:31:29,360 Så vi kunne gjøre dette-- annet hvis jeg er lik lik null. 1827 01:31:29,360 --> 01:31:31,710 >> Jeg kunne da gå og åpne mine klammeparentes, 1828 01:31:31,710 --> 01:31:36,087 og si: printf 0, backslash n, gjort. 1829 01:31:36,087 --> 01:31:38,170 Men husk hvordan disse gafler i veien kan fungere. 1830 01:31:38,170 --> 01:31:39,836 Og, egentlig, bare tenke på logikk. 1831 01:31:39,836 --> 01:31:41,510 i er et tall. 1832 01:31:41,510 --> 01:31:43,320 Det er et heltall, spesielt. 1833 01:31:43,320 --> 01:31:48,600 Og det betyr at det kommer til å bli mindre enn 0 eller større enn 0, eller 0. 1834 01:31:48,600 --> 01:31:51,600 Så det er litt av denne implisitt standard sak. 1835 01:31:51,600 --> 01:31:54,920 >> Og så vi kunne, akkurat som Scratch, dispensere med annet hvis, 1836 01:31:54,920 --> 01:31:55,747 og bare si annet. 1837 01:31:55,747 --> 01:31:57,830 Logisk, hvis du programmerer vet det er bare 1838 01:31:57,830 --> 01:32:01,635 tre bøtter inn som en scenario kan fall-- den første, 1839 01:32:01,635 --> 01:32:03,510 den andre eller den tredje i denne case-- ikke 1840 01:32:03,510 --> 01:32:07,100 gidder å legge den ekstra presisjon og den ytterligere logikk der. 1841 01:32:07,100 --> 01:32:09,690 Bare gå videre med Standard tilfelle her av andre. 1842 01:32:09,690 --> 01:32:11,950 >> Nå, la oss gå videre etter lagring dette, må 1843 01:32:11,950 --> 01:32:15,760 forhold dot slash conditions-- ikke en stor brukergrensesnitt, 1844 01:32:15,760 --> 01:32:18,914 fordi jeg ikke spørre bruker, som jeg nevnte tidligere. 1845 01:32:18,914 --> 01:32:19,580 Men det er fint. 1846 01:32:19,580 --> 01:32:20,454 Vi vil holde det enkelt. 1847 01:32:20,454 --> 01:32:21,890 La oss prøve nummer 42. 1848 01:32:21,890 --> 01:32:23,240 Og det er positivt. 1849 01:32:23,240 --> 01:32:26,120 La oss prøve nummer negativ 42, negativ. 1850 01:32:26,120 --> 01:32:28,244 >> La oss prøve verdien 0. 1851 01:32:28,244 --> 01:32:29,160 Og, ja, det fungerer. 1852 01:32:29,160 --> 01:32:33,900 Nå vil du se med problemer før lange, testing ting tre ganger, 1853 01:32:33,900 --> 01:32:34,980 sannsynligvis ikke tilstrekkelig. 1854 01:32:34,980 --> 01:32:37,438 Du har sannsynligvis vil teste noen større tall, noen mindre 1855 01:32:37,438 --> 01:32:40,520 tall, noen hjørne tilfeller, for eksempel vi vil komme til å beskrive dem. 1856 01:32:40,520 --> 01:32:42,500 >> Men for nå, er dette en ganske enkelt program. 1857 01:32:42,500 --> 01:32:45,160 Og jeg er ganske sikker på, logisk, at den faller inn i tre tilfeller. 1858 01:32:45,160 --> 01:32:49,360 Og, ja, selv om vi bare fokusert på de potensielle negative 1859 01:32:49,360 --> 01:32:53,480 av upresishet og overløp, i virkelighet der mange av CS50 problemer, 1860 01:32:53,480 --> 01:32:56,000 Vi kommer ikke til å bekymre om, hele tiden, 1861 01:32:56,000 --> 01:32:59,050 disse spørsmålene av overløp og unøyaktig, fordi, i virkeligheten, i C, 1862 01:32:59,050 --> 01:33:01,889 det er faktisk ikke alle som lett å unngå disse tingene. 1863 01:33:01,889 --> 01:33:04,180 Hvis du ønsker å telle opp større, og større, og større, 1864 01:33:04,180 --> 01:33:07,510 det viser seg at det er teknikker du kan bruke, ofte med ting som kalles 1865 01:33:07,510 --> 01:33:11,240 biblioteker, samlinger av kode, som andre skrev som du kan bruke, 1866 01:33:11,240 --> 01:33:13,910 og andre språk som Java og andre, faktisk 1867 01:33:13,910 --> 01:33:15,800 gjøre det mye enklere å telle enda høyere. 1868 01:33:15,800 --> 01:33:19,810 Så det virkelig er noen av disse farene en funksjon av språket du bruker. 1869 01:33:19,810 --> 01:33:22,710 Og i de kommende ukene, vil vi se hvor farlig C egentlig 1870 01:33:22,710 --> 01:33:24,950 kan være hvis du ikke bruker den riktig. 1871 01:33:24,950 --> 01:33:27,610 Men derfra, og med Python, og Javascript, vil 1872 01:33:27,610 --> 01:33:32,620 vi lag på noen ekstra beskyttelse, og kjøre færre av disse risikoene. 1873 01:33:32,620 --> 01:33:35,820 >> Så la oss gjøre litt mer interessant logikk i vårt program. 1874 01:33:35,820 --> 01:33:39,110 Så la meg gå videre og skape et program som heter Logical 1875 01:33:39,110 --> 01:33:43,804 bare så jeg kan spille med noen Selve logikk, logical.c. 1876 01:33:43,804 --> 01:33:46,870 Jeg skal bare kopiere og lime inn noen kode fra tidligere slik at jeg får tilbake 1877 01:33:46,870 --> 01:33:49,950 til dette fint utgangspunkt. 1878 01:33:49,950 --> 01:33:53,980 >> La meg denne gangen gjør char C. Jeg er kommer til å gi det et navn på C 1879 01:33:53,980 --> 01:33:58,510 bare fordi det er vanlig, får en karakter fra brukeren. 1880 01:33:58,510 --> 01:34:00,730 Og la oss late som Jeg gjennomføre en del 1881 01:34:00,730 --> 01:34:04,130 av at Rm programmet, remove program før det blir bedt om brukeren 1882 01:34:04,130 --> 01:34:05,400 å fjerne en fil. 1883 01:34:05,400 --> 01:34:06,750 Hvordan kan vi gjøre dette? 1884 01:34:06,750 --> 01:34:11,090 >> Jeg vil si, hvis C er lik lik, sitat unquote, 1885 01:34:11,090 --> 01:34:16,304 y, så jeg kommer til å anta som brukeren har valgt ja. 1886 01:34:16,304 --> 01:34:17,470 Jeg skal bare skrive ut ja. 1887 01:34:17,470 --> 01:34:19,440 Hvis det var faktisk skriver fjerning program, 1888 01:34:19,440 --> 01:34:21,420 vi kunne fjerne filen med flere linjer med kode. 1889 01:34:21,420 --> 01:34:22,461 Men vi vil holde det enkelt. 1890 01:34:22,461 --> 01:34:25,950 1891 01:34:25,950 --> 01:34:31,250 >> Else hvis c er lik lik N- og nå her, kommer jeg til å si, 1892 01:34:31,250 --> 01:34:32,980 brukeren må ha betydd noe. 1893 01:34:32,980 --> 01:34:34,360 Og så ellers, vet du hva? 1894 01:34:34,360 --> 01:34:36,200 Jeg vet ikke hva annet brukeren kommer til å skrive. 1895 01:34:36,200 --> 01:34:38,533 Så jeg skal bare si at det er en feil, uansett 1896 01:34:38,533 --> 01:34:40,070 han eller hun faktisk skrevet. 1897 01:34:40,070 --> 01:34:41,180 >> Så hva er det som skjer her? 1898 01:34:41,180 --> 01:34:44,530 Det er en fundamental forskjell i motsetning til hva jeg har gjort i fortiden. 1899 01:34:44,530 --> 01:34:49,300 Doble anførselstegn, anførselstegn, dobbel sitater, og ennå, enkle anførselstegn, 1900 01:34:49,300 --> 01:34:50,170 apostrof. 1901 01:34:50,170 --> 01:34:52,860 Det viser seg i C, at når du ønsker å skrive en streng, 1902 01:34:52,860 --> 01:34:56,680 du bruker doble anførselstegn, akkurat som vi har brukt hele denne tiden med printf. 1903 01:34:56,680 --> 01:35:02,030 >> Men hvis du ønsker å forholde seg til bare en enkelt tegn, en såkalt røye, 1904 01:35:02,030 --> 01:35:03,780 så du faktisk bruke enkle anførselstegn. 1905 01:35:03,780 --> 01:35:05,450 De av dere som har programmert før, kan du ikke ha 1906 01:35:05,450 --> 01:35:07,850 måtte bekymre deg for dette skillet på enkelte språk. 1907 01:35:07,850 --> 01:35:09,450 I C, gjør det noe. 1908 01:35:09,450 --> 01:35:12,560 Og så når jeg får en røye og jeg ønsker å sammenligne det røye bruker likemenn 1909 01:35:12,560 --> 01:35:18,350 lik til noen brev som y eller n, det gjør jeg, ja, må ha enkle anførselstegn. 1910 01:35:18,350 --> 01:35:19,770 >> Nå, la oss gå videre og gjøre dette. 1911 01:35:19,770 --> 01:35:26,180 La oss gå videre og gjør logiske dot slash logisk. 1912 01:35:26,180 --> 01:35:27,305 Og nå er jeg blir bedt om det. 1913 01:35:27,305 --> 01:35:30,638 Så, formodentlig, en bedre brukeropplevelse ville faktisk fortelle meg hva jeg skal gjøre her. 1914 01:35:30,638 --> 01:35:33,030 Men jeg kommer til å bare blindt si y for ja, OK, hyggelig. 1915 01:35:33,030 --> 01:35:35,780 >> La oss kjøre den igjen, n for nei, hyggelig. 1916 01:35:35,780 --> 01:35:39,610 Anta at visse folk jeg kjenner, mine Caps Lock-tasten er på altfor ofte. 1917 01:35:39,610 --> 01:35:43,740 Så jeg gjør hovedstaden Y, enter, feil. 1918 01:35:43,740 --> 01:35:46,130 OK, det er ikke akkurat hva jeg forventet. 1919 01:35:46,130 --> 01:35:48,170 Faktisk, datamaskinen gjør bokstavelig talt hva 1920 01:35:48,170 --> 01:35:51,794 Jeg fortalte det til do-- se etter små bokstaver y og små bokstaver n. 1921 01:35:51,794 --> 01:35:53,960 Dette føles ikke som god brukeropplevelse, skjønt. 1922 01:35:53,960 --> 01:35:59,010 La meg spørre for og imot enten små bokstaver eller store bokstaver. 1923 01:35:59,010 --> 01:36:02,090 Så det viser seg, kan det være lurt å si noe sånt i Scratch, 1924 01:36:02,090 --> 01:36:08,150 som bokstavelig eller C er lik tilsvarer kapital enkelt sitert y. 1925 01:36:08,150 --> 01:36:11,400 Slår ut, ikke C ikke har dette bokstavelig søkeord eller. 1926 01:36:11,400 --> 01:36:12,880 >> Men det har to loddrette streker. 1927 01:36:12,880 --> 01:36:15,463 Du må holde Shift vanligvis, hvis du bruker et amerikansk tastatur, 1928 01:36:15,463 --> 01:36:18,910 og traff den vertikale linjen Nøkkelen over avkastningen nøkkelen. 1929 01:36:18,910 --> 01:36:22,410 Men denne vertikale linjen vertikale linjen betyr eller. 1930 01:36:22,410 --> 01:36:26,220 >> Hvis, derimot, ønsket vi å si, og som i Scratch, 1931 01:36:26,220 --> 01:36:28,180 vi kunne gjøre ampersand-tegn. 1932 01:36:28,180 --> 01:36:31,330 Det gir ingen logisk mening her, fordi et menneske ikke kunne muligens 1933 01:36:31,330 --> 01:36:37,110 har skrevet både y og små bokstaver y og kapital Y som samme karakter. 1934 01:36:37,110 --> 01:36:39,470 Så eller er det vi har tenkt her. 1935 01:36:39,470 --> 01:36:46,280 >> Så hvis jeg gjør dette på begge steder, eller c tilsvarer tilsvarer kapital N, nå kjøre, 1936 01:36:46,280 --> 01:36:49,390 gjør logisk, kjør logisk. 1937 01:36:49,390 --> 01:36:51,200 Nå, jeg kan skrive y. 1938 01:36:51,200 --> 01:36:53,920 Og jeg kan gjøre det igjen med kapital Y eller kapital N. 1939 01:36:53,920 --> 01:36:56,630 Og jeg kunne legge inn ekstra kombinasjoner fortsatt. 1940 01:36:56,630 --> 01:36:58,810 >> Så dette er en logisk Programmet i den utstrekning nå 1941 01:36:58,810 --> 01:37:01,940 Jeg sjekker logisk for denne verdien eller denne verdien. 1942 01:37:01,940 --> 01:37:06,420 Og jeg trenger ikke å nødvendigvis, komme opp med to ifs eller annet ifs. 1943 01:37:06,420 --> 01:37:09,960 Jeg kan faktisk kombinere noen av relaterte logikk sammen på denne måten. 1944 01:37:09,960 --> 01:37:11,950 Så dette ville være bedre utformet enn bare 1945 01:37:11,950 --> 01:37:17,490 si, hvis C er lik små bokstaver y, skrive ut ja, annet hvis c er lik kapital Y, 1946 01:37:17,490 --> 01:37:20,074 skrive ut ja, annet hvis c er lik lower-- med andre ord 1947 01:37:20,074 --> 01:37:21,990 du trenger ikke å ha flere og flere grener. 1948 01:37:21,990 --> 01:37:28,840 Du kan kombinere noen av de tilsvarende grener logisk, som på denne måten. 1949 01:37:28,840 --> 01:37:34,150 >> Så la oss ta en titt på bare ett endelig ingrediens, en endelig konstruksjon, 1950 01:37:34,150 --> 01:37:34,847 at C tillater. 1951 01:37:34,847 --> 01:37:36,930 Og vi vil komme tilbake i fremtiden til andre fortsatt. 1952 01:37:36,930 --> 01:37:41,400 Og så får vi konkludere ved å se ved ikke riktigheten av code-- 1953 01:37:41,400 --> 01:37:46,070 å få kode til work-- men design kode, og plante disse frøene tidlig. 1954 01:37:46,070 --> 01:37:51,337 >> Så la meg gå videre og åpne opp en ny fil her. 1955 01:37:51,337 --> 01:37:51,920 Vet du hva? 1956 01:37:51,920 --> 01:37:54,450 Jeg kommer til å re-implementere det samme programmet, 1957 01:37:54,450 --> 01:37:55,940 men med en annen konstruksjon. 1958 01:37:55,940 --> 01:38:00,110 >> Så la meg raskt gi meg selv tilgang til å omfatte CS50.h 1959 01:38:00,110 --> 01:38:04,150 for CS50 bibliotek, standard Io.h for printf. 1960 01:38:04,150 --> 01:38:06,510 Gi meg int main annullert. 1961 01:38:06,510 --> 01:38:09,310 Og så over her, la meg gå videre og gjøre dette. 1962 01:38:09,310 --> 01:38:12,010 >> Char c får få røye, akkurat som før. 1963 01:38:12,010 --> 01:38:16,770 Og jeg kommer til å bruke en ny konstruksjon now-- slå, på hva karakter? 1964 01:38:16,770 --> 01:38:19,820 Så bryter er typen som bytte et tog spor. 1965 01:38:19,820 --> 01:38:22,070 Eller, egentlig, er det slags en om annet, hvis annet hvis, 1966 01:38:22,070 --> 01:38:23,980 men skrevet noe annerledes. 1967 01:38:23,980 --> 01:38:25,490 >> En bryter ser slik ut. 1968 01:38:25,490 --> 01:38:29,060 Du har bryteren, og hva tegn eller nummer du ønsker å se på, 1969 01:38:29,060 --> 01:38:32,000 så noen klammeparentes som i Scratch, bare si gjøre denne ting. 1970 01:38:32,000 --> 01:38:33,480 Og da har du forskjellige tilfeller. 1971 01:38:33,480 --> 01:38:34,830 >> Du trenger ikke bruke hvis og annet. 1972 01:38:34,830 --> 01:38:37,050 Du bokstavelig talt bruke ordet saken. 1973 01:38:37,050 --> 01:38:38,790 Og du ville si noe sånt som dette. 1974 01:38:38,790 --> 01:38:43,820 >> Slik at i tilfelle av en liten bokstav y, eller i tilfelle av en kapital Y, 1975 01:38:43,820 --> 01:38:47,350 gå videre og skrive ut ja. 1976 01:38:47,350 --> 01:38:49,020 Og deretter bryte ut av bryteren. 1977 01:38:49,020 --> 01:38:49,580 Det er det. 1978 01:38:49,580 --> 01:38:50,880 Vi er ferdige. 1979 01:38:50,880 --> 01:38:57,270 >> Annet hvis, så å si, små bokstaver n, eller kapital N, 1980 01:38:57,270 --> 01:39:02,560 deretter gå videre og print ut nei, og deretter bryte. 1981 01:39:02,560 --> 01:39:08,022 Else-- og denne type er Standard tilfelle indeed-- printf error-- 1982 01:39:08,022 --> 01:39:10,980 og bare for godt mål, men logisk denne pausen er ikke nødvendig 1983 01:39:10,980 --> 01:39:12,896 fordi vi er på slutten av bryteren uansett, 1984 01:39:12,896 --> 01:39:14,520 Jeg er nå å bryte ut av bryteren. 1985 01:39:14,520 --> 01:39:16,280 Så dette ser litt annerledes ut. 1986 01:39:16,280 --> 01:39:18,272 >> Men, logisk, er det faktisk tilsvarende. 1987 01:39:18,272 --> 01:39:19,980 Og hvorfor ville du bruke en over den andre? 1988 01:39:19,980 --> 01:39:23,220 Noen ganger bare personlig preferanse, noen ganger estetikk, 1989 01:39:23,220 --> 01:39:25,420 hvis jeg kikker på nå, det er noe 1990 01:39:25,420 --> 01:39:27,510 å si for den lesbarheten av denne koden. 1991 01:39:27,510 --> 01:39:30,690 Jeg mener, never mind det faktum at denne Koden er nytt for mange av oss i rommet. 1992 01:39:30,690 --> 01:39:33,515 >> Men det bare slags er pen. 1993 01:39:33,515 --> 01:39:37,760 Du ser små bokstaver y, kapital Y, små bokstaver n, kapital N standard 1994 01:39:37,760 --> 01:39:40,150 det bare slags hopp ut på deg på en måte 1995 01:39:40,150 --> 01:39:42,200 som, uten tvil, kanskje det foregående eksempelet 1996 01:39:42,200 --> 01:39:45,780 med IFS, og de vertikale stolpene, og annet ifs, kanskje ikke. 1997 01:39:45,780 --> 01:39:51,600 Så dette er egentlig et spørsmål om personlig valg, egentlig, eller lesbarhet, 1998 01:39:51,600 --> 01:39:52,360 av koden. 1999 01:39:52,360 --> 01:39:58,230 >> Men når det gjelder funksjonalitet, la meg gå videre og gjøre en bryter, dot slash 2000 01:39:58,230 --> 01:40:05,830 bryteren, og nå skrive med små bokstaver y, kapital Y, små bokstaver n, kapital N, 2001 01:40:05,830 --> 01:40:09,250 David, prøv på nytt fordi det er ikke et enkelt tegn. 2002 01:40:09,250 --> 01:40:12,050 La oss gjøre x, feil, som forventet. 2003 01:40:12,050 --> 01:40:15,640 Og logically-- og dette er noe Jeg vil oppfordre i general-- selv 2004 01:40:15,640 --> 01:40:17,790 selv om vi bare skrape overflaten av noen av disse funksjonene. 2005 01:40:17,790 --> 01:40:20,560 >> Og det kan ikke være opplagt når du selv sitte ned på tastaturet, 2006 01:40:20,560 --> 01:40:21,370 hvordan virker dette? 2007 01:40:21,370 --> 01:40:22,240 Hva ville dette gjøre? 2008 01:40:22,240 --> 01:40:25,630 Den vakre ting om å ha en bærbar PC, eller skrivebordet, eller tilgang 2009 01:40:25,630 --> 01:40:29,290 til en datamaskin med en kompilator, og med en kode editor som dette, 2010 01:40:29,290 --> 01:40:32,990 er du nesten alltid svare på disse spørsmål til deg selv bare ved å prøve. 2011 01:40:32,990 --> 01:40:36,570 >> For eksempel, hvis det retoriske Spørsmålet dreier var, 2012 01:40:36,570 --> 01:40:39,540 hva skjer hvis du glemmer break uttalelser? 2013 01:40:39,540 --> 01:40:41,400 Som faktisk er en veldig vanlig ting å gjøre, 2014 01:40:41,400 --> 01:40:43,540 fordi det ikke ser som du virkelig trenger dem. 2015 01:40:43,540 --> 01:40:46,790 De har egentlig ikke fullføre tenkte som en parentes eller en krøllete 2016 01:40:46,790 --> 01:40:47,714 brace gjør. 2017 01:40:47,714 --> 01:40:49,630 La oss gå videre og rekompilere koden og se. 2018 01:40:49,630 --> 01:40:53,690 Så gjør bryteren, dot slash bryteren. 2019 01:40:53,690 --> 01:40:56,435 La oss skrive med små bokstaver y, den øverste saken, Enter. 2020 01:40:56,435 --> 01:40:59,390 2021 01:40:59,390 --> 01:41:00,700 Så jeg skrev y. 2022 01:41:00,700 --> 01:41:04,420 >> Programmet sa ja, nei, feil, som om det var å endre sin mening. 2023 01:41:04,420 --> 01:41:09,280 Men den slags var, fordi det som skjer med en bryter er den første som tilfellet 2024 01:41:09,280 --> 01:41:13,899 kamp egentlig betyr, hei datamaskin, utføre alle av koden under den. 2025 01:41:13,899 --> 01:41:16,690 Og hvis du ikke sier pause, eller ikke si pause, eller ikke si pause, 2026 01:41:16,690 --> 01:41:19,540 maskinen kommer til å blåse gjennom alle disse linjene 2027 01:41:19,540 --> 01:41:22,779 og utføre dem inntil det blir til at curly brace. 2028 01:41:22,779 --> 01:41:24,320 Så bremsene er faktisk nødvendig. 2029 01:41:24,320 --> 01:41:27,120 Men en takeaway her er, når i tvil, prøv noe. 2030 01:41:27,120 --> 01:41:29,510 Kanskje spare koden først, eller lagre den i en ekstra fil 2031 01:41:29,510 --> 01:41:32,930 hvis du er veldig bekymret rote opp og måtte gjenopprette 2032 01:41:32,930 --> 01:41:34,430 det arbeidet som du vet fungerer. 2033 01:41:34,430 --> 01:41:35,410 >> Men prøv ting. 2034 01:41:35,410 --> 01:41:38,074 Og ikke være så redd for, kanskje, av hva maskinen kan gjøre, 2035 01:41:38,074 --> 01:41:39,490 eller at du kan ødelegge noe. 2036 01:41:39,490 --> 01:41:42,790 Du kan alltid gå tilbake til noen tidligere versjon. 2037 01:41:42,790 --> 01:41:45,640 >> Så la oss slutte med å se ved utformingen av kode. 2038 01:41:45,640 --> 01:41:49,020 Vi har denne muligheten nå til å skrive forhold, og skrive looper, 2039 01:41:49,020 --> 01:41:50,850 og variabler, og samtalefunksjoner. 2040 01:41:50,850 --> 01:41:54,590 Så, for å være ærlig, vi er litt tilbake på hvor vi var for en uke siden med Scratch, 2041 01:41:54,590 --> 01:42:00,120 riktignok med en mindre overbevisende tekstlig miljø enn Scratch tillater. 2042 01:42:00,120 --> 01:42:03,990 >> Men legg merke til hvor raskt vi har kjøpt som ordforråd, selv om det er 2043 01:42:03,990 --> 01:42:07,570 kommer til å ta litt tid å synke inn, slik at vi nå kan bruke denne vokabular 2044 01:42:07,570 --> 01:42:10,320 å skrive mer interessante programmer. 2045 01:42:10,320 --> 01:42:12,940 Og la oss ta en baby skritt mot denne, som følger. 2046 01:42:12,940 --> 01:42:14,890 La meg gå videre og opprette en ny fil her. 2047 01:42:14,890 --> 01:42:17,750 >> Jeg kommer til å kalle dette prototype.c, og introdusere 2048 01:42:17,750 --> 01:42:20,954 for første gang, evnen å lage dine egne funksjoner. 2049 01:42:20,954 --> 01:42:22,870 Noen av dere har kanskje gjort dette med Scratch, 2050 01:42:22,870 --> 01:42:25,430 der du kan lage dine egne blokker i Scratch, 2051 01:42:25,430 --> 01:42:27,892 og deretter dra dem på plass uansett hvor du vil i C. 2052 01:42:27,892 --> 01:42:30,100 Og i de fleste programmerings språk, kan du gjøre akkurat 2053 01:42:30,100 --> 01:42:33,580 at-- lage dine egne funksjoner, hvis de ikke allerede eksisterer. 2054 01:42:33,580 --> 01:42:38,660 >> Så, for eksempel, la meg gå videre og inkluderer CS50.h, og inkluderer 2055 01:42:38,660 --> 01:42:43,110 standard IO.h, int main annullert. 2056 01:42:43,110 --> 01:42:46,020 Og nå har vi en plassholder klar til å gå. 2057 01:42:46,020 --> 01:42:48,550 Jeg holder utskrift ting som folks navn i dag. 2058 01:42:48,550 --> 01:42:51,910 Og det føles like-- ville ikke være fint hvis det 2059 01:42:51,910 --> 01:42:53,936 var en funksjon kalt print navn? 2060 01:42:53,936 --> 01:42:55,060 Jeg trenger ikke å bruke printf. 2061 01:42:55,060 --> 01:42:56,976 Jeg trenger ikke å huske alle format koder. 2062 01:42:56,976 --> 01:43:00,050 Hvorfor ikke jeg, eller hvorfor gjorde ikke noen før meg, 2063 01:43:00,050 --> 01:43:02,980 lage en funksjon kalt print navn, som fikk noen navn, 2064 01:43:02,980 --> 01:43:03,980 bare skrives det ut? 2065 01:43:03,980 --> 01:43:08,700 >> Med andre ord, hvis jeg sier hei, datamaskin, gi meg en streng 2066 01:43:08,700 --> 01:43:11,870 ved å spørre brukeren for eksempel, via CS50 get streng funksjonen. 2067 01:43:11,870 --> 01:43:15,090 Hei, datamaskin, sette strengen i variabelen i venstre side, 2068 01:43:15,090 --> 01:43:16,150 og kaller det s. 2069 01:43:16,150 --> 01:43:22,150 Og så, hei datamaskinen, gå videre og skrive personens navn, gjort. 2070 01:43:22,150 --> 01:43:26,240 >> Nå ville det være fint, fordi dette programmet, treffende navn, 2071 01:43:26,240 --> 01:43:29,170 forteller meg hva det er ment å gjøre ved hjelp av de funksjonsenes navn. 2072 01:43:29,170 --> 01:43:32,930 La meg gå og gjøre prototype, Enter. 2073 01:43:32,930 --> 01:43:34,930 Og, dessverre, dette ikke kommer til å fly. 2074 01:43:34,930 --> 01:43:39,430 >> Prototype.c, linje 7, karakter 5, feil, implisitt erklæring 2075 01:43:39,430 --> 01:43:42,960 av funksjon print navn er ugyldig i C99, C99 2076 01:43:42,960 --> 01:43:45,130 betyr en versjon av C- som kom ut i 1999. 2077 01:43:45,130 --> 01:43:45,730 Det er alt. 2078 01:43:45,730 --> 01:43:48,780 >> Så jeg vet ikke hva alt dette betyr enda. 2079 01:43:48,780 --> 01:43:50,810 Men jeg erkjenner feil i rødt. 2080 01:43:50,810 --> 01:43:51,770 Det er ganske opplagt. 2081 01:43:51,770 --> 01:43:53,769 >> Og det virker som med den grønne karakter her, 2082 01:43:53,769 --> 01:43:57,520 problemet er med print navn, åpen paren s, nær paren, semi-kolon. 2083 01:43:57,520 --> 01:44:01,800 Men implisitt erklæring funksjon vi fikk se kort tidligere. 2084 01:44:01,800 --> 01:44:04,880 Dette betyr ganske enkelt at klang vet ikke hva jeg mener. 2085 01:44:04,880 --> 01:44:09,000 >> Jeg har brukt et vokabular ord at det er aldri sett eller blitt lært før. 2086 01:44:09,000 --> 01:44:11,950 Og så jeg trenger å lære det hva denne funksjonen innebærer. 2087 01:44:11,950 --> 01:44:13,590 Så jeg kommer til å gå videre og gjøre det. 2088 01:44:13,590 --> 01:44:17,970 >> Jeg kommer til å gå videre og implementere min egen funksjon kalt ut navn. 2089 01:44:17,970 --> 01:44:24,720 Og jeg kommer til å si, slik at den gjør dette, printf, hallo, prosent 2090 01:44:24,720 --> 01:44:27,760 s, backslash n, navn, semikolon. 2091 01:44:27,760 --> 01:44:29,250 Så hva gjorde jeg bare gjøre? 2092 01:44:29,250 --> 01:44:31,325 >> Så det viser seg, til implementere din egen funksjon, 2093 01:44:31,325 --> 01:44:33,845 vi slags låne noen av den samme struktur som hoved 2094 01:44:33,845 --> 01:44:35,720 som vi har nettopp vært tatt for gitt, og jeg 2095 01:44:35,720 --> 01:44:37,730 vet bare å kopiere og lime ganske mye hva 2096 01:44:37,730 --> 01:44:39,170 Jeg har skrevet tidligere. 2097 01:44:39,170 --> 01:44:40,570 Men legg merke til mønsteret her. 2098 01:44:40,570 --> 01:44:43,750 Int, Main, Void, vi vil erte hverandre før lenge hva det egentlig betyr. 2099 01:44:43,750 --> 01:44:46,160 >> Men for i dag, bare merke parallellitet. 2100 01:44:46,160 --> 01:44:48,210 Void, print navn, string navn, så det er 2101 01:44:48,210 --> 01:44:50,310 en lilla søkeord, som vi kommer til å starte 2102 01:44:50,310 --> 01:44:54,067 ringer en returtype, navnet på funksjonen, og deretter input. 2103 01:44:54,067 --> 01:44:56,400 Så, faktisk, kan vi destillere denne typen som i forrige uke 2104 01:44:56,400 --> 01:44:59,030 som, er dette navnet eller algoritme av koden vi er 2105 01:44:59,030 --> 01:45:00,761 kommer til å write-- den algoritme underliggende 2106 01:45:00,761 --> 01:45:02,010 koden vi kommer til å skrive. 2107 01:45:02,010 --> 01:45:03,180 >> Dette er sine innspill. 2108 01:45:03,180 --> 01:45:04,670 Dette er dens utgang. 2109 01:45:04,670 --> 01:45:08,730 Denne funksjonen, print navn, er utformet for å ta en streng kalt navn, 2110 01:45:08,730 --> 01:45:11,350 eller hva, som input, og deretter annullert. 2111 01:45:11,350 --> 01:45:13,904 Det går ikke tilbake noe, som får streng eller få int gjør. 2112 01:45:13,904 --> 01:45:15,570 Så det kommer til å gi meg noe tilbake. 2113 01:45:15,570 --> 01:45:17,960 Det er bare kommer til å ha en bivirkning, så å si, 2114 01:45:17,960 --> 01:45:19,570 skrive ut en persons navn. 2115 01:45:19,570 --> 01:45:22,260 Så legger merke til, linje 7, jeg kan kalle print navn. 2116 01:45:22,260 --> 01:45:25,920 Linje 10, kan jeg definere eller implementere print navn. 2117 01:45:25,920 --> 01:45:28,450 Men, dessverre, det er ikke nok. 2118 01:45:28,450 --> 01:45:31,230 >> La meg gå videre og rekompilere dette etter lagring. 2119 01:45:31,230 --> 01:45:33,910 Jøss, nå har jeg gjort det verre, vil det synes. 2120 01:45:33,910 --> 01:45:37,027 Så implisitt erklæring funksjonsskrivernavnet er ugyldig. 2121 01:45:37,027 --> 01:45:38,360 Og igjen, det er flere feil. 2122 01:45:38,360 --> 01:45:41,430 Men som jeg advarte tidligere, selv Hvis du bli overveldet med, 2123 01:45:41,430 --> 01:45:44,850 eller litt trist å se så mange feil, bare fokusere på den første 2124 01:45:44,850 --> 01:45:47,500 utgangspunktet, fordi det kan bare har hatt en gjennomgripende effekt. 2125 01:45:47,500 --> 01:45:51,970 Så C, eller klang mer spesifikt, fortsatt ikke gjenkjenner print navn. 2126 01:45:51,970 --> 01:45:54,580 >> Og det er fordi klang, av design, er litt dum. 2127 01:45:54,580 --> 01:45:56,280 Det gjør bare det du ber den om. 2128 01:45:56,280 --> 01:46:00,950 Og det bare gjør det i den rekkefølgen der du ber den om. 2129 01:46:00,950 --> 01:46:05,270 >> Så jeg har definert hoved på linje fire, som vi har gjort ganske ofte. 2130 01:46:05,270 --> 01:46:07,980 Jeg har definert print navn på linje 10. 2131 01:46:07,980 --> 01:46:11,793 Men jeg prøver å bruke print navn på linje sju. 2132 01:46:11,793 --> 01:46:13,670 >> Det er for tidlig, ikke finnes ennå. 2133 01:46:13,670 --> 01:46:19,150 Så jeg kan være flink, og være like, OK, så la oss bare spille sammen, 2134 01:46:19,150 --> 01:46:23,680 og flytte print navn opp her, og re-kompilere. 2135 01:46:23,680 --> 01:46:24,550 Herregud. 2136 01:46:24,550 --> 01:46:25,260 Det funket. 2137 01:46:25,260 --> 01:46:26,670 Det var så enkelt som det. 2138 01:46:26,670 --> 01:46:28,120 >> Men logikken er akkurat det. 2139 01:46:28,120 --> 01:46:30,870 Du må lære klang hva det er ved å definere funksjonen første. 2140 01:46:30,870 --> 01:46:31,920 Deretter kan du bruke den. 2141 01:46:31,920 --> 01:46:33,940 Men, ærlig, føles dette som en glatt skråning. 2142 01:46:33,940 --> 01:46:35,773 >> Så hver gang jeg kjører inn i et problem, jeg er bare 2143 01:46:35,773 --> 01:46:39,450 kommer til å markere og kopiere koden Jeg skrev, klippe det og lime det opp her. 2144 01:46:39,450 --> 01:46:41,370 Og sikkert, vi kunne pønsker noen scenarier 2145 01:46:41,370 --> 01:46:43,286 hvor en funksjon makt trenger å ringe en annen. 2146 01:46:43,286 --> 01:46:46,030 Og du bare ikke kan sette alle funksjon over alle andre. 2147 01:46:46,030 --> 01:46:47,930 >> Så det viser seg at det er en bedre løsning. 2148 01:46:47,930 --> 01:46:50,100 Vi kan la dette være. 2149 01:46:50,100 --> 01:46:53,677 Og ærlig talt, det er vanligvis fint, og praktisk, og god design 2150 01:46:53,677 --> 01:46:56,760 for å sette hoved første, fordi, igjen, Hoved akkurat som når grønne flagget klikket, 2151 01:46:56,760 --> 01:46:59,027 det er den funksjon at blir utført som standard. 2152 01:46:59,027 --> 01:47:01,110 Så du kan like godt sette den på toppen av filen 2153 01:47:01,110 --> 01:47:03,560 slik at når du eller noen annet menneske ser på filen 2154 01:47:03,560 --> 01:47:06,360 du vet hva som skjer bare ved å lese hoved først. 2155 01:47:06,360 --> 01:47:15,360 Så det viser seg, kan vi fortelle klang proaktivt, hei, klang, på linje fire, 2156 01:47:15,360 --> 01:47:17,940 Jeg lover å implementere en funksjon som heter Print 2157 01:47:17,940 --> 01:47:22,600 Navn som tar en streng kalt navn som input, og returnerer ingenting, tomrom. 2158 01:47:22,600 --> 01:47:24,770 Og jeg vil komme til å implementere det senere. 2159 01:47:24,770 --> 01:47:25,680 >> Her kommer Main. 2160 01:47:25,680 --> 01:47:29,130 Hoved nå på linje 9 kan bruke Skriv navn fordi klang 2161 01:47:29,130 --> 01:47:32,600 er å stole på at, til slutt, det vil støte definisjonen 2162 01:47:32,600 --> 01:47:34,880 av gjennomføringen av Print navn. 2163 01:47:34,880 --> 01:47:37,390 Så etter du har lagret filen min, la meg gå videre og gjøre prototype, 2164 01:47:37,390 --> 01:47:38,498 ser bra denne gangen. 2165 01:47:38,498 --> 01:47:43,470 Dot slash, prototype, la meg gå videre og skrive inn et navn. 2166 01:47:43,470 --> 01:47:48,440 David, hallo David, Zamila, hallo Zamila, og, ja, nå fungerer det. 2167 01:47:48,440 --> 01:47:52,200 >> Så ingrediensen her er at vi har gjort en egendefinert funksjon, som en egendefinert 2168 01:47:52,200 --> 01:47:54,219 Scratch blokken vi kaller det. 2169 01:47:54,219 --> 01:47:57,010 Men i motsetning til Scratch hvor du kan bare lage den og begynne å bruke den, 2170 01:47:57,010 --> 01:47:59,330 nå må vi være en litt mer pedantisk, 2171 01:47:59,330 --> 01:48:03,410 og faktisk trene klang å bruke, eller du kan forvente det. 2172 01:48:03,410 --> 01:48:09,140 Nå, som en side, hvorfor hele denne tiden har vi vært bare blindt på tro inkludert 2173 01:48:09,140 --> 01:48:12,170 CS50.h, og med standard IO.h? 2174 01:48:12,170 --> 01:48:15,190 >> Vel, det viser seg, blant et par andre ting, 2175 01:48:15,190 --> 01:48:18,550 alt som er i dem dot h filer, som tilfeldigvis er filer. 2176 01:48:18,550 --> 01:48:20,460 De er header-filer, så å si. 2177 01:48:20,460 --> 01:48:23,270 De er fortsatt skrevet i C. Men de er en annen type fil. 2178 01:48:23,270 --> 01:48:28,690 >> For nå, kan du ganske mye anta at alt som er inne i CS50.h 2179 01:48:28,690 --> 01:48:33,360 er noen one-liners som dette, ikke for funksjoner kalt ut navn, 2180 01:48:33,360 --> 01:48:36,840 men for få String, Get Float, og noen få andre. 2181 01:48:36,840 --> 01:48:41,510 Og det finnes lignende prototyper, en liners, innsiden av standard IO.h 2182 01:48:41,510 --> 01:48:46,241 for printf, som nå er i min egen Print Navn funksjon. 2183 01:48:46,241 --> 01:48:49,490 Så med andre ord, hele denne tiden har vi nettopp blitt blindt kopiere og lime 2184 01:48:49,490 --> 01:48:51,780 inkludere dette, inkluderer det, hva skjer? 2185 01:48:51,780 --> 01:48:55,310 De er bare slags hint til klang som til hvilke funksjoner 2186 01:48:55,310 --> 01:49:00,170 er faktisk gjennomført, bare andre steder i forskjellige filer 2187 01:49:00,170 --> 01:49:02,440 et annet sted i systemet. 2188 01:49:02,440 --> 01:49:05,160 >> Så vi har implementert print navn. 2189 01:49:05,160 --> 01:49:07,910 Den har denne bivirkning av skriver noe på skjermen. 2190 01:49:07,910 --> 01:49:10,170 Men det gjør faktisk ikke gi meg noe tilbake. 2191 01:49:10,170 --> 01:49:12,200 Hvordan går vi om benytter et program som 2192 01:49:12,200 --> 01:49:14,510 ikke gi meg noe tilbake? 2193 01:49:14,510 --> 01:49:15,580 >> Vel, la oss prøve dette. 2194 01:49:15,580 --> 01:49:21,360 La meg gå videre og implementere en fil som heter return.c 2195 01:49:21,360 --> 01:49:24,530 slik at vi kan vise hvordan noe liker Få String, eller få Int, 2196 01:49:24,530 --> 01:49:27,340 er faktisk retur noe tilbake til brukeren. 2197 01:49:27,340 --> 01:49:29,840 La oss gå videre og definere int main annullert. 2198 01:49:29,840 --> 01:49:33,230 >> Og, igjen, i fremtiden, vil vi forklare hva som int og det tomrommet 2199 01:49:33,230 --> 01:49:34,090 er faktisk gjør. 2200 01:49:34,090 --> 01:49:35,840 Men for i dag, vil vi ta det for gitt. 2201 01:49:35,840 --> 01:49:39,970 Jeg kommer til å gå videre og printf, for en god brukeropplevelse, er x. 2202 01:49:39,970 --> 01:49:44,360 Og så kommer jeg til å vente på bruker å gi meg x med komme int. 2203 01:49:44,360 --> 01:49:48,459 >> Og så kommer jeg til å gå videre og skrive ut x til torget. 2204 01:49:48,459 --> 01:49:50,500 Så når du bare har en tastatur, folk vanligvis 2205 01:49:50,500 --> 01:49:52,600 bruke litt gulrot symbol på tastaturet 2206 01:49:52,600 --> 01:49:55,330 å representere til strøm av eller eksponent for. 2207 01:49:55,330 --> 01:49:58,960 Så x squared er til stede i. 2208 01:49:58,960 --> 01:50:00,660 >> Og nå kommer jeg til å gjøre dette. 2209 01:50:00,660 --> 01:50:03,940 Jeg kunne bare do-- hva er x squared? x squared er x ganger x. 2210 01:50:03,940 --> 01:50:06,690 >> Og vi gjorde dette noen tid siden allerede i dag. 2211 01:50:06,690 --> 01:50:08,730 Dette føles ikke som så mye fremgang. 2212 01:50:08,730 --> 01:50:09,570 Vet du hva? 2213 01:50:09,570 --> 01:50:13,100 La oss utnytte noe av den tanken fra forrige gang av abstraksjon. 2214 01:50:13,100 --> 01:50:16,080 >> Ville det ikke vært fint om det er en funksjon som heter 2215 01:50:16,080 --> 01:50:18,460 firkantet som gjør akkurat det? 2216 01:50:18,460 --> 01:50:20,640 Det fortsatt, ved slutten av dag, gjør det samme regnestykket. 2217 01:50:20,640 --> 01:50:22,410 Men la oss abstrakte bort ideen om å ta 2218 01:50:22,410 --> 01:50:25,280 ett tall multiplisert med en annen, og bare gi den et navn, 2219 01:50:25,280 --> 01:50:27,360 lignende firkant denne verdien. 2220 01:50:27,360 --> 01:50:29,560 >> Og, med andre ord, i C, la oss lage en funksjon 2221 01:50:29,560 --> 01:50:32,660 heter plassen som gjør akkurat det. 2222 01:50:32,660 --> 01:50:34,600 Det kommer til å bli kalt torget. 2223 01:50:34,600 --> 01:50:35,790 Det kommer til å ta en int. 2224 01:50:35,790 --> 01:50:37,820 Og vi vil vil bare kalle det n, som standard. 2225 01:50:37,820 --> 01:50:39,403 >> Men vi kan kalle det noe vi ønsker. 2226 01:50:39,403 --> 01:50:42,900 Og alt som det kommer til å gjør det, bokstavelig talt, er tilbake 2227 01:50:42,900 --> 01:50:45,810 resultatet av n ganger n. 2228 01:50:45,810 --> 01:50:48,980 Men fordi det er retur noe som 2229 01:50:48,980 --> 01:50:53,690 er nøkkelordet i lilla vi har aldri sett før, jeg, på linje 11, 2230 01:50:53,690 --> 01:50:55,410 kan ikke bare si tomrommet denne gangen. 2231 01:50:55,410 --> 01:51:01,320 >> Void, i eksempelet nettopp så vi snarere print navn, betyr bare, 2232 01:51:01,320 --> 01:51:02,190 gjør noe. 2233 01:51:02,190 --> 01:51:04,170 Men ikke gi meg noe tilbake. 2234 01:51:04,170 --> 01:51:06,790 I dette tilfellet vil jeg for å gå tilbake n ganger n, 2235 01:51:06,790 --> 01:51:08,460 eller hva det er, det tallet. 2236 01:51:08,460 --> 01:51:12,460 >> Så jeg kan ikke si hei, datamaskin, Jeg kommer tilbake ingenting, tomrom. 2237 01:51:12,460 --> 01:51:16,166 Det kommer til å gå tilbake, av natur, en int. 2238 01:51:16,166 --> 01:51:17,790 Og så det er alt som skjer her. 2239 01:51:17,790 --> 01:51:20,070 >> Inngangen til torget kommer til å bli en int. 2240 01:51:20,070 --> 01:51:24,760 Og slik at vi kan bruke det, har det å har et navn, N. Det kommer til utgang 2241 01:51:24,760 --> 01:51:26,240 en int som ikke trenger et navn. 2242 01:51:26,240 --> 01:51:29,590 Vi kan overlate til hoved, eller den som er hjelp meg å huske denne verdien hvis vi 2243 01:51:29,590 --> 01:51:31,120 vil med sin egen variabel. 2244 01:51:31,120 --> 01:51:33,230 >> Og, igjen, den eneste nye nøkkelordet her er Return. 2245 01:51:33,230 --> 01:51:34,480 Og jeg bare gjør litt matematikk. 2246 01:51:34,480 --> 01:51:41,825 Hvis jeg virkelig ønsket å være unødvendig, Jeg kan si int produktet kommer n ganger n. 2247 01:51:41,825 --> 01:51:44,170 >> Og da kunne jeg si, returnere produktet. 2248 01:51:44,170 --> 01:51:47,360 Men, igjen, til poenget mitt tidligere av dette bare ikke å være god design-- 2249 01:51:47,360 --> 01:51:50,060 som, hvorfor innføre et navn, et symbol, som produkt, 2250 01:51:50,060 --> 01:51:51,570 bare for å umiddelbart returnere den? 2251 01:51:51,570 --> 01:51:53,670 Det er litt renere, litt strammere, så 2252 01:51:53,670 --> 01:51:59,380 å snakke, bare for å si retur n ganger n, bli kvitt denne linjen helt. 2253 01:51:59,380 --> 01:52:02,860 >> Og det er bare mindre kode å lese, mindre mulighet for feil. 2254 01:52:02,860 --> 01:52:05,180 Og la oss se om dette faktisk nå fungerer. 2255 01:52:05,180 --> 01:52:09,380 Nå kommer jeg til å gå videre og gjøre gjengjeld. 2256 01:52:09,380 --> 01:52:11,460 >> Uh-oh, implisitt erklæring av funksjon. 2257 01:52:11,460 --> 01:52:14,080 Jeg har gjort denne feilen før, ingen big deal. 2258 01:52:14,080 --> 01:52:18,950 La meg bare skrive, eller markere og kopiere, nøyaktig samme funksjon prototype, 2259 01:52:18,950 --> 01:52:21,342 eller signatur, av funksjonen her oppe. 2260 01:52:21,342 --> 01:52:22,800 Eller jeg kunne flytte hele funksjonen. 2261 01:52:22,800 --> 01:52:23,841 >> Men det er litt lat. 2262 01:52:23,841 --> 01:52:24,870 Så vi vil ikke gjøre det. 2263 01:52:24,870 --> 01:52:27,960 Nå, la meg gjøre retur igjen, dot slash retur. 2264 01:52:27,960 --> 01:52:32,790 >> x er 2. x squared er 4. x er 3. x squared er ni. 2265 01:52:32,790 --> 01:52:35,300 Og funksjonen virker nå ut til å virke. 2266 01:52:35,300 --> 01:52:36,550 Så hva er forskjellen her? 2267 01:52:36,550 --> 01:52:42,520 Jeg har en funksjon som heter kvadrat, i dette tilfellet, som jeg satt på en inngang. 2268 01:52:42,520 --> 01:52:43,830 Og jeg kommer tilbake en utgang. 2269 01:52:43,830 --> 01:52:46,210 Og likevel, som tidligere, hvis Jeg åpner den andre eksemplet 2270 01:52:46,210 --> 01:52:51,640 fra tidligere, som var kalt prototype.c, 2271 01:52:51,640 --> 01:52:54,770 Jeg hadde print navn, som returnert ugyldig, så å si, 2272 01:52:54,770 --> 01:52:58,730 Eller den returnerte ingenting, og bare hadde en bivirkning. 2273 01:52:58,730 --> 01:53:00,230 >> Så hva er det som skjer her? 2274 01:53:00,230 --> 01:53:03,520 Vel, vurdere funksjonen få streng for bare et øyeblikk. 2275 01:53:03,520 --> 01:53:06,570 Vi har brukt funksjonen få streng på følgende måte. 2276 01:53:06,570 --> 01:53:10,464 >> Vi har hatt en funksjon får streng, som inkluderer CS50.h, 2277 01:53:10,464 --> 01:53:16,624 inkluderer standard IO.h, int, main, annullert. 2278 01:53:16,624 --> 01:53:18,790 Og så hver gang jeg har heter get streng så langt, 2279 01:53:18,790 --> 01:53:23,260 Jeg har sagt noe sånt, string s får få streng, fordi get string-- 2280 01:53:23,260 --> 01:53:27,880 la oss kalle dette get.c-- get streng selv returnerer en streng som jeg kan deretter 2281 01:53:27,880 --> 01:53:32,050 bruke, og si hei, komma, prosent s, backslash n, s. 2282 01:53:32,050 --> 01:53:35,660 >> Så dette er det samme eksempelet, virkelig, at vi hadde tidligere. 2283 01:53:35,660 --> 01:53:37,920 Så får streng returnerer en verdi. 2284 01:53:37,920 --> 01:53:41,260 Men en stund siden, print string returnerer ikke en verdi. 2285 01:53:41,260 --> 01:53:42,721 Den har bare en bivirkning. 2286 01:53:42,721 --> 01:53:44,220 Så dette er en fundamental forskjell. 2287 01:53:44,220 --> 01:53:46,710 Vi har sett annerledes typer funksjoner nå, 2288 01:53:46,710 --> 01:53:49,490 hvorav noen har returnert verdier, hvorav noen ikke. 2289 01:53:49,490 --> 01:53:51,890 Så kanskje det er streng, eller int eller float. 2290 01:53:51,890 --> 01:53:53,480 Eller kanskje det bare er ugyldig. 2291 01:53:53,480 --> 01:53:55,710 >> Og forskjellen er at disse funksjonene 2292 01:53:55,710 --> 01:53:59,940 få data og returnere en verdi er faktisk bringe noe tilbake til bordet, 2293 01:53:59,940 --> 01:54:01,110 så å si. 2294 01:54:01,110 --> 01:54:03,710 Så la oss gå videre og ser på en endelig sett 2295 01:54:03,710 --> 01:54:09,129 eksempler som gir en følelse nå, av hvordan vi kan, faktisk, abstrakt bedre, 2296 01:54:09,129 --> 01:54:11,670 og bedre og bedre eller mer, og mer og mer, for 2297 01:54:11,670 --> 01:54:13,810 å skrive, til slutt, bedre kode. 2298 01:54:13,810 --> 01:54:16,860 La oss gå videre, og i ånden av Scratch, gjør følgende. 2299 01:54:16,860 --> 01:54:21,700 >> La meg gå videre og omfatte CS50.h og standard IO.h. 2300 01:54:21,700 --> 01:54:24,010 La meg gå videre og gi meg selv en int, viktigste, annullert. 2301 01:54:24,010 --> 01:54:27,380 Og la meg gå videre, kaller dette cough.c. 2302 01:54:27,380 --> 01:54:35,510 >> Og la meg gå videre og bare som Scratch, skrive ut hoste / n. 2303 01:54:35,510 --> 01:54:37,170 Og jeg ønsker å gjøre dette tre ganger. 2304 01:54:37,170 --> 01:54:39,670 Så jeg, selvfølgelig, bare gå kopiere og lime inn tre ganger. 2305 01:54:39,670 --> 01:54:46,440 Jeg er nå kommer til å gjøre hoste dot slash hoste. 2306 01:54:46,440 --> 01:54:50,120 La oss gi meg selv litt mer plass her, Enter, hoste, hoste, hoste. 2307 01:54:50,120 --> 01:54:53,970 >> Det er, selvsagt, allerede en mulighet for forbedring. 2308 01:54:53,970 --> 01:54:55,679 Jeg har kopiert og limt et par ganger i dag. 2309 01:54:55,679 --> 01:54:58,261 Men det var bare så jeg gjorde ikke må du skrive så mange tegn. 2310 01:54:58,261 --> 01:55:00,250 Jeg fortsatt endret hva disse linjene med kode er. 2311 01:55:00,250 --> 01:55:04,240 >> Disse tre linjene er identiske, som føles lat og faktisk er, 2312 01:55:04,240 --> 01:55:07,110 og er sannsynligvis ikke den rette tilnærmingen. 2313 01:55:07,110 --> 01:55:11,029 Så med det som ingrediens kan vi forbedre denne koden? 2314 01:55:11,029 --> 01:55:12,570 Vi trenger ikke å kopiere og lime inn koden. 2315 01:55:12,570 --> 01:55:15,070 >> Og, ja, helst du føler selv å kopiere og lime inn, 2316 01:55:15,070 --> 01:55:17,700 og ikke selv endre koden, oddsen er det en bedre måte. 2317 01:55:17,700 --> 01:55:19,470 Og, ja, det er. 2318 01:55:19,470 --> 01:55:22,510 La meg gå videre og gjøre en for loop, selv om syntaksen kanskje ikke 2319 01:55:22,510 --> 01:55:24,570 komme naturlig ennå. 2320 01:55:24,570 --> 01:55:29,494 >> Gjør dette tre ganger, rett og slett ved å gjøre following-- 2321 01:55:29,494 --> 01:55:31,160 og jeg tilfeldigvis vet dette fra praksis. 2322 01:55:31,160 --> 01:55:32,810 Men vi har en rekke eksempler nå. 2323 01:55:32,810 --> 01:55:34,950 Og du vil se online flere referanser fortsatt. 2324 01:55:34,950 --> 01:55:37,790 >> Dette er syntaksen på linje 6, som mye som Scratch som gjentar 2325 01:55:37,790 --> 01:55:40,090 blokk, gjenta følgende tre ganger. 2326 01:55:40,090 --> 01:55:41,340 Det er litt magisk for nå. 2327 01:55:41,340 --> 01:55:43,050 Men dette vil få mer, og mer kjent. 2328 01:55:43,050 --> 01:55:45,050 >> Og det kommer til å gjenta linje åtte tre ganger, 2329 01:55:45,050 --> 01:55:52,390 slik at hvis jeg re-kompilere make hoste, dot slash hoste, hoste, hoste, hoste. 2330 01:55:52,390 --> 01:55:54,030 Det fungerer fortsatt på samme måte. 2331 01:55:54,030 --> 01:55:55,550 Så det er alt fint og bra. 2332 01:55:55,550 --> 01:55:58,200 Men det er ikke veldig abstrahert. 2333 01:55:58,200 --> 01:55:59,371 >> Det er helt riktig. 2334 01:55:59,371 --> 01:56:01,370 Men det føles som om det kan være en mulighet, 2335 01:56:01,370 --> 01:56:03,750 som i verden Scratch, til slags start 2336 01:56:03,750 --> 01:56:07,530 å legge til noen semantikk her, slik at Jeg har ikke bare ha litt for loop, 2337 01:56:07,530 --> 01:56:09,867 og en funksjon som sier hoste, eller ikke hoste. 2338 01:56:09,867 --> 01:56:10,450 Vet du hva? 2339 01:56:10,450 --> 01:56:12,620 La meg prøve å være en litt kulere enn det, 2340 01:56:12,620 --> 01:56:16,090 og faktisk skrive en funksjon som har noen bivirkninger, kaller det hoste. 2341 01:56:16,090 --> 01:56:20,830 >> Og det tar ingen innspill, og returnerer ingen verdi som utgang. 2342 01:56:20,830 --> 01:56:22,680 Men vet du hva det betyr? 2343 01:56:22,680 --> 01:56:29,370 Det gjør dette-- printf, quote unquote, hoste. 2344 01:56:29,370 --> 01:56:32,380 >> Og nå opp her, skal jeg å gå videre og for int, 2345 01:56:32,380 --> 01:56:36,070 Jeg får null, jeg mindre enn tre, jeg pluss pluss. 2346 01:56:36,070 --> 01:56:39,770 Jeg skal ikke gjøre printf, som er uten tvil en lav implementering nivå 2347 01:56:39,770 --> 01:56:40,270 detalj. 2348 01:56:40,270 --> 01:56:41,353 Jeg bryr meg ikke om hvordan å hoste. 2349 01:56:41,353 --> 01:56:43,240 Jeg vil bare bruke hoste funksjonen. 2350 01:56:43,240 --> 01:56:44,840 Og jeg skal bare ringe hoste. 2351 01:56:44,840 --> 01:56:46,204 >> Nå merke motsetningen. 2352 01:56:46,204 --> 01:56:49,370 Når du ringer en funksjon, hvis du ikke ønsker å gi det innganger, helt fint. 2353 01:56:49,370 --> 01:56:51,780 Bare gjør åpne paren, nær paren, og du er ferdig. 2354 01:56:51,780 --> 01:56:56,271 >> Når du definerer en funksjon, eller erklære en funksjon prototype, 2355 01:56:56,271 --> 01:56:58,770 hvis du vet på forhånd er det ikke kommer til å ta noen argumenter, 2356 01:56:58,770 --> 01:57:01,170 si tomrommet i disse parentes der. 2357 01:57:01,170 --> 01:57:05,660 Og det gjør sikker på at du vil ikke tilfeldigvis misbruke den. 2358 01:57:05,660 --> 01:57:07,020 La meg gå videre og gjøre hoste. 2359 01:57:07,020 --> 01:57:08,540 Og, selvfølgelig, jeg har gjort en feil. 2360 01:57:08,540 --> 01:57:10,410 >> Faen, det er det implisitt erklæring. 2361 01:57:10,410 --> 01:57:11,325 Men det er fint. 2362 01:57:11,325 --> 01:57:12,590 Det er lett å fikse. 2363 01:57:12,590 --> 01:57:18,240 Jeg trenger bare prototypen høyere opp i filen min enn jeg faktisk bruker det. 2364 01:57:18,240 --> 01:57:20,070 >> Så nå la meg gjøre hoste igjen, hyggelig. 2365 01:57:20,070 --> 01:57:20,790 Nå fungerer det. 2366 01:57:20,790 --> 01:57:22,930 Gjør hoste, hoste, hoste, hoste. 2367 01:57:22,930 --> 01:57:25,930 Så du kanskje tror at vi er veldig drøyt ingeniør dette problemet. 2368 01:57:25,930 --> 01:57:26,763 Og, ja, vi er. 2369 01:57:26,763 --> 01:57:28,870 Dette er ikke en god kandidaten av et program 2370 01:57:28,870 --> 01:57:31,930 i øyeblikket for ommøblerer, og gjøre det som er 2371 01:57:31,930 --> 01:57:35,645 kalt hierarkisk nedbryting, hvor du tar noen kode, og deretter 2372 01:57:35,645 --> 01:57:38,790 du slags faktor ting ut, så som å tillegge flere semantikk til dem, 2373 01:57:38,790 --> 01:57:40,930 og bruke det til slutt lengre sikt. 2374 01:57:40,930 --> 01:57:43,490 Men det er en byggestein mot mer avanserte programmer 2375 01:57:43,490 --> 01:57:45,600 at vi vil starte skrive før lenge at 2376 01:57:45,600 --> 01:57:50,090 tillater oss å ha vokabularet med å skrive bedre kode. 2377 01:57:50,090 --> 01:57:52,920 Og, ja, la oss se om vi kan ikke generalisere dette nærmere. 2378 01:57:52,920 --> 01:57:57,984 >> Det virker litt halt som jeg, viktigste, trenger å bekymre deg for dette darn for loop, 2379 01:57:57,984 --> 01:57:59,400 og ringer hoste igjen og igjen. 2380 01:57:59,400 --> 01:58:03,050 Hvorfor kan jeg ikke bare fortelle hoste, kan hoste tre ganger? 2381 01:58:03,050 --> 01:58:08,170 Med andre ord, hvorfor kan jeg ikke bare gi innspill til hoste og gjøre dette? 2382 01:58:08,170 --> 01:58:11,270 >> Hvorfor kan jeg ikke bare si, i Hoved hoste tre ganger. 2383 01:58:11,270 --> 01:58:13,150 Og nå, dette er slags magisk. 2384 01:58:13,150 --> 01:58:14,540 Det er veldig iterativ her. 2385 01:58:14,540 --> 01:58:15,940 Og det er faktisk en baby trinn. 2386 01:58:15,940 --> 01:58:19,250 >> Men bare muligheten til å si videre linje åtte, hoste tre ganger, 2387 01:58:19,250 --> 01:58:20,730 det er bare så mye mer lesbar. 2388 01:58:20,730 --> 01:58:24,210 Og pluss, jeg trenger ikke å vite eller bryr seg hvordan hoste er implementert. 2389 01:58:24,210 --> 01:58:26,460 Og, ja, senere i sikt og for siste prosjekter, 2390 01:58:26,460 --> 01:58:29,150 hvis du takle et prosjekt med en klassekamerat eller to klassekamerater, 2391 01:58:29,150 --> 01:58:32,370 vil du innse at du kommer til å må, eller vil, dele arbeidet. 2392 01:58:32,370 --> 01:58:34,650 >> Og du kommer til å ønske å bestemme på forhånd, som kommer til å gjøre det, 2393 01:58:34,650 --> 01:58:35,483 og i hvilken stykker? 2394 01:58:35,483 --> 01:58:37,520 Og ville det ikke vært fint Hvis du, for eksempel, 2395 01:58:37,520 --> 01:58:40,100 ta ansvar for å skrive hoved, gjort. 2396 01:58:40,100 --> 01:58:43,470 Og romkameraten din, eller din partner mer generelt, 2397 01:58:43,470 --> 01:58:45,230 sørger for å implementere hoste. 2398 01:58:45,230 --> 01:58:49,540 >> Og denne divisjonen, disse vegger av abstraksjon, 2399 01:58:49,540 --> 01:58:52,310 eller lag av abstraksjon hvis du vil, er super kraftig, 2400 01:58:52,310 --> 01:58:55,480 fordi spesielt for større mer komplekse programmer og systemer, 2401 01:58:55,480 --> 01:59:00,070 det gjør at flere folk til å bygge ting sammen, og til slutt 2402 01:59:00,070 --> 01:59:02,680 sy sitt arbeid sammen på denne måten. 2403 01:59:02,680 --> 01:59:05,332 Men, selvfølgelig, vi må nå fikse hoste. 2404 01:59:05,332 --> 01:59:07,290 Vi må fortelle hoste at, hei, vet du hva? 2405 01:59:07,290 --> 01:59:11,230 Du kommer til å trenge å ta en input-- så ikke tomrom, men int og nå. 2406 01:59:11,230 --> 01:59:15,170 La oss gå videre og sette inn hoste int. jeg får null. 2407 01:59:15,170 --> 01:59:16,890 >> Jeg er mindre enn hvor mange ganger. 2408 01:59:16,890 --> 01:59:18,550 Jeg sa tre før. 2409 01:59:18,550 --> 01:59:20,420 Men det er ikke det jeg vil. 2410 01:59:20,420 --> 01:59:25,520 Jeg ønsker hoste å generaliseres til støtter en rekke iterasjoner. 2411 01:59:25,520 --> 01:59:28,800 >> Så, ja, det er n som jeg ønsker, hva brukeren forteller meg. 2412 01:59:28,800 --> 01:59:31,620 Nå kan jeg gå videre og si print hoste. 2413 01:59:31,620 --> 01:59:34,750 Og uansett hvilket nummer brukeren går inn, 2414 01:59:34,750 --> 01:59:36,890 Jeg vil gjenta at mange ganger. 2415 01:59:36,890 --> 01:59:39,160 >> Så på slutten av dagen, Programmet er identiske. 2416 01:59:39,160 --> 01:59:42,820 Men legg merke til alt dette ting kan til og med være i en annen fil. 2417 01:59:42,820 --> 01:59:45,620 Ja, jeg vet ikke på øyeblikk hvor printf er implementert. 2418 01:59:45,620 --> 01:59:47,980 >> Jeg vet ikke i øyeblikket hvordan får streng, eller få int, eller få flyte 2419 01:59:47,980 --> 01:59:48,646 blir gjennomført. 2420 01:59:48,646 --> 01:59:50,930 Og jeg ønsker ikke å se dem på skjermen min. 2421 01:59:50,930 --> 01:59:55,320 Som det er, jeg begynner å fokusere på mitt program, ikke disse funksjonene. 2422 01:59:55,320 --> 01:59:59,070 >> Og så, ja, så snart du starte facto kode som dette ut, 2423 01:59:59,070 --> 02:00:01,397 kunne vi til og med flytte hoste til en egen fil? 2424 02:00:01,397 --> 02:00:02,730 Noen andre kunne gjennomføre det. 2425 02:00:02,730 --> 02:00:06,810 Og du og din programmet bli veldig vakker, og svært lesbar, 2426 02:00:06,810 --> 02:00:10,830 uten tvil, egentlig fire tråd program der. 2427 02:00:10,830 --> 02:00:13,510 >> Så la oss gå videre nå og gjør en mer endring. 2428 02:00:13,510 --> 02:00:16,180 Legg merke til at min prototype har til å endre opp toppen. 2429 02:00:16,180 --> 02:00:18,390 Så la meg fikse det så Jeg får ikke skrek til. 2430 02:00:18,390 --> 02:00:22,580 >> Gjør hoste, la meg kjøre hoste gang mer, fortsatt gjør det samme. 2431 02:00:22,580 --> 02:00:26,010 Men nå ser vi har en ingrediens for en endelig versjon. 2432 02:00:26,010 --> 02:00:26,940 Vet du hva? 2433 02:00:26,940 --> 02:00:29,040 Jeg ønsker ikke å bare hoste, nødvendigvis. 2434 02:00:29,040 --> 02:00:30,802 Jeg vil ha noe mer generelt. 2435 02:00:30,802 --> 02:00:31,510 Så vet du hva? 2436 02:00:31,510 --> 02:00:32,450 Jeg ønsker å gjøre dette. 2437 02:00:32,450 --> 02:00:37,140 Jeg ønsker å ha, mye som Scratch gjør, å si blokk, men ikke bare 2438 02:00:37,140 --> 02:00:38,680 si noe viss antall ganger. 2439 02:00:38,680 --> 02:00:41,510 Jeg ønsker å si en veldig spesifikk streng. 2440 02:00:41,510 --> 02:00:43,850 Og derfor gjør jeg ikke vil den skal bare si hoste. 2441 02:00:43,850 --> 02:00:47,660 Jeg ønsker å si hva string er gått i. 2442 02:00:47,660 --> 02:00:49,960 >> Så legger merke til, har jeg generalisert dette slik at nå 2443 02:00:49,960 --> 02:00:53,110 si føles som et godt navn for dette, som Scratch, 2444 02:00:53,110 --> 02:00:55,530 tar to argumenter, i motsetning til Scratch. 2445 02:00:55,530 --> 02:00:56,570 Den ene er en streng. 2446 02:00:56,570 --> 02:00:57,300 Den ene er en int. 2447 02:00:57,300 --> 02:00:58,130 >> Og jeg kunne bytte dem. 2448 02:00:58,130 --> 02:01:00,713 Jeg bare slags liker tanken på si strengen først, og deretter 2449 02:01:00,713 --> 02:01:01,940 hvor mange ganger senere. 2450 02:01:01,940 --> 02:01:03,970 Void betyr det likevel returnerer ikke noe. 2451 02:01:03,970 --> 02:01:06,428 Dette er bare visuelle side effekter, som med [? Jordan,?] 2452 02:01:06,428 --> 02:01:08,240 en verbal bivirkning av roping. 2453 02:01:08,240 --> 02:01:12,630 Det gjør fortsatt noe n ganger, 0 opp til, men ikke lik n. 2454 02:01:12,630 --> 02:01:14,540 Dette betyr n totaltid. 2455 02:01:14,540 --> 02:01:16,540 Og så bare skrive ut hva som strengen er. 2456 02:01:16,540 --> 02:01:19,060 Så jeg har egentlig generalisert denne linjen med kode. 2457 02:01:19,060 --> 02:01:22,460 Så nå, hvordan bruker jeg hoste funksjon? 2458 02:01:22,460 --> 02:01:25,520 >> Jeg kan gjøre ugyldig hoste. 2459 02:01:25,520 --> 02:01:28,501 Og jeg kan fortsatt ta i hvordan mange ganger du ønsker å hoste. 2460 02:01:28,501 --> 02:01:29,250 Men vet du hva? 2461 02:01:29,250 --> 02:01:31,240 Jeg kan nå punt å si. 2462 02:01:31,240 --> 02:01:36,540 >> Jeg kan ringe si med Ordet hoste, passerer i n. 2463 02:01:36,540 --> 02:01:40,410 Og hvis jeg vil også implementere, bare for moro, et nys funksjon, 2464 02:01:40,410 --> 02:01:42,290 Jeg kan nyse noen flere ganger. 2465 02:01:42,290 --> 02:01:47,300 Og jeg kan holde gjenbruk n, fordi Legg merke til at m i denne sammenheng eller omfang 2466 02:01:47,300 --> 02:01:49,470 bare eksisterer innenfor denne funksjonen. 2467 02:01:49,470 --> 02:01:52,767 >> Og n i denne sammenheng bare eksisterer innenfor denne funksjonen her. 2468 02:01:52,767 --> 02:01:54,600 Så vi vil komme tilbake til disse problemene i omfang. 2469 02:01:54,600 --> 02:02:01,160 Og her, jeg bare kommer til å si, Achoo, og deretter n ganger, semikolon. 2470 02:02:01,160 --> 02:02:04,340 >> Og nå, jeg trenger bare å låne disse fungerer signaturer opp her. 2471 02:02:04,340 --> 02:02:06,290 Så hoste er riktig. 2472 02:02:06,290 --> 02:02:10,090 Void nys er riktig nå. 2473 02:02:10,090 --> 02:02:12,390 >> Og jeg trenger fortsatt bare si. 2474 02:02:12,390 --> 02:02:18,990 Så jeg kommer til å si, si string s, int n, semikolon. 2475 02:02:18,990 --> 02:02:22,010 Så jeg har over-konstruert på pokker ut av dette programmet. 2476 02:02:22,010 --> 02:02:23,760 >> Og dette betyr ikke nødvendigvis at dette er 2477 02:02:23,760 --> 02:02:26,343 hva du bør gjøre når du skriver selv de enkleste programmer. 2478 02:02:26,343 --> 02:02:29,280 Ta noe som er åpenbart veldig enkelt, veldig kort, 2479 02:02:29,280 --> 02:02:31,800 og re-implementere det bruker altfor mye kode. 2480 02:02:31,800 --> 02:02:34,560 Men vil du faktisk se, og i gang se tilbake på disse eksemplene, 2481 02:02:34,560 --> 02:02:38,610 og innser, oh, de er fremgangsmåten vi tok å faktisk generalisere, 2482 02:02:38,610 --> 02:02:40,797 faktor noe ut, inntil på slutten av dagen 2483 02:02:40,797 --> 02:02:42,380 koden min er faktisk ganske rimelig. 2484 02:02:42,380 --> 02:02:45,960 Fordi hvis jeg ønsker å hoste tre ganger så nyse tre ganger, 2485 02:02:45,960 --> 02:02:50,420 Jeg bare kommer til å kjøre dette, Programmet gjør hoste, og kjøre hoste. 2486 02:02:50,420 --> 02:02:53,620 Og jeg har tre hoste og tre nyser. 2487 02:02:53,620 --> 02:02:55,990 >> Og så dette er en grunnleggende paradigme, om du vil, 2488 02:02:55,990 --> 02:03:00,110 for hvordan vi kan gå om faktisk implementering av et program. 2489 02:03:00,110 --> 02:03:03,220 Men la oss bare se nå hva det er Vi har gjort alt dette tidspunktet, 2490 02:03:03,220 --> 02:03:06,940 og hva noen av de siste bitene står bak denne enkle kommandoen. 2491 02:03:06,940 --> 02:03:09,620 På slutten av dagen, har vi brukt klang som vår kompilatoren. 2492 02:03:09,620 --> 02:03:11,494 Vi har skrevet kilde kode, omdanning av det 2493 02:03:11,494 --> 02:03:12,820 via klang til maskinkode. 2494 02:03:12,820 --> 02:03:15,540 >> Og vi har brukt Gjør bare å legge til rette for våre tastetrykk så 2495 02:03:15,540 --> 02:03:20,740 at vi ikke trenger å huske disse besvergelser av klang selv. 2496 02:03:20,740 --> 02:03:22,640 Men hva er Make faktisk gjør? 2497 02:03:22,640 --> 02:03:24,750 Og, i sin tur, hvilken er Klang faktisk gjør? 2498 02:03:24,750 --> 02:03:28,790 >> Det viser seg, selv om vi har forenklet dagens diskusjon ved å si: 2499 02:03:28,790 --> 02:03:33,090 du tar kildekoden, går det som innspill til en kompilator, som gir deg 2500 02:03:33,090 --> 02:03:35,750 produksjon av maskin kode, viser seg det er 2501 02:03:35,750 --> 02:03:37,420 noen forskjellige skritt inne der. 2502 02:03:37,420 --> 02:03:41,940 Og kompilering skjer for å være paraplyen betegnelse for en hel haug med trinn. 2503 02:03:41,940 --> 02:03:43,970 Men la oss bare erte dette ut veldig raskt. 2504 02:03:43,970 --> 02:03:48,070 >> Det viser seg at vi har gjort flere ting hver gang jeg kjører et program, 2505 02:03:48,070 --> 02:03:50,990 eller hver gang jeg kompilere et program i dag. 2506 02:03:50,990 --> 02:03:55,020 Så forbehandling refererer til dette-- noe i et C-program, 2507 02:03:55,020 --> 02:03:58,720 som vi vil se igjen og igjen, som starter med denne hash symbol, 2508 02:03:58,720 --> 02:04:03,320 eller hashtag symbol her, betyr det er en preprosessor direktivet. 2509 02:04:03,320 --> 02:04:07,330 Det betyr at, i dette tilfellet, hei datamaskin, gjøre noe med denne filen 2510 02:04:07,330 --> 02:04:09,430 før du faktisk lage min egen kode. 2511 02:04:09,430 --> 02:04:15,220 >> I dette tilfellet omfatter nummerverdien er, hovedsak, C måte å si, 2512 02:04:15,220 --> 02:04:19,325 hei datamaskin, går du få innholdet av CS50.h og lime dem her. 2513 02:04:19,325 --> 02:04:22,170 Hei datamaskin, går du få Innholdet i standard IO.h, 2514 02:04:22,170 --> 02:04:24,690 uansett hvor det er på harddisk, lim den inn her. 2515 02:04:24,690 --> 02:04:27,390 Så disse tingene skje først under forbehandling. 2516 02:04:27,390 --> 02:04:28,880 >> Og klang gjør alt dette for oss. 2517 02:04:28,880 --> 02:04:30,510 Og det gjør det så darn rask, trenger du ikke engang 2518 02:04:30,510 --> 02:04:32,000 se fire forskjellige ting som skjer. 2519 02:04:32,000 --> 02:04:34,100 Men det er den første slike skritt. 2520 02:04:34,100 --> 02:04:35,560 >> Hva skjer egentlig nå? 2521 02:04:35,560 --> 02:04:38,320 Vel, den neste offisielle trinnet er kompilering. 2522 02:04:38,320 --> 02:04:40,385 Og det viser seg at kompilere et program 2523 02:04:40,385 --> 02:04:44,060 teknisk betyr å gå fra kildekode, ting vi har 2524 02:04:44,060 --> 02:04:47,890 vært å skrive i dag, til noe kalt forsamlingen kode, noe 2525 02:04:47,890 --> 02:04:49,260 som ser litt annerledes ut. 2526 02:04:49,260 --> 02:04:51,050 >> Og, faktisk, kan vi se dette virkelig fort. 2527 02:04:51,050 --> 02:04:53,890 La meg faktisk gå inn i min IDE. 2528 02:04:53,890 --> 02:04:58,050 La meg gå videre og åpne hello.c, som er den aller første programmet som vi 2529 02:04:58,050 --> 02:04:59,120 begynte i dag. 2530 02:04:59,120 --> 02:05:04,130 Og la meg gå videre og kjøre klang en litt annerledes, klang-s, hello.c, 2531 02:05:04,130 --> 02:05:07,720 som faktisk kommer til å gi meg en annen fil hello.s. 2532 02:05:07,720 --> 02:05:10,330 >> Og vi vil sannsynligvis aldri igjen se denne typen kode. 2533 02:05:10,330 --> 02:05:13,030 Hvis du tar et lavere nivå systemer klasse som CS61, 2534 02:05:13,030 --> 02:05:14,920 du vil se mye mer av denne type kode. 2535 02:05:14,920 --> 02:05:17,020 Men dette er assembly. 2536 02:05:17,020 --> 02:05:22,050 Dette er X86 assembly at den CPU som er underliggende 2537 02:05:22,050 --> 02:05:24,460 CS50 IDE faktisk forstår. 2538 02:05:24,460 --> 02:05:27,060 >> Og kryptisk da det gjør se, det er noe 2539 02:05:27,060 --> 02:05:29,180 datamaskinen forstår ganske godt. 2540 02:05:29,180 --> 02:05:30,790 Sub q, er dette en subtrahere. 2541 02:05:30,790 --> 02:05:31,660 Det er bevegelser. 2542 02:05:31,660 --> 02:05:35,730 >> Det ringer av funksjoner her, x-øringen, en bevegelse, et tillegg, en pop, 2543 02:05:35,730 --> 02:05:36,430 en retur. 2544 02:05:36,430 --> 02:05:38,850 Så det er noen veldig lave instruksjoner nivå 2545 02:05:38,850 --> 02:05:41,280 at CPUer forstår at Jeg antydet tidligere. 2546 02:05:41,280 --> 02:05:43,100 Det er det Intel Inside. 2547 02:05:43,100 --> 02:05:45,030 >> Det er mønstre av nuller og enere som 2548 02:05:45,030 --> 02:05:51,800 kart til disse arcanely formulert, men noe godt navngitt, instruksjoner, 2549 02:05:51,800 --> 02:05:52,780 så å si. 2550 02:05:52,780 --> 02:05:54,780 Det er hva som skjer når du kompilere koden din. 2551 02:05:54,780 --> 02:05:58,560 Du får montering språket ut av det, som 2552 02:05:58,560 --> 02:06:04,680 betyr det tredje trinnet er å montere at forsamlingen kode inn, til slutt, 2553 02:06:04,680 --> 02:06:09,080 maskin code-- nuller og enere, ikke tekst som vi nettopp så et øyeblikk siden. 2554 02:06:09,080 --> 02:06:13,370 >> Så pre-prosessering gjør at finne og erstatte, og et par andre ting. 2555 02:06:13,370 --> 02:06:16,430 Kompilering tar din kilde kode fra C, kildekode 2556 02:06:16,430 --> 02:06:18,980 som vi skrev, til montering kode som vi bare kikket på. 2557 02:06:18,980 --> 02:06:22,170 Montering hadde forsamlingen koden til nuller og enere 2558 02:06:22,170 --> 02:06:24,680 at CPU virkelig vil forstå på slutten av dagen. 2559 02:06:24,680 --> 02:06:27,630 Og linking er det siste trinnet det skjer for us-- igjen, 2560 02:06:27,630 --> 02:06:29,830 så fort vi ikke selv notice-- som sier: 2561 02:06:29,830 --> 02:06:32,460 hei datamaskin, ta alle nuller og enere som 2562 02:06:32,460 --> 02:06:36,750 resulterte fra kompilering Davids kode, og hans viktigste funksjonen i dette tilfellet. 2563 02:06:36,750 --> 02:06:39,160 >> Og hei datamaskin, går du få alle de nuller og enere 2564 02:06:39,160 --> 02:06:42,180 at CS50 ansatte skrev inne i CS50 biblioteket. 2565 02:06:42,180 --> 02:06:43,440 Bland de i med Davids. 2566 02:06:43,440 --> 02:06:46,648 Og hei datamaskin, går du få alle nullene og de som noen andre skrev år 2567 02:06:46,648 --> 02:06:47,470 siden for printf. 2568 02:06:47,470 --> 02:06:49,880 Og legg dem inn i hele greia, slik at vi har 2569 02:06:49,880 --> 02:06:52,870 fikk min nuller og enere, den CS50 ansattes nuller og enere, 2570 02:06:52,870 --> 02:06:55,370 printf nuller og enere, og alt annet vi bruker. 2571 02:06:55,370 --> 02:07:00,410 >> De blir kombinert sammen til ett Programmet heter, i dette tilfellet, hallo. 2572 02:07:00,410 --> 02:07:03,141 Så fra nå av, vil vi bare bruke ordet kompilering. 2573 02:07:03,141 --> 02:07:06,390 Og vi vil ta for gitt at når vi sier, kompilere programmet, det vil si, 2574 02:07:06,390 --> 02:07:08,849 hei gjøre pre-prosessering, montering, og linking. 2575 02:07:08,849 --> 02:07:11,890 Men det er faktisk noen saftig ting skjer der under panseret. 2576 02:07:11,890 --> 02:07:13,723 Og spesielt hvis du få nysgjerrig litt tid, 2577 02:07:13,723 --> 02:07:15,900 du kan begynne poking rundt på dette lavere nivå. 2578 02:07:15,900 --> 02:07:19,660 Men for nå, skjønner at blant gatekjøkken for i dag 2579 02:07:19,660 --> 02:07:23,420 er ganske enkelt begynnelsen av en prosess, 2580 02:07:23,420 --> 02:07:26,700 for å få komfortable med noe som hello world. 2581 02:07:26,700 --> 02:07:29,575 Ja, det meste av det vi gjorde i dag absolutt ikke vil synke i super rask. 2582 02:07:29,575 --> 02:07:31,491 Og det vil ta litt tid, og litt øvelse. 2583 02:07:31,491 --> 02:07:33,864 Og oddsen er, vil du sortere av ønsker å treffe tastaturet 2584 02:07:33,864 --> 02:07:34,780 eller kjefte på skjermen. 2585 02:07:34,780 --> 02:07:35,880 Og alt dette er OK. 2586 02:07:35,880 --> 02:07:38,320 Skjønt, kanskje prøve å ikke gjøre det i biblioteket så mye. 2587 02:07:38,320 --> 02:07:40,820 >> Og til slutt, vil du være i stand til selv å starte 2588 02:07:40,820 --> 02:07:44,580 se mønstre, både i god kode at du har skrevet og i feil 2589 02:07:44,580 --> 02:07:45,370 som du har gjort. 2590 02:07:45,370 --> 02:07:48,965 Og mye som fremgangs bli en TF eller en CA er like, 2591 02:07:48,965 --> 02:07:51,590 du begynner å bli bedre og flinkere til å se disse mønstrene, 2592 02:07:51,590 --> 02:07:53,774 og bare løse din egne problemer slutt. 2593 02:07:53,774 --> 02:07:56,940 I mellomtiden vil det være nok av oss å låne deg støtte, og få deg 2594 02:07:56,940 --> 02:07:57,481 gjennom dette. 2595 02:07:57,481 --> 02:07:59,450 Og i skrive-ups for alle problemene 2596 02:07:59,450 --> 02:08:01,366 vil du bli guidet gjennom alle kommandoene 2597 02:08:01,366 --> 02:08:05,330 at jeg sikkert vet fra mye trening nå, 2598 02:08:05,330 --> 02:08:07,380 men kan ha flydd over hodet for nå. 2599 02:08:07,380 --> 02:08:08,580 Og det er helt greit. 2600 02:08:08,580 --> 02:08:11,230 >> Men, til slutt, du kommer å begynne å se mønstre dukker opp. 2601 02:08:11,230 --> 02:08:14,260 Og når du kommer forbi alle dumme detaljer, som parenteser, 2602 02:08:14,260 --> 02:08:16,710 og klammeparentes, og semikolon, og ting, ærlig, 2603 02:08:16,710 --> 02:08:19,360 det er ikke i det hele tatt intellektuelt interessant. 2604 02:08:19,360 --> 02:08:22,690 Og det er ikke målet for tar noen innledende klasse. 2605 02:08:22,690 --> 02:08:24,410 Det er de ideer som kommer til å spille noen rolle. 2606 02:08:24,410 --> 02:08:26,659 >> Det er looper, og forhold, og de funksjoner, 2607 02:08:26,659 --> 02:08:30,552 og mer kraftfullt abstraksjon, og factoring av kode, 2608 02:08:30,552 --> 02:08:33,510 og god design, og den gode stil, og til slutt riktig 2609 02:08:33,510 --> 02:08:37,330 av koden din, det er slutt skal saken mest. 2610 02:08:37,330 --> 02:08:40,925 Så neste uke, vil vi ta disse ideer som vi først så i Scratch 2611 02:08:40,925 --> 02:08:42,800 og har nå oversatt til C. Og vi starter 2612 02:08:42,800 --> 02:08:45,740 å introdusere den første av de kursets virkelige verden domener. 2613 02:08:45,740 --> 02:08:50,140 >> Vi vil fokusere på verden av sikkerhet, og mer spesifikt kryptografi, 2614 02:08:50,140 --> 02:08:51,980 kunsten scrambling informasjon. 2615 02:08:51,980 --> 02:08:54,000 Og blant de første problemer du selv 2616 02:08:54,000 --> 02:08:56,840 vil komme til å skrive ut spille med noen av syntaks 2617 02:08:56,840 --> 02:08:59,880 og løse noen logisk problemer, slutt før lang, 2618 02:08:59,880 --> 02:09:03,960 er å faktisk rykke ut, eller kryptere, og til slutt dekryptere informasjon. 2619 02:09:03,960 --> 02:09:06,470 Og alt vi har gjort i dag, vil ganske lav 2620 02:09:06,470 --> 02:09:09,190 nivå, er bare kommer til å tillate oss å ta en og en, 2621 02:09:09,190 --> 02:09:13,550 og ett skritt over mot skriver de mest interessante koden ennå. 2622 02:09:13,550 --> 02:09:15,050 >> Så mer om det i neste uke. 2623 02:09:15,050 --> 02:09:17,834 2624 02:09:17,834 --> 02:09:18,762 >> [VIDEO PLAYBACK] 2625 02:09:18,762 --> 02:09:19,690 2626 02:09:19,690 --> 02:09:22,006 >> -Hva Kan du fortelle meg om siste gang du så ham? 2627 02:09:22,006 --> 02:09:26,041 2628 02:09:26,041 --> 02:09:27,040 -Hva Kan jeg si, egentlig? 2629 02:09:27,040 --> 02:09:30,500 2630 02:09:30,500 --> 02:09:35,340 Jeg mener, det var som alle andre pre-produksjon øving, 2631 02:09:35,340 --> 02:09:40,510 bortsett fra det var noe han sa helt på slutten som stakk med meg. 2632 02:09:40,510 --> 02:09:44,810 2633 02:09:44,810 --> 02:09:46,640 >> -Dette Var CS50. 2634 02:09:46,640 --> 02:09:49,440 2635 02:09:49,440 --> 02:09:52,190 >> -Det Er et kutt alle, god jobb på øving. 2636 02:09:52,190 --> 02:09:53,070 >> -Det Er lunsj? 2637 02:09:53,070 --> 02:09:54,986 >> -Ja, Du og jeg kan ta en sandwich i en bit. 2638 02:09:54,986 --> 02:09:58,380 La meg bare debrief med David veldig raskt. 2639 02:09:58,380 --> 02:09:59,160 David? 2640 02:09:59,160 --> 02:10:01,260 David? 2641 02:10:01,260 --> 02:10:03,110 >> [END PLAYBACK]