[Powered by Google Translate] David J. Malan: Ok, er CS50, og det er start af uge to. Tak. Lad os begynde her med et telefonopkald. Jeg er ved at ringe 617-BUG-CS50. CS50: Dette er CS50. For Shuttle Boy Tryk på 1. Til at starte forfra, skal du trykke 9. DAVID J. Malan: Så sagde han til Shuttle Boy Tryk på 1. Så vi kommer til at trykke på 1. CS50: Hvad er din oprindelse? For quad Tryk på 1. Mather, tryk 2. Boylston, trykke på 3. Lamont, tryk 4. Mem Hall Tryk på 5. Til at starte forfra, tryk 0. DAVID J. Malan: Vi vil trykke 1 for quad. CS50: Næste rumfærgen blade dette øjeblik ved 1:10 PM, og derefter at 1:20 PM. 01:30, 13:40 Det er CS50. DAVID J. Malan: Så dette er CS50 stemme. Og det er et eksempel på den slags afsluttende projekter, Du kan f.eks bide mod I slutningen af ​​semesteret. For eksempel findes der shuttleboy.cs50.net - faktisk et projekt, som jeg først skrev efter at have taget CS51 tilbage, da jeg var en undergraduate. Og inspirationen her var dengang, alle de havde var de trykte shuttle bus tidsplaner, og der var ingen begrebet kigge tingene op online. Og så jeg slags due i en weekend, hældes gennem trykt tidsplan, og porterede den til et edb-program. Dengang skete det computerprogram, der skal skrives i C. Og du faktisk kørte det ved at skrive Shuttle Boy på en blinkende bede ligesom vi har gjort hidtil. Men i årenes løb, er det udviklet sig til en øjeblikkelig messaging bot. Det er udviklet for nylig på denne hjemmeside, i en SMS-baseret værktøj, samt i denne stemme-baseret værktøj. Og det er at antyde den slags ting, som du kan gøre for dig selv ved semesters afslutning. For eksempel, der SMS version af Shuttle Boy sker til at fungere som følger. Hvis det på din mobiltelefon, kan du sende en SMS til 41.411 og derefter sende den særlige symbol sboy, for Shuttle Boy, efterfulgt af A og B, hvor A er en oprindelse og B er en destination - for eksempel Boylston Space Quad - hvad du skal komme tilbage inden for få sekunder er en tekst besked fra Shuttle Boy fortæller dig præcis, hvornår den næste par pendulkørsler er, fra dette punkt A går til at punkt B. Og det er en mere generel eksempel på, hvad der er kendt som hjælp af en API. Så for eksempel, er dette her bare shuttleboy.cs50.net, den egentlig webbaseret inkarnation af dette. Men de data, der understreger dette og andre programmer, der CS50 har udviklet er alle udsat for alle her i form af API'er. application programming interfaces Og det er bare en fancy måde at sige, at folk kan lide vi på Internettet og andre har brugt en del tid på at oprette software, som du kan bruge for at få fat i data fra os og derefter bygge dine egne programmer på toppen af det pågældende datasæt. Så for eksempel, denne Shuttle Boy API side her, som sker for at være i CS50 manual det væsentlige dokumenter hvordan du kan gå om at spørge CS50 servere til data. For eksempel, hvis du er fortrolig med CSV-filer, komma separeret værdier, er disse lige slags hurtig og beskidt Excel-lignende filer. Så du kan bede Shuttle Boy til alle data om alle de huse og deres GPS-koordinater, og du får tilbage i det væsentlige et regneark som det at du kan så læse i et program på din egen og derefter generere resultater, ligesom Shuttle Boy selv sker at gøre. For de mere velkendte, mere moderne datarepræsentationer omfatte JSON, JavaScript Object Notation. Noget vil komme tilbage til dig mod I slutningen af ​​semesteret. Men igen, dette er blot et af flere af CS50 egen API'er. Og det spændende er nu, i disse dage, Facebook og Twitter og Google og stort set hver populære websted ud der har en form for API, hvilket betyder, at hvis du læser dokumentation på deres hjemmeside, du tilmelder dig en konto, kan du så begynde at skrive software på toppen af de redskaber eller data, som selskab der giver. Og så en af ​​vores egne undervisning stipendiater et par år tilbage skrev en Mac-version af dette. Så på på linket Mac her øverst til venstre, kan du faktisk downloade en Mac OS widget, der kører på din egen Mac til at gøre det samme slags ting. Så det handler om at bygge oven på datasæt som disse. Men mere om det i slutningen af ​​semestret. Så lad os dykke i virkelig hurtig til en fejl, bare for at slags får tingene varmes op i dag, og tænker tilbage på nogle af de ting, vi så på i sidste uge. Især lad mig gå videre og trække op, sige, dette eksempel. Buggy1.c, det er tilgængeligt på kursets hjemmeside, hvis du vil gerne hente det og stikke omkring dig selv. Men lad os zoome ind her på dette forholdsvis korte program, og bare en super-hurtig resumé af nogle af de grundlæggende byggesten, vi virkelig vil bare begynde at tage for givet. Så den blå ting, i linjerne 1 til 9 er bare softball spørgsmål. Så dette er blot kommentarer. De har ingen funktionel betydning. Men de er kommentarer i den forstand, at de er bemærker, at I, det menneskelige, til mig selv, så i foredrag og efter foredrag, kan jeg faktisk huske, hvad dette program gør uden at skulle læse igennem den linje for linje og genskabe historien i mit sind. Desuden, hvis jeg aflevere dette program til en anden lignende dig, er det meget klarere for dig, på grund af kommentarer som denne, hvad programmet er faktisk laver, eller i det mindste hvad Programmet er meningen at gøre. Hvorvidt det er korrekt, er en helt anden sag. Nu, i C, med flere linjer kommentarer, minde om, at på linje en her er det magiske symbol, / *. Det betyder her kommer starten på en kommentar. Og intet andet spørgsmål, indtil du når til slutningen terminator, som er * /, det modsatte. Så det faktum, at jeg har 80-nogle underlige stjerner her fra venstre til højre er egentlig bare en æstetisk detalje. Det ikke har nogen funktionel betydning. Nu hvor omkring linje 11? Hvad betyder dette gøre i lægmandssprog? Hvad er det? PUBLIKUM: Omfatter standard. DAVID J. Malan: OK, godt. Således er den stdio.h bibliotek. Så hvad betyder det? Nå, indeni, fil, stdio.h, er en hel bunke af funktionserklæringer - det vil sige, kode, som en anden skrev. Og et perfekt eksempel på en funktion, der er angivet i stdio.h er - som favorit ved nu? Så printf, en af ​​de mest almindelige brug, bestemt tidligt, fra at biblioteket er der. Hvis jeg udelukker, at linje kode, der Dunk vil råbe på mig noget om at bruge en sort symbol. Sort Noget er nok nøgleordet, fordi Vi har ikke informeret compiler hvad printf ser gerne medmindre vi medtage denne linje. Og mere ned på jorden, virkelig, hvad denne linje siger, er åbne denne fil, stdio.h, hvor det er på serverens harddisk eller apparatets harddisk, og copy-paste det lige der i min fil, uden at jeg at skulle gøre det manuelt. Nu, når vi kommer herned til main, vi inden længe vil begynde drilleri fra hinanden hvad int og hvilke hulrum er. Men for nu, lad os se på de tre linjer inden for 15 til 17. Det her jeg krav på som buggy. Linje 7 i mine kommentarer, siger "Bør udskrive 10 asterisker men ikke. "Hvorfor dette ikke udskrives, i virkeligheden, 10 sådanne stjerner? PUBLIKUM: [uhørlig]. DAVID J. Malan: Præcis. Så bemærke, at vi er begyndt at tælle fra 0. Og det er faktisk en konvention i programmering og datalogi mere generelt begynder at tælle fra 0 i stedet for 1. Og det er virkelig bare skyldes, at der for Fx når vi havde otte mennesker op på scenen, når der var ingen, hæve deres hånd, var de alle effektivt nuller. Og så er det bare sådan en computer konvention, så, derfor, at begynde at tælle fra 0. Hvis det er det laveste antal, du kan repræsentere i binær. Så her har vi begyndt at initialisere i til 0. Vi har sat i lig med 0. Men da jeg lavede denne fejl her, siger jeg er mindre end eller lig med 10. Men hvis du tror, ​​igennem, hvis jeg starter på 0 og derefter går jeg op til 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, jeg faktisk går til udskrive 11 stjerner til skærmen, fordi jeg har gået op til og lig med 10. Så den nemme løsning her derefter er hvad? PUBLIKUM: [uhørlig]. DAVID J. Malan: Bare ændre den til mindre end. Hvis du virkelig vil, kan du gøre det her. Men generelt er det ildeset. Og så begynder at tælle fra 0 er bare noget du bør typisk vænne sig til. Nu, hvad hele denne konstruktion i sig selv? Denne linje 15 demarks en for-løkke. Så for er ikke en funktion. Det er bare en erklæring. Det er en looping konstruktion, ligesom vi så det i Scratch. Og det har tre dele. Bemærk, at der er den første del til til venstre semikolon. Der er den midterste del mellem de to semikoloner. Og så er der den højre del til højre i den anden semikolon. Nu er den første af disse gør hvad? PUBLIKUM: [uhørlig]. DAVID J. Malan: Tilbage er der? Ja? PUBLIKUM: Initialisering. DAVID J. Malan: Initialisering. Så hvad betyder dette? Vi har erklæret en variabel kaldet i. Det er af typen int, fordi jeg har angivet int i. Og jeg initialisering i til værdien 0. Så hvad er det egentlig sige? Det er effektivt at sige til computeren hey, giv mig nok hukommelse, nok RAM, til at passe et nummer, og derefter sætte nummer 0 i denne bid af RAM. Og som en sidebemærkning, er hvor stor en int typisk, i det mindste indenfor af apparatet? PUBLIKUM: 32 bit. David J. Malan: 32 bit. Så det betyder at give mig 32 bits, ellers kendt som 4 byte, og sætte værdien 0 i det, som er temmelig let, fordi Det betyder blot indstille alle bits til 0. Så nu, den anden del her er betingelsen. Og tilstanden, som navnet antyder, er hvad der kontrolleres igen og igen og igen, om det er sandt eller falsk. Så dette er bare at sige gøre følgende linjer kode - nemlig linje 16, fordi det er den eneste indrykket en nedenunder - så længe i er mindre end 10. Og efter hver iteration gennem denne løkke, skal du gøre optælling, som i dette tilfælde er i + +. Nu, behøver det ikke at være i + +. Det kunne være i -. Men hvis jeg gjorde det, hvad den adfærd går være af dette program? PUBLIKUM: Det kommer til at være en uendelig løkke. DAVID J. Malan: Det kommer til at være en slags uendelig løkke, medmindre vi får heldige efter negativ 2 mia eller deromkring. Måske tingene skal ombrydes, blot i kraft af den begrænsede Antallet af bit, som vi har tildelt til en int. Men det er helt sikkert kommer til at gentage langt mere end 10 og sikkert mere end 11 gange her. Og nu, lige som en sidebemærkning, indse, at jeg + + og i - er virkelig bare syntaktisk sukker. Det er bare stenografi notation for, hvad der er lidt mere udtrykkeligt er skrevet som følger: i = i + 1. Som er identisk med i + +. Det bare slags ser pænere at sige jeg + +. Det er mere kortfattet, mere læsbar. Og så de fleste mennesker gøre det i stedet. Men dette er identiske funktionelt til hvad vi lige har set. Så kort sagt, er den nemme løsning her bare for at sige gentage i fra 0 hele vejen op til mindre end 10. Og så vil vi faktisk få 10 stjerner. Så lad os prøve dette. Jeg vil åbne terminalen i bunden. Lad mig gå ind i den mappe, at dette er i. Og jeg har tænkt mig at kompilere den manuelt med Dunk for nu. Og jeg har tænkt mig at kompilere dette som buggy1.c, Enter. Og nu buggy1, hvorfor er der ingen sådan fil eller mappe kaldet buggy1? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah. Så det er faktisk kaldt a.out. Så huske, hvis du bare køre Dunk, hvor Dunk er det compiler, og du ikke angiver det navn, du vil give dit program, går det til standard at a.out. Så ja, hvis jeg gør ls - oops. Og jeg didn't - den sort-hvide emne nogle af du står er blevet rettet. Men lad mig gøre det. Der har vi a.out på venstre side der. Så vi er nødt til at køre a.out stedet for buggy1. Så lad mig gå videre og gøre det. . / A.out, Enter. Og jeg tilsyneladende ikke gøre hvad? PUBLIKUM: Gem. DAVID J. Malan: Gem mit fil. Så det er let løses ved at trykke Control S, eller gå til Filer, Gem, ligesom i de fleste programmer. Lad mig gå ned her, rydde skærmen, kør den igen. Og der er stadig en fejl. Så hvad der foregår - PUBLIKUM: Du har ikke kompilere. DAVID J. Malan: Ah, godt. Jeg har ikke kompilere det. Ligesom en idiot, jeg ser på koden for at se, hvad der er galt. Så klang buggy1.c, nu a.out. Og Pyha, gemt. Så det ser lidt grimt, fordi der ikke er nogen ny linje hvor som helst i programmet. Men igen, det er bare en æstetisk detalje. Og i hvert fald hvis vi tæller dem ud, bør vi nu se 10 sådanne stjerner. Nå, hvad med dette andet warm-up eksempel? Så i buggy2, hævder jeg, at denne version også vil udskrive 10 stjerner, én pr linje. Så denne gang har jeg en ny linje, bare for at gøre tingene lidt pænere. Men i stedet, hvad jeg får, er dette. Så lad mig gøre klang buggy2.c, Enter. Nu er det igen hedder a.out. Enter. Jeg ser kun én ny linje, er kun det allersidste nye linje, flytter min prompt til den næste linje. Og alligevel tydeligt har jeg udskrivning *, så en ny linje, *, Så en ny linje. Men hvad er fejlen her? Ja? PUBLIKUM: [uhørlig]. DAVID J. Malan: Præcis. Så i modsætning til nogle sprog, som Python, hvor indrykning faktisk har funktionel betydning, i et sprog som C - som vi vil se, PHP, JavaScript - indrykningen er virkelig bare for mennesker 'fordel. Så det faktum, at jeg har indrykket linie 16 og 17 ser flot ud, men det har ingen funktionel betydning her. Hvis jeg vil begge linier at udføre som en del af for loop, så jeg skal vedlægge dem i krøllede parenteser ved at gøre dette. Du kan kun klippe det hjørne og udelade de krøllede parenteser, hvis hvad er tilfældet? PUBLIKUM: Blot én linje. DAVID J. Malan: Bare én linje. Så det er bare en slags pæn slags syntaks detaljer, så at du ikke spilder tid på at skrive tre linjer, hvoraf to er krøllede parenteser, bare for at skrive en eneste linje kode. Men hvis du har to eller flere linjer, vi faktisk nødt til at gøre dette. Så nu lad mig gemme dette. Lad mig gå videre og igen køre Dunk. Så lad mig køre a.out, og nu får jeg dem én pr linje. Nu a.out igen er sådan en dum navn til et program. Hvordan kan jeg fortælle Dunk til rent faktisk at give mig et filnavn der er mere brugervenlig, ligesom buggy2 selv? Lidt mere klart? PUBLIKUM: [uhørlig]. DAVID J. Malan: OK, så jeg kan faktisk tage det meget brugervenlig genvej og bare skrive lave buggy2. Jeg kan ikke specificere. C. i denne sag, og tryk på Enter. Og hvad gør gør, er det kompilerer buggy2.c for mig af beder Dunk at gøre det. Specifikt er det kalder Dunk, det kører Dunk hjælp måde mere kommandolinjeargumenter eller kontakter end jeg egentlig har brug for. Med tiden vil vi vende tilbage til, hvad alle disse forskellige kryptiske sammensatte udtryk betyder. Men for nu, er der bare gemme mig for besværet med skulle huske og skulle skrive ud alle dem forskellige bindestreg udtryk. Og opadrettede af det i sidste ende er at nu har jeg buggy2. Hvis jeg ønsker at gøre det manuelt, selv om, jeg kan i stedet gøre det - klang-o buggy2 og derefter buggy2.c. Og det vil ligeledes give mig en fil kaldet buggy2. Så kort sagt, er Dunk compileren. Lav er blot et brugervenligt værktøj, som vi vil bruge mere og mere, fordi det bare begynder at forenkle tingene for os. Og vi returnere 0 endelig. For nu, for bare, men vi vil begynde at drille den del dag og på onsdag. Eventuelle spørgsmål om noget af dette? Ja? PUBLIKUM: [uhørligt] ls i anførselstegn der? DAVID J. Malan: OK. Når jeg maskinskrevne ls i anførselstegn, det var mig laver nogle magi bag kulisserne for at rette en fejl. Jeg glemte, ligesom vi har fortalt mange af jer på diskussionsfora, at gøre - vi vil gøre det nu - sudo yum-y update appliance50. Whoops, at det er stavet rigtigt. Så apparatet er som et operativsystem. Det kører dette operativsystem kaldet Fedora. Og nu på grund af min langsom internetforbindelse, har jeg virkelig spules det. Så kører sudo yum update, som vi fortæller jer at gøre i problem sæt, i det væsentlige kan lide at køre automatiske opdateringer i Mac OS eller Windows. Og årsagen til at køre dette ved selve starten af problem sæt er fordi da vi skabte apparatet, jeg rodet op, og jeg ved et uheld lavet alle dine programmer ser sort på en sort skærm, hvilket er grunden til du ikke kan se dem som standard. Men den nyeste version af apparatet løser dette. Og jeg ordner i løbet af pause, når jeg har internet tilslutningsmuligheder. Så de citater bare skjuler min fejl, meget diskret, tilsyneladende. Andre spørgsmål? Ja? PUBLIKUM: Hvor gør komme fra? [Uhørlig] DAVID J. Malan: Godt spørgsmål. Hvor gør komme fra? Det er et Linux-program, der har eksisteret i mange år, lang før CS50. Og det kommer med et operativsystem som Fedora. Den kommer ikke fra CS50 biblioteket. Faktisk er de eneste ting, der kommer fra CS50 biblioteket hidtil, at vi har set, er GetString, GetInt, som alle dem Få funktioner, og ordet streng, og til en vis grad ordet bool. Men vi vil drille at bortset når vi dykke ned i CS50 selve apparatet. Så ja, endnu et spørgsmål her. PUBLIKUM: Når du sagde gøre, og derefter buggy, hvordan fungerer det computer vide [uhørligt]? DAVID J. Malan: Godt spørgsmål. Så når du bare køre make buggy1 eller gøre buggy2, hvordan gør det? Så som standard, hvis du skriver lave buggy1, lave ser for en fil kaldet buggy1.c. Og så udfører de passende klang kommandoer, derved tilsidesætte standard output fil kaldet a.out. Faktisk, hvis vi ser på det, der gør, hvad - lad os afslutte dette. Hvis vi ser på, hvad gør faktisk gør, gør buggy2, det er allerede ajour. Så lad mig fjerne rm kommandoen, program jeg skrev før. Typing Y-E-S for at bekræfte, at jeg ønsker at fjerne det. Hvis jeg nu gør, bemærke, at i denne meget lange linje, der er denne sidste ting her,-o buggy2. Alle gøre gør passerer dette argument, så at sige, at Klang, så jeg ikke behøver at skrive det selv. Okay, så en hurtig par administrative annonceringer. Så for sektioner, der officielt begyndte i det kommende Søndag, vil du altid vil bringe, hvis du har en, en bærbar computer. Hvis du ikke har en bærbar computer, skal du nå ud til mig af slippe mig en e-mail. Og vi vil finde ud af en arbejdsproces. Hvad generelt finder du i afsnit er, at de er en del konceptuelle, del hands-on. Vi vil specifikt bruge afsnit med spørgsmål, en del af ugens problem sæt, til at gå gennem nogle af de konceptuelle materiale fra forelæsning. Og det er alt i det aktuelle problem sæt. Og vi vil også dykke ned i nogle hands-on aktiviteter, undertiden som vil være forpligtet til at blive forelagt, til tider af som ikke vil. For eksempel, den første uge er de ment kun som en opvarmning motion. Og du vil opdage, at disse problemer er virkelig bare det. De er beregnet til at være temmelig lille, men ikke nødvendigvis trivielle programmer til at skrive, som ikke nødvendigvis er spændende i sig selv, men er gode muligheder for at øve med syntaks, med nye funktioner, i komfort af en sektion, hvor du har et par af dine klassekammerater til stede som såvel som din TF. Og hvad vi vil gøre med tiden er at bruge et værktøj kaldet CS50 Spaces, hvorved i stedet for bare at bruge CS50 Appliance, vil du i stedet gå til en webside i en browser, hvor du vil være i stand at skrive kode i et browservindue under sektion. Og så hvis du vælger, kan din undervisning fyr derefter vise uanset hvad det er du skriver på din skærm i din browser Vinduet op foran klassen, hvad enten anonymt eller offentligt, så han eller hun så kan gå igennem med dine klassekammerater hvad du gjorde godt, hvad du ikke gjorde godt. Og igen, være sikker på alt dette kan være pænt anonymiseret. Men det vil være en god mulighed for meget mere interaktivitet end noget lignende foredrag tillader. I mellemtiden vil vi have disse ting kaldet super sektioner, som er frivillig, men er åbne for alle i klassen, så du kan gøre dette mere kollektivt for problem angive én. Her er tidsplanen. Dette er også lagt ud på hjemmesiden på cs50.net. Bemærk, at der vil være en hacker-specifik i morgen eftermiddag. Og vi vil filme en dag og i morgen og sende dem online inden for 24 timer. Så hvis du ikke kan gøre nogen af ​​disse tider, ikke at bekymre dig. Og igen, tidsplanen er online nu på cs50.net. Med hensyn til sektionering selv, bør du have fået en e-mail instruere dig at gå til kursets hjemmeside for at finde ud af din afdeling. Hvis livet har ændret sig, og du skal ændre din afdeling, ikke et problem. Gå tilbage til den samme webadresse, cs50.net/section, ental, og du vil udfylde lignende form, så du kan derefter give os dine præferencer. Og vi vil følge op ved ugens udgang, hvad vi kan plads. Sidste uge, minde om, at vi foreslået at bruge CS50 diskutere, kursets diskussion værktøj, i foredrag. Så havde vi 40 spørgsmål, der blev stillet, og besvares under forelæsning. Så det syntes at fungere godt, så vi vil fortsætte forsøger at gøre dette. Hvis det under foredrag, behøver du ikke bare føler sig trygge forhøjelse hånden, ikke et problem. Gå til cs50.net/discuss, postere der, og en af ​​vores undervisning stipendiaterne vil enten besvare det elektronisk eller øge deres hånd på dine vegne anonymt at spørge, afhængigt af arten af ​​spørgsmålet. Og i form af tilbagekobling, vil generelt psets være returneres inden for en uge. Fordi det tager lidt tid for sektioner for at opnå ligevægt vil den første Pset, 0 og 1, være lidt forsinket, da tingene falde til ro. Men stay tuned for, at der i de kommende uger. Okay, så lad mig sige på min alvorlig stemme for bare et øjeblik. Så det er faktisk en interessant klima til at være har denne diskussion, hvad med alle de andre ting foregår på campus i forbindelse hermed. Men CS50 har helt sikkert haft sin historie af dette særlige emnet, for så vidt som hvert år, dette naturligvis for mange år, Ad-Boards omtrent 3% af klassen. Denne seneste år, 2011, CS50 Ad-profilering 35 studerende. Det er ikke, tror jeg, på grund af manglende klarhed. Indse, at i løbet pensum, der er en side af redegørelse, hvor linjerne er. Samme erklæring gentages på hver enkelt af de Problemet sætter på side et. Så jeg nævner denne dag virkelig bare for at gøre folk opmærksomme på dette. Og vi har prøvet forskellige ting. Og hvad jeg troede, vi ville gøre i dag er bare tage et øjeblik til faktisk se på nogle af tidligere sager, der er kommet op. Snarere end at holde disse som små beskidte hemmeligheder, faktisk påpege, hvad de studerende har gjort, og hvordan vi har opdaget det og virkelig hvad den overordnede motivation er for selv have denne samtale. Så med det sagt, linjen væsentlige er dette - pr pensum, er du velkommen, du opfordres til at tale med klassekammerater. Det er hele formålet med at have disse kollaborative kontortid i Annenberg og tilskynde folk til afgangsprojekt at arbejde sammen. Men linje tegnes når det drejer sig tid til rent faktisk at skrive din endelige løsning. Taler på engelsk, helt fint, taler i pseudo-kode, helt fint. Emailing en klassekammerat din Pset, lade dem se over skærmen som hænderne fortsætte med at skrive, over linje. Må se til pensum for de særlige linjer. Men bare for at male et billede af, hvordan det er desværre et virkeligheden, indse, at der er hjemmesider derude, der have løsninger fra denne klasse og mange andre klasser. Det faktum, at du eller omkring 3% af jer ved, at dette eksisterer betyder, at vi ved, at dette eksisterer. Det faktum, at der er hjemmesider som denne, hvor du kan betale nogen til rent faktisk at gøre dit problem sæt - det var en aktuel sag, der kom op sidste år. Dette er en hjemmeside kaldet odesk.com. Og Tim var navnet på den person her, der var udstationering på denne hjemmeside og spurgte en person til at gøre sit Pset 7 i dette særlige tilfælde. Nå, odesk.com er meget Google-stand, og vi også er meget god til at google. Også her er der steder - og denne her er snarere grusomme, helt ærligt. [Latter] DAVID J. Malan: Det sjove ved dette site er, hvis du læser om side, de taler om deres corporate kultur og hvordan kundeservice er deres nummer et prioritet, at sikre, at dine opgaver bliver slået i til tiden. Men i alle alvor, igen, det forhold, at disse websteder eksistere, indser vi også er bevidste om den slags steder. Og for at give dig en fornemmelse af, hvilke former dette generelt tager vi generelt ikke har store skandaler, hvor folk samarbejder om nogen form for massiv, men snarere det er disse sene øjeblikke af svaghed, hvor du har så meget at gøre, det er 4:00, er du udmattet, og du tænke på dig selv, ja, lad mig bare tage et kig på min roommate-eller min ven kode eller lignende. Og manifestationer af dette desværre involvere Student En indsender noget som dette og Student B indsendelse noget som dette, som helt sikkert, i en computer videnskab klasse, er bemærkelsesværdigt nemt for dataloger at opdage med software. Dette er en anden almindelig paradigme, hvor du har slags arbejdet sammen med nogen, måske taler i Engelsk, bare fint, pseudokode. Men så kommer det tid til rent faktisk at indsende, og psets bare få udvekslet via e-mail eller Dropbox eller lignende. Men i et forsøg på at gøre det mindre klart, at det er hvad der er sket, så er det, hvad der er indsendt. Også dette ikke tur op velskrevne stykker software som vi er nødt til rent faktisk at opdage den slags ting. Og faktisk, hvad vi gør, er run software, der sammenligner alle dette års indlæg mod alle tidligere års indlæg, mod alt, hvad vi fandt på Internet, mod alle job hjemmesiden derude. Det er alt sammen meget automatiseret. Og så gør vi det virkelig i stor retfærdighed til de 97%, der virkelig arbejder deres røven ud af bukserne i denne og i andre klasser og sætte i alle disse bestræbelser, således at arbejdet de i sidste ende er deres egne. Og jeg kan gå på i aldre. Dette er blot en håndfuld af sidste års sager. Et par elever forelagt disse filer identisk for Pset 2, Pset 3, Pset 4, Pset 5, Pset 6, Pset 9. I dette tilfælde var denne quiz 0 og i sidste år, hvor to studerende indsendt ens denne sætning blandt mange andre, "Anmodningen om type -" prik, prik, prik. Så selv i en klasse på 600 gjorde vi opdage dette på indsendt quizzer. Så kort sagt, dette - helt ærligt, jeg hader at have denne form for samtale - men dette er virkelig en bevidst indsats i år at forsøge at køre ned dette nummer. For selvom vi siger den slags ting hver år, jeg tror den virkelighed at have dvælet ved det for et par sekunder mere end normalt og faktisk lige påpege at hvad der kan synes som, eh, ikke sådan en big deal, i det mindste tænker tilbage på denne særlige øjeblik, både i retfærdighed til dig selv og dine klassekammerater her. Så hvis du nogensinde har spørgsmål om, hvor grænsen er, skal du bare nå ud til mig personligt. Men svaret er altid, helt understregede i sidste øjeblik, kontanter i en sen dag. Eller hvis det er et spørgsmål om ikke at have nogen sene dage, ærligt, email mig personligt. Vi finder ud af noget. Vær venlig ikke at sætte din tid her på Harvard i fare. Nu, jeg troede vi skulle lette stemningen, så jeg medtaget dette som det næste dias. [Latter] DAVID J. Malan: Denne hjemmeside var stor. Jeg fik faktisk lidt distraheret. Der er denne ene. Og så dette var forbløffende. Okay, så tænk på, at killingen sent på aftenen, når de foretager disse beslutninger. Okay, så tilbage til mere sjov og mindre alvorlige ting, som betingelser. Okay, så vi talte kort om disse. Det er noget, det er nok helt bekendt fra en verden af ​​Scratch. Og i en verden af ​​Scratch, har vi dette behov undertiden gå gøre gafler i vejen. Enten gøre dette eller hint eller dette andet ting her. Og når vi ønsker at gøre dette, kan vi bruge, i C nu, dette, hvis ellers konstruere. Og så har vi her booleske udtryk. For eksempel, boolske udtryk her kan vi ELLER dem sammen i den forstand, at vi har denne tilstand eller denne betingelse. Vi kan og dem sammen, i den forstand, at vi ønsker at tjek denne tilstand og denne betingelse. Og her har vi en switch-statement nu, som ikke er så ligner syntaktisk til den slags betingelser, men det giver os mulighed for at gøre hvad der svarer til, hvis ellers hvis ellers hvis ellers hvis og lignende ved at optælle dem fra sag til sag ved hvert enkelt tilfælde. Så vi oplevede dem sidste gang. Og så begyndte vi at røre ved ting som sløjfer. Vi oplevede en af ​​disse bare for et øjeblik siden. Men der er disse andre looping konstruktioner. For eksempel. Denne her Så while (betingelse), skal du gøre det her igen og igen. Så fundamentalt, hvad der synes at være forskellige mellem denne for løkke og denne while-løkken her? Dette for-løkke, og denne while-løkke. Ja? Hvad er det? PUBLIKUM: [uhørlig]. DAVID J. Malan: Good. Så mens det i for-løkken tilstand, er der klart mere syntaks. Der er denne initialisering, der er denne opdatering. I en while-løkke, er der bare denne betingelse. Så det lader til, at det er lidt skåret ned i forhold til den for loop, hvilket betyder, hvis vi ønsker at have variabler, og vi ønsker at have optælling, vi faktisk er nødt til at gøre dette selv. Så lad mig gå videre og åbne op gedit. Lad mig skifte over til apparatet. Og lad os bare gøre en hurtig lille eksempel på, at skelner en af ​​disse fra den anden. Og på bagsiden af ​​mit sind her, vil jeg sige én ting. Jeg specifikt nævnt navnet Tim. Tim var faktisk nogen, at en elev har forsøgt at finde at gøre deres hjemmearbejde for dem. Vi havde ingen Tim i den pågældende sektion. Så indse, at jeg ikke skal afsløres en elev, var det ikke en elev. Det var en tilfældig person på internettet at gøre tingene ved fuldmagt sidste år. Så vi finder det, også. Så i dette tilfælde her, lad mig gå videre og åbne en ny fil. Filer, Ny. Dette giver mig en fane her. Lad mig gå videre og gemme det som loop.c. Lad mig gå hen og klik på Gem. Og derefter ned her, så lad os gå videre og begynde at skrive # Include . Lad mig zoome ind Nu vil vi gøre int main (void). Lad mig nu gå videre og gøre for (int i = 0; i < oh, 10; i + +). Og nu jeg har tænkt mig at gå videre og gøre udskrive stjernen, at jeg gjorde tidligere. Og så i slutningen af ​​dette program, vil vi bare til udskrive en ny linje, bare så min prompt ser ikke alt rodet. returnere 0. Seem syntaktisk korrekt? Indtil videre. Så lad os se. Så lad mig zoome ud, skal du gå ind i min terminal vindue. Og lad mig gå videre og køre loop, fordi jeg kaldt dette ting loop.c. Så gør løkke. Synes at kompilere OK. Lad mig løbe loop, og nu Enter. Og det synes at have udskrevet 10 stjerner. Så lad os bare konvertere dette til en while-løkke og se, hvad slags spørgsmål, vi falde over. Så i stedet for dette, lad mig komme ind her og sige, mens jeg er mindre end 10 - lad mig slippe af for-løkken. OK, så vi har et par problemer allerede. Så betingelse er den samme, men jeg er selvfølgelig mangler initialisering. Jeg mangler den optælling. Så hvad skal compileren sandsynligvis fortælle mig når jeg forsøger at kompilere dette program? Ja? PUBLIKUM: [uhørlig]. DAVID J. Malan: Good. Så det kommer til at sige noget lignende sort - i dette tilfælde, variablen i. Og ja, brug af sort identifikator i. Og så dette er i modsætning til sprog som PHP og Python og Ruby, som nogle af jer måske være bekendt, hvor du kan bare lidt af start ved at bruge variabler forgodtbefindende og ikke behøver at bekymre dig om at erklære dem eksplicit altid. I C og i sprog som Java og C + +, skal du være super eksplicit. Og hvis du ønsker en variabel kaldet jeg, er du nødt til at fortælle mig hvilken variabel det. Så vi bliver nødt til at løse dette på følgende måde. Jeg har tænkt mig at have til at gå op her og skrive int i, og derfor Jeg har erklæret en variabel kaldet i. Nu har jeg sprunget et trin. Jeg har naturligvis ikke initialiseret det, men lad os se om, at der på mindst mærker Dunk stoppe klager. Så lad mig genindspilning dette program. Okay, nu er det bare klagende af en anden grund. "Variabel 'jeg' er uden startværdi når de bruges her." Okay, så det er temmelig eksplicit. Initialiseret betyder blot sætte det lig med en værdi. Og vi har ikke gjort det, så lad mig prøve lig 0. Lad os prøve det igen og igen køre Dunk. Kompileret denne gang. Og jeg er ved at køre den. Men store gamle uendelig løkke, fordi jeg har gjort det initialisering, jeg har gjort den betingelse, men jeg har aldrig gjort enhver form for optælling. Så hvordan kan jeg gøre det optælling? Tja, i en while-løkke, føles det som om jeg har tænkt mig at have at gøre det indre af sløjfen, da ligesom den første uges eksempler på at gøre looping konstruktioner, ligesom med sokkerne og med den selvstændige optælling havde vi at gøre noget til allersidst, gerne gå tilbage til den næste linje. Hvad hvis jeg gå videre og gøre det i + + her? Lad os ikke engang kompilere dette. Fang mig allerede. Hvad er der galt her? PUBLIKUM: [uhørlig]. DAVID J. Malan: Så det er bestemt ikke int. Det er i. Og de krøllede parenteser, som før, indrykning er ikke nok. Så nu har jeg denne konstruktion. Så mens jeg er mindre end 10, skal du udskrive en stjerne, derefter tilvækst i. Og den måde en while-løkke værker er, at så snart du trykker på bunden af ​​sløjfen, som i dette tilfælde ligner linje 10, det kommer til at gå tilbage til linje 6, på hvilket tidspunkt betingelse vil blive kontrolleret igen. Og hvis jeg er stadig mindre end 10, vil vi gøre linjerne 8 og derefter på 9, så vil vi ramt 10, og gå tilbage til 6, igen og igen og igen og igen, så længe jeg er mindre end 10. Så lad os re-run gøre her. Okay, vi har kompileret okay. Lad mig omvalg loop. Og nu er det faktisk ser ud til at virke. Så plusser og minusser her? Nå, så langt er der faktisk ikke en helhed af PLO - så søde. Okay, det var en - ah, det var et uheld. Okay, så lad os gå tilbage til for-løkken. Så for løkker er rart, fordi de er super eksplicit. Og selv om de er lidt klodset at skrive, det er meget magtfulde og det giver dig mulighed for at gøre flere ting på én gang. Selvom sløjfer ikke synes at have en enorm mængde af værdi lige endnu, fordi det føles som om vi bare nødt til at gøre mere arbejde. Vi er nødt til at sætte initialiseringen op her, opdatere hernede, og vi er nødt til at huske at gøre alt det der. Så vi vil se i tide at mens sløjfer faktisk låne sig til kun forskellige sammenhænge, ​​forskellige data strukturer som lister og hash-tabeller, ting, vi vil komme til mid-semester. Men for nu, ved, at der er denne tredje type er kendt som en gør- while-løkke. Og vi har set dette kort. Og det kan være super nyttige med Pset 1. Hver gang du ønsker at gøre noget, og derefter kontrollere, om den bruger, der samarbejdede, og hvis de ikke gjorde det, så gør det igen, en gør- while-løkke egner sig til den slags logik. Fordi som bestilling fra top til bund her antyder, gør bogstaveligt betyder at gøre dette. Og gøre det igen og igen, hvad kunne det være? Måske betyder det ringer GetInt eller GetString og derefter at kontrollere værdien af ​​GetInt eller GetString og derefter råben på brugeren, hvis de ikke har samarbejdet ved at bede dem igen og igen og igen. Hvor du ønsker at gøre noget en gang, så tjek nogle betingelse. Så lad os prøve dette. Lad mig faktisk ændre dette nu til en gør-while-løkke. Og jeg har tænkt mig at gå videre og gøre følgende. Så skal du gøre følgende. Lad os gøre int i = GetInt (); men lad os først fortælle brugeren hvad de skal gøre. Så en lidt anderledes denne gang. "Giv mig en int". Så jeg vil bruge printf for. Og nu jeg har tænkt mig at gå ned her, og jeg har tænkt mig at gøre dette mens jeg er, lad os sige, større end - lad os se, i er, lad os sige, mindre end 0, eller i er større end 10. Med andre ord ønsker jeg et tal fra 1 til 9, bare vilkårligt. Så jeg bruger en kombineret Boolesk udtryk her sørge for, at i er mindre end 0 eller større end 10, hvor tilfælde vil jeg gøre dette loop her igen. Så igen, skal du gøre dette - medens i er mindre end 0, eller i er større end 10. Så lad os nu gå videre og gøre det, når vi har gjort det. Lad os bare gøre en hurtig tilregnelighed check. printf ("Tak, jeg er% d", i). Så denne simple program beder brugeren om en int, gør sikker på det er inden for nogle interval, 1 til 9 inklusive, og derefter takker brugeren ved at minde dem om, hvad de lige indtastet, ligesom en lille tilregnelighed check. Men lad os se om det virker efter hensigten. Lad mig gå hovedet ned her og re-run gøre loop. Hmm. "Brug af kaldenavn 'i'". Det er underligt. Jeg troede, vi løst det. Samme symptom men anden kode. Ja? PUBLIKUM: [uhørlig] inde i to, vi er nødt til at [Uhørlig]. DAVID J. Malan: Præcis. Så dette faktisk fører os til et emne kaldet rækkevidde. Det viser sig, at C, igen, det virkelig tager dig bogstaveligt. Og hvis du gør noget som dette, hvor du erklærer en int og derefter tildele det en vis værdi, men du gør det inde i en par krøllede parenteser, hvad C gør, er det forudsætter, at du kun ønsker disse 32 bits kendt som I at eksistere inden for led i disse krøllede parenteser, inden for rammerne af linjer 6 til 9. Så jeg er erklæret, og den er tildelt en værdi i linje 8, men så snart du kommer udenfor ledning 9 under klammeparentes, i er ikke længere i rækkevidde, så at sige. S-C-O-P-E. Det er ikke længere i den rette kontekst. Så nu er der ingen i, så det er som om vi havde ikke engang erklærede det overhovedet. Så hvad er en rettelse så for noget som dette, hvis det Grunden er, at jeg er erklæret i de krøllede parenteser, som er tilsyneladende slemt? Her? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah. Så vi kan initialisere den udenfor. Så lad mig gå videre og slette erklæringen dele, hvorved Jeg angive, hvilken type, og lad mig gøre det op her. Så i linje 5, er det nu siger "Giv mig en int." Kald det i. Meddelelse i linje 9, jeg ikke ønsker at gøre dette, fordi jeg allerede har de 32 bits. Jeg ønsker ikke at bede computeren for en forskellige 32 bits. Jeg vil bruge de samme 32 bit. Og nu, fordi jeg er erklæret i linje 5, er det stadig legit at bruge det i linie 11 og linie 12. Så lad mig prøve at genoversætte dette og se hvis Dunk stopper råben. gøre løkken. Så nu er det "underforstået erklæring af funktionen »GetInt 'er ugyldig i C99." Hvad er det? Ja? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah. Så nu, at jeg faktisk bruger GetInt, det er ikke noget der bare kommer med C. Dette kommer fra CS50. Så vi har brug for denne her. Og lad mig gå tilbage til prompten ned her og re-run gøre. Okay, endelig. Nu har vi besluttet, og den anden fejl. Lad mig nu køre loop og se hvad der sker. "Giv mig en int." Jeg vil give det 11. Jeg vil give det -1. Jeg vil give det foo. Jeg vil give det 5. Og nu er det faktisk virker. Men prompten ændres for en grund her. Hvorfor skulle det sige retry en af ​​disse gange, men giv mig en int de andre tre gange? Hvorfor er det adfærd anderledes? PUBLIKUM: Gav det en streng. DAVID J. Malan: Undskyld? PUBLIKUM: Du gav det en streng. DAVID J. Malan: Yeah. Så vi gav det en streng i dette tredje forsøg, når jeg har skrevet foo. Foo er en streng. Det er naturligvis ikke en int. Og den måde, CS50 har implementeret GetInt er, at vi ikke kontrollere, om noget er mindre end 0 eller større end 10 for dig, for hvordan kan vi vide på forhånd, hvad slags int du ønsker? Men vi kan minimalt tjekke for dig, har brugeren i det mindste skrive et heltal? Og hvis de ikke gjorde det, vi råber på, at brugeren ved at skrive "prøv igen" på skærmen. Så nu har vi et program, der er looping. Okay. Nu, hvilke af disse er en slags bedre konstruktion? Så det er her tingene begynder at blive lidt rodet, den faktum, at du skal huske at erklære en variabel op her hvis du ønsker at bruge det inde i nogle krøllede parenteser og udenfor. Men selv hvis dette ser lidt kryptisk ved første blik, bare igen, husker den enkle logik. For at kunne bruge noget i C, uanset om det er en funktion eller Det er en variabel, skal du angive den, hvis det er en funktion i nogle bibliotek, du eller har brug for at erklære den. Men nu er du nødt til at være ekstra opmærksom på det faktum, at du erklære den i den rigtige omfang. Du er ikke at lægge det for stramt inde i parenteser. Så lad mig faktisk rulle tilbage. Hvis vi går tilbage til vores for eksempel fra tidligere, og jeg går tilbage til for int, int i = 0; i <10; i + +, og jeg gøre printf stjerner, som denne, og derefter lukke parentes, og nu printf i er nu - efter samme logik, hvad der vil ske, når jeg forsøger at kompilere dette program? PUBLIKUM: Ugyldig id. DAVID J. Malan: Så det er en anden ugyldig identifikator, kaldenavn. Nu er grunden er lidt anderledes. Der er tydeligvis ingen krøllede parenteser her, men det samme idé, den samme historie af anvendelsesområdet gælder. Hvis du har erklæret en variabel ligesom jeg inde i en for-løkke, dig selv, hvis der ikke udtrykkeligt skrevet den krøllede seler, så tænk på dem mentalt stadig være der, hvor tilfælde jeg er kun gyldig inde i for-løkken. Det er ikke gyldig, når du kommer til den næste linje, som i denne sag er nu 10. Så bare et par spørgsmål om omfang og lignende. Okay, nogen spørgsmål? Okay, så det er lidt af en triviel lille program, udskrivning blot små stjerner. Men lad os se om du kan huske den sang her. Dette er en utroligt irriterende sang børnene ville synge på skolebussen og lignende. Men hvad er rart om det er, at det har denne cyclicity, hvorved det er "99 flasker øl på væggen, 99 flasker øl. Tag en ned, passerer den rundt, 98 flasker øl om væg. "Og så sangen gentager 97, så 96, så 95, så 94, hele vejen ned til 0, hvis du rent faktisk fik at langt på bussen. Så dette er et godt program til at sortere i redskabet, fordi min Gud, hvis du bare kunne gennemføre denne med et par linjer kode, kan du spytte ud hele lyrics til dette sang ganske hurtigt. Men hen ad vejen, kan vi begynde at nu drille hinanden nogle af disse grundlæggende looping konstruktioner og nu også introducere funktioner, som vi skriver os selv, returnere værdier vi passerer rundt. Men først, hvorfor vi ikke gå videre og tage vores fem-minutters pause her? Og når vi kommer tilbage, vil vi synge denne sang. Okay, så er vi tilbage. Og når jeg siger, at vi nu vil synge denne sang, jeg mener programmeringsmæssigt, ikke verbalt. Så her har vi beer1.c, som er en implementering af dette bestemt sang. Og bare for at være klar, for dem bekendt med, hvad denne ting ser ud, lad mig gå videre og gøre beer1, Enter. Lad mig løbe beer1, og hvad vi vil se - hvor mange flasker af øl vil der være? Jeg vil skrive i 99, ligesom sangen siger. Enter. Og nu, hvis vi ruller gennem - oops - hvis vi ruller gennem alt dette, vil vi se, at Dette har faktisk synge hele sangen. Vent et øjeblik. Min rullepanel er lidt rodet op. Lad os bruge større vindue. Så beer1, 99, vi der gå. Så her har vi hele sangen, sunget meget hurtigere af computer end det kunne have været med os. Så bemærker dog, den cykliske karakter her. Det siger 99, så 99, så "tage en ned, give det rundt "og derefter 98. Og nu er det gentager igen og igen. Så dette er faktisk en perfekt mulighed for en slags looping konstruktion. Bemærk, at jeg er lidt skære et hjørne her. Bemærk, at jeg siger "98 flasker øl på væggen, 97 flasker øl på væggen ", og det var lige så at når vi kommer til en flasker øl, jeg har ikke at bekymre sig om den engelske grammatik. Men vi kan også løse dette med en lille smule af en hvis betingelse, måske. Hvis dette tal er ental, gå videre og sige "flaske", ellers hvis det er flertal, siger "flasker". Men for nu, jeg er helt skære dette hjørne. Så lad os se, hvad vi har her. Så vi har fået nogle kommentarer på toppen. Jeg herunder disse to biblioteker, som vi har ofte været. Og lad mig rulle ned til den første faktiske linjer kode. Linje 17 starter main. Linje 21 og 20 har, hvor mange flasker øl vil der være? Og så kalder jeg GetInt. Og nu har jeg lidt af en tilregnelighed check. Så dette er en konvention, at vi nu vil begynde at vedtage at mere stringent kontrollere brugerens input. Nogle gange er du bare ikke ønsker at bede dem igen og igen og igen. Hvis brugeren skruer op og ikke samarbejder, fint. Afslut og bare ikke håndtere dem. Og så det er hvad jeg laver her. Hvis n er mindre end 1, vil jeg bare råbe på brugeren, "Beklager, det giver ingen mening." Og så jeg har tænkt mig at vilkårligt returnere 1. Så igen, det er bare en konvention at vænne sig til. For nu at tage det på tro. Men indtil nu har vi altid været tilbage 0, fordi vi har sagt returnere 0 betegner hvad? PUBLIKUM: Succes. DAVID J. Malan: Succes, det er alt. Så nu hvor vi endelig er begyndt at tænke ikke-succeser - med andre ord, hjørne tilfælde, fejltilstande - nu har jeg en uendelig forsyning, eller mindst 4 milliarder mulige ting, der kan gå galt i mine programmer. Og jeg kan begynde at tildele dem individuelle numre. Nu generelt er det tilstrækkeligt at bare returnere noget andet end 0. Så vi kommer til at blot returnere 1 for nu. Men grunden til returnering 1 er, at så snart du vender tilbage 1, gæt hvad der sker med resten af ​​programmet? Det stopper. Det er det. Så det faktum, at jeg vender tilbage 1 er effektivt kortslutte dette program henrettelse, så intet nedenfor linie 27 vil fortsætte udførelsen. Så snart hovedsagen vender tilbage, er, at den. Okay, så hvis brugeren ikke samarbejder, og vi når linje 30 fordi de har skrevet i en legitim tal, her er mit gennemførelsen af ​​denne sang. Så jeg først udskrive en ny linje, bare for æstetik. Jeg har nu en for-løkke. Og mærke jeg gør tingene på en lidt i en anden retning. Jeg behøver ikke at gøre mindre end, jeg har ikke nødt til at gøre + +. Jeg kan i stedet sige initialisere en variabel i, sæt den lig n er antallet brugeren har indtastet i, skal du gøre følgende, så længe jeg er større end 0, så jeg - når du er færdig gentagelsen af ​​denne løkke. Så vi kan tælle ned med en for-løkke så godt. Nu, dette er temmelig meget uge en ting nu, med printf. Så print "% d flasker øl på væggen." Print "% d flasker øl. "" Tag én ned, passerer den rundt. "Print "% D flasker øl på væggen." Så det er stadig% d, men bemærke, at argumentet printf til at ændre sig. Efter komma, har jeg i, fordi jeg ønsker at sige 99. Efter denne komma, har jeg i, fordi jeg ønsker at sige 99. Efter denne komma, har jeg i - 1, fordi jeg ønsker at sige 98 i denne første iteration, og så videre. Og nu hernede, jeg bare har en dum lille bemærkning. Og så linje 42, jeg returnere 0 ved konvention, som betyder, at alt er okay. Så hvad hvis jeg goofed? Hvad kan en almindelig fejl her være? Nå, hvad hvis jeg ved et uheld sagde godt, ønsker jeg at tælle ned til 0, vil jeg 0 flasker øl på væggen? Så jeg siger, jeg er større end eller lig med 0. Hvad vil være det symptom, at jeg nu se, om jeg kompilere beer1 og køre det? PUBLIKUM: Negativ. DAVID J. Malan: Ja, det er gonna blive negativ. Dette er en forskudt med en fejl, en utrolig almindelig fejl at gøre. Lad os faktisk gå tilbage til terminalvinduet og gøre det her, så vi kan se mere på et tidspunkt. Enter, 99 flasker øl. Tæt på, men vi gik nogensinde så lidt for langt. Vi sang sangen for langt ned, sådan at vi nu ramt negativt tal. Så det ikke helt virker. Okay, så vi nemt kan ordne det ved at gå tilbage til måde det var engang. Men hvad er nogle muligheder nu for forbedring? Nå, lad mig åbne beer2.c og rulle ned her og tage et se på denne version. Hvad er den første ting, der springer ud på dig som forskellige i denne version her? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah, så ikke mere i, fordi det gik op for mig ved du hvad, jeg beder brugeren om n, og så er jeg indstilling i lig med n, og så er jeg ændre i, men jeg er aldrig røre n igen. Så hvad dælen var det punkt, du tildele en anden 32 bits kaldte jeg bare så jeg kan få en anden variabel? Så i dette tilfælde, jeg slags anerkendt, at unødvendige design funktion. Og jeg vil nu sige, mens n er større end 0, skal du gå fremad og udskrive den samme sang, der passerer et n til printf som andet argument, og n - 1 som det andet argument hernede. Og så på hver gentagelse af denne løkke, gå videre og blot dekrementere n selv. Nu, funktionelt, dette program vil være identiske. Hvis jeg skriver i 99, n starter kl 99. Jeg decrement, decrement, decrement, dekrement. Jeg har tænkt mig at komme hele vejen ned til "En flaske øl på muren, en flaske øl. Tag en ned, passerer det rundt. 0 flasker øl på væggen. "Sidste ende, fordi jeg gjorde får den betingelse korrekt. Det er større end 0. Jeg har ikke gøre denne fejl. Så der er bedre, version én eller version to? Så hørte jeg en masse murren til to. Hvorfor to? Hvad er det? PUBLIKUM: [uhørlig]. DAVID J. Malan: Oh, okay. Så det vil ikke gå under 0, men husk, i version One, original korrekte version ikke gå under 0 enten. Så husk, at dette er den korrekte version. Så lad os i det mindste sammenligne de to korrekte versioner. Hvad er et argument af version to er, mmm, bedre? Ja? PUBLIKUM: Den bruger mindre plads. DAVID J. Malan: Okay, så det bruger mindre plads, ikke? Betragtninger versionen der bruges 32 bit til n, og derefter en anden 32 bit for jeg. Version to bruger kun 32 bit for n, således at synes at være en plus. Andre tanker? Er der nogen ønsker at argumentere for en? Ja? PUBLIKUM: Du er nødt til at bruge ekstra linje kode for n -. DAVID J. Malan: Okay, helt sikkert. Så det er fair. Så dette bare det mindste for mig - Jeg mener, dette faktisk føles lidt Messier, den omstændighed, at Jeg kan ikke sortere af indkapsler hele min logik i én smuk linje, for-løkken, som for-løkken kan. Her vil jeg slags nødt til at hæfte på denne n - ved slutningen af ​​sløjfen, da Det er logisk nødvendig. Men den slags gnider mig den forkerte vej, bare fordi det synes adskilt fra logikken i op her, selv om igen, det er nødvendigt. Andre tanker? Ja? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah. Så hvad nu hvis du i stedet, i slutningen af ​​sangen, ønskede at udskrive igen navnet på den sang? Ligesom "Tak for at spille 99 flasker øl", noget eller fjollet sådan? Men pointen er, du ville få adgang til den oprindelige værdi. Det faktum, at du har muteret eller ændrede n på hver iteration og derfor har ødelagt sin oprindelige værdi betyder, at du kan bare ikke gøre det i slutningen. Nu, velsagtens, vi tydeligvis ikke ønsker at gøre at i dette program. Så hvem bekymrer sig? Men det er et meget gyldigt punkt. Og for at være ærlig, er der virkelig ingen rigtige svar her. De er begge lige korrekte. Jeg kunne blive overbevist enten måde. Jeg vil sige, at der generelt, det er et godt princip, hvis du spurgte brugeren for en vis værdi, og du har gemt i en variabel ligesom n, en slags på princippet lige, er det sikkert godt at holde det omkring. Og alle data, du ønsker at mutere igen og igen, bare give dig selv en kopi af denne variabel, bare så du har adgang til den oprindelige. Du bruger 32 flere bit, men virkeligheden er dette computer har, ligesom, to gigabyte RAM i disse dage, og vi ordkløveri over 32 bits? Virkelig ikke sådan en big deal. Og selv om denne enhed her, med en halv koncert eller en gigabyte RAM, 32 bits versus 64 bit, ikke sådan en big deal. Bestemt i dag, det vil være måde overvældet af størrelsen af selve programmet, er der vil være flere hundrede kilobyte, hvis ikke et par megabyte, i disse dage. Så rimelige bekymringer, ingen rigtige svar. Men i det mindste det er de tanker, der bør begynde at gå gennem dit sind? Fordi der i Pset 0, selvom vi egentlig kun forventet korrekthed, eller i det mindste fraskrivelse forskellige fejl, der du måske har stødt på, som vi bevæger os fremad, design er vil være et andet centralt aspekt, som begge skrive kode og også vores vurdering kode. Og så i det mindste give menes at ting som dette. Og bare fordi noget virker, betyder ikke, det er godt, betyder ikke, det er godt udformet. Og det er en af ​​de ting de undervisningsmæssige fellows og problemområder sæt vil hjælpe os med at drille en del over tid. Nå, hvad med, lad os sige, denne version her? Lad mig gøre noget lidt sexet her om et øjeblik. Først lad mig slippe af med dette. Og lad os nu løse dette grammatisk problem. Så i denne version, vil jeg gerne rette grammatik, således at snarere end blot sige parentetiske s, som "flaske" eller "flasker" - Jeg ønsker ikke at skære den hjørne - Jeg vil også gerne dynamisk udskrive ordet "flasker" eller "flaske" og derved anvende disse% s pladsholdere i dag. Så jeg er nødt til at betinget kontrollere, hvad er værdien af ​​i. Og hvis det er 1, jeg ønsker at sige "flaske", og hvis det er noget ellers vil jeg sige "flasker". Så lad os prøve at gøre dette. Så hvis jeg == 1, så lad mig gå videre og erklære - Jeg har brug for en snor, så lad mig gøre string s1, fordi det er første streng jeg ligeglad med lige nu. Jeg har tænkt mig at sige "flaske". Og så, lad os se, string s2 - og jeg vil forklare, hvor jeg har tænkt mig om et øjeblik - "Flasker". Så huske, at i denne sang, er vi nødt til at kunne at udskrive ting, to forskellige ord potentielt. Så hvis vi ser tilbage her, bemærke, at når vi kommer til dette eksempel her, "to flasker øl på væggen, to flasker øl, tage en ned, passerer det rundt ", jeg ønsker denne fjerde linie til nu sige "en flaske øl på væggen ". Så jeg er nødt til at beslutte, ønsker jeg at sige" flasker "eller "Flaske"? Så jeg har tænkt mig at vilkårligt at sige, okay, Jeg har tænkt mig at nu erklære en variabel kaldet s1, string én, er at gå for at få sat ind her, og også her, fordi disse ord er altid identisk, blot på grund af karakter af sangen. Og jeg har tænkt mig at kalde S2 hvad ord jeg vil sidst vises hernede. Nu, bogstaveligt talt, 99 gange ud af 100, det vil være den samme i begge disse sager, fordi 3 er flertal, 2 er flertal, 4 er flertal. Men i dette hjørne tilfælde, hvor vi kommer til 2 og derefter 1, eller selv 1 og derefter 0, jeg har brug for denne logik. Så jeg er nødt til at tilbringe noget tid i min kode at få denne ret. Så hvis jeg gør det, hvis jeg == 1, så der s1 er lig med "flaske" og s2 er lig med "flasker", fordi det vil være for 1 flaske, og dette vil være på 0 flasker. Og dette her, hvad det repræsenterer? Bare for at være klar. Dette er blot en kommentar. Så det faktum, at du kan have single-line kommentarer betyder, at du kan kommentere din kode som denne, men en anden fælles paradigme, også er, at hvis du har en super-kort sætning, at du ønsker at sætte dig selv og det er bare lettere at læse for at sætte det lige for enden af ​​den linje kode, kan du absolut gøre noget som dette. Så hvad nu hvis jeg gør dette? Else hvis jeg ikke er lig med 1. Så bang lig - udråbstegn er kendt som "bang". Så bang = 1. Så hvis jeg ikke er lig med 1, hvad skal jeg i stedet ønsker at gøre? Nå, det første ord jeg ønsker at være, hvad? Så streng 1 bør være "flasker" for pluralistiske flasker, og så vil det være flertal "flasker" så godt, for nu. Og vi vil se, om det rent faktisk får os til hvor vi vil hen. Så nu hvis jeg rulle ned her mærke til, at jeg sætter stikket i ikke kun jeg, men S1. Jeg tilslutte i og s1. Og derefter ned her, jeg er minus 1, hvilket er det samme som før, men s2. Med andre ord ønsker jeg det engelske ord for at ændre baseret på denne logik. Nu er der allerede nogle problemer i denne kode. Hvad er brudt allerede ud af porten her? Ja? PUBLIKUM: [uhørlig]. DAVID J. Malan: Præcis. Så jeg har allerede overtrådt den lektie af anvendelsesområdet. Så jeg har erklæret S1 og S2, men jeg har gjort det inde i krøllede parenteser, hvilket betyder yeah, vil denne kode arbejde op indtil linje 42, så snart jeg ramte linie 43, men gæt hvad ingen længere eksisterer? Nå, gætte, hvad er ikke længere i omfang - hverken s1 eller s2. Så vi er nødt til at løse dette. Så lad mig slette erklæringerne. Og jeg vil overlade de variable navne og slette denne her og slet denne her. Og på hvilken linjer bør jeg virkelig erklære disse ting? PUBLIKUM: [uhørlig]. DAVID J. Malan: Yeah, så sandsynligvis lige heroppe, 33-ish. Så streng s1 og derefter streng s2. Og det viser sig, kan jeg gøre det. Hvis du erklære to variabler af samme type, du kan faktisk bare bruge et komma og gøre det i C. Alle højre, så nu har jeg to variable - s1 og s2. Jeg tildele dem værdier i disse forholdene her, eller herinde. Og så jeg bruger dem dernede. Hvor godt er det nu kommer til at arbejde? Tja, det er stadig lidt buggy, men lad os i det mindste se hvor langt vi har fået. Så lad mig gå videre og gøre beer3. Er dette beer3? Yep, det er beer3. Og lad mig nu gå videre og køre beer3. 399 99. Vi kan sandsynligvis springe de fleste af dem. Og hernede, se på det. "En flaske øl på væggen, en flaske øl, tage én ned, passerer den rundt, 0 flasker øl på væggen. " Men jeg henlede Deres opmærksomhed på kun halvdelen af ​​løsningen. Kind of skruet op her. Så det lader til, at hjørne sager opstår, når jeg lig hvad to værdier? PUBLIKUM: 2, 1. David J. Malan: 2 og 1. Det er ikke 1 og ikke 1. Det er virkelig bare de to sidste strofer af denne sang. Så hvad gør jeg i stedet ønsker at gøre? Så jeg synes at have fanget det tilfælde, hvor hvis jeg er == til 1, derefter det første ord er "flaske", men det andet ord er "flasker". Men her, jeg ønsker at ændre dette for at være == 2. Og hvis dette er tilfældet, hvad jeg vil have det første ord at være? Publikum: "flasker". DAVID J. Malan: "flasker", så for to flasker. Og så dette ord her bør være - Publikum: "Bottle". DAVID J. Malan: "Bottle", ental. Okay, lad os zoome ud, gå tilbage herovre, re-run gøre, omvalg beer3, type 99 igen. Okay, "Segmentation fault (core dumpet)." Hvad har jeg gjort forkert? PUBLIKUM: Du behøver ikke have en værdi [uhørlig]. DAVID J. Malan: Ah, excellent punkt. Okay, så hvad er der galt her? Så segmenteringsfejl, og vi faktisk kommer til at se dette helt et par gange i fremtiden, bevidst. Men for nu, hvad betyder det egentlig? En segmentering fejl næsten altid betyder, at du har en eller anden måde forsøgt at få adgang hukommelse, RAM i din computer, at du ikke ejer, at du faktisk ikke har anmodet operativsystem til. Så i dette tilfælde, mærke til, hvad jeg har gjort, som er behæftet med fejl i min logik. Jeg har tildelt s1 og s2 en værdi, hvis jeg er lig med 1. Jeg har også gjort det, hvis jeg er lig 2. Men jeg har ikke gjort det i det uendelige antal af andre muligheder - i særdeleshed. 3 eller 4 eller prik, prik, prik, 99 Så en rettelse til dette kunne bare være lad os have en anden tilstand. Og lad mig gå ind her og sige s1 lig - hvad skulle det være her? PUBLIKUM: [uhørlig]. DAVID J. Malan: "flasker", fordi der i den fælles sag, det er bare det samme. Så lig citerer, citat slut, "flasker". Så for flertalsformen flasker, og derefter op her, for flertalsformer flasker. Okay, så lad mig vende tilbage til mit terminalvindue, rekompilere, re-køre den. 99. Puha. Og lad os gøre en hurtig tilregnelighed check. Teknisk set ville vi ønsker at læse alle disse for at sikre de er korrekte, men lad os se på mindst de kendte syndere. 3 flasker, 2 flasker, 2 flasker, 1 flaske, 1 flaske, 0 flasker. Vi synes at have i det mindste fastsættes det for nu. Men fangsten her er, at hvad en Gud forfærdelige rod dette er bare for at løse en dum ét tegn grammatiske detaljer. Så der er lidt af en grund, at jeg skar dette hjørne tidligere, at fordi det er bare helt irriterende nødt til at skrive så meget kode. Men det viser sig, at der er lidt mere elegante måder udtrykker præcis det samme. Og vi kan gøre det på følgende måde. Lad mig forlade dette på skærmen et øjeblik og introducere noget kendt som en ternær operatør. Det er lidt af en one-liner, der er blot ment til at gøre vores bor en lidt mere sexet, som lovet. Og jeg har tænkt mig at gøre det som følger. Giv mig en streng kaldet s1, og lad mig tildele det som følger. (I == 1)? "Flaske", ellers "flasker". String s2 får (i == 2)? "Flaske", ellers "flasker". Så hvad er så forskellen her? Disse to linjer kode, jeg argumentere, kan erstatte hele denne rod. Så jeg kalder det noget rod, bare fordi det slags gnider mig forkert måde, at det er så mange linjer kode. Ikke forkert. Det er ikke dårligt design. Ligesom, det er helt korrekt og helt fint. Men kodning bliver kedelig, hvis du er nødt til at udtrykke dig så pokkers specifikt igen og igen og igen med en enkel scenarie som dette. Så C har nogle genveje, som denne. Så dette væsentlige siger erklære en streng kaldet s1 og tildele det enten denne værdi eller denne værdi, hvis jeg er == - Undskyld, skal jeg sige det mere tydeligt. Erklær en variabel s1, tildele det denne værdi, hvis dette er sandt. Ellers tildele det denne værdi. Så med andre ord, er denne form for en linie måde siger, hvis ellers men laver en opgave undervejs. Så hvis jeg er 1, derefter gå videre og kalde det "flaske". Og så er dette andet, kalder det "flasker". I mellemtiden s2, at andet ord, som vi er nødt til at definere, hvis jeg er lig med 2, vil vi mængden S2 til "flaske". Ellers sæt den til "flasker". Og hvad Dette betyder nu, er jeg kan gå igennem dette og slette alle disse linjer kode. Og når jeg siger, noget latterligt, at dette nu er sexier, det er mere sexet i den slags stilistiske fornuft. Det faktum, at funktionelt, er denne kode der faktisk går til gøre præcis de samme ting. Og selvom det måske ser lidt kryptisk ved første blik, fordi vi ikke har set denne konstruktion før, jeg havde hævder, at det i sidste ende kommer til at være så meget mere læsbar og så meget lettere for vi mennesker at sortere i forstå, fordi nu kan du bare læse kode på én linje. Det er stadig samme ånd til en hvis det, hvor det er tilstand og derefter dette er hvad der er inde i if, og dette er, hvad der er inde i andet. Men vi kan gøre det lige meget mere elegant. Og hvis jeg nu gå tilbage til min terminal, efter at have slettet alle af disse linjer og erstattet dem med bare de to, rekompilere, re-run flasker øl med 99, meddelelse om, at min grammatik er faktisk stadig korrekt. Så igen, noget at starte. 2 flasker øl, 1 flaske øl. Ser ret. Yeah. Så der har vi en langt mere kortfattet løsning. Så det også, som du får mere komfortabel med C, ikke nødvendigvis med den første Pset eller endog sekunder, men indse, at disse konstruktioner kan tillade os at gøre tingene nogensinde mere elegant. Nu lad os gøre en anden ting her. Lad mig gå videre og åbne op return1.c. Lad os nu begynde at løse et andet problem på en måde, giver os mulighed for at skrive mere sofistikerede kode. Så her er en simpel lille program, hvis formål i livet at inkrementere værdier. Og faktisk, lad os tage et skridt tilbage. Lad mig gøre det manuelt. Lad mig gøre inkludere og int main (void). Og lad mig kalde denne increment.c. Og hvad vil jeg gøre? Jeg har tænkt mig at gå videre og sige noget lignende - vil vi kalde tallene det samme - int x. Så int x får 2; printf x er% d, ny linje, x. Så jeg skriver hurtigt, men slags velkendte ting nu. Så jeg har tænkt mig at gøre x + +. Så jeg har tænkt mig at udskrive den samme sætning igen. Og så jeg har tænkt mig at vende tilbage 0 bare for at afslutte programmet. Okay, så dette er et program, inkrementer et tal. Det er først at gå til initialisere noget til 2, og så er det kommer til at forøge den og udskrive den igen. Så lad os køre tilvækst, utroligt simpelt program. Men formoder nu, at jeg ønsker at terning værdien, så gør noget noget arbitrær. Og jeg vil faktisk gerne gøre x får terning af det. Så jeg kunne bruge det, der kaldes pow-funktionen, men jeg gør ikke virkelig ved, hvor det er endnu. Så jeg har tænkt mig at gøre det på den gammeldags måde. x gange svarer dette til x gange x gange x. Så jeg Cubing værdien multiplicere det af sig selv igen og igen og igen, så vi får magt af 3 i dette tilfælde. Så nu de tal, jeg skulle udskrive burde være, som vi vil se her - gøre tilvækst, så det er faktisk ikke rigtig tilvækst længere, men vi vil forlade navn alene - 2 og derefter 8. Nu har vi begyndelsen til en mulighed for raffinement her, hvorved denne Cubing ting om at multiplicere et tal af sig selv af sig selv i sig selv føles som dette kan bare være nyttigt at have som en funktion, ligesom nogen besluttede år siden - du ved, sådan nyttig, hvis en af ​​os sidder ned og skriver printf så resten af ​​verden kan bruge det, hvorfor gør vi ikke sidde ned og skrive en funktion kaldet terning der gør dette Cubing for os, så vi ikke behøver at manuelt implementere begrebet Cubing værdier her? Så et simpelt eksempel, men lad os gå videre og bruge dette som en mulighed for at skrive vores egen funktion. Indtil hidtil har vi kun brugt vigtigste, og vi har brugt andre folks funktioner, men vi har ikke skrevet vores egen. Så her går vi. Jeg har tænkt mig at gå videre og skrive en funktion kaldet terning. Og jeg har tænkt mig at få det tage en indgang. Så sin indgang vil være et heltal. Og hvad er det tænkt sig at gøre? Det kommer til at erklære int output = input gange input gange input. Og så det kommer til at vende tilbage, at output. Og så er jeg nødt til at være specifik nu. Denne funktion vil returnere en int. Så her er så, hvordan du ville skrive dine egne funktioner. Du skal først beslutte, hvad er navnet på din funktion vil være. Og generelt, noget forklarende er god, så jeg vil kalder det terning. Så er du nødt til at specificere, hvad det kommer til at vende tilbage, hvad er sin produktion vil være. Og vi har ikke så mange muligheder endnu. Int, char, float, bool, string. For nu, vil jeg holde fast i en int, fordi jeg ønsker det at returnere et heltal. Så er du nødt til at præcisere, hvad dens indgange, hvis nogen, er. Og hvis terning tager et argument, tager noget mellem parenteser, du har at give dette argument et navn, så man kan kalde det noget som du gennemfører eller skriver denne funktion, og du er nødt til at give det en type, som i dette tilfælde vil være int. Så kort sagt, er terning en funktion, der tager et heltal som input og returnerer et heltal som output. Så hvad betyder det gøre med, at input? Tja, i linje 14, erklærer jeg en variabel kaldet output, og jeg tildele den værdien, input gange input gange input. Og så vender jeg tilbage output. Så hvordan bruger jeg dette så? Hvad skal jeg ændre disse fremhævede tegn på linje 7, der skal, tror du? PUBLIKUM: [uhørlig]. DAVID J. Malan: Ja, så terning af x. Så x er en variabel, hvilket betyder, at det besidder en vis værdi. Heldigvis er det af typen heltal. Og fordi x er en int, der betyder, at jeg kan give det til terning. Og selvom jeg tvingende værdien af ​​x med den værdi af kube x, som det har været tilfældet hidtil, hver gang du har lighedstegn og en linje kode, de ting på den rigtige bliver henrettet, og bliver tildelt værdien til venstre. Så rækkefølgen af ​​operationer er, som vi kunne håbe. Så fungerer det? Nå, lad mig gå ned her. Lad mig åbne mit terminalvindue. Lad mig gør tilvækst, Enter. "Implicit erklæring af funktionen 'terning' er ugyldig i C99 ". Som en sidebemærkning C99 refererer til sproget C, som det var fastlagt i 1999, hvilket var en opdatering over version fra 1989, hvilket er en opdatering i den oprindelige. Så det er alt der betyder. Så hvad betyder det, at "der er funktionen 'terning' er ugyldig? "Det er lige her. Det er lige der på linje 12. PUBLIKUM: [uhørlig]. DAVID J. Malan: Hvad er det? PUBLIKUM: Det er ikke før. DAVID J. Malan: Det er ikke før. Så dette er den ting. C er en slags dum, eller C-compilere er lidt dum. De virkelig kun gøre, hvad du fortæller dem at gøre. Og de bl.a. læse kun din kode top til bund, venstre til højre. Så hvis compileren, Dunk, læser din kode, linje 1, det tal ud af hvordan du gør dette. Åh, her kommer main. Okay, lad mig gå videre og erklære en variabel x. Lad mig udskrive noget. Linje 7, hvad dælen er terning? Det er ikke erklæret i stdio.h. Det kommer ikke med C. Jeg har ingen idé om hvad de skal gøre. Og så Dunk bare bails og afsluttes med denne fejlmeddelelse. Så vi kan løse dette på et par forskellige måder. Vi kan undervise Dunk hvilken terning er ved blot at flytte, når erklæring er. Så jeg klippet og klistret det oven main. Nu indse, at bare fordi main er ikke længere først, det er stadig henrettet som standard. Main er main. Det er standard funktion navn. Det betyder ikke noget, hvor det er i en fil. Men i det mindste nu Dunk har set terning før jeg bruger det. Så lad os se om Dunk er gladere nu. Gør tilvækst, gjorde det kompilere denne gang. Lad mig løbe tilvækst. Og ja, det synes at virke. Nu kan du komme op med scenarier til sidst hvor det er ikke muligt at sætte enhver funktion over hver anden funktion. Du vil sidde fast i denne uendelig løkke i virkeligheden, hvor denne fyr ønsker at være her, men dette fyr skal være der. Så det fungerer ikke altid. Så heldigvis, C har en mere elegant løsning. Jeg har tænkt mig at sætte dette tilbage, hvor det var, bare fordi jeg foretrækker, som en principsag, at main altid være i toppen, fordi er bare rart at se, hvad dette program gør som standard. Og hvad jeg har tænkt mig at gøre heroppe er erklære, hvad der kaldes en prototype. Jeg har tænkt mig at re-erklære min terning funktion ved bogstaveligt kopiere og indsætte. Faktisk er det ikke bogstaveligt. Så bogstaveligt kopiere og indsætte linie 15 op over linjen 6. Det er ligegyldigt, hvilken linje dette ender på. Det sker for at være på linie 4. Men det behøver at være før main. Men læg mærke forskellen. Linje 4 ender med et semikolon, hvilket betyder hey, Klang, tage mit ord for det, at der findes en funktion kaldet terning, der tager en int og returnerer en int. Men jeg vil ikke fortælle dig, hvad det er endnu. Bare vide, at jeg lover at fortælle dig i sidste ende. Og ja, nu er det okay, at dette er dernede. Så dette er generelt bedre, for så i toppen af din fil, kan du bare aflire, hurtige brand, en linje hver, hvad navnene på dine funktioner er, hvad deres indgange er, hvad deres udgange er. Og for at være mere klar, input betyder generelt argument eller parameter, synonyme. Output betyder returværdi, hvad betyder det hånd tilbage til mig. Så i dette tilfælde her, er terning blevet erklæret i toppen, men defineret, også kendt som implementeres, i bunden. Så lad os nu gå tilbage her og returnerer til dette. Så nu lad mig gå videre og igen køre make, re-run tilvækst. Og det ser nu ud til at virke fint. Så nu kan vi gå videre og faktor ud af noget som øl eksempel i denne fjerde udgave. Så lad mig rulle ned her. Og bemærke, at jeg slags tog denne lektion til hjertet lige nu. Det faktum, at jeg var synger den samme strofe igen og igen og igen, det samme kor linje i sangen, følte ligesom hvorfor gør jeg ikke faktor, ud i en funktion? Og ja, bør dette være et af motiverne. Ud over det faktum, at nogen andre i verden vil måske at anvende en terning funktion - der er en god grund til faktor noget ud og skriv din egne brugerdefinerede funktion - hvis der er et stykke kode i dit program, der bare gør begrebsmæssig forstand, at du slags ønsker at give det en navn - som i dette tilfælde, kor - så kan du ligeledes skrive det som en separat funktion. Du behøver ikke at skrive alt i main hvis det bare føles renere at adskille det, og giv den et navn. Så i dette tilfælde her, bemærke, at jeg har en kommentar oven denne funktion, som kun synger om angivne antal flasker. Bemærk her, at jeg ikke behøver at kalde disse ting input og output. Faktisk jeg denne gang har lige ringet min indgang B til flaske. Og mærke her, ugyldig antyder, hvad? Denne kor - PUBLIKUM: Har ikke returnere den. DAVID J. Malan: returnerer ikke en værdi. Og ja, behøver funktioner ikke behøver at vende tilbage værdier. De kan bare gøre noget. De kan have såkaldte bivirkninger, som i dette Sagen er bare en hel bunke af udskrivning på skærmen. Så bemærke, at denne kode, jeg bogstaveligt talt bare stjal fra det foregående eksempel. Den eneste forskel er i stedet for at bruge i som min variable, jeg nu bruger b som min variabel. Så jeg har b hernede, jeg har b hernede, jeg har b minus 1 ned her. Men koden er nøjagtig den samme. Men bare for at vise dig nu, hvordan vi kan bruge dette, så lad mig gå fremad og faktisk ændre dette for at være en for-løkke. for (int i = n; i> n; i -). Så jeg har stjålet den fra vores tidligere eksempel. Tidligere er det på linje 37, at jeg ville have startet synge denne irriterende sang. Men i stedet, jeg bare nu kalder koret af i. Udført. Så nu i hver iteration af denne løkke, kalder jeg denne anden funktion, kor, som jeg tilfældigvis at skrive. Det blev ikke skrevet af en anden år siden. Men kor, i mellemtiden, bruger printf at udskrive af disse fire linjer. Men det faktum, at jeg ringer kor igen og igen i en løkke betyder, at jeg har tænkt mig at få, til allersidst, det nøjagtig samme sang, som jeg har hidtil. Så kort sagt, nu, hvis jeg ser tilbage på min kode, selvom funktionelt dette er ækvivalent, bemærke, at det er begyndt at få endnu mere læsevenlig. Jeg ved ikke præcis, hvordan GetInt er implementeret. Helt ærligt, jeg ved ikke, hvordan kor er implementeret. Men det betyder ikke noget for mig. Jeg er ligeglad, fordi jeg nu kan sortere i, som et menneske, læse dette fra top til bund. Og fordi funktionerne er navngivet efter, hvad de gør, min kode bliver stadig læses. Og da vores programmer får meget mere kompleks - ved semestrets afslutning, vil du skrive hundredvis af linjer af kode i sprog som PHP og JavaScript og lignende - vil du opdage, at det er så meget nemmere end at holde styr på hvad du har gjort. Og når du begynder at samarbejde med venner eller partnere eller kolleger, vil du være i stand til at skrive meget mere massive programmer ved at begynde at udøve disse grundlæggende byggesten. Så med det sagt, hvorfor vi ikke kalde det en dag? Og vi vil se dig på onsdag. [Bifald]