>> [MUSIC Playing]
>> DAVID J MALAN: Okay, velkommen tilbage til CS50.
Dette er starten på uge to.
Et ord fra en af ​​vores venner på campus -
hvis du er interesseret, eventuelt, enten nu eller i en fremtidig periode
endnu en gang mere komfortabel, undervisning middle school studerende en lidt
noget om datalogi, gør hovedet til denne webadresse.
De er særligt behov lige nu for lærere, især hvis du har
havde nogle eksponering for datalogi.
>> Så minde om, at sidste gang, vi introducerede et par datatyper i C, og
du måske er begyndt at få din hænder beskidte med disse hidtil
i problemet indstillet en sådan.
Og vi havde en char.
Så i noget tekniske termer, hvad er en char som du kender det i dag?
>> Så det er et tegn, men lad os være mere præcis nu.
Hvad forstår vi ved tegn eller individuelle char?
En ikke-numerisk karakter -
så ikke nødvendigvis.
Det viser sig, at selv numre, selv tegnsætning og breve er
repræsenteret med disse data skriv kendt som en char.
Så det er ikke nødvendigvis alfabetisk.
Ja?
>> Så det er en ASCII-tegn.
Så hvis du tænker tilbage på uge nul, når vi havde vores byte af frivillige
komme op og enten holde deres hænder op eller ikke alle, de repræsenterede bits.
Men kollektivt som en gruppe af otte, de repræsenterede en byte.
Og vi introducerede begrebet ASCII på det foredrag, blot der er en
kortlægning mellem tal og bogstaver.
Og ASCII anvendelser, som dem mennesker underforståede, otte bits
at repræsentere en karakter.
>> Så derfor, hvis otte bits kan hver især på én af to værdier -
nul eller én -
det betyder der var to muligheder for den pågældende person -
nul eller én -
to for denne person, to for dette person to for denne ene.
Så i alt to gange to gange to gange to gange to -
så to den ottende i alt.
Så der er en samlede antal tegn 256 muligt, at du kan
repræsentere med otte bits.
>> Nu de af jer, der taler asiatiske sprog kan vide, at der er mere
tegn i verden end blot As og Bs og Cs og Ds.
Og ja, er ASCII ikke tilstrækkeligt for en masse af verdens sprog.
Men mere om det en anden gang.
For nu, ved, at i C, hvis du ønsker at repræsentere et brev, et stykke
tegnsætning, eller bare noget tegn i naturen, bruger vi en char.
Og det er en byte eller otte bits.
>> Hvad med en int?
Tja, en int er et heltal.
Hvor mange bits, hvis du husker, var et heltal typisk?
Enhver tilbagekaldelse?
Så det er typisk 32.
Det faktisk afhænger af computeren at du bruger.
Men i apparatet, og i en masse computere, er det 32 ​​bit eller fire
bytes - otte gange fire.
Og ints bare bruges til opbevaring numre, enten negative,
positive eller nul.
>> Og hvis du har fået 32 ​​bit, og du kun pleje om positive tal, kan
nogen ballpark hvor mange mulige heltal en computer kan repræsenterer, fra
nul på op?
Så det ville være to til 32, som er omtrent fire milliarder.
Så disse beføjelser to kommer til at være tilbagevendende temaer i datalogi.
Som vi kan se, de er helt praktisk til at arbejde med, selvom det ikke er helt
let at gøre det math i ens hoved.
>> Så vi vil sige omkring fire milliarder.
Nu en lang lang -
du kan slags gæt.
Det er længere end en int.
Hvor mange bits?
Så 64 bits eller otte bytes.
Det betyder bare, du kan repræsentere selv større tal, større positiv eller
større negative tal.
>> Og hvad flyde?
Det er en floating point værdi af 32 bit.
Dette er blot et reelt tal, noget med et komma.
Men hvis man i stedet har brug for flere steder efter kommaet, eller du ønsker at
repræsentere et større antal med nogle fraktion efter det, kan du bruge en
dobbelt, hvilket er 64 bit.
>> Men der er en interessant takeaway her.
Så hvis int'er er begrænset af 32 bits og selv lange længes er begrænset af 64
bits, den slags rejser spørgsmålet, hvad nu hvis du rent faktisk ønsker at tælle
højere end 4 milliarder for en int?
Nå, du bare bruge en lang lang.
Men hvad nu hvis du ønsker at tælle højere end to til den 64., give eller tage?
>> Nu, det er et enormt antal.
Men til sidst, du kan faktisk bekymrer sig om den slags værdier,
især hvis du bruger en database og begynder at indsamle masser og masser
og masser af data og tildele unikke tal til hvert stykke af disse data.
Så vi slags har et problem.
, Og ligeledes med flydende komma værdier - flåd eller doubler -
hvis du kun har et begrænset antal bits, hvor mange samlede tal kunne du
muligvis repræsentere?
>> Tja, det er mindre klart, når du involvere et komma.
Men det er sikkert begrænset.
Hvis du har et endeligt antal bits, et endeligt antal mennesker, et endeligt
Antallet af pærer, helt sikkert du kan kun repræsenterer et endeligt antal
kommeværdier.
Men hvor mange reelle tal er deres i verden?
Der er en uendelig.
Så det er lidt af et problem, fordi vi ikke har en uendelig mængde af
hukommelse eller RAM inde i vores computere.
Så nogle udfordrende ting kan ske.
>> Så lad os gå videre og prøve at udtrykke dette her.
Lad mig gå videre og åbne op gedit.
Jeg har tænkt mig at gå videre og gemme en fil kaldet "floats0.c" bare for at være
overensstemmelse med et eksempel, der er tilgængelige online, hvis du gerne vil.
Og jeg har tænkt mig at gå videre og definere det som følger -
Jeg har tænkt mig at gå videre og sige, int main tomrum, som vi ofte gør.
>> Og så i dette program, vil jeg erklære mig en float, så en 32-bit
variabel kaldet f, vilkårligt.
Og så jeg har tænkt mig at gemme i det Jeg ved det ikke, en tiendedel, så 0.1.
Så jeg har tænkt mig at udtrykke, at som én divideret med 10, hvilket er helt
legitime i C.
>> Og så på den anden linje, jeg simpelthen ønsker at udskrive denne værdi.
Så minde om, at vi kan bruge den velkendte printf.
Vi ønsker ikke at bruge% i for en int.
Vi ønsker at bruge% f for en svømmer.
Og så vil jeg tænkt mig at gøre backslash n, tæt citat, komma, f, semikolon.
>> Så her er mit program.
Der er allerede én fejl.
Er der nogen, for hvem denne klikket vil allerede pege mindst
én fejl jeg har lavet?
Ja?
Ja.
Jeg glemte "# include" på top, de symptom på som, hvis jeg forsøger at
kompilere dette vil være, at compiler vil råbe på mig,
siger udefineret symbol eller noget i den retning.
Det betyder ikke forstå noget gerne printf.
>> Så jeg har tænkt mig at gøre "# include "Gemme filen.
Og nu er det i bedre form.
Men jeg vil også pege ud én ny detalje i dag.
Ud over at angive sted holdere som% f% i% s, kan du
undertiden påvirke adfærden af denne pladsholder.
For eksempel, i tilfælde af en variabel pointværdi, hvis jeg kun vil
at vise én decimal efter periode, kan jeg rent faktisk gør 0.1f.
Så med andre ord, adskille jeg f og procenttegn med 0,1, bare
fortæller printf, har du måske en hel masse tal efter kommaet
punkt for mig.
Men jeg kun ønsker at se en af ​​dem.
>> Så jeg har tænkt mig at gå videre nu og spar dette program, skal du gå ind i min terminal
vinduet, og jeg har tænkt mig at gå videre og type gør float 0, ind.
Jeg kan se, at noget kryptiske linje, vil begynde at give mere mening, da vi
drille det fra hinanden i denne uge og næste.
Nu vil jeg gå videre og køre float nul.
Og, fandens.
>> Så der er en anden fejl her for nogle grund.
Jeg er temmelig sikker på, at en tiendedel eller én divideret med 10, er ikke 0.0.
Måske er jeg bare ikke ser ved nok cifre.
Så hvorfor ikke siger jeg to .2 at se to decimaler stedet for blot én.
Lad mig gå tilbage til min terminal vindue her og ramt op et par gange for at
se min historie.
Gør flyde nul igen, og derefter op igen.
Og nu ind.
>> Og nu er jeg temmelig sikker på det er forkert.
Og jeg kunne gøre tre og fire, og jeg er sandsynligvis kommer til at holde se nuller.
Så hvor er fejlen?
Én divideret med 10, bør være 0,1.
Nogen ønsker at tage et stik på, hvad det grundlæggende spørgsmål er?
Ja?
De er begge heltal.
Og hvad så?
Så med et divideret med 10, der er hvad jeg gør i matematik.
Og jeg får 0.1.
>> Ja.
Og så er det faktisk, at spørgsmålet.
Når du tager et heltal i en computer og du dividere det med et andet heltal,
computeren som standard vil antage, at du vil have et heltal.
Problemet er dog, selvfølgelig, er at 0,1 ikke er et heltal.
Det er et reelt tal.
Og så hvad computeren gør ved Standard er det bare smider væk
alt efter kommaet.
Det betyder ikke runde ned eller op per se.
Det bare smider alt væk efter kommaet.
Og nu det giver mening.
Fordi nu er vi helt klart tilbage med nul.
>> Men vent et øjeblik.
Jeg kan ikke se en int nul.
Jeg faktisk ser 0,00.
Så hvordan kan jeg forene det nu?
Hvis man divideret med 10 er nul, men jeg er se 0.00, hvor er det at få
konverteres tilbage til et reelt tal?
Ja.
Præcis.
>> Så op her på linje fem, da jeg faktisk gemme det 0,1, som derefter
trunkeret til nul, inde i en float, det er faktisk svarer til
lagre den ikke som en int, men ja, som en float.
Desuden, jeg derefter bruge printf til udtrykkeligt udskrive dette nummer til to
decimaler selvom der måske faktisk ikke være nogen.
>> Så denne slags stinker, right?
Tilsyneladende kan du ikke gøre matematik, i det mindste på dette niveau af
præcision, i en computer.
Men sikkert er der en løsning.
Hvad er den enkleste fix kunne vi måske gøre, bare intuitivt her
løse dette?
Ja?
Drej heltal ind -
ja.
Selvom jeg ikke er helt sikker på, hvad der er virkelig foregår her, hvis det
fundamentalt har at gøre med disse både være ints, ja, hvorfor ikke jeg
gør at 10,0, hvilket gør dette 1.0, gem filen.
Lad mig gå ned til bund og rekompilering.
Lad mig nu køre.
Og der -
Nu har jeg fået min en tiendedel repræsenteret 0,10.
>> Ok.
Så det er ikke dårligt.
Og lad mig påpege en anden vej vi kunne have løst dette.
Lad mig faktisk rulle tilbage i tiden til, når vi havde dette som en
tiendedel et øjeblik siden.
Og lad mig gå videre og gem denne fil som et andet filnavn, for blot at
har en lille checkpoint.
Så det var udgave én.
Og lad mig nu gå videre og gøre én mere versionen.
Vi kalder denne udgave to zero indekseret.
>> Og jeg har tænkt mig at stedet gøre det - ved du hvad?
Tilføjelse dot nul fungerer i dette tilfælde.
Men formoder, at man var en variabel.
Formodes 10 var en variabel.
Med andre ord, formoder, at jeg ikke kunne bare hårdt kode .0 ved udgangen
af denne aritmetiske udtryk.
Tja, jeg kan faktisk gøre noget i parentes kaldes støbning.
Jeg kan kaste, at heltal 10 til en float, og jeg kan kaste, at heltal en til en
flyde, samt.
Så matematik, der kommer til at ske effektivt 1.0 divideret med 10,0,
resultatet heraf går if som før.
Så hvis jeg kompilere det som gør flåd 2., og nu flyder 2, får jeg den samme
besvare, samt.
>> Så dette er en temmelig kunstig eksempel, at løse dette problem
ved at indføre støbning.
Men generelt er casting kommer til at være en kraftfuld ting, især for
Problemet indstille to i en uges tid, hvor du ønsker at konvertere en datatype
andet, at ved udgangen af ​​dagen er repræsenteret på den samme måde.
Ved slutningen af ​​dagen, hver enkelt ting, vi har talt om hidtil er
bare ints under hætten.
Eller hvis det er for lavt niveau for dig, de er bare tal
under hætten.
Selv tegn, igen, husker fra uge nul, er tal
under hætten.
>> Hvilket vil sige, vi kan konvertere mellem forskellige typer af numre, hvis
de er bare bits.
Vi kan konvertere mellem numrene og breve, hvis de er bare
bits, og vice versa.
Og støbning på denne måde er en mekanisme i programmering, der lader dig magt
ændre en datatype til en anden.
Desværre er det ikke så ligetil som jeg kunne have ønsket.
>> Jeg har tænkt mig at gå tilbage til flåd 1, som var enklere, mere
ligetil med .0 Tilføjet til hver.
Og ligesom en opfrisket, lad mig gå videre og kompilere
dette, skal flåd 2 -
Beklager, det er at gøre flåd 1..
Og lad os nu køre flåd 1..
Og i bunden, bemærk at jeg faktisk får 0.1.
Så problem løst.
>> Men ikke endnu.
Jeg er nu kommer til at få en smule nysgerrig, og jeg har tænkt mig at gå tilbage til mit
printf erklæring og sige, ved du hvad?
Jeg vil gerne bekræfte, at denne er virkelig en tiendedel.
Og jeg har tænkt mig at ønsker at se denne til,, siger fem decimaler.
Det er ikke et problem.
Jeg ændre to til fem, Jeg kompilere med lave.
Jeg køre det som flyder 1..
Ser temmelig godt.
Mine fornuftighedskontroller kan ende der, men Jeg får lidt mere eventyrlystne.
Jeg har tænkt mig at ændre 0,5-0,10.
Jeg ønsker at se 10 cifre efter det decimal.
>> Og jeg har tænkt mig at gå videre og kompilere dette og køre svæver 1..
Jeg slags beklagelse have testet dette længere, fordi min matematik er ikke så
korrigere længere, det forekommer.
Men vent et øjeblik, måske det er bare et lykketræf.
Måske computer fungerer en lille smule mærkeligt.
Lad mig gå videre og gøre 20 decimaler og berolige mig selv, at jeg kender
hvordan man gør matematik.
Jeg ved, hvordan man programmerer.
Foretag flåd 1, rekompilere og helvede.
Det er virkelig, virkelig komme langt fra mærket.
>> Så hvad sker der her?
Intuitivt er baseret på vores antagelser tidligere om størrelsen af ​​datatyper
hvad der skal ske her under hætten?
Ja?
Præcis.
Hvis du ønsker denne meget præcision, og det er en pokkers af en masse præcision -
20 numre efter kommaet.
Du kan umuligt udgøre en vilkårligt antal medmindre du har en
vilkårligt antal bits.
Men det gør vi ikke.
For en svømmer, har vi kun 32 bit.
>> Så hvis 32 bit kan kun ionbyttet i en måde - ligesom vores mennesker på, scene
hænderne op eller ned - i et begrænset antal måder, er der kun et begrænset antal
af reelle tal, du kan repræsentere med disse bit.
Og så computeren sidst er nødt til at
begynde at skære hjørner.
Computeren kan skjule disse detaljer fra os for en lille smule tid.
Men hvis vi begynder at stikke på tallene og ser længere og længere på
efterstillede tal i hele tal, så vi begynder at se, at det er
faktisk tilnærme idé på en tiendedel.
>> Og så viser det sig, tragisk, er der et uendeligt antal numre
Vi kan ikke repræsentere netop i en computer, i det mindste med en endelig
Antallet af bits, et endeligt mængden af ​​RAM.
Nu desværre, det til tider har virkelige verden konsekvenser.
Hvis folk ikke helt sætte pris på denne eller slags tager for givet,
at deres computer bare vil gøre, hvad de fortæller det til at gøre, og ikke
forstå disse underliggende repræsentation detaljer -
som ærligt talt, i nogle sprog er skjult for brugeren, i modsætning til C -
nogle dårlige ting kan ske.
>> Og hvad jeg troede, vi ville gøre er at tage et skridt tilbage.
Og det er omkring en otte-minutters video.
Det blev sendt for et par år siden, og det giver indblik i faktisk hvad der kan gå
galt, når du under-værdsætte disse former for detaljer i meget alt for
virkelige verden.
Hvis vi kunne dæmpe lyset i et par minutter.
>> SPEAKER 1: Vi vender nu tilbage til teknik
katastrofer på Modern Marvels.
>> Computere -
vi har alle kommet til at acceptere ofte frustrerende problemer
der går med dem.
Bugs, vira og software glitches er små priser til at betale for
bekvemmelighed.
Men i high-tech og high-speed militær og rumprogram
applikationer, den mindste problem kan forstørres i katastrofen.
>> Den 4. juni 1996 udarbejdet forskerne at lancere en ubemandet Ariane 5 raket.
Det var i færd videnskabelige satellitter til formål at skabe præcist, hvordan
Jordens magnetfelt interagerer med solvind.
Raketten blev bygget til det europæiske Rumorganisation og løftes fra dets
facilitet på kysten Fransk Guyana.
>> JACK GANSSLE: I omkring 37 sekunder inde flyvningen, de først bemærket
noget gik galt.
Dyserne blev dreje i en måde, de burde virkelig ikke.
Ca. 40 sekunder inde i flyvningen, klart køretøjet var i knibe.
Og det er, når de lavede en beslutning om at ødelægge det.
Sortimentet sikkerhed officer med enorme tarme, trykkede på knappen,
sprængte raketten før den kunne blive en fare for den offentlige sikkerhed.
>> SPEAKER 1: Dette var den jomfrurejse af Ariane 5 og dens ødelæggelse
fandt sted på grund af en indbygget fejl i rakettens software.
>> JACK GANSSLE: Problemet på Ariane var, at der var en række
det krævede 64 bits til at udtrykke.
Og de ønskede at konvertere til en 16-bit tal.
De antog, at antallet var aldrig vil være meget stor, at de fleste af
disse cifre i 64-bit Antallet var nuller.
De var forkert.
>> SPEAKER 1: Den manglende evne af et software program til at acceptere den slags
tal, som genereres af en anden var ved roden af ​​den manglende.
Softwareudvikling var blevet en meget kostbare del af ny teknologi.
Ariane 4 raket havde været meget succes, så meget af softwaren
skabt for det var også anvendes i Ariane 5.
>> PHILIP COYLE: Det grundlæggende problem var at Ariane 5 var hurtigere,
fremskyndes hurtigere.
Og softwaren ikke havde tegnede sig for det.
>> SPEAKER 1: Ødelæggelsen af ​​raketten var en enorm økonomisk katastrofe,
alle på grund af et minut softwarefejl.
Men dette var ikke første gang data konvertering problemer var plaget moderne
raketteknologien.
>> JACK GANSSLE: I 1991 med starten af den første Golfkrig, Patriot
missil oplevet en lignende art en række konvertering problem.
Som følge heraf var 28 amerikanske soldater dræbt og omkring 100 andre såret
når Patriot, som skulle at beskytte mod indkommende Scuds,
undladt at affyre et missil.
>> SPEAKER 1: Når Irak invaderede Kuwait, og America lancerede Desert Storm i
begyndelsen af ​​1991, Patriot missil-batterier blev indsat for at beskytte Saudi-Arabien
og Israel fra irakisk Scud missilangreb.
The Patriot er et amerikansk mellemdistance overflade-til-luft-system fremstillet af
Raytheon selskab.
>> THEODORE POSTOL: Størrelsen af ​​Patriot opfanger selv er groft
20-meter lang.
Og det vejer omkring 2000 pounds.
Og det bærer et sprænghoved på omkring -
Jeg synes det er omkring 150 pounds.
Og sprænghoved selv er en højeksplosive der har
fragmenter omkring det.
Den beklædning i sprænghoved er konstrueret at optræde som hagl.
>> SPEAKER 1: missiler udføres fire pr beholder og transporteres
af en sættevogn.
>> PHILIP COYLE: The Patriot anti-missil systemet går tilbage til
mindst 20 år nu.
Det var oprindeligt designet som en luftforsvar missil
nedskyde fjendtlige fly.
I den første Golfkrig, når denne krig kom, hæren ønskede at bruge det
at nedskyde Scuds, ikke fly.
Den irakiske luftvåben var ikke så meget af et problem.
Men hæren var bekymret Scuds.
Og så de forsøgte at opgradere Patriot.
>> SPEAKER 1: Aflytning en fjende missil rejser på mach fem var
vil være udfordrende nok.
Men da Patriot blev hastet ind service, hæren var ikke klar over en
Irakiske modifikation, der gjorde deres Scuds næsten umuligt at ramme.
>> THEODORE POSTOL: Hvad skete er Scuds der var
kommer var ustabil.
De var slingrende.
Grunden til dette var irakerne, i For at få 600 km ud af en
300-kilometer-range missil tog vægt af den forreste sprænghoved.
De gjorde sprænghoved lysere.
Så nu Patriot forsøger at komme på Scud.
Og det meste af tiden, den overvældende størstedelen af ​​den tid, det ville bare
flyve ved Scud.
>> SPEAKER 1: Når Patriot-systemet operatører indså Patriot savnet
sit mål, de detonerede Patriots sprænghoved for at undgå mulig
tab, hvis det blev tilladt at falde til jorden.
>> THEODORE POSTOL: Det var, hvad de fleste folk så som store ildkugler på himlen
og misforstået som aflytninger af Scud sprænghoveder.
>> SPEAKER 1: Selv om i nat himmel Patrioter syntes at være vellykket
ødelægge Scuds på Dhahran der kunne ikke fejl om dens
ydeevne.
Der, Patriot radarsystem tabt styr på en indkommende Scud og aldrig
iværksat på grund af en software-fejl.
>> Det var israelere, der først opdagede at jo længere systemet
var på, jo større tidssammenfald forfaldt til et ur
indlejret i systemets computer.
>> JACK GANSSLE: Omkring to uger før tragedie i Dhahran, israelerne
indberettes til forsvarsministeriet at systemet var ved at miste tid.
Efter omkring otte timers drift, bemærkede de, at systemet er
bliver mærkbart mindre nøjagtige.
Forsvarsministeriet reagerede ved fortæller alle de Patriot batterier
at ingen af ​​systemerne på i lang tid.
De har aldrig sagt, hvad en lang tid var.
Otte timer?
10 timer?
1000 timer?
Ingen vidste det.
>> SPEAKER 1: The Patriot batteri stationeret på kasernen på Dhahran
og dets mangelfulde interne ur havde været på mere end 100 timer på natten
25. februar.
>> JACK GANSSLE: Det spores tid til en nøjagtighed på omkring en tiendedel af et sekund.
Nu, en tiendedel af et sekund er en interessant nummer, fordi det ikke kan være
udtrykt i binær nøjagtigt, hvilket betyder det ikke kan udtrykkes nøjagtigt
enhver moderne digital computer.
Det er svært at tro, men bruge dette som et eksempel.
Lad os tage nummer en tredjedel.
En tredjedel kan ikke udtrykkes i decimal nøjagtigt.
En tredjedel er 0,333 går på til uendeligt.
Der er ingen måde at gøre det med absolutte nøjagtighed i decimal.
Det er præcis den samme slags problemer der skete i Patriot.
Jo længere systemet kørte den værst tiden fejlen blev.
>> SPEAKER 1: Efter 100 timers drift, fejlen i tid var kun
omkring en tredjedel af et sekund.
Men med hensyn til målretning et missil rejser på mach fem, det resulterede i
en tracking error på over 600 meter.
Det ville være en fatal fejl for soldaterne ved Dhahran.
>> THEODORE POSTOL: Hvad skete der er en Scud lancering blev opdaget i begyndelsen af
advarsels-satellitter.
Og de vidste, at Scud kom i deres generelle retning.
De vidste ikke, hvor det kommer.
>> SPEAKER 1: Det var nu op til radaren komponent af Patriot-systemet
forsvare Dhahran at lokalisere og holde styr på de indkommende fjendtlige missil.
>> JACK GANSSLE: Radaren var meget smart.
Det ville faktisk spore positionen af Scud og derefter forudsige, hvor det
sandsynligvis ville være den næste gang radaren sendte en puls ud.
Der blev kaldt intervallet gate.
>> THEODORE POSTOL: Så når Patriot beslutter er gået tid nok til at gå
tilbage og tjekke det næste sted for dette opdagede objekt, det går tilbage.
Så når det gik tilbage til den forkerte sted, er det så ikke ser nogen objekt.
Og det beslutter, at der ikke var nogen genstand, det var en falsk afsløring og
dråber sporet.
>> SPEAKER 1: Det kommende Scud forsvandt fra radar skærmen, og
sekunder senere smækkede ind i kasernen.
Den Scud dræbte 28 og var den sidste fyret under den første Golfkrig.
Tragisk, den opdaterede software ankom ved Dhahran den følgende dag.
Den software fejl var blevet fastsat, lukke et kapitel i den urolige
historie Patriot missil.
>> Patriot er faktisk et akronym for Trinvis Array SPORING
Skæring Target.
>> DAVID J MALAN: Okay, så en ædru eksempel, for at være sikker.
Og heldigvis er disse lavere niveau bugs er ikke noget, vi vil
typisk at værdsætte, bestemt ikke med nogle af vores
tidligste af programmerne.
Snarere, de fleste af de fejl vil du møde vil være logisk i naturen,
syntaktisk i naturen, hvorved kode fungerer bare ikke rigtigt.
Og du ved det temmelig hurtigt.
>> Men især når vi kommer til slutningen af ​​semestret, det kommer til at
bliver mere og mere af en mulighed for at virkelig tænke hårdt om design
af dine programmer og de underliggende repræsentation
der også, af data.
For eksempel, vil vi introducere MySQL, som er et populært database motor
som du kan bruge med hjemmesider til gemme data på bagenden.
Og du bliver nødt til at begynde at afgøre, på slutningen af ​​semestret ikke kun, hvad
typer af data langs disse linjer at bruge men præcis hvor mange bits til at bruge,
hvorvidt du ønsker at gemme datoer som datoer og tidspunkter som tider, og også
ting som hvor stor vil du have entydige id'er til at være for, siger, brugerne
i din database.
>> Faktisk haft, hvis nogle af jer har Facebook tegner sig for temmelig lang tid,
og du ved, hvordan du får adgang til til din bruger-id -
som undertiden dukker op i din profil URL, medmindre du har valgt en
kaldenavn for den webadresse, eller hvis du har brugte Facebooks Graph API, den
offentligt tilgængelig API, som du kan bede Facebook for rådata -
kan du se, hvad din numerisk id er.
Og for nogle år siden, Facebook væsentlige måttet ændre fra at bruge
svarer til int'er at bruge lang lang, fordi over tid som brugere kommer
og gå og skabe masser af konti, og falske konti, selv de meget let
var i stand til at udtømme noget som en 4 milliarder mulig værdi som en int.
>> Så mere på den slags spørgsmål ned ad vejen,. samt
Okay, så det var casting.
Det var upræcist.
Et par hurtige meddelelser.
Så sektioner formelt begynder denne kommende Søndag, mandag, tirsdag.
Du vil høre via e-mail senere i denne uge at din afdeling opgave.
Og du vil også her på det punkt, hvor at ændre din afdeling, hvis din
tidsplan er nu ændret eller din komfort niveau er nu ændret.
Imens P-set én og hacker man er grund denne torsdag med mulighed for at
forlænge fristen pr specifikationer til fredag
i en typisk måde.
>> Indse, at følger med problemet sæt specifikationer er instruktioner om
hvordan man bruger CS50 apparat, gør, samt nogle CS50 konkrete værktøjer
agtig stil 50, der kan give dig feedback dynamisk på
kvaliteten af ​​din kode stil og også tjek 50, der kan give dig
dynamisk feedback på din kodens korrekthed.
Tilgiv, at vi stadig strygning ud et par kinks med checken 50 år.
Et par af dine klassekammerater, der gjorde begynde omkring 04:00 fredag ​​aften, når
spec gik op have bemærket siden et par bugs, som vi arbejder
igennem, og undskyldninger for alle, der har oplevet uberettigede frustrationer.
Fejlen er min.
Men vi vil følge op på CS50 diskutere, hvornår der er løst.
>> Så et ord på scoringer selv.
Så det vil være en uge eller to, før du begynder at få feedback på problemet sæt
fordi du endnu ikke har en undervisning fyr.
Og selv da, vil vi begynde at evaluere C problemet sæt, før vi
gå tilbage og evaluere bunden så at du får mere relevant
tilbagemeldinger hurtigere.
Men generelt per pensum, CS50 problem sæt evalueres langs
efter fire akser -
rækkevidde, korrekthed, design og stil.
>> Scope vil være en række typisk mellem nul og fem,
indfanger hvor meget af stykke, som du smule.
Typisk, vil du have dette at være fem.
Du i det mindste prøvet alt.
Og mærke det er en multiplikativ faktor således at gøre kun en del af
Problemet sæt er ikke den bedste strategi.
>> I mellemtiden mere indlysende er det vigtigheden af ​​korrekthed -
bare dit program korrekt med respekt til specifikationen?
Det vægtes bevidst mere hårdere end de to andre akser ved en
faktor tre, fordi vi anerkender der typisk du kommer til at tilbringe en
meget mere tid jagter ned nogle bugs, få din kode for at arbejde, så er du
er indrykke den og vælge passende variable navne og
gerne, der er på den anden ende af spektret af stil.
>> Det er ikke til at sige stil er ikke vigtigt, og vi vil prædike det over
gang både i foredrag og i sektioner.
Stil refererer til æstetik af din kode.
Har du valgt vel-navngivne variabler der er korte, men noget
beskrivende?
Er din kode indrykket som du har set i foredrag og på en måde,
med stil 50?
>> Endelig er designet til højre der i midten.
Design er jo sværere en til at sætte en finger på, fordi det er meget mere
subjektive.
Men det er måske den vigtigste af De tre akser i form af pædagogisk
værdi over tid, og at dette vil være undervisningen stipendiatens mulighed for at
give dig kvalitativ feedback.
Ja, i CS50 selvom vi har disse formler og scoringer, som ultimo
af dagen disse er meget bevidst meget små spande - kommaværdier
mellem nul og tre og nul og fem.
Vi forsøger ikke at trække meget grove linjer mellem problem sæt eller mellem
studerende, men snarere fokusere så meget som Vi kan på kvalitative, hånden
feedback, enten maskinskrevet eller verbale fra netop din undervisning fyr,
du får at vide ganske godt.
>> Men i almindelighed er dem vægtene at de forskellige akser skal have.
I mellemtiden også, det er værd at holde i imod, at man ikke bør antage, at en
tre ud af fem er en 60% og derfor groft svigter.
Tre er bevidst menes at være slags midten af ​​vejen godt.
Hvis du får treere på semesterstart, det er
faktisk beregnet til at være en god sted at begynde.
Hvis du får toere, messer, er der absolut noget arbejde til at betale lidt
mere opmærksomhed, for at drage fordel afsnit og kontortid.
>> Hvis du får fours og femmere, store.
Men virkelig, vi håber at se baner blandt de studerende - meget
individualiseret per elev, men starter semestret her slags
de to til tre rækkevidde, men slutter heroppe i de fire til fem rækkevidde.
Det er, hvad vi virkelig søger.
Og vi huske deltaet, som du udviser mellem uge nul og uge
12, når jeg laver kvaliteter.
Det betyder ikke noget for os helt hvordan du retfærdigt i starten, hvis din
bane er faktisk opad og stærk.
>> Akademisk ærlighed - så lad mig sætte på min mere alvorlig stemme for bare et øjeblik.
Så dette kursus har sondringen for sende flere studerende end nogen anden
i historien til annoncen bord, tror jeg.
Vi har slags mistet optælling på dette punkt, hvor ofte dette sker.
Og det er ikke fordi de studerende i 50 er mere uærlig end deres
klassekammerater andetsteds.
Men indser også, at vi er meget gode til at opdage den slags ting.
>> Og det er den fordel, at en datalogi klasse har i, at vi
kan, og vi sammenligne alle elever Problemet sætter parvise imod enhver
anden, ikke kun i år men alle tidligere år.
Vi har evnen, ligesom studerende i klassen, Google og finde koden
på websteder som github og diskussionsfora.
Der er absolut løsninger på CS50 s p-sæt flyder rundt der.
Men hvis du kan finde dem, vi kan finde dem.
Og alt dette er meget automatiseret og nemt og trist for os at finde.
>> Men jeg vil gerne understrege, også, at de Uddannelsens faglige ærlighed politik
meget betød at være meget det modsatte af denne ånd.
Faktisk dette år har vi omformuleret tingene i pensum at være denne, dot
dot dot med flere detaljer i pensum.
Men det overordnede tema i kurset er virkelig at være rimelig.
Vi anerkender, at der er en betydelig mængde af pædagogisk
værdi i samarbejdende, til en vis grad, med klassekammerater, hvor du
to eller du tre eller du flere er stående på et hvidt bord
whiteboarding, så at tale, dine ideer -
at skrive pseudokode i billeder, diagrammering hvad skal Mario være, hvis
du skulle skrive det første i pseudokode.
Hvad skal grådige algoritme -
hvordan skal den opfører per Problemet sætter en?
>> Og så indse, at adfærden at vi tilskynder er meget
meget langs disse linjer.
Og i pensum, vil du se en hel masse kugler under en
rimelig kategori og en ikke rimeligt kategori, der hjælper os med at hjælpe
du pakke dit sind omkring hvor vi trækker denne linje.
Og generelt, en anstændig tommelfingerregel er, at hvis du kæmper for at løse
nogle fejl og din ven eller klassekammerat sidder ved siden af ​​dig, det er
rimeligt for dig at vise ham eller hende din kode og sige, hey, kan du hjælpe
mig regne ud, hvad der går galt her?
>> Vi typisk ikke omfavne den modsatte side.
Det er ikke et korrekt svar til din ven eller klassekammerat her for at sige, åh,
bare se på mine og tal det ud fra det.
Det er slags urimeligt.
Men efter at have en anden, en anden hjerne, et andet par øjne ser på
skærmen, eller se på din kode og sige, er du sikker på du vil
at have en løkke her?
Eller er du sikker på du vil at semikolon her?
Eller åh, det fejlmeddelelsen betyder dette.
De er meget rimelige og opmuntret adfærd.
>> De sager, som jeg hentydede til tidligere koges ned til, når eleverne er
sent på aftenen gør dårlig dømmekraft beslutninger og emailing deres kode til
en anden eller bare at sige, her, det er i Dropbox eller
Googling sent om natten.
Og så vil jeg opmuntre og beder dig, hvis du har dem uundgåelige
øjeblikke af stress, du ramlede mod deadline, har du ingen sent
dag, da det er allerede fredag ​​på det punkt, email kursets hoveder eller
selv direkte.
Sig, lytte, jeg er på min bristepunktet her.
Lad os få en samtale og regne det ud.
Ty til internettet eller en anden ikke rimelig adfærd er aldrig
løsning, og alt for mange af dine klassekammerater er ikke længere her på
campus på grund af, at dårlig dømmekraft.
Men det er meget nemt at nederdel denne linje.
>> Og her er et lille billede til at juble dig fra Reddit så der nu
alt vil være OK.
>> Så en hurtig resumé, så af, hvor vi slap.
Så i sidste uge, minde om, at vi indfører betingelser, ikke i Scratch
men i C denne gang.
Og der var nogle nye syntaks, men virkelig ingen nye ideer selv.
Vi havde boolske udtryk, vi kunne eller sammen med to lodrette
barer eller og sammen med to ampersands, siger, at både venstre
og retten skal være sandt for at dette kan udføre.
Derefter havde vi switches, som vi kiggede ved kortvarigt, men jeg foreslår, er virkelig
bare forskellige syntaks for at nå samme slags mål, hvis du kender i
forhånd, hvad dine sager vil være.
>> Vi kiggede på sløjfer.
En for-løkke er måske den mest almindelige, eller i det mindste den ene, at folk
typisk nå til instinktivt.
Selvom det ser lidt kryptisk, du vil se mange, mange eksempler på denne
inden længe, ​​som du har allerede i slutningen af ​​sidste uge.
Mens sløjfer kan ligeledes opnå det samme.
Men hvis du ønsker at gøre nogen optælling eller ajourføring af
variable værdier, er du nødt til gøre det mere manuelt end
for loop før tillader.
Og så er der den do-while løkke, som giver os mulighed for at gøre noget ved
mindst én gang, mens noget ellers er sandt.
Og det er især god til programmer eller til spil, hvor du ønsker
til at bede brugeren for noget mindst én gang.
Og så, hvis han eller hun ikke samarbejder, du måske ønsker at gøre det
igen og igen.
>> Med variable, i mellemtiden havde vi linjer kode som dette, der kunne
være to linjer.
Du kunne erklære en kaldet int tæller, semikolon.
Eller du kan bare erklære og definere det, så at sige.
Give det en værdi på samme tid.
>> Og så endelig, talte vi om funktioner.
Og dette var en nice eksempel på den forstand, at det illustrerer
to typer funktioner.
Ene er getString (), som igen får en streng fra brugeren.
Men getString () er lidt interessant, så vidt vi har brugt det,
fordi vi altid har brugt det med noget på venstre side af en
lighedstegn.
Det vil sige, at getString () returnerer en værdi.
Den returnerer naturligvis en streng.
Og derefter på den venstre side, er vi simpelthen gemme denne streng inde i en
variabel kaldet navn.
>> Det er anderledes, i en vis forstand, fra printf fordi printf, mindst i vores
forbrug her ikke vender tilbage noget.
Som en sidebemærkning, betyder det tilbagevenden noget.
Vi bare ligeglad, hvad det er.
Men det har, hvad der er kaldes en bivirkning.
Og hvad er det bivirkning i alle tilfælde, vi har set hidtil?
Hvad betyder printf gøre?
Den udskriver noget til skærmen, displays tekst eller tal eller noget
på skærmen.
Og det er bare betragtes som en bivirkning fordi det ikke er rigtig at uddele
det tilbage til mig.
Det er ikke et svar inde i en sort boks, som jeg derefter kan
nå ind og få fat.
Det er bare at gøre det på sin egen, meget ligesom Colton var tilsluttet dette
black box i sidste uge, og han eller anden måde magisk var trække på tavlen
uden mig faktisk involveret.
Det ville være en bivirkning.
Men hvis jeg havde faktisk at nå tilbage i her og sige, åh, her er strengen
fra brugeren, ville det være en tilbagevenden værdi.
>> Og hidtil har vi kun anvendte funktioner at andre mennesker har skrevet.
Men vi kan faktisk gøre disse slags ting selv.
Så jeg har tænkt mig at gå ind i CS50 apparat igen.
Lad mig slutte den fane, vi havde åbne for et øjeblik siden.
Og lad mig gå videre og oprette en ny fil.
Og jeg har tænkt mig at gå videre og kalder dette ene positive.c.
Så jeg ønsker at gøre noget med positive tal her.
Så jeg har tænkt mig at gå videre og gøre int -
sorry -
# Include.
Lad os ikke gøre det samme fejl som før.
Int main (void), åben curly klampe, lukket klammeparentes.
>> Og nu vil jeg gøre følgende.
Jeg vil skrive et program, der insisterer på, at brugeren giver
mig et positivt heltal.
Så der er ingen GetPositiveInt funktion i CS50 biblioteket.
Der er kun GetInt ().
Men det er OK, fordi jeg har den konstruktioner, som jeg kan pålægge en
lidt mere pres på denne værdi.
Jeg kunne gøre noget som dette.
>> Så int n -
og hvis du skriver sammen, bare indse Jeg har tænkt mig at gå tilbage og
ændre nogle ting i et øjeblik -
så int n lig GetInt ().
Og det kommer til at sætte en int indersiden af ​​n..
Og lad mig være en mere beskrivende.
Lad mig sige noget som jeg forlanger, at du give mig et positivt heltal.
>> Ok.
Så bare en lille smule af instruktioner.
Og nu, hvad kan jeg gøre?
Nå, jeg allerede kender fra min simple betingelser eller filialer, ligesom jeg
havde i Scratch, kunne jeg sige noget gerne, hvis n er mindre end eller lig med
nul, så jeg ønsker at gøre noget gerne, det er ikke positivt.
Og så kunne jeg gøre -
OK, men jeg virkelig ønsker at få det int.
Så jeg kunne gå op her, og jeg kunne slags af eksemplar dette og led dette.
Og så, OK.
Så hvis n er mindre end eller lig med nul gøre dette.
>> Hvad nu, hvis brugeren ikke samarbejder?
Nå, så jeg har tænkt mig at låne dette her.
Og så går jeg ind her og her og her.
Så dette er tydeligvis ikke løsningen, right?
Fordi der er ingen ende i sigte.
Hvis jeg ønsker at kræve, at brugeren giver mig et positivt heltal, kan jeg
faktisk få int.
Jeg kan så kontrollere, om denne int.
Men så vil jeg tjekke det igen og tjekke det igen og tjekke det igen.
Så selvfølgelig, hvad er bedre konstruere at være ved hjælp her?
Okay, så en form for løkke.
>> Så jeg har tænkt mig at slippe næsten alt dette.
Og jeg ønsker at få denne int mindst én gang.
Så jeg har tænkt mig at sige gøre -
og jeg vil vende tilbage til mens der i bare et øjeblik -
nu, gør hvad?
Jeg har tænkt mig at gøre int n får GetInt ().
OK.
Så det er temmelig godt.
Og nu, hvor ofte gør Jeg ønsker at gøre dette?
>> Lad mig sætte printf indersiden af ​​løkken så jeg kan forlange igen og igen,
hvis nødvendigt.
Og hvad vil jeg det mens betingelse for at gøre?
Jeg ønsker at holde gør dette mens det er tilfældet?
Ja.
N er mindre end eller lig med nul.
Så allerede vi har betydeligt rengøres denne kode op.
Vi har lånt en meget enkel konstruktion - gør-while-løkke.
Jeg har stjålet bare de vigtige linjer kode, at jeg begyndte at kopiere og
indsætning, som ikke var klogt.
Og så nu vil jeg faktisk indsætte det her og bare gøre det én gang.
>> Og nu, hvad ønsker jeg at gøre på slutningen af ​​dette program?
Jeg vil bare sige noget simpelt gerne, tak for - og
Jeg vil gøre% i for int -
backslash n, komma og derefter plug in n, semikolon.
>> Ok.
Så lad os se, hvad der sker nu når jeg køre dette program.
Jeg har tænkt mig at gå videre og gør positiv.
Damn.
Et par fejl.
Så lad mig rulle tilbage op til den første.
Må ikke arbejde gennem dem baglæns.
Arbejde gennem dem fra toppen og ned at de ikke kaskade, og kun
én ting være forkert.
Implicit erklæring funktion GetInt ().
Ja.
Så det var ikke nok.
Jeg slags lavet den samme fejl, men lidt anderledes denne gang.
Jeg skal ikke kun omfatte stdio.h men også cs50.h, som omfatter
såkaldte erklæringer om at få int, hvilket undervise apparatet eller lærer
C hvad GetInt () er.
>> Så lad mig gemme!.
Jeg har tænkt mig at ignorere de andre fejl fordi jeg har tænkt mig at håbe, at de er
anden måde relateret til fejlen Jeg har allerede fast.
Så lad mig gå videre og kompilere med make positive, Enter.
Damn.
Tre fejl, stadig.
Lad mig rulle op til den første.
Ubrugte variabel n..
Vi har ikke set det før.
Og også dette er lidt kryptisk.
Dette er outputtet af compileren.
Og hvad der fremhævede linje der - positive.c :9:13 -
siger, det siger on line ni af positive.c, på den 13. karakter,
13. kolonne, du har lavet denne fejl.
>> Og i særdeleshed, er det at fortælle mig ubrugt variabel n..
Så lad os se -
linie ni.
Jeg bruger n i den forstand, Jeg giver det en værdi.
Men hvad compileren ikke kan lide, er at jeg ikke tilsyneladende bruger det.
Men vent et øjeblik, jeg bruger det.
På linje 11, jeg bruger det her.
Men hvis jeg rulle ned yderligere på positive.c :11 -
så ved linie 11, tegn 12, den compiler fortæller mig, brug af
kaldenavn n.
>> Så sort betyder, at jeg har ikke specificeret det som en
variabel med en datatype.
Men vent et øjeblik.
Jeg gjorde præcis det på linje ni.
Så nogen er virkelig forvirret her.
Det er enten mig eller compiler, fordi på linje ni, igen jeg erklære en
int n, og jeg tildele det returnere værdien af ​​GetInt ().
Så jeg bruger denne variabel n på linje 11 og kontrollere, hvis dens værdi er mindre
end eller lig med nul.
Men det er tilsyneladende dårlige og brudt hvorfor?
Sig det igen?
>> Ah, jeg nødt til at erklære n før ind i løkken.
Men hvorfor?
Jeg mener, vi netop foreslået en smule siden, at det er fint at erklære variabler
alle på én linje og derefter tildele dem en vis værdi.
En global variabel - lad os vende tilbage til denne idé i bare et øjeblik.
Hvorfor vil du have mig til at sætte den ud af løkken?
Det er.
Præcis.
>> Så, omend noget ulogisk, lad mig opsummere.
Når du erklærer n inde af gør blokken der -
specifikt inde i de krøllede parenteser -
denne variabel n har, hvad der er kaldes en rækkevidde -
relateret til vores pointsystem i kursus - men har en rækkevidde, der er
begrænset til de krøllede parenteser.
Med andre ord, hvis du typisk erklærer en variabel inde i et sæt
krøllede parenteser, at variable eksisterer kun indersiden af ​​disse krøllede parenteser.
Så ved denne logik alene, men selv Jeg har erklæret n på linje ni, det
væsentlige forsvinder fra anvendelsesområdet forsvinder fra hukommelsen, så at sige,
med den tid, jeg ramte linie 11.
Fordi linje 11, desværre, er uden for disse krøllede parenteser.
>> Så jeg kan desværre ikke løse dette ved gå tilbage til, hvad jeg gjorde det før.
Du kan i første omgang gøre det.
Men hvad er du nu ikke laver cyklisk?
Du naturligvis ikke at få int cyklisk.
Så vi kan forlade GetInt (), og vi skal forlade GetInt () inde i
loop fordi det er hvad vi ønsker at forpeste brugeren om igen og igen.
Men det er tilstrækkeligt til at gå op til linje, siger seks.
Int n, semikolon.
Må ikke give det en værdi endnu, fordi du behøver ikke at bare endnu.
>> Men nu hernede, varsel - det ville være en meget nem fejltagelse.
Jeg ønsker ikke at skygge min tidligere erklæring n.
Jeg ønsker at bruge n som rent faktisk eksisterer.
Og så nu i linje 10, Jeg tildeler n en værdi.
Men på linje seks, erklærer I n.
Og så kan jeg eller kan jeg ikke bruge det i linje 12 nu?
Jeg kan, fordi mellem hvilke krøllet seler er n erklæret nu?
Den ene op her på linje fem.
Til en her på linie 14..
Så hvis jeg nu zoome ud, skal du gemme denne fil, gå tilbage i og køre gøre positive, det
udarbejdet denne gang.
Så det er allerede fremskridt.
Slash. . / Positive, Enter.
>> Jeg forlanger, at du giver mig et positivt heltal.
Negativ 1..
Negativ 2..
Negativ 3..
Nul.
One.
Og tak for den ene er hvad der nu er udskrevet.
>> Lad mig prøve noget andet, ud af nysgerrighed.
Jeg bliver bedt om at indtaste et heltal.
Men hvad nu hvis jeg i stedet skrive i lam?
Så du nu se en anden prompt -
prøv igen.
Men ingen steder i min kode jeg skriver prøv igen.
Så hvor formentlig, er det prøve igen bede kommer fra, ville du sige?
Ja, fra GetInt () selv.
Så en af ​​de ting, CS50 personale gør for dig, i det mindste disse første par
uger har vi skrevet nogle beløb af fejlkontrol til at sikre, at hvis
du kalder GetInt (), vil du i det mindste komme tilbage en int fra brugeren.
Du vil ikke få en streng.
Du vil ikke få en char.
Du vil ikke få noget helt andet.
Du får en int.
>> Nu kan det ikke være positiv.
Det er måske ikke være negativ.
Vi giver ingen garantier omkring dette.
Men vi vil forpeste brugeren for at prøve igen, prøve igen, prøve igen, indtil han eller hun faktisk
samarbejder.
Tilsvarende, hvis jeg gør 1,23, det er ikke en int.
Men hvis jeg skriver i, siger, 50, der giver mig en værdi, som jeg ønskede.
>> Ok.
Så ikke dårligt.
Eventuelle spørgsmål om, hvad vi lige har gjort?
Nøglen takeaway er, at være klar, ikke så meget løkke, som vi har set
før selvom vi har ikke rigtig brugt det, men spørgsmålet om omfanget, hvor
variable kan kun kan kun bruges inden nogle nærmere angivet omfang.
>> Okay, lad mig tage fat forslaget du har lavet tidligere, at en
global variabel.
Som en sidebemærkning viser det sig, at en anden løsning på dette problem, men
typisk en forkert opløsning eller en dårligt designet løsning, er at
erklære din variabel som, hvad der er kaldes en global variabel.
Nu er jeg slags krænke min definition af muligheder, fordi der er
ingen krøllede parenteser allerøverst og selve bunden af ​​en fil.
Men konsekvenserne af denne er det nu i overensstemmelse fire,
n er en global variabel.
Og som navnet antyder, er det bare tilgængelig overalt.
>> Scratch har faktisk disse.
Hvis du har brugt en variabel, kan du huske du skulle vælge, hvis det er for
dette sprite eller for alle sprites.
Tja, alle sprites er bare tydeligere måde at sige global.
Ja?
Ah, virkelig godt spørgsmål.
>> Så huske, at i den allerførste udgave af min kode, da jeg forkert
erklæret og defineret n på linje ni -
Jeg erklærede det som en variabel og jeg gav det en værdi med
opgaven operatør -
dette gav mig to fejl.
Én, at n ikke er blevet anvendt, og to, at i linie 11
Det var bare ikke deklareret.
Så den første jeg gjorde ikke adresse på det tidspunkt.
Det er strengt taget ikke en fejl at erklære en variabel, men ikke bruge det.
Men en af ​​de ting, vi har gjort i Den CS50 apparat, bevidst,
pædagogisk, er vi skrevet op forventninger til compiler til at gøre
sikker på, at du laver tingene ikke bare korrekt, men virkelig korrekt.
>> Fordi hvis du erklære en variabel ligesom n og aldrig bruger det, eller bruger det
korrekt, så hvad det gør der?
Det er virkelig tjener ikke noget formål.
Og det er meget nemt over tid, hvis du ikke konfigurerer din egen computer i
denne måde, at bare have kode, der har små rester her, rester der.
Og så måneder senere du se tilbage og du er ligesom, hvorfor er denne linje af
kode der?
Og hvis der ikke er nogen god grund, er det gavner ikke dig eller dine kolleger
ned ad vejen til at snuble over det dengang.
>> Som en sidebemærkning, hvor er , som kommer fra?
Nå, minde om, at hver gang vi kompilere program, alle disse ting er
blive udskrevet.
Så vi vil vende tilbage til dette.
Men igen, gør er et hjælpeprogram, automatiserer processen med udarbejdelse af
kører faktiske compiler kaldet klang.
Denne ting, vil vi i sidste ende se, har at gøre med debugging med en speciel
program kaldet debugger.
Dette har at gøre med at optimere kode - mere om det i fremtiden.
Std = C99 -
dette betyder bare bruge 1999-udgaven af C. C har været omkring endnu længere end
det, men de gjorde nogle nice ændringer 10 plus år siden.
>> Og her er de relevante virksomheder.
Vi siger gøre noget, tidligere ville have været en advarsel
en fejl forhindrer eleven fra kompilering.
Og vægorganer gøre det for en hel masse ting, ikke
netop relateret til variable.
Og så lad mig rulle til slutningen af ​​denne linie.
Og også dette vi vil i sidste ende komme tilbage til.
Dette er naturligvis navnet filen jeg kompilering.
Det minder om navnet på filen Jeg udsender som navnet
min kørbar program.
Dette-lcs50 betyder blot bruge CS50 bibliotek og eventuelle nuller og ettaller, der
personalet skrev og kompileret tidligere dette år, integrerer
dem ind i mit program.
>> Og nogen vide, hvad-lm er?
Det er den matematiske bibliotek, som er der bare selvom du
ikke gør nogen math.
Det er bare automatisk forudsat os ved at gøre.
>> Nå, lad mig gøre et andet eksempel her ved at åbne en ny fil.
Og lad mig gemme denne ene som string.c.
Det viser sig, at når vi taler om data typer i dag, er der endnu mere
foregår under hætten end vi har set hidtil.
Så lad mig hurtigt gøre en hurtig program.
Medtag stdio.h.
Og jeg vil gemme det.
Og du ved, jeg ikke gør så lad samme fejl igen og igen.
Medtag cs50.h.
Og lad mig gå videre nu og gør int main (void).
>> Og nu vil jeg bare ønsker at gøre et program der gør dette - erklære en streng
kaldet s og få en streng fra brugeren.
Og lad mig gøre lidt vejledningen her -
bedes du give mig en snor - så brugeren ved, hvad de skal gøre.
Og så hernede under dette, Jeg ønsker at gøre følgende -
til int i bliver nul.
Igen, dataloger typisk begynder at tælle ved nul, men vi kunne
gør, at man, hvis vi virkelig ønskede.
Nu vil jeg lave jeg er mindre end strengen længde sek.
Så strlen -
S-T-R-L-E-N -
igen, det er kortfattet, fordi det er nemmere at skrive, selvom det er en
lidt kryptisk.
>> Det er en funktion, vi har ikke brugt før, men bogstaveligt gør det -
tilbage til mig et tal, der repræsenterer længden af ​​strengen
at brugeren har indtastet.
Hvis de har skrevet i hej, det ville vende tilbage fem, fordi der er fem
bogstaver i Hello.
Derefter på hver iteration af denne løkke, jeg plus plus.
Så igen en standard konstruere selvom du er ikke helt for godt eller
fortrolig med det endnu.
>> Men nu hver iteration af denne løkke, mærke til, hvad jeg har tænkt mig at gøre.
Jeg ønsker at gå videre og udskrive ud af en enkelt karakter -
så% c backslash n på en ny linje.
Og så ved du hvad jeg ønsker at gøre?
Uanset ordet er at brugeren skriver i, ligesom hej, jeg ønsker at udskrive
H-E-L-L-O, ét tegn pr linje.
Med andre ord, vil jeg til at komme på enkelte tegn i en streng,
hvorved indtil nu en streng har netop været en sekvens af tegn.
>> Og det viser sig, jeg kan gøre s, konsol I tæt beslag, luk
parentes, semikolon.
Og jeg behøver at gøre én ting mere.
Det er i en fil kaldet string.h at strlen deklareres.
Så hvis jeg ønsker at bruge denne funktion, Jeg har brug for at fortælle compiler,
forventer at bruge det.
Lad mig nu gå videre og gøre det program kaldet strengen.
Dot, skråstreg, streng.
>> Giv mig en streng.
Jeg vil gå videre og skrive det.
Hej, i alle caps, Enter.
Og nu mærke til jeg har udskrevet dette et tegn efter den anden.
Så den nye detalje her er, at en streng, ved slutningen af ​​dagen, kan være
tilgås ved hjælp af dens individuelle tegn ved at indføre pladsen
beslag notation.
Og det er fordi en streng nedenunder hætten er faktisk en sekvens af
tegn.
Men hvad er pæne om dem er i computerens RAM -
Mac, pc, uanset hvad det er - de er bogstaveligt tilbage til tilbage til tilbage -
H-E-L-L-O -
på individuelt, der støder op bytes i hukommelsen.
>> Så hvis du ønsker at få ram på den ottende byte, som i denne sløjfe ville være
beslag nul, beslag én, konsol to, beslag tre beslag fire -
der er nul indekseret indtil fem -
der vil udskrive H-E-L-L-O på sin egen linje.
>> Nu, som en teaser, så lad mig vise dig slags ting, du vil i sidste ende blive
stand til at forstå, i det mindste med nogle close leder.
For én, vi hvad indeholdt i dagens eksempler, hvis du gerne vil, er faktisk
en af ​​de allerførste jailbreaks til iPhone.
Jailbreaking betyder revner telefonen så du kan faktisk bruge det på en
anden transportvirksomhed eller installere din egen software.
Og du vil bemærke dette ser helt kryptisk, mest sandsynligt.
Men se på dette.
IPhone var tilsyneladende revnet med en for-løkke, en hvis betingelse, en ellers
tilstand, en flok af funktioner vi har ikke set.
>> Og igen, vil du ikke første øjekast formentlig
forstå, hvordan dette virker.
Men alt det, vi slags tage for givet i vores moderne liv
faktisk tendens til at reducere endog til en vis af disse fundamentale vi har været
ser på.
Lad mig gå videre og åbne en andet program, holloway.c.
Så dette også er noget, du burde ikke rigtig kender.
Selv ingen af ​​personale eller jeg kunne formentlig finde ud af dette ved at se på
det, fordi det var en kode der blev indgivet til, hvad der er
historisk kendt som en korrumperet C konkurrence, hvor du skriver et program
der kompilerer og kører, men er så pokkers kryptisk intet menneske kan forstå, hvad
det kommer til at gøre, indtil de faktisk køre den.
>> Så ja, hvis man ser på dette kode, ser jeg en switch.
Jeg ser main.
Jeg ser disse firkantede parenteser indebærer en form for en matrix.
Er der nogen der ønsker at gætte, hvad dette program faktisk
gør, hvis jeg kører Holloway?
Ja.
OK.
Godt gået.
Så kun de ansatte, og jeg kan ikke regne ud af, hvad disse ting gør.
>> Og nu endelig, lad mig gå videre og åbne op et andet program.
Denne ene -
igen, vil vi gøre kildekoden tilgængelig online - det ene er bare
slags smuk at se på.
Alt, hvad de gjorde, er ramt space bar ganske lidt.
Men dette er virkeligt kode.
Så hvis du tror, ​​det er smuk, hvis vi faktisk køre dette på prompt,
sidste ende vil du se, hvordan vi kan gøre ting som dette.
>> Så vi vil forlade dig på dette notat og se dig på onsdag.
>> [MUSIC Playing]
>> SPEAKER 2: På det næste CS50, TFS iscenesætte et mytteri.
>> SPEAKER 3: Der er han.
Få ham!
>> [MUSIC Playing]