>> DAVID J MALAN: All rett, så dette er CS50.
Og dette er helt klart en fredag.
Og dette er slutten av uken en.
Så du husker kanskje at vi slapp, siste gang, med en cliffhanger slags.
Hvor vi avsløre denne løgnen, at ingen Uansett hva du har lært voksende
opp, 1 dividert med 10 er det, i Faktisk, 0,1 eller 0,100 eller 0,10000.
Faktisk, hvis vi kompilere dette program, som vi gjorde i går, med,
gjøre upresishet, og deretter gjøre dot, skråstrek, unøyaktighet,
vi lært at dette er hva som er 1 delt på 10 faktisk er.
Så det er egentlig ikke helt tilfelle.
Men dette gjør hint på noen fundamental begrensning av datamaskiner.
Og ja, blant ting vi kommer til å gjøre
i dag er å ta en titt på hvorfor dette har skjedd, hvilke implikasjoner dette har,
hvordan menneskeheten har mislyktes å forstå dette i noen svært
alvorlig situations-- resultatet av hvilken
har vært ganske tragisk og expensive-- og også
ta en titt på hvordan vi kan faktisk forsvare
mot slike begrensninger.
Så intuitivt, kanskje, hvorfor er en delt med 10,
i henhold til min datamaskin her, ikke bare 1/10, 0,10?
Yeah.
Hva synes du?
>> Publikummer: The Radix er annerledes?
>> DAVID J MALAN: The hva er?
Oh, er radix annerledes?
Så ikke helt.
Det er faktisk mer grunnleggende for maskinvaren.
Andre tanker?
Yeah.
Publikummer: De representerer tallene annerledes?
DAVID J MALAN: Så they-- Høyre.
De representerer tallene annerledes.
Unøyaktig, tilsynelatende.
Så det er-- Vel, forskjellig fra hva?
Eller fra hvem?
Fra oss?
Publikum medlem: Yeah.
De bruker ikke desimal system til [uhørbart].
DAVID J MALAN: OK.
Så på en måte, gjør de ikke bruke desimalsystemet.
Under panseret, alt er faktisk binære,
og det er relatert, faktisk.
Men det er enda en enklere forklaring enn det.
Yeah.
>> Publikummer: De bare har så mange biter.
De kan bare lagre opp til en viss grad, som med desimalene.
>> DAVID J MALAN: Yeah.
Dette er hva som virkelig får på det.
Det viser seg at datamaskiner Vanligvis vil alltid bare
bruke en begrenset mengde informasjon å representere noe.
Høyre?
Tross alt, vi har bare en fast plass på harddisken.
Vi har bare en fast mengde RAM, eller datamaskinens minne.
Og hvis du bare har en fast beløp på noe,
sikkert du ikke kan faktisk telle opp til uendelig eller så mange du vil.
Du, slags, må velge hvilke utvalg
av verdier du kommer til å støtte.
>> Og så for eksempel en uke eller to siden, da vi snakket om ASCII,
og vi snakket om 8 bits, eller en byte, så å si,
det største antallet vi kunne representerer med 8 bits var hva?
255.
Og vi kan representere 256 totale verdier men ikke hvis vi bruker en av dem
på 0-- Vel, men hvis vi bruke en av dem på 0,
så det største antallet er, selvfølgelig, 255.
>> Så det viser seg at dette er tilfelle også i denne sammenheng.
Vi begynte å snakke, siste gang, om flyttall, som
er forskjellige fra heltall, i at de har et punktum
og, forhåpentligvis, noen tall etter det, men de er også.
En datamaskin er bare typisk kommer å bruke 32 bits, kanskje 64 biter
å representere et flyttall.
Så selv om vi har vokst opp lære matematikk og vite
som du absolutt kan ha et uendelig antall tall
etter desimaltegnet, ikke hvis du har begrenset minne.
Du, type, har å runde, eller velge hvilke
tallene du kommer til å representere.
Og så du kan tenke på, på en måte, dette blir datamaskinen nærmeste
tilnærmelse til verdien 1/10 det kan bli, med bare 32 eller så biter.
Og det er ikke bare 1/10.
>> For eksempel, hvis jeg endre dette til 1/3, som vi tror er enda enklere.
Så en delt på tre.
La meg lagre filen.
La meg gå videre og rekompilere den.
Og la meg å kjøre den.
Her også, tilsynelatende, er 1/3 ikke 0.3 og deretter et uendelig antall 3s
etterpå.
Du har denne unøyaktighet på slutten.
Så vi mennesker er riktig, og hva du har lært er, faktisk, riktig,
men vi er bumping opp mot noen begrensninger.
>> Og det jeg trodde vi ville gjøre i dag, er å begynne
ved å se på, for å være ærlig, det tragiske konsekvensene av dette
noen ganger, når menneskeheten ikke helt implementere
for denne virkeligheten og disse begrensningene.
Og vi vil se en rekke vignetter fra History Channel som tar
en titt på hvordan ting har gått galt.
Det er ca 8 minutter lang, og vi vil komme tilbake etter dette
og ta en titt på nøyaktig hva annet kan gå galt.
Hvis vi kunne dimme lights--
>> [VIDEO PLAYBACK]
>> -Computers, Har vi alle kommer til å akseptere de ofte frustrerende problemer som
gå med dem.
Bugs, virus og programvare glitches er små priser
å betale for enkelhets skyld.
Men i high-tech og high-speed militære og romprogram applikasjoner,
det minste problemet kan foredles til katastrofe.
4. juni 1996, forskere forberedt å lansere en ubemannet Ariane 5-raketten.
Det var bærer vitenskapelig satellitter konstruert
å etablere nøyaktig hvordan Jordens magnetfelt samhandler
med solvind.
Raketten ble bygget for European Space Agency
og løftet av fra sitt anlegg på kysten av Fransk Guyana.
>> -Og Ca 30 sekunder inn flyturen, de første
la merke til noe gikk galt.
At dysene ble sving på en måte de egentlig ikke burde.
Rundt 40 sekunder inn i fly, klart kjøretøyet var i trøbbel,
og det er da de gjorde beslutningen om å ødelegge det.
En Range Safety Officer med enorm guts trykket på knappen,
sprengte raketten før den kunne bli en fare for offentlig sikkerhet.
>> -Dette Var jomfru voyage av Ariane 5,
og dens ødeleggelse tok sted på grunn av en feil
innebygd i raketten programvare.
-Den Problem på Ariane var at det
var et tall som kreves 64 bits til å uttrykke,
og han ønsket å konvertere den til et 16 bits tall.
De antok at antallet ble aldri kommer til å bli veldig stor,
at de fleste av disse sifre i 64 biters tall var 0-tallet.
De var galt.
>> -Den Manglende evne til én program for å ta imot
den type tall som genereres av en annen var ved roten av svikt.
Programvareutvikling hadde blitt en svært kostbare delen av ny teknologi.
Ariane 4 raketten hadde vært veldig lykkes, så mye av programvaren
opprettet for det ble også brukes på Ariane 5.
>> -Den Grunnleggende problemet var at Ariane 5 var raskere, akselerert raskere.
Og programvaren ikke hadde stod for det.
>> -Den Ødeleggelse av raketten var en stor økonomisk katastrofe,
alt på grunn av en liten programvarefeil.
Men dette var ikke den første time data konvertering problemer
hadde plaget moderne rakett-teknologi.
>> -I 1991, med start av den første Gulf-krigen,
Patriot rakett opplevd en lignende type
av antall konvertering problem.
Som et resultat av 28 personer, 28 amerikanske soldater
ble drept og om 100 andre såret,
når Patriot, som var ment for å beskytte mot innkommende scuds,
ikke klarte å avfyre ​​en rakett.
>> -Når Irak invaderte Kuwait og USA lansert Desert Storm i begynnelsen av 1991,
Patriot missilbatterier ble utplassert å beskytte Saudi Arabia og Israel
fra irakiske Scud rakettangrep.
The Patriot er en amerikansk, medium-range bakke-til-luft-system
fremstilt av Raytheon Company.
>> -Den Størrelsen på Patriot jagerfly, selv, er om, omtrent 20 fot lang.
Og den veier ca 2000 pounds.
Og det bærer et stridshode fra om-- Jeg tror det er omtrent 150 pounds.
Og stridshodet, i seg selv, er en høyeksplosiv,
som har fragmenter rundt det.
Foringsrøret for stridshodet er laget for å fungere som buckshot.
>> -De Raketter er gjennomført, 4 per container,
og transporteres med en semi-trailer.
>> -The Patriot anti missilsystem går tilbake minst 20 år nå.
Det ble opprinnelig utviklet som en luftvernmissil
å skyte ned fiendtlige fly.
I den første Gulf-krigen, når den krigen kom,
Hæren ønsket å bruke den til å skyte ned scuds, ikke fly.
Den irakiske Force var ikke så mye av et problem,
men hæren ble bekymret scuds.
Og så de prøvde å oppgradere Patriot.
>> -Intercepting En fiende rakett reiser på mach five
skulle være utfordrende nok.
Men når Patriot ble styrtet inn i tjeneste,
Hæren var ikke klar over en Irakiske modifikasjon som gjorde
sine scuds nesten umulig å treffe.
>> -Hva Har skjedd, er de scuds som skulle komme inn, var ustabil,
de ble vingler.
Grunnen til dette, var irakerne, for
å få 600 kilometer ut av en 300 kilometer rekkevidde rakett,
tok vekten ut av foran stridshode og gjort stridshodet lettere.
Så nå, patrioten er å prøve å komme ved Scud, og mesteparten av tiden,
det overveldende flertallet av tid, ville det bare fly av Scud.
>> -Når De Patriot systemoperatører innså Patriot savnet sitt mål,
de detonerte Patriot stridshode, for å unngå mulige tap hvis det
ble tillatt å falle til jorden.
>> -Det Var hva folk flest så, de store ildkuler på himmelen,
og misforstått som avskjærer av Scud-stridshoder.
Selv i natt himmel, Patriots dukket
å være vellykket ødelegge scuds, i Dhahran,
det kan være noen feil om ytelsen.
Der patriot radar system mistet oversikten over innkommende Scud,
og aldri lansert, på grunn av en feil programvare.
Det var israelerne som først oppdaget at jo lenger systemet var på,
jo større tidsavviket ble, som følge av en innebygd klokke
i systemet datamaskin.
>> -Om To uker før tragedien i Dhahran,
israelerne rapportert til Forsvarsdepartementet,
at systemet var å miste tid, at etter ca 8 timer med løping,
de la merke til at systemet var bli merkbart mindre nøyaktig.
Forsvarsdepartementet svarte med fortelle alle Patriot batterier
å ikke la systemene i lang tid.
De sa aldri hva en lang tid var.
8 timer?
10 timer?
1000 timer?
Ingen visste.
-The Patriot batteri stasjonert ved brakkene
på Dhahran, og dens feil interne klokke, hadde vært på over 100 timer
på natten av februar 25 år.
>> -Det Spores tid til en nøyaktighet på omtrent 1/10 av et sekund.
Nå 1/10 av et sekund er et interessant tall
fordi det ikke kan bli uttrykt i binære, akkurat.
Hvilket betyr, kan det ikke bli uttrykt nøyaktig,
i enhver moderne digital datamaskin.
Det er vanskelig å tro, men bruker dette som et eksempel.
La oss ta nummeret, 1/3.
1/3 kan ikke uttrykkes i desimal, nøyaktig.
1/3 er 0,333 pågått i det uendelige.
Det er ingen måte å gjøre det, med absolutt nøyaktighet, i desimal.
Det er akkurat samme type problem som skjedde i Patriot.
Jo lengre system løp, den verre tiden feilen ble.
>> -Etter 100 timers drift, feil tid var bare omtrent 1/3 av et sekund.
Men i form av rettet mot en rakett reiser på mach 5,
Det resulterte i en relativ feil på over 600 meter.
Det ville være en fatal feil for soldatene på Dhahran.
>> -Hva Har skjedd, er en Scud lanseringen var oppdaget av tidlig varsling satellitter,
og de nye at Scud var Kommer i sin generelle retningen.
De visste ikke hvor det kom.
>> -Det Var nå opp til radaren komponent i Patriot system,
forsvare Dhahran, for å finne og holde spor av innkommende fiendtlige missilet.
>> -Den Radar var veldig smart.
Det ville faktisk spore posisjonen til Scud
og deretter forutse hvor det sannsynligvis ville være,
neste gang, radar sendte en puls ut.
Som ble kalt utvalget gate.
>> -Da, Når Patriot bestemmer nok tid har
vedtatt å gå tilbake og sjekke neste plassering for denne oppdagede objektet,
det går tilbake.
Så når det gikk tilbake til feil sted, så ser det ikke objektet
og det bestemmer seg for at det ikke var noen objekt, det var en falsk deteksjon,
og faller sporet.
Den innkommende Scud forsvant fra radarskjermen,
og sekunder senere, det slengte inn i brakkene.
Den Scud drepte 28 og var den siste én avfyrt under første Gulf-krigen.
Tragisk, den oppdaterte programvaren kom til Dhahran den påfølgende dagen.
Programvaren feilen hadde vært fast, lukking
ett kapittel i den urolige Historien om Patriot rakett.
>> [END PLAYBACK]
>> DAVID J MALAN: Så får vi ta en titt på noen lignende begrensninger i bare litt.
Men først, la oss Overgangen til noen FYI finnes.
Så one-- denne helgen, der vil være super seksjoner,
som er ment å erstatte regelmessig seksjoner, som
vil starte opp en uke frem i tid.
Ta en titt på CS50 hjemmeside for mer informasjon om disse.
De vil også bli filmet og streamet leve for de som ikke kan delta.
Problemet satt en er på Kurset hjemmeside allerede,
og vi tar en titt på at i bare en liten bit.
Og arbeidstid vil også ta plassere denne mandag til torsdag.
>> Så dette var den mest kanoniske programmet vi så på forrige gang.
Det er som den enkleste program du kan skrive i C,
og selv det er litt av en dristig påstand.
Høyre?
Fordi det er mye tilsynelatende kompleksitet til dette.
Så la oss ta en rask titt på hva noen av disse elementene
var og så prøve å gi en mental modell for hvordan
disse enkleste av programmer arbeide, og så får vi begynne
se på ting stadig mer komplekse.
Så denne linjen her, markert nå, i gult, hva gjorde vi sier, siste gang,
at dette betyr for oss?
Hva er hensikten den fungerer?
Noen fra lenger tilbake?
Yeah.
>> Publikummer: [uhørbart]
DAVID J MALAN: Good.
Så det gir deg tilgang på kommandoer, eller la oss
kaller dem fungerer, at noen andre skrev, som erklærte:
så å si, i en annen fil.
Så vi får se hva en .h fil er kontra en .c fil, til slutt.
Men for nå, bare vet printf som, for eksempel,
er blant de funksjonene som har vært deklarert i en annen fil, et sted
annet på cloud harddisk som tillater oss å få tilgang printf og bruke den
uten å gjenoppfinne at hjulet selv.
I mellomtiden, hoved.
Hva var analog av hoved, i forrige uke?
Yeah.
>> Publikummer: Grønn flagg klikkes.
>> DAVID J MALAN: Yeah.
Scratch-tallet, da grønne flagget klikket.
Det er som puslespill brikke som sparker ting av.
Og så på samme måte, gjorde verden besluttet noen år siden at i C,
og en haug med andre språk, Hvis du ønsker å skrive et program,
din første funksjonen har å bli kalt, hoved.
Og det har å se slik ut.
Men vi kommer tilbake, en annen gang, til hva, int,
og, ugyldig, betyr i denne sammenhengen.
For nå klammeparentes er snill av som Scratch puslespill brikke form
som omslutter et antall linjer.
Og blant på linjene her, dette er en her.
printf er en funksjon som har som formål i livet er å skrive ut en formatert streng.
Og ved formatert, jeg mener du kan plugge inn plassholder verdier,
og du kan angi hvor mange desimal punkter, hvor mange tall som skal skrives ut
etter et desimaltegn og lignende.
Og printf, selvfølgelig, tar man eller flere argumenter eller parametere,
også kjent, på en enklere måte, som innganger.
>> Så printf, som mange funksjoner, tar innganger.
Og disse inngangene er omfavnet av de to parentesene her.
Og innsiden av dem er en inngang.
Det er en streng, som vi har kalt det, som er bare en sekvens av tegn,
som et ord eller en setning, eller en hel essay selv, i mellom doble anførselstegn.
Og det er det som kommer til å påvirke oppførselen til printf grunn naturligvis
det er bare en generisk print funksjon.
Det kommer ikke til å vite hva å skrive ut, med mindre du forteller det.
Og så, noen bagateller.
Hva sa vi denne rare sekvens av symboler er?
Yeah.
>> Publikummer: Ny linje.
>> DAVID J MALAN: Ny linje.
Så det viser seg, kan du ikke bare trykke, angi når du skriver programmet.
Generelt blir kompilatoren skal få litt forvirret med hensyn til hva du mener.
Snarere må du bokstavelig talt si, gi meg en ny linje her.
Og så / n er det vi vanligvis kalle en flukt karakter.
Så n, for ny linje.
Og kompilatoren vet at når den ser / n,
det bør faktisk indusere datamaskinen, til slutt, eller printf, i dette tilfellet
å skrive ut en faktisk ny linje, som treffer, skriver,
tast på tastaturet.
Og til slutt, hva gjorde vi sier dette stykke syntaksen er for?
Hva representerer det?
Yeah.
>> Publikummer: [uhørbart]
>> DAVID J MALAN: Det er bare enden av linjen.
Det er slutten av setningen.
Og innse at vi ikke sette dem overalt.
Vi absolutt ikke sette dem ved endene av hver linje.
For eksempel, det er ingen på første linje, det er ingen på linjen
med, viktigste, det er ingen etter klammeparentes,
men du vil begynne å se og få kjent med hvor det heter for.
Og det er nesten alltid etter en funksjon Ring eller en uttalelse, litt action
at du faktisk tar.
>> Og vet nå, spesielt hvis blant de mindre komfortable,
disse er den slags dumme ting at du vil ende opp ved et uhell banging
hodet mot veggen over.
Fordi du vil være logisk trygg på noen problem
du har løst for et problem sett, og den jævla ting bare
vil ikke kompilere eller selv kjøre.
Og så ofte, tidlig, det kommer til å være fordi du savnet en parentes,
eller du gikk glipp av et semikolon.
Og så bare være oppmerksomme av slike ting,
og prøv å ikke bli frustrert av dem fordi svært raskt gjør dette
bli gammelt hat.
Men det er veldig lett å få frustrert tidlig, som et resultat.
>> Så nå, la oss ta en titt på hvordan denne linjen er faktisk fungerer
og deretter se på en litt mer komplisert.
Så vi har over her, evne til å trekke på denne skjermen.
Og la oss anta at Dette er skjermen min,
men jeg skriver det, hallo program, og jeg har ikke implementert, printf.
Noen andre har implementert, printf.
Hvem ønsker å hevde å har implementert, printf?
Hvis vi kan?
Greit, hva heter du?
>> STUDENT 1: [? Copal. ?]
>> DAVID J MALAN: Copal, kom opp.
Kom opp.
Greit.
Så vi har, her, noen navneskilt, siden vi skal lage litt spill av dette.
Og vi vil ringe deg, printf.
Og hvis du ønsker å komme hit, hva jeg har bare trukket på skjermen,
det er ganske enkelt, det er meg, dette.
>> All right, så, hello my name is, printf, hvis du ønsker å sette det på.
Greit.
Og hvis du kan gå stativ av skjermen
som om du er den funksjonen som kom med dette datasystemet.
Og ditt formål i livet er å faktisk skrive ut noe.
Men mye som programmet vi bare hadde på skjermen, her,
vi er nødt til å faktisk gi deg noen innspill.
>> Og så, hvis mitt innspill, her, er tilsynelatende, hva er gått til printf,
la oss slags spotte det opp som dette.
Jeg kommer til å bokstavelig talt skrive på et stykke papir, "Hei, verden"
backslash N. Og for å være klar, hva Jeg har bare trukket på dette stykke papir,
ser slik ut.
Så når jeg kjører dette programmet, og dette gul linje med kode blir henrettet,
det er som om jeg, hallo program, jeg overlate noen innspill til en funksjon
at noen andre skrev.
>> Og hvis du, med din finger, kunne faktisk, med fingeren,
tegne på skjermen uansett det er du har blitt overlevert,
effekten, til slutt, er å se nøyaktig at, på skjermen.
Og et lite hjørne tilfelle her.
Og bra, vi skal ikke se den, ny linje på dette punktet.
Det ville være feil for deg eksplisitt tegne linjeskift.
Men hvis vi fortsatte å skrive ordene på skjermen, vil de ende opp under det.
>> Så tusen takk, men pinne rundt her for bare et øyeblikk.
Vi trenger nå en annen frivillig, hvis vi kunne,
som kommer til å trenge å spille rollen of-- Det er bare folk i orkesteret
akkurat nå.
Hvordan om-- OK.
Akkurat her.
Kom opp.
Hva er navnet ditt?
>> STUDENT 2: [? Ivay. ?]
DAVID J MALAN: Sorry?
STUDENT 2: [? Ivay. ?]
DAVID J MALAN: Ethan, kom opp.
Nei?
Fikk jeg det galt, selv etter at du har sagt det to ganger?
Kom opp.
Det er vanskelig å høre her oppe.
OK.
Og jeg beklager, hva heter du?
>> STUDENT 2: [? Ivay. ?]
>> [? DAVID J MALAN: Ivay. ?] OK.
For nå, hvis du ikke gjør det sinn, er du GetString.
>> STUDENT 2: OK.
Cool.
DAVID J MALAN: Så hvis du ønsker å stå her for bare et øyeblikk,
la oss ta en titt på en litt mer kompleks program, det vil
nå har tre linjer med kode.
Så vi har, en, oppgi navn ved hjelp printf; to, en oppfordring til GetString,
etterfulgt av et oppdrag til en variabel kalt, snor s, eller kalt s;
og deretter en annen samtale til, printf, men denne gangen med to innganger.
>> Så vi har allerede gjort staten ditt navn, eller rettere sagt, vi har
allerede gjort en printf samtale.
Så jeg kommer til å skrive, oppgi navn.
Og så, hva jeg kommer til å passere, printf, i et øyeblikk,
er ganske enkelt, dette.
Så hvis du ønsker å gå videre og trekke dette på skjermen, det er dine innspill nå.
Greit.
Og glem string, har vi nå vår egen linje av koden her.
Så i, GetString, vi trenger å faktisk ringe, GetString.
Så ditt formål i livet er å bare gå ut i orkesteret, hvis du kunne,
og få noen navn.
Men la oss gi deg noe å sette den på.
Hvis du ønsker å gå fremover og få en streng,
få noen navn på den stykke papir, hvis du kunne.
>> Greit.
Og vi får se, i et øyeblikk, hvis navn vi får.
I mellomtiden, hva jeg kommer til å ha klar, er et blankt
papir, der, jeg kommer å lagre hva verdi det
er at GetString er tilbake til meg, Jeg, som en streng variabel kalt, s.
Greit.
Så hva har du her?
Nik.
Greit.
Så vi har Nik navn her.
Så dette er hva bokstavelig har blitt returnert
til meg, så å si, av GetString.
>> Jeg, nå, jeg kommer til å utføre venstre side
av det uttrykket, hvor jeg rett og slett kopiere ned, for dagens formål, Nik.
Så nå har jeg en variabel kalt, s, lagring Nik navn.
Jeg har allerede overlevert til printf, en tidligere argument.
Men i vår tredje og siste linje av kode, jeg faktisk har til å hånd printf
noe litt different-- "Hei,% s," backslash n.
>> Og så den siste linjen jeg kommer til send-- den siste tingen jeg er
kommer til å skrive ned nå, er dette.
Så de to linjer med kode, eller snarere den siste linjen med kode,
samtaler for to inputs-- en, denne, og to, dette.
Så hvis vår printf funksjonen Nå kan du ta disse som input,
la meg tømme skjermen for deg.
Egentlig ikke, kan du gå videre.
Vi vil la det opp, siden det er på det samme programmet.
Vi bør se, hallo, Nik.
Greit.
Så dette var ganske mange ringer å hoppe gjennom, bare
å skrive, oppgi din navn, og, hallo, Nik.
Men denne enkle ideen om meldingsutveksling, av input pasninger og utgang mottak,
er akkurat den modellen vi kommer til å ha for selv de mest komplekse funksjoner.
Så tusen takk til dere begge.
Vi har en herlig spenning ball her for deg.
Og takk til vår GetString og printf frivillige likt.
Takk.
Greit.
Takk til dere begge.
>> Så vi har snakket om så langt, for det meste om strenger.
Og det viser seg at C kan faktisk forstå noen forskjellige datatyper.
Faktisk, la oss ta en titt på disse her.
Så C, og en rekke språk, forstå ting som kalles tegn.
En røye er generelt en enkelt byte, eller åtte biter.
Og det representerer en enkelt karakter, som bokstaven A, eller hovedstaden
bokstaven A, eller liten bokstav A, eller et utropstegn,
eller hvilket som helst tegn på at du kan skrive på tastaturet, og noen ganger enda mer.
Vi har også skje for å se flyter.
En flottør er, generelt, en 32-bits verdi, eller fire byte
fordi igjen, er en byte åtte bits.
>> Så en dupp er et flyttall, noe med en desimal.
Og ja, det er det filmen snakket
om når de snakket om flytende punktverdier, noe fast antall bits
blir brukt for å representere et reelt tall.
Men det er også ting som kalles dobles.
Disse finnes i Java, Hvis du har tatt APCS,
og en dobbel, som navnet heldigvis antyder, er dobbelt så stor som en dupp.
Det er fortsatt et reelt tall, det bare har flere biter
med å bli stadig mer presis, eller å lagre enda større tall.
int er enkelt.
Vi snakket om den siste tiden.
Det er bare et tall.
Og det er som regel 32 biter, eller fire bytes.
>> Og så, hvis du har, la oss se nå, 32 bits-- og vi gjorde dette i uke 0,
aldri så briefly-- hvis du har 32 biter, hva er den største
nummer du kan representere som et heltall?
Gi eller ta?
Det er som 4 milliarder kroner, og det er bare hvis vi er
representerer bare positive tall.
Hvis du har 32 bits, og du vil representere negative tall også,
omfanget er, i hovedsak, negative 2 milliarder til positiv 2 milliarder.
Men generelt, vil vi starte på 0 går opp til 4 milliarder.
>> Du trenger ikke å vite nøyaktig, men Vi kan se dette, faktisk, hvis jeg bare
åpne opp en liten kalkulator, her.
Jeg kan gjøre to på 32, og det er akkurat hvor stort,
hvor mange verdier du kan representerer, med 32 bits.
Og det er omtrent 4 milliarder kroner.
Så vi vil fortsette å se at antall i et par forskjellige steder.
Men hvis du trenger lengre tall enn det,
det viser seg at det er noe som kalles en lang lang.
Og en lang lang er generelt 64 bits, som
betyr at det er en størrelsesorden enda større enn en int.
>> Så jeg kan ikke engang uttale den største nummer som du kan representere,
men det er merkbart større.
Nå som en side, historisk, hvis en int er 32 bits,
og en lang lang er 64 bits, hvordan stort er en lang, ikke en lang lang tid?
Du tror det er lenger enn en int men kanskje mindre lang enn en lang lang,
men det avhenger faktisk.
>> Og så viser det seg én av frustrasjonene også,
med å skrive kode på visse systemer, er at ikke alle av disse datatypene
har forhåndsbestemte verdier.
Noen ganger er det så mange biter.
Slik at du faktisk må vite, noen ganger, hvilken maskinvare
du kjører programvaren på.
Heldigvis, andre språk og andre datatyper som nå finnes,
tillate deg å være mer presis.
Vel, vi så streng, og vi så bool, også,
men det viser seg de kommer bare med CS50 biblioteket.
Så de som ikke er bygget til C. De i stedet,
kommer i den filen som heter CS50.h, at vi vil til slutt
skallet tilbake lag av.
Men for nå, de er bare flere datatyper.
En bool er en sann eller usann, og en streng er en sekvens av tegn,
som et ord.
Nå printf, vi har sett, har plassholdere, er% s en.
Og du kan være i stand til å nå, slutte fra disse andre eksempler, hvordan
du kunne ha en plassholder for ulike datatyper.
For eksempel ta en gjetning, hvis du ønsket å skrive ut en eneste røye hjelp
printf, er plassholderen sannsynligvis% c.
Og hvis du ønsker å skrive ut en heltall med plassholder,% i.
% lld er en lang lang desimal verdi, men lang lang, slik at kartene til det.
Og så% f for flytende punkt verdi eller for en dobbel,
så noen ganger de er gjenbrukt i ulike sammenhenger.
Så vi får se og bruke noen av de over tid.
Og printf og andre funksjoner også støtte andres escape-sekvenser,
og noen ganger, disse er nødvendige.
Så backslash n er en ny linje.
Backslash t, er det noen ønsker å ta et stikk?
Publikum medlem: Tab.
DAVID J MALAN: Tab.
Så hvis du faktisk ønsker å skrive ut en fane, ikke
et fast antall plasser, men en faktisk tabulatortegn, trenger du ikke treffer,
tab, tast på tastaturet, generelt, du faktisk gjør backslash t.
Backslash dobbel sitat, hvorfor skulle jeg ønske det?
Høyre?
Hvorfor kan jeg ikke bare skrive en dobbel sitat på tastaturet?
Publikummer: Fordi, ellers er det
kommer til å synes det er slutten av liker utskrifts [? tekst. ?]
>> DAVID J MALAN: Nettopp.
Husk at med vår printf eksempler, når vi
var innom å printf i input, til venstre på at innspill string
og på høyre side av at innspill våren, selvfølgelig, var en dobbel sitat.
Hvis din egen inngang har en dobbel sitat i midten av det,
datamaskinen kanskje potensielt blir forvirret, som til,
gjør denne doble sitat hører hjemme i midten?
Hører det med den venstre?
Hører det med den rette?
Og så, hvis du ønsker å gjøre det super klar, gjør du backslash dobbel sitat,
slik at det er rømt, så å si, og det er ikke smeltet sammen til noe annet.
Og det er noen andre her, backslash r, apostrof, 0,
så vi kan se over tid, også.
Og nå, hva om funksjoner?
>> Så handlinger som vi kan ta så langt i dette språket, C, vel, vi har sett,
printf, selvfølgelig, og alle av de andre på skjermen,
her, at vi vil bruke for kursets første ukene bare,
komme når CS50 biblioteket.
Og de gjør det mye enklere, i C, å faktisk få brukerundersøkelser.
Det viser seg at i C, og ærlig i noen språk,
det er en reell smerte i nakken å gjøre noe enkelt, som ber brukeren
for tastatur, for hans eller hennes innspill.
Og så disse funksjonene gjør det enklere.
>> Og det har også feil sjekker hele,
slik at, når husker på onsdag, vi
så, prøv på nytt, advarsel, når jeg ikke samarbeide,
og jeg skrev et ord, i stedet for et tall?
Vi har gjort de tunge løftene tidlig på å sørge for at brukeren samarbeider.
Men dette er bare trening hjul som vi vil til slutt,
og raskt, ta av.
>> Så til oppsummering, da, la oss ta en rask titt,
mye som vi gjorde med Scratch, på noen kanoniske konstruksjoner i C.
Dette er ment å, liksom av, være en rask tur,
bare slik at du har en referanse og som du har sett ting først.
Men så skal vi se på selve kodingen bruke noen av disse byggeklosser.
Så mye som i Scratch, når vi hadde uttalelser liker,
si eller, vent, i C, har vi funksjoner også, som printf.
>> Hvis vi ønsker å uttrykke en betingelse i C, er det tilsvarende, i ånd,
til at puslespillbiten som så ut som dette i Scratch.
Men i stedet, vi bokstavelig talt bare skrive om.
Og så, i parentes, vi sette en betingelse,
der at tilstanden er hva vi vil ringe, igjen, en boolsk uttrykk.
Og igjen, dette er slags pseudokode.
Og, faktisk, er // en kommentar.
Det er bare engelske ord til meg selv.
Men dette er den generelle Strukturen av en, hvis tilstand.
Men vi får se betong eksempler i bare et øyeblikk.
>> Hvis du ønsker å ha en toveis veiskille,
mye som vi gjorde med våre frivillige på Onsdag, kan du ha en, annet hvis.
Og hvis du vil ha en tredje og endelig tilstand, eller standard situasjon,
du kan ha bare en annen blokk, der.
Og på samme måte, med boolske uttrykk, du kan, og dem sammen.
Og vi så på onsdag, som det er ikke en enkelt-tegn,
det er to, for lavere nivå grunner som Vi vil til slutt se og spille med.
Eller-ing sammen ting er 2 vertikale barer.
På et amerikansk tastatur, dette er generelt en nøkkel
med Skift-tasten ovenfor din Enter eller Retur-tasten.
>> Så er det disse tingene som vi bruker kanskje en eller to ganger.
De er funksjonelt likeverdig med hva du kan gjøre med en, om, annet hvis,
else if annet, konstruere, men de kalles en bryter.
De ser veldig annerledes, men vi vil se på noen av våre distribusjons kode,
for en fremtidig problem sett, mest sannsynlig, at det er noen ganger bare en penere
måte å uttrykke en hel haug av forholdene,
uten å ha en masse klammeparentes og mange parenteser og innrykk.
Men de gir oss ikke mer makt enn vi allerede har.
Og nå loops.
Og dette vil vi se ved en litt langsommere.
Men så skal vi begynne å bruke disse, spesielt for de som allerede er kjent.
Dette er den kanoniske måten, hvis utrolig uforståelige måten å skrive en løkke i C.
>> Nå en løkke i Scratch var ganske grei.
Du har en, for alltid, blokk.
Du har en, gjentar, blokk med bare et tall du må skrive inn.
Og med den, for loop, kan du gjennomføre begge disse ideene,
men det er litt mer teknisk.
Men ærlig talt, det er også forholdsvis enkel.
Når du vet rekkefølgen på operasjoner, du bokstavelig talt
bare skal plugge inn verdier og fortelle datamaskinen hva de skal gjøre.
Så her er et eksempel.
Dette er en løkke som, ganske enkelt, teller fra ett tall opp
gjennom en annen.
Og bare ved å kaste et blikk på det, selv om du har
ingen tidligere erfaring med dette språket, hvilket nummer
betyr det sannsynligvis begynne å telle på?
OK, 0.
Og jeg tipper det er fordi du se at det er en int og en jeg,
som er en variabel.
Det er initialisert til 0.
>> Og senere, ser det ut som vi passerer printf, en verdi.
Og, faktisk, gjorde jeg en liten skrivefeil her.
Men det er lett fast.
La meg legge inn, jeg her.
Vi har nå printf velvære vedtatt at plassholder value.
Og hva som kommer til å telle opp gjennom?
PUBLIKUM: 50.
50.
49.
DAVID J MALAN: 49.
Så 50, ved første øyekast virker riktig.
Men at det viser seg, kommer til å være vår tilstand som vi fortsette å se.
Og vi kommer til å stoppe en gang i er ikke lenger mindre enn 50.
Så denne sløyfen omvendt, bør utføre, så lenge jeg er under 50.
Men så snart det blir 50 eller 51, eller verre, bør den stoppe automatisk.
Greit.
>> Så hva skjer egentlig her?
Så dette er rekkefølgen på operasjoner for en sløyfe.
One, har du såkalt initialisering.
Denne gule uthevet blings av koden kjøres først,
og det har den virkning at, per Onsdag, har du sannsynligvis forestille deg.
Det skaper en variabel som heter jeg, og det butikker i den variabelen verdien 0.
Så jeg er 0 på dette punktet i historien.
>> Det neste som skjer i denne konstruksjonen,
er at tilstanden blir kontrollert.
Så jeg sjekke umiddelbart, er jeg mindre enn 50?
Og selvfølgelig, er svaret for nå er, sikkert, ja.
Ja, fordi jeg er 0, og det er sikkert mindre enn 50.
Så hva som skjer, er at dette kodelinje blir henrettet.
Og faktisk, hvis det er multiple kodelinjer i disse klammeparentes,
de alle bli henrettet en etter en.
>> Og i effekt her, er tilsynelatende, for å skrive ut
antall i, som skal være 0, og deretter en, og deretter to.
Men hvorfor?
Hvorfor det blir økes?
Vel, den fjerde tingen som skjer er at denne syntaksen
blir utført, etter semikolon.
i ++ er en forkortelse måte å si; ta verdien av i, og legge en til det;
og så neste gang rundt, legge 1 til den; og neste gang rundt,
legge en til det.
>> Så hvis vi holder det gående, hva kommer til å skje
neste er jeg ikke kommer til å initial jeg noensinne igjen.
Hvis jeg holdt initialisering jeg til 0, dette eksemplet
ville aldri slutt fordi jeg ville bli sittende fast på 0.
Men hva kommer til å skje er at tilstanden vil bli kontrollert,
linjen med kode vil bli henrettet, det jeg skal økes,
tilstand vil bli kontrollert, koden vil bli henrettet.
Og det holdt sykling igjen, og igjen, og igjen,
før jeg ++ induserer en verdi av 50.
>> Tilstanden da sier, er 50 mindre enn 50?
Svaret er selvfølgelig nei, og så hele koden stopper utføring.
Og hvis du har mer kode på skjermen der nede, det er hva som skjer videre.
Det spretter ut av disse klammeparentes og fortsetter å skrive ut mer etter det.
>> Så en spøk nå, fra Foxtrot, som vil du kanskje nå forstår.
Det er alltid morsomt.
Det er som de humrer slags sive,
og da du innser at du ikke burde være å le av humor som dette.
Men det er noen takeaway her, pedagogisk, også.
Så det viser seg at jeg er mangler en bit av syntaks,
eller foxtrot er mangler en stykke syntaks her.
Hva som mangler, at vi har hatt i alle andre eksempel, så langt?
Til gjengjeld er der, så det er noe annet,
at vi vil komme tilbake til før lenge.
Hva som mangler, skjønt?
Yeah.
>> Publikummer: The initialisering av [uhørbart].
>> DAVID J MALAN: OK.
Så ja.
Så egentlig, er-- dette Vel, og teller er initialisert
opp ovenfor, eller rettere sagt, erklærte seg over.
Så dette er en annen måte å gjøre det.
Men ikke i en linje er det gyldig skjønt.
Hva med her?
>> Publikummer: Er det klammeparentes?
>> DAVID J MALAN: Yeah.
Så klammeparentes mangler.
Men denne koden, mener jeg, deres kreditt, faktisk er, syntaktisk gyldig.
Det viser seg, trenger du ikke trenger klammeparentes
hvis du bare har en linje med kode som du ønsker å utføre innsiden av løkken.
Nå har vi alltid, i klassen og i alle våre distribusjons kode,
inkluderer klammeparentes uansett, bare for klarhetens skyld.
Men innser at i lærebøker og online eksempler,
du kan godt se krøllete bukseseler mangler en gang.
Og det er OK, hvis det du har rykket inn og beregnet
er bare en eneste linje med kode, og ikke flere linjer med kode, potensielt.
Greit.
Så knyttet til spørsmålet om upresishet, er en sak av overløp,
i den forstand at, på samme måte, trenger heltall ha grenser for dem
akkurat som flyt verdier?
I verden til et flyttall verdier, kan vi bare være så presis,
hvoretter, iblant dårlige ting kan skje,
og våre programmer kan være buggy og feiling.
Nå selv med heltall, du kan støte på problemer.
Nå et heltall ikke har en desimaltegn eller tall etter det.
Det er bare et naturlig tall, typisk.
Så hva kan gå galt med en int?
Hvis jeg bruker en int til telle, hva kan gå galt?
Virker mye enklere.
Yeah.
>> Publikummer: Hvis nummer blir [uhørbart]
>> DAVID J MALAN: Yeah.
Hva hvis du teller så høyt, at du kan ikke uttrykke at virkelig store tall.
Høyre?
På et tidspunkt, du kommer å overskride grensene
av en 32-bits verdi eller et 64-bits verdi.
Nå igjen, jeg er ikke sikker på hvordan å uttale en 64-biters verdi,
men jeg vet at med en 32-bits heltall, den største verdi kan det være,
hvis det er bare positivt verdier, er omtrent 4 milliarder kroner.
Så hvis jeg prøver å telle til 5 milliarder kroner, noe kommer til å skje.
Men la oss se hva, faktisk kan skje.
I en verden av heltall overløp, hvor du, på en måte,
overløp av kapasiteten til en heltall, hva som kan skje?
>> Så her er et binært tall, det er et tilbakesteg til 0.
Det er alle 1-tallet, og de plassholdere det er krefter på 2,
så dette er binær.
Så disse er 8, en biter på skjermen.
Og hvis du husker eller du raskt gjøre regnestykket,
hvilken verdi er representert her med disse åtte en bit?
255.
Og selv om du ikke var helt sikker av regnestykket, kan du gjøre det ut.
Eller du kan bare snill fornuftens gjennom det,
vent litt, hvis jeg er representerer en 8 bits verdi,
og jeg har fått 256 mulige verdier, men den første av disse er 0,
Jeg bare vet at største kommer til å være 255,
og det er hva dette kan være.
>> Så antar jeg prøver å legge en til denne verdien.
Hva ville du gjøre i klasse skolen når du legger til en 1, og det
egentlig ikke passer fordi du må bære en?
Hva er dette tallet kommer til å bli når du legger til en?
Det kommer til å bli 0.
Høyre?
Fordi hvis du hadde mer bits-- og jeg skal prøv å, på en måte, skriver den ut her--
hvis vi hadde flere biter, hva vi kunne gjøre her er å legge til en,
og da vil vi få dette.
Uff da.
Vi ville ha en en bit hele veien over her.
>> Men hvis dette er en endelig verdi, er det bare 8 bits,
og det er forhåndsbestemt av datamaskinen,
at en er effektivt ikke der.
Det faller bare slags utfor et stup.
Og så hvis du legg 1 til 255, hva verdi har du tydeligvis få?
0.
Og så tallene uhell, og kanskje ubevisst,
ender opp innpakning rundt som dette.
Så hva kan være konsekvensen av dette?
Vel, det er et par forskjellige ting.
Så en, betyr det ende opp som ser som 0, utilsiktet,
men du kan slags se, selv i den virkelige verden,
for bedre eller verre, manifestasjoner av denne ideen om en grense.
For eksempel, noen av dere som noen gang har spilt Lego Star Wars,
er det noen som tilfeldigvis vet maksimalt antall mynter
du kan samle seg i Lego Star Wars?
Ta en gjetning basert på dagens ledende spørsmål.
Det er større enn 256 eller 255.
Det er 4 milliarder kroner.
Så det viser seg, og det er noen people--
noen googling bekreftet sist kvelden-- har fått 4 milliarder gullmynter,
eller whatnot, i Lego Star Wars.
Selv tilsynelatende, det er en måte å lure spillet,
det er en bug eller funksjon, som lar deg bare tilfalle mange og massevis av poeng.
Men den største mulige verdi, i henhold
til dette skjermbilde av noen jeg funnet på nettet, er faktisk 4 milliarder.
>> Nå hvorfor er det?
Det er nettopp 4 milliarder kroner, sannsynligvis fordi noen bestemte seg,
som skrev dette spillet, at de kunne gjøre 4 milliarder kroner,
noe, noe, noe som verdien jeg satt opp
med kalkulatoren tidligere, men det er bare litt renere for mennesker
for å si det maksimale antallet av coins-- eller pigger,
som de kaller them-- at du kan samle er 4 milliarder.
Og så, hvorfor er dette?
Hvordan er LEGO spill implementere telleren
som holder orden på antall mynter du har?
De bruker hva?
Publikummer: Den stopper telling etter 4 milliarder.
DAVID J MALAN: Den stopper telling etter 4 milliarder kroner,
som betyr at du kan antyde, som programmerer,
at de er sannsynligvis ved hjelp av en 32 bit heltall.
Som programmerer bokstavelig talt bare maskinskrevet, int, i hans eller hennes kode,
og det er den type variabel som de bruker til å lagre noen kode.
Så det er andre manifestasjoner av slike grenser.
>> Så jeg har ikke spilt denne game-- og jeg leste opp på historien
å bekrefte som much-- men i opprinnelige versjonen av Civilization, der
du tydeligvis samhandle med hverandre andre og kan føre krig eller fred,
Gandhi var ment å være en av de mest fredelige tegn, så jeg
forstå det, i den første versjon av Civilization.
Og faktisk på en skala fra 1 til 10, hans aggressivitet var bare en en.
Så aldri så mildt aggressive, tilsynelatende.
>> Men på et tidspunkt, kan du tilsynelatende installere demokrati i geografi.
Og hvis du installerer demokrati inn din versjon av spillet,
så din aggresjon nivået går ned.
Det er en god ting.
Folk er mer rolig tydeligvis i en slik situasjon.
Men tydeligvis gjorde noen ikke har en, dersom tilstanden
i den opprinnelige versjonen av koden.
>> Så Gandhis aggresjonsnivå gikk fra positiv 1, minus to, til negativ en,
men spillet ikke forstå negative tall.
Så det som skjedde var Gandhis aggresjon nivå gikk fra 1, 0, til en negativ,
som hadde den virkning innpakning rundt å være
den mest aggressive karakter i spillet, til en verdi av 255,
på en skala fra 1 til 10.
Og siden da har det vært flere inkarnasjoner av dette spillet,
og de har holdt det som en slags påske egg,
som Gandhi er tilsynelatende så fryktelig aggressiv.
Men det var et resultat av en veldig enkel programmeringsfeil
i at svært tidlig versjon av spillet.
>> Nå mer urovekkende, mer nylig, Boeing 787
ble dokumentert til å ha en bug, ikke den slags enhet
du spesielt ønsker å ha en bug.
Og symptomene, som jeg skal lese her, fra en artikkel på nettet,
var dette en modell 787 fly som har vært drevet kontinuerlig
for 248 dager kan miste alt vekselstrøm, AC,
elektrisk kraft, på grunn de generator kontrollenheter,
GCUs, samtidig går inn Fail-safe mode.
Så dette var en advarsel når dette problemet ble oppdaget.
Denne tilstanden er forårsaket av en programvareteller,
internt i GCUs, så et helt tall eller en variabel,
som vil overløp etter 248 dager med kontinuerlig strøm.
Boeing er i ferd utvikle en GCU software oppgradering som
vil avhjelpe usikre tilstand.
>> Så mye som missilet scenario, hvor
de hadde noen form for variabel som ble telling, og teller,
og teller, men etter hvert overfylte grensene for sin evne,
på samme måte gjorde jævla flyet har en variabel overløp
etter nok tid for løping.
Og så tongue-in-cheek måte å jobbe rundt dette problemet
er å virkelig, reboot, flyet hver 247 dager, slik at minnet blir visket
og den variable går tilbake til 0.
Men innser, er dette en svært store inkarnasjon av programvare,
men særlig ettersom vi hører om Apples operativsystemer kommer inn i biler,
og selv kjører biler fra Google, og en rekke inkarnasjoner av programvare
i vårt daglige liv, TV og klokker, og mer,
realisere var omgitt av programvare, som alle er skrevet av oss mennesker.
>> Og som vi alle snart oppdage, det er veldig enkelt og veldig typisk
å gjøre feil når du skriver programvare.
Og hvis du ikke fange dem, noen dårlige ting kan skje.
Nå noen ganger, noen morsomme ting kan skje,
eller i det minste noen ganger vi vet å forvente noen ondskap.
Så 0 delt på 0, fra klasse skole, er generelt en dårlig ting.
Det er udefinert.
Og det viser out-- og la oss se om min mic kan plukke dette opp-- at Apple
hadde litt moro med dette nylig.
Så jeg har en iPhone her.
Jeg kommer til å snakke med Siri og be henne å gi meg svaret på 0 delt på 0.
Hva er 0 delt på 0?
>> SIRI: Tenk deg at du har 0 cookies, og du dele dem jevnt
blant 0 venner.
Hvor mange cookies gjør hver person får?
Se?
Det gir ikke mening.
Og Cookie Monster er trist at det ikke er noen kapsler.
Og du er trist at du har ingen venner.
DAVID J MALAN: Det er litt ubehagelig.
Så dette er hva som ble bare sa det.
Det er ubestemmelig, det er ikke definert, Og ja, mange programmeringsspråk
eller, egentlig, kompilatorer vil oppdage når du, i et program,
prøv å dele 0 av 0.
Mer moro enn dette selv, er som tilsynelatende, Cookie Monster
er på Twitter i disse dager.
Og han svarte på dette, med dette, som er helt bedårende.
Men la oss ta en rask titt på et par andre konstruksjoner,
og deretter sette noe av denne kode for å bruke, i gode måter.
Så det viser seg, foruten etter looper, det er
noe som kalles en stund loop, som ser annerledes ut og er implementert
litt differently-- og Vi vil til slutt se examples--
men i noen forstand, det er enklere fordi det
ikke tillater deg å initial og oppdatere innenfor grensen av loopen.
Du kan fortsatt gjennomføre det.
Så du kan gjøre de samme tingene med en stund sløyfe, som med en løkke for,
men syntaksen, ultimately-- som vi vil til slutt
see-- kommer til å være annerledes.
Det er enda en gjør mens loop, som er faktisk litt annerledes,
i at mens en for loop og en stund løkke alltid
sjekke tilstanden deres første, hvis du leser denne tingen topp til bunn,
den slags ser ut som det kommer til å sjekk den tilstand siste fordi det er
virkelig den siste linje med kode.
Og ja, det kommer til å være nyttig i enkelte programmer som vi skriver,
Hvis du ønsker å bare blindt gjøre noe og til slutt sjekke tilstanden.
Det er ikke nødvendigvis en dårlig ting.
Hvis vi ønsker variabler, kan vi gjøre det i et par forskjellige måter.
Og vi så i Foxtrot tegneserie, en måte å gjøre det,
hvor du deklarerer variabelen, som int teller semikolon,
og deretter later-- kanskje neste linje, kanskje 10 linjer later--
du faktisk initialisere den.
Så disse 2 linjer med kode erklære en variabel av type int
og kaller det teller, slik at det gir meg nok biter til å holde en int.
Og så til slutt, setter det verdien 0 i den variable.
Det ordner 0 og 1-ere i en mønster, som vi vet fra forrige uke,
representerer antallet vi kjenner som 0.
Eller for å være ærlig, kan du gjøre dette mye mer konsist, akkurat som dette.
>> Nå har vi også muligheten til å ringe funksjoner.
Og faktisk, her er en 2 linje program, eller et utsnitt av disse,
som tillater oss å faktisk skrive noen kode som
får en streng fra user-- mye som vår frivillig et øyeblikk ago--
lagring av resultatet i en variabel kalt navn,
og then-- mye som med våre frivillige med printf-- skriver ut disse verdiene
ved å føre i to argumenter, den streng, etterfulgt av den variable
kalt, navn, i seg selv.
Så la oss ta en titt, før vi kommer tilbake til Mario der,
på et par nå, eksempler på dette.
>> Jeg kommer til å gå videre og åpne opp, la oss si, funksjon-0.c.
Og som alltid, er denne koden tilgjengelig på kursets hjemmeside,
slik at du kan spille sammen hjem og se på det senere.
Men her er programmet i det hovedsak fra linje 17-22.
Hovedprogrammet er der Programmet er alltid kommer til å starte.
Dette programmet, tilsynelatende, kommer å skrive ut navnet ditt, tykktarm.
Det er da tenkt å ringe GetString, akkurat som vi gjorde med våre frivillige.
Og så, er dette interessant, det kommer til å ringe printname.
Det viser seg, hele denne tiden, er det ser ut til å være en funksjon som kalles printname.
Som skriver ut noen navn.
Vi trenger ikke å bruke printf fra svunnen tid, det er printname.
>> Men det er misvisende fordi printname ikke
komme med C. Folk gjorde ikke oppfinne det noen 40 eller 50 år siden,
Jeg gjorde det, i stedet.
Og faktisk, hvis jeg blar ned ytterligere, varsel
hvordan jeg kan skrive min egen funksjoner i C. Vi vil til slutt
forklare hvorfor vi fortsetter å si, tomrom, i noen få steder,
men for i dag, la oss bare se på navnet.
>> På linje 24, hvis du ønsker å lage din egen funksjon,
du bokstavelig talt skrive Navnet på funksjonen.
Jeg valgte printname.
I parentes, du deretter angi hva slags
innganger, og hvor mange du ønsker denne funksjonen til å ta.
I dette tilfellet ønsker jeg å ta En variabel kalt, navn,
og det kommer til å være av type, streng, så det kommer
å være en sekvens av tegn.
Og så, dette program-- mye som i Scratch,
du kan ha tilpasset puslespill pieces-- kommer til å ha denne skikken atferd.
Det kommer til å ringe printf bestått i, hallo, plassholder,
og så kommer det til å plugge i hva brukeren heter.
>> Så dette er et eksempel på hva en datamaskin vitenskapsmann ville
samtale abstraksjon eller funksjonell dekomponering, som er like
fancy måter av saying-- er hvis du liker dette høye nivået idé,
som jeg vil ha funksjonalitet som skriver noen navn, absolutt du
kan bokstavelig talt skrive printf og deretter passere i argumentene du ønsker,
og programmet vil fungere, som den har siden onsdag.
Men du kan begynne å abstrahere bort tanken om å skrive et navn.
Du kan gi den et navn, som printname, og dette
er denne ideen om lagdeling fra uke 0.
>> Heretter, jeg og du ikke trenger å vite eller omsorg hvordan printname er implementert.
Ja det bruker printf, kanskje det ikke gjør det, hvem vet hva bruker?
Hvem bryr seg?
Nå snakker jeg opp her, i stedet for ned her.
Og ja, som våre programmer får mer avansert og sofistikert,
vi kommer til å fortsette å ta for gitt at lavere nivå puslebiter eksisterer.
Fordi vi skrev dem eller noen andre gjorde, så
at vi da kan bygge på toppen av dem.
La oss ta en titt på denne variant, fungerer en.
>> Så dette er litt mer avansert, men det viser seg
at i CS50 bibliotek, det er bare en GetInt funksjon.
Vi trodde ikke, år siden, for å implementere en GetPositiveInt funksjon.
Og det er litt irriterende fordi hvis dere skriver et program hvor
Vil du få en positiv heltall fra brukeren,
du kan absolutt bruke GetInt.
Og du kan absolutt sjekke med tilstanden og kanskje en løkke
hvis det int er større enn 0 og kjefte på brukeren
hvis han eller hun ikke gir man et positivt tall.
Men la oss bygge dette bygningen blokkere oss selv, en,
tilpassede Scratch stykke, om du vil.
Jeg kommer til å ha et program her som til slutt, jeg
ønsker å være i stand til å ringe GetPositiveInt, og jeg ønsker å være
i stand til å skrive ut hva som int er.
Men dette er abstrahert bort nå.
Det er bare blitt gitt en høy grad navn som sier hva den gjør,
som er fantastisk fordi det er veldig intuitivt nå å lese.
Og hvis jeg gjør bryr hva som er under panseret, la meg bla nedover.
Og det er litt skremmende i starten, spesielt
Hvis dette er ditt første program, men la oss ta en titt.
>> Jeg ikke lenger å si, ugyldig fordi det viser seg funksjoner,
mye som GetString, kan returnere en verdi for meg.
De har ikke bare ha skrive ut på skjermen,
de faktisk kan levere meg noe tilbake.
Og mens før printname, Jeg trengte ikke noe tilbake.
Jeg trengte den bivirkning av noe å dukke opp på skjermen,
men jeg trenger ikke et menneske å gi meg noe tilbake.
Her, med GetPositiveInt, som med GetInt,
Jeg ønsker å bli levert noe tilbake.
Så jeg sier ikke, ugyldig på linje 23, men int,
som sier, denne funksjonen som jeg skriver,
kalt GetPositiveInt kommer til å gi meg tilbake et tall, ikke noe,
ikke annullert.
>> I mellomtiden kommer det til å ta nei innganger, så jeg har, type, snudd det.
Jeg gir ikke GetPositiveInt noen input, jeg vil at det skal gi meg sin produksjon.
Og hva skjer nå?
Så her er hvordan jeg kan erklære en variabel.
Jeg har gjort det utenfor loop, av grunner vi vil til slutt se,
men dette gir bare meg 32 biter kalt, n,
og jeg har pre-bestemmelse dem til å lagre heltall.
Og her er det, gjør mens konstruere, og dette er grunnen til at det er nyttig.
Bokstavelig talt gjøre dette, mens n er mindre enn 1.
Så la oss se hva som skjer.
Jeg skrive ut, kan gi meg en positiv int.
Jeg deretter få en int, ved hjelp av CS50 s funksjon og som er lagret i n.
>> Og så, hva linje med kode trolig blir henrettet neste, logisk?
Hvilken linje nummer?
Ja, så 31.
Du vil ikke vite dette før du har blitt fortalt eller slags antyde det,
men det er sant.
Det går opp og ned og deretter holder gjenta.
Så hvis jeg har skrevet i si, antall negative 1, er n mindre enn negative 1?
Yeah.
Fordi negative 1 er mindre enn en.
Så hva skal skje?
Jeg kommer til å gjøre dette mens n er mindre enn 1,
så jeg kommer til å gå tilbake til linje 28.
>> Og hver tid-- og la oss kjøre dette-- gjøre funksjon en å kompilere den,
og nå dot slash funksjon 1.
Hvis jeg skriver negativ en, er det kommer til å holde roping på meg
før jeg samarbeide fordi hver av mine innganger er mindre enn 1
og hvis det er mens mindre enn 1, Jeg kommer til å fortsette å gjøre dette.
Hvis jeg endelig gi den et tall som 50, heldigvis, sier det, takk for den 50.
Hvorfor?
Fordi så snart n er ikke mindre enn 1, slutter jeg å bli sittende fast i denne sløyfen,
og denne nye søkeordet i dag, avkastning, gjør bokstavelig talt det.
Så jeg har nettopp gjennomført, i en forstand, tilsvarende GetString,
hvor jeg levere tilbake til den som bruker meg, noen verdi.
Det trenger ikke å være en streng, er det en int.
Så en enkel, rask eksempel, men vi vil snart
se litt mer sofistikert versjoner fortsatt.
Faktisk, la oss ta en titt på en numerisk en, som kalles return.c.
Og dette er faktisk litt enklere.
Så dette programmets formål i life-- la oss kompilere og kjøre den,
så sørg for retur, dot slash, return-- varsel
programmet bare terninger verdien 2.
Det er ganske dumt, er det vanskelig kode, tar det ikke noen innganger,
men det viser en annen funksjon som jeg har skrevet selv.
Så her har jeg erklært variabel, kalt x, av typen int,
lik antallet 2, helt vilkårlig.
Dette er bare noen fluffy utskrift.
Det sier x er nå, slik og sådan, cubing dot dot dot.
Og magien er tydeligvis på linje 21.
Jeg ringer en funksjon kalt, kube, Jeg overlate det et ark
med nummer 2 er skrevet på det, og hva verdien, matematisk,
ønsker jeg å få ut av det?
Akkurat som en mental helse sjekk?
8.
Høyre?
Jeg vil ha to terninger tilbake, to til kraften av tre, slik at 8 tilbake.
>> Så hvor er kube implementert?
Vel, merke til det er gjennomført her nede.
Og akkurat som før, logisk, selv om syntaksen er trolig
veldig nytt for mange av dere, Jeg vil ha denne funksjonen
å gi meg tilbake et ark med papir med en int på den.
Så jeg har en int, den Navnet er vilkårlig,
men beleilig kalt kube.
Inngangen til det, er n av skriver heltall, så det er
hvordan jeg kan passere i antall 2 på et ark.
Og så viser det seg C støtte matematikk, slik at du ikke har x-er for tiden,
du bare bruke stjerne for multiplikasjon.
Og dette returnerer n ganger n ganger n, som ganske enkelt er en terningformede verdi.
>> Så hvor skal vi med alt dette?
Dette er definitivt en virvelvind tur, være trygg,
som i super seksjonene og i oppgavesettet 1,
vil du bli gikk gjennom alt dette enda mer.
Og i oppgavesettet en, vil vi overgangen fra den grafiske verden av Scratch
til noe mer kommandolinje i C. Men vi vil trekke inspirasjon
fra dette her spillet fra en svunnen tid, hvor
ved hjelp av C og standard utgaven av p settet du vil implementere Mario pyramide.
Og i hacker-utgaven av p sett, hvis du velger å velge,
du vil implementere litt mer utfordrende pyramide med to topper.
Du vil også gjennomføre en algoritme, en grådig algoritme.
Det viser seg at det er noen interessante logikk
bak fremgangs kjører en kasserer stasjon
og faktisk overlate noen tilbake endring.
Det er en algoritme som er ganske grei, at du kanskje selv
forstå intuitivt når du først lese it-- innser det er det jeg alltid har
gjort noen gang jeg har gitt noen noen penger back-- som lar deg alltid
minimere antall papir notater eller metallmynter
at du leverer tilbake til brukeren.
Og dette, selvfølgelig, er overbevisende fordi hvis du går til CVS eller whatnot,
du ikke ønsker å være handed en hel haug av dem
eller en hel haug med pennies.
Du vil ha færrest mynter, sannsynligvis, det er mulig.
>> Til slutt, vil du også bli utfordret å prøve seg i en verden av vann
og faktisk få en forståelse for en mapping mellom vannføringer,
av lyst, vann i en dusj, hvor mye vann brukes.
Og hentydning deri, blir dette klippet her,
som vi vil ende på for bare 60 sekunder, som
tegner et bilde av low-flow dusjhoder.
>> [VIDEO PLAYBACK]
-Greit.
Jeg fikk alt her.
Jeg fikk Cyclone F-serien, Hydra, Jetflow, Stockholm
Supersteam, you name it.
>> -Og Hva anbefaler du?
>> -Hva ser du etter?
>> -Power Mann.
Power.
-lignende Silkwood.
-Det Er for stråling.
-Det er riktig.
-Nå Hva er dette?
-Det Er det Commando 450.
Jeg selger ikke at en.
>> -Men Det er det vi ønsker.
Det er en commando 450.
>> -Ingen Tro meg.
Det er kun brukt i sirkus.
Det er for elefanter.
>> -Jeg Betale noe.
>> -Hva Med Jerry?
>> -Han Ikke kunne håndtere det.
Han er delikat.
Oh yeah.
[END PLAYBACK]
DAVID J MALAN: All right.
Det er hvis for CS50.
Vi sees neste uke.
>> SPEAKER 1: [? Scully?], [? Ian,?] så langt som dette outro prosjektet,
hva har dere kommet opp med?
>> SPEAKER 2: Vel, vi har gitt det en rekke tanke,
og vi tror at den beste måten to--
>> SPEAKER 3: Får jeg?
>> SPEAKER 2: Ja.
For all del, faktisk.
>> SPEAKER 3: Så jeg tror Vi kan oppsummere vår idé
for de outros med ett word-- ingenting.
>> DAVID J MALAN: Ingenting?
SPEAKER 3: Ingenting.
DAVID J MALAN: Hva betyr det?
SPEAKER 3: outros er om ingenting.
SPEAKER 2: Vel, jeg mener, i filosofi, Jeg mener, ingenting er alltid noe.
SPEAKER 1: Så what's-- hva er forutsetningen?
SPEAKER 3: Så det er som livet.
OK.
Hva gjorde du idag?
>> DAVID J MALAN: Jeg sto opp, hadde frokost, og kom til å fungere.
>> SPEAKER 3: Det er en outro.
SPEAKER 2: Men, jeg mener, bør ikke noe skje med ham på the--
SPEAKER 3: Nei, nei, nei, nei.
Ingenting skjer.
>> SPEAKER 1: Så hvorfor er vi ser?
>> SPEAKER 3: Fordi det er en outro for CS50.
>> DAVID J MALAN: Ikke ennå.