[Powered by Google Translate] David J. MALAN: Okej, det här är CS50 och det är
slutet av vecka 1, så studera kort i och det totala antalet
klasskamrater som du har i år är 745.
Och vi är så glada att ha så många av er i kursen
denna termin, men även om kursen är så stort,
inse att det är dessa saker som fredag ​​luncher, liksom
kontorstid, 15-personen sektioner och så vidare att
verkligen tänkt att skapa denna mer intim
miljö.
Så även om vi kan samlas en eller två gånger i veckan, här i
Sanders, vet att mycket av din erfarenhet i denna kurs
kommer i hög grad att vara praktisk på sidan av dina klasskamrater
och lärarna.
>> Så här går vi, Fall 2012.
Så minns att förra gången vi slutade på en del av
vaghet, talar om representation siffror.
Och vi tittade på en av de misslyckanden som hände i
verkliga världen, när det kom till missförstånd
hur datorer fungerar.
Nåväl, idag ska vi återkomma en annan av de idéer som
samt fortsätta vår diskussion om CS50-klienten
och C och vad det innebär egentligen att programmera.
Men först, bara ett par virvelvind meddelanden.
>> Avsnitt börjar denna söndag, och den första veckan är alltid en
lite av en snabb start, eftersom vi bara fick i
din sektion former.
Vi gör samma sak, nu med undervisningen stipendiater, nu
att de vet sina scheman, så vi siktar, genom
Lördag morgon att följa upp med dig med din sektion
uppdrag och TF.
Inse att de ska börja nästa dag, söndag
eller måndag eller tisdag.
Och då kommer vi att rymma avsnitt förändras när de uppstår
under de kommande dagarna.
Kontorstid, tiden är, återigen, i kväll, 8 PM till 11, i
Annenberg, liksom i morgon kväll.
Även om problemet apparater är i allmänhet beror på torsdagar
vid middagstid, inser du ha upp till fem sena dagar att spendera,
därmed tillgången på kontorstid på torsdagar om
du kontanter i en av dessa sena dagar och därmed lägga
något på fredag.
Låt mig föreslå att Scratch är bland de roligare, bland
mer låg nyckeln problem uppsättningar.
Och jag skulle hänga på dessa sena dagar, strategiskt, bara
för senare i terminen när livet börjar komma i vägen
med midterms och andra klasser.
Problem Set 1, under tiden, skulle anslås på kursens
webbplats på fredag, vilket kommer att på kursen promenad
genom video, som kommer att filmas vid 2:30 PM på fredag
och sedan publiceras online av nästa dag.
>> Så vi slutade på måndag.
Jag vill - faktiskt en notera här.
Eftersom klasserna - eftersom Sanders inte precis lämpar
sig till casual Q & A och tillbaka fruktansvärt bra, vi är
kommer att prova något lite nytt i år, där
om du inte är bekväm att höja handen eller om du bara
vill inte upp handen i ett rum som detta,
vi kommer att ha några av de pedagogiska stipendiater och CA
bemanning cs50.net/discuss under föreläsningen.
Så om du har en fråga, eftersom jag var helt
oklart om något eller om du är nyfiken på något
ämne, försök lägga den där.
Märka den med en etikett Föreläsning, och vi ska göra vårt bästa
idag och nästa vecka - we'll prova detta - att sätta in den
antingen elektroniskt, på nätet, eller om det känns som om vi ska
verkligen åtgärda det en masse, en av de pedagogiska stipendiater eller
CA kommer att höja sin hand och be
anonymt för din räkning.
Så vi ska ge det ett försök och se hur bra det fungerar.
Men med alla medel, fortsätta att höja händerna som du vill.
>> Så förra gången vi visade att 10% eller en tiondel inte i
Faktum 0,1, som du har lärt dig många år sedan.
Det är i själva verket ett värde som denna.
Men det är inte helt sant, eller hur?
Vi har bara denna begränsning i datorer som innebär att om du
endast har en begränsad mängd minne, RAM eller mer
speciellt bitar, ja, det är bara ett begränsat antal
saker du kan representera.
Till exempel, om vi har siffran noll, och vi vill
representerar i binär, med användning av åtta bitar, där en bit,
igen, en nolla eller en etta, kan vi
representera det som 00000000.
Och det är lite onödigt mångordig.
Precis som i det decimala systemet i den verkliga världen,
allmänhet, om du vill skriva numret 123, vi
människor förmodligen inte skriva 00000123 även om
funktionellt, det är exakt samma nummer.
Vi släpper bara inledande nollor, så att säga.
>> I binär, kan vi göra samma sak.
Binär och noll, noll och binär är bara noll.
Du behöver bara en enda bit.
Men återigen, det vanligaste måttenheten i världen
av datorer är byte, åtta bitar.
Bara för att en bit, ganska värdelös.
Åtta bitar, inte särskilt bra, men åtminstone är det mer
användbar än en enda måttenhet.
Så med åtta bitar, vi representerar vanligtvis binärt.
Så här har vi siffrorna noll, ett, två, och sedan, när
Nate gjorde i vår video i onsdags, kan vi fortsätta
räkna upp till sju, åtta.
Och sedan om vi använder fler och fler bitar, vi
kan räkna upp till oändlighet.
Men om du bara har ett begränsat antal av dessa bitar, som är
fallet i något datasystem, eller missil
systemet, ja, ja du bara har en
ändlig mängd av precision.
Så om du vill representera antalet som 0,1, ja, det
Datorn måste välja och vraka.
Och om den har endast ett begränsat antal siffror den kan
representerar, kan det komma nära 0,1 för dig, men det kan inte
nödvändigtvis ge dig exakt det värde som du vill ha.
Och detta är bara en av de utmaningar som datorer,
under huven, tack och lov.
>> När vi går längre i terminen, dessa lägre nivå
detaljer blir mycket mindre intressant, men säkert
tillämpningen av dessa idéer kan ha några mycket verkliga världen
förgreningar.
Man är lite roligt.
Hur många av er har sett den fantastiska Space filmen Office?
Om du inte har, är din inofficiella
läxor för veckan.
Men i Office Space, stipendiaterna i den filmen tar
Fördelen med just denna idé, men de faktiskt stal
den från en annan film som du kan ha
sett, även år tidigare.
Så låt mig ge er några sekunder av denna trailer från
denna fantastiska film och det är mycket
akademiskt relevant.
>> [SPELAR FILM]
Egentligen jag främjas.
Jag kan programmera ett virus som kommer att slita som
plats utanför big time.
Nå, hur funkar det?
Varje gång det är en bank transaktion där intresset är
beräknade, det finns tusentals per dag, slutar datorn upp
med dessa delar av en cent.
Men jag tänker inte göra något olagligt.
Olagligt? Samir, detta är Amerika.
Du måste svär.
Om ingen vet om detta men vi, okej? Inga familjemedlemmar, inga
flickvänner, ingen.
[OHÖRBAR].
Oroa dig inte, mannen, jag kommer inte berätta för någon heller.
[MOVIE SLUTAR]
>> Okej, så kanske jag hittade den här filmen bättre än de flesta
människor här, men i alla fall, det virus som de
försöker skapa -
och i filmer, när som helst de skulle ringa något virus,
Det är i allmänhet inte egentligen ett virus.
Det är bara ett program som någon skrev att göra något.
Och i detta fall, killarna försökte skriva ett program
som tog fördel av deras företag som heter Innotech s
datasystem, varigenom datorer, också, även när det
kommer till pengar, kan inte nödvändigtvis
representerar pengar exakt.
Så även om du kanske har $ 0,10 på ditt bankkonto,
0,10, ja, kanske datorn tror faktiskt att du har
detta många cent i ditt bankkonto.
Och så vad dessa killar hade strävar efter att göra - och de
stal idén, visar det sig från Superman III, där
Richard Pryor gjorde samma sak - de var i huvudsak
skriva program som strävar efter att ta alla efterföljande
siffror, alla de små, små, små fraktioner av
pennies och suga dem utanför så att människorna bara
tanke, åh, det är bara $ 0,10 där, men alla dessa
avslutande tal lägger så småningom upp.
Så en underbar idé och det slog slint uppsluppen i det
viss film.
>> Men i den verkliga världen, också, det finns mycket mer om
konsekvenserna av dessa typer av saker.
Och en av anledningarna att dyka in i fältet av dator
vetenskap är, återigen, dess tillämpbarhet inte till
teknikvetenskap ensam, men bara för att
andra områden också.
Så detta är en mindre lättsam titt på vad som kan gå fel, men
Det är också ganska öppna ögonen, tror jag, när det gäller
förstå exakt hur allestädes närvarande teknik som
datorer och programmering eller dessa dagar,
i form av programvara.
Så detta nästa klipp är bara om sex minuter, fortsätter
där vi slutade förra gången, men tillåter oss att titta lite
mer ingående vid ett sådant av dessa frågor.
Låt mig gå vidare till där vi slutade,
som var här.
Och vi har en del två av två, i ca sex minuter här.
>> [PLAY MOVIE]
Plågat modern raket-teknik.
Under 1991 med starten av det första Gulfkriget, Patriot
missil upplevde en liknande typ av
nummer konvertering problem.
Och som ett resultat, var 20 personer, 20 amerikanska soldater, dödades
och cirka 100 andra skadades när Patriot, som skulle
för att skydda mot inkommande Scuds,
misslyckades att avfyra en missil.
>> När Irak invaderade Kuwait och USA lanserade en öken
Storm i början av 1991, var Patriot missiler batterier
användas för att skydda Saudiarabien och Israel från irakiska
Scud missiler.
Patriot är en amerikansk medium-range surface-to-air-systemet,
tillverkas av Raytheon företaget.
Storleken på Patriot jaktplan själv, det handlar om
ungefär 20 meter lång och den väger omkring 2.000 pounds.
Och det bär en stridsspets med om - jag tror att det är ungefär
150 pounds.
Och stridsspetsen själv är en högexplosiv som har
fragment runt den.
Hölje stridsspetsen är konstruerad för att agera som hagel.
Missilerna förs fyra per behållare och
transporteras av en påhängsvagn.
>> Patriot antimissilsystem går tillbaka åtminstone till
20 år nu.
Det var ursprungligen utformad som en luftförsvar missil till
skjuta ner fientliga flygplan, i det första Gulfkriget.
När det kriget kom, ville armén för att använda den för att skjuta
ner Scuds, inte flygplan.
Air irakiska Force var inte så mycket av ett problem, men armén
var orolig Scuds.
Och så de försökte uppgradera Patriot.
Fånga en fiende missil färdas i Mach 5 skulle
att vara utmanande nog.
Men när Patriot var rusade i bruk, armén
var inte medveten om en irakisk förändring som gjorde sin
Scuds nästan omöjligt att slå.
>> Vad som hände är Scuds som var
kommer i var instabila.
De precession.
Anledningen till detta var irakierna, för att få 600
kilometer ur ett 300 kilometer sortiment missil tog
vikt av den främre stridsspetsen och
gjorde stridsspetsen tändaren.
Så nu Patriot försöker komma på Scud, och de flesta av
tiden, den överväldigande majoriteten av tiden, skulle det
bara flyga av Scud.
När Patriot systemansvariga insåg Patriot
missade sitt mål, detonerade de Patriot stridsspets.
För att undvika eventuella förluster, var det tillåtet
att falla till marken.
Det var vad de flesta såg som stora eldklot på himlen,
och missförstås som avlyssningar av Scud stridsspetsar.
>> Även på natthimlen, verkade Patriots vara
framgångsrikt förstörde Scuds på Dhahran, kunde det inte finnas någon
misstag om dess prestanda.
Där förlorade Patriots radarsystem reda på ett
inkommande Scud och aldrig lanserat grund
till en programvara fel.
Det var israelerna som först upptäckte att ju längre
systemet var på, desto större avvikelse tiden blev,
på grund av en klocka inbäddad i systemets dator.
Om två veckor före tragedin i Dhahran, den
Israelerna rapporteras till Försvarsdepartementet att
systemet förlorar tid.
Efter ca åtta timmars drift, märkte de att
Systemet blev märkbart mindre exakt.
Försvarsdepartementet svarade med att berätta allt
Patriot batterierna inte lämna de system
under en lång tid.
De sa aldrig vad en lång tid var - 8 timmar, 10
timmar, 1.000 timmar.
Ingen visste.
>> The Patriot batteri stationerad vid barackerna vid Dhahran
och dess bristfälliga interna klocka hade varit på över 100 timmar på
natten den 25 februari.
Det spårade tid till en noggrannhet av ungefär 1/10 av en sekund.
Nu en tiondel av den andra är ett intressant nummer eftersom
Det kan inte uttryckas i binär, exakt, vilket betyder
Det kan inte uttryckas exakt i alla
modern digital dator.
Det är svårt att tro.
Men använda detta som ett exempel.
>> Låt oss ta numret tredjedel.
En tredjedel kan inte uttryckas i decimaler, exakt.
En tredjedel är 0,333 pågår för oändligheten.
Det finns inget sätt att göra det med absolut precision i decimal.
Det är precis samma typ av problem som hände i
Patriot.
Ju längre systemet sprang, desto värre när felet blev.
Efter 100 timmars drift, var felet i tid endast
ungefär en tredjedel av en sekund.
Men när det gäller att rikta en missil som reser på Mach 5,
Det resulterade i en tracking error över 600 meter.
Det skulle vara ett allvarligt fel för soldaterna i Dhahran.
>> Vad som hände är en Scud lansering upptäcktes av tidig varning
satelliter och de visste att Scud kom i deras
allmänna riktning.
De visste inte var den var på väg.
Det var nu upp till radarn del av Patriot
system försvara Dhahran, att hitta och hålla reda på
inkommande fiende missil.
Radarn var mycket smart.
Du skulle faktiskt spåra positionen för Scud och sedan
förutsäga var det förmodligen skulle bli nästa gång
radarn sände en puls ut.
Som kallades området grinden.
Sedan, när Patriot beslutar tillräckligt med tid har gått för att gå
tillbaka och kontrollera nästa plats för denna detekterade
objekt, går den tillbaka.
Så när det gick tillbaka till fel ställe, ser det då inte
objekt och beslutar att det inte fanns något föremål.
Det var en falsk detektering och sjunker banan.
>> Den inkommande Scud försvann från radarskärmen.
Och sekunder senare smällde det till barackerna. Den Scud
dödade 28 och var den sista sparken under
det första Gulfkriget.
Tragiskt kom den uppdaterade programvaran på Dhahran
Följande dag.
Och mjukvaran fel hade fastställts, stänga ett kapitel i
den oroliga historia Patriot missiler.
Patriot är egentligen en förkortning för "infasade Spårning
Skärningspunkt Target. "
>> Okej, så en mycket mer sorgsen utfallet av inte riktigt
förstå den här världen.
Och takeaway, verkligen, från filmen är att lösningen
Det var starta om missilförsvar
varje gång på ett tag.
Och så igen, en av syftena med denna kurs, säkert
på en mer ödmjuk skala än dessa program, är att
verkligen öppna allas ögon för exakt hur du går om
gör maskiner gör vad du vill att de ska göra och hur du går
om att göra det på rätt sätt, medan på vägen gör det
bra, elegant, och så vidare.
Och så idag, låt oss dyka in lite mer av detta, men
så att vi inte går för fort, särskilt för de mindre
bekväm, men också så att vi kan behålla intresset för
de mer bekväm, låt oss bara snabbt börja med lite
av resumé av några av dessa idéer.
Och återigen, be bort, både personligen eller online, om du har
frågor så att vi kan hålla alla på samma sida.
>> Så CS50 Appliance, snabb steg tillbaka, är
vad med dina egna ord?
Det är OK om du har ingen aning om vad dessa ord kan vara ännu.
[OHÖRBAR]
Okej, så en universell gränssnitt för -
att vi alla kan dela.
Absolut.
Så vi kunde till exempel säga att du ska gå till någon
hemsida, ladda ner denna programvara för Mac OS.
Ladda ner denna programvara för Windows, konfigurera i
hit och dit.
Men verkligheten är vi stöter otaliga tekniska
supportärenden.
Och även dessa dagar, mycket av vad som görs serversidan,
i en värld av datorer, speciellt när det gäller
webbutveckling och webbaserade applikationer, faktiskt
ganska ofta gjort på Unix eller Linux-datorer, i motsats till
Mac eller Windows-datorer.
>> Så bland upsides alltså att använda denna sak som kallas
CS50 Appliance är vi alla kommer att ha samma miljö.
Så alla är på samma sida oavsett vilken maskinvara du
kom till campus med men också kommer att syssla med just
samma miljö som du kommer att använda mot
termin slut samt för webbutveckling samt i
framtid för verkliga applikationer därav.
Så mer konkret, är CS50 Appliance en fri bit
programvara som gör att du kan köra ett annat operativsystem,
Linux, i det här fallet, på din egen dator, i ett fönster.
Nu kan du inte bara ladda ner apparaten.
Du behöver ett program som man kan spela eller köra maskinen.
Och det mjukvara är allmänt känd som en
hypervisor.
Hypervisorer kommer i form av produkter som VMware,
Virtual Box, Parallels.
Alla typer av företag gör programvara, både fria och
kommersiell, lika.
Vad du ser i problembild 1 är instruktioner om hur man
få fri programvara som man kan
kör CS50 Appliance.
Och när du gör får du, i ett fönster på din Mac eller PC,
en skrivbordsmiljö som ser ganska så här, där
den har en Start-menyn-liknande sak i
nedre vänstra hörnet.
Den har en hemmapp eller hemkatalog i det övre vänstra
där, en papperskorg, och så vidare.
Så vi ska retas isär de nödvändiga detaljer som vi går.
>> Men nu ska vi börja att dyka in C.
Så C är denna programmeringsspråk, likadana i andemening som
Scratch, men långt mindre grafiskt, men ironiskt nog, långt
mer kraftfull när du får smart med det.
Så i C, skriver vi program genom att skriva källkod, som är
denna engelska-liknande syntax, liknande de strumpor
demonstration som vi gjorde förra gången som tillåter dig att
uttrycka dig ganska exakt, om
arcanely, till datorn.
>> Så vilken typ av produkt programvara behöver du egentligen
att skriva program på ett språk som C, baserat på vår
samtal på måndag?
[OHÖRBAR]
OK, du behöver bara en texteditor.
Du behöver inte någon särskild programvara
sig att skriva program.
Du behöver bara en texteditor som Anteckningar i Windows,
TextEdit på Mac, eller något som kallas gedit, i en värld av
Linux, som vi kommer att använda här.
Och det är det, för att skriva program.
>> Men skriver är bara halva ekvationen.
Du behöver sedan köra dem.
Men för att köra program -
Du kan inte köra källkod.
Du har istället att göra vad det först?
Ja.
David J. MALAN: Du behöver
kompilera det.
Och någon annan, kompilera källkoden innebär -
[OHÖRBAR]
David J. MALAN: Exakt.
Översätta det till nollor och ettor.
Eftersom vi alla, i dessa dagar, har datorer som har processorer,
nästan alla är gjorda av ett företag som heter Intel, och
Intel Inside, innebär att det är det här hjärnan insidan av din
dator, som kallas CPU.
Och en av de saker som att hjärnan gör är, det vet
hur man ska förstå mönster av ettor och nollor.
Den vet vad mönstret av bitar representerar Dessutom, vad
mönster representerar subtraktioner, vilket mönster av
bitar representerar skriva och skapa ett hörbart ljud.
>> Så kort sagt, CPU, tillsammans med operativsystemet,
vilket är en mjukvara som körs på toppen av processorn,
så att säga.
Tillsammans dessa två stycken vet hur du kör program som
vi människor skriver.
>> Så om jag går in i CS50 Appliance här, jag måste öppna
upp en textredigerare och jag kan komma åt denna
i ett par olika sätt.
Jag kan antingen gå till Meny, programmering,
och då kan jag välja -
Nix, inte den menyn.
Jag kan gå till Tillbehör / gedit här för att öppna
min lilla textredigerare.
Eller enklare, kan jag klicka på den här lilla ikonen längst ner
vänstra hörnet.
Och nu får jag den här miljön här.
Det är ganska påminner om en enkel textredigerare, med bara
en eller två skillnader.
I det övre, där markören blinkar nu, det är där
Jag kan börja skriva min kod.
I botten är denna sak kallad terminalfönstret.
Och vilka typer av saker kan jag göra i denna
så kallade terminalfönster?
[OHÖRBAR]
>> Okej, så jag ska köra kommandon.
Och några av de kommandon som vi sprang på måndagen var lite
kryptiska i början, men ls för listan, cd för förändring katalog,
rm, för bort.
Så det är typ av en old-school sätt att navigera din
dator, med bara tangentbordet och textuella kommandon,
och inte, i allmänhet, med användning av en mus.
Men vi får se, snart ger detta faktiskt oss en
lite mer makt och lite mer precision med vilken
uttrycka oss.
Och sedan över här till vänster, vi ska bara se,
som vi börjar skriva programvara, en liten sammanfattning av
program som vi har skrivit uppe till vänster.
Men vi får se det igen inom kort.
>> Så låt oss göra något ganska enkelt här.
Låt mig först gå vidare och gå till File, Save, och jag är bara
kommer att klicka på jharvard här över på vänster och
jharvard är återigen namnet för mitt hem mapp, min
personliga filer, mig, nu är John Harvard, som ni alla
snart John Harvard i denna miljö.
Han har denna hemkatalog, Mina dokument och så vidare,
att jag vill spara, nu den här filen i.
Så jag kommer att kalla det hej.c. Sen ska jag gå
framåt och klicka på Spara, och nu vad jag har här är en flik
kallas hej.c, så mycket som en annan typ av editor.
>> Så nu låt mig gå vidare och börja skriva ett program.
int main (void).
Och då jag bara gjorde förra gången, printf, för utskrift formaterad,
("Hello, world!"
).
Nästan komplett.
Men jag saknar ett par detaljer.
Vad saknas i detta program som jag verkligen behöver för
det att faktiskt kompilera?
Ja.
[OHÖRBAR]?
>> David J. MALAN: Ja, så jag måste inkludera den standard
I / O-bibliotek.
Så detta måste gå över huvud, så jag ska bara
göra en del utrymme för det där.
Och jag ska göra # include .
Och märker de vinklade fästen där.
Och som en sidoreplik är gedit lite användarvänlig, om
ibland lite förvirrande, eftersom den försöker att hjälpa din
ögon ser vad linjer med vad.
Så det faktum att min markör är intill denna vinklade
fäste, märker hur det belyser andra vinklade
konsol plus här.
Och det är bara att dra min uppmärksamhet på det faktum att jag
har symmetri.
Och symmetri i programmering är i allmänhet en bra sak.
Likaså om jag flyttar min markören till slutet, märker hur de
klammerparenteser linje upp för att visa att, ja, jag har en öppen en
och en sluten en, så att säga.
>> Okej, jag kan göra en annan sak.
Det är inte absolut nödvändigt, men god praxis, för att säga
tillbaka 0.
Och retur 0 gör vad för oss här?
Eller betyder det?
[OHÖRBAR]
David J. MALAN: Men ingenting är fel.
Och ärligt talat är det svårt för mycket att gå fel i en
programmera denna korta.
Så jag bara vara super tydlig att allt är bra.
Jag, människan, när jag kör det här programmet, kommer förmodligen aldrig
se att 0.
Generellt är dessa siffror att vara tillbaka från huvud
bara uppfostra sina huvuden till människor när
något går fel.
Och du får en liten pop-up säger systemfel, ett,
två, tre, eller vad numret var att
faktiskt tillbaka.
Så allt annat fel?
[OHÖRBAR]
>> David J. MALAN: Så det här är inte så mycket en funktionell misstag
men en estetisk ett.
Jag borde nog sätta i en radmatningstecken där på
i slutet av den här strängen så att vi går faktiskt markören till
nästa rad, och programmet ser bara lite snyggare.
>> Så nu låt mig gå ner till min terminalfönster
och zooma igen
Och denna sak här, det kallas prompten.
Det är bara påminna mig vem jag är, jharvard @ apparat, där
apparaten är namnet på den dator jag är på.
Inom parentes är tilde den squiggle symbol, som
representerar vad?
Publiken: hemkatalogen.
David J. MALAN: hemkatalog.
Så det är bara en förkortning notation för att säga att du är i
din personliga mapp där alla dina filer går som standard.
Så nu, här kan jag skriva ls för listan.
Och det enda jag ser här just nu är hej.c.
Och det är bra eftersom jag bara skrev det här.
>> Så låt mig gå vidare och gör hej.
Och märker jag inte skriva att hej.c.
Istället, jag skriver bara bas namnet på filen, hej.
Och gör, som vi såg i måndags, kommer bara dra slutsatsen att jag vill
den. c-fil.
Så nu har jag skrivit att hej.
Nu ser jag det ganska lång kommando och kommer att fortsätta
ser detta om och om igen.
Men för att vara tydlig, klang, det ord som just dök upp,
Det är den verkliga kompilatorn.
Gör bara en bygga verktyg.
Det är bara en mer användarvänligt program som sparar mig i
lång sikt, från att skriva ut otroligt tråkiga långa
kommandon som att en.
Så du kan köra klang manuellt.
Du kan skriva allt detta manuellt.
Blir bara väldigt tråkiga.
Och så gör bara ett program som förenklar våra liv och
kör mer komplexa kommandon för oss.
>> Okej, så nu vilken fil ska jag ha
I min nuvarande katalog?
Inte bara hej.c, men också hej.
Så om jag vill köra hej, minns att jag säger dot slash,
där dot betyder gå in den aktuella mappen, var du
är, och sedan kör programmet heter hej, och faktiskt, nu,
Jag har hallå världen.
Okej, några frågor om arbetsflödet eller syntax
vad vi gjorde just?
>> Okej, så låt oss ta saker upp ett hack igen.
Så detta var underwhelming att bara skriva ett program som bara
någonsin, säger hej, värld.
Så vi ändrade det, på måndag, för att säga, hej, David.
Det är lite mer personligt, men lika hårt kodad som
Första versionen.
Så inte så övertygande.
Men det finns, i C, fungerar säkert förutom
utskrift, funktioner som gör att du får indata.
Och sättet vi gjorde detta, häromdagen, var följande.
Innan jag faktiskt skriva ut något, fick jag först
något från användaren.
Så låt mig göra det igen.
>> String s, där s är bara ett godtyckligt namn, här, för en
sträng är lika GetString.
Så vad getString?
Det blir naturligtvis en sträng, baserat på dess namn.
Men vad är det, mer tekniskt?
Det är en funktion.
Så det är en funktion som inte kommer med C per se.
CS50 anställda skrev.
Och så för att använda detta kan du inte bara inkludera stdio.h,
Du måste också inkludera vad?
Ja.
Så cs50.h, som är bara en fil som vi skrev för några år sedan.
Vi installerade det på apparaten för dig tillsammans med
alla de vanliga filerna.
Och så i dessa första veckorna för klassen, kommer vi att använda
Detta bara för att förenkla processen att göra mycket grundläggande
saker som får indata.
För som vi ser i ett par veckor, att få användardata i en
språk som C är faktiskt överraskande komplex,
särskilt eftersom du inte vet i förväg, vanligen hur
mycket grejer användaren ska skriva i.
Och när du inte vet hur mycket data att förvänta sig, behöver du inte
vet hur mycket minne att fördela.
Och om du faktiskt har ett kontradiktoriskt användare som försöker
att hacka sig in i systemet, kraschar datorn, ja,
allmänhet den första metoden attack är, precis som jag gjorde på
Måndag skriver en hel lång sekvens av slumpmässiga tecken,
trycka Enter, och se vad sönder.
Eftersom allmänhet om ett program raster, antyder att vid
en säkerhetsbrist, potentiellt.
Det antyder visserligen på dig, programmeraren, efter att ha gjort en
misstag, men farligt, kanske du har gjort en
säkerhetsrelaterad misstag, och i allmänhet vi ser att
det är hur maskinerna äventyras till denna dag, både
i världen av webben och program på
kommandoraden, så här.
>> Okej.
Så sträng s lika getString.
Så mer konkret nu, vad linje 6 göra här?
Så funktionen på höger blir sträng,
tar hur många argument?
Okej.
Så ingen.
Lite förstånd kontrollera.
Ett argument, återigen, är bara en ingång till en funktion för att ändra
dess standardbeteendet på något sätt.
Men i detta fall, jag vill inte ändra
beteende GetString.
Jag ville bara få en sträng.
Så jag satte något inom parentes, och sedan jag satte en
semikolon demarking änden av kodrad.
Nu, likhetstecknet betyder inte lika, per se.
Det betyder uppdrag, vilket innebär ange vad får
utmatas på den högra insidan av det som finns till vänster.
>> Så till vänster säger vi att vi har förklarat en
sträng som kallas s..
Och mer specifikt, har vi allokerat minne inuti
som vi sätter de bitar som representerar en sekvens av
tecken.
Men för idag har vi tilldelats
eller förklarade en sträng.
Okej.
Så nu när jag har gjort det, vill jag koppla in värdet på
s inte värdet av David.
Så detta är fel varför?
Så detta är bara bokstavligen hårdkodad s.
Det är att säga "hej, s," som är inte vad jag vill.
Så jag kan göra detta.
Den procentuella tecknet är en platshållare, men nu behöver jag
passera in skriva ut en andra argument.
Minns att argument till funktioner separeras genom
kommatecken, så nästa kommatecknet här jag lade efter detta bokstaven S.
Och i detta sammanhang nu, s är variabeln, och printf,
vid mottagande dessa två ingångar -
strängen till vänster och variabelnamnet är till höger -
kommer det att ansluta senare till fd för oss, och
bara skriva ut en fin vacker sträng som innehåller
vad det är som vi skrivit in
>> Så låt oss prova det här.
Kommer att gå vidare och zooma ut, tillbaka
till min terminalfönster.
Zooma in längst ner här.
Skriva att hej.
Klang verkar ha repris.
Jag ska skriva. / Hej, Enter.
Ingenting verkar hända ännu, men det är på denna uppmaning
att jag kan skriva något i stil med Nate, Enter, och nu har vi
Hej, Nate.
Och jag kan göra det igen med Rob, och så vidare.
Så förhoppningsvis nu detta program beter sig som jag tänker.
>> Nu inte så användarvänligt.
Jag har ingen aning om vad som är förväntat av mig.
Så vi kan verkligen städa upp lite.
Låt mig gå tillbaka upp hit, och i stället för bara dyka in och
be användaren efter en sträng, låt mig uttryckligen berätta
användaren vad jag förväntat mig.
Så printf ("Ange en sträng:"
);
Så inga variabler här.
Inga procenttecken.
Bara den enkla engelska frasen.
Låt mig nu gå till botten här och köra mitt program.
Men ingenting verkar ha ändrats.
Varför?
Jag måste kompilera det.
Så lätt misstag att göra.
Men du måste inte bara spara filen, men
kompilera programmet.
Och så om jag köra göra hej, nu klang körs.
Nu kan jag köra. / Hej. Och nu ser jag "Ange en sträng:".
Okej.
Nu är det lite mer användarvänligt.
Nate, Enter, hej, Nate.
>> Nåväl, låt oss prova det här igen och börja tänka
om Corner fall.
Så precis som i Scratch, du uppmuntras eller håller på att
uppmuntras i spec till typ av tänka på vad som kan gå
fel om du inte räknar allt som användaren kan göra.
Buggar därför kan uppstå.
Så skriv en sträng -
vad är ett hörn fallet här?
Vad är ett scenario som jag, programmerare, kanske inte
förväntas?
Ja.
Okej.
Så vad händer om jag skriver i ett antal som denna?
Okej.
Så det fungerar fortfarande.
Gramatically är meningslöst.
Men åtminstone programmet fungerar.
>> Vad är ett annat hörn fall?
Något jag inte förväntar sig.
Ja?
Okej.
Så vi kunde göra något som en riktigt, riktigt stor nummer.
Så låt oss göra det här.
Låt mig zooma ut för en sekund, låt mig belysa.
Det går inte att kopiera och klistra in här nere.
Okej.
Så jag kan inte kopiera och klistra in i terminalfönstret, så vi får
bara simulera det.
Låt mig zooma ut, kommer att slå.
Jag tänker inte göra det för länge, eftersom det inte kommer att
faktiskt bryta i detta program.
Men det kunde.
Enter.
Men det gjorde det inte.
Okej.
Men det är en äkta hörn fall.
Och den enda anledningen till att uppträdde korrekt, så att
tala, beror på CS50 funktionen GetString är faktiskt
utformade under huven, som vi ser i ett par veckor,
automatiskt att tilldela mer och mer RAM-minne, mer och mer
minne från operativsystemet, när det inser, wow,
du har verkligen skrivit i något ganska lång.
Nu är det lite av en vit lögn.
Om vi ​​stannade faktiskt ett bra tag och jag skrev i
ungefär 5 miljarder tecken på tangentbordet
här, eller egentligen slå kopiera och klistra ganska lite, vi förmodligen
kan leda till att programmet kraschar.
Bara lite svårare att simulera det med en ändlig
tid.
>> Vad är ett annat hörn fall vi kan prova?
Ja?
Ja.
Så varför inte vi svara någonting?
Så vi har faktiskt att vidta några åtgärder, annars
Programmet kommer att sitta där blinkande hela dagen.
Men om jag bara trycka Enter -
OK, nu ser fortfarande fel.
Inte krascha, men kanske finns det nu en möjlighet att
börja genomföra en mer rigoröst program
som kontrollerar faktiskt.
Och om strängen, meningen, det ord som jag
skrivit i har längden 0, ja, jag kanske borde skrika på
användare eller berätta för honom eller henne att ange en sträng igen, så att
Vi får faktiskt ser ut korrekt beteende och inte
bara helt förbiseende från min sida.
>> Fråga i ryggen?
Decimaltal.
Så vi kan prova det också.
1,10000005.
Verkar som det kommer att bara jobba faktiskt okej.
Och som faktiskt förväntas.
Även om vi kanske har skrivit det numret där eller en
större antal tidigare inse att när vi skriver användaren
ingång och vi använder GetString funktionen inte
Oavsett om vad jag skriver ser ut som ett nummer.
Minns att enligt ASCII, allt på din
tangentbordet har ett numeriskt värde som kan mappas till en
karaktär, en röding.
Så i det här fallet, även om jag kan skriva ett nummer,
Datorn kommer att tänka på det, så att säga, som en sträng -
något som ser ut som ett nummer, men är
faktiskt inte ett nummer.
Men det är faktiskt en perfekt Segue, för nu kan vi
faktiskt övergång till skriva program som
använda andra datatyper.
>> Så förutom att använda tecken, eller snarare, förutom att använda strängar,
inse att vi har andra datatyper i C samt i
andra språk.
En röding, som namnet antyder, är bara ett enda tecken.
En flottör är ett flyttal värde, och det är bara en fantasi
sätt att säga ett reellt tal - något som har en decimal
punkt i den med några siffror till vänster och / eller höger.
En int är ett heltal, som är bara ett nummer som 123.
Och nu mer intressant är saker som dubbel.
Vad gjorde vi säga en dubbel var förra gången?
Det är 64, till höger.
Så medan typiskt en flottör är 32-bitars -
så det är så lång tid i minnet, använder den 32 nollor och ettor till
representerar värden - en dubbel är bokstavligen dubbelt så, som
innebär att du antingen kan representera större tal, eller
Du kan representera mer precisa siffror.
Så du kan få fler nummer efter decimalkommat, men
som stipendiaten sa i videon, även något enkelt
begreppsmässigt som 1/3 inte kan representeras exakt av en
dator, eftersom så småningom tar slut bitar, och
Därför kan du bara göra .33333333 så många gånger, på
då du måste bara säga att jag är ute representation
utrymme måste jag bara kalla det en dag och representerar det
något oprecist så.
Och en lång lång -
dumt namn, men det är för att det finns en datatyp som kallas
länge i C som tillfällighet är ofta 32 bitar, precis som en
int är 32 bitar, men en lång lång är
allmänhet 64 bitar.
Så det betyder bara att du kan representera större
siffror än så.
>> Okej.
Så om vi vill verkligen börja representera saker, vi
kan behöva mer avancerade typer och
det är därför vi har sträng.
Så i CS50 biblioteket kallas den filen cs50.h, vi har
faktiskt förklarade en datatyp, så att säga, som kallas sträng,
men sträng existerar inte faktiskt.
Detta är återigen en av dessa lager kommer vi att skala
tillbaka i en vecka eller två och kasta bort det, och faktiskt
titta under huven på vad en sträng egentligen är, och
hur det representerade.
Vi kommer även att titta på booleska värden.
>> Så vad var bool i samband med Scratch?
Det är sant eller falskt.
Så det är bara ett värde som är sant eller falskt, på eller av, 1 eller
0, men du vill visa världen.
Så i C, tack vare CS50 biblioteket, vilket i sin tur
omfattar ett annat bibliotek under huven, har vi
tillgång till en datatyp som kallas bool, som kommer
bokstavligen tillåter oss att tilldela värdena true eller false för
saker i ett program.
>> Så låt oss gå vidare här och skriva ett litet program som
gör något där siffror istället.
Så låt mig gå tillbaka till CS50 Appliance, låt mig gå vidare och
skapa en ny fil här kallas -
låt oss bara säga något enkelt, som math.c.
Okej.
Och nu gå upp till toppen av mitt program, jag
kommer att göra den vanliga -
# Include , så att jag kan använda
printf, int main (void) -
Vi ska återkomma till så småningom, vad int betyder
här, vad tomrum menas här, men för nu, vet bara att
du måste starta program som detta.
Nu ska jag gå vidare och säga något lite
annorlunda - printf ("Ge mig ett nummer:"
).
Sen ska jag göra int n = getInt, eftersom det
Det visade sig att getInt är en annan funktion i CS50 biblioteket
förutom GetString.
Och nu ska jag göra något dumt, som "tack
för% d "för heltal och sedan komma n och
sedan tillbaka 0.
Så återigen, tillbaka 0 har ingenting att göra med numret jag
ber användaren.
Bara betyder slutet som alla, förmodligen är bra.
>> Så låt mig gå ner till min terminalfönster här.
Låt mig skriva att matte skriver.
Och något är fel.
Gör matte fungerade inte.
Här är den första av våra felmeddelanden.
Varför?
Lite kryptisk, men -
Ja.
Så cs50.h.
Så återigen, särskilt tidigt på kommer du skriva din första
program för pset 1 i avsnitt, kontorstid, och
ärligt talat, det blir överväldigande ibland vad dessa saker
faktiskt säger.
Men du inser väldigt snabbt de börjar falla
i hinkar där det en innebär att du har slutat en
av # innefattar längst upp i filen.
Och klang, kompilatorn är att informera dig om detta genom att
säger ganska fantasifullt, implicit deklaration av
funktion getInt är ogiltig.
>> Okej.
Så vad betyder det?
Det betyder bara att du implicit har deklarerat getInt i
den meningen att man inte uttryckligen har förklarat det.
Uttryckligen förklara int, måste du lära
Klang att den existerar.
Och mycket enkel lösning för det är att lära genom
inklusive denna andra filen, cs50.h på
toppen av din fil.
Eftersom bokstavligen, vad # include är det berättar klang
ganska mycket att gå hitta filen som heter cs50.h, kopiera,
klistra automatiskt in i toppen av mitt program för mig,
och sedan konvertera källkoden till nollor och ettor.
Men det skulle naturligtvis vara mycket tröttande om vi människor hade
att gå kopiera och klistra in dessa stora filer hela tiden,
så # include bara gör allt detta automatiskt utan
muddying min kod med någon annans bibliotek.
Och ett bibliotek är bara en annan fil som innehåller funktioner och
andra saker som någon annan har skrivit, att vi är
utnyttja för vår egen skull.
>> Okej.
Låt oss försöka igen.
Gör matten.
Enter.
Bra.
Så det verkar ha fungerat.
Så låt mig nu kör matematik,. / Matematik.
Ange ger mig ett nummer, 123.
Tack för 123.
Nu ska vi prova en annan hörn fall.
En sträng är ganska generöst, eftersom en
sträng kan vara vad som helst.
Kan se ut siffror, ser ut
tecken, ser ut som ord.
Men en int är en int.
Så nu om jag den svåra användaren, och det säger "Ge mig
ett nummer, "tänk om jag försöker göra något liknande 0,1?
Tja, det är ett nummer, och det är förenligt med
grammatik använde jag här, men under huven, jag är för
Naturligtvis med funktionen getInt.
>> Så låt oss se vad som händer.
Enter, försök igen.
Okej.
Låt mig vara svårt och bara trycka Enter igen.
Enter, Enter.
Så nu verkar det som getInt är lite mer
kraftfull än GetString.
Vi, personal, genomförs på ett sådant sätt att om vi märker
du har inte gett oss en int - och en int är ett decimaltal
innehåller nollor, ettor, tvåor, fyror, femmor, sexor,
sjuor, åttor eller nior.
Och det är det.
Inga decimaler, inga tecken, inga skiljetecken.
Det verkar som vi måste samarbeta.
Så låt mig försöka fyra, fem, sex, och det får mig igenom.
Så egentligen, att vara analt här skulle jag nog säga "Ge mig
ett heltal "för att förmedla till användaren
exakt vad jag tänker.
>> Nu ska vi tänka på under huven.
Vi kommer inte att titta på hur cs50.h genomförs idag,
det biblioteket.
Men om det fortsätter att säga försöka igen, försöka igen, försöka igen, vilken programmering
konstruera jag förmodligen använda under huven till
genomföra detta?
Så bara en slinga, eller hur?
Ett av de enklaste idéerna som vi såg på Scratch.
Konstruktionen evigt, Repetera konstruera.
Förmodligen, i detta program, under huven, även
även om det är skrivet i C och inte repa, det är att göra
något som kallas motsvarar alltid om användaren inte har
skrivs i ett heltal, säger försöka igen, försöka igen, försöka igen, försöka igen, så
slutligen när vi får ett heltal, då du
bryta sig ur denna slinga.
>> Så vad andra funktioner kan vi använda här i CS50 bibliotek?
Tja,, typ av uppenbara åtminstone baserat på
datatyper som vi nu vet finns.
Vi har genomfört GetString, getInt, utan i hela
första veckorna av terminen kan du också använda getFloat och
GetDouble och GetLongLong för att få exakt
datatyper som du vill.
Eftersom den viktigaste detalj här är att till skillnad från vissa språk,
Liksom Python och Ruby, där man inte nödvändigtvis
deklarera datatypen för en variabel -
du behöver inte tala om för datorn vilken typ av saker
du kommer att sätta i variabeln -
i C, måste du vara aldrig så exakt.
Så om du vill ha en variabel som heter N, en bit av lagringsutrymme
att i detta fall råkar vara 32 bitar av konvention, du
måste tala om för datorn att dessa bitar är
kommer att lagra ett nummer -
inte ett tecken, inte en sträng, inte en flottör.
Och detta löser problemet vi effektivt
sprang in förra veckan.
Om vi ​​använder nollor och ettor siffror för att representera inte bara
siffror utan som och B och Cs, hur i hela världen är en
dator kommer att veta att detta mönster av bitar faktiskt
representerar antalet 65, i motsats till representerar
bokstaven A, som tillfällighet, enligt
ASCII, minns, motsvarade 65?
>> Så dessa datatyper ger sammanhang till datorn, så
att den vet om dessa bitar bör tolkas som ett
int eller som en sträng.
Har du frågor, då på detta?
Ja?
David J. MALAN: Bra fråga.
Om vi ​​tar ut stdio.h sparar vi filen -
Låt mig gå ner till terminalfönster och kör make matematik, zoom
in och skriv -
nu får jag en annan fel, eftersom jag är implicit
förklara vilken funktion nu?
Printf.
Så nu har jag skapat ett nytt problem, vars lösning är
väsentligen samma.
Jag måste sätta tillbaka den.
PUBLIK: [OHÖRBAR]
David J. MALAN: Åh.
Så om jag tar ut -
Okej, ja.
Så om jag tar bort standard I / O bibliotekets integration upp
Här, och sedan du säger om jag bli av med printf får
bli av med printf?
Ja.
Det borde fungera, eftersom jag inte längre använda någon - hoppsan.
Har jag ljuga bara?
Åh, okej.
Detta kommer inte att fungera på grund av ett nytt fel vi precis börjat.
Och den här är lite mer självförklarande.
>> Vad är problemet?
Oanvända variabeln n..
Så detta fel är ett resultat av att vi har konfigurerat
apparaten vara särskilt pedantisk, att verkligen skrika på
dig för varje möjlig misstag, även om det är typ av
en icke-fatalt misstag som detta - är det verkligen så stor
hantera att jag tilldelats ett int, sätta ett nummer i den och sedan
bara gjorde ingenting med den?
Så funktionellt, nej.
Det kommer inte att bryta programmet.
Det är bara typ av dumt, eller hur?
Det finns inget värde att ha bett om det numret, lagras
den i en variabel, om du aldrig kommer att göra något
med det, om skriva ut det eller spara det.
Så i detta fall klang medger så mycket, och
Det säger oanvända variabeln n..
>> Så vi kan fixa det här om vi verkligen vill.
Men återigen, det är inte bra programmering nu.
Så jag bara kunde göra detta -
gå ner här, låt mig rensa skärmen, gör matte.
Det fungerar.
Nu kan jag köra min matte program tar ingång -
Tja, det var så illa.
Tar in, och det är allt den gör, i det här fallet.
>> Så egentligen, låt oss försöka en andra hörnet så att vi
tänkte inte på tidigare.
I detta fall - här, låt oss gå tillbaka till en som är en
lite mer användarvänliga.
Låt mig gå tillbaka hit och kör make matematik igen.
Hoppsan, vad jag gör fel?
Fick rulla tillbaka ytterligare.
Okej.
Nu är vi tillbaka i sitt ursprungliga tillstånd, där alla
är förhoppningsvis väl.
Och nu om jag kör matte verkar 123 för att arbeta.
Men detta är egentligen inte en effektiv bevis för att bara säga
okej, fungerar det.
789 fungerar det.
Dags att skicka.
Eftersom det finns andra hörnet fall här.
En sträng inte riktigt ge oss mycket besvär genom att skriva i en
massa tecken.
Men om jag skriver i detta?
Att slå numret 1 en hel del, massa här -
okej, det börjar bli lite tråkigt, så jag ska
stanna här, och jag kommer att träffa på Enter.
>> Vad fan hände?
Så detta kan faktiskt förklaras.
Så tog det det som binär?
En bra tanke, men nej, det är inte det faktum att det tog
som binär, eftersom faktiskt, det var bara lite av en
tillfällighet.
Vi kan göra det igen.
Så det finns ingen 2 i det binära systemet, det är
förmodligen tillräckligt ändå.
Enter.
Så det var inte problemet.
Vad mer?
Exakt.
>> Så tänk tillbaka till vad en int egentligen är.
Det är 32 bitar som kollektivt tolkas
som ett nummer.
Om du har 32 bitar, innebär att var och en av bitarna kan vara
en 0 eller en 1, 0 eller en 1.
Så det innebär att det finns två möjligheter för denna bit,
två möjligheter för detta, två möjligheter för detta
bit - så det är 2 gånger 2 gånger -
så det är 2 till 32 effekten är det totala antalet
permutationer av nollor och ettor om du har 32
platshållare, nollor eller ettor, framför dig.
Så om jag har 2 till 32, matematiskt, det är vad?
Så det är en hel del.
Det är 4 miljarder, ge eller ta.
Och 4 miljarder verkar inte vara det som skrivs här.
I själva verket ser det närmare 2 miljarder.
Men detta är inte en tillfällighet.
Det faktum att datorn har misstolkat mitt stort antal,
min stora sekvens av ettor och sedan min stora sekvens av tvåor,
som cirka 2 miljarder kronor, förklaras hur?
Det finns ett tak för int.
Det finns en absolut ett högsta värde som du kan representera.
Men det är oftast 4 miljarder, eller hur?
Om 2 till 32 är ungefär 4 miljarder, verkar det som
Det är det största antalet.
Så inte en rest, men en bra tanke.
Negativa tal.
Så om du har 4 miljarder möjliga saker du kan
representerar dessa olika permutationer av 32 0 och
1s, ja, är det förståeligt att vi människor kanske vill
representerar inte bara positiva heltal
men negativa heltal.
Och faktiskt, det är antagandet att C gör.
Så med 32 bitar, kan du representerar ungefär negativ 2
miljarder ända upp till positiv 2 miljarder.
Och så i det här fallet, vad vi egentligen ser är bara
i utkanten av kapaciteten i vårt heltal, och vi har, så
att tala, svämmade ett heltal.
Vi har försökt att klämma fler bitar i det än kan faktiskt passar.
Så slutresultatet är vi i huvudsak har alla 1 bitar.
Vi har vänt alla våra bitar på, har vi försökt att representera
det största antalet möjliga, men det är helt klart inte alls
tillräckligt stor för att representera de två saker som jag just skrivit i.
Ja?
PUBLIK: [OHÖRBAR]
>> David J. MALAN: Bra fråga.
Varför kan vi inte står bara att negativa
underteckna som bara en karaktär?
Så vi kunde absolut, och vi kunde sedan spara
en ytterligare bit.
Men du fortfarande kommer att behöva representera den streck, och
det kommer att kosta dig åtminstone något,
förmodligen lite.
Så ja, vi kunde ha 32 bitar som används för våra nummer, men nu
Vi behöver en annan bit som används för vår streck
symbol, ett minustecken.
Så nu har vi 33 bitars värden, som vi kan göra, men det är
bara inte hur det är gjort.
Vi gjorde en bedömning samtal år sedan, är 32 bitar sortering av
måttenhet här.
Så vi kommer att använda en av dessa bitar effektivt
representerar negativitet och 31 bitar för att representera numret.
Övriga frågor?
Okej.
Det är en hel del.
Varför inte vi gå vidare och ta vår fem-minuters paus här?
>> Okej.
Så återigen, inte överbetona de matematiska tillämpningar
av programmering, låt oss plocka precis utanför detta ett exempel
innan vi går in i andra konstruktioner, bara för att det
kommer att illustrera några vanliga stapplande punkter på några av
grunderna när det gäller att skriva program.
I detta fall, gör aritmetiska uttryck som har någon
intressant relevans för syntaxen.
>> Så detta är bara en formel som vi kan konvertera
temperaturer från Fahrenheit till Celsius.
Om du inte minns, detta är bara formeln.
Så om vi ansluter i Fahrenheit värde av 32 grader, vilket är
frysning, det är kommer att bli 32 minus 32 är 0, och faktiskt,
0 i Celsius är också frysning.
Så snabb förstånd kontrollera det - det är den välbekanta formeln.
Låt mig gå över till apparaten, dock, och börja
skriva ett program som heter, som, F2C, "Fahrenheit till
Celsius punkt c. ".
Och upp på toppen här, jag ska börja med # include
stdio.h, och jag kommer att göra int main (void), och
igen, vi kommer tillbaka i framtiden vad int betyder
där och vad tomrum innebär att det.
Och låt mig nu gå vidare och genomföra ett program som
huvudsak gör denna konvertering för oss.
>> Så printf, låt oss säga, temperatur i Fahrenheit.
Och låt mig gå vidare och få värdet från användaren.
Vilken typ av värde ska jag ta från användaren om jag vill
dem att ge mig en temperatur i Fahrenheit?
Ja?
Vad skulle du föreslå?
Ja.
Så float känns ganska rimligt.
Vi har återigen några alternativ som
vi har sett hittills.
Vi har saker som röding, dubbel, flyta, int, long long,
bool, sträng.
Så av dessa känns flyta ganska rimlig.
Vi skulle kunna använda en dubbel, höger, för om vi verkligen vill
representerar en människas temperatur -
98,60000 -
vi kunde använda 64 bitar för att göra det, men det känns som
overkill för temperaturen.
Så låt oss bara gå med flottör.
Nu behöver jag en variabel.
Bara för att hålla det enkelt, jag kommer att kalla det f, men jag
kunde lika rätt kalla det temperatur,
men antingen är bra.
Så flyter f = getFloat.
Så fort jag nu har beslutat att använda getFloat, men jag
behöva göra en korrigering.
Ja.
Så vi måste # include , annars kompilatorn är
kommer att skrika på oss.
Nu när jag har en flottör, låt mig gå vidare och göra det
omvandling.
>> Så först, låt mig också vänja sig här om
kommentera min kod.
Så återigen, är en kommentar bara en notation till människan som är
inte en del av programmet i sig, men det en, hjälper dig
förstår vad du gjorde nästa morgon, eller nästa
månad, det hjälper din undervisning karl förstår vad du gjorde
eller vad du tänkt göra, så det är
generellt mycket god praxis.
Med några rader kod, skriv en kommentar
dig själv eller din kollega.
Så här, jag kommer att säga, "Be användaren för temperatur."
Behöver inte vara en fullständig mening, bara en kort fras.
Men tanken bakom kommentera i C är att alla dina
synpunkter bör ge dig - eller, säg, en TF eller en kollega -
att skumma ditt program och vet exakt vad den gör, genom att inte
så mycket att läsa koden, men genom att läsa kommentarerna, som
bör vara koncis och tydlig.
Okej, så nu låt mig gå vidare och säga, "Konvertera
Fahrenheit till Celsius. "Så jag ska gå vidare och göra,
låt oss säga, flyta c..
Vi håller Celsius som ett flyttal värde.
>> Och låt mig ta ett hugg på det här.
Formeln är, återigen, här uppe.
Som 5/9 ggr F minus 32.
Så låt oss göra det här.
Så 5 dividerat med 9, minus -
hoppsan, trasslat jag upp redan.
Gånger.
Så 5/9 ggr F minus 32.
Så F minus 32, semikolon.
Och nu, här nere, jag ska gå vidare
och säga, skriv ut resultatet.
Och denna del är lätt. Printf.
Hur gör jag för att skriva ut detta?
Tja, jag kunde säga "Det antalet i Celsius är% f \ n",
bara för vissa estetik.
Och vad värde vill jag koppla in här som printf s
andra argument?
Okej.
Så bara c..
Så vi börjar med det här och sedan bara returnera 0.
Återigen, det har inget att göra med matten.
Det betyder bara allt är bra.
>> Nu är detta korrekt, det här programmet?
Okej.
Så jag har gjort några misstag.
Även om du har ingen aning om vad programmering är, kan du sortera
av sluta sig till grundskolan vad
misstag här kan vara.
Vad är en av de första?
PUBLIK: [OHÖRBAR]
David J. MALAN: Ja.
Så vi saknar parenteser.
Det var avsiktligt att jag gjorde parenteser i grundtonen
glida här, eftersom det finns faktiskt denna uppfattning av ordning
av verksamheten, eller företräde, varvid vissa verksamheter -
multiplikation -
har högre bindande, har högre prioritet, än saker
som addition eller subtraktion.
Så vi har gjort detta i flera år bara för att klargöra exakt
vad matematisk operation bör göras först.
Så jag skulle nog efterlikna just detta.
Annars är datorn går förmodligen att försöka göra
något som klyftan 5 av 9, sedan multiplicera F, sedan subtrahera
32 från det hela.
Vilket faktiskt inte vad vi vill göra.
Så låt oss INSKJUTA SOM PARENTES.
Låt oss lägga till mina parenteser här, parenteser här.
Låt oss sätta detta här.
Här märkte jag bara ett misstag jag gjorde på vägen.
Ja?
PUBLIK: [OHÖRBAR]
>> David J. MALAN: Ah.
Bra.
Så vi har faktiskt samma heltal
division fråga från förr.
Jag rätta att, låt oss se vad symtomet är.
Men vi kommer att behöva rätta till ett
andra misstag här.
Ja?
PUBLIK: [OHÖRBAR]
David J. MALAN: Ja.
Så dumt misstag som jag gjorde, men oerhört viktigt.
Datorn kommer inte att bara blunda och låta
mig använda kapitalet F, när jag faktiskt deklarerat variabeln
som ett gement f här, i linje 8.
Så jag behöver korrigera i linje 11 min kapitalisering, som en
stund sedan var ett kapital F av misstag.
Vad om här?
Skulle detta vara gemener också?
Det bör vara, men det är en tillfällighet.
Denna% f har ingenting att göra med variabeln.
Så bara för att vara super tydlig här, låt mig gå vidare och
byta namn på, kortfattat, "temperatur". Låt mig döpa
detta "temperatur". Låt mig inte att byta namn här.
Jo, en gång,% f globalt betyder "flyttal."
Har ingenting att göra med min variabel.
Men "temperatur" överallt är bara lite ordrik,
så jag kommer att gå tillbaka till min gement "f" s.
>> Låt mig nu gå vidare ner till mitt fönster här.
Gör f2c -
vilket återigen den godtyckliga namn jag
gav till den här filen.
Verkar har sammanställt.
Låt mig köra f2c.
Enter.
Temperatur i Fahrenheit - låt oss göra lätt.
32.
OK, korrigera.
Men om jag gör nu 212 för kokning -
fan.
Okej.
Så klart inte korrigera om din TF försöker
minst två värden.
Så vad är problemet här?
Tja, lägger du redan fingret på vad problemet är.
Men varför är det så?
Här uppe, när jag gör matten av 5 dividerat med 9.
Så begreppsmässigt, det helt rätt.
Helt i överensstämmelse med formeln.
Men datorer gör bara precis vad du
berätta för dem att göra.
Och vad vi faktiskt säger datorn här är
dela heltalet 5 av heltalet 9
och ge mig resultatet.
Problemet är, men när du gör division med hjälp av data
typer, är utsignalen samma datatyp som ingångarna.
Och så om de två ingångarna är båda Ints är utgången går
att vara en int.
Och så 5 delat med 9 är punkt något.
Men vad är det närmaste heltal till punkt något?
Så det är faktiskt 0.
Så som vi diskuterade på måndagen, allt efter decimalkommat
punkt blir trunkerad.
Det blir bara kastas bort.
Så detta är ett komplett misstag, eftersom jag kan lika gärna
multiplicera allt med 0 här.
>> Nu kan jag fixa detta på ett par olika sätt.
Jag kunde göra detta.
5,0 dividerat med 9,0.
Tekniskt, jag behöver inte ens göra det.
Det räcker att bara göra en av de nummer en flottör -
eller dubbel - genom att decimalkommat här.
För vad händer nu är när du delar ett heltal av
en flottör, eller en dubbel, är datorn kommer att inse
Åh, är en av de mer exakt.
Låt mig fela på sidan av att ge dig mer precision än
du tänkt.
Så det kommer att konvertera resultatet -
den kommer tillbaka resultatet som ett flyttal värde också.
Så det skulle fungera.
Detta skulle fungera.
Och det finns en annan mekanism som vi ser i
närmare nästa vecka.
Du kan faktiskt, som programmerare, tala om för datorn
att faktiskt behandla en datatyp som
även om det var en annan.
>> Så jag kunde faktiskt göra detta.
Inom parentes kan jag säga något i stil med (float), öppen
paren, nära parentes.
Och detta är vad som kallas "gjutning." Återigen, mer
på detta nästa vecka.
Men detta är bara programmatiska sätt att berätta
datorn, ja jag vet 9 är ett heltal eller en lång.
Jag vet att det inte är en flyttal värde.
Men behandla den som sådan i alla fall.
Så för att kasta en datatyp innebär att omvandla
från det ena till det andra.
Ärligt talat, det är bara lite ful, så jag skulle föreslå att vi går
tillbaka till det ursprungliga förslaget för att bara konvertera
dessa saker till flyttal värden manuellt.
För nu är det bara super tydligt vad som händer, och
det är inte allt som störande.
>> Så låt oss nu gå tillbaka till mitt terminalfönster.
Gör f2c.
Låt mig gå vidare och köra.
Och som en sidoreplik, får du uttråkad skriva dessa kommandon
om och om igen, inse att datorer, som Linux här,
tenderar att vara ganska smart.
Och om jag slog upp, kan vi gå igenom hela min historia
kommandon, upp och ner.
Så i detta fall här, kan jag bara gå upp för att köra göra f2c.
Jag blir skrek åt, eftersom jag bara gjorde det för en sekund sedan.
Det är redan aktuell.
Så nu kan jag köra f2c igen.
Låt oss försöka 32 Fahrenheit.
Nu ska vi försöka 212 Fahrenheit.
>> Puh.
Verkar fungera.
Nu är det bra, men det känns lite godtyckligt att
Jag visar sex siffror efter decimalkomma.
Eller hur?
Om du är vädret personen på TV, du typ av Doofus
om du läser av temperaturen till
denna grad av precision.
Så låt oss förenkla detta.
Så låt oss faktiskt gå upp här, till min printf.
Och ja, jag vill flyta.
Men jag vill nu ange precisionen.
Och jag kommer att vara lite kortfattad.
Jag ska säga, ge mig en punkt efter decimal.
Så i stället för att säga% f, jag kommer att säga% .1 f.
Och detta betyder bara ge mig en plats
efter decimalkommat.
Okej.
Låt oss prova det här igen.
Låt mig köra det efter kompilering.
Och nu har jag skriver i 32, och jag får tillbaka en
mer kortfattad värde.
Och jag kan skriva i, nu 212, och få tillbaka en mer kortfattad
värde samt.
Och det finns andra saker du kan göra med printf.
Du kan faktiskt ange hur stort antalet ska vara.
Om du vill ha stoppning på det, så att du kan högerjustera eller
vänster-align alla dina nummer eller
Försök till centrum saker.
Så inser att det finns små knep man kan göra där.
Men de koka bara ner till formatkoder,
som vi har där.
>> Så när det gäller det här numret av företräde.
Detta är en mycket tråkig bord att gå igenom metodiskt.
Men inser att författarna av C har kommit upp med
regler som anger vilka operatörer har högre
företräde, mer bindande kraft, än andra.
Så medan i grundskolan, visste vi i allmänhet att det var
multiplikation och division, sedan addition och subtraktion,
sedan några andra saker.
I en värld av programmering, det finns en mycket
längre lista över saker.
Och detta är inte något som är värt att memorera nu.
Du ska få acklimatiserad till det snart.
Men precis som i grundskolan, parenteser löser allmänhet
frågor om företräde, genom att super klart för
dator och människa både vad som avses.
Så anser att detta bara lite fusklapp där.
Men de flesta av dessa detaljer som vi inte kommer att få en tid.
>> Okej.
Nu ska vi bygga upp och röra sig bort från dessa fåniga små
matematiska exempel.
Fortfarande använder samma fundamenta, men börja
uttrycka oss lite mer som Scratch.
Så i Scratch hade vi dessa booleska uttryck.
Och på engelska, är ett booleskt uttryck vad?
Sant eller falskt.
Det är något som utvärderas till sant eller falskt.
1 eller 0.
På eller av.
Vad du än vill kalla det.
Nu i Scratch, såg pusselbitarna så här.
Och det är kombinationen, på botten där, på tre
pusselbitar.
En kombination -
något som har tomt och tomt.
Och sedan två booleska uttryck i den.
Så du kan kapsla booleska uttryck för att få mer
komplicerade booleska uttryck.
Till exempel, om det är lördag, och det är trevligt
väder, gå utanför.
Eller något godtyckligt sådant.
Så du kan gå booleska uttryck för att komma fram till en
större sanning värde, vars svar är baserad
på de mindre.
>> Nu i C, tack och lov, är denna kartläggning
faktiskt ganska enkelt.
Parenteser bidra till att göra saker och ting klara här.
&& Är vad betyder "och". Så det är hur
vi kommer att omvandla dessa block från Scratch till C.
Och för de förhållanden som vi såg i Scratch, till vänster
sida där kan jag stapla dem på samma sätt i C. Om x är mindre
än Y, sedan göra det.
Else if x är större än y, så gör det.
Annars logiskt att de måste vara lika, så att säga
att de är lika.
Så vi kan nu börja bygga dessa saker.
>> Så låt oss göra ett exempel.
Låt mig öppna upp en fil som är på kursens webbplats som
Jag skrev i förväg.
Det kallas nonswitch.c.
Och vi får se varför bara ett ögonblick.
Så i den här filen - nonswitch.c--
först inse att det finns en hel massa
kommentarer på toppen.
Som bara förklara namnet på filen, vad den
gör, och så vidare.
Och det visar tydligen att använda Boolean AND-ning -
conjoining två uttryck.
>> Så låt oss se hur det här programmet fungerar.
Jag har mina två filer, cs50.h och stdio.h.
Om jag bläddra ner, nu till programmet, är det lite längre
än vi har skrivit tidigare, men ganska lättläst.
Så jag skriva först till användaren, på linje 18,
"Ge mig ett heltal mellan 1 och 10." Så
Det är just där.
Nu får jag heltalet.
Men inser att getInt - ganska enkel.
Det kommer bara att få en int.
Det kommer att se till att det blir en int och inte en
sträng eller en flottör.
Men det kommer inte att göra någon form av gräns kontroll.
Det kommer inte att filtrera siffrorna till mellan en
visst intervall.
Så vi måste genomföra det själva.
Så precis som i Scratch, där jag kunde göra en kombination av
två uttryck, kan jag göra det i C enligt följande.
Om n är större än eller lika med 1, och n är mindre än och
eller lika med 3, kommer jag att mycket godtyckligt dekret som
nummer att vara ett litet antal.
Bara för att ett uttalande.
Else if n är mellan 4 och 6, print "Du valde ett medium
nummer. "Else om n är mellan 7 och 10, tryck" Du valde en
stort antal. "Else print" Du väljer ett ogiltigt nummer. "
Eftersom logiskt följer att om vi har
uttömt vårt sortiment.
>> Så inser detta är inte riktigt hur vi skriver större än eller
lika med en matte klass.
Eller hur?
Du ritar brukar det så här, med linjen under den.
Men det finns ingen sådan knapp på mitt tangentbord.
Så symbolen i C för att uttrycka större än eller
lika med är två tecken och symbolen för mindre än
eller lika med är två tecken också.
Okej.
Så om jag kör det här programmet kan du nog gissa vad det är
kommer att göra.
Om jag gå vidare och göra nonswitch, Enter.
Och kör sedan nonswitch.
Ge mig ett nummer mellan 1 och 10.
Jag ska ge det 11.
Jag plockade ett ogiltigt nummer.
Låt mig försöka siffran 3.
Jag plockade ett litet antal.
Så ganska enkelt där.
>> Vad händer om jag vill ändra beteendet hos detta program och
göra något lite annorlunda istället?
Låt mig gå vidare och säga detta.
Låt mig bli av med allt detta.
Och låt mig säga om (n == 42).
Och då ska jag gå vidare och säga print "Du valde
rätt svar. "Annars kommer vi att gå vidare och säga,
printf ("Du valde
fel svar "),. Okej.
Bara för att.
>> Nu, några punkter vi kan göra här.
En, jag skriver inte den symbol som man skulle kunna tro är
mest rimliga.
När jag vill kontrollera jämställdhet visar sig att du inte använder
likhetstecken.
Du använder istället lika likhetstecknet.
Och varför skulle det vara, bara intuitivt?
Ja.
PUBLIK: [OHÖRBAR]
David J. MALAN: Rätt.
Likhetstecknet används redan för tilldelning.
Någon har inte riktigt tänka igenom det här.
Och så nu, när det kommer till jämställdhet tester måste vi
vara mer explicit, och säger lika jämlikar.
Ett mycket vanligt misstag är att göra detta.
Och om i kontorstid eller någon gång nästa vecka eller i
nästa två veckor du göra något liknande och sedan
kämpa med det för 10, 20 minuter att försöka lista ut
vad den jävla bugg är, inse att du är en av dem
människor som gjort detta misstag.
Så super lätt att göra.
Men målet är nu att avvärja detta misstag.
Detta kan utvärdera eftersom det är det verkligen säger?
Om n får 42.
Så verbet människor använder, verbalt, att uttrycka
begreppet uppdrag är "får". Så om n får 42.
Så betyder tilldela 42 till n.
Nu har jag ett booleskt uttryck inom parentes,
insidan av detta tillstånd, är det värde 42.
Eller hur?
För om du utvärdera den inifrån och ut, det totala
svar, nu är 42.
>> Så om jag frågade dig frågan, "om (42)," vad är
att säga egentligen?
Tja, kan booleska uttryck endast sant eller falskt.
1 eller 0.
På eller av.
Så vi verkar ha ett hörn fallet här, där alla en
plötsligt, jag säger "om (42)". Det är inte ett booleskt värde.
Så vad datorer gör, är det dock i huvudsak motsvarar
något som inte är 0 tolkas för att vara sant.
1.
På.
De är alla funktionellt likvärdiga.
Endast värdet 0 eller nyckelordet falska, som vi ska
småningom se, är faktiskt falskt.
Så "om (42)" skulle faktiskt vara sant, eftersom det är icke-noll.
Så för att vara mer exakt här, är ett booleskt värde egentligen inte så
mycket sant eller falskt, men för detta
fallet, om är 0 eller icke-noll.
Så falsk eller inte falsk.
Och det gör att vi kan omfatta allt mer
möjligheter i uttrycket inom parenteser.
Så vi måste, aldrig så noga, säger detta -
if (n == 42).
Helt enkelt därför att vi måste ange ett test av jämlikhet,
inte en överlåtelse av ett värde.
>> Vad är värt att notera här?
Dessa klammerparenteser är faktiskt inte nödvändigt.
Jag har gjort dem bara för att vara nit-kräsen här.
Men när du har ett tillstånd som bara har en rad av
kod, som en bekvämlighet, behöver programmerare inte använda
klammerparenteserna.
Det räcker att bara strecksatsen, av estetiska skäl, och
Skriv sedan kodrad.
Först när du vill skriva två rader kod - för
exempel, annars printf ("Hej!"). Om du vill göra
att detta bryts.
Du kan dra allt du vill, men det faktum att du har
skrivit två rader kod utan att använda klammerparenteser
innebär att detta program inte skulle fungera eller kanske
inte ens kompilera korrekt.
Så för nu, för att vara ärlig, jag tror det bästa vana är bara
Använd klammerparenteser, och du kommer att upptäcka att de gör
Super Clear vad som händer.
>> Också, som en parentes - särskilt om du är bland dem som använder
de rekommenderade böcker eller resurser på nätet -
inser att det är det här begreppet stil i
programmering.
Och en del människor föredrar faktiskt att sätta klammerparentes
hit på en linje.
Vissa människor föredrar att göra löjliga saker,
gillar ställa dem här.
Det finns ingen fel svar när det gäller
stil, men det är fel.
Men vissa människor gör det.
[Skratt]
David J. MALAN: Så jag nämner detta nu, helt enkelt eftersom så
du läser upp på saker i böcker eller på nätet, du kommer att få
olika budskap från olika lärare och
olika författare.
Och bara inse att, funktionellt, de är
generellt likvärdiga, men vara konsekvent.
Så i det här fallet kommer vi standardisera på lockigt
hängslen kö här till vänster.
>> Okej.
Så låt oss gå vidare nu och kör detta, och se vad som händer
med detta program.
Gör nonswitch.
Kör sedan nonswitch.
Ge mig ett heltal mellan 0 och - så det är inte relevant
längre, men jag ska bara godtyckligt säga 42.
Och jag valde det rätta svaret.
Nåväl nu, låt oss faktiskt ta i en annan riktning.
Det visar sig att det finns någon annan syntax vi
kan använda i ett program.
Här är en ny bit av syntax som är funktionellt densamma,
men bara inför ett annat sätt att uttrycka oss själva.
Så detta är vad som kallas en "switch uttalande." Och en
switch-programsats fungerar enligt följande.
Det tar, inom parentes, ett värde som du vill
"Switch" på.
Du vill bete sig annorlunda baserat på dess värde.
Så detta betyder slå på värdet på n.
Och vad betyder det?
Tja, om n är 1 eller 2 eller 3, gå vidare och skriva ut "Du
plockade ett stort antal "och sedan bryta.
Anledningen till avbrottet är att det sätt C fungerar är som
snart den finner ett fall som matchar, börjar det köra
all kod under den.
Så om jag har en rad kod, som jag gör här på rad 27, den
blir exekveras.
Om jag lägger en annan linje här, det blir avrättas.
Annan linje här, det blir avrättas.
Programmet stoppar endast utföra vad under
tillämplig fall uttalande när jag uttryckligen
säga "gå sönder." Så fel.
Rätt, i detta fall, som följd.
Fall 4 eller 5 eller 6, på liknande sätt, kommer
att skriva ut ett budskap.
I detta fall, medelhög nummer.
Sönder.
Fall 7, 8, 9, 10, det kommer att skriva ut "Du valde en stor
nummer. "Break.
Och sedan finns det bokstavligen ett sökord som kallas "default"
Det är faktiskt som "annat" konstruera.
Så ny syntax, men intellektuellt,
ingenting alls nytt här.
Det är precis som Scratch.
Om annars om, annars om typ av block.
>> Så det är bytt versionen av detta program.
Men märker att vi gjorde det med siffror här.
Låt mig öppna upp en andra version, bara för att visa
något lite mer konkret.
Så här har vi betyg i stället.
Det visade sig att du kan använda växlar inte bara på heltal, utan på
tecken.
Inte i alla datatyper, men åtminstone på tecken.
Så här skulle vi kunna göra något liknande om värdet på C som
användaren har skrivit in i ledningen 19, genom att använda getchar funktionen,
är huvudstad A eller gemener en, låt oss tolka det som en klass,
och säger att de valde en utmärkt kvalitet.
Och ner längs switch, har vi andra
fall för "B" s och "C" s, och så vidare.
Men låt oss nu spetsa en annan sak.
Och återigen, typ av flyger genom
några av dessa exempel.
Men det är verkligen så att vi kan använda dem, nu -
eller egentligen bara översätta dem nu -
till C.
>> Så låt mig gå vidare och göra det.
Jag ska öppna upp en ny fil.
Och jag ska göra inkludera .
Och då ska jag göra int main (void).
Låt mig spara filen som en loop.c.
Bara som ett exempel.
Och jag kommer att gå vidare och gör följande.
Jag vill skriva ett mycket tungt program.
Så 10.
Låt oss göra detta.
9.
Okej.
Så snart du börjar göra detta i programmering, du
förmodligen gör något fel.
Men vi börjar där ändå.
Oops.
Det är faktiskt fel.
7.
6.
5.
4.
Inget kommer att hända när vi kommer till 0.
3.
2.
1.
Okej.
0.
Ta bort.
>> Okej.
Så tillbaka 0.
Så det här programmet är uppenbarligen kommer att göra vad det mycket
tediously säger att det kommer att göra.
Det kommer att skriva ut alla dessa
värden, från topp till botten.
Så låt mig göra göra slinga.
Och sedan - hoppsan.
Gör slinga.
Jag var i fel katalog.
Och låt mig nu kör slingan.
Enter.
Woohoo.
Mycket trevligt.
Trevligt, långa programmet.
>> Okej, men nu ska vi göra det här bättre.
Precis som i Scratch, när du började använda en looping
konstruera, istället för att bara kopiera och klistra in alla
pusselbitar, låt mig presentera här.
Så i C, finns det olika looping konstruktioner,
en av som ser ut så här.
A "för" loop har tre saker, åtskilda av två semikolon.
Och därefter, inuti kroppen hos slingan, så att säga - det
grejer insidan av klammerparenteser -
vi kan göra något och om igen.
Så vad jag har här på skärmen, är detta
bokstavligen bara en kommentar.
På / / betyder här kommer en kommentar.
Detta är inte kod.
Detta är bara på engelska, för mig, det mänskliga.
>> Så initieringar, villkor och uppdateringar.
Nåväl, låt oss se hur det fungerar.
Detta gör att jag kan skriva om det här programmet som följer.
För -
så här kommer min loop -
int i -
här kommer en variabel som heter "i" -
blir initieras till 10.
Så det är min initiering.
Jag vill göra denna slinga så länge "i" är större än eller
lika med 0.
Och på varje iteration av denna slinga, vill jag
att göra i. -.
Så vi såg + + på måndag.
- Är det motsatta.
Det minskar värdet med 1.
Inuti denna slinga, jag vill verkligen göra något.
Så jag kommer att säga något i stil printf.
Jag vill inte säga 10 nu, eftersom det uppenbarligen är bara
kommer att skriva ut samma värde.
Vad vill jag skriva ut istället, förmodligen?
Ja.
Så "jag." Så% d, dvs.
>> Så jag kommer att stjäla en av dessa idéer från tidigare -
denna ersättning för formatkoder -
och sedan ner här, längst ner, jag återkommer 0, bara
för bra åtgärd.
Men nu har jag en mer kortfattad program.
Det är bara några få rader, och inte några 10 eller 11 rader.
Låt mig gå till min prompt här nere.
Remake slinga.
Kör slinga.
Och det verkar vara samma.
Nu är programmet inte mer intressant.
Men nu kan jag skriva ungefär så här.
Jag kan ändra detta till 100.
Jag kan då kompilera mitt program.
Och då kan jag köra mitt program.
Och nu går det supersnabbt på dagens datorer.
Men jag har -
och faktiskt, gör min scrollback buffert inte
ens gå så långt.
Där kör vi.
Så där har vi alla 100.
Men det är lätt att göra misstag här.
Vad kommer att bli det förväntade beteendet om jag
misstag göra det?
Så det känns som oändligt.
Så låt oss se om datorn fungerar.
>> Så låt mig gå vidare och göra ögla.
Och låt mig köra slingan.
Så låt oss återkomma till detta på bara ett ögonblick.
Vi låter som körs.
För vad ska vi räkna upp till minimalt?
Förmodligen minst 2 miljarder, om vi har så många bitar, och
vi använder positiva värden.
Så låt oss hoppa tillbaka hit.
Förutom dessa typer av slingor, har vi så kallade medan
slingor. Så, precis som i Scratch, hade du alltid
block, och du hade Upprepa block.
Även i C har du bara andra sätt
att uttrycka sig själv.
Så du har den här föreställningen om en while-slinga som låter dig
uttrycka dig lite annorlunda.
Och då har du något som kallas en gör-while-slinga,
som fungerar lite annorlunda också.
Och vi kommer att reta dem isär med tiden.
>> Men låt oss ta en titt på denna sista här.
Om vi ​​går in -
fortfarande körs.
Det är ganska oändlig.
Så låt mig gå in positiva, och visa hur vi faktiskt kan
styr inmatning lite mer effektivt.
Det är en ganska kort program.
Och här har vi i huvudsak en int n deklaration.
Så ge mig en variabel som heter N. Nu säger jag bokstavligen
"Göra". Och då har jag öppet lockigt
stag, nära klammerparentes.
Och sedan märker direkt efter det, säger medan N
är mindre än 1.
Så märker att dessa rader -
19 till 24 -
komponera kollektivt en gör-while-slinga.
Och återigen, ny syntax, inte en ny idé.
Det är bara ett annat sätt att looping, syntaktiskt.
Så vad gör det?
Gör följande när n är mindre än 1.
Så vad vill jag göra?
Jag kräver att du ger mig ett positivt heltal.
Sen försöker jag faktiskt få ett heltal från användaren.
Men när det gäller ordningen verksamhet här, eftersom
medan tillståndet är här nere, jag sedan kommer att kontrollera, är n
mindre än 1?
Så antar att användaren -
efter att ha krävt på detta sätt -
typer i värdet 0.
Detta tillstånd kommer att vara sant eller falskt?
Tja, det kommer faktiskt att vara sant.
Eftersom n är 0, och 0 är mindre än 1.
Så vad innebär det?
Göra det igen.
Bara en gång detta villkor utvärderas till false.
Om jag skriver in 42.
Tja nej, 42 inte mindre än 1.
Därför denna slinga sker utför.
Och så på den punkten, kommer programmet att säga, tack för
den 42, i detta fall.
Nu när du har detta sätt att uttrycka sig själv -
Vi bör inte vänta för att avsluta.
Det kommer att ta lite tid.
Fortsättning nästa gång, kanske.
>> Men nu har du möjlighet att förhoppningsvis förstå en
lite Geek humor.
Ber om ursäkt.
Detta är inte representativt för humor i datavetenskap
världen, men det är gulligt.
[Skratt] Låt oss slutet på denna anmärkning.
Och vi kommer att se dig på måndag.
[Applåder]