[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]