[Powered by Google Translate] DAVID J. MALAN: Greit, dette er CS50 og dette er
slutten av uke 1, så studere kortene er i og det totale antall av
klassekamerater som du har dette året er 745.
Og vi er så begeistret for å ha så mange av dere i løpet
dette semesteret, men selv om dette kurset er så stor,
innse at det er disse tingene som fredag ​​lunsjer, som
kontortid, 15 personer deler, og så videre som
er egentlig ment for å skape dette mer intim
miljø.
Så selv om vi kan samle en eller to ganger i uken, her i
Sanders, vet at mye av din erfaring i dette kurset
vil veldig mye være hands-on på sammen av dine klassekamerater
og faglærere.
>> Så her går vi, Fall 2012.
Så husker at forrige gang vi endte på et notat av
unøyaktighet, snakker om representasjon av tall.
Og vi så på en av de feil som har skjedd i
virkelige verden, når det kom til misforståelser
hvordan datamaskiner fungerer.
Vel, i dag skal vi besøke en av disse ideene som
samt fortsette vår diskusjon av CS50 klient
og C, og hva det egentlig betyr å programmere.
Men først, bare et par virvelvindteknikkene kunngjøringer.
>> Seksjoner begynner denne søndagen, og den første uken er alltid en
litt av en rask start, fordi vi bare fikk i
din del skjemaer.
Vi gjør det samme nå, med undervisning stipendiater, nå
at de kjenner planene sine, så vi sikter, etter
Lørdag morgen, for å følge opp med deg med inndelingen
oppdrag og TF.
Innse at de vil starte neste dag, søndag
eller mandag eller tirsdag.
Og deretter vil vi imøtekomme delen endringer som de oppstår
i dagene som kommer.
Kontortid, i mellomtiden, er, igjen i kveld, 20:00 til 11, i
Annenberg samt morgen kveld.
Selv om problemet sett er vanligvis på grunn på torsdager
midt på dagen, innser at du har opptil fem sent dager å bruke,
derav tilgjengeligheten av kontortiden på torsdager hvis
du kontanter i en av de sene dager og dermed sende
noe på fredag.
La meg foreslå at Scratch er blant de mer moro, blant
mer lav nøkkel oppgavesett.
Og jeg ville henge på de sene dager, strategisk, bare
for senere i semesteret når livet begynner å komme i veien
med midterms og andre klasser.
Problem Set 1, i mellomtiden, ville bli lagt ut på kursets
Nettside denne fredagen, som vil bli på kurset gange
gjennom video, som vil bli filmet på 02:30 på fredag
og deretter lagt ut på nettet av neste dag.
>> Så vi endte på mandag.
Jeg vil - faktisk, en merke seg her.
Fordi klassene - fordi Sanders ikke låne nøyaktig
seg til uformell Q & A og tilbake veldig godt, vi
kommer til å prøve noe litt nytt i år, der
Hvis du ikke er komfortabel å heve hånden eller du bare
vil heller ikke heve hånden i et rom som dette,
vi kommer til å ha noen av de pedagogiske stipendiatene og CAS
bemanning cs50.net/discuss under forelesning.
Så hvis du har et spørsmål fordi jeg var helt
uklart om noe eller er du nysgjerrig på noen
emne, prøve å legge den der.
Merke den med en etikett av Foredrag, og vi vil gjøre vårt beste
i dag og neste uke - vi vil prøve dette ut - til feltet det
enten elektronisk, online, eller om det føles som vi skal
virkelig ta det en masse, en av de pedagogiske fellows eller
CAer vil heve sin hånd og spør
anonymt på dine vegne.
Så vi vil gi dette en sjanse og se hvor godt dette fungerer.
Men, for all del, fortsett å heve hendene som du ønsker.
>> Så siste gang vi viste at 10% eller en tiendedel er ikke i
Faktisk, 0.1, som du lærte for mange år siden.
Det er faktisk en verdi som dette.
Men det er ikke helt sant, ikke sant?
Vi må bare denne begrensningen i datamaskiner der, hvis du
bare har en begrenset mengde minne, RAM, eller mer
spesielt biter, vel, det er bare et endelig antall
ting kan du representerer.
For eksempel, hvis vi har tallet null, og vi ønsker å
representerer i binær, med åtte biter, der litt,
igjen, er en null eller en, kanskje vi
representerer det som 00000000.
Og det er litt unødvendig detaljert.
Akkurat som i desimalsystemet i den virkelige verden,
generelt, hvis du ønsker å skrive nummeret 123, vi
mennesker sannsynligvis ikke skrive 00000123 selv om,
funksjonelt, det er nøyaktig samme antall.
Vi dropper ledende nuller, så å si.
>> I binær, kan vi gjøre det samme.
Binære og null, null og binære er bare null.
Du trenger bare en enkelt bit.
Men igjen, den vanligste måleenheten i verden
databehandling er byte, åtte biter.
Bare fordi en bit, ganske ubrukelig.
Åtte biter, ikke veldig nyttig, men minst det er mer
nyttige enn en enkelt måleenhet.
Så med åtte bits, vil vi vanligvis representerer binær.
Så her har vi tallene null, ett, to, og så, som
Nate gjorde i videoen vår forrige onsdag, kan vi fortsette
telle opp til sju, åtte.
Og så hvis vi bruker mer og mer biter, vi
kan telle opp til uendelig.
Men hvis du bare har et endelig antall av disse bitene, er som
tilfelle i ethvert datasystem, eller selv missil
system, vel, faktisk du bare har en
begrenset mengde av presisjon.
Så hvis du ønsker å representere tall som 0,1, vel,
Datamaskinen har å velge og vrake.
Og hvis det har bare et begrenset antall tall det kan
representerer, kan det komme nær 0.1 for deg, men det kan ikke
nødvendigvis gi deg nøyaktig den verdien du ønsker.
Og dette er bare en av utfordringene med datamaskiner,
under panseret, heldigvis.
>> Som vi flytte lenger i semesteret, disse lavere nivå
detaljene blir mye mindre interessant, men absolutt
anvendelsen av disse ideene kan ha noen svært virkelige verden
konsekvenser.
Den ene er en litt morsom.
Hvor mange av dere har sett den fantastiske filmen Office Space?
Hvis du ikke har, er at uoffisielle
lekser for uken.
Men i Office Space, fellows i den filmen tar
nytte av nettopp denne ideen, men de faktisk stjal
det fra en annen film som du kan ha
sett, selv år tidligere.
Så la meg gi deg noen sekunder av denne traileren fra
denne fantastiske filmen, og dette er veldig mye
faglig relevant.
>> [SPILLER MOVIE]
Egentlig jeg blir forfremmet.
Jeg kan programmere et virus som vil rive det
plassere seg big time.
Vel, hvordan virker det?
Hver gang det er en bank transaksjon der interessen er
computertomografi, det er tusenvis om dagen, avslutter maskinen opp
med disse fraksjoner av en cent.
Men jeg har ikke tenkt å gjøre noe ulovlig.
Ulovlig? Samir, er dette Amerika.
Du må sverge til Gud.
Hvis ingen vet om dette, men oss, ok? Ingen familiemedlemmer, ingen
kjærester, ingen.
[Uhørlig].
Ikke bekymre deg, mann, vil jeg ikke si det til noen heller.
[Filmen slutter]
>> All right, så kanskje jeg fant denne filmen bedre enn de fleste
folk her, men i alle fall, viruset som de var
prøver å skape -
og i filmer, når de vil kalle noe et virus,
Det er generelt ikke egentlig et virus.
Det er bare et program som noen skrev å gjøre noe.
Og i dette tilfellet ble gutta prøver å skrive et program
som tok fordel av deres selskap kalt Innotech er
datasystemet, hvorved datamaskiner, også, selv når det
kommer til penger, kan ikke nødvendigvis
representerer penger presist.
Så selv om du kanskje har $ 0,10 på bankkontoen din,
0,10, vel, kan det hende at datamaskinen faktisk tror at du har
dette mange cent i din bankkonto.
Og så hva disse gutta var håper å gjøre - og de
stjal ideen, viser det seg fra Superman III, hvor
Richard Pryor gjorde det samme - de var i hovedsak
skrive programmer som håper å ta alle de etterfølgende
tall, alle de små, små, små fraksjoner av
pennies, og siphoning de av slik at menneskene bare
tanke, oh, det er bare $ 0.10 der, men alle av dem
etterfølgende tall til slutt legge opp.
Så en fantastisk idé, og det backfired hilariously i at
spesiell film.
>> Men i den virkelige verden, for det er mye mer om
implikasjonene av disse slags ting.
Og en av grunnene til å dykke inn i feltet av datamaskinen
vitenskap er, igjen, dens anvendbarhet ikke til
ingeniørfag alene, men bare for å
andre felt også.
Så dette er en mindre munter titt på hva som kan gå galt, men
det er også ganske øynene åpne, tror jeg, når det kommer til
forstå nøyaktig hvor allestedsnærværende teknologier som
datamaskiner og programmering eller disse dager,
i form av programvare.
Så dette neste klippet er omtrent seks minutter, fortsetter
der vi slapp forrige gang, men tillater oss å se litt
mer i dybden på en slik av disse spørsmålene.
La meg gå videre til der vi slapp,
som var her.
Og vi har en del to av to, for omtrent seks minutter her.
>> [PLAY MOVIE]
Plaget moderne rakett-teknologi.
I 1991, med oppstart av den første Gulf-krigen, Patriot
missil opplevd en lignende type
tallkonvertering problem.
Og som et resultat, ble 20 personer, 20 amerikanske soldater, drept
og ca 100 andre såret, da Patriot, som var ment
for å beskytte mot innkommende scuds,
unnlatt å fyre av en rakett.
>> Da Irak invaderte Kuwait og Amerika lansert en Desert
Storm tidlig 1991, var Patriot raketter batterier
utplassert for å beskytte Saudi-Arabia og Israel fra Irak
Scud rakettangrep.
The Patriot er en amerikansk mellomdistanse bakke-til-luft-systemet,
produsert av Raytheon selskapet.
Størrelsen på Patriot interceptor selv, det handler om
omtrent 20 meter lang og veier ca 2000 pounds.
Og det bærer et stridshode på om - jeg tror det er omtrent
150 pounds.
Og stridshodet selv er en høy eksplosiv som har
fragmenter rundt det.
Casing av stridshodet er ment å virke som haggel.
Rakettene er gjennomført fire per container og er
transporteres av en semitrailer.
>> The Patriot anti-rakett system går tilbake minst til
20 år nå.
Det ble opprinnelig utviklet som en luftforsvar rakett til
skyte ned fiendtlige fly, i den første Gulf-krigen.
Når det krig kom, ville hæren til å bruke den til å skyte
ned scuds, ikke fly.
Air irakiske Force var ikke så mye av et problem, men hæren
var bekymret scuds.
Og så de prøvde å oppgradere Patriot.
Avskjære fiendens rakett reiser på Mach 5 skulle
å være utfordrende nok.
Men når Patriot ble rushed inn i tjeneste, Hæren
var ikke klar over en irakisk modifikasjon som gjorde sitt
Scuds nesten umulig å treffe.
>> Hva skjedde er scuds som var
kommer i var ustabil.
De ble wobbling.
Grunnen til dette var at irakerne, for å få 600
kilometer ut av en 300 kilometer rekkevidde rakett, tok
vekt ut av foran stridshode og
gjort stridshodet lettere.
Så nå Patriot prøver å komme på Scud, og de fleste av
tiden, det overveldende flertallet av tiden, ville det
bare fly av Scud.
Når Patriot operatører innsett Patriot
savnet sitt mål, detonerte de Patriot stridshode.
For å unngå mulige tap, ble det tillatt
å falle til bakken.
Det var hva folk flest så, som store ildkuler på himmelen,
og misforstått som fanger av Scud stridshoder.
>> Selv på nattehimmelen, dukket Patriots å være
vellykket ødelagt scuds, på Dhahran, kan det ikke være noen
feil om ytelsen.
Der mistet Patriot radar system spor på en
innkommende Scud og aldri lansert på grunn
til en programvare feil.
Det var israelerne som først oppdaget at jo lenger
systemet var på, jo større den tid avviket ble,
grunnet en klokke innebygd i systemets datamaskin.
To om uker før tragedien i Dhahran, den
Israelerne rapportert til Forsvarsdepartementet at
Systemet var å miste tid.
Etter cirka åtte timer å kjøre, merket de at
Systemet var blitt merkbart mindre nøyaktige.
Forsvarsdepartementet svarte med å fortelle alle
Patriot batteriene å ikke la systemene
på for en lang tid.
De sa aldri hva en lang tid var - 8 timer, 10
timer, 1.000 timer.
Ingen visste.
>> The Patriot batteri stasjonert ved brakkene på Dhahran
og dens feil intern klokke hadde vært på over 100 timer på
natt til 25. februar.
Det spores tid til en nøyaktighet på omtrent en tiendedel av et sekund.
Nå er en tidel av andre er en interessant tall, fordi
det ikke kan uttrykkes i binær, nøyaktig, noe som betyr
det ikke kan uttrykkes nøyaktig i hvilken som helst
moderne digitale datamaskin.
Det er vanskelig å tro.
Men bruker dette som et eksempel.
>> La oss ta nummer én tredjedel.
En tredjedel kan ikke uttrykkes i desimal, akkurat.
En tredjedel er 0.333 skjer for uendelig.
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 lenger systemet løp, jo verre tidspunkt feilen ble.
Etter 100 timers drift, var feilen i tide bare
om lag en tredjedel av et sekund.
Men i form av målretting en rakett som reiser på Mach 5,
det resulterte i en relativ volatilitet på over 600 meter.
Det ville være en fatal feil for soldatene ved Dhahran.
>> Hva skjedde er en Scud lanseringen ble oppdaget av tidlig varsling
satellitter og de visste at Scud kom i deres
generelle retning.
De visste ikke hvor det kom.
Det var nå opp til radaren komponenten av Patriot
system, forsvarer Dhahran, for å finne og holde orden på
innkommende fiendtlige raketter.
Radaren var veldig smart.
Du ville faktisk spore posisjonen til Scud og deretter
forutsi hvor det sannsynligvis ville bli den neste gang
radar sendte en puls ut.
Som ble kalt serien gate.
Deretter, når Patriot bestemmer nok tid har gått til å gå
tilbake og sjekke neste plassering for denne oppdaget
objekt, går den tilbake.
Så når det gikk tilbake til feil sted, ser det da ingen
innvende, og det bestemmer at det ikke var noen objekt.
Det var en falsk deteksjon og faller sporet.
>> Den innkommende Scud forsvant fra radarskjermen.
Og sekunder senere, slengte den inn i brakkene. Den Scud
drept 28 og var den siste sparken under
den første Gulf-krigen.
Tragisk, kom den oppdaterte programvaren på Dhahran
den påfølgende dagen.
Og programvaren feilen hadde blitt fikset, lukke et kapittel i
den urolige historie Patriot missilet.
PATRIOT er faktisk et akronym for "faset array Tracking
Skjæringspunktet for Target ".
>> All right, så en mye mer sørgmodig utfallet av ikke helt
forstå denne verden.
Og takeaway, egentlig, fra filmen er at løsningen
Det var starte rakettforsvar
hver gang på en stund.
Og så igjen, en av målene for dette kurset, sikkert
på en mer ydmyk skala enn disse programmene, er å
virkelig åpne alles øyne til nøyaktig hvordan du går om
lage maskiner gjøre hva du vil de skal gjøre og hvordan du går
om å gjøre det riktig, mens underveis gjør det
vel, elegant, og så videre.
Og så i dag, la oss dykke inn i en litt mer av dette, men
slik at vi ikke går for fort, spesielt for de mindre
komfortable, men også slik at vi kan beholde interessen til
de mer komfortable, la oss bare raskt begynne med litt
av oppsummering av noen av disse ideene.
Og igjen, spør unna, både i person eller online, hvis du har
spørsmål slik at vi kan holde alle på samme side.
>> Så CS50 Appliance, raske skritt tilbake, er
hva med dine egne ord?
Det er OK hvis du har ingen anelse om hva disse ordene kan være ennå.
[Uhørlig]
Ok, så en universell grensesnitt for -
at vi alle kan dele.
Absolutt.
Så vi kunne, for eksempel, fortelle deg å gå til noen
nettside, laste ned denne programvaren for Mac OS.
Last ned denne programvaren for Windows, konfigurere i
denne måten, og at.
Men realiteten er da vi får utallige tekniske
støtte problemer.
Og også i disse dager, mye av hva som blir gjort server side,
i verden av databehandling, spesielt når det kommer til
webutvikling og web-baserte applikasjoner, er faktisk
ganske ofte gjort på Unix eller Linux-maskiner, i motsetning til
Mac eller Windows-PCer.
>> Så blant oppsider, da, for å bruke dette som kalles
CS50 Appliance er vi alle har det samme miljøet.
Så alle er på samme side uansett hvilken maskinvare du
kom til campus med, men også vil bli dabbling i nøyaktig
det samme miljøet som du skal bruke mot
semesters slutt også for webutvikling, samt i
fremtiden for virkelige verden programmer derav.
Så mer konkret, er det CS50 Appliance et gratis stykke
programvare som lar deg kjøre et annet operativsystem,
Linux, i dette tilfellet, på din egen datamaskin, i et vindu.
Nå kan du ikke bare laste ned apparatet.
Du trenger et program som brukes til å spille av eller bruke maskinen.
Og at stykke programvare er generelt kjent som en
hypervisor.
Hypervisorer kommer i form av produkter som VMware,
Virtual Box, Parallels.
Alle slags selskaper gjør programvare, både gratis og
kommersiell, likt.
Hva du vil se i oppgave Set 1 er instruksjoner om hvordan du
få gratis programvare som å
kjøre CS50 Appliance.
Og når du gjør det, vil du ha i et vindu på Mac eller PC,
et skrivebordsmiljø som ser ganske som dette, hvor
den har en Start-menyen-lignende ting i
nederst i venstre hjørne.
Den har en Hjem-mappen, eller Hjem-katalogen, i øvre venstre
der, en søppelbøtta, og så videre.
Så vi vil skille fra hverandre de nødvendige detaljer som vi går.
>> Men la oss nå begynne å dykke inn i C.
Så C er dette programmeringsspråk, ligner i ånden til
Scratch, men langt mindre grafisk, men ironisk nok, langt
kraftigere når du får kunnskapsrike med det.
Så i C, skriver vi programmer ved å skrive kildekode, som er
denne engelsk-lignende syntaks, ligner på sokker
demonstrasjon som vi gjorde sist gang som lar deg
uttrykke deg ganske nøyaktig, hvis
arcanely, til datamaskinen.
>> Så hva slags produkt programvare trenger du faktisk trenger
å skrive programmer i et språk som C, basert på vår
samtale på mandag?
[Uhørlig]
OK, du trenger bare en tekst editor.
Du trenger ikke noen spesiell programvare
per se å skrive programmer.
Du trenger bare en tekst editor som Notisblokk, på Windows,
TextEdit på Mac, eller noe som kalles gedit, i verden av
Linux, som vi vil bruke her.
Og det er det, å skrive programmene.
>> Men skriving er bare halvparten av ligningen.
Du da trenger å kjøre dem.
Men for å kjøre programmer -
du kan ikke kjøre kildekode.
Du i stedet må gjøre det til det første?
Ja.
DAVID J. MALAN: Du må
kompilere den.
Og noen andre, kompilere kildekoden betyr -
[Uhørlig]
DAVID J. MALAN: Nettopp.
Oversette det til nuller og enere.
Fordi alle av oss, i disse dager, har datamaskiner som har CPUer,
nesten alle som er tatt opp av et firma som kalles Intel, og
Intel Inside, betyr at det er dette hjernen innsiden av
datamaskin, kjent som CPU.
Og en av de tingene som at hjernen fungerer er, det vet
hvordan å forstå mønstre av nuller og enere.
Den vet hva mønster av biter representerer tillegg, hva
mønster representerer subtraksjoner, hva mønster av
bits representerer utskrift, og skape en hørbar lyd.
>> Så kort sagt, CPU, kombinert med operativsystemet,
som er et stykke programvare som kjører på toppen av CPU,
så å si.
Sammen disse to stykker vet hvordan du kjører programmer som
vi mennesker skrive.
>> Så hvis jeg går inn i CS50 Appliance her, jeg trenger å åpne
opp en tekst editor, og jeg kan få tilgang til denne
i et par måter.
Jeg kan enten gå til Meny, programmering,
og da kan jeg velge -
nope, ikke denne menyen.
Jeg kan gå til Tilbehør / gedit her for å åpne
min lille tekst editor.
Eller enklere, kan jeg klikke på denne lille ikonet nederst
venstre hjørne.
Og nå får jeg dette miljøet her.
Det er ganske minner om en enkel tekst editor, med bare
en eller to forskjeller.
I toppen, hvor markøren blinker nå, dette er hvor
Jeg kan begynne å skrive min kode.
I bunnen er dette som kalles terminal-vinduet.
Og hva slags ting kan jeg gjøre i denne
såkalte terminalvindu?
[Uhørlig]
>> Ok, så jeg skal kjøre kommandoer.
Og noen av kommandoene vi kjørte på mandag var litt
kryptiske i starten, men ls for listen, cd for change directory,
rm, for fjerne.
Så det er liksom en old-school måte å navigere din
datamaskin, kun ved hjelp av tastaturet og tekstlige kommandoer,
og ikke, generelt, ved hjelp av en mus.
Men vi får se, lenge før, gir dette oss faktisk en
litt mer kraft og litt mer presisjon med å
uttrykke oss.
Og så over her til venstre, vi bare kommer til å se,
som vi begynner å skrive programvare, en liten oppsummering av
program som vi har skrevet øverst til venstre.
Men vi får se det igjen før lenge.
>> Så la oss gjøre noe ganske enkelt her.
La meg først gå videre og gå til Fil, Lagre, og jeg er bare
kommer til å klikke på jharvard her, over til venstre, og
jharvard er, igjen, navnet for mitt hjem-mappen, min
personlige filer, meg nå er John Harvard, som dere alle
vil snart være John Harvard i dette miljøet.
Han fikk denne Hjem-katalogen, Mine dokumenter og så videre,
som jeg ønsker å spare nå, denne filen i.
Så jeg kommer til å kalle det hallo.c. Så jeg kommer til å gå
fremover og klikker på Lagre, og nå hva jeg har her er en fane
kalt hallo.c, så mye som en annen type editor.
>> Så nå la meg gå videre og begynne å skrive et program.
int main (void).
Og da jeg bare gjorde sist gang, printf, for utskrift formatert,
("Hei, verden!"
);.
Nesten ferdig.
Men jeg mangler et par detaljer.
Hva mangler i dette programmet at jeg virkelig trenger for
det å faktisk lage?
Ja.
[Uhørlig]?
>> DAVID J. MALAN: Ja, så jeg trenger å inkludere standard
I / O-bibliotek.
Så dette må gå over main, så jeg skal bare
gjøre noen plass for det der.
Og jeg kommer til å gjøre # include .
Og legg merke til de festemateriell der.
Og som en side, er gedit litt brukervennlig, hvis
noen ganger litt forvirrende, ved at den prøver å hjelpe
øyne merke til hva linje med hva.
Så det faktum at min markøren er rett ved siden av denne vinklet
brakett, legge merke til hvordan det er å fremheve den andre vinklet
brakett pluss denne.
Og det er bare å trekke min oppmerksomhet til det faktum at jeg
har symmetri.
Og symmetri i programmering er vanligvis en god ting.
Tilsvarende, hvis jeg flytter markøren til slutten, legg merke til hvordan den
klammeparentes i kø for å vise at, ja, jeg har en åpen
og et lukket, så å si.
>> Greit, og jeg kan gjøre en annen ting.
Det er ikke strengt nødvendig, men god praksis, for å si
returnere 0.
Og return 0 gjør hva for oss her?
Eller betyr det?
[Uhørlig]
DAVID J. MALAN: Men ingenting er galt.
Og ærlig er det vanskelig for mye å gå galt i en
programmere denne korte.
Så jeg bare være super eksplisitt at alt er vel.
Jeg, den menneskelige, når jeg kjører dette programmet, vil trolig aldri
se at 0.
Vanligvis er disse tallene som blir returnert fra viktigste
bare oppdra sine hoder til mennesker når
noe går galt.
Og du får en liten pop opp med å si systemfeil, en,
to, tre, eller hva nummeret var at
var faktisk returnert.
Så noe annet galt med dette?
[Uhørlig]
>> DAVID J. MALAN: Så dette er ikke så mye en funksjonell feil
men en estetisk opplevelse.
Jeg bør nok sette i en ny linje karakter der på
slutten av denne strengen, slik at vi faktisk flytte markøren til
neste linje, og programmet ser bare litt penere.
>> Så nå la meg gå ned til min terminal-vinduet
og zoom tilbake igjen
Og denne tingen her, det kalles spørsmålet.
Det er bare minner meg på hvem jeg er, jharvard @ apparatet, hvor
Apparatet er navnet på maskinen jeg er på.
I parentes er dette tilde, den squiggle symbol, som
representerer hva?
PUBLIKUM: Hjem katalogen.
DAVID J. MALAN: Hjem katalogen.
Så det er bare en snarvei notasjon for å si at du er i
den personlige mappen hvor alle filene går som standard.
Så nå, her kan jeg skrive ls for listen.
Og det eneste jeg ser her i øyeblikket er hallo.c.
Og det er bra fordi jeg bare skrev dette.
>> Så la meg gå videre og gjør hallo.
Og legg merke til jeg ikke skrive foreta hallo.c.
I stedet, jeg bare skrive basen navnet på filen, hallo.
Og gjøre, som vi så på mandag, vil bare antyde at jeg ønsker
den. c-fil.
Så nå har jeg skrevet at hallo.
Nå ser jeg dette ganske lang kommando og vil fortsette
se dette igjen og igjen.
Men for å være klar, clang, ordet som bare dukket opp,
som er den faktiske kompilatoren.
Gjør er bare en bygge verktøyet.
Det er bare en mer brukervennlig program som sparer meg, i
lang sikt, fra å måtte skrive ut utrolig kjedelig lang
kommandoer sånn en.
Så du kan kjøre Clang manuelt.
Du kan skrive alt dette manuelt.
Bare blir veldig kjedelig.
Og så gjør er bare et program som forenkler våre liv og
kjører mer komplekse kommandoer for oss.
>> All right, så nå hva filen bør jeg ha
i min nåværende katalogen?
Ikke bare hallo.c, men også hei.
Så hvis jeg vil kjøre hallo, husker at jeg sier dot slash,
hvor dot betyr gå inn i gjeldende mappe, uansett hvor du
er, og så kjøre programmet heter Hallo, og ja, nå,
Jeg har hallo verden.
Greit, noen spørsmål på arbeidsflyt eller syntaksen
hva vi nettopp gjorde?
>> All right, så la oss ta ting opp et hakk igjen.
Så dette var underwhelming å bare skrive et program som bare
noensinne sier Hei, verden.
Så vi endret det, på mandag, for å si hei, David.
Det er litt mer personlig, men like hard kodet som
Første versjon.
Så ikke alle som overbevisende.
Men det finnes, i C, funksjoner absolutt foruten
print, funksjoner som gjør at du får inndata fra brukeren.
Og måten vi gjorde dette, den andre dagen, var som følger.
Før jeg faktisk skrive ut noe, jeg først fikk
noe fra brukeren.
Så la meg gjøre dette igjen.
>> String s, hvor s er bare en tilfeldig navn, her, for en
streng, lik GetString.
Så hva var GetString?
Det blir åpenbart en streng, basert på navnet.
Men hva er det, mer teknisk?
Det er en funksjon.
Så det er en funksjon som ikke kommer med C per se.
CS50 ansatte skrev dette.
Og så å bruke denne, kan du ikke bare ta stdio.h,
Du må også ta med hva?
Ja.
Så cs50.h, som er bare en fil skrev vi for noen år siden.
Vi installerte det på apparatet for deg sammen
alle vanlige filer.
Og så i disse første ukene av klassen, vil vi bruke
dette bare for å forenkle prosessen med å gjøre svært grunnleggende
ting som får inndata fra brukeren.
Fordi vi vil se i et par uker, får inndata fra brukeren i en
språk som C er faktisk overraskende komplisert,
spesielt fordi du ikke vet på forhånd, vanligvis, hvordan
mye ting brukeren kommer til å skrive i.
Og når du ikke vet hvor mye data du kan forvente, trenger du ikke
vet hvor mye minne til å tildele.
Og hvis du faktisk har en motstandere bruker som prøver
å hacke seg inn i systemet ditt, krasje datamaskinen, vel,
vanligvis den første metoden for angrep er, akkurat som jeg gjorde på
Mandag, skriver en hel lang sekvens med tilfeldige tegn,
trykk Enter, og se hva bryter.
Fordi generelt, hvis et program pauser, hint at
en sikkerhetsfeil, potensielt.
Det antyder absolutt på deg, programmerer, har gjort en
feil, men mer farlig, kanskje du har gjort en
sikkerhetsrelaterte feil, og generelt vil vi se at
det er hvordan maskinene er kompromittert til denne dag, både
i verden av web og programmer på
kommandolinjen, som dette.
>> OK.
Så streng s tilsvarer GetString.
Så mer konkret nå, hva linje 6 gjøre her?
Så funksjonen til høyre får streng,
tar hvor mange argumenter?
Okay.
Så ingen.
En liten mental helse sjekk.
Et argument, igjen, er bare en inngang til en funksjon for å endre
sin standard virkemåte på noen måte.
Men i dette tilfellet har jeg ikke lyst til å endre
oppførselen til GetString.
Jeg ville bare få en streng.
Så jeg satte ingenting i parentes, og da jeg satte en
semikolon demarking slutten av linje med kode.
Nå likhetstegnet betyr ikke lik, per se.
Det betyr oppdrag, noe som betyr plassere hva får
outputted på høyre innsiden av det som er på venstre side.
>> Så til venstre, sier vi at vi har erklært en
string kalt s.
Og mer spesifikt, har vi tildelt minne innsiden av
som vi vil sette biter som representerer en sekvens av
tegn.
Men i dag har vi tildelt
eller erklært en streng.
OK.
Så nå når jeg har gjort dette, vil jeg plugge i verdien av
s, ikke verdien av David.
Så dette er galt hvorfor?
Så dette er bare bokstavelig hardkodet s.
Det er å si "Hei, s", som er ikke hva jeg vil.
Så jeg kan gjøre dette.
Prosenttegnet er en plassholder, men nå trenger jeg å
passere inn skrive et annet argument.
Husker at argumenter til funksjoner er adskilt med
komma, så neste komma her jeg satt etter dette brevet er.
Og i denne sammenheng nå, s er variabel, og printf,
ved mottak disse to innganger -
strengen til venstre og variabelnavnet s på høyre -
det vil plugge det sistnevnte i det tidligere for oss, og
bare skrive ut en fin vakker streng med
hva det er som vi skrev i.
>> Så la oss prøve dette.
Kommer til å gå videre og zoome ut, tilbake
til min terminal-vinduet.
Zoome inn på bunnen her.
Skriv lage hello.
Clang synes å ha vært reprise.
Jeg kommer til å skrive. / Hallo, Enter.
Ingenting synes å skje ennå, men det er på denne meldingen
at jeg kan skrive noe sånt Nate, Enter, og nå har vi
Hei, Nate.
Og jeg kan gjøre det igjen med Rob, og så videre.
Så forhåpentligvis nå dette programmet oppfører seg som jeg har tenkt.
>> Nå, ikke alle som brukervennlig.
Jeg har ingen anelse om hva som blir forventet av meg.
Så vi kan sikkert rydde opp litt.
La meg gå tilbake her oppe, og i stedet for bare dykking i og
spør brukeren om en streng, la meg tydelig fortelle
bruker det jeg forventer.
Så printf ("Skriv inn en streng:"
);
Så ingen variabler her.
Ingen prosenttegn.
Bare det enkle engelske uttrykket.
La meg nå gå til bunns her og kjør programmet mitt.
Men ingenting ser ut til å ha endret seg.
Hvorfor?
Jeg må rekompilere det.
Så enkel feil å gjøre.
Men du må ikke bare lagre filen, men
rekompilere programmet.
Og så hvis jeg re-run gjøre hallo, nå Clang går.
Nå kan jeg kjøre. / Hallo. Og nå ser jeg "Angi en streng:".
Okay.
Nå er det litt mer brukervennlig.
Nate, Enter, hallo, Nate.
>> Vel, la oss prøve dette igjen og begynne å tenke
om hjørnet tilfeller.
Så akkurat som i Scratch, er du oppmuntret eller blir
oppmuntret i spec å slags tenke på hva kunne gå
galt hvis du ikke forventer alt brukeren måtte gjøre.
Bugs, derfor kan følge.
Så skriv en streng -
hva er et hjørne tilfelle her?
Hva er et scenario som jeg, programmerer, ikke kan ha
forventet?
Ja.
Okay.
Så hva om jeg skriver i en rekke som dette?
OK.
Så det fungerer fremdeles.
Gramatically gir ingen mening.
Men minst programmet fungerer.
>> Hva er et annet hjørne saken?
Noe jeg ikke forvente.
Ja?
Okay.
Slik at vi kunne gjøre noe sånt som en virkelig, virkelig stort antall.
Så la oss gjøre dette her.
La meg zoome ut for et sekund, la meg fremheve.
Kan ikke kopiere og lime inn her nede.
OK.
Så jeg kan ikke kopiere og lime inn i denne terminalen vinduet, så vi vil
bare simulere det.
La meg zoome ut, kommer til å brytes.
Jeg har ikke tenkt til å gjøre dette for lenge, fordi det vil ikke
faktisk bryte i dette programmet.
Men det kunne.
Enter.
Men det gjorde det ikke.
OK.
Men det er en ekte hjørne tilfelle.
Og den eneste grunnen til at opptrådt korrekt, så å
snakke, er fordi CS50 funksjon GetString er faktisk
designet under panseret, som vi skal se i et par uker,
tildele mer og mer RAM, mer og mer
minne fra operativsystemet, når det realiserer, wow,
du har virkelig skrevet i noe ganske lang.
Nå er dette litt av en hvit løgn.
Hvis vi faktisk stoppet for en god stund, og jeg skrev i
noe som 5000 millioner tegn på tastaturet
her, eller virkelig treffer copy-paste ganske mye, vi ganske muligens
kan føre til at programmet krasjer.
Bare litt vanskeligere å simulere at med et endelig
tidsperiode.
>> Hva er et annet hjørne tilfelle vi kunne prøve?
Ja?
Ja.
Så hvorfor ikke vi svare noe?
Slik at vi faktisk nødt til å ta noen handling, fordi ellers
programmet kommer til å sitte der å blinke hele dagen.
Men hvis jeg bare trykke Enter -
OK, nå ser fortsatt feil.
Ikke krasje, men kanskje det er nå en mulighet til å
begynne å implementere en mer streng program
som kontrollerer faktisk.
Og hvis strengen, den setningen, det ord som jeg
skrevet i har lengde 0, vel, kanskje jeg bør kjefte på
bruker, eller fortelle ham eller henne til å skrive inn en streng igjen, slik at
vi faktisk får noe som ligner riktig atferd og ikke
bare komplett oversikt for min del.
>> Spørsmålet i ryggen?
Desimaltall.
Så vi kan prøve det også.
1,10000005.
Virker som det kommer til å bare jobbe egentlig greit.
Og som faktisk forventes.
Selv om vi kanskje har skrevet at det nummeret, eller en
større antall tidligere, innser at når vi skriver brukeren
innspill og vi bruker den GetString funksjon, ikke
Uansett om hva jeg skriver ser ut som et tall.
Husker at i henhold til ASCII, alt på
Tastaturet har en numerisk verdi som kan tilordnes til en
karakter, en røye.
Så i dette tilfellet, selv om jeg kanskje skrive inn et tall, den
datamaskinen kommer til å tenke på det, så å si, som en streng -
noe som ser ut som et tall, men er
faktisk ikke et tall.
Men det er faktisk en perfekt segue, for nå kan vi
faktisk overgang til å skrive programmer som
bruke andre datatyper.
>> Så i tillegg til å bruke tegn, eller rettere sagt, foruten å bruke strenger,
innse at vi har andre datatyper i C samt i
andre språk.
En røye, som navnet antyder, er bare ett tegn.
En flottør er et flyttall, og det er bare en fancy
måte å si et reelt tall - noe som har en desimal
punkt i den med noen tall til venstre og / eller høyre.
En int er et heltall, som er bare et tall som 123.
Og nå mer interessant er ting som dobbel.
Hva sa vi en dobbel var siste gang?
Det er 64, høyre.
Så mens typisk en float er 32-bit -
så det er så lenge i minnet, bruker den 32 nuller og enere til
representerer verdier - en dobbel er bokstavelig talt det dobbelte, noe som
betyr at du kan enten representere større tall, eller
du kan representere mer presise tall.
Så du kan ha flere tall etter desimaltegnet, men
som mannen sa i videoen, selv noe enkelt
konseptuelt som 1/3 ikke kan representeres nøyaktig ved en
datamaskin, fordi til slutt du kjører ut av biter, og
derfor kan du bare gjøre .33333333 så mange ganger, at
hvilket punkt du må bare si at jeg er ute av representasjon
plass, må jeg bare kalle det en dag og representerer det
noe upresist sånn.
Og en lang lang -
dum navn, men det er fordi det er en datatype som kalles en
lenge i C som tilfeldigvis er ofte 32 bits, akkurat som en
int er 32 bits, men en lang lang er
generelt 64 bits.
Så det betyr bare at du kan representere større
tall enn dette.
>> OK.
Så hvis vi faktisk ønsker å starte representerer ting, vi
kanskje mer sofistikerte typer, og
det er derfor vi har streng.
Så i CS50 biblioteket, som fil som heter cs50.h, har vi
faktisk erklært en datatype, så å si, kalt streng,
men streng faktisk ikke eksisterer.
Dette er, igjen, en av disse lagene vi skal skrelle
tilbake om en uke eller to, og kaste den bort, og faktisk
se under panseret på hva en streng faktisk er, og
hvordan det representert.
Vi kommer også til å se på boolske verdier.
>> Så hva var en bool i sammenheng med Scratch?
Det er sant eller usant.
Så det er bare en verdi som er sant eller usant, på eller av, 1 eller
0, men du ønsker å vise verden.
Så i C, takket være CS50 biblioteket, som i sin tur
inkluderer et annet bibliotek under panseret, har vi
tilgang til en datatype som kalles bool, som vil
bokstavelig talt tillate oss å tildele verdiene sant eller usant til
ting i et program.
>> Så la oss gå videre her og skrive et lite program som
gjør noe som involverer tall istedenfor.
Så la meg gå tilbake til CS50 Appliance, la meg gå videre og
opprette en ny fil her kalt -
la oss bare si noe enkelt, som math.c.
OK.
Og nå går opp til toppen av mitt program, jeg
kommer til å gjøre den vanlige -
# Include , slik at jeg kan bruke
printf, int main (void) -
vi vil komme tilbake til, til slutt, hva int betyr
her, hva ugyldig betyr her, men for nå, bare vet at
du må starte programmer som dette.
Nå skal jeg gå videre og si noe litt
annerledes - printf ("Gi meg et nummer:"
);.
Så jeg kommer til å gjøre int n = GetInt, fordi det
svinger ut GetInt er en annen funksjon i CS50 bibliotek
foruten GetString.
Og nå skal jeg gjøre noe dumt, som "takk
for% d, "for Desimalheltallet og deretter komma n, og
deretter tilbake 0.
Så igjen, gå tilbake 0 har ingenting å gjøre med antall jeg er
spør brukeren om.
Bare betyr på slutten at alle, formodentlig, er godt.
>> Så la meg gå ned til min terminal-vinduet her.
La meg skrive at matematikk, skriver.
Og noe er galt.
Gjør matematikk fungerte ikke.
Her er den første av våre feilmeldinger.
Hvorfor?
Litt kryptisk, men -
Ja.
Så cs50.h.
Så igjen, spesielt tidlig, vil du skrive din første
program for pset 1 i seksjoner, i kontortiden, og
ærlig, vil det være overveldende noen ganger hva disse tingene
faktisk sier.
Men vil du innse veldig raskt de begynner å falle
inn bøtter der dette betyr at du har forlatt utenfor en
av innbefatter # fra toppen av filen.
Og Clang, kompilatoren, er å informere deg om dette ved
sa heller fancifully, implisitt deklarasjon av
funksjon GetInt er ugyldig.
>> OK.
Så hva betyr det?
Det betyr bare at du har implisitt erklært GetInt i
den forstand at du ikke uttrykkelig har erklært det.
Eksplisitt erklærer int, må du lære
Clang at den finnes.
Og veldig enkel løsning for det er å lære det ved
inkludert denne annen fil, cs50.h, på
toppen av filen.
Fordi bokstavelig talt, hva betyr # include er den forteller Clang
ganske mye å gå finne filen som heter cs50.h, kopiere,
lim den automatisk inn i toppen av programmet mitt for meg,
og deretter konvertere kildekoden til nuller og enere.
Men det ville selvsagt være veldig kjedelig hvis vi mennesker hadde
å gå kopiere og lime disse store filer hele tiden,
så # include bare gjør alt som automatisk uten
muddying min kode med noen andre bibliotek.
Og et bibliotek er bare en annen fil som inneholder funksjoner og
andre ting som noen andre har skrevet, at vi er
utnytte for vår egen skyld.
>> OK.
La oss prøve igjen.
Gjør matematikk.
Enter.
Bra.
Så det ser ut til å ha fungert.
Så la meg nå gå matte;. / Matematikk.
Inn gir meg et nummer, 123.
Takk for 123.
La oss nå prøve et annet hjørne saken.
En streng er ganske raus, fordi en
string kan være noe.
Kan se ut som tall, ser ut som
tegn, ser ut som ord.
Men en int er en int.
Så nå om jeg er den vanskelige brukeren, og det er å si "Gi meg
et nummer, "hva hvis jeg prøver å gjøre noe sånt 0,1?
Vel, det er et tall, og det er i samsvar med
grammatikk jeg brukte her, men under panseret, jeg av
Selvfølgelig bruker funksjonen GetInt.
>> Så la oss se hva som skjer.
Enter, prøv igjen.
OK.
La meg være vanskelig og bare trykke Enter igjen.
Enter, Enter.
Så nå ser det ut som GetInt er litt mer
kraftigere enn GetString.
Vi, de ansatte, gjennomføres på en slik måte at hvis vi oppdager
du har ikke gitt oss en int - og en int er et desimaltall
inneholder nuller, enere, toere, treere, firere, femmere, seksere,
syvere, åttere, eller niere.
Og det er det.
Ingen desimaler, ingen tegn, ingen tegnsetting.
Det ser ut til at vi må samarbeide.
Så la meg prøve fire, fem, seks, og som får meg gjennom.
Så egentlig, å være anal her, skal jeg nok si "Gi meg
et heltall "for å formidle til brukeren
akkurat hva jeg har tenkt.
>> Nå la oss tenke på under panseret.
Vi kommer ikke til å se på hvordan cs50.h er implementert i dag,
det biblioteket.
Men hvis det holder å si prøve, prøve, prøve, hva programmering
konstruere jeg antagelig bruker under panseret for å
gjennomføre det?
Så bare en loop, ikke sant?
En av de enkleste ideene som vi så på Scratch.
The Forever konstruere, Gjenta konstruere.
Antagelig i dette programmet, under panseret, selv
selv om det er skrevet i C og ikke grunnen, det gjør
noe som kalles tilsvarende for alltid hvis brukeren har ikke
skrevet i et heltall, sier forsøke, forsøke, forsøke, forsøke, så
så til slutt når vi får et heltall, så du
bryte ut av som sløyfe.
>> Så hva andre funksjoner kan vi bruke her i CS50 bibliotek?
Vel, type det opplagte, minst basert på
datatyper som vi nå vet eksisterer.
Vi implementert GetString, GetInt, men i hele
første ukene av begrepet, kan du også bruke GetFloat og
GetDouble og GetLongLong for å få nøyaktig
datatyper som du ønsker.
Fordi nøkkelen detalj her er at i motsetning til enkelte språk,
som Python og Ruby, hvor du ikke nødvendigvis trenger å
erklære datatypen til en variabel -
du trenger ikke å fortelle datamaskinen hva slags ting
du kommer til å sette inn den variable -
i C, må du være aldri så presis.
Så hvis du ønsker en variabel kalt n, en del av lagringsplass
at i dette tilfellet skjer for å være 32 bits av konvensjonen, du
må fortelle datamaskinen at disse bitene er
kommer til å lagre et nummer -
ikke et tegn, ikke en streng, ikke en flåte.
Og dette løser problemet vi effektivt
kjørte inn i forrige uke.
Hvis vi bruker nuller og enere tall til å representere ikke bare
tall, men som og Bs og Cs, hvor i verden er en
datamaskin skal vite at dette mønsteret biter faktisk
representerer nummeret 65, i motsetning til å representerer
bokstaven A, som tilfeldigvis, i henhold til
ASCII, husker, var tilsvarende 65?
>> Så disse datatypene gi kontekst til datamaskinen, så
at den vet om disse bitene bør tolkes som en
int eller som en streng.
Eventuelle spørsmål, da, om dette?
Ja?
DAVID J. MALAN: Godt spørsmål.
Hvis vi tar ut stdio.h, sparer vi filen -
la meg gå ned til terminalvindu og kjør make matematikk, zoom
inn og skriv -
nå får jeg en annen feil, fordi jeg er implisitt
erklærte hva fungere nå?
Printf.
Så nå har jeg laget et nytt problem, som løsningen er
i hovedsak de samme.
Jeg trenger å sette det tilbake.
PUBLIKUM: [uhørlig]
DAVID J. MALAN: Oh.
Så hvis jeg tar ut -
Ok, ja.
Så hvis jeg fjerner standard I / O-bibliotek inkludering opp
her, og da er du si hvis jeg bli kvitt printf, får
kvitt printf?
Ja.
Dette bør fungere, fordi jeg ikke lenger bruker noen - whoops.
Sa jeg bare ligge?
Oh, okay.
Dette vil ikke fungere på grunn av en ny feil vi nettopp introdusert.
Og dette er en litt mer selvforklarende.
>> Hva er problemet?
Ubrukte variabel n.
Så denne feilen er et resultat av at vi har konfigurert
apparatet for å være spesielt pedantisk, for å virkelig kjefte på
du for alle mulige feil, selv om det er slags
en ikke-fatal feil som dette - er det virkelig så stor
håndtere at jeg tildelt en int, sette et tall på det, og deretter
bare gjorde ingenting med det?
Så funksjonelt, nei.
Som ikke kommer til å bryte programmet.
Det er bare litt dumt, ikke sant?
Det er ingen verdi å ha bedt om det nummeret, lagret
det i en variabel, hvis du aldri kommer til å gjøre noe
med det, om skrive det ut eller lagre den.
Så i dette tilfellet er Clang erkjennelsen så mye, og
det er å si ubrukte variable n.
>> Så vi kan fikse dette hvis vi virkelig vil.
Men igjen, dette er ikke god programmering nå.
Så jeg bare kunne gjøre dette -
gå ned her, la meg tømme skjermen, gjør matte.
Det fungerer.
Nå kan jeg kjøre min matte program, tar inngang -
vel, det var så ille.
Tar inndata, og det er alt det gjør det, i dette tilfellet.
>> Så egentlig, la oss prøve en annen hjørne slik at vi
tenkte ikke på tidligere.
I dette tilfellet - her, la oss gå tilbake til en som er en
litt mer brukervennlig.
La meg gå tilbake hit og kjøre gjør matte igjen.
Whoops, hva gjorde jeg galt?
Fikk å rulle tilbake ytterligere.
Okay.
Nå er vi tilbake i den opprinnelige tilstanden, der alle
er forhåpentligvis godt.
Og nå hvis jeg kjører matte, synes 123 til å fungere.
Men dette er egentlig ikke en effektiv bevis, bare for å si
okay, fungerer det.
789, fungerer det.
Tid til å sende.
Fordi det er andre hjørnet tilfeller her.
En streng ikke virkelig gi oss mye trøbbel ved å skrive inn en
hel masse tegn.
Men hva om jeg skriver i dette?
Treffer nummer 1 en hel masse, mye her -
all right, det blir litt kjedelig, så jeg kommer til å
stoppe her, og jeg kommer til å trykke Enter.
>> Hva faen skjedde?
Så dette kan faktisk bli forklart.
Så tok det det som binære?
En god tanke, men nei, det er ikke det faktum at det tok det
som binære, fordi faktisk, det var bare en slags
tilfeldighet.
Vi kan gjøre dette på nytt.
Så det er ingen 2 i det binære systemet, som er
sannsynligvis nok uansett.
Enter.
Så det var ikke problemet.
Hva annet?
Akkurat.
>> Så tenk tilbake til hva en int faktisk er.
Det er 32 biter som til sammen blir tolket
som et tall.
Hvis du har 32 bits, betyr at hver av de biter kan være
0 eller 1, 0 eller en 1.
Så det betyr at det er to muligheter for denne biten,
to muligheter for dette, to muligheter for dette
bit - så det er 2 ganger 2 ganger -
så det er 2 til 32 strømmen er det totale antall
permutasjoner av nuller og enere hvis du har 32
plassholdere, nuller og ettall, foran deg.
Så hvis jeg har 2 til 32, matematisk det er det?
Så det er mye.
Det er 4 milliarder kroner, gi eller ta.
Og 4000 millioner ikke synes å være det som ble skrevet ut her.
Faktisk ser dette nærmere 2 milliarder kroner.
Men dette er ikke en tilfeldighet.
Det faktum at maskinen har feiltolket mitt stort antall,
min enorme sekvens av dem og deretter min enorme sekvens av toere,
som omtrent 2 milliarder kroner, er forklart hvordan?
Det er en cap på int.
Det er en absolutt en maksimal verdi at du kan representere.
Men det er vanligvis 4 milliarder kroner, ikke sant?
Hvis 2 til 32 er omtrent 4 milliarder kroner, virker som liker
det er det største antallet.
Så ikke en rest, men en god tanke.
Negative tall.
Så hvis du har 4 milliard mulige ting du kan
representerer disse ulike permutasjoner av 32 0s og
1s, vel, det står til grunn at vi mennesker kanskje ønsker å
representerer ikke bare positive heltall
men negative heltall.
Og ja, det er en forutsetning at C gjør.
Så med 32 bits, kan du representerer omtrent negative 2
milliarder hele veien opp til positive 2 milliarder.
Og så i dette tilfellet, hva vi egentlig ser er bare
utkanten av kapasiteten heltall, og vi har, så
å snakke, overflyt et heltall.
Vi har prøvd å stappe flere biter i det enn kan faktisk passe.
Så sluttresultatet er vi i hovedsak har alle en bit.
Vi har snudd alle våre biter på, har vi prøvd å representere
det største antallet mulig, men det er helt klart ikke på langt nær
stor nok til å representere de to tingene jeg har nettopp skrevet i.
Ja?
PUBLIKUM: [uhørlig]
>> DAVID J. MALAN: Godt spørsmål.
Hvorfor kan vi ikke bare representerer det negative
signere som bare et tegn?
Så vi absolutt kunne, og vi kunne deretter lagre
en ekstra bit.
Men du fortsatt nødt til å representere at dash, og
som kommer til å koste deg i det minste noe,
antagelig litt.
Så ja, vi kunne ha 32 bits i bruk for våre tall, men nå
vi trenger en annen bit brukes for dash vår
symbol, minustegnet.
Så nå har vi 33 biters verdier, som vi kunne gjøre, men det er
bare ikke måten det er gjort.
Vi har gjort en vurderingssak år siden, er 32 bits liksom den
måleenhet her.
Så vi kommer til å bruke en av de bitene effektivt til
representerer negativitet, og 31 bits for å representere nummeret.
Andre spørsmål?
OK.
Det er mye.
Hvorfor ikke vi gå videre og ta våre fem-minutters pause her?
>> OK.
Så igjen, for ikke å overdrive de matematiske programmer
programmering, la oss bare rive av dette ett eksempel
før vi flytter inn i andre konstruksjoner, bare fordi det
vil illustrere noen vanlige stumbling poeng på noen av
det grunnleggende når det gjelder å skrive programmer.
I dette tilfellet, gjør aritmetiske uttrykk som har noen
interessant relevans til syntaks.
>> Så dette er bare en formel som vi kan konvertere
temperaturer fra Fahrenheit til Celsius.
Hvis du ikke husker, er dette bare formelen.
Så hvis vi kobler Fahrenheit verdi på 32 grader, noe som er
frysing, som kommer til å være 32 minus 32 er 0, og ja,
0 i Celsius er også iskaldt.
Så rask tilregnelighet sjekk der - det er det velkjente formelen.
La meg gå over til apparatet, skjønt, og start
skrive et program som heter, som, f2c; "Fahrenheit til
Celsius dot c ".
Og opp på toppen her, jeg kommer begynne med # include
stdio.h, og jeg kommer til å gjøre int main (void), og
igjen, vil vi komme tilbake i fremtiden om hva int betyr
der og hva ugyldig betyr der.
Og nå la meg gå videre og gjennomføre et program som
hovedsak gjør denne konverteringen for oss.
>> Så printf, la oss si, temperaturen i Fahrenheit.
Og så la meg gå videre og få verdien fra brukeren.
Hva slags verdi bør jeg få fra brukeren hvis jeg vil
dem til å gi meg en temperatur i Fahrenheit?
Ja?
Hva ville du foreslå?
Ja.
Så float føles ganske rimelig.
Vi har igjen, bare et par alternativer som
vi har sett så langt.
Vi har ting som røye, double, float, int, long long,
bool, streng.
Så av disse, føles float ganske rimelig.
Vi kunne bruke en dobbel, høyre, fordi hvis vi virkelig ønsker å
representerer et menneskes temperatur -
98.60000 -
vi kunne bruke 64 bits å gjøre det, men det føles som
overkill for temperaturen.
Så la oss bare gå med flottør.
Nå trenger jeg en variabel.
Bare for å holde ting enkelt, jeg kommer til å kalle det f, men jeg
kunne like riktig kaller det temperatur,
men er enten fine.
Så flyter f = GetFloat.
Så snart jeg har nå besluttet å bruke GetFloat, skjønt, jeg
trenger å gjøre en korreksjon.
Ja.
Så vi trenger å # include , ellers kompilatoren er
kommer til å kjefte på oss.
Nå som jeg har en flåte, la meg gå videre og gjøre det
konvertering.
>> Så først, la meg også komme inn i vanen her av
kommenterer min kode.
Så igjen, er en kommentar bare en notasjon til mennesket som finnes
ikke en del av programmet per se, men det en, hjelper deg
forstår hva du gjorde neste morgen, eller neste
måned, det hjelper undervisningen stipendiat forstår hva du gjorde
eller hva du hadde tenkt å gjøre, så det er
generelt veldig god praksis.
Hvert par linjer med kode, skrive en kommentar til
deg selv eller din kollega.
Så her, jeg kommer til å si, "Spør bruker for temperatur."
Trenger ikke å være en hel setning, bare en kort setning.
Men ideen bak kommenterer i C er at hver av dine
kommentarer bør styrke deg - eller, si, en TF eller en kollega -
å skumme programmet og vet nøyaktig hva den gjør, ved å ikke
så mye å lese koden, men ved å lese kommentarene, som
bør være konsis og klar.
All right, så nå la meg gå videre og si, "Konverter
Fahrenheit til Celsius. "Så jeg kommer til å gå videre og gjøre,
la oss si, flyter c.
Vi vil holde Celsius som et flyttall.
>> Og la meg ta en stikke på dette.
Formelen er, igjen, her oppe.
Som 5/9 ganger F minus 32.
Så la oss gjøre dette.
Så 5 delt på 9, minus -
whoops, rotet jeg det opp allerede.
Times.
Så 5/9 ganger F minus 32.
Så F minus 32, semikolon.
Og nå, her nede, jeg kommer til å gå videre
og si ut resultatet.
Og denne delen er lett. Printf.
Hvordan går jeg om å skrive dette?
Vel, jeg kunne si "Tallet i Celsius er% f \ n",
bare for noen estetikk.
Og så hva verdien ønsker jeg å plugge inn her som printf er
andre argument?
Okay.
Så bare ca.
Så vi vil starte med dette og så bare gå tilbake 0.
Igjen, det har ingenting å gjøre med matematikk.
Det betyr bare at alt er bra.
>> Nå er dette riktig, dette programmet?
OK.
Så jeg har gjort noen feil.
Selv om du ikke har noen anelse om hva programmering er, kan du sortere
av antyde tilbake til grunnskolen hva
feil her kan være.
Hva er en av de første?
PUBLIKUM: [uhørlig]
DAVID J. MALAN: Yeah.
Så vi mangler parenteser.
Det var bevisst at jeg gjorde parentes i keynote
skyv her, fordi det er faktisk dette begrepet for
av drift, eller presedens, der visse operasjoner -
multiplikasjon -
har høyere binding, har høyere prioritet enn ting
som tillegg eller subtraksjon.
Så vi har gjort dette i årevis bare for å gjøre det klart nøyaktig
hva matematisk operasjon bør gjøres først.
Så jeg bør nok etterligne akkurat dette.
Ellers, er datamaskinen formodentlig skal prøve å gjøre
noe som dividere 5 av 9, deretter multiplisere F, og deretter trekke
32 fra hele greia.
Som ikke er det, faktisk, hva vi ønsker å gjøre.
Så la oss parenthesize.
La oss legge til mine parentes her, parenteser her.
La oss sette dette over her.
Her, jeg la merke til en annen feil jeg gjorde underveis.
Ja?
PUBLIKUM: [uhørlig]
>> DAVID J. MALAN: Ah.
Bra.
Slik at vi faktisk har samme heltall
divisjon problemet fra før.
Jeg korrigerer det, la oss se hva symptomet er.
Men vi er nødt til å korrigere en
andre feil her.
Ja?
PUBLIKUM: [uhørlig]
DAVID J. MALAN: Ja.
Så dum feil jeg gjorde, men utrolig viktig.
Datamaskinen er ikke til å bare lukke øynene og la
meg bruke kapital F, når jeg faktisk erklærte variabelen
som en liten f her, i linje 8.
Så jeg trenger å korrigere i linje 11 kapitalisering mitt, som en
øyeblikk siden var en stor F ved en feiltakelse.
Hva om her?
Skulle dette være små også?
Det skal være, men det er en tilfeldighet.
At% f har ingenting å gjøre med variabelen.
Så bare for å være super klar her, la meg gå videre og
endre navn på denne, kort, "temperatur". La meg gi nytt navn
dette "temperatur". La meg ikke endre navn på denne.
Fordi, igjen,% f globalt betyr "flyttall verdi."
Har ingenting å gjøre med variabel min.
Men "temperaturen" all over the place er bare litt wordy,
så jeg kommer til å gå tilbake til min liten "f" s.
>> Nå, la meg gå videre ned til vinduet mitt her.
Gjør f2c -
som var igjen, vilkårlig navn jeg
ga til denne filen.
Synes å ha utarbeidet.
La meg kjøre f2c.
Enter.
Temperaturen i celsius - la oss gjøre en enkel en.
32.
OK, korrigere.
Men, hvis jeg nå gjøre 212 for koking -
faen.
OK.
Så klart ikke korrigere, hvis TF prøver
minst to verdier.
Så hva er problemet her?
Vel, du har allerede sette fingeren på hva problemet er.
Men hvorfor er det slik?
Opp her, når jeg gjør regnestykket av 5 delt på 9.
Så konseptuelt, det er helt riktig.
Helt i samsvar med formelen.
Men datamaskiner bare gjøre akkurat det du
fortelle dem å gjøre.
Og hva vi effektivt forteller datamaskinen her er
dele heltallet 5 ved heltall 9
og gi meg resultatet.
Problemet er, men når du gjør divisjon ved hjelp av data
typer, er resultatet det samme datatype som inngangene.
Og så hvis de to innganger er begge ints, blir utgangen går
å være en int.
Og så 5 delt på 9 er poenget noe.
Men hva er det nærmeste heltall for å peke noe?
Så, det er faktisk 0.
Så som vi diskuterte mandag, alt etter desimaltegnet
punkt blir avkortet.
Det bare blir kastet bort.
Så dette er en fullstendig feil, fordi jeg kan like godt bare
multiplisere alt av 0 her.
>> Nå kan jeg fikse dette i et par måter.
Jeg kunne gjøre dette.
5,0 delt på 9,0.
Teknisk sett trenger jeg ikke engang trenger å gjøre det.
Det gjør nok å bare gjøre ett av tallene a float -
eller dobbelt - ved å sette desimaltegn her.
Fordi det som skjer nå er når du deler et heltall ved
en flåte, eller en dobbel, er datamaskinen kommer til å realisere
oh, er en av de mer presis.
La meg feile på siden av å gi deg mer presisjon enn
du hadde tenkt.
Så det vil konvertere resultatet -
det vil returnere resultatet som et flyttall også.
Så det ville fungere.
Dette ville fungere.
Og det er en annen mekanisme som vi vil se i
større detalj i neste uke.
Du kan faktisk, som programmerer, fortelle datamaskinen
å faktisk behandle en datatype som
selv om det var en annen.
>> Så jeg kunne faktisk gjøre dette.
I parentes kan jeg si noe sånt (float), åpen
paren, nær paren.
Og dette er det som kalles "casting". Igjen, mer
på dette neste uke.
Men dette er bare programmatiske måten å fortelle
datamaskinen, ja jeg vet 9 er et heltall eller en lang.
Jeg vet det ikke er et flyttall.
Men behandle det som sådan uansett.
Så for å kaste en datatype betyr å konvertere
fra den ene til den andre.
Ærlig, er dette bare en liten stygg, så jeg ville foreslå vi gå
tilbake til det opprinnelige forslaget av bare å konvertere
disse tingene til flytpunktverdier manuelt.
Fordi nå er det bare super klart hva som skjer, og
det er ikke alle som distraherende.
>> Så la oss nå gå tilbake til min terminal-vinduet.
Gjør f2c.
La meg gå videre og kjøre denne.
Og, som en side, får du lei skrive disse kommandoene
igjen og igjen, innser at datamaskiner, som Linux her,
pleier å være ganske smart.
Og hvis jeg slo opp, kan vi gå gjennom min hele historien
kommandoer, opp og ned.
Så i dette tilfellet her, kan jeg bare gå opp til å kjøre gjøre f2c.
Jeg blir skreket til, fordi jeg bare gjorde det en andre siden.
Det er allerede oppdatert.
Så nå kan jeg kjøre f2c igjen.
La oss prøve 32 Fahrenheit.
La oss nå prøve 212 Fahrenheit.
>> Puh.
Synes å fungere.
Nå, dette er bra, men det føles litt vilkårlig at
Jeg viser seks tall etter desimaler.
Rett?
Hvis du er været person på TV, er du en slags doofus
hvis du leser temperaturen til
denne graden av presisjon.
Så la oss forenkle dette.
Så la oss faktisk gå opp her, til min printf.
Og ja, jeg vil flyte.
Men jeg ønsker å nå spesifisere presisjon.
Og jeg kommer til å være litt konsis.
Jeg kommer til å si, gi meg ett poeng etter desimal.
Så snarere enn si% f, jeg kommer til å si% .1 f.
Og dette betyr bare gi meg en posisjon
etter desimaltegnet.
OK.
La oss prøve dette igjen.
La meg igjen kjøre den etter kompilering.
Og nå har jeg skriver i 32, og jeg får tilbake en
mer konsis verdi.
Og jeg kan skrive i, nå, 212, og få tilbake en mer konsis
verdi også.
Og det er andre ting du kan gjøre med printf.
Du kan faktisk angi hvor bred antallet bør være.
Hvis du vil ha polstring på det, slik at du kan høyrejustere eller
venstre justere alle dine tall eller
prøver å senter ting.
Så skjønner det er lite triks du kan gjøre der.
Men de bare koke ned til formatkoder,
som vi har det.
>> Så i form av denne utgaven av forrang.
Dette er en veldig kjedelig bord å gå gjennom metodisk.
Men innser at forfatterne av C har kommet opp med
regler som spesifiserer hvilke operatører har høyere
forrang, mer forpliktende makt, enn andre.
Så mens i grunnskolen, vi generelt visste at det var
multiplikasjon og divisjon, så addisjon og subtraksjon,
så noen andre ting.
I en verden av programmering, det er en mye
lengre liste over ting.
Og dette er ikke noe verdt memorere nå.
Du vil få acclimated til det før lenge.
Men akkurat som i grunnskolen, parentes generelt løse
spørsmålene om forrang, ved å gjøre super klar til
datamaskin og menneskelig alike hva er ment.
Så vurdere dette bare en liten jukselapp der.
Men de fleste av disse detaljene vi ikke får til for noen tid.
>> OK.
Nå, la oss bygge opp og bevege seg bort fra disse dum liten
matematiske eksempler.
Fortsatt bruke de samme grunnleggende, men starter
uttrykke oss litt mer som Scratch.
Så i Scratch, hadde vi disse boolske uttrykk.
Og på engelsk, er en boolsk uttrykk hva?
Sant eller usant.
Det er noe som evalueres til sant eller usant.
1 eller 0.
På eller av.
Uansett hva du vil kalle det.
Nå i Scratch, så brikkene som dette.
Og det er kombinasjonen, på bunnen der, av tre
puslebiter.
En kombinasjon -
noe som har blank og blank.
Og deretter to boolske uttrykk innsiden av det.
Så du kan neste boolske uttrykk for å få mer
komplisert boolske uttrykk.
For eksempel, hvis det er lørdag, og det er hyggelig
vær, så gå utenfor.
Eller noe vilkårlig sånn.
Så du kan bli med boolske uttrykk for å komme opp med en
større sannhet verdi, hvis svaret er basert
på de mindre.
>> Nå, i C, heldigvis, er denne kartleggingen
faktisk ganske enkelt.
Parentes bidra til å gjøre ting klart her.
&& Er hva betyr "og". Så det er slik
vi kommer til å konvertere disse blokkene fra Scratch til C.
Og for de forhold vi så i Scratch, på venstre hånd
siden det kan jeg stable dem på samme måte i C. Hvis x er mindre
enn y, så gjør dette.
Else if x er større enn y, så gjør dette.
Else logisk de må være like, så si
at de er like.
Så vi kan nå begynne å bygge disse tingene opp.
>> Så la oss gjøre et eksempel.
La meg åpne opp en fil som er på kursets nettside som
Jeg skrev på forhånd.
Som kalles nonswitch.c.
Og vi vil se hvorfor på bare et øyeblikk.
Så i denne filen - nonswitch.c--
først innse at det er en hel haug med
kommentarer på toppen.
Det er bare å forklare navnet på filen, hva det
gjør, og så videre.
Og det viser tilsynelatende bruk av boolske OG-ing -
conjoining to uttrykk.
>> Så la oss se hvordan dette programmet fungerer.
Jeg har mine to filer, cs50.h og stdio.h.
Hvis jeg ruller nedover, nå, til programmet, er det litt lenger
enn vi har skrevet før, men ganske lesbar.
Så jeg først ut til brukeren, på linje 18,
"Gi meg et heltall mellom 1 og 10 år." Så
det er rett der.
Nå får jeg heltall.
Men innser at GetInt - ganske enkelt.
Det er bare kommer til å få en int.
Det kommer til å sørge for at den får en int og ikke en
streng eller en flåte.
Men det kommer ikke til å gjøre noen form for grense kontroll.
Det er ikke til å filtrere tallene for å være mellom en
visst område.
Så vi må gjennomføre det selv.
Så akkurat som i Scratch, hvor jeg kunne gjøre en forbindelse av
to uttrykk, kan jeg gjøre det i C som følger.
Hvis n er større enn eller lik 1, og n er mindre enn og
eller lik 3, jeg kommer til å veldig vilkårlig dekret som
nummer å være et lite antall.
Bare for moro skyld en uttalelse.
Else if n er mellom 4 og 6, print "Du plukket et medium
nummer. "Else hvis n er mellom 7 og 10, print" Du plukket en
stort antall. "Else print" Du velger et ugyldig nummer. "
Fordi logisk, følger at dersom vi har
utmattet vårt utvalg.
>> Så innser dette er ikke helt hvordan vi skriver større enn eller
lik i en matte klasse.
Rett?
Du vanligvis trekke det ut som dette, med strek under det.
Men det er ikke slike tasten på tastaturet mitt.
Så symbolet i C for å uttrykke større enn eller
lik er to tegn, og symbolet for mindre enn
eller lik er to tegn i tillegg.
OK.
Så hvis jeg kjører dette programmet, kan du sikkert gjette hva det er
kommer til å gjøre.
Hvis jeg går videre og gjøre nonswitch, Enter.
Og deretter kjøre nonswitch.
Gi meg et tall mellom 1 og 10 år.
Jeg kommer til å gi den 11.
Jeg plukket et feil nummer.
La meg prøve nummer tre.
Jeg plukket et lite antall.
Så ganske grei der.
>> Hva om jeg ønsker å endre oppførselen til dette programmet, og
gjøre noe litt annerledes i stedet?
La meg gå videre og si dette.
La meg bli kvitt alt dette.
Og la meg si if (n == 42).
Og så skal jeg gå videre og si print "Du plukket
riktig svar. "Else vi kommer til å gå foran og si,
printf ("Du valgte
feil svar ");. Okay.
Bare fordi.
>> Nå, noen punkter vi kan gjøre her.
En, det gjorde jeg ikke skrive symbolet som du tror er
mest fornuftige.
Når jeg ønsker å sjekke likestilling, viser seg at du ikke bruker
likhetstegnet.
Du i stedet bruke like likhetstegnet.
Og hvorfor kan det være, bare intuitivt?
Ja.
PUBLIKUM: [uhørlig]
DAVID J. MALAN: Riktig.
Likhetstegnet er allerede brukt for tildeling.
Noen hadde egentlig ikke tenke gjennom dette.
Og så nå, når det gjelder likestilling testing, må vi
være mer eksplisitt, og si lik lik.
En veldig vanlig feil er å gjøre dette.
Og hvis du er i kontortid eller en gang neste uke eller i
neste to uker gjør du noe som dette, og deretter
sliter med det for 10, 20 minutter prøver å finne ut
hva faen bug er, skjønner at du er en av dem
folk som har gjort denne feilen.
Så super enkelt å lage.
Men målet er nå å avverge dette feil.
Dette kan vurdere, fordi det er dette egentlig si?
Hvis n blir 42.
Så verbet folk bruker, muntlig, uttrykke
oppfatningen av oppdraget er "får". Så hvis n får 42.
Så det betyr tildele 42 til n.
Nå har jeg en boolsk uttrykk i parentes,
innsiden av denne tilstanden, er verdien av disse 42.
Rett?
Fordi hvis du vurdere det fra innsiden og ut, den totale
Svaret nå er 42.
>> Så hvis jeg spurte deg spørsmålet, "hvis (42)," hva er
som virkelig sier?
Vel, kan boolske uttrykk bare være sant eller usant.
1 eller 0.
På eller av.
Så vi synes å ha et hjørne tilfelle her, hvorved alle en
plutselig, jeg sier "if (42)". Det er ikke en boolsk verdi.
Så hva datamaskiner gjør, skjønt, er det i hovedsak tilsvarer
noe som ikke er 0 er tolket til å være sant.
1.
På.
De er alle tilsvarende funksjonalitet.
Bare verdien 0 eller søkeordet falsk, som vi vil
slutt se, er faktisk falsk.
Så "if (42)" ville faktisk være sant, fordi det ikke er null.
Så for å være mer presis her, er en boolsk verdi egentlig ikke så
mye sant eller usant, men for denne
tilfelle, hvis er 0 eller ikke-null.
Så falsk eller ikke falsk.
Og som tillater oss å omfatte alle mer
muligheter i parentesuttrykk.
Så vi må, aldri så nøye, sier dette -
if (n == 42).
Rett og slett fordi vi trenger å spesifisere en test av likestilling,
ikke et oppdrag av en verdi.
>> Hva annet er verdt å merke seg her?
Disse klammeparentes er faktisk ikke nødvendig.
Jeg har gjort dem bare for å være nit-kresen her.
Men når du har en tilstand som bare har én linje av
kode, som bekvemmelighet, trenger programmerere ikke trenger å bruke
de klammeparentes.
Det er nok å bare strekpunkt for estetiske grunner, og
deretter skrive linje med kode.
Bare når du ønsker å skrive to linjer med kode - for
eksempel, ellers printf ("Bye!"). Hvis du ønsker å gjøre
det, er dette brutt.
Du kan rykke alt du vil, men det faktum at du har
skrevet to linjer med kode uten å bruke klammeparentes
betyr at dette programmet ikke ville kjøre riktig eller kanskje
ikke engang kompilere riktig.
Så for nå, for å være ærlig, tror jeg det beste vane er bare
bruke klammeparentes, og du vil finne at de gjør
super klart hva som skjer.
>> Også, som en side - spesielt hvis du er blant dem som bruker
de anbefalte bøker eller ressurser online -
innse at det er denne oppfatningen av stil i
programmering.
Og noen mennesker faktisk foretrekker å sette krøllete brace
over her på en linje.
Noen mennesker foretrekker å gjøre latterlige ting,
liker sette dem her.
Det er ingen feil svar når det kommer til
stil, men dette er feil.
Men noen mennesker gjør det.
[Latter]
DAVID J. MALAN: Så jeg nevner dette nå, rett og slett fordi så
du lese opp på ting i bøker eller på nettet, du kommer til å få
ulike meldinger fra ulike lærere og
forskjellige forfattere.
Og bare innse det, funksjonelt, de er
generelt tilsvarende, men vær konsekvent.
Så i dette tilfellet, vil vi standardisere på krøllete
bukseseler kø her til venstre.
>> OK.
Så la oss gå videre nå og kjøre denne, og se hva som skjer
med dette programmet.
Gjør nonswitch.
Deretter kjøre nonswitch.
Gi meg et heltall mellom 0 og - så det er ikke relevant
lenger, men jeg skal bare vilkårlig si 42.
Og jeg plukket det rette svaret.
Vel, la oss faktisk ta dette i en annen retning.
Det viser seg at det er noen andre syntaks vi
kan bruke i et program.
Her er et nytt stykke av syntaks som er funksjonelt det samme,
men introduserer bare en annen måte å uttrykke oss selv.
Så dette er det som kalles en "bryter uttalelse." Og en
bryter uttalelse virker som følger.
Det tar, i parentes, en verdi som du vil
"Bryter" på.
Du ønsker å oppføre seg annerledes basert på verdi.
Så dette betyr bryteren på verdien av n.
Og hva betyr dette?
Vel, hvis n er 1 eller 2 eller 3, gå videre og skrive ut "Du
plukket et stort antall "og deretter bryte.
Grunnen til pausen er at veien C fungerer er som
snart den finner en sak som matcher, begynner det å utføre
all koden nedenfor den.
Så hvis jeg har en linje med kode, som jeg gjør her på linje 27, den
blir henrettet.
Hvis jeg legger en annen linje her, det blir henrettet.
En annen linje her, det blir henrettet.
Programmet stopper bare utfører det som er under
gjeldende sak uttalelse når jeg eksplisitt
si "break". Så galt.
Høyre, i dette tilfellet, som et resultat.
Tilfelle 4 eller 5 eller 6, på samme måte, kommer
å skrive ut en melding.
I dette tilfellet, middels antall.
Bryte.
Sak 7, 8, 9, 10, kommer det til å skrive ut "Du plukket en stor
nummer. "Break.
Og så er det bokstavelig talt et nøkkelord som heter "default"
det er effektivt som "annet" konstruere.
Så ny syntaks, men intellektuelt,
ingenting i det hele tatt ny her.
Det er akkurat som Scratch.
If, else if, else om, liksom blokk.
>> Så det er slått versjon av dette programmet.
Men merker at vi gjorde det med tall her.
La meg åpne opp en ny versjon, bare for å vise
noe litt mer konkret.
Så her har vi karakterer i stedet.
Det viser seg at du kan bruke brytere ikke bare på heltall, men på
tegn.
Ikke i alle datatyper, men minst på karakterer.
Så her kan vi gjøre noe sånt hvis verdien av C som
brukeren skrev inn, i linje 19, ved å bruke getchar funksjon,
er hovedstaden A eller små bokstaver a, la oss tolke det som en klasse,
og sier de plukket en utmerket klasse.
Og ned langs bryteren uttalelse, har vi andre
tilfeller for "B" s og "C" s, og så videre.
Men la oss nå avrunder en annen ting.
Og igjen, type fly gjennom
noen av disse eksemplene.
Men det er egentlig slik at vi kan bruke dem nå -
eller egentlig, bare oversette dem nå -
til C.
>> Så la meg gå videre og gjøre dette.
Jeg kommer til å åpne opp en ny fil.
Og jeg kommer til å gjøre er .
Og så skal jeg gjøre int main (void).
La meg lagre denne filen som et loop.c.
Bare som et eksempel.
Og jeg kommer til å gå videre og gjøre følgende.
Jeg ønsker å skrive en svært langtekkelig program.
Så 10.
La oss gjøre dette.
9.
OK.
Så snart du begynner å gjøre dette i programmering, er du
sannsynligvis gjør noe galt.
Men vi vil starte der allikevel.
Oops.
Det er faktisk feil.
7.
6.
5.
4.
Ingenting kommer til å skje når vi kommer til 0.
3.
2.
1.
Okay.
0.
Slett.
>> OK.
Så tilbake 0.
Så dette programmet er åpenbart kommer til å gjøre det veldig
tediously sier det kommer til å gjøre.
Det kommer til å skrive ut alle disse
verdier, fra topp til bunn.
Så la meg gjør loop.
Og så - whoops.
Gjør loop.
Jeg var i feil katalog.
Og nå la meg kjøre loop.
Enter.
Woohoo.
Veldig hyggelig.
Nice, langt program.
>> Greit, men nå la oss gjøre dette bedre.
Akkurat som i Scratch, når du begynte å bruke en looping
konstruere, i stedet for bare å kopiere og lime alle
puslespillbiter, la meg presentere denne tingen.
Så i C, er det ulike looping konstruksjoner,
en som ser ut som dette.
En "for" loop har tre ting, atskilt med to semikolon.
Og deretter, på innsiden av kroppen av loopen, så å si - den
ting innsiden av klammeparentes -
Vi kan gjøre noe igjen og igjen.
Så det jeg har her på skjermen, er dette
bokstavelig talt bare en kommentar.
Den / / betyr her kommer en kommentar.
Dette er ikke-kode.
Dette er bare engelske beskrivelsen, for meg, det menneskelige.
>> Så initialiseringer, betingelser og oppdateringer.
Vel, la oss se hvordan dette fungerer.
Dette tillater meg å skrive dette programmet som følger.
For -
så her kommer min sløyfe -
int i -
her kommer en variabel kalt "i" -
blir initialisert til 10 år.
Så det er min initialisering.
Jeg ønsker å gjøre denne sløyfen så lenge "i" er større enn eller
lik 0..
Og på hver iterasjon av denne sløyfen, vil jeg
å gjøre jeg -.
Så vi så + + på mandag.
- Er det motsatte.
Det reduserer verdien av en.
Innsiden av denne sløyfen, ønsker jeg å faktisk gjøre noe.
Så jeg kommer til å si noe sånt som printf.
Jeg ønsker ikke å si 10 nå, fordi dette åpenbart er bare
kommer til å skrive ut den samme verdi.
Hva ønsker jeg å skrive ut i stedet, sannsynligvis?
Ja.
Så "i". Så% d, jeg.
>> Så jeg kommer til å stjele en av disse ideene fra tidligere -
Dette erstatning for formatkoder -
og deretter ned her, nederst, vil jeg returnere 0, bare
for godt mål.
Men nå har jeg en mer konsis program.
Det er bare noen få linjer, og ikke noen 10 eller 11 linjer.
La meg gå til min rask her nede.
Remake loop.
Kjør loop.
Og det synes å være det samme.
Nå er programmet ikke mer interessant.
Men nå kan jeg skrive noe sånt som dette.
Jeg kan endre dette til 100 år.
Da kan jeg rekompilere programmet mitt.
Og da kan jeg re-run mitt program.
Og nå går det superraske på dagens datamaskiner.
Men det jeg har -
og faktisk, min Rulleminne buffer ikke
selv gå så langt.
Det vi går.
Så det har vi alle 100.
Men det er lett å gjøre feil her.
Hva kommer til å bli forventet oppførsel hvis jeg
uhell gjøre det?
Så det føles som uendelig.
Så la oss se om maskinen oppfører seg.
>> Så la meg gå videre og gjøre loop.
Og la meg kjøre loop.
Så la oss komme tilbake til det i løpet av et øyeblikk.
Vi vil la det kjøre.
Fordi hva skal vi telle opp til, minimalt?
Sannsynligvis minst 2 milliarder kroner, hvis vi har så mange biter, og
vi bruker positive verdier.
Så la oss hoppe tilbake hit.
I tillegg til disse typer løkker, har vi det som kalles mens
sløyfer. Så, akkurat som i Scratch, hadde du Alltid
blokker, og du hadde Gjenta blokker.
Tilsvarende, i C, du må bare andre måter
å uttrykke deg selv.
Så du har denne oppfatningen av en stund loop som lar deg
uttrykke deg litt annerledes.
Og da har du noe som heter en gjør-mens loop,
som opererer litt forskjellig så vel.
Og vi vil erte disse fra hverandre over tid.
>> Men la oss ta en titt på denne siste her.
Hvis vi går inn i -
fortsatt kjører.
Det er ganske uendelig.
Så la meg gå til positivt og viser hvordan vi kan faktisk
styre brukerens input litt mer effektivt.
Det er en ganske kort program.
Og her har vi i hovedsak en int n erklæringen.
Så gi meg en variabel kalt n. Nå, jeg bokstavelig talt si
"Gjøre." Og så har jeg fått åpne krøllete
spenne, nær krøllete brace.
Og deretter oppdager, rett etter det, sier den mens n
er mindre enn 1.
Så merke til at disse linjene -
19-24 -
komponere sammen en do-while-løkke.
Og igjen, ny syntaks, ikke en ny idé.
Det er bare en annen måte å looping, syntaktisk.
Så hva gjør dette?
Gjør følgende mens n er mindre enn 1.
Så hva ønsker jeg å gjøre?
Jeg krever at du gir meg et positivt heltall.
Da jeg faktisk prøve å få et heltall fra brukeren.
Men i forhold til rekkefølgen av operasjoner her, fordi
mens tilstanden er her nede, jeg så kommer til å sjekke, er n
mindre enn 1?
Så antar at brukeren -
etter blir krevd i denne måten -
typer i verdien 0.
Denne tilstanden kommer til å være sant eller usant?
Vel, det er faktisk kommer til å være sant.
Fordi n er 0, og 0 er mindre enn 1.
Så hva betyr det?
Gjøre det igjen.
Bare en gang at tilstanden USANN.
Hvis jeg skriver i 42.
Vel nei, er 42 ikke mindre enn en.
Derfor denne sløyfen er gjort gjennomføre.
Og så på det punktet, vil programmet si, takk for
den 42, i dette tilfellet.
Nå som du har denne måten å uttrykke deg selv -
Vi bør ikke vente på dette til slutt.
Det kommer til å ta litt tid.
Å bli videreført neste gang, kanskje.
>> Men nå har du muligheten til å forhåpentligvis å forstå en
litt geek humor.
Unnskyldninger.
Dette er ikke representativt for humor i datavitenskap
verden, men den er søt.
[Ler] La oss slutten på dette notatet.
Og vi vil se deg på mandag.
[Applaus]