[Powered by Google Translate] DAVID J. MALAN: Greit, dette er CS50 og dette er slutten av uke 1, så studere kortene er i og det totale antall av klassekamerater som du har dette året er 745. Og vi er så begeistret for å ha så mange av dere i løpet dette semesteret, men selv om dette kurset er så stor, innse at det er disse tingene som fredag ​​lunsjer, som kontortid, 15 personer deler, og så videre som er egentlig ment for å skape dette mer intim miljø. Så selv om vi kan samle en eller to ganger i uken, her i Sanders, vet at mye av din erfaring i dette kurset vil veldig mye være hands-on på sammen av dine klassekamerater og faglærere. Så her går vi, Fall 2012. Så husker at forrige gang vi endte på et notat av unøyaktighet, snakker om representasjon av tall. Og vi så på en av de feil som har skjedd i virkelige verden, når det kom til misforståelser hvordan datamaskiner fungerer. Vel, i dag skal vi besøke en av disse ideene som samt fortsette vår diskusjon av CS50 klient og C, og hva det egentlig betyr å programmere. Men først, bare et par virvelvindteknikkene kunngjøringer. Seksjoner begynner denne søndagen, og den første uken er alltid en litt av en rask start, fordi vi bare fikk i din del skjemaer. Vi gjør det samme nå, med undervisning stipendiater, nå at de kjenner planene sine, så vi sikter, etter Lørdag morgen, for å følge opp med deg med inndelingen oppdrag og TF. Innse at de vil starte neste dag, søndag eller mandag eller tirsdag. Og deretter vil vi imøtekomme delen endringer som de oppstår i dagene som kommer. Kontortid, i mellomtiden, er, igjen i kveld, 20:00 til 11, i Annenberg samt morgen kveld. Selv om problemet sett er vanligvis på grunn på torsdager midt på dagen, innser at du har opptil fem sent dager å bruke, derav tilgjengeligheten av kontortiden på torsdager hvis du kontanter i en av de sene dager og dermed sende noe på fredag. La meg foreslå at Scratch er blant de mer moro, blant mer lav nøkkel oppgavesett. Og jeg ville henge på de sene dager, strategisk, bare for senere i semesteret når livet begynner å komme i veien med midterms og andre klasser. Problem Set 1, i mellomtiden, ville bli lagt ut på kursets Nettside denne fredagen, som vil bli på kurset gange gjennom video, som vil bli filmet på 02:30 på fredag og deretter lagt ut på nettet av neste dag. Så vi endte på mandag. Jeg vil - faktisk, en merke seg her. Fordi klassene - fordi Sanders ikke låne nøyaktig seg til uformell Q & A og tilbake veldig godt, vi kommer til å prøve noe litt nytt i år, der Hvis du ikke er komfortabel å heve hånden eller du bare vil heller ikke heve hånden i et rom som dette, vi kommer til å ha noen av de pedagogiske stipendiatene og CAS bemanning cs50.net/discuss under forelesning. Så hvis du har et spørsmål fordi jeg var helt uklart om noe eller er du nysgjerrig på noen emne, prøve å legge den der. Merke den med en etikett av Foredrag, og vi vil gjøre vårt beste i dag og neste uke - vi vil prøve dette ut - til feltet det enten elektronisk, online, eller om det føles som vi skal virkelig ta det en masse, en av de pedagogiske fellows eller CAer vil heve sin hånd og spør anonymt på dine vegne. Så vi vil gi dette en sjanse og se hvor godt dette fungerer. Men, for all del, fortsett å heve hendene som du ønsker. Så siste gang vi viste at 10% eller en tiendedel er ikke i Faktisk, 0.1, som du lærte for mange år siden. Det er faktisk en verdi som dette. Men det er ikke helt sant, ikke sant? Vi må bare denne begrensningen i datamaskiner der, hvis du bare har en begrenset mengde minne, RAM, eller mer spesielt biter, vel, det er bare et endelig antall ting kan du representerer. For eksempel, hvis vi har tallet null, og vi ønsker å representerer i binær, med åtte biter, der litt, igjen, er en null eller en, kanskje vi representerer det som 00000000. Og det er litt unødvendig detaljert. Akkurat som i desimalsystemet i den virkelige verden, generelt, hvis du ønsker å skrive nummeret 123, vi mennesker sannsynligvis ikke skrive 00000123 selv om, funksjonelt, det er nøyaktig samme antall. Vi dropper ledende nuller, så å si. I binær, kan vi gjøre det samme. Binære og null, null og binære er bare null. Du trenger bare en enkelt bit. Men igjen, den vanligste måleenheten i verden databehandling er byte, åtte biter. Bare fordi en bit, ganske ubrukelig. Åtte biter, ikke veldig nyttig, men minst det er mer nyttige enn en enkelt måleenhet. Så med åtte bits, vil vi vanligvis representerer binær. Så her har vi tallene null, ett, to, og så, som Nate gjorde i videoen vår forrige onsdag, kan vi fortsette telle opp til sju, åtte. Og så hvis vi bruker mer og mer biter, vi kan telle opp til uendelig. Men hvis du bare har et endelig antall av disse bitene, er som tilfelle i ethvert datasystem, eller selv missil system, vel, faktisk du bare har en begrenset mengde av presisjon. Så hvis du ønsker å representere tall som 0,1, vel, Datamaskinen har å velge og vrake. Og hvis det har bare et begrenset antall tall det kan representerer, kan det komme nær 0.1 for deg, men det kan ikke nødvendigvis gi deg nøyaktig den verdien du ønsker. Og dette er bare en av utfordringene med datamaskiner, under panseret, heldigvis. Som vi flytte lenger i semesteret, disse lavere nivå detaljene blir mye mindre interessant, men absolutt anvendelsen av disse ideene kan ha noen svært virkelige verden konsekvenser. Den ene er en litt morsom. Hvor mange av dere har sett den fantastiske filmen Office Space? Hvis du ikke har, er at uoffisielle lekser for uken. Men i Office Space, fellows i den filmen tar nytte av nettopp denne ideen, men de faktisk stjal det fra en annen film som du kan ha sett, selv år tidligere. Så la meg gi deg noen sekunder av denne traileren fra denne fantastiske filmen, og dette er veldig mye faglig relevant. [SPILLER MOVIE] Egentlig jeg blir forfremmet. Jeg kan programmere et virus som vil rive det plassere seg big time. Vel, hvordan virker det? Hver gang det er en bank transaksjon der interessen er computertomografi, det er tusenvis om dagen, avslutter maskinen opp med disse fraksjoner av en cent. Men jeg har ikke tenkt å gjøre noe ulovlig. Ulovlig? Samir, er dette Amerika. Du må sverge til Gud. Hvis ingen vet om dette, men oss, ok? Ingen familiemedlemmer, ingen kjærester, ingen. [Uhørlig]. Ikke bekymre deg, mann, vil jeg ikke si det til noen heller. [Filmen slutter] All right, så kanskje jeg fant denne filmen bedre enn de fleste folk her, men i alle fall, viruset som de var prøver å skape - og i filmer, når de vil kalle noe et virus, Det er generelt ikke egentlig et virus. Det er bare et program som noen skrev å gjøre noe. Og i dette tilfellet ble gutta prøver å skrive et program som tok fordel av deres selskap kalt Innotech er datasystemet, hvorved datamaskiner, også, selv når det kommer til penger, kan ikke nødvendigvis representerer penger presist. Så selv om du kanskje har $ 0,10 på bankkontoen din, 0,10, vel, kan det hende at datamaskinen faktisk tror at du har dette mange cent i din bankkonto. Og så hva disse gutta var håper å gjøre - og de stjal ideen, viser det seg fra Superman III, hvor Richard Pryor gjorde det samme - de var i hovedsak skrive programmer som håper å ta alle de etterfølgende tall, alle de små, små, små fraksjoner av pennies, og siphoning de av slik at menneskene bare tanke, oh, det er bare $ 0.10 der, men alle av dem etterfølgende tall til slutt legge opp. Så en fantastisk idé, og det backfired hilariously i at spesiell film. Men i den virkelige verden, for det er mye mer om implikasjonene av disse slags ting. Og en av grunnene til å dykke inn i feltet av datamaskinen vitenskap er, igjen, dens anvendbarhet ikke til ingeniørfag alene, men bare for å andre felt også. Så dette er en mindre munter titt på hva som kan gå galt, men det er også ganske øynene åpne, tror jeg, når det kommer til forstå nøyaktig hvor allestedsnærværende teknologier som datamaskiner og programmering eller disse dager, i form av programvare. Så dette neste klippet er omtrent seks minutter, fortsetter der vi slapp forrige gang, men tillater oss å se litt mer i dybden på en slik av disse spørsmålene. La meg gå videre til der vi slapp, som var her. Og vi har en del to av to, for omtrent seks minutter her. [PLAY MOVIE] Plaget moderne rakett-teknologi. I 1991, med oppstart av den første Gulf-krigen, Patriot missil opplevd en lignende type tallkonvertering problem. Og som et resultat, ble 20 personer, 20 amerikanske soldater, drept og ca 100 andre såret, da Patriot, som var ment for å beskytte mot innkommende scuds, unnlatt å fyre av en rakett. Da Irak invaderte Kuwait og Amerika lansert en Desert Storm tidlig 1991, var Patriot raketter batterier utplassert for å beskytte Saudi-Arabia og Israel fra Irak Scud rakettangrep. The Patriot er en amerikansk mellomdistanse bakke-til-luft-systemet, produsert av Raytheon selskapet. Størrelsen på Patriot interceptor selv, det handler om omtrent 20 meter lang og veier ca 2000 pounds. Og det bærer et stridshode på om - jeg tror det er omtrent 150 pounds. Og stridshodet selv er en høy eksplosiv som har fragmenter rundt det. Casing av stridshodet er ment å virke som haggel. Rakettene er gjennomført fire per container og er transporteres av en semitrailer. The Patriot anti-rakett system går tilbake minst til 20 år nå. Det ble opprinnelig utviklet som en luftforsvar rakett til skyte ned fiendtlige fly, i den første Gulf-krigen. Når det krig kom, ville hæren til å bruke den til å skyte ned scuds, ikke fly. Air irakiske Force var ikke så mye av et problem, men hæren var bekymret scuds. Og så de prøvde å oppgradere Patriot. Avskjære fiendens rakett reiser på Mach 5 skulle å være utfordrende nok. Men når Patriot ble rushed inn i tjeneste, Hæren var ikke klar over en irakisk modifikasjon som gjorde sitt Scuds nesten umulig å treffe. Hva skjedde er scuds som var kommer i var ustabil. De ble wobbling. Grunnen til dette var at irakerne, for å få 600 kilometer ut av en 300 kilometer rekkevidde rakett, tok vekt ut av foran stridshode og gjort stridshodet lettere. Så nå Patriot prøver å komme på Scud, og de fleste av tiden, det overveldende flertallet av tiden, ville det bare fly av Scud. Når Patriot operatører innsett Patriot savnet sitt mål, detonerte de Patriot stridshode. For å unngå mulige tap, ble det tillatt å falle til bakken. Det var hva folk flest så, som store ildkuler på himmelen, og misforstått som fanger av Scud stridshoder. Selv på nattehimmelen, dukket Patriots å være vellykket ødelagt scuds, på Dhahran, kan det ikke være noen feil om ytelsen. Der mistet Patriot radar system spor på en innkommende Scud og aldri lansert på grunn til en programvare feil. Det var israelerne som først oppdaget at jo lenger systemet var på, jo større den tid avviket ble, grunnet en klokke innebygd i systemets datamaskin. To om uker før tragedien i Dhahran, den Israelerne rapportert til Forsvarsdepartementet at Systemet var å miste tid. Etter cirka åtte timer å kjøre, merket de at Systemet var blitt merkbart mindre nøyaktige. Forsvarsdepartementet svarte med å fortelle alle Patriot batteriene å ikke la systemene på for en lang tid. De sa aldri hva en lang tid var - 8 timer, 10 timer, 1.000 timer. Ingen visste. The Patriot batteri stasjonert ved brakkene på Dhahran og dens feil intern klokke hadde vært på over 100 timer på natt til 25. februar. Det spores tid til en nøyaktighet på omtrent en tiendedel av et sekund. Nå er en tidel av andre er en interessant tall, fordi det ikke kan uttrykkes i binær, nøyaktig, noe som betyr det ikke kan uttrykkes nøyaktig i hvilken som helst moderne digitale datamaskin. Det er vanskelig å tro. Men bruker dette som et eksempel. La oss ta nummer én tredjedel. En tredjedel kan ikke uttrykkes i desimal, akkurat. En tredjedel er 0.333 skjer for uendelig. Det er ingen måte å gjøre det med absolutt nøyaktighet i desimal. Det er akkurat samme type problem som skjedde i Patriot. Jo lenger systemet løp, jo verre tidspunkt feilen ble. Etter 100 timers drift, var feilen i tide bare om lag en tredjedel av et sekund. Men i form av målretting en rakett som reiser på Mach 5, det resulterte i en relativ volatilitet på over 600 meter. Det ville være en fatal feil for soldatene ved Dhahran. Hva skjedde er en Scud lanseringen ble oppdaget av tidlig varsling satellitter og de visste at Scud kom i deres generelle retning. De visste ikke hvor det kom. Det var nå opp til radaren komponenten av Patriot system, forsvarer Dhahran, for å finne og holde orden på innkommende fiendtlige raketter. Radaren var veldig smart. Du ville faktisk spore posisjonen til Scud og deretter forutsi hvor det sannsynligvis ville bli den neste gang radar sendte en puls ut. Som ble kalt serien gate. Deretter, når Patriot bestemmer nok tid har gått til å gå tilbake og sjekke neste plassering for denne oppdaget objekt, går den tilbake. Så når det gikk tilbake til feil sted, ser det da ingen innvende, og det bestemmer at det ikke var noen objekt. Det var en falsk deteksjon og faller sporet. Den innkommende Scud forsvant fra radarskjermen. Og sekunder senere, slengte den inn i brakkene. Den Scud drept 28 og var den siste sparken under den første Gulf-krigen. Tragisk, kom den oppdaterte programvaren på Dhahran den påfølgende dagen. Og programvaren feilen hadde blitt fikset, lukke et kapittel i den urolige historie Patriot missilet. PATRIOT er faktisk et akronym for "faset array Tracking Skjæringspunktet for Target ". All right, så en mye mer sørgmodig utfallet av ikke helt forstå denne verden. Og takeaway, egentlig, fra filmen er at løsningen Det var starte rakettforsvar hver gang på en stund. Og så igjen, en av målene for dette kurset, sikkert på en mer ydmyk skala enn disse programmene, er å virkelig åpne alles øyne til nøyaktig hvordan du går om lage maskiner gjøre hva du vil de skal gjøre og hvordan du går om å gjøre det riktig, mens underveis gjør det vel, elegant, og så videre. Og så i dag, la oss dykke inn i en litt mer av dette, men slik at vi ikke går for fort, spesielt for de mindre komfortable, men også slik at vi kan beholde interessen til de mer komfortable, la oss bare raskt begynne med litt av oppsummering av noen av disse ideene. Og igjen, spør unna, både i person eller online, hvis du har spørsmål slik at vi kan holde alle på samme side. Så CS50 Appliance, raske skritt tilbake, er hva med dine egne ord? Det er OK hvis du har ingen anelse om hva disse ordene kan være ennå. [Uhørlig] Ok, så en universell grensesnitt for - at vi alle kan dele. Absolutt. Så vi kunne, for eksempel, fortelle deg å gå til noen nettside, laste ned denne programvaren for Mac OS. Last ned denne programvaren for Windows, konfigurere i denne måten, og at. Men realiteten er da vi får utallige tekniske støtte problemer. Og også i disse dager, mye av hva som blir gjort server side, i verden av databehandling, spesielt når det kommer til webutvikling og web-baserte applikasjoner, er faktisk ganske ofte gjort på Unix eller Linux-maskiner, i motsetning til Mac eller Windows-PCer. Så blant oppsider, da, for å bruke dette som kalles CS50 Appliance er vi alle har det samme miljøet. Så alle er på samme side uansett hvilken maskinvare du kom til campus med, men også vil bli dabbling i nøyaktig det samme miljøet som du skal bruke mot semesters slutt også for webutvikling, samt i fremtiden for virkelige verden programmer derav. Så mer konkret, er det CS50 Appliance et gratis stykke programvare som lar deg kjøre et annet operativsystem, Linux, i dette tilfellet, på din egen datamaskin, i et vindu. Nå kan du ikke bare laste ned apparatet. Du trenger et program som brukes til å spille av eller bruke maskinen. Og at stykke programvare er generelt kjent som en hypervisor. Hypervisorer kommer i form av produkter som VMware, Virtual Box, Parallels. Alle slags selskaper gjør programvare, både gratis og kommersiell, likt. Hva du vil se i oppgave Set 1 er instruksjoner om hvordan du få gratis programvare som å kjøre CS50 Appliance. Og når du gjør det, vil du ha i et vindu på Mac eller PC, et skrivebordsmiljø som ser ganske som dette, hvor den har en Start-menyen-lignende ting i nederst i venstre hjørne. Den har en Hjem-mappen, eller Hjem-katalogen, i øvre venstre der, en søppelbøtta, og så videre. Så vi vil skille fra hverandre de nødvendige detaljer som vi går. Men la oss nå begynne å dykke inn i C. Så C er dette programmeringsspråk, ligner i ånden til Scratch, men langt mindre grafisk, men ironisk nok, langt kraftigere når du får kunnskapsrike med det. Så i C, skriver vi programmer ved å skrive kildekode, som er denne engelsk-lignende syntaks, ligner på sokker demonstrasjon som vi gjorde sist gang som lar deg uttrykke deg ganske nøyaktig, hvis arcanely, til datamaskinen. Så hva slags produkt programvare trenger du faktisk trenger å skrive programmer i et språk som C, basert på vår samtale på mandag? [Uhørlig] OK, du trenger bare en tekst editor. Du trenger ikke noen spesiell programvare per se å skrive programmer. Du trenger bare en tekst editor som Notisblokk, på Windows, TextEdit på Mac, eller noe som kalles gedit, i verden av Linux, som vi vil bruke her. Og det er det, å skrive programmene. Men skriving er bare halvparten av ligningen. Du da trenger å kjøre dem. Men for å kjøre programmer - du kan ikke kjøre kildekode. Du i stedet må gjøre det til det første? Ja. DAVID J. MALAN: Du må kompilere den. Og noen andre, kompilere kildekoden betyr - [Uhørlig] DAVID J. MALAN: Nettopp. Oversette det til nuller og enere. Fordi alle av oss, i disse dager, har datamaskiner som har CPUer, nesten alle som er tatt opp av et firma som kalles Intel, og Intel Inside, betyr at det er dette hjernen innsiden av datamaskin, kjent som CPU. Og en av de tingene som at hjernen fungerer er, det vet hvordan å forstå mønstre av nuller og enere. Den vet hva mønster av biter representerer tillegg, hva mønster representerer subtraksjoner, hva mønster av bits representerer utskrift, og skape en hørbar lyd. Så kort sagt, CPU, kombinert med operativsystemet, som er et stykke programvare som kjører på toppen av CPU, så å si. Sammen disse to stykker vet hvordan du kjører programmer som vi mennesker skrive. Så hvis jeg går inn i CS50 Appliance her, jeg trenger å åpne opp en tekst editor, og jeg kan få tilgang til denne i et par måter. Jeg kan enten gå til Meny, programmering, og da kan jeg velge - nope, ikke denne menyen. Jeg kan gå til Tilbehør / gedit her for å åpne min lille tekst editor. Eller enklere, kan jeg klikke på denne lille ikonet nederst venstre hjørne. Og nå får jeg dette miljøet her. Det er ganske minner om en enkel tekst editor, med bare en eller to forskjeller. I toppen, hvor markøren blinker nå, dette er hvor Jeg kan begynne å skrive min kode. I bunnen er dette som kalles terminal-vinduet. Og hva slags ting kan jeg gjøre i denne såkalte terminalvindu? [Uhørlig] Ok, så jeg skal kjøre kommandoer. Og noen av kommandoene vi kjørte på mandag var litt kryptiske i starten, men ls for listen, cd for change directory, rm, for fjerne. Så det er liksom en old-school måte å navigere din datamaskin, kun ved hjelp av tastaturet og tekstlige kommandoer, og ikke, generelt, ved hjelp av en mus. Men vi får se, lenge før, gir dette oss faktisk en litt mer kraft og litt mer presisjon med å uttrykke oss. Og så over her til venstre, vi bare kommer til å se, som vi begynner å skrive programvare, en liten oppsummering av program som vi har skrevet øverst til venstre. Men vi får se det igjen før lenge. Så la oss gjøre noe ganske enkelt her. La meg først gå videre og gå til Fil, Lagre, og jeg er bare kommer til å klikke på jharvard her, over til venstre, og jharvard er, igjen, navnet for mitt hjem-mappen, min personlige filer, meg nå er John Harvard, som dere alle vil snart være John Harvard i dette miljøet. Han fikk denne Hjem-katalogen, Mine dokumenter og så videre, som jeg ønsker å spare nå, denne filen i. Så jeg kommer til å kalle det hallo.c. Så jeg kommer til å gå fremover og klikker på Lagre, og nå hva jeg har her er en fane kalt hallo.c, så mye som en annen type editor. Så nå la meg gå videre og begynne å skrive et program. int main (void). Og da jeg bare gjorde sist gang, printf, for utskrift formatert, ("Hei, verden!" );. Nesten ferdig. Men jeg mangler et par detaljer. Hva mangler i dette programmet at jeg virkelig trenger for det å faktisk lage? Ja. [Uhørlig]? DAVID J. MALAN: Ja, så jeg trenger å inkludere standard I / O-bibliotek. Så dette må gå over main, så jeg skal bare gjøre noen plass for det der. Og jeg kommer til å gjøre # include . Og legg merke til de festemateriell der. Og som en side, er gedit litt brukervennlig, hvis noen ganger litt forvirrende, ved at den prøver å hjelpe øyne merke til hva linje med hva. Så det faktum at min markøren er rett ved siden av denne vinklet brakett, legge merke til hvordan det er å fremheve den andre vinklet brakett pluss denne. Og det er bare å trekke min oppmerksomhet til det faktum at jeg har symmetri. Og symmetri i programmering er vanligvis en god ting. Tilsvarende, hvis jeg flytter markøren til slutten, legg merke til hvordan den klammeparentes i kø for å vise at, ja, jeg har en åpen og et lukket, så å si. Greit, og jeg kan gjøre en annen ting. Det er ikke strengt nødvendig, men god praksis, for å si returnere 0. Og return 0 gjør hva for oss her? Eller betyr det? [Uhørlig] DAVID J. MALAN: Men ingenting er galt. Og ærlig er det vanskelig for mye å gå galt i en programmere denne korte. Så jeg bare være super eksplisitt at alt er vel. Jeg, den menneskelige, når jeg kjører dette programmet, vil trolig aldri se at 0. Vanligvis er disse tallene som blir returnert fra viktigste bare oppdra sine hoder til mennesker når noe går galt. Og du får en liten pop opp med å si systemfeil, en, to, tre, eller hva nummeret var at var faktisk returnert. Så noe annet galt med dette? [Uhørlig] DAVID J. MALAN: Så dette er ikke så mye en funksjonell feil men en estetisk opplevelse. Jeg bør nok sette i en ny linje karakter der på slutten av denne strengen, slik at vi faktisk flytte markøren til neste linje, og programmet ser bare litt penere. Så nå la meg gå ned til min terminal-vinduet og zoom tilbake igjen Og denne tingen her, det kalles spørsmålet. Det er bare minner meg på hvem jeg er, jharvard @ apparatet, hvor Apparatet er navnet på maskinen jeg er på. I parentes er dette tilde, den squiggle symbol, som representerer hva? PUBLIKUM: Hjem katalogen. DAVID J. MALAN: Hjem katalogen. Så det er bare en snarvei notasjon for å si at du er i den personlige mappen hvor alle filene går som standard. Så nå, her kan jeg skrive ls for listen. Og det eneste jeg ser her i øyeblikket er hallo.c. Og det er bra fordi jeg bare skrev dette. Så la meg gå videre og gjør hallo. Og legg merke til jeg ikke skrive foreta hallo.c. I stedet, jeg bare skrive basen navnet på filen, hallo. Og gjøre, som vi så på mandag, vil bare antyde at jeg ønsker den. c-fil. Så nå har jeg skrevet at hallo. Nå ser jeg dette ganske lang kommando og vil fortsette se dette igjen og igjen. Men for å være klar, clang, ordet som bare dukket opp, som er den faktiske kompilatoren. Gjør er bare en bygge verktøyet. Det er bare en mer brukervennlig program som sparer meg, i lang sikt, fra å måtte skrive ut utrolig kjedelig lang kommandoer sånn en. Så du kan kjøre Clang manuelt. Du kan skrive alt dette manuelt. Bare blir veldig kjedelig. Og så gjør er bare et program som forenkler våre liv og kjører mer komplekse kommandoer for oss. All right, så nå hva filen bør jeg ha i min nåværende katalogen? Ikke bare hallo.c, men også hei. Så hvis jeg vil kjøre hallo, husker at jeg sier dot slash, hvor dot betyr gå inn i gjeldende mappe, uansett hvor du er, og så kjøre programmet heter Hallo, og ja, nå, Jeg har hallo verden. Greit, noen spørsmål på arbeidsflyt eller syntaksen hva vi nettopp gjorde? All right, så la oss ta ting opp et hakk igjen. Så dette var underwhelming å bare skrive et program som bare noensinne sier Hei, verden. Så vi endret det, på mandag, for å si hei, David. Det er litt mer personlig, men like hard kodet som Første versjon. Så ikke alle som overbevisende. Men det finnes, i C, funksjoner absolutt foruten print, funksjoner som gjør at du får inndata fra brukeren. Og måten vi gjorde dette, den andre dagen, var som følger. Før jeg faktisk skrive ut noe, jeg først fikk noe fra brukeren. Så la meg gjøre dette igjen. String s, hvor s er bare en tilfeldig navn, her, for en streng, lik GetString. Så hva var GetString? Det blir åpenbart en streng, basert på navnet. Men hva er det, mer teknisk? Det er en funksjon. Så det er en funksjon som ikke kommer med C per se. CS50 ansatte skrev dette. Og så å bruke denne, kan du ikke bare ta stdio.h, Du må også ta med hva? Ja. Så cs50.h, som er bare en fil skrev vi for noen år siden. Vi installerte det på apparatet for deg sammen alle vanlige filer. Og så i disse første ukene av klassen, vil vi bruke dette bare for å forenkle prosessen med å gjøre svært grunnleggende ting som får inndata fra brukeren. Fordi vi vil se i et par uker, får inndata fra brukeren i en språk som C er faktisk overraskende komplisert, spesielt fordi du ikke vet på forhånd, vanligvis, hvordan mye ting brukeren kommer til å skrive i. Og når du ikke vet hvor mye data du kan forvente, trenger du ikke vet hvor mye minne til å tildele. Og hvis du faktisk har en motstandere bruker som prøver å hacke seg inn i systemet ditt, krasje datamaskinen, vel, vanligvis den første metoden for angrep er, akkurat som jeg gjorde på Mandag, skriver en hel lang sekvens med tilfeldige tegn, trykk Enter, og se hva bryter. Fordi generelt, hvis et program pauser, hint at en sikkerhetsfeil, potensielt. Det antyder absolutt på deg, programmerer, har gjort en feil, men mer farlig, kanskje du har gjort en sikkerhetsrelaterte feil, og generelt vil vi se at det er hvordan maskinene er kompromittert til denne dag, både i verden av web og programmer på kommandolinjen, som dette. OK. Så streng s tilsvarer GetString. Så mer konkret nå, hva linje 6 gjøre her? Så funksjonen til høyre får streng, tar hvor mange argumenter? Okay. Så ingen. En liten mental helse sjekk. Et argument, igjen, er bare en inngang til en funksjon for å endre sin standard virkemåte på noen måte. Men i dette tilfellet har jeg ikke lyst til å endre oppførselen til GetString. Jeg ville bare få en streng. Så jeg satte ingenting i parentes, og da jeg satte en semikolon demarking slutten av linje med kode. Nå likhetstegnet betyr ikke lik, per se. Det betyr oppdrag, noe som betyr plassere hva får outputted på høyre innsiden av det som er på venstre side. Så til venstre, sier vi at vi har erklært en string kalt s. Og mer spesifikt, har vi tildelt minne innsiden av som vi vil sette biter som representerer en sekvens av tegn. Men i dag har vi tildelt eller erklært en streng. OK. Så nå når jeg har gjort dette, vil jeg plugge i verdien av s, ikke verdien av David. Så dette er galt hvorfor? Så dette er bare bokstavelig hardkodet s. Det er å si "Hei, s", som er ikke hva jeg vil. Så jeg kan gjøre dette. Prosenttegnet er en plassholder, men nå trenger jeg å passere inn skrive et annet argument. Husker at argumenter til funksjoner er adskilt med komma, så neste komma her jeg satt etter dette brevet er. Og i denne sammenheng nå, s er variabel, og printf, ved mottak disse to innganger - strengen til venstre og variabelnavnet s på høyre - det vil plugge det sistnevnte i det tidligere for oss, og bare skrive ut en fin vakker streng med hva det er som vi skrev i. Så la oss prøve dette. Kommer til å gå videre og zoome ut, tilbake til min terminal-vinduet. Zoome inn på bunnen her. Skriv lage hello. Clang synes å ha vært reprise. Jeg kommer til å skrive. / Hallo, Enter. Ingenting synes å skje ennå, men det er på denne meldingen at jeg kan skrive noe sånt Nate, Enter, og nå har vi Hei, Nate. Og jeg kan gjøre det igjen med Rob, og så videre. Så forhåpentligvis nå dette programmet oppfører seg som jeg har tenkt. Nå, ikke alle som brukervennlig. Jeg har ingen anelse om hva som blir forventet av meg. Så vi kan sikkert rydde opp litt. La meg gå tilbake her oppe, og i stedet for bare dykking i og spør brukeren om en streng, la meg tydelig fortelle bruker det jeg forventer. Så printf ("Skriv inn en streng:" ); Så ingen variabler her. Ingen prosenttegn. Bare det enkle engelske uttrykket. La meg nå gå til bunns her og kjør programmet mitt. Men ingenting ser ut til å ha endret seg. Hvorfor? Jeg må rekompilere det. Så enkel feil å gjøre. Men du må ikke bare lagre filen, men rekompilere programmet. Og så hvis jeg re-run gjøre hallo, nå Clang går. Nå kan jeg kjøre. / Hallo. Og nå ser jeg "Angi en streng:". Okay. Nå er det litt mer brukervennlig. Nate, Enter, hallo, Nate. Vel, la oss prøve dette igjen og begynne å tenke om hjørnet tilfeller. Så akkurat som i Scratch, er du oppmuntret eller blir oppmuntret i spec å slags tenke på hva kunne gå galt hvis du ikke forventer alt brukeren måtte gjøre. Bugs, derfor kan følge. Så skriv en streng - hva er et hjørne tilfelle her? Hva er et scenario som jeg, programmerer, ikke kan ha forventet? Ja. Okay. Så hva om jeg skriver i en rekke som dette? OK. Så det fungerer fremdeles. Gramatically gir ingen mening. Men minst programmet fungerer. Hva er et annet hjørne saken? Noe jeg ikke forvente. Ja? Okay. Slik at vi kunne gjøre noe sånt som en virkelig, virkelig stort antall. Så la oss gjøre dette her. La meg zoome ut for et sekund, la meg fremheve. Kan ikke kopiere og lime inn her nede. OK. Så jeg kan ikke kopiere og lime inn i denne terminalen vinduet, så vi vil bare simulere det. La meg zoome ut, kommer til å brytes. Jeg har ikke tenkt til å gjøre dette for lenge, fordi det vil ikke faktisk bryte i dette programmet. Men det kunne. Enter. Men det gjorde det ikke. OK. Men det er en ekte hjørne tilfelle. Og den eneste grunnen til at opptrådt korrekt, så å snakke, er fordi CS50 funksjon GetString er faktisk designet under panseret, som vi skal se i et par uker, tildele mer og mer RAM, mer og mer minne fra operativsystemet, når det realiserer, wow, du har virkelig skrevet i noe ganske lang. Nå er dette litt av en hvit løgn. Hvis vi faktisk stoppet for en god stund, og jeg skrev i noe som 5000 millioner tegn på tastaturet her, eller virkelig treffer copy-paste ganske mye, vi ganske muligens kan føre til at programmet krasjer. Bare litt vanskeligere å simulere at med et endelig tidsperiode. Hva er et annet hjørne tilfelle vi kunne prøve? Ja? Ja. Så hvorfor ikke vi svare noe? Slik at vi faktisk nødt til å ta noen handling, fordi ellers programmet kommer til å sitte der å blinke hele dagen. Men hvis jeg bare trykke Enter - OK, nå ser fortsatt feil. Ikke krasje, men kanskje det er nå en mulighet til å begynne å implementere en mer streng program som kontrollerer faktisk. Og hvis strengen, den setningen, det ord som jeg skrevet i har lengde 0, vel, kanskje jeg bør kjefte på bruker, eller fortelle ham eller henne til å skrive inn en streng igjen, slik at vi faktisk får noe som ligner riktig atferd og ikke bare komplett oversikt for min del. Spørsmålet i ryggen? Desimaltall. Så vi kan prøve det også. 1,10000005. Virker som det kommer til å bare jobbe egentlig greit. Og som faktisk forventes. Selv om vi kanskje har skrevet at det nummeret, eller en større antall tidligere, innser at når vi skriver brukeren innspill og vi bruker den GetString funksjon, ikke Uansett om hva jeg skriver ser ut som et tall. Husker at i henhold til ASCII, alt på Tastaturet har en numerisk verdi som kan tilordnes til en karakter, en røye. Så i dette tilfellet, selv om jeg kanskje skrive inn et tall, den datamaskinen kommer til å tenke på det, så å si, som en streng - noe som ser ut som et tall, men er faktisk ikke et tall. Men det er faktisk en perfekt segue, for nå kan vi faktisk overgang til å skrive programmer som bruke andre datatyper. Så i tillegg til å bruke tegn, eller rettere sagt, foruten å bruke strenger, innse at vi har andre datatyper i C samt i andre språk. En røye, som navnet antyder, er bare ett tegn. En flottør er et flyttall, og det er bare en fancy måte å si et reelt tall - noe som har en desimal punkt i den med noen tall til venstre og / eller høyre. En int er et heltall, som er bare et tall som 123. Og nå mer interessant er ting som dobbel. Hva sa vi en dobbel var siste gang? Det er 64, høyre. Så mens typisk en float er 32-bit - så det er så lenge i minnet, bruker den 32 nuller og enere til representerer verdier - en dobbel er bokstavelig talt det dobbelte, noe som betyr at du kan enten representere større tall, eller du kan representere mer presise tall. Så du kan ha flere tall etter desimaltegnet, men som mannen sa i videoen, selv noe enkelt konseptuelt som 1/3 ikke kan representeres nøyaktig ved en datamaskin, fordi til slutt du kjører ut av biter, og derfor kan du bare gjøre .33333333 så mange ganger, at hvilket punkt du må bare si at jeg er ute av representasjon plass, må jeg bare kalle det en dag og representerer det noe upresist sånn. Og en lang lang - dum navn, men det er fordi det er en datatype som kalles en lenge i C som tilfeldigvis er ofte 32 bits, akkurat som en int er 32 bits, men en lang lang er generelt 64 bits. Så det betyr bare at du kan representere større tall enn dette. OK. Så hvis vi faktisk ønsker å starte representerer ting, vi kanskje mer sofistikerte typer, og det er derfor vi har streng. Så i CS50 biblioteket, som fil som heter cs50.h, har vi faktisk erklært en datatype, så å si, kalt streng, men streng faktisk ikke eksisterer. Dette er, igjen, en av disse lagene vi skal skrelle tilbake om en uke eller to, og kaste den bort, og faktisk se under panseret på hva en streng faktisk er, og hvordan det representert. Vi kommer også til å se på boolske verdier. Så hva var en bool i sammenheng med Scratch? Det er sant eller usant. Så det er bare en verdi som er sant eller usant, på eller av, 1 eller 0, men du ønsker å vise verden. Så i C, takket være CS50 biblioteket, som i sin tur inkluderer et annet bibliotek under panseret, har vi tilgang til en datatype som kalles bool, som vil bokstavelig talt tillate oss å tildele verdiene sant eller usant til ting i et program. Så la oss gå videre her og skrive et lite program som gjør noe som involverer tall istedenfor. Så la meg gå tilbake til CS50 Appliance, la meg gå videre og opprette en ny fil her kalt - la oss bare si noe enkelt, som math.c. OK. Og nå går opp til toppen av mitt program, jeg kommer til å gjøre den vanlige - # Include , slik at jeg kan bruke printf, int main (void) - vi vil komme tilbake til, til slutt, hva int betyr her, hva ugyldig betyr her, men for nå, bare vet at du må starte programmer som dette. Nå skal jeg gå videre og si noe litt annerledes - printf ("Gi meg et nummer:" );. Så jeg kommer til å gjøre int n = GetInt, fordi det svinger ut GetInt er en annen funksjon i CS50 bibliotek foruten GetString. Og nå skal jeg gjøre noe dumt, som "takk for% d, "for Desimalheltallet og deretter komma n, og deretter tilbake 0. Så igjen, gå tilbake 0 har ingenting å gjøre med antall jeg er spør brukeren om. Bare betyr på slutten at alle, formodentlig, er godt. Så la meg gå ned til min terminal-vinduet her. La meg skrive at matematikk, skriver. Og noe er galt. Gjør matematikk fungerte ikke. Her er den første av våre feilmeldinger. Hvorfor? Litt kryptisk, men - Ja. Så cs50.h. Så igjen, spesielt tidlig, vil du skrive din første program for pset 1 i seksjoner, i kontortiden, og ærlig, vil det være overveldende noen ganger hva disse tingene faktisk sier. Men vil du innse veldig raskt de begynner å falle inn bøtter der dette betyr at du har forlatt utenfor en av innbefatter # fra toppen av filen. Og Clang, kompilatoren, er å informere deg om dette ved sa heller fancifully, implisitt deklarasjon av funksjon GetInt er ugyldig. OK. Så hva betyr det? Det betyr bare at du har implisitt erklært GetInt i den forstand at du ikke uttrykkelig har erklært det. Eksplisitt erklærer int, må du lære Clang at den finnes. Og veldig enkel løsning for det er å lære det ved inkludert denne annen fil, cs50.h, på toppen av filen. Fordi bokstavelig talt, hva betyr # include er den forteller Clang ganske mye å gå finne filen som heter cs50.h, kopiere, lim den automatisk inn i toppen av programmet mitt for meg, og deretter konvertere kildekoden til nuller og enere. Men det ville selvsagt være veldig kjedelig hvis vi mennesker hadde å gå kopiere og lime disse store filer hele tiden, så # include bare gjør alt som automatisk uten muddying min kode med noen andre bibliotek. Og et bibliotek er bare en annen fil som inneholder funksjoner og andre ting som noen andre har skrevet, at vi er utnytte for vår egen skyld. OK. La oss prøve igjen. Gjør matematikk. Enter. Bra. Så det ser ut til å ha fungert. Så la meg nå gå matte;. / Matematikk. Inn gir meg et nummer, 123. Takk for 123. La oss nå prøve et annet hjørne saken. En streng er ganske raus, fordi en string kan være noe. Kan se ut som tall, ser ut som tegn, ser ut som ord. Men en int er en int. Så nå om jeg er den vanskelige brukeren, og det er å si "Gi meg et nummer, "hva hvis jeg prøver å gjøre noe sånt 0,1? Vel, det er et tall, og det er i samsvar med grammatikk jeg brukte her, men under panseret, jeg av Selvfølgelig bruker funksjonen GetInt. Så la oss se hva som skjer. Enter, prøv igjen. OK. La meg være vanskelig og bare trykke Enter igjen. Enter, Enter. Så nå ser det ut som GetInt er litt mer kraftigere enn GetString. Vi, de ansatte, gjennomføres på en slik måte at hvis vi oppdager du har ikke gitt oss en int - og en int er et desimaltall inneholder nuller, enere, toere, treere, firere, femmere, seksere, syvere, åttere, eller niere. Og det er det. Ingen desimaler, ingen tegn, ingen tegnsetting. Det ser ut til at vi må samarbeide. Så la meg prøve fire, fem, seks, og som får meg gjennom. Så egentlig, å være anal her, skal jeg nok si "Gi meg et heltall "for å formidle til brukeren akkurat hva jeg har tenkt. Nå la oss tenke på under panseret. Vi kommer ikke til å se på hvordan cs50.h er implementert i dag, det biblioteket. Men hvis det holder å si prøve, prøve, prøve, hva programmering konstruere jeg antagelig bruker under panseret for å gjennomføre det? Så bare en loop, ikke sant? En av de enkleste ideene som vi så på Scratch. The Forever konstruere, Gjenta konstruere. Antagelig i dette programmet, under panseret, selv selv om det er skrevet i C og ikke grunnen, det gjør noe som kalles tilsvarende for alltid hvis brukeren har ikke skrevet i et heltall, sier forsøke, forsøke, forsøke, forsøke, så så til slutt når vi får et heltall, så du bryte ut av som sløyfe. Så hva andre funksjoner kan vi bruke her i CS50 bibliotek? Vel, type det opplagte, minst basert på datatyper som vi nå vet eksisterer. Vi implementert GetString, GetInt, men i hele første ukene av begrepet, kan du også bruke GetFloat og GetDouble og GetLongLong for å få nøyaktig datatyper som du ønsker. Fordi nøkkelen detalj her er at i motsetning til enkelte språk, som Python og Ruby, hvor du ikke nødvendigvis trenger å erklære datatypen til en variabel - du trenger ikke å fortelle datamaskinen hva slags ting du kommer til å sette inn den variable - i C, må du være aldri så presis. Så hvis du ønsker en variabel kalt n, en del av lagringsplass at i dette tilfellet skjer for å være 32 bits av konvensjonen, du må fortelle datamaskinen at disse bitene er kommer til å lagre et nummer - ikke et tegn, ikke en streng, ikke en flåte. Og dette løser problemet vi effektivt kjørte inn i forrige uke. Hvis vi bruker nuller og enere tall til å representere ikke bare tall, men som og Bs og Cs, hvor i verden er en datamaskin skal vite at dette mønsteret biter faktisk representerer nummeret 65, i motsetning til å representerer bokstaven A, som tilfeldigvis, i henhold til ASCII, husker, var tilsvarende 65? Så disse datatypene gi kontekst til datamaskinen, så at den vet om disse bitene bør tolkes som en int eller som en streng. Eventuelle spørsmål, da, om dette? Ja? DAVID J. MALAN: Godt spørsmål. Hvis vi tar ut stdio.h, sparer vi filen - la meg gå ned til terminalvindu og kjør make matematikk, zoom inn og skriv - nå får jeg en annen feil, fordi jeg er implisitt erklærte hva fungere nå? Printf. Så nå har jeg laget et nytt problem, som løsningen er i hovedsak de samme. Jeg trenger å sette det tilbake. PUBLIKUM: [uhørlig] DAVID J. MALAN: Oh. Så hvis jeg tar ut - Ok, ja. Så hvis jeg fjerner standard I / O-bibliotek inkludering opp her, og da er du si hvis jeg bli kvitt printf, får kvitt printf? Ja. Dette bør fungere, fordi jeg ikke lenger bruker noen - whoops. Sa jeg bare ligge? Oh, okay. Dette vil ikke fungere på grunn av en ny feil vi nettopp introdusert. Og dette er en litt mer selvforklarende. Hva er problemet? Ubrukte variabel n. Så denne feilen er et resultat av at vi har konfigurert apparatet for å være spesielt pedantisk, for å virkelig kjefte på du for alle mulige feil, selv om det er slags en ikke-fatal feil som dette - er det virkelig så stor håndtere at jeg tildelt en int, sette et tall på det, og deretter bare gjorde ingenting med det? Så funksjonelt, nei. Som ikke kommer til å bryte programmet. Det er bare litt dumt, ikke sant? Det er ingen verdi å ha bedt om det nummeret, lagret det i en variabel, hvis du aldri kommer til å gjøre noe med det, om skrive det ut eller lagre den. Så i dette tilfellet er Clang erkjennelsen så mye, og det er å si ubrukte variable n. Så vi kan fikse dette hvis vi virkelig vil. Men igjen, dette er ikke god programmering nå. Så jeg bare kunne gjøre dette - gå ned her, la meg tømme skjermen, gjør matte. Det fungerer. Nå kan jeg kjøre min matte program, tar inngang - vel, det var så ille. Tar inndata, og det er alt det gjør det, i dette tilfellet. Så egentlig, la oss prøve en annen hjørne slik at vi tenkte ikke på tidligere. I dette tilfellet - her, la oss gå tilbake til en som er en litt mer brukervennlig. La meg gå tilbake hit og kjøre gjør matte igjen. Whoops, hva gjorde jeg galt? Fikk å rulle tilbake ytterligere. Okay. Nå er vi tilbake i den opprinnelige tilstanden, der alle er forhåpentligvis godt. Og nå hvis jeg kjører matte, synes 123 til å fungere. Men dette er egentlig ikke en effektiv bevis, bare for å si okay, fungerer det. 789, fungerer det. Tid til å sende. Fordi det er andre hjørnet tilfeller her. En streng ikke virkelig gi oss mye trøbbel ved å skrive inn en hel masse tegn. Men hva om jeg skriver i dette? Treffer nummer 1 en hel masse, mye her - all right, det blir litt kjedelig, så jeg kommer til å stoppe her, og jeg kommer til å trykke Enter. Hva faen skjedde? Så dette kan faktisk bli forklart. Så tok det det som binære? En god tanke, men nei, det er ikke det faktum at det tok det som binære, fordi faktisk, det var bare en slags tilfeldighet. Vi kan gjøre dette på nytt. Så det er ingen 2 i det binære systemet, som er sannsynligvis nok uansett. Enter. Så det var ikke problemet. Hva annet? Akkurat. Så tenk tilbake til hva en int faktisk er. Det er 32 biter som til sammen blir tolket som et tall. Hvis du har 32 bits, betyr at hver av de biter kan være 0 eller 1, 0 eller en 1. Så det betyr at det er to muligheter for denne biten, to muligheter for dette, to muligheter for dette bit - så det er 2 ganger 2 ganger - så det er 2 til 32 strømmen er det totale antall permutasjoner av nuller og enere hvis du har 32 plassholdere, nuller og ettall, foran deg. Så hvis jeg har 2 til 32, matematisk det er det? Så det er mye. Det er 4 milliarder kroner, gi eller ta. Og 4000 millioner ikke synes å være det som ble skrevet ut her. Faktisk ser dette nærmere 2 milliarder kroner. Men dette er ikke en tilfeldighet. Det faktum at maskinen har feiltolket mitt stort antall, min enorme sekvens av dem og deretter min enorme sekvens av toere, som omtrent 2 milliarder kroner, er forklart hvordan? Det er en cap på int. Det er en absolutt en maksimal verdi at du kan representere. Men det er vanligvis 4 milliarder kroner, ikke sant? Hvis 2 til 32 er omtrent 4 milliarder kroner, virker som liker det er det største antallet. Så ikke en rest, men en god tanke. Negative tall. Så hvis du har 4 milliard mulige ting du kan representerer disse ulike permutasjoner av 32 0s og 1s, vel, det står til grunn at vi mennesker kanskje ønsker å representerer ikke bare positive heltall men negative heltall. Og ja, det er en forutsetning at C gjør. Så med 32 bits, kan du representerer omtrent negative 2 milliarder hele veien opp til positive 2 milliarder. Og så i dette tilfellet, hva vi egentlig ser er bare utkanten av kapasiteten heltall, og vi har, så å snakke, overflyt et heltall. Vi har prøvd å stappe flere biter i det enn kan faktisk passe. Så sluttresultatet er vi i hovedsak har alle en bit. Vi har snudd alle våre biter på, har vi prøvd å representere det største antallet mulig, men det er helt klart ikke på langt nær stor nok til å representere de to tingene jeg har nettopp skrevet i. Ja? PUBLIKUM: [uhørlig] DAVID J. MALAN: Godt spørsmål. Hvorfor kan vi ikke bare representerer det negative signere som bare et tegn? Så vi absolutt kunne, og vi kunne deretter lagre en ekstra bit. Men du fortsatt nødt til å representere at dash, og som kommer til å koste deg i det minste noe, antagelig litt. Så ja, vi kunne ha 32 bits i bruk for våre tall, men nå vi trenger en annen bit brukes for dash vår symbol, minustegnet. Så nå har vi 33 biters verdier, som vi kunne gjøre, men det er bare ikke måten det er gjort. Vi har gjort en vurderingssak år siden, er 32 bits liksom den måleenhet her. Så vi kommer til å bruke en av de bitene effektivt til representerer negativitet, og 31 bits for å representere nummeret. Andre spørsmål? OK. Det er mye. Hvorfor ikke vi gå videre og ta våre fem-minutters pause her? OK. Så igjen, for ikke å overdrive de matematiske programmer programmering, la oss bare rive av dette ett eksempel før vi flytter inn i andre konstruksjoner, bare fordi det vil illustrere noen vanlige stumbling poeng på noen av det grunnleggende når det gjelder å skrive programmer. I dette tilfellet, gjør aritmetiske uttrykk som har noen interessant relevans til syntaks. Så dette er bare en formel som vi kan konvertere temperaturer fra Fahrenheit til Celsius. Hvis du ikke husker, er dette bare formelen. Så hvis vi kobler Fahrenheit verdi på 32 grader, noe som er frysing, som kommer til å være 32 minus 32 er 0, og ja, 0 i Celsius er også iskaldt. Så rask tilregnelighet sjekk der - det er det velkjente formelen. La meg gå over til apparatet, skjønt, og start skrive et program som heter, som, f2c; "Fahrenheit til Celsius dot c ". Og opp på toppen her, jeg kommer begynne med # include stdio.h, og jeg kommer til å gjøre int main (void), og igjen, vil vi komme tilbake i fremtiden om hva int betyr der og hva ugyldig betyr der. Og nå la meg gå videre og gjennomføre et program som hovedsak gjør denne konverteringen for oss. Så printf, la oss si, temperaturen i Fahrenheit. Og så la meg gå videre og få verdien fra brukeren. Hva slags verdi bør jeg få fra brukeren hvis jeg vil dem til å gi meg en temperatur i Fahrenheit? Ja? Hva ville du foreslå? Ja. Så float føles ganske rimelig. Vi har igjen, bare et par alternativer som vi har sett så langt. Vi har ting som røye, double, float, int, long long, bool, streng. Så av disse, føles float ganske rimelig. Vi kunne bruke en dobbel, høyre, fordi hvis vi virkelig ønsker å representerer et menneskes temperatur - 98.60000 - vi kunne bruke 64 bits å gjøre det, men det føles som overkill for temperaturen. Så la oss bare gå med flottør. Nå trenger jeg en variabel. Bare for å holde ting enkelt, jeg kommer til å kalle det f, men jeg kunne like riktig kaller det temperatur, men er enten fine. Så flyter f = GetFloat. Så snart jeg har nå besluttet å bruke GetFloat, skjønt, jeg trenger å gjøre en korreksjon. Ja. Så vi trenger å # include , ellers kompilatoren er kommer til å kjefte på oss. Nå som jeg har en flåte, la meg gå videre og gjøre det konvertering. Så først, la meg også komme inn i vanen her av kommenterer min kode. Så igjen, er en kommentar bare en notasjon til mennesket som finnes ikke en del av programmet per se, men det en, hjelper deg forstår hva du gjorde neste morgen, eller neste måned, det hjelper undervisningen stipendiat forstår hva du gjorde eller hva du hadde tenkt å gjøre, så det er generelt veldig god praksis. Hvert par linjer med kode, skrive en kommentar til deg selv eller din kollega. Så her, jeg kommer til å si, "Spør bruker for temperatur." Trenger ikke å være en hel setning, bare en kort setning. Men ideen bak kommenterer i C er at hver av dine kommentarer bør styrke deg - eller, si, en TF eller en kollega - å skumme programmet og vet nøyaktig hva den gjør, ved å ikke så mye å lese koden, men ved å lese kommentarene, som bør være konsis og klar. All right, så nå la meg gå videre og si, "Konverter Fahrenheit til Celsius. "Så jeg kommer til å gå videre og gjøre, la oss si, flyter c. Vi vil holde Celsius som et flyttall. Og la meg ta en stikke på dette. Formelen er, igjen, her oppe. Som 5/9 ganger F minus 32. Så la oss gjøre dette. Så 5 delt på 9, minus - whoops, rotet jeg det opp allerede. Times. Så 5/9 ganger F minus 32. Så F minus 32, semikolon. Og nå, her nede, jeg kommer til å gå videre og si ut resultatet. Og denne delen er lett. Printf. Hvordan går jeg om å skrive dette? Vel, jeg kunne si "Tallet i Celsius er% f \ n", bare for noen estetikk. Og så hva verdien ønsker jeg å plugge inn her som printf er andre argument? Okay. Så bare ca. Så vi vil starte med dette og så bare gå tilbake 0. Igjen, det har ingenting å gjøre med matematikk. Det betyr bare at alt er bra. Nå er dette riktig, dette programmet? OK. Så jeg har gjort noen feil. Selv om du ikke har noen anelse om hva programmering er, kan du sortere av antyde tilbake til grunnskolen hva feil her kan være. Hva er en av de første? PUBLIKUM: [uhørlig] DAVID J. MALAN: Yeah. Så vi mangler parenteser. Det var bevisst at jeg gjorde parentes i keynote skyv her, fordi det er faktisk dette begrepet for av drift, eller presedens, der visse operasjoner - multiplikasjon - har høyere binding, har høyere prioritet enn ting som tillegg eller subtraksjon. Så vi har gjort dette i årevis bare for å gjøre det klart nøyaktig hva matematisk operasjon bør gjøres først. Så jeg bør nok etterligne akkurat dette. Ellers, er datamaskinen formodentlig skal prøve å gjøre noe som dividere 5 av 9, deretter multiplisere F, og deretter trekke 32 fra hele greia. Som ikke er det, faktisk, hva vi ønsker å gjøre. Så la oss parenthesize. La oss legge til mine parentes her, parenteser her. La oss sette dette over her. Her, jeg la merke til en annen feil jeg gjorde underveis. Ja? PUBLIKUM: [uhørlig] DAVID J. MALAN: Ah. Bra. Slik at vi faktisk har samme heltall divisjon problemet fra før. Jeg korrigerer det, la oss se hva symptomet er. Men vi er nødt til å korrigere en andre feil her. Ja? PUBLIKUM: [uhørlig] DAVID J. MALAN: Ja. Så dum feil jeg gjorde, men utrolig viktig. Datamaskinen er ikke til å bare lukke øynene og la meg bruke kapital F, når jeg faktisk erklærte variabelen som en liten f her, i linje 8. Så jeg trenger å korrigere i linje 11 kapitalisering mitt, som en øyeblikk siden var en stor F ved en feiltakelse. Hva om her? Skulle dette være små også? Det skal være, men det er en tilfeldighet. At% f har ingenting å gjøre med variabelen. Så bare for å være super klar her, la meg gå videre og endre navn på denne, kort, "temperatur". La meg gi nytt navn dette "temperatur". La meg ikke endre navn på denne. Fordi, igjen,% f globalt betyr "flyttall verdi." Har ingenting å gjøre med variabel min. Men "temperaturen" all over the place er bare litt wordy, så jeg kommer til å gå tilbake til min liten "f" s. Nå, la meg gå videre ned til vinduet mitt her. Gjør f2c - som var igjen, vilkårlig navn jeg ga til denne filen. Synes å ha utarbeidet. La meg kjøre f2c. Enter. Temperaturen i celsius - la oss gjøre en enkel en. 32. OK, korrigere. Men, hvis jeg nå gjøre 212 for koking - faen. OK. Så klart ikke korrigere, hvis TF prøver minst to verdier. Så hva er problemet her? Vel, du har allerede sette fingeren på hva problemet er. Men hvorfor er det slik? Opp her, når jeg gjør regnestykket av 5 delt på 9. Så konseptuelt, det er helt riktig. Helt i samsvar med formelen. Men datamaskiner bare gjøre akkurat det du fortelle dem å gjøre. Og hva vi effektivt forteller datamaskinen her er dele heltallet 5 ved heltall 9 og gi meg resultatet. Problemet er, men når du gjør divisjon ved hjelp av data typer, er resultatet det samme datatype som inngangene. Og så hvis de to innganger er begge ints, blir utgangen går å være en int. Og så 5 delt på 9 er poenget noe. Men hva er det nærmeste heltall for å peke noe? Så, det er faktisk 0. Så som vi diskuterte mandag, alt etter desimaltegnet punkt blir avkortet. Det bare blir kastet bort. Så dette er en fullstendig feil, fordi jeg kan like godt bare multiplisere alt av 0 her. Nå kan jeg fikse dette i et par måter. Jeg kunne gjøre dette. 5,0 delt på 9,0. Teknisk sett trenger jeg ikke engang trenger å gjøre det. Det gjør nok å bare gjøre ett av tallene a float - eller dobbelt - ved å sette desimaltegn her. Fordi det som skjer nå er når du deler et heltall ved en flåte, eller en dobbel, er datamaskinen kommer til å realisere oh, er en av de mer presis. La meg feile på siden av å gi deg mer presisjon enn du hadde tenkt. Så det vil konvertere resultatet - det vil returnere resultatet som et flyttall også. Så det ville fungere. Dette ville fungere. Og det er en annen mekanisme som vi vil se i større detalj i neste uke. Du kan faktisk, som programmerer, fortelle datamaskinen å faktisk behandle en datatype som selv om det var en annen. Så jeg kunne faktisk gjøre dette. I parentes kan jeg si noe sånt (float), åpen paren, nær paren. Og dette er det som kalles "casting". Igjen, mer på dette neste uke. Men dette er bare programmatiske måten å fortelle datamaskinen, ja jeg vet 9 er et heltall eller en lang. Jeg vet det ikke er et flyttall. Men behandle det som sådan uansett. Så for å kaste en datatype betyr å konvertere fra den ene til den andre. Ærlig, er dette bare en liten stygg, så jeg ville foreslå vi gå tilbake til det opprinnelige forslaget av bare å konvertere disse tingene til flytpunktverdier manuelt. Fordi nå er det bare super klart hva som skjer, og det er ikke alle som distraherende. Så la oss nå gå tilbake til min terminal-vinduet. Gjør f2c. La meg gå videre og kjøre denne. Og, som en side, får du lei skrive disse kommandoene igjen og igjen, innser at datamaskiner, som Linux her, pleier å være ganske smart. Og hvis jeg slo opp, kan vi gå gjennom min hele historien kommandoer, opp og ned. Så i dette tilfellet her, kan jeg bare gå opp til å kjøre gjøre f2c. Jeg blir skreket til, fordi jeg bare gjorde det en andre siden. Det er allerede oppdatert. Så nå kan jeg kjøre f2c igjen. La oss prøve 32 Fahrenheit. La oss nå prøve 212 Fahrenheit. Puh. Synes å fungere. Nå, dette er bra, men det føles litt vilkårlig at Jeg viser seks tall etter desimaler. Rett? Hvis du er været person på TV, er du en slags doofus hvis du leser temperaturen til denne graden av presisjon. Så la oss forenkle dette. Så la oss faktisk gå opp her, til min printf. Og ja, jeg vil flyte. Men jeg ønsker å nå spesifisere presisjon. Og jeg kommer til å være litt konsis. Jeg kommer til å si, gi meg ett poeng etter desimal. Så snarere enn si% f, jeg kommer til å si% .1 f. Og dette betyr bare gi meg en posisjon etter desimaltegnet. OK. La oss prøve dette igjen. La meg igjen kjøre den etter kompilering. Og nå har jeg skriver i 32, og jeg får tilbake en mer konsis verdi. Og jeg kan skrive i, nå, 212, og få tilbake en mer konsis verdi også. Og det er andre ting du kan gjøre med printf. Du kan faktisk angi hvor bred antallet bør være. Hvis du vil ha polstring på det, slik at du kan høyrejustere eller venstre justere alle dine tall eller prøver å senter ting. Så skjønner det er lite triks du kan gjøre der. Men de bare koke ned til formatkoder, som vi har det. Så i form av denne utgaven av forrang. Dette er en veldig kjedelig bord å gå gjennom metodisk. Men innser at forfatterne av C har kommet opp med regler som spesifiserer hvilke operatører har høyere forrang, mer forpliktende makt, enn andre. Så mens i grunnskolen, vi generelt visste at det var multiplikasjon og divisjon, så addisjon og subtraksjon, så noen andre ting. I en verden av programmering, det er en mye lengre liste over ting. Og dette er ikke noe verdt memorere nå. Du vil få acclimated til det før lenge. Men akkurat som i grunnskolen, parentes generelt løse spørsmålene om forrang, ved å gjøre super klar til datamaskin og menneskelig alike hva er ment. Så vurdere dette bare en liten jukselapp der. Men de fleste av disse detaljene vi ikke får til for noen tid. OK. Nå, la oss bygge opp og bevege seg bort fra disse dum liten matematiske eksempler. Fortsatt bruke de samme grunnleggende, men starter uttrykke oss litt mer som Scratch. Så i Scratch, hadde vi disse boolske uttrykk. Og på engelsk, er en boolsk uttrykk hva? Sant eller usant. Det er noe som evalueres til sant eller usant. 1 eller 0. På eller av. Uansett hva du vil kalle det. Nå i Scratch, så brikkene som dette. Og det er kombinasjonen, på bunnen der, av tre puslebiter. En kombinasjon - noe som har blank og blank. Og deretter to boolske uttrykk innsiden av det. Så du kan neste boolske uttrykk for å få mer komplisert boolske uttrykk. For eksempel, hvis det er lørdag, og det er hyggelig vær, så gå utenfor. Eller noe vilkårlig sånn. Så du kan bli med boolske uttrykk for å komme opp med en større sannhet verdi, hvis svaret er basert på de mindre. Nå, i C, heldigvis, er denne kartleggingen faktisk ganske enkelt. Parentes bidra til å gjøre ting klart her. && Er hva betyr "og". Så det er slik vi kommer til å konvertere disse blokkene fra Scratch til C. Og for de forhold vi så i Scratch, på venstre hånd siden det kan jeg stable dem på samme måte i C. Hvis x er mindre enn y, så gjør dette. Else if x er større enn y, så gjør dette. Else logisk de må være like, så si at de er like. Så vi kan nå begynne å bygge disse tingene opp. Så la oss gjøre et eksempel. La meg åpne opp en fil som er på kursets nettside som Jeg skrev på forhånd. Som kalles nonswitch.c. Og vi vil se hvorfor på bare et øyeblikk. Så i denne filen - nonswitch.c-- først innse at det er en hel haug med kommentarer på toppen. Det er bare å forklare navnet på filen, hva det gjør, og så videre. Og det viser tilsynelatende bruk av boolske OG-ing - conjoining to uttrykk. Så la oss se hvordan dette programmet fungerer. Jeg har mine to filer, cs50.h og stdio.h. Hvis jeg ruller nedover, nå, til programmet, er det litt lenger enn vi har skrevet før, men ganske lesbar. Så jeg først ut til brukeren, på linje 18, "Gi meg et heltall mellom 1 og 10 år." Så det er rett der. Nå får jeg heltall. Men innser at GetInt - ganske enkelt. Det er bare kommer til å få en int. Det kommer til å sørge for at den får en int og ikke en streng eller en flåte. Men det kommer ikke til å gjøre noen form for grense kontroll. Det er ikke til å filtrere tallene for å være mellom en visst område. Så vi må gjennomføre det selv. Så akkurat som i Scratch, hvor jeg kunne gjøre en forbindelse av to uttrykk, kan jeg gjøre det i C som følger. Hvis n er større enn eller lik 1, og n er mindre enn og eller lik 3, jeg kommer til å veldig vilkårlig dekret som nummer å være et lite antall. Bare for moro skyld en uttalelse. Else if n er mellom 4 og 6, print "Du plukket et medium nummer. "Else hvis n er mellom 7 og 10, print" Du plukket en stort antall. "Else print" Du velger et ugyldig nummer. " Fordi logisk, følger at dersom vi har utmattet vårt utvalg. Så innser dette er ikke helt hvordan vi skriver større enn eller lik i en matte klasse. Rett? Du vanligvis trekke det ut som dette, med strek under det. Men det er ikke slike tasten på tastaturet mitt. Så symbolet i C for å uttrykke større enn eller lik er to tegn, og symbolet for mindre enn eller lik er to tegn i tillegg. OK. Så hvis jeg kjører dette programmet, kan du sikkert gjette hva det er kommer til å gjøre. Hvis jeg går videre og gjøre nonswitch, Enter. Og deretter kjøre nonswitch. Gi meg et tall mellom 1 og 10 år. Jeg kommer til å gi den 11. Jeg plukket et feil nummer. La meg prøve nummer tre. Jeg plukket et lite antall. Så ganske grei der. Hva om jeg ønsker å endre oppførselen til dette programmet, og gjøre noe litt annerledes i stedet? La meg gå videre og si dette. La meg bli kvitt alt dette. Og la meg si if (n == 42). Og så skal jeg gå videre og si print "Du plukket riktig svar. "Else vi kommer til å gå foran og si, printf ("Du valgte feil svar ");. Okay. Bare fordi. Nå, noen punkter vi kan gjøre her. En, det gjorde jeg ikke skrive symbolet som du tror er mest fornuftige. Når jeg ønsker å sjekke likestilling, viser seg at du ikke bruker likhetstegnet. Du i stedet bruke like likhetstegnet. Og hvorfor kan det være, bare intuitivt? Ja. PUBLIKUM: [uhørlig] DAVID J. MALAN: Riktig. Likhetstegnet er allerede brukt for tildeling. Noen hadde egentlig ikke tenke gjennom dette. Og så nå, når det gjelder likestilling testing, må vi være mer eksplisitt, og si lik lik. En veldig vanlig feil er å gjøre dette. Og hvis du er i kontortid eller en gang neste uke eller i neste to uker gjør du noe som dette, og deretter sliter med det for 10, 20 minutter prøver å finne ut hva faen bug er, skjønner at du er en av dem folk som har gjort denne feilen. Så super enkelt å lage. Men målet er nå å avverge dette feil. Dette kan vurdere, fordi det er dette egentlig si? Hvis n blir 42. Så verbet folk bruker, muntlig, uttrykke oppfatningen av oppdraget er "får". Så hvis n får 42. Så det betyr tildele 42 til n. Nå har jeg en boolsk uttrykk i parentes, innsiden av denne tilstanden, er verdien av disse 42. Rett? Fordi hvis du vurdere det fra innsiden og ut, den totale Svaret nå er 42. Så hvis jeg spurte deg spørsmålet, "hvis (42)," hva er som virkelig sier? Vel, kan boolske uttrykk bare være sant eller usant. 1 eller 0. På eller av. Så vi synes å ha et hjørne tilfelle her, hvorved alle en plutselig, jeg sier "if (42)". Det er ikke en boolsk verdi. Så hva datamaskiner gjør, skjønt, er det i hovedsak tilsvarer noe som ikke er 0 er tolket til å være sant. 1. På. De er alle tilsvarende funksjonalitet. Bare verdien 0 eller søkeordet falsk, som vi vil slutt se, er faktisk falsk. Så "if (42)" ville faktisk være sant, fordi det ikke er null. Så for å være mer presis her, er en boolsk verdi egentlig ikke så mye sant eller usant, men for denne tilfelle, hvis er 0 eller ikke-null. Så falsk eller ikke falsk. Og som tillater oss å omfatte alle mer muligheter i parentesuttrykk. Så vi må, aldri så nøye, sier dette - if (n == 42). Rett og slett fordi vi trenger å spesifisere en test av likestilling, ikke et oppdrag av en verdi. Hva annet er verdt å merke seg her? Disse klammeparentes er faktisk ikke nødvendig. Jeg har gjort dem bare for å være nit-kresen her. Men når du har en tilstand som bare har én linje av kode, som bekvemmelighet, trenger programmerere ikke trenger å bruke de klammeparentes. Det er nok å bare strekpunkt for estetiske grunner, og deretter skrive linje med kode. Bare når du ønsker å skrive to linjer med kode - for eksempel, ellers printf ("Bye!"). Hvis du ønsker å gjøre det, er dette brutt. Du kan rykke alt du vil, men det faktum at du har skrevet to linjer med kode uten å bruke klammeparentes betyr at dette programmet ikke ville kjøre riktig eller kanskje ikke engang kompilere riktig. Så for nå, for å være ærlig, tror jeg det beste vane er bare bruke klammeparentes, og du vil finne at de gjør super klart hva som skjer. Også, som en side - spesielt hvis du er blant dem som bruker de anbefalte bøker eller ressurser online - innse at det er denne oppfatningen av stil i programmering. Og noen mennesker faktisk foretrekker å sette krøllete brace over her på en linje. Noen mennesker foretrekker å gjøre latterlige ting, liker sette dem her. Det er ingen feil svar når det kommer til stil, men dette er feil. Men noen mennesker gjør det. [Latter] DAVID J. MALAN: Så jeg nevner dette nå, rett og slett fordi så du lese opp på ting i bøker eller på nettet, du kommer til å få ulike meldinger fra ulike lærere og forskjellige forfattere. Og bare innse det, funksjonelt, de er generelt tilsvarende, men vær konsekvent. Så i dette tilfellet, vil vi standardisere på krøllete bukseseler kø her til venstre. OK. Så la oss gå videre nå og kjøre denne, og se hva som skjer med dette programmet. Gjør nonswitch. Deretter kjøre nonswitch. Gi meg et heltall mellom 0 og - så det er ikke relevant lenger, men jeg skal bare vilkårlig si 42. Og jeg plukket det rette svaret. Vel, la oss faktisk ta dette i en annen retning. Det viser seg at det er noen andre syntaks vi kan bruke i et program. Her er et nytt stykke av syntaks som er funksjonelt det samme, men introduserer bare en annen måte å uttrykke oss selv. Så dette er det som kalles en "bryter uttalelse." Og en bryter uttalelse virker som følger. Det tar, i parentes, en verdi som du vil "Bryter" på. Du ønsker å oppføre seg annerledes basert på verdi. Så dette betyr bryteren på verdien av n. Og hva betyr dette? Vel, hvis n er 1 eller 2 eller 3, gå videre og skrive ut "Du plukket et stort antall "og deretter bryte. Grunnen til pausen er at veien C fungerer er som snart den finner en sak som matcher, begynner det å utføre all koden nedenfor den. Så hvis jeg har en linje med kode, som jeg gjør her på linje 27, den blir henrettet. Hvis jeg legger en annen linje her, det blir henrettet. En annen linje her, det blir henrettet. Programmet stopper bare utfører det som er under gjeldende sak uttalelse når jeg eksplisitt si "break". Så galt. Høyre, i dette tilfellet, som et resultat. Tilfelle 4 eller 5 eller 6, på samme måte, kommer å skrive ut en melding. I dette tilfellet, middels antall. Bryte. Sak 7, 8, 9, 10, kommer det til å skrive ut "Du plukket en stor nummer. "Break. Og så er det bokstavelig talt et nøkkelord som heter "default" det er effektivt som "annet" konstruere. Så ny syntaks, men intellektuelt, ingenting i det hele tatt ny her. Det er akkurat som Scratch. If, else if, else om, liksom blokk. Så det er slått versjon av dette programmet. Men merker at vi gjorde det med tall her. La meg åpne opp en ny versjon, bare for å vise noe litt mer konkret. Så her har vi karakterer i stedet. Det viser seg at du kan bruke brytere ikke bare på heltall, men på tegn. Ikke i alle datatyper, men minst på karakterer. Så her kan vi gjøre noe sånt hvis verdien av C som brukeren skrev inn, i linje 19, ved å bruke getchar funksjon, er hovedstaden A eller små bokstaver a, la oss tolke det som en klasse, og sier de plukket en utmerket klasse. Og ned langs bryteren uttalelse, har vi andre tilfeller for "B" s og "C" s, og så videre. Men la oss nå avrunder en annen ting. Og igjen, type fly gjennom noen av disse eksemplene. Men det er egentlig slik at vi kan bruke dem nå - eller egentlig, bare oversette dem nå - til C. Så la meg gå videre og gjøre dette. Jeg kommer til å åpne opp en ny fil. Og jeg kommer til å gjøre er . Og så skal jeg gjøre int main (void). La meg lagre denne filen som et loop.c. Bare som et eksempel. Og jeg kommer til å gå videre og gjøre følgende. Jeg ønsker å skrive en svært langtekkelig program. Så 10. La oss gjøre dette. 9. OK. Så snart du begynner å gjøre dette i programmering, er du sannsynligvis gjør noe galt. Men vi vil starte der allikevel. Oops. Det er faktisk feil. 7. 6. 5. 4. Ingenting kommer til å skje når vi kommer til 0. 3. 2. 1. Okay. 0. Slett. OK. Så tilbake 0. Så dette programmet er åpenbart kommer til å gjøre det veldig tediously sier det kommer til å gjøre. Det kommer til å skrive ut alle disse verdier, fra topp til bunn. Så la meg gjør loop. Og så - whoops. Gjør loop. Jeg var i feil katalog. Og nå la meg kjøre loop. Enter. Woohoo. Veldig hyggelig. Nice, langt program. Greit, men nå la oss gjøre dette bedre. Akkurat som i Scratch, når du begynte å bruke en looping konstruere, i stedet for bare å kopiere og lime alle puslespillbiter, la meg presentere denne tingen. Så i C, er det ulike looping konstruksjoner, en som ser ut som dette. En "for" loop har tre ting, atskilt med to semikolon. Og deretter, på innsiden av kroppen av loopen, så å si - den ting innsiden av klammeparentes - Vi kan gjøre noe igjen og igjen. Så det jeg har her på skjermen, er dette bokstavelig talt bare en kommentar. Den / / betyr her kommer en kommentar. Dette er ikke-kode. Dette er bare engelske beskrivelsen, for meg, det menneskelige. Så initialiseringer, betingelser og oppdateringer. Vel, la oss se hvordan dette fungerer. Dette tillater meg å skrive dette programmet som følger. For - så her kommer min sløyfe - int i - her kommer en variabel kalt "i" - blir initialisert til 10 år. Så det er min initialisering. Jeg ønsker å gjøre denne sløyfen så lenge "i" er større enn eller lik 0.. Og på hver iterasjon av denne sløyfen, vil jeg å gjøre jeg -. Så vi så + + på mandag. - Er det motsatte. Det reduserer verdien av en. Innsiden av denne sløyfen, ønsker jeg å faktisk gjøre noe. Så jeg kommer til å si noe sånt som printf. Jeg ønsker ikke å si 10 nå, fordi dette åpenbart er bare kommer til å skrive ut den samme verdi. Hva ønsker jeg å skrive ut i stedet, sannsynligvis? Ja. Så "i". Så% d, jeg. Så jeg kommer til å stjele en av disse ideene fra tidligere - Dette erstatning for formatkoder - og deretter ned her, nederst, vil jeg returnere 0, bare for godt mål. Men nå har jeg en mer konsis program. Det er bare noen få linjer, og ikke noen 10 eller 11 linjer. La meg gå til min rask her nede. Remake loop. Kjør loop. Og det synes å være det samme. Nå er programmet ikke mer interessant. Men nå kan jeg skrive noe sånt som dette. Jeg kan endre dette til 100 år. Da kan jeg rekompilere programmet mitt. Og da kan jeg re-run mitt program. Og nå går det superraske på dagens datamaskiner. Men det jeg har - og faktisk, min Rulleminne buffer ikke selv gå så langt. Det vi går. Så det har vi alle 100. Men det er lett å gjøre feil her. Hva kommer til å bli forventet oppførsel hvis jeg uhell gjøre det? Så det føles som uendelig. Så la oss se om maskinen oppfører seg. Så la meg gå videre og gjøre loop. Og la meg kjøre loop. Så la oss komme tilbake til det i løpet av et øyeblikk. Vi vil la det kjøre. Fordi hva skal vi telle opp til, minimalt? Sannsynligvis minst 2 milliarder kroner, hvis vi har så mange biter, og vi bruker positive verdier. Så la oss hoppe tilbake hit. I tillegg til disse typer løkker, har vi det som kalles mens sløyfer. Så, akkurat som i Scratch, hadde du Alltid blokker, og du hadde Gjenta blokker. Tilsvarende, i C, du må bare andre måter å uttrykke deg selv. Så du har denne oppfatningen av en stund loop som lar deg uttrykke deg litt annerledes. Og da har du noe som heter en gjør-mens loop, som opererer litt forskjellig så vel. Og vi vil erte disse fra hverandre over tid. Men la oss ta en titt på denne siste her. Hvis vi går inn i - fortsatt kjører. Det er ganske uendelig. Så la meg gå til positivt og viser hvordan vi kan faktisk styre brukerens input litt mer effektivt. Det er en ganske kort program. Og her har vi i hovedsak en int n erklæringen. Så gi meg en variabel kalt n. Nå, jeg bokstavelig talt si "Gjøre." Og så har jeg fått åpne krøllete spenne, nær krøllete brace. Og deretter oppdager, rett etter det, sier den mens n er mindre enn 1. Så merke til at disse linjene - 19-24 - komponere sammen en do-while-løkke. Og igjen, ny syntaks, ikke en ny idé. Det er bare en annen måte å looping, syntaktisk. Så hva gjør dette? Gjør følgende mens n er mindre enn 1. Så hva ønsker jeg å gjøre? Jeg krever at du gir meg et positivt heltall. Da jeg faktisk prøve å få et heltall fra brukeren. Men i forhold til rekkefølgen av operasjoner her, fordi mens tilstanden er her nede, jeg så kommer til å sjekke, er n mindre enn 1? Så antar at brukeren - etter blir krevd i denne måten - typer i verdien 0. Denne tilstanden kommer til å være sant eller usant? Vel, det er faktisk kommer til å være sant. Fordi n er 0, og 0 er mindre enn 1. Så hva betyr det? Gjøre det igjen. Gjøre det igjen. Gjøre det igjen. Bare en gang at tilstanden USANN. Hvis jeg skriver i 42. Vel nei, er 42 ikke mindre enn en. Derfor denne sløyfen er gjort gjennomføre. Og så på det punktet, vil programmet si, takk for den 42, i dette tilfellet. Nå som du har denne måten å uttrykke deg selv - Vi bør ikke vente på dette til slutt. Det kommer til å ta litt tid. Å bli videreført neste gang, kanskje. Men nå har du muligheten til å forhåpentligvis å forstå en litt geek humor. Unnskyldninger. Dette er ikke representativt for humor i datavitenskap verden, men den er søt. [Ler] La oss slutten på dette notatet. Og vi vil se deg på mandag. [Applaus]