[Powered by Google Translate] DAVID J. Malan: Okay, det er CS50, og det er slutningen af ​​uge 1, så undersøgelse kort er i og det samlede antal klassekammerater, at du har dette år er 745. Og vi er så glade for at have så mange af jer i løbet dette semester, men selvom dette kursus er så stort, indse, at det er disse ting som fredag ​​frokoster, ligesom kontortid, 15-personers sektioner og så videre, at er virkelig meningen at skabe denne mere intime miljø. Så selv om vi måske samle en gang eller to gange om ugen, her i Sanders, ved, at meget af din erfaring på dette kursus vil meget være hands-on på siden af ​​dine klassekammerater og underviserne. Så her vi går, Fall 2012. Så minde om, at sidste gang, vi endte på et notat af upræcist, taler om repræsentation af tal. Og vi kiggede på en af ​​de fejl, der skete i virkelige verden, når det kom til misforståelse hvordan computere fungerer. Nå, i dag vil vi gense en anden af ​​disse ideer samt fortsætte vores diskussion af CS50 klient og C og hvad det betyder egentlig at programmere. Men først lige et par hvirvelvind annonceringer. Sektioner begynder denne søndag, og den første uge er altid en lidt af en hurtig start, fordi vi har lige fået i din afdeling formularer. Vi gør det samme, nu med undervisningen stipendiater, nu at de kender deres tidsplaner, så vi sigter, ved Lørdag morgen, for at følge op med dig med din afdeling opgave og TF. Erkend, at de vil starte næste dag, søndag eller mandag eller tirsdag. Og så vil vi rumme afsnit ændringer, som de opstår i de kommende dage. Kontortid, i mellemtiden, er, igen, i aften, 8 PM til 11, Annenberg, samt i morgen aften. Selvom problemet sæt skyldes generelt om torsdagen ved middagstid, indser du har op til fem sene dage at tilbringe, dermed tilgængeligheden for kontortid om torsdagen, hvis du kontanter i en af ​​disse sene dage og dermed indsende noget på fredag. Lad mig foreslå, at Scratch er blandt de sjovere, blandt mere lav centrale problem sæt. Og jeg vil hænge på de sene dage, strategisk, bare til senere i det semester, hvor livet begynder at komme i vejen med midterms og andre klasser. Problem Set 1, i mellemtiden ville blive lagt ud på kursets website denne fredag, som det vil være på kurset gang gennem video, som vil blive filmet på 2:30 PM på fredag og derefter lagt online ved den næste dag. Så vi endte på mandag. Jeg vil gerne - faktisk, man bemærke her. Fordi klasser - fordi Sanders ikke ligefrem egner sig til afslappet Q & A frem og tilbage frygtelig godt, vi er vil prøve noget lidt nyt i år, hvorved hvis du ikke er behageligt at hæve din hånd, eller du bare ville hellere ikke hæve din hånd i et rum som dette, vi skal have nogle af de pædagogiske stipendiater og CA bemanding cs50.net/discuss under forelæsning. Så hvis du har et spørgsmål, fordi jeg var helt uklart om noget eller du er nysgerrig om nogle emne, kan du prøve udstationering det der. Tag den med en etiket af Forelæsning, og vi vil gøre vores bedste i dag og i næste uge - we'll prøve dette - at området det enten elektronisk, online, eller hvis det føles som om vi skulle virkelig behandle det i massevis, en af ​​de pædagogiske stipendiater eller CA'er vil hæve deres hånd og bede anonymt på dine vegne. Så vi vil give det en chance og se, hvor godt det virker. Men, med alle midler, fortsætte med at hæve hænder, som du ønsker. Så sidste gang vi viste, at 10% eller en tiendedel ikke er i kendsgerning, 0,1, ligesom du er blevet instrueret mange år siden. Det er i virkeligheden en værdi som dette. Men det er ikke helt sandt, ikke? Vi har bare denne begrænsning i computere, hvorved, hvis du har kun en begrænset mængde hukommelse, RAM eller flere specifikt bits, ja, der er kun et begrænset antal af ting, du kan repræsentere. For eksempel har vi, hvis vi har tallet nul, og ønsker at repræsenterer i binær under anvendelse af otte bits, hvis en smule, igen, er et nul eller én, vi måske repræsentere det som 00000000. Og det er lidt unødigt detaljeret. Ligesom i den decimal system i den virkelige verden, generelt, hvis du ønsker at skrive nummeret 123, vi mennesker sandsynligvis ikke skrive 00000123, selv om funktionelt, det er nøjagtig samme nummer. Vi har lige droppe nuller, så at sige. I binær, kan vi gøre det samme. Binær og nul, nul og binære er bare nul. Du behøver kun en enkelt bit. Men igen, den mest almindelige måleenhed i verden af computing er bytes, otte bits. Bare fordi en bit, temmelig ubrugelig. Otte bits, ikke frygtelig nyttige, men mindst det er mere anvendelig end en enkelt måleenhed. Så med otte bits, vil vi typisk repræsentere binære. Så her har vi numrene nul, et, to, og derefter, som Nate gjorde i vores video sidste onsdag, kan vi fortsætte tælle op til syv, til otte. Og så hvis vi bruger flere og flere bits, vi kan tælle op til uendeligt. Men hvis du kun har et begrænset antal af disse bits, som er tilfældet i ethvert computersystem, eller endog missil system, ja, ja du kun har et endelig mængde præcision. Så hvis du ønsker at repræsentere tal som 0,1, godt, computer har at vælge og vrage. Og hvis det kun har et begrænset antal numre det kan repræsenterer, kan det komme tæt på 0,1 for dig, men det kan ikke nødvendigvis giver dig præcis den værdi, du ønsker. Og det er blot en af ​​de udfordringer, computere, under hætten. heldigvis Efterhånden som vi bevæger længere i semestret, disse lavere niveau detaljer bliver meget mindre interessant, men helt sikkert anvendelse af disse ideer kan have nogle meget virkelige verden forgreninger. Den ene er en smule sjov. Hvor mange af jer har set den fantastiske film Office Space? Hvis du ikke har, det er din uofficielle lektier for ugen. Men i Office Space, tage stipendiater i den film Fordelen ved netop denne idé, men de faktisk stjal det fra en anden film, som du måske har set, lige år forud. Så lad mig give dig et par sekunder af denne trailer fra denne fantastiske film, og det er meget fagligt relevant. [SPILLER MOVIE] Faktisk Jeg bliver forfremmet. Jeg kan programmere en virus, der vil rippe at placere off big tid. Nå, hvordan virker det? Hver gang der er en bank transaktion, hvor interessen er beregnede, der er tusindvis om dagen, computeren ender med disse brøkdele af et cent. Men jeg har ikke tænkt mig at gøre noget ulovligt. Ulovligt? Samir, det er Amerika. Du er nødt til at sværge til Gud. Hvis ingen kender dette, men os, okay? Ingen familiemedlemmer, ingen veninder, ingen. [Uhørlig]. Bare rolig, mand, jeg vil ikke sige det til nogen enten. [Filmen slutter] Okay, så måske jeg fandt denne film bedre end de fleste mennesker her, men under alle omstændigheder, virus, at de var forsøger at skabe - og i film, når som helst de ville kalde noget en virus, Det er generelt ikke en egentlig virus. Det er bare et program, at nogen skrev at gøre noget. Og i dette tilfælde blev de fyre forsøger at skrive et program der benyttede sig af deres firma kaldet Innotech s computing system, hvor computere, også selv når det kommer til penge, kan ikke nødvendigvis repræsenterer penge præcist. Så selvom du måske har $ 0,10 på din bankkonto, 0,10, godt, kan computeren rent faktisk tror, ​​at du har så mange cents i din bankkonto. Og hvad så disse fyre der ønsker at gøre - og de stjal ideen, viser det sig fra Superman III, hvor Richard Pryor gjorde det samme - de var hovedsagelig skrive programmer, der stræber efter at tage alle de bageste numre, alle de små, små, små fraktioner af småpenge, og hævertvirkning dem væk, så mennesker bare tanke, åh, det er kun $ 0,10 der, men alle dem afsluttende numre til sidst tilføje op. Så en vidunderlig idé, og det bagslag afsindigt i at bestemt film. Men i den virkelige verden, er der også meget mere om konsekvenser af disse slags ting. Og en af ​​grundene til at dykke ned inden for computer videnskab er igen dens anvendelse ikke til ingeniørvidenskab alene, men blot at andre felter. Så dette er en mindre munter kig på, hvad der kan gå galt, men det er også helt øjenåbnende, tror jeg, når det kommer til forståelse præcis hvordan allestedsnærværende teknologier som computere og programmering eller i disse dage, i form af software. Så dette næste klip er bare om seks minutter, fortsætter hvor vi slap sidste gang, men giver os mulighed for at se lidt mere i dybden på en sådan af disse spørgsmål. Lad mig gå videre til hvor vi slap, som var lige her. Og vi har en del to af to, for omkring seks minutter her. [PLAY MOVIE] Plaget moderne raketteknologi. I 1991, med starten af ​​den første Golfkrig Patriot missil oplevede en lignende form for Antallet konvertering problem. Og som følge heraf blev 20 mennesker, 20 amerikanske soldater, dræbt og omkring 100 andre såret, da Patriot, som skulle til beskyttelse mod indkommende Scuds, undladt at affyre et missil. Da Irak invaderede Kuwait og Amerika lanceret en Desert Storm i begyndelsen af ​​1991, Patriot missilbatterier var indsat for at beskytte Saudi-Arabien og Israel fra irakisk Scud-missilangreb. The Patriot er et amerikansk medie-range overflade-til-luft-system, fremstilles af Raytheon Company. Størrelsen af ​​Patriot opfanger selv, det handler om omkring 20 meter lang og vejer omkring 2.000 pounds. Og det bærer et sprænghoved på omkring - Jeg synes, det er groft 150 pounds. Og sprænghovedet selv er en højeksplosiv der har fragmenter omkring det. Kabinettet for sprænghovedet er designet til at fungere som hagl. Missilerne udføres fire pr beholder og er transporteres af en sættevogn. The Patriot anti-missil-system går mindst tilbage til 20 år nu. Det blev oprindeligt designet som en luft forsvar missil til nedskyde fjendens fly, i den første Golfkrig. Når denne krig kom, hæren ønskede at bruge det til at skyde down Scuds, ikke flyvemaskiner. The Air irakiske Force var ikke så meget af et problem, men hæren var bekymret Scuds. Og så prøvede de at opgradere Patriot. Opsnappe en fjende missil rejser på Mach 5 foregik at være udfordrende nok. Men da Patriot blev hastet i brug, hæren var ikke bekendt med en irakisk modifikation, der gjorde deres Scuds næsten umuligt at ramme. Hvad der skete er de Scuds, der var kommer ind var ustabile. De slingrende. Grunden hertil var irakerne, for at få 600 kilometer ud af en 300 kilometer rækkevidde missil, tog vægt af den forreste sprænghoved og gjort sprænghovedet lettere. Så nu Patriot forsøger at komme på Scud, og de fleste af den tid, det overvældende flertal af den tid, det ville bare flyve af Scud. Når Patriot operatørerne indså Patriot forpasset sit mål, de detonerede Patriot sprænghoved. For at undgå eventuelle ulykker, blev det tilladt at falde til jorden. Det var hvad de fleste mennesker så, da store ildkugler på himlen, og misforstås som aflytninger af Scud-sprænghoveder. Selv på nattehimlen, syntes Patriots at være held ødelagt Scuds på Dhahran, kunne der ikke være fejl om dens ydeevne. Der, Patriots radarsystem mistet overblikket over en indkommende Scud og aldrig iværksat på grund af til en software fejl. Det var israelerne, der først opdagede, at jo længere systemet var, jo større den tid uoverensstemmelse blev, på grund af et ur indlejret i systemets computer. Cirka to uger før tragedien i Dhahran, den Israelerne indberettet til forsvarsministeriet, at det Systemet var ved at miste tid. Efter omkring otte timers drift, bemærkede de, at Systemet var ved at blive mærkbart mindre nøjagtige. Den forsvarsministerium reagerede ved at fortælle alle The Patriot batterier til ikke forlade de systemer i lang tid. De har aldrig sagt, hvad en lang tid var - 8 timer, 10 timer, 1.000 timer. Ingen vidste det. The Patriot batteri stationeret på kasernen på Dhahran og dets mangelfulde interne ur havde været på over 100 timer på Natten til den 25. februar. Det sporede tid med en nøjagtighed på omkring en tiendedel af et sekund. Nu er en tiendedel af den anden er en interessant tal, fordi det ikke kan udtrykkes i binær, nøjagtigt, hvilket betyder det ikke kan udtrykkes på ethvert andet moderne digital computer. Det er svært at tro. Men bruge dette som et eksempel. Lad os tage det nummer en tredjedel. En tredjedel ikke kan udtrykkes i decimal, præcis. En tredjedel er 0,333 stået på i uendelighed. Der er ingen måde at gøre det med absolut nøjagtighed i decimal. Det er præcis den samme type problem, der skete i Patriot. Jo længere systemet løb, jo værre tidsfejl blev. Efter 100 timers drift, var fejlen i tide kun omkring en tredjedel af et sekund. Men med hensyn til målretning et missil rejser på Mach 5, det resulterede i en tracking error på over 600 meter. Det ville være en fatal fejl for soldaterne ved Dhahran. Hvad der skete er en Scud lanceringen blev påvist ved tidlig varsling satellitter og de vidste, at Scud kom i deres generelle retning. De vidste ikke, hvor det kommer. Det var nu op til radaren del af Patriot system, forsvarer Dhahran, at finde og holde styr på det indkommende fjendtlige missiler. Radaren var meget smart. Du ville faktisk spore placeringen af ​​Scud og derefter forudsige, hvor det sandsynligvis ville være det næste gang radar sendt en impuls ud. Det blev kaldt intervallet gate. Derefter, når Patriot beslutter tilstrækkelig tid er gået til at gå tilbage og tjekke det næste sted for denne detekterede objekt, det går tilbage. Så når det gik tilbage til det forkerte sted, det så ikke ser nogen indsigelse, og den beslutter, at der ikke var noget objekt. Det var en falsk detektion og taber sporet. Den indkommende Scud forsvandt fra radarskærmen. Og sekunder senere, den hamrede ind i kasernen. The Scud dræbte 28 og var den sidste affyret under den første Golfkrig. Tragisk, den opdaterede software ankom til Dhahran den følgende dag. Og den software fejl var blevet fastsat, lukker et kapitel i den urolige historie Patriot missil. PATRIOT er faktisk en forkortelse for "fasede Tracking Skæring af Target. " Okay, så en meget mere sorgfuld resultat af ikke helt forstå denne verden. Og takeaway, virkelig, fra filmen er, at løsningen Der blev genstarte dit missilforsvarssystem hver gang i et stykke tid. Og så igen, et af formålene med dette kursus, i hvert fald på en mere ydmyg målestok end disse applikationer, er at virkelig åbne alles øjne for præcis, hvordan du går om maskiner til fremstilling gøre, hvad du vil have dem til at gøre, og hvordan du går om at gøre det rigtigt, mens undervejs gør det godt, elegant, og så videre. Og så i dag, lad os dykke ned i en lille smule mere af dette, men så vi ikke går for hurtigt, især for de mindre komfortabel, men også for at vi kan fastholde interessen for dem mere komfortable, lad os bare hurtigt begynde med en smule af resumé af nogle af disse ideer. Og igen, så spørg væk, både personligt eller online, hvis du har spørgsmål, så vi kan holde alle på samme side. Så CS50 Appliance, hurtig skridt tilbage, er hvad med dine egne ord? Det er OK, hvis du ikke har nogen idé om, hvad disse ord kan være endnu. [Uhørlig] Okay, så en universel grænseflade til - at vi alle kan dele. Absolut. Så vi kunne, for eksempel, fortælle dig at gå til nogle hjemmeside, downloade denne software til Mac OS. Download dette software til Windows, konfigurere i denne måde, og at. Men virkeligheden er så vi løber ind i utallige tekniske støtte problemer. Og også i disse dage, meget af, hvad der bliver gjort server side, i verden af ​​computing, det især når kommer til webudvikling og web-baserede applikationer, er faktisk ganske ofte gøres på Unix eller Linux-computere, i modsætning til Macs eller Windows-pc'er. Så blandt de upsides så med at bruge denne ting kaldet CS50 Appliance er vi alle have det samme miljø. Så alle er på samme side, uanset hvilken hardware du kom til campus med, men også vil være dypning i nøjagtig det samme miljø, som du vil bruge mod semesters afslutning samt for webudvikling, samt i den fremtid for virkelige verden applikationer deraf. Så mere konkret, det CS50 Appliance er et gratis stykke software, der tillader dig at køre et andet operativsystem, Linux, i dette tilfælde, på din egen computer. I et vindue Nu kan du ikke bare hente apparatet. Du har brug for et program, som skal spille eller køre apparatet. Og det stykke software er almindeligt kendt som en hypervisor. Hypervisors kommer i form af produkter som VMware, Virtual Box, Parallels. Alle former for selskaber gør software, både gratis og kommercielle, ens. Hvad ser du i Problem sæt 1 er instruktioner om, hvordan du få gratis software med til at køre CS50 Appliance. Og når du gør det, vil du have, i et vindue på din Mac eller pc, en desktop miljø, der ser helt sådan ud, hvor det har en Start-menu-lignende ting i nederste venstre hjørne. Det har en hjemmemappe, eller Hjemmemappe, i øverste venstre der, en skraldespand, og så videre. Så vi vil drille hinanden de nødvendige oplysninger, når vi går. Men lad os nu begynde at dykke ned i C. Så C er dette programmeringssprog, ligner i ånd til Scratch, men langt mindre grafisk, men ironisk nok, langt mere kraftfulde når du får kyndige med det. Så i C, vi skriver programmer ved at skrive kildekode, som er denne engelsk-lignende syntaks, svarende til sokker påvisning af, at vi gjorde sidste gang, hvor du kan udtrykke dig temmelig præcist, hvis arcanely, til computeren. Så hvad slags produkt software har du rent faktisk har brug at skrive programmer i et sprog som C, baseret på vores samtale på mandag? [Uhørlig] OK, du skal bare have en tekst editor. Du behøver ikke nogen speciel software i sig selv at skrive programmer. Du skal bare have en teksteditor som Notesblok, på Windows, TextEdit på Mac, eller noget, der hedder gedit, i verden af Linux, som vi vil bruge her. Og det er det, at skrive programmerne. Men skrivning er kun halvdelen af ​​ligningen. Du kan derefter nødt til at køre dem. Men for at køre programmer - du kan ikke køre kildekode. Du i stedet nødt til at gøre, hvad det først? Yeah. DAVID J. Malan: Du skal kompilere det. Og en anden, kompilere kildekoden betyder - [Uhørlig] DAVID J. Malan: Præcis. Oversætte det til nuller og ettaller. Fordi vi alle, i disse dage, har computere, der har CPU'er, næsten alle er lavet af et firma kaldet Intel, og Intel Inside, betyder, at der er denne hjerne inde i din computer, kaldet CPU. Og en af ​​de ting, som at hjernen gør, er, det ved hvordan man skal forstå mønstre af nuller og ettaller. Det ved, hvad mønster af bit repræsenterer desuden hvad mønster repræsenterer subtraktioner, hvilken mønster af bits repræsenterer udskrivning, og skabe en hørbar lyd. Så kort, CPU, kombineret med operativsystemet som er et stykke software, der kører på toppen af ​​CPU, så at sige. Sammen disse to stykker vide, hvordan du kører programmer, der vi mennesker skriver. Så hvis jeg går ind i CS50 Appliance her, jeg har brug for at åbne en tekst editor, og jeg kan få adgang til denne i et par forskellige måder. Jeg kan enten gå til Menu, programmering, og så kan jeg vælge - nope, ikke på menuen. Jeg kan gå til Tilbehør / gedit her for at åbne min lille tekst editor. Eller mere enkelt, kan jeg klikke på denne lille ikon i bunden venstre hjørne. Og nu får jeg dette miljø her. Det er temmelig minder om en simpel teksteditor, med blot en eller to forskelle. I toppen, hvor markøren blinker nu er det her Jeg kan begynde at skrive min kode. I bunden er denne ting kaldet terminalvinduet. Og hvad slags ting kan jeg gøre i dette såkaldte terminal vindue? [Uhørlig] Okay, så jeg vil køre kommandoer. Og nogle af de kommandoer, vi kørte i mandags var lidt kryptiske i starten, men ls til listen, cd for forandring bibliotek, rm, for fjernes. Så det er slags en old-school måde at navigere din computer, der kun bruger dit tastatur og tekstmæssige kommandoer, og ikke, i almindelighed under anvendelse af en mus. Men vi vil se, inden længe, ​​dette faktisk giver os en lidt mere power og lidt mere præcision, hvormed at udtrykke os. Og så herovre til venstre, vil vi bare at se, da vi begynde at skrive software, en lille resumé af program, som vi har skrevet øverst til venstre. Men vi vil se det igen inden længe. Så lad os gøre noget temmelig simpelt her. Lad mig først gå videre og gå til Fil, Gem, og jeg er bare kommer til at klikke på jharvard her, over til venstre, og jharvard er, igen, navnet på mit hjem mappe, min personlige filer, mig, nu er John Harvard, som alle jer vil snart være John Harvard i dette miljø. Han har dette Home bibliotek, Mine Dokumenter og så videre, at jeg vil gemme, nu denne fil i. Så jeg har tænkt mig at kalde det hello.c. Så jeg har tænkt mig at gå fremad og klik på Gem, og nu, hvad jeg har her, er en fane kaldet hello.c, så meget som en anden type editor. Så nu lad mig gå videre og begynde at skrive et program. int main (void). Og så vil jeg bare gjorde sidste gang, printf, for print formateret, ("Hello, world!" ). Næsten færdig. Men jeg mangler et par detaljer. Hvad der mangler i dette program, som jeg virkelig har brug for det faktisk kompilere? Yeah. [Uhørlig]? DAVID J. Malan: Ja, så jeg er nødt til at inkludere den standard I / O-bibliotek. Så det skal gå over main, så jeg bare til gøre nogle plads til det der. Og jeg har tænkt mig at gøre # include . Og bemærk de vinklede parenteser dér. Og som en sidebemærkning, er gedit lidt brugervenlig, hvis nogle gange lidt forvirrende, idet den forsøger at hjælpe din øjne mærke til, hvad linjer op med hvad. Så det faktum at min markør er lige ved siden af ​​denne vinklet beslag, bemærk, hvordan det er at fremhæve den anden vinklet beslag plus denne ene. Og det er bare at henlede min opmærksomhed på, at jeg have symmetri. Og symmetri i programmeringen er generelt en god ting. Tilsvarende, hvis jeg flytter min markøren til slutningen, læg mærke til hvordan den krøllede parenteser i kø for at vise, at, ja, jeg har en åben og et lukket, så at sige. Okay, og jeg kan gøre en anden ting. Det er ikke strengt nødvendigt, men god praksis, for at sige returnere 0. Og return 0 gør hvad for os her? Eller betyder hvad? [Uhørlig] DAVID J. Malan: Men intet er galt. Og helt ærligt det er svært for meget at gå galt i en programmere denne korte. Så jeg bare at være super klart, at alt er godt. Jeg, menneske, når jeg kører dette program, vil sandsynligvis aldrig se, 0. Generelt er disse tal, der bliver returneret fra main kun opdrage deres hoveder til mennesker, når noget går galt. Og du får en lille pop op at sige systemfejl, én, to, tre, eller uanset hvor mange var, at faktisk returneres. Så noget andet galt med dette? [Uhørlig] DAVID J. Malan: Så det er ikke så meget et funktionelt fejltagelse men en æstetisk en. Jeg skal nok sætte i en ny linje der ved slutningen af ​​denne streng, så vi rent faktisk at flytte markøren til næste linje, og programmet bare ser lidt pænere. Så nu lad mig gå ned til min terminal vindue og ind igen Og denne ting her, det hedder prompten. Det er bare at minde mig om, hvem jeg er, jharvard @ apparat, hvor Apparatet er navnet på den computer, jeg er på. I parentes er denne tilde, tilden symbol, som repræsenterer hvad? PUBLIKUM: Home bibliotek. DAVID J. Malan: Home bibliotek. Så det er bare en forkortelse notation for at sige du er i din personlige mappe, hvor alle dine filer går som standard. Så nu, her, kan jeg skrive ls for listen. Og det eneste, jeg kan se her i øjeblikket er hello.c. Og det er godt, fordi jeg lige skrev dette. Så lad mig gå videre og gør goddag. Og bemærk jeg ikke skrive make hello.c. I stedet er jeg kun skrive bunden navnet på filen, hej. Og gøre, som vi så på mandag vil bare udlede, at jeg ønsker den. c fil. Så nu har jeg skrevet lave hej. Nu kan jeg se denne lange kommando og vil fortsætte se dette igen og igen. Men for at være klar, klang, ordet, der bare syntes, det er den faktiske compiler. Lav er bare et build hjælpeprogram. Det er bare en mere brugervenligt program, der sparer mig, i lange løb, fra at skulle skrive ud utroligt kedelig lang kommandoer som at én. Så du kunne løbe Dunk manuelt. Du kan skrive alt dette manuelt. Bliver bare meget trættende. Og så gør, er bare et program, der forenkler vores liv, og kører mere komplekse kommandoer for os. Okay, så nu, hvad filen skal jeg have i mit aktuelle bibliotek? Ikke bare hello.c, men også hej. Så hvis jeg vil køre goddag, huske, at jeg siger dot slash, hvor dot midler gå ind i den aktuelle mappe, hvor du er, og derefter køre programmet hedder hello, og ja, nu, Jeg har hej verden. Okay, eventuelle spørgsmål om workflow eller syntaksen i hvad vi lige gjorde? Okay, så lad os tage tingene op et hak igen. Så det var underwhelming at bare skrive et program, der kun nogensinde, siger hej, verden. Så vi ændrede det på mandag, for at sige, hej, David. Det er en lidt mere personlig, men lige så hårdt kodet som første version. Så ikke alt det overbevisende. Men der findes i C, fungerer sikkert udover print, funktioner, så du får input fra brugeren. Og den måde, vi gjorde det, den anden dag, var som følger. Før jeg faktisk udskrive noget, jeg først fik noget fra brugeren. Så lad mig gøre det igen. String s, hvor s er blot et vilkårligt navn, her, til en streng, svarer GetString. Så hvad var GetString? Det naturligvis får en streng, der er baseret på dens navn. Men hvad er det, mere teknisk? Det er en funktion. Så det er en funktion, der ikke kommer med C per se. CS50 medarbejdere skrev dette. Og så at bruge dette, kan du ikke bare inkludere stdio.h, Du skal også omfatte hvad? Yeah. Så cs50.h, som er blot en fil vi skrev for nogle år siden. Vi installerede det på apparatet for dig ved siden af alle standard filer. Og så i disse første par uger af klassen, vil vi bruge dette bare for at forenkle processen med at gøre meget grundlæggende ting som at få input fra brugeren. For som vi vil se i et par uger, at få brugerinput i en sprog som C er faktisk overraskende kompleks, især fordi du ikke kender i forvejen, som regel, hvordan mange ting som brugeren kommer til at skrive i. Og når du ikke ved, hvor meget data til at forvente, at du ikke vide, hvor meget hukommelse der skal tildeles. Og hvis du rent faktisk har en kontradiktorisk bruger, der forsøger at hacke ind i dit system, crash din computer, ja, generelt den første metode til angreb er, ligesom jeg gjorde på Mandag skrive en hel lang sekvens af tilfældige tegn, trykke Enter, og se hvad bryder. Fordi generelt, hvis et program bryder, antyder, at der på et sikkerhedshul, potentielt. Det er helt sikkert antyder du, programmøren, der har fremstillet en fejltagelse, men mere faretruende, måske du har lavet en sikkerhedsrelateret fejl, og generelt vil vi se, at det er sådan maskinerne er kompromitteret til denne dag, både i verden af ​​internettet og programmer på kommandolinjen, som denne. Ok. Så string s lig GetString. Så mere konkret nu, hvad linje 6 gøre her? Så den funktion til højre får strengen, tager, hvor mange argumenter? Okay. Så ingen. En lille sanity check. Et argument, igen, er bare et input til en funktion til at ændre sin standard opførsel på en eller anden måde. Men i dette tilfælde, jeg ikke ønsker at ændre adfærd GetString. Jeg ville bare få en streng. Så jeg satte intet i parentes, og så vil jeg sætte en semikolon demarking enden af ​​kodelinje. Nu lighedstegnet betyder ikke lige, per se. Det betyder opgave, hvilket betyder indsætte de får afgives til højre inde i det, der er til venstre. Så til venstre, siger vi, at vi har erklæret en streng ved navn s. Og mere specifikt, har vi allokeret hukommelse inde i som vi vil lægge de bits, der repræsenterer en sekvens af tegn. Men i dag har vi afsat eller erklæres en streng. Ok. Så nu når jeg har gjort dette, vil jeg tilslutte i værdien af s, ikke værdien af ​​David. Så dette er forkert hvorfor? Så det er bare bogstaveligt talt hard-coded s. Det er at sige "goddag, s", som er ikke hvad jeg vil. Så jeg kan gøre dette. Den procentvise tegn er en pladsholder, men nu har jeg brug for passere ind i udskrive et andet argument. Husk på, at argumenter til funktioner er adskilt af kommaer, så næste komma her jeg sætte efter denne bogstavet s. Og i den forbindelse nu, s er variabel, og printf, efter modtagelse af disse to indgange - strengen til venstre og variabelnavnet s til højre - det vil lukke sidstnævnte i førstnævnte for os, og bare udskrive en dejlig smuk streng, der indeholder uanset hvad det er, at vi har skrevet i. Så lad os prøve dette. Kommer til at gå videre og zoome ud, tilbage til min terminal vindue. Zoom ind ved bunden her. Gentag gøre hej. Klang synes at have været køres igen. Jeg har tænkt mig at skrive. / Hej, Enter. Intet synes at ske endnu, men det er ved denne prompt at jeg kan skrive noget som Nate, Enter, og nu har vi Hej, Nate. Og jeg kan gøre det igen med Rob, og så videre. Så forhåbentlig nu dette program opfører sig som jeg agter. Nu ikke så brugervenlig. Jeg har ingen idé om, hvad der bliver forventet af mig. Så vi kan helt sikkert rydde op en lille smule. Lad mig gå tilbage her, og i stedet for bare at dykke i og beder brugeren om en streng, lad mig eksplicit fortælle bruger, hvad jeg forventer. Så printf ("Indtast en streng:" ); Så ingen variabler her. Ingen procenttegn. Bare den simple engelsk udtryk. Lad mig nu gå til bunden her og kør mit program. Men intet synes at have ændret sig. Hvorfor? Jeg er nødt til at kompilere den. Så let fejl at gøre. Men du er nødt til ikke kun at gemme filen, men genoversætte programmet. Og så hvis jeg re-run gøre hej, nu Dunk kører. Nu kan jeg køre. / Hej. Og nu kan jeg se "Indtast en streng:". Okay. Nu er det lidt mere brugervenligt. Nate, Enter, hallo, Nate. Nå, lad os prøve det igen og begynde at tænke ca hjørne tilfælde. Så ligesom i Scratch, er du opmuntret eller er ved at blive fremmes i spec at slags tænke over hvad der kunne gå galt, hvis du ikke forventer alt, hvad brugeren kan gøre. Bugs derfor kunne forårsage. Så indtaste en streng - hvad er et hjørne sag her? Hvad er et scenarie, at jeg, programmør, måske ikke har forventet? Yeah. Okay. Så hvad hvis jeg skriver i en række som denne? Ok. Så det virker stadig. Gramatically giver ingen mening. Men i det mindste programmet virker. Hvad er et andet hjørne sag? Noget jeg ikke havde forventet. Ja? Okay. Så vi kunne gøre noget som en virkelig, virkelig stort antal. Så lad os gøre det her. Lad mig zoome ud til en anden, lad mig fremhæve. Kan ikke kopiere og indsætte hernede. Ok. Så jeg kan ikke kopiere og indsætte i denne terminal vindue, så vi får lige simulere det. Lad mig zoome ud, kommer til at wrap. Jeg har ikke tænkt mig at gøre dette alt for længe, ​​fordi det ikke vil faktisk bryde i dette program. Men det kunne. Enter. Men det gjorde det ikke. Ok. Men det er en ægte hjørne sag. Og den eneste grund til, at opførte sig korrekt, så at tale, er fordi CS50 funktionen GetString er faktisk udformet under hætten, som vi vil se i et par uger, til automatisk at tildele mere og mere RAM, mere og mere hukommelse fra operativsystemet, når det indser, wow, du har virkelig skrevet i noget ganske lang. Nu, dette er lidt af en hvid løgn. Hvis vi faktisk standsede et stykke tid, og jeg har skrevet i noget lignende 5 milliarder tegn på tastaturet her, eller virkelig ramt copy-paste ganske lidt, vi muligvis kan få programmet til at gå ned. Bare lidt sværere at simulere det med en endelig tid. Hvad er et andet hjørne tilfælde kunne vi forsøge? Ja? Yeah. Så hvorfor gør vi ikke svare noget? Så vi faktisk nødt til at tage nogle tiltag, fordi ellers programmet kommer til at sidde der blinker hele dagen. Men hvis jeg bare trykke Enter - OK, nu, ser stadig forkert. Vidste ikke gå ned, men måske er der nu en mulighed for at påbegynde gennemførelsen af ​​en mere stringent program der egentlig kontrollerer. Og hvis strengen, den sætning, det ord, jeg indtastet har længde 0, ja, måske jeg skulle råbe ad den bruger, eller fortælle ham eller hende om at indtaste en streng igen, så vi faktisk får, hvad der ligner korrekt adfærd og ikke bare fuldstændig forglemmelse fra min side. Spørgsmål i ryggen? Decimaltal. Så vi kunne prøve det, også. 1,10000005. Synes lige det kommer til at bare arbejde faktisk okay. Og det faktisk forventes. Selv om vi kunne have skrevet, at antallet der, eller en større antal tidligere indse, at når vi er ved at skrive bruger input og vi bruger den GetString funktion, ikke Uanset om hvad jeg skriver ligner et nummer. Husk på, at i henhold til ASCII, alt på din tastaturet har en numerisk værdi, der kan knyttes til en karakter, en char. Så i dette tilfælde, selvom jeg måske skrive et nummer, computer kommer til at tænke på det, så at sige, som en streng - noget, der ligner et tal, men er faktisk ikke et tal. Men det er faktisk en perfekt Segue, fordi vi nu kan faktisk overgang til at skrive programmer, der bruge andre datatyper. Så udover selv at anvende chars, eller rettere, udover selv at anvende strenge, indse, at vi har andre datatyper i C samt i andre sprog. En char, som navnet antyder, er blot et enkelt tegn. En flyder er en floating point-værdi, og det er bare en fancy måde at sige et reelt tal - noget, der har en decimal punkt i det med nogle numre til venstre og / eller højre. En int er et heltal, der er bare et nummer som 123. Og nu mere interessant er ting som dobbelt. Hvad sagde vi sige en dobbelt var sidste gang? Det er 64, til højre. Så mens typisk en float er 32-bit - så det er så lang tid i hukommelsen, det bruger 32 nuller og ettaller til repræsenterer værdier - en dobbelt er bogstaveligt talt to gange, hvilket betyder, at du enten kan repræsentere større tal, eller du kan repræsentere mere præcise tal. Så du kan have flere numre efter kommaet, men som fyren sagde i videoen, selv noget simpelt konceptuelt ligesom 1/3 ikke kan gengives præcist ved en computer, fordi i sidste ende du løber tør for bits, og derfor kan du kun gøre .33333333 så mange gange, på hvorefter du bare nødt til at sige, jeg er ud af repræsentation plads, jeg skal bare kalde det en dag og repræsentere det lidt upræcist lide det. Og en lang lang - dumt navn, men det er fordi der er en datatype kendt som en længe i C, som tilfældigvis er ofte 32 bits, ligesom en int er 32 bit, men en lang lang er generelt 64 bits. Så det bare betyder, at du kan repræsentere større tal end dette. Ok. Så hvis vi rent faktisk ønsker at starte repræsenterer ting, vi muligvis mere sofistikerede typer, og det er derfor vi har streng. Så i CS50 biblioteket, at fil kaldet cs50.h, vi har faktisk erklærede en datatype, så at sige, kaldet streng, men streng faktisk ikke eksisterer. Det er, igen, en af ​​disse lag vi vil skrælle tilbage i en uge eller to og smide det væk, og faktisk kigge under kølerhjelmen på, hvad en streng egentlig er, og hvordan det er repræsenteret. Vi vil også se på booleske værdier. Så hvad var en bool i forbindelse med Scratch? Det er sandt eller falsk. Så det er bare en værdi, der er sandt eller falsk, tændt eller slukket, 1 eller 0, men du ønsker at se i verden. Så i C, takket være den CS50 bibliotek, som igen omfatter et andet bibliotek under motorhjelmen, har vi adgang til en datatype, der hedder bool, som vil bogstaveligt giver os mulighed for at tildele værdierne sand eller falsk til ting i et program. Så lad os gå videre her og skrive et lille program, der gør noget der involverer tal i stedet. Så lad mig gå tilbage til CS50 Appliance, lad mig gå videre og oprette en ny fil her kaldet - lad os bare sige noget simpelt, som math.c. Ok. Og nu gå op til toppen af ​​mit program, jeg er vil gøre det sædvanlige - # Include , så jeg kan bruge printf, int main (void) - vi vil komme tilbage til i sidste ende, hvad int betyder her, hvad tomrum betyder her, men for nu, ved bare at du nødt til at starte programmer som dette. Nu vil jeg gå videre og sige noget lidt anderledes - printf ("Giv mig et nummer:" ). Så jeg har tænkt mig at gøre int n = GetInt, fordi det Sving ud GetInt er en anden funktion i CS50 biblioteket foruden GetString. Og nu jeg har tænkt mig at gøre noget dumt, som "tak for% d, for "decimal heltal, og derefter komma n, og derefter vende tilbage 0. Så igen, returnere 0 har noget at gøre med antallet er jeg beder brugeren om. Bare betyder i slutningen, at alle, formentlig, er godt. Så lad mig gå ned til min terminal vindue her. Lad mig skrive make matematik, skal du indtaste. Og noget er galt. Gør matematik virkede ikke. Her er den første af vores fejlmeddelelser. Hvorfor? Lidt kryptisk, men - Yeah. Så cs50.h. Så igen, især tidligt på, vil du skrive din første program for Pset 1 i sektioner, i kontortiden, og helt ærligt, vil det være overvældende til tider hvad disse ting rent faktisk siger. Men du vil indse meget hurtigt de begynder at falde i spande, hvor denne ene betyder, at du har forladt fra én i # indbefatter øverst i filen. Og Dunk, compileren, er at informere dig om dette ved siger, snarere fancifully, underforstået erklæring af funktion GetInt er ugyldig. Ok. Så hvad betyder det? Det betyder bare, at du har implicit erklæret GetInt i den forstand, at du ikke udtrykkeligt har erklæret det. Til eksplicit erklære int, er du nødt til at undervise Klang, at det eksisterer. Og den meget enkel løsning for det er at lære det ved herunder denne anden fil, cs50.h, på toppen af ​​din fil. Fordi bogstaveligt, hvad betyder # include er den fortæller Dunk temmelig meget at gå finde den fil der hedder cs50.h, kopiere, indsætte den automatisk ind i toppen af ​​mit program for mig, og derefter konvertere kildekoden til nuller og ettaller. Men det ville naturligvis være meget trættende, hvis vi mennesker havde at gå kopiere og indsætte disse store filer hele tiden, så # include bare gør alt dette automatisk uden muddying min kode med en andens bibliotek. Og et bibliotek er bare en anden fil, der indeholder funktioner og andre ting, som en anden har skrevet, at vi er gearing for vores egen skyld. Ok. Lad os prøve igen. Gør matematik. Enter. Godt. Så det ser ud til at have virket. Så lad mig nu køre matematik. / Matematik. Indtast giver mig et nummer, 123. Tak for de 123. Lad os prøve et andet hjørne sag. En streng er temmelig generøs, fordi en streng kan være hvad som helst. Kan ligne tal, ligner tegn, ligner ord. Men en int er en int. Så nu, hvis jeg er den vanskelige bruger, og det siger "Giv mig et nummer, "hvad nu hvis jeg prøver at gøre noget som 0,1? Tja, det er et tal, og det er i overensstemmelse med grammatik jeg brugte her, men under motorhjelmen, er jeg af kursus med funktionen GetInt. Så lad os se hvad der sker. Indtast, prøv igen. Ok. Lad mig være svært og bare trykke Enter igen. Indtast, Enter. Så nu ser det ud til, at GetInt er lidt mere kraftfuld end GetString. Vi, personale, gennemføres på en sådan måde, at hvis vi bemærker De har ikke givet os en int - og en int er et decimaltal indeholder nuller, dem, toere, treere, firere, femmere, seksere, syvere, ottere eller niere. Og det er det. Ingen decimaltegn, ingen tegn, ingen tegnsætning. Det ser ud til, at vi er nødt til at samarbejde. Så lad mig prøve fire, fem, seks, og det får mig igennem. Så virkelig, at være anal her, vil jeg nok sige "Giv mig et heltal "for at formidle til brugeren præcis hvad jeg agter. Nu lad os tænke over under hætten. Vi kommer ikke til at se på, hvordan cs50.h gennemføres i dag, det pågældende bibliotek. Men hvis det holder at sige prøv igen, prøv igen, prøv igen, hvad programmering konstruere jeg formodentlig med under hætten til gennemføre det? Så bare en løkke, right? En af de enkleste ideer, som vi så på Scratch. Det Forever konstruere, Repeat konstruere. Formodentlig i dette program, under hætten, selv selvom det er skrevet i C og ikke bunden, er det at gøre noget, der hedder svarende til evigt, hvis brugeren ikke har indtastet et heltal, siger prøve igen, prøve igen, prøve igen, prøve igen, så så endelig når vi får et heltal, så du bryde ud af denne sløjfe. Så hvad andre funktioner kan vi bruge her i CS50 bibliotek? Godt, slags den åbenlyse i det mindste på grundlag af datatyper, som vi nu ved eksisterer. Vi implementerede GetString, GetInt, men i hele første uger af udtrykket, kan du også bruge GetFloat og GetDouble og GetLongLong for at opnå præcis den datatyper, som du ønsker. Fordi den centrale detalje her er, at i modsætning til nogle sprog, ligesom Python og Ruby, hvor man ikke nødvendigvis behøver at erklære datatypen for en variabel - du behøver ikke at fortælle computeren, hvad slags ting du kommer til at sætte ind i den variable - i C, skal du være nok så præcis. Så hvis du ønsker en variabel kaldet n, en luns af storage at i dette tilfælde sker for at være 32 bit ved konvention, du nødt til at fortælle computeren, at disse bits er kommer til at gemme et nummer - ikke et tegn, ikke en streng, ikke en float. Og det løser problemet vi effektivt løb ind i sidste uge. Hvis vi bruger nuller og ettaller numre til at repræsentere ikke blot numre, men As og Bs og Cs, hvordan i verden er en Computeren vil vide, at dette mønster af bit egentlig betegner nummeret 65, i modsætning til repræsenterer bogstavet A, som tilfældigvis ifølge ASCII, huske, svarede til 65? Så disse datatyper levere indhold til computeren, så at det ved, om disse bits skal fortolkes som en int eller som en streng. Eventuelle spørgsmål, så om dette? Ja? DAVID J. Malan: Godt spørgsmål. Hvis vi tager ud stdio.h, vi gemme filen - lad mig gå ned til terminalvinduet og køre gøre matematik, zoom ind og indtaste - nu får jeg en anden fejl, fordi jeg er implicit erklære hvilken funktion nu? Printf. Så nu har jeg lavet et nyt problem, hvis løsning er væsentlige den samme. Jeg har brug for at sætte den tilbage. PUBLIKUM: [uhørligt] DAVID J. Malan: Oh. Så hvis jeg tager ud - Okay, ja. Så hvis jeg fjerner den standard I / O-bibliotek indlemmelse op her, og så er du siger, hvis jeg slippe af med printf, få slippe af printf? Ja. Dette bør arbejde, fordi jeg ikke længere bruge nogen - Ups. Har jeg bare lyve? Oh, okay. Dette vil ikke arbejde på grund af en ny fejl, vi netop introduceret. Og denne ene er lidt mere selvforklarende. Hvad er problemet? Ubrugte variabel n.. Så denne fejl er resultatet af vores have konfigureret apparatet at være særligt pedantisk, for virkelig at yell på dig for alle mulige fejl, selvom det er lidt en ikke-fatal fejltagelse som denne - er det virkelig så stort et håndtere, at jeg tildelt en int, sætte et nummer i det, og så bare gjorde intet med det? Så funktionelt, no. Det kommer ikke til at bryde programmet. Det er bare lidt dum, right? Der er ingen værdi at have bedt om det nummer, oplagret det i en variabel, hvis du aldrig kommer til at gøre noget med det,. hvorvidt udskrive det eller gemme det Så i dette tilfælde, er Dunk erkender så meget, og Det siger ubrugte variabel n.. Så vi kan løse dette, hvis vi virkelig ønsker. Men igen, dette er ikke god programmering nu. Så jeg kunne bare gøre det - gå ned her, lad mig rydde skærmen, lave matematik. Det virker. Nu kan jeg køre min matematik program, tager input - godt, det var slemt. Tager input, og det er alt det gør i dette tilfælde. Så faktisk, lad os prøve en anden hjørne, at vi tænkte ikke på tidligere. I dette tilfælde - her, lad os gå tilbage til en, der er en lidt mere brugervenligt. Lad mig gå tilbage her og kør gøre matematik igen. Whoops, hvad gjorde jeg forkert? Fik at rulle tilbage yderligere. Okay. Nu er vi tilbage i den oprindelige tilstand, hvor alle er forhåbentlig godt. Og nu, hvis jeg løber matematik, 123 synes at virke. Men det er egentlig ikke en effektiv bevis, bare at sige okay, det virker. 789, der virker. Tid til at indsende. Fordi der er andre hjørne sager her. En streng ikke virkelig give os mange problemer ved at skrive i en hel masse tegn. Men hvad hvis jeg skriver i dette? Hitting tallet 1 en hel masse, hel masse her - okay, det bliver lidt kedeligt, så jeg har tænkt mig at stoppe her, og jeg har tænkt mig at trykke Enter. Hvad fanden skete der lige? Så dette kan faktisk forklares. Så tog det det som binær? En god tanke, men nej, det er ikke det faktum, at det tog det som binær, fordi faktisk det var bare sådan en tilfældighed. Vi kan gøre det igen. Så der er ingen 2 i det binære system, der er sandsynligvis nok alligevel. Enter. Så det var ikke problemet. Hvad ellers? Præcis. Så tænke tilbage på, hvad en int rent faktisk er. Det er 32 bit, der tilsammen er fortolket som et tal. Hvis du har 32 bit, der betyder, at hver af de bits kan være et 0 eller et 1, 0 eller et 1. Så det betyder, at der er to muligheder for denne bit, to muligheder for dette, to muligheder for dette bit - så det er 2 gange 2 gange - så det er 2 til 32 effekt er det samlede antal permutationer af nuller og ettaller, hvis du har 32 pladsholdere, nuller og ettaller, foran dig. Så hvis jeg har 2 til 32, matematisk, det er hvad? Så det er en masse. Det er 4 mia give eller tage. Og 4 milliarder synes ikke at være det, der blev udskrevet her. Faktisk ser det tættere på 2 mia. Men det er ikke en tilfældighed. Den omstændighed, at computeren har misfortolket mit enormt antal, min store sekvens af dem og derefter min store sekvens af toere, som 2 milliarder groft, forklaret er hvordan? Der er et loft på int. Der er en bestemt en maksimal værdi, som du kan repræsentere. Men det er normalt 4 mia right? Hvis 2 til 32 er omtrent 4 milliarder der ser ud som Det er det største antal. Så ikke en rest, men en god tanke. Negative tal. Så hvis du har 4 milliarder mulige ting, du kan repræsentere med disse forskellige permutationer af 32 0'er og 1s, ja, det er indlysende, at vi mennesker måske ønsker at repræsentere ikke kun positive heltal men negative heltal. Og ja, det er den antagelse, at C gør. Så med 32 bit, kan du repræsentere groft negativ 2 mia.kr. hele vejen op til positiv 2 mia. Og så i dette tilfælde, er det, vi virkelig ser bare i udkanten af ​​kapaciteten i vores tal, og vi har, så at sige overløb et heltal. Vi har prøvet at proppe flere bit ind i det, end rent faktisk kan passe. Så det endelige resultat er, at vi hovedsagelig har alle 1 bits. Vi har vendt alle vores bits på, har vi forsøgt at repræsentere det største antal muligt, men det er klart ikke nær stor nok til at repræsentere de to ting, jeg lige har skrevet i. Ja? PUBLIKUM: [uhørligt] DAVID J. Malan: Godt spørgsmål. Hvorfor kan vi ikke bare repræsenterer den negative underskrive som blot et tegn? Så vi absolut kunne, og vi kunne derefter gemme en ekstra bit. Men du er stadig nødt til at repræsentere denne streg, og der kommer til at koste dig i det mindste noget, formentlig en smule. Så ja, vi kunne have 32 bits, der anvendes til vores nummer, men nu vi har brug for en anden bit, der anvendes til vores tankestreg symbol, minustegn. Så nu har vi 33 bit-værdier, som vi kunne gøre, men det er bare ikke den måde, det er gjort. Vi lavede en dom opkald år siden, 32 bit er en slags af måleenhed her. Så vi kommer til at bruge en af ​​disse bits effektivt til repræsentere negativitet, og 31 bit til at repræsentere tal. Andre spørgsmål? Ok. Det er en masse. Skal vi ikke gå videre og tage vores fem minutters pause her? Ok. Så igen, at ikke understrege nok de matematiske applikationer af programmering, bare lad os plukke fra dette ene eksempel før vi bevæger os ind i andre konstruktioner, bare fordi det vil illustrere nogle få fælles humpe point på nogle af det grundlæggende, når det kommer til at skrive programmer. I dette tilfælde gør aritmetiske udtryk, der har nogle interessant relevans for syntaks. Så dette er blot en formel, som vi kan konvertere temperaturer fra Fahrenheit til Celsius. Hvis du ikke huske, det er bare formlen. Så hvis man tilslutter Fahrenheit værdi på 32 grader, hvilket er frysning, er det kommer til at være 32 minus 32 er 0, og ja, 0 i Celsius er også frysning. Så hurtig tilregnelighed kontrollere der - det er den velkendte formel. Lad mig gå over til apparatet, selv om, og start skrive et program kaldet, ligesom, f2c; "Fahrenheit til Celsius dot c ". Og op på toppen her, vil jeg starte med # include stdio.h, og jeg har tænkt mig at gøre int main (void), og igen, vil vi komme tilbage i fremtiden, hvad int betyder der, og hvilke hulrum betyder, at der. Og lad mig nu gå videre og gennemføre et program, der hovedsageligt gør denne konvertering for os. Så printf, lad os sige, temperatur i Fahrenheit. Og så lad mig gå videre og få den værdi fra brugeren. Hvilken slags værdi bør jeg får fra brugeren, hvis jeg ønsker dem til at give mig en temperatur i Fahrenheit? Ja? Hvad ville du foreslå? Yeah. Så float føles temmelig rimelig. Vi har, igen, blot et par muligheder, vi har set hidtil. Vi har ting som char, double, float, int, lang lang, bool, string. Så af disse, float føles temmelig rimelig. Vi kunne godt bruge en dobbelt, ret, for hvis vi virkelig ønsker at repræsenterer et menneskes temperatur - 98,60 tusind - vi kunne bruge 64 bit til at gøre det, men det føles som overkill for temperaturen. Så lad os bare gå med float. Nu har jeg brug for en variabel. Bare for at holde tingene enkle, vil jeg kalde det f, men jeg kunne lige så rigtigt kalder det temperatur, men enten er fint. Så flyde f = GetFloat. Så snart jeg nu har besluttet at bruge GetFloat, selv om, jeg nødvendigt at lave én korrektion. Yeah. Så vi er nødt til at # include , ellers compiler er kommer til at yell på os. Nu hvor jeg har en float, lad mig gå videre og gøre det konvertering. Så det første, lad mig også komme ind i vane her af kommentering min kode. Så igen, en kommentar er blot en notation til mennesket, der er ikke en del af programmet i sig selv, men en, hjælper dig forstå, hvad du gjorde den næste morgen, eller næste måned, det hjælper din undervisning fyr forstår, hvad du gjorde eller hvad du havde tænkt dig at gøre, så det er generelt meget god praksis. Hvert par linjer kode, skrive en kommentar til dig selv eller din kollega. Så her vil jeg sige, "Spørg brugeren for temperatur." Behøver ikke at være en hel sætning, bare en kort sætning. Men tanken bag kommentere i C er, at hver af dine bemærkninger bør give dig - eller, siger en TF eller en kollega - at skimme dit program og ved præcis, hvad det gør, ved ikke så meget at læse koden, men ved at læse de kommentarer, som bør være kortfattet og klar. Okay, så lad mig gå videre og sige, "Konverter Fahrenheit til Celsius. "Så jeg har tænkt mig at gå videre og gøre, lad os sige, flyde ca. Vi holder Celsius som en floating point værdi. Og lad mig tage et stik på dette. Formlen er, igen, op her. Som 5/9 gange F minus 32. Så lad os gøre det. Så 5 divideret med 9, minus - Ups, jeg rodet det op allerede. Times. Så 9/5 gange F minus 32. Så F minus 32, semikolon. Og nu, hernede, vil jeg gå videre og sige, udskrive resultat. Og denne del er nemt. Printf. Hvordan går jeg om udskrivning af dette? Tja, jeg kunne sige "Dette antal i Celsius er% f \ n", kun for nogle æstetik. Og hvad så værdi ønsker jeg at tilslutte her som printf s andet argument? Okay. Så bare c. Så vi vil starte med denne og så bare returnere 0. Igen, det har intet at gøre med matematik. Det betyder bare, at alt er godt. Nu er dette korrekt, dette program? Ok. Så jeg har lavet nogle fejl. Selv hvis du ikke har nogen idé om, hvad programmering er, kan du sortere af udlede tilbage til folkeskolen, hvad fejl her kunne være. Hvad er en af ​​de første? PUBLIKUM: [uhørligt] DAVID J. Malan: Yeah. Så vi mangler parenteser. Det var bevidst, at jeg gjorde parenteser i keynote glide her, fordi der er faktisk dette begreb af ordre af operationer, eller forrang, hvorved visse operationer - multiplikation - har højere binding, har højere prioritet end ting som addition eller subtraktion. Så vi har gjort det i årevis bare at gøre det klart præcis hvad matematisk operation bør gøres først. Så jeg burde nok efterligne netop dette. Ellers er computeren formodentlig vil forsøge at gøre noget lignende skel 5 af 9, og derefter multiplicere F, derefter trække 32 fra det hele. Hvilket ikke i virkeligheden, hvad vi ønsker at gøre. Så lad os parenthesize. Lad os tilføje mine parenteser her, parenteser her. Lad os sætte dette herovre. Her vil jeg blot har bemærket en anden fejl gjorde jeg undervejs. Ja? PUBLIKUM: [uhørligt] DAVID J. Malan: Ah. Godt. Så vi har faktisk samme heltal division spørgsmål fra før. Jeg korrigere, lad os se, hvad symptom er. Men vi bliver nødt til at rette en anden fejl her. Ja? PUBLIKUM: [uhørligt] DAVID J. Malan: Ja. Så dum fejl jeg lavede, men utrolig vigtig. Computeren vil ikke bare vende det blinde øje, og lad mig bruge kapital F, da jeg faktisk erklærede den variable som et lille f her, i linje 8. Så jeg er nødt til at korrigere i linje 11 min kapitalisering, som en øjeblik siden var stort F ved en fejltagelse. Hvad med her? Skulle dette være små bogstaver så godt? Det bør være, men det er en tilfældighed. Denne% f har intet at gøre med den variable. Så bare for at være super klar her, lad mig gå videre og omdøbe dette, kort, "temperatur". Lad mig omdøbe denne "temperatur". Lad mig ikke omdøbe denne. Fordi, igen,% f globalt betyder, "decimaltalsværdi." Har intet at gøre med min variabel. Men "temperatur" over det hele er bare lidt ordrig, så jeg har tænkt mig at gå tilbage til min lille "f" s. Lad mig gå videre ned til mit vindue her. Gør f2c - der var igen den vilkårlige navn jeg gav til denne fil. Synes at have kompileret. Lad mig løbe f2c. Enter. Temperatur i Fahrenheit - lad os gøre en let. 32. OK, korrigere. Men hvis jeg nu gør 212 til kogning - damn. Ok. Så tydeligvis ikke korrekt, hvis din TF forsøger mindst to værdier. Så hvad er problemet her? Nå, du allerede sætte fingeren på, hvad problemet er. Men hvorfor er det sådan? Heroppe. Når jeg laver matematik af 5 divideret med 9 Så begrebsmæssigt, det er helt korrekt. Fuldstændig i overensstemmelse med formlen. Men computere kun gøre præcis, hvad du fortælle dem at gøre. Og hvad vi reelt fortæller computeren her er opdele det hele tal 5 ved det hele tal 9 og giv mig resultatet. Problemet er dog, når du division ved hjælp af data typer, er udgangen samme datatype som input. Og så hvis de to indgange er begge int'er er udgangen går være en int. Og så 5 divideret med 9 er point noget. Men hvad er det nærmeste heltal til punkt noget? Så det er faktisk 0. Så som vi diskuterede i mandags, alt efter kommaet punkt bliver afkortet. Det bare bliver smidt væk. Så dette er en komplet fejltagelse, fordi jeg kan lige så godt bare formere alt ved 0 her. Nu kan jeg løse dette i et par forskellige måder. Jeg kunne gøre dette. 5,0 divideret med 9,0. Teknisk set har jeg ikke engang behøver at gøre det. Det er tilstrækkeligt til at bare gøre et af tallene en float - eller dobbelt - ved at sætte kommaet her. For hvad der sker nu, er, når du dividerer et heltal ved en flyder eller en dobbelt, er computeren vil indse oh, en af ​​dem er mere præcis. Lad mig fejle på siden af ​​giver dig mere præcision end du havde tænkt dig. Så det vil konvertere resultatet - det vil returnere resultatet som en kommatalsværdi så godt. Så det ville arbejde. Det ville virke. Og der er en anden mekanisme, som vi vil se i mere detaljeret i næste uge. Du kan faktisk, som programmøren, fortælle computeren til rent faktisk at behandle en datatype som om det var en anden. Så jeg kunne faktisk gøre det. I parentes kan jeg sige noget lignende (float), åben paren tæt parentes. Og det er, hvad der kaldes "casting". Igen, mere på denne næste uge. Men dette er kun den programmæssige måde at fortælle computeren, yeah jeg ved 9 er et heltal eller en lang. Jeg ved, det er ikke en kommatalsværdi. Men behandle det som sådan alligevel. Så for at kaste en datatype midler til at konvertere fra den ene til den anden. Helt ærligt, det er bare lidt grim, så jeg vil foreslå, at vi går tilbage til den oprindelige forslag om blot konvertere disse ting til kommeværdier manuelt. Fordi nu er det bare super klart, hvad der sker, og det er ikke alt, distraherende. Så lad os nu gå tilbage til min terminal vindue. Gør f2c. Lad mig gå videre og køre dette. Og som en sidebemærkning, får du keder skrive disse kommandoer igen og igen, indse, at computere, som Linux her, tendens til at være temmelig smart. Og hvis jeg ramte Up, kan vi gå igennem hele min historie kommandoer, op og ned. Så i dette tilfælde her, kan jeg bare gå op at køre gøre f2c. Jeg bliver råbt på, fordi jeg lige gjorde det et sekund siden. Det er allerede ajour. Så nu kan jeg køre f2c igen. Lad os prøve 32 Fahrenheit. Lad os prøve 212 Fahrenheit. Pyh. Synes at virke. Nu, dette er godt, men det føles lidt vilkårlig, at Jeg viser seks numre efter de decimaler. Right? Hvis du er vejret person på TV, du er sådan en doofus hvis du læser temperaturen til denne grad af præcision. Så lad os forenkle dette. Så lad os faktisk gå op her, til min printf. Og ja, jeg vil flyde. Men jeg vil nu angive præcision. Og jeg har tænkt mig at være lidt kortfattet. Jeg har tænkt mig at sige, giv mig et point efter decimal. Så i stedet for at sige% f, vil jeg sige% .1 f. Og det betyder bare give mig en position efter kommaet. Ok. Lad os prøve det igen. Lad mig igen køre det efter kompilering. Og nu jeg skriver i 32, og jeg kommer tilbage en mere kortfattet værdi. Og jeg kan skrive i, nu 212, og komme tilbage en mere kortfattet værdi så godt. Og der er andre ting, du kan gøre med printf. Du kan faktisk angive, hvordan bred nummeret skal være. Hvis du vil have polstring på den, så du kan højrejustere eller venstrestille alle dine numre eller forsøger at center ting. Så indser at der er små tricks, du kan gøre der. Men de bare koges ned til at formatere koder, ligesom vi har der. Så med hensyn til dette nummer af forrang. Dette er en meget kedelige tabel igennem metodisk. Men indse, at ophavsmændene til C er kommet op med den regler, der specificerer hvilke operatører har højere forrang, mere bindende magt, end andre. Så mens det i folkeskolen, vi generelt vidste, at det var multiplikation og division, og derefter addition og subtraktion, så nogle andre ting. I en verden af ​​programmering, er der en meget længere liste af ting. Og det er ikke noget værd at huske nu. Du bliver akklimatiseret til det inden længe. Men ligesom i folkeskolen, parenteser generelt løser spørgsmålene om forrang, ved at gøre super klart for computer og human både hvad der er tilsigtet. Så overveje dette bare en lille snyde ark der. Men de fleste af disse oplysninger, vil vi ikke komme til i nogen tid. Ok. Nu, lad os bygge op og flytte væk fra disse tåbelige lille matematiske eksempler. Stadig bruge de samme nøgletal, men starte udtrykke os selv lidt mere som Scratch. Så i Scratch, havde vi disse boolske udtryk. Og på engelsk, er et boolesk udtryk hvad? Sandt eller falsk. Det er noget, der evalueres til sand eller falsk. 1 eller 0. Tændt eller slukket. Uanset hvad du ønsker at kalde det. Nu i Scratch, puslespilsbrikker lignede dette. Og det er den kombination, på bunden der, af tre puslespilsbrikker. Én sammenholdt - noget, der har blank og blank. Og derefter to booleske udtryk i den. Så du kan indlejre booleske udtryk for at få mere kompliceret booleske udtryk. For eksempel, hvis det er lørdag, og er rart vejr, så gå udenfor. Eller noget vilkårlig måde. Så kan du tilmelde dig boolske udtryk til at komme med et større sandhedsværdi, hvis svaret er baseret på de mindre. Nu, i C, heldigvis, denne kortlægning er faktisk ret simpelt. Parenteser at gøre tingene klart her. && Er, hvad betyder "og". Så det er sådan vi kommer til at konvertere disse blokke fra Scratch til C. Og for de betingelser, vi så i Scratch, på venstre hånd side der, kan jeg stable dem på samme måde i C. Hvis x er mindre end y, så gøre det. Else hvis x er større end y, så gør det. Else logisk de skal være ens, så at sige at de er ens. Så vi kan nu begynde at bygge disse ting op. Så lad os gøre et eksempel. Lad mig åbne en fil, der er på kursets hjemmeside, at Jeg skrev i forvejen. Det kaldes nonswitch.c. Og vi vil se hvorfor i bare et øjeblik. Så i denne fil - nonswitch.c-- først indse, at der er en hel masse bemærkninger øverst. Det er bare at forklare navnet på filen, hvad det gør, og så videre. Og det tilsyneladende demonstrerer brugen af ​​booleske OG-ning - konjunktion to udtryk. Så lad os se, hvordan dette program virker. Jeg inkluderer mine to filer, cs50.h og stdio.h. Hvis jeg rulle ned, nu til programmet, det er en lidt længere end vi har skrevet før, men temmelig læsbar. Så jeg først udskriver til brugeren, på linie 18, "Giv mig et heltal mellem 1 og 10". Så det er lige der. Nu får jeg det hele tal. Men indse, at GetInt - temmelig simpel. Det er bare at få en int. Det kommer til at sikre, at det får en int og ikke en snor eller en float. Men det kommer ikke til at gøre nogen form for grænse kontrol. Det kommer ikke til at filtrere de tal til at være mellem en bestemt interval. Så vi er nødt til at gennemføre denne selv. Så ligesom i Scratch, hvor jeg kunne gøre en konjunktion af to udtryk, kan jeg gøre det i C som følger. Hvis n er større end eller lig med 1, og n er mindre end og eller lig med 3, vil jeg meget vilkårligt dekret, for at være et lille antal. Bare for skyld en redegørelse. Else hvis n er mellem 4 og 6, print "Du valgte en medium nummer. "Else, hvis n er mellem 7 og 10, print" Du valgte en stort antal. "Else print" Du vælger et ugyldigt nummer. " Fordi logisk, der følger hvis vi har udtømt vores sortiment. Så indse dette er ikke helt hvordan vi skal lave større end eller svarende til i en matematik klasse. Right? Du normalt tegne det på denne måde, med streg under det. Men der er ingen sådan nøgle på mit tastatur. Så symbolet i C til ekspression større end eller lig med er to tegn, og symbolet for mindre end eller lig med er to karakterer så godt. Ok. Så hvis jeg køre dette program, kan du sikkert gætte, hvad det er vil gøre. Hvis jeg gå videre og gøre nonswitch, Enter. Og derefter køre nonswitch. Giv mig et tal mellem 1 og 10. Jeg har tænkt mig at give det 11. Jeg plukket et ugyldigt nummer. Lad mig prøve nummer 3. Jeg plukket et lille antal. Så ret ligetil dér. Hvad hvis jeg ønsker at ændre adfærd af dette program og gøre noget lidt anderledes i stedet? Lad mig gå videre og sige dette. Lad mig slippe af med alt dette. Og lad mig sige if (n == 42). Og så jeg har tænkt mig at gå videre og sige print "Du valgte den rigtige svar. "Else vi vil gå videre og sige, printf ("Du valgte den forkert svar "). Okay. Bare fordi. Nu, et par punkter, vi kan gøre her. En, jeg ikke skrive det symbol, du vil synes er mest rimelige. Når jeg ønsker at kontrollere ligestilling, viser sig, du ikke bruger lighedstegn. Du i stedet bruge det lige lighedstegnet. Og hvorfor kan det være, bare intuitivt? Yeah. PUBLIKUM: [uhørligt] DAVID J. Malan: Korrekt. Lighedstegnet bruges allerede til opgave. Nogen troede egentlig ikke dette igennem. Og så nu, når det kommer til ligestilling test, er vi nødt til være mere eksplicit, og sige lig ligemænd. En meget almindelig fejl er at gøre dette. Og hvis i kontortiden eller engang i næste uge eller i næste to uger du gøre noget som dette, og derefter kæmper med det i 10, 20 minutter forsøger at finde ud af hvad den skide fejl er, indse, at du er en af ​​dem mennesker, der gjorde denne fejl. Så super let at lave. Men målet er nu at afværge denne fejl. Dette kunne vurdere, fordi hvad er det egentlig sige? Hvis n får 42. Så de verbum folk bruger, verbalt, til at udtrykke begrebet opgave er "får". Så hvis n bliver 42. Så betyder tildele 42 til n.. Nu har jeg en boolesk udtryk i parentes, inde i denne tilstand, er den værdi 42. Right? For hvis du evaluerer det indefra og ud, det samlede svar nu, er 42. Så hvis jeg spurgte dig spørgsmålet: "hvis (42)," hvad er der virkelig siger? Nå, kan boolske udtryk kun være sand eller falsk. 1 eller 0. Tændt eller slukket. Så vi synes at have et hjørne tilfældet her, hvor alle af en pludselig, jeg siger "hvis (42)". Det er ikke en boolesk værdi. Så hvad computere gør, er dog det væsentlige svarer noget, der ikke er 0 er fortolket til at være sandt. 1. On. De er alle tilsvarende funktionalitet. Kun værdien 0, eller søgeordet falske, som vi vil sidste ende se, er faktisk forkert. Så "hvis (42)" ville faktisk være sandt, fordi det er ikke-nul. Så for at være mere præcis her, en boolesk værdi er virkelig ikke så meget sandt eller falsk, men for denne tilfældet, hvis er 0 eller nul. Så falsk eller ikke falsk. Og det giver os mulighed for at dække alle de mere muligheder i parentetisk udtryk. Så vi er nødt til at, nogensinde så omhyggeligt, sige dette - if (n == 42). Simpelthen fordi vi er nødt til at angive en test af lighed, ikke en overdragelse af en værdi. Hvad der ellers er værd at bemærke her? Disse krøllede parenteser er faktisk ikke nødvendigt. Jeg har gjort dem bare for at være nit-betyder her. Men når du har en tilstand, der kun har én linje af kode, som en bekvemmelighed, behøver programmører ikke behøver at bruge tuborg-klammerne. Det er tilstrækkeligt at bare led af æstetiske grunde, og så skriv din linje kode. Kun når du ønsker at skrive to linjer kode - for Eksempelvis ellers printf ("Bye!"). Hvis du ønsker at gøre at der er dette brydes. Du kan led alt, hvad du vil, men det faktum, at du har skrevet to linier kode uden brug af krøllede parenteser betyder, at dette program ikke ville løbe korrekt eller måske ikke engang kompilere. Så for nu at være helt ærlig, tror jeg det bedste vane er bare bruge de krøllede parenteser, og du vil opdage, at de gør super klart, hvad der foregår. Også, som en sidebemærkning - især hvis du er blandt dem, der bruger de anbefalede bøger eller ressourcer online - indse, at der er denne forestilling om stil i programmering. Og nogle mennesker faktisk foretrækker at sætte klammeparentes herovre på en linje. Nogle mennesker foretrækker at gøre latterlige ting, gerne sætte dem her. Der er ingen forkerte svar, når det kommer til stil, men dette er forkert. Men nogle mennesker gør det. [Latter] DAVID J. Malan: Så jeg nævner dette nu, simpelthen fordi som du læse op på tingene i bøger eller på nettet, er du nødt til at få forskellige budskaber fra forskellige lærere og forskellige forfattere. Og bare indse, at funktionelt, de er generelt ækvivalent, men være konsekvente. Så i dette tilfælde, vil vi standardisere på de krøllede seler foring op her til venstre. Ok. Så lad os gå videre nu, og køre dette, og se hvad der sker med dette program. Gør nonswitch. Så kører nonswitch. Giv mig et heltal mellem 0 og - så det er ikke relevant længere, men jeg vil bare vilkårligt sige 42. Og jeg plukket det rigtige svar. Nå, lad os faktisk tage dette i en anden retning. Det viser sig, at der er nogle andre syntaks vi kan bruge i et program. Her er et nyt stykke syntaks, der er funktionelt det samme, men bare introducerer en anden måde at udtrykke os selv. Så dette er hvad der kaldes en "switch-statement." Og en switch-sætning som følger. Det tager i parentes en værdi, som du vil "Switch" på. Du ønsker at opføre sig forskelligt baseret på dens værdi. Så det betyder kontakten på værdien af ​​n.. Og hvad betyder dette? Tja, hvis n er 1 eller 2 eller 3, gå videre og udskrive "Du plukket et stort antal "og derefter bryde. Årsagen til brud er, at vejen C virker, er som snart den finder en sag, der matcher, det begynder fuldbyrdende hele koden nedenunder. Så hvis jeg har én linje kode, som jeg gør her på linie 27, det bliver henrettet. Hvis jeg tilføjer en anden linje her, det bliver henrettet. En anden linje her, det bliver henrettet. Programmet standser kun udføre, hvad der er under gældende sag resultatopgørelsen, når jeg udtrykkeligt sige "pause". Så galt. Ret, i det foreliggende tilfælde. Som følge Case 4 eller 5 eller 6, ligeledes vil at udskrive en besked. I dette tilfælde antallet medium. Break. Sag 7, 8, 9, 10, går det at printe ud "Du valgte en stor nummer. "Break. Og så er der bogstaveligt talt et nøgleord kaldet "default" Det er effektivt ligesom "else" konstruere. Så ny syntaks, men intellektuelt, intet overhovedet ny her. Det er ligesom Scratch. Hvis ellers hvis, ellers hvis slags blok. Så det er den koblet version af dette program. Men bemærk, at vi gjorde det med tal her. Lad mig åbne op for en anden version, bare for at vise noget lidt mere konkret. Så her har vi kvaliteter i stedet. Slår ud du kan bruge kontakter ikke blot på heltal, men på tegn. Ikke i alle datatyper, men i det mindste på tegn. Så her kunne vi gøre noget lignende, hvis værdien af ​​C at brugeren har indtastet, i ledningen 19, ved hjælp af getchar funktion, er kapital A eller små bogstaver en, lad os fortolke det som en kvalitet, og siger, at de plukkes en fremragende kvalitet. Og ned langs switch-sætningen, har vi andre tilfælde til "B" s og "C" s og så videre. Men lad os nu runde ud en anden ting. Og igen, slags flyver gennem nogle af disse eksempler. Men det er virkelig så at vi kan anvende dem, nu - eller virkelig, bare oversætte dem nu - til C. Så lad mig gå videre og gøre det. Jeg har tænkt mig at åbne en ny fil. Og jeg har tænkt mig at gøre omfatte . Og så jeg har tænkt mig at gøre int main (void). Lad mig gemme denne fil som et loop.c. Blot som eksempel. Og jeg har tænkt mig at gå videre og gøre følgende. Jeg vil skrive en meget kedelig program. Så 10. Lad os gøre det. 9. Ok. Så snart du begynder at gøre dette i programmering, er du formentlig gør noget forkert. Men vi vil starte der alligevel. Ups. Det er faktisk forkert. 7. 6. 5. 4. Intet kommer til at ske, når vi kommer til 0. 3. 2. 1. Okay. 0. Slet. Ok. Så returnere 0. Så dette program er tydeligvis kommer til at gøre, hvad det meget tediously siger, at det kommer til at gøre. Det kommer til at udskrive alle dem værdier, fra top til bund. Så lad mig gøre lave loop. Og så - Ups. Gøre løkken. Jeg var i den forkerte mappe. Og lad mig køre loop. Enter. Woohoo. Very nice. Nice, lange program. Okay, men lad os nu gøre det bedre. Ligesom i Scratch, da du begyndte at bruge en løkke konstruere, i stedet for bare at kopiere og indsætte alle de puslespilsbrikker, lad mig introducere denne ting. Så i C, er der forskellige looping konstruktioner, hvoraf den ene ser sådan ud. A "for" loop har tre ting, adskilt af to semikoloner. Og derpå, inde i legemet af sløjfen, så at sige - den stuff indersiden af ​​krøllede parenteser - vi kan gøre noget igen og igen. Så hvad jeg har her på skærmen, det er bogstaveligt talt bare en kommentar. Den / / betyder her kommer en kommentar. Dette er ikke kode. Dette er blot engelsk beskrivelse, for mig, det menneskelige. So startværdier, betingelser og opdateringer. Nå, lad os se hvordan det virker. Dette giver mig mulighed for at omskrive dette program som følger. For - så her kommer mit loop - int i - her kommer en variabel kaldet "i" - bliver initialiseret til 10.. Så der er min initialisering. Jeg ønsker at gøre dette loop, så længe "i" er større end eller lig med 0.. Og på hver gentagelse af denne sløjfe, vil jeg at gøre i -. Så vi oplevede + + på mandag. - Er det modsatte. Det reduceres værdien med 1. Inde i denne løkke, vil jeg rent faktisk gøre noget. Så jeg har tænkt mig at sige noget lignende printf. Jeg ønsker ikke at sige 10 nu, fordi det tydeligvis er bare vil udskrive den samme værdi. Hvad ønsker jeg at udskrive i stedet, sandsynligvis? Yeah. Så "i". Så% d, dvs. Så jeg har tænkt mig at stjæle en af ​​disse idéer fra tidligere - denne substitution for format-koder - og derefter ned her, i bunden, vil jeg vende tilbage 0, bare for god foranstaltning. Men nu har jeg en mere kortfattet program. Det er kun et par linjer, og ikke nogle 10 eller 11 linjer. Lad mig gå til min prompt hernede. Remake loop. Gentagelsen loop. Og den forekommer at være den samme. Nu er programmet er ikke mere interessant. Men nu kan jeg skrive noget som dette. Jeg kan ændre dette til 100. Jeg kan så kompilere mit program. Og så kan jeg igen køre mit program. Og nu går det super-hurtigt på nutidens computere. Men der har jeg - og faktisk, min tilbagerulning buffer ikke endda gå så langt. Der vi går. Så der har vi alle 100. Men det er nemt at lave fejl her. Hvad vil være den forventede adfærd, hvis jeg uheld gøre det? Så det føles som uendelig. Så lad os se, om computeren opfører sig. Så lad mig gå videre og gøre loop. Og lad mig køre loop. Så lad os vende tilbage til dette om et øjeblik. Vi vil lade det køre. For hvad skal vi tælle op til, minimalt? Sandsynligvis mindst 2 mia hvis vi har så mange bits, og vi bruger positive værdier. Så lad os hoppe tilbage her. Udover den slags sløjfer, har vi hvad der kaldes mens løkker. Så ligesom i Scratch, havde du Forever blokke, og du havde Gentag blokke. Ligeledes i C, du lige har andre måder udtrykke dig selv. Så du har denne opfattelse af en while-løkke, hvor du kan udtrykke dig lidt anderledes. Og så har du noget, der hedder en gør-while-løkke, der fungerer smule anderledes samt. Og vi vil drille dem fra hinanden over tid. Men lad os tage et kig på denne sidste her. Hvis vi går ind i - stadig kører. Det er temmelig uendelig. Så lad mig gå ind positivt, og viser, hvordan vi kan faktisk regere brugerinput lidt mere effektivt. Det er en temmelig kort program. Og her har vi, i main, en int n erklæring. Så giv mig en variabel kaldet n. Nu, jeg bogstaveligt talt sige "Gør." Og så har jeg fået åbne krøllet tandbøjle, tæt klammeparentes. Og så mærke til, lige efter det, det siger, mens n er mindre end 1. Så bemærke, at disse linjer - 19 til 24 - komponere kollektivt en gør-while-løkke. Og igen, ny syntaks, ikke en ny idé. Det er bare en anden måde at looping, syntaktisk. Så hvad betyder dette? Gør følgende, mens n er mindre end 1. Så hvad vil jeg gøre? Jeg forlanger, at du giver mig et positivt heltal. Så jeg faktisk forsøge at få et heltal fra brugeren. Men i form af den rækkefølge af operationer her, fordi så længe betingelse er hernede, jeg derefter vil kontrollere, er n mindre end 1? Således antage, at brugeren - efter at være krævet på denne måde - typer i værdien 0. Denne betingelse vil være sand eller falsk? Nå, det faktisk kommer til at være sandt. Idet n er 0, og 0 er mindre end 1. Så hvad betyder det indebærer? Gør det igen. Gør det igen. Gør det igen. Først når denne betingelse evalueres til FALSK. Hvis jeg skriver i 42. Nå nej, 42 er ikke mindre end 1. Derfor er denne sløjfe sker udførelse. Og så på det punkt, vil programmet sige, tak for den 42 i dette tilfælde. Nu hvor du har denne måde at udtrykke dig selv - Vi bør ikke vente på denne til slut. Det kommer til at tage noget tid. Fortsættes næste gang, måske. Men nu, du har evnen til at forhåbentlig at forstå et bit af geek humor. Undskyldninger. Dette er ikke repræsentativt for humor i datalogi verden, men det er nuttet. [Griner] Lad os ende på denne note. Og vi vil se dig på mandag. [Bifald]