>> [Muziek]
DAVID MALAN: Hallo, iedereen.
Dit is CS50's supersection.
Toegewezen secties niet start voor een week.
En dus vandaag, ik ben hier met--
>> MARIA: Maria.
DAVID MALAN: --om eigenlijk een kijkje nemen op probleem
set één, de cursus eerste weken materiaal,
krijg je georiënteerd met CS50 IDE, een beetje Linux, het besturingssysteem dat is
die op IDE, alsmede kijken naar enkele van de overgang
from Scratch naar C leidende tot problemen stellen één.
>> Dus zonder verder oponthoud, in set een probleem,
je gaat worden geïntroduceerd CS50 IDE, waarin
is deze web-based programmering omgeving die we gebruiken om
kunnen programmeren.
Het is ontworpen om zeer kijken die doet denken aan een typische computer
systeem met een besturingssysteem systeem genaamd Linux.
Maar het is in de zogenaamde cloud, hetgeen betekent dat iedereen in de klasse
kan daadwerkelijk zijn of haar eigen rekening en gebruik het, als goed.
>> Dus de meeste van jullie waarschijnlijk nooit gebruikt een Linux-omgeving voor of misschien
zelfs een command line omgeving.
En een command line omgeving verschilt.
Het is allemaal tekstuele.
Het is allemaal toetsenbordopdrachten.
En het is geen mousing, geen pictogrammen, geen dialoog ramen, geen menu's.
Het is puur tekst.
Zo op het eerste, het soort van voelt als een stap
achteruit in termen van verfijning.
Maar het eindigt in een veel krachtiger, zeker,
voor een computer wetenschapper, uiteindelijk.
>> Dus laten we eens een kijkje nemen.
Hier ben ik op CS50.io, via welke kunt u inloggen op CS50 IDE.
En net als in Scratch, is er drie primaire gebieden om dit scherm.
Dus op de linker kant, we hebben wat zal het bestand browser.
En er is deze map op top, die nu leeg is
sinds ik verlost van al mijn bestanden voordat supersection.
En dat is waar we zullen opslaan C bestanden die we schrijven.
Bovenaan rechts, hebben we een plek waar al onze code gaat om geschreven te krijgen.
En inderdaad, als ik op deze plus, dit gaat om me te laten kiezen Nieuw bestand.
En hier kan ik beginnen met het schrijven van C-code of, echt, een aantal andere talen.
>> En vervolgens op de bodem waar zegt jharvard @ ide50-- en de jouwe zal
iets te zeggen different-- wat dit heet?
Terminal-venster.
Ja.
Dus de terminal venster de zogenaamde command line
interface via welke u kunt communiceren met het onderliggende besturingssysteem.
En voor nu, we gaan maken zeer weinig gebruik van dit--
gewoon te compileren, om naar te kijken foutmeldingen die we zien,
en om onze programma's te draaien.
Maar uiteindelijk, we gaan zo veel meer te doen, als goed.
En je kunt zelfs software te installeren en het beheer van uw werkruimte
binnen CS50 IDE, als goed.
Maar daarover een andere keer.
>> Dus laten we verder gaan en schrijven een eenvoudig programma gewoon
om te gaan door een warming-up van hello.c, die misschien
de eenvoudigste programma dat we kunnen schrijven.
Ik heb al opende een nieuw tabblad.
Ik ga om te gaan en zeggen zijn standaard io.h.
Dan int main (void).
En dan printf ("hello, world" backslash n, dicht citaat,
sluit haakjes, en puntkomma.
>> Prima.
Dus nu ziet mijn raam is naamloos.
Dus ik ben zeer snel gaan om omhoog te gaan naar Bestand, Opslaan.
En het is belangrijk dat Ik noem dit niet "hallo."
Dus een veel voorkomende fout, vooral in de set een probleem,
is om per ongeluk gewoon bellen uw programma "water" of "hebzuchtig" of "Mario"
of "krediet" of iets dergelijks.
Maar je eigenlijk wilt maken ervoor dat u de bestandsextensie
want dit is de enige manier waarop de compiler en ook de code-editor
weet dat je eigenlijk het schrijven van C-code.
Dus laat me gaan en klik op Opslaan.
>> En nu ook wat CS50 IDE voor ons heeft gedaan is het ook
syntax gemarkeerd alles.
Dus het maakte alles zeer kleurrijk.
En het hele doel van die niet functioneel.
Het is gewoon mijn ogen vestigen op de conceptueel verschillende stukken
van dit programma.
Dus laten we verder gaan en stellen dit.
En ik kan het compileren in een paar manieren.
En in een week, de old-school manier we deden
het was letterlijk aan het commando line-- "clang hello.c."
En dan druk ik op Enter.
En niets lijkt te gebeuren in het terminal-venster.
Maar wat deed verandering in de IDE?
Waar, wederom, IDE betekent alleen Geïntegreerde ontwikkelomgeving.
Het is een mooie manier om te zeggen Deze geïntegreerde ontwikkeling
omgeving voor het ontwikkelen van software.
Dus wat deed veranderen in de UI?
Wat heb je merken dat is anders, Maria?
>> MARIA: Ik merkte iets onder de IDE50 map hier.
>> DAVID MALAN: Ja.
Dus hier, niet alleen hebben we "hello.c."
We hebben ook 'a.out', dat is soort van een domme naam voor een programma.
Maar inderdaad, het is de standaard naam voor een programma wanneer u alleen uw code te compileren
en niet de compiler vertellen wat bestand naar de uitgang.
Dus als ik wil dit uitvoeren, I moeten de compiler-- vertellen
of liever gezegd, ik moet vertel de werkruimte die ik
wil het programma genaamd run "a.out."
Enter.
En er is "hallo, wereld. "nu" ./ ".
is in feite belangrijk.
Hoewel gewoonlijk alleen we schrijf de namen van opdrachten,
wanneer het is een programma dat u hebt geschreven, wil je "./" zeggen
want dat expliciet vertelt Linux dat u wilt een programma genaamd run
"a.out" dat is in deze, waar de stip betekent deze directory dat ik ben momenteel
in die toevallig genaamd werkruimte, "a.out.
Want als ik zei gewoon "a.out," Enter, Ik ga krijgen "a.out opdracht niet
gevonden ", omdat de computer-- omdat ik uitgevonden "a.out;"
het kwam niet met de computer-- weet niet waar je moet kijken voor het,
ook al is het juiste onder mijn neus, om zo te zeggen.
OK.
Dus we konden dit veranderen worden "clang -o hallo hello.c."
En als ik druk op enter, welk programma gaat dit uitgang voor mij?
Wat is de naam van het bestand?
Ja, in de rug.
Dat is juist. "Hallo."
Dus "hallo" gaat worden de naam van het programma
want we hebben gebruik gemaakt van een zogenaamd command line argument, dat is gewoon
wijze het gedrag veranderen de compiler om daadwerkelijk uitvoer
een specifieke bestandsnaam.
En inderdaad, als ik te zoomen naar buiten en kijk omhoog hier,
nu heb ik niet alleen "a.out" en "hello.c", maar ook "hallo" bevatten, alsmede.
Dus nu ik kan doen "./hello," Enter.
En er is "Hallo, wereld."
Maar lastly-- en dit zal nu de conventie
We gebruiken de gehele semester, typically--
is dat je kunt ook gewoon zeggen "maken hallo."
En inderdaad, het is te zeggen het is actueel omdat het al bestaat.
Laat me gaan en te verwijderen, met het rm commando, zowel 'a.out "-
en zeg "verwijder normaal bestand a.out?"
Dat betekent, bent u zeker dat u wilt verwijderen?
Ik ga om ja te zeggen.
En dan ga ik te verwijderen "hello" maar niet "hello.c."
Ik ga om te zeggen "ja" expliciet, maar "y" is voldoende, als goed.
>> En nu merken als ik typt ls-- die, herinneren,
betekent list-- maakt een lijst van alle van de bestanden in mijn map.
En inderdaad, als ik te zoomen naar buiten en kijk naar linksboven,
bevestigt dat wat in deze map, zelfs
al is bestempeld als IDE50 hier en niet werkruimte, het is gewoon "hello.c."
Dus nu hier beneden, als ik doen "maken hello," Enter,
nu zie ik een veel langere opdracht, maar een meer geavanceerde commando dat gaat
bruikbaar in de komende weken te zijn.
En nu kan ik zeggen "./hello."
>> Dus laten we eens een korte rondleiding enkele andere Linux-commando's.
Waarom we niet een stap terug en eigenlijk kijken naar C meer
het algemeen, de overgang van Scratch C, en vervolgens af te sluiten met een blik
het eerste probleem in C. Oké.
Dus ik ga je gang en gewoon schoon gaan mijn werkruimte met de Control-L gewoon
om het scherm netjes te houden.
Maar geen functionele anderszins beïnvloeden.
>> Bedenk dat we hebben gezien een paar commando's nu.
Dus we hebben clang gezien, die over het algemeen u zal niet meer handmatig uitvoeren.
We zullen in plaats daarvan gebruik te maken.
Maar we zagen ook ls, dat een laat notering van de bestanden in mijn map.
En nu, wat is er-- Er zijn twee bestanden nu, "hallo" en "hello.c."
Waarom is er een ster of een sterretje na "hallo"?
Wat deed dat betekenen, gebaseerd over wat we zagen in een week?
Wat denk je?
Wat betekent de ster betekenen?
>> MARIA: voor-- het programma "hallo"?
DAVID MALAN: "Hallo *".
Ja.
Zeker weten?
Oh, uitvoerbaar.
Dat is juist.
Dat betekent dus dat "hello" is uitvoerbaar.
Dus inderdaad, dat is de reden waarom Ik kan doen "./hello."
Prima.
Dus wat kan ik hier doen?
Nou, het blijkt dat ik kan Ook maken directories.
Dus laat me gaan en te creëren, bijvoorbeeld een directory "pset1".
En het probleem te stellen specificatie moet je precies doen,
zodat u niet hoeft te onthouden vandaag.
Maar "mkdir pset1" lijkt geen impact hebben.
Maar nogmaals, geen foutmelding is over het algemeen een goede zaak.
Dus als ik het type "ls" now-- ah, nu Ik heb een uitvoerbaar bestand met de naam
"hello", een C bestand genaamd "hello.c."
En dan de slash, om zo te spreken, betekent dat dit een directory.
>> Dus inderdaad, nu wil ik om het te openen.
En ik denk niet dubbelklikken op het als in een GUI, een grafische omgeving.
Ik in plaats daarvan zeggen "cd pset1."
Enter.
Niets interessant lijkt te hebben gebeurd behalve mijn kleine prompt
hier-- dit is Linux's manier van herinneren me waar ik ben, dus wat de map geopend is.
Het is gewoon te vertellen me uitdrukkelijk als grafisch in tegenstelling tot.
En als ik typ "ls," waarom heb ik een ander te zien onmiddellijk vragen, denk je,
toen ik de inhoud van pset1?
MARIA: Je hoeft waarschijnlijk niet iets in.
DAVID MALAN: Ja.
Dus dan hebben we niet duidelijk creëerde iets daar
omdat ik zojuist de directory.
Nu, als ik wilde een file-- te creëren voor Zo kon ik een nieuw bestand te maken.
En dan kon ik ga naar Opslaan en opslaan als,
als, "mario.c" als u aan het doen bent de standaard editie van PSET één.
En dan, net als elke Mac of pc, gewoon kies de map "pset1, opslaan.
En nu is het bestand is leeg.
Maar laten we in te zoomen opnieuw voor een tweede.
Laten we het doen ls hier.
Nu zien we "mario.c".
>> Dus er is een aantal andere commando's die zijn de moeite waard om in het achterhoofd dan tijd--
duidelijk of de Control-L is wat ik heb geweest raken; mkdir we hebben gezien;
rm we hebben gezien, maar ook, dat is voor het verwijderen of verwijderen van een bestand.
Let u kunt also-- en als je kijkt bij online tutorials, zult u rm -rf
is een veel voorkomende manier om te zeggen een map die dingen in zich heeft te verwijderen.
Gewoon super, super voorzichtig.
-rf betekent recursief schrappen wat het ook is
je probeert te verwijderen en met geweld te verwijderen.
Dus recursieve wijze als het een map met een map met een map met een map,
ze allemaal te verwijderen.
En geweld betekent niet eens Vraag me ja of nee, ben ik zeker?
Dus het is een super gevaarlijke manier van het verwijderen van veel spullen snel.
Maar beware-- te vaak doet een onverschrokken student per ongeluk verwijderen, zeg, PSET
één, bijvoorbeeld.
>> MARIA: En als ze gewoon -r doen, ze gaan
om hen te vragen over elk bestand.
>> DAVID MALAN: Welke is matig vervelend.
>> MARIA: Ja.
>> DAVID MALAN: Dus dat is de reden waarom zo velen van ons, zelf inbegrepen,
ben in de gewoonte van het gebruik rf.
Maar het is gevaarlijk.
Dus koper beware.
En dan is mv soort interessant genoemd.
Dus dit is de move commando, die voelt een beetje raar
omdat je inderdaad kunt het gebruiken om bestanden verplaatsen van de ene plaats naar de andere.
Bijvoorbeeld, veronderstel dat ik verknald.
Stel dat ik heb gemaakt een nieuw bestand voor de PSET.
En ik redde het als "greedy.c."
Maar stel dat ik per ongeluk opslaan in IDE50-- dus in mijn werkruimte zichzelf
en niet in pset1.
>> U kunt zo veel linksboven te zien.
Er is "greedy.c."
En er is een aantal oplossingen.
Zodat men, kan ik gebruik maken van de super gebruiksvriendelijke manier
van gewoon te slepen.
En dat zou eigenlijk Dit probleem oplossen.
Maar vandaag, we proberen om naar te kijken de meer mysterieuze maar krachtige manieren
dit doen.
Dus laat me "ls" in pset1.
En ik zie alleen "mario.c."
Laat me gaan en doen "cd ..".
Dus CD weer is verandering directory.
".." Wat betekent dat, hoewel?
Laatste keer dat ik zei "cd pset1 "in te gaan op pset1.
Dus als ik zeg "cd ..", wat doe ik?
Achteruit.
Ja.
>> Dus het gaat om de zogenaamde ouder.
Ga een niveau omhoog, net als het verlaten van een map.
Dus Enter.
En inderdaad, kijk wat het deed.
Het ontroerde me gewoon in de werkruimte plaats van in pset1, die in de werkruimte.
En nu als ik typ "ls", er is een hele hoop dingen.
Daar is "greedy.c".
Dus nu laat ik gebruik mv letterlijk bewegen "greedy.c" in pset1.
En zo een groot aantal Linux-commando's werken precies zo.
Ze nemen geen argumenten of zij één te nemen argument of ze nemen twee command line
argumenten enzovoort.
En in dit geval is letterlijk doen wat
het zegt, zij succinctly-- greedy.c verhuizen naar pset1.
Enter.
Niets lijkt te gebeuren.
Maar als ik opnieuw doen een ls, hebzuchtig is verdwenen.
En als ik dat doe "cd pset1", invoeren, en vervolgens ls opnieuw, nu is het op de juiste plaats.
Even terzijde, als voor sommige reason-- vooral
als je intermitterende hebt netwerkconnectiviteit
of je bent rond te lopen campus met je laptop deksel
gesloten en open deze vervolgens opnieuw en uw werkruimte
lijkt enigszins uit sync, geen big deal.
Gewoon herlaad je browser venster, en het moet
resync zodat de linker file browser ziet er precies
zoals de terminal-venster.
Geen zorgen te maken.
Bij twijfel, herlaad de pagina, dus Zolang u de bestanden die al zijn opgeslagen.
OK.
Dus mv kan ook worden gebruikt om bestanden te hernoemen.
En laten we een kijkje nemen op deze laatste opdracht hier.
Dus suppose-- en dit is super gemeenschappelijke Ook vroeg.
Sommige studenten af ​​en toe een bestand te maken genoemd, laten we say-- wat is een ander?
Zoals "WATER.C."
Dus ik zal gewoon schreeuwen, voor geen reden, in alle caps.
Maar dit is niet het correcte naam voor het bestand
alleen al omdat ons probleem stellen specificatie niet vertellen
om het bestand als hoofdletters redden "WATER.C."
In plaats daarvan, we verwachten "water.c" in kleine letters.
En in feite is dit problematisch omdat check50,
een programma dat je gaat om te voldoen aan in problemen
instellen die automatisch testen de juistheid van uw code
gaat schreeuwen tegen u als het niet kan vinden "water.c" in kleine letters.
>> Dus ik moet dit oplossen.
Zo veel verschillende manieren om doen, waarvan de eerste
zou zijn om Control-klikken of klik met de rechtermuisknop de bestandsnaam en verander gewoon Rename.
Helemaal fijn om dat te doen.
Maar nogmaals, vandaag de dag, laten we doe het een beetje liefhebber.
Laten we gebruik mv te veranderen "WATER.C" naar "water.c."
Dus je kunt ook het eerste argument gebruiken om het te hernoemen naar het tweede argument
Als het tweede argument is niet in Sterker nog, een map of een directory naam.
>> Prima.
En tot slot, een beetje trick-- dus ik ben in mijn werkruimte directory op dit moment.
Als ik wil krijgen in PSET één, Ik kan zeker het type "cd pset1."
Maar het is zo vervelend om "pset1" typen of langere bestandsnamen of directory namen
nog.
Zo heel vaak in Linux, wat je kunt doen is beginnen met typen "pse"
en gewoon vervelen, Tab, en laat de computer cijfer het uit voor je.
Super behulpzaam te krijgen in die gewoonte.
De enige vangst is als u meerdere bestanden of mappen te beginnen
met de letter "p" of "PS," je zou kunnen hebben
een paar voor de typen computer weet wat te doen.
>> MARIA: We willen snelkoppelingen.
>> DAVID MALAN: Dit zal bespaart u zo veel tijd.
En ook, zoals we al zeiden in collegezaal, u kan in de geschiedenis te scrollen, omhoog en omlaag,
te vinden recent uitgevoerde opdrachten ook.
Prima.
Dus nu, laten we onze aandacht weer een eenvoudig programma, hello wereld.
Dus we hebben dit precies samengesteld.
En nu waarom we niet nemen een blik op de data types
en dan de overgang van een aantal overeenkomend Scratch blokken C.
MARIA: Awesome.
Dus nu dat je bent begonnen schrijven programma in C,
we gaan beginnen te praten over data types en variabelen.
Dus sommige soorten gegevens die u zou willen weten nu beginnen
zijn degenen die zijn blauw gemarkeerd.
Dus we hebben int eerste, wat staat voor integer.
En dat geldt gehele getallen, zoals u misschien guessed-- zo 1, 2, 3,
en alle andere getallen die je maar kunt bedenken.
>> DAVID MALAN: En ook negatief.
>> MARIA: En ook negatieve, yep.
En 0.
Dan hebben we praalwagens, die zijn floating point getallen.
Dus dat is al de reële getallen die moeten decimalen.
Dus 5,0, 5,2, en zelfs meer cijfers achter de komma,
als goed, maar ook negatieve.
Dan hebben we char die een personage.
Dus ik denk dat we gesproken over dit in het college vandaag.
Maar we hebben brieven, voor example-- A, B, C-- die kan worden opgeslagen als een char.
Maar dan hebben we veel meer symbolen dat kan worden opgeslagen als een char.
En die worden opgeslagen als ASCII.
>> En dan hebben we bool, die Booleans zijn.
En die te evalueren op True of Valse of 1 en 0 respectievelijk.
DAVID MALAN: En herinneren dat bool afkomstig uit de CS50 bibliotheek.
Dus het is niet ingebouwd in C, maar het is super handig
de notie van waar en onwaar zijn.
En hoewel je misschien think-- leuk feitje.
Een bool technisch moet hoeveel bits, echt, te vertegenwoordigen tegenover True False?
Hoeveel bits denk je je nodig zou hebben, maximaal?
Ja, slechts één.
Dus het blijkt dat C kan niet geven je gewoon een beetje.
De kleinste maateenheid je kunt krijgen is acht.
Dus het is een beetje verspilling ze je bent via een volledige byte of acht bits,
te vertegenwoordigen Waar of niet waar.
Maar dat is gewoon de manier waarop het is in C uitgevoerd door de CS50 bibliotheek.
MARIA: En dan degenen die we niet van plan om te praten over zo uitgebreid
rechts now-- dubbel, dat is voor grotere praalwagens.
Lange lange en korte Ook voor integers.
DAVID MALAN: Inderdaad.
In hacker editie van PSET één, we eigenlijk lange lange gebruiken.
Maar voor de standaard editie, het moet niet noodzakelijk zijn.
MARIA: Cool.
OK.
Dus operators-- je moet waarschijnlijk bekend met de meeste van deze.
Daarnaast +; aftrekken, -.
Voor vermenigvuldiging, hebben we de *.
Dus niet de X die we meestal gebruiken.
Divisie, hebben we de backslash.
En modulo is onze laatste operator die we gaan praten over nu.
Het is een operator die ons in staat stelt om Neem de rest van de deling.
Dus als we 4% 2, 4 verdeeld door 2 is 2 met een restant van 0.
Dus 4% 2 0 is.
4% 3 is 1.
4% 5 4 is, zoals je had kunnen vermoeden.
En vergeet niet bij het gebruik van al deze operators de PEMDAS regels.
>> DAVID MALAN: Dus om duidelijk te zijn, als je do 4% 2, waarom is dat 0, precies?
>> MARIA: Omdat 4 gedeeld door 2 is 2 met een restant van 0.
Dus modulo geeft ons dat de rest als in tegenstelling tot het resultaat van de deling.
DAVID MALAN: En inderdaad, wat we dit nuttig vinden
is het dat in sommige problemen Dat is niet per se een,
als je wilt om het hebben effect van het beperken van jezelf
een reeks getallen zoals 0 tot iets,
u kunt modulo gebruiken om rond te wikkelen eerder dan als de 2 miljard
of 4 miljard waarde we hebben gesproken over in collegezaal.
>> MARIA: Ja.
En zelfs in de "hebzuchtige" we kunnen.
DAVID MALAN: Ja, in probleem set één, als goed.
MARIA: Ja, leuk.
DAVID MALAN: Goede hint.
MARIA: Sorry.
Boolean expressions-- zo voor Booleaanse operatoren,
we gaan over alles praten van deze die je hier ziet.
Dus nu hebben we twee gelijke borden vermeld voor gelijken.
Dus dat zijn ter vergelijking.
Tot nu toe hebben we alleen gezien een gelijk teken.
Dat is wanneer we wijzen een waarde aan een variabele.
Dus als we hebben gezien int n = 5, dan we hebben toegewezen 5 aan de variabele n.
Maar als we willen == gebruiken voor vergelijking, kunnen we als n == 5 controleren.
En als n == 5, dan is dat waar.
>> Dus Booleaanse operatoren stellen ons in staat, in principe,
met Boolean evalueren uitdrukkingen Waar of niet waar.
Dus niet equals-- hebben we de uitroepteken en gelijken.
Dus we konden ook controleren of n is niet gelijk 5-- zo n! = 5.
Minder dan, kleiner dan of gelijk aan groter dan, groter dan of gelijk aan,
en dan hebben we het logische En de logische OR.
En die ons in staat stellen om te evalueren meerdere Booleaanse expressies samen
in principe samen als komen één geheel Booleaanse uitdrukking.
Dus als we willen een nummer te vinden, zeggen, die groter is dan 5 en minder dan 15
tegelijkertijd, zouden we de logische operator om te zien of n
groter dan 5 && n minder dan 15.
DAVID MALAN: En hier, ook, het is echt gemakkelijk
vroeg per ongeluk Gebruik slechts een enkele ampersand
of een enkele verticale balk.
En hopelijk zal de compiler schreeuwen tegen je, omdat ze eigenlijk
een andere betekenis.
Voor degenen die nieuwsgierig, ze zijn gebruikt voor bitsgewijze operaties,
die op individuele bits.
Maar je wilt het paar van hen hier.
En super belangrijk is dat eerste, het isgelijkteken,
dat is de exploitant gelijkheid tegen het toewijzen.
>> MARIA: En de verticale balk gelegen tussen de Delete en Return.
DAVID MALAN: Ja.
Op een typische Amerikaanse toetsenbord.
>> MARIA: Yep.
Dus laten we springen recht in voorwaardelijke verklaringen.
In Scratch, je hebt al gezien, waarschijnlijk,
als uitspraken die u in staat te stellen controleren of iets waar is, dan is
iets anders doen.
Dus je zou hebben gewild om te controleren of uw sprite is
aanraken van een andere sprite of de rand van uw scherm.
En dan kun je al wilde beëindigen het spel of iets anders doen.
Dus de syntax daarvoor is "als (conditie)."
Dus als je sprite raakt iets, dan doen is in de accolades.
>> Dan hebben we if-else statements.
Anders laat ons toe om iets te doen als voorwaarde dat wij
controleren in het begin niet waar is.
Dus als de sprite raakt de grens doen, anders iets anders doen.
Dus anders iets anders doen.
Dan hebben we een kort voorbeeld voor.
Dus als (military_time <12), we willen printf "Goedemorgen!"
Anders gaan we printf "Goedenavond!"
Basic voorbeeld.
>> DAVID MALAN: Goed.
>> MARIA: Cool.
Dus nu hebben we switch statements.
Schakelen verklaringen in het algemeen kan kunnen we veel van hetzelfde te doen
dat we net gesproken over met als uitspraken.
Zo, nu hebben we de algemene vorm van de switch-statement
die ons in staat stelt te nemen een variabele genaamd n
en vergelijk het met een heleboel verschillende waarden die wij hier
Constant1, constant2 hebben genoemd.
We kunnen veel meer hebben.
En die zijn gevallen genoemd.
>> Dus als we een schakelaar argument-- en dit werkt
alleen integers-- we een variabele in dit geval is dat n.
Als de variabele n is gelijk constant1, we
zal enige stukje code uit te voeren of iets dat we willen doen.
En dan zouden we breken.
Dus de pauze betekent dat de switch
stopt uitvoeren als n gelijk is aan constant1,
en dan het programma zal worden voortgezet.
Het zal verlaten uit de switch statement en het zal
blijven om iets anders te doen.
>> Indien echter n is niet gelijk Constant1, dan case voor constant2
worden gecontroleerd.
Als n gelijk is constant2, dat andere fragment van de code zal worden uitgevoerd.
En dan zal het breken indien deze gelijk is aan het.
En dan kunnen we also-- niet noodzakelijkerwijs, hoewel-- een standaard geval,
dat zal gebeuren als n niet gelijk een van de zaken die u hebt opgenomen.
En in het standaard geval ook hebben een pauze niet noodzakelijkerwijs
omdat de switch zal weten dat het moet eindigen na de standaard
geval als dat het geval is.
>> DAVID MALAN: Maar stilistisch, we het altijd daar.
>> MARIA: Ja.
>> DAVID MALAN: Ja.
Dus vooral bij het starten, vooral als onder die minder
comfortabele, zou ik persoonlijk gewoon raden stok met de ifs
en IFS-elses en if-else-if-elses enzovoort als slechts
omdat ze een beetje eenvoudiger.
Dit is een mooi optimalisatie, of soms zelfs esthetisch is
maakt de code beter leesbaar.
En inderdaad, vermoedelijk mid-semester zullen we een probleem zien
set waar het ziet er gewoon beter en makkelijker te lezen voor de mens
met behulp van een switch statement.
Maar maak je geen zorgen te maken over klampt zich vast aan dit te vroeg.
>> MARIA: Ja.
Als je een heleboel als statements, het misschien gewoon niet goed leesbaar.
Het zou niet erg snel zijn voor u om te gaan doorheen.
Dus schakelen verklaringen kunnen zeer nuttig ook.
En ook niet remember-- niet vergeet de pauzes in daar te zetten.
>> DAVID MALAN: Doe dit niet onthouden.
>> MARIA: Want dan zou je valt door middel van het ene geval tot geval.
Dus laten we zeggen dat geval Constant1 heeft een break-statement niet in hebben.
Dan zouden we door vallen in geval constant2.
En we willen niet te doen als we hebben al het geval Constant1 bereikt
en het is gelijk aan n.
>> Dus, bijvoorbeeld, als we een variabele n dat een klasse nummer bevat,
en we willen zien wat dat klasse is-- als n gelijk is aan 50,
we gaan om af te drukken "CS50 is Inleiding tot de Informatica I. "
Dan gaan we breken.
En dat is het.
Wanneer echter n gelijk tot 51, we gaan
om af te drukken "CS51 is Introduction Computer Science II. "
Dan weer, we gaan breken.
Indien Daarna worden 124, 61, welke ander nummer dat je zou denken,
of programma is niet van plan te erkennen dat.
Dus het gaat om te zeggen: "Sorry, ik ben niet vertrouwd met die klasse. "
En het gaat te breken.
DAVID MALAN: Dus je kunt echt zien if, anders als, anders idee hier.
Het is gewoon anders syntaxis voor de uiting van de exact hetzelfde idee.
>> MARIA: Precies.
Nu hebben we onze ternair operators.
Dus ternair exploitanten drie parts-- een voorwaarde,
iets te doen als die voorwaarde waar is,
en dan is er iets te doen als die voorwaarde is onwaar.
Zo zie je, in principe, de syntax van die hier.
We hebben het vraagteken, en dan the-- wat doen we dit noemen?
DAVID MALAN: De dubbele punt.
MARIA: Colon.
Dank je.
Sorry.
Dus laten we eens kijken naar ons voorbeeld te kijken of we zin dit-- kan maken
class_num == 50.
Dus hier zien we onze Booleaanse operator == dat vergelijkt de variabele class_num
50.
Dus class_num winkels een integer.
En als dat getal is gelijk aan 50, dan zijn we
gaan slaan "David Malan" binnen de string professor.
Als klasse nummer niet gelijk aan 50 ", niet David Malan"
gaat de professor zijn.
>> DAVID MALAN: Dank je wel.
Dus dit lijkt gelijk aan wat, zou je zeggen, op het eerste gezicht?
>> MARIA: Het lijkt mij zoals if-else statements.
>> DAVID MALAN: Ja.
En in feite is dit soort van een mooie one-liner,
zo te zeggen, voor de uitvoering van precies de logica van if-else
maar het doen van alles in één stap.
>> MARIA: Precies.
Ja.
Dus als-else statements zou nemen veel ruimte.
Zij zullen het ook lang voor zijn iets eenvoudigs als dit.
Dus dit kan zeer beknopt en erg leuk.
Dus nu gaan we naar op zoek naar iets opnieuw en opnieuw uitvoeren,
dus controleren op een conditie meerdere keren
en dan blijft iets te doen terwijl die voorwaarde waar is.
Dus dit brengt ons mooi in terwijl loops.
>> Aan de linkerkant, hebben we onze eerste while lus.
Dus terwijl iets waar is, iets opnieuw en opnieuw doen.
Dus zorg ervoor om op te merken dat onze Voorwaarde hierbij is bevestigd aan de top.
Overwegende dat met onze tweede loop-- we noemen dat een do-while loop-- we iets doen,
dan controleren we voor een voorwaarde.
En als die voorwaarde blijft om waar te zijn,
we terug gaan en doen het ding weer.
Dus het belangrijkste verschil is de plaats waar de voorwaarde wordt gecontroleerd.
En de code kan nooit uitgevoerd als de voorwaarde niet
waar met de while lus.
Overwegende dat met de do-while lus, hebben we de code
dat altijd ten minste een keer uitgevoerd.
En dan, terwijl de conditie blijft om waar te zijn,
we terug kunnen gaan en herhalen weer binnen.
Dus waarom denk je dat we zouden gebruiken een do-while lus over een tijdje lus?
Rechts.
Dus als we willen de prompt gebruiker voor een soort van input,
als we willen hen vragen om hun naam in te voeren,
we willen hen minstens een keer vragen.
En als ze in te voeren die naam, we zijn niet
gaan ze weer vragen omdat we weten het al.
Maar als ze niet in te voeren hun naam, of als ze
voer iets dat natuurlijk geen naam,
we nog steeds willen blijven hen te vragen voor hun naam.
>> DAVID MALAN: En lezing hadden we een als dit met het krijgen positieve int
bijvoorbeeld, waar er niets aan kijk eerst omdat je niet eens
gekregen een int.
Dus we willen dit-- doen krijgen een int van de user--
check het dan, misschien, opnieuw en opnieuw en opnieuw.
>> MARIA: Precies.
Voor loops-- OK.
Voor loops kunnen ons toelaten om bijna doen precies hetzelfde, als goed.
Het is eigenlijk precies hetzelfde.
Dus er is niets dat je kunt doen met lussen
dat je niet zou kunnen te maken met while loops.
Maar voor lussen kan een beetje lijken beetje meer syntactisch ingewikkeld
omdat ze drie onderdelen wat
was voor alleen de staat met while loops.
Dus het eerste deel dat je op zee, de meest linkse, we hebben "int dwergen = 0."
Dus dit is waar we initialiseren onze variabele.
>> Dan hebben we een puntkomma en "dwergen <7."
Dus dit is waar uit toestand eigenlijk is.
Dus dat is wat we zouden moeten zet alleen in de tijd loop--
"terwijl dwergen <7."
Hier, dat gaat in de midden van onze lus.
Dus "dwaves <7."
En dan is onze laatste deel is "dwergen ++," dat is waar we onze variabele updaten.
Dus de belangrijkste om te beseffen is dat dit
gaat om te gaan door deze lus zevenmaal en uitvoeren zevenmaal.
Dus we hebben zeven dwergen, en ze zijn allemaal
gaan zeggen, "Ik ben hier om je te helpen, Sneeuwwitje "
want ze zijn klaar te helpen Sneeuwwitje.
>> Met while loops, zouden wij hebben gedaan de initialisatie en het bijwerken
niet in de toestand weer, maar hetzij vóór of in de while lus
om ervoor te zorgen dat we-- omdat we altijd moeten die delen.
Dus om ervoor te zorgen dat we hebben hen, zouden we nog steeds hebben toegevoegd hen
op, maar niet tussen de haakjes.
>> DAVID MALAN: En zo ziet like-- in de collegezaal, bijvoorbeeld,
Ik bijna altijd, als, i en n en saai variabelen.
Het lijkt alsof je meer kunt gebruiken slim genoemd variabelen, ook.
>> MARIA: Ja, het is eigenlijk heel leuk een beetje meer beschrijvende variabelen
want vooral als iemand anders is het lezen van uw code-- misschien bent u grader
of als u samenwerkt met somebody--
wilt u ervoor zorgen dat ze begrijpen wat je aan het doen bent.
>> OK.
Dus dit is iets heel funky-- lus binnen een lus.
Ik weet niet of we dit eerder gezien.
Waarschijnlijk niet.
Maar we kunnen eigenlijk dit-- dus lussen in plaats van lussen.
Dus doet iedereen wil misschien wandelen me door wat er hier aan de hand?
DAVID MALAN: Ik zal een steek te nemen.
MARIA: Cool.
DAVID MALAN: OK.
Dus, spoiler-- willen we de spullen af ​​te drukken dat is in de rechter bovenhoek
er.
>> MARIA: Recht.
Jaaa Jaaa.
>> DAVID MALAN: Dus we hebben net zet er die voorbeeld van de uitvoer.
Dus ik kan afleiden uit de bovenste lus die je
itereren over rijen van de buitenste lus, om zo te zeggen.
En je bent dan itereren zuilen de binnenste lus.
En intuïtief, deze hopelijk zinvol
omdat door de aard van elk programma dat we hebben gezien
vóór, printf, dat de functie we gebruiken, uiteindelijk,
heeft de mogelijkheid om dingen af ​​te drukken out wezen regel voor regel.
Zoals, als je eenmaal hebt uitgevoerd een nieuwe lijn, er is
geen weg terug verdubbelen en afdrukken iets hoger in het scherm, tenminste
niet met behulp van printf als dit.
>> En zo in dat verband, het maakt zin dat de buitenste lus
worden verwezen naar de rijen omdat voor elke gegeven rij,
je gaat te willen uitprinten XXXXX, en dan
gaan naar de volgende rij, XXXXX.
Dus rijen staan ​​voorop.
En vervolgens binnen elk rij, je kolommen afdrukken.
Als u geprobeerd om het het doen tegendeel, het zou waarschijnlijk niet
komen als u van plan bent.
>> MARIA: Ja.
We konden gewoon niet terug naar de vorige rij met printf.
>> DAVID MALAN: En wat is interessant per vandaag praatje over omvang,
eigenlijk, is die rij is een int dat is gedeclareerd in de bovenste lus.
Maar merken dat het nog steeds Binnenin, zogezegd,
de accolades die onmiddellijk volgen,
ook al is het technisch niet binnen die accolades.
Dus rij is ruimte voor het geheel van het fragment van de code,
zowel in de buitenste lus en de binnenkant van de binnenste lus.
Maar daarentegen, waar de is kolom in scope?
De variabele kolom?
Ja, alleen in het inwendige lus.
En dat is OK, want we hebben geen toegang tot Het buiten de accolades.
Alles wat we doen is het afdrukken van een nieuw lijn aan het einde daar.
Zodat in feite is OK.
>> Dit heeft dus het effect, het lijkt erop dat, doen drie rijen en vier kolommen.
>> MARIA: Recht.
Dus eerst gaan we via onze eerste rij.
En alleen in onze eerste rij, doen we het vier kolommen in de eerste rij.
Dus we uitprinten vier X.
En dan kunnen we verlaat de lus, omdat we hebben al uitgeprint vier X.
En we het afdrukken van een nieuwe lijn.
En dan gaan we door de Hetzelfde proces voor twee rijen
een totaal van drie te maken.
>> DAVID MALAN: En het is vermeldenswaard is het gewoon een artefact van het lettertype, het feit
dat het monster uitgang lijken zo veel groter,
alsof er is meer rijen dan kolommen.
Maar het is gewoon omdat de X is langer dan breed.
Dat is alles wat er gebeurt, plus de witte ruimte tussen de lijnen.
>> MARIA: Recht.
Koel.
DAVID MALAN: Oké.
Dus een snelle blik op een probleem te stellen, nemen alle vragen, en dan verdagen?
Prima.
Dus in het probleem te stellen één, er is drie voornaamste uitdagingen, uiteindelijk.
Maar eerst, vind je het Probleemverzameling
specificatie, zoals bij veel van de psets dit najaar, zal je lopen
door een paar warming-up oefeningen, u wijzen op een weinig middelen
dat je wel of nog niet hebben gezien.
Bijvoorbeeld, CS50 heeft een suite van shorts,
die korte video's zijn, niet anders dan dit, maar
zijn zeer onderwerp specific-- misschien vijf minuten,
10 minuten lang op lussen of op de voorwaarden of op algoritmen
of later op meer geavanceerde onderwerpen, als goed.
En we meestal insluiten die in het probleem
sets zodat studenten een middel waarmee
tot materiaal dat zou kunnen hebben herzien al komen in collegezaal of sectie.
Maar op deze manier is het meer gericht en nog veel meer binnen handbereik.
>> We hebben ook de neiging om te verankeren in probleemwijken zet dingen genoemd walkthroughs.
Dus vrijwel alle voorbeelden ik in collegezaal, op het podium hier, wij ook
hebben geschoten op de camera in vooraf een tragere,
een meer intieme walkthrough door mij op mijn laptop van die code, regel voor regel
zodat in de klas, we vaak doorlopen iets of iemand
zal tussenbeide met een antwoord op een vraag.
Maar het hoeft niet per se zinken voor iedereen in het publiek.
Dus je zult code walkthroughs vinden voor de meeste voorbeelden
dat we hier doen in collegezaal, zodat u kan er doorheen lopen in uw eigen tempo
en terugspoelen of snel vooruit of overslaan helemaal, als je wilt.
>> Er vaak een paar warm-up vragen die
vraag je om te sorteren van Dit materiaal versterken
en zorg ervoor dat je comfortabel bent voor u doorgaat met de rest van de PSET.
En dan, natuurlijk, er is de PSET zelf.
En één van de dingen we heel bewust
doen in CS50 is bijna elke oninteressant of intellectueel oninteressant
mechanische stap die je zou kunnen hebben om te doen
is bijna altijd zeer goed gedocumenteerd.
In de loop van de termijn, zullen we beginnen om meer retorische vragen te stellen
zoals herinneren hoe om dit of dat te doen?
Maar over het algemeen, vindt u dat het probleem sets krijg je
door de monteurs iets zodat
de interessante, intellectuele uitdagingen uiteindelijk overgelaten aan de student.
>> Met dat gezegd, Zamyla, aan wie wij gehouden verwijzend vandaag in collegezaal,
is een van onze oude medewerkers lid die ook houdt walkthroughs
over specifieke PSET problemen zoals mario en hebzuchtig, maar niet het water dit jaar.
En het is in die walkthroughs dat ze vaak
biedt een aantal tips en trucs voor hoe verder te gaan, je nooit vertellen
precies wat te doen, maar rather-- als een voorwaarde,
als je will-- geven u tenminste een paar ideeën, zodat het is aan jou,
zelfs om hoe ze te benaderen.
>> MARIA: als een soort high-level begrip van de logica van wat
Wij vragen u om te doen.
>> DAVID MALAN: Precies.
En inderdaad, Zamyla's walkthroughs zijn bedoeld
op de meest beantwoorden gestelde vraag waar
heb ik begon, in het bijzonder wanneer deze lange specificaties
een beetje ontmoedigend gezien alle tekst en beelden die ze in zich hebben.
>> Dus water.c, vindt u nadat je het hebt voltooid,
in feite betrekkelijk eenvoudig.
Absoluut zijn een stelletje van ga je bang
je hoofd tegen de muur proberen om erachter te komen waarom het niet compileren
of waarom het is niet correct uitgevoerd.
Maar als je eenmaal klaar bent met het en als je eenmaal hebt
verbleef enige tijd worstelen met enige van de bugs die u zou kunnen hebben,
je zult zien dat het een kort programma.
Het kan in enkele regels code, waarvan de meeste
we hebben gezien hier in lezing al, als je monteren van de juiste bouwstenen.
>> En als we suggereren hier, het gaat om te vragen
u aangeven hoeveel minuten iemand die een douche op de campus.
We geven in het probleem Stel de snelheid van de waterstroom
in, zoals een low-flow douche hoofd, net als de Seinfeld clip
we gisteren zagen of het tegengestelde daarvan.
En dan hoef je alleen te doen een beetje van de wiskunde,
really-- rekenen met behulp van C te vertellen ons hoe veel, ongeveer, flessen water
is dat gelijk aan als we het nemen van een n-minuten douche.
>> Nu, in mario.c, dit gaat een iets langere programma.
Het is nog steeds niet van plan om zo lang te zijn.
Slechts een paar regels langer dan water.c.
Maar het gaat om de gelegenheid te zijn aan de oude school Mario recreëren
piramide van Super Mario Broers of een follow-on.
Het gaat niet om naar te kijken als mooier of zo kleurrijk als die daar.
We gaan gewoon te weinig hashtags gebruiken zoals wij hebben hier op het scherm
met behulp van ASCII-tekst.
Maar het zal hetzelfde idee te benaderen.
En het gaat om een ​​te zijn uitoefenen, dat op het eerste gezicht
lijkt vrij simple-- net afdrukken van een eenvoudige piramide.
Maar er zijn een paar kenmerken Hier die interessant zijn.
Merk op dat de meest rechtse rand van de piramide heeft eigenlijk breedte twee.
Dus er is twee gelijke hoogte kolommen, die
maakt het een beetje nodig beetje van het denken te maken
ervoor dat je dat precies goed, als in tegenstelling tot slechts een perfect haakse
lijn.
Dus dat is een beetje een hoek geval maar overeenkomt met het eigenlijke spel.
>> En het is ook niet duidelijk op het eerste oogopslag hoe de witte ruimte te drukken.
Dus als ik kijk naar de voorbeelduitvoer hier--
en het is ook in de spec-- is soort ziet eruit als een rechthoek,
maar een diagonaal van het rechthoek is afgehakt,
en het is gewoon witte ruimtes, om zo te zeggen.
En zo een veelgestelde vraag is hier altijd goed,
hoe kan ik de hashtags verplaatsen naar rechts?
Of hoe kan ik de lege ruimtes te drukken?
En het is eigenlijk makkelijker dan de meeste studenten denken.
Rechts?
U kunt het visueel benaderen door gewoon of twee keer raken van de spatiebalk
of drie keer.
>> En dus zelfs al met printf we bijna altijd uitprinten een string of een int
of een woord als "hallo, wereld "of reeks van woorden,
u kunt ook gewoon uitprinten citaat, ruimte, einde citaat.
En dat ook daadwerkelijk te geven u een witte ruimte daar.
Dus hou dat in het achterhoofd en dit niet over nadenken.
Je moet echt besluiten per rij voor rij,
niet in tegenstelling tot uw voorbeeld een ogenblik geleden, hoeveel van die
kolommen witte ruimtes en hoeveel van hen zou moeten zijn hashtags.
Het zal een beetje tijd in beslag nemen, maar het is uiteindelijk een logische puzzel van soorten.
>> MARIA: Ja.
Maar de logica van het gaan rij voor rij zal hier zeer nuttig zijn.
DAVID MALAN: Ja.
Ik denk dat de voorbeeldcode je zelfs gave-- hoewel het niet een volledig programma.
Je moet nog int en de belangrijkste en nietig en # include stdio.h,
veel van de spullen van lezing.
Maar de bouwstenen lijkt om daar te zijn.
En dan tot slot is iets een beetje meer algoritmische.
Dus het blijkt dat elke keer dat u gaan in CVS of supermarkt
en iemand die je handen bij de caissière biljetten of munten als verandering,
het blijkt dat ze, mensen, ongeacht of ze het weten of niet,
waarschijnlijk met behulp van wat is riep een hebzuchtige algoritme,
waarbij als u verschuldigd bent, zeg, $ 21 in verandering, omdat een of andere reden
je iets heel goedkoop gekocht met een zeer grote bill bij CVS,
zou het echt vervelend als het zijn caissière gaf je 21 singles of, nog erger
nog, een heleboel munten.
Integendeel, wat een redelijk persoon is waarschijnlijk gaat doen, is ze gaan
een $ 20 en vervolgens een $ 1-bill, en grijp geef je gewoon twee wetsvoorstellen in dat geval.
MARIA: Dus ze op zoek te minimaliseren de verandering die ze terug te geven aan u.
DAVID MALAN: Precies.
En dezelfde deal met munten, als goed.
Als u verschuldigd bent, zeg, $ 0,50, hopelijk u niet wilt dat 50 pence.
U wilt in plaats van twee kwartalen, bijvoorbeeld.
Nu, dit doet veronderstellen dat de caissière heeft
genoeg van elke denominatie die hij of zij zou willen om u te geven.
Maar wij u toestaan ​​om te veronderstellen zowel in het probleem.
En het doel is uiteindelijk aan implementeren in C-code een hebzuchtige algoritme.
Zodat de gebruiker mag te typen in hoeveel
hij veranderen of zij verschuldigd is met dollars en centen, een soort van floating point
waarde waarschijnlijk.
En dan moet je de wiskunde te doen en achterhalen algoritmisch, nou ja,
hoeveel munten kan ik geven u minimaal aan u geven
precies dat bedrag van de verandering.
Maar er zal een te zijn enkele lastige onderdelen hier, toch?
Alsof er de hele onnauwkeurigheid kwestie.
MARIA: Precies.
Dus floating point waarden onnauwkeurigheid.
Hebben we over praten in de lezing van vandaag?
>> DAVID MALAN: We hebben de de laatste keer in collegezaal.
We spraken over onnauwkeurigheid.
En u niet wilt dat de gebruiker te bedriegen hoeveel verandering die hij of zij verschuldigd is.
En dus is de walkthrough, in het Probleemverzameling specificatie
nadenken, uiteindelijk, als bedoeld hoe je kunt verminderen die onnauwkeurigheid
fouten, potentieel.
Het vermeden, zeker voor de ingangen we praten over.
En inderdaad, pennies-- Misschien zullen we uit te stellen tot Zamyla,
Ik denk dat, voor de trucs daar.
Dus uiteindelijk heb je een vondst progressie van de problemen van deze week,
waarvan de eerste is vrij klein, dan medium, dan een beetje groter.
Maar ze gebruiken het gebouw blokken van de afgelopen week,
van deze supersection, probleem set specificatie
plaatst je in talloze bronnen.
Maar toch, als het al moeilijk hebben, vooral onder degenen minder comfortabel
zonder voorafgaande achtergrond, kom naar de kantooruren
op maandag en dinsdag en Woensdag en donderdag.
Ga naar CS50 Bespreek via de website van de cursus,
via welke u kunt chatten met het personeel en klasgenoten.
>> Maar uiteindelijk denk ik dat de beste advies is gewoon beginnen vroeg.
Het is niet het soort van de klasse die u moet beginnen psets op woensdag
's nachts, of erger donderdagavond.
>> MARIA: Mijn beste advies is te zijn begonnen op maandag.
DAVID MALAN: maandag.
Dus als je nog niet begonnen already-- nee.
Maar zelfs als ze niet maandag, dan dinsdag.
Hoe eerder hoe beter.
En dat is de reden dat de Natuurlijk heeft zoveel late dagen
om u een beetje een psychologische druk
eerder beginnen, maar nog steeds laat dingen slip wanneer de dingen langer duren
dan je zou verwachten.
>> MARIA: En u wilt gebruik maken van kantooruren zoveel als je kunt, ook.
>> DAVID MALAN: Heeft u nog vragen?
Prima.
Nou, waarom niet we hier verdagen?