[Powered by Google Translate] [Uke 2, Fortsatt]
[David J. Malan, Harvard University]
[Dette er CS50. - CS50.TV]
OK. Dette er CS50, og dette er slutten av uke 2.
Hvis du forventer å være sulten på denne tiden i morgen,
vet at vi kommer til å innkalle som en liten gruppe i morgen, torsdag, 1:15 pm.
Det er denne nettadressen her hvis du ønsker å RSVP.
Plassen er begrenset, så tilgi hvis skjemaet er fylt opp av den tiden du fyller ut dette.
En annen URL, men som kan være av interesse er dette.
I omtrent en måneds tid, er kurset skal gjøres tilgjengelig
desto mer grovt via EDX, via som folk på internett vil være i stand til å følge med,
drive emnet ganske aktivt, faktisk.
De skal bruke CS50 Appliance og CS50 Diskuter
og de fleste av de ulike dataverktøy som vi allerede har brukt dette semesteret.
Og ett av tiltakene vi ønsker å ta på som et eksperiment i år
er å se hvor mye innhold vi kan oversette
i andre muntlige og skriftlige språk.
Så hvis du kan ha en interesse i å delta i dette prosjektet
hvor vi vil gi engelsk utskrifter og undertekster for kursets forelesninger
og shorts og seminarer og seksjoner og lignende,
hvis du snakker flytende eller skrive flytende et annet språk,
vi vil gjerne engasjere deg i dette prosjektet hvor du tar på en eller flere av videoene,
oversette dem til et språk du kjenner ganske godt.
>> For å gi deg en følelse av grensesnittet, er det denne web-basert brukergrensesnitt
at vi skal bruke som vil skape hovedsak en UI som dette.
Dette ble meg å undervise noen Halloween siden,
og på den høyre side det i sort ved siden av disse tidsstempler,
vil du se de forskjellige tingene som kom ut av munnen min den dagen,
og deretter under det vil du være i stand til å oversette til et annet språk
nøyaktig hva kartleggingen er mellom, i dette tilfellet, engelsk og, si, spansk.
Så det er faktisk en veldig brukervennlig verktøy.
Du kan spole tilbake og spole fram svært lett med hurtigtaster.
Så hvis du ønsker å ta del i dette eksperimentet, og har dine ord sett og lest
ved potensielt tusenvis av folk der ute, gjør du gjerne delta.
Ett ord om kattunge fra mandag.
Så vi har sendt en altfor skremmende melding, innser det, som kontortid foreslår
og som deler foreslår, er utformingen av kurset veldig mye
å ha studenter samarbeider og snakker til å arbeide gjennom oppgavesett
og problemer sammen, og egentlig linjen bare kommer ned til,
igjen, bør arbeidet du til slutt sende være din egen.
Og så helt ærlig, i kontortiden er det helt normalt,
det er helt å forvente enda, skal chatte med noen venn ved siden av deg.
>> Hvis han eller hun sliter med noen tema og du liker,
"Å, vel, la meg gi deg et glimt av noen linje med kode som jeg skrev," det er greit,
det skjer, og det er veldig mye bidrar, tror jeg, med prosessen med læring.
Hvor linjen blir krysset er når hodet er liksom vippet over her for altfor mange sekunder
eller minutter for at virkelig å ha fått en Unblocking mulighet for din venn,
og sikkert når ting blir utvekslet via e-post og Dropbox og lignende,
det er for linjen.
Så for all del føler deg komfortabel og føler oppfordres til å chatte med venner
og klassekamerater om psets og flere og bare innse at det du til slutt sende
burde egentlig være et produkt av din kreasjon og ikke noen andre.
Og så en av de domene-spesifikke problemer for pset2,
som vil komme ut sent i morgen kveld, er å dykke inn i verden av kryptografi,
som er kunsten for kryptering eller scrambling informasjon,
og dette gjelder til slutt til en verden av sikkerhet.
Nå kommer sikkerheten for de fleste av oss i form av ganske dagligdagse mekanismer.
Alle av oss har brukernavn og passord,
og alle av oss har svært dårlige brukernavn og passord, mest sannsynlig.
>> Hvis passordet er det samme på flere nettsteder, det er nok ikke den beste ideen,
som vi vil diskutere mot semesters slutt.
Hvis passordet er skrevet på en klistrelapp - ingen spøk - på skjermen,
som er for ikke nødvendigvis den beste design, men ganske vanlig fenomen.
Og hvis du ikke bruker kryptografi for å kryptere passordene dine,
de er spesielt sårbare.
Så hvis du tror du er super flink ved å ha en skjult Word-dokument
et sted på harddisken din som har alle passordene dine
men det er i en mappe som ingen kommer til å se på, som også er ikke en veldig sikker mekanisme.
Og så hva pset2 vil introdusere er denne kunsten kryptografi
og scrambling informasjon slik at ting som passord er alle mer sikker.
Konteksten her er at med usikre data
kommer en mulighet til å kryptere den og til å rykke det.
Og så dette, for eksempel, er et eksempel på en kryptert melding.
Dette sier faktisk noe på engelsk, men det er åpenbart ikke helt opplagt.
Og vi vil komme full sirkel i dag for å erte hverandre hva denne hemmelige budskap her er.
Men i den virkelige verden av datamaskiner, ting ikke engang ser ut som de kan være engelske setninger.
For eksempel er dette hva du kan finne på en standard Linux eller Mac eller UNIX-maskin
i en fil som var en gang kalt passord fil.
>> I dag er det blitt flyttet til andre steder.
Men hvis du ser på rett sted på et system, vil du se ikke bare ditt brukernavn
eller som av andre mennesker på systemet, men vil du se en kryptert versjon av passordet sitt.
Faktisk tyder ordet krypten der at følgende ting er kryptert,
og denne serien av tilsynelatende tilfeldige bokstaver og tegn og tall, og så videre
kan dekrypteres bare generelt vite noen hemmelighet -
et hemmelig ord, en hemmelig nummer -
og så faktisk til kunsten kryptografi slutt koker ned stole av noe slag
og vite noe som noen andre gjør det ikke.
Så vi vil utforske dette i en litt mer detaljert i dag og i pset som kommer.
Og nå et ord på bestått / ikke bestått.
Særlig ettersom noen av dere har dykket inn pset1, apparatet,
og en veldig ny verden for deg selv, innser at frustrasjoner og forvirring
og bare tekniske problemer er ganske å forvente,
spesielt med den første pset, der det er bare så mye nytt,
bare å bli kjent med ls og cd og alle disse uforståelige kommandoer
og et nytt miljø, og som er atskilt fra selve materialet og programmering selv.
Så skjønner også at det er sikkert kontortid som eksisterer som en støtte struktur.
>> Seksjoner begynner førstkommende søndag.
Men viktigst av alt, hvis du føler bare at dette er ikke verden for deg,
innse at det virkelig tar bare tid.
Og var det ikke for denne muligheten år siden for meg for å ta en klasse bestått / ikke bestått,
ærlig, jeg ville aldri ha selv satt foten i klasserommet.
Og du kan endre dette frem til, sier den femte mandag av kurset,
så hvis du er på kanten nå, innser at heller enn hodet inn i noen andre farvann helt,
gjør absolutt vurdere å bare bytte til bestått / ikke bestått.
Igjen, det er jo ikke denne kulturen her på Harvard for å ta ting bestått / ikke bestått
siden alle ønsker virkelig å oppnå eller overgå,
men ærlig, er dette en flott måte å prøve noe ut
som kanskje ikke er kjent for deg, og du vil ende opp med å gjøre, i de fleste tilfeller, ganske fine,
kanskje mye å overraske din.
Og i mer konkret hva jeg tror bestått / ikke bestått generelt gjør,
spesielt som du kanskje har opplevd med pset0,
hvis du setter på 10 timer, 15 timer, 25 timer i noen pset
og du bare stanger hodet mot veggen og det blir super sent på kvelden
men du har tatt pset 90% av veien, og du bare ikke kan finne ut en ting,
bestått / ikke bestått virkelig tar kanten av en klasse som dette,
hvor du kan liksom gjerne si: "OK, jeg vet det er ikke perfekt,
men jeg jobbet ræva av meg på dette, jeg er ganske fornøyd med hvor det endte opp, "
og som vil oppfylle forventningene for bestått / ikke bestått.
Så hold det i tankene. OK.
>> Så de av dere som har kjempet for å bruke Harvard University Wi-Fi,
vet at det er en CS50 SSID, en Wi-Fi-tilkobling, flyter rundt
at du kan ha bedre lykke til.
Det er litt ironisk at passordet for dette, hvis du ønsker å prøve å koble til dette
for bedre hastigheter - og la oss få vite om det er noe bedre - er 12345, hele veien opp til 8
fordi 8 er sikrere enn 5.
Så hvis du trenger Wi-Fi passord, koble til CS50 trådløst her, 12345678,
og innlegg på CS50 Diskuter hvis du fortsatt har intermitterende tilkoblingsproblemer,
og vi vil gi krefter som skal vite for denne plassen. OK.
Så en rask teaser, spesielt for de av dere som er fan gutter eller jenter av alle ting Apple.
Hva jeg gravd opp fra et par år tilbake var denne filen her, iUnlock.c,
bare for å slags gjør mer konkret og mer komplekse
noen av de mer grunnleggende C-programmer vi har skrevet.
Så jeg åpnet opp denne filen, iUnlock.c. Det er tilgjengelig på Forelesninger siden for i dag.
På venstre side ser du en lang liste med funksjoner.
Så fyr som skrev dette skrev opp en masse funksjoner, mer enn bare main.
Han brukte en hel haug av biblioteker her, og hvis vi begynner å bla gjennom,
hva dette egentlig er er den aller første, tror jeg, sprekk for den originale iPhone.
>> Når du ønsket å jailbreak den originale iPhone, noe som betyr untether det fra AT & T
og faktisk installere spesiell programvare på den og gjøre ting som Apple ikke vil at folk skal gjøre,
noen tok seg tid til å finne ut nøyaktig hvordan de kan utnytte programvare feil,
feil, feil, i Apple-programvare, og dermed ble født iUnlock.c--
at hvis du kompilerte det på datamaskinen og installert det på en iPhone
som var koblet til datamaskinen via, sier en USB-kabel,
Dette vil gi deg administrative eller rotrettigheter på din iPhone
og lar deg gjøre ganske mye hva du vil.
Og så det har vært denne fascinerende katt og mus lek
mellom Apple og resten av verden særlig når de, som mange bedrifter,
prøv å låse sine ting ned slik at du bare kan gjøre med det hva de har tenkt.
Men takket være folk som dette og forståelsen av lavt nivå detaljer -
og i dette tilfellet C-programmering - og mange av de kjente konstruksjoner
at vi har begynt å leke med, er du i stand til å virkelig utnytte maskinvaren
på en måte se deg passform og ikke nødvendigvis noen bedriftsenhet.
Så for eksempel, har jeg ingen anelse om hva alt dette gjør,
men GetVersion høres ganske grei,
og det ser ut som dette er en funksjon som denne personen skrev.
Det tar noen form for heltall som argument, ikke returnerer noe,
men ser ut til å sløyfe med en for løkke her, og en hvis tilstand, hvis tilstanden pause,
og relaterer eller annen måte å versjonsnumre hvis vi bla nedover,
selv om mange av disse søkeordene skal være ny.
Og det er en hel masse funksjoner i her vi aldri har sett, og kanskje aldri se
i løpet av semesteret.
>> På slutten av dagen, følger det de samme regler og logikk som vi har lekt med så langt.
Så dette er altfor gammel til å knekke iPhone 3s eller 4s eller snart 5s disse dager,
men vet at det er alle veldig mye avledet fra denne verden som vi har dykket inn.
La oss ta en titt på en litt mer enkelt eksempel:
dette, bare for å få varme opp med noen syntaks og også noen andre datatype
som vi har snakket om, men har egentlig ikke sett i C.
Dette er en fil som heter positive1.c, og per kommentarene på toppen,
dette krever bare at en bruker har et positivt tall.
Så det er et eksempel på en do-while loop, som er fint for brukeren interaktive programmer
hvor du trenger å fortelle brukeren om å gjøre noe,
og hvis de ikke samarbeider du kjefte på dem eller avvise deres innspill.
Case in point: Jeg kommer til å gjøre linjene 19 til og med 24
så lenge brukeren ikke har gitt meg et positivt tall.
Denne detaljen her på linje 18, hvorfor jeg erklærer n over hele denne looping konstruere
i motsetning til rett ved siden av linje 22 hvor jeg faktisk har lyst til å få n? Ja.
[Student] Scope. >> Ja, så denne utgaven av omfanget.
Og i lekmann vilkår, hva omfanget refererer til?
Ja. >> [Uhørlig student respons] >> Kan du snakke litt høyere?
[Student] Hvor du kan få tilgang til variabelen. >> Perfect.
Hvor du kan få tilgang til en bestemt variabel.
Og generelt, tommelfingerregelen hittil har vært at omfanget av noen variable
defineres av de nyeste klammeparentes som du har sett.
>> Og så i dette tilfellet, hvis jeg har gjort feil i å erklære n på linje 22, ville den linjen fungere.
Jeg ville få en int, og jeg ville sette det inn i den variable n på linje 22,
men hvilken linje med kode ville nå har ingen anelse om hva jeg snakker om? >> [Student] 25.
[Malan] 25, og det viser seg 24 så vel fordi i dette tilfellet faller det utenfor klammeparentes.
Så bare en liten bit av en ordensforstyrrelser, men veldig enkelt løses ved å erklære den variable
utenfor selve funksjonen.
Vi får se senere i dag kan du gå ett skritt videre
og du kan selv få litt lat.
Og dette er ikke å anbefale generelt, men du kan selv få lat
og sette en variabel globalt, så å si, ikke på innsiden av en funksjon, ikke inne i en løkke,
men i selve filen, utenfor alle funksjoner du har skrevet, som jeg gjorde her på linje 15.
Dette er vanligvis mislikt, men at dette er en løsning noen ganger til andre problemer,
som vi vil til slutt se.
Så for nå skal vi la det som dette, men la oss se om vi kan omskrive dette
bare å begynne å uttrykke oss litt annerledes.
Dette programmet, bare for å være klar, er positive1.
La meg gå videre her og i min terminal-vinduet gjør positive1, Enter.
Sammenstiller greit. Jeg kommer til å kjøre positive1, trykk på Enter.
Jeg krever at du gir meg et positivt heltall. Jeg vil si -1. Som ikke fungerte.
0, 99. Som synes å fungere.
Kanskje ikke den mest grundige testen, men minst det er en fin sunn fornuft sjekk
at vi er på rett spor.
>> Så nå la meg gå videre og åpne versjon 2 av dette,
og hva er annerledes allerede?
Det implementerer det samme, men hva hoppe ut som klart annerledes denne gangen?
Dette bool i grønt. Det er uthevet i grønt, dette søkeordet kjent som bool, som er en datatype.
Det kommer ikke innebygd i alle versjoner av C.
Du trenger å inkludere et bestemt bibliotek.
I vårt tilfelle, inkludert jeg CS50 biblioteket slik at vi har tilgang til bool.
Men i linje 18, synes vi å ha en boolsk verdi her kalt takknemlig.
Jeg kunne ha kalt dette noe, men jeg kalte det takknemlig
bare for å slags formidle noe semantisk mening.
Så først på linje 18, er jeg tydeligvis ikke takknemlig
fordi den boolske verdien takknemlig er initialisert til false i linje 18.
Og det synes det jeg har gjort her i linjer 21 til 23
er jeg bare slags omskrevet min logikk.
Så ingen funksjonelt forskjellige, men i linje 22 nå jeg sjekke om int brukeren har gitt
er større enn 0, så jeg bare endre verdien av takknemlig til sann.
Og hvorfor gjør jeg det? Fordi i linje 25, tilsynelatende jeg kommer til å sjekke en tilstand.
Gjør dette løkke mens takknemlig er falsk.
Så jeg foreslo dette som et alternativ til versjon 1
fordi det er i alle fall litt mer intuitivt kanskje er det litt mer jordet på engelsk.
Så gjør du følgende mens du ikke takknemlig eller mens takknemlig er falsk.
Og denne gangen også jeg tydeligvis ikke lyst til å huske hva brukeren skrev i
fordi varsel er det ingen variabel n, så egentlig en liten hvit løgn der.
>> Funksjonelt, er programmet litt annerledes når vi kommer til bunns i det
fordi jeg ikke husker hva n er.
Men jeg ønsket å demonstrere her også at selv om vi har sett GetInt
og GetString som brukes på den høyre side av et likhetstegn hittil
slik at vi husker verdien, teknisk, det er ikke strengt nødvendig.
Hvis en eller annen grunn bare ikke bryr seg å lagre verdien,
du bare ønsker å sjekke verdien merke til at vi bare kan skrive dette som GetInt,
åpen paren, nær paren.
At funksjonen skal returnere en verdi, som vi har sagt.
Det kommer til å gi deg tilbake en int.
Og så hvis du mentalt tenker på at dette skjer,
når jeg skriver i 99, returnerer GetInt tallet 99,
og så konseptuelt, er det som om min kode var faktisk dette.
Så hvis 99 er faktisk større enn 0, så takknemlig blir sant,
deretter linje 25 innser ooh, vi gjort fordi jeg er nå takknemlig,
og i linje 26, vi bare si: "Takk for den positive heltall!"
hva det har skjedd å være.
Nå la oss gjøre litt syntaktisk sukker her, så å si.
La oss se om vi kan rydde opp denne linjen 25 med denne tredje og siste varianten i positive3.
>> Legg merke den eneste forskjellen nå er hvilken linje av koden? >> [Student] 25. >> [Malan] Yeah, 25 år.
Og vi har ikke egentlig sett dette trikset ennå, men vi fikk se utropstegnet på mandag,
som betegner hva? >> [Student] Not. >> Ikke eller negasjon.
Så ta en boolsk verdi og sprelle med verdi.
Sant blir usann, blir falsk sant.
Så dette, ville jeg foreslå, er enda litt mer intuitiv måte å skrive koden
fordi jeg fortsatt initialisere takknemlig for falsk, jeg fortsatt gjøre følgende,
Jeg satt takknemlig å true når den tid kommer,
men nå kan du egentlig bare oversette denne koden verbalt venstre til høyre,
while (takknemlig!), fordi bang eller utropstegn betegner begrepet ikke,
så mens ikke takknemlig.
Så igjen, har vi ikke innført noen nye konsepter per se.
Vi snakket om boolske tilbake når vi spilte med Scratch,
men innser nå kan vi bare begynne å skrive vår kode på mange forskjellige måter.
Så spesielt i pset1 hvis du er liksom sliter med å finne ut en måte å skrive noen program,
oddsen er har du flaks fordi det kan være en rekke løsninger
at du kan skje på.
For eksempel er dette bare 3 for selv de enkleste programmene. OK.
Og nå husker på mandag dro vi på dette notatet med retur verdier.
Så for aller første gang skrev vi et program som ikke bare har viktigste;
det har også sin egen egendefinert funksjon som jeg skrev her.
Så i tråd 31 gjennom 34 har jeg implementert en kube funksjon.
Det er ikke komplisert. Det er bare en * en * en i dette tilfellet.
Men det som er viktig om det er at jeg tar inn i form av en
og jeg er tilbake ut i form av a * a * a.
Så nå har jeg muligheten, mye som jeg brukte til med prinf alene,
å kalle denne funksjonen ved å kalle kuben funksjonen.
>> Og kuben funksjonen tar noen innspill, og kuben funksjonen returnerer noen utgang.
Derimot, printf bare gjorde noe.
Det kom ikke tilbake noe som vi brydde seg om, selv om som en side gjør det returnere en verdi;
du bare generelt ignorere det.
Printf bare gjorde noe. Den hadde en bivirkning av utskrift til skjermen.
I motsetning her, har vi kuben funksjon, som faktisk returnerer noe.
Så for de som er kjent med dette, er det en ganske grei idé.
Men for de mindre kjent med denne ideen om bestått i innganger og komme tilbake utganger,
la oss prøve bare noe super enkelt.
Er noen komfortabel kommer opp på scenen kort?
Du må være komfortabel med et kamera på deg også. Ja? Okay.
Hva heter du? >> [Student] Ken. >> Ken. OK. Ken, kom opp.
Ken kommer til å være en funksjon av sorterer her.
La oss gå videre og gjøre dette. La oss få litt fancy.
Hyggelig å treffe deg. Velkommen til sentrum scene. OK.
La oss hit på denne knappen her. OK.
Så her har du en moderne tavlen,
og hva jeg er den viktigste funksjon, for eksempel,
og jeg har ikke en iPad i hånden.
>> Jeg vet egentlig ikke huske hvordan du - Vel, jeg kan ikke si det.
Jeg har egentlig ikke god håndskrift,
og så derfor jeg vil at du skal skrive ut noe på skjermen for meg.
Jeg blir hovedprogrammet, og jeg kommer til å ha dere si dette
ved å skrive det i min kylling scratch og deretter passerer du en inngang.
Så dumt om denne øvelsen er, oppfatningen av funksjoner og ringer en funksjon
og returnere en funksjon egentlig koker ned til dette.
Jeg er viktigste, jeg har nettopp skrevet printf, sitat-unquote noe på skjermen,
Jeg kjører dette programmet, og så snart printf blir kalt,
det tar ett argument eller en parameter noen ganger mellom doble anførselstegn.
Her er det argumentet. Eg gir den til Ken.
Han er en svart boks skrevet et antall år siden
som tilsynelatende vet bare hvordan du skriver ut ting på skjermen.
Så kjøre.
Det er ikke dårlig. Veldig bra.
Så nå Ken gjøres utfører. Trenger han å gi meg noe tilbake?
Ikke at vi har sett så langt.
Igjen, ikke printf faktisk tilbake et nummer, men vi kommer til å ignorere det for nå
fordi vi aldri har brukt det. Så det er det for Ken.
Og så nå main tar kontroll over programmet på nytt
fordi det kodelinje, printf, gjøres utfører.
Og vi gå om vår måte, utfører hva andre linjer er der.
Så nå skal vi prøve en litt annen eksempel.
Denne gangen her la oss først tømme skjermen, og denne gangen skal vi gjøre det cubing funksjon,
men denne gangen, jeg forventer en produksjon verdi.
>> Så la oss gå videre og gjøre dette.
Nå har jeg en linje med kode som sier x blir kube av x.
Kodelinjen, tilbakekalling, ser slik ut: x = cube (x);
Så hvordan dette kommer til å fungere? La oss gå videre og gi deg en hvit skjerm igjen.
Jeg kommer til å skrive ned nå verdien av x,
som på dette tidspunkt måtte være, la oss si, 2 for å holde det enkelt.
Jeg har skrevet ned på et stykke papir verdien 2, som er min verdi x.
Jeg leverer den til Ken. >> Og jeg bare skrive svaret? >> Ja, la oss bare skrive svaret.
Okay. Og nå har han å returnere meg noe. Perfekt. Hyggelig segue.
Så nå er han rekker meg tilbake verdien av 8 i denne saken, og hva gjør jeg med det?
Faktisk - la oss se, får denne retten. Hva skal jeg gjøre med det?
Nå skal jeg ta denne verdien, og faktisk lagre den i de samme bitene i minnet.
Men merker jeg er litt sliter her.
Jeg er litt forvirret fordi der jeg faktisk skrive verdien av x,
fordi det jeg har nettopp gjort er fysisk hånd Ken et stykke papir som hadde verdien 2,
som var x, og faktisk, det er nettopp det som skjedde.
Så det viser seg at når du kaller funksjonen og du passerer i en krangel
som hallo, verden eller du passerer i en krangel som 2,
generelt, du passerer en kopi av argumentet.
Og så akkurat som jeg skrev ned nummeret to her og ga den til Ken,
det må bety at jeg fortsatt har en kopi av verdien 2 sted
fordi faktisk, nå som jeg har fått tilbake verdien 8, jeg trenger å gå tilbake i RAM
og faktisk skrive ned 8 der jeg en gang hadde nummer 2.
Så visuelt, husk dette begrepet bestått i, bokstavelig talt, en kopi av verdien.
>> Ken gjør sin ting, gir meg noe tilbake - i dette tilfellet en verdi som 8 -
og da må jeg gjøre noe med den verdien hvis jeg ønsker å holde det rundt.
Så alt dette vil komme tilbake for å være altfor kjent før lenge.
Takk så mye for denne demoen her, Ken. [Applaus]
Veldig godt gjort.
La oss se hvordan det til slutt gjelder noen av funksjonen ringer at vi har gjort her.
La meg gå videre og bringe oss tilbake til den cubing eksempel her.
Legg merke til at hvis vi ønsker å faktisk begynne å ta dette videre,
Vi er nødt til å være oppmerksom på det faktum at antall x som blir vedtatt her
er forskjellig fra det som faktisk blir vedtatt i til funksjonen.
Så igjen, dette passerer kopi kommer til å bli ganske germane på bare et øyeblikk.
La oss ta en titt på noe som ikke helt fungerer riktig ennå.
Jeg kommer til å gå videre og åpner en tredje buggy eksempel, som er feil av natur,
og det heter buggy3 og den implementerer en byttering funksjon.
Her har vi en hovedfunksjon som har x og y vilkårlig initialisert til 1 og 2, henholdsvis.
Vi kunne bruke GetInt, men vi trenger bare en enkel øvelse,
så det er hardkodet som 1 og 2.
I linjer 21 og 22, men for tilsynelatende skrive ut x og y, 1 per linje.
Så på linje 23, hevder jeg at jeg bytte disse verdiene, dot, dot, dot.
Jeg tydeligvis kalle en funksjon på linje 24 såkalte swap som tar 2 argumenter.
Det er helt legitimt for funksjoner for å ta 2 argumenter. Vi har sett printf gjøre det allerede.
>> Så swap tar tilsynelatende x og y, og som navnet antyder,
Jeg håper at det kommer til å bytte disse 2 verdiene.
Så da jeg hevder på linje 25 "Byttet!" og jeg skrive x og y
under forutsetning av at de har faktisk blitt byttet.
Men hvis jeg faktisk kjøre dette programmet - la meg åpne opp en terminal vindu,
la meg gjøre buggy3 - som navnet antyder, er dette ikke kommer til å ende godt
fordi når jeg trykker Enter merke til at x er 1, y 2,
og ennå på slutten av programmet, er de fortsatt, faktisk, det samme.
Så basert på demonstrasjonen akkurat nå med Ken, hva som faktisk skjer?
La oss dykke inn i denne swap-funksjon. Det er super kort. Det er bare noen få linjer med kode lang.
Men hva er det grunnleggende problemet basert på det enkle historien fortalt her oppe med Ken?
Hvorfor er swap brutt?
[Student] Du lagrer en kopi, ikke variabelen.
Akkurat. Vi lagrer en kopi, ikke variabelen selv.
Med andre ord, tar swap tilsynelatende to argumenter, en int,
og det vilkårlig kalles a og b,
og opp her har jeg passert i x og y, som er henholdsvis 1 og 2,
men jeg er ikke bokstavelig talt passerer i x, jeg er ikke bokstavelig passerer y,
Jeg passerer en kopi av x og en kopi av y.
Det er nesten som om kopiert deg og limes inn swap
verdiene som du vil den skal faktisk manipulere.
Så hvis det er tilfelle, da jeg programstart utfører linje 35 og 36,
når jeg kommer til linje 37, på dette punktet i historien, er det verdien av en?
På dette punktet i historien, linje 37, hvilken verdi av en på dette punktet? >> [Student] 1.
[Malan] Det bør bare være en rett, fordi x ble vedtatt i som første argument,
og denne funksjonen bare vilkårlig kaller sin første argumentet en.
Tilsvarende er y det andre argumentet, og det er bare vilkårlig kaller det andre argumentet b.
>> Denne motsetningen er faktisk ganske enkelt forklart. Tenk på det.
Ingen av oss har møtt personen som skrev printf,
så sikkert, har han eller hun ingen anelse om hva våre variabler 30 år senere kommer til å bli kalt.
Så det må være et skille mellom hva du kaller variabler i funksjoner du skriver
og hva du kaller variabler i funksjoner du ringer eller bruker.
Så med andre ord, jeg har skrevet mine variabler som x og y,
men hvis noen andre hadde skrevet swap-funksjonen, kan han eller hun absolutt ikke ville vite
hva mine variabler kommer til å bli kalt,
så skjønner at dette er grunnen til at du har denne dualiteten av navn.
Teknisk sett kunne jeg gjøre dette ved en tilfeldighet,
men de ville fortsatt være bestått som kopier.
Det ville bare være en ren tilfeldighet estetisk hvis den personen som skrev swap
hadde brukt de samme navnene.
Så på dette punktet i historien, linje 37, er en 1, b 2, og nå er jeg fortsette å bytte dem.
Først av alt, la meg faktisk gjør dette mye enklere.
Jeg vet ikke hva disse tre linjer med kode gjorde.
La meg bare gjøre dette: b = a; a = b; gjort.
Hvorfor er denne brutt, logisk?
Det er slags intuitiv ting, ikke sant?
Så en blir b og b blir en,
men problemet er at så snart som linje 37 utfører, hva er verdien av a og b?
Det samme, 1, fordi du har angrepet, så å si, du har endret b for å tilsvare en.
Så når linje 37 har utført, det er flott, du har nå to eksemplarer av nummer 1
innsiden av denne funksjonen, så da når du sier i tråd 38 a = b,
du slags skrudd fordi du bare tildele 1-1.
Du har slags mistet verdien du brydde deg om.
Så i den opprinnelige versjonen av dette, legge merke til hva jeg gjorde.
Jeg i stedet hadde en tredje linje med kode som så ut som dette.
Jeg erklærer en midlertidig variabel.
>> Tmp er en svært vanlig navn på en midlertidig variabel, og det er en int
fordi den har for å matche det jeg ønsker å lage en kopi av.
Jeg lagrer kopi av en innsiden av tmp, så når linje 37 har utført,
verdien av en er - rask tilregnelighet sjekk - 1, er verdien av b 2,
og verdien av tmp er også en.
Så nå er jeg utføre linje 38.
Gang linjen 38 utfører, tar en på verdien av b. Og b var 2, slik at en er nå 2.
Så på dette punktet i historien, er en 2, er b 2, og tmp er 1,
så nå logisk, kan vi bare plop tmp verdi i b og vi er ferdige.
Så vi har løst det problemet.
Dessverre, når jeg kjører dette programmet i dette skjemaet, er det ikke egentlig bytte noen verdier.
Men for å være klar, hvorfor?
Jeg fikset den logiske problemet fra bare et øyeblikk siden,
men igjen, hvis jeg kjører dette programmet, x og y uendret
innen utgangen av programmets gjennomføring.
[Uhørlig student kommentar] >> Vi har ikke returnert noe, så det er sant.
Men det viser seg at det er litt av et problem her fordi så langt,
Det eneste vi har vært i stand til å returnere er en ting, og dette er en begrensning av C.
Du kan bare returnere virkelig en verdi, i hvilket tilfelle jeg er litt stuck her
fordi jeg kunne gå tilbake den nye verdien av x eller jeg kunne gå tilbake den nye verdien av y,
men jeg vil begge tilbake.
Så tilbake ikke er den enkle løsning her.
Men problemet er fundamentalt hvorfor? Hva har vi egentlig byttet?
[Student] a og b. >> A og b.
Men a og b er kopier av x og y, som betyr at vi bare gjorde alt dette arbeidet,
Vi brukte bare 3 minutter å snakke om swap-funksjonen og alle 3 av disse variablene,
og det er flott, helt riktig isolert
men a og b omfang er bare i disse linjene her.
>> Så akkurat som en for loop, hvis du deklarerer et heltall jeg inne for loop,
Tilsvarende, hvis du erklære a og b innsiden av en funksjon som du har skrevet,
de er bare gyldig innsiden av den funksjonen, noe som betyr så snart swap er gjort gjennomføre
og vi går fra linje 24 til linje 25, har X og Y ikke er endret i det hele tatt.
Du bare kastet bort en hel masse tid bytte kopier av variabler.
Så det viser seg at løsningen på dette er faktisk ikke opplagt.
Det er ikke helt tilstrekkelig til å returnere verdier fordi vi bare kan returnere en verdi,
og jeg virkelig ønsker å bytte både x og y på samme tid,
så vi er nødt til å komme tilbake til dette.
Men for nå, innser at problemet fundamentalt avledet fra det faktum at a og b er kopier
og de er i sin egen omfang.
La oss prøve å løse dette på noen måte.
La meg faktisk bla tilbake hit og åpne opp, la oss si, en fjerde variant av dette, buggy4.
Hva med dette?
Dette er en lignende, men enklere problem å se på før vi tar en stikke på å løse det.
Dette programmet kalles tilvekst, og det tilsynelatende initialiserer en x heltall til en i linje 18.
Jeg så hevder x er en, jeg da kreve "økes ..."
Jeg deretter ringe tilvekst, men da i linjene 22 og 23, jeg hevder det er blitt økes,
Jeg hevder x er nå hva det er - 2, formodentlig - men dette programmet er buggy.
Hva er problemet?
Ja. >> [Uhørlig student respons] >> Nettopp.
Så x har blitt erklært, selvsagt, på linje 18.
Som er inne viktigste er klammeparentes.
Så det enkle svaret her er at mens x finnes her,
det finnes ikke i linje 32, så dette programmet faktisk ikke engang kompilere.
Kompilatoren når jeg prøver å kompilere denne koden kommer til å kjefte på meg
om noen svart identifikator eller noe om dette. Faktisk, la oss prøve.
Dette er å buggy4. Det er det.
Bruk av svart identifikator 'x' i linje 32.
Og faktisk, la oss være mer eksplisitt her i dag, slik at dette er nyttig
i kontortiden og hjemme.
>> Legg merke til at det er litt kryptisk skrevet.
Men det faktum at Clang har skreket til oss, sier buggy4.c: 32:5, faktisk er nyttig.
Det betyr at feilen er på linje 32 ved tegnposisjon 5.
Så 1, 2, 3, 4, 5. Det er, faktisk, hvor problemet er.
Og også, også, husk på kontortid og hjemme, jeg er heldig her.
Jeg har en feil. Det kommer til å være relativt enkelt å fikse.
Men hvis du får en hel skjerm full av overveldende feilmeldinger,
igjen innse at den nederste man kan bare være symptomatisk for den øverste ett.
Så alltid jage ned bugs fra toppen og ned
fordi det kan bare være en seriekoble effekt
som tyder du har mye mer problemer enn du faktisk gjør.
Så hvordan kan vi fikse dette hvis mitt mål er å øke x? >> [Student] Lag x global.
Ok, så vi kan gjøre x global.
La oss ta snarveien som jeg advarte om tidligere, men pokker, vi trenger bare en rask løsning,
så la oss bare si int x opp her. Det gjør x global.
Så nå main har tilgang til det og tilvekst har tilgang til det,
og så la meg gå videre og kompilere dette nå.
Gjør buggy4, Enter. Synes å kompilere nå.
La oss kjøre buggy4. Og det ser ut til å faktisk fungerer.
Dette er en av disse tingene som er gjøre som jeg sier, ikke som jeg gjør,
som jeg nettopp har gjort her, fordi generelt,
våre programmer kommer til å få mye mer interessant og mye lenger enn dette,
og hvis din løsning på livets problemer er satt bare alle variablene på toppen av filen,
svært raskt gjør programmene får horrifically vanskelig å administrere.
Det blir vanskeligere å finne på nye variabelnavn,
det blir vanskeligere å forstå hva variabel som gjør hva,
og så generelt, dette er ikke en god løsning.
Så la oss gjøre dette bedre.
Vi ønsker ikke å bruke en global variabel her.
>> Jeg ønsker å øke x, så jeg kunne selvsagt -
på slutten av dagen, er denne typen av en dum historie fordi vi bare gjøre dette -
men hvis jeg ikke visste om at operatøren eller jeg fikk ikke lov til å endre det i hoved seg selv,
hvordan ellers kunne jeg gjennomføre Ken over her denne gangen ikke å kube, men å øke?
Hvordan endrer jeg denne greia her? Ja.
[Student] Pass på x og deretter returnere [hørbar] >> Ok, bra.
Så hvorfor ikke jeg passerer i x og da heller enn den tilbake,
hvorfor jeg ikke bare kommer tilbake x + 1.
Et par flere ting må endre her. Jeg er på rett spor.
Hva annet trenger jeg å finpusse? Noen andre. Ja.
[Uhørlig student respons]
Jeg trenger å endre retur type tilveksten fordi det ikke er ugyldig.
Void betyr ingenting blir returnert, men klart nå det er,
så dette må endres til - >> [student] int.
int å være konsekvent med hva jeg faktisk tilbake.
Nå noe annet, er fortsatt buggy her. Ja.
[Uhørlig student respons] >> [Malan] Så jeg trenger å øke x?
[Uhørlig student respons] >> [Malan] Ah, så jeg må passere x.
Så jeg trenger å gjøre dette her. >> [Uhørlig student kommentar]
[Malan] Så prototypen, må jeg endre dette opp her.
Så dette må bli en int, har dette å bli -
hmm, jeg har faktisk en bug her nede. La oss fikse dette først.
Hva bør dette faktisk være? Det er nødt til å være en int noe.
Det kan være x, men ærlig, hvis du begynner å ringe alle dine variablene x,
det kommer til å bli mindre og mindre tydelig hva som er hva.
>> Så la oss bare vilkårlig velge en annen navnekonvensjon for min hjelper funksjoner,
funksjonene jeg skriver. Vi kaller det en, eller vi kan kalle det -
La oss kalle det for å være enda mer eksplisitt.
Så da må jeg tilbake uansett antall er pluss 1,
og nå har jeg å endre en annen ting her oppe og en annen ting her oppe.
Hva må jeg endre på linje 21 første? >> [Uhørlig student respons]
[Malan] Jeg må tilordne den til x. Jeg kan ikke bare ringe tilvekst (x).
Jeg trenger å huske svaret ved å endre verdien av x på venstre side.
Og selv om x er nå på venstre og høyre, det er helt greit
fordi høyre side blir utført først da blir plopped inn i venstre hånd ting -
x i dette tilfellet.
Og så til slutt, er dette lett å fikse nå.
Dette bør bare matche det er der nede, int tall.
Så en hel haug av endringer for en virkelig dum funksjon
men representativ for ting som vi vil i økende grad ønsker å gjøre.
Så sørg buggy4. Jeg har skrudd opp et sted.
Herregud. Fem feil i en 6-linjers programmet.
Så hva er galt på linje 18, 5 karakter?
Så jeg må erklære dette, int.
La oss se. Det finnes en hel haug med andre feil.
Herregud - 19, 18, 21 - men igjen, la oss bare tømme skjermen, Control L her,
og kjør Clang.
Så 5 problemer er faktisk akkurat det en.
Så nå la oss kjøre buggy4, Enter. Puh, har x blitt økes riktig.
OK. Eventuelle spørsmål om hvordan å øke tallene? Ja.
[Uhørlig student spørsmål] >> Godt spørsmål.
Hvordan har det seg at jeg bare kan endre x til nummer og programmet vil vite umiddelbart?
>> Igjen, tenk på det som denne abstraksjon.
Så hvis jeg er hoved-og Ken er tilvekst, ærlig, jeg bryr meg ikke hva Ken kaller sin iPad.
Jeg bryr meg ikke hva han kaller alt som har å gjøre med hans gjennomføring av denne funksjonaliteten.
Dette er en implementering detaljer som jeg, viktigste, ikke å bry seg om.
Og så bare å endre det konsekvent innsiden av funksjon - antall her og nummer her -
er alt det tar så lang som jeg rekompilere.
Det er liksom som om du tenker på mange av oss, de av dere med førerkort
som har drevet eller hvis du har selv kjørt i en bil,
de fleste av oss har ingen anelse om hvordan en bil fungerer under panseret.
Og bokstavelig talt, hvis du åpner opp panseret, de fleste av oss - meg selv inkludert -
kommer ikke til å virkelig vite hva vi ser på,
typen som du kanskje føler med ting som dette akkurat nå.
Men vi trenger egentlig ikke å bry seg om hvordan bilen fungerer,
vi trenger ikke å bry seg hva alle de stenger og stempler og kabler inne i bilen
faktisk gjør.
Så noe som det du kaller stempelet spiller ingen rolle her i dette tilfellet. Samme idé.
Ja. >> [Uhørlig student spørsmål]
Hvis det er flere anvendelser av den variable XA øyeblikk siden,
deg, programmerer, måtte endre dem overalt.
Eller du kan bokstavelig talt gjøre Fil, Meny og deretter Finn, Erstatt - noe sånt -
men du er nødt til å gjøre disse endringene selv.
Du må være konsekvent. >> [Student] Hvis det er flere variabler [hørbar]
En spesiell rekkefølge som her, hvis dette var int annet nummer? >> [Student] Riktig.
[Malan] Yeah. Bestill teller når du ringer funksjonen.
>> Så hvis jeg skulle kalle tilvekst her med noe komma noe,
det er en direkte kartlegging.
Den første variabelen, hva det heter, er laget en kopi av det første argumentet over her.
Unnskyld. Dette bør ikke være en parentes.
Det andre argumentet på linje med andre. Så orden, ja, saker. OK.
Unnskyld. Jeg tok den lange veien for å komme dit. Andre spørsmål? OK.
Så la oss se om vi ikke kan male et bilde av hva som faktisk skjer her
under panseret, så å si.
Dette er et rektangel som kan representere datamaskinens minne.
Selv om du ikke har noen anelse om hvordan hukommelsen virker eller hvordan RAM fungerer,
minst forutsetter at du har bunter av det i disse dager.
Du har megabyte av det, har du gigabyte av det,
og vi vet fra uke 0 som en byte er bare hva? >> [Student] 8 biter.
8 biter, ikke sant? Så 8 nuller og ett.
Så hvis datamaskinen har en gig RAM, 2 gigabyte RAM i disse dager,
du har en milliard eller 2 milliarder bytes minne eller omtrent 8 milliarder kroner eller 16 milliard bits
innsiden av datamaskinen.
I motsetning til den lille Wooly Willy eksempel, er det ikke magnetiske partikler vanligvis lenger.
I økende grad - i bærbare datamaskiner minst - det er solid state-disker, SSD,
som bare har noen bevegelige deler. Det er all elektronisk. Det er all elektrisitet-basert.
Så tenk på dette rektangelet som bare representerer 1 eller 2 gigabyte minne som du har.
>> Så det er en del av minnet.
En verden av datateknologi har liksom fradeles
biter av minne til å gjøre forskjellige ting.
For eksempel, hvis dette er datamaskinens RAM, som foreslått av rektangelet der,
det viser seg at ved konvensjonen, på toppen av RAM, så å si,
er generelt det som kalles en tekst segment.
De er 0'er og 1'ere som du har samlet.
Så når vi har sett under panseret på hva a.out er,
alle disse 0'er og 1'ere, når du kjører et program,
de 0'er og 1'ere er lastet fra harddisken til noe som kalles RAM,
og i RAM de er satt på toppen.
I mellomtiden har du andre ting: initialisere data, uninitialize data.
De to ranker minne refererer til globale variabler, som du ikke bruker så ofte
men noen ganger hvis du gjør det, ender de opp der oppe også.
Så er det noen andre ting: miljøvariabler, som vi ikke vil bruke mye tid på,
men da 2 viktige ting som vil komme tilbake gjennom hele semesteret,
stack og heap.
Så de fleste av datamaskinens minne er reservert når du kjører et program
for noe som kalles stabelen og noe som kalles haugen.
Vi kommer ikke til å snakke om heap i dag, men vi vil snakke om stabelen.
Stabelen er ment å trylle frem det visuelle av matsalen matbrett i Mather House
eller hvor du tilfeldigvis være der matsalen ansatte rengjør dem hver dag,
de stable dem opp fra gulvet på opp,
og tilsvarende, i minnet, er det denne ideen om å sette noe på en stabel,
sette noe på en stabel, sette noe på en stabel.
Og hva mener vi med dette?
>> La oss zoome inn på akkurat den nedre halvdelen av dette bildet, datamaskinens RAM,
å foreslå følgende.
Det viser seg at når du kjører et program som a.out eller Hallo -
hva programmet er at du har skrevet -
igjen, de 0'er og 1'ere er lastet fra harddisken, som er langsiktig lagring,
forblir det selv når du trekker ut kontakten, lastet inn i RAM.
RAM er raskere enn harddisker - det er mindre enn harddisker -
men det er der programmene leve mens du kjører dem.
Så du dobbeltklikker et program på en Mac eller PC, er det lastet fra harddisk til RAM.
Så snart det er lastet inn i RAM, det 0'er og 1'ere gå på veien toppen,
den såkalte tekstsegment, men deretter så snart programmet faktisk begynner å kjøre,
den viktigste funksjonen kalles, og viktigste, som vi har sett, ofte har lokale variabler,
og det har ints og strenger og chars og lignende.
Så hvis programmet som du har skrevet eller programmet som du har dobbeltklikket
brukt noen variabler inne i main,
de ender opp på bunnen av bunken med minne, så å si.
Mer konkret hva dette egentlig betyr?
Dette betyr bare at hvis vi skulle nummerere bytes RAM i datamaskinen,
merke til at dette kan være bytenummer 0, kan dette være byte nummer 1, 2, 3, 4, 5, 6,
hele veien opp til 2 milliarder ville være helt der oppe på toppen.
Så med andre ord, når vi snakker om RAM eller minne i form av bytes,
det betyr bare at noen har bestemt hva de skal telle hver av disse biter av minnet.
Så når du trenger 32 bits for en int eller trenger du 8 biter for en røye,
hvor ender de opp i minnet?
>> Konseptuelt, de bare ender opp på bunnen av denne tingen kalt stabelen.
Men det som er interessant nå er når main kaller en funksjon -
anta en funksjon kalt foo, bare et tilfeldig navn -
hva som skjer er det viktigste er på bunnen av denne bunken med minne;
Foo nå er satt på toppen av hoved i minnet.
Slik at eventuelle lokale variabler som Foo har ender opp slags begrepsmessig over de i main.
Hvis foo kaller en annen funksjon kalt bar, disse variablene ende opp her.
Hvis bar kaller noe annet, her, her, her.
Så hva er interessant om hvordan du kjører et program er at når du kaller funksjoner
og som disse funksjonene kaller funksjoner og som disse funksjonene kaller funksjoner,
du bygge opp denne bunken av funksjoner i minnet.
Og bare en gang i funksjonen returnerer du begynne å få det minnet tilbake.
Så en av de enkleste måtene å kjøre ut av minnet i et dataprogram
er å skrive funksjoner som aldri tilbake.
Så for eksempel, la oss vise så mye med en bevisst buggy program.
La meg gå videre og gjøre # include ,
int main (void),
og jeg kommer til å gjøre mens (2> 1), som sannsynligvis ikke vil noensinne forandre på oss,
og la meg gå videre nå og gjøre printf.
Egentlig, det kommer til å være mindre visuelt interessant. La oss gjøre dette.
For int i = 0; i> 0 - la oss gjøre dette feil - i + +.
Og la oss ikke printf her. La oss praktisere det jeg forkynner.
La oss ha en metode her, ugyldige refreng, og vi vil si int i,
og da kommer jeg til å si printf - nei, la oss gjøre dette mer interessant.
La oss faktisk ikke skrive noe i det hele tatt. La oss bare gjøre dette: kor (i).
OK. Så dette er buggy fordi hvorfor?
Jeg gjør dette som jeg gå fordi programmet ikke gjør faktisk noe av interesse.
>> Men det er ikke målet.
Målet er å skrive et program som viktigste funksjon gjør hva, tilsynelatende?
Kalle seg. Og faktisk, trenger vi ikke loopen.
La oss selv forenkle dette bare for ikke å miste av syne virkelig grunnleggende feil.
Viktigste samtaler kor til å synge noen chorus,
så jeg gjorde noe dumt og jeg hadde kor samtale kor
fordi jeg antok noen andre skulle gjennomføre det kanskje,
og nå er dette ikke kommer til å kompilere ennå. Jeg trenger å gjøre hva?
Jeg trenger prototypen, huske.
Så jeg må ha her oppe void kor (int i);
Så nå hvis jeg går ned her - faktisk, la oss bruke større vindu.
La oss gå videre og gjøre refreng.
Bruk av svart identifikator jeg.
Å, det var dumt. Vi trenger ikke argumentet. La oss bare gjøre dette.
Jeg skulle ønske vi hadde startet på denne måten. Det ville ha vært en mye enklere program for å skrive.
Det. Nå la oss gå over til min terminal-vinduet, kjører Clang, og her vi går.
Det var virkelig rask.
Hva som faktisk skjedde, da?
Vel, nå skal jeg legge ut linjen slik at vi kan se.
La meg si printf ("Jeg er her") - ingen variabler. Vi vil la det sånn.
La meg kjøre gjøre. La meg kjøre refreng.
Og ... kom igjen. Holde det gående.
Som en side, hvorfor har det ikke krasjet ennå?
Segmentering feil skjedde super rask før.
[Uhørlig student respons] >> Nettopp. Så det tar tid å skrive ut, ikke sant?
Det tar bare mer arbeid på datamaskinen del.
Og det er det: Segmentering feil.
>> Så legge merke til hvor raskt programmene kjører.
Hvis du ikke skriver noe, super rask.
Men vi har fortsatt denne segmentering feil fordi det som skjedde?
Hvis du tenker på hvordan datamaskinens minne er lagt ut,
Dette skjer for å være viktigste, men her la oss bare kalle dette koret, og la oss kalle dette koret.
Og nå hvis jeg gjør mine estetikk rett, dette bare kommer til å si kor, kor, kor,
kor, kor, kor, kor, ad nauseum, og til slutt, hva kommer til å skje?
Hvis det store bildet, bokstavelig talt, er dette, hva skjer bare konseptuelt?
Stabelen overskridelser haugen.
Eller enda verre, du bare overkjørt alt, inkludert tekst-segmentet,
som er den 0'er og 1'ere som representerer programmet.
Kort sagt, dette er bare super, super dårlig.
Ditt program har kommet ut av kontroll.
Du bruker mye mer minne enn du hadde tenkt
alt på grunn av en dum feil i dette tilfellet,
eller i dette tilfellet en svært bevisst gjort funksjon kaller seg.
Nå, dette er ikke så verst.
Funksjoner som kaller seg faktisk har stor makt når du bruker den riktig.
Jeg har ikke brukt den riktig her.
Så dette er ikke så verst, men det faktum at jeg aldri slutte å kalle meg selv
er en grunnleggende svakhet her av dette programmet.
Så hvor skal vi med alt dette? Hva som egentlig skjer?
Når jeg kaller tilvekst funksjonen som vi gjorde i disse eksemplene,
Jeg har en verdi som en som jeg passerer i.
Jeg passerer i en kopi av nummer 1, slik at følgende skjer.
La oss gå inn i tilvekst eksempel denne fyren rett over her.
Her er hva som faktisk skjer.
Når jeg ringer tilvekst og passerer jeg i x, billedlig, hva skjer her er dette.
>> Hvis jeg har verdien av en lagret her, og jeg faktisk ringe tilvekst,
som nå kalles kor - iPad er å kaste meg av her.
La oss kalle denne tilveksten, og vi vet ikke hva dette neste funksjon skal være.
Så hva som faktisk skjer er her et sted i hoved Jeg har en del av minnet
som lagrer tallet 1.
Når jeg ringer tilvekst, jeg bruker en annen del av minnet,
men nå har jeg kopi av en.
Når jeg øke denne verdien, blir dette to,
men hva skjer så snart tilvekst avkastning?
Dette minnet bare blir sendt tilbake til operativsystemet,
som betyr at alt du har gjort er ingenting nyttig.
1 som ble opprinnelig inneholdt i main er fortsatt faktisk der.
Så hvor skal vi med dette?
Det viser seg at i minnet du har denne back-to-back sekvens av bytes
at du kan sette ting i, og det viser seg at vi allerede har sett noe
som innebærer å sette ting tilbake til rygg mot rygg til rygg.
Hva er en streng basert på uke 1, og nå uke 2?
Det er bare en samling av tegn.
Så det viser seg akkurat som du kan sette tall i minnet,
Tilsvarende kan du sette tegn i minnet.
Og når vi begynner å sette karakterer i minnet rygg mot rygg til rygg mot rygg,
det viser seg at det å bruke de enkleste ting som en for loop eller en stund loop,
Vi kan iterate fra venstre til høyre over tegnene i en streng
og begynne å massere dem inn i ulike karakterer helt -
en kan bli b, kan b bli c -
slik at til slutt, kan vi ta en engelsk setning som faktisk er fornuftig
og konvertere hver av disse brevene en om gangen
ved å gå gjennom vår datamaskinens minne venstre til høyre for å faktisk kryptere.
Så la oss ta våre fem-minutters pause her,
og når vi kommer tilbake, vil vi starte denne prosessen med scrambling informasjon.
>> OK.
Før vi dykke inn i noen krypto og disse tingene som kalles matriser,
la meg pause for eventuelle spørsmål fordi jeg føler at jeg virkelig slags forvirret
noen av disse emnene. Så la oss fikse nå hvis vi kan.
Vi bare snakket om retur verdier, snakket vi om argumenter,
og vi snakket om denne tanken, som vi vil komme tilbake til i ukene som kommer,
å vise minne som en hel haug av disse stablet skuffer, så å si,
fra bunnen på opp, slik at hver skuff som blir satt på stakken
representerer en funksjon som for tiden å bli kalt.
Eventuelle spørsmål?
La meg stille et spørsmål her.
La meg forenkle dette tilbake til hva det var før noen av våre tidligere Q & A.
Det faktum at tilveksten har åpen parentes, int antall, lukket parentes -
Hva representerer int nummer?
[Student] Et argument. >> Et argument. Okay. Men hva er et argument?
[Uhørlig student respons] >> Hva er det? >> [Student] Noe som du passerer i.
Ok, så noe som du passerer i. Og mer generelt, er det bare inngangen.
Hvis du skulle skrive en funksjon og at funksjons formål i livet
er å gjøre noe litt annerledes hver gang du bruker den,
så den eneste måten for at det skal skje virkelig synes å være å gi den med innspill
slik at den kan gjøre noe annerledes med at innspill hver gang.
>> Så du trenger å angi to ting når en funksjon tar input.
Du må angi navnet du ønsker å gi til den inngangen
rent for din egen bekvemmelighet, slik at du kan referere til den
i funksjonen som du selv skriver, som jeg gjorde her i linje 32.
Men du må også angi sin type fordi C er et programmeringsspråk
som krever bare at hvis du vil ha en variabel, må du fortelle datamaskinen hva datatype det er,
i stor grad slik at den vet hvor mange biter som skal tildeles den variabelen
fordi det kan være 6 - beklager, vil det ikke være 6.
Det kan være 16, kan det være åtte, kan det være 32, selv 64,
men datamaskinen trenger å vite.
Nå, representerer int på venstre side hva, derimot?
[Uhørlig student respons] >> Hva er det? >> [Student] Type av funksjon.
Typen av en funksjon og, mer spesifikt, den type av produksjonen. Høyre.
Så mens tingen i parentes representerer sin inngang, hvis noen,
tingen til venstre representerer sin produksjon.
Og i dette tilfellet, returnerer tilvekst tilsynelatende en int,
og så int er avkastningen type av denne funksjonen.
Hva betyr det å vende tilbake?
Bokstavelig talt, bruker du nøkkelordet retur og hvis hva du er tilbake
til høyre for søkeordet er et heltall,
så det er faktisk i samsvar med det vi har lovet.
Du kunne ikke gjøre noe som dette - Hei, verden - fordi det er en streng.
>> Selvfølgelig er det ikke et heltall.
Så kort sagt, er byrden virkelig på oss, programmerer, for å være spesifikk
om hva vi er tilbake og deretter faktisk gå om retur det.
Konteksten her nå er at datamaskinens minne er en gigabyte, 2 gigabyte -
uansett - kanskje det er mer, kanskje det er mindre,
men datamaskinen ser det som å ha forskjellige seksjoner.
Noe går der nede, går noe annet der oppe,
forskjellige ting går i midten, og i dag er vi bare begynne å fortelle historien,
men vi vil komme tilbake til dette over tid.
For nå er det eneste stykke minne vi virkelig bryr seg om tekstsegment
fordi det bare representerer 0'er og 1'ere som Clang har generert.
Så når du kjører en kommando på tastaturet som a.out
eller du dobbeltklikker et ikon på Mac OS eller Windows,
programmet er lastet fra harddisken til RAM
og det er plopped på toppen av datamaskinens RAM, så å si.
Samtidig som programmet starter, og viktigste blir kalt
i programmet skrev du eller programmet Microsoft eller Apple skrev,
noen av sine lokale variabler ende opp der nede på bunnen av datamaskinens minne.
Men hvis viktigste samtaler annen funksjon som selv har variabler eller argumenter, de ender opp over det.
Og hvis det funksjon kaller noe, ender de opp over det, over det, over det.
>> Og bare en gang i funksjonen er ferdig utfører ikke bunken med skuffer, så å si,
begynne å bli lavere og lavere.
Og dette er hva da, i et nøtteskall, forklarer hvorfor når du ringer kube
eller du kaller tilvekst, du passerer en kopi av verdien.
Og hva det betyr billedlig er at du bokstavelig talt skrive nummer 1
i en annen del av minnet, endring at 1 til 2 i tilfelle av inkrementet
eller til en 8 i tilfelle av kuben og deretter kaste dette minnet unna
så snart dette inkrementet eller kuben funksjonen returnerer. Spørsmål.
[Student] Hvor er globale variabler lagret?
Globale variabler er lagret i det som i dag kalles initialisert data eller uinitialiserte data,
forskjellen er hvis du har en global variabel og tildele deg den umiddelbart en verdi
med likhetstegnet, ender det opp på toppen der,
og hvis du bare si int x; uten verdi, ender det opp litt lavere i RAM
bare ved konvensjonen.
Andre spørsmål? OK.
Så dette bildet vil komme tilbake som vi får kraftigere
med hva vi kan gjøre med datamaskinen,
men for nå, la oss ta en kort intro til kryptografi,
en bestemt type kryptografi som løser ikke alle verdens problemer
men løser noen av dem.
I dette tilfellet her har vi noe som heter hemmelig-nøkkel kryptografi.
Hemmelig-nøkkel kryptografi, som navnet antyder, stammer sikkerhet fra en hemmelighet.
>> For eksempel, hvis du var tilbake i grunnskolen og du passerer en liten hemmelighet kjærlighetsbrev
til gutten eller jenta du var knusende på, hvis du ønsket å passere dette notatet gjennom publikum,
du sannsynligvis ikke ville skrive en merknad på engelsk eller hva morsmålet ditt er.
Snarere kan du kryptere den, eller du kan bare sende dem en tekstmelding i disse dager.
Men du kan faktisk sende dem et notat i hele klasserommet.
Og for å gjøre dette sikkert på en slik måte at dine venner og læreren
vet ikke hva du skriver, kan du komme opp med en ganske enkel algoritme,
ung om du kan være, å bare rykke ordene.
Så i stedet for å skrive en kan du skrive b,
i stedet for b kan du skrive c,
stedet for c kan du skrive d, og så videre.
Eller du kan komme opp med en mer sofistikert oversettelse
av brev til forskjellige bokstaver.
Men fangsten er gutt eller jente som du sender dette notatet
behov for å vite noe, som er det, selvsagt? >> [Student] Hva du sender.
Hva hemmeligheten din er, som hva er det mapping mellom A og B-og c-og d er.
Er det bare å legge en til hver av bokstavene til å gå fra A til B, B til C?
Er det mer komplisert enn som så?
>> Slik at du og din knuse trenger å ha denne hemmelig informasjon,
men det er litt av en catch-22 her.
Hvis dette er den aller første gangen du skal sende denne kjærlighetsbrev gjennom klassen,
hvordan er det gutt eller jente kommer til å vite hva hemmeligheten selv er?
Så hemmelig-nøkkel kryptering løser ikke alle verdens problemer,
og det er faktisk et forhold her at vi vil komme tilbake til mot semesters slutt.
Tilsvarende gjør de fleste av oss ikke kjenner noen som fungerer, for eksempel på Amazon.com,
og ennå mange av oss har sikkert kjøpt ting på Amazon.com,
og vi har blitt opplært til å anta at disse e-handelstransaksjoner er sikre.
Nettadressen sier trolig https, er det kanskje en dum liten hengelås sted,
det er en slags kryptografi sikre kredittkortinformasjonen
mellom deg og Amazon.com.
Og likevel hvis kryptografi innebærer å vite noen hemmelighet
og ennå jeg ikke kjenner noen på Amazon, og jeg har absolutt ikke arrangert noen form for hemmelig
med noen på Amazon, hvordan er min datamaskin eller nettleseren min å gjøre dette?
Det viser seg at det er andre typer kryptografi helt som løser det problemet.
Men for i dag, vil vi fokusere på enkel en
hvor du kan ordne på forhånd for å vite noe hemmelig
som en eller noen tilordning mellom A og B-tallet.
Og prosessen med kryptografi generelt innebærer dette.
Du har noen ren tekst, avbildet her til venstre,
du kjøre det gjennom en slags algoritme eller prosedyre for kryptering det -
kanskje det er bare en blir b, blir b c -
og så ender du opp med chiffertekst.
I mellomtiden, når forelskelsen mottar denne hemmelige notatet,
han eller hun må da dekryptere den ved generelt å reversere den algoritmen
slik som å få tilbake den ren tekst.
Det er fysiske inkarnasjoner av dette.
>> For eksempel er dette en liten hemmelighet dekoder ring,
og dette er en ring i den forstand at det er to ringer her.
På utsiden periferien av denne tingen, det er bokstavene A til Z,
selv om de er i tilfeldig rekkefølge,
og på innsiden, det er faktisk noen tall
slik at med denne ringen kan du slags skru utsiden, men ikke på innsiden
for å stille opp tallene med bokstaver.
Fra en film som heter A Christmas Story, vil du se at lille Ralphie
var så ivrig etter å finne ut hva Little Orphan Annie hemmelige budskap var til ham
som hadde blitt kommunisert, tror jeg, i form av tallkoder på en frokostblanding boks
og du måtte samle alle de små kortene som fulgte med i frokostblanding boksen,
du måtte sende dem inn, måtte du få tilbake den hemmelige dekoder ring
slik at du kan endelig finne ut hva kartleggingen er mellom bokstaver og tall
eller bokstaver og bokstaver.
Hvordan i en datamaskin kan vi gå om etablering eller representerer ting som dette?
Vi trenger en måte å uttrykke oss selv litt mer fleksibelt
enn våre variabler så langt har tillatt.
Vi har hatt ints, vi har hatt tegn, vi har hatt flyter og dobbeltrom og noen få andre,
men de er individuelle deler av minnet som ikke egentlig tillater oss å uttrykke ting
som ord og setninger og uttrykk.
Faktisk har vi kalt slike ting strenger,
men vi lover at dette er egentlig bare en forenkling i CS50 bibliotek
at vi har tenkt å skrelle tilbake.
Og så la oss begynne å gjøre det her.
La meg gå videre og åpne opp en fil -
alle disse filene er tilgjengelige, som vanlig, online - kalt array.c
å løse et problem som ikke er relatert til strenger, men det tegner et bilde her
av hvordan kan vi bruke noe som kalles en matrise.
>> En matrise er en datatype.
Det er en type variabel slags som har flere mindre datatyper innsiden av det
rygg mot rygg til rygg mot rygg.
Så for eksempel, hvis vi ønsket å skrive et lite program som gir deg din quiz gjennomsnitt
for et kurs som 50 som har to spørrekonkurranser,
du kan veldig lett skrive dette programmet basert selv på noen av forrige ukes materiale
ved hjelp GetInt og et par av variabler: int quiz1, int quiz2.
Og det er ganske grei.
Det er kanskje 10, 20 linjer med kode maks å gjennomføre et program
som ber brukeren om to quiz score og deretter regner deres gjennomsnittlige
ved å legge dem sammen, dividere med 2, og deretter skrive ut resultatene.
Vi kunne sannsynligvis gjøre det ganske lett nå etter et antall minutter.
Men problemet er at anta at 50 hadde 3 spørrekonkurranser eller 4.
Anta at du ønsket å bruke det samme programmet for en klasse som hadde ukentlige quiz.
Tenk om en klasse som har ukentlige quiz.
Hvis det er 16 eller så uker i et semester, nå har du 16 variabler:
int quiz1, int quiz2, int quiz3, quiz4 int.
Så snart du begynner å se denne redundans, dette kopieres og limes inn koden,
det bør begynne å gjøre deg skulle ønske det var en bedre måte.
Og heldigvis, på grunn av arrays er det. Så la oss gjøre dette.
Først, la meg presentere en veldig enkel ting som vi ikke har brukt så langt,
men du vil se det noen ganger i koden.
>> Dette er hva som er generelt kalt en konstant.
Så det er en konstant i den forstand at denne verdien ikke endres.
Den menneskelige konvensjonen når du oppretter en konstant
er å bruke store bokstaver akkurat slik at det virkelig skiller seg ut i koden,
og den spesielle søkeord som du bruker i C er å definere #.
Så vi sier # define, deretter et mellomrom og deretter ordet du vil bruke for den konstante navn
og deretter verdien av konstanten.
Merke dette er forskjellig fra å tildele noe til en variabel.
Det er ingen likhetstegnet, er det ingen semikolon.
Dette er hva som er allment kjent som en preprosessor direktivet,
men mer om det en annen gang.
For nå, skaper dette en uforanderlig verdi som kalles quizer
hvis faktisk numerisk verdi er 2.
Så når du ser spørrekonkurranser, quiz, spørrekonkurranser hele denne filen,
det er bare nummer to.
Hvis jeg ser på main nå, la oss se hvordan dette fungerer.
Først det ser litt kryptisk, men det er alle ting fra uke 1.
Spør brukeren for karakterer. Hvordan gjør vi dette?
I tråd 22 - dette er virkelig den saftige delen - Jeg erklærer en flåte
men ikke bare en enkelt flåte. Jeg erklærer heller en rekke flyttallsytelse verdier.
Den variabelen kommer til å bli kalt karakterer, som underforstått her,
men den eneste stykke av ny syntaks så er disse hakeparenteser.
Det faktum at jeg har sagt float karakterer og deretter åpen klamme og deretter et nummer -
legge merke til hvis dette er en konstant dette er akkurat som vi gjorde dette -
dette betyr, "Hey datamaskin, gi meg 2 flyter og la oss kollektivt kalle dem karakterer."
>> Dette er i motsetning til en mye mer langtekkelig prosess som dette: float Grade1;
flyte Grade2, og så videre.
Så en matrise tillater oss å gjennomføre denne ideen, men mye mindre messily,
på en slik måte at vi kan skrive en linje med kode i stedet for, sier 16 for en 16-ukers semester.
Jeg ønsker ikke å hard-kode 2 fordi hvis du tenker på dette nå logisk,
anta neste år CS50 endringer i 3 quizer stedet
og jeg hadde nummer 2 her, hadde jeg nummer 2 her,
Jeg hadde nummer 2 her, nummer 2 her.
Det blir veldig kjedelig og veldig lett å skru opp
og ved et uhell endrer en verdi til 3 og savner noen annen verdi på 2.
Så jeg kommer til stedet abstrakt dette bort og bruke denne konstant som,
som navnet antyder, endres aldri.
Og nå uansett om vi har forskjellige quizer i år eller neste,
Jeg må bare endre den i en plass opp her på toppen.
Så det er alt en konstant er.
I mellomtiden er den nye konseptuelle funksjon som av en matrise.
Så klammeparentesene gi meg så mange flyter og lar meg kollektivt kaller dem karakterer her.
Så la oss nå se hva jeg skal gjøre.
Her i linje 24 er begynnelsen av en for løkke.
>> Dette er egentlig ikke noe fancy. Det er bare å bruke quizer i stedet for en hardkodet nummer.
Men det er ingenting intellektuelt annerledes der fra forrige uke.
Dette er bare printf, så printf ("Quiz #% d av% ​​d:")
fordi jeg vil bare skrive ut gi meg quiz nummer 1 av 2 og deretter 2 av 2.
Så dette er et rent estetisk ting.
Men det interessante delen er nå på linje 27.
For å fylle en av de to med en plassholderne kommatal,
du igjen bruke hakeparenteser.
I dette tilfellet, jeg bruker jeg fordi dette for loop har startet med i tilsvarende hva verdien, tilsynelatende?
[Student] 0. >> [Malan] 0.
Så på den første iterasjon av denne sløyfen, er det som om jeg skrev dette i koden,
men på den andre iterasjon av denne sløyfen, er det som om jeg skrev dette i min kode.
Men det faktum at jeg bruker en variabel er perfekt fordi, som navnet antyder,
det er varierende sin verdi på hver iterasjon,
så jeg fyller denne tabellen ett sted om gangen.
Hvordan ser denne tabellen ut?
Grunnen til at jeg trakk super enkel firkant på skjermen her før var på grunn av dette.
En matrise er bare en del av minnet etterfulgt av en annen del av minnet
etterfulgt av en annen del av minne og så videre.
Så hvis min array er av størrelse 2 i dette tilfellet her, alt jeg skulle gjøre
ved å skrive i min quiz score liker her - jeg fikk 100 på dette og så fikk jeg en 99 på dette -
så dette minnet kanskje ikke engang brukes fordi jeg har bare spurt datamaskinen
for en rekke størrelser som 2.
Disse rutene er der fremdeles, ikke sant?
Du har fortsatt to gigabyte RAM, selv om du bare ber om 2 flyter.
Så ideen bak arrays er at datamaskinen bare tar en bit av minne
og apportions deretter mindre biter rygg mot rygg til rygg mot rygg.
Og så det er alt en matrise er.
>> Det er en sammenhengende del av minnet innsiden av som du kan sette ting.
Dette skjer så å gjøre bare noen kjedelig aritmetikk.
Hvis jeg ruller nedover her, dette er hvor jeg da iterere over tabellen.
Jeg kommer opp med summering av alle verdiene i matrisen,
og da bruker jeg den runde funksjon her å faktisk gjøre summen deles spørrekonkurranser.
Men la meg bølge min hånd på det som en slags nok aritmetikk for nå.
Men alle som gjør for meg til slutt beregner et gjennomsnitt.
Så første quiz pluss andre quiz delt på 2 og deretter skrive det ut som en int.
Men la oss nå gjøre overgangen til et annet eksempel heter streng1,
som maler et lignende bilde, men bruker strenger.
La meg gå videre og forenkle dette for bare et øyeblikk.
Tilgi innrykk for nå.
Varsel i linje 19 i denne eksempel, får jeg en streng fra brukeren.
Men legg merke hva jeg neste gjøre i linjer 22 og fremover.
Jeg er faktisk iterating fra jeg opp til - og dette er et nytt triks - strlen, streng lengde.
Dette er en funksjon som kommer med C at hvis du passerer den en streng,
den forteller deg hvor mange tegn er i strengen. Det er alt.
Og det faktum at det er strlen stedet for streng lengde er bare fordi det er mer konsis.
Tretti år siden, likte folk å skrive ting som konsist som mulig,
så vi har holdt at konvensjonen her.
i + + betyr bare øke jeg i hver iterasjon.
Og nå merke til dette, noe som er veldig interessant.
I linje 24, sier jeg, "Computer, gi meg et tegn, 8 bits, og kaller det c".
Men hva er dette på høyre side sier?
På engelsk, hva som representerer?
[Student] Det første tegnet i rekken.
Akkurat. Gi meg det første tegnet i rekken.
Eller mer generelt, gi meg i. tegnet i rekken.
Og realisere det er viktig nå at så dataforskere,
vi faktisk telle fra 0.
>> Du har ikke skjønn nå for å begynne å gjøre dette.
Nå må du oppføre seg i henhold til datamaskinens forventninger og telle fra 0
fordi [0] kommer til å være det første tegnet i en streng,
[1] kommer til å bli den andre, [2] kommer til å bli den tredje, og så videre.
Så dette programmet, hvis jeg kompilere den, er dette igjen streng1, så sørg streng1,
og nå har jeg kjørt streng1 i min terminal-vinduet.
Den venter på innspill, så jeg kommer til å skrive i David, Enter,
og nå er det ut David alle på ulike linjer fordi varsel hva jeg gjør.
Jeg skriver ett tegn om gangen.
Vi vil ikke gå i detalj i dag på dette, men jeg slettet et øyeblikk siden denne sjekken her.
Det viser seg at hvis brukeren ikke ordentlig, motstandere, eller bare forvirret,
du kan faktisk ikke klarer å gi en streng av noen lengde.
Hvis du treffer feil tast på tastaturet, kan du gi noen streng i det hele tatt,
eller hvis du er ondsinnet, kan du prøve å lime på en gigabyte verdt av et essay
å fylle denne strengen, og hvis maskinen går tom for minne,
det viser seg at vi kommer til å få tilbake denne spesielle verdi som kalles NULL.
Så for nå, bare vet at det er denne spesielle verdi som kalles NULL
som vil tillate oss å sjekke når vi er ute av minne, blant annet.
Men hvis jeg åpner opp nå streng2, merke en forskjell her.
Merke en forskjell her med streng2.
Med streng2, dette er for loop litt annerledes.
>> La meg slette NULL, slik at vi kan snakke om dem en annen gang.
Hva er annerledes med for loop denne gangen?
Jeg kan gå tilbake til forrige eksempel.
Så det er versjon 2, er denne versjonen en. 1, 2.
1, 2.
Den strlen samtalen er der?
Det er i den første del av for loop.
Noen tanker om hvorfor jeg gjør dette? Ja.
[Student] Så du ikke kaller funksjonen hver eneste gang.
[Malan] Så vi ikke kalle funksjonen hver eneste gang. Akkurat.
Husker fra for looper at de er super enkelt
når du liksom forstå at dette er initialisering, tilstanden, og oppdateringen.
Problemet er at tilstanden skjer på hver iterasjon av sløyfen.
Og så i dette eksempelet her, er hva dårlig om det faktum at dette er min tilstand?
[Student] Du ringer strlen.
[Malan] Du ringer strlen igjen og igjen og igjen.
Men når jeg har skrevet i David, er lengden av strengen 5,
og det kommer ikke til å endre på hver iterasjon av loopen
fordi strengen fremdeles D-a-v-i-d.
Så dette er et hint om hva som kommer til å bli en stadig viktigere idé
kjent som en design beslutning der bare ikke gjør maskinen gjøre unødvendig arbeid.
>> Akkurat som en sniktitt på pset2, pset2 i standardutgaven
kommer til å utfordre deg til å faktisk gjennomføre noen flere koder,
noen flere krypteringsalgoritmer, slik at du både kan kryptere
og dekryptere hemmelige meldinger mye som den Ralphie det dekodet.
I hacker utgave av pset2, vi kommer til å gå litt lenger.
Vi kommer til å gi deg en fil fra en faktisk datasystem
som inneholder en hel haug med brukernavn og faktiske krypterte passord,
og utfordringen for hacker utgaven kommer til å være å knekke disse passordene
og finne ut hva kryptografi eller hva hemmeligheten ble brukt til å faktisk lage disse passordene.
Og vi kommer til å gjøre dette ved hjelp av en ny funksjon her på C
at jeg skal gi dere en demo av kjent som kommandolinjeargumenter.
Det viser seg, som noen av dere kanskje har sett i avsnitt eller i lærebøker,
main ikke alltid trenger å være ugyldig i parentes.
Det viser seg at hoved kan også skrives som dette, med to argumenter,
argc og argv, hvor argc er antall ord
at du skriver etter programmets navn på kommandolinjen
og argv er de faktiske ordene.
Og som klammeparentesene det foreslår, er argv tilsynelatende en matrise.
Det kommer til å være en streng etter en streng etter en streng i minnet.
>> Så det vi kommer til å være i stand til å gjøre starter med pset 2 er noe sånt som dette.
Hvis jeg gjør argv1, som er et eksempel vi vil komme tilbake til på mandag, og kjøre den,
legge merke til at det ikke synes å gjøre noe ennå.
Det skriver bare ut sitt eget navn.
Men hvis jeg sier farvel klasse, legg merke til at dette programmet tilsynelatende gjentar
over hver av de ordene som ble skrevet ved ledeteksten.
Og midlene som vi får tilgang til ord som brukeren har skrevet inn ved ledeteksten
er ved å endre hoved starte denne helgen fra int main (void) til int main (argc, argv)
og dermed vil bli født kommandolinjeargumenter.
Og når du får virkelig sofistikert på dette, vil du være i stand til å skrive virkelig trippy programmer
slik som denne en her, som går utover
noen av funksjonene vi har gjort så langt, men alle ganske kraftig.
>> Så vi vil forlate dette med denne på skjermen, og vi vil se deg på mandag.
>> [CS50.TV]