1 00:00:00,000 --> 00:00:00,000 2 00:00:00,000 --> 00:00:00,000 [MUSIK AFSPILLER] 3 00:00:00,000 --> 00:00:13,950 4 00:00:13,950 --> 00:00:16,240 >> DAVID J. MALAN: Okay, det er CS50. 5 00:00:16,240 --> 00:00:18,010 Og dette er uge én. 6 00:00:18,010 --> 00:00:22,050 Så minde om, at sidste gang i uge nul, vi fokuseret på beregningsmæssige tænkning. 7 00:00:22,050 --> 00:00:25,440 Og vi gået fra at for at Scratch, en grafisk programmering 8 00:00:25,440 --> 00:00:27,360 sprog fra vores venner på MIT Media Lab. 9 00:00:27,360 --> 00:00:31,730 >> Og med Scratch, vi udforske ideer som funktioner og betingelser, 10 00:00:31,730 --> 00:00:35,210 og loops, og variable, og selv begivenheder og tråde, og meget mere. 11 00:00:35,210 --> 00:00:37,880 Og i dag, vi vil fortsætte med at bruge disse idéer, 12 00:00:37,880 --> 00:00:40,630 og virkelig tager dem for givet, men oversætte dem 13 00:00:40,630 --> 00:00:44,220 til et andet sprog kendt som C. Nu C er en mere traditionel sprog. 14 00:00:44,220 --> 00:00:46,020 Det er et lavere niveau sprog, hvis du vil. 15 00:00:46,020 --> 00:00:47,300 >> Det er rent tekstmæssige. 16 00:00:47,300 --> 00:00:49,910 Og så ved første øjekast, er det alle kommer til at se temmelig kryptisk 17 00:00:49,910 --> 00:00:51,430 hvis du aldrig har programmeret før. 18 00:00:51,430 --> 00:00:53,530 Vi kommer til at have semikolon og parenteser, 19 00:00:53,530 --> 00:00:55,150 og krøllede parenteser, og meget mere. 20 00:00:55,150 --> 00:00:57,240 Men indse, at selv selvom syntaksen er 21 00:00:57,240 --> 00:01:00,600 om at se lidt uvant til de fleste af jer, se forbi det. 22 00:01:00,600 --> 00:01:03,220 Og prøv at se ideerne der er, ja, velkendte, 23 00:01:03,220 --> 00:01:06,750 fordi her i uge ét hvad Vi vil begynde at gøre, er at sammenligne, 24 00:01:06,750 --> 00:01:08,980 i første omgang, Scratch versus C. 25 00:01:08,980 --> 00:01:12,350 >> Så for eksempel huske, at når vi gennemførte den første af vores programmer 26 00:01:12,350 --> 00:01:16,220 sidste gang, havde vi en blok, der kiggede lidt noget lignende denne-- når 27 00:01:16,220 --> 00:01:19,990 grønne flag klikkede, og derefter havde vi en eller flere puslespilsbrikker under det, 28 00:01:19,990 --> 00:01:22,150 i dette tilfælde, siger, hej verden. 29 00:01:22,150 --> 00:01:24,870 Så, ja, i Scratch, når jeg klikker det grønne flag 30 00:01:24,870 --> 00:01:27,390 at køre mit program, så at tale, disse er 31 00:01:27,390 --> 00:01:29,520 de blokke, der bliver udført, eller køre. 32 00:01:29,520 --> 00:01:32,230 Og specifikt Scratch sagde goddag, verden. 33 00:01:32,230 --> 00:01:35,377 >> Nu, jeg kunne have specificeret forskellige ord her. 34 00:01:35,377 --> 00:01:37,960 Men vi vil se, at, ja, mange af disse blocks-- og faktisk, 35 00:01:37,960 --> 00:01:41,880 i C mange functions-- kan være parametriseret eller tilpasset 36 00:01:41,880 --> 00:01:43,150 at gøre forskellige ting. 37 00:01:43,150 --> 00:01:45,520 Faktisk i C, hvis vi vil konvertere, nu, 38 00:01:45,520 --> 00:01:47,567 dette Scratch program til dette andet sprog, 39 00:01:47,567 --> 00:01:49,650 vi kommer til at skrive en lidt noget som dette. 40 00:01:49,650 --> 00:01:52,540 >> Indrømmet, der er nogle ukendte syntaks der mest sandsynligt, int, 41 00:01:52,540 --> 00:01:54,380 og parenteser og ugyldig. 42 00:01:54,380 --> 00:01:57,740 Men printf-- selvom du ville tror, ​​det ville bare være print. 43 00:01:57,740 --> 00:02:00,120 Men print betyder print formateret, da vi snart vil se. 44 00:02:00,120 --> 00:02:02,140 Denne bogstaveligt talt vil udskrive til skærmen uanset 45 00:02:02,140 --> 00:02:05,990 er inde i disse parenteser, som selvfølgelig i dette tilfælde er, hej verden. 46 00:02:05,990 --> 00:02:09,290 >> Men du vil opdage nogle andre syntaks, nogle dobbelte anførselstegn, 47 00:02:09,290 --> 00:02:11,890 at parenteserne i slutningen, semikolon og lignende. 48 00:02:11,890 --> 00:02:15,027 Så der er lidt af overhead, så at sige, både kognitivt 49 00:02:15,027 --> 00:02:17,860 og syntaktisk, at vi vil at skulle huske inden længe. 50 00:02:17,860 --> 00:02:20,720 Men indse, at med praksis, dette vil begynde at hoppe ud på dig. 51 00:02:20,720 --> 00:02:24,920 >> Faktisk lad os fokusere på at en funktion specifically-- i dette tilfælde, 52 00:02:24,920 --> 00:02:26,290 sige goddag verden. 53 00:02:26,290 --> 00:02:27,560 Så siger er den funktion. 54 00:02:27,560 --> 00:02:31,320 Hello world er dens parameter, eller argument, dens tilpasning. 55 00:02:31,320 --> 00:02:34,320 >> Og ækvivalensen i C er bare vil være denne ene linje her, 56 00:02:34,320 --> 00:02:38,710 hvor printf svarer til, siger, den dobbelte citeret streng, hej 57 00:02:38,710 --> 00:02:41,470 verden er ækvivalent, selvfølgelig, til hvad der er i den hvide boks der. 58 00:02:41,470 --> 00:02:45,680 Og omvendt skråstreg n, men lidt mærkeligt og fraværende fra Scratch, 59 00:02:45,680 --> 00:02:49,380 blot vil have den virkning, vi får se i en computer, som min Mac eller en pc, 60 00:02:49,380 --> 00:02:51,660 for blot at bevæge markøren til den næste linje. 61 00:02:51,660 --> 00:02:53,970 Det er ligesom at ramme Enter på tastaturet. 62 00:02:53,970 --> 00:02:55,580 >> Så vi vil se det igen inden længe. 63 00:02:55,580 --> 00:02:58,640 Men først, lad os tage et kig på denne andet eksempel i tilfældet af løkker. 64 00:02:58,640 --> 00:03:02,830 Vi havde denne evigt loop sidste gang, som var en serie af puslespilsbrikker 65 00:03:02,830 --> 00:03:05,490 der gjorde noget bogstaveligt forever-- i denne sag, 66 00:03:05,490 --> 00:03:08,360 siger, hello verden, hello verden, hej verden, hej verden. 67 00:03:08,360 --> 00:03:10,350 Så det er en uendelig løkke ved design. 68 00:03:10,350 --> 00:03:14,580 >> I C, hvis vi ønsker at gennemføre denne samme idé, kan vi simpelthen gøre dette. 69 00:03:14,580 --> 00:03:19,570 Mens sandt, printf hej verden-nu mens, bare semantisk, sådan 70 00:03:19,570 --> 00:03:23,090 fremmaner tanken om at gøre noget igen og igen og igen, 71 00:03:23,090 --> 00:03:23,980 og hvor længe? 72 00:03:23,980 --> 00:03:27,990 Nå, true-- minde om, at sand er lige på eller én. 73 00:03:27,990 --> 00:03:30,660 >> Og sandt er naturligvis altid sandt. 74 00:03:30,660 --> 00:03:33,060 Så det er lidt af en meningsløs erklæring bare at sige sandt. 75 00:03:33,060 --> 00:03:36,890 Men ja, det er bevidst, fordi hvis sand er bare altid sandt, 76 00:03:36,890 --> 00:03:40,850 end mens sand bare antyder, hvis lidt indirekte 77 00:03:40,850 --> 00:03:44,070 at følgende linjer kode i mellem disse krøllede parenteser 78 00:03:44,070 --> 00:03:48,320 skulle bare udføre igen og igen, og igen, og faktisk aldrig stoppe. 79 00:03:48,320 --> 00:03:50,230 >> Men hvis du vil have din løkke til at stoppe, som vi 80 00:03:50,230 --> 00:03:54,500 gjorde sidste gang med noget lignende dette, gentag følgende 50 gange, 81 00:03:54,500 --> 00:03:57,700 i C kan vi gøre det samme med, hvad der er kaldes en for loop-- nøgleordet 82 00:03:57,700 --> 00:03:59,330 ikke at blive, mens, men for. 83 00:03:59,330 --> 00:04:03,290 Og så har vi nogle nye syntaks her, med int i er lig med 0, i mindre end 50, 84 00:04:03,290 --> 00:04:03,880 Jeg ++. 85 00:04:03,880 --> 00:04:05,430 Og vi vil vende tilbage til. 86 00:04:05,430 --> 00:04:09,660 Men det er simpelthen, hvordan vi ville oversætte sæt Skrab blokke 87 00:04:09,660 --> 00:04:13,079 til et sæt af C linjer kode. 88 00:04:13,079 --> 00:04:14,450 >> I mellemtiden overveje variabler. 89 00:04:14,450 --> 00:04:16,540 Og i virkeligheden, vi bare så en et øjeblik siden. 90 00:04:16,540 --> 00:04:21,220 Og i tilfælde af Scratch, hvis vi ønskede at erklære en variabel kaldet i 91 00:04:21,220 --> 00:04:24,590 for jeg bliver heltal, bare et nummer, og vi ønsker at indstille den til en vis værdi, 92 00:04:24,590 --> 00:04:28,410 vi ville bruge denne appelsin blokere her-- sat i til 0. 93 00:04:28,410 --> 00:04:30,800 >> Og vi vil se i dag, og ud over, ligesom i sidste uge, 94 00:04:30,800 --> 00:04:33,850 programmører gøre næsten altid begynde at tælle fra nul, virkelig 95 00:04:33,850 --> 00:04:34,950 efter sædvane. 96 00:04:34,950 --> 00:04:37,250 Men også fordi tilbagekaldelse fra vores diskussion af binære, 97 00:04:37,250 --> 00:04:39,990 det mindste tal, du kan repræsenterer med et vilkårligt antal bits 98 00:04:39,990 --> 00:04:41,640 er bare at være 0 selv. 99 00:04:41,640 --> 00:04:45,190 Og så vil vi generelt starter initialisering selv vores variabler til 0. 100 00:04:45,190 --> 00:04:47,710 >> Og i C at gøre det samme, vi kommer til at sige int 101 00:04:47,710 --> 00:04:50,110 for heltal, jeg bare efter sædvane. 102 00:04:50,110 --> 00:04:53,390 Jeg kunne have kaldt denne variabel hvad jeg vil, ligesom i Scratch. 103 00:04:53,390 --> 00:04:57,770 Og så lig 0 kun tildeler værdien 0 fra højre 104 00:04:57,770 --> 00:05:01,319 og sætter det ind i variablen, eller opbevaringsbeholder der, til venstre. 105 00:05:01,319 --> 00:05:04,360 Og semikolon som vi vil see-- og Vi har set et par af disse already-- 106 00:05:04,360 --> 00:05:06,530 betyder bare slutningen af ​​tanke. 107 00:05:06,530 --> 00:05:09,430 Fortsæt at gøre noget andet på de linjer, der følger. 108 00:05:09,430 --> 00:05:11,330 >> Nu, hvad booleske udtryk? 109 00:05:11,330 --> 00:05:14,320 Husk på, at i Scratch, disse var udtryk 110 00:05:14,320 --> 00:05:16,740 der er enten sand eller false-- spørgsmål, 111 00:05:16,740 --> 00:05:18,910 virkelig, at enten er sande eller falske. 112 00:05:18,910 --> 00:05:21,960 Så i tilfælde af Scratch, måske vi stille et simpelt spørgsmål som dette, 113 00:05:21,960 --> 00:05:24,586 er jeg mindre end 50? 114 00:05:24,586 --> 00:05:25,710 Så jeg, igen, er et helt tal. 115 00:05:25,710 --> 00:05:27,210 Måske vi bruger det i et Scratch program 116 00:05:27,210 --> 00:05:29,310 at holde styr på en score eller sådan noget. 117 00:05:29,310 --> 00:05:33,810 Så denne syntaks her i Scratch betyder bare, er jeg mindre end 50? 118 00:05:33,810 --> 00:05:37,330 Nå, heldigvis, noget er enkel i C. Og at oversætte, 119 00:05:37,330 --> 00:05:41,780 dette ville vi blot sige jeg mindre end 50, under anvendelse af velkendte nøgle 120 00:05:41,780 --> 00:05:42,850 på tastaturet. 121 00:05:42,850 --> 00:05:45,141 >> I mellemtiden, hvis du ville sige noget mere generelt, 122 00:05:45,141 --> 00:05:49,890 lignende, godt, er x mindre end y, hvor hver af x og y er selv variabler? 123 00:05:49,890 --> 00:05:52,280 Vi kan gøre det samme i C, så længe vi har 124 00:05:52,280 --> 00:05:53,942 skabt disse variabler allerede. 125 00:05:53,942 --> 00:05:55,650 Og vi vil se, hvordan du gøre det inden længe. 126 00:05:55,650 --> 00:05:58,590 Vi vil blot sige x mindre end y. 127 00:05:58,590 --> 00:06:00,530 >> Så du begynder at se nogle ligheder. 128 00:06:00,530 --> 00:06:03,490 Og de folk, der har foretaget Scratch var bestemt 129 00:06:03,490 --> 00:06:05,250 inspireret af nogle af disse grundlæggende ideer. 130 00:06:05,250 --> 00:06:10,350 Og du vil se denne form for syntaks 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 sprog stadig. 133 00:06:14,790 --> 00:06:18,270 >> Lad os overveje en anden konstruktion fra C, begrebet en tilstand, 134 00:06:18,270 --> 00:06:20,370 gør noget betinget. 135 00:06:20,370 --> 00:06:22,720 Hvis noget er sandt, at gøre dette. 136 00:06:22,720 --> 00:06:24,457 Hvis noget andet er sandt, gør det. 137 00:06:24,457 --> 00:06:27,040 Det er en slags programmering svarende til en gaffel i vejen. 138 00:06:27,040 --> 00:06:29,730 Måske er det en to-vejs gaffel, en tre-vejs gaffel, eller mere. 139 00:06:29,730 --> 00:06:32,800 Og i Scratch, kunne vi have set noget som dette. 140 00:06:32,800 --> 00:06:34,010 >> Så denne ene er en stor en. 141 00:06:34,010 --> 00:06:36,750 Men overveje den relative enkelhed af logik. 142 00:06:36,750 --> 00:06:44,010 Hvis x er mindre end y, så siger x er mindre end y, ellers hvis x er større end y, 143 00:06:44,010 --> 00:06:46,230 så sige x er større end y. 144 00:06:46,230 --> 00:06:48,300 Og så, logisk, hvis du tænker tilbage på Scratch 145 00:06:48,300 --> 00:06:52,610 eller bare din egen menneskelige intuition, godt, hvis x ikke er større end y, og x 146 00:06:52,610 --> 00:06:57,000 ikke er mindre end y, så selvfølgelig x vil være lig med y. 147 00:06:57,000 --> 00:06:59,690 Så i dette tilfælde, ved indlejring disse Skrab blokke, 148 00:06:59,690 --> 00:07:02,580 kan vi opnå en tre måde gaffel i vejen? 149 00:07:02,580 --> 00:07:04,980 >> I mellemtiden, hvis vi ønsker at gøre det i C, det velsagtens 150 00:07:04,980 --> 00:07:08,420 ser lidt simpler-- mindst når du får fortrolig med syntaks. 151 00:07:08,420 --> 00:07:12,050 Hvis x er mindre end y, printf x er mindre end y. 152 00:07:12,050 --> 00:07:16,140 Ellers hvis x er større end y, printf x er større end y. 153 00:07:16,140 --> 00:07:21,210 Else printf x er lig med y-- og, igen, med dem, backslash slutter lige 154 00:07:21,210 --> 00:07:24,160 for de nye linjer, så hvis du faktisk løb denne form for program 155 00:07:24,160 --> 00:07:25,940 Det ville bare flytte markøren i sidste ende 156 00:07:25,940 --> 00:07:28,100 til den næste linje af skærmen. 157 00:07:28,100 --> 00:07:31,270 >> Nu, i mellemtiden Scratch havde andre mere avancerede funktioner, kun 158 00:07:31,270 --> 00:07:34,320 hvoraf vi vil oprindeligt flytte over til en verden af ​​C. 159 00:07:34,320 --> 00:07:37,010 Og en af ​​dem var kaldes en liste i bunden. 160 00:07:37,010 --> 00:07:39,100 Og dette var en særlig type variabel, der 161 00:07:39,100 --> 00:07:42,840 tilladt dig at gemme flere ting i det tilbage, til tilbage, til tilbage, til at bakke. 162 00:07:42,840 --> 00:07:45,540 >> I C, har det ikke lister, per se, men noget 163 00:07:45,540 --> 00:07:48,090 der er mere generelt kaldet arrays, selvom vi 164 00:07:48,090 --> 00:07:50,590 komme tilbage senere dette semester at se på noget 165 00:07:50,590 --> 00:07:52,780 kaldes en liste, eller virkelig en linket liste. 166 00:07:52,780 --> 00:07:55,510 Men for nu, det tætteste tilsvarende i C for os 167 00:07:55,510 --> 00:07:57,345 kommer til at være noget kaldes et array. 168 00:07:57,345 --> 00:07:59,740 Og et array er simpelthen en særlig type variabel 169 00:07:59,740 --> 00:08:03,160 der giver dig mulighed for at lagre data tilbage, til tilbage, til tilbage, mod ryg. 170 00:08:03,160 --> 00:08:05,840 >> Og, ja, i Scratch, hvis vi ønskede at få adgang til 171 00:08:05,840 --> 00:08:09,030 det første element i en matrix eller en list-- og jeg har tænkt mig at kalde det, 172 00:08:09,030 --> 00:08:13,600 konventionelt, argv, argument vektor, men mere om det inden længe. 173 00:08:13,600 --> 00:08:17,090 Hvis jeg ønsker at få på det første element af argv i verden af ​​Scratch 174 00:08:17,090 --> 00:08:20,930 du rent faktisk gør typisk begynde at tælle 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 implementeret begrebet lister. 177 00:08:26,310 --> 00:08:29,860 Men i C, vil jeg mere simpelthen bare sige, argv, 178 00:08:29,860 --> 00:08:32,758 som igen er navnet på min list-- eller for at være klar, et array. 179 00:08:32,758 --> 00:08:34,549 Og hvis jeg vil have den første elementer, jeg har tænkt mig 180 00:08:34,549 --> 00:08:37,890 at bruge kantede parenteser, som du måske ikke ofte anvendes under et tastatur. 181 00:08:37,890 --> 00:08:40,150 >> Men 0 betyder bare, få mig den første. 182 00:08:40,150 --> 00:08:42,160 Så på lejlighed og som tiden går, vi vil 183 00:08:42,160 --> 00:08:44,570 at begynde at se disse dikotomier mellem Scratch og C, 184 00:08:44,570 --> 00:08:46,070 hvorved Scratch bruger et. 185 00:08:46,070 --> 00:08:47,670 Vi i C bruger 0 her. 186 00:08:47,670 --> 00:08:49,420 Men du vil hurtigt se når du forstår 187 00:08:49,420 --> 00:08:52,920 grundlaget for hvert sprog, at disse ting begynder at få alle de mere 188 00:08:52,920 --> 00:08:56,860 bekendt gennem praksis og praksis. 189 00:08:56,860 --> 00:08:59,700 >> Så lad os faktisk ser nu på et program. 190 00:08:59,700 --> 00:09:04,031 Her er den første af vores C kildekoden til komplette programmer. 191 00:09:04,031 --> 00:09:06,280 Og det program, vi skal hen at tilbyde til overvejelse 192 00:09:06,280 --> 00:09:09,340 er den, der er ækvivalent til dette tidligere Scratch stykke. 193 00:09:09,340 --> 00:09:13,210 >> Så her har vi, hvad der er nok den enkleste C-programmet 194 00:09:13,210 --> 00:09:15,410 du kan skrive, at faktisk gør noget. 195 00:09:15,410 --> 00:09:18,250 Nu vil vi kigge forbi, for nu, er omfatte, 196 00:09:18,250 --> 00:09:21,190 standard io.h, og disse vinkel beslag, og int, og ugyldig, 197 00:09:21,190 --> 00:09:22,840 og de krøllede parenteser og lignende. 198 00:09:22,840 --> 00:09:25,390 >> Og lad os bare fokusere på hvad det mindste intuitivt, 199 00:09:25,390 --> 00:09:26,860 kan springe ud på dig allerede. 200 00:09:26,860 --> 00:09:30,300 Faktisk vigtigste, det gør jeg ikke nødvendigvis ved, hvad det er, 201 00:09:30,300 --> 00:09:34,580 men meget gerne Scratch havde at når grønt flag klikket puslespilsbrik, 202 00:09:34,580 --> 00:09:39,070 så gør C som et programmeringssprog har en vigtigste stykke kode, 203 00:09:39,070 --> 00:09:43,380 bliver udført som standard. Og faktisk det er bogstaveligt talt kommer til at blive kaldt vigtigste. 204 00:09:43,380 --> 00:09:44,720 >> Så vigtigste er en funktion. 205 00:09:44,720 --> 00:09:48,720 Og det er en speciel funktion, der eksisterer i C, at når du kører et program, 206 00:09:48,720 --> 00:09:52,720 Det er vigtigste, der bliver drevet af misligholdelse. I en verden af ​​Scratch, 207 00:09:52,720 --> 00:09:56,970 det var normalt når grønt flag klikkede der fik kørt som standard. 208 00:09:56,970 --> 00:10:01,130 >> I mellemtiden har vi set det før, printf eller udskrive formateret, det er 209 00:10:01,130 --> 00:10:05,620 kommer til at være en funktion, der kommer med C, sammen med en hel masse andre, 210 00:10:05,620 --> 00:10:10,140 denne vilje fra tid og tid igen, for at gøre præcis 211 00:10:10,140 --> 00:10:12,450 som navnet antyder, udskrive noget. 212 00:10:12,450 --> 00:10:13,500 Hvad ønsker vi at udskrive? 213 00:10:13,500 --> 00:10:15,770 Nå, vil vi se, at ved omsluttende tegn 214 00:10:15,770 --> 00:10:18,680 ligesom these-- hej verden, omvendt skråstreg n i anførselstegn, 215 00:10:18,680 --> 00:10:23,040 vi kan fortælle printf præcis hvad der skal udskrives på skærmen. 216 00:10:23,040 --> 00:10:26,430 >> Men for at gøre at vi desværre 217 00:10:26,430 --> 00:10:30,010 nødt til at tage noget, der er allerede kryptisk for os mennesker, 218 00:10:30,010 --> 00:10:34,510 men i det mindste er det noget readable-- skarp indbefatter standard io.h, int, 219 00:10:34,510 --> 00:10:39,340 vigtigste, ugyldig, printf, alle de magiske besværgelser vi lige har set på skærmen. 220 00:10:39,340 --> 00:10:42,470 Men vi faktisk nødt til at gå mere mystiske stadig. 221 00:10:42,470 --> 00:10:47,140 Vi først nødt til at oversætte koden at vi skriver til maskinkode. 222 00:10:47,140 --> 00:10:51,370 Og husker fra sidste uge, at maskiner, mindst dem vi kender her, 223 00:10:51,370 --> 00:10:54,450 ved udgangen af ​​dag kun forstå nuller og ettaller. 224 00:10:54,450 --> 00:10:58,100 >> Og min Gud, hvis vi skulle skrive disse nuller og ettaller til faktisk program, 225 00:10:58,100 --> 00:11:01,260 det ville meget, meget hurtigt tage det sjove ud af noget. 226 00:11:01,260 --> 00:11:05,150 Men det viser sig, per sidste uge, at disse mønstre af nuller og ettaller 227 00:11:05,150 --> 00:11:06,400 bare har en særlig betydning. 228 00:11:06,400 --> 00:11:08,500 I visse sammenhænge, de kan betyde numre. 229 00:11:08,500 --> 00:11:11,840 >> I nogle sammenhænge kan de betyde bogstaver, eller farver, eller en række 230 00:11:11,840 --> 00:11:14,710 af andre abstraktioner der på. 231 00:11:14,710 --> 00:11:18,450 Men ligesom din computer har en CPU, Central Processing Unit, 232 00:11:18,450 --> 00:11:20,390 eller hjernen inde i din computer. 233 00:11:20,390 --> 00:11:22,240 Det er normalt Intel indeni, fordi det er 234 00:11:22,240 --> 00:11:24,900 en af ​​de største virksomheder der gør CPU'er til computere. 235 00:11:24,900 --> 00:11:28,910 >> Nå, Intel CPU'er og andre simpelthen har besluttet på forhånd 236 00:11:28,910 --> 00:11:33,970 at visse mønstre af nuller og dem forstås specifikke ting. 237 00:11:33,970 --> 00:11:37,040 Visse mønstre af nuller og ettaller vil betyde, udskrive denne til skærmen, 238 00:11:37,040 --> 00:11:39,710 eller tilføje disse to tal, eller subtrahere disse to tal, 239 00:11:39,710 --> 00:11:43,310 eller flytte dette stykke data fra min computers hukommelse herovre, 240 00:11:43,310 --> 00:11:47,870 eller en række andre meget lavt niveau, men i sidste ende nyttige operationer. 241 00:11:47,870 --> 00:11:53,022 Men heldigvis vi mennesker vil ikke til brug for at vide dette niveau af detaljer. 242 00:11:53,022 --> 00:11:56,230 Faktisk ligesom sidste gang, hvor vi indvindes igen og igen og igen, 243 00:11:56,230 --> 00:11:58,930 bygning fra meget lavt niveau primitiver som nuller og ettaller 244 00:11:58,930 --> 00:12:01,160 til begreber højere niveau lignende tal og bogstaver, 245 00:12:01,160 --> 00:12:04,330 og farver, og mere, så kan vi som programmører 246 00:12:04,330 --> 00:12:07,080 stå på skuldrene af andre, der er kommet før os 247 00:12:07,080 --> 00:12:11,260 og bruge software, som andre folk har skrevet før os-- 248 00:12:11,260 --> 00:12:14,340 nemlig programmer kaldet compilere. 249 00:12:14,340 --> 00:12:17,770 >> C er et sprog, sædvanligvis kompileret, 250 00:12:17,770 --> 00:12:22,130 hvilket betyder konverteret fra kildekoden til maskinkode. 251 00:12:22,130 --> 00:12:25,230 , Hvad det betyder især er, at hvis du har fået din kilde 252 00:12:25,230 --> 00:12:29,530 kode, som du selv skriver, som vi snart vil i bare et øjeblik på skærmen, 253 00:12:29,530 --> 00:12:33,140 og du ønsker at konvertere den sidste ende til maskinen code-- 254 00:12:33,140 --> 00:12:37,100 disse nuller og ettaller, der kun din Mac eller din PC 255 00:12:37,100 --> 00:12:41,230 understands-- du har fået en første foder denne kildekode i så 256 00:12:41,230 --> 00:12:46,340 input til en særlig program kaldet en compiler, 257 00:12:46,340 --> 00:12:48,974 hvis udgang vi skal se, er maskinkode. 258 00:12:48,974 --> 00:12:51,890 Og, ja, sidste gang vi talte om, virkelig, ved slutningen af ​​dagen, 259 00:12:51,890 --> 00:12:52,610 problemløsning. 260 00:12:52,610 --> 00:12:53,360 Du har indgange. 261 00:12:53,360 --> 00:12:54,318 Og du har udgange. 262 00:12:54,318 --> 00:12:56,560 Og du har fået en slags af algoritmen i midten. 263 00:12:56,560 --> 00:12:59,830 >> Algoritmer kan helt sikkert være implementeret i software, 264 00:12:59,830 --> 00:13:02,900 som vi så med pseudokode sidste uge og som vi vil se med konkrete kode 265 00:13:02,900 --> 00:13:03,490 denne uge. 266 00:13:03,490 --> 00:13:06,430 Og så en compiler egentlig bare har et sæt algoritmer inde 267 00:13:06,430 --> 00:13:10,060 af det, der ved, hvordan man konvertere de særlige søgeord, 268 00:13:10,060 --> 00:13:12,180 ligesom vigtigste, og printf, og andre, at vi bare 269 00:13:12,180 --> 00:13:17,620 så ind i mønstre af nuller og dem, Intel Inside og andre CPU'er 270 00:13:17,620 --> 00:13:20,020 faktisk forstår. 271 00:13:20,020 --> 00:13:22,460 Så hvordan gør vi det? 272 00:13:22,460 --> 00:13:24,470 Hvor får vi en compiler? 273 00:13:24,470 --> 00:13:26,400 >> De fleste af os her har en Mac eller en pc. 274 00:13:26,400 --> 00:13:29,152 Og du kører Mac OS, eller Windows eller Linux, eller Solaris, 275 00:13:29,152 --> 00:13:30,860 eller en række andre operativsystemer. 276 00:13:30,860 --> 00:13:32,568 Og, ja, vi kunne gå ud på nettet 277 00:13:32,568 --> 00:13:35,710 og hente en compiler til din Mac eller din PC 278 00:13:35,710 --> 00:13:37,360 til netop dit operativsystem. 279 00:13:37,360 --> 00:13:39,617 Men vi vil alle være på forskellige sider, så at sige. 280 00:13:39,617 --> 00:13:41,450 Vi ville have lidt forskellige konfigurationer. 281 00:13:41,450 --> 00:13:43,210 Og tingene ville ikke arbejde alle de samme. 282 00:13:43,210 --> 00:13:45,280 Og, ja, i disse dage mange af os ikke bruger 283 00:13:45,280 --> 00:13:47,516 software, der kører kun på vores bærbare pc'er. 284 00:13:47,516 --> 00:13:49,390 I stedet skal vi bruge noget som en browser, der 285 00:13:49,390 --> 00:13:52,930 tillader os at få adgang webbaserede applikationer i skyen. 286 00:13:52,930 --> 00:13:55,630 Og senere dette semester, vi vil gøre præcis det. 287 00:13:55,630 --> 00:13:59,660 Vi vil skrive applikationer eller software ved hjælp code-- ikke C, 288 00:13:59,660 --> 00:14:02,860 men andre sprog som Python og JavaScript--, der kører i skyen. 289 00:14:02,860 --> 00:14:05,860 >> Og for at gøre det, vi selv i løbet af semestret 290 00:14:05,860 --> 00:14:11,890 rent faktisk vil bruge en cloud-baseret miljø kendt som CS50 IDE. 291 00:14:11,890 --> 00:14:16,030 Dette er en webbaseret programmering miljø, eller integreret udvikling 292 00:14:16,030 --> 00:14:20,610 miljø, IDE, der er bygget oven på nogle open source software kaldet Cloud 9. 293 00:14:20,610 --> 00:14:22,966 Og vi har gjort nogle pædagogiske forenklinger det 294 00:14:22,966 --> 00:14:25,840 således at skjule visse funktioner i de første uger, som vi ikke har brug for, 295 00:14:25,840 --> 00:14:27,770 hvorefter du kan afsløre dem og gøre de fleste 296 00:14:27,770 --> 00:14:29,400 noget, du vil med miljøet. 297 00:14:29,400 --> 00:14:32,470 >> Og det giver os også, at præ-installere bestemt software. 298 00:14:32,470 --> 00:14:35,330 Ting som en såkaldt CS50 bibliotek, som vi snart vil se 299 00:14:35,330 --> 00:14:39,210 giver os i C med nogle yderligere funktionalitet. 300 00:14:39,210 --> 00:14:44,392 Så hvis du går til, i sidste ende, CS50.io, vil du blive bedt om at logge ind, 301 00:14:44,392 --> 00:14:46,350 og når du gør og skabe en konto gratis, 302 00:14:46,350 --> 00:14:52,150 du vil kunne få adgang til en miljø, der ser ganske som denne. 303 00:14:52,150 --> 00:14:53,760 >> Nu, dette er i standardtilstanden. 304 00:14:53,760 --> 00:14:55,650 Alt er rart og lyse på skærmen. 305 00:14:55,650 --> 00:14:57,941 Mange af os har en vane med arbejder på CS50 stykke, der er 306 00:14:57,941 --> 00:14:59,150 ganske sent ud på natten. 307 00:14:59,150 --> 00:15:02,400 Og så nogle af jer måske foretrække at gøre det til nat-mode, så at sige. 308 00:15:02,400 --> 00:15:05,550 >> Men i sidste ende, hvad du er kommer til at se inden CS50 IDE 309 00:15:05,550 --> 00:15:08,340 er tre særskilte areas-- et område til venstre, hvor 310 00:15:08,340 --> 00:15:12,604 dine filer vil være i sky, et område øverst til højre 311 00:15:12,604 --> 00:15:14,270 hvor din kode vil være redigeres. 312 00:15:14,270 --> 00:15:16,650 Du vil være i stand til at åbne individuelle faner for ethvert program 313 00:15:16,650 --> 00:15:19,670 at du skriver dette semester inde af denne øverste højre hjørne. 314 00:15:19,670 --> 00:15:23,070 Og så mest arcanely, og dog stærkt, 315 00:15:23,070 --> 00:15:26,610 bliver denne ting på bund kendt som en terminal vindue. 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, der tillader dig til at udføre kommandoer 318 00:15:32,240 --> 00:15:35,260 på computer-- i dette tilfælde computeren i cloud-- 319 00:15:35,260 --> 00:15:39,090 at gøre ting som kompilere din kode fra kildekoden til maskinkode, 320 00:15:39,090 --> 00:15:43,600 at køre dine programmer, eller at starte din webserver, eller få adgang til din database, 321 00:15:43,600 --> 00:15:47,454 og et antal andre teknikker at vi vil begynde at bruge inden længe. 322 00:15:47,454 --> 00:15:49,370 Men for at komme dertil, er vi vil faktisk have 323 00:15:49,370 --> 00:15:51,240 at gå online og begynde at spille. 324 00:15:51,240 --> 00:15:54,399 Og for at gøre det, så lad os først begynde at fifle med de vigtigste, 325 00:15:54,399 --> 00:15:55,940 og skriv den vigtigste del af et program. 326 00:15:55,940 --> 00:15:59,170 Og lad os bruge denne funktion printf, som vi brugte tidligere, 327 00:15:59,170 --> 00:16:01,050 blot at sige noget. 328 00:16:01,050 --> 00:16:04,910 >> Så her er jeg allerede inde 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 screenet fuld vinduet. 331 00:16:07,360 --> 00:16:09,670 Og så, i sidste ende, du også i kommende problemer 332 00:16:09,670 --> 00:16:12,960 vil følge lignende skridt, der vil give online-dokumentation. 333 00:16:12,960 --> 00:16:16,360 Så du behøver ikke at bekymre sig om absorbere hvert lille teknisk skridt 334 00:16:16,360 --> 00:16:17,730 at jeg gør her i dag. 335 00:16:17,730 --> 00:16:19,222 >> Men du får en skærm som denne. 336 00:16:19,222 --> 00:16:20,430 Jeg tilfældigvis er i nat-tilstand. 337 00:16:20,430 --> 00:16:22,944 Og du kan lysne alt op ved at deaktivere nat mode. 338 00:16:22,944 --> 00:16:24,860 Og ved slutningen af ​​den dag, er du nødt til at se 339 00:16:24,860 --> 00:16:30,090 disse tre vigtigste areas-- filen browser til venstre, koden faner op toppen, 340 00:16:30,090 --> 00:16:32,430 og terminalvinduet nederst. 341 00:16:32,430 --> 00:16:34,890 >> Lad mig gå videre og skrive min første program. 342 00:16:34,890 --> 00:16:42,300 Jeg har tænkt mig at forebyggende gå til Fil, Gem og gemme min fil som hello.c. 343 00:16:42,300 --> 00:16:46,850 Faktisk ved konvention, ethvert program, vi skriver, der er skrevet i C sproget 344 00:16:46,850 --> 00:16:49,739 bør navngives noget dot c, efter sædvane. 345 00:16:49,739 --> 00:16:53,030 Så jeg har tænkt mig at nævne det hello.c, fordi Jeg vil bare sige hej til verden. 346 00:16:53,030 --> 00:16:54,820 Nu vil jeg zoome ud og klik på Gem. 347 00:16:54,820 --> 00:16:58,180 Og alt hvad jeg har her nu er en fane hvor kan jeg begynde at skrive kode. 348 00:16:58,180 --> 00:16:59,490 >> Dette kommer ikke til at kompilere. 349 00:16:59,490 --> 00:17:00,300 Det betyder ikke noget. 350 00:17:00,300 --> 00:17:02,750 Og så selvom jeg konverterede dette til nuller og ettaller, 351 00:17:02,750 --> 00:17:05,390 CPU'en vil have nogen idé om, hvad der foregår rundt. 352 00:17:05,390 --> 00:17:14,170 Men hvis jeg skriver linjer, der matcher op med C'er conventions-- C væsen, 353 00:17:14,170 --> 00:17:20,150 igen, denne language-- med syntaks ligesom dette, printf hej verden-og jeg har 354 00:17:20,150 --> 00:17:22,210 fået godt med gør dette over tid. 355 00:17:22,210 --> 00:17:24,510 Så jeg tror ikke, jeg gjorde eventuelle trykfejl. 356 00:17:24,510 --> 00:17:27,910 >> Men, uvægerligt, den allerførste gang du gør dette, vil du. 357 00:17:27,910 --> 00:17:31,090 Og hvad jeg er ved at gøre måske meget godt ikke arbejde for dig første gang. 358 00:17:31,090 --> 00:17:33,610 Og det er helt OK, fordi lige nu er du 359 00:17:33,610 --> 00:17:37,662 kunne bare se en hel masse newness, men over tid, når du blive fortrolig 360 00:17:37,662 --> 00:17:39,870 med dette miljø, og dette sprog, og andre, 361 00:17:39,870 --> 00:17:42,370 du vil begynde at se ting, er enten rigtige eller forkerte. 362 00:17:42,370 --> 00:17:44,369 >> Og det er, hvad det undervisning stipendiater og kursus 363 00:17:44,369 --> 00:17:48,780 assistenter får så god til over tid, er spotting fejl eller fejl i din kode. 364 00:17:48,780 --> 00:17:52,110 Men jeg hævder, at der er ingen fejl i denne kode. 365 00:17:52,110 --> 00:17:53,990 Så jeg ønsker nu at køre dette program. 366 00:17:53,990 --> 00:17:57,440 >> Nu på min egen Mac eller pc, jeg er i for vane at dobbeltklikke ikoner 367 00:17:57,440 --> 00:17:59,350 når jeg vil køre nogle program. 368 00:17:59,350 --> 00:18:01,080 Men det er ikke den model her. 369 00:18:01,080 --> 00:18:04,570 I dette miljø, som er CS50 IDE. 370 00:18:04,570 --> 00:18:07,192 Vi bruger et operativsystem system kaldet Linux. 371 00:18:07,192 --> 00:18:09,900 Linux minder om en anden operativsystem, generelt kendt 372 00:18:09,900 --> 00:18:10,850 som Unix. 373 00:18:10,850 --> 00:18:16,340 Og Linux er især kendt for have en Command Line Miljø, CLI. 374 00:18:16,340 --> 00:18:20,070 Nu, vi bruger en bestemt smag af Linux kaldet Ubuntu. 375 00:18:20,070 --> 00:18:22,770 Og Ubuntu er simpelthen en bestemt version af Linux. 376 00:18:22,770 --> 00:18:27,900 >> Men disse Linux er i disse dage gør faktisk kommer med grafiske brugergrænseflader. 377 00:18:27,900 --> 00:18:30,360 Og den, vi tilfældigvis bruge her er webbaseret. 378 00:18:30,360 --> 00:18:32,735 Så dette kunne se endnu en lidt anderledes end noget 379 00:18:32,735 --> 00:18:35,310 du selv kan have set eller køre i fortiden. 380 00:18:35,310 --> 00:18:37,910 >> Så jeg har tænkt mig at gå videre nu og gøre følgende. 381 00:18:37,910 --> 00:18:40,950 Jeg har gemt denne fil som hello.c. 382 00:18:40,950 --> 00:18:47,350 Jeg har tænkt mig at gå videre og typen clanghello.c Så Dunk 383 00:18:47,350 --> 00:18:49,850 for C-sproget er en compiler. 384 00:18:49,850 --> 00:18:51,952 Det er pre-installeret i CS50 IDE. 385 00:18:51,952 --> 00:18:54,910 Og du kan absolut hente og installere dette på egen hånd Mac eller pc. 386 00:18:54,910 --> 00:18:57,910 >> Men igen, du ville ikke have alle præ-konfiguration gjort for dig. 387 00:18:57,910 --> 00:19:00,940 Så for nu, jeg er bare kommer til at køre clanghello.c. 388 00:19:00,940 --> 00:19:03,240 Og nu mærke til denne syntaks her vil i sidste ende 389 00:19:03,240 --> 00:19:06,930 indse, betyder, at jeg er i en mappe eller mappe kaldet Workspace. 390 00:19:06,930 --> 00:19:11,030 Denne dollartegn er bare konvention for mening, skriv dine kommandoer her. 391 00:19:11,030 --> 00:19:14,560 >> Det er hvad der kaldes en hurtig, bare ved konventionen er dollartegn. 392 00:19:14,560 --> 00:19:19,130 Og hvis jeg gå videre nu og klik Enter, intet synes at være sket. 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 der sker på skærmen, jo mere sandsynligt 395 00:19:23,650 --> 00:19:26,710 din kode er at være korrekt, mindst syntaktisk. 396 00:19:26,710 --> 00:19:29,120 >> Så hvis jeg ønsker at køre dette program, hvad gør jeg? 397 00:19:29,120 --> 00:19:33,770 Tja, det viser sig, at den standardnavn konventionelt 398 00:19:33,770 --> 00:19:38,854 til programmer, når du ikke angiver et navn til dit program er bare a.out. 399 00:19:38,854 --> 00:19:41,270 Og denne syntaks også, vil du blive fortrolig med inden længe. 400 00:19:41,270 --> 00:19:47,500 >> Dot skråstreg betyder bare, hey, CS50 IDE, køre et program kaldet a.out 401 00:19:47,500 --> 00:19:49,400 der er inde min nuværende mappe. 402 00:19:49,400 --> 00:19:51,520 Det prik betyder det aktuelle bibliotek. 403 00:19:51,520 --> 00:19:55,040 Og vi vil se, hvad andre sådanne sekvenser tegn betyder inden længe. 404 00:19:55,040 --> 00:19:58,430 >> Så her går vi, Enter, hej verden. 405 00:19:58,430 --> 00:20:00,080 Og du vil opdage, at det, der skete? 406 00:20:00,080 --> 00:20:01,580 Ikke kun gjorde det udskriver hej verden. 407 00:20:01,580 --> 00:20:05,990 Det flyttede også markøren til den næste linje. 408 00:20:05,990 --> 00:20:07,160 >> Og hvorfor var det? 409 00:20:07,160 --> 00:20:12,400 Hvad var den kode, vi skrev før der sikrede, at markøren ville 410 00:20:12,400 --> 00:20:14,882 gå på den næste linje? 411 00:20:14,882 --> 00:20:16,840 Sjove ting om en computer er det kun vil 412 00:20:16,840 --> 00:20:18,570 at gøre bogstaveligt hvad du fortæller det til at gøre. 413 00:20:18,570 --> 00:20:26,050 >> Så hvis du fortælle det til printf goddag, komma, plads, verden, luk tilbud, 414 00:20:26,050 --> 00:20:29,090 det er bogstaveligt talt kun vil at udskrive disse tegn. 415 00:20:29,090 --> 00:20:31,980 Men jeg havde denne særlige karakter i slutningen, tilbagekaldelse, backslash n. 416 00:20:31,980 --> 00:20:34,230 Og det er, hvad sikres at tegnet gik 417 00:20:34,230 --> 00:20:36,570 til den næste linje af skærmen. 418 00:20:36,570 --> 00:20:38,097 >> Faktisk lade mig gå og gøre dette. 419 00:20:38,097 --> 00:20:39,430 Lad mig gå videre og slette denne. 420 00:20:39,430 --> 00:20:41,180 Nu mærke til, at øverst på min skærm er der 421 00:20:41,180 --> 00:20:42,890 lidt rødt lys i fanen indikerer, 422 00:20:42,890 --> 00:20:45,047 hey, du har ikke gemt din fil. 423 00:20:45,047 --> 00:20:47,880 Så jeg har tænkt mig at gå videre med kontrol S eller kommando S, gemme filen. 424 00:20:47,880 --> 00:20:51,130 Nu goes-- det gik for en moment-- grøn. 425 00:20:51,130 --> 00:20:53,760 Og nu er det tilbage til blot at være en tæt ikon. 426 00:20:53,760 --> 00:21:01,860 >> Hvis jeg nu køre clanghello.c igen, Indtast, dot skråstreg, a.out, Enter, 427 00:21:01,860 --> 00:21:04,110 vil du se, at det stadig arbejdede. 428 00:21:04,110 --> 00:21:06,020 Men det er nok lidt buggy. 429 00:21:06,020 --> 00:21:08,714 Lige nu, min prompt-- arbejdsområde, og så er dollartegn, 430 00:21:08,714 --> 00:21:10,880 og derefter min faktiske prompt-- er alle på samme linje. 431 00:21:10,880 --> 00:21:14,540 Så dette helt sikkert en æstetisk bug, selv om det ikke er virkelig en logisk fejl. 432 00:21:14,540 --> 00:21:16,250 >> Så jeg har tænkt mig at fortryde, hvad jeg lige gjorde. 433 00:21:16,250 --> 00:21:18,560 Jeg har tænkt mig at kør a.out. 434 00:21:18,560 --> 00:21:22,710 Bemærk, at jeg har tilføjet newline tegn tilbage. 435 00:21:22,710 --> 00:21:24,280 Jeg har gemt filen. 436 00:21:24,280 --> 00:21:31,630 >> Så jeg har tænkt mig at gentages a.out, og-- for fanden, en fejl, en fejl der betyder fejltagelse. 437 00:21:31,630 --> 00:21:35,020 Så fejlen er, at selvom Jeg tilføjede omvendt skråstreg n der, 438 00:21:35,020 --> 00:21:41,180 re-gemt, re-løb i programmet, adfærden var det 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 skridt, ikke? 441 00:21:43,910 --> 00:21:47,620 Det afgørende skridt tidligere var, at du har at-- når du ændrer din kildekode, 442 00:21:47,620 --> 00:21:49,610 det viser sig også køre det gennem compiler 443 00:21:49,610 --> 00:21:51,102 igen, så du får ny maskinkode. 444 00:21:51,102 --> 00:21:52,810 Og maskinkode, de nuller og ettaller, 445 00:21:52,810 --> 00:21:56,260 kommer til at være næsten identiske, men ikke perfekt, fordi vi har brug for, 446 00:21:56,260 --> 00:21:57,510 naturligvis, at nye linje. 447 00:21:57,510 --> 00:22:02,640 >> Så for at løse dette, jeg har tænkt mig at brug for at køre clanghello.c, indtaste, prik 448 00:22:02,640 --> 00:22:03,800 slash, a.out. 449 00:22:03,800 --> 00:22:08,402 Og nu, hej verden er tilbage til hvor jeg forventer, at være. 450 00:22:08,402 --> 00:22:09,610 Så dette er alt fint og godt. 451 00:22:09,610 --> 00:22:13,150 Men a.out er en temmelig dum navn for en program, selvom det sker at være, 452 00:22:13,150 --> 00:22:16,530 af historiske grunde, den default-- betyder montage udgange. 453 00:22:16,530 --> 00:22:20,780 >> Men lad mig gå videre her og gøre det anderledes. 454 00:22:20,780 --> 00:22:24,760 Jeg vil have min hello world program til rent faktisk at blive kaldt hej. 455 00:22:24,760 --> 00:22:28,320 Så hvis det var et ikon på min skrivebordet, ville det ikke være a.out. 456 00:22:28,320 --> 00:22:29,730 Det ville blive kaldt hej. 457 00:22:29,730 --> 00:22:33,660 >> Så for at gøre dette, viser det sig at Dunk, ligesom mange programmer, 458 00:22:33,660 --> 00:22:37,980 understøtter kommandolinjeflag, eller flag, eller kontakter, 459 00:22:37,980 --> 00:22:39,600 der blot påvirke adfærd. 460 00:22:39,600 --> 00:22:45,160 Specifikt Dunk understøtter en bindestreg o flag, som derefter tager et andet ord. 461 00:22:45,160 --> 00:22:48,190 I dette tilfælde vil jeg vilkårligt, men rimeligt, kalder det hej. 462 00:22:48,190 --> 00:22:50,710 Men jeg kunne kalde det noget Jeg ønsker, undtagen a.out, som 463 00:22:50,710 --> 00:22:52,390 ville være ret ud over punktet. 464 00:22:52,390 --> 00:22:55,640 >> Og så bare angive navnet af filen jeg ønsker at kompilere. 465 00:22:55,640 --> 00:22:59,190 Så nu selvom i begyndelsen af kommandoen Jeg har stadig Dunk, 466 00:22:59,190 --> 00:23:01,410 ved slutningen af ​​kommandoen Jeg har stadig filnavnet, 467 00:23:01,410 --> 00:23:05,520 Jeg har nu disse kommandolinjen argumenter, disse flag, der siger, 468 00:23:05,520 --> 00:23:11,180 Åh, ved den måde, output-o, en fil kaldet hej, ikke standard a.out. 469 00:23:11,180 --> 00:23:13,810 >> Så hvis jeg ramte Indtast nu, intet synes at være sket. 470 00:23:13,810 --> 00:23:17,900 Og, endnu, nu kan jeg gøre dot skråstreg hej. 471 00:23:17,900 --> 00:23:19,089 Så det er det samme program. 472 00:23:19,089 --> 00:23:21,380 De nuller og ettaller er identisk i slutningen af ​​dagen. 473 00:23:21,380 --> 00:23:24,210 >> Men de er i to forskellige files-- a.out, 474 00:23:24,210 --> 00:23:26,490 som er den første version og bare tåbeligt navngivet, 475 00:23:26,490 --> 00:23:30,250 og nu hej, som er et meget mere overbevisende navn for et program. 476 00:23:30,250 --> 00:23:33,195 Men, helt ærligt, jeg aldrig vil huske dette igen, 477 00:23:33,195 --> 00:23:34,070 og igen, og igen. 478 00:23:34,070 --> 00:23:36,411 Og, faktisk, da vi skriver mere komplicerede programmer, 479 00:23:36,411 --> 00:23:38,160 de kommandoer, du er nødt til at skrive 480 00:23:38,160 --> 00:23:40,920 kommer til at få endnu mere kompliceret stadig. 481 00:23:40,920 --> 00:23:41,940 >> Og så ikke at bekymre dig. 482 00:23:41,940 --> 00:23:46,220 Det viser sig, at mennesker før os har indset de også 483 00:23:46,220 --> 00:23:47,530 havde netop dette samme problem. 484 00:23:47,530 --> 00:23:50,900 De havde heller ikke nyde at skulle skriv temmelig lange, mystiske kommandoer, 485 00:23:50,900 --> 00:23:52,200 endsige huske dem. 486 00:23:52,200 --> 00:23:56,070 Og så mennesker før os har gjort andre programmer, der gør det nemmere 487 00:23:56,070 --> 00:23:57,670 at kompilere din software. 488 00:23:57,670 --> 00:24:01,609 >> Og, ja, en sådan program kaldes Make. 489 00:24:01,609 --> 00:24:03,150 Så jeg har tænkt mig at gå videre og gøre dette. 490 00:24:03,150 --> 00:24:05,691 Jeg har tænkt mig at fortryde alt, hvad jeg lige gjorde på følgende måde. 491 00:24:05,691 --> 00:24:07,690 Lad mig skrive LS. 492 00:24:07,690 --> 00:24:10,980 Og du vil opdage tre things-- a.out, og en stjerne, hej 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åbentlig dette bør være lidt intuitiv, 495 00:24:14,730 --> 00:24:18,220 for så vidt som tidligere var intet i denne arbejdsområde. 496 00:24:18,220 --> 00:24:21,240 Der var ikke noget, at jeg havde skabt indtil vi begyndte klasse. 497 00:24:21,240 --> 00:24:22,840 >> Og jeg skabte hello.c. 498 00:24:22,840 --> 00:24:24,544 Jeg derefter kompileret det, og kaldte det a.out. 499 00:24:24,544 --> 00:24:27,460 Og så jeg kompileret det igen lidt anderledes, og kaldte det hej. 500 00:24:27,460 --> 00:24:32,830 Så jeg har tre filer i denne mappe, i denne mappe kaldet Workspace. 501 00:24:32,830 --> 00:24:35,005 Nu kan jeg se, at så godt hvis jeg zoome ud faktisk. 502 00:24:35,005 --> 00:24:37,530 >> Hvis jeg zoome ud her og se på det øverste højre 503 00:24:37,530 --> 00:24:39,940 hjørne, som lovet venstre side af skærmen 504 00:24:39,940 --> 00:24:42,990 altid vil vise dig hvad der er i din konto, hvad er 505 00:24:42,990 --> 00:24:44,790 indersiden af ​​CS50 IDE. 506 00:24:44,790 --> 00:24:46,680 Og der er tre filer der. 507 00:24:46,680 --> 00:24:49,070 >> Så jeg ønsker at slippe af a.out og goddag. 508 00:24:49,070 --> 00:24:51,275 Og som du måske forestille intuitivt, du 509 00:24:51,275 --> 00:24:53,400 kunne sortere af kontrol klik eller højreklik på dette. 510 00:24:53,400 --> 00:24:54,590 Og denne lille menu dukker op. 511 00:24:54,590 --> 00:24:57,170 Du kan downloade filen, køre det, se det, opdatere, omdøbe, 512 00:24:57,170 --> 00:24:57,700 eller hvad ikke. 513 00:24:57,700 --> 00:25:00,260 >> Og jeg kunne bare slette, og det ville gå væk. 514 00:25:00,260 --> 00:25:05,260 Men lad os gøre ting med en kommando linje for nu, så for at få komfortabel 515 00:25:05,260 --> 00:25:07,010 med dette, og gøre følgende. 516 00:25:07,010 --> 00:25:12,345 Jeg har tænkt mig at gå videre og fjern a.out ved at skrive bogstaveligt rma.out. 517 00:25:12,345 --> 00:25:14,890 Det viser sig, kommandoen for fjerne eller slette noget, 518 00:25:14,890 --> 00:25:16,280 er ikke fjerne eller slette. 519 00:25:16,280 --> 00:25:21,260 >> Det er mere kortfattet RM, blot for at spare dig nogle tastetryk, og tryk Enter. 520 00:25:21,260 --> 00:25:24,707 Nu skal vi til at være noget kryptisk fjerne almindelig fil a.out. 521 00:25:24,707 --> 00:25:27,040 Jeg ved ikke rigtig, hvad en uregelmæssig fil ville være endnu. 522 00:25:27,040 --> 00:25:28,660 Men jeg ønsker at fjerne det. 523 00:25:28,660 --> 00:25:30,150 >> Så jeg har tænkt mig at skrive y for ja. 524 00:25:30,150 --> 00:25:31,940 Eller jeg kunne skrive det ud, og tryk på Enter. 525 00:25:31,940 --> 00:25:33,440 Og igen, intet synes at ske. 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 gang, hvad skal jeg se? 528 00:25:40,490 --> 00:25:44,930 Forhåbentlig bare hej og hello.c. 529 00:25:44,930 --> 00:25:47,286 Nu, som en sidebemærkning, vil du bemærke dette stjerne, stjerne, 530 00:25:47,286 --> 00:25:48,660 der er i slutningen af ​​mine programmer. 531 00:25:48,660 --> 00:25:50,201 Og de er også dukke op i grønt. 532 00:25:50,201 --> 00:25:53,970 Det er bare CS50 IDE måde af cluing dig ind det faktum 533 00:25:53,970 --> 00:25:55,280 at det ikke er kildekode. 534 00:25:55,280 --> 00:25:58,880 Det er en eksekverbar, et runnable program, som du rent faktisk kan køre 535 00:25:58,880 --> 00:26:01,020 ved at gøre dot skråstreg, og så er det navn. 536 00:26:01,020 --> 00:26:05,860 >> Lad mig gå videre og fjern dette, rm hej, Enter, fjern regelmæssig 537 00:26:05,860 --> 00:26:08,010 fil hej, ja. 538 00:26:08,010 --> 00:26:11,180 Og nu, hvis jeg skriver LS, vi er tilbage til hello.c. 539 00:26:11,180 --> 00:26:13,917 Prøv ikke at slette din faktiske kildekode. 540 00:26:13,917 --> 00:26:16,250 Selv om der er funktioner indbygget i CS50 IDE hvor 541 00:26:16,250 --> 00:26:19,870 du kan gå gennem din revision historie og tilbage i tid, hvis du ved et uheld 542 00:26:19,870 --> 00:26:23,660 slette noget, gør være opmærksomme som pr disse prompter ja eller nej, 543 00:26:23,660 --> 00:26:25,381 af, hvad du rent faktisk ønsker at gøre. 544 00:26:25,381 --> 00:26:27,380 Og hvis jeg går op til toppen venstre hjørne her, 545 00:26:27,380 --> 00:26:30,696 er der kun tilbage hello.c. 546 00:26:30,696 --> 00:26:32,570 Så der er klaser af andre kommandoer, som du 547 00:26:32,570 --> 00:26:37,550 kan udføre i verden af ​​Linux, hvoraf den ene er, igen, Få. 548 00:26:37,550 --> 00:26:40,180 Og vi kommer til at Make mit program nu som følger. 549 00:26:40,180 --> 00:26:43,270 >> I stedet for at gøre clang, stedet for at gøre klang-o, 550 00:26:43,270 --> 00:26:45,860 Jeg har tænkt mig at blot bogstaveligt skriver, gør hej. 551 00:26:45,860 --> 00:26:49,630 Og nu mærke til, er jeg ikke skrive gøre hello.c. 552 00:26:49,630 --> 00:26:50,910 Jeg skrive gøre hej. 553 00:26:50,910 --> 00:26:54,840 >> Og dette program Gøre, at kommer med CS50 IDE, og mere 554 00:26:54,840 --> 00:26:57,090 generelt med Linux, er et program, der er 555 00:26:57,090 --> 00:26:59,120 kommer til at lave et program kaldet Hello. 556 00:26:59,120 --> 00:27:03,680 Og det kommer til at antage, efter sædvane, at hvis dette program kan foretages, 557 00:27:03,680 --> 00:27:09,030 det vil ske fra en kilde kode fil der ender på dot c, hello.c. 558 00:27:09,030 --> 00:27:12,210 >> Så hvis jeg ramte Indtast nu, meddelelse om, at kommandoen, der bliver henrettet 559 00:27:12,210 --> 00:27:14,340 er faktisk endnu længere før end før. 560 00:27:14,340 --> 00:27:16,670 Og det er, fordi vi har prækonfigureret CS50 IDE at have 561 00:27:16,670 --> 00:27:19,878 nogle ekstra funktioner indbygget i det Vi har ikke brug for lige nu, men snart vil. 562 00:27:19,878 --> 00:27:23,470 Men nøglen ting at indse er nu jeg har en Hello program. 563 00:27:23,470 --> 00:27:27,080 >> Hvis jeg skriver LS igen, jeg har en Hej program. 564 00:27:27,080 --> 00:27:32,070 Og jeg kan køre det med dot skråstreg a.out, nej, 565 00:27:32,070 --> 00:27:35,590 fordi hele pointen med denne øvelse var dot skråstreg hej. 566 00:27:35,590 --> 00:27:38,089 Og nu har jeg min hello world program. 567 00:27:38,089 --> 00:27:39,880 Så bevæger sig fremad, vi er næsten altid bare 568 00:27:39,880 --> 00:27:42,088 kommer til at kompilere vores programmer ved hjælp af kommandoen Make. 569 00:27:42,088 --> 00:27:45,300 Og så vil vi køre dem ved dot skråstreg, og programmets navn. 570 00:27:45,300 --> 00:27:49,610 Men indse, hvad gør gør for dig, er det i sig selv ikke en compiler. 571 00:27:49,610 --> 00:27:53,310 Det er bare en bekvemmelighed program der forstår at udløse en compiler 572 00:27:53,310 --> 00:27:56,470 til at køre, så du selv kan bruge den. 573 00:27:56,470 --> 00:28:00,220 >> Hvad findes andre kommandoer i Linux, og til gengæld for CS50 IDE? 574 00:28:00,220 --> 00:28:03,107 Vi vil snart se, at der er en CD kommando, Change Directory. 575 00:28:03,107 --> 00:28:05,190 Dette giver dig mulighed inden din kommandolinjegrænseflade 576 00:28:05,190 --> 00:28:07,610 at bevæge sig fremad, og tilbage, og åbne op forskellige mapper 577 00:28:07,610 --> 00:28:08,860 uden at bruge musen. 578 00:28:08,860 --> 00:28:12,470 >> LS, vi oplevede, som står for liste filerne i det aktuelle bibliotek. 579 00:28:12,470 --> 00:28:14,650 Gør Dir, kan du sandsynligvis begynder at udlede 580 00:28:14,650 --> 00:28:18,150 hvad disse betyder nu-- gøre biblioteket, Hvis du vil oprette en mappe. 581 00:28:18,150 --> 00:28:21,270 RM til fjerne, RM Dir for fjerne directory-- og disse, 582 00:28:21,270 --> 00:28:24,160 igen, er kommandolinjen ækvivalenter af hvad du 583 00:28:24,160 --> 00:28:26,945 kunne gøre i CS50 IDE med musen. 584 00:28:26,945 --> 00:28:28,820 Men du vil snart finde at nogle gange er det bare 585 00:28:28,820 --> 00:28:30,610 meget hurtigere at gøre ting med et tastatur, 586 00:28:30,610 --> 00:28:33,690 og i sidste ende en meget mere kraftfuld. 587 00:28:33,690 --> 00:28:36,440 >> Men det er svært at argumentere for, at noget vi har gjort hidtil 588 00:28:36,440 --> 00:28:39,990 er alt, kraftfuld, når alle vi har at sige er, hej verden. 589 00:28:39,990 --> 00:28:43,740 Og i virkeligheden, jeg hardcodede den ord hej verden i mit program. 590 00:28:43,740 --> 00:28:45,530 Der er ingen dynamik endnu. 591 00:28:45,530 --> 00:28:49,320 Scratch var en størrelsesorden mere interessant sidste uge. 592 00:28:49,320 --> 00:28:51,220 >> Og så lad os komme der. 593 00:28:51,220 --> 00:28:55,310 Lad os tage et skridt mod, at ved måde af nogle af disse funktioner. 594 00:28:55,310 --> 00:28:59,470 Så ikke alene C kommer med printf, og klaser af andre funktioner 595 00:28:59,470 --> 00:29:01,850 hvoraf vi vil se over tid, gør det ikke 596 00:29:01,850 --> 00:29:05,760 gør det så let lige ud af porten i at få brugerinput. 597 00:29:05,760 --> 00:29:08,140 >> Faktisk er en af ​​svaghederne af sprog som C, 598 00:29:08,140 --> 00:29:10,140 og selv Java og endnu andre, er, at det ikke 599 00:29:10,140 --> 00:29:15,860 gør det nemt at bare få ting som heltal fra brugere eller strygere, ord, 600 00:29:15,860 --> 00:29:19,970 og sætninger, endsige ting som floating point værdier eller reelle tal 601 00:29:19,970 --> 00:29:23,240 med decimaler, og virkelig lange numre, som vi snart vil se. 602 00:29:23,240 --> 00:29:27,000 Så denne liste over funktioner her, disse er ligesom andre Scratch puslespilsbrikker 603 00:29:27,000 --> 00:29:31,090 at vi har pre-installeret i CS50 IDE, som vi vil bruge til et par uger 604 00:29:31,090 --> 00:29:34,010 som uddannelse hjul slags, og i sidste ende tage dem af, og se 605 00:29:34,010 --> 00:29:37,210 under emhætten, måske, på hvordan disse ting gennemføres. 606 00:29:37,210 --> 00:29:40,460 >> Men for at gøre dette, lad os rent faktisk at skrive et program. 607 00:29:40,460 --> 00:29:41,770 Lad mig gå videre nu. 608 00:29:41,770 --> 00:29:44,750 Og jeg har tænkt mig at oprette en ny fil ved at klikke på denne lille plus, 609 00:29:44,750 --> 00:29:45,970 og klikke på Ny fil. 610 00:29:45,970 --> 00:29:49,250 >> Jeg har tænkt mig at gemme denne næste en som, lad os sige, string.c, 611 00:29:49,250 --> 00:29:50,750 fordi jeg ønsker at spille med strygere. 612 00:29:50,750 --> 00:29:53,990 Og streng i C er bare en sekvens af tegn. 613 00:29:53,990 --> 00:29:56,090 Så lad os nu gå videre og gøre følgende. 614 00:29:56,090 --> 00:30:01,204 >> Medtag standard IO.h-- og det viser sig standard IO, 615 00:30:01,204 --> 00:30:03,360 IO betyder blot input og output. 616 00:30:03,360 --> 00:30:05,920 Så det viser sig, at denne linje her er hvad 617 00:30:05,920 --> 00:30:08,140 er det nærliggende for os at bruge printf. 618 00:30:08,140 --> 00:30:10,410 Printf selvfølgelig frembringer output. 619 00:30:10,410 --> 00:30:15,000 Så for at bruge printf, viser det sig ud du nødt til at have denne linje kode 620 00:30:15,000 --> 00:30:16,040 i toppen af ​​din fil. 621 00:30:16,040 --> 00:30:18,456 >> Og vi vil vende tilbage til det der virkelig betyder inden længe. 622 00:30:18,456 --> 00:30:20,400 Det viser sig, at i enhver C-program jeg skriver, 623 00:30:20,400 --> 00:30:23,640 Jeg har fået at starte den med kode, der ligner dette. 624 00:30:23,640 --> 00:30:26,860 Og du vil opdage CS50 IDE og anden integreret udvikling 625 00:30:26,860 --> 00:30:30,050 miljøer som det, vil forsøge så godt 626 00:30:30,050 --> 00:30:31,780 de kan for at afslutte din tanke. 627 00:30:31,780 --> 00:30:35,930 Faktisk et øjeblik siden, hvis jeg fortryder hvad jeg lige gjorde, jeg ramte på Enter. 628 00:30:35,930 --> 00:30:39,160 >> Jeg derefter ramte åben krøllet bandage, tryk Enter igen. 629 00:30:39,160 --> 00:30:40,430 Og det færdige min tanke. 630 00:30:40,430 --> 00:30:45,140 Det gav mig en ny linje, indrykket ikke mindre for nice stilistiske årsager vil vi se. 631 00:30:45,140 --> 00:30:48,559 Og så gav mig automatisk at krøllede tandbøjle til at afslutte min tanke. 632 00:30:48,559 --> 00:30:50,600 Nu er det ikke altid gætte, hvad du vil gøre. 633 00:30:50,600 --> 00:30:53,620 Men for en stor del, det gør spare dig nogle tastetryk. 634 00:30:53,620 --> 00:30:59,560 Så for et øjeblik siden, kørte vi denne program-- hej, verden, og derefter kompileret det, 635 00:30:59,560 --> 00:31:00,460 og derefter kørte det. 636 00:31:00,460 --> 00:31:01,867 Men der er ingen dynamik her. 637 00:31:01,867 --> 00:31:03,700 Hvad hvis vi ønskede at gøre noget anderledes? 638 00:31:03,700 --> 00:31:07,630 Nå, hvad hvis jeg ønskede at faktisk få en streng fra brugeren? 639 00:31:07,630 --> 00:31:11,250 Jeg har tænkt mig at bruge en puslespilsbrik kaldt præcis at-- få streng. 640 00:31:11,250 --> 00:31:15,860 >> Viser sig i C, at når du ikke ønsker at give input til en brik, 641 00:31:15,860 --> 00:31:19,360 eller mere korrekt til en funktion, du bogstavelig talt bare gøre åben parentes, 642 00:31:19,360 --> 00:31:20,430 tæt parentes. 643 00:31:20,430 --> 00:31:25,540 Så det er, som om der er ingen hvide felt til at skrive ind. 644 00:31:25,540 --> 00:31:27,720 Det siger blok før havde en lille hvid boks. 645 00:31:27,720 --> 00:31:29,660 Vi har ikke den hvide boks nu. 646 00:31:29,660 --> 00:31:33,310 >> Men når jeg kalder get streng, jeg ønsker at sætte resultatet et eller andet sted. 647 00:31:33,310 --> 00:31:37,680 Så en meget almindelig paradigme i C er at kalde en funktion, ligesom get snor her, 648 00:31:37,680 --> 00:31:41,070 og derefter gemme sin tilbagevenden værdi. 649 00:31:41,070 --> 00:31:44,450 Det er resultatet af dets indsats i noget. 650 00:31:44,450 --> 00:31:47,630 >> Og hvad er konstruere i programmering, 651 00:31:47,630 --> 00:31:53,450 enten i bunden eller nu C, at vi kan bruge til rent faktisk at gemme noget? 652 00:31:53,450 --> 00:31:55,990 Kaldte det en variabel, ikke? 653 00:31:55,990 --> 00:32:00,320 Og i Scratch, gør vi ikke rigtig pleje, hvad der foregik i variabler. 654 00:32:00,320 --> 00:32:02,170 >> Men i dette tilfælde, vi rent faktisk gør. 655 00:32:02,170 --> 00:32:03,719 Jeg har tænkt mig at sige streng. 656 00:32:03,719 --> 00:32:05,510 Og så kunne jeg ringe dette hvad jeg vil. 657 00:32:05,510 --> 00:32:08,340 Jeg har tænkt mig at kalde det navn, får få streng. 658 00:32:08,340 --> 00:32:10,250 >> Og nu selvom du er lidt ny på dette, 659 00:32:10,250 --> 00:32:11,984 bemærke, at jeg mangler nogle detaljer. 660 00:32:11,984 --> 00:32:13,150 Jeg glemmer et semikolon. 661 00:32:13,150 --> 00:32:14,400 Jeg har brug for at afslutte denne tanke. 662 00:32:14,400 --> 00:32:17,480 Så jeg har tænkt mig at flytte min markøren, og ramte semikolon der. 663 00:32:17,480 --> 00:32:19,130 Og hvad har jeg lige gjort? 664 00:32:19,130 --> 00:32:21,440 I denne linje kode, nummer 5 i det øjeblik, 665 00:32:21,440 --> 00:32:23,799 Jeg ringer get snor uden input. 666 00:32:23,799 --> 00:32:26,090 Så der er ingen lille hvid boks ligesom Gem blokken har. 667 00:32:26,090 --> 00:32:28,590 >> Jeg siger bare, hey, computer, få mig en streng. 668 00:32:28,590 --> 00:32:31,390 Den lighedstegnet er ikke rigtig et lighedstegn, per se. 669 00:32:31,390 --> 00:32:33,790 Det er opgaven operatør, hvilket betyder, 670 00:32:33,790 --> 00:32:37,860 hey, computer, flytte værdien fra højre over til 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 >> Hey, computer, giv mig et string-- en sekvens af tegn. 673 00:32:43,580 --> 00:32:45,637 Og kalder det string Navn. 674 00:32:45,637 --> 00:32:47,220 Og jeg behøver ikke engang at kalde det Navn. 675 00:32:47,220 --> 00:32:49,970 >> Jeg kunne kalde det, konventionelt, noget som S, 676 00:32:49,970 --> 00:32:52,900 meget gerne vi brugte jeg til kalde variablen i. 677 00:32:52,900 --> 00:32:54,829 Men nu har jeg brug for at gøre noget med det. 678 00:32:54,829 --> 00:32:57,370 Det ville være temmelig dumt at prøve at oversætte denne kode, der kører 679 00:32:57,370 --> 00:32:59,410 dette program, selvom Jeg får en streng, 680 00:32:59,410 --> 00:33:01,580 fordi det er stadig lige kommer til at sige goddag verden. 681 00:33:01,580 --> 00:33:06,140 >> Men hvad nu, hvis jeg ønsker at ændre dette. 682 00:33:06,140 --> 00:33:07,940 Hvorfor kan jeg ikke gøre det? 683 00:33:07,940 --> 00:33:11,632 Procent s, komma s. 684 00:33:11,632 --> 00:33:13,090 Og dette er en lille kryptisk stadig. 685 00:33:13,090 --> 00:33:15,560 >> Så lad mig gøre mine variabler mere klar. 686 00:33:15,560 --> 00:33:17,510 Lad mig nævne denne variabel navn. 687 00:33:17,510 --> 00:33:20,230 Og lad os se om vi ikke kan drille fra hinanden, hvad der sker 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 opbevare denne streng, hvad brugeren har indtastet 690 00:33:25,620 --> 00:33:28,430 på hans eller hendes tastatur, i en variabel kaldet navn. 691 00:33:28,430 --> 00:33:30,590 Og det viser sig, at printf ikke bare 692 00:33:30,590 --> 00:33:34,220 tage et argument i dobbelt citater, en indgang i dobbelte anførselstegn. 693 00:33:34,220 --> 00:33:39,100 >> Det kan tage to eller tre, eller flere, såsom at den anden eller tredje eller fjerde, 694 00:33:39,100 --> 00:33:42,320 er alle de navne på variabler, eller specifikt værdier, 695 00:33:42,320 --> 00:33:48,610 at du ønsker at sætte ind, dynamisk, at streng i anførselstegn. 696 00:33:48,610 --> 00:33:52,110 Med andre ord, hvad ville være galt med dette? 697 00:33:52,110 --> 00:33:57,920 Hvis jeg sagde bare hej navn, omvendt skråstreg n, reddede min fil, kompileret min kode, 698 00:33:57,920 --> 00:34:01,660 og kørte det, hvad der ville ske? 699 00:34:01,660 --> 00:34:05,139 >> Det er lige til at sige, hej navn, bogstaveligt N-A-M-E, 700 00:34:05,139 --> 00:34:07,900 som er form for dumme, fordi Det er ikke anderledes end verden. 701 00:34:07,900 --> 00:34:10,400 Så noget i anførselstegn er hvad bogstaveligt bliver udskrevet. 702 00:34:10,400 --> 00:34:12,520 Så hvis jeg vil have en pladsholder der, 703 00:34:12,520 --> 00:34:14,422 Jeg faktisk nødt til at bruge nogle særlige syntaks. 704 00:34:14,422 --> 00:34:17,380 Og det viser sig, hvis du læser dokumentation for printf funktion, 705 00:34:17,380 --> 00:34:21,320 Det vil sige, at hvis du bruger procent s, 706 00:34:21,320 --> 00:34:23,920 du kan erstatte en værdi på følgende måde. 707 00:34:23,920 --> 00:34:27,190 >> Efter et komma efter at dobbelt tilbud, skal du blot 708 00:34:27,190 --> 00:34:29,179 skrive navnet på den variabel, du vil 709 00:34:29,179 --> 00:34:33,790 at tilslutte i dette format kode, eller format specifier, 710 00:34:33,790 --> 00:34:35,469 procent s for strygere. 711 00:34:35,469 --> 00:34:39,190 Og nu, hvis jeg har gemt min fil, Jeg går tilbage til min terminal. 712 00:34:39,190 --> 00:34:42,870 Og jeg skriver Make String, fordi igen, 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 har tænkt mig at sige Make String, indtaste. 715 00:34:48,510 --> 00:34:51,550 Åh min godhed, se på alle de fejl, vi har lavet i forvejen. 716 00:34:51,550 --> 00:34:55,540 Og dette is-- hvad, dette er virkelig ligesom en seks, syv line program? 717 00:34:55,540 --> 00:34:57,790 Så det er her, det kan meget hurtigt få overvældende. 718 00:34:57,790 --> 00:35:00,890 >> Denne terminal vindue har nu bare regurgitated 719 00:35:00,890 --> 00:35:03,230 et stort antal af fejlmeddelelser. 720 00:35:03,230 --> 00:35:07,560 Sikkert, jeg har ikke mere fejl meddelelser, end jeg har linjer kode. 721 00:35:07,560 --> 00:35:08,680 Så hvad sker der? 722 00:35:08,680 --> 00:35:10,920 >> Nå, den bedste strategi at gøre når som helst du 723 00:35:10,920 --> 00:35:13,710 støder en overvældende liste over fejl som dette, 724 00:35:13,710 --> 00:35:16,690 er rulle tilbage, kigge efter kommandoen du bare kørte, som i mit tilfælde 725 00:35:16,690 --> 00:35:18,020 er at gøre streng. 726 00:35:18,020 --> 00:35:21,630 Se på, hvad gør gjorde, og det er, at lang Dunk kommando, nogen 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 Green forsøger at være blid og hjælpsomme. 729 00:35:24,750 --> 00:35:26,140 Men det er stadig dårligt, i dette tilfælde. 730 00:35:26,140 --> 00:35:27,510 Men hvor er det slemt? 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 almindelig konvention. 733 00:35:32,930 --> 00:35:36,060 Noget kolon noget betyder linienummer og karakter nummer. 734 00:35:36,060 --> 00:35:41,080 Fejl, brug af sort 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å desværre, Dunk forsøger at være hjælpsom. 737 00:35:45,530 --> 00:35:46,850 Men det er forkert, i dette tilfælde. 738 00:35:46,850 --> 00:35:49,350 Nej, Dunk, jeg mente ikke standard IO. 739 00:35:49,350 --> 00:35:51,070 Jeg mente, at på linje et, ja. 740 00:35:51,070 --> 00:35:53,420 >> Men linie fem er denne ene her. 741 00:35:53,420 --> 00:35:57,040 Og Dunk ikke forstå S-T-R-I-N-G. 742 00:35:57,040 --> 00:36:01,490 Det er en sort identifikator, en ord har det bare aldrig set før. 743 00:36:01,490 --> 00:36:05,730 Og det er fordi C, sproget vi skriver koden i lige nu, 744 00:36:05,730 --> 00:36:08,070 ikke har variable kaldes strenge. 745 00:36:08,070 --> 00:36:11,380 >> Det gør det ikke, som standard, støtte noget, der hedder en streng. 746 00:36:11,380 --> 00:36:16,750 Det er en CS50 stykke jargon, men meget traditionel. 747 00:36:16,750 --> 00:36:18,600 Men jeg kan løse dette på følgende måde. 748 00:36:18,600 --> 00:36:22,090 >> Hvis jeg tilføjer en linje kode til toppen af ​​dette program, 749 00:36:22,090 --> 00:36:27,890 omfatter CS50.h, som er en anden fil et sted inde i CS50 IDE, et sted 750 00:36:27,890 --> 00:36:30,820 på harddisken, så at sige, af Ubuntu operativsystem 751 00:36:30,820 --> 00:36:33,590 at jeg løber, at er den fil, der er 752 00:36:33,590 --> 00:36:38,740 vil lære operativsystemet systemet, hvad en streng er, bare 753 00:36:38,740 --> 00:36:41,930 ligesom standard io.h er den fil i operativsystemet, der er 754 00:36:41,930 --> 00:36:44,430 kommer til at undervise i det, hvad printf er. 755 00:36:44,430 --> 00:36:46,810 >> Faktisk ville vi have fået en meget lignende besked 756 00:36:46,810 --> 00:36:50,600 hvis IO havde indrømmet standard IO.h og forsøgte at bruge printf. 757 00:36:50,600 --> 00:36:53,632 Så jeg har tænkt mig at gå videre og bare tage kontrol L at rydde min skærm. 758 00:36:53,632 --> 00:36:56,340 Eller du kan skrive klart og det vil bare rydde terminalvinduet. 759 00:36:56,340 --> 00:36:58,020 Men du kan stadig rulle tilbage i tiden. 760 00:36:58,020 --> 00:37:01,100 >> Og jeg har tænkt mig at køres igen Make String. 761 00:37:01,100 --> 00:37:03,660 Kryds mine fingre denne gang, Enter. 762 00:37:03,660 --> 00:37:05,380 Åh min Gud, det virkede. 763 00:37:05,380 --> 00:37:09,280 det viser mig lang kryptisk kommando det er det, Sørg genereres via Dunk, 764 00:37:09,280 --> 00:37:10,460 men ingen fejlmeddelelser. 765 00:37:10,460 --> 00:37:12,460 Så indse, selv om du får muligvis helt 766 00:37:12,460 --> 00:37:14,480 overvældet med antal fejlmeddelelser, 767 00:37:14,480 --> 00:37:17,540 det bare kunne være dette irriterende cascading effekt, hvor Dunk ikke forstår 768 00:37:17,540 --> 00:37:19,620 én ting, hvilket betyder, at det derefter forstår ikke det næste ord, 769 00:37:19,620 --> 00:37:20,560 eller den næste linje. 770 00:37:20,560 --> 00:37:22,850 Og så det bare chokes på din kode. 771 00:37:22,850 --> 00:37:24,440 Men rettelsen kan være enkel. 772 00:37:24,440 --> 00:37:27,822 Og så altid fokusere på allerførste linje af output. 773 00:37:27,822 --> 00:37:29,530 Og hvis du ikke gør forstår det, bare se 774 00:37:29,530 --> 00:37:32,480 for søgeord, der kunne være spor, og linjenummeret, 775 00:37:32,480 --> 00:37:34,650 og art, hvor denne fejl kunne være. 776 00:37:34,650 --> 00:37:40,328 >> Lad mig nu gå videre og skrive dot skråstreg, snor, indtaste. 777 00:37:40,328 --> 00:37:44,340 Hm, er det ikke at sige hej noget. 778 00:37:44,340 --> 00:37:46,210 Hvorfor? 779 00:37:46,210 --> 00:37:48,170 Nå, husker, hvor det kører? 780 00:37:48,170 --> 00:37:53,730 >> Det er formentlig stukket i øjeblikket i en løkke, hvis du vil, på linje seks, 781 00:37:53,730 --> 00:37:56,950 fordi Get String ved design, skrevet af CS50 personale, 782 00:37:56,950 --> 00:38:00,350 bogstaveligt betød at bare sidde 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, hvad vi mener med strengen er menneskeligt input. 785 00:38:03,792 --> 00:38:04,500 Så ved du hvad? 786 00:38:04,500 --> 00:38:05,166 Lad mig gå videre. 787 00:38:05,166 --> 00:38:08,704 Og bare på et indfald, lad mig skriv mit navn, David, indtaste. 788 00:38:08,704 --> 00:38:10,120 Nu har jeg en mere dynamisk program. 789 00:38:10,120 --> 00:38:11,240 Det sagde hej David. 790 00:38:11,240 --> 00:38:16,280 >> Hvis jeg gå videre og køre dette igen, lad mig prøve sige Zamila navn, indtast. 791 00:38:16,280 --> 00:38:17,940 Og nu har vi en dynamisk program. 792 00:38:17,940 --> 00:38:19,380 Jeg har ikke svært kodet verden. 793 00:38:19,380 --> 00:38:21,760 Jeg har ikke svært kodet navn, eller David eller Zamila. 794 00:38:21,760 --> 00:38:25,350 >> Nu er det meget mere som programmerne vi ved, hvor, hvis det tager input, 795 00:38:25,350 --> 00:38:27,870 den producerer lidt anderledes output. 796 00:38:27,870 --> 00:38:31,020 Nu, dette er ikke den bedste brugeroplevelse, eller UX. 797 00:38:31,020 --> 00:38:33,000 Jeg køre programmet. 798 00:38:33,000 --> 00:38:35,830 >> Jeg ved ikke, hvad jeg skulle at gøre, medmindre jeg faktisk ser på 799 00:38:35,830 --> 00:38:37,290 eller huske kildekoden. 800 00:38:37,290 --> 00:38:39,640 Så lad os gøre brugeren opleve lidt bedre 801 00:38:39,640 --> 00:38:41,240 med den enkleste af ting. 802 00:38:41,240 --> 00:38:44,782 Lad mig gå tilbage til dette program, og blot sige printf. 803 00:38:44,782 --> 00:38:48,870 >> Og lad mig gå videre og sige navnet, colon, og et mellemrum og derefter et semikolon. 804 00:38:48,870 --> 00:38:51,170 Og bare for sjov, ingen slør n. 805 00:38:51,170 --> 00:38:52,980 Og det er bevidst, fordi jeg ikke vil 806 00:38:52,980 --> 00:38:54,590 bliver bedt om at flytte til den næste linje. 807 00:38:54,590 --> 00:38:58,800 >> Jeg vil, i stedet, gør det, gør streng at kompilere min kode i ny maskine 808 00:38:58,800 --> 00:39:00,980 kode dot skråstreg streng. 809 00:39:00,980 --> 00:39:02,460 Ah, det er meget pænere. 810 00:39:02,460 --> 00:39:05,780 Nu ved jeg rent faktisk ved, hvad computeren vil have mig til at gøre, at give den et navn. 811 00:39:05,780 --> 00:39:10,020 >> Så jeg har tænkt mig at gå videre og skrive i Rob, indtaste, og goddag, Rob. 812 00:39:10,020 --> 00:39:13,640 Så indse, er det stadig i slutningen af dagen, kun en ni linje program. 813 00:39:13,640 --> 00:39:15,090 Men vi har taget disse små skridt. 814 00:39:15,090 --> 00:39:18,380 >> Vi skrev en linje, som vi var bekendt, printf, hej verden. 815 00:39:18,380 --> 00:39:19,980 Så løste vi en lille smule af det. 816 00:39:19,980 --> 00:39:21,560 Og vi faktisk brugt get streng. 817 00:39:21,560 --> 00:39:23,362 Og vi kastede denne værdi i en variabel. 818 00:39:23,362 --> 00:39:26,070 Og så gik vi videre og forbedret det videre med en tredje linje. 819 00:39:26,070 --> 00:39:29,220 Og denne iterative skrive software er virkelig nøglen. 820 00:39:29,220 --> 00:39:33,420 I CS50, og i livet i almindelighed, du bør generelt ikke sidde ned, 821 00:39:33,420 --> 00:39:36,800 har et program i tankerne, og prøv at skrive det hele helvedes ting på én gang. 822 00:39:36,800 --> 00:39:40,810 >> Det vil uundgåeligt resultere i måde flere fejl, end vi selv oplevede her. 823 00:39:40,810 --> 00:39:44,070 Selv jeg, den dag i dag, hele tiden gøre andre dumme fejl, 824 00:39:44,070 --> 00:39:47,480 er faktisk hårdere fejl der er sværere at regne ud. 825 00:39:47,480 --> 00:39:52,095 Men du vil gøre flere fejltagelser mere kodelinjer du skriver på én gang. 826 00:39:52,095 --> 00:39:54,220 Og så denne praksis med, skrive en lille smule kode 827 00:39:54,220 --> 00:39:57,930 at du er fortrolig med, kompilere det, kører det, teste det mere generelt, 828 00:39:57,930 --> 00:40:01,370 derefter flytte on-- så ligesom vi holdt lagdeling og lagdeling i sidste uge, 829 00:40:01,370 --> 00:40:04,190 bygning fra noget meget simpelt til noget mere kompleks, 830 00:40:04,190 --> 00:40:05,200 gøre det samme her. 831 00:40:05,200 --> 00:40:08,500 Må ikke sidde ned, og forsøge at skrive en hel problem. 832 00:40:08,500 --> 00:40:10,780 Faktisk tager disse små skridt. 833 00:40:10,780 --> 00:40:15,100 >> Nu, strenge er ikke alle at nyttig til sig selv. 834 00:40:15,100 --> 00:40:18,210 Vi havde faktisk ideelt set gerne har noget andet i vores værktøjskasse. 835 00:40:18,210 --> 00:40:20,990 Så lad os rent faktisk gør præcis det. 836 00:40:20,990 --> 00:40:24,900 >> Lad mig gå videre nu, og pisk op en lidt anden program. 837 00:40:24,900 --> 00:40:28,320 Og vi vil kalde denne int.c, for heltal. 838 00:40:28,320 --> 00:40:30,870 Jeg har tænkt mig at, på samme måde, omfatter CS550.h. 839 00:40:30,870 --> 00:40:33,060 Jeg har tænkt mig at inkludere standard IO. 840 00:40:33,060 --> 00:40:36,630 Og det kommer til at være temmelig almindelig i disse første par dage af klassen. 841 00:40:36,630 --> 00:40:39,050 >> Og jeg har tænkt mig at klar mig med en hovedfunktion. 842 00:40:39,050 --> 00:40:43,370 Og nu i stedet for at få en streng, lad os gå videre og få en int. 843 00:40:43,370 --> 00:40:49,285 Lad os kalde det jeg, og kalder det får int, tætte parens, semikolon. 844 00:40:49,285 --> 00:40:51,410 Og lad os nu gøre noget med det, printf. 845 00:40:51,410 --> 00:40:56,190 >> Lad os sige noget lignende hej, omvendt skråstreg n, komma i. 846 00:40:56,190 --> 00:41:00,010 Så jeg temmelig meget efterligne hvad jeg gjorde for et øjeblik siden. 847 00:41:00,010 --> 00:41:01,660 Jeg har en pladsholder her. 848 00:41:01,660 --> 00:41:05,150 Jeg har komma jeg her, fordi jeg ønsker at sætte i ind i denne pladsholder. 849 00:41:05,150 --> 00:41:07,250 >> Så lad os gå videre og prøve udarbejdelsen af ​​denne program. 850 00:41:07,250 --> 00:41:10,060 Filen hedder int.c. 851 00:41:10,060 --> 00:41:12,920 Så jeg har tænkt mig at sige, gøre int, indtaste. 852 00:41:12,920 --> 00:41:16,420 Åh min Gud, men nogen big deal, right? 853 00:41:16,420 --> 00:41:17,230 Der er en fejl. 854 00:41:17,230 --> 00:41:19,810 >> Der er en syntaktisk fejl her sådan, at programmet ikke kan 855 00:41:19,810 --> 00:41:25,460 udarbejdes inde int.c, linje syv, karakter 27, fejl format 856 00:41:25,460 --> 00:41:28,400 specificerer typen char stjerne, hvad det så er. 857 00:41:28,400 --> 00:41:30,020 Men argumentet type er int. 858 00:41:30,020 --> 00:41:33,110 >> Så også her, vi vil ikke at-- selvom dag er meget materiale, 859 00:41:33,110 --> 00:41:35,710 vi kommer til at overvælde dig med absolut hvert element i C, 860 00:41:35,710 --> 00:41:38,070 og programmering mere generelt i netop disse første par uger. 861 00:41:38,070 --> 00:41:40,400 Så der er ofte kommer til at være jargon som du ikke kender. 862 00:41:40,400 --> 00:41:43,350 Og faktisk char stjerne er noget vi kommer til at vende tilbage til 863 00:41:43,350 --> 00:41:44,830 i en uge eller to tid. 864 00:41:44,830 --> 00:41:47,530 >> Men for nu, lad os se om vi kan parse ord, der er fortrolige med. 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 velkendt. 867 00:41:51,840 --> 00:41:53,840 Motortype- men argumentet har typen int. 868 00:41:53,840 --> 00:41:55,980 Vent et øjeblik, jeg er en int. 869 00:41:55,980 --> 00:41:59,230 >> Måske procent s faktisk har nogle definerede betydning. 870 00:41:59,230 --> 00:42:00,230 Og netop det gør. 871 00:42:00,230 --> 00:42:03,101 Et heltal, hvis du ønsker printf at erstatte det, 872 00:42:03,101 --> 00:42:05,350 du faktisk nødt til at bruge en andet format specifier. 873 00:42:05,350 --> 00:42:06,890 Og du ville ikke vide det medmindre nogen fortalte dig, 874 00:42:06,890 --> 00:42:07,973 eller du havde gjort det før. 875 00:42:07,973 --> 00:42:10,490 Men procent i er hvad kan almindeligvis anvendes 876 00:42:10,490 --> 00:42:12,240 i printf til at tilslutte et heltal. 877 00:42:12,240 --> 00:42:14,920 Du kan også bruge procent d til en decimal heltal. 878 00:42:14,920 --> 00:42:16,490 Men jeg er nice og enkel her. 879 00:42:16,490 --> 00:42:17,590 Så vi vil gå med det. 880 00:42:17,590 --> 00:42:21,160 >> Lad mig nu gå videre og gentagelsen make int, Enter. 881 00:42:21,160 --> 00:42:23,328 Det er godt, ingen fejl. 882 00:42:23,328 --> 00:42:27,260 Dot slash int-- OK, dårlig brugeroplevelse, fordi jeg ikke har fortalt mig selv 883 00:42:27,260 --> 00:42:27,760 hvad skal man gøre. 884 00:42:27,760 --> 00:42:28,426 Men det er fint. 885 00:42:28,426 --> 00:42:29,480 Jeg fange på hurtigt. 886 00:42:29,480 --> 00:42:36,260 >> Og lad mig gå videre og skrive 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 gang, jeg bruger en funktion, en brik, kaldet get int. 889 00:42:41,710 --> 00:42:44,230 Og det viser out-- og vi vil se denne senere i term-- 890 00:42:44,230 --> 00:42:47,730 den CS50 personale har gennemført få strengen på en sådan måde 891 00:42:47,730 --> 00:42:50,350 at det vil kun fysisk få en streng til dig. 892 00:42:50,350 --> 00:42:54,340 >> Det har implementeret get int i sådan måde, at det kun vil 893 00:42:54,340 --> 00:42:55,590 få et heltal for dig. 894 00:42:55,590 --> 00:42:57,830 Og hvis du, det menneskelige, ikke samarbejder, er det 895 00:42:57,830 --> 00:43:00,590 bogstavelig talt lige til at siger prøve igen, prøve igen, prøve igen, 896 00:43:00,590 --> 00:43:05,200 bogstaveligt sidder der looping, indtil du forpligter med nogle magiske tal, 897 00:43:05,200 --> 00:43:07,670 ligesom 50, og goddag 50. 898 00:43:07,670 --> 00:43:11,440 >> Eller hvis vi kører det igen og skrive i 42, hej 42. 899 00:43:11,440 --> 00:43:15,750 Og så get int funktionen indersiden af ​​denne brik 900 00:43:15,750 --> 00:43:19,050 er nok logik, nok tanke, at finde ud af, hvad der er et ord? 901 00:43:19,050 --> 00:43:20,330 Og hvad er et tal? 902 00:43:20,330 --> 00:43:23,165 Kun acceptere, i sidste ende, tal. 903 00:43:23,165 --> 00:43:25,690 904 00:43:25,690 --> 00:43:30,230 >> Så det viser sig, at denne er ikke alt, udtryksfulde. 905 00:43:30,230 --> 00:43:30,910 indtil nu. 906 00:43:30,910 --> 00:43:33,690 Så yay, sidste gang vi gik temmelig hurtigt 907 00:43:33,690 --> 00:43:38,320 ind gennemførelsesbestemmelser spil og animation, og kunstneriske værker i Scratch. 908 00:43:38,320 --> 00:43:42,260 Og her er vi være tilfreds med hello verden, og goddag 50. 909 00:43:42,260 --> 00:43:43,696 >> Det er ikke alt, inspirerende. 910 00:43:43,696 --> 00:43:46,070 Og, ja, disse første par eksempler vil tage nogen tid 911 00:43:46,070 --> 00:43:47,510 at rampe op i spænding. 912 00:43:47,510 --> 00:43:49,854 Men vi har så meget mere kontrollerer nu, faktisk. 913 00:43:49,854 --> 00:43:51,770 Og vi vil meget hurtigt begynde lagdeling 914 00:43:51,770 --> 00:43:53,870 på toppen af ​​disse grundlæggende primitiver. 915 00:43:53,870 --> 00:43:56,370 >> Men først, lad os forstå hvad begrænsningerne er. 916 00:43:56,370 --> 00:43:58,620 Faktisk er en af ​​de ting Scratch ikke let 917 00:43:58,620 --> 00:44:00,990 Lad os gøre, er virkelig se under emhætten, 918 00:44:00,990 --> 00:44:03,740 og forstå, hvad en computer er, hvad det kan gøre, 919 00:44:03,740 --> 00:44:05,250 og hvad dens begrænsninger er. 920 00:44:05,250 --> 00:44:08,580 Og, ja, at manglende forståelse potentielt langsigtet 921 00:44:08,580 --> 00:44:12,520 kan føre til vores egen mistakes-- skrivning bugs, skriveredskaber usikker software, 922 00:44:12,520 --> 00:44:13,880 bliver hacket på en eller anden måde. 923 00:44:13,880 --> 00:44:17,130 >> Så lad os tage nogle skridt i retning forstå dette lidt bedre ved 924 00:44:17,130 --> 00:44:19,710 måde, siger, det følgende eksempel. 925 00:44:19,710 --> 00:44:23,550 Jeg har tænkt mig at gå videre og gennemføre rigtig hurtig et program kaldet adder. 926 00:44:23,550 --> 00:44:25,134 Ligesom, lad os tilføje nogle tal sammen. 927 00:44:25,134 --> 00:44:27,800 Og jeg har tænkt mig at kode nogle hjørner her, og bare kopiere og indsætte 928 00:44:27,800 --> 00:44:30,270 hvor jeg var før, bare så vi kan komme i gang hurtigere. 929 00:44:30,270 --> 00:44:33,090 Så nu har jeg fået de grundlæggende begyndelser af et program kaldet adder. 930 00:44:33,090 --> 00:44:34,670 >> Og lad os gå videre og gøre dette. 931 00:44:34,670 --> 00:44:38,680 Jeg har tænkt mig at gå videre og siger, intx får få int. 932 00:44:38,680 --> 00:44:39,430 Og ved du hvad? 933 00:44:39,430 --> 00:44:40,990 Lad os lave en bedre brugeroplevelse. 934 00:44:40,990 --> 00:44:45,740 >> Så lad os bare sige x er, og effektivt bede brugeren om at give os x. 935 00:44:45,740 --> 00:44:50,600 Og så lad mig gå videre og sige, printf hvad med y er, denne gang forventer 936 00:44:50,600 --> 00:44:53,140 to værdier fra brugeren. 937 00:44:53,140 --> 00:44:59,759 Og så lad os bare gå videre og sige, printf, summen af ​​x og y er. 938 00:44:59,759 --> 00:45:01,300 Og nu ønsker jeg ikke at gøre procent s. 939 00:45:01,300 --> 00:45:09,080 Jeg ønsker at gøre procent i, backslash n, og derefter tilslutte sum værdi. 940 00:45:09,080 --> 00:45:10,620 >> Så hvordan kan jeg gå om at gøre dette? 941 00:45:10,620 --> 00:45:11,270 Du ved hvad? 942 00:45:11,270 --> 00:45:12,840 Jeg ved, hvordan man bruger variablerne. 943 00:45:12,840 --> 00:45:15,140 Lad mig blot erklære en ny, int z. 944 00:45:15,140 --> 00:45:16,770 >> Og jeg har tænkt mig at tage et gæt her. 945 00:45:16,770 --> 00:45:21,470 Hvis der er lighedstegn i dette sprog, måske jeg kan bare gøre x plus y, 946 00:45:21,470 --> 00:45:23,660 så længe jeg slutte min tænkte med et semikolon? 947 00:45:23,660 --> 00:45:28,170 Nu kan jeg gå tilbage hernede, tilslutte z, afslutte denne tanke med et semikolon. 948 00:45:28,170 --> 00:45:33,160 Og lad os nu se, hvis disse sekvenser af 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 >> Tilføj x og y, gemme værdien i z-- så, igen, husk lighedstegnet 951 00:45:37,980 --> 00:45:38,560 er ikke lig. 952 00:45:38,560 --> 00:45:41,100 Det er opgave fra højre mod venstre. 953 00:45:41,100 --> 00:45:45,180 Og lad os udskrive at summen af x og y er ikke bogstaveligt z, 954 00:45:45,180 --> 00:45:46,830 men hvad der er inde i z. 955 00:45:46,830 --> 00:45:50,090 Så lad os gøre Adder - nice, ingen fejl denne gang. 956 00:45:50,090 --> 00:45:53,030 Dot skråstreg Adder, indtaste, x bliver 1. 957 00:45:53,030 --> 00:45:55,380 >> Y vil være to. 958 00:45:55,380 --> 00:45:58,964 Og summen af ​​x og y er 3. 959 00:45:58,964 --> 00:46:00,130 Så det er alt fint og godt. 960 00:46:00,130 --> 00:46:03,260 >> Så du ville forestille sig, at matematik bør arbejde i et program som dette. 961 00:46:03,260 --> 00:46:04,040 Men ved du hvad? 962 00:46:04,040 --> 00:46:06,904 Er denne variabel, linje 12, endog nødvendigt? 963 00:46:06,904 --> 00:46:09,820 Du behøver ikke at få for vane af bare at lagre ting i variabler 964 00:46:09,820 --> 00:46:10,980 bare fordi du kan. 965 00:46:10,980 --> 00:46:13,550 Og i virkeligheden, er det normalt betragtes som dårlig design 966 00:46:13,550 --> 00:46:18,100 hvis du opretter en variabel, kaldet z i dette tilfælde, lagring noget i det, 967 00:46:18,100 --> 00:46:21,390 og derefter straks at bruge det, men aldrig igen. 968 00:46:21,390 --> 00:46:24,700 Hvorfor give noget et navn ligesom z, hvis du er bogstaveligt talt 969 00:46:24,700 --> 00:46:26,770 kommer til at bruge det eneste gang, og så 970 00:46:26,770 --> 00:46:29,380 proksimalt for hvor du oprettede det i første omgang, 971 00:46:29,380 --> 00:46:31,052 så tæt i form af linjer kode? 972 00:46:31,052 --> 00:46:31,760 Så ved du hvad? 973 00:46:31,760 --> 00:46:34,480 Det viser sig, at C er temmelig fleksibel. 974 00:46:34,480 --> 00:46:36,586 Hvis jeg rent faktisk ønsker at plug-in værdier her, 975 00:46:36,586 --> 00:46:38,210 Jeg behøver ikke at erklære en ny variabel. 976 00:46:38,210 --> 00:46:41,680 Jeg kunne bare plug-in x plus y, fordi C forstår 977 00:46:41,680 --> 00:46:43,390 aritmetik, og matematiske operatorer. 978 00:46:43,390 --> 00:46:47,140 >> Så jeg kan blot sige, at gøre dette matematik, x plus y, uanset disse værdier, er, 979 00:46:47,140 --> 00:46:50,780 plug den resulterende heltal i denne streng. 980 00:46:50,780 --> 00:46:53,730 Så dette kan være, men kun én linje kortere, 981 00:46:53,730 --> 00:46:58,480 et bedre design, et bedre program, fordi der er mindre kode, derfor 982 00:46:58,480 --> 00:46:59,921 mindre for mig at forstå. 983 00:46:59,921 --> 00:47:01,920 Og det er også bare renere, så vidt vi er ikke 984 00:47:01,920 --> 00:47:04,620 indføre nye ord, nye symboler, ligesom z, 985 00:47:04,620 --> 00:47:07,510 selvom de egentlig ikke tjene meget af et formål. 986 00:47:07,510 --> 00:47:12,890 >> Desværre, matematik er ikke alle, at pålidelige tider. 987 00:47:12,890 --> 00:47:15,270 Lad os gå videre og gøre dette. 988 00:47:15,270 --> 00:47:18,200 Jeg har tænkt mig at gå videre nu og gøre følgende. 989 00:47:18,200 --> 00:47:27,650 >> Lad os gøre printf, procent i, plus procent i, skal være procent i, backslash n. 990 00:47:27,650 --> 00:47:32,240 Og jeg har tænkt mig at gøre denne-- xyx plus y. 991 00:47:32,240 --> 00:47:34,821 Så jeg bare at omskrive denne lidt anderledes her. 992 00:47:34,821 --> 00:47:36,320 Lad mig bare gøre en hurtig tilregnelighed check. 993 00:47:36,320 --> 00:47:37,986 Igen, lad os ikke komme foran os selv. 994 00:47:37,986 --> 00:47:41,420 Lav adder, dot skråstreg adder. 995 00:47:41,420 --> 00:47:44,950 x er 1, y er 2, 1 plus 2 er 3. 996 00:47:44,950 --> 00:47:45,870 Så det er godt. 997 00:47:45,870 --> 00:47:49,060 Men lad os komplicere dette nu lidt, og oprette en ny fil. 998 00:47:49,060 --> 00:47:53,350 >> Jeg har tænkt mig at kalde denne ene, sige, ints, plural for heltal. 999 00:47:53,350 --> 00:47:55,980 Lad mig starte hvor jeg var for et øjeblik siden. 1000 00:47:55,980 --> 00:47:57,770 Men lad os nu gøre et par andre linjer. 1001 00:47:57,770 --> 00:48:03,430 Lad mig gå videre og gøre følgende, printf, procent i, minus procent i, 1002 00:48:03,430 --> 00:48:08,959 er procent i, komma x, komma yx minus y. 1003 00:48:08,959 --> 00:48:10,750 Så jeg gør lidt anderledes matematik der. 1004 00:48:10,750 --> 00:48:11,624 Lad os gøre en anden én. 1005 00:48:11,624 --> 00:48:16,610 Så procent I tider procent Jeg er procent i, backslash n. 1006 00:48:16,610 --> 00:48:21,430 Lad os plug-in x, og y, og x gange y. 1007 00:48:21,430 --> 00:48:24,530 Vi bruger stjernen på din computer for tider. 1008 00:48:24,530 --> 00:48:26,390 >> Du behøver ikke bruge x. x er en variabel navn her. 1009 00:48:26,390 --> 00:48:28,270 Du bruger stjerne for multiplikation. 1010 00:48:28,270 --> 00:48:29,020 Lad os gøre en mere. 1011 00:48:29,020 --> 00:48:34,580 Printf procent I, opdelt ved procent i, er procent i, 1012 00:48:34,580 --> 00:48:40,460 backslash n. xy divideret med y-- så du bruger skråstreg i C 1013 00:48:40,460 --> 00:48:41,502 at gøre division. 1014 00:48:41,502 --> 00:48:42,460 Og lad os gøre en anden. 1015 00:48:42,460 --> 00:48:47,920 1016 00:48:47,920 --> 00:48:55,240 Resten af ​​procent I, opdelt ved procent i, er procent i. 1017 00:48:55,240 --> 00:48:59,550 xy-- og nu resten er, hvad der er tilovers. 1018 00:48:59,550 --> 00:49:02,980 Når du prøver at dividere et nævneren i en tælleren, 1019 00:49:02,980 --> 00:49:05,570 hvor meget der er tilovers, at kunne du ikke opdele ud? 1020 00:49:05,570 --> 00:49:07,910 >> Så der er ikke rigtig, nødvendigvis, et symbol 1021 00:49:07,910 --> 00:49:09,470 vi har brugt i folkeskolen til dette. 1022 00:49:09,470 --> 00:49:13,830 Men der i C. Du kan sige x modulo y, hvor 1023 00:49:13,830 --> 00:49:18,000 denne procent skilt i denne context-- forvirrende når du er inde 1024 00:49:18,000 --> 00:49:20,170 af de dobbelte anførselstegn, indersiden af ​​printf, procent 1025 00:49:20,170 --> 00:49:21,830 anvendes som formateringsanvisning. 1026 00:49:21,830 --> 00:49:25,420 >> Når du bruger procent uden for at der i et matematisk udtryk, 1027 00:49:25,420 --> 00:49:29,910 det er den modulo operatør for modulær arithmetic-- til vores formål 1028 00:49:29,910 --> 00:49:33,650 her, betyder bare, hvad der er den resten af ​​x divideret med y? 1029 00:49:33,650 --> 00:49:36,130 Så x divideret med y er x skråstreg y. 1030 00:49:36,130 --> 00:49:38,220 Hvad er resten af ​​x divideret med y? 1031 00:49:38,220 --> 00:49:41,780 Det er x mod y, som programmør ville sige. 1032 00:49:41,780 --> 00:49:48,300 >> Så hvis jeg lavede ingen fejl her, lad mig gå videre og gøre ints, plural, nice, 1033 00:49:48,300 --> 00:49:50,010 og dot skråstreg ints. 1034 00:49:50,010 --> 00:49:55,270 Og lad os gå videre og gør, lad os sige, 1, 10. 1035 00:49:55,270 --> 00:49:58,390 Okay, en plus 10 er 11, check. 1036 00:49:58,390 --> 00:50:01,240 1 minus 10 er negativ 9, check. 1037 00:50:01,240 --> 00:50:03,420 >> 1 gange 10 er 10, check. 1038 00:50:03,420 --> 00:50:07,090 1 divideret med 10 is-- OK, vi vil springe denne ene. 1039 00:50:07,090 --> 00:50:09,480 Resterende del af 1 divideret med 10 er 1. 1040 00:50:09,480 --> 00:50:10,680 Det er korrekt. 1041 00:50:10,680 --> 00:50:12,630 Men der er en fejl i her. 1042 00:50:12,630 --> 00:50:15,390 >> Så den jeg sætter min udlevere, ikke korrekt. 1043 00:50:15,390 --> 00:50:16,670 Jeg mener, det er tæt på 0. 1044 00:50:16,670 --> 00:50:20,670 1 divideret med 10, du ved, hvis vi er skære nogle hjørner, sikker, det er nul. 1045 00:50:20,670 --> 00:50:28,050 Men det skal virkelig være 1/10, 0,1, eller 0,10, 0.1000, eller så videre. 1046 00:50:28,050 --> 00:50:30,600 >> Det burde egentlig ikke være nul. 1047 00:50:30,600 --> 00:50:35,990 Tja, det viser sig, at computeren er gør bogstaveligt hvad vi fortalte det til at gøre. 1048 00:50:35,990 --> 00:50:39,460 Vi gør matematik ligesom x divideret med y. 1049 00:50:39,460 --> 00:50:44,680 Og både x og y, pr linjerne kode tidligere, er hele tal. 1050 00:50:44,680 --> 00:50:50,440 >> Endvidere på linie 15, er vi fortæller printf, hey, printf plug-in 1051 00:50:50,440 --> 00:50:54,230 et heltal, plug-in er et heltal, plug-in en integer-- specifikt 1052 00:50:54,230 --> 00:50:57,580 x, og derefter y, og derefter x divideret med y. x og y er ints. 1053 00:50:57,580 --> 00:50:59,060 Vi er gode der. 1054 00:50:59,060 --> 00:51:01,250 >> Men hvad er x divideret med x? 1055 00:51:01,250 --> 00:51:06,790 x divideret med y burde være, matematisk, 1/10, eller 0,1, 1056 00:51:06,790 --> 00:51:11,600 der er et reelt tal, et reelt tal have potentielt et komma. 1057 00:51:11,600 --> 00:51:13,230 Det er ikke et heltal. 1058 00:51:13,230 --> 00:51:18,290 >> Men hvad er tættest heltal til 1/10 eller 0,1? 1059 00:51:18,290 --> 00:51:21,114 Ja, den slags er nul. 1060 00:51:21,114 --> 00:51:22,030 0.1 er sådan meget. 1061 00:51:22,030 --> 00:51:22,890 Og en er så meget. 1062 00:51:22,890 --> 00:51:25,870 Så 1/10 er tættere på 0 end det er at en. 1063 00:51:25,870 --> 00:51:30,800 >> Og hvad så C gør for os-- slags fordi vi fortalte det at-- 1064 00:51:30,800 --> 00:51:32,600 er trunkering at heltal. 1065 00:51:32,600 --> 00:51:40,540 Det tager værdien, som igen er formodes at være noget i retning 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 beskærer alt efter kommaet 1068 00:51:45,320 --> 00:51:47,510 således at alt dette ting, fordi den ikke 1069 00:51:47,510 --> 00:51:51,910 passer i begrebet et heltal, som er blot et tal som negativ 1, 0, 1, 1070 00:51:51,910 --> 00:51:55,830 op og ned, det kaster alt væk efter kommaet, fordi du 1071 00:51:55,830 --> 00:51:59,020 kan ikke passe et decimaltegn i et helt tal per definition. 1072 00:51:59,020 --> 00:52:01,290 >> Så svaret her er nul. 1073 00:52:01,290 --> 00:52:02,600 Så hvordan kan vi løse dette? 1074 00:52:02,600 --> 00:52:04,400 Vi har brug for en anden løsning alle sammen. 1075 00:52:04,400 --> 00:52:06,880 Og vi kan gøre det, som følger. 1076 00:52:06,880 --> 00:52:12,820 >> Lad mig gå videre og skabe en ny fil, denne ene kaldet floats.c. 1077 00:52:12,820 --> 00:52:16,500 Og gemme det her i samme mappe, float.c. 1078 00:52:16,500 --> 00:52:19,360 1079 00:52:19,360 --> 00:52:23,260 Og lad mig gå videre og kopiere noget af det kode fra tidligere. 1080 00:52:23,260 --> 00:52:27,690 >> Men i stedet for at få en int, lad os gøre det. 1081 00:52:27,690 --> 00:52:31,037 Giv mig en decimaltalsværdi kaldet x. hvor en flydende komma 1082 00:52:31,037 --> 00:52:33,370 værdi er lige bogstaveligt noget med en floating point. 1083 00:52:33,370 --> 00:52:34,410 Den kan bevæge sig til venstre, til højre. 1084 00:52:34,410 --> 00:52:35,530 Det er et reelt tal. 1085 00:52:35,530 --> 00:52:38,050 >> Og lad mig kalde ikke få int, men få float, 1086 00:52:38,050 --> 00:52:41,420 som også var blandt menuen af muligheder i C250 biblioteket. 1087 00:52:41,420 --> 00:52:43,220 Lad os ændre y til en flyder. 1088 00:52:43,220 --> 00:52:45,000 Så det bliver få float. 1089 00:52:45,000 --> 00:52:47,620 >> Og nu, ønsker vi ikke at tilslutte ints. 1090 00:52:47,620 --> 00:52:53,130 Det viser sig, vi er nødt til at bruge procent f for float, procent f for float, 1091 00:52:53,130 --> 00:52:54,560 og nu gemme det. 1092 00:52:54,560 --> 00:53:01,220 Og nu, krydsede fingre, gøre flåd, nice, dot skråstreg flåd. 1093 00:53:01,220 --> 00:53:04,280 x bliver en 1. y Kommer til at være 10 igen. 1094 00:53:04,280 --> 00:53:08,240 >> Og, nice, OK min tilføjelse er korrekt. 1095 00:53:08,240 --> 00:53:10,240 Jeg håbede på mere, men jeg glemte at skrive det. 1096 00:53:10,240 --> 00:53:13,250 Så lad os gå og løse dette logisk fejl. 1097 00:53:13,250 --> 00:53:16,280 >> Lad os gå videre og få fat følgende. 1098 00:53:16,280 --> 00:53:18,080 Vi vil bare gøre lidt kopiere og indsætte. 1099 00:53:18,080 --> 00:53:20,080 Og jeg har tænkt mig at sige minus. 1100 00:53:20,080 --> 00:53:21,890 >> Og jeg har tænkt mig at sige gange. 1101 00:53:21,890 --> 00:53:24,060 Og jeg har tænkt mig at sige delt. 1102 00:53:24,060 --> 00:53:28,240 Og jeg har ikke tænkt mig at gøre modulo, som ikke er så germane her, 1103 00:53:28,240 --> 00:53:33,690 divideret med f, og tider plus-- OK, lad os gøre det igen. 1104 00:53:33,690 --> 00:53:44,210 >> Gør flåd, dot skråstreg flåd, og 1, 10, og-- nice, nej, 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å det er meget almindeligt i datalogi 1107 00:53:47,000 --> 00:53:49,780 at lave dumme fejl som denne. 1108 00:53:49,780 --> 00:53:53,100 >> For pædagogiske formål, hvad jeg virkelig ønskede at gøre 1109 00:53:53,100 --> 00:53:57,410 blev ændre videnskab her til plus, minus, til tider, 1110 00:53:57,410 --> 00:54:01,140 og til at dele, som du forhåbentlig bemærket i løbet af denne øvelse. 1111 00:54:01,140 --> 00:54:04,700 Så lad os nu re-kompilere dette program, gør dot skråstreg flåd. 1112 00:54:04,700 --> 00:54:07,950 >> Og for tredje gang, lad os se, om det opfylder mine forventninger. 1113 00:54:07,950 --> 00:54:21,480 1, 10, indtast, ja, OK, 1,000, divideret med 10.000, er 0,100 tusind. 1114 00:54:21,480 --> 00:54:24,952 Og det viser sig, vi kan styre, hvor mange tal er efter disse decimaler. 1115 00:54:24,952 --> 00:54:25,660 Vi faktisk vil. 1116 00:54:25,660 --> 00:54:26,790 Vi kommer tilbage til. 1117 00:54:26,790 --> 00:54:28,440 >> Men nu, i virkeligheden, matematik er korrekt. 1118 00:54:28,440 --> 00:54:30,090 Så igen, hvad er takeaway her? 1119 00:54:30,090 --> 00:54:33,050 Det viser sig, at i C, er der ikke kun lige strings-- og faktisk, 1120 00:54:33,050 --> 00:54:36,120 Der er ikke rigtig, fordi vi tilføje dem med CS50 biblioteket. 1121 00:54:36,120 --> 00:54:37,710 Men der er ikke kun ints. 1122 00:54:37,710 --> 00:54:38,990 >> Der er også flyder. 1123 00:54:38,990 --> 00:54:42,810 Og det viser sig en masse andre data typer også, at vi vil bruge inden længe. 1124 00:54:42,810 --> 00:54:46,270 Slår ud, hvis du ønsker en enkelt karakter, ikke en streng af tegn, 1125 00:54:46,270 --> 00:54:47,610 du kan bruge bare en char. 1126 00:54:47,610 --> 00:54:52,350 >> Viser sig, at hvis du ønsker en bool, en Boolesk værdi, sand eller falsk kun, 1127 00:54:52,350 --> 00:54:56,840 takket være CS50 bibliotek, vi har føjet til C bool datatypen samt. 1128 00:54:56,840 --> 00:54:59,180 Men det er også til stede i mange andre sprog. 1129 00:54:59,180 --> 00:55:04,130 Og det viser sig, at man nogle gange brug for større tal derefter kommer som standard 1130 00:55:04,130 --> 00:55:05,210 med ints og flåd. 1131 00:55:05,210 --> 00:55:10,590 >> Og i virkeligheden, en dobbelt er et tal der bruger ikke 32 bit, men 64 bit. 1132 00:55:10,590 --> 00:55:14,990 Og en lang lang er et nummer, bruger ikke 32, bits, men 64 bit, 1133 00:55:14,990 --> 00:55:19,190 henholdsvis for floating point værdier og heltal henholdsvis. 1134 00:55:19,190 --> 00:55:22,780 Så lad os faktisk nu se det i aktion. 1135 00:55:22,780 --> 00:55:26,150 >> Jeg har tænkt mig at gå videre her og pisk op en anden program. 1136 00:55:26,150 --> 00:55:32,020 Her jeg har tænkt mig at gå videre og omfatter CS50.h. 1137 00:55:32,020 --> 00:55:34,910 Og lad mig gå, omfatter standard IO.h. 1138 00:55:34,910 --> 00:55:37,320 >> Og du vil opdage noget funky der sker her. 1139 00:55:37,320 --> 00:55:40,592 Det er ikke farvekodning ting i på samme måde, som det gjorde før. 1140 00:55:40,592 --> 00:55:43,550 Og det viser sig, det er fordi jeg har ikke givet noget et filnavn. 1141 00:55:43,550 --> 00:55:47,270 >> Jeg har tænkt mig at kalde denne ene sizeof.c, og ramte Gem. 1142 00:55:47,270 --> 00:55:51,039 Og mærke til, hvad sker der med min meget hvid kode mod den sorte baggrund. 1143 00:55:51,039 --> 00:55:52,830 Nu, i hvert fald er der nogle lilla derinde. 1144 00:55:52,830 --> 00:55:54,490 Og det er syntaks fremhævet. 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 at give den et navn, og specifikt en fil forlængelse. 1147 00:56:01,060 --> 00:56:03,620 Lad os nu gå videre og gøre dette. 1148 00:56:03,620 --> 00:56:08,910 Jeg har tænkt mig at gå videre og meget blot udskrive following-- bool 1149 00:56:08,910 --> 00:56:11,080 er procent LU. 1150 00:56:11,080 --> 00:56:12,950 >> Vi kommer tilbage til at på bare et øjeblik. 1151 00:56:12,950 --> 00:56:15,840 Og så jeg har tænkt mig at print størrelse bool. 1152 00:56:15,840 --> 00:56:18,170 Og nu, bare for at spare mig selv lidt tid, jeg er 1153 00:56:18,170 --> 00:56:20,280 kommer til at gøre en hel bundt af disse på en gang. 1154 00:56:20,280 --> 00:56:24,620 Og specifikt jeg vil ændre dette til en char og fjeldørred. 1155 00:56:24,620 --> 00:56:27,760 Denne ene, jeg har tænkt mig at ændre til en dobbelt og en dobbelt. 1156 00:56:27,760 --> 00:56:31,440 >> Denne ene, jeg har tænkt mig at ændre til en flyder og en flyder. 1157 00:56:31,440 --> 00:56:35,670 Denne ene, jeg har tænkt mig at skifte til en int og en int. 1158 00:56:35,670 --> 00:56:38,660 Og denne ene, jeg har tænkt mig at skifte til en lang lang. 1159 00:56:38,660 --> 00:56:40,840 Og det er stadig tager lang tid, lang lang. 1160 00:56:40,840 --> 00:56:44,572 >> Og så endelig, jeg gav mig selv én for meget, streng. 1161 00:56:44,572 --> 00:56:47,030 Det viser sig, at i C, er der den særlige operatør kaldet 1162 00:56:47,030 --> 00:56:50,260 størrelsen af ​​det er bogstaveligt talt vil, når det køres, 1163 00:56:50,260 --> 00:56:52,099 fortælle os størrelsen af hver af disse variabler. 1164 00:56:52,099 --> 00:56:53,890 Og dette er en måde, nu, vi kan forbinde tilbage 1165 00:56:53,890 --> 00:56:57,140 til sidste uges diskussion af data og repræsentation. 1166 00:56:57,140 --> 00:57:00,330 >> Lad mig gå videre og kompilere størrelsen af ​​dot skråstreg størrelse. 1167 00:57:00,330 --> 00:57:01,210 Og lad os se. 1168 00:57:01,210 --> 00:57:05,210 Det viser sig, at i C, specifikt på CS50 IDE, 1169 00:57:05,210 --> 00:57:08,170 specifikt på operativsystem Ubuntu, 1170 00:57:08,170 --> 00:57:11,100 som er en 64-bit operativsystem Systemet i dette tilfælde, 1171 00:57:11,100 --> 00:57:14,189 en bool vil bruge en byte af plads. 1172 00:57:14,189 --> 00:57:16,480 Det er sådan størrelse måles, ikke i bits, men i byte. 1173 00:57:16,480 --> 00:57:18,690 Og minde om, at en byte er otte bits. 1174 00:57:18,690 --> 00:57:22,030 Så en bool, selvom du teknisk set kun brug for et 0 eller 1, 1175 00:57:22,030 --> 00:57:24,092 det er lidt ødsel hvordan vi har implementeret det. 1176 00:57:24,092 --> 00:57:26,800 Det er faktisk kommer til at bruge en hel byte-- så alle nuller, er måske 1177 00:57:26,800 --> 00:57:31,050 alle dem, eller noget lignende, eller bare en 1 blandt otte bits. 1178 00:57:31,050 --> 00:57:34,962 >> En char, i mellemtiden, bruges til et tegn som en ASCII-tegn per sidste uge, 1179 00:57:34,962 --> 00:57:36,170 kommer til at være et tegn. 1180 00:57:36,170 --> 00:57:42,340 Og det Herved overføres op med vores opfattelse af det er ikke mere end 256 bits-- snarere, 1181 00:57:42,340 --> 00:57:45,360 synchs op med at det er uden længere end 8 bit, som 1182 00:57:45,360 --> 00:57:47,450 giver os så mange som 256 værdier. 1183 00:57:47,450 --> 00:57:49,680 En dobbelt vil være 8 byte eller 64 bits. 1184 00:57:49,680 --> 00:57:50,510 >> En flyder er 4. 1185 00:57:50,510 --> 00:57:51,690 En int er fire. 1186 00:57:51,690 --> 00:57:52,980 En lang, lang er 8. 1187 00:57:52,980 --> 00:57:54,716 Og en streng er 8. 1188 00:57:54,716 --> 00:57:55,840 Men du behøver ikke bekymre dig om det. 1189 00:57:55,840 --> 00:57:57,340 Vi kommer til at skrælle det lag. 1190 00:57:57,340 --> 00:57:59,940 Det viser sig, strygere kan være længere end 8 bytes. 1191 00:57:59,940 --> 00:58:02,310 >> Og, ja, vi har skrevet strygere allerede, hej verden, 1192 00:58:02,310 --> 00:58:03,700 længere end 8 bytes. 1193 00:58:03,700 --> 00:58:06,270 Men vi vil vende tilbage til at på bare et øjeblik. 1194 00:58:06,270 --> 00:58:09,690 Men take væk her er følgende. 1195 00:58:09,690 --> 00:58:15,320 >> Enhver computer har kun en begrænset mængden af ​​hukommelse og plads. 1196 00:58:15,320 --> 00:58:17,860 Du kan kun gemme så mange filer på din Mac eller PC. 1197 00:58:17,860 --> 00:58:23,030 Du kan kun gemme så mange programmer i RAM kører på én gang, nødvendigvis, selv 1198 00:58:23,030 --> 00:58:26,360 med virtuel hukommelse, fordi du har en begrænset mængde RAM. 1199 00:58:26,360 --> 00:58:28,990 >> Og bare for at picture-- hvis du aldrig har åbnet en bærbar computer 1200 00:58:28,990 --> 00:58:31,300 eller bestilles ekstra hukommelse for en computer, du 1201 00:58:31,300 --> 00:58:33,670 måske ikke ved, at indersiden af ​​din computer 1202 00:58:33,670 --> 00:58:36,590 er noget, der ser lidt ligesom dette. 1203 00:58:36,590 --> 00:58:40,540 Så dette er blot en fælles selskab ved navn Afgørende der gør RAM til computere. 1204 00:58:40,540 --> 00:58:43,620 Og RAM er hvor programmer leve mens de kører. 1205 00:58:43,620 --> 00:58:46,630 >> Så på hver Mac eller pc, når du fordobler på et program, og det åbner op, 1206 00:58:46,630 --> 00:58:48,921 og det åbner nogle Word-dokument eller sådan noget, 1207 00:58:48,921 --> 00:58:51,764 det gemmer det midlertidigt i RAM, fordi RAM er hurtigere 1208 00:58:51,764 --> 00:58:53,680 end din harddisk, eller din solid state disk. 1209 00:58:53,680 --> 00:58:56,600 Så det er bare hvor programmer gå at leve, når de kører, 1210 00:58:56,600 --> 00:58:58,060 eller når der anvendes filer. 1211 00:58:58,060 --> 00:59:00,890 >> Så du har ting, der ser som denne inde i din bærbare computer, 1212 00:59:00,890 --> 00:59:03,320 eller lidt større ting indersiden af ​​dit skrivebord. 1213 00:59:03,320 --> 00:59:07,440 Men nøglen er du kun har en endeligt antal af disse ting. 1214 00:59:07,440 --> 00:59:11,230 Og der er kun en begrænset mængde hardware sidder på dette skrivebord til højre 1215 00:59:11,230 --> 00:59:11,730 her. 1216 00:59:11,730 --> 00:59:15,920 >> Så, helt sikkert, vi kan ikke gemme uendeligt lange numre. 1217 00:59:15,920 --> 00:59:19,030 Og endnu, hvis du tænker tilbage til folkeskolen, hvor mange cifre kan 1218 00:59:19,030 --> 00:59:21,400 du har til højre af et komma? 1219 00:59:21,400 --> 00:59:24,680 For den sags skyld, hvor mange cifre kan du har til venstre for et komma? 1220 00:59:24,680 --> 00:59:26,300 Virkelig, uendeligt mange. 1221 00:59:26,300 --> 00:59:30,840 >> Nu, kun kunne vi mennesker hvordan man udtaler million, 1222 00:59:30,840 --> 00:59:34,990 og milliarder, trillioner, og quadrillion, og quintillion. 1223 00:59:34,990 --> 00:59:39,370 Og jeg skubber grænserne for min understanding-- eller my-- jeg forstår 1224 00:59:39,370 --> 00:59:41,110 tal, men min udtale af tal. 1225 00:59:41,110 --> 00:59:44,720 Men de kan få uendelig stor med uendeligt mange cifre til venstre 1226 00:59:44,720 --> 00:59:47,050 eller til højre for et komma. 1227 00:59:47,050 --> 00:59:50,040 >> Men computere har kun en begrænset mængde hukommelse, 1228 00:59:50,040 --> 00:59:53,510 et endeligt antal transistorer, en endeligt antal pærer indeni. 1229 00:59:53,510 --> 00:59:57,350 Så hvad sker der, når du løber tør for plads? 1230 00:59:57,350 --> 00:59:59,620 Med andre ord, hvis du tænke tilbage på sidste uge 1231 00:59:59,620 --> 01:00:03,160 når vi talte om tal selv er repræsenteret i binær, 1232 01:00:03,160 --> 01:00:05,480 antage, at vi har fået denne 8-bit værdi her. 1233 01:00:05,480 --> 01:00:08,290 >> Og vi har syv 1'ere og en 0. 1234 01:00:08,290 --> 01:00:10,827 Og formoder, at vi ønsker at tilføje 1 til denne værdi. 1235 01:00:10,827 --> 01:00:12,410 Dette er en virkelig stor antal lige nu. 1236 01:00:12,410 --> 01:00:16,610 >> Dette er 254, hvis jeg husker matematik fra sidste uge højre. 1237 01:00:16,610 --> 01:00:19,480 Men hvad hvis jeg ændre at yderst til højre 0 til en 1? 1238 01:00:19,480 --> 01:00:22,800 Det hele tal, af Selvfølgelig bliver otte 1'er. 1239 01:00:22,800 --> 01:00:24,050 Så vi er stadig gode. 1240 01:00:24,050 --> 01:00:27,204 >> Og der sandsynligvis repræsenterer 255, dog afhængig af kontekst 1241 01:00:27,204 --> 01:00:29,120 det kunne faktisk repræsenterer et negativt tal. 1242 01:00:29,120 --> 01:00:31,240 Men mere om det en anden gang. 1243 01:00:31,240 --> 01:00:34,220 Det føles som om det handler om så højt som jeg kan tælle. 1244 01:00:34,220 --> 01:00:35,290 >> Nu er det kun 8 bit. 1245 01:00:35,290 --> 01:00:38,170 Og min Mac, helt sikkert, har måde mere end 8 bit hukommelse. 1246 01:00:38,170 --> 01:00:39,170 Men det har begrænset. 1247 01:00:39,170 --> 01:00:43,230 Så den samme argument gælder, selv om vi have flere af disse dem på skærmen. 1248 01:00:43,230 --> 01:00:47,020 >> Men hvad sker der, hvis du er lagring dette nummer, 255, 1249 01:00:47,020 --> 01:00:49,290 og du vil tælle en smule højere,? 1250 01:00:49,290 --> 01:00:51,600 Du ønsker at gå fra 255 til 256. 1251 01:00:51,600 --> 01:00:55,800 Problemet er naturligvis, at hvis man begynde at tælle ved nul ligesom sidste uge, 1252 01:00:55,800 --> 01:00:59,670 du kan ikke tælle så højt som 256, endsige 257, 1253 01:00:59,670 --> 01:01:02,584 endsige 258, m fordi hvad sker, når du tilføjer en 1? 1254 01:01:02,584 --> 01:01:05,000 Hvis du gør det gamle klasse skole tilgang, du sætter en en her, 1255 01:01:05,000 --> 01:01:08,150 og derefter 1 plus 1 er 2, men det er virkelig et nul, du bærer en, 1256 01:01:08,150 --> 01:01:09,695 bære 1, bære 1. 1257 01:01:09,695 --> 01:01:12,620 Alle disse ting, disse 1'ere, gå til nul. 1258 01:01:12,620 --> 01:01:17,820 Og du afvikle, ja, som en person påpeget, en 1 på venstre side. 1259 01:01:17,820 --> 01:01:22,540 Men alt, hvad du kan faktisk se og passer i hukommelsen 1260 01:01:22,540 --> 01:01:27,960 er bare otte 0'er, hvilket vil sige på et tidspunkt, hvis du, en computer, 1261 01:01:27,960 --> 01:01:32,490 forsøgt at tælle højt nok oppe, du er kommer til at ombryde omkring, synes det, 1262 01:01:32,490 --> 01:01:35,850 til nul, eller måske endda negativ tal, der er endnu lavere end nul. 1263 01:01:35,850 --> 01:01:37,260 >> Og vi kan slags se dette. 1264 01:01:37,260 --> 01:01:39,900 Lad mig gå videre og skrive en rigtig hurtig program her. 1265 01:01:39,900 --> 01:01:43,690 Lad mig gå videre og skrive et program kaldet Overflow. 1266 01:01:43,690 --> 01:01:49,980 Indbefatter CS50.h, indbefatter standard IO.h-- åh, 1267 01:01:49,980 --> 01:01:51,730 Jeg virkelig savnet min syntaksfremhævning. 1268 01:01:51,730 --> 01:01:54,440 Så lad os gemme denne som overflow.c. 1269 01:01:54,440 --> 01:01:57,084 >> Og nu int main void-- og inden længe, ​​vil vi 1270 01:01:57,084 --> 01:01:59,500 komme tilbage til at forklare, hvorfor vi holder skrive int main tomrum. 1271 01:01:59,500 --> 01:02:02,080 Men for nu, lad os bare gøre det, tager det for givet. 1272 01:02:02,080 --> 01:02:06,200 Lad os give mig selv en int, og initialisere den til 0. 1273 01:02:06,200 --> 01:02:11,716 >> Lad os så gøre for int jeg får zero-- faktisk, lad os gøre en uendelig løkke 1274 01:02:11,716 --> 01:02:12,590 og se hvad der sker. 1275 01:02:12,590 --> 01:02:22,440 Mens sandt, så lad os udskrive n er procent i, omvendt skråstreg n, plug-in n. 1276 01:02:22,440 --> 01:02:27,200 Men nu, lad os gøre n får n plus 1. 1277 01:02:27,200 --> 01:02:29,660 >> Så med andre ord, på hver iteration af dette uendelig løkke, 1278 01:02:29,660 --> 01:02:32,550 lad os tage n værdi, og der tilsættes 1 til det, og derefter 1279 01:02:32,550 --> 01:02:34,350 gemme resultatet igen n til venstre. 1280 01:02:34,350 --> 01:02:37,150 Og i virkeligheden, har vi set syntaks lidt ligesom dette, kortvarigt. 1281 01:02:37,150 --> 01:02:39,730 En kølig trick er i stedet skrive alt dette, 1282 01:02:39,730 --> 01:02:42,770 du kan faktisk sige en n plus er lig med 1. 1283 01:02:42,770 --> 01:02:47,480 >> Eller hvis du virkelig ønsker at være fancy, du kan sige n plus plus semikolon. 1284 01:02:47,480 --> 01:02:50,130 Men disse to sidstnævnte er blot hvad vi ville kalde syntaktisk sukker 1285 01:02:50,130 --> 01:02:50,790 for den første ting. 1286 01:02:50,790 --> 01:02:53,456 >> Den første ting er mere eksplicit, helt fint, helt korrekt. 1287 01:02:53,456 --> 01:02:55,470 Men det er mere almindeligt, vil jeg sige. 1288 01:02:55,470 --> 01:02:57,210 Så vi vil gøre dette for bare et øjeblik. 1289 01:02:57,210 --> 01:03:01,685 >> Lad os nu gøre overløb, som lyder temmelig ildevarslende, dot skråstreg overløb. 1290 01:03:01,685 --> 01:03:04,380 1291 01:03:04,380 --> 01:03:09,852 Lad os se, n er ved at blive temmelig store. 1292 01:03:09,852 --> 01:03:11,310 Men lad os tænke, hvor stort 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å for et øjeblik siden med størrelsen af eksempel at en int er fire bytes. 1295 01:03:16,400 --> 01:03:22,070 Vi ved fra sidste uge, fire bytes er 32 bit, fordi 8 gange 4, der er 32. 1296 01:03:22,070 --> 01:03:23,460 Det kommer til at være 4 mia. 1297 01:03:23,460 --> 01:03:25,802 >> Og vi er op til 800.000. 1298 01:03:25,802 --> 01:03:28,510 Dette kommer til at tage for evigt at tæller så højt som jeg overhovedet kan. 1299 01:03:28,510 --> 01:03:30,635 Så jeg har tænkt mig at gå videre, som du måske inden længe, 1300 01:03:30,635 --> 01:03:34,910 og ramte Kontrol C-- ærligt, kontrol C, en masse, hvor Kontrol C generelt 1301 01:03:34,910 --> 01:03:36,034 midler annullere. 1302 01:03:36,034 --> 01:03:38,200 Desværre, fordi dette kører i skyen, 1303 01:03:38,200 --> 01:03:41,190 undertiden skyen er spytte ud, så mange ting, 1304 01:03:41,190 --> 01:03:44,180 så meget output, vil det tage lidt tid for mit input 1305 01:03:44,180 --> 01:03:45,630 at komme til skyen. 1306 01:03:45,630 --> 01:03:49,240 Så selv om jeg ramte Kontrol C få sekunder siden, 1307 01:03:49,240 --> 01:03:53,110 dette er absolut den side virkning af en uendelig løkke. 1308 01:03:53,110 --> 01:03:56,070 >> Og så i sådanne tilfælde, er vi vil forlade det være. 1309 01:03:56,070 --> 01:03:59,050 Og vi kommer til at tilføje en anden terminalvindue herovre 1310 01:03:59,050 --> 01:04:03,186 med plus, hvilket naturligvis ikke gør sådan, da det er stadig tænker. 1311 01:04:03,186 --> 01:04:05,310 Og lad os gå videre og være lidt mere rimelig. 1312 01:04:05,310 --> 01:04:07,768 >> Jeg har tænkt mig at gå videre og gøre dette kun endeligt mange gange. 1313 01:04:07,768 --> 01:04:10,047 Lad os bruge en for-løkke, som jeg hentydet til tidligere. 1314 01:04:10,047 --> 01:04:10,630 Lad os gøre det. 1315 01:04:10,630 --> 01:04:13,430 Giv mig en anden variabel int i får 0. 1316 01:04:13,430 --> 01:04:17,430 Jeg er mindre end, lad os sige, 64 i ++. 1317 01:04:17,430 --> 01:04:24,010 Og lad mig gå videre og print ud n er procent i, komma n. 1318 01:04:24,010 --> 01:04:27,547 Og så n- dette er stadig vil tage for evigt. 1319 01:04:27,547 --> 01:04:28,130 Lad os gøre det. 1320 01:04:28,130 --> 01:04:30,620 >> n bliver n gange 2. 1321 01:04:30,620 --> 01:04:34,140 Eller vi kunne være fancy og gøre gange lig med 2. 1322 01:04:34,140 --> 01:04:37,120 Men lad os bare sige n lig selv, gange 2. 1323 01:04:37,120 --> 01:04:39,321 Med andre ord, i denne ny version af programmet, 1324 01:04:39,321 --> 01:04:41,820 Jeg ønsker ikke at vente for evigt fra ligesom 800.000 til 4 mia. 1325 01:04:41,820 --> 01:04:43,070 Lad os bare få det overstået med. 1326 01:04:43,070 --> 01:04:44,920 >> Lad os faktisk fordoble n hver gang. 1327 01:04:44,920 --> 01:04:47,660 Hvilket, tilbagekaldelse, fordobling er det modsatte af at have, selvfølgelig. 1328 01:04:47,660 --> 01:04:50,035 Og mens sidste uge har vi noget igen og igen, 1329 01:04:50,035 --> 01:04:52,200 og igen, super hurtig, fordobling vil sikkert 1330 01:04:52,200 --> 01:04:58,080 få os fra 1 til størst mulig værdi, som vi kan tælle til med en int. 1331 01:04:58,080 --> 01:04:59,750 >> Så lad os gøre netop dette. 1332 01:04:59,750 --> 01:05:01,720 Og vi vil vende tilbage til dette inden længe. 1333 01:05:01,720 --> 01:05:04,180 Men dette, igen, er ligesom gentagelsen blok i Scratch. 1334 01:05:04,180 --> 01:05:05,600 Og du vil bruge dette inden længe. 1335 01:05:05,600 --> 01:05:10,170 >> Det betyder blot tæller fra nul op til, men ikke lige, til 64. 1336 01:05:10,170 --> 01:05:14,285 Og på hver iteration af dette loop, bare holde forøgelse i. 1337 01:05:14,285 --> 01:05:18,990 Så jeg ++ - og denne generelle konstruktion på linje 7 er bare en super almindelig måde 1338 01:05:18,990 --> 01:05:22,290 af at gentage nogle linjer af kode, nogle antal gange. 1339 01:05:22,290 --> 01:05:23,362 Hvilke kodelinjer? 1340 01:05:23,362 --> 01:05:25,570 Disse krøllede parenteser, som du kan have udledes nu, 1341 01:05:25,570 --> 01:05:26,780 betyder, skal du gøre følgende. 1342 01:05:26,780 --> 01:05:29,510 >> Det er i ligesom Scratch, når det har de gule blokke 1343 01:05:29,510 --> 01:05:32,680 og andre farver slags omfavne eller kramme andre blokke. 1344 01:05:32,680 --> 01:05:34,750 Det er, hvad disse krøllet seler gør her. 1345 01:05:34,750 --> 01:05:40,200 Så hvis jeg fik min syntaks right-- du kan se gulerod symbol i C-midler 1346 01:05:40,200 --> 01:05:42,706 det er, hvor mange gange jeg var forsøger at løse dette problem. 1347 01:05:42,706 --> 01:05:45,330 Så lad os slippe af med, at man helt, og luk vinduet. 1348 01:05:45,330 --> 01:05:46,520 Og vi vil bruge den nye. 1349 01:05:46,520 --> 01:05:51,980 Lav overløb, dot skråstreg overløb, Enter, okay, 1350 01:05:51,980 --> 01:05:53,090 det ser slemt i første omgang. 1351 01:05:53,090 --> 01:05:56,200 Men lad os rulle tilbage i tiden, fordi jeg gjorde dette 64 gange. 1352 01:05:56,200 --> 01:05:58,700 >> Og bemærke den første gang, n er 1. 1353 01:05:58,700 --> 01:06:03,110 Anden gang, n er 2, derefter 4, så 8, derefter 16. 1354 01:06:03,110 --> 01:06:09,450 Og det lader til, at så snart Jeg kommer til omtrent 1 milliard, 1355 01:06:09,450 --> 01:06:12,800 hvis jeg fordoble det igen, at bør give mig 2 mia. 1356 01:06:12,800 --> 01:06:14,980 Men det viser sig, er det lige på nippet. 1357 01:06:14,980 --> 01:06:18,930 >> Og så er det faktisk flyder en int fra 1 mia 1358 01:06:18,930 --> 01:06:23,514 til ca. negativ 2 mia, fordi et helt tal, 1359 01:06:23,514 --> 01:06:25,430 i modsætning til numre vi var under forudsætning af sidste uge, 1360 01:06:25,430 --> 01:06:28,397 kan være både positive og negative i virkeligheden og i en computer. 1361 01:06:28,397 --> 01:06:30,730 Og så i det mindste en af ​​dem bits effektivt stjålet. 1362 01:06:30,730 --> 01:06:34,190 Så vi virkelig kun har 31 bit, eller 2 milliarder mulige værdier. 1363 01:06:34,190 --> 01:06:38,220 >> Men for nu, takeaway er helt simpelthen, uanset disse tal er 1364 01:06:38,220 --> 01:06:42,280 og uanset matematik er, der sker noget slemt i sidste ende, 1365 01:06:42,280 --> 01:06:46,980 fordi i sidste ende, du forsøger at permutere bittene en alt for mange gange. 1366 01:06:46,980 --> 01:06:51,060 Og du effektivt gå fra alle 1 's til måske alle 0 s, eller måske 1367 01:06:51,060 --> 01:06:54,260 blot nogle andet mønster, at det klart, afhængigt af kontekst, 1368 01:06:54,260 --> 01:06:56,342 kan tolkes som et negativt tal. 1369 01:06:56,342 --> 01:06:59,300 Og så det ser ud den højeste I kan tælle i dette særlige program 1370 01:06:59,300 --> 01:07:01,210 er kun ca. 1 mia. 1371 01:07:01,210 --> 01:07:02,760 Men der er en delvis løsning her. 1372 01:07:02,760 --> 01:07:03,480 Du ved hvad? 1373 01:07:03,480 --> 01:07:07,600 >> Lad mig ændre sig fra en int til en lang lang. 1374 01:07:07,600 --> 01:07:10,633 Og lad mig gå videre her og say-- Jeg har tænkt mig at have 1375 01:07:10,633 --> 01:07:12,290 at ændre dette til et usigneret længe. 1376 01:07:12,290 --> 01:07:16,860 Eller, lad os se, jeg aldrig kan huske mig selv. 1377 01:07:16,860 --> 01:07:19,920 >> Lad os gå videre og gøre overløb. 1378 01:07:19,920 --> 01:07:21,860 Nej, det er ikke det, dr.jur, tak. 1379 01:07:21,860 --> 01:07:23,430 Så nogle gange Dunk kan være nyttig. 1380 01:07:23,430 --> 01:07:27,550 Jeg havde ikke huske, hvad det format anvisning var for en lang lang. 1381 01:07:27,550 --> 01:07:28,950 >> Men, ja, Dunk fortalt mig. 1382 01:07:28,950 --> 01:07:31,570 Green er en slags god, betyder stadig du har lavet en fejl. 1383 01:07:31,570 --> 01:07:33,190 Det gætte, at jeg mente LLD. 1384 01:07:33,190 --> 01:07:38,750 >> Så lad mig tage det råd, en lang lang decimaltal, gem det. 1385 01:07:38,750 --> 01:07:43,190 Og lad mig køres igen det, dot slash overløb, Enter. 1386 01:07:43,190 --> 01:07:45,020 Og nu, hvad der er cool er det. 1387 01:07:45,020 --> 01:07:49,140 >> Hvis jeg går tilbage i tiden, vi stadig starte tælle 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 Bemærk, får vi alle de op til 1 mia. 1390 01:07:54,860 --> 01:07:57,070 Men så er vi sikkert komme til 2 mia. 1391 01:07:57,070 --> 01:08:01,300 >> Derefter får vi til 4 milliarder, derefter 8 milliarder, 17 milliarder. 1392 01:08:01,300 --> 01:08:03,340 Og vi går højere og højere og højere. 1393 01:08:03,340 --> 01:08:05,740 Til sidst, også dette pauser. 1394 01:08:05,740 --> 01:08:09,350 >> Til sidst, med en lang lang, som er den 64-bit værdi, ikke 1395 01:08:09,350 --> 01:08:13,660 en 32-bit værdi, hvis man tæller for højt, du wrap omkring 0. 1396 01:08:13,660 --> 01:08:16,410 Og i dette tilfælde, sker vi at ender med et negativt tal. 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 sig, at denne Problemet er ikke så mystiske. 1399 01:08:20,439 --> 01:08:23,060 Selvom jeg har med vilje inducerede det med disse fejl, 1400 01:08:23,060 --> 01:08:26,149 det viser sig, vi ser den slags alle omkring os, eller i det mindste nogle af os gør. 1401 01:08:26,149 --> 01:08:28,939 >> Så i Lego Star Wars, hvis du nogensinde har spillet spillet, 1402 01:08:28,939 --> 01:08:33,830 det viser sig, du kan gå rundt bryde tingene op i LEGO verden, 1403 01:08:33,830 --> 01:08:36,640 og indsamle mønter, væsentlige. 1404 01:08:36,640 --> 01:08:39,200 Og hvis du nogensinde har spillet dette spil alt for meget tid, 1405 01:08:39,200 --> 01:08:42,630 da denne unavngivne individ her gjorde, det samlede antal 1406 01:08:42,630 --> 01:08:46,700 af mønter, som du kan indsamle er, synes det, 4 milliarder. 1407 01:08:46,700 --> 01:08:48,240 >> Nu med det faktisk afrundet. 1408 01:08:48,240 --> 01:08:50,239 Så LEGO forsøgte at holde tingene brugervenlig. 1409 01:08:50,239 --> 01:08:53,779 De gjorde det ikke ligefrem 2 til 32 strøm, per sidste uge. 1410 01:08:53,779 --> 01:08:55,310 Men 4 milliarder er en grund. 1411 01:08:55,310 --> 01:08:58,979 Det synes, baseret på disse oplysninger, at LEGO, og det selskab, der 1412 01:08:58,979 --> 01:09:02,624 gjort denne faktiske software, besluttede at det maksimale antal mønter 1413 01:09:02,624 --> 01:09:04,540 brugeren kan akkumulere er faktisk 4 milliarder, 1414 01:09:04,540 --> 01:09:12,069 fordi de valgte i deres kode at anvende ikke en lang lang, tilsyneladende, 1415 01:09:12,069 --> 01:09:16,140 men bare et heltal, en usigneret heltal, kun et positivt heltal, hvis 1416 01:09:16,140 --> 01:09:18,089 max værdi er nogenlunde det. 1417 01:09:18,089 --> 01:09:19,380 Nå, her er en anden sjov en. 1418 01:09:19,380 --> 01:09:23,500 Så i spillet Civilization, der nogle af jer måske være bekendt med 1419 01:09:23,500 --> 01:09:26,660 det viser sig, at år siden var en fejl i dette spil, hvor 1420 01:09:26,660 --> 01:09:28,750 hvis du spillede rollen af Gandhi i spillet, 1421 01:09:28,750 --> 01:09:34,020 i stedet for ham er meget pacifistisk, i stedet var utrolig, utrolig 1422 01:09:34,020 --> 01:09:36,399 aggressiv, under visse omstændigheder. 1423 01:09:36,399 --> 01:09:40,529 Især den måde, at Civilization værker er, at hvis du som spiller, 1424 01:09:40,529 --> 01:09:44,680 vedtage demokrati, din aggressivitet score får 1425 01:09:44,680 --> 01:09:48,130 reduceres med to, så minus minus, og derefter minus minus. 1426 01:09:48,130 --> 01:09:50,569 >> Så du trækker 2 fra din faktiske iteration. 1427 01:09:50,569 --> 01:09:56,650 Desværre, hvis din iteration er oprindeligt en, og du trække 2 fra det 1428 01:09:56,650 --> 01:09:59,050 efter vedtagelsen af ​​demokratiet som Gandhi her måske 1429 01:09:59,050 --> 01:10:02,200 har gjort, fordi han var meget passive-- 1 på omfanget af aggressivitet. 1430 01:10:02,200 --> 01:10:04,830 Men hvis han vedtager demokrati, så han går fra 1 til negativ 1. 1431 01:10:04,830 --> 01:10:11,470 >> Desværre var de under anvendelse unsigned numre, 1432 01:10:11,470 --> 01:10:15,400 hvilket betyder, at de behandlede endog negativ numre, som om de var positive. 1433 01:10:15,400 --> 01:10:19,780 Og det viser sig, at positiv ækvivalent negativ 1, 1434 01:10:19,780 --> 01:10:23,480 i typiske computerprogrammer, er 255. 1435 01:10:23,480 --> 01:10:27,250 Så hvis Gandhi vedtager demokrati har, og derfor 1436 01:10:27,250 --> 01:10:32,470 hans aggressivitet score faldt, det faktisk ruller rundt til 255 1437 01:10:32,470 --> 01:10:35,470 og gør ham til den mest aggressive karakter i spillet. 1438 01:10:35,470 --> 01:10:36,930 Så du kan google op på dette. 1439 01:10:36,930 --> 01:10:39,380 Og det var faktisk en utilsigtet programmering bug, 1440 01:10:39,380 --> 01:10:43,010 men der er indtastet helt den lore lige siden. 1441 01:10:43,010 --> 01:10:44,360 >> Det er alt sjov og nuttet. 1442 01:10:44,360 --> 01:10:47,760 Mere skræmmende er, når faktiske virkelige verden enheder, og ikke spil, 1443 01:10:47,760 --> 01:10:48,820 har de samme fejl. 1444 01:10:48,820 --> 01:10:54,500 I virkeligheden, bare et år siden en artikel kom ud af om Boeing 787. 1445 01:10:54,500 --> 01:10:56,850 >> Og artiklen først blik læser lidt mystiske. 1446 01:10:56,850 --> 01:11:01,480 Men det sagde dette, et software sårbarhed i Boeings 1447 01:11:01,480 --> 01:11:04,790 nye 787 Dreamliner jet har potentiale til at forårsage piloter 1448 01:11:04,790 --> 01:11:07,220 at miste kontrollen over luftfartøjet, muligvis 1449 01:11:07,220 --> 01:11:11,750 i midten af ​​flyvningen, FAA embedsmænd advarede flyselskaber nylig. 1450 01:11:11,750 --> 01:11:14,520 Det var bestemmelsen at en model 787 1451 01:11:14,520 --> 01:11:19,770 fly, der har været tændt kontinuerligt i 248 dage 1452 01:11:19,770 --> 01:11:24,880 kan miste alle vekselstrøm, AC, elektrisk effekt grundet generatoren 1453 01:11:24,880 --> 01:11:28,892 styreenheder, GCUs, samtidig gå i fejlsikker tilstand. 1454 01:11:28,892 --> 01:11:29,850 Det er lidt at miste mig. 1455 01:11:29,850 --> 01:11:35,390 Men notatet anførte, OK, nu fik jeg det, tilstanden var forårsaget af en software 1456 01:11:35,390 --> 01:11:38,590 imødegå internt til generatoren kontrol 1457 01:11:38,590 --> 01:11:44,860 enheder, der vil overflow efter 248 dages kontinuerlig strøm. 1458 01:11:44,860 --> 01:11:47,070 Vi udsteder denne bemærke at forhindre tab 1459 01:11:47,070 --> 01:11:49,300 af alle AC elektrisk magt, hvilket kan resultere 1460 01:11:49,300 --> 01:11:50,980 i tab af kontrollen over flyvemaskinen. 1461 01:11:50,980 --> 01:11:55,380 >> Så bogstaveligt, er der nogle heltal, eller nogle tilsvarende datatype, 1462 01:11:55,380 --> 01:11:57,960 anvendes i software i en faktiske flyvemaskine 1463 01:11:57,960 --> 01:12:00,756 at hvis du holder din fly længe nok, som tilsyneladende 1464 01:12:00,756 --> 01:12:03,880 kan være tilfældet, hvis du bare kører dem konstant og aldrig frakoble 1465 01:12:03,880 --> 01:12:06,810 din flyvemaskine, synes det, eller lade sine batterier dør, 1466 01:12:06,810 --> 01:12:09,840 sidste ende vil tælle op, og op, og op og op og op og op. 1467 01:12:09,840 --> 01:12:12,150 >> Og i sagens natur en begrænset mængde hukommelse 1468 01:12:12,150 --> 01:12:15,880 vil overflow, rulle tilbage til nul eller nogle negativ værdi, 1469 01:12:15,880 --> 01:12:19,920 en bivirkning af, som er den skræmmende virkelige virkelighed 1470 01:12:19,920 --> 01:12:23,970 at flyet måske har brug for skal genstartes, effektivt, 1471 01:12:23,970 --> 01:12:27,290 eller kan falde, værre, mens den flyver. 1472 01:12:27,290 --> 01:12:29,230 Så den slags spørgsmål er stadig med os, 1473 01:12:29,230 --> 01:12:33,130 even-- dette var en 2015 artikel, desto mere skræmmende 1474 01:12:33,130 --> 01:12:36,100 når du ikke nødvendigvis forstå, værdsætte, eller forudse 1475 01:12:36,100 --> 01:12:38,640 den slags fejl. 1476 01:12:38,640 --> 01:12:42,030 >> Så det viser sig der er en anden dårligt om repræsentation af data. 1477 01:12:42,030 --> 01:12:47,080 Det viser sig, at selv flåd er form for fejlbehæftet, fordi flåd, også, 1478 01:12:47,080 --> 01:12:51,440 Jeg foreslog er 32 bit, eller måske 64 hvis du bruger en dobbelt. 1479 01:12:51,440 --> 01:12:53,070 Men det er stadig begrænset. 1480 01:12:53,070 --> 01:12:57,070 >> Og fangsten er, at hvis du kan sætte et uendeligt antal numre 1481 01:12:57,070 --> 01:12:59,460 efter kommaet, der er ingen måde, du 1482 01:12:59,460 --> 01:13:02,690 kan repræsentere alle mulige numre, som vi blev undervist 1483 01:13:02,690 --> 01:13:04,990 i folkeskolen kan eksistere i verden. 1484 01:13:04,990 --> 01:13:08,870 En computer, væsentlige, har til vælge en delmængde af disse numre 1485 01:13:08,870 --> 01:13:10,200 at repræsentere præcist. 1486 01:13:10,200 --> 01:13:12,450 >> Nu, kan computeren runde måske en lille smule, 1487 01:13:12,450 --> 01:13:17,900 og kan give dig mulighed for nogenlunde butik vilkårligt antal, du muligvis ønsker. 1488 01:13:17,900 --> 01:13:20,940 Men bare intuitivt, hvis du har en begrænset antal bit, 1489 01:13:20,940 --> 01:13:24,560 du kan kun permutere dem på så mange finite måder. 1490 01:13:24,560 --> 01:13:26,570 Så du kan ikke muligvis bruger et endeligt antal 1491 01:13:26,570 --> 01:13:29,880 af permutation af bits, mønstre af nuller og ettaller, 1492 01:13:29,880 --> 01:13:32,940 at repræsentere en uendelig antal numre, 1493 01:13:32,940 --> 01:13:37,370 hvilket antyder, at computere might meget vel være at lyve for os nogle gange. 1494 01:13:37,370 --> 01:13:38,770 >> Faktisk, lad os gøre det. 1495 01:13:38,770 --> 01:13:41,239 Lad mig gå tilbage til CS50 IDE. 1496 01:13:41,239 --> 01:13:43,030 Lad mig gå videre og skabe et lille program 1497 01:13:43,030 --> 01:13:47,940 kaldet Unøjagtighed, at vise, at computere er faktisk upræcis. 1498 01:13:47,940 --> 01:13:51,910 >> Og lad mig gå videre og begynde med noget af det kode fra før, 1499 01:13:51,910 --> 01:13:53,830 og nu bare gøre følgende. 1500 01:13:53,830 --> 01:14:03,640 Lad mig gå videre og gøre printf, procent f, omvendt skråstreg n, 1 divideret med 10. 1501 01:14:03,640 --> 01:14:07,430 Med andre ord, lad os dykke dybere til 1/10, ligesom 1 og divideret med 10. 1502 01:14:07,430 --> 01:14:09,760 Sikkert, kan en computer repræsentere 1/10. 1503 01:14:09,760 --> 01:14:13,620 >> Så lad os gå videre og gøre unøjagtighed. 1504 01:14:13,620 --> 01:14:14,390 Lad os se. 1505 01:14:14,390 --> 01:14:16,210 Format angiver skrive dobbelt. 1506 01:14:16,210 --> 01:14:18,160 Men det argument har typen int. 1507 01:14:18,160 --> 01:14:19,040 Hvad sker der? 1508 01:14:19,040 --> 01:14:21,970 >> Åh, interessant, så det er en lektion lærte fra før. 1509 01:14:21,970 --> 01:14:26,050 Jeg siger, hey, computer show mig en float med procent f. 1510 01:14:26,050 --> 01:14:28,200 Men jeg giver det 2 ints. 1511 01:14:28,200 --> 01:14:31,120 Så det viser sig, kan jeg lave dette i et par måder. 1512 01:14:31,120 --> 01:14:38,430 >> Jeg kunne bare vende en i 1,0, og 10 ind 10,0, hvilket ville faktisk 1513 01:14:38,430 --> 01:14:42,390 have den virkning at omdanne dem i floats-- stadig forhåbentlig 1514 01:14:42,390 --> 01:14:43,180 det samme antal. 1515 01:14:43,180 --> 01:14:45,880 Eller det viser sig der er noget vi vil se igen inden længe. 1516 01:14:45,880 --> 01:14:47,170 Du kunne kaste tallene. 1517 01:14:47,170 --> 01:14:49,880 >> Man kan, ved hjælp af denne parentetiske udtryk, kan du sige, 1518 01:14:49,880 --> 01:14:52,560 hey, computer, tage denne 10, som jeg ved er en int. 1519 01:14:52,560 --> 01:14:54,660 Men behandle det, please, som om det er en float. 1520 01:14:54,660 --> 01:14:56,680 Men det føles unødvendigt kompliceret. 1521 01:14:56,680 --> 01:14:59,040 >> Til vores formål i dag, lad os bare bogstaveligt 1522 01:14:59,040 --> 01:15:02,700 gøre dem floating point-værdier med et komma, som denne. 1523 01:15:02,700 --> 01:15:07,060 Lad mig gå videre og gentagelsen, gør unøjagtighed, god, dot skråstreg 1524 01:15:07,060 --> 01:15:08,870 unøjagtighed, indtaste. 1525 01:15:08,870 --> 01:15:10,990 OK, vi ser gode. 1526 01:15:10,990 --> 01:15:18,194 >> 1 divideret med 10, ifølge min Mac her, er, ja, 0,100 tusind. 1527 01:15:18,194 --> 01:15:21,360 Nu blev jeg undervist i folkeskolen der bør være et uendeligt antal 0'er. 1528 01:15:21,360 --> 01:15:23,151 Så lad os i det mindste prøve at se nogle af dem. 1529 01:15:23,151 --> 01:15:26,770 Det viser sig, at printf er lidt amatør stadig end vi har brugt. 1530 01:15:26,770 --> 01:15:30,890 Det viser sig, at du ikke behøver at angive bare procent f, eller bare procent i. 1531 01:15:30,890 --> 01:15:33,830 Du kan faktisk angive nogle kontrolmuligheder her. 1532 01:15:33,830 --> 01:15:36,470 >> Konkret Jeg har tænkt mig at sige, hey, printf, 1533 01:15:36,470 --> 01:15:39,660 faktisk vise mig 10 decimaler. 1534 01:15:39,660 --> 01:15:40,820 Så det ser lidt underligt. 1535 01:15:40,820 --> 01:15:42,845 Men du siger procent, dot, hvor mange numre 1536 01:15:42,845 --> 01:15:44,970 du ønsker at se efter komma, og derefter f 1537 01:15:44,970 --> 01:15:48,340 til flade, bare fordi det er hvad dokumentationen siger. 1538 01:15:48,340 --> 01:15:50,080 Lad mig gå videre og redde denne. 1539 01:15:50,080 --> 01:15:52,460 >> Og mærke også, jeg får træt af genindtastning ting. 1540 01:15:52,460 --> 01:15:55,900 Så jeg bare sætte op og pil ned på mine nøgler her. 1541 01:15:55,900 --> 01:15:58,710 Og hvis jeg bliver ved at ramme op, du kan se alle de kommandoer 1542 01:15:58,710 --> 01:16:01,090 at jeg gjorde, eller forkert lavet. 1543 01:16:01,090 --> 01:16:04,630 >> Og jeg har tænkt mig at gå videre nu, og faktisk ikke bruge det, tilsyneladende. 1544 01:16:04,630 --> 01:16:11,416 Lav unøjagtigheder, prik skråstreg imprecision-- så 1545 01:16:11,416 --> 01:16:13,290 hvad jeg blev undervist i lønklasse skole tjekker ud. 1546 01:16:13,290 --> 01:16:19,010 Selv hvis jeg udskriver det til 10 decimal placerer det, ja, er 0,10 tusind. 1547 01:16:19,010 --> 01:16:19,840 Men ved du hvad? 1548 01:16:19,840 --> 01:16:21,150 >> Lad os få lidt grådige. 1549 01:16:21,150 --> 01:16:23,990 Lad os sige, ligesom, vis mig 55 peger efter kommaet. 1550 01:16:23,990 --> 01:16:26,160 Lad os virkelig tage dette programmere for et spin. 1551 01:16:26,160 --> 01:16:31,170 Lad mig omskabe det med make unøjagtighed, dot skråstreg, unøjagtighed. 1552 01:16:31,170 --> 01:16:32,390 >> Og her går vi. 1553 01:16:32,390 --> 01:16:34,420 Din barndom var en løgn. 1554 01:16:34,420 --> 01:16:48,410 Tilsyneladende, 1 divideret med 10 er faktisk 0.100000000000000005551115123-- 1555 01:16:48,410 --> 01:16:49,740 >> Hvad sker der? 1556 01:16:49,740 --> 01:16:53,360 Tja, det viser sig, hvis du slags ser langt nok ud i den underliggende 1557 01:16:53,360 --> 01:16:55,950 repræsentation af dette nummer, det faktisk 1558 01:16:55,950 --> 01:17:00,400 er ikke nøjagtigt 1/10 eller 0,1 og et uendeligt antal nuller. 1559 01:17:00,400 --> 01:17:01,630 Nu, hvorfor er det? 1560 01:17:01,630 --> 01:17:06,250 >> Godt, selvom det er et simpelt nummer til os mennesker, 1 divideret med 10, 1561 01:17:06,250 --> 01:17:10,910 det er stadig en af ​​uendeligt mange numre, som vi kunne tænke op. 1562 01:17:10,910 --> 01:17:14,490 Men en computer kan kun repræsentere endeligt mange deromkring numre. 1563 01:17:14,490 --> 01:17:18,710 Og så effektivt, hvad computer viser os er dens nærmeste 1564 01:17:18,710 --> 01:17:22,940 tilnærmelse til antallet vi ønsker at tro er 1/10, 1565 01:17:22,940 --> 01:17:27,760 eller virkelig 0,10 tusind uendelige. 1566 01:17:27,760 --> 01:17:30,425 >> Snarere, er dette imidlertid så tæt som det kan få. 1567 01:17:30,425 --> 01:17:32,300 Og, ja, hvis man ser under emhætten, 1568 01:17:32,300 --> 01:17:37,050 som vi er her ved at se 55 cifre efter kommaet, 1569 01:17:37,050 --> 01:17:39,990 vi faktisk se, at virkeligheden. 1570 01:17:39,990 --> 01:17:42,610 Nu som en sidebemærkning, hvis du har nogensinde set movie-- 1571 01:17:42,610 --> 01:17:45,780 de fleste af jer sikkert haven't-- men Superman 3 for nogle år siden, 1572 01:17:45,780 --> 01:17:49,500 Richard Pryor væsentlige gearede dette virkelighed i hans selskab til at stjæle en masse 1573 01:17:49,500 --> 01:17:53,500 af fraktioner og fraktioner af øre, fordi company-- så vidt jeg husker, 1574 01:17:53,500 --> 01:17:57,210 det har været en while-- var hovedsagelig smide noget, der ikke passede 1575 01:17:57,210 --> 01:17:58,790 ind i begrebet cents. 1576 01:17:58,790 --> 01:18:01,480 >> Men hvis du tilføje op alle disse lille, lille, lille tal igen, 1577 01:18:01,480 --> 01:18:04,960 og igen, og igen, kan du, som i hans sag, gøre en god sum penge. 1578 01:18:04,960 --> 01:18:08,010 >> Samme idé blev flået af en nyere, men stadig nu ældre 1579 01:18:08,010 --> 01:18:10,500 film, kaldet Office Space, hvor fyrene i den film, 1580 01:18:10,500 --> 01:18:13,501 gjorde det samme, skrues det op fuldstændigt, endte med alt for meget 1581 01:18:13,501 --> 01:18:14,666 penge på deres bankkonto. 1582 01:18:14,666 --> 01:18:15,800 Det var alle meget mistænkelige. 1583 01:18:15,800 --> 01:18:19,290 Men i slutningen af ​​dagen, unøjagtighed er overalt omkring os. 1584 01:18:19,290 --> 01:18:22,240 >> Og det også kan være skræmmende tilfældet. 1585 01:18:22,240 --> 01:18:25,590 Det viser sig, at Superman 3 og Office Space til side, der 1586 01:18:25,590 --> 01:18:28,460 kan være nogle meget reelle verdens forgreninger 1587 01:18:28,460 --> 01:18:32,290 af realiteterne i upræcis repræsentation af data 1588 01:18:32,290 --> 01:18:34,770 at selv vi mennesker til denne dag ikke nødvendigvis 1589 01:18:34,770 --> 01:18:38,230 forstå såvel som vi bør, eller huske så ofte som vi burde. 1590 01:18:38,230 --> 01:18:42,950 Og, ja, den følgende klip er fra et kig på nogle meget virkelige verden 1591 01:18:42,950 --> 01:18:47,730 udløbere af, hvad der sker, hvis du ikke værdsætter unøjagtigheden som 1592 01:18:47,730 --> 01:18:50,065 kan ske i tal repræsentation. 1593 01:18:50,065 --> 01:18:51,300 >> [VIDEO PLAYBACK] 1594 01:18:51,300 --> 01:18:55,620 >> -Computere, Vi har alle kommet til at acceptere de ofte frustrerende problemer, 1595 01:18:55,620 --> 01:19:00,310 gå med them-- bugs, vira, og software fejl, 1596 01:19:00,310 --> 01:19:03,130 for små priser at betale for bekvemmelighed. 1597 01:19:03,130 --> 01:19:07,800 Men i højteknologiske og høj hastighed militære og plads programansøgninger, 1598 01:19:07,800 --> 01:19:12,800 den mindste problem kan blive forstørret i katastrofe. 1599 01:19:12,800 --> 01:19:18,900 >> Den June 4th, 1996 videnskabsfolk forberedt at lancere en ubemandet Ariane 5 raket. 1600 01:19:18,900 --> 01:19:21,220 Det var i færd videnskabelig satellitter designet 1601 01:19:21,220 --> 01:19:24,600 at etablere præcist, hvordan Jordens magnetfelt interagerer 1602 01:19:24,600 --> 01:19:27,410 med sol vind. 1603 01:19:27,410 --> 01:19:30,800 Raketten blev bygget til Den Europæiske Rumorganisation, 1604 01:19:30,800 --> 01:19:34,370 og løftes fra sit anlæg på kysten af ​​Fransk Guyana. 1605 01:19:34,370 --> 01:19:37,540 >> -At Omkring 37 sekunder inde flyvningen, de først 1606 01:19:37,540 --> 01:19:39,270 bemærket noget gik galt. 1607 01:19:39,270 --> 01:19:42,250 Dyserne blev drejning i en måde, de burde virkelig ikke. 1608 01:19:42,250 --> 01:19:46,580 Omkring 40 sekunder inde i flyvningen, klart, at køretøjet var i vanskeligheder. 1609 01:19:46,580 --> 01:19:48,850 >> Og det er, når de lavede en beslutning om at ødelægge det. 1610 01:19:48,850 --> 01:19:52,780 Sortimentet sikkerhed officer, med enorme indvolde, trykkede på knappen, 1611 01:19:52,780 --> 01:19:58,150 sprængte raket, før det kunne bliver en fare for den offentlige sikkerhed. 1612 01:19:58,150 --> 01:20:01,060 >> -Dette Var jomfru sejlads Ariane 5. 1613 01:20:01,060 --> 01:20:03,960 Og dens ødelæggelse tog sted på grund af en fejl 1614 01:20:03,960 --> 01:20:05,822 indlejret i rakettens software. 1615 01:20:05,822 --> 01:20:08,280 -Den Problem på Ariane var at der var et tal, der 1616 01:20:08,280 --> 01:20:10,600 kræves 64 bits til at udtrykke. 1617 01:20:10,600 --> 01:20:13,590 Og de ønskede at konvertere det til et 16-bit tal. 1618 01:20:13,590 --> 01:20:15,610 De antog, at nummer aldrig vil 1619 01:20:15,610 --> 01:20:20,980 til at være meget store, at de fleste af dem, cifre i et 64-bit tal var nuller. 1620 01:20:20,980 --> 01:20:22,440 De var forkert. 1621 01:20:22,440 --> 01:20:25,060 >> -Den Manglende evne én softwareprogram til at acceptere 1622 01:20:25,060 --> 01:20:29,510 den form for nummer genereret af en anden var ved roden af ​​fiasko. 1623 01:20:29,510 --> 01:20:34,350 Softwareudvikling var blevet en meget omkostningskrævende del af ny teknologi. 1624 01:20:34,350 --> 01:20:38,140 Ariane raket har været meget vellykket, så meget af den software, 1625 01:20:38,140 --> 01:20:41,550 oprettet til den var også anvendes i Ariane 5. 1626 01:20:41,550 --> 01:20:47,940 >> -Den Grundlæggende problem var, at Ariane 5 var hurtigere, accelereret hurtigere. 1627 01:20:47,940 --> 01:20:51,450 Og softwaren ikke havde redegøres for. 1628 01:20:51,450 --> 01:20:55,060 >> -Den Ødelæggelse af raketten var en enorm økonomisk katastrofe, 1629 01:20:55,060 --> 01:20:58,790 alle på grund af et minut softwarefejl. 1630 01:20:58,790 --> 01:21:01,210 Men dette var ikke den første problemer datakonvertering tid 1631 01:21:01,210 --> 01:21:04,820 havde plaget moderne raket teknologi. 1632 01:21:04,820 --> 01:21:08,050 >> -I 1991 med start af den første Golfkrig, 1633 01:21:08,050 --> 01:21:10,570 Patriot missil oplevet en lignende art 1634 01:21:10,570 --> 01:21:12,800 af antallet konvertering problem. 1635 01:21:12,800 --> 01:21:16,090 Og som et resultat, 28 personer, 28 amerikanske soldater, 1636 01:21:16,090 --> 01:21:19,080 blev dræbt, og omkring 100 andre såret, 1637 01:21:19,080 --> 01:21:22,780 når Patriot, som skulle at beskytte mod indkommende scuds, 1638 01:21:22,780 --> 01:21:25,830 undladt at affyre et missil. 1639 01:21:25,830 --> 01:21:31,670 >> -Når Irak invaderede Kuwait, og Amerika lanceret Desert Storm i begyndelsen af ​​1991, 1640 01:21:31,670 --> 01:21:35,780 Patriot Missile batterier blev indsat at beskytte Saudi-Arabien og Israel 1641 01:21:35,780 --> 01:21:39,230 fra irakiske Scud missilangreb. 1642 01:21:39,230 --> 01:21:43,810 The Patriot er et amerikansk medium-range overflade til luftsystem, fremstillet 1643 01:21:43,810 --> 01:21:45,770 af Raytheon selskab. 1644 01:21:45,770 --> 01:21:52,340 >> -Den Størrelse Patriot interceptor selv er omkring ca. 20 fod lang. 1645 01:21:52,340 --> 01:21:55,230 Og det vejer omkring 2.000 pounds. 1646 01:21:55,230 --> 01:21:59,320 Og det bærer et sprænghoved på omkring, Jeg synes det er omtrent 150 pounds. 1647 01:21:59,320 --> 01:22:03,930 Og sprćnghovedet selv er en højeksplosive, som 1648 01:22:03,930 --> 01:22:07,330 har fragmenter omkring det. 1649 01:22:07,330 --> 01:22:11,680 Foringen af ​​sprænghovedet er beregnet til at fungere som hagl. 1650 01:22:11,680 --> 01:22:14,110 >> -De Missiler udføres fire pr container, 1651 01:22:14,110 --> 01:22:17,130 og transporteres af en sættevogn. 1652 01:22:17,130 --> 01:22:24,930 >> -Den Patriot anti-missil-system går tilbage mindst 20 år nu. 1653 01:22:24,930 --> 01:22:28,420 Det blev oprindeligt designet som en luft forsvar missil 1654 01:22:28,420 --> 01:22:30,720 at nedskyde fjendtlige fly. 1655 01:22:30,720 --> 01:22:34,500 I den første Golfkrig, når at krig kom, 1656 01:22:34,500 --> 01:22:39,745 hæren ønskede at bruge det til nedskyde scuds, ikke flyvemaskiner. 1657 01:22:39,745 --> 01:22:43,620 >> Den irakiske luftvåben var ikke så meget et problem. 1658 01:22:43,620 --> 01:22:46,670 Men hæren var bekymret om scuds. 1659 01:22:46,670 --> 01:22:50,170 Og så de forsøgte at opgradere Patriot. 1660 01:22:50,170 --> 01:22:52,800 >> -Intercepting En fjende missil rejser på mach 5 1661 01:22:52,800 --> 01:22:55,830 skulle være udfordrende nok. 1662 01:22:55,830 --> 01:22:58,490 Men da Patriot blev hastet i brug, 1663 01:22:58,490 --> 01:23:02,860 hæren var ikke klar over en Irakiske modifikation, der gjorde 1664 01:23:02,860 --> 01:23:05,930 deres scuds næsten umuligt at ramme. 1665 01:23:05,930 --> 01:23:10,740 >> -Hvad Skete er scuds der kom i var ustabil. 1666 01:23:10,740 --> 01:23:11,692 De blev slingrende. 1667 01:23:11,692 --> 01:23:14,910 Grunden til dette var irakerne, for 1668 01:23:14,910 --> 01:23:18,280 at få 600 km ud af en 300 kilometer 1669 01:23:18,280 --> 01:23:21,700 rækkevidde missil, tog vægt ud af den forreste sprænghoved. 1670 01:23:21,700 --> 01:23:23,390 De gjorde sprćnghovedet lysere. 1671 01:23:23,390 --> 01:23:27,330 >> Så nu patriot er forsøger at komme på Scud. 1672 01:23:27,330 --> 01:23:30,230 Og det meste af tiden, det overvældende flertal af tiden, 1673 01:23:30,230 --> 01:23:32,940 Det ville bare flyve af Scud. 1674 01:23:32,940 --> 01:23:37,260 Når Patriot systemoperatører indså Patriot savnede sit mål, 1675 01:23:37,260 --> 01:23:41,690 de detonerede Patriots sprænghoved at undgå mulige tab, hvis det 1676 01:23:41,690 --> 01:23:44,570 fik lov til at falde til jorden. 1677 01:23:44,570 --> 01:23:48,790 >> -Det Var hvad de fleste mennesker så, disse store ildkugler på himlen, 1678 01:23:48,790 --> 01:23:54,550 og misforstået som aflytninger af Scud sprænghoveder. 1679 01:23:54,550 --> 01:23:56,630 >> -Selv Om natten himmel, Patriots dukkede 1680 01:23:56,630 --> 01:24:00,370 at være vellykket ødelægge Scuds på Dhahran, 1681 01:24:00,370 --> 01:24:03,360 der kunne være nogen fejl om dens ydeevne. 1682 01:24:03,360 --> 01:24:07,970 Der, Patriot radar-system mistet overblikket over et indgående Scud, 1683 01:24:07,970 --> 01:24:10,721 og aldrig lanceret grund til en software fejl. 1684 01:24:10,721 --> 01:24:14,090 1685 01:24:14,090 --> 01:24:18,940 Det var israelerne, der først opdagede at jo længere systemet var på, 1686 01:24:18,940 --> 01:24:22,690 jo større tidsforskel blev, på grund af et ur indlejret 1687 01:24:22,690 --> 01:24:24,810 i systemets computer. 1688 01:24:24,810 --> 01:24:28,210 >> -Om To uger før tragedien i Dhahran, 1689 01:24:28,210 --> 01:24:30,770 israelerne indberettes til forsvarsministeriet 1690 01:24:30,770 --> 01:24:32,590 at systemet var ved at miste tid. 1691 01:24:32,590 --> 01:24:35,360 Efter omkring otte timer eller kører, bemærkede de, at systemet 1692 01:24:35,360 --> 01:24:37,720 var ved at blive mærkbart mindre nøjagtige. 1693 01:24:37,720 --> 01:24:41,900 Den forsvarsministerium reagerede ved fortæller alle de Patriot-batterier 1694 01:24:41,900 --> 01:24:44,950 ikke forlade systemerne i lang tid. 1695 01:24:44,950 --> 01:24:49,160 De har aldrig sagt, hvad en lang tid was-- otte timer, 10 timer, 1.000 timer. 1696 01:24:49,160 --> 01:24:51,360 Ingen vidste. 1697 01:24:51,360 --> 01:24:53,380 >> -Den Patriot batteri stationeret på kasernen 1698 01:24:53,380 --> 01:24:58,350 på Dhahran og dets mangelfulde interne ur havde været på over 100 timer 1699 01:24:58,350 --> 01:25:01,670 om natten den 25. februar. 1700 01:25:01,670 --> 01:25:05,917 >> -Det Spores tid til en nøjagtighed på omkring en tiendedel sekund. 1701 01:25:05,917 --> 01:25:08,000 Nu, en tiendedel af et sekund er en interessant nummer, 1702 01:25:08,000 --> 01:25:11,920 fordi det ikke kan udtrykkes i binær nøjagtigt, som 1703 01:25:11,920 --> 01:25:16,820 betyder det ikke kan udtrykkes præcist i enhver moderne digital computer. 1704 01:25:16,820 --> 01:25:18,540 Det er svært at tro. 1705 01:25:18,540 --> 01:25:21,210 >> Men bruge dette som et eksempel. 1706 01:25:21,210 --> 01:25:23,540 Lad os tage nummer en tredjedel. 1707 01:25:23,540 --> 01:25:27,350 En tredjedel må ikke være udtrykt i decimal nøjagtigt. 1708 01:25:27,350 --> 01:25:32,080 En tredjedel er 0,333 stået på i uendelighed. 1709 01:25:32,080 --> 01:25:36,480 >> Der er ingen måde at gøre det med absolutte nøjagtighed i decimal. 1710 01:25:36,480 --> 01:25:39,560 Det er præcis den slags problemer der skete i Patriot. 1711 01:25:39,560 --> 01:25:44,100 Jo længere systemet kørte den værre blev tidsfejl. 1712 01:25:44,100 --> 01:25:48,890 >> -Efter 100 timers drift, fejl i tid var kun omkring en tredjedel 1713 01:25:48,890 --> 01:25:50,600 af et sekund. 1714 01:25:50,600 --> 01:25:54,210 Men med hensyn til at målrette en missil rejser på mach 5, 1715 01:25:54,210 --> 01:25:58,710 det resulterede i en tracking fejl på over 600 meter. 1716 01:25:58,710 --> 01:26:02,120 Det ville være en fatal fejl for soldaterne om, hvad 1717 01:26:02,120 --> 01:26:08,940 skete der en Scud lancering var opdaget af tidlig varsling satellitter 1718 01:26:08,940 --> 01:26:12,860 og de vidste, at Scud var kommer i deres generelle retning. 1719 01:26:12,860 --> 01:26:15,320 De vidste ikke, hvor det kommer. 1720 01:26:15,320 --> 01:26:18,250 >> -Det Var nu op til radaren komponent af Patriot-systemet 1721 01:26:18,250 --> 01:26:23,190 forsvare Dhahran at finde og holde styr på de indkommende fjendtlige missiler. 1722 01:26:23,190 --> 01:26:24,609 >> -Den Radar var meget smart. 1723 01:26:24,609 --> 01:26:26,650 Det ville faktisk spore placeringen af ​​Scud, 1724 01:26:26,650 --> 01:26:30,350 og derefter forudsige, hvor det sandsynligvis ville være den næste gang radaren sendt 1725 01:26:30,350 --> 01:26:31,420 en puls ud. 1726 01:26:31,420 --> 01:26:33,110 Det blev kaldt en række gate. 1727 01:26:33,110 --> 01:26:37,660 >> -Så, Når Patriot beslutter tid nok har 1728 01:26:37,660 --> 01:26:42,450 bestået at gå tilbage og tjekke den næste placering for denne detekteret objekt, 1729 01:26:42,450 --> 01:26:43,600 det går tilbage. 1730 01:26:43,600 --> 01:26:48,650 Så når det gik tilbage til den forkerte sted, ser det derefter intet objekt. 1731 01:26:48,650 --> 01:26:52,160 Og det beslutter, at der ikke var nogen objekt, det var en falsk detektion, 1732 01:26:52,160 --> 01:26:53,930 og taber sporet. 1733 01:26:53,930 --> 01:26:57,030 >> -Den Indgående Scud forsvandt fra radarskærmen. 1734 01:26:57,030 --> 01:27:00,260 Og sekunder senere, det smækkede ind i kasernen. 1735 01:27:00,260 --> 01:27:06,150 Den Scud dræbte 28, og var den sidste man fyret under den første Golfkrig. 1736 01:27:06,150 --> 01:27:11,960 >> Tragisk, den opdaterede software ankom til Dhahran den følgende dag. 1737 01:27:11,960 --> 01:27:14,930 Den software fejl havde været fast, lukning 1738 01:27:14,930 --> 01:27:19,806 et kapitel i den urolige historie Patriot missil. 1739 01:27:19,806 --> 01:27:20,729 >> [VIDEO PLAYBACK] 1740 01:27:20,729 --> 01:27:23,520 DAVID J. MALAN: Så det er alt for sige, at disse spørgsmål af overløb 1741 01:27:23,520 --> 01:27:25,860 og unøjagtighed er alt for virkelige. 1742 01:27:25,860 --> 01:27:26,920 Så hvordan har vi her? 1743 01:27:26,920 --> 01:27:28,895 Vi begyndte med bare taler om printf. 1744 01:27:28,895 --> 01:27:31,270 Igen, denne funktion, udskriver noget til skærmen, 1745 01:27:31,270 --> 01:27:33,450 og vi indførte derefter et par andre funktioner 1746 01:27:33,450 --> 01:27:34,945 fra den såkaldte CS50 bibliotek. 1747 01:27:34,945 --> 01:27:36,910 Og vi vil fortsætte med at se disse i god tid. 1748 01:27:36,910 --> 01:27:40,760 Og vi, især anvendes get streng, og få int, og nu også få float, 1749 01:27:40,760 --> 01:27:44,410 og endnu andre stadig vil vi møder og bruge os inden længe. 1750 01:27:44,410 --> 01:27:47,220 >> Men til tider, har vi allerede set et behov 1751 01:27:47,220 --> 01:27:50,520 til at gemme, hvad disse funktioner hånd tilbage? 1752 01:27:50,520 --> 01:27:52,920 De hånd os tilbage en streng, eller en int eller en flyder. 1753 01:27:52,920 --> 01:27:56,070 Og nogle gange er vi nødt til at sætte det streng, eller int eller float, et sted. 1754 01:27:56,070 --> 01:28:00,100 >> Og til at gemme de ting, husker bare ligesom i Scratch, har vi variabler. 1755 01:28:00,100 --> 01:28:03,260 Men i modsætning til i Scratch, i C har vi konkrete typer 1756 01:28:03,260 --> 01:28:05,530 af variables-- data typer, flere generally-- 1757 01:28:05,530 --> 01:28:08,640 blandt dem, en snor, en int, et flyde, og disse andre stadig. 1758 01:28:08,640 --> 01:28:12,321 >> Og så når vi erklærer variable i C, vi bliver nødt til at erklære vores datatyper. 1759 01:28:12,321 --> 01:28:14,820 Det er ikke noget vi får nødt til at gøre senere i semesteret 1760 01:28:14,820 --> 01:28:16,810 da vi overgangen til andre sprog. 1761 01:28:16,810 --> 01:28:19,610 Men for nu, har vi brug for til a priori på forhånd, 1762 01:28:19,610 --> 01:28:24,370 forklare til computeren, hvilken type variabel vi ønsker at give os. 1763 01:28:24,370 --> 01:28:27,290 >> Nu, i mellemtiden, for at udskrive den slags datatyper, 1764 01:28:27,290 --> 01:28:29,570 vi nødt til at fortælle printf hvad forventer. 1765 01:28:29,570 --> 01:28:32,450 Og vi så procent s for strygere, og procent i for heltal, 1766 01:28:32,450 --> 01:28:33,790 og et par andre allerede. 1767 01:28:33,790 --> 01:28:37,237 Og dem er simpelthen krav for den visuelle præsentation 1768 01:28:37,237 --> 01:28:38,070 af disse oplysninger. 1769 01:28:38,070 --> 01:28:42,080 >> Og hver af disse kan faktisk være parametriseret eller sammenknebne på en eller anden måde, 1770 01:28:42,080 --> 01:28:45,370 hvis du ønsker at fremme kontrol den type output, som du får. 1771 01:28:45,370 --> 01:28:49,604 Og i virkeligheden viser det sig, at ikke kun er der omvendt skråstreg n for en ny linje. 1772 01:28:49,604 --> 01:28:52,520 Der er noget andet kaldes backslash r for en vognretur, som 1773 01:28:52,520 --> 01:28:54,360 er mere beslægtet med en gamle skole skrivemaskine, 1774 01:28:54,360 --> 01:28:57,690 og også Windows anvendt i mange år. 1775 01:28:57,690 --> 01:28:59,690 >> Der er backslash t til faner. 1776 01:28:59,690 --> 01:29:03,170 Slår ud, at hvis du ønsker at dobbelt citat inde i en snor, 1777 01:29:03,170 --> 01:29:05,000 minde om, at vi har brugt dobbelt citat double 1778 01:29:05,000 --> 01:29:07,900 citat til venstre og højre ender af vores strenge hidtil. 1779 01:29:07,900 --> 01:29:09,420 Det synes at forvirre tingene. 1780 01:29:09,420 --> 01:29:12,503 >> Hvis du ønsker at sætte en dobbelt citat i midt i en string-- og faktisk 1781 01:29:12,503 --> 01:29:13,670 Det er forvirrende at se. 1782 01:29:13,670 --> 01:29:17,120 Og så er du nødt til at flygte, så at tale, en dobbelt citat med noget 1783 01:29:17,120 --> 01:29:18,860 lignende, bogstaveligt, backslash dobbelt citat. 1784 01:29:18,860 --> 01:29:20,230 Og der er et par andre stadig. 1785 01:29:20,230 --> 01:29:24,540 Og vi vil se mere af dem, i faktiske brug inden længe. 1786 01:29:24,540 --> 01:29:27,930 >> Så lad os nu overgangen fra data, og repræsentation, 1787 01:29:27,930 --> 01:29:30,820 og aritmetiske operatorer, alle hvoraf gav os nogle bygning 1788 01:29:30,820 --> 01:29:32,070 blokke med at spille. 1789 01:29:32,070 --> 01:29:34,481 Men lad os nu faktisk give os resten af ​​ordforrådet 1790 01:29:34,481 --> 01:29:36,230 at vi allerede havde sidste uge med Scratch 1791 01:29:36,230 --> 01:29:39,350 ved at tage et kig på nogle andre konstruktioner i C-- ikke dem alle. 1792 01:29:39,350 --> 01:29:41,680 Men de idéer, vi er til at se virkelig bare 1793 01:29:41,680 --> 01:29:45,610 at understrege oversættelse fra et sprog, Scratch, til en anden, C. 1794 01:29:45,610 --> 01:29:48,470 >> Og over tid, vil vi samle op flere værktøjer til vores værktøjskasse, 1795 01:29:48,470 --> 01:29:49,820 så at sige, syntaktisk. 1796 01:29:49,820 --> 01:29:54,190 Og, ja, vil du se, at de ideer, er nu temmelig velkendt fra sidste uge. 1797 01:29:54,190 --> 01:29:55,200 Så lad os gøre det. 1798 01:29:55,200 --> 01:29:58,870 >> Lad os gå videre og pisk op et program der rent faktisk bruger nogle udtryk, 1799 01:29:58,870 --> 01:30:00,720 et boolsk udtryk. 1800 01:30:00,720 --> 01:30:02,810 Lad mig gå videre her og oprette en ny fil. 1801 01:30:02,810 --> 01:30:06,090 Jeg ringer denne condition.c. 1802 01:30:06,090 --> 01:30:09,350 >> Lad mig gå videre og omfatter CS50 bibliotek. 1803 01:30:09,350 --> 01:30:12,640 Og lad mig gå videre og inkludere standard IO.h for vores funktioner, 1804 01:30:12,640 --> 01:30:14,690 og printf, og mere hhv. 1805 01:30:14,690 --> 01:30:18,900 Lad mig give mig selv, at standardtekst af int main tomrum, hvis forklaring vi får 1806 01:30:18,900 --> 01:30:20,360 vende tilbage til i fremtiden. 1807 01:30:20,360 --> 01:30:23,820 >> Lad mig nu gå videre og give selv en int via get int. 1808 01:30:23,820 --> 01:30:25,970 Så lad mig gå videre og gøre dette. 1809 01:30:25,970 --> 01:30:30,150 Jeg vil sige, hvis jeg er less-- lad os skelne mellem positive, negative, 1810 01:30:30,150 --> 01:30:31,260 eller nulværdier. 1811 01:30:31,260 --> 01:30:36,630 >> Så hvis i er mindre end nul, lad mig bare have dette program blot sige, 1812 01:30:36,630 --> 01:30:42,370 negativ, omvendt skråstreg n, ellers hvis i er større end nul. 1813 01:30:42,370 --> 01:30:47,030 Nu er jeg selvfølgelig vil sige printf positiv, backslash n. 1814 01:30:47,030 --> 01:30:50,690 Og så ellers if-- jeg kunne gøre dette. 1815 01:30:50,690 --> 01:30:53,410 >> Jeg kunne gøre, hvis jeg er lig 0. 1816 01:30:53,410 --> 01:30:55,840 Men jeg ville være at gøre ved mindst én fejl allerede. 1817 01:30:55,840 --> 01:30:59,480 Husk på, at lighedstegnet er ikke lige, da vi mennesker kender det. 1818 01:30:59,480 --> 01:31:01,010 >> Men det er tildelingsoperatoren. 1819 01:31:01,010 --> 01:31:05,640 Og vi ønsker ikke at tage 0 på højre og sætte det i jeg til venstre. 1820 01:31:05,640 --> 01:31:11,810 Så for at undgå denne forvirring, eller måske misbrug af lighedstegnet, 1821 01:31:11,810 --> 01:31:14,740 mennesker besluttede for nogle år siden at i mange programmeringssprog 1822 01:31:14,740 --> 01:31:18,000 når du ønsker at kontrollere for ligestilling mellem venstre og højre, 1823 01:31:18,000 --> 01:31:19,635 du rent faktisk bruger lig ligemænd. 1824 01:31:19,635 --> 01:31:21,010 Så du rammer lighedstegnet to gange. 1825 01:31:21,010 --> 01:31:25,600 Når du ønsker at tildele fra højre til venstre, du bruger en enkelt lighedstegn. 1826 01:31:25,600 --> 01:31:29,360 Så vi kunne gøre denne-- andet hvis jeg lig er lig med nul. 1827 01:31:29,360 --> 01:31:31,710 >> Jeg kunne derefter gå og åbne mine krøllede parenteser, 1828 01:31:31,710 --> 01:31:36,087 og sige, printf 0, omvendt skråstreg n, gjort. 1829 01:31:36,087 --> 01:31:38,170 Men husk, hvordan disse gafler i vejen kan arbejde. 1830 01:31:38,170 --> 01:31:39,836 Og virkelig, bare tænke på logik. 1831 01:31:39,836 --> 01:31:41,510 i er et tal. 1832 01:31:41,510 --> 01:31:43,320 Det er et helt tal, specifikt. 1833 01:31:43,320 --> 01:31:48,600 Og det betyder, at det vil være mindre end 0 eller større end 0, eller 0. 1834 01:31:48,600 --> 01:31:51,600 Så der er form for dette stiltiende normale tilfælde. 1835 01:31:51,600 --> 01:31:54,920 >> Og så kunne vi, ligesom Scratch, dispensere fra andet hvis, 1836 01:31:54,920 --> 01:31:55,747 og bare sige andet. 1837 01:31:55,747 --> 01:31:57,830 Logisk, hvis du programmør ved, der er kun 1838 01:31:57,830 --> 01:32:01,635 tre skovle, hvori en scenarie kan fall-- den første, 1839 01:32:01,635 --> 01:32:03,510 den anden, eller den tredje i dette case-- ikke 1840 01:32:03,510 --> 01:32:07,100 genere lægge det yderligere præcision og den yderligere logik der. 1841 01:32:07,100 --> 01:32:09,690 Bare gå videre med standard tilfældet her for andet. 1842 01:32:09,690 --> 01:32:11,950 >> Lad os nu gå videre efter at have gemt dette, skal 1843 01:32:11,950 --> 01:32:15,760 betingelser dot skråstreg conditions-- ikke en stor brugerflade, 1844 01:32:15,760 --> 01:32:18,914 fordi jeg ikke spørge bruger, som jeg nævnte 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 simpelt. 1847 01:32:20,454 --> 01:32:21,890 Lad os 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 Lad os prøve det antal negativ 42, negativ. 1850 01:32:26,120 --> 01:32:28,244 >> Lad os prøve værdien 0. 1851 01:32:28,244 --> 01:32:29,160 Og netop det fungerer. 1852 01:32:29,160 --> 01:32:33,900 Nu, vil du se med problemer før lange, prøvning ting tre gange, 1853 01:32:33,900 --> 01:32:34,980 sandsynligvis ikke tilstrækkeligt. 1854 01:32:34,980 --> 01:32:37,438 Du ønsker sikkert at afprøve nogle større tal, nogle mindre 1855 01:32:37,438 --> 01:32:40,520 numre, nogle hjørne sager, som vi vil komme til at beskrive dem. 1856 01:32:40,520 --> 01:32:42,500 >> Men for nu, er det en temmelig simpelt program. 1857 01:32:42,500 --> 01:32:45,160 Og jeg er ret sikker på, logisk, at den falder i tre tilfælde. 1858 01:32:45,160 --> 01:32:49,360 Og, ja, selvom vi bare fokuseret på de potentielle ulemper 1859 01:32:49,360 --> 01:32:53,480 af manglende præcision og overløb, i virkelighed, hvor mange af CS50 problemer, 1860 01:32:53,480 --> 01:32:56,000 Vi vil ikke bekymre sig om, hele tiden, 1861 01:32:56,000 --> 01:32:59,050 disse spørgsmål af overløb og unøjagtigheder, fordi, i virkeligheden, i C, 1862 01:32:59,050 --> 01:33:01,889 det er faktisk ikke alt, let at undgå disse ting. 1863 01:33:01,889 --> 01:33:04,180 Hvis du ønsker at tælle op større, og større, og større, 1864 01:33:04,180 --> 01:33:07,510 det viser sig der er teknikker, du kan bruge, som ofte involverer ting kaldet 1865 01:33:07,510 --> 01:33:11,240 biblioteker, samlinger af kode, at andre mennesker skrev, at du kan bruge, 1866 01:33:11,240 --> 01:33:13,910 og andre sprog som Java og andre, der faktisk 1867 01:33:13,910 --> 01:33:15,800 gør det meget lettere at tælle endnu højere. 1868 01:33:15,800 --> 01:33:19,810 Så det er virkelig nogle af disse farer en funktion af det sprog, du bruger. 1869 01:33:19,810 --> 01:33:22,710 Og i de kommende uger, vil vi se, hvor farligt C egentlig 1870 01:33:22,710 --> 01:33:24,950 kan være, hvis du ikke bruger det ordentligt. 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å nogle yderligere beskyttelse, og køre færre af disse risici. 1873 01:33:32,620 --> 01:33:35,820 >> Så lad os gøre lidt mere interessant logik i vores program. 1874 01:33:35,820 --> 01:33:39,110 Så lad mig gå videre og skabe et program kaldet logisk 1875 01:33:39,110 --> 01:33:43,804 bare så jeg kan spille med nogle faktiske logik, logical.c. 1876 01:33:43,804 --> 01:33:46,870 Jeg vil bare kopiere og indsætte nogle kode fra tidligere, så jeg får tilbage 1877 01:33:46,870 --> 01:33:49,950 til denne nice udgangspunkt. 1878 01:33:49,950 --> 01:33:53,980 >> Lad mig denne gang gøre char C. jeg vil give det et navn C 1879 01:33:53,980 --> 01:33:58,510 bare fordi det er konventionelle, få en karakter fra brugeren. 1880 01:33:58,510 --> 01:34:00,730 Og lad os lade som Jeg gennemføre del 1881 01:34:00,730 --> 01:34:04,130 af denne Rm program, fjern program før denne bedt brugeren 1882 01:34:04,130 --> 01:34:05,400 fjerne en fil. 1883 01:34:05,400 --> 01:34:06,750 Hvordan kunne vi gøre det? 1884 01:34:06,750 --> 01:34:11,090 >> Jeg ønsker at sige, hvis C er lig lig, citat Citat slut, 1885 01:34:11,090 --> 01:34:16,304 y, så jeg har tænkt mig at antage at brugeren har valgt ja. 1886 01:34:16,304 --> 01:34:17,470 Jeg skal bare udskrive ja. 1887 01:34:17,470 --> 01:34:19,440 Hvis det rent faktisk var at skrive fjernelse program, 1888 01:34:19,440 --> 01:34:21,420 vi kunne fjerne filen med flere linjer kode. 1889 01:34:21,420 --> 01:34:22,461 Men vi vil holde det simpelt. 1890 01:34:22,461 --> 01:34:25,950 1891 01:34:25,950 --> 01:34:31,250 >> Else hvis c er lig lig n- og nu her, vil jeg sige, 1892 01:34:31,250 --> 01:34:32,980 brugeren må have betydet noget. 1893 01:34:32,980 --> 01:34:34,360 Og så ellers, ved du hvad? 1894 01:34:34,360 --> 01:34:36,200 Jeg ved ikke, hvad der ellers brugeren kommer til at skrive. 1895 01:34:36,200 --> 01:34:38,533 Så jeg vil bare sige, at der er en fejl, uanset 1896 01:34:38,533 --> 01:34:40,070 han eller hun faktisk har skrevet. 1897 01:34:40,070 --> 01:34:41,180 >> Så hvad sker der her? 1898 01:34:41,180 --> 01:34:44,530 Der er en grundlæggende forskel kontra hvad jeg har gjort i fortiden. 1899 01:34:44,530 --> 01:34:49,300 Anførselstegn, dobbelt anførselstegn, dobbelt citater, og, endnu, enkelte anførselstegn, 1900 01:34:49,300 --> 01:34:50,170 enkelte anførselstegn. 1901 01:34:50,170 --> 01:34:52,860 Det viser sig i C, at når du ønsker at skrive en streng, 1902 01:34:52,860 --> 01:34:56,680 du bruger anførselstegn, ligesom vi har brugt al den tid med printf. 1903 01:34:56,680 --> 01:35:02,030 >> Men hvis du ønsker at beskæftige sig med blot en enkelt tegn, en såkaldt char, 1904 01:35:02,030 --> 01:35:03,780 så du faktisk bruge enkelte anførselstegn. 1905 01:35:03,780 --> 01:35:05,450 De af jer, der har programmeret før, du måske ikke har 1906 01:35:05,450 --> 01:35:07,850 måtte bekymre dig om dette forskel i visse sprog. 1907 01:35:07,850 --> 01:35:09,450 I C, det betyder noget. 1908 01:35:09,450 --> 01:35:12,560 Og så når jeg får en char og jeg vil at sammenligne den char hjælp ligeværdige 1909 01:35:12,560 --> 01:35:18,350 lig med nogle brev som y eller n, jeg gør, ja, skal have de enkelte anførselstegn. 1910 01:35:18,350 --> 01:35:19,770 >> Lad os nu gå videre og gøre dette. 1911 01:35:19,770 --> 01:35:26,180 Lad os gå videre og gør logiske prik slash logisk. 1912 01:35:26,180 --> 01:35:27,305 Og nu er jeg blevet bedt om det. 1913 01:35:27,305 --> 01:35:30,638 Så formentlig, en bedre brugeroplevelse ville faktisk fortælle mig hvad jeg skal gøre her. 1914 01:35:30,638 --> 01:35:33,030 Men jeg har tænkt mig at bare blindt siger y for ja, OK, nice. 1915 01:35:33,030 --> 01:35:35,780 >> Lad os køre den igen, n for nej, nice. 1916 01:35:35,780 --> 01:35:39,610 Antag ligesom visse mennesker, jeg kender, mine caps lock tasten er tændt alt for ofte. 1917 01:35:39,610 --> 01:35:43,740 Så jeg gør kapital Y, indtaste, fejl. 1918 01:35:43,740 --> 01:35:46,130 OK, det er ikke præcis, hvad jeg forventer. 1919 01:35:46,130 --> 01:35:48,170 Faktisk computeren gør bogstaveligt hvad 1920 01:35:48,170 --> 01:35:51,794 Jeg fortalte det til do-- kontrollere for små bogstaver y og små bogstaver n. 1921 01:35:51,794 --> 01:35:53,960 Dette betyder ikke lyst til god brugeroplevelse, selv om. 1922 01:35:53,960 --> 01:35:59,010 Lad mig bede om og acceptere enten små bogstaver eller store bogstaver. 1923 01:35:59,010 --> 01:36:02,090 Så det viser sig, kan du at sige noget lignende i Scratch, 1924 01:36:02,090 --> 01:36:08,150 som bogstaveligt eller C lig lig kapital enkelt citerede y. 1925 01:36:08,150 --> 01:36:11,400 Slår ud, har C ikke har denne bogstavelige søgeord eller. 1926 01:36:11,400 --> 01:36:12,880 >> Men det har to lodrette stænger. 1927 01:36:12,880 --> 01:36:15,463 Du er nødt til at holde Shift normalt, hvis du bruger et amerikansk tastatur, 1928 01:36:15,463 --> 01:36:18,910 og ramte den lodrette bjælke nøgle over dit afkast nøgle. 1929 01:36:18,910 --> 01:36:22,410 Men denne vertikale bar lodret streg betyder eller. 1930 01:36:22,410 --> 01:36:26,220 >> Hvis, derimod, vi ønskede at sige, og ligesom i Scratch, 1931 01:36:26,220 --> 01:36:28,180 vi kunne gøre tegnet og-tegn. 1932 01:36:28,180 --> 01:36:31,330 Det giver ingen logisk mening her, fordi et menneske kunne umuligt 1933 01:36:31,330 --> 01:36:37,110 har skrevet både y og små bogstaver y og kapital Y som den samme karakter. 1934 01:36:37,110 --> 01:36:39,470 Så eller er, hvad vi agter her. 1935 01:36:39,470 --> 01:36:46,280 >> Så hvis jeg gør dette i begge steder, eller c lig lig kapital N, nu køres igen, 1936 01:36:46,280 --> 01:36:49,390 gøre logisk, gentages logisk. 1937 01:36:49,390 --> 01:36:51,200 Nu kan jeg skrive y. 1938 01:36:51,200 --> 01:36:53,920 Og jeg kan gøre det igen med hovedstad Y, eller kapitalen N. 1939 01:36:53,920 --> 01:36:56,630 Og jeg kunne tilføje i ekstra kombinationer stille. 1940 01:36:56,630 --> 01:36:58,810 >> Så dette er en logisk program omfang nu 1941 01:36:58,810 --> 01:37:01,940 Jeg tjekker logisk for denne værdi eller denne værdi. 1942 01:37:01,940 --> 01:37:06,420 Og jeg behøver ikke at nødvendigvis, komme op med to flere hvis'er eller ellers hvis'er. 1943 01:37:06,420 --> 01:37:09,960 Jeg kan faktisk kombinere nogle af de logik sammen på denne måde. 1944 01:37:09,960 --> 01:37:11,950 Så det ville være bedre designet end blot 1945 01:37:11,950 --> 01:37:17,490 sige, hvis C er lig små bogstaver y, udskrive ja, ellers hvis c er lig kapital Y, 1946 01:37:17,490 --> 01:37:20,074 udskrive ja, ellers hvis c er lig lower-- med andre ord, 1947 01:37:20,074 --> 01:37:21,990 du behøver ikke at have flere og flere grene. 1948 01:37:21,990 --> 01:37:28,840 Man kan kombinere nogle af den ækvivalente grene logisk, som på denne måde. 1949 01:37:28,840 --> 01:37:34,150 >> Så lad os tage et kig på blot én sidste ingrediens, en endelige konstruktion, 1950 01:37:34,150 --> 01:37:34,847 at C tillader. 1951 01:37:34,847 --> 01:37:36,930 Og vi vil komme tilbage i fremtiden til atter andre. 1952 01:37:36,930 --> 01:37:41,400 Og så vil vi slutte af med at kigge ved ikke rigtigheden af ​​code-- 1953 01:37:41,400 --> 01:37:46,070 få kode til work-- men designet kode, og plante disse frø tidligt. 1954 01:37:46,070 --> 01:37:51,337 >> Så lad mig gå videre og åbne en ny fil her. 1955 01:37:51,337 --> 01:37:51,920 Du ved hvad? 1956 01:37:51,920 --> 01:37:54,450 Jeg har tænkt mig at re-implementere samme program, 1957 01:37:54,450 --> 01:37:55,940 brug af et andet konstrukt. 1958 01:37:55,940 --> 01:38:00,110 >> Så lad mig hurtigt give mig selv adgang til at 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 Giv mig min int main tomrum. 1961 01:38:06,510 --> 01:38:09,310 Og så herovre, lad mig gå videre og gøre dette. 1962 01:38:09,310 --> 01:38:12,010 >> Char c får få char, ligesom før. 1963 01:38:12,010 --> 01:38:16,770 Og jeg har tænkt mig at bruge en ny konstruktion nu-- skifte, på hvilke tegn? 1964 01:38:16,770 --> 01:38:19,820 Så switch er lidt ligesom skifte en toget spor. 1965 01:38:19,820 --> 01:38:22,070 Eller, virkelig, er den slags en hvis ellers, hvis ellers hvis, 1966 01:38:22,070 --> 01:38:23,980 men skrevet noget anderledes. 1967 01:38:23,980 --> 01:38:25,490 >> En switch ser sådan ud. 1968 01:38:25,490 --> 01:38:29,060 Du har switch, og hvad så tegn eller tal, du ønsker at se på, 1969 01:38:29,060 --> 01:38:32,000 derefter nogle krøllede parenteser gerne i Scratch, bare sige gøre det her. 1970 01:38:32,000 --> 01:38:33,480 Og så har du forskellige sager. 1971 01:38:33,480 --> 01:38:34,830 >> Du behøver ikke bruge, hvis og andet. 1972 01:38:34,830 --> 01:38:37,050 Du bogstaveligt talt bruge ordet tilfældet. 1973 01:38:37,050 --> 01:38:38,790 Og du ville sige noget som dette. 1974 01:38:38,790 --> 01:38:43,820 >> Så i tilfælde af et lille y, eller i tilfælde af et stort Y, 1975 01:38:43,820 --> 01:38:47,350 gå videre og udskrive ja. 1976 01:38:47,350 --> 01:38:49,020 Og derefter bryde ud af kontakten. 1977 01:38:49,020 --> 01:38:49,580 Det er det. 1978 01:38:49,580 --> 01:38:50,880 Vi er færdige. 1979 01:38:50,880 --> 01:38:57,270 >> Else hvis, så at sige, små bogstaver n, eller kapitalen N, 1980 01:38:57,270 --> 01:39:02,560 derefter gå videre og print ud nej, og derefter bryde. 1981 01:39:02,560 --> 01:39:08,022 Else-- og denne form for er det normale tilfælde indeed-- printf error-- 1982 01:39:08,022 --> 01:39:10,980 og bare for god foranstaltning, selv om logisk denne pause er ikke nødvendigt 1983 01:39:10,980 --> 01:39:12,896 fordi vi er ved enden af omskifteren alligevel, 1984 01:39:12,896 --> 01:39:14,520 Jeg er nu at bryde ud af kontakten. 1985 01:39:14,520 --> 01:39:16,280 Så dette ser lidt anderledes. 1986 01:39:16,280 --> 01:39:18,272 >> Men logisk, det er faktisk tilsvarende. 1987 01:39:18,272 --> 01:39:19,980 Og hvorfor ville du bruge ene frem for den anden? 1988 01:39:19,980 --> 01:39:23,220 Nogle gange, bare personlig præference, undertiden æstetik, 1989 01:39:23,220 --> 01:39:25,420 hvis jeg blik på dette nu, er der noget 1990 01:39:25,420 --> 01:39:27,510 der taler for den læsbarheden af ​​denne kode. 1991 01:39:27,510 --> 01:39:30,690 Jeg mener, pyt, at dette kode er nyt for mange af os i rummet. 1992 01:39:30,690 --> 01:39:33,515 >> Men det er bare sådan er smuk. 1993 01:39:33,515 --> 01:39:37,760 Du ser små bogstaver y, hovedstaden Y, små bogstaver n, kapital N standard 1994 01:39:37,760 --> 01:39:40,150 det bare sådan hopper ud på dig på en måde 1995 01:39:40,150 --> 01:39:42,200 at, velsagtens, måske det foregående eksempel 1996 01:39:42,200 --> 01:39:45,780 med hvis'er, og de lodrette stænger, og ellers hvis'er, måske ikke har. 1997 01:39:45,780 --> 01:39:51,600 Så det er virkelig et spørgsmål om personlig valg, virkelig, eller læsbarhed, 1998 01:39:51,600 --> 01:39:52,360 af koden. 1999 01:39:52,360 --> 01:39:58,230 >> Men med hensyn til funktionalitet, lad mig gå videre og gøre en switch, prik skråstreg 2000 01:39:58,230 --> 01:40:05,830 switch, og nu skrive små bogstaver y, hovedstad Y, små bogstaver n, hovedstaden N, 2001 01:40:05,830 --> 01:40:09,250 David, prøv igen, fordi det er ikke et enkelt tegn. 2002 01:40:09,250 --> 01:40:12,050 Lad os gøre x, fejl, som forventet. 2003 01:40:12,050 --> 01:40:15,640 Og, logically-- og det er noget Jeg vil opfordre i general-- selv 2004 01:40:15,640 --> 01:40:17,790 selvom vi kun skrabe overflade af nogle af disse funktioner. 2005 01:40:17,790 --> 01:40:20,560 >> Og det kan ikke være indlysende, når du selv sidde ned på tastaturet, 2006 01:40:20,560 --> 01:40:21,370 hvordan fungerer det? 2007 01:40:21,370 --> 01:40:22,240 Hvad ville det gøre? 2008 01:40:22,240 --> 01:40:25,630 Den smukke ting om at have en bærbar computer, eller stationær eller adgang 2009 01:40:25,630 --> 01:40:29,290 til en computer med en compiler, og med en kode editor som dette, 2010 01:40:29,290 --> 01:40:32,990 er du næsten altid besvare disse spørgsmål til dig selv lige ved at prøve. 2011 01:40:32,990 --> 01:40:36,570 >> For eksempel, hvis den retoriske spørgsmål ved hånden var, 2012 01:40:36,570 --> 01:40:39,540 hvad sker der, hvis du glemmer din pause udsagn? 2013 01:40:39,540 --> 01:40:41,400 Hvilket er faktisk en meget almindelig ting at gøre, 2014 01:40:41,400 --> 01:40:43,540 fordi det ikke ser ligesom du virkelig har brug for dem. 2015 01:40:43,540 --> 01:40:46,790 De har ikke rigtig fuldføre din tænkte som en parentes eller en krøllet 2016 01:40:46,790 --> 01:40:47,714 tandbøjle gør. 2017 01:40:47,714 --> 01:40:49,630 Lad os gå videre og rekompilere koden og se. 2018 01:40:49,630 --> 01:40:53,690 Så gør switch, dot skråstreg switch. 2019 01:40:53,690 --> 01:40:56,435 Lad os skrive med små bogstaver y, den øverste tilfælde Enter. 2020 01:40:56,435 --> 01:40:59,390 2021 01:40:59,390 --> 01:41:00,700 Så jeg har skrevet y. 2022 01:41:00,700 --> 01:41:04,420 >> Programmet sagde ja, nej, fejl, som om det var ved at skifte mening. 2023 01:41:04,420 --> 01:41:09,280 Men den slags var, fordi det, der sker med en kontakt er det første tilfælde, at 2024 01:41:09,280 --> 01:41:13,899 match væsentlige betyder, hey computer, udføre hele koden under den. 2025 01:41:13,899 --> 01:41:16,690 Og hvis du ikke siger pause, eller siger ikke pause eller ikke siger pause, 2026 01:41:16,690 --> 01:41:19,540 computeren vil blæse gennem alle disse linjer 2027 01:41:19,540 --> 01:41:22,779 og udføre dem alle indtil det bliver til det krøllede klammeparentes. 2028 01:41:22,779 --> 01:41:24,320 Så bremserne er faktisk nødvendigt. 2029 01:41:24,320 --> 01:41:27,120 Men en takeaway her er, når i tvivl, så prøv noget. 2030 01:41:27,120 --> 01:41:29,510 Måske gemmer din kode først, eller gemme det i en ekstra fil 2031 01:41:29,510 --> 01:41:32,930 hvis du er virkelig bekymret rode op og at skulle inddrive 2032 01:41:32,930 --> 01:41:34,430 det arbejde, som du ved fungerer. 2033 01:41:34,430 --> 01:41:35,410 >> Men prøv tingene. 2034 01:41:35,410 --> 01:41:38,074 Og ikke være så bange, måske, af, hvad computeren kan gøre, 2035 01:41:38,074 --> 01:41:39,490 eller at du måske bryde noget. 2036 01:41:39,490 --> 01:41:42,790 Du kan altid vende tilbage til nogle tidligere version. 2037 01:41:42,790 --> 01:41:45,640 >> Så lad os slutte med at kigge ved udformningen af ​​koden. 2038 01:41:45,640 --> 01:41:49,020 Vi har denne evne nu at skrive betingelser, og skrive loops, 2039 01:41:49,020 --> 01:41:50,850 og variabler, og opkaldsfunktioner. 2040 01:41:50,850 --> 01:41:54,590 Så helt ærligt, vi er slags tilbage på hvor vi var en uge siden med Scratch, 2041 01:41:54,590 --> 01:42:00,120 omend med en mindre overbevisende tekstmæssige miljøet end Scratch tillader. 2042 01:42:00,120 --> 01:42:03,990 >> Men bemærk, hvor hurtigt vi har erhvervet at ordforråd, selvom det er 2043 01:42:03,990 --> 01:42:07,570 kommer til at tage lidt tid at synke i, så vi nu kan bruge denne ordforråd 2044 01:42:07,570 --> 01:42:10,320 at skrive mere interessante programmer. 2045 01:42:10,320 --> 01:42:12,940 Og lad os tage en baby skridt mod denne, som følger. 2046 01:42:12,940 --> 01:42:14,890 Lad mig gå videre og oprette en ny fil her. 2047 01:42:14,890 --> 01:42:17,750 >> Jeg har tænkt mig at kalde denne prototype.c, og indføre 2048 01:42:17,750 --> 01:42:20,954 for første gang, evnen at lave dine egne funktioner. 2049 01:42:20,954 --> 01:42:22,870 Nogle af jer har måske gjort dette med Scratch, 2050 01:42:22,870 --> 01:42:25,430 hvor du kan oprette din egne brugerdefinerede blokke i Scratch, 2051 01:42:25,430 --> 01:42:27,892 og derefter trække dem på plads hvor du gerne vil have i C. 2052 01:42:27,892 --> 01:42:30,100 Og i de fleste programmering sprog, kan du gøre præcis 2053 01:42:30,100 --> 01:42:33,580 at-- lave dine egne funktioner, hvis de ikke allerede findes. 2054 01:42:33,580 --> 01:42:38,660 >> Så for eksempel, lad mig gå videre og indbefatter CS50.h, og indbefatter 2055 01:42:38,660 --> 01:42:43,110 standard IO.h, int main tomrum. 2056 01:42:43,110 --> 01:42:46,020 Og nu har vi en eksempeltekst klar til at gå. 2057 01:42:46,020 --> 01:42:48,550 Jeg holder udskrivning ting ligesom folks navne i dag. 2058 01:42:48,550 --> 01:42:51,910 Og det føles like-- ville ikke være rart, hvis der 2059 01:42:51,910 --> 01:42:53,936 var en funktion kaldet print navn? 2060 01:42:53,936 --> 01:42:55,060 Jeg behøver ikke at bruge printf. 2061 01:42:55,060 --> 01:42:56,976 Jeg behøver ikke at huske alle format koder. 2062 01:42:56,976 --> 01:43:00,050 Hvorfor ikke jeg, eller hvorfor ikke nogen før mig, 2063 01:43:00,050 --> 01:43:02,980 oprette en funktion kaldet print navn, der givet nogle navn, 2064 01:43:02,980 --> 01:43:03,980 blot udskriver det ud? 2065 01:43:03,980 --> 01:43:08,700 >> Med andre ord, hvis jeg siger, hey, computer, giv mig en streng 2066 01:43:08,700 --> 01:43:11,870 ved at bede brugeren om sådan, via CS50 os få string funktion. 2067 01:43:11,870 --> 01:43:15,090 Hey, computer, sætte det streng i variablen i venstre side, 2068 01:43:15,090 --> 01:43:16,150 og kalder det s. 2069 01:43:16,150 --> 01:43:22,150 Og så, hey computer, gå videre og udskrive personens navn, gjort. 2070 01:43:22,150 --> 01:43:26,240 >> Nu ville det være rart, fordi dette program, rammende navn, 2071 01:43:26,240 --> 01:43:29,170 fortæller mig, hvad det er meningen at gøre ved hjælp af de funktionens navne. 2072 01:43:29,170 --> 01:43:32,930 Lad mig gå hen og gøre prototype, Enter. 2073 01:43:32,930 --> 01:43:34,930 Og desværre Dette kommer ikke til at flyve. 2074 01:43:34,930 --> 01:43:39,430 >> Prototype.c, linie 7, karakter 5, fejl, underforstået erklæring 2075 01:43:39,430 --> 01:43:42,960 af funktion print navn er ugyldigt i C99, C99 2076 01:43:42,960 --> 01:43:45,130 betyder en version af C der kom ud 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 ved ikke, hvad Alt dette betyder endnu. 2079 01:43:48,780 --> 01:43:50,810 Men jeg anerkender fejl i rødt. 2080 01:43:50,810 --> 01:43:51,770 Det er temmelig indlysende. 2081 01:43:51,770 --> 01:43:53,769 >> Og det lader til, at med den grønne karakter her, 2082 01:43:53,769 --> 01:43:57,520 problemet er med print navn, åben paren s, tæt paren, semikolon. 2083 01:43:57,520 --> 01:44:01,800 Men underforstået erklæring om funktion vi se kort tidligere. 2084 01:44:01,800 --> 01:44:04,880 Det betyder blot, at Dunk ikke ved, hvad jeg mener. 2085 01:44:04,880 --> 01:44:09,000 >> Jeg har brugt et ordforråd ord, at det er aldrig set eller lært før. 2086 01:44:09,000 --> 01:44:11,950 Og så jeg har brug for at lære det hvad denne funktion betyder. 2087 01:44:11,950 --> 01:44:13,590 Så jeg har tænkt mig at gå videre og gøre det. 2088 01:44:13,590 --> 01:44:17,970 >> Jeg har tænkt mig at gå videre og gennemføre min egen funktion kaldet Print Navn. 2089 01:44:17,970 --> 01:44:24,720 Og jeg har tænkt mig at sige, som følger, at det sker, printf, hej, procent 2090 01:44:24,720 --> 01:44:27,760 s, omvendt skråstreg n, navn, semikolon. 2091 01:44:27,760 --> 01:44:29,250 Så hvad gjorde jeg bare gøre? 2092 01:44:29,250 --> 01:44:31,325 >> Så det viser sig, at implementere din egen funktion, 2093 01:44:31,325 --> 01:44:33,845 vi slags låne nogle af samme struktur som vigtigste 2094 01:44:33,845 --> 01:44:35,720 at vi bare har været tages for givet, og jeg 2095 01:44:35,720 --> 01:44:37,730 kender bare at kopiere og indsætte temmelig meget, hvad 2096 01:44:37,730 --> 01:44:39,170 Jeg har været at skrive i fortiden. 2097 01:44:39,170 --> 01:44:40,570 Men bemærk mønsteret her. 2098 01:44:40,570 --> 01:44:43,750 Int, Main, Void, vi drille hinanden inden længe, ​​hvad det egentlig betyder. 2099 01:44:43,750 --> 01:44:46,160 >> Men for i dag, bare mærke til parallelitet. 2100 01:44:46,160 --> 01:44:48,210 Void, print navn, string navn, så der er 2101 01:44:48,210 --> 01:44:50,310 en lilla søgeord, som vi kommer til at starte 2102 01:44:50,310 --> 01:44:54,067 kalde en returtype, navnet på funktionen, og derefter input. 2103 01:44:54,067 --> 01:44:56,400 Så faktisk, kan vi destillere denne form for ligesom sidste uge 2104 01:44:56,400 --> 01:44:59,030 som, det er det navn eller algoritme af koden er vi 2105 01:44:59,030 --> 01:45:00,761 vil write-- den algoritme underliggende 2106 01:45:00,761 --> 01:45:02,010 den kode, vi kommer til at skrive. 2107 01:45:02,010 --> 01:45:03,180 >> Dette er dens indgang. 2108 01:45:03,180 --> 01:45:04,670 Dette er dens output. 2109 01:45:04,670 --> 01:45:08,730 Denne funktion, print navn, er designet til at tage en streng kaldet navn, 2110 01:45:08,730 --> 01:45:11,350 eller hvad, som input, og derefter annulleret. 2111 01:45:11,350 --> 01:45:13,904 Det betyder ikke returnere noget, gerne få snor eller få int gør. 2112 01:45:13,904 --> 01:45:15,570 Så det kommer til at give mig noget tilbage. 2113 01:45:15,570 --> 01:45:17,960 Det er bare vil have en bivirkning, så at sige, 2114 01:45:17,960 --> 01:45:19,570 at udskrive en persons navn. 2115 01:45:19,570 --> 01:45:22,260 Så bemærke, linje 7, jeg kan kalde print navn. 2116 01:45:22,260 --> 01:45:25,920 Linje 10, kan jeg definere eller gennemføre print navn. 2117 01:45:25,920 --> 01:45:28,450 Men desværre, det er ikke nok. 2118 01:45:28,450 --> 01:45:31,230 >> Lad mig gå videre og kompilere dette efter at spare. 2119 01:45:31,230 --> 01:45:33,910 Whoa, nu har jeg gjort det værre, synes det. 2120 01:45:33,910 --> 01:45:37,027 Så underforstået erklæring om funktion print er ugyldigt. 2121 01:45:37,027 --> 01:45:38,360 Og igen er der flere fejl. 2122 01:45:38,360 --> 01:45:41,430 Men som jeg advarede tidligere, selv hvis du får overvældet med, 2123 01:45:41,430 --> 01:45:44,850 eller lidt trist at se så mange fejl, kun fokusere på den første 2124 01:45:44,850 --> 01:45:47,500 i første omgang, fordi det måske bare har haft en kaskadevirkning. 2125 01:45:47,500 --> 01:45:51,970 Så C, eller Dunk mere specifikt, stadig ikke anerkender print navn. 2126 01:45:51,970 --> 01:45:54,580 >> Og det er fordi Dunk, ved design, er lidt dum. 2127 01:45:54,580 --> 01:45:56,280 Det gør kun hvad du fortæller det til at gøre. 2128 01:45:56,280 --> 01:46:00,950 Og det kun gør det i den rækkefølge hvor du fortæller det til at gøre. 2129 01:46:00,950 --> 01:46:05,270 >> Så jeg har defineret main på linje fire, ligesom vi har gjort temmelig ofte. 2130 01:46:05,270 --> 01:46:07,980 Jeg har defineret print navn på linje 10. 2131 01:46:07,980 --> 01:46:11,793 Men jeg forsøger at bruge print navn på linie syv. 2132 01:46:11,793 --> 01:46:13,670 >> Det er for tidligt, ikke eksisterer endnu. 2133 01:46:13,670 --> 01:46:19,150 Så jeg kunne være smart, og være ligesom, OK, så lad os bare spille sammen, 2134 01:46:19,150 --> 01:46:23,680 og flytte print navn op her, og re-kompilere. 2135 01:46:23,680 --> 01:46:24,550 Åh min Gud. 2136 01:46:24,550 --> 01:46:25,260 Det virkede. 2137 01:46:25,260 --> 01:46:26,670 Det var så simpelt er det. 2138 01:46:26,670 --> 01:46:28,120 >> Men logikken er nøjagtigt. 2139 01:46:28,120 --> 01:46:30,870 Du er nødt til at undervise i Dunk, hvad det er ved at definere funktionen først. 2140 01:46:30,870 --> 01:46:31,920 Derefter kan du bruge det. 2141 01:46:31,920 --> 01:46:33,940 Men helt ærligt, det føles som en glidebane. 2142 01:46:33,940 --> 01:46:35,773 >> Så hver gang jeg kører ind i et problem, jeg er bare 2143 01:46:35,773 --> 01:46:39,450 kommer til at markere og kopiere koden Jeg skrev, klippe det og indsætte det op her. 2144 01:46:39,450 --> 01:46:41,370 Og, helt sikkert, vi kunne udtænke nogle scenarier 2145 01:46:41,370 --> 01:46:43,286 hvor én funktion might brug for at ringe til en anden. 2146 01:46:43,286 --> 01:46:46,030 Og du kan bare ikke sætte hver funktion over alle andre. 2147 01:46:46,030 --> 01:46:47,930 >> Så det viser sig at der er en bedre løsning. 2148 01:46:47,930 --> 01:46:50,100 Vi kan forlade dette være. 2149 01:46:50,100 --> 01:46:53,677 Og helt ærligt, det er generelt nice, og praktisk, og godt design 2150 01:46:53,677 --> 01:46:56,760 at sætte vigtigste først, fordi igen, vigtigste ligesom når grønne flag klikkede, 2151 01:46:56,760 --> 01:46:59,027 der er den funktion, bliver udført som standard. 2152 01:46:59,027 --> 01:47:01,110 Så du kan lige så godt sætte det øverst af filen 2153 01:47:01,110 --> 01:47:03,560 så når du eller nogen andet menneske ser på filen 2154 01:47:03,560 --> 01:47:06,360 du ved, hvad der foregår blot ved at læse main først. 2155 01:47:06,360 --> 01:47:15,360 Så det viser sig, kan vi fortælle Dunk proaktivt, hey, Dunk, på linje fire, 2156 01:47:15,360 --> 01:47:17,940 Jeg lover at gennemføre en funktion kaldet Print 2157 01:47:17,940 --> 01:47:22,600 Navn, der tager en streng kaldet navn som input, og returnerer ingenting, ugyldig. 2158 01:47:22,600 --> 01:47:24,770 Og jeg vil komme rundt til gennemføre det senere. 2159 01:47:24,770 --> 01:47:25,680 >> Her kommer Main. 2160 01:47:25,680 --> 01:47:29,130 Main nu på linje 9 kan bruge Print navn fordi Dunk 2161 01:47:29,130 --> 01:47:32,600 er tillid til, at med tiden, det vil støde definitionen 2162 01:47:32,600 --> 01:47:34,880 af gennemførelsen af ​​Print Navn. 2163 01:47:34,880 --> 01:47:37,390 Så efter at redde min fil, så lad mig gå videre og gøre prototype, 2164 01:47:37,390 --> 01:47:38,498 ser godt denne gang. 2165 01:47:38,498 --> 01:47:43,470 Dot skråstreg, prototype, lad mig gå videre og skrive et navn. 2166 01:47:43,470 --> 01:47:48,440 David, hej David, Zamila, hej Zamila, og, ja, nu virker det. 2167 01:47:48,440 --> 01:47:52,200 >> Så ingrediensen her er, at vi har gjort en brugerdefineret funktion, ligesom en brugerdefineret 2168 01:47:52,200 --> 01:47:54,219 Scratch blok vi kalder det. 2169 01:47:54,219 --> 01:47:57,010 Men i modsætning til Scratch hvor du kan bare oprette det og begynde at bruge det, 2170 01:47:57,010 --> 01:47:59,330 nu har vi til at være en lidt mere pedantisk, 2171 01:47:59,330 --> 01:48:03,410 og faktisk tog Dunk at bruge, eller at forvente det. 2172 01:48:03,410 --> 01:48:09,140 Nu, som en sidebemærkning, hvorfor al denne tid har vi været bare blindt på tro herunder 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 >> Tja, det viser sig, blandt et par andre ting, 2175 01:48:15,190 --> 01:48:18,550 alle, der er i dem, dot h filer, som tilfældigvis er filer. 2176 01:48:18,550 --> 01:48:20,460 De er header-filer, så at sige. 2177 01:48:20,460 --> 01:48:23,270 De er stadig skrevet i C. Men de er en anden type fil. 2178 01:48:23,270 --> 01:48:28,690 >> For nu, kan du stort set antage at alt, hvad der er inde i CS50.h 2179 01:48:28,690 --> 01:48:33,360 er nogle one-liners som denne, ikke for funktioner kaldet Print Navn, 2180 01:48:33,360 --> 01:48:36,840 men for Get String, Get Float, og et par andre. 2181 01:48:36,840 --> 01:48:41,510 Og der er lignende prototyper, en liners, inde af standard IO.h 2182 01:48:41,510 --> 01:48:46,241 for printf, som nu er i min egen Print Name funktion. 2183 01:48:46,241 --> 01:48:49,490 Så med andre ord, hele denne gang, vi har netop blevet blindt at kopiere og indsætte 2184 01:48:49,490 --> 01:48:51,780 medtage denne, omfatter at, hvad sker der? 2185 01:48:51,780 --> 01:48:55,310 Det er bare slags spor til klang, hvad funktioner 2186 01:48:55,310 --> 01:49:00,170 er, ja, gennemført, bare andetsteds i forskellige filer 2187 01:49:00,170 --> 01:49:02,440 andetsteds i systemet. 2188 01:49:02,440 --> 01:49:05,160 >> Så vi har implementeret print navn. 2189 01:49:05,160 --> 01:49:07,910 Det har denne bivirkning af trykning noget på skærmen. 2190 01:49:07,910 --> 01:49:10,170 Men det gør faktisk ikke hånd mig noget tilbage. 2191 01:49:10,170 --> 01:49:12,200 Hvordan kan vi gå om gennemførelsen af ​​et program, som 2192 01:49:12,200 --> 01:49:14,510 betyder hånd mig noget tilbage? 2193 01:49:14,510 --> 01:49:15,580 >> Nå, lad os prøve dette. 2194 01:49:15,580 --> 01:49:21,360 Lad mig gå videre og gennemføre en fil kaldet return.c 2195 01:49:21,360 --> 01:49:24,530 så vi kan vise, hvordan noget ligesom Få String, eller Få Int, 2196 01:49:24,530 --> 01:49:27,340 er faktisk vender tilbage noget tilbage til brugeren. 2197 01:49:27,340 --> 01:49:29,840 Lad os gå videre og definere int main tomrum. 2198 01:49:29,840 --> 01:49:33,230 >> Og igen, i fremtiden, vil vi forklare, hvad der int og det tomrum 2199 01:49:33,230 --> 01:49:34,090 er faktisk gør. 2200 01:49:34,090 --> 01:49:35,840 Men for i dag, vil vi tager det for givet. 2201 01:49:35,840 --> 01:49:39,970 Jeg har tænkt mig at gå videre og printf, for en god brugeroplevelse, x er. 2202 01:49:39,970 --> 01:49:44,360 Og så jeg har tænkt mig at vente på bruger til at give mig x med at komme int. 2203 01:49:44,360 --> 01:49:48,459 >> Og så jeg har tænkt mig at gå videre og udskrive x til pladsen. 2204 01:49:48,459 --> 01:49:50,500 Så når du kun har en tastatur, mennesker almindeligt 2205 01:49:50,500 --> 01:49:52,600 bruge lidt gulerod symbol på tastaturet 2206 01:49:52,600 --> 01:49:55,330 at repræsentere til magten af eller eksponent for. 2207 01:49:55,330 --> 01:49:58,960 SOx kvadreret er til stede i. 2208 01:49:58,960 --> 01:50:00,660 >> Og nu vil jeg gøre det. 2209 01:50:00,660 --> 01:50:03,940 Jeg kunne bare do-- hvad der er x kvadreret? x squared er x gange x. 2210 01:50:03,940 --> 01:50:06,690 >> Og det gjorde vi nogle tid siden allerede i dag. 2211 01:50:06,690 --> 01:50:08,730 Dette betyder ikke lyst så meget fremskridt. 2212 01:50:08,730 --> 01:50:09,570 Du ved hvad? 2213 01:50:09,570 --> 01:50:13,100 Lad os udnytte nogle af denne idé fra sidste gang abstraktionsniveau. 2214 01:50:13,100 --> 01:50:16,080 >> Ville det ikke være rart, hvis der er en funktion kaldet 2215 01:50:16,080 --> 01:50:18,460 firkant, der gør netop dette? 2216 01:50:18,460 --> 01:50:20,640 Det stadig, ved udgangen af dag, gør det samme matematik. 2217 01:50:20,640 --> 01:50:22,410 Men lad os abstrakte væk tanken om at tage 2218 01:50:22,410 --> 01:50:25,280 ét nummer multipliceret med en anden, og bare give den et navn, 2219 01:50:25,280 --> 01:50:27,360 kvadratisk denne værdi. 2220 01:50:27,360 --> 01:50:29,560 >> Og, med andre ord, i C, lad os oprette en funktion 2221 01:50:29,560 --> 01:50:32,660 kaldet firkant, der gør netop dette. 2222 01:50:32,660 --> 01:50:34,600 Det kommer til at blive kaldt pladsen. 2223 01:50:34,600 --> 01:50:35,790 Det kommer til at tage en int. 2224 01:50:35,790 --> 01:50:37,820 Og vi vil vil bare kalder det n, som standard. 2225 01:50:37,820 --> 01:50:39,403 >> Men vi kunne kalde det noget, vi ønsker. 2226 01:50:39,403 --> 01:50:42,900 Og alle, at det kommer til at gør, bogstaveligt talt, er afkast 2227 01:50:42,900 --> 01:50:45,810 resultatet af n gange n. 2228 01:50:45,810 --> 01:50:48,980 Men fordi det er returnering noget, som 2229 01:50:48,980 --> 01:50:53,690 er nøgleordet i lilla vi har aldrig set før, jeg, på linje 11, 2230 01:50:53,690 --> 01:50:55,410 kan ikke bare sige ugyldig denne gang. 2231 01:50:55,410 --> 01:51:01,320 >> Void, i eksemplet, vi lige har set snarere af print navn, betyder blot, 2232 01:51:01,320 --> 01:51:02,190 gør noget. 2233 01:51:02,190 --> 01:51:04,170 Men du behøver ikke udlevere mig noget tilbage. 2234 01:51:04,170 --> 01:51:06,790 I dette tilfælde vil jeg have at returnere n gange n, 2235 01:51:06,790 --> 01:51:08,460 eller hvad der er, dette nummer. 2236 01:51:08,460 --> 01:51:12,460 >> Så jeg kan ikke sige, hey, computer, Jeg vender tilbage ingenting, ugyldig. 2237 01:51:12,460 --> 01:51:16,166 Det kommer til at vende tilbage, af natur, en int. 2238 01:51:16,166 --> 01:51:17,790 Og så det er alt, der foregår her. 2239 01:51:17,790 --> 01:51:20,070 >> Indgangen til firkant vil være en int. 2240 01:51:20,070 --> 01:51:24,760 Og så vi kan bruge det, skal det har et navn, N. Det kommer til at output 2241 01:51:24,760 --> 01:51:26,240 en int, der ikke har brug for et navn. 2242 01:51:26,240 --> 01:51:29,590 Vi kan overlade det til main, eller hvem er hjælp mig til at huske denne værdi, hvis vi 2243 01:51:29,590 --> 01:51:31,120 ønsker med sin egen variabel. 2244 01:51:31,120 --> 01:51:33,230 >> Og igen, det eneste nye søgeord her er Return. 2245 01:51:33,230 --> 01:51:34,480 Og jeg er bare laver nogle matematik. 2246 01:51:34,480 --> 01:51:41,825 Hvis jeg virkelig ønskede at være unødvendigt, Jeg kunne sige int produkt får n gange n. 2247 01:51:41,825 --> 01:51:44,170 >> Og så kunne jeg sige, returnere produktet. 2248 01:51:44,170 --> 01:51:47,360 Men igen, at min pointe tidligere af dette bare ikke at være god design-- 2249 01:51:47,360 --> 01:51:50,060 lignende, hvorfor indføre et navn, et symbol, samme vare, 2250 01:51:50,060 --> 01:51:51,570 bare til straks returnere den? 2251 01:51:51,570 --> 01:51:53,670 Det er lidt renere, lidt strammere, så 2252 01:51:53,670 --> 01:51:59,380 at tale, bare for at sige tilbagevenden n gange n, slippe af med denne linje helt. 2253 01:51:59,380 --> 01:52:02,860 >> Og det er bare mindre kode til at læse, mindre mulighed for fejl. 2254 01:52:02,860 --> 01:52:05,180 Og lad os se, om det faktisk arbejder nu. 2255 01:52:05,180 --> 01:52:09,380 Nu, jeg har tænkt mig at gå fremad og foretage tilbagevenden. 2256 01:52:09,380 --> 01:52:11,460 >> Uh-oh, implicitte erklæring af funktionen. 2257 01:52:11,460 --> 01:52:14,080 Jeg lavede denne fejl før, nogen big deal. 2258 01:52:14,080 --> 01:52:18,950 Lad mig bare skrive, eller fremhæve og kopiere, nøjagtig samme funktion prototype, 2259 01:52:18,950 --> 01:52:21,342 eller underskrift, af funktionen heroppe. 2260 01:52:21,342 --> 01:52:22,800 Eller jeg kunne flytte hele funktionen. 2261 01:52:22,800 --> 01:52:23,841 >> Men det er lidt doven. 2262 01:52:23,841 --> 01:52:24,870 Så vi vil ikke gøre det. 2263 01:52:24,870 --> 01:52:27,960 Nu, lad mig gøre tilbagevenden igen, dot skråstreg tilbagevenden. 2264 01:52:27,960 --> 01:52:32,790 >> x 2. x kvadreret er 4. x 3. x kvadreret er 9. 2265 01:52:32,790 --> 01:52:35,300 Og funktionen virker nu til at virke. 2266 01:52:35,300 --> 01:52:36,550 Så hvad er forskellen her? 2267 01:52:36,550 --> 01:52:42,520 Jeg har en funktion, der hedder firkantet, i dette tilfælde, som jeg sætter i en indgang. 2268 01:52:42,520 --> 01:52:43,830 Og jeg kommer tilbage en udgang. 2269 01:52:43,830 --> 01:52:46,210 Og dog, som tidligere, hvis Jeg åbner den anden eksempel 2270 01:52:46,210 --> 01:52:51,640 fra tidligere, som var kaldet prototype.c, 2271 01:52:51,640 --> 01:52:54,770 Jeg havde print navn, som returneret ugyldig, så at sige, 2272 01:52:54,770 --> 01:52:58,730 Eller det returnerede ingenting, og simpelthen havde en bivirkning. 2273 01:52:58,730 --> 01:53:00,230 >> Så hvad sker der her? 2274 01:53:00,230 --> 01:53:03,520 Nå, overveje funktionen få streng for et øjeblik. 2275 01:53:03,520 --> 01:53:06,570 Vi har været ved hjælp af funktionen få strengen på følgende måde. 2276 01:53:06,570 --> 01:53:10,464 >> Vi har haft en funktion får streng, ligesom omfatter CS50.h, 2277 01:53:10,464 --> 01:53:16,624 omfatter standard IO.h, int, vigtigste, ugyldig. 2278 01:53:16,624 --> 01:53:18,790 Og så hver gang jeg har kaldet get streng hidtil, 2279 01:53:18,790 --> 01:53:23,260 Jeg har sagt noget lignende, snor s får få snor, fordi get string-- 2280 01:53:23,260 --> 01:53:27,880 lad os kalde denne get.c-- get streng selv returnerer en streng, som jeg kan derefter 2281 01:53:27,880 --> 01:53:32,050 bruge, og sige, hej, komma, procent s, omvendt skråstreg n, s. 2282 01:53:32,050 --> 01:53:35,660 >> Så dette er det samme eksempel, virkelig, at vi havde tidligere. 2283 01:53:35,660 --> 01:53:37,920 Så få strengen returnerer en værdi. 2284 01:53:37,920 --> 01:53:41,260 Men for et øjeblik siden, print string ikke returnerer en værdi. 2285 01:53:41,260 --> 01:53:42,721 Det har simpelthen en bivirkning. 2286 01:53:42,721 --> 01:53:44,220 Så dette er en grundlæggende forskel. 2287 01:53:44,220 --> 01:53:46,710 Vi har set anderledes typer af funktioner nu, 2288 01:53:46,710 --> 01:53:49,490 hvoraf nogle har returneret værdier, hvoraf nogle ikke. 2289 01:53:49,490 --> 01:53:51,890 Så måske er det streng, eller int eller float. 2290 01:53:51,890 --> 01:53:53,480 Eller måske er det bare ugyldig. 2291 01:53:53,480 --> 01:53:55,710 >> Og forskellen er at disse funktioner, 2292 01:53:55,710 --> 01:53:59,940 få data og returnerer en værdi faktisk bringe noget tilbage til bordet, 2293 01:53:59,940 --> 01:54:01,110 så at sige. 2294 01:54:01,110 --> 01:54:03,710 Så lad os gå videre og se på en sidste sæt 2295 01:54:03,710 --> 01:54:09,129 eksempler, der giver en følelse, nu, af hvordan vi kunne, ja, abstrakt bedre, 2296 01:54:09,129 --> 01:54:11,670 og bedre og bedre, eller mere, og mere og mere, for 2297 01:54:11,670 --> 01:54:13,810 at skrive i sidste ende bedre kode. 2298 01:54:13,810 --> 01:54:16,860 Lad os gå videre, og i den ånd af Scratch, skal du gøre følgende. 2299 01:54:16,860 --> 01:54:21,700 >> Lad mig gå videre og inkludere CS50.h og standard IO.h. 2300 01:54:21,700 --> 01:54:24,010 Lad mig gå videre og give mig selv en int, vigtigste, ugyldig. 2301 01:54:24,010 --> 01:54:27,380 Og lad mig gå videre, kalder dette cough.c. 2302 01:54:27,380 --> 01:54:35,510 >> Og lad mig gå videre og bare ligesom Scratch, udskrive hoste / n. 2303 01:54:35,510 --> 01:54:37,170 Og jeg ønsker at gøre dette tre gange. 2304 01:54:37,170 --> 01:54:39,670 Så jeg selvfølgelig bare at kopiere og indsætte tre gange. 2305 01:54:39,670 --> 01:54:46,440 Jeg vil nu gøre hoste dot skråstreg hoste. 2306 01:54:46,440 --> 01:54:50,120 Lad os give mig lidt mere plads her, Enter, hoste, hoste, hoste. 2307 01:54:50,120 --> 01:54:53,970 >> Der er naturligvis allerede en mulighed for forbedringer. 2308 01:54:53,970 --> 01:54:55,679 Jeg har kopieret og indsat et par gange i dag. 2309 01:54:55,679 --> 01:54:58,261 Men det var kun så jeg gjorde ikke nødt til at skrive så mange tegn. 2310 01:54:58,261 --> 01:55:00,250 Jeg skiftede stadig hvad disse linjer kode er. 2311 01:55:00,250 --> 01:55:04,240 >> Disse tre linjer er identiske, der føles doven og faktisk er, 2312 01:55:04,240 --> 01:55:07,110 og er nok ikke den rigtige fremgangsmåde. 2313 01:55:07,110 --> 01:55:11,029 Så med hvad ingrediens kunne vi forbedre denne kode? 2314 01:55:11,029 --> 01:55:12,570 Vi behøver ikke at kopiere og indsætte koden. 2315 01:55:12,570 --> 01:55:15,070 >> Og, ja, helst du føler selv kopiere og indsætte, 2316 01:55:15,070 --> 01:55:17,700 og ikke engang skiftende kode, odds er der er en bedre måde. 2317 01:55:17,700 --> 01:55:19,470 Og, ja, der er. 2318 01:55:19,470 --> 01:55:22,510 Lad mig gå videre og gøre en for-løkke, selvom syntaksen måske ikke 2319 01:55:22,510 --> 01:55:24,570 kommer naturligt endnu. 2320 01:55:24,570 --> 01:55:29,494 >> Gør dette tre gange, simpelthen ved at gøre following-- 2321 01:55:29,494 --> 01:55:31,160 og jeg tilfældigvis kender det fra praksis. 2322 01:55:31,160 --> 01:55:32,810 Men vi har en række eksempler nu. 2323 01:55:32,810 --> 01:55:34,950 Og du vil se online flere referencer stille. 2324 01:55:34,950 --> 01:55:37,790 >> Dette er syntaksen i linje 6, at meget gerne Scratch, der gentager 2325 01:55:37,790 --> 01:55:40,090 blok, gentag følgende tre gange. 2326 01:55:40,090 --> 01:55:41,340 Det er lidt magisk for nu. 2327 01:55:41,340 --> 01:55:43,050 Men dette vil få mere, og mere velkendte. 2328 01:55:43,050 --> 01:55:45,050 >> Og det kommer til at gentage linje otte tre gange, 2329 01:55:45,050 --> 01:55:52,390 så hvis jeg re-kompilere make hoste, dot skråstreg hoste, hoste, hoste, hoste. 2330 01:55:52,390 --> 01:55:54,030 Det fungerer stadig på samme måde. 2331 01:55:54,030 --> 01:55:55,550 Så det er alt fint og godt. 2332 01:55:55,550 --> 01:55:58,200 Men det er ikke meget indvindes. 2333 01:55:58,200 --> 01:55:59,371 >> Det er fuldstændig korrekt. 2334 01:55:59,371 --> 01:56:01,370 Men det føles som om der kunne være en mulighed, 2335 01:56:01,370 --> 01:56:03,750 som i verden af Scratch, at slags begyndelse 2336 01:56:03,750 --> 01:56:07,530 at tilføje nogle semantik her, så Jeg har ikke bare have nogle for-løkke, 2337 01:56:07,530 --> 01:56:09,867 og en funktion, der siger hoste, eller er hoste. 2338 01:56:09,867 --> 01:56:10,450 Du ved hvad? 2339 01:56:10,450 --> 01:56:12,620 Lad mig prøve at være en lidt køligere end det, 2340 01:56:12,620 --> 01:56:16,090 og faktisk skrive en funktion, har nogle bivirkninger, kalder det hoste. 2341 01:56:16,090 --> 01:56:20,830 >> Og det tager ingen input og returnerer nogen værdi som output. 2342 01:56:20,830 --> 01:56:22,680 Men ved du hvad den gør? 2343 01:56:22,680 --> 01:56:29,370 Det gør denne-- printf, citat Citat slut, hoste. 2344 01:56:29,370 --> 01:56:32,380 >> Og nu her, jeg vil at gå videre og til int, 2345 01:56:32,380 --> 01:56:36,070 Jeg får nul, jeg mindre end 3, i plus plus. 2346 01:56:36,070 --> 01:56:39,770 Jeg har tænkt mig at ikke printf, som er velsagtens en implementering lavt niveau 2347 01:56:39,770 --> 01:56:40,270 detalje. 2348 01:56:40,270 --> 01:56:41,353 Jeg er ligeglad med hvor at hoste. 2349 01:56:41,353 --> 01:56:43,240 Jeg ønsker blot at bruge hoste funktionen. 2350 01:56:43,240 --> 01:56:44,840 Og jeg bare kalde hoste. 2351 01:56:44,840 --> 01:56:46,204 >> Nu, bemærk dikotomi. 2352 01:56:46,204 --> 01:56:49,370 Når du ringer til en funktion, hvis du ikke gør ønsker at give det indgange, helt fint. 2353 01:56:49,370 --> 01:56:51,780 Bare gør åbne paren tæt parentes, og du er færdig. 2354 01:56:51,780 --> 01:56:56,271 >> Når du definerer en funktion, eller erklære en funktion prototype, 2355 01:56:56,271 --> 01:56:58,770 Hvis du på forhånd ved, det er ikke kommer til at tage nogen argumenter, 2356 01:56:58,770 --> 01:57:01,170 sige tomrum i disse parenteser der. 2357 01:57:01,170 --> 01:57:05,660 Og det gør sikker på, at du vil ikke ved et uheld at misbruge det. 2358 01:57:05,660 --> 01:57:07,020 Lad mig gå videre og gøre hoste. 2359 01:57:07,020 --> 01:57:08,540 Og, selvfølgelig, jeg har lavet en fejl. 2360 01:57:08,540 --> 01:57:10,410 >> Dammit, der er at implicit 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 en let rettelse. 2363 01:57:12,590 --> 01:57:18,240 Jeg skal bare have prototypen højere op i min fil, end jeg faktisk bruger det. 2364 01:57:18,240 --> 01:57:20,070 >> Så nu lad mig gøre hoste igen, nice. 2365 01:57:20,070 --> 01:57:20,790 Nu, det fungerer. 2366 01:57:20,790 --> 01:57:22,930 Gør hoste, hoste, hoste, hoste. 2367 01:57:22,930 --> 01:57:25,930 Så du måske tror, ​​at vi er virkelig lige over engineering dette problem. 2368 01:57:25,930 --> 01:57:26,763 Og faktisk er vi. 2369 01:57:26,763 --> 01:57:28,870 Dette er ikke en god kandidat for et program 2370 01:57:28,870 --> 01:57:31,930 i øjeblikket for refactoring, og gør, hvad der er 2371 01:57:31,930 --> 01:57:35,645 kaldes hierarkisk nedbrydning, hvor du tager noget kode, og derefter 2372 01:57:35,645 --> 01:57:38,790 du slags faktor ting ud, så som at tilskrive flere semantik til dem, 2373 01:57:38,790 --> 01:57:40,930 og genbruge det i sidste ende længere sigt. 2374 01:57:40,930 --> 01:57:43,490 Men det er en byggesten i retning mere sofistikerede programmer 2375 01:57:43,490 --> 01:57:45,600 at vi starter skriver inden længe at 2376 01:57:45,600 --> 01:57:50,090 tillader os at have ordforråd med til at skrive bedre kode. 2377 01:57:50,090 --> 01:57:52,920 Og, ja, lad os se om vi kan ikke generalisere dette yderligere. 2378 01:57:52,920 --> 01:57:57,984 >> Det virker en smule halt, at jeg, vigtigste, behøver at bekymre dig om dette darn for løkke, 2379 01:57:57,984 --> 01:57:59,400 og kalder hoste igen og igen. 2380 01:57:59,400 --> 01:58:03,050 Hvorfor kan jeg ikke bare fortælle hoste, bedes hoste tre gange? 2381 01:58:03,050 --> 01:58:08,170 Med andre ord, kan ikke, hvorfor jeg bare giver input til at hoste og gøre det? 2382 01:58:08,170 --> 01:58:11,270 >> Hvorfor kan jeg ikke bare sige, i vigtigste hoste tre gange. 2383 01:58:11,270 --> 01:58:13,150 Og nu, det er lidt magisk. 2384 01:58:13,150 --> 01:58:14,540 Det er meget iterativ her. 2385 01:58:14,540 --> 01:58:15,940 Og det er, ja, en baby skridt. 2386 01:58:15,940 --> 01:58:19,250 >> Men kun evnen til at sige på linje otte, hoste tre gange, 2387 01:58:19,250 --> 01:58:20,730 det er bare så meget mere læsbar. 2388 01:58:20,730 --> 01:58:24,210 Og, plus, jeg behøver ikke at vide eller pleje hvordan hoste er implementeret. 2389 01:58:24,210 --> 01:58:26,460 Og faktisk senere i sigt og for de endelige projekter, 2390 01:58:26,460 --> 01:58:29,150 hvis du tackle et projekt med en klassekammerat eller to klassekammerater, 2391 01:58:29,150 --> 01:58:32,370 vil du indse, at du kommer til at nødt til, eller vil, opdele arbejdet. 2392 01:58:32,370 --> 01:58:34,650 >> Og du vil ønsker at beslutte på forhånd, hvem der kommer til at gøre hvad, 2393 01:58:34,650 --> 01:58:35,483 og i hvilke stykker? 2394 01:58:35,483 --> 01:58:37,520 Og ville det ikke være rart Hvis du, for eksempel, 2395 01:58:37,520 --> 01:58:40,100 tage ansvaret for at skrive vigtigste, gjort. 2396 01:58:40,100 --> 01:58:43,470 Og din værelseskammerat, eller din partner mere generelt, 2397 01:58:43,470 --> 01:58:45,230 tager sig af gennemførelsen af ​​hoste. 2398 01:58:45,230 --> 01:58:49,540 >> Og denne opdeling, disse vægge af abstraktion, 2399 01:58:49,540 --> 01:58:52,310 eller lag af abstraktion, hvis du vil, er super stærk, 2400 01:58:52,310 --> 01:58:55,480 fordi især for større, mere komplekse programmer og systemer, 2401 01:58:55,480 --> 01:59:00,070 det tillader flere folk til at bygge ting sammen, og i sidste ende 2402 01:59:00,070 --> 01:59:02,680 sy deres arbejde sammen på denne måde. 2403 01:59:02,680 --> 01:59:05,332 Men selvfølgelig, vi nødt til nu reparere hoste. 2404 01:59:05,332 --> 01:59:07,290 Vi er nødt til at fortælle hoste at, hey, ved du hvad? 2405 01:59:07,290 --> 01:59:11,230 Du vil få brug for at tage en input-- så ikke ugyldig, men int og nu. 2406 01:59:11,230 --> 01:59:15,170 Lad os gå videre og sætte i hoste int. Jeg får nul. 2407 01:59:15,170 --> 01:59:16,890 >> i er mindre end hvor mange gange. 2408 01:59:16,890 --> 01:59:18,550 Jeg sagde tre før. 2409 01:59:18,550 --> 01:59:20,420 Men det er ikke hvad jeg vil. 2410 01:59:20,420 --> 01:59:25,520 Jeg ønsker hoste skal generaliseres til støtte enhver antal iterationer. 2411 01:59:25,520 --> 01:59:28,800 >> Så, ja, det er n, som jeg ønsker, hvad brugeren fortæller mig. 2412 01:59:28,800 --> 01:59:31,620 Nu kan jeg gå videre og sige print hoste. 2413 01:59:31,620 --> 01:59:34,750 Og uanset hvad nummer brugeren passerer, 2414 01:59:34,750 --> 01:59:36,890 Jeg vil gentage, at mange gange. 2415 01:59:36,890 --> 01:59:39,160 >> Så ved slutningen af ​​dagen, Programmet er identiske. 2416 01:59:39,160 --> 01:59:42,820 Men bemærke alt det her kunne endda være i en anden fil. 2417 01:59:42,820 --> 01:59:45,620 Faktisk ved jeg ikke på det øjeblik, hvor printf er implementeret. 2418 01:59:45,620 --> 01:59:47,980 >> Jeg ved ikke, i det øjeblik, hvordan får snor, eller få int, eller få float 2419 01:59:47,980 --> 01:59:48,646 gennemføres. 2420 01:59:48,646 --> 01:59:50,930 Og jeg ønsker ikke at se dem på min skærm. 2421 01:59:50,930 --> 01:59:55,320 Som det er, er jeg begyndt at fokusere på mit program, ikke disse funktioner. 2422 01:59:55,320 --> 01:59:59,070 >> Og så, ja, så snart du begynde factoring kode som denne ud, 2423 01:59:59,070 --> 02:00:01,397 kunne vi endda flytte hoste til en separat fil? 2424 02:00:01,397 --> 02:00:02,730 En anden kunne gennemføre den. 2425 02:00:02,730 --> 02:00:06,810 Og dig og dit program bliver meget smuk, og meget læsbar, 2426 02:00:06,810 --> 02:00:10,830 velsagtens, virkelig fire line program lige der. 2427 02:00:10,830 --> 02:00:13,510 >> Så lad os gå videre nu og gøre endnu ændring. 2428 02:00:13,510 --> 02:00:16,180 Bemærk, at min prototype skal ændres op toppen. 2429 02:00:16,180 --> 02:00:18,390 Så lad mig ordne, at så Jeg kan ikke få råbte på. 2430 02:00:18,390 --> 02:00:22,580 >> Lav hoste, lad mig køre hoste en gang mere, stadig gør det samme. 2431 02:00:22,580 --> 02:00:26,010 Men nu, bemærker vi har en ingrediens til en endelig udgave. 2432 02:00:26,010 --> 02:00:26,940 Du ved hvad? 2433 02:00:26,940 --> 02:00:29,040 Jeg ønsker ikke at bare hoste, nødvendigvis. 2434 02:00:29,040 --> 02:00:30,802 Jeg vil gerne have noget mere generelt. 2435 02:00:30,802 --> 02:00:31,510 Så ved du hvad? 2436 02:00:31,510 --> 02:00:32,450 Jeg ønsker at gøre dette. 2437 02:00:32,450 --> 02:00:37,140 Jeg vil gerne have, meget gerne Scratch gør, indflydelse blok, men ikke bare 2438 02:00:37,140 --> 02:00:38,680 sige noget nogle antal gange. 2439 02:00:38,680 --> 02:00:41,510 Jeg vil have det til at sige en meget specifik streng. 2440 02:00:41,510 --> 02:00:43,850 Og derfor gør jeg ikke ønsker det bare sige hoste. 2441 02:00:43,850 --> 02:00:47,660 Jeg vil have det til at sige, hvad streng føres ind. 2442 02:00:47,660 --> 02:00:49,960 >> Så mærke, jeg har generaliseret dette, så nu 2443 02:00:49,960 --> 02:00:53,110 sige føles et godt navn for dette, ligesom Scratch, 2444 02:00:53,110 --> 02:00:55,530 tager to argumenter, i modsætning 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 skifte dem. 2448 02:00:58,130 --> 02:01:00,713 Jeg bare lidt ligesom ideen om sige snoren først, og derefter 2449 02:01:00,713 --> 02:01:01,940 hvor mange gange senere. 2450 02:01:01,940 --> 02:01:03,970 Void betyder det stadig vender ikke tilbage noget. 2451 02:01:03,970 --> 02:01:06,428 Disse er blot visuel side effekter, ligesom med [? Jordan,?] 2452 02:01:06,428 --> 02:01:08,240 en verbal bivirkning af råben. 2453 02:01:08,240 --> 02:01:12,630 Det gør stadig noget n gange, 0 op til, men ikke lig med n. 2454 02:01:12,630 --> 02:01:14,540 Det betyder n total tider. 2455 02:01:14,540 --> 02:01:16,540 Og så bare udskrive hvad det så streng er. 2456 02:01:16,540 --> 02:01:19,060 Så jeg har virkelig generaliseret denne linje kode. 2457 02:01:19,060 --> 02:01:22,460 Så nu, hvordan implementerer jeg hoste funktion? 2458 02:01:22,460 --> 02:01:25,520 >> Jeg kan gøre ugyldig hoste. 2459 02:01:25,520 --> 02:01:28,501 Og jeg kan stadig tage på, hvordan mange gange, du ønsker at hoste. 2460 02:01:28,501 --> 02:01:29,250 Men ved du hvad? 2461 02:01:29,250 --> 02:01:31,240 Jeg kan nu punt at sige. 2462 02:01:31,240 --> 02:01:36,540 >> Jeg kan ringe sige med Ordet hoste, passerer i n. 2463 02:01:36,540 --> 02:01:40,410 Og hvis jeg vil også gennemføre, bare for sjov, et nys funktion, 2464 02:01:40,410 --> 02:01:42,290 Jeg kan nyse nogle antal gange. 2465 02:01:42,290 --> 02:01:47,300 Og jeg kan holde genbruge n, fordi Bemærk at m i denne forbindelse eller omfang 2466 02:01:47,300 --> 02:01:49,470 eksisterer kun inden for denne funktion. 2467 02:01:49,470 --> 02:01:52,767 >> Og n i denne sammenhæng kun eksisterer inden denne funktion her. 2468 02:01:52,767 --> 02:01:54,600 Så vi vil vende tilbage til disse spørgsmål til omfang. 2469 02:01:54,600 --> 02:02:01,160 Og her, jeg vil bare sige, Achoo, og derefter n gange, semikolon. 2470 02:02:01,160 --> 02:02:04,340 >> Og nu, jeg skal bare låne disse funktioner underskrifter heroppe. 2471 02:02:04,340 --> 02:02:06,290 Så hoste er korrekt. 2472 02:02:06,290 --> 02:02:10,090 Void nys er korrekt nu. 2473 02:02:10,090 --> 02:02:12,390 >> Og jeg stadig bare brug sige. 2474 02:02:12,390 --> 02:02:18,990 Så jeg har tænkt mig at sige, sige string s, int n, semikolon. 2475 02:02:18,990 --> 02:02:22,010 Så jeg har over-manipuleret dælen ud af dette program. 2476 02:02:22,010 --> 02:02:23,760 >> Og dette ikke nødvendigvis, det er 2477 02:02:23,760 --> 02:02:26,343 hvad du skal gøre, når du skriver selv de enkleste af programmer. 2478 02:02:26,343 --> 02:02:29,280 Tag noget, der er tydeligvis virkelig simpelt, meget kort, 2479 02:02:29,280 --> 02:02:31,800 og re-implementere det hjælp alt for meget kode. 2480 02:02:31,800 --> 02:02:34,560 Men du vil faktisk se, og i tid se tilbage på disse eksempler, 2481 02:02:34,560 --> 02:02:38,610 og indse, åh, det er de trin vi tog til rent faktisk at generalisere, 2482 02:02:38,610 --> 02:02:40,797 at faktor noget ud, indtil slutningen af ​​dagen 2483 02:02:40,797 --> 02:02:42,380 min kode er faktisk temmelig rimelig. 2484 02:02:42,380 --> 02:02:45,960 Fordi hvis jeg ønsker at hoste tre gange så nyse tre gange, 2485 02:02:45,960 --> 02:02:50,420 Jeg vil blot køres igen dette, Programmet gør hoste, og kø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 grundlæggende paradigme, hvis du vil, 2488 02:02:55,990 --> 02:03:00,110 for, hvordan vi måske gå om faktisk at gennemføre et program. 2489 02:03:00,110 --> 02:03:03,220 Men lad os bare se nu, hvad det er Vi har gjort alt dette tid, 2490 02:03:03,220 --> 02:03:06,940 og hvad nogle af de sidste brikker står bag denne enkle kommando. 2491 02:03:06,940 --> 02:03:09,620 I slutningen af ​​dagen, har vi brugt Dunk som vores compiler. 2492 02:03:09,620 --> 02:03:11,494 Vi har været at skrive kilde kode, konvertere den 2493 02:03:11,494 --> 02:03:12,820 via Dunk til maskinkode. 2494 02:03:12,820 --> 02:03:15,540 >> Og vi har brugt Make bare at lette vores tastetryk så 2495 02:03:15,540 --> 02:03:20,740 at vi ikke behøver at huske disse besværgelser af Dunk selv. 2496 02:03:20,740 --> 02:03:22,640 Men hvad er Make faktisk gør? 2497 02:03:22,640 --> 02:03:24,750 Og til gengæld, hvad der er Dunk faktisk gør? 2498 02:03:24,750 --> 02:03:28,790 >> Det viser sig, selvom vi har forenklet dagens diskussion ved at sige, 2499 02:03:28,790 --> 02:03:33,090 du tager kildekoden, passerer det som input til en compiler, som giver dig 2500 02:03:33,090 --> 02:03:35,750 produktion af maskinen kode, viser sig at der er 2501 02:03:35,750 --> 02:03:37,420 et par forskellige skridt inde der. 2502 02:03:37,420 --> 02:03:41,940 Og kompilering sker for at være paraply betegnelse for en hel masse trin. 2503 02:03:41,940 --> 02:03:43,970 Men lad os bare drille dette ud virkelig hurtigt. 2504 02:03:43,970 --> 02:03:48,070 >> Det viser sig, at vi har gjort flere ting hver gang jeg kø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 her-- noget i et C-program, 2507 02:03:55,020 --> 02:03:58,720 som vi vil se igen og igen, der starter med dette hash symbol, 2508 02:03:58,720 --> 02:04:03,320 eller hashtag symbolet her, betyder det er en præprocessor direktiv. 2509 02:04:03,320 --> 02:04:07,330 Det betyder i dette tilfælde, hey computer, gøre noget med denne fil 2510 02:04:07,330 --> 02:04:09,430 før du rent faktisk kompilere min egen kode. 2511 02:04:09,430 --> 02:04:15,220 >> I dette tilfælde, hash omfatte, er, væsentlige, C måde at sige, 2512 02:04:15,220 --> 02:04:19,325 hey computer, gå få indholdet af CS50.h og indsætte dem her. 2513 02:04:19,325 --> 02:04:22,170 Hey computer, gå få indholdet af standard IO.h, 2514 02:04:22,170 --> 02:04:24,690 uanset hvor det er på harddisk, indsæt den her. 2515 02:04:24,690 --> 02:04:27,390 Så disse ting sker først under forbehandlingsfasen. 2516 02:04:27,390 --> 02:04:28,880 >> Og Dunk gør alt dette for os. 2517 02:04:28,880 --> 02:04:30,510 Og det gør det så pokkers hurtigt, ikke gøre dig selv 2518 02:04:30,510 --> 02:04:32,000 se fire forskellige ting, der sker. 2519 02:04:32,000 --> 02:04:34,100 Men det er den første af disse trin. 2520 02:04:34,100 --> 02:04:35,560 >> Hvad der rent faktisk sker der nu? 2521 02:04:35,560 --> 02:04:38,320 Nå, den næste officielle trin er kompilering. 2522 02:04:38,320 --> 02:04:40,385 Og det viser sig, at udarbejdelse af et program 2523 02:04:40,385 --> 02:04:44,060 teknisk betyder at gå fra kildekode, de ting vi har 2524 02:04:44,060 --> 02:04:47,890 været at skrive i dag, til noget kaldet forsamling kode, noget 2525 02:04:47,890 --> 02:04:49,260 der ser lidt anderledes. 2526 02:04:49,260 --> 02:04:51,050 >> Og i virkeligheden, kan vi se dette virkelig hurtigt. 2527 02:04:51,050 --> 02:04:53,890 Lad mig faktisk gå ind i min IDE. 2528 02:04:53,890 --> 02:04:58,050 Lad mig gå videre og åbne hello.c, som er det allerførste program, som vi 2529 02:04:58,050 --> 02:04:59,120 begyndte i dag. 2530 02:04:59,120 --> 02:05:04,130 Og lad mig gå videre og køre Dunk en lidt anderledes, Dunk-s, hello.c, 2531 02:05:04,130 --> 02:05:07,720 der rent faktisk vil give mig en anden fil hello.s. 2532 02:05:07,720 --> 02:05:10,330 >> Og vi vil formentlig aldrig igen se denne form for kode. 2533 02:05:10,330 --> 02:05:13,030 Hvis du tager et lavere niveau systemer klasse som CS61, 2534 02:05:13,030 --> 02:05:14,920 du vil se meget mere af denne slags kode. 2535 02:05:14,920 --> 02:05:17,020 Men det er assembler. 2536 02:05:17,020 --> 02:05:22,050 Dette er X86 assembler at CPU'en, der ligger til grund 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 som den gør se, det er noget 2539 02:05:27,060 --> 02:05:29,180 computeren forstår temmelig godt. 2540 02:05:29,180 --> 02:05:30,790 Sub q, er dette en subtraktion. 2541 02:05:30,790 --> 02:05:31,660 Der er bevægelser. 2542 02:05:31,660 --> 02:05:35,730 >> Der ringer af funktioner her, x ORING, en bevægelse, en add, et pop, 2543 02:05:35,730 --> 02:05:36,430 en tilbagevenden. 2544 02:05:36,430 --> 02:05:38,850 Så der er nogle meget instruktioner lavt niveau 2545 02:05:38,850 --> 02:05:41,280 at CPU'er forstå, at Jeg hentydet til tidligere. 2546 02:05:41,280 --> 02:05:43,100 Det er, hvad Intel Inside. 2547 02:05:43,100 --> 02:05:45,030 >> Der er mønstre af nuller og ettaller, der 2548 02:05:45,030 --> 02:05:51,800 kort til disse arcanely formuleret, men noget godt navngivet, instruktion, 2549 02:05:51,800 --> 02:05:52,780 så at sige. 2550 02:05:52,780 --> 02:05:54,780 Det er, hvad der sker, når du kompilere din kode. 2551 02:05:54,780 --> 02:05:58,560 Du får samling sprog ud af det, som 2552 02:05:58,560 --> 02:06:04,680 betyder det tredje skridt er at samle at montering kode i sidste ende, 2553 02:06:04,680 --> 02:06:09,080 maskine code-- nuller og ettaller, ikke de tekst, som vi lige har set et øjeblik siden. 2554 02:06:09,080 --> 02:06:13,370 >> Så forbehandling betyder det finde og erstatte, og et par andre ting. 2555 02:06:13,370 --> 02:06:16,430 Kompilering tager din kilde kode fra C, kildekode 2556 02:06:16,430 --> 02:06:18,980 at vi skrev, at samlingen kode, som vi bare kiggede på. 2557 02:06:18,980 --> 02:06:22,170 Montering tager at montering kode til nuller og ettaller 2558 02:06:22,170 --> 02:06:24,680 at CPU'en virkelig vil forstå ved udgangen af ​​dagen. 2559 02:06:24,680 --> 02:06:27,630 Og forbinder er det sidste trin det sker for os-- igen, 2560 02:06:27,630 --> 02:06:29,830 så hurtigt vi ikke selv notice-- der siger, 2561 02:06:29,830 --> 02:06:32,460 hey computer, tage alle de nuller og ettaller, der 2562 02:06:32,460 --> 02:06:36,750 skyldes kompilere Davids kode, og hans vigtigste funktion i dette tilfælde. 2563 02:06:36,750 --> 02:06:39,160 >> Og hey computer, gå få alle de nuller og ettaller 2564 02:06:39,160 --> 02:06:42,180 at CS50 personale skrev inde i CS50 bibliotek. 2565 02:06:42,180 --> 02:06:43,440 Bland dem i med Davids. 2566 02:06:43,440 --> 02:06:46,648 Og hey computer, gå få alle de nuller og dem, at en anden skrev år 2567 02:06:46,648 --> 02:06:47,470 siden til printf. 2568 02:06:47,470 --> 02:06:49,880 Og tilføje dem ind i hele, så vi har 2569 02:06:49,880 --> 02:06:52,870 fik mine nuller og ettaller, den CS50 personalets nuller og ettaller, 2570 02:06:52,870 --> 02:06:55,370 printf nuller og ettaller, og noget andet vi bruger. 2571 02:06:55,370 --> 02:07:00,410 >> De har alle bliver samlet sammen til én program kaldet, i dette tilfælde, hej. 2572 02:07:00,410 --> 02:07:03,141 Så fra nu af, vil vi blot bruge ordet kompilering. 2573 02:07:03,141 --> 02:07:06,390 Og vi vil tage for givet, at når vi siger, kompilere dit program, det betyder, 2574 02:07:06,390 --> 02:07:08,849 hey gøre forbehandling, samling, og forbinder. 2575 02:07:08,849 --> 02:07:11,890 Men der er faktisk nogle saftige ting foregår der under kølerhjelmen. 2576 02:07:11,890 --> 02:07:13,723 Og især hvis du få nysgerrige nogen tid, 2577 02:07:13,723 --> 02:07:15,900 du kan begynde at stikke rundt på dette lavere niveau. 2578 02:07:15,900 --> 02:07:19,660 Men for nu, indser, at blandt grillbarer til i dag 2579 02:07:19,660 --> 02:07:23,420 er ganske enkelt den begyndelsen af ​​en proces, 2580 02:07:23,420 --> 02:07:26,700 for at få komfortable med noget som hej verden. 2581 02:07:26,700 --> 02:07:29,575 Det meste af det, vi gjorde i dag vil bestemt ikke synke i super hurtigt. 2582 02:07:29,575 --> 02:07:31,491 Og det vil tage nogle tid, og nogle praksis. 2583 02:07:31,491 --> 02:07:33,864 Og odds er, vil du sortere af ønsker at ramme dit tastatur 2584 02:07:33,864 --> 02:07:34,780 eller råbe på skærmen. 2585 02:07:34,780 --> 02:07:35,880 Og alt det er OK. 2586 02:07:35,880 --> 02:07:38,320 Men, måske forsøge ikke at gør det i biblioteket så meget. 2587 02:07:38,320 --> 02:07:40,820 >> Og i sidste ende, vil du være i stand til selv, at starte 2588 02:07:40,820 --> 02:07:44,580 se mønstre, både i god kode at du har skrevet, og i fejl 2589 02:07:44,580 --> 02:07:45,370 at du har foretaget. 2590 02:07:45,370 --> 02:07:48,965 Og meget gerne processen med blive en TF eller en CA er ligesom, 2591 02:07:48,965 --> 02:07:51,590 vil du begynde at få det bedre og bedre til at se de mønstre, 2592 02:07:51,590 --> 02:07:53,774 og bare løse dit egne problemer i sidste ende. 2593 02:07:53,774 --> 02:07:56,940 I mellemtiden vil der være masser af os til at låne dig støtte, og få dig 2594 02:07:56,940 --> 02:07:57,481 gennem denne. 2595 02:07:57,481 --> 02:07:59,450 Og i opskrivninger for alle problemerne 2596 02:07:59,450 --> 02:08:01,366 vil du blive guidet gennem alle kommandoerne 2597 02:08:01,366 --> 02:08:05,330 at jeg helt sikkert kender fra en masse praksis nu, 2598 02:08:05,330 --> 02:08:07,380 men måske har fløjet over hovedet for nu. 2599 02:08:07,380 --> 02:08:08,580 Og det er helt fint. 2600 02:08:08,580 --> 02:08:11,230 >> Men i sidste ende, er du nødt at begynde at se mønstre dukke op. 2601 02:08:11,230 --> 02:08:14,260 Og når du kommer forbi alle de dumme detaljer, ligesom parenteser, 2602 02:08:14,260 --> 02:08:16,710 og krøllede parenteser, og semikolon, og de ting, helt ærligt, 2603 02:08:16,710 --> 02:08:19,360 det er slet ikke intellektuelt interessant. 2604 02:08:19,360 --> 02:08:22,690 Og det er ikke formålet med tager nogen indledende klasse. 2605 02:08:22,690 --> 02:08:24,410 Det er de ideer, der kommer til at noget. 2606 02:08:24,410 --> 02:08:26,659 >> Det er løkkerne, og betingelser, og de funktioner, 2607 02:08:26,659 --> 02:08:30,552 og stærkere indvinding, og factoring af koden, 2608 02:08:30,552 --> 02:08:33,510 og godt design, og den gode stil, og i sidste ende rigtigheden 2609 02:08:33,510 --> 02:08:37,330 af din kode, det er i sidste ende vil sagen mest. 2610 02:08:37,330 --> 02:08:40,925 Så næste uge, vil vi tage disse idéer, som vi først så i Scratch 2611 02:08:40,925 --> 02:08:42,800 og har nu oversat til C. Og vi vil begynde 2612 02:08:42,800 --> 02:08:45,740 at indføre den første af de kursets virkelige verden domæner. 2613 02:08:45,740 --> 02:08:50,140 >> Vi fokuserer på verden af ​​sikkerhed, og mere specifikt kryptografi, 2614 02:08:50,140 --> 02:08:51,980 kunsten scrambling information. 2615 02:08:51,980 --> 02:08:54,000 Og blandt de første problemer man selv 2616 02:08:54,000 --> 02:08:56,840 vil komme til at skrive ud leger med nogle af syntaksen 2617 02:08:56,840 --> 02:08:59,880 og løse nogle logiske problemer, i sidste ende inden længe, 2618 02:08:59,880 --> 02:09:03,960 er til rent faktisk at forvrænge eller kryptere, og i sidste ende dekryptere information. 2619 02:09:03,960 --> 02:09:06,470 Og alt, hvad vi har gjort dag, vil forholdsvis lav 2620 02:09:06,470 --> 02:09:09,190 niveau, er bare at tillade os at tage én, og én, 2621 02:09:09,190 --> 02:09:13,550 og endnu et skridt ovenfor retning skrive den mest interessante kode endnu. 2622 02:09:13,550 --> 02:09:15,050 >> Så mere om det i næste uge. 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 >> -Hvad Kan du fortælle mig om sidste gang du så ham? 2627 02:09:22,006 --> 02:09:26,041 2628 02:09:26,041 --> 02:09:27,040 -Hvad Kan jeg sige, virkelig? 2629 02:09:27,040 --> 02:09:30,500 2630 02:09:30,500 --> 02:09:35,340 Jeg mener, det var ligesom alle andre pre-produktion generalprøve, 2631 02:09:35,340 --> 02:09:40,510 medmindre der var noget, han sagde til allersidst, der stak med mig. 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 snit alle, stort stykke arbejde på generalprøven. 2636 02:09:52,190 --> 02:09:53,070 >> -Det Frokost? 2637 02:09:53,070 --> 02:09:54,986 >> -Ja, Du og jeg kan snuppe en sandwich i en bit. 2638 02:09:54,986 --> 02:09:58,380 Lad mig blot debriefing med David virkelig hurtigt. 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 AFSPIL]