[Powered by Google Translate] DAVID J. MALAN: Oke, dit is CS50, en dit is de begin van week twee. Dank u. Laten we hier beginnen met een telefoontje. Ik sta op het 617-BUG-CS50 kiezen. CS50: Dit is CS50. Voor Shuttle Boy, drukt u op 1. Om opnieuw te beginnen, drukt u op 9. DAVID J. MALAN: Dus hij zei voor Shuttle Boy, drukt u op 1. Dus we gaan op 1 te drukken. CS50: Wat is je afkomst? Voor quad, drukt u op 1. Mather, drukt u op 2. Boylston, drukt u op 3. Lamont, drukt u op 4. Mem Hall, drukt u op 5. Om opnieuw te beginnen, drukt u op 0. DAVID J. MALAN: We zullen op 1 te drukken voor quad. CS50: Volgende shuttle gaat dit zeer minuten om 1:10 PM, en dan op 13:20, 1:30 PM, 1:40 PM. Dit is CS50. DAVID J. MALAN: Dus dit is CS50's stem. En het is een voorbeeld van het soort afstudeerprojecten, voor Zo kunt u uit de richting van bijten het einde van het semester. Bijvoorbeeld dat shuttleboy.cs50.net bestaat - eigenlijk een project dat ik voor het eerst schreef na het nemen van CS51 terug toen ik nog een undergraduate. En de inspiratie was hier toen, alles wat ze hadden was de gedrukte shuttle bus schema's, en er was geen begrip op te zoeken online. En dus heb ik soort van duif in een weekend, gegoten door de gedrukte schema, en omgezet naar een computerprogramma. Op het moment, het computerprogramma geschreven toevallig in C. En je eigenlijk liep het door het intikken van en naar het vliegveld Jongen op een knipperende prompt zoals we al tot nu toe doen. Maar in de loop van de jaren, is het uitgegroeid tot een instant messaging bot. Het is meer recent ontwikkelde zich tot deze website, in een SMS-tool, en in deze voice-tool. En dit is te wijzen op het soort dingen die je kunt doen voor jezelf eind semester. Zo is er, de SMS-versie van en naar het vliegveld Boy gebeurt om als volgt. Als op uw mobiele telefoon, kunt u een SMS-bericht naar 41411 en stuur dan het speciale symbool sboy, voor Shuttle Boy, gevolgd door A en B, waarbij A een oorsprong en B is een bestemming - bijvoorbeeld Boylston Space Quad - wat je moet terug binnen een paar seconden is een tekst bericht van en naar het vliegveld Boy vertelt u precies wanneer de komende shuttles zijn, vanaf dat punt A naar die punt B. En dit is een meer algemeen voorbeeld van wat bekend staat als met een API. Dus bijvoorbeeld, deze is vaak precies shuttleboy.cs50.net, de werkelijke web-based incarnatie van deze. Maar de gegevens die deze en andere apps onderstreept dat CS50 heeft alle blootgesteld aan iedereen in de vorm van API's, application programming interfaces. En dat is gewoon een mooie manier om te zeggen dat we mensen willen op het internet en anderen hebben enige tijd het creëren van software die u kunt gebruiken om gegevens te grijpen van ons en dan bouw je eigen applicaties op de top van deze gegevensset. Dus bijvoorbeeld, dit naar het vliegveld Boy API pagina hier, die toevallig in de handleiding CS50 wezen documenten hoe u kunt gaan over het vragen CS50-servers voor gegevens. Bijvoorbeeld, als u bekend bent met CSV-bestanden, komma gescheiden waarden, dit zijn gewoon soort van quick and dirty Excel-achtige bestanden. Zo kunt u vragen naar het vliegveld Boy voor alle gegevens op alle van de huizen en hun GPS-coördinaten, en je krijgt terug, in wezen, een spreadsheet zoals dat kunt u dan lezen in een programma van uw eigen en dan het genereren van resultaten, zoals naar het vliegveld Boy zelf gebeurt moeten doen. Voor degenen die meer vertrouwd, meer moderne gegevens representaties onder meer JSON, JavaScript Object Notation. Iets zal terugkomen om u te in de richting van het einde van het semester. Maar nogmaals, dit is slechts een van de vele van de eigen API's CS50's. En het spannende is nu, deze dagen, Facebook en Twitter en Google en vrijwel elke populaire website uit er moet een soort van API, wat betekent dat als je de documentatie op hun website, u zich aanmeldt voor een account, kunt u dan beginnen met het schrijven software op de top van welke hulpmiddelen of gegevens die onderneming daar biedt. En dus een van onze eigen onderwijs medemensen een paar jaar terug schreef een Mac-versie van deze. Dus op de link Mac hier linksboven, kunt u eigenlijk downloaden van een Mac OS-widget die op je eigen Mac aan de doen Dezelfde soort dingen. Dus het is allemaal over het bouwen op de top van datasets als deze. Maar meer op dat tegen het einde van het semester. Dus laten we duiken in heel snel een bug, alleen maar om soort van te krijgen dingen opgewarmd vandaag, en denk terug op een aantal van de dingen die we keken naar vorige week. In het bijzonder, laat me ga je gang en trek je, laten we zeggen, Dit voorbeeld. Buggy1.c, deze is beschikbaar op de website van de cursus als je wilt wilt downloaden en om je heen steken. Maar laten we inzoomen hier op dit vrij kort programma, en net een supersnelle samenvatting van enkele van de fundamentele bouwstenen die we echt gaan gewoon beginnen als vanzelfsprekend. Dus de blauwe spul, in de regels 1 tot en met 9, zijn slechts softbal vragen. Dus dit zijn alleen maar de commentaren. Ze hebben geen functionele betekenis. Maar ze zijn opmerkingen in de zin dat ze merkt op dat Ik, de mens, maakte mezelf zodat in lezing en na lezing, kan ik eigenlijk herinneren wat dit programma doet zonder dat er doorheen lijn gelezen door lijn en recreëren geschiedenis in mijn gedachten. Bovendien, als ik de hand van dit programma aan iemand anders, zoals u, het is veel duidelijker voor u, als gevolg van opmerkingen als deze, wat het programma eigenlijk aan het doen is, of op zijn minst wat de programma's moeten doen. Of het klopt is een andere zaak. Nu, in C, met multi-line opmerkingen herinneren dat on line een is hier het magische symbool, / *. Het betekent hier komt de start van een reactie. En Nothing Else Matters totdat je het einde bereikt terminator, die * / het tegenovergestelde. Dus het feit dat ik 80-paar vreemde sterren hebben hier van van links naar rechts is eigenlijk gewoon een esthetische detail. Heeft geen functionele betekenis. Nu hoe over lijn 11? Wat betekent dit in lekentaal? Wat is dat? PUBLIEK: Inclusief de standaard. DAVID J. MALAN: OK, goed. Omvat dus de stdio.h bibliotheek. Dus wat betekent dat? Nou, in dat bestand, stdio.h, zijn een hele hoop functie verklaringen - dat wil zeggen, code dat iemand anders heeft geschreven. En een perfect voorbeeld van een functie die is opgegeven in stdio.h is - die favoriet nu? Dus printf, tot een van de meest voorkomende zeker gebruiken, vroeg op, uit die bibliotheek is er. Als ik uitsluiten dat regel van de code, wordt Clang gaat schreeuwen bij mij iets over het gebruik van een niet-verklaarde symbool. Zwartwerk iets is waarschijnlijk het sleutelwoord, want We hebben niet aan de compiler wat printf eruit ziet graag tenzij we onder die lijn. En meer naar de aarde, echt, wat die lijn zegt is open dat bestand, stdio.h, waar het ook is op de server harde schijf, of het apparaat de harde schijf, en copy-paste het daar in mijn dossier, zonder dat ik dat u dat handmatig doen. Nu, als we hier naar beneden naar de belangrijkste, het duurde niet lang we beginnen plagen elkaar wat int en wat leegte is. Maar voor nu, laten we eens kijken naar de drie lijnen binnen 15 tot 17. Dit hier heb ik claimen als buggy. Lijn 7 in mijn comments zegt: "Moet afdrukken 10 sterretjes maar niet. "Waarom is dit niet af te drukken, in feite, 10 van zulke sterren? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Precies. Dus merken dat we beginnen te tellen vanaf 0. En dit is eigenlijk een conventie in de programmering en informatica meer in het algemeen, om te beginnen te tellen van 0 in plaats van 1. En dit eigenlijk alleen voort uit het feit dat voor Bijvoorbeeld, wanneer we acht mensen hadden op het podium, bij het niemand hun hand te verhogen, waren ze Alle effectief nullen. En dus het is gewoon een soort van een computer conventie zo, daarom beginnen te tellen vanaf 0. Als dat het laagste nummer kunt u vertegenwoordigen in binaire. Dus hier zijn we begonnen met het initialiseren van i op 0. We hebben ingesteld i gelijk is aan 0. Maar toen maakte ik deze fout hier, zeggende: i kleiner is dan of gelijk aan 10. Maar als je denkt dat door middel van, als ik beginnen bij 0 en dan ga ik tot 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ik echt gaat afdrukken 11 sterren om het scherm, want ik heb gestegen tot en gelijk aan 10. Dus de makkelijke oplossing hier is wat dan? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Gewoon te veranderen in minder dan. Als je echt wilt, kun je dit doen. Maar in het algemeen, dat is afgekeurd. En zo begint te tellen vanaf 0 is gewoon iets wat je moet meestal wennen. Nu, hoe zit het met deze hele constructie in en van zichzelf? Deze lijn 15 demarks een for-lus. Dus is geen functie. Het is gewoon een statement. Het is een looping construct, zoals we zagen in Scratch. En het bestaat uit drie delen. Merk op dat er het eerste deel te links van de puntkomma. Er is het middendeel tussen de twee puntkomma. En dan is er de rechterhand naar rechts van de tweede puntkomma. Nu, de eerste van deze doet wat? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Terug daar? Ja? PUBLIEK: Initialisatie. DAVID J. MALAN: Initialisatie. Dus wat betekent dit? Wij hebben verklaard een variabele genaamd i. Het is van het type int, want ik heb aangegeven int i. En ik ben het initialiseren van i naar de waarde 0. Dus wat is dit eigenlijk zeggen? Het is effectief, zeggende tot de computer he, genoeg geef me geheugen, genoeg RAM-geheugen, een aantal passen, en zet dan de nummer 0 in een portie RAM geheugen. En even terzijde, hoe groot is een int meestal, in ieder geval binnen van het apparaat? PUBLIEK: 32 bit. DAVID J. MALAN: 32 bits. Dus dat betekent geef me 32 bits, ook wel bekend als 4 bytes, en dat de waarde 0 in, dat is vrij eenvoudig, omdat het betekent gewoon stellen alle bits op 0. Nu het tweede deel hier is de aandoening. En de toestand, zoals de naam al doet vermoeden, is wat wordt gecontroleerd opnieuw en opnieuw en opnieuw over de vraag of het waar is of onwaar. Dus dit is alleen maar te zeggen doet u het volgende regels code - namelijk lijn 16, want dat is de ingesprongen enige onder - zolang i kleiner is dan 10. En na elke iteratie door deze lus, doet u het incrementering, in dit geval i + +. Nu is het niet te zijn i + +. Het kan i -. Maar als ik dit deed, wat is het gedrag te gaan om van dit programma? PUBLIEK: Het gaat om een ​​oneindige lus. DAVID J. MALAN: Het gaat om een ​​soort van oneindige lus, tenzij we geluk na negatieve 2 miljard of zo. Misschien dingen zullen rond wikkelen, maar door de aard van de eindige aantal bits dat we hebben toegewezen aan een int. Maar het is zeker gaat om veel meer dan 10 herhalen en zeker meer dan 11 keer hier. En nu, net als een terzijde, beseffen dat i + + en i - zijn eigenlijk alleen maar syntactische suiker. Het is gewoon verkorte schrijfwijze voor wat een beetje meer expliciet geschreven als volgt: i = i + 1. Die gelijk is aan i + +. Het gewoon een soort van ziet er mooier zeggen i + +. Het is meer beknopt, beter leesbaar. En dus de meeste mensen doen dat in plaats. Maar dit is identiek functioneel aan wat we net zagen. Dus in het kort, de quick fix hier is gewoon om te zeggen dat ik herhalen van 0 helemaal tot minder dan 10. En dan zullen we inderdaad krijgen 10 sterren. Dus laten we dit proberen. Laat me het openstellen van de terminal aan de onderkant. Laat me gaan naar de map dat dit binnen En ik ga het handmatig compileren met Clang voor nu. En ik ga voor een compilatie als buggy1.c, Enter. En nu buggy1, waarom is er geen bestand of map genoemd buggy1? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja. Dus het is eigenlijk genoemd a.out. Dus roepen als je gewoon loopt Clang, waar Clang is het compiler, en je hoeft niet de naam die u wilt geven aan uw programma, gaat het om standaard op a.out. Dus inderdaad als ik dat doe ls - oops. En ik didn't - de zwart-wit kwestie een aantal van u geconfronteerd is opgelost. Maar laat me dit doen. Daar hebben we a.out aan de linkerkant daar. Dus moeten we a.out lopen in plaats van buggy1. Dus laat me ga je gang en doen. . / A.out, Enter. En ik blijkbaar niet deed wat? PUBLIEK: Opslaan. DAVID J. MALAN: Bewaar mijn bestand. Dus dat is eenvoudig op te lossen door het raken van Control S, of ga naar Bestand,, Save zoals in de meeste programma's. Laat me hier naar beneden gaan, schakelt u het scherm opnieuw uit te voeren is. En er is nog een bug. Dus wat er gaande is - PUBLIEK: Je hebt niet compileren. DAVID J. MALAN: Ah, goed. Ik heb niet compileren. Als een idioot, ik ben op zoek naar de code om te zien wat er mis is. Dus clang buggy1.c, nu a.out. En oef, gered. Dus het ziet er een beetje lelijk omdat er geen nieuwe lijn overal in het programma. Maar nogmaals, dat is gewoon een esthetische detail. En tenminste als we tellen die uit, moeten we nu zie 10 zulke sterren. Nou, hoe zit het met deze tweede warming-up voorbeeld? Dus in buggy2, ik beweer dat deze versie ook, afgedrukt 10 sterren, een per regel. Dus deze keer, ik heb een nieuwe regel karakter, alleen maar om dingen een beetje mooier. Maar in plaats daarvan wat ik krijg is het volgende. Dus laat me doen kletteren buggy2.c, Enter. Nu is het weer heet a.out. Enter. Ik zie slechts een nieuwe lijn, alleen het allerlaatste nieuwe lijn die beweegt mijn prompt naar de volgende regel. En toch duidelijk ik heb afdrukken *, dan is een nieuwe lijn, *, Dan is een nieuwe regel. Maar wat is de bug hier? Ja? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Precies. Dus in tegenstelling tot sommige talen, zoals Python, waar inspringen eigenlijk heeft functionele betekenis, in een taal als C - zoals we zullen zien, PHP, JavaScript - de inspringing is eigenlijk gewoon voor de mens 'voordeel. Dus het feit dat ik heb lijn 16 en 17 ingesprongen ziet er geweldig uit, maar heeft geen functionele betekenis. Als ik wil beide lijnen uit te voeren als onderdeel van de voor de lus, dan moet ik bijvoegen ze in accolades door dit te doen. U kunt alleen knippen die hoek en laat de accolades als wat is het geval? PUBLIEK: Slechts een lijn. DAVID J. MALAN: Slechts een regel. Dus dat is gewoon soort van een mooie soort syntax detail, zodat U verspilt geen tijd aan het schrijven drie lijnen, waarvan er twee accolades, om er maar een regel code te schrijven. Maar als u twee of meer lijnen, we inderdaad behoefte om dit te doen. Dus nu laat ik sla dit. Laat me gaan en opnieuw uitvoeren Clang. Laat me dan opnieuw uit te voeren a.out, en nu ik ze een per regel. Nu a.out weer soort stomme naam voor een programma. Hoe kan ik zien Clang om daadwerkelijk mij een bestandsnaam dat is meer gebruikersvriendelijk, zoals buggy2 zelf? Een beetje duidelijker? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: OK, dus ik kan eigenlijk nemen de zeer gebruiksvriendelijke snelkoppeling en gewoon schrijven te maken buggy2. Ik weet niet op te geven. C in dit geval, en druk op Enter. En wat maakt doet is het compileert buggy2.c voor mij door vraagt ​​Clang om het te doen. In het bijzonder, het Clang noemt, loopt Clang met veel meer command-line argumenten of schakelaars dan ik eigenlijk nodig hebben. Na verloop van tijd zullen we terug te komen op wat al deze verschillende cryptische gekoppelde expressies betekent. Maar voor nu, dat is gewoon opslaan van mij de moeite van het hoeft te onthouden en die te typen al deze verschillende gekoppelde uitdrukkingen. En de bovenkant van het is uiteindelijk dat ik nu heb buggy2. Als ik dit wil doen handmatig, hoewel, ik kan in plaats daarvan dit doen - clang-o buggy2 en dan buggy2.c. En dat zal eveneens me een bestand met de naam buggy2. Dus in het kort, Clang is de compiler. Maak bevindt zich op slechts een gebruiksvriendelijk hulpmiddel dat we meer gebruik maken van en omdat het begint gewoon vereenvoudigen dingen voor ons. En we terug 0, ten slotte. Voor nu, alleen maar omdat, maar we beginnen plagen dat deel vandaag en op woensdag. Hebt u vragen over een van deze? Ja? PUBLIEK: [onverstaanbaar] ls tussen aanhalingstekens daar? DAVID J. MALAN: OK. Toen ik typte ls tussen aanhalingstekens, dat was me het doen van wat magie achter de schermen om een ​​bug op te lossen. Ik vergat, zoals we al te vertellen velen van jullie op de discussieborden te doen - We doen dit nu - sudo yum-y-update appliance50. Oeps, dat dat juist is gespeld. Zodat het apparaat als een besturingssysteem. Het uitvoeren van dit besturingssysteem met de naam Fedora. En nu door mijn trage internetverbinding, ik heb echt afgespoten het. Dus lopen sudo yum update, zoals we u vertellen om te doen in de probleem set, in wezen zoals het uitvoeren van automatische updates in Mac OS of Windows. De reden voor het uitvoeren van deze aan het begin van de probleem set is, want als we het apparaat gemaakt, ik messed up, en ik per ongeluk gemaakt van al uw programma's kijken zwart op een zwart scherm, dat is waarom je niet ze te zien standaard. Maar de nieuwste versie van het apparaat lost dit. En ik zal vast dat tijdens de pauze een keer Ik gebruik Internet connectiviteit. Dus de citaten gewoon verbergt mijn fout, zeer discreet, blijkbaar. Andere vragen? Ja? PUBLIEK: Waar maakt vandaan? [Onverstaanbaar] DAVID J. MALAN: Goede vraag. Waar maakt vandaan? Het is een Linux programma dat bestaat al vele jaren, lang voor CS50. En het komt met een besturingssysteem, zoals Fedora. Het komt niet uit de CS50 bibliotheek. In feite is de enige dingen die komen van de CS50 bibliotheek tot nu toe, die we hebben gezien, zijn GetString, GetInt, alle die Get functies, en het woord snaar, en tot op zekere mate, het woord bool. Maar we zullen dat naast plagen als we een duik in de CS50 apparaat zelf. Dus ja, nog een vraag hier. PUBLIEK: Toen je zei te maken en vervolgens buggy, hoe werkt het computer beter leren kennen [onverstaanbaar]? DAVID J. MALAN: Goede vraag. Dus als je alleen nog maar te maken buggy1 of maak buggy2, hoe maakt weten? Dus standaard, als type je make buggy1, maken looks voor een bestand met de naam buggy1.c. En dan voert de juiste Clang commando's, waardoor overschrijven van de standaard output bestand genaamd a.out. In feite, als we kijken naar wat te maken, wat - Laten we stoppen met dit. Als we kijken naar wat maken was eigenlijk aan het doen, maken buggy2, het is al up-to-date. Dus laat me verwijder het rm commando, de programma ik al eerder schreef. Het typen van Y-E-S om te bevestigen dat ik wil om het te verwijderen. Als ik nu doen maken, merken dat in deze zeer lange lijn, er is een laatste ding hier,-o buggy2. Alle merk doet is het passeren van dat argument, zo te zeggen, om te Clang, zodat ik niet hoeft te typen het zelf. Oke, dus een snelle paar administratieve aankondigingen. Dus voor secties, die begon officieel het komende Zondag, zult u altijd wilt brengen, indien je er een hebt, een laptop. Als u niet beschikt over een laptop, buiten hoeft te reiken naar mij door laten vallen me een email. En we bedenken een workflow. Wat over het algemeen vindt u in sectie is dat ze deel uitmaken conceptuele, deel hands-on. We zullen met name gebruik maken van de sectie van vragen, een deel van de week het probleem set, te lopen door een deel van de conceptuele materiaal van lezing. En dat is alles wat in de huidige probleem set. En we zullen ook een duik nemen in een aantal hands-on activiteiten, soms waarvan zal moeten worden ingediend, soms van welke niet. Bijvoorbeeld, de eerste week, zijn ze bedoeld net als een warming-up oefening. En je zult zien dat die problemen echt zijn dat ook. Ze zijn bedoeld om te worden vrij klein, maar niet noodzakelijk triviale programma's te schrijven, die niet noodzakelijkerwijs spannend in en van zichzelf, maar zijn goede mogelijkheden om oefenen met syntax, met nieuwe functies, in het comfort van een waar je een paar van je klasgenoten te presenteren als evenals uw TF. En wat we doen na verloop van tijd is het gebruik van een tool genaamd CS50 Spaces, waarbij in plaats van alleen met behulp van de CS50 Appliance, zult u in plaats daarvan naar een webpagina in een browser, waar u zult in staat zijn om code in een browservenster schrijven tijdens sectie. En dan, als je hiervoor kiest, kan uw onderwijs mede dan laten wat het ook is dat je het typen op het scherm in uw browser Venster aan de voorzijde van de klas, of anoniem publiekelijk, zodat hij of zij kan lopen dan door met je klasgenoten wat je goed deed jij, wat deed het niet goed. En nogmaals, wees gerust dit alles kan mooi worden geanonimiseerd. Maar het zal een mooie gelegenheid zijn voor veel meer interactiviteit dan iets als lezing toelaat. In de tussentijd zullen we deze dingen super heet secties, die zijn optioneel, maar staan ​​open voor iedereen in de klas, zodat u dit kunt doen meer samen voor probleem te stellen een. Hier is het schema. Dit wordt ook geplaatst op de homepage op cs50.net. Merk op dat er wel een hacker-specifiek te zijn een morgenmiddag. En we zullen filmen een vandaag en een morgen en plaatsen die online binnen 24 uur. Dus als je niet kunt maken van een van deze tijden, geen zorgen te maken. En nogmaals, het schema is nu online op cs50.net. In termen van het snijden zelf, moet u hebben gekregen een e-mail waarin u wordt gevraagd naar de homepage van de cursus te vinden van uw sectie. Als het leven is veranderd en u nodig hebt om uw sectie te veranderen, geen probleem. Ga terug naar dezelfde URL, cs50.net/section, enkelvoud, en u zult vul het soortgelijke vorm, zodat u kunt geef ons uw voorkeuren. En we zullen follow-up door einde van de week over wat we kunnen tegemoet. Vorige week herinneren dat we voorgesteld het gebruik CS50 Discuss, de cursus discussie tool, in college. Dus we hadden 40 vragen die werden gesteld en beantwoord tijdens college. Dus het leek goed te werken, dus we zullen blijven proberen om dit te doen. Als tijdens de lezing, heb je niet alleen comfortabel voelt verhoging je hand, geen probleem. Ga naar cs50.net/discuss, daar plaatsen, en een van ons onderwijs bursalen, hetzij elektronisch beantwoorden of verhogen hun hand op uw naam anoniem te vragen, afhankelijk van de aard van de vraag. En in termen van feedback, zal in het algemeen psets worden terug binnen een week. Omdat het duurt een tijdje voor de secties te bereiken evenwicht wordt de eerste PSET, 0 en 1, een beetje vertraagd als dingen settelen. Maar stay tuned voor dat in de komende weken. Oke, dus laat me op mijn ernstige stem voor slechts een moment. Dus dit is eigenlijk een interessant klimaat te met deze discussie, met al de andere er aan de hand op de campus over deze aangelegenheid. Maar CS50 heeft zeker zijn geschiedenis van dit bijzondere onderwerp, voor zover ieder jaar, deze cursus, voor vele jaar, Ad-Boards ongeveer 3% van de klas. Dit laatste jaar, 2011, CS50 Ad-Ingescheept 35 studenten. Dit is niet, denk ik, door een gebrek aan duidelijkheid. Realiseer je dat in de syllabus van de cursus is er een pagina met verklaring uit te leggen waar de lijnen. Diezelfde verklaring wordt herhaald op elk van de probleem stelt op pagina een. Dus ik zeg dit nu echt alleen maar om ervoor te zorgen mensen bewust van dit. En we hebben geprobeerd verschillende dingen. En wat ik dacht dat we zouden doen vandaag de dag is een moment gewoon te eigenlijk kijken naar een aantal van vroegere gevallen die zijn gekomen. In plaats van te houden deze als smerige geheimen, eigenlijk wijzen op wat studenten hebben gedaan en hoe we hebben vastgesteld het en echt wat de overkoepelende motivatie is voor zelfs met dit gesprek. Dus met dat gezegd, de lijn is dit in essentie - per de syllabus, je welkom, je wordt aangemoedigd om praten met klasgenoten. Dat is het hele doel van het hebben van deze samenwerking kantooruren in Annenberg en het stimuleren van mensen voor de afstudeerproject om samen te werken. Maar de lijn wordt getrokken wanneer het tijd is om daadwerkelijk schrijven je uiteindelijke oplossing. Spreken in het Engels, helemaal goed, het spreken in pseudo-code, helemaal goed. E-mailen van een klasgenoot je PSET, hen te laten kijken over het scherm als de handen doorgaan met het typen, over de lijn ook. Bekijk ook eens aan de syllabus voor de betreffende lijnen. Maar alleen maar om een ​​beeld te krijgen van hoe dit is helaas een te schilderen werkelijkheid, beseffen dat er websites zijn die hebben oplossingen van deze klasse en vele andere klassen. Het feit dat u of ongeveer 3% van jullie weten dat dit bestaat betekent dat we weten dat dit bestaat. Het feit dat er websites als deze, waar u kan iemand betalen om daadwerkelijk doen uw probleem sets - dit was een concreet geval dat kwam in het laatste jaar. Dit is een website genaamd odesk.com. En Tim was de naam van de persoon hier die werd plaatsing op deze website en vroeg iemand om zijn PSET 7 doen in dit geval. Nou, odesk.com is zeer Google-baar, en ook wij zijn erg goed in googelen. Ook hier zijn er sites - en deze is nogal afschuwelijk, eerlijk gezegd. [Gelach] DAVID J. MALAN: Het grappige ding over deze site is als lees je de Over pagina, ze praten over hun corporate cultuur en hoe de klantenservice is hun nummer een prioriteit, om ervoor te zorgen dat uw opdrachten te krijgen ingeschakeld op tijd. Maar in alle ernst weer dat deze sites bestaan, ook wij beseffen,, zijn op de hoogte van de dit soort sites. En om u een idee van wat vormt dit over het algemeen neemt, we doorgaans geen grote schandalen waar mensen werken samen aan enige vorm van grote schaal, maar het is deze late-night momenten van zwakte, waar je zo veel te doen, het is 4:00 AM, je bent uitgeput, en u denk je bij jezelf, nou ja, laat me even een kijkje op mijn nemen huisgenoot of mijn vriend code of iets dergelijks. En de manifestaties van deze helaas te betrekken Student Een indienen van zoiets als dit en Student B overlegging zoiets als dit, wat zeker in een computer wetenschap klasse, is opmerkelijk gemakkelijk voor informatici te detecteren met software. Dit is een andere veel voorkomende paradigma, waar je hebt soort van gewerkt naast iemand, misschien praten in Engels, prima, pseudocode. Maar dan komt de tijd om daadwerkelijk in te dienen, en de psets krijgt gewoon uitgewisseld via e-mail of Dropbox of iets dergelijks. Maar in een poging om het minder duidelijk zijn dat dit wat er gebeurd is, dan is dit wat er ingediend. Ook dit is niet struikelen goed geschreven stukken software zoals we eigenlijk te detecteren dit soort dingen. En inderdaad, wat we doen is run software die vergelijkt alle van van dit jaar inzendingen tegen alle van het verleden jaar inzendingen, tegen alles wat we vinden op de Internet, tegen elke vacature website die er zijn. Het is allemaal erg geautomatiseerd. En dus doen we dit echt in grote eerlijkheid van de 97% die echt werken hun ezels af in deze en in andere klassen en de invoering van al die inspanning, zodat het werk ze uiteindelijk in te dienen is hun eigen. En ik kan gaan voor jong en oud. Dit zijn slechts een handvol van de gevallen vorig jaar. Een paar studenten voorgelegd deze bestanden identiek voor PSET 2, PSET 3, PSET 4, PSET 5, PSET 6, PSET 9. In dit geval was quiz 0 en in de laatste jaren, waarbij twee studenten voorgelegd identiek deze zin onder vele anderen, "Het verzoek van het type -" puntje, puntje, puntje. Dus zelfs in een klasse van 600 hebben we dit waarnemen op de ingediende quizzen. Dus in het kort, dit - eerlijk gezegd, ik haat het hebben van dit soort gesprek - maar dit is echt een bewuste inspanning dit jaar om te proberen te rijden van dat nummer. Want ook al zeggen we dit soort dingen elke jaar, ik denk dat de realiteit van het hebben stilgestaan ​​bij het voor een paar nog seconden dan normaal en eigenlijk alleen maar te wijzen op dat wat lijkt misschien, eh, niet zo'n big deal, althans denk terug aan dit bijzondere moment, zowel in alle eerlijkheid jezelf en je klasgenoten hier. Dus als je ooit vragen hebt over waar de lijn is, kunt u gewoon persoonlijk te bereiken voor mij. Maar het antwoord is altijd, geheel benadrukt tijdens de last minute, contant geld in een late dag. Of als het een kwestie van niet met een late dag, eerlijk, persoonlijk e-mail me. We verzinnen wel iets. Gelieve niet hier zet je tijd aan Harvard in gevaar. Nu, ik dacht dat we de stemming te verlichten, dus ik opgenomen dat als de volgende dia. [Gelach] DAVID J. MALAN: Deze website was geweldig. Ik werd eigenlijk een beetje afgeleid. Er is deze. En toen deze was geweldig. Oke, zo laat denken dat kitten 's nachts bij het maken van deze beslissingen. Oke, dus terug naar meer plezier en minder ernstige dingen, zoals voorwaarden. Oke, dus we spraken kort over deze. Dit is iets dat waarschijnlijk heel vertrouwd uit de wereld van de Scratch. En in de wereld van Scratch, hebben we deze behoefte soms gaan maken vorken in de weg. Ofwel doe dit of dat of dat andere ding hier. En als we dit willen doen, kunnen we, in C nu, dit als anders te construeren. En dan hier hebben we Booleaanse uitdrukkingen. Bijvoorbeeld, Booleaanse uitdrukkingen hier, kunnen we OF ze samen, in de zin dat we deze aandoening hebben OF die voorwaarde. Wij kunnen en ze samen, in de zin dat we willen check deze voorwaarde en die voorwaarde. En hier hebben we een switch-statement nu, dat is dus niet vergelijkbaar syntactisch met dat soort omstandigheden, maar het stelt ons in staat te doen het equivalent van if, else if, else if, else indien en dergelijke door simpelweg te sommen per geval door van geval tot geval. Zo zagen we de vorige keer. En toen begonnen we raken aan zaken als lussen. We zagen een van deze zojuist. Maar er zijn deze andere lusconstructies. Bijvoorbeeld, deze hier. Dus terwijl (voorwaarde), deze zaak doen opnieuw en opnieuw. Dus fundamenteel, wat lijkt anders te zijn tussen deze for-lus en deze while-lus hier? Deze for-lus en deze while-lus. Ja? Wat is dat? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Goed. Dus terwijl in de for-lus staat, er is duidelijk meer syntaxis. Er is een initialisatie, er is deze update. In een lus while, er is gewoon deze aandoening. Dus het lijkt erop dat het een beetje teruggebracht ten opzichte van de voor de lus, wat betekent dat als we willen variabelen hebben en we willen tot ophoging hebben we eigenlijk moeten doe dit ding zelf. Dus laat me gaan en open te stellen gedit. Laat mij over te schakelen naar het apparaat. En laten we gewoon doen een snelle kleine voorbeeld dat een van deze onderscheidt van de andere. En in de achterkant van mijn hoofd hier, moet ik een ding zeggen. Ik specifiek vermeld de naam Tim. Tim was eigenlijk iemand die een student probeerde te vinden om te doen hun huiswerk voor hen. We hadden geen Tim in de betreffende sectie. Dus realiseren, opdat ik niet bekendgemaakt een student, het was geen student. Het was een willekeurig persoon op het internet om dingen te doen bij volmacht vorig jaar. Dus we vinden dat ook. Dus in dit geval hier, laat me ga je gang en het openen van een nieuw bestand. Bestand, Nieuw. Dit geeft me een tab hier. Laat me ga je gang en sla het op als loop.c. Laat me gaan en klik op Opslaan. En dan hier beneden, laten we verder gaan en beginnen met het schrijven # Include . Laat me zoomen Nu doen we int main (void). Nu ik ga je gang en laat het for (int i = 0; i < oh, 10; i + +). En nu ga ik om verder te gaan en de ster niet af te drukken dat ik eerder deed. En dan aan het eind van dit programma, we gewoon gaan afdrukken van een nieuwe lijn, gewoon zo dat mijn prompt ziet er niet al rommelig. 0 terug. Lijken syntactisch correct? Dusver. Dus laten we eens kijken. Dus laat me uit te zoomen, ga in mijn terminal venster. En laat me gaan en lopen loop, want ik noemde dit ding loop.c. Zorg er dus voor lus. Lijkt OK compileren. Laat me lopen lus, en nu op Enter. En het lijkt te zijn afgedrukt 10 sterren. Dus laten we gewoon dit om te zetten in een while lus en zien wat soorten problemen die we struikelen. Dus in plaats van deze, laat me hier gaan en zeggen, terwijl i minder dan 10 - laat me te ontdoen van de for-lus. OK, dus we hebben een paar problemen reeds. Dus de conditie is hetzelfde, maar ik ben uiteraard ontbreekt de initialisatie. Ik mis de ophoging. Dus wat moet de compiler zal me vertellen wanneer ik probeer te compileren dit programma? Ja? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Goed. Dus het gaat om iets als zwartwerk zeggen - in dit geval, variabele i. En inderdaad, het gebruik van niet-aangegeven identifier i. En dus is dit in tegenstelling tot talen zoals PHP en Python en Ruby, waarmee sommige van jullie misschien bekend, waar u kunt gewoon een soort van start met behulp van variabelen tegen wil en dank en niet zorgen te maken over ze te declareren expliciet altijd. In C en in talen zoals Java en C + +, moet je super expliciet. En als je een variabele met de naam i, je moet me vertellen welke variabele is. Dus we zullen moeten oplossen als volgt. Ik ga te hebben om hier te gaan en int i typen, daarom, Ik heb verklaard een variabele genaamd i. Nu, ik heb een stap overgeslagen. Ik heb natuurlijk niet geïnitialiseerd, maar laten we eens kijken of dat bij minste merken Clang stop klagen. Dus laat me remake dit programma. Oke, nu is het gewoon klagen om een ​​andere reden. "Variabele 'i' wordt niet-geïnitialiseerd wanneer hier gebruikt." Oke, dus dat is vrij expliciet. Geïnitialiseerd betekent gewoon de oprichting ervan gelijk zijn aan een bepaalde waarde. En we hebben dat niet gedaan, dus laat mij eens proberen gelijk is aan 0. Laten we nu nog eens proberen en opnieuw uitvoeren Clang. Gecompileerde deze tijd. En ik sta op het punt om het te draaien. Maar grote oude oneindige lus, want ik heb gedaan de initialisatie, ik heb gedaan de aandoening, maar ik heb het nog nooit gedaan elke vorm van ophoging. Dus hoe kan ik de ophoging? Nou, in een while-lus, het voelt alsof ik ga hebben het doen binnenzijde van de lus, doordat net als de eerste week voorbeelden van het doen van lusconstructies, zoals bij de sokken en met de zelf-tellen, wat we moesten doen iets helemaal aan het einde, graag terug te gaan naar de volgende regel. Wat als ik ga je gang en doe dit i + + hier? Laten we ook niet deze samen te stellen. Al pak me. Wat is er mis hier? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Dus het is zeker niet int. Het is i. En de accolades, zoals vroeger, inspringen is niet genoeg. Dus nu heb ik dit construct. Dus terwijl ik minder dan 10, drukt u een ster, dan verhogen i. En de manier waarop een while-lus werken is dat zodra je de einde van de lus, die in dit geval lijkt leiding 10, het gaat om terug te gaan naar lijn 6, op welk punt de voorwaarde zal opnieuw worden gecontroleerd. En als ik nog steeds minder dan 10, dan doen we lijnen 8 en dan 9, dan zullen we raken 10, en ga terug naar 6, opnieuw en telkens weer, zolang i kleiner is dan 10. Dus laten we opnieuw uit te voeren hier te maken. Oke, we hebben goed samengesteld. Laat me re-run lus. En nu lijkt het echt te werken. Dus plussen en minnen hier? Nou, tot nu toe is er eigenlijk niet een geheel van PLO - zo schattig. Oke, dat was een - ah, dat was een ongeluk. Oke, dus laten we terug gaan naar de for-lus. Dus voor loops zijn leuk omdat ze super expliciet. En ook al zijn ze een beetje onhandig om te schrijven, het is zeer krachtig en het laat u doen om meerdere dingen tegelijk. Terwijl loops lijken niet om een ​​enorme hoeveelheid waarde hebben net toch, omdat het voelt alsof we alleen maar meer werk te doen. We moeten de initialisatie zetten hier, de hier werken naar beneden, en we moeten niet vergeten dat allemaal doen. Dus we zullen zien in de tijd dat, terwijl loops eigenlijk lenen zich tot slechts verschillende contexten, verschillende data structuren zoals lijsten en hash tabellen, dingen die we zullen krijgen om mid-semester. Maar voor nu, weten dat er dit derde type bekend als een doe- while lus. En we hebben gezien dit kort. En dit zou kunnen zijn super behulpzaam met PSET 1. Elke keer dat je iets wilt doen en dan controleren of de gebruiker meewerkte, en als ze dat niet deden, het opnieuw doen, een doe- while lus leent zich voor dat soort logica. Want als het bestellen van boven naar beneden hier al doet vermoeden, doen betekent letterlijk doen. En doe dit opnieuw en opnieuw, wat zou dat zijn? Misschien is het een beroep worden GetInt of GetString en vervolgens het controleren van de waarde van de GetInt of GetString en dan schreeuwen bij de gebruiker als ze niet meegewerkt door hen te vragen opnieuw en opnieuw en opnieuw. Waar wil je een keer iets doen, controleer dan of andere voorwaarde. Dus laten we dit proberen. Laat ik eigenlijk dit nu veranderen in een do-while-lus. En ik ga om verder te gaan en het volgende te doen. Dus doe het volgende. Laten we het doen int i = GetInt (), maar laten we eerst de gebruiker te vertellen wat te doen. Dus een beetje anders deze keer. "Geef me een int". Dus ik zal printf gebruiken voor. En nu ga ik hier naar beneden gaan, en ik ga om dit te doen terwijl ik is, laten we zeggen, groter dan - laten we eens kijken, ik wil zeggen, laten we zeggen, minder dan 0, of i groter dan 10. Met andere woorden, wil een getal van 1 tot 9, maar willekeurig. Dus ik ben met behulp van een gecombineerde Booleaanse expressie hier om zorgen dat i kleiner is dan 0 of groter dan 10, waarin geval zal ik deze lus weer hier te doen. Dus nogmaals, dit doen - terwijl i kleiner is dan 0 of i groter is dan 10. Dus laten we nu verder gaan en dit doen als we dat gedaan hebt. Laten we doen een snelle sanity check. printf ("Bedankt, i is% d", i). Dus dit eenvoudige programma vraagt ​​de gebruiker om een ​​int, zorgt ervoor dat het binnen een paar bereik 1 tot en met 9, en dan, dankzij de gebruiker door hen eraan te herinneren wat ze net ingetypt, net als een klein sanity check. Maar laten we eens kijken of dit werkt zoals bedoeld. Laat me go head hier naar beneden en opnieuw uit te voeren maken lus. Hmm. "Gebruik van niet-aangegeven identifier 'i'". Dat is vreemd. Ik dacht dat we besloten dat. Zelfde symptoom maar andere code. Ja? PUBLIEK: [onverstaanbaar] in de twee, we moeten [Onverstaanbaar]. DAVID J. MALAN: Precies. Dus dit leidt ons eigenlijk op een onderwerp bekend als scope. Het blijkt dat C weer,, Ben jij het echt duurt letterlijk. En als je iets als dit waar verklaart u een int en toekennen bepaalde waarde, maar je dat de binnenkant van een paar accolades, wat C doet is het ervan uitgegaan dat u alleen willen dat die 32 bits bekend als i te bestaan ​​binnen de kader van die accolades, in het kader van de lijnen 6 tot 9. Dus ik wordt verklaard, en het krijgt een waarde in lijn 8, maar zodra je buiten lijn 9 onder de accolade, i is niet langer in ruimte, om zo te zeggen. S-C-O-P-E. Het is niet meer in de juiste context. Dus nu is er geen ik, dus het is alsof we hadden niet eens verklaarde het helemaal. Dus wat is een oplossing dan voor iets als dit, als de reden hiervoor is dat ik wordt verklaard binnen de accolades, die is blijkbaar slecht? Hier? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja. Dus we kunnen initialiseren buiten. Dus laat me gaan en verwijder de verklaring onderdelen waarbij Ik geef de soort, en laat mij dat doen hier op. Dus in lijn 5, het zegt nu "Geef me een int." Noem het i. Merk op dat in lijn 9, ik wil niet om dit te doen, omdat ik al de 32 bits. Ik wil niet op de computer voor een vraag verschillende 32 bits. Ik wil diezelfde 32 bits te gebruiken. En nu, omdat ik wordt verklaard in lijn 5, het is nog steeds legaal om het te gebruiken in de lijn 11 en lijn 12. Dus laat me proberen dit hercompileren en te zien Als Clang stopt schreeuwen. maken lus. Dus nu is het "impliciete declaratie van functie 'GetInt' is ongeldig in C99. "Wat is dat? Ja? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja. Dus nu dat ik eigenlijk ben GetInt gebruikt, dit is niet iets dat komt alleen met C. Dit komt door CS50. Dus moeten we dit hier. En laat me terug te gaan naar de prompt naar beneden hier en opnieuw uitvoeren te maken. Oke, eindelijk. Nu hebben we besloten dat en de andere fout. Laat me nu lus lopen en zien wat er gebeurt. "Geef me een int." Ik geef het 11. Ik geef het -1. Ik geef het foo. Ik geef het 5. En nu werkt het inderdaad. Maar de vraag veranderd voor een reden hier. Waarom heeft het te zeggen retry een van deze tijden, maar geef me een int de andere drie keer? Waarom is dat gedrag anders? PUBLIEK: Gaf het een string. DAVID J. MALAN: Sorry? PUBLIEK: Je gaf het een string. DAVID J. MALAN: Ja. Dus we probeerden het een string in deze derde poging, toen ik foo getypt. Foo is een string. Het is duidelijk niet een int. En de manier waarop CS50 heeft GetInt geïmplementeerd, is dat we niet controleren of er iets is kleiner dan 0 of groter dan 10 voor u, want hoe weten we van tevoren wat voor soort int je wilt? Maar we kunnen minimaal voor u controleren, heeft de gebruiker in ieder geval Typ een geheel getal? En als ze dat niet deden, we schreeuwen tegen de gebruiker door het intikken van "retry" op het scherm. Dus nu hebben we een programma dat looping. Oke. Nu, welke van deze soort beter construct? Dus dit is waar dingen beginnen om een ​​beetje rommelig te krijgen, de feit dat je aan te denken om een ​​variabele hier declareren up als je wilt om het te gebruiken binnenkant van sommige accolades en buiten. Maar zelfs als dit ziet er een beetje cryptisch op het eerste blik, gewoon opnieuw, denk aan de eenvoudige logica. Om iets te gebruiken in C, of ​​het een functie of het is een variabele, moet u op te nemen als het een functie in sommige bibliotheek, of je nodig hebt om het te verklaren. Maar nu moet je extra bewust van het feit dat je bent te verklaren op de juiste omvang. U bent niet zetten het te strak binnenkant van haakjes. Dus laat me eigenlijk terug te rollen. Als we terug gaan naar onze bijvoorbeeld van eerder, en ik ga terug naar voor int, int i = 0; i <10; i + +, en ik doen printf sterren, zoals deze, en sluit haakje, en nu printf i is nu - volgens dezelfde logica, wat zal er gebeuren als ik probeer te compileren dit programma? PUBLIEK: Ongeldige id. DAVID J. MALAN: Dus het is een andere ongeldige identificatie, zwart identifier. Nu, de reden is een beetje anders. Er is uiteraard geen accolades hier, maar dezelfde idee, hetzelfde verhaal van de werkingssfeer is van toepassing. Als u hebben verklaard een variabele als ik de binnenkant van een for-lus, zelfs als u niet expliciet geschreven krullend bretels, mentaal denken aan hen als nog daar te zijn, waarbij geval i is alleen geldig binnen de for-lus. Het is niet geldig als je eenmaal naar de volgende regel, die in dit geval is nu 10. Dus gewoon een paar problemen van omvang en dergelijke. Oke, nog vragen? Oke, dus dit is een soort van een triviale klein programma, afdrukken gewoon kleine sterren. Maar laten we eens kijken of je nog dit nummer hier. Dit is een ongelooflijk irritant lied de kinderen zouden zingen op de schoolbus en dergelijke. Maar wat is er leuk over het is dat het deze cycliciteit heeft, waarbij het is "99 flessen bier op de muur, 99 flessen bier. Neem een ​​naar beneden, voorbij het rond, 98 flessen bier op de muur. "En dan het lied herhaalt de 97, dan 96, dan 95, dan 94, helemaal naar beneden op 0 als u daadwerkelijk kreeg dat ver op de bus. Dus dit is een leuk programma om te sorteren van werktuig, omdat mijn God, als je kon gewoon de uitvoering van dit met een paar regels code, kunt u spugen de hele tekst van deze lied vrij snel. Maar langs de weg, kunnen we beginnen met het nu plagen elkaar een aantal van deze fundamentele lusconstructies en nu ook introduceren functies die we zelf schrijven, waarden retourneren dat we pas rond. Maar eerst, waarom we niet verder te gaan en nemen onze vijf minuten breken hier? En als we terug zijn, zullen we dit lied zingen. Oke, dus we zijn weer terug. En als ik zeg dat we nu dit lied zingen, ik bedoel programmatisch, niet verbaal. Hier hebben we dus beer1.c, een uitvoering van deze bepaald liedje. En net om duidelijk te zijn, voor degenen die niet bekend zijn met wat dit ding eruit ziet, laat me gaan en maak beer1, Enter. Laat me lopen beer1, en wat we zullen zien - hoeveel flessen van bier zullen er zijn? Ik typ in 99, zoals het lied zegt. Enter. En nu, als we bladeren door - oops - als we bladeren door dit alles, zullen we zien dat dit inderdaad zingen de hele song. Wacht eens even. Mijn schuifbalk is een beetje messed up. Laten we gebruik maken van de groter venster. Dus beer1, 99, daar gaan we. Hier hebben we dus de hele song, veel sneller gezongen door de computer dan het had kunnen zijn door ons. Dus hoewel opmerken,, de cyclische natuur hier. Het zegt 99, dan 99 dan, "neem een ​​naar beneden, geef het rond, "dan 98. En nu herhaalt opnieuw en opnieuw. Dus dit is eigenlijk een perfecte gelegenheid voor een soort van looping construeren. Merk op dat ik ben een beetje van het snijden van een hoek hier. Merk op dat ik zeg "98 flessen bier op de muur, 97 flessen bier op de muur, "en dat was gewoon zo dat als we naar een flessen bier, heb ik niet te maken over de Engels grammatica. Maar we kunnen ook dit oplossen met een beetje van een if- conditie, misschien. Als dit nummer is enkelvoud, ga je gang en zeg "fles", anders als het meervoud, zeggen "flessen". Maar voor nu, ik ben helemaal te snijden die hoek. Dus laten we eens kijken wat we hier hebben. Dus we hebben een aantal opmerkingen aan de top. Ik ben met inbegrip van deze twee bibliotheken, zoals we hebben vaak geweest. En nu laat ik scroll naar beneden naar de eerste werkelijke regels code. Lijn 17 gaat van start belangrijkste. Lijn 21 en 20 heeft hoeveel flessen bier zal er zijn? En dan noem ik GetInt. En nu heb ik een beetje een sanity check. Dus dit is een conventie dat we nu beginnen de aanneming tot strenger controleren invoer van de gebruiker. Soms heb je gewoon niet willen opnieuw vragen ze en opnieuw en opnieuw. Als de gebruiker schroeven en werkt niet mee, prima. Stoppen en gewoon niet omgaan met hen. En dus dat is wat ik hier doe. Als n kleiner is dan 1, ik ben gewoon ga schreeuwen tegen de gebruiker, 'Het spijt me, dat heeft geen zin. " En dan ga ik naar willekeurig terug 1. Dus nogmaals, dit is slechts een conventie om te wennen aan. Voor nu, neem het op geloof. Maar tot nu toe hebben we altijd terug 0, omdat we hebben gezegd terug te keren 0 betekent wat? PUBLIEK: Succes. DAVID J. MALAN: Succes, dat is alles. Dus nu we eindelijk gaan beginnen na te denken over niet-successen - Met andere woorden, hoek gevallen fouttoestanden - nu heb ik een oneindig aanbod, of op zijn minst vier miljard mogelijke dingen die kunnen misgaan in mijn programma's. En ik kan beginnen met het toewijzen van hen een individueel nummer. Nu, in het algemeen volstaat het om gewoon terug te keren iets anders dan 0. Dus we gaan gewoon een terug te keren voor nu. Maar de reden voor de terugkeer 1 is dat zodra u terugkeert 1, raden wat er gebeurt met de rest van het programma? Het stopt. Dat is het. Dus het feit dat ik een terugkeer is effectief kortsluiting van dit programma executie, zodat niets onder lijn 27 zal blijven uitvoeren. Zodra belangrijkste rendement, dat is het. Oke, dus als de gebruiker doet samenwerken en bereiken we lijn 30 omdat ze getypt in een legitieme getal, hier is mijn uitvoering van dit nummer. Dus ik eerst af te drukken van een nieuwe regel karakter, alleen voor esthetiek. Ik heb nu een for-lus. En let op ik doe dingen in een beetje van een andere richting. Ik heb geen tot minder dan doen, ik heb geen tot + + doen. Ik kan in plaats daarvan zeggen initialiseren van een variabele i, stel deze gelijk aan n is het aantal de gebruiker heeft ingevoerd in, doe dan het volgende, zodat Zolang ik groter is dan 0, dan is i - als je eenmaal klaar bent met een iteratie van deze lus. Dus we kunnen aftellen met behulp van een for-lus ook. Nu, dit is vrij veel week een spul nu, met printf. Dus print "% d flessen bier op de muur." Print "% d flessen bier. "" Neem een ​​naar beneden, het rond gaan. "Print "% D flessen bier op de muur." Dus het is nog steeds% d, maar merken dat het argument printf aan het veranderen is. Na de komma, ik heb ik, want ik wil 99 zeggen. Na deze komma, ik heb ik, want ik wil 99 zeggen. Na deze komma, ik heb i - 1, want ik wil tot 98 zeggen in deze eerste iteratie, enzovoort. En nu hier beneden, ik heb alleen een paar stomme opmerking. En dan lijn 42, I 0 terug volgens afspraak, wat betekent dat alles in orde is. Dus wat als ik goofed? Wat zou een veel voorkomende fout hier te zijn? Nou, wat als ik per ongeluk zei nou, ik wil tellen tot 0, ik wil 0 flessen bier op de muur? Dus bijv. i groter dan of gelijk aan 0. Wat gaat er het symptoom dat ik nu kijken of ik opnieuw te compileren zijn beer1 en voer het uit? PUBLIEK: Negatief. DAVID J. MALAN: Ja, het is ga negatief. Dit is een off-door-een fout, een ongelooflijk veel gemaakte fout te maken. Laten we in feite terug naar de terminal-venster en doe het hier, zodat we kunnen zien meer in een tijd. Voer, 99 flessen bier. Close, maar we gingen ooit zo iets te ver. We zongen het lied te ver naar beneden, zodat we nu de getroffen negatief getal. Het maakt dus niet helemaal werkt. Oke, dus we kunnen gemakkelijk vast te stellen dat door terug te gaan naar de zoals het ooit was. Maar wat zijn een aantal mogelijkheden nu verbetering? Nou, laat me openen beer2.c en hier scroll naar beneden en neem een kijk naar deze versie. Wat is het eerste dat eruit springt als verschillende in deze versie hier? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja, dus niet meer ik, want het kwam bij me weet je wat, ik de gebruiker voor n te vragen, en dan ben ik het instellen van i gelijk is aan n, en dan ga ik veranderen ik, maar ik ben nooit aanraken n weer. Dus wat is het nou was het punt dat u de toewijzing van nog eens 32 stukjes genaamd i gewoon zo dat ik kan een andere variabele te hebben? Dus in dit geval, ik soort van erkend dat onnodige designkenmerk. En ik ga nu te zeggen, terwijl n groter is dan 0, gaat u vooruit en print de zelfde lied, het passeren van een n aan printf als de tweede argument, en n - 1 als het tweede argument hier beneden. En dan op elke iteratie van deze lus, ga je gang en net verlagen n zelf. Nu functioneel dit programma zal identiek. Als ik typ in 99, n begint bij 99. Ik decrement, decrement, verlagen, verlagen. Ik ga de hele weg naar beneden naar "Een fles bier op de muur, een fles bier. Neem een ​​naar beneden, voorbij het rond. 0 flessen bier op de muur. "Het einde, want ik heb krijgen de aandoening correct. Het is groter dan 0. Ik heb niet maken deze fout. Dus dat is beter, versie een of versie twee? Dus hoorde ik een heleboel murmureringen voor twee. Waarom twee? Wat is dat? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Oh, oke. Dus het zal niet gaan onder 0, maar vergeet niet, in versie een, de originele juiste versie ging niet onder 0 niet. Dus vergeet niet dat dit de juiste versie. Dus laten we op zijn minst te vergelijken van de twee juiste versies. Wat is een argument ten gunste van versie twee zijn, mmm, beter? Ja? PUBLIEK: Het gebruikt minder ruimte in beslag. DAVID J. MALAN: Oke, dus hij gebruikt minder ruimte in beslag, toch? Overwegende dat de versie die wordt gebruikt 32 bits voor n, en dan nog 32 bits voor i. Versie twee slechts 32 bits gebruikt voor n, zodat lijkt een plus. Andere gedachten? Wil iemand pleiten voor een? Ja? PUBLIEK: Je moet je extra regel code te gebruiken voor n -. DAVID J. MALAN: Oke, zeker. Dus dat is eerlijk. Dus dit gewoon, althans bij mij - Ik bedoel, dit eigenlijk voelt een beetje rommeliger, het feit dat Ik kan niet sorteren van kapselen al mijn logica in een mooie lijn, de for-lus, als de for-lus kan. Hier, ik soort van moet gehecht worden op deze n - Aan het einde van de lus, doordat Het is logisch noodzakelijk. Maar het soort wrijft mij de verkeerde kant op, alleen maar omdat het lijkt los van de logica van hier, ook al, nogmaals, het is noodzakelijk. Andere gedachten? Ja? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja. Dus wat als je in plaats daarvan, aan het einde van de song, wilde opnieuw af te drukken de naam van het liedje? Net als "Bedankt voor het spelen 99 flesjes bier", of iets dom als dat? Maar het punt is, je wilde de toegang tot de oorspronkelijke waarde. Het feit dat u gemuteerd of veranderd n op elke iteratie en daarom hebben vernietigd zijn oorspronkelijke waarde betekent dat u gewoon niet doen, dat aan het eind. Nu, misschien wel, we duidelijk niet willen doen dat in dit programma. Dus who cares? Maar dat is een zeer valide punt. En om eerlijk te zijn, er is echt niemand hier te beantwoorden. Ze zijn allebei in gelijke mate juist. Ik kon overtuigd worden in beide richtingen. Ik zal zeggen dat, in het algemeen, is het een goed principe als je vroeg de gebruiker voor een waarde en u opgeslagen in een variabele zoals n, gewoon soort van uit principe, is het waarschijnlijk goed die rond te houden. En alle gegevens die u wilt opnieuw en opnieuw muteren, net geef jezelf een kopie van die variabele, gewoon zo dat je toegang tot het origineel. U besteden 32 meer bits, maar de realiteit is dit computer heeft, zoals, twee gigabyte aan RAM-geheugen van deze dag, en we zijn spitsvondigheden meer dan 32 bits? Echt niet zo'n big deal. En zelfs op dit apparaat hier, met een halve gig of een gigabyte aan RAM-geheugen, 32 bits versus 64 bits, niet zo'n big deal. Zeker vandaag de dag, het gaat om plaats te overweldigd door de grootte zijn van het programma zelf, die zal worden honderden kilobytes, zo niet een paar megabytes, deze dagen. Dus redelijk gaat, niet een juist antwoord. Maar in ieder geval, dat zijn de gedachten die begint te gaan door je hoofd? Omdat in PSET 0, ook al hebben we eigenlijk alleen verwacht correctheid, of in ieder geval afwijzen verschillende bugs die die u misschien tegenkomt, als we vooruit, het ontwerp is weer een belangrijk aspect, zowel van het schrijven van code en ook onze evaluatie van code. En dus op zijn minst te denken over dit soort dingen. En alleen maar omdat iets werkt wil niet zeggen dat het goed is, betekent niet dat het is goed ontworpen. En dat is een van de dingen die het onderwijs jongens en probleem sets zal ons helpen plagen deel in de tijd. Nou, hoe zit het, laten we zeggen, deze versie hier? Laat mij iets doen een beetje sexy hier in een moment. Laat me eerst te ontdoen van deze. En laten we nu dit oplossen grammaticale kwestie. Dus in deze versie, wil ik de grammatica vast, zodat, in plaats van alleen maar zeggen haakjes s, zoals "fles" of "flessen" - Ik wil niet naar die hoek snijden - Ik wil ook dynamisch afdrukken het woord "flessen" of "fles", waardoor het gebruik van deze% s placeholders vandaag. Dus ik moet voorwaardelijk controleren wat is de waarde van i. En als het een, ik wil "fles" zeggen, en als het even wat anders, ik wil "flessen" te zeggen. Dus laten we proberen om dit te doen. Dus als i == 1, dan laat me gaan en verklaren - Ik heb een string, dus laat mij dat doen snaar s1, want het is de eerste string Ik geef om op dit moment. Ik ga "fles" te zeggen. En dan, laten we eens kijken, string s2 - en ik zal uitleggen waar ik heen ga in een moment - "Flessen". Dus herinneren dat, in dit lied, moeten we in staat zijn om mogelijk afdrukken meer twee verschillende woorden. Dus als we terugkijken hier, merken dat als we in dit voorbeeld hier, "twee flessen bier op de muur, twee flessen bier, neem een ​​naar beneden, voorbij het rond ", ik wil Deze vierde lijn nu te zeggen "een fles bier op de muur ". Dus ik moet beslissen, wil ik zeggen:" flessen "of "Fles"? Dus ik ga naar willekeur te zeggen, oke, Ik ga nu verklaren een variabele genaamd s1, tekenreeks een, dat gaat aangesloten hier binnen en ook hier, want die woorden zijn altijd identiek, alleen maar omdat van de aard van de song. En ik ga bellen s2 welk woord ik wil uiteindelijk hier ook zien naar beneden. Nu, letterlijk, 99 keer van de 100, het gaat om de hetzelfde in beide gevallen, want 3 is meervoudig, 2 meervoud, 4 is meervoud. Maar in deze hoek geval, waar we bij 2 en vervolgens op 1, of zelfs 1 en daarna 0, ik heb deze logica. Dus ik moet wat tijd door te brengen in mijn code om dat recht. Dus als ik dit doe, als ik == 1 en stel s1 gelijk aan "fles" en S2 gelijk aan "flessen", omdat dit voor een fles, en dit zal voor 0 flessen. En dit hier, dit is wat voor? Voor alle duidelijkheid. Dit is slechts een reactie. Dus het feit dat je kunt een regel commentaar hebben betekent dat je kan comment code zoals deze, maar een andere veel voorkomende paradigma is ook dat als je een super-korte zin die je wilt jezelf en het is gewoon beter leesbaar te maken aan het goed aan het einde van de regel code, kunt u absoluut iets doen als dit. Dus nu wat als ik dit doe? Else if i niet gelijk aan 1. Dus bang is gelijk aan - uitroepteken staat bekend als "bang". Dus bang = 1. Dus als ik niet gelijk is aan 1, wat moet ik in plaats daarvan wil doen? Nou, het eerste woord dat ik wil zijn wat? Dus string 1 zou moeten zijn "flessen" voor meerdere flessen, en dan zal dit meervoud "flessen" ook, voor nu. En we zullen zien of dit ook daadwerkelijk krijgt ons waar we naartoe willen. Dus als ik nu naar beneden scrollen hier, merken dat ik het aansluiten van niet alleen ik, maar s1. Ik ben het inpluggen van i en s1. En hier beneden, ik minus 1, wat hetzelfde is als voor, maar s2. Met andere woorden, ik wil dat het Engels woord te veranderen op basis op deze logica. Nu, er is al een aantal problemen in deze code. Wat is al gebroken uit de poort hier? Ja? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Precies. Dus ik heb al geschonden de les van omvang. Dus ik heb verklaard s1 en s2, maar ik heb het gedaan binnenkant van accolades, wat betekent ja, deze code zal werken op tot lijn 42, maar zodra ik lijn 43 geraakt, wat denk je er geen meer bestaat? Nou, wat denk je nu niet meer in omvang - niet s1 of s2. Dus we moeten dit op te lossen. Dus laat me verwijderen van de verklaringen. En ik verlaat de variabele namen en verwijder deze hier en hier verwijder deze. En in welke lijnen zou ik echt verklaar deze dingen? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja, dus waarschijnlijk recht omhoog hier, 33-ish. Dus snaar s1 en s2 snaar. En het blijkt, kan ik dit doen. Als je verklaren twee variabelen van hetzelfde type, je kunt eigenlijk gewoon gebruik maken van een komma en dat doen in C. Alle Oke, dus nu heb ik twee variabelen - s1 en s2. Ik ben ze toe te kennen waarden in deze omstandigheden hier, of hier. En dan heb ik het gebruik ervan beneden. Hoe goed is dit nu gaat werken? Nou, het is nog steeds een beetje buggy, maar laten we eens kijken op zijn minst hoe ver we zijn gekomen. Dus laat me gaan en maak beer3. Hierdoor beer3? Yep, dit is beer3. En nu laat ik verder gaan en lopen beer3. 399 99. We kunnen waarschijnlijk overslaan meeste van hen. En hier beneden, kijk eens aan. "Een fles bier op de muur, een fles bier, nemen een naar beneden, voorbij het rond, 0 flessen bier op de muur. " Maar ik uw aandacht slechts de helft van de oplossing. Soort verpest hier. Dus het lijkt erop dat de hoek gevallen zich voordoen wanneer i gelijk is aan wat twee waarden? PUBLIEK: 2, 1. DAVID J. MALAN: 2 en 1. Het is niet 1 en niet 1. Het is echt alleen deze laatste twee strofen van dit lied. Dus wat moet ik in plaats daarvan wil doen? Dus ik lijken te hebben gevangen het geval dat als ik is == tot 1, dan is het eerste woord is "fles", maar het tweede woord is "flessen". Maar hier, ik wil veranderen dat dit == 2. En als dit het geval is, wat wil ik de eerste woord te zijn? PUBLIEK: "Flessen". DAVID J. MALAN: "Flessen", dus voor twee flessen. En dan dit woord hier zou moeten zijn - PUBLIEK: "Bottle". DAVID J. MALAN: "Bottle", enkelvoud. Oke, laten we uit te zoomen, ga terug naar hier, re-run te maken, re-run beer3, type 99 weer. Oke, 'Segmentation fault (core dumped). " Wat heb ik verkeerd gedaan? PUBLIEK: Je hebt geen waarde [onverstaanbaar]. DAVID J. MALAN: Ah, goed punt. Oke, dus wat is er mis hier? Dus segmentatie fout, en we eigenlijk gaan zien dit wel een paar keer in de toekomst bewust. Maar voor nu, dit betekent wat eigenlijk? Een segmentation fault bijna altijd betekent dat je moet een of andere manier geprobeerd om het geheugen, RAM-geheugen in uw computer, dat niet van u is, dat u niet echt vroeg de besturingssysteem voor. Dus in dit geval, let op wat ik heb gedaan, dat is gebrekkig in mijn logica. Ik heb toegewezen s1 en s2 een waarde als ik gelijk is aan 1. Ik heb ook gedaan als ik gelijk is aan 2. Maar ik heb het niet gedaan in de oneindige aantal andere mogelijkheden - in het bijzonder 3 of 4 of dot dot, dot, 99. Dus een oplossing voor dit kon gewoon laten we een andere aandoening. En laat me gaan hier binnen en zeggen: s1 gelijk aan - wat moet het hier zijn? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: "Flessen", want in het voorkomende geval, het is gewoon hetzelfde. Dus gelijk citaat, unquote, "flessen". Dus voor meervoud flessen, en dan hier, voor meerdere flessen. Oke, dus nu laat ik terug naar mijn terminal venster, opnieuw compileren, re-run het. 99. Oef. En laten we een snelle sanity check. Technisch gezien zouden we willen al deze te lezen om er zeker van ze zijn juist, maar laten we eens kijken naar minste bekende boosdoeners. 3 flessen, 2 flessen, 2 flessen, 1 fles, 1 fles, 0 flessen. We lijken op zijn minst hebben vastgesteld het voor nu. Maar de vangst is hier dat wat een god verschrikkelijk puinhoop is dit gewoon om een ​​domme lossen een teken grammaticale details. Dus er is een soort van een reden die ik snijd deze hoek eerder, omdat het net volledig te vervelend schrijf dit veel code. Maar het blijkt dat er iets meer elegante manier van de uiting van de precies hetzelfde. En we kunnen dit als volgt doen. Laat me dit laat op het scherm voor een moment en introduceren iets bekend als een ternaire operator. Dit is een soort van een one-liner die net is bedoeld om onze leeft een beetje sexier, zoals beloofd. En ik ga doen dit als volgt. Geef me een string genaamd s1, en laat mij toewijzen als volgt. (I == 1)? "Fles", anders "flessen". String s2 krijgt (i == 2)? "Fles", anders "flessen". Dus wat is dan het verschil hier? Deze twee regels code, ik betogen, kan vervang deze hele puinhoop. Dus ik noem het een puinhoop, alleen maar omdat het soort van mij de wrijft verkeerde manier dat het zo veel regels code. Niet verkeerd. Het is niet slecht ontwerp. Zoals, dit is volkomen juist en perfect in orde. Maar codering krijgt vervelend als je moet zo uitdrukken verdomme specifiek opnieuw en opnieuw en opnieuw met een eenvoudige scenario als dit. Dus C heeft een aantal sneltoetsen, zoals dit. Dus dit zegt in essentie verklaren een string genaamd s1 en toewijzen of deze waarde of deze waarde als ik is == - sorry, moet ik zeggen dat dit duidelijker. Declareer een variabele s1, toewijzen deze waarde als dit waar is. Anders toewijzen deze waarde. Met andere woorden, dit soort een regel manier zeggen als anders dan het doen van een opdracht langs de weg. Dus als ik 1 is, dan ga je gang en noemen dit "bottle". En dan is dit anders, noem het "flessen". Ondertussen, s2, de tweede woord dat we nodig hebben om te definiëren, als ik gelijk is aan 2, zullen we ingesteld s2 op "bottle". Anders, zet deze op "flessen". En wat Dit betekent dat nu kan ik gaan door dit en verwijder alle die regels code. En als ik zeg, een beetje belachelijk, dat dit nu sexier, het is sexier in het soort stilistische zin. Dat functioneel Deze code daadwerkelijk zal doen precies hetzelfde. En hoewel het ziet er misschien een beetje cryptisch op het eerste blik, omdat we niet hebben dit construct gezien, zou ik beweren dat het uiteindelijk gaat worden zo veel meer leesbaar en zo veel makkelijker voor wij mensen om te sorteren van begrijpen, want nu kun je gewoon lezen code alles op een regel. Het is nog steeds in dezelfde geest aan een of, indien dit het conditie en dan is dit wat er in de if en dit is wat er in de ander. Maar we kunnen dit doen gewoon veel meer elegant. En als ik nu terug naar mijn terminal, die verwijderd alle van die lijnen en vervangen door alleen die twee, opnieuw compileren, re-run flessen bier met 99, merk dat mijn grammatica is in feite nog klopt. Dus nogmaals, wat om te beginnen. 2 flessen bier, 1 fles bier. Ziet er goed uit. Ja. Dus daar hebben we een veel beknopter oplossing. Dus dit ook als je meer comfortabel met C, niet noodzakelijkerwijs met de eerste PSET of zelfs tweede, maar beseffen dat deze constructen kunnen ons in staat stellen om steeds dingen te doen meer elegant. Nu gaan we een ander ding hier. Laat me gaan en open te stellen return1.c. Laten we nu eens beginnen met een ander probleem op een manier die op te lossen stelt ons in staat te schrijven meer geavanceerde code. Dus hier is een eenvoudig klein programma dat tot doel in het leven te verhogen waarden. En eigenlijk, laten we een stap terug. Laat mij handmatig dit. Laat mij op te nemen en int main (void). En laat me noemen dit increment.c. En wat wil ik doen? Ik ga om verder te gaan en iets te zeggen - zullen we de nummers hetzelfde - int x. Dus int x krijgt 2; printf x is% d, nieuwe lijn, x. Dus ik ben het typen snel, maar soort van vertrouwde dingen nu. Dan ga ik naar x + + doen. Dan ga ik naar dezelfde zin opnieuw af te drukken. En dan ga ik naar 0 terug te keren alleen maar om het programma te verlaten. Oke, dus dit is een programma dat stappen van een nummer. Het is eerst naar iets te initialiseren naar 2, en dan is het gaat om het te verhogen en opnieuw afdrukken. Dus laten we lopen increment, ongelooflijk eenvoudig programma. Maar nu dat ik wil kubus van de waarde, dus doe iets enigszins arbitrair. En ik eigenlijk wil doen x krijgt de kubus van. Dus ik zou kunnen gebruiken wat de pow functie genaamd, maar dat doe ik niet echt weet waar dat is nog niet. Dus ik ga om dit te doen op de ouderwetse manier. x keer deze is gelijk aan x maal x keer x. Dus ik ben cubing de waarde, te vermenigvuldigen met zichzelf opnieuw en opnieuw en opnieuw, zodat we de kracht van 3 in dit geval. Dus nu de getallen moet afdrukken zou moeten zijn, zoals we zullen zien hier - maak increment, dus het is eigenlijk niet echt verhogen meer, maar we laten de naam alleen al - 2 en dan 8. Nu hebben we het begin van een kans voor verfijning hier, waarbij deze Cubing ding van het vermenigvuldigen van een getal zelf op zich zelf voelt dit misschien wel nuttig te hebben als een functie, net als iemand die besloten jaar geleden - je weet wel, een beetje handig zijn als een van ons gaat zitten en schrijft printf zodat de rest van de wereld kan gebruiken, waarom gaan we niet zitten en schrijf een functie genaamd kubus dat doet dit Cubing voor ons, zodat we niet handmatig hoeft te uitvoering van de notie van cubing waarden hier? Dus een simpel voorbeeld, maar laten we verder gaan en gebruik maken van dit als een mogelijkheid om onze eigen functie te schrijven. Tot nu toe hebben we alleen de belangrijkste gebruikt, en we hebben andere gebruikte mensen functies, maar we hebben niet geschreven onze eigen. Dus hier gaan we dan. Ik ga om verder te gaan en een functie genaamd kubus te schrijven. En ik ga om het te laten nemen van een ingang. Dus de ingang gaat een geheel getal zijn. En wat gaat het doen? Het zal int uitgang verklaren = ingang keer ingang Keer input. En dan is het gaat om die uitgang terug te keren. En dan moet ik nu specifiek te zijn. Deze functie gaat naar een int terug te keren. Dus hier is dan hoe je zou schrijven uw eigen functies. Je moet eerst beslissen wat is de naam van uw functie gaat worden. En in het algemeen, iets verklarende is goed, dus ik zal noem het kubus. Dan moet je om aan te geven wat het gaat om terug te keren, wat is de uitgang gaat worden. En we hebben nog geen dat vele opties. Int, char, float, bool, string. Voor nu, ik ga aan de stok met een int, want ik wil het een integer terug. Dan moet je aangeven wat de inputs, indien aanwezig, zijn. En als kubus een argument neemt, duurt iets tussen haakjes, je moet dat argument een naam te geven, zodat je kunt noemen iets als je de uitvoering of het schrijven van deze functie en u geven een type, dat in dit geval zal zijn int. Dus in het kort, kubus is een functie die een integer is als input en geeft een geheel als output. Dus wat doet het met die ingang? Nou, in de lijn 14, verklaar ik een variabele genaamd uitgang, en ik wijs hieraan de waarde, ingang keer ingang keer ingang. En dan heb ik terug output. Dus hoe kan ik dan gebruiken? Wat moet ik veranderen deze gemarkeerde tekens on-line 7 op, denk je? PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Ja, dus kubus van x. Dus x is een variabele, waardoor het bezit bepaalde waarde. Gelukkig, het is van het type integer. En omdat x is een int, dat betekent dat ik kan het in kubus. En hoewel ik het overschrijven van de waarde van x met de waarde van kubus x, zoals al het geval is tot nu toe, elke keer dat je hebben gelijke teken en een regel code, het spul aan de rechterkant wordt uitgevoerd en vervolgens wordt toegewezen aan de waarde links. Dus de volgorde van de bewerkingen is als we hopen zouden. Dus werkt dit? Nou, laat me hier naar beneden gaan. Laat me open mijn terminal venster. Laat me niet increment te maken, op Enter. "Impliciete verklaring van 'kubus' functie is ongeldig C99. "Even terzijde, C99 verwijst naar de taal C zoals het was gedefinieerd in 1999, en dat was een update over de versie van 1989, een update over het origineel. Dus dat is alles dat betekent. Dus wat betekent het dat "impliciete declaratie van functie 'cube' is ongeldig? "Het is hier. Het is daar in de lijn 12. PUBLIEK: [onverstaanbaar]. DAVID J. MALAN: Wat is dat? PUBLIEK: Het is niet eerder. DAVID J. MALAN: Het is niet eerder. Dus dit is het ding. C is een beetje dom, of C-compilers zijn een beetje dom. Ze zijn echt alleen maar doen wat je ze vertelt te doen. En zij, in het bijzonder, alleen lezen de code boven naar beneden, links naar rechts. Dus als de compiler, Clang, is het lezen van de code, lijn 1, het uit hoe dit te doen. Oh, hier komt de belangrijkste. Oke, laat me gaan en verklaren een variabele x. Laat me iets af te drukken. Lijn 7, wat is het nou kubus? Het is niet zijn aangegeven in stdio.h. Het komt niet met C. Ik heb geen idee wat te doen. En zo Clang bails rechtvaardige en stopt met die foutmelding. Dus we kunnen dit oplossen in een paar manieren. We kunnen leren Clang wat kubus is door gewoon bewegen, waar de verklaring is. Dus ik geknipt en geplakt het boven op de belangrijkste. Nu beseffen dat alleen maar omdat de belangrijkste is niet langer eerste, is het nog steeds uitgevoerd door standaard. Belangrijkste is de belangrijkste. Het is de standaard functienaam. Het maakt niet uit waar het in een bestand. Maar in ieder geval nu Clang heeft gezien kubus voordat ik het gebruik. Dus laten we eens kijken of Clang is gelukkiger nu. Maak increment, ging het compileren deze keer. Laat me lopen increment. En inderdaad, het lijkt te werken. Nu kun je komen met scenario's uiteindelijk waar Het is niet mogelijk te stellen elke functie boven elke andere functie. Je zult vast komen te zitten in deze oneindige lus in de werkelijkheid, waar deze man wil zijn hier, maar dit man moet om daar te zijn. Dus dat werkt niet altijd. Dus gelukkig, C heeft een meer elegante oplossing. Ik ga deze terug te zetten waar het was, alleen maar omdat ik voorkeur, als een kwestie van principe, dat de voornaamste altijd aan de top, want het is gewoon leuk om te zien wat dit programma doet standaard. En wat ik ga doen hier boven is te verklaren wat heet een prototype. Ik ga mijn cube functie opnieuw te verklaren door letterlijk kopiëren en plakken. Eigenlijk is dat niet letterlijk. Dus letterlijk kopiëren en plakken lijn 15 boven lijn 6. Het maakt niet uit welke lijn deze eindigt op. Het gebeurt te zijn op lijn 4. Maar het hoeft te zijn voor de belangrijkste. Maar het verschil merken. Lijn 4 eindigt met een puntkomma, wat betekent he, Clang, neem mijn woord te geloven, dat er sprake is van een functie genaamd kubus die een int neemt en geeft een int. Maar ik ga je niet vertellen wat het is. Gewoon weten dat ik beloof om uiteindelijk vertellen. En inderdaad, nu is het goed dat dit onder de naar beneden. Dit is dus algemeen beter, omdat dan bovenaan uw bestand, kunt u gewoon rammelaar uit, snelle-het-vuren, een lijn elk, wat de namen van uw functies zijn, wat hun ingangen zijn, wat hun uitgangen zijn. En om meer duidelijk, ingang betekent over het algemeen argument of parameter, synoniem. Output betekent return waarde, wat doet het hand terug naar mij. Dus in dit geval, is kubus aangemeld bij de top, maar gedefinieerd, ook wel uitgevoerd, onderaan. Dus nu laten we hier terug te gaan en opnieuw uit te voeren dit. Dus nu laat me gaan en opnieuw uitvoeren te maken, opnieuw uit te voeren stap. En het lijkt nu te werken prima. Nu kunnen we verder gaan en factor uit zoiets als de bier bijvoorbeeld in deze vierde versie. Dus laat me scrollen hier beneden. En merk dat ik soort van deze les ter harte genomen juist nu. Het feit dat ik dezelfde strofe weer zingen en opnieuw en opnieuw, op dezelfde chorus line in het lied, voelde graag waarom niet ik factor die uit in een functie? En inderdaad, moet dit een van de redenen. Naast het feit dat iemand anders in de wereld zou willen om een ​​kubus functie te gebruiken - dat is een goede reden om iets factor uit en schrijf uw eigen aangepaste functie - als er een stuk code in uw programma dat maakt conceptuele zin, dat je soort van wilt geven het een naam - zoals in dit geval, koor - dan kunt u net schrijven dat als een aparte functie. Je hoeft niet alles te schrijven in de belangrijkste is het maar voelt schoner te scheiden en geef het een naam. Dus in dit geval hier, merken dat ik een reactie op de top van zijn deze functie die net zingt over de bepaald aantal flessen. Let hier op dat ik niet nodig om deze te bellen dingen input en output. In feite is dit keer dat ik belde net mijn inbreng b voor fles. En hier ziet, nietig suggereert wat? Dat refrein - PUBLIEK: Maakt niet terug. DAVID J. MALAN: retourneert geen waarde. En inderdaad, er functies niet te waarden terug te keren. Ze kunnen gewoon iets doen. Ze kunnen wat bijwerkingen genoemd, in dit geval is gewoon een hele hoop af te drukken op het scherm. Dus op dat deze code hier, letterlijk ik net gewonnen van het vorige voorbeeld. Het enige verschil is in plaats van i als mijn variabele, ik nu met behulp van b als mijn variabele. Dus ik b hebben hier beneden, ik b hebben hier beneden, ik heb b min 1 hier beneden. De code is precies hetzelfde. Maar net nu laten zien hoe we deze gebruiken, laat me gaan vooruit en eigenlijk veranderen in een voor-lus. for (int i = n; i> n; i -). Dus ik heb gestolen, dat van onze vorige voorbeeld. Eerder, het is in lijn 37 dat ik zou zijn begonnen zingen dit vervelende lied. Maar in plaats daarvan, ik ben gewoon ga nu bellen koor van i. Gereed. Dus nu in elke iteratie van deze lus, noem ik dit andere functie, chorus, die ik toevallig te schrijven. Het werd niet geschreven door iemand anders jaren geleden. Maar chorus, ondertussen, maakt gebruik van printf afdrukken van deze vier lijnen. Maar het feit dat ik koor roepen steeds weer in een lus betekent dat ik ga, krijgen op het einde, de exact hetzelfde liedje als ik tot nu toe. Dus in het kort, als ik nu terugkijk op mijn code, ook al functioneel dit is gelijk, merken dat het beginnen te krijgen nog meer leesbaar. Ik weet niet precies hoe GetInt wordt uitgevoerd. Eerlijk gezegd, ik weet niet hoe koor wordt uitgevoerd. Maar het maakt niet uit voor mij. Kan me niet schelen, want nu kan ik sorteren van, als mens, lees deze van boven naar beneden. En omdat de functies genoemd naar wat ze doen, mijn code is steeds leesbaar. En als onze programma's krijgen veel complexer - tegen het einde van het semester is, zult u het schrijven van honderden lijnen van de code in talen als PHP en JavaScript en dergelijke - je zult zien dat het zo veel makkelijker dan bij te houden wat je hebt gedaan. En als je begint samen met vrienden of partners of collega's, zult u in staat om veel meer te schrijven massale programma's door te beginnen aan deze fundamentele oefenen bouwstenen. Dus met dat gezegd, waarom niet noemen we het een dag? En we zullen zien op woensdag. [Applaus]