[Powered by Google Translate] DAVID J. Malan: Okay, det er CS50, og det er
slutningen af ​​uge 1, så undersøgelse kort er i og det samlede antal
klassekammerater, at du har dette år er 745.
Og vi er så glade for at have så mange af jer i løbet
dette semester, men selvom dette kursus er så stort,
indse, at det er disse ting som fredag ​​frokoster, ligesom
kontortid, 15-personers sektioner og så videre, at
er virkelig meningen at skabe denne mere intime
miljø.
Så selv om vi måske samle en gang eller to gange om ugen, her i
Sanders, ved, at meget af din erfaring på dette kursus
vil meget være hands-on på siden af ​​dine klassekammerater
og underviserne.
>> Så her vi går, Fall 2012.
Så minde om, at sidste gang, vi endte på et notat af
upræcist, taler om repræsentation af tal.
Og vi kiggede på en af ​​de fejl, der skete i
virkelige verden, når det kom til misforståelse
hvordan computere fungerer.
Nå, i dag vil vi gense en anden af ​​disse ideer
samt fortsætte vores diskussion af CS50 klient
og C og hvad det betyder egentlig at programmere.
Men først lige et par hvirvelvind annonceringer.
>> Sektioner begynder denne søndag, og den første uge er altid en
lidt af en hurtig start, fordi vi har lige fået i
din afdeling formularer.
Vi gør det samme, nu med undervisningen stipendiater, nu
at de kender deres tidsplaner, så vi sigter, ved
Lørdag morgen, for at følge op med dig med din afdeling
opgave og TF.
Erkend, at de vil starte næste dag, søndag
eller mandag eller tirsdag.
Og så vil vi rumme afsnit ændringer, som de opstår
i de kommende dage.
Kontortid, i mellemtiden, er, igen, i aften, 8 PM til 11,
Annenberg, samt i morgen aften.
Selvom problemet sæt skyldes generelt om torsdagen
ved middagstid, indser du har op til fem sene dage at tilbringe,
dermed tilgængeligheden for kontortid om torsdagen, hvis
du kontanter i en af ​​disse sene dage og dermed indsende
noget på fredag.
Lad mig foreslå, at Scratch er blandt de sjovere, blandt
mere lav centrale problem sæt.
Og jeg vil hænge på de sene dage, strategisk, bare
til senere i det semester, hvor livet begynder at komme i vejen
med midterms og andre klasser.
Problem Set 1, i mellemtiden ville blive lagt ud på kursets
website denne fredag, som det vil være på kurset gang
gennem video, som vil blive filmet på 2:30 PM på fredag
og derefter lagt online ved den næste dag.
>> Så vi endte på mandag.
Jeg vil gerne - faktisk, man bemærke her.
Fordi klasser - fordi Sanders ikke ligefrem egner
sig til afslappet Q & A frem og tilbage frygtelig godt, vi er
vil prøve noget lidt nyt i år, hvorved
hvis du ikke er behageligt at hæve din hånd, eller du bare
ville hellere ikke hæve din hånd i et rum som dette,
vi skal have nogle af de pædagogiske stipendiater og CA
bemanding cs50.net/discuss under forelæsning.
Så hvis du har et spørgsmål, fordi jeg var helt
uklart om noget eller du er nysgerrig om nogle
emne, kan du prøve udstationering det der.
Tag den med en etiket af Forelæsning, og vi vil gøre vores bedste
i dag og i næste uge - we'll prøve dette - at området det
enten elektronisk, online, eller hvis det føles som om vi skulle
virkelig behandle det i massevis, en af ​​de pædagogiske stipendiater eller
CA'er vil hæve deres hånd og bede
anonymt på dine vegne.
Så vi vil give det en chance og se, hvor godt det virker.
Men, med alle midler, fortsætte med at hæve hænder, som du ønsker.
>> Så sidste gang vi viste, at 10% eller en tiendedel ikke er i
kendsgerning, 0,1, ligesom du er blevet instrueret mange år siden.
Det er i virkeligheden en værdi som dette.
Men det er ikke helt sandt, ikke?
Vi har bare denne begrænsning i computere, hvorved, hvis du
har kun en begrænset mængde hukommelse, RAM eller flere
specifikt bits, ja, der er kun et begrænset antal
af ting, du kan repræsentere.
For eksempel har vi, hvis vi har tallet nul, og ønsker at
repræsenterer i binær under anvendelse af otte bits, hvis en smule,
igen, er et nul eller én, vi måske
repræsentere det som 00000000.
Og det er lidt unødigt detaljeret.
Ligesom i den decimal system i den virkelige verden,
generelt, hvis du ønsker at skrive nummeret 123, vi
mennesker sandsynligvis ikke skrive 00000123, selv om
funktionelt, det er nøjagtig samme nummer.
Vi har lige droppe nuller, så at sige.
>> I binær, kan vi gøre det samme.
Binær og nul, nul og binære er bare nul.
Du behøver kun en enkelt bit.
Men igen, den mest almindelige måleenhed i verden
af computing er bytes, otte bits.
Bare fordi en bit, temmelig ubrugelig.
Otte bits, ikke frygtelig nyttige, men mindst det er mere
anvendelig end en enkelt måleenhed.
Så med otte bits, vil vi typisk repræsentere binære.
Så her har vi numrene nul, et, to, og derefter, som
Nate gjorde i vores video sidste onsdag, kan vi fortsætte
tælle op til syv, til otte.
Og så hvis vi bruger flere og flere bits, vi
kan tælle op til uendeligt.
Men hvis du kun har et begrænset antal af disse bits, som er
tilfældet i ethvert computersystem, eller endog missil
system, ja, ja du kun har et
endelig mængde præcision.
Så hvis du ønsker at repræsentere tal som 0,1, godt,
computer har at vælge og vrage.
Og hvis det kun har et begrænset antal numre det kan
repræsenterer, kan det komme tæt på 0,1 for dig, men det kan ikke
nødvendigvis giver dig præcis den værdi, du ønsker.
Og det er blot en af ​​de udfordringer, computere,
under hætten. heldigvis
>> Efterhånden som vi bevæger længere i semestret, disse lavere niveau
detaljer bliver meget mindre interessant, men helt sikkert
anvendelse af disse ideer kan have nogle meget virkelige verden
forgreninger.
Den ene er en smule sjov.
Hvor mange af jer har set den fantastiske film Office Space?
Hvis du ikke har, det er din uofficielle
lektier for ugen.
Men i Office Space, tage stipendiater i den film
Fordelen ved netop denne idé, men de faktisk stjal
det fra en anden film, som du måske har
set, lige år forud.
Så lad mig give dig et par sekunder af denne trailer fra
denne fantastiske film, og det er meget
fagligt relevant.
>> [SPILLER MOVIE]
Faktisk Jeg bliver forfremmet.
Jeg kan programmere en virus, der vil rippe at
placere off big tid.
Nå, hvordan virker det?
Hver gang der er en bank transaktion, hvor interessen er
beregnede, der er tusindvis om dagen, computeren ender
med disse brøkdele af et cent.
Men jeg har ikke tænkt mig at gøre noget ulovligt.
Ulovligt? Samir, det er Amerika.
Du er nødt til at sværge til Gud.
Hvis ingen kender dette, men os, okay? Ingen familiemedlemmer, ingen
veninder, ingen.
[Uhørlig].
Bare rolig, mand, jeg vil ikke sige det til nogen enten.
[Filmen slutter]
>> Okay, så måske jeg fandt denne film bedre end de fleste
mennesker her, men under alle omstændigheder, virus, at de var
forsøger at skabe -
og i film, når som helst de ville kalde noget en virus,
Det er generelt ikke en egentlig virus.
Det er bare et program, at nogen skrev at gøre noget.
Og i dette tilfælde blev de fyre forsøger at skrive et program
der benyttede sig af deres firma kaldet Innotech s
computing system, hvor computere, også selv når det
kommer til penge, kan ikke nødvendigvis
repræsenterer penge præcist.
Så selvom du måske har $ 0,10 på din bankkonto,
0,10, godt, kan computeren rent faktisk tror, ​​at du har
så mange cents i din bankkonto.
Og hvad så disse fyre der ønsker at gøre - og de
stjal ideen, viser det sig fra Superman III, hvor
Richard Pryor gjorde det samme - de var hovedsagelig
skrive programmer, der stræber efter at tage alle de bageste
numre, alle de små, små, små fraktioner af
småpenge, og hævertvirkning dem væk, så mennesker bare
tanke, åh, det er kun $ 0,10 der, men alle dem
afsluttende numre til sidst tilføje op.
Så en vidunderlig idé, og det bagslag afsindigt i at
bestemt film.
>> Men i den virkelige verden, er der også meget mere om
konsekvenser af disse slags ting.
Og en af ​​grundene til at dykke ned inden for computer
videnskab er igen dens anvendelse ikke til
ingeniørvidenskab alene, men blot at
andre felter.
Så dette er en mindre munter kig på, hvad der kan gå galt, men
det er også helt øjenåbnende, tror jeg, når det kommer til
forståelse præcis hvordan allestedsnærværende teknologier som
computere og programmering eller i disse dage,
i form af software.
Så dette næste klip er bare om seks minutter, fortsætter
hvor vi slap sidste gang, men giver os mulighed for at se lidt
mere i dybden på en sådan af disse spørgsmål.
Lad mig gå videre til hvor vi slap,
som var lige her.
Og vi har en del to af to, for omkring seks minutter her.
>> [PLAY MOVIE]
Plaget moderne raketteknologi.
I 1991, med starten af ​​den første Golfkrig Patriot
missil oplevede en lignende form for
Antallet konvertering problem.
Og som følge heraf blev 20 mennesker, 20 amerikanske soldater, dræbt
og omkring 100 andre såret, da Patriot, som skulle
til beskyttelse mod indkommende Scuds,
undladt at affyre et missil.
>> Da Irak invaderede Kuwait og Amerika lanceret en Desert
Storm i begyndelsen af ​​1991, Patriot missilbatterier var
indsat for at beskytte Saudi-Arabien og Israel fra irakisk
Scud-missilangreb.
The Patriot er et amerikansk medie-range overflade-til-luft-system,
fremstilles af Raytheon Company.
Størrelsen af ​​Patriot opfanger selv, det handler om
omkring 20 meter lang og vejer omkring 2.000 pounds.
Og det bærer et sprænghoved på omkring - Jeg synes, det er groft
150 pounds.
Og sprænghovedet selv er en højeksplosiv der har
fragmenter omkring det.
Kabinettet for sprænghovedet er designet til at fungere som hagl.
Missilerne udføres fire pr beholder og er
transporteres af en sættevogn.
>> The Patriot anti-missil-system går mindst tilbage til
20 år nu.
Det blev oprindeligt designet som en luft forsvar missil til
nedskyde fjendens fly, i den første Golfkrig.
Når denne krig kom, hæren ønskede at bruge det til at skyde
down Scuds, ikke flyvemaskiner.
The Air irakiske Force var ikke så meget af et problem, men hæren
var bekymret Scuds.
Og så prøvede de at opgradere Patriot.
Opsnappe en fjende missil rejser på Mach 5 foregik
at være udfordrende nok.
Men da Patriot blev hastet i brug, hæren
var ikke bekendt med en irakisk modifikation, der gjorde deres
Scuds næsten umuligt at ramme.
>> Hvad der skete er de Scuds, der var
kommer ind var ustabile.
De slingrende.
Grunden hertil var irakerne, for at få 600
kilometer ud af en 300 kilometer rækkevidde missil, tog
vægt af den forreste sprænghoved og
gjort sprænghovedet lettere.
Så nu Patriot forsøger at komme på Scud, og de fleste af
den tid, det overvældende flertal af den tid, det ville
bare flyve af Scud.
Når Patriot operatørerne indså Patriot
forpasset sit mål, de detonerede Patriot sprænghoved.
For at undgå eventuelle ulykker, blev det tilladt
at falde til jorden.
Det var hvad de fleste mennesker så, da store ildkugler på himlen,
og misforstås som aflytninger af Scud-sprænghoveder.
>> Selv på nattehimlen, syntes Patriots at være
held ødelagt Scuds på Dhahran, kunne der ikke være
fejl om dens ydeevne.
Der, Patriots radarsystem mistet overblikket over en
indkommende Scud og aldrig iværksat på grund af
til en software fejl.
Det var israelerne, der først opdagede, at jo længere
systemet var, jo større den tid uoverensstemmelse blev,
på grund af et ur indlejret i systemets computer.
Cirka to uger før tragedien i Dhahran, den
Israelerne indberettet til forsvarsministeriet, at det
Systemet var ved at miste tid.
Efter omkring otte timers drift, bemærkede de, at
Systemet var ved at blive mærkbart mindre nøjagtige.
Den forsvarsministerium reagerede ved at fortælle alle
The Patriot batterier til ikke forlade de systemer
i lang tid.
De har aldrig sagt, hvad en lang tid var - 8 timer, 10
timer, 1.000 timer.
Ingen vidste det.
>> The Patriot batteri stationeret på kasernen på Dhahran
og dets mangelfulde interne ur havde været på over 100 timer på
Natten til den 25. februar.
Det sporede tid med en nøjagtighed på omkring en tiendedel af et sekund.
Nu er en tiendedel af den anden er en interessant tal, fordi
det ikke kan udtrykkes i binær, nøjagtigt, hvilket betyder
det ikke kan udtrykkes på ethvert andet
moderne digital computer.
Det er svært at tro.
Men bruge dette som et eksempel.
>> Lad os tage det nummer en tredjedel.
En tredjedel ikke kan udtrykkes i decimal, præcis.
En tredjedel er 0,333 stået på i uendelighed.
Der er ingen måde at gøre det med absolut nøjagtighed i decimal.
Det er præcis den samme type problem, der skete i
Patriot.
Jo længere systemet løb, jo værre tidsfejl blev.
Efter 100 timers drift, var fejlen i tide kun
omkring en tredjedel af et sekund.
Men med hensyn til målretning et missil rejser på Mach 5,
det resulterede i en tracking error på over 600 meter.
Det ville være en fatal fejl for soldaterne ved Dhahran.
>> Hvad der skete er en Scud lanceringen blev påvist ved tidlig varsling
satellitter og de vidste, at Scud kom i deres
generelle retning.
De vidste ikke, hvor det kommer.
Det var nu op til radaren del af Patriot
system, forsvarer Dhahran, at finde og holde styr på det
indkommende fjendtlige missiler.
Radaren var meget smart.
Du ville faktisk spore placeringen af ​​Scud og derefter
forudsige, hvor det sandsynligvis ville være det næste gang
radar sendt en impuls ud.
Det blev kaldt intervallet gate.
Derefter, når Patriot beslutter tilstrækkelig tid er gået til at gå
tilbage og tjekke det næste sted for denne detekterede
objekt, det går tilbage.
Så når det gik tilbage til det forkerte sted, det så ikke ser nogen
indsigelse, og den beslutter, at der ikke var noget objekt.
Det var en falsk detektion og taber sporet.
>> Den indkommende Scud forsvandt fra radarskærmen.
Og sekunder senere, den hamrede ind i kasernen. The Scud
dræbte 28 og var den sidste affyret under
den første Golfkrig.
Tragisk, den opdaterede software ankom til Dhahran
den følgende dag.
Og den software fejl var blevet fastsat, lukker et kapitel i
den urolige historie Patriot missil.
PATRIOT er faktisk en forkortelse for "fasede Tracking
Skæring af Target. "
>> Okay, så en meget mere sorgfuld resultat af ikke helt
forstå denne verden.
Og takeaway, virkelig, fra filmen er, at løsningen
Der blev genstarte dit missilforsvarssystem
hver gang i et stykke tid.
Og så igen, et af formålene med dette kursus, i hvert fald
på en mere ydmyg målestok end disse applikationer, er at
virkelig åbne alles øjne for præcis, hvordan du går om
maskiner til fremstilling gøre, hvad du vil have dem til at gøre, og hvordan du går
om at gøre det rigtigt, mens undervejs gør det
godt, elegant, og så videre.
Og så i dag, lad os dykke ned i en lille smule mere af dette, men
så vi ikke går for hurtigt, især for de mindre
komfortabel, men også for at vi kan fastholde interessen for
dem mere komfortable, lad os bare hurtigt begynde med en smule
af resumé af nogle af disse ideer.
Og igen, så spørg væk, både personligt eller online, hvis du har
spørgsmål, så vi kan holde alle på samme side.
>> Så CS50 Appliance, hurtig skridt tilbage, er
hvad med dine egne ord?
Det er OK, hvis du ikke har nogen idé om, hvad disse ord kan være endnu.
[Uhørlig]
Okay, så en universel grænseflade til -
at vi alle kan dele.
Absolut.
Så vi kunne, for eksempel, fortælle dig at gå til nogle
hjemmeside, downloade denne software til Mac OS.
Download dette software til Windows, konfigurere i
denne måde, og at.
Men virkeligheden er så vi løber ind i utallige tekniske
støtte problemer.
Og også i disse dage, meget af, hvad der bliver gjort server side,
i verden af ​​computing, det især når kommer til
webudvikling og web-baserede applikationer, er faktisk
ganske ofte gøres på Unix eller Linux-computere, i modsætning til
Macs eller Windows-pc'er.
>> Så blandt de upsides så med at bruge denne ting kaldet
CS50 Appliance er vi alle have det samme miljø.
Så alle er på samme side, uanset hvilken hardware du
kom til campus med, men også vil være dypning i nøjagtig
det samme miljø, som du vil bruge mod
semesters afslutning samt for webudvikling, samt i den
fremtid for virkelige verden applikationer deraf.
Så mere konkret, det CS50 Appliance er et gratis stykke
software, der tillader dig at køre et andet operativsystem,
Linux, i dette tilfælde, på din egen computer. I et vindue
Nu kan du ikke bare hente apparatet.
Du har brug for et program, som skal spille eller køre apparatet.
Og det stykke software er almindeligt kendt som en
hypervisor.
Hypervisors kommer i form af produkter som VMware,
Virtual Box, Parallels.
Alle former for selskaber gør software, både gratis og
kommercielle, ens.
Hvad ser du i Problem sæt 1 er instruktioner om, hvordan du
få gratis software med til at
køre CS50 Appliance.
Og når du gør det, vil du have, i et vindue på din Mac eller pc,
en desktop miljø, der ser helt sådan ud, hvor
det har en Start-menu-lignende ting i
nederste venstre hjørne.
Det har en hjemmemappe, eller Hjemmemappe, i øverste venstre
der, en skraldespand, og så videre.
Så vi vil drille hinanden de nødvendige oplysninger, når vi går.
>> Men lad os nu begynde at dykke ned i C.
Så C er dette programmeringssprog, ligner i ånd til
Scratch, men langt mindre grafisk, men ironisk nok, langt
mere kraftfulde når du får kyndige med det.
Så i C, vi skriver programmer ved at skrive kildekode, som er
denne engelsk-lignende syntaks, svarende til sokker
påvisning af, at vi gjorde sidste gang, hvor du kan
udtrykke dig temmelig præcist, hvis
arcanely, til computeren.
>> Så hvad slags produkt software har du rent faktisk har brug
at skrive programmer i et sprog som C, baseret på vores
samtale på mandag?
[Uhørlig]
OK, du skal bare have en tekst editor.
Du behøver ikke nogen speciel software
i sig selv at skrive programmer.
Du skal bare have en teksteditor som Notesblok, på Windows,
TextEdit på Mac, eller noget, der hedder gedit, i verden af
Linux, som vi vil bruge her.
Og det er det, at skrive programmerne.
>> Men skrivning er kun halvdelen af ​​ligningen.
Du kan derefter nødt til at køre dem.
Men for at køre programmer -
du kan ikke køre kildekode.
Du i stedet nødt til at gøre, hvad det først?
Yeah.
DAVID J. Malan: Du skal
kompilere det.
Og en anden, kompilere kildekoden betyder -
[Uhørlig]
DAVID J. Malan: Præcis.
Oversætte det til nuller og ettaller.
Fordi vi alle, i disse dage, har computere, der har CPU'er,
næsten alle er lavet af et firma kaldet Intel, og
Intel Inside, betyder, at der er denne hjerne inde i din
computer, kaldet CPU.
Og en af ​​de ting, som at hjernen gør, er, det ved
hvordan man skal forstå mønstre af nuller og ettaller.
Det ved, hvad mønster af bit repræsenterer desuden hvad
mønster repræsenterer subtraktioner, hvilken mønster af
bits repræsenterer udskrivning, og skabe en hørbar lyd.
>> Så kort, CPU, kombineret med operativsystemet
som er et stykke software, der kører på toppen af ​​CPU,
så at sige.
Sammen disse to stykker vide, hvordan du kører programmer, der
vi mennesker skriver.
>> Så hvis jeg går ind i CS50 Appliance her, jeg har brug for at åbne
en tekst editor, og jeg kan få adgang til denne
i et par forskellige måder.
Jeg kan enten gå til Menu, programmering,
og så kan jeg vælge -
nope, ikke på menuen.
Jeg kan gå til Tilbehør / gedit her for at åbne
min lille tekst editor.
Eller mere enkelt, kan jeg klikke på denne lille ikon i bunden
venstre hjørne.
Og nu får jeg dette miljø her.
Det er temmelig minder om en simpel teksteditor, med blot
en eller to forskelle.
I toppen, hvor markøren blinker nu er det her
Jeg kan begynde at skrive min kode.
I bunden er denne ting kaldet terminalvinduet.
Og hvad slags ting kan jeg gøre i dette
såkaldte terminal vindue?
[Uhørlig]
>> Okay, så jeg vil køre kommandoer.
Og nogle af de kommandoer, vi kørte i mandags var lidt
kryptiske i starten, men ls til listen, cd for forandring bibliotek,
rm, for fjernes.
Så det er slags en old-school måde at navigere din
computer, der kun bruger dit tastatur og tekstmæssige kommandoer,
og ikke, i almindelighed under anvendelse af en mus.
Men vi vil se, inden længe, ​​dette faktisk giver os en
lidt mere power og lidt mere præcision, hvormed at
udtrykke os.
Og så herovre til venstre, vil vi bare at se,
da vi begynde at skrive software, en lille resumé af
program, som vi har skrevet øverst til venstre.
Men vi vil se det igen inden længe.
>> Så lad os gøre noget temmelig simpelt her.
Lad mig først gå videre og gå til Fil, Gem, og jeg er bare
kommer til at klikke på jharvard her, over til venstre, og
jharvard er, igen, navnet på mit hjem mappe, min
personlige filer, mig, nu er John Harvard, som alle jer
vil snart være John Harvard i dette miljø.
Han har dette Home bibliotek, Mine Dokumenter og så videre,
at jeg vil gemme, nu denne fil i.
Så jeg har tænkt mig at kalde det hello.c. Så jeg har tænkt mig at gå
fremad og klik på Gem, og nu, hvad jeg har her, er en fane
kaldet hello.c, så meget som en anden type editor.
>> Så nu lad mig gå videre og begynde at skrive et program.
int main (void).
Og så vil jeg bare gjorde sidste gang, printf, for print formateret,
("Hello, world!"
).
Næsten færdig.
Men jeg mangler et par detaljer.
Hvad der mangler i dette program, som jeg virkelig har brug for
det faktisk kompilere?
Yeah.
[Uhørlig]?
>> DAVID J. Malan: Ja, så jeg er nødt til at inkludere den standard
I / O-bibliotek.
Så det skal gå over main, så jeg bare til
gøre nogle plads til det der.
Og jeg har tænkt mig at gøre # include .
Og bemærk de vinklede parenteser dér.
Og som en sidebemærkning, er gedit lidt brugervenlig, hvis
nogle gange lidt forvirrende, idet den forsøger at hjælpe din
øjne mærke til, hvad linjer op med hvad.
Så det faktum at min markør er lige ved siden af ​​denne vinklet
beslag, bemærk, hvordan det er at fremhæve den anden vinklet
beslag plus denne ene.
Og det er bare at henlede min opmærksomhed på, at jeg
have symmetri.
Og symmetri i programmeringen er generelt en god ting.
Tilsvarende, hvis jeg flytter min markøren til slutningen, læg mærke til hvordan den
krøllede parenteser i kø for at vise, at, ja, jeg har en åben
og et lukket, så at sige.
>> Okay, og jeg kan gøre en anden ting.
Det er ikke strengt nødvendigt, men god praksis, for at sige
returnere 0.
Og return 0 gør hvad for os her?
Eller betyder hvad?
[Uhørlig]
DAVID J. Malan: Men intet er galt.
Og helt ærligt det er svært for meget at gå galt i en
programmere denne korte.
Så jeg bare at være super klart, at alt er godt.
Jeg, menneske, når jeg kører dette program, vil sandsynligvis aldrig
se, 0.
Generelt er disse tal, der bliver returneret fra main
kun opdrage deres hoveder til mennesker, når
noget går galt.
Og du får en lille pop op at sige systemfejl, én,
to, tre, eller uanset hvor mange var, at
faktisk returneres.
Så noget andet galt med dette?
[Uhørlig]
>> DAVID J. Malan: Så det er ikke så meget et funktionelt fejltagelse
men en æstetisk en.
Jeg skal nok sætte i en ny linje der ved
slutningen af ​​denne streng, så vi rent faktisk at flytte markøren til
næste linje, og programmet bare ser lidt pænere.
>> Så nu lad mig gå ned til min terminal vindue
og ind igen
Og denne ting her, det hedder prompten.
Det er bare at minde mig om, hvem jeg er, jharvard @ apparat, hvor
Apparatet er navnet på den computer, jeg er på.
I parentes er denne tilde, tilden symbol, som
repræsenterer hvad?
PUBLIKUM: Home bibliotek.
DAVID J. Malan: Home bibliotek.
Så det er bare en forkortelse notation for at sige du er i
din personlige mappe, hvor alle dine filer går som standard.
Så nu, her, kan jeg skrive ls for listen.
Og det eneste, jeg kan se her i øjeblikket er hello.c.
Og det er godt, fordi jeg lige skrev dette.
>> Så lad mig gå videre og gør goddag.
Og bemærk jeg ikke skrive make hello.c.
I stedet er jeg kun skrive bunden navnet på filen, hej.
Og gøre, som vi så på mandag vil bare udlede, at jeg ønsker
den. c fil.
Så nu har jeg skrevet lave hej.
Nu kan jeg se denne lange kommando og vil fortsætte
se dette igen og igen.
Men for at være klar, klang, ordet, der bare syntes,
det er den faktiske compiler.
Lav er bare et build hjælpeprogram.
Det er bare en mere brugervenligt program, der sparer mig, i
lange løb, fra at skulle skrive ud utroligt kedelig lang
kommandoer som at én.
Så du kunne løbe Dunk manuelt.
Du kan skrive alt dette manuelt.
Bliver bare meget trættende.
Og så gør, er bare et program, der forenkler vores liv, og
kører mere komplekse kommandoer for os.
>> Okay, så nu, hvad filen skal jeg have
i mit aktuelle bibliotek?
Ikke bare hello.c, men også hej.
Så hvis jeg vil køre goddag, huske, at jeg siger dot slash,
hvor dot midler gå ind i den aktuelle mappe, hvor du
er, og derefter køre programmet hedder hello, og ja, nu,
Jeg har hej verden.
Okay, eventuelle spørgsmål om workflow eller syntaksen i
hvad vi lige gjorde?
>> Okay, så lad os tage tingene op et hak igen.
Så det var underwhelming at bare skrive et program, der kun
nogensinde, siger hej, verden.
Så vi ændrede det på mandag, for at sige, hej, David.
Det er en lidt mere personlig, men lige så hårdt kodet som
første version.
Så ikke alt det overbevisende.
Men der findes i C, fungerer sikkert udover
print, funktioner, så du får input fra brugeren.
Og den måde, vi gjorde det, den anden dag, var som følger.
Før jeg faktisk udskrive noget, jeg først fik
noget fra brugeren.
Så lad mig gøre det igen.
>> String s, hvor s er blot et vilkårligt navn, her, til en
streng, svarer GetString.
Så hvad var GetString?
Det naturligvis får en streng, der er baseret på dens navn.
Men hvad er det, mere teknisk?
Det er en funktion.
Så det er en funktion, der ikke kommer med C per se.
CS50 medarbejdere skrev dette.
Og så at bruge dette, kan du ikke bare inkludere stdio.h,
Du skal også omfatte hvad?
Yeah.
Så cs50.h, som er blot en fil vi skrev for nogle år siden.
Vi installerede det på apparatet for dig ved siden af
alle standard filer.
Og så i disse første par uger af klassen, vil vi bruge
dette bare for at forenkle processen med at gøre meget grundlæggende
ting som at få input fra brugeren.
For som vi vil se i et par uger, at få brugerinput i en
sprog som C er faktisk overraskende kompleks,
især fordi du ikke kender i forvejen, som regel, hvordan
mange ting som brugeren kommer til at skrive i.
Og når du ikke ved, hvor meget data til at forvente, at du ikke
vide, hvor meget hukommelse der skal tildeles.
Og hvis du rent faktisk har en kontradiktorisk bruger, der forsøger
at hacke ind i dit system, crash din computer, ja,
generelt den første metode til angreb er, ligesom jeg gjorde på
Mandag skrive en hel lang sekvens af tilfældige tegn,
trykke Enter, og se hvad bryder.
Fordi generelt, hvis et program bryder, antyder, at der på
et sikkerhedshul, potentielt.
Det er helt sikkert antyder du, programmøren, der har fremstillet en
fejltagelse, men mere faretruende, måske du har lavet en
sikkerhedsrelateret fejl, og generelt vil vi se, at
det er sådan maskinerne er kompromitteret til denne dag, både
i verden af ​​internettet og programmer på
kommandolinjen, som denne.
>> Ok.
Så string s lig GetString.
Så mere konkret nu, hvad linje 6 gøre her?
Så den funktion til højre får strengen,
tager, hvor mange argumenter?
Okay.
Så ingen.
En lille sanity check.
Et argument, igen, er bare et input til en funktion til at ændre
sin standard opførsel på en eller anden måde.
Men i dette tilfælde, jeg ikke ønsker at ændre
adfærd GetString.
Jeg ville bare få en streng.
Så jeg satte intet i parentes, og så vil jeg sætte en
semikolon demarking enden af ​​kodelinje.
Nu lighedstegnet betyder ikke lige, per se.
Det betyder opgave, hvilket betyder indsætte de får
afgives til højre inde i det, der er til venstre.
>> Så til venstre, siger vi, at vi har erklæret en
streng ved navn s.
Og mere specifikt, har vi allokeret hukommelse inde i
som vi vil lægge de bits, der repræsenterer en sekvens af
tegn.
Men i dag har vi afsat
eller erklæres en streng.
Ok.
Så nu når jeg har gjort dette, vil jeg tilslutte i værdien af
s, ikke værdien af ​​David.
Så dette er forkert hvorfor?
Så det er bare bogstaveligt talt hard-coded s.
Det er at sige "goddag, s", som er ikke hvad jeg vil.
Så jeg kan gøre dette.
Den procentvise tegn er en pladsholder, men nu har jeg brug for
passere ind i udskrive et andet argument.
Husk på, at argumenter til funktioner er adskilt af
kommaer, så næste komma her jeg sætte efter denne bogstavet s.
Og i den forbindelse nu, s er variabel, og printf,
efter modtagelse af disse to indgange -
strengen til venstre og variabelnavnet s til højre -
det vil lukke sidstnævnte i førstnævnte for os, og
bare udskrive en dejlig smuk streng, der indeholder
uanset hvad det er, at vi har skrevet i.
>> Så lad os prøve dette.
Kommer til at gå videre og zoome ud, tilbage
til min terminal vindue.
Zoom ind ved bunden her.
Gentag gøre hej.
Klang synes at have været køres igen.
Jeg har tænkt mig at skrive. / Hej, Enter.
Intet synes at ske endnu, men det er ved denne prompt
at jeg kan skrive noget som Nate, Enter, og nu har vi
Hej, Nate.
Og jeg kan gøre det igen med Rob, og så videre.
Så forhåbentlig nu dette program opfører sig som jeg agter.
>> Nu ikke så brugervenlig.
Jeg har ingen idé om, hvad der bliver forventet af mig.
Så vi kan helt sikkert rydde op en lille smule.
Lad mig gå tilbage her, og i stedet for bare at dykke i og
beder brugeren om en streng, lad mig eksplicit fortælle
bruger, hvad jeg forventer.
Så printf ("Indtast en streng:"
);
Så ingen variabler her.
Ingen procenttegn.
Bare den simple engelsk udtryk.
Lad mig nu gå til bunden her og kør mit program.
Men intet synes at have ændret sig.
Hvorfor?
Jeg er nødt til at kompilere den.
Så let fejl at gøre.
Men du er nødt til ikke kun at gemme filen, men
genoversætte programmet.
Og så hvis jeg re-run gøre hej, nu Dunk kører.
Nu kan jeg køre. / Hej. Og nu kan jeg se "Indtast en streng:".
Okay.
Nu er det lidt mere brugervenligt.
Nate, Enter, hallo, Nate.
>> Nå, lad os prøve det igen og begynde at tænke
ca hjørne tilfælde.
Så ligesom i Scratch, er du opmuntret eller er ved at blive
fremmes i spec at slags tænke over hvad der kunne gå
galt, hvis du ikke forventer alt, hvad brugeren kan gøre.
Bugs derfor kunne forårsage.
Så indtaste en streng -
hvad er et hjørne sag her?
Hvad er et scenarie, at jeg, programmør, måske ikke har
forventet?
Yeah.
Okay.
Så hvad hvis jeg skriver i en række som denne?
Ok.
Så det virker stadig.
Gramatically giver ingen mening.
Men i det mindste programmet virker.
>> Hvad er et andet hjørne sag?
Noget jeg ikke havde forventet.
Ja?
Okay.
Så vi kunne gøre noget som en virkelig, virkelig stort antal.
Så lad os gøre det her.
Lad mig zoome ud til en anden, lad mig fremhæve.
Kan ikke kopiere og indsætte hernede.
Ok.
Så jeg kan ikke kopiere og indsætte i denne terminal vindue, så vi får
lige simulere det.
Lad mig zoome ud, kommer til at wrap.
Jeg har ikke tænkt mig at gøre dette alt for længe, ​​fordi det ikke vil
faktisk bryde i dette program.
Men det kunne.
Enter.
Men det gjorde det ikke.
Ok.
Men det er en ægte hjørne sag.
Og den eneste grund til, at opførte sig korrekt, så at
tale, er fordi CS50 funktionen GetString er faktisk
udformet under hætten, som vi vil se i et par uger,
til automatisk at tildele mere og mere RAM, mere og mere
hukommelse fra operativsystemet, når det indser, wow,
du har virkelig skrevet i noget ganske lang.
Nu, dette er lidt af en hvid løgn.
Hvis vi faktisk standsede et stykke tid, og jeg har skrevet i
noget lignende 5 milliarder tegn på tastaturet
her, eller virkelig ramt copy-paste ganske lidt, vi muligvis
kan få programmet til at gå ned.
Bare lidt sværere at simulere det med en endelig
tid.
>> Hvad er et andet hjørne tilfælde kunne vi forsøge?
Ja?
Yeah.
Så hvorfor gør vi ikke svare noget?
Så vi faktisk nødt til at tage nogle tiltag, fordi ellers
programmet kommer til at sidde der blinker hele dagen.
Men hvis jeg bare trykke Enter -
OK, nu, ser stadig forkert.
Vidste ikke gå ned, men måske er der nu en mulighed for at
påbegynde gennemførelsen af ​​en mere stringent program
der egentlig kontrollerer.
Og hvis strengen, den sætning, det ord, jeg
indtastet har længde 0, ja, måske jeg skulle råbe ad den
bruger, eller fortælle ham eller hende om at indtaste en streng igen, så
vi faktisk får, hvad der ligner korrekt adfærd og ikke
bare fuldstændig forglemmelse fra min side.
>> Spørgsmål i ryggen?
Decimaltal.
Så vi kunne prøve det, også.
1,10000005.
Synes lige det kommer til at bare arbejde faktisk okay.
Og det faktisk forventes.
Selv om vi kunne have skrevet, at antallet der, eller en
større antal tidligere indse, at når vi er ved at skrive bruger
input og vi bruger den GetString funktion, ikke
Uanset om hvad jeg skriver ligner et nummer.
Husk på, at i henhold til ASCII, alt på din
tastaturet har en numerisk værdi, der kan knyttes til en
karakter, en char.
Så i dette tilfælde, selvom jeg måske skrive et nummer,
computer kommer til at tænke på det, så at sige, som en streng -
noget, der ligner et tal, men er
faktisk ikke et tal.
Men det er faktisk en perfekt Segue, fordi vi nu kan
faktisk overgang til at skrive programmer, der
bruge andre datatyper.
>> Så udover selv at anvende chars, eller rettere, udover selv at anvende strenge,
indse, at vi har andre datatyper i C samt i
andre sprog.
En char, som navnet antyder, er blot et enkelt tegn.
En flyder er en floating point-værdi, og det er bare en fancy
måde at sige et reelt tal - noget, der har en decimal
punkt i det med nogle numre til venstre og / eller højre.
En int er et heltal, der er bare et nummer som 123.
Og nu mere interessant er ting som dobbelt.
Hvad sagde vi sige en dobbelt var sidste gang?
Det er 64, til højre.
Så mens typisk en float er 32-bit -
så det er så lang tid i hukommelsen, det bruger 32 nuller og ettaller til
repræsenterer værdier - en dobbelt er bogstaveligt talt to gange, hvilket
betyder, at du enten kan repræsentere større tal, eller
du kan repræsentere mere præcise tal.
Så du kan have flere numre efter kommaet, men
som fyren sagde i videoen, selv noget simpelt
konceptuelt ligesom 1/3 ikke kan gengives præcist ved en
computer, fordi i sidste ende du løber tør for bits, og
derfor kan du kun gøre .33333333 så mange gange, på
hvorefter du bare nødt til at sige, jeg er ud af repræsentation
plads, jeg skal bare kalde det en dag og repræsentere det
lidt upræcist lide det.
Og en lang lang -
dumt navn, men det er fordi der er en datatype kendt som en
længe i C, som tilfældigvis er ofte 32 bits, ligesom en
int er 32 bit, men en lang lang er
generelt 64 bits.
Så det bare betyder, at du kan repræsentere større
tal end dette.
>> Ok.
Så hvis vi rent faktisk ønsker at starte repræsenterer ting, vi
muligvis mere sofistikerede typer, og
det er derfor vi har streng.
Så i CS50 biblioteket, at fil kaldet cs50.h, vi har
faktisk erklærede en datatype, så at sige, kaldet streng,
men streng faktisk ikke eksisterer.
Det er, igen, en af ​​disse lag vi vil skrælle
tilbage i en uge eller to og smide det væk, og faktisk
kigge under kølerhjelmen på, hvad en streng egentlig er, og
hvordan det er repræsenteret.
Vi vil også se på booleske værdier.
>> Så hvad var en bool i forbindelse med Scratch?
Det er sandt eller falsk.
Så det er bare en værdi, der er sandt eller falsk, tændt eller slukket, 1 eller
0, men du ønsker at se i verden.
Så i C, takket være den CS50 bibliotek, som igen
omfatter et andet bibliotek under motorhjelmen, har vi
adgang til en datatype, der hedder bool, som vil
bogstaveligt giver os mulighed for at tildele værdierne sand eller falsk til
ting i et program.
>> Så lad os gå videre her og skrive et lille program, der
gør noget der involverer tal i stedet.
Så lad mig gå tilbage til CS50 Appliance, lad mig gå videre og
oprette en ny fil her kaldet -
lad os bare sige noget simpelt, som math.c.
Ok.
Og nu gå op til toppen af ​​mit program, jeg er
vil gøre det sædvanlige -
# Include , så jeg kan bruge
printf, int main (void) -
vi vil komme tilbage til i sidste ende, hvad int betyder
her, hvad tomrum betyder her, men for nu, ved bare at
du nødt til at starte programmer som dette.
Nu vil jeg gå videre og sige noget lidt
anderledes - printf ("Giv mig et nummer:"
).
Så jeg har tænkt mig at gøre int n = GetInt, fordi det
Sving ud GetInt er en anden funktion i CS50 biblioteket
foruden GetString.
Og nu jeg har tænkt mig at gøre noget dumt, som "tak
for% d, for "decimal heltal, og derefter komma n, og
derefter vende tilbage 0.
Så igen, returnere 0 har noget at gøre med antallet er jeg
beder brugeren om.
Bare betyder i slutningen, at alle, formentlig, er godt.
>> Så lad mig gå ned til min terminal vindue her.
Lad mig skrive make matematik, skal du indtaste.
Og noget er galt.
Gør matematik virkede ikke.
Her er den første af vores fejlmeddelelser.
Hvorfor?
Lidt kryptisk, men -
Yeah.
Så cs50.h.
Så igen, især tidligt på, vil du skrive din første
program for Pset 1 i sektioner, i kontortiden, og
helt ærligt, vil det være overvældende til tider hvad disse ting
rent faktisk siger.
Men du vil indse meget hurtigt de begynder at falde
i spande, hvor denne ene betyder, at du har forladt fra én
i # indbefatter øverst i filen.
Og Dunk, compileren, er at informere dig om dette ved
siger, snarere fancifully, underforstået erklæring af
funktion GetInt er ugyldig.
>> Ok.
Så hvad betyder det?
Det betyder bare, at du har implicit erklæret GetInt i
den forstand, at du ikke udtrykkeligt har erklæret det.
Til eksplicit erklære int, er du nødt til at undervise
Klang, at det eksisterer.
Og den meget enkel løsning for det er at lære det ved
herunder denne anden fil, cs50.h, på
toppen af ​​din fil.
Fordi bogstaveligt, hvad betyder # include er den fortæller Dunk
temmelig meget at gå finde den fil der hedder cs50.h, kopiere,
indsætte den automatisk ind i toppen af ​​mit program for mig,
og derefter konvertere kildekoden til nuller og ettaller.
Men det ville naturligvis være meget trættende, hvis vi mennesker havde
at gå kopiere og indsætte disse store filer hele tiden,
så # include bare gør alt dette automatisk uden
muddying min kode med en andens bibliotek.
Og et bibliotek er bare en anden fil, der indeholder funktioner og
andre ting, som en anden har skrevet, at vi er
gearing for vores egen skyld.
>> Ok.
Lad os prøve igen.
Gør matematik.
Enter.
Godt.
Så det ser ud til at have virket.
Så lad mig nu køre matematik. / Matematik.
Indtast giver mig et nummer, 123.
Tak for de 123.
Lad os prøve et andet hjørne sag.
En streng er temmelig generøs, fordi en
streng kan være hvad som helst.
Kan ligne tal, ligner
tegn, ligner ord.
Men en int er en int.
Så nu, hvis jeg er den vanskelige bruger, og det siger "Giv mig
et nummer, "hvad nu hvis jeg prøver at gøre noget som 0,1?
Tja, det er et tal, og det er i overensstemmelse med
grammatik jeg brugte her, men under motorhjelmen, er jeg af
kursus med funktionen GetInt.
>> Så lad os se hvad der sker.
Indtast, prøv igen.
Ok.
Lad mig være svært og bare trykke Enter igen.
Indtast, Enter.
Så nu ser det ud til, at GetInt er lidt mere
kraftfuld end GetString.
Vi, personale, gennemføres på en sådan måde, at hvis vi bemærker
De har ikke givet os en int - og en int er et decimaltal
indeholder nuller, dem, toere, treere, firere, femmere, seksere,
syvere, ottere eller niere.
Og det er det.
Ingen decimaltegn, ingen tegn, ingen tegnsætning.
Det ser ud til, at vi er nødt til at samarbejde.
Så lad mig prøve fire, fem, seks, og det får mig igennem.
Så virkelig, at være anal her, vil jeg nok sige "Giv mig
et heltal "for at formidle til brugeren
præcis hvad jeg agter.
>> Nu lad os tænke over under hætten.
Vi kommer ikke til at se på, hvordan cs50.h gennemføres i dag,
det pågældende bibliotek.
Men hvis det holder at sige prøv igen, prøv igen, prøv igen, hvad programmering
konstruere jeg formodentlig med under hætten til
gennemføre det?
Så bare en løkke, right?
En af de enkleste ideer, som vi så på Scratch.
Det Forever konstruere, Repeat konstruere.
Formodentlig i dette program, under hætten, selv
selvom det er skrevet i C og ikke bunden, er det at gøre
noget, der hedder svarende til evigt, hvis brugeren ikke har
indtastet et heltal, siger prøve igen, prøve igen, prøve igen, prøve igen, så
så endelig når vi får et heltal, så du
bryde ud af denne sløjfe.
>> Så hvad andre funktioner kan vi bruge her i CS50 bibliotek?
Godt, slags den åbenlyse i det mindste på grundlag af
datatyper, som vi nu ved eksisterer.
Vi implementerede GetString, GetInt, men i hele
første uger af udtrykket, kan du også bruge GetFloat og
GetDouble og GetLongLong for at opnå præcis den
datatyper, som du ønsker.
Fordi den centrale detalje her er, at i modsætning til nogle sprog,
ligesom Python og Ruby, hvor man ikke nødvendigvis behøver at
erklære datatypen for en variabel -
du behøver ikke at fortælle computeren, hvad slags ting
du kommer til at sætte ind i den variable -
i C, skal du være nok så præcis.
Så hvis du ønsker en variabel kaldet n, en luns af storage
at i dette tilfælde sker for at være 32 bit ved konvention, du
nødt til at fortælle computeren, at disse bits er
kommer til at gemme et nummer -
ikke et tegn, ikke en streng, ikke en float.
Og det løser problemet vi effektivt
løb ind i sidste uge.
Hvis vi bruger nuller og ettaller numre til at repræsentere ikke blot
numre, men As og Bs og Cs, hvordan i verden er en
Computeren vil vide, at dette mønster af bit egentlig
betegner nummeret 65, i modsætning til repræsenterer
bogstavet A, som tilfældigvis ifølge
ASCII, huske, svarede til 65?
>> Så disse datatyper levere indhold til computeren, så
at det ved, om disse bits skal fortolkes som en
int eller som en streng.
Eventuelle spørgsmål, så om dette?
Ja?
DAVID J. Malan: Godt spørgsmål.
Hvis vi tager ud stdio.h, vi gemme filen -
lad mig gå ned til terminalvinduet og køre gøre matematik, zoom
ind og indtaste -
nu får jeg en anden fejl, fordi jeg er implicit
erklære hvilken funktion nu?
Printf.
Så nu har jeg lavet et nyt problem, hvis løsning er
væsentlige den samme.
Jeg har brug for at sætte den tilbage.
PUBLIKUM: [uhørligt]
DAVID J. Malan: Oh.
Så hvis jeg tager ud -
Okay, ja.
Så hvis jeg fjerner den standard I / O-bibliotek indlemmelse op
her, og så er du siger, hvis jeg slippe af med printf, få
slippe af printf?
Ja.
Dette bør arbejde, fordi jeg ikke længere bruge nogen - Ups.
Har jeg bare lyve?
Oh, okay.
Dette vil ikke arbejde på grund af en ny fejl, vi netop introduceret.
Og denne ene er lidt mere selvforklarende.
>> Hvad er problemet?
Ubrugte variabel n..
Så denne fejl er resultatet af vores have konfigureret
apparatet at være særligt pedantisk, for virkelig at yell på
dig for alle mulige fejl, selvom det er lidt
en ikke-fatal fejltagelse som denne - er det virkelig så stort et
håndtere, at jeg tildelt en int, sætte et nummer i det, og så
bare gjorde intet med det?
Så funktionelt, no.
Det kommer ikke til at bryde programmet.
Det er bare lidt dum, right?
Der er ingen værdi at have bedt om det nummer, oplagret
det i en variabel, hvis du aldrig kommer til at gøre noget
med det,. hvorvidt udskrive det eller gemme det
Så i dette tilfælde, er Dunk erkender så meget, og
Det siger ubrugte variabel n..
>> Så vi kan løse dette, hvis vi virkelig ønsker.
Men igen, dette er ikke god programmering nu.
Så jeg kunne bare gøre det -
gå ned her, lad mig rydde skærmen, lave matematik.
Det virker.
Nu kan jeg køre min matematik program, tager input -
godt, det var slemt.
Tager input, og det er alt det gør i dette tilfælde.
>> Så faktisk, lad os prøve en anden hjørne, at vi
tænkte ikke på tidligere.
I dette tilfælde - her, lad os gå tilbage til en, der er en
lidt mere brugervenligt.
Lad mig gå tilbage her og kør gøre matematik igen.
Whoops, hvad gjorde jeg forkert?
Fik at rulle tilbage yderligere.
Okay.
Nu er vi tilbage i den oprindelige tilstand, hvor alle
er forhåbentlig godt.
Og nu, hvis jeg løber matematik, 123 synes at virke.
Men det er egentlig ikke en effektiv bevis, bare at sige
okay, det virker.
789, der virker.
Tid til at indsende.
Fordi der er andre hjørne sager her.
En streng ikke virkelig give os mange problemer ved at skrive i en
hel masse tegn.
Men hvad hvis jeg skriver i dette?
Hitting tallet 1 en hel masse, hel masse her -
okay, det bliver lidt kedeligt, så jeg har tænkt mig at
stoppe her, og jeg har tænkt mig at trykke Enter.
>> Hvad fanden skete der lige?
Så dette kan faktisk forklares.
Så tog det det som binær?
En god tanke, men nej, det er ikke det faktum, at det tog det
som binær, fordi faktisk det var bare sådan en
tilfældighed.
Vi kan gøre det igen.
Så der er ingen 2 i det binære system, der er
sandsynligvis nok alligevel.
Enter.
Så det var ikke problemet.
Hvad ellers?
Præcis.
>> Så tænke tilbage på, hvad en int rent faktisk er.
Det er 32 bit, der tilsammen er fortolket
som et tal.
Hvis du har 32 bit, der betyder, at hver af de bits kan være
et 0 eller et 1, 0 eller et 1.
Så det betyder, at der er to muligheder for denne bit,
to muligheder for dette, to muligheder for dette
bit - så det er 2 gange 2 gange -
så det er 2 til 32 effekt er det samlede antal
permutationer af nuller og ettaller, hvis du har 32
pladsholdere, nuller og ettaller, foran dig.
Så hvis jeg har 2 til 32, matematisk, det er hvad?
Så det er en masse.
Det er 4 mia give eller tage.
Og 4 milliarder synes ikke at være det, der blev udskrevet her.
Faktisk ser det tættere på 2 mia.
Men det er ikke en tilfældighed.
Den omstændighed, at computeren har misfortolket mit enormt antal,
min store sekvens af dem og derefter min store sekvens af toere,
som 2 milliarder groft, forklaret er hvordan?
Der er et loft på int.
Der er en bestemt en maksimal værdi, som du kan repræsentere.
Men det er normalt 4 mia right?
Hvis 2 til 32 er omtrent 4 milliarder der ser ud som
Det er det største antal.
Så ikke en rest, men en god tanke.
Negative tal.
Så hvis du har 4 milliarder mulige ting, du kan
repræsentere med disse forskellige permutationer af 32 0'er og
1s, ja, det er indlysende, at vi mennesker måske ønsker at
repræsentere ikke kun positive heltal
men negative heltal.
Og ja, det er den antagelse, at C gør.
Så med 32 bit, kan du repræsentere groft negativ 2
mia.kr. hele vejen op til positiv 2 mia.
Og så i dette tilfælde, er det, vi virkelig ser bare
i udkanten af ​​kapaciteten i vores tal, og vi har, så
at sige overløb et heltal.
Vi har prøvet at proppe flere bit ind i det, end rent faktisk kan passe.
Så det endelige resultat er, at vi hovedsagelig har alle 1 bits.
Vi har vendt alle vores bits på, har vi forsøgt at repræsentere
det største antal muligt, men det er klart ikke nær
stor nok til at repræsentere de to ting, jeg lige har skrevet i.
Ja?
PUBLIKUM: [uhørligt]
>> DAVID J. Malan: Godt spørgsmål.
Hvorfor kan vi ikke bare repræsenterer den negative
underskrive som blot et tegn?
Så vi absolut kunne, og vi kunne derefter gemme
en ekstra bit.
Men du er stadig nødt til at repræsentere denne streg, og
der kommer til at koste dig i det mindste noget,
formentlig en smule.
Så ja, vi kunne have 32 bits, der anvendes til vores nummer, men nu
vi har brug for en anden bit, der anvendes til vores tankestreg
symbol, minustegn.
Så nu har vi 33 bit-værdier, som vi kunne gøre, men det er
bare ikke den måde, det er gjort.
Vi lavede en dom opkald år siden, 32 bit er en slags af
måleenhed her.
Så vi kommer til at bruge en af ​​disse bits effektivt til
repræsentere negativitet, og 31 bit til at repræsentere tal.
Andre spørgsmål?
Ok.
Det er en masse.
Skal vi ikke gå videre og tage vores fem minutters pause her?
>> Ok.
Så igen, at ikke understrege nok de matematiske applikationer
af programmering, bare lad os plukke fra dette ene eksempel
før vi bevæger os ind i andre konstruktioner, bare fordi det
vil illustrere nogle få fælles humpe point på nogle af
det grundlæggende, når det kommer til at skrive programmer.
I dette tilfælde gør aritmetiske udtryk, der har nogle
interessant relevans for syntaks.
>> Så dette er blot en formel, som vi kan konvertere
temperaturer fra Fahrenheit til Celsius.
Hvis du ikke huske, det er bare formlen.
Så hvis man tilslutter Fahrenheit værdi på 32 grader, hvilket er
frysning, er det kommer til at være 32 minus 32 er 0, og ja,
0 i Celsius er også frysning.
Så hurtig tilregnelighed kontrollere der - det er den velkendte formel.
Lad mig gå over til apparatet, selv om, og start
skrive et program kaldet, ligesom, f2c; "Fahrenheit til
Celsius dot c ".
Og op på toppen her, vil jeg starte med # include
stdio.h, og jeg har tænkt mig at gøre int main (void), og
igen, vil vi komme tilbage i fremtiden, hvad int betyder
der, og hvilke hulrum betyder, at der.
Og lad mig nu gå videre og gennemføre et program, der
hovedsageligt gør denne konvertering for os.
>> Så printf, lad os sige, temperatur i Fahrenheit.
Og så lad mig gå videre og få den værdi fra brugeren.
Hvilken slags værdi bør jeg får fra brugeren, hvis jeg ønsker
dem til at give mig en temperatur i Fahrenheit?
Ja?
Hvad ville du foreslå?
Yeah.
Så float føles temmelig rimelig.
Vi har, igen, blot et par muligheder,
vi har set hidtil.
Vi har ting som char, double, float, int, lang lang,
bool, string.
Så af disse, float føles temmelig rimelig.
Vi kunne godt bruge en dobbelt, ret, for hvis vi virkelig ønsker at
repræsenterer et menneskes temperatur -
98,60 tusind -
vi kunne bruge 64 bit til at gøre det, men det føles som
overkill for temperaturen.
Så lad os bare gå med float.
Nu har jeg brug for en variabel.
Bare for at holde tingene enkle, vil jeg kalde det f, men jeg
kunne lige så rigtigt kalder det temperatur,
men enten er fint.
Så flyde f = GetFloat.
Så snart jeg nu har besluttet at bruge GetFloat, selv om, jeg
nødvendigt at lave én korrektion.
Yeah.
Så vi er nødt til at # include , ellers compiler er
kommer til at yell på os.
Nu hvor jeg har en float, lad mig gå videre og gøre det
konvertering.
>> Så det første, lad mig også komme ind i vane her af
kommentering min kode.
Så igen, en kommentar er blot en notation til mennesket, der er
ikke en del af programmet i sig selv, men en, hjælper dig
forstå, hvad du gjorde den næste morgen, eller næste
måned, det hjælper din undervisning fyr forstår, hvad du gjorde
eller hvad du havde tænkt dig at gøre, så det er
generelt meget god praksis.
Hvert par linjer kode, skrive en kommentar til
dig selv eller din kollega.
Så her vil jeg sige, "Spørg brugeren for temperatur."
Behøver ikke at være en hel sætning, bare en kort sætning.
Men tanken bag kommentere i C er, at hver af dine
bemærkninger bør give dig - eller, siger en TF eller en kollega -
at skimme dit program og ved præcis, hvad det gør, ved ikke
så meget at læse koden, men ved at læse de kommentarer, som
bør være kortfattet og klar.
Okay, så lad mig gå videre og sige, "Konverter
Fahrenheit til Celsius. "Så jeg har tænkt mig at gå videre og gøre,
lad os sige, flyde ca.
Vi holder Celsius som en floating point værdi.
>> Og lad mig tage et stik på dette.
Formlen er, igen, op her.
Som 5/9 gange F minus 32.
Så lad os gøre det.
Så 5 divideret med 9, minus -
Ups, jeg rodet det op allerede.
Times.
Så 9/5 gange F minus 32.
Så F minus 32, semikolon.
Og nu, hernede, vil jeg gå videre
og sige, udskrive resultat.
Og denne del er nemt. Printf.
Hvordan går jeg om udskrivning af dette?
Tja, jeg kunne sige "Dette antal i Celsius er% f \ n",
kun for nogle æstetik.
Og hvad så værdi ønsker jeg at tilslutte her som printf s
andet argument?
Okay.
Så bare c.
Så vi vil starte med denne og så bare returnere 0.
Igen, det har intet at gøre med matematik.
Det betyder bare, at alt er godt.
>> Nu er dette korrekt, dette program?
Ok.
Så jeg har lavet nogle fejl.
Selv hvis du ikke har nogen idé om, hvad programmering er, kan du sortere
af udlede tilbage til folkeskolen, hvad
fejl her kunne være.
Hvad er en af ​​de første?
PUBLIKUM: [uhørligt]
DAVID J. Malan: Yeah.
Så vi mangler parenteser.
Det var bevidst, at jeg gjorde parenteser i keynote
glide her, fordi der er faktisk dette begreb af ordre
af operationer, eller forrang, hvorved visse operationer -
multiplikation -
har højere binding, har højere prioritet end ting
som addition eller subtraktion.
Så vi har gjort det i årevis bare at gøre det klart præcis
hvad matematisk operation bør gøres først.
Så jeg burde nok efterligne netop dette.
Ellers er computeren formodentlig vil forsøge at gøre
noget lignende skel 5 af 9, og derefter multiplicere F, derefter trække
32 fra det hele.
Hvilket ikke i virkeligheden, hvad vi ønsker at gøre.
Så lad os parenthesize.
Lad os tilføje mine parenteser her, parenteser her.
Lad os sætte dette herovre.
Her vil jeg blot har bemærket en anden fejl gjorde jeg undervejs.
Ja?
PUBLIKUM: [uhørligt]
>> DAVID J. Malan: Ah.
Godt.
Så vi har faktisk samme heltal
division spørgsmål fra før.
Jeg korrigere, lad os se, hvad symptom er.
Men vi bliver nødt til at rette en
anden fejl her.
Ja?
PUBLIKUM: [uhørligt]
DAVID J. Malan: Ja.
Så dum fejl jeg lavede, men utrolig vigtig.
Computeren vil ikke bare vende det blinde øje, og lad
mig bruge kapital F, da jeg faktisk erklærede den variable
som et lille f her, i linje 8.
Så jeg er nødt til at korrigere i linje 11 min kapitalisering, som en
øjeblik siden var stort F ved en fejltagelse.
Hvad med her?
Skulle dette være små bogstaver så godt?
Det bør være, men det er en tilfældighed.
Denne% f har intet at gøre med den variable.
Så bare for at være super klar her, lad mig gå videre og
omdøbe dette, kort, "temperatur". Lad mig omdøbe
denne "temperatur". Lad mig ikke omdøbe denne.
Fordi, igen,% f globalt betyder, "decimaltalsværdi."
Har intet at gøre med min variabel.
Men "temperatur" over det hele er bare lidt ordrig,
så jeg har tænkt mig at gå tilbage til min lille "f" s.
>> Lad mig gå videre ned til mit vindue her.
Gør f2c -
der var igen den vilkårlige navn jeg
gav til denne fil.
Synes at have kompileret.
Lad mig løbe f2c.
Enter.
Temperatur i Fahrenheit - lad os gøre en let.
32.
OK, korrigere.
Men hvis jeg nu gør 212 til kogning -
damn.
Ok.
Så tydeligvis ikke korrekt, hvis din TF forsøger
mindst to værdier.
Så hvad er problemet her?
Nå, du allerede sætte fingeren på, hvad problemet er.
Men hvorfor er det sådan?
Heroppe. Når jeg laver matematik af 5 divideret med 9
Så begrebsmæssigt, det er helt korrekt.
Fuldstændig i overensstemmelse med formlen.
Men computere kun gøre præcis, hvad du
fortælle dem at gøre.
Og hvad vi reelt fortæller computeren her er
opdele det hele tal 5 ved det hele tal 9
og giv mig resultatet.
Problemet er dog, når du division ved hjælp af data
typer, er udgangen samme datatype som input.
Og så hvis de to indgange er begge int'er er udgangen går
være en int.
Og så 5 divideret med 9 er point noget.
Men hvad er det nærmeste heltal til punkt noget?
Så det er faktisk 0.
Så som vi diskuterede i mandags, alt efter kommaet
punkt bliver afkortet.
Det bare bliver smidt væk.
Så dette er en komplet fejltagelse, fordi jeg kan lige så godt bare
formere alt ved 0 her.
>> Nu kan jeg løse dette i et par forskellige måder.
Jeg kunne gøre dette.
5,0 divideret med 9,0.
Teknisk set har jeg ikke engang behøver at gøre det.
Det er tilstrækkeligt til at bare gøre et af tallene en float -
eller dobbelt - ved at sætte kommaet her.
For hvad der sker nu, er, når du dividerer et heltal ved
en flyder eller en dobbelt, er computeren vil indse
oh, en af ​​dem er mere præcis.
Lad mig fejle på siden af ​​giver dig mere præcision end
du havde tænkt dig.
Så det vil konvertere resultatet -
det vil returnere resultatet som en kommatalsværdi så godt.
Så det ville arbejde.
Det ville virke.
Og der er en anden mekanisme, som vi vil se i
mere detaljeret i næste uge.
Du kan faktisk, som programmøren, fortælle computeren
til rent faktisk at behandle en datatype som
om det var en anden.
>> Så jeg kunne faktisk gøre det.
I parentes kan jeg sige noget lignende (float), åben
paren tæt parentes.
Og det er, hvad der kaldes "casting". Igen, mere
på denne næste uge.
Men dette er kun den programmæssige måde at fortælle
computeren, yeah jeg ved 9 er et heltal eller en lang.
Jeg ved, det er ikke en kommatalsværdi.
Men behandle det som sådan alligevel.
Så for at kaste en datatype midler til at konvertere
fra den ene til den anden.
Helt ærligt, det er bare lidt grim, så jeg vil foreslå, at vi går
tilbage til den oprindelige forslag om blot konvertere
disse ting til kommeværdier manuelt.
Fordi nu er det bare super klart, hvad der sker, og
det er ikke alt, distraherende.
>> Så lad os nu gå tilbage til min terminal vindue.
Gør f2c.
Lad mig gå videre og køre dette.
Og som en sidebemærkning, får du keder skrive disse kommandoer
igen og igen, indse, at computere, som Linux her,
tendens til at være temmelig smart.
Og hvis jeg ramte Up, kan vi gå igennem hele min historie
kommandoer, op og ned.
Så i dette tilfælde her, kan jeg bare gå op at køre gøre f2c.
Jeg bliver råbt på, fordi jeg lige gjorde det et sekund siden.
Det er allerede ajour.
Så nu kan jeg køre f2c igen.
Lad os prøve 32 Fahrenheit.
Lad os prøve 212 Fahrenheit.
>> Pyh.
Synes at virke.
Nu, dette er godt, men det føles lidt vilkårlig, at
Jeg viser seks numre efter de decimaler.
Right?
Hvis du er vejret person på TV, du er sådan en doofus
hvis du læser temperaturen til
denne grad af præcision.
Så lad os forenkle dette.
Så lad os faktisk gå op her, til min printf.
Og ja, jeg vil flyde.
Men jeg vil nu angive præcision.
Og jeg har tænkt mig at være lidt kortfattet.
Jeg har tænkt mig at sige, giv mig et point efter decimal.
Så i stedet for at sige% f, vil jeg sige% .1 f.
Og det betyder bare give mig en position
efter kommaet.
Ok.
Lad os prøve det igen.
Lad mig igen køre det efter kompilering.
Og nu jeg skriver i 32, og jeg kommer tilbage en
mere kortfattet værdi.
Og jeg kan skrive i, nu 212, og komme tilbage en mere kortfattet
værdi så godt.
Og der er andre ting, du kan gøre med printf.
Du kan faktisk angive, hvordan bred nummeret skal være.
Hvis du vil have polstring på den, så du kan højrejustere eller
venstrestille alle dine numre eller
forsøger at center ting.
Så indser at der er små tricks, du kan gøre der.
Men de bare koges ned til at formatere koder,
ligesom vi har der.
>> Så med hensyn til dette nummer af forrang.
Dette er en meget kedelige tabel igennem metodisk.
Men indse, at ophavsmændene til C er kommet op med den
regler, der specificerer hvilke operatører har højere
forrang, mere bindende magt, end andre.
Så mens det i folkeskolen, vi generelt vidste, at det var
multiplikation og division, og derefter addition og subtraktion,
så nogle andre ting.
I en verden af ​​programmering, er der en meget
længere liste af ting.
Og det er ikke noget værd at huske nu.
Du bliver akklimatiseret til det inden længe.
Men ligesom i folkeskolen, parenteser generelt løser
spørgsmålene om forrang, ved at gøre super klart for
computer og human både hvad der er tilsigtet.
Så overveje dette bare en lille snyde ark der.
Men de fleste af disse oplysninger, vil vi ikke komme til i nogen tid.
>> Ok.
Nu, lad os bygge op og flytte væk fra disse tåbelige lille
matematiske eksempler.
Stadig bruge de samme nøgletal, men starte
udtrykke os selv lidt mere som Scratch.
Så i Scratch, havde vi disse boolske udtryk.
Og på engelsk, er et boolesk udtryk hvad?
Sandt eller falsk.
Det er noget, der evalueres til sand eller falsk.
1 eller 0.
Tændt eller slukket.
Uanset hvad du ønsker at kalde det.
Nu i Scratch, puslespilsbrikker lignede dette.
Og det er den kombination, på bunden der, af tre
puslespilsbrikker.
Én sammenholdt -
noget, der har blank og blank.
Og derefter to booleske udtryk i den.
Så du kan indlejre booleske udtryk for at få mere
kompliceret booleske udtryk.
For eksempel, hvis det er lørdag, og er rart
vejr, så gå udenfor.
Eller noget vilkårlig måde.
Så kan du tilmelde dig boolske udtryk til at komme med et
større sandhedsværdi, hvis svaret er baseret
på de mindre.
>> Nu, i C, heldigvis, denne kortlægning er
faktisk ret simpelt.
Parenteser at gøre tingene klart her.
&& Er, hvad betyder "og". Så det er sådan
vi kommer til at konvertere disse blokke fra Scratch til C.
Og for de betingelser, vi så i Scratch, på venstre hånd
side der, kan jeg stable dem på samme måde i C. Hvis x er mindre
end y, så gøre det.
Else hvis x er større end y, så gør det.
Else logisk de skal være ens, så at sige
at de er ens.
Så vi kan nu begynde at bygge disse ting op.
>> Så lad os gøre et eksempel.
Lad mig åbne en fil, der er på kursets hjemmeside, at
Jeg skrev i forvejen.
Det kaldes nonswitch.c.
Og vi vil se hvorfor i bare et øjeblik.
Så i denne fil - nonswitch.c--
først indse, at der er en hel masse
bemærkninger øverst.
Det er bare at forklare navnet på filen, hvad det
gør, og så videre.
Og det tilsyneladende demonstrerer brugen af ​​booleske OG-ning -
konjunktion to udtryk.
>> Så lad os se, hvordan dette program virker.
Jeg inkluderer mine to filer, cs50.h og stdio.h.
Hvis jeg rulle ned, nu til programmet, det er en lidt længere
end vi har skrevet før, men temmelig læsbar.
Så jeg først udskriver til brugeren, på linie 18,
"Giv mig et heltal mellem 1 og 10". Så
det er lige der.
Nu får jeg det hele tal.
Men indse, at GetInt - temmelig simpel.
Det er bare at få en int.
Det kommer til at sikre, at det får en int og ikke en
snor eller en float.
Men det kommer ikke til at gøre nogen form for grænse kontrol.
Det kommer ikke til at filtrere de tal til at være mellem en
bestemt interval.
Så vi er nødt til at gennemføre denne selv.
Så ligesom i Scratch, hvor jeg kunne gøre en konjunktion af
to udtryk, kan jeg gøre det i C som følger.
Hvis n er større end eller lig med 1, og n er mindre end og
eller lig med 3, vil jeg meget vilkårligt dekret,
for at være et lille antal.
Bare for skyld en redegørelse.
Else hvis n er mellem 4 og 6, print "Du valgte en medium
nummer. "Else, hvis n er mellem 7 og 10, print" Du valgte en
stort antal. "Else print" Du vælger et ugyldigt nummer. "
Fordi logisk, der følger hvis vi har
udtømt vores sortiment.
>> Så indse dette er ikke helt hvordan vi skal lave større end eller
svarende til i en matematik klasse.
Right?
Du normalt tegne det på denne måde, med streg under det.
Men der er ingen sådan nøgle på mit tastatur.
Så symbolet i C til ekspression større end eller
lig med er to tegn, og symbolet for mindre end
eller lig med er to karakterer så godt.
Ok.
Så hvis jeg køre dette program, kan du sikkert gætte, hvad det er
vil gøre.
Hvis jeg gå videre og gøre nonswitch, Enter.
Og derefter køre nonswitch.
Giv mig et tal mellem 1 og 10.
Jeg har tænkt mig at give det 11.
Jeg plukket et ugyldigt nummer.
Lad mig prøve nummer 3.
Jeg plukket et lille antal.
Så ret ligetil dér.
>> Hvad hvis jeg ønsker at ændre adfærd af dette program og
gøre noget lidt anderledes i stedet?
Lad mig gå videre og sige dette.
Lad mig slippe af med alt dette.
Og lad mig sige if (n == 42).
Og så jeg har tænkt mig at gå videre og sige print "Du valgte den
rigtige svar. "Else vi vil gå videre og sige,
printf ("Du valgte den
forkert svar "). Okay.
Bare fordi.
>> Nu, et par punkter, vi kan gøre her.
En, jeg ikke skrive det symbol, du vil synes er
mest rimelige.
Når jeg ønsker at kontrollere ligestilling, viser sig, du ikke bruger
lighedstegn.
Du i stedet bruge det lige lighedstegnet.
Og hvorfor kan det være, bare intuitivt?
Yeah.
PUBLIKUM: [uhørligt]
DAVID J. Malan: Korrekt.
Lighedstegnet bruges allerede til opgave.
Nogen troede egentlig ikke dette igennem.
Og så nu, når det kommer til ligestilling test, er vi nødt til
være mere eksplicit, og sige lig ligemænd.
En meget almindelig fejl er at gøre dette.
Og hvis i kontortiden eller engang i næste uge eller i
næste to uger du gøre noget som dette, og derefter
kæmper med det i 10, 20 minutter forsøger at finde ud af
hvad den skide fejl er, indse, at du er en af ​​dem
mennesker, der gjorde denne fejl.
Så super let at lave.
Men målet er nu at afværge denne fejl.
Dette kunne vurdere, fordi hvad er det egentlig sige?
Hvis n får 42.
Så de verbum folk bruger, verbalt, til at udtrykke
begrebet opgave er "får". Så hvis n bliver 42.
Så betyder tildele 42 til n..
Nu har jeg en boolesk udtryk i parentes,
inde i denne tilstand, er den værdi 42.
Right?
For hvis du evaluerer det indefra og ud, det samlede
svar nu, er 42.
>> Så hvis jeg spurgte dig spørgsmålet: "hvis (42)," hvad er
der virkelig siger?
Nå, kan boolske udtryk kun være sand eller falsk.
1 eller 0.
Tændt eller slukket.
Så vi synes at have et hjørne tilfældet her, hvor alle af en
pludselig, jeg siger "hvis (42)". Det er ikke en boolesk værdi.
Så hvad computere gør, er dog det væsentlige svarer
noget, der ikke er 0 er fortolket til at være sandt.
1.
On.
De er alle tilsvarende funktionalitet.
Kun værdien 0, eller søgeordet falske, som vi vil
sidste ende se, er faktisk forkert.
Så "hvis (42)" ville faktisk være sandt, fordi det er ikke-nul.
Så for at være mere præcis her, en boolesk værdi er virkelig ikke så
meget sandt eller falsk, men for denne
tilfældet, hvis er 0 eller nul.
Så falsk eller ikke falsk.
Og det giver os mulighed for at dække alle de mere
muligheder i parentetisk udtryk.
Så vi er nødt til at, nogensinde så omhyggeligt, sige dette -
if (n == 42).
Simpelthen fordi vi er nødt til at angive en test af lighed,
ikke en overdragelse af en værdi.
>> Hvad der ellers er værd at bemærke her?
Disse krøllede parenteser er faktisk ikke nødvendigt.
Jeg har gjort dem bare for at være nit-betyder her.
Men når du har en tilstand, der kun har én linje af
kode, som en bekvemmelighed, behøver programmører ikke behøver at bruge
tuborg-klammerne.
Det er tilstrækkeligt at bare led af æstetiske grunde, og
så skriv din linje kode.
Kun når du ønsker at skrive to linjer kode - for
Eksempelvis ellers printf ("Bye!"). Hvis du ønsker at gøre
at der er dette brydes.
Du kan led alt, hvad du vil, men det faktum, at du har
skrevet to linier kode uden brug af krøllede parenteser
betyder, at dette program ikke ville løbe korrekt eller måske
ikke engang kompilere.
Så for nu at være helt ærlig, tror jeg det bedste vane er bare
bruge de krøllede parenteser, og du vil opdage, at de gør
super klart, hvad der foregår.
>> Også, som en sidebemærkning - især hvis du er blandt dem, der bruger
de anbefalede bøger eller ressourcer online -
indse, at der er denne forestilling om stil i
programmering.
Og nogle mennesker faktisk foretrækker at sætte klammeparentes
herovre på en linje.
Nogle mennesker foretrækker at gøre latterlige ting,
gerne sætte dem her.
Der er ingen forkerte svar, når det kommer til
stil, men dette er forkert.
Men nogle mennesker gør det.
[Latter]
DAVID J. Malan: Så jeg nævner dette nu, simpelthen fordi som
du læse op på tingene i bøger eller på nettet, er du nødt til at få
forskellige budskaber fra forskellige lærere og
forskellige forfattere.
Og bare indse, at funktionelt, de er
generelt ækvivalent, men være konsekvente.
Så i dette tilfælde, vil vi standardisere på de krøllede
seler foring op her til venstre.
>> Ok.
Så lad os gå videre nu, og køre dette, og se hvad der sker
med dette program.
Gør nonswitch.
Så kører nonswitch.
Giv mig et heltal mellem 0 og - så det er ikke relevant
længere, men jeg vil bare vilkårligt sige 42.
Og jeg plukket det rigtige svar.
Nå, lad os faktisk tage dette i en anden retning.
Det viser sig, at der er nogle andre syntaks vi
kan bruge i et program.
Her er et nyt stykke syntaks, der er funktionelt det samme,
men bare introducerer en anden måde at udtrykke os selv.
Så dette er hvad der kaldes en "switch-statement." Og en
switch-sætning som følger.
Det tager i parentes en værdi, som du vil
"Switch" på.
Du ønsker at opføre sig forskelligt baseret på dens værdi.
Så det betyder kontakten på værdien af ​​n..
Og hvad betyder dette?
Tja, hvis n er 1 eller 2 eller 3, gå videre og udskrive "Du
plukket et stort antal "og derefter bryde.
Årsagen til brud er, at vejen C virker, er som
snart den finder en sag, der matcher, det begynder fuldbyrdende
hele koden nedenunder.
Så hvis jeg har én linje kode, som jeg gør her på linie 27, det
bliver henrettet.
Hvis jeg tilføjer en anden linje her, det bliver henrettet.
En anden linje her, det bliver henrettet.
Programmet standser kun udføre, hvad der er under
gældende sag resultatopgørelsen, når jeg udtrykkeligt
sige "pause". Så galt.
Ret, i det foreliggende tilfælde. Som følge
Case 4 eller 5 eller 6, ligeledes vil
at udskrive en besked.
I dette tilfælde antallet medium.
Break.
Sag 7, 8, 9, 10, går det at printe ud "Du valgte en stor
nummer. "Break.
Og så er der bogstaveligt talt et nøgleord kaldet "default"
Det er effektivt ligesom "else" konstruere.
Så ny syntaks, men intellektuelt,
intet overhovedet ny her.
Det er ligesom Scratch.
Hvis ellers hvis, ellers hvis slags blok.
>> Så det er den koblet version af dette program.
Men bemærk, at vi gjorde det med tal her.
Lad mig åbne op for en anden version, bare for at vise
noget lidt mere konkret.
Så her har vi kvaliteter i stedet.
Slår ud du kan bruge kontakter ikke blot på heltal, men på
tegn.
Ikke i alle datatyper, men i det mindste på tegn.
Så her kunne vi gøre noget lignende, hvis værdien af ​​C at
brugeren har indtastet, i ledningen 19, ved hjælp af getchar funktion,
er kapital A eller små bogstaver en, lad os fortolke det som en kvalitet,
og siger, at de plukkes en fremragende kvalitet.
Og ned langs switch-sætningen, har vi andre
tilfælde til "B" s og "C" s og så videre.
Men lad os nu runde ud en anden ting.
Og igen, slags flyver gennem
nogle af disse eksempler.
Men det er virkelig så at vi kan anvende dem, nu -
eller virkelig, bare oversætte dem nu -
til C.
>> Så lad mig gå videre og gøre det.
Jeg har tænkt mig at åbne en ny fil.
Og jeg har tænkt mig at gøre omfatte .
Og så jeg har tænkt mig at gøre int main (void).
Lad mig gemme denne fil som et loop.c.
Blot som eksempel.
Og jeg har tænkt mig at gå videre og gøre følgende.
Jeg vil skrive en meget kedelig program.
Så 10.
Lad os gøre det.
9.
Ok.
Så snart du begynder at gøre dette i programmering, er du
formentlig gør noget forkert.
Men vi vil starte der alligevel.
Ups.
Det er faktisk forkert.
7.
6.
5.
4.
Intet kommer til at ske, når vi kommer til 0.
3.
2.
1.
Okay.
0.
Slet.
>> Ok.
Så returnere 0.
Så dette program er tydeligvis kommer til at gøre, hvad det meget
tediously siger, at det kommer til at gøre.
Det kommer til at udskrive alle dem
værdier, fra top til bund.
Så lad mig gøre lave loop.
Og så - Ups.
Gøre løkken.
Jeg var i den forkerte mappe.
Og lad mig køre loop.
Enter.
Woohoo.
Very nice.
Nice, lange program.
>> Okay, men lad os nu gøre det bedre.
Ligesom i Scratch, da du begyndte at bruge en løkke
konstruere, i stedet for bare at kopiere og indsætte alle de
puslespilsbrikker, lad mig introducere denne ting.
Så i C, er der forskellige looping konstruktioner,
hvoraf den ene ser sådan ud.
A "for" loop har tre ting, adskilt af to semikoloner.
Og derpå, inde i legemet af sløjfen, så at sige - den
stuff indersiden af ​​krøllede parenteser -
vi kan gøre noget igen og igen.
Så hvad jeg har her på skærmen, det er
bogstaveligt talt bare en kommentar.
Den / / betyder her kommer en kommentar.
Dette er ikke kode.
Dette er blot engelsk beskrivelse, for mig, det menneskelige.
>> So startværdier, betingelser og opdateringer.
Nå, lad os se hvordan det virker.
Dette giver mig mulighed for at omskrive dette program som følger.
For -
så her kommer mit loop -
int i -
her kommer en variabel kaldet "i" -
bliver initialiseret til 10..
Så der er min initialisering.
Jeg ønsker at gøre dette loop, så længe "i" er større end eller
lig med 0..
Og på hver gentagelse af denne sløjfe, vil jeg
at gøre i -.
Så vi oplevede + + på mandag.
- Er det modsatte.
Det reduceres værdien med 1.
Inde i denne løkke, vil jeg rent faktisk gøre noget.
Så jeg har tænkt mig at sige noget lignende printf.
Jeg ønsker ikke at sige 10 nu, fordi det tydeligvis er bare
vil udskrive den samme værdi.
Hvad ønsker jeg at udskrive i stedet, sandsynligvis?
Yeah.
Så "i". Så% d, dvs.
>> Så jeg har tænkt mig at stjæle en af ​​disse idéer fra tidligere -
denne substitution for format-koder -
og derefter ned her, i bunden, vil jeg vende tilbage 0, bare
for god foranstaltning.
Men nu har jeg en mere kortfattet program.
Det er kun et par linjer, og ikke nogle 10 eller 11 linjer.
Lad mig gå til min prompt hernede.
Remake loop.
Gentagelsen loop.
Og den forekommer at være den samme.
Nu er programmet er ikke mere interessant.
Men nu kan jeg skrive noget som dette.
Jeg kan ændre dette til 100.
Jeg kan så kompilere mit program.
Og så kan jeg igen køre mit program.
Og nu går det super-hurtigt på nutidens computere.
Men der har jeg -
og faktisk, min tilbagerulning buffer ikke
endda gå så langt.
Der vi går.
Så der har vi alle 100.
Men det er nemt at lave fejl her.
Hvad vil være den forventede adfærd, hvis jeg
uheld gøre det?
Så det føles som uendelig.
Så lad os se, om computeren opfører sig.
>> Så lad mig gå videre og gøre loop.
Og lad mig køre loop.
Så lad os vende tilbage til dette om et øjeblik.
Vi vil lade det køre.
For hvad skal vi tælle op til, minimalt?
Sandsynligvis mindst 2 mia hvis vi har så mange bits, og
vi bruger positive værdier.
Så lad os hoppe tilbage her.
Udover den slags sløjfer, har vi hvad der kaldes mens
løkker. Så ligesom i Scratch, havde du Forever
blokke, og du havde Gentag blokke.
Ligeledes i C, du lige har andre måder
udtrykke dig selv.
Så du har denne opfattelse af en while-løkke, hvor du kan
udtrykke dig lidt anderledes.
Og så har du noget, der hedder en gør-while-løkke,
der fungerer smule anderledes samt.
Og vi vil drille dem fra hinanden over tid.
>> Men lad os tage et kig på denne sidste her.
Hvis vi går ind i -
stadig kører.
Det er temmelig uendelig.
Så lad mig gå ind positivt, og viser, hvordan vi kan faktisk
regere brugerinput lidt mere effektivt.
Det er en temmelig kort program.
Og her har vi, i main, en int n erklæring.
Så giv mig en variabel kaldet n. Nu, jeg bogstaveligt talt sige
"Gør." Og så har jeg fået åbne krøllet
tandbøjle, tæt klammeparentes.
Og så mærke til, lige efter det, det siger, mens n
er mindre end 1.
Så bemærke, at disse linjer -
19 til 24 -
komponere kollektivt en gør-while-løkke.
Og igen, ny syntaks, ikke en ny idé.
Det er bare en anden måde at looping, syntaktisk.
Så hvad betyder dette?
Gør følgende, mens n er mindre end 1.
Så hvad vil jeg gøre?
Jeg forlanger, at du giver mig et positivt heltal.
Så jeg faktisk forsøge at få et heltal fra brugeren.
Men i form af den rækkefølge af operationer her, fordi
så længe betingelse er hernede, jeg derefter vil kontrollere, er n
mindre end 1?
Således antage, at brugeren -
efter at være krævet på denne måde -
typer i værdien 0.
Denne betingelse vil være sand eller falsk?
Nå, det faktisk kommer til at være sandt.
Idet n er 0, og 0 er mindre end 1.
Så hvad betyder det indebærer?
Gør det igen.
Først når denne betingelse evalueres til FALSK.
Hvis jeg skriver i 42.
Nå nej, 42 er ikke mindre end 1.
Derfor er denne sløjfe sker udførelse.
Og så på det punkt, vil programmet sige, tak for
den 42 i dette tilfælde.
Nu hvor du har denne måde at udtrykke dig selv -
Vi bør ikke vente på denne til slut.
Det kommer til at tage noget tid.
Fortsættes næste gang, måske.
>> Men nu, du har evnen til at forhåbentlig at forstå et
bit af geek humor.
Undskyldninger.
Dette er ikke repræsentativt for humor i datalogi
verden, men det er nuttet.
[Griner] Lad os ende på denne note.
Og vi vil se dig på mandag.
[Bifald]