>> DAVID J MALAN: Alle højre, så dette er CS50.
Og det er helt klart en fredag.
Og det er i slutningen af ​​ugen en.
Så du kan huske, at vi slap, sidste gang, med en cliffhanger slags.
Hvorved vi udsætter denne løgn, at ingen uanset hvad du har lært voksende
op, 1 divideret med 10 er ikke i Faktisk 0,1 eller 0,100 eller 0,10 tusind.
Faktisk, hvis vi kompilere dette program, som vi gjorde i går, med,
gøre upræcise, og derefter gør prik, skråstreg, unøjagtigheder,
lærte vi, at dette er, hvad der er 1 divideret med 10 faktisk er.
Så det er egentlig ikke helt tilfældet.
Men det betyder tip på nogle grundlæggende begrænsning af computere.
Og ja, blandt de ting, vi vil gøre
i dag, er at tage et kig på, hvorfor det har skete, hvilke konsekvenser det har,
hvordan menneskeheden har undladt at gribe denne i nogle meget
alvorlig situations-- resultatet af hvilke
har været ganske tragisk og expensive-- samt
tage et kig på, hvordan vi kan faktisk forsvare
mod disse typer af begrænsninger.
Så intuitivt, måske, Derfor er 1 divideret med 10,
ifølge min computer her, ikke kun 1/10, 0,10?
Ja.
Hvad synes du?
>> PUBLIKUM MEDLEM: Den radix er anderledes?
>> David J MALAN: Den hvad er?
Åh, radix er anderledes?
Så ikke helt.
Det er faktisk mere grundlæggende for hardware.
Andre tanker?
Ja.
PUBLIKUM MEDLEM: De repræsentere tal anderledes?
David J MALAN: Så they-- Right.
De repræsenterer tal forskelligt.
Unøjagtigt, tilsyneladende.
Så det is-- Nå, anderledes end hvad?
Eller fra hvem?
Fra os?
PUBLIKUM MEDLEM: Ja.
De behøver ikke bruge decimal system [uhørligt].
David J MALAN: OK.
Så i en vis forstand, ikke gør de bruge decimal system.
Under kølerhjelmen, alt er faktisk, binære,
og det er relateret, faktisk.
Men det er endnu en enklere forklaring end det.
Ja.
>> PUBLIKUM MEDLEM: De kun har så mange bits.
De kan kun lagre op til en vis udstrækning, ligesom med decimaler.
>> David J MALAN: Ja.
Dette er, hvad der virkelig komme på det.
Det viser sig, at computere typisk, altid vil kun
anvende en endelig mængde information at repræsentere noget.
Højre?
Efter alt, har vi kun et fast mængde plads på harddisken.
Vi har kun et fast beløb RAM, eller computer hukommelse.
Og hvis du kun har en fast beløb på noget,
sikkert kan du faktisk ikke tælle op til uendelig eller et nummer, du ønsker.
Du, slags, er nødt til at vælge og vrage, hvad rækkevidde
af værdier, du kommer til at understøtte.
>> Og så for eksempel en uge eller to siden, da vi talte om ASCII,
og vi talte omkring 8 bit, eller en byte, så at sige,
det største antal vi kunne repræsentere med 8 bit var, hvad?
255.
Og vi kan repræsentere 256 samlede værdier men ikke hvis vi bruger en af ​​dem
på 0-- Nå, men hvis vi tilbringe en af ​​dem på 0,
derefter det største antal er naturligvis, 255.
>> Så det viser sig, at det er tilfældet også i denne forbindelse.
Vi begyndte at tale, sidste gang, om flydende tal, som
er forskellige fra heltal i at de har et komma
og forhåbentlig nogle numre Efter dette, men de er for.
En computer er kun typisk går at anvende 32 bit, 64 bit måske
at repræsentere en floating point-værdi.
Så selv om vi er vokset op lære matematik og vide
at du absolut kan have et uendeligt antal numre
efter kommaet, ikke hvis du har begrænset hukommelse.
Du, slags, nødt til at runde, eller vælge og vrage hvilke
numre, du kommer til at repræsentere.
Og så du kan tænke på, i en vis forstand, dette er computerens nærmeste
tilnærmelse til værdien 1/10, at det kan få, med kun 32 eller deromkring bits.
Og det er ikke kun 1/10.
>> For eksempel, hvis jeg ændre dette til 1/3, hvilket vi mener er endnu enklere.
Så 1 divideret med 3.
Lad mig gemme filen.
Lad mig gå videre og kompilere den.
Og lad mig igen køre den.
Også her tilsyneladende, 1/3 ikke 0,3 og derefter et uendeligt antal 3s
derefter.
Du har denne unøjagtighed i slutningen.
Så vi mennesker er korrekte, og hvad du har lært er, i virkeligheden, er korrekt,
men vi ramlede op mod nogle begrænsninger.
>> Og hvad jeg troede vi ville gøre i dag, er at begynde
ved at se på, helt ærligt, det tragiske konsekvenser af denne
Nogle gange, når menneskeheden ikke helt gennemføre
for denne virkelighed og disse begrænsninger.
Og vi vil se en række vignetter fra History Channel, der tager
et kig på hvordan det er gået galt.
Det er omkring 8 minutter lang, og vi vil komme tilbage efter dette
og tage et kig på, præcis hvad der ellers kan gå galt.
Hvis vi kunne dæmpe lights--
>> [VIDEO PLAYBACK]
>> -Computere, Har vi alle kommer til at acceptere de ofte frustrerende problemer,
gå med dem.
Bugs, vira, og software glitches er små priser
at betale for bekvemmelighed.
Men i high-tech og high-speed militære og rumprogram applikationer,
den mindste problem kan blive forstørret i katastrofen.
Den 4. juni 1996 videnskabsfolk forberedt at lancere en ubemandet Ariane 5 raket.
Det var transporterer videnskabelige satellitter designet
præcist, hvordan det at etablere Jordens magnetfelt interagerer
med sol vind.
Raketten blev bygget til Den Europæiske Rumorganisation
og løftes fra sit anlæg på kysten af ​​Fransk Guyana.
>> -Og Cirka 30 sekunder inde flyvningen, de først
bemærket noget gik galt.
At dyserne blev drejelig på en måde, de burde virkelig ikke.
Omkring 40 sekunder inde i flyvningen, klart køretøjet var i vanskeligheder,
og det er, når de lavede beslutningen om at ødelægge det.
En Range sikkerhedsansvarlige med enorme indvolde trykkede på knappen,
sprængte raket, før det kunne blive en fare for den offentlige sikkerhed.
>> -Dette Var jomfru sejlads af Ariane 5,
og dens ødelæggelse tog sted på grund af en fejl
indlejret i rakettens software.
-Den Problem på Ariane var, at der
var et nummer, der kræves 64 bits til at udtrykke,
og han ønskede at konvertere det til et 16 bit tal.
De antog, at antallet var aldrig vil være meget stor,
at de fleste af disse cifre i 64 bit tal var 0'er.
De var forkert.
>> -Den Manglende evne til én softwareprogram til at acceptere
den slags antal genereret af en anden var ved roden af ​​fiasko.
Softwareudvikling var blevet en meget dyrt del af ny teknologi.
Ariane 4 raket havde været meget succes, så meget af den software,
skabt til det var også bruges på Ariane 5.
>> -Den Grundlæggende problem var, at Ariane 5 var hurtigere, accelereret hurtigere.
Og softwaren ikke havde tegnede sig for det.
>> -Den Ødelæggelse af raketten var en enorm økonomisk katastrofe,
alle på grund af et minut softwarefejl.
Men det var ikke den første time data konvertering problemer
havde plaget moderne raket teknologi.
>> -I 1991 med starten af den første Golfkrig,
Patriot missil oplevede en lignende art
af antallet konvertering problem.
Som et resultat, 28 personer, 28 amerikanske soldater
blev dræbt og ca. 100 andre såret,
når Patriot, som skulle at beskytte mod indkommende Scuds,
undladt at affyre et missil.
>> -Når Irak invaderede Kuwait og Amerika lanceret Desert Storm i begyndelsen af ​​1991,
Patriot missil batterier blev indsat at beskytte Saudi-Arabien og Israel
fra irakiske Scud missilangreb.
The Patriot er et amerikansk, medium-range overflade-til-luft-system
fremstillet af Raytheon selskab.
>> -Den Størrelse Patriot interceptor, selv, handler om, omkring 20 fod lang.
Og det vejer omkring 2000 pounds.
Og det bærer et sprænghoved af om-- Jeg synes det er nogenlunde 150 pounds.
Og sprænghoved, selv er en højeksplosiv,
som har fragmenter omkring det.
Kabinettet af sprænghoved beregnet til at fungere som hagl.
>> -De Missiler er gennemført, 4 pr container,
og transporteres af en sættevogn.
>> -Den Patriot anti missilsystem går tilbage mindst 20 år nu.
Den blev oprindeligt designet som en luft forsvar missil
at nedskyde fjendtlige fly.
I første Golfkrig, når at krig kom sammen,
hæren ønskede at bruge det til nedskyde Scuds, ikke flyvemaskiner.
Den irakiske Kraft ikke var så meget af et problem,
men hæren var bekymret Scuds.
Og så de forsøgte at opgradere Patriot.
>> -Intercepting En fjende missil rejser på mach fem
skulle være udfordrende nok.
Men når Patriot blev hastet i brug,
hæren var ikke bekendt med en Irakisk modifikation, der gjorde
deres Scuds næsten umuligt at ramme.
>> -Hvad Skete, er de Scuds der kom i, var ustabil,
de slingrende.
Årsagen til dette, var irakerne, for
at få 600 kilometer ud af en 300 kilometer rækkevidde missil,
tog vægten ud af den forreste sprænghoved og gjorde sprænghoved lysere.
Så nu, Patriot s forsøger at komme på Scud, og det meste af tiden,
det overvældende flertal af den tid, ville det bare flyve af Scud.
>> -Når Patriot systemoperatører indså Patriot savnede sit mål,
de detonerede Patriot s sprænghoved, at undgå mulige tab, hvis det
fik lov til at falde til jorden.
>> -Det Var hvad de fleste mennesker så, de store ildkugler på himlen,
og misforstået som aflytninger af Scud sprænghoveder.
Selv i nat himmel, Patriots optrådte
at være vellykket ødelægge Scuds på Dhahran,
der kunne være nogen fejl om dens ydeevne.
Der, Patriot radar-system mistet overblikket over et indgående Scud,
og aldrig lanceret, på grund af en software fejl.
Det var israelerne, der først opdagede at jo længere systemet var på,
jo større tidsforskel blev, på grund af et ur indlejret
i systemets computer.
>> -Om 2 uger før tragedien i Dhahran,
israelerne rapporteret til forsvarsministeriet,
at systemet var ved at miste tid, at efter ca. 8 timers drift,
bemærkede de, at systemet var blive mærkbart mindre præcise.
Forsvarsministeriet reagerede ved fortæller alle de Patriot-batterier
ikke forlade systemerne i lang tid.
De har aldrig sagt, hvad lang tid var.
8 timer?
10 timer?
1000 timer?
Ingen vidste.
-Den Patriot batteri stationeret på kasernen
på Dhahran, og dens mangelfulde interne ur, havde været på over 100 timer
om natten den 25. februar.
>> -Det Spores tid til en nøjagtighed på ca. 1/10 af et sekund.
Nu 1/10 af et sekund er en interessant nummer
fordi den ikke kan være udtrykt i binær, nøjagtigt.
Hvilket betyder, kan det ikke udtrykkes, præcis,
i enhver moderne digital computer.
Det er svært at tro, men bruge dette som et eksempel.
Lad os tage nummeret, 1/3.
1/3 ikke kan udtrykkes i decimal, nøjagtigt.
1/3 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 form for problem, der skete i Patriot.
Jo længere Systemet kørte den værre tiden fejlen blev.
>> -Efter 100 timers drift, fejlen i tid var kun omkring 1/3 af et sekund.
Men i form af at målrette en missil rejser på Mach 5,
det resulterede i en tracking fejl på over 600 meter.
Det ville være en fatal fejl for soldaterne på Dhahran.
>> -Hvad Skete, er en Scud lancering var opdaget af satellitter tidlig varsling,
og de nye, at Scud var kommer i deres generelle retning.
De vidste ikke, hvor det kommer.
>> -Det Var nu op til radaren komponent i Patriot systemet,
forsvare Dhahran, for at lokalisere og holde styr på de indkommende fjendtlige missiler.
>> -Den Radar var meget smart.
Det ville faktisk spore position Scud
og derefter forudsige, hvor det sandsynligvis ville være,
næste gang, den radar sendte en puls ud.
Det blev kaldt området gate.
>> -Så, Når Patriot beslutter tid nok har
øjeblikkeligt at gå tilbage og checke den næste placering for denne detekteret objekt,
det går tilbage.
Så når det gik tilbage til den forkerte sted, er det så ikke ser nogen genstand
og det beslutter, at der ikke var nogen formål, det var en falsk detektion,
og taber sporet.
Det kommende Scud forsvandt fra radarskærmen,
og sekunder senere, smækkede ind i kasernen.
Den Scud dræbte 28 og var den sidste man fyret under Første Golfkrig.
Tragisk, den opdaterede software ankom til Dhahran den følgende dag.
Den software fejl havde været fast, lukning
et kapitel i den urolige historie Patriot missil.
>> [END AFSPIL]
>> David J MALAN: Så vil vi tage et kig på nogle lignende begrænsninger i bare en smule.
Men først, lad os overgangen til et par FYI er.
Så en-- denne weekend, er der vil være super sektioner,
som er beregnet til at erstatte regelmæssigt planlagte sektioner, som
vil starte en uge dermed.
Tag et kig på CS50 hjemmeside for mere information om dem.
De vil også blive filmet og streamet leve for dem, forhindret i at deltage.
Problem sæt 1 er på Selvfølgelig hjemmeside allerede,
og vi vil tage et kig på at i bare en lille smule.
Og kontortid også vil tage placere denne mandag til torsdag.
>> Så dette var den mest kanoniske program, vi kiggede på sidste gang.
Det er ligesom den enkleste program, du kan skrive i C,
og selv det er lidt af en dristig påstand.
Højre?
Fordi der er en masse tilsyneladende kompleksitet til dette.
Så lad os tage et hurtigt kig på hvad nogle af disse elementer
var, og derefter forsøge at give en mental model for, hvordan
disse enkleste af programmer arbejde, og så vil vi begynde
ser på tingene stadig mere komplekse.
Så denne linje her, fremhævede nu i gul, hvad gjorde vi sige, sidste gang,
at dette gør for os?
Hvad er formålet det tjener?
Nogen fra længere tilbage?
Ja.
>> PUBLIKUM MEDLEM: [uhørligt]
David J MALAN: Godt.
Så det giver dig adgang på kommandoer, eller lad os
kalder dem funktioner, at nogen anden skrev, der er erklæret,
så at sige, i en anden fil.
Så vi vil se præcis, hvad en .h fil er versus en .c fil, vinder.
Men for nu, bare vide at printf, for eksempel,
er blandt de funktioner, der har været anmeldt i en anden fil, et eller andet sted
andet på skyen harddisk, der tillader os at få adgang til printf og bruge det
uden at skulle genopfinde der hjul os selv.
I mellemtiden, main.
Hvad var analog af vigtigste, i sidste uge?
Ja.
>> PUBLIKUM MEDLEM: Grøn flag er klikket på.
>> David J MALAN: Ja.
Scratch er, når grønne flag klikkes.
Det er ligesom brik der skydes ting ud.
Og så ligeledes gjorde verden besluttede nogle år siden, i C,
og en masse andre sprog, hvis du ønsker at skrive et program,
dit første funktion har at blive kaldt, vigtigste.
Og det skal se sådan ud.
Men vi kommer tilbage, anden gang, til hvad, int,
og, ugyldig, betyder i denne sammenhæng.
For nu, de krøllede parenteser er venlige ligesom Scratch s brik form
der indkapsler et bestemt antal linier.
Og blandt på linjerne her, er dette en her.
printf er en funktion, hvis formål i livet er at udskrive en formateret streng.
Og ved formateret, mener jeg du kan tilslutte pladsholder værdier,
og du kan angive, hvor mange decimaler punkter, hvor mange numre der skal udskrives
efter et komma og lignende.
Og printf naturligvis tager en eller flere argumenter eller parametre,
også kendt, mere enkelt, som input.
>> Så printf, som en masse funktioner, tager input.
Og disse indgange omfavnede af de to parenteser her.
Og inde i dem er en indgang.
Det er en streng, som vi har kaldt det, som er blot en sekvens af tegn,
Ligesom et ord eller en sætning, eller et helt essay selv, mellem dobbelte anførselstegn.
Og det er, hvad der kommer til at påvirke adfærd printf fordi, selvfølgelig,
det er bare en generisk print-funktion.
Det kommer ikke til at vide, hvad at udskrive, medmindre du fortæller det.
Og så nogle bagateller.
Hvad gjorde vi siger dette underlige sekvens af symboler er?
Ja.
>> PUBLIKUM MEDLEM: Ny linje.
>> David J MALAN: Ny linje.
Så det viser sig, kan du ikke bare ramt, komme ind, når du skriver programmet.
Generelt er compileren vil få lidt forvirret om, hvad du mener.
I stedet er du nødt til bogstaveligt talt sige, giv mig en ny linje her.
Og så / n er hvad vi generelt kalder en flugt karakter.
Så n for ny linje.
Og compileren kender at når det ser / n,
Det bør faktisk inducere computeren, sidste ende, eller printf, i dette tilfælde,
at udskrive en egentlig ny line, ligesom rammer, indtaste,
tasten på tastaturet.
Og endelig, hvad gjorde vi siger dette stykke syntaks er for?
Hvad betyder det repræsenterer?
Ja.
>> PUBLIKUM MEDLEM: [uhørligt]
>> David J MALAN: Det er bare slutningen af ​​linjen.
Det er i slutningen af ​​sætningen.
Og indse, at vi ikke sætte dem overalt.
Vi har bestemt ikke sætte dem ved enderne af hver linje.
For eksempel er der ingen på første linje, er der ingen på linjen
med, vigtigste, er der ingen efter de krøllede parenteser,
men du vil begynde at se og få fortrolig med, hvor det er krævet.
Og det er næsten altid efter en funktion ringe eller en erklæring, en handling
at du rent faktisk tager.
>> Og ved nu, især hvis blandt de mindre behagelig,
disse er den slags dumme ting at du vil ende med et uheld banging
hovedet mod væggen over.
Fordi du vil være logisk sikker på nogle problemer
du har løst et problem for sæt, og den forbandede ting bare
vil ikke kompilere eller endda køre.
Og så ofte, tidligt, det vil være fordi du gik glip af en parentes,
eller du gik glip af et semikolon.
Og så bare være opmærksomme af disse former for ting,
og forsøge ikke at blive frustrerede over dem, fordi meget hurtigt gør dette
bliver gamle hat.
Men det er meget let at få frustreret tidligt, som følge heraf.
>> Så nu, lad os tage et kig på, hvordan denne linje er faktisk arbejder
og derefter se på en lidt mere kompliceret.
Så vi har herovre, det mulighed for at trække på denne skærm.
Og lad os antage, at dette er min computerskærm,
men jeg skriver det, hej-programmet, og jeg har ikke gennemført, printf.
En anden har gennemført, printf.
Hvem ønsker at hævde at har gennemført, printf?
Hvis vi kan?
Okay, hvad er dit navn?
>> STUDENT 1: [? Copal. ?]
>> David J MALAN: Copal, kom op.
Kom op.
Okay.
Så vi har, her, nogle navneskilte, da vi vil gøre en lille spil af denne.
Og vi vil ringe til dig, printf.
Og hvis du ønsker at komme herover, hvad jeg har netop tegnet på skærmen,
det er ganske enkelt, der er mig, dette.
>> Okay, så, hej mit navn er, printf, hvis du gerne vil sætte det på.
Okay.
Og hvis du kan gå stativ af computerskærmen
som om du er den funktion, kom med denne computer-system.
Og dit formål i livet er til rent faktisk at udskrive noget.
Men meget gerne det program, vi lige haft på skærmen, her,
vi nødt til at faktisk give dig nogle input.
>> Og så, hvis mit input, her, er tilsyneladende, hvad føres til printf,
lad os slags håne det op på denne måde.
Jeg har tænkt mig at bogstaveligt skrive på et stykke papir, "Hej, verden,"
backslash N. Og for at være klar, hvad Jeg har netop trukket på dette stykke papir,
ser sådan ud.
Så når jeg kører dette program, og dette gule linje kode bliver henrettet,
det er som om jeg, det hej programmet, jeg afleverer nogle input ud til en funktion
at en anden skrev.
>> Og hvis du, med din finger, kunne faktisk, med din finger,
tegne på skærmen, uanset det er du er blevet afleveret,
effekten, i sidste ende, er at se nøjagtigt, at der på skærmen.
Og et lille hjørne tilfældet her.
Og godt, bør vi ikke se den, ny linje, på dette punkt.
Det ville være forkert for dig udtrykkeligt at trække newline.
Men hvis vi holdt skrive ord på skærm, ville de ende under dette.
>> Så mange tak, men stick omkring her for blot et øjeblik.
Vi har nu brug for en anden frivillig, hvis vi kunne,
der kommer til at nødt til at spille rollen of-- Det er kun mennesker i orkestret
lige nu.
Hvordan om-- OK.
Lige her.
Kom op.
Hvad er dit navn?
>> STUDENT 2: [? Ivay. ?]
David J MALAN: Beklager?
STUDENT 2: [? Ivay. ?]
David J MALAN: Ethan, kom op.
Nej?
Fik jeg det forkert, selv efter at du sagde det to gange?
Kom op.
Det er svært at høre op her.
OK.
Og jeg er ked af, hvad er dit navn?
>> STUDENT 2: [? Ivay. ?]
>> [? David J MALAN: Ivay. ?] OK.
For nu, hvis du ikke sind, er du getString.
>> STUDENT 2: OK.
Cool.
David J MALAN: Så hvis du gerne vil at stå her for blot et øjeblik,
lad os tage et kig på et lidt mere komplekst program, der
nu har tre linjer kode.
Så vi har en, oplyse dit navn ved hjælp printf; to, en opfordring til getString,
efterfulgt af en opgave til en variabel kaldet, snor s, eller kaldes s;
og derefter en anden opfordring til, printf, men denne gang med to indgange.
>> Så vi har allerede gjort tilstand dit navn, eller rettere, vi har
allerede gjort en printf opkald.
Så jeg har tænkt mig at skrive, dit navn.
Og ja, hvad jeg har tænkt mig at passere, printf, på bare et øjeblik,
er ganske enkelt, dette.
Så hvis du ønsker at gå videre og trække denne på skærmen, det er dit input nu.
Okay.
Og glem streng, vi nu har vores egen linje af kode.
Så i, getString, vi har brug for til rent faktisk at kalde, getString.
Så dit formål i livet er at bare gå ud i orkestret, hvis du kunne,
og få en persons navn.
Men lad os give dig noget at sætte det på.
Hvis du ønsker at gå videre og få en streng,
få en persons navn på det stykke papir, hvis du kunne.
>> Okay.
Og vi vil se, i bare et øjeblik, hvis navn vi får.
I mellemtiden, hvad jeg har tænkt mig at har klar, er et blankt stykke
af papir, hvor, jeg skal at opbevare uanset værdi,
er, at getString vender tilbage til mig, I, er en streng variabel kaldet, s.
Okay.
Så hvad har du her?
Nik.
Okay.
Så vi har Nik navn her.
Så dette er hvad bogstaveligt er blevet returneret
til mig, så at sige, ved getString.
>> Jeg, nu jeg kommer til at udføre venstre side
af dette udtryk, hvor jeg simpelthen kopiere ned, for nutidens formål, Nik.
Så nu har jeg en variabel kaldet, s, lagring Nik navn.
Jeg har allerede afleveret til printf, en tidligere argumentation.
Men i vores tredje og sidste linie af kode, jeg faktisk nødt til at hånd printf
noget lidt different-- "Hej,% s" backslash n.
>> Og så den sidste linje jeg har tænkt mig at send-- det sidste, jeg er
vil skrive ned nu, er dette.
Så de to linjer kode, eller snarere den sidste linje kode,
opfordrer til to inputs-- én, dette, og to, dette.
Så hvis vores printf funktion kan nu tage disse som input,
lad mig rydde skærmen for dig.
Faktisk ikke noget, kan du gå videre.
Vi vil lade det op, da det er på det samme program.
Vi skal se, goddag, Nik.
Okay.
Så det var en hel hoops til at hoppe igennem, bare
at skrive, oplyse dit navn, og, hallo, Nik.
Men denne simple idé om besked forbifarten, input passerer og output modtagelse,
er præcis den model, vi vil have til selv de mest komplekse funktioner.
Så tak så meget til jer begge.
Vi har en dejlig stress bold her for dig.
Og tak til vores getString og printf frivillige både.
Tak.
Okay.
Tak til jer begge.
>> Så vi har talt om hidtil, for det meste om strenge.
Og det viser sig, at C kan faktisk forstå et par forskellige datatyper.
Faktisk, lad os tage et kig på disse her.
Så C, og en masse sprog, forstå ting kaldet tegn.
En char er generelt en enkelt byte eller otte bits.
Og det repræsenterer et enkelt tegn, som bogstavet A eller hovedstaden
bogstavet A eller lille bogstav En eller et udråbstegn,
eller nogen tegn, som du kan skrive på tastaturet, og nogle gange endda mere.
Vi tilfældigvis også at se flåd.
En flyder er generelt en 32-bit værdi, eller fire bytes
fordi igen, en byte er otte bits.
>> Så en float er en flydende pointværdi, noget med en decimal.
Og ja, det er hvad filmen talte
om, når de talte om flydende pointværdier, nogle fast antal bit
anvendes til at repræsentere et reelt tal.
Men der er også ting kaldet double.
Disse findes i Java, hvis du har taget APCS,
og en dobbelt, som navnet heldigvis antyder, er dobbelt så stor som en float.
Det er stadig et reelt tal, det bare har flere bit
med til at være stadigt mere præcise, eller gemme endnu større antal.
int er nemt.
Vi talte om, at sidste gang.
Det er bare et heltal.
Og det er generelt 32 bit eller fire bytes.
>> Og så, hvis du har, lad os nu se, 32 bits-- og vi gjorde dette i uge 0,
nogensinde så briefly-- hvis du har 32 bit, hvad er den største
nummer, du kan repræsentere som et heltal?
Give eller tage?
Det er ligesom 4 milliarder, og det er kun, hvis vi er
repræsenterer kun positive tal.
Hvis du har 32 bit, og du ønsker at repræsenterer negative tal samt,
Deres sortiment er det væsentlige, negative 2 milliarder til positiv 2 mia.
Men generelt vil vi begynde ved 0 gå op til 4 mia.
>> Du behøver ikke at vide præcist, men Vi kan se dette, i virkeligheden, hvis jeg bare
åbne op for en lille lommeregner, her.
Jeg kan gøre 2 32, og det er præcis, hvor stor,
hvor mange værdier, du kan repræsentere, med 32 bit.
Og det er nogenlunde 4 mia.
Så vi vil holde se, at antallet i et par forskellige steder.
Men hvis du har brug for længere tal end det,
det viser sig at der er noget, der hedder en lang lang.
Og en lang lang er generelt 64 bits, som
betyder, at det er en størrelsesorden endnu større end en int.
>> Så kan jeg ikke engang udtale det største nummer, som du kan repræsentere,
men det er markant større.
Nu som en sidebemærkning, historisk, hvis en int er 32 bits,
og en lang lang er 64 bits, hvordan stor er en lang, ikke en lang lang?
Du ville synes, det er længere end en int men måske mindre lang end en lang lang,
men det faktisk afhænger af.
>> Og så viser det sig, en af de frustrationer også,
med at skrive kode på visse systemer, er, at ikke alle disse datatyper
har forud fastsatte værdier.
Nogle gange er det så mange bits.
Nogle gange er det at mange bits.
Så du faktisk nødt til at vide, nogle gange, hvilken hardware
du kører din software på.
Heldigvis, andre sprog og andre datatyper, der nu findes,
tillade dig at være mere præcis.
Nå, vi så streng, og vi så bool, også,
men det viser sig de kommer kun med CS50 biblioteket.
Så dem er ikke bygget i C. De stedet,
kommer i denne fil kaldet CS50.h, at vi vil til sidst
skrælle lagene af.
Men for nu, de er bare yderligere datatyper.
En bool er en sand eller falsk, og en streng er en sekvens af tegn,
ligesom et ord.
Nu printf, vi har set, har pladsholdere,% s er én.
Og du kan være i stand til nu, udlede disse andre eksempler, hvordan
du kunne have en pladsholder for forskellige datatyper.
For eksempel tage et gæt, hvis du ønskede at udskrive en enkelt char hjælp
printf, pladsholderen er formentlig% c.
Og hvis du ønsker at udskrive en heltal med pladsholder,% i.
% LLD er en lang lang decimal værdi, men lang lang, så der er knyttet til det.
Og så% f til flydende punkt værdi eller for en dobbelt,
så nogle gange de er genbruges i forskellige sammenhænge.
Så vi vil se og bruge nogle af dem over tid.
Og printf og andre funktioner også støtte andres escape-sekvenser,
og nogle gange, de er nødvendige.
Så backslash n er en ny linje.
Backslash t, der nogen ønsker at tage et stik?
PUBLIKUM MEDLEM: Tab.
David J MALAN: Tab.
Så hvis du rent faktisk ønsker at udskrive en fane, ikke
et fast antal rum, men en faktisk tabulatortegn, behøver du ikke rammer din,
fane, tasten på tastaturet, generelt, du rent faktisk gør backslash t.
Omvendt skråstreg dobbelt tilbud, hvorfor skulle jeg nogensinde ønsker det?
Højre?
Hvorfor kan jeg ikke bare skrive et dobbelt citat på mit tastatur?
Publikumsdeltager: Fordi, ellers er det
kommer til at synes, det er enden af lide din print [? tekst. ?]
>> David J MALAN: Præcis.
Husk, med vores printf eksempler, når vi
passerer til printf i input, på venstre side af denne inputstrengen
og til højre for denne indgang foråret, selvfølgelig, var en dobbelt citat.
Hvis din egen indgang har en dobbelt citerer i midten af ​​denne,
computeren måske potentielt blive forvirret med hensyn til,
gør denne dobbelte citat hører hjemme i midten?
Er det hører med venstre en?
Er det hører med den rigtige?
Og så, hvis du ønsker at gøre det super klar, du omvendt skråstreg dobbelt tilbud,
så det er flygtet, så at sige, og det er ikke smelter sammen til noget andet.
Og der er et par andre her, backslash r, enkelte anførselstegn, 0,
at vi kan se over tid, så godt.
Og nu, hvad med funktioner?
>> Så handlinger, vi kan tage hidtil i dette sprog, C, ja, vi har set,
printf, selvfølgelig, og alle af de andre på skærmen,
her, at vi vil bruge til kursets første par kun uger,
komme, når det CS50 biblioteket.
Og de gør det meget lettere, i C, til rent faktisk at få brugerinput.
Det viser sig, at i C, og ærligt i et par sprog,
det er en reel smerte i nakken til at gøre noget simpelt, ligesom prompt brugeren
til tastatur, for hans eller hendes input.
Og så disse funktioner gør det lettere.
>> Og det har også fejl kontrol hele vejen igennem,
således at, når man huske på onsdag, vi
så, prøve igen, advarsel, når jeg ikke samarbejdede,
og jeg har skrevet et ord, i stedet for et nummer?
Vi har gjort det tunge løft tidligt på at sikre, at brugeren samarbejder.
Men disse er blot uddannelse hjul, vi vil i sidste ende,
og hurtigt, take off.
>> Så for at opsummere, så lad os tage et hurtigt kig,
meget som vi gjorde med Scratch, på nogle kanoniske konstruktioner i C.
Dette menes at, sortere af, være en hurtig rundvisning,
bare så du har en reference og at du har set tingene i første omgang.
Men så vil vi se på faktiske kodning bruge nogle af disse byggesten.
Så meget gerne i Scratch, når vi havde udsagn kan lide,
sige eller, vent, i C, har vi funktioner samt, ligesom printf.
>> Hvis vi ønsker at udtrykke en tilstand i C, det ligner, i ånden,
denne puslespilsbrik, der lignede dette i Scratch.
Men i stedet, vi bogstavelig talt bare skrive, hvis.
Og så, i parentes, vi sætter en betingelse,
hvor denne betingelse er, hvad vi får ringe, igen, en boolsk udtryk.
Og igen, det er en slags pseudokode.
Og i virkeligheden, // er en kommentar.
Det er bare engelske ord til mig selv.
Men dette er den generelle struktur af et, hvis tilstand.
Men vi vil se beton eksempler på blot et øjeblik.
>> Hvis du ønsker at have en to-vejs gaffel i vejen,
meget som vi gjorde med vores frivillige på Onsdag kan du have en, ellers hvis.
Og hvis du ønsker at have en tredje og sidste betingelse, eller standard situation
du kan have bare en anden blok, der.
Og tilsvarende, med boolske udtryk, du kan, og, dem sammen.
Og vi så på onsdag, at det er ikke en enkelt-tegn,
det er to, for lavere niveau grunde, vi vil i sidste ende se og lege med.
Eller-ing ting sammen er 2 lodrette stænger.
På en amerikansk tastatur, dette er generelt en vigtig
med Shift-tasten ovenfor din Enter-tasten eller tasten Return.
>> Så er der disse ting, vi vil bruge måske en gang eller to gange.
De er funktionelt ækvivalente med hvad du kan gøre med en, hvis ellers hvis,
ellers hvis ellers, konstruere, men de kaldes en switch.
De ser meget forskellige, men vi vil se i nogle af vores fordeling kode,
for en fremtidig problem sæt, mest sandsynligt, at det er nogle gange bare et smukkere
måde at udtrykke helhed bundt af betingelser,
uden at have en masse krøllede parenteser og en masse parenteser og indrykning.
Men de giver os ikke mere strøm, end vi allerede har.
Og nu sløjfer.
Og denne ene, vil vi se på en lidt langsommere.
Men så vil vi begynde at bruge disse, især for dem, der allerede kender.
Dette er den kanoniske måde, hvis utroligt Uforståelige måde at skrive en løkke i C.
>> Nu er en løkke i Scratch var temmelig ligetil.
Du har en, for evigt, blok.
Du har en, gentag, blok med bare et nummer, du er nødt til at skrive i.
Og med, for-løkke, kan du gennemføre begge disse idéer,
men det er lidt mere teknisk.
Men helt ærligt, det er også forholdsvis enkel.
Når du kender rækkefølgen af operationer, du bogstaveligt talt
er lige til at tilslutte værdier og fortælle computeren, hvad de skal gøre.
Så her er et eksempel.
Dette er en løkke, der helt simpelthen, tæller fra et nummer op
gennem en anden.
Og blot ved et blik på det, selvom du har
nogen forudgående erfaring med dette sprog, hvilket nummer
betyder det sandsynligvis begynde at tælle på?
OK, 0.
Og jeg gætte det er fordi du se, at der er en int og en i,
som er en variabel.
Det er initialiseret til 0.
>> Og senere, det ligner vi passerer printf, er en værdi.
Og i virkeligheden, jeg lavede en lille tastefejl her.
Men der er let fast.
Lad mig tilføje, jeg her.
Vi har nu printf væren øjeblikkeligt at pladsholder værdi.
Og hvad der kommer til at tælle op igennem?
PUBLIKUM: 50.
50.
49.
DAVID J MALAN: 49.
Så 50, ved første øjekast, synes rigtigt.
Men at det viser sig, vil være vores betingelse, at vi holde kontrol.
Og vi kommer til at stoppe, når Jeg er ikke længere mindre end 50.
Så denne løkke, omvendt, bør udføre, så længe jeg er mindre end 50.
Men så snart det bliver 50 eller 51, eller værre, bør det stoppe automatisk.
Okay.
>> Så hvad sker der egentlig her?
Så dette er rækkefølgen af operationer for en løkke.
Én, har du såkaldte initialisering.
Denne gule fremhævet chunk af eksekveres først,
og det har den virkning, pr Onsdag du sandsynligvis forestille sig.
Det skaber en variabel kaldet jeg, og det butikker i denne variabel værdien 0.
Så jeg er 0 på dette tidspunkt i historien.
>> Den næste ting, sker i denne konstruktion,
er, at betingelsen bliver kontrolleret.
Så jeg tjekke med det samme, er jeg mindre end 50?
Og selvfølgelig svaret for nu er, helt sikkert, ja.
Ja, fordi jeg er 0, og det er helt sikkert mindre end 50.
Så hvad sker der, er, at dette linje kode bliver henrettet.
Og i virkeligheden, hvis der er flere linjer kode i de krøllede parenteser,
de alle bliver henrettet den ene efter den anden.
>> Og effekten her, er tilsyneladende, at udskrive
antallet I, som kommer til at være 0, og derefter 1, og derefter 2.
Men hvorfor?
Hvorfor det bliver øges?
Nå, den fjerde ting, sker er, at denne syntaks
bliver henrettet, efter semikolon.
Jeg ++ er en forkortelse måde at sige; tage værdien af ​​i, og der tilsættes 1 til det;
og derefter den næste gang, tilføjer 1 til den; og næste gang,
tilsættes 1 til det.
>> Så hvis vi holde gå, hvad der kommer til at ske
næste er jeg ikke kommer til at initialisere jeg nogensinde igen.
Hvis jeg holdt initialisering I 0, dette eksempel
aldrig ville ende, fordi jeg ville blive hængende ved 0.
Men hvad der vil ske, er at betingelsen vil blive kontrolleret,
den linje kode vil blive henrettet, det jeg vil øges,
tilstand vil blive kontrolleret, kode vil blive udført.
Og det holdt cykling igen, og igen og igen,
indtil jeg ++ inducerer en værdi på 50.
>> Betingelsen derefter siger, er 50 mindre end 50?
Svaret er naturligvis nej, og så hele koden stopper udførelsen.
Og hvis du har mere kode på skærmen dernede, det er hvad der sker næste.
Det springer ud af disse krøllede parenteser og fortsætter med at udskrive mere efter det.
>> Så en joke nu, fra Foxtrot, at vil du måske nu forstår.
Det er altid sjovt.
Det er ligesom de chuckles slags sive,
og så du er klar over, bør du ikke være griner på humor som denne.
Men der er nogle takeaway her, pædagogisk, også.
Så det viser sig, at jeg er mangler et stykke af syntaks,
eller Foxtrot s mangler et stykke syntaks her.
Hvad mangler, at vi har haft i hvert andet eksempel, hidtil?
Return, er der, så det er noget andet,
at vi vil komme tilbage til inden længe.
Hvad mangler, selv?
Ja.
>> PUBLIKUM MEDLEM: Den initialisering af [uhørligt].
>> David J MALAN: OK.
Så ja.
Så faktisk, det is-- Nå, og optælling initialiseres
op over, eller rettere, erklærede op over.
Så dette er en anden måde at gøre det.
Men ikke på en linje, det er gyldigt selv.
Hvad med her?
>> PUBLIKUM MEDLEM: Er det de krøllede parenteser?
>> David J MALAN: Ja.
Så de krøllede parenteser mangler.
Men denne kode, jeg mener, at deres kredit, er faktisk, syntaktisk gyldig.
Det viser sig, ikke gør du har brug for de krøllede parenteser
hvis du kun har én linje kode, der du ønsker at udføre inde i sløjfen.
Nu er vi altid, i klassen og i alle vores distributionen kode,
omfatter de krøllede parenteser alligevel, bare for klarhedens skyld.
Men indse, at i lærebøger og online eksempler,
du kan meget vel se krøllet seler mangler engang.
Og det er OK, hvis det, du har indrykket og bestemt
er blot en enkelt linje kode, og ikke flere linjer kode, potentielt.
Okay.
Så relateret til spørgsmålet om unøjagtighed, er et spørgsmål om overløb,
i den forstand, tilsvarende, behøver heltal har grænser for dem
ligesom floating point-værdier?
I verden en floating point værdier, kan vi kun være så præcise,
hvorefter, undertiden dårlige ting kan ske,
og vores programmer kan være fejlbehæftet og fejl.
Nu selv med heltal, du kan løbe ind i problemer.
Nu et helt tal ikke har en decimaltegnet eller tal efter det.
Det er bare et naturligt tal, typisk.
Så hvad der kunne gå galt med en int?
Hvis jeg bruger en int til tæller, hvad der kunne gå galt?
Synes meget enklere.
Ja.
>> PUBLIKUM MEDLEM: Hvis nummer får [uhørligt]
>> David J MALAN: Ja.
Hvad hvis du tæller så højt, at man kan ikke udtrykke det helt store nummer.
Højre?
På et tidspunkt er du nødt at overskride grænserne
af en 32-bit værdi eller en 64-bit værdi.
Nu igen, jeg er ikke sikker på, hvordan man udtaler en 64-bit værdi,
men jeg ved med en 32-bit heltal, den største værdi, det kan være,
hvis det er eneste positive værdier, er omtrent 4 mia.
Så hvis jeg prøver at tælle til 5 milliarder, noget kommer til at ske.
Men lad os se hvad, i virkeligheden, kan ske.
I en verden af ​​heltal overløb, hvor man, på en måde,
overløb af kapaciteten på et heltal, hvad der kan ske?
>> Så her er et binært tal, Det er en tilbagevenden til 0.
Det er alle 1 s, og pladsholdere der er kræfter på 2,
så dette er binær.
Så disse er 8, 1 bit på skærmen.
Og hvis du husker eller du hurtigt gøre det math,
hvad værdi er repræsenteret her med disse otte bits 1?
255.
Og selv hvis du ikke var helt sikker af matematik, kan du gøre det ud.
Eller du kunne bare lidt fornuftens igennem det,
vent et øjeblik, hvis jeg svarende til en 8 bit værdi,
og jeg har fået 256 mulige værdier, men hvoraf den første er 0,
Jeg ved bare, at det største kommer til at være 255,
og det er hvad denne ene kunne være.
>> Så formoder jeg forsøger at tilføje 1 til denne værdi.
Hvad ville du gøre i lønklasse skole, når du tilføjer en 1, og det
ikke rigtig passer, fordi du er nødt til at bære en?
Hvad er dette tal går at blive, når du tilføjer 1?
Det kommer til at blive 0.
Højre?
For hvis du havde mere bits-- og jeg vil forsøge at, sådan, skal du skrive det ud her--
hvis vi havde flere bit, hvad vi kunne gøre her tilføje 1,
og så ville vi få dette.
Hovsa.
Vi ville have en 1 bit hele vejen herover.
>> Men hvis det er en begrænset værdi, er det kun 8 bit,
og det er forudbestemt af computeren,
at 1 er effektivt ikke er der.
Det bare sådan falder ud fra en klippe.
Og så hvis du tilføjer 1 til 255, hvad værdi har du tilsyneladende får?
0.
Og så tal uheld, og måske, utilsigtet,
ender indpakning rundt som dette.
Så hvad kan være konsekvenserne af dette?
Tja, der er et par forskellige ting.
Så en, betyder det ende med at se like 0, utilsigtet,
men du kan slags se, selv i den virkelige verden,
for bedre eller værre, manifestationer af denne idé om en grænse.
For eksempel nogen af ​​jer, der nogensinde har spillet Lego Star Wars,
Er der nogen tilfældigvis kender det maksimale antal mønter
du kan samle i Lego Star Wars?
Tage et gæt baseret på nutidens førende spørgsmål.
Det er større end 256 eller 255.
Det er 4 mia.
Så det viser sig, og der er nogle people--
nogle googling bekræftet sidste night-- har fået 4 milliarder guldmønter,
eller whatnot, i Lego Star Wars.
Selvom tilsyneladende er der en måde at narre spillet,
der er en fejl eller funktion, der lader dig bare tilfalde masser og masser af point.
Men den største mulige værdi i overensstemmelse
til dette skærmbillede af en person, jeg findes online, er faktisk, 4 milliarder.
>> Nu hvorfor er det?
Det er præcis 4 milliarder, formentlig fordi nogen har besluttet,
der skrev dette spil, at de kunne gøre 4 milliarder,
noget, noget, noget, ligesom værdien jeg sætte op
med lommeregneren tidligere, men det er bare en lidt renere for mennesker
at sige det maksimale antal af coins-- eller nitter,
som de kalder them-- at du kan indsamle er 4 mia.
Og ja, hvorfor er dette?
Hvordan er LEGO spil gennemføre tælleren
der er holde styr på antal mønter, du har?
De bruger hvad?
PUBLIKUM MEDLEM: Det standser tælle efter 4 mia.
David J MALAN: Det standser tælle efter 4 milliarder,
hvilket betyder at du kan udlede, som programmør,
at de er formentlig anvendelse af en 32 bit heltal.
Ligesom programmøren bogstaveligt talt bare maskinskrevet, int, i hans eller hendes kode,
og det er den type variabel, der de bruger til at gemme en andens kode.
Så der er andre manifestationer af disse former for grænser.
>> Så jeg har ikke spillet denne game-- og jeg læste op på historien
at bekræfte som much-- men i oprindelige version af Civilization, hvor
du tilsyneladende interagerer med hver anden og kan føre krig eller fred,
Gandhi skulle være en af de mest fredelige karakterer, som jeg
forstår det, i det første version af Civilization.
Og i virkeligheden, på en skala fra 1 til 10, hans aggressivitet var bare en 1.
Så nogensinde så mildt aggressiv, tilsyneladende.
>> Men på et tidspunkt, kan du tilsyneladende installere demokratiet i din geografi.
Og hvis du installerer demokratiet ind i din version af spillet,
så vil din aggression niveau går ned.
Det er en god ting.
Folk er mere rolige tilsyneladende, i den situation.
Men tilsyneladende, nogen gjorde ikke en, hvis tilstand
i den oprindelige version af koden.
>> Så Gandhis aggression niveau gik fra positiv 1, minus 2, til negativ 1,
men spillet ikke forstå negative tal.
Så hvad der skete, var Gandhis aggression niveau gik fra 1 til 0, negativ 1,
som havde den virkning, indpakning omkring at være
den mest aggressive karakter i spillet, til en værdi af 255,
på en skala fra 1 til 10.
Og siden da, har der været flere inkarnationer af dette spil,
og de har holdt det som en slags påskeæg,
at Gandhi er tilsyneladende så frygtelig aggressiv.
Men det var resultatet af en meget simpel programmering fejl
ved, at meget tidlig version af spillet.
>> Nu mere foruroligende, mere nylig, Boeing 787
blev dokumenteret at have en bug, ikke den form for indretningen
du især ønsker at have en fejl.
Og symptomerne, at jeg vil læse her, fra en artikel på nettet,
var dette en model 787 fly der er blevet drevet kontinuerligt
til 248 dage kan tabe alt vekselstrøm, AC,
elektrisk strøm, som følge af generatorens styreenheder,
GCUs, samtidig gå i Fail-safe mode.
Så det var en advarsel udstedt Når dette problem blev opdaget.
Denne betingelse er forårsaget af en software tæller,
internt i GCUs, så et helt tal eller en variabel,
der vil overløb efter 248 dage af kontinuerlig effekt.
Boeing er i færd med at udvikle en GCU softwareopgradering, der
vil afhjælpe det usikre forhold.
>> Så meget ligesom missil scenario, hvor
de havde en slags variabel der blev tælle og tælle,
og tælle, men efterhånden overfyldte grænserne for sin evne,
ligeledes gjorde pokkers fly har en variabel overløb
efter tid nok af at køre.
Og så tungen-i-kinden måde at arbejde omkring dette emne
er lige, genstart, dit fly hver 247 dage, således at hukommelsen bliver udslettet
og den variable går tilbage til 0.
Men indse, dette er en meget store inkarnation af software,
men især fordi vi hører om Apples operativsystemer går ind i biler,
og selv-kørsel biler fra Google, og hvilket som helst antal inkarnationer af software
i vores dagligdag, tv og ure, og meget mere,
indse var omgivet af software, som alle er skrevet af os mennesker.
>> Og som vi alle hurtigt opdage, det er meget nemt og meget typisk
at lave fejl, når du skriver software.
Og hvis du ikke fange dem, nogle dårlige ting kan ske.
Nu undertiden nogle sjove ting kan ske,
eller i det mindste nogle gange vi ved, at forvente nogle ondskab.
Så 0 divideret med 0, fra lønklasse skole, er generelt en dårlig ting.
Det er udefineret.
Og det viser out-- og lad os se om min mic kan vælge dette up-- at Apple
havde lidt sjov med det for nylig.
Så jeg har en iPhone her.
Jeg har tænkt mig at tale til Siri og bede hende at give mig svaret på 0 divideret med 0.
Hvad er 0 divideret med 0?
>> SIRI: Forestil dig, at du har 0 cookies, og du opdele dem jævnt
blandt 0 venner.
Hvor mange cookies gør hver person får?
Se?
Det giver ikke mening.
Og Cookie Monster er trist at der ikke er cookies.
Og du er trist, at du har ingen venner.
David J MALAN: Det er lidt klamt.
Så dette er, hvad der lige sagde der.
Det er ubestemt, er det ikke defineret, Og ja, mange programmeringssprog
eller virkelig, compilere vil detektere, når man i et program,
forsøger at opdele 0 med 0.
Sjovere end dette er dog, som tilsyneladende, Cookie Monster
er på Twitter i disse dage.
Og han svarede denne, med dette, som er helt bedårende.
Men lad os tage et hurtigt kig på et par andre konstruktioner,
og derefter sætte nogle af dette kode til brug, i gode måder.
Så det viser sig, foruden efter sløjfer, der er
noget, der hedder en while-løkke, der ser anderledes ud og implementeres
lidt differently-- og vi vil til sidst se examples--
men i en vis forstand, er det enklere, fordi det
ikke tillader dig at formatere og opdatere inden for grænserne af løkken.
Du kan stadig gennemføre den.
Så du kan gøre præcis de samme ting med en while-løkke, som med en for-løkke,
men din syntaks, ultimately-- som vi vil i sidste ende
see-- bliver anderledes.
Der er endda en gør while-løkke, som er faktisk lidt anderledes,
i, at mens en for-løkke og en while-løkke altid
kontrollere deres tilstand først, hvis du læser denne ting top til bund,
den slags ser ud som det kommer til at tjek det tilstand sidste, fordi det er
virkelig den sidste linje kode.
Og ja, der kommer til at være nyttig i visse programmer, som vi skriver,
hvis du vil bare blindt at gøre noget og til sidst kontrollere tilstanden.
Det er ikke nødvendigvis en dårlig ting.
Hvis vi ønsker variabler, kan vi gøre det i et par forskellige måder.
Og vi så i foxtrot tegneserie, en måde at gøre det,
hvor du erklære din variabel, ligesom int counter semikolon,
og derefter later-- måske den næste line, måske 10 linjer later--
du rent faktisk initialisere det.
Så disse 2 linjer kode erklære en variabel af typen int
og kalder det tæller, så det giver mig nok bits til at holde en int.
Og så til sidst, det sætter værdien 0 i denne variabel.
Det arrangerer 0'er og 1'er i en mønster, som vi kender fra sidste uge,
repræsenterer det antal, vi kender som 0.
Eller ærligt, kan du gøre det meget mere kortfattet, ligesom dette.
>> Nu har vi også den evne til at kalde funktioner.
Og i virkeligheden, her er en 2 linje program, eller et uddrag heraf,
der tillader os at faktisk skrive noget kode,
får en snor fra user-- meget ligesom vores frivillige et øjeblik ago--
lagring af resultatet i en variabel kaldet navn,
og then-- meget gerne med vores frivillige med printf-- udskriver disse værdier
ved at passere i to argumenter, den streng, efterfulgt af variable
kaldes, navn, selv.
Så lad os tage et kig, før vi kommer tilbage til Mario der,
på et par nu, eksempler på dette.
>> Jeg har tænkt mig at gå videre og åbne op, lad os sige, funktion-0.c.
Og som altid, denne kode er tilgængelig på kursets hjemmeside,
så du kan spille sammen på hjem og se på det senere.
Men her er programmet i det essens, fra linje 17 til 22.
Hovedprogrammet er hvor Programmet vil altid starte.
Dette program, tilsyneladende, går at udskrive dit navn, kolon.
Det er derefter vil kalde getString, ligesom vi gjorde med vores frivillige.
Og derefter, det er interessant, det kommer til at kalde PrintName.
Det viser sig, al denne tid, der synes at være en funktion kaldet PrintName.
Der udskriver en persons navn.
Vi behøvede ikke at bruge printf fra Gårsdagens, er der PrintName.
>> Men det er misvisende fordi PrintName ikke
komme med C. folk ikke opfinde det nogle 40 eller 50 år siden,
Jeg gjorde, i stedet for.
Og i virkeligheden, hvis jeg ruller yderligere ned, varsel
hvordan jeg kan skrive min egen funktioner i C. Vi vil i sidste ende
forklare, hvorfor vi bliver ved at sige, ugyldig, i et par steder,
men for i dag, lad os bare se på navnet.
>> På linie 24, hvis du vil oprette din egen funktion,
du bogstaveligt talt skriver funktionens navn.
Jeg valgte PrintName.
I parentes, du derefter angive, hvilke former
af input, og hvor mange du ønsker, at denne funktion til at tage.
I dette tilfælde, jeg ønsker at tage 1 variabel kaldet, navn,
og det kommer til at være af type, snor, så det kommer
at være nogle sekvens af tegn.
Og så, denne program-- meget gerne i Scratch,
du kan have brugerdefinerede puslespil pieces-- kommer til at have denne skik adfærd.
Det kommer til at kalde printf passerer, hallo, pladsholder,
og så det kommer til at tilslutte uanset brugeren kaldes.
>> Så dette er et eksempel på, hvad datalog ville
opkald abstraktion eller funktionelle nedbrydning, der er lige
fancy måder af saying-- er, hvis du kan lide dette høje niveau idé,
ligesom jeg vil have funktionalitet, udskriver en persons navn, absolut du
kan bogstaveligt talt skrive printf og derefter passere i de argumenter, du ønsker,
og programmet vil arbejde, som det har siden onsdag.
Men du kan begynde at abstrakte væk begrebet udskrive et navn.
Du kan give den et navn, Ligesom PrintName, og dette
er denne idé om lagdeling fra uge 0.
>> Fremover, jeg og du ikke behøver at vide eller pleje, hvordan PrintName er implementeret.
Ja det bruger printf, måske det ikke, der ved, hvad bruger?
Og hvad så?
Nu er jeg taler heroppe, i stedet for hernede.
Og ja, da vores programmer får mere avancerede og sofistikerede,
vi kommer til at holde tager for givet at lavere niveau puslespilsbrikker eksisterer.
Fordi vi skrev dem eller en anden gjorde, så
at vi så kan bygge oven på dem.
Lad os tage et kig på denne variant, fungerer én.
>> Så denne ene er lidt mere avanceret, men det viser sig
at i CS50 bibliotek, der er kun en GetInt funktion.
Vi troede ikke, år siden, at gennemføre en GetPositiveInt funktion.
Og det er lidt irriterende, fordi hvis du fyre skriver et program, hvori
du ønsker at få en positiv heltal fra brugeren,
du kan absolut bruge GetInt.
Og du kan absolut tjekke med tilstanden og måske en løkke
hvis det int er større end 0 og råbe på brugeren
hvis han eller hun ikke giver du et positivt tal.
Men lad os bygge denne bygning blokere os selv, en,
brugerdefinerede Scratch brik, hvis du vil.
Jeg har tænkt mig at have et program her som i sidste ende, jeg
ønsker at være i stand til at ringe GetPositiveInt, og jeg ønsker at være
i stand til at udskrive hvad det int er.
Men det er indvindes væk nu.
Det er bare blevet givet et højt niveau navn, der siger, hvad den gør,
som er vidunderligt, fordi det er meget intuitiv nu at læse.
Og hvis jeg ligeglad gøre hvad der er nedenunder hætten, lad mig rulle ned.
Og det er lidt skræmmende ved første, især
Hvis dette er dit første program, men lad os tage et kig.
>> Jeg ikke længere sige, ugyldig, fordi det viser sig funktioner,
meget gerne getString, kan returnere en værdi for mig.
De har ikke bare have at udskrive til skærmen,
de kan faktisk hånd mig noget tilbage.
Og mens før PrintName, Jeg har ikke brug for noget tilbage.
Jeg havde brug for den bivirkning af noget viser op på skærmen,
men jeg har ikke brug for et menneske at aflevere mig noget tilbage.
Her, med GetPositiveInt, lignende med GetInt,
Jeg ønsker at blive udleveret noget tilbage.
Så jeg siger ikke, ugyldig, på linie 23, men int,
som siger, denne funktion at jeg skriver,
kaldet GetPositiveInt kommer til at hånd mig tilbage et heltal, ikke noget,
ikke ugyldig.
>> I mellemtiden er det kommer til at tage nogen indgange, så jeg har, sådan, vendt det.
Jeg giver ikke GetPositiveInt nogen input, jeg vil have det til at give mig sin produktion.
Og hvad sker der nu?
Så her er hvordan jeg kan erklære en variabel.
Jeg har gjort det uden for løkken, af årsager, vi vil til sidst se,
men dette blot giver mig 32 bit kaldes, n,
og jeg har pre-bestemmende dem til at gemme heltal.
Og her er det, gøre, mens konstruktion, og det er derfor, det er nyttigt.
Bogstaveligt talt gør dette, mens n er mindre end 1.
Så lad os se hvad der sker.
Jeg udskrive, skal du give mig en positiv int.
Jeg så få en int, ved hjælp CS50 s fungere og lagres i n.
>> Og så, hvad linje kode sandsynligvis bliver udført næste, logisk?
Hvilket linjenummer?
Ja, så 31.
Du ville ikke vide dette, indtil du har fået at vide eller slags udlede det,
men det er sandt.
Det går top til bund og så holder gentage.
Så hvis jeg har skrevet i sige, at antallet negative 1, er n mindre end negative 1?
Ja.
Fordi negativ 1 er mindre end 1.
Så hvad skal der ske?
Jeg har tænkt mig at gøre dette mens n er mindre end 1,
så jeg har tænkt mig at gå tilbage til linje 28.
>> Og hver time-- og lad os løbe denne-- gør-funktion 1 til at udarbejde det,
og nu dot slash-funktion 1.
Hvis jeg skriver negativt 1, er det vil holde råben på mig
indtil jeg samarbejder, fordi hver af mine input er mindre end 1
og hvis det er mens mindre end 1, Jeg har tænkt mig at holde gør dette.
Hvis jeg endelig give det et nummer som 50, heldigvis, det siger, tak for 50.
Hvorfor?
Fordi så snart n ikke er mindre end 1, jeg holder op med at sidde fast i denne løkke,
og denne nye søgeord i dag, afkast, bogstaveligt gør det.
Så jeg har lige gennemført, i en forstand, hvad der svarer til getString,
hvor jeg afleverer tilbage til hvem der bruger mig, vis værdi.
Det behøver ikke at være en snor, det er en int.
Så en enkel, hurtig eksempel, men vi vil snart
se nogle mere sofistikerede versioner stadig.
Faktisk, lad os tage et kig på en numerisk én, som kaldes return.c.
Og denne her er faktisk lidt enklere.
Så dette program formål i life-- lad os kompilere og køre den,
så gør gengæld dot skråstreg, return-- varsel
programmet simpelthen terninger værdien 2.
Det er temmelig dumt, det er svært kode, betyder det ikke tage nogen indgange,
men det gør demonstrere en anden funktion, som jeg har skrevet mig selv.
Så her har jeg erklæret en variabel, kaldet x, af typen int,
lig med antallet 2, helt vilkårlig.
Dette er blot nogle fluffy udskrivning.
Den siger x er nu, sådan og sådan cubing dot dot dot.
Og magien er tilsyneladende på linje 21.
Jeg ringer en funktion kaldes, terning, Jeg afleverer det et ark papir
med nummeret 2 skrevet på det, og hvilken værdi, matematisk,
ønsker jeg at få ud af det?
Ligesom en tilregnelighed check?
8.
Højre?
Jeg ønsker 2 kubik tilbage, 2 til magt 3, så 8 tilbage.
>> Så hvor er terning gennemført?
Tja, lægger mærke til det implementeret hernede.
Og ligesom før, logisk, selvom syntaksen er sandsynligvis
meget nyt for mange af jer, Jeg vil have denne funktion
at aflevere mig tilbage et ark papir med en int på det.
Så jeg har en int, den navn er vilkårligt,
men bekvemt kaldes terning.
Indgangssignalet til det, er n skriv heltal, så det er
hvordan jeg kan passere i antallet 2 på et ark papir.
Og så viser det sig C understøtter matematik, så har du ikke X'er for tider,
du bare bruge stjerne til formering.
Og dette returnerer n gange n gange n, der blot er et kubik værdi.
>> Så hvor skal vi hen med alt dette?
Dette er absolut en hvirvelvind tur, være sikker på,
at i de super sektioner og problemet sæt 1,
du vil blive gik gennem alt dette så meget desto mere.
Og i problemer sæt 1, vil vi overgangen fra den grafiske verden af ​​Scratch
til noget mere kommandolinjen i C. Men vi vil hente inspiration
fra det her spil fra gårsdagens, hvor
ved hjælp af C og standard udgave af p sæt, du vil implementere Marios pyramide.
Og i hacker udgave af p sæt, hvis du vælger at vælge,
du vil gennemføre en smule mere udfordrende pyramide med to toppe.
Du vil også gennemføre en algoritme, en grådig algoritme.
Det viser sig at der er nogle interessante logik
bag processen med kører en bankcheck station
og faktisk afleverer nogen tilbage forandring.
Der er en algoritme, der er temmelig ligetil, at du måske endda
fatte intuitivt når du først læst det-- indse, at er hvad jeg har altid
gjort nogen tid, jeg har givet nogen noget penge tilbage-- der giver dig mulighed for altid at
minimere antallet af papir noter eller metal mønter
at du afleverer tilbage til brugeren.
Og dette er naturligvis, er overbevisende fordi hvis du går til CVS eller whatnot,
du ikke ønsker at blive udleveret en hel masse dem
eller en hel masse småpenge.
Du ønsker færrest mønter, sandsynligvis, det er muligt.
>> Endelig, vil du også blive udfordret at fuske i verden af ​​vand
og rent faktisk får en forståelse for en mapping mellem satserne for flow,
af lide, vand i et brusebad, hvor meget vand anvendes.
Og hentydning deri, vil være dette klip her,
som vi vil ende på i kun 60 sekunder at
tegner et billede af lav-flow brusehoveder.
>> [VIDEO PLAYBACK]
-Okay.
Jeg fik alt her.
Jeg fik Cyclone F Series, Hydra, JetFlow, Stockholm
Supersteam, du navngive det.
>> -Og Hvad vil du anbefale?
>> -Hvad leder du efter?
>> -Power Mand.
Strøm.
-lignende Silkwood.
-Det Er for stråling.
-Det er rigtigt.
-Nu Hvad er det?
-Det Er den Commando 450.
Jeg sælger ikke, at én.
>> -Men Det er hvad vi ønsker.
Det er en commando 450.
>> -Nej Tro mig.
Det er kun brugt i cirkus.
Det er til elefanter.
>> -Jeg Betale noget.
>> Hvad med Jerry?
>> -Han Kunne ikke håndtere det.
Han er delikat.
Oh yeah.
[END AFSPIL]
David J MALAN: Okay.
Det er hvis for CS50.
Vi vil se dig i næste uge.
>> SPEAKER 1: [? Scully?], [? Ian,?] så vidt dette outro projekt,
hvad har du fyre komme op med?
>> SPEAKER 2: Nå, har vi givet det en række tanke,
og vi mener, at den bedste måde at--
>> SPEAKER 3: Må jeg?
>> SPEAKER 2: Ja.
Med alle midler, faktisk.
>> SPEAKER 3: Så tror jeg Vi kan opsummere vores idé
for Outros med en word-- ingenting.
>> David J MALAN: Ingenting?
SPEAKER 3: Ingenting.
David J MALAN: Hvad betyder det?
SPEAKER 3: outros handler om ingenting.
SPEAKER 2: Jamen, jeg mener, i filosofi, Jeg mener, intet er altid noget.
SPEAKER 1: Så what's-- hvad er præmissen?
SPEAKER 3: Så det er ligesom livet.
OK.
Hvad lavede du i dag?
>> David J MALAN: Jeg stod op, havde morgenmad, og kom til at arbejde.
>> SPEAKER 3: Det er en outro.
SPEAKER 2: Men, jeg mener, bør ikke noget ske med ham på til--
SPEAKER 3: Nej, nej, nej, nej.
Sker der intet.
>> SPEAKER 1: Så hvorfor er vi ser?
>> SPEAKER 3: Fordi det er en outro til CS50.
>> David J MALAN: Ikke endnu.