[Powered by Google Translate] [♪ Buzzing ♪]
Så for å introdusere deg til det jeg har fått opp på skjermen;
det er en av de verktøyene vi utviklet over sommeren;
det heter CS50 Spaces,
og det er vår samarbeidende koding søknad
at vi kommer til å bruke i seksjoner.
Det er ganske kult.
Har noen av dere sett CS50 run ennå?
La meg trekke det opp i en annen fane.
Run.cs50.net
Så
hvis du går til run.cs50.net,
du kan se dette er en i din nettleser måten å
faktisk kode - skriv C-kode,
og deretter kjøre den,
så det både kompilerer det, går det, returnerer deretter resultatet til deg,
så dette er en slags kul måte å eksperimentere
med noen av koden at David går over i forelesninger
og vi gir til på deg på oppgavesett
uten egentlig å måtte fyre opp maskinen.
>> Så hva Spaces gjør som er annerledes fra det
hvis jeg bytter tilbake til denne fanen,
Spaces er CS50 løp, som du ser her,
men hvis vi rulle over og se på den andre siden av vinduet,
du ser rett jeg er den eneste personen i dette rommet,
men hva jeg skal gjøre er å spørre dere å delta i denne Space med meg
og vi vil alle komme til kode i samme lille vinduet,
dele kode med hverandre,
og snakke om forskjellene mellom koden vår.
Så det er en slags kule ting -
så å bli med, hvis du vil gå til denne linken her på toppen
at jeg har uthevet,
du kan bare skrive i apps.cs50.net/spaces/vqcspSnO.
>> All right, så starter,
Jeg kommer til å gi deg en liten bit av en tur til dette.
Vi skal gjøre noen dum liten koding med det først,
bare slik at alle får ganske en følelse for hva det er,
men det jeg har gjort -
eller hva jeg skal gjøre her er -
Jeg kommer til å ta koden som jeg har skrevet her,
som som du ser akkurat nå er tom;
det gjør ikke noe.
Det er bare kjele plate koden, vil vi kaller det.
Med litt to-do kommentar.
Jeg kommer til å lagre den ved å treffe denne knappen Lagre.
Og hva det gjør er det
fremhevet det opp her en kort stund - at revisjon lagre grønn boks,
og nå, hvis du søker etter meg i Space,
du klikker navnet mitt,
du kan se at jeg har fått denne revisjonen akkurat her,
og hvis du klikker på den revisjonen,
det vil laste den koden inn Space din, også.
>> Så har alle lastet at koden inn Space deres?
Greit, hvis du ennå ikke har, gå videre og gjøre det,
og hva jeg ønsker dere å gjøre i denne lille to-do seksjon
er å skrive en litt hjelp printf om deg selv,
så for eksempel, ville jeg skrive
printf ("Mitt navn er Nate");
og da jeg skulle skrive
"Jeg ble uteksaminert i 2009
fra Stanford "
og jeg ville elske å høre om
Hvilket år du er på skolen,
enten du er på høyskole eller handelshøyskole
eller en annen Harvard skole,
hva du studerer om det er kjent ennå;
hvis det ikke er kjent, er det helt kult.
Jeg gjorde ikke bestemme før jeg var sent i mitt andre år som student.
og så ville jeg også gjerne vite
noe gale du vil fortelle meg eller
noe om klassen eller bare noe annet.
Når du er ferdig med å skrive at med din lille printf,
Hvis du vil spare revisjonen eller snarere
først forsikre deg om at du kan kjøre det
og at det skrives ut nøyaktig hva du vil den skal skrive ut,
og hvis du går videre og lagre den revisjonen
bruker Revisjon Lagre-knappen, denne første lille fyren over her,
og vi vil ganske gå gjennom og gjøre en liten introduksjon på den måten.
Så du bør bare nødt til å treffe på Play-knappen,
som er opp her på øverst til venstre,
så dette Play-knappen øverst til venstre vil
send koden off til vår server der det blir utarbeidet og deretter kjøre.
Så hva er ganske sprøtt om dette er
denne koden faktisk ikke kjører på datamaskinen;
det er faktisk blir sendt over Internett.
>> Hvordan går det, Charlotte?
>> I - okay. Jeg er - jeg tror jeg er
ha vanskeligheter lagrer den
på serveren, slik at det kan - jeg kan kjøre programmet.
Og så når jeg prøver å kjøre den, står det at det er en feil.
Erklært som et virus, som er ikke i det lenger.
Oh, la oss se, kan du treffe Lagre igjen?
Jeg ser det på skjermen.
>> Høyre, greit, slik at det jeg har.
Og jeg vet ikke hvorfor det ikke lar meg kjøre den.
Oh, ok, beklager.
Kan du forklare hvorfor - hva som var galt - hva som ikke fungerer med den?
>> Ja, fordi jeg ikke se at det var en siste linje der det er fortsatt en variabel
at jeg ikke hadde erklært, som jeg ikke har tenkt på at det er det.
Ja, perfekt!
>> Nå hvis jeg lagrer det, tror jeg det skal fungere.
Nå som du har lagret det, det fungerer; awesome.
>> Så ja, når vi går gjennom -
så hva som skjedde,
Jeg bare kommer til å gjenta dette for kameraet.
Hva skjedde var at denne variabelen er
var igjen i etter - jeg antar du slettet noen andre ting
hvor du erklært som,
og så dette var å kaste ting av og ble ikke som å kjøre den.
Så dette er akkurat hva vi ønsker å gjøre i seksjon
er har folk prøver å skrive forskjellige deler av koden,
sammenstille det, se hva som fungerer, se hva som ikke,
og deretter ganske snakke om disse tingene, fordi disse er tripping punkter som
Jeg fortsatt møter,
Jeg fortsatt - jeg gjør masse dumme ting hele tiden,
og jeg vet ikke hvorfor det ikke fungerer,
så la oss trekke opp Charlotte revisjon 3,
og vi vil kjøre den.
>> Så når jeg kjører, nå som jeg har fått henne kode her,
Jeg kan zoome inn, traff Run-knappen,
opplastninger det, bygger det, går det,
sier det var vellykket, og hvis jeg ruller nedover,
se Charlotte er en junior på Adams House,
psykologi, videregående i økonomi; awesome.
Flott å møte deg!
Awesome.
Ok, flytte på, la oss gå til Daniel,
gå til revisjon 3,
kompilere, kjøre;
hvorfor ikke du fortelle oss litt om deg selv, Daniel?
>> Ring meg Dan.
Jeg kommer til å handelshøyskole over fra dere,
og jeg var i marinen før her,
og dette er alt nytt for meg, så ja.
Ikke føler seg dårlig, jeg er 30 og jeg vet ikke noe av dette ting.
Awesome, takk, Dan!
Greit, vi fikk en annen Daniel.
Du går av Daniel - vil du introdusere deg selv, Daniel?
>> >> Jada, jeg er Daniel.
Jeg er en sophomore på Mather akkurat nå.
Jeg må konsentrere meg om regjeringen,
men jeg ønsket å ta CS50 fordi jeg har hørt gode anmeldelser om klassen
og jeg har aldri prøvd CS før.
Bla nedover her og vis dette - kult.
Flytte på, Jared.
Hvordan går det?
>> Bra, hvor er du?
Som du kan se, jeg er en junior filosofi konsentratoren i Eliot,
opprinnelig fra Sør-California,
og jeg er interessert i å ta CS50 fordi jeg liker logikken i det,
og det virker veldig kult å gjøre ting på datamaskinen, så.
Awesome, hvor i Sør-California er du fra?
>> Om en time fra [uhørlig], en liten by [hørbar].
Oh, yeah, min far fra Redlands.
Kule ting.
>> Greit, Jimmy, hvordan går det, Jimmy?
>> Bra, hvor er du?
Gjør det ganske bra!
Fortell oss om deg selv.
>> Jeg er en førsteårsstudent, og jeg er ikke helt sikker på hva jeg hovedfag i
men jeg er ganske lener mot økonomi.
Som Daniel før meg, jeg har aldri gjort noe CS, men det høres ganske kult.
Jeg er opprinnelig fra Chicago.
Awesome. Så sjekk ut hans utskriften her.
Jeg ønsket å spørre, gjorde dette print ut som du forventet?
>> Nei, jeg glemte å skrive ut en ny linje.
Jeg har faktisk glemte at når jeg skrev min greie
for første gang, også.
Det er litt vondt å huske å sette dem inn manuelt.
Det ville være fint om det bare vet det er det du ville.
>> Ok, Kelly.
Wow, vi har to Kellys, 2 Daniels, 2 Kellys.
Så Kelly - du går av Kelly Ren?
Ok, awesome.
Eller Kelly, mener jeg.
>> Så ja, så jeg er Kelly.
Jeg er en sophomore i Pfoho.
Jeg fikk en e-post i dag at jeg fortsatt har 7 uker å erklære min konsentrasjon,
så jeg prøver å ikke tenke på det,
og jeg liker baking, løping, og craisins.
Jeg har ikke erfaring med de fleste av CS;
Jeg lærte meg å bygge nettsteder da jeg var veldig ung,
men jeg tror jeg sannsynligvis lært meg feil mange ganger.
Forhåpentligvis vil jeg lære litt mer
og - ja.
>> Awesome, vel, takk skal du ha.
La oss gå til den andre Kelly;
Jeg har ikke noe - Sa du noe her inne?
>> [Uhørlig]
Det er det!
Søt!
>> All right, så jeg er Kelly.
Jeg er en første-års graduate student.
Jeg hovedfag i Mind, Brain, og utdanning.
Jeg ble uteksaminert i Franklin & Marshall College i 2008
med hovedfag i psykologi og sosiologi
og en mindre på fransk.
Jeg tar CS50
fordi jeg er interessert i å få en doktorgrad i nevrovitenskap
og jeg føler at dette vil hjelpe meg å forstå den teknologien som blir brukt.
Awesome.
Flytte på, Mikaela.
Er det riktig uttale?
Ok, awesome.
>> >> Jeg er Mikhaila.
Jeg er en sophomore i Kirkland House,
og jeg må konsentrere meg i Mechanical Engineering.
Jeg liker sykling, bygget en sykkel i sommer.
Jeg tar CS, faktisk,
som en konsentrasjon krav,
men du vet, jeg tror det er fortsatt kult slags ingeniør klasse.
Awesome - du bygget en sykkel i sommer?
>> Ja.
Wow, som rammen og alt det?
>> Uh-hunh (bekreftende).
Wow, det er kult.
>> [Uhørlig off-camera chat]
[Latter]
Ja, det har vært så lenge.
Du vet aldri, ikke sant?
Vel, kult, vel takk, Mikhaila.
>> Greit, Missy.
>> Jeg heter Missy, jeg er en freshman,
så det betyr at jeg ikke vet noe!
Jeg ønsker å konsentrere seg i astrofysikk.
I CS50,
Jeg føler definitivt hjelpe med det.
En merkelig faktum om meg er at jeg er et nasjonalt sertifisert brannmann.
Wow!
Hvordan skjedde det?
>> Jeg deltok på en akademi
og gikk gjennom helvete for mange uker
og fikk min sertifisering.
Wow, grattis!
Det er ingen liten prestasjon, for sikker.
Ok, så nå vil vi gjøre meg.
Jeg er den neste i rekken.
Jeg er - kjøre den.
>> Så mitt navn er Nate.
Jeg var klasse 2009 på Stanford.
Jeg var en symbolsk Systems store,
som er lik den Mind, Brain, Behavior konsentrasjon her,
men det er litt av en blanding av
informatikk, lingvistikk, psykologi og filosofi.
Slags - Ja, mye av rare ting, men det var flott,
og da jeg gjorde min master i informatikk der, også.
Så jeg er ny på Harvard i år.
Jeg virkelig ønsket å få inn i undervisningen.
Jeg tilbrakte de siste 4 årene på Stanford TA-ing Computer Science klasser
og så David la meg komme på,
og jeg skal være med å hjelpe ut med CS50,
så jeg gjør dette på heltid, er jeg ikke i grad skolen.
Det har vært morsomt.
Forhåpentligvis vil det fortsette å være morsom, jeg er sikker på at det vil.
>> Greit, Sam.
>> Mitt navn er Sam, jeg er en sophomore ved høgskolen, i lov spesielt.
Min største vil være vitenskapens historie, sannsynligvis, og VES videregående,
og min favoritt farge er gul.
Du trenger ikke å avsi dom eller noe, men det er en god farge!
Og Stella.
>> Hei, jeg Stella, jeg er en førsteårsstudent i Grays.
Jeg har ingen anelse hva jeg har konsentrert inn enda,
så CS50 var bare slags tilfeldig,
som er interessant.
Moro var faktisk Jimmy første Harvard venn av meg,
fordi vi er begge fra Chicago.
Kult, og Grace - som er ment å være den virkelig fin en, ikke sant?
>> Jeg trodde [hørbar].
Oh, yeah.
[Uhørlig / off-camera chat]
Ok, jeg er fortsatt læring, fortsatt læring.
>> Så vi har noe annet som er like interessant her.
Ja, jeg bare lurer, har du en idé som skjer her?
Du vet hvordan du skal tolke dette?
>> Jeg skulle bli satt semikolon etter hver eneste linje.
Det er en slags smerte.
Noen ganger er disse semikolon kan være en reell smerte å spore opp.
Så det viser seg at
det spesielle programmet vi bruker dette året til
kompilere vår C-kode kalles Clang,
og grunnen til at vi har begynt å bruke Clang i år -
fordi vi ikke har brukt det programmet i det siste;
Vi har brukt en annen som heter GCC som er veldig populære -
Clang faktisk gir deg feilmeldinger som fornuftig.
Dette sier "forventet ';' etter uttrykket"
og det forteller deg også uttrykket etter som du trengte et semikolon.
Så er du fikse det?
>> Ja, akkurat nå.
Awesome, la meg vite, og vi vil trekke det opp, og vi vil kjøre den.
Men ja, å sette disse semikolon i er en slags smerte.
>> Jeg fikset det, så jeg tror det skal fungere.
Awesome - revision 3.
Det ser ut som det.
Ok, så nå hvis vi kjører den,
der det går.
Kule ting.
>> OK.
Så takk for å gjøre det.
Det er flott å møte dere.
Hva vi skal gjøre nå er å tilbringe den neste litt
ganske dykke inn i avsnittet problemer
som kommer fra problemet sett fra denne uken
og vi vil gjøre det for de fleste av delene
for resten av begrepet,
og så skal vi spare de siste 15, 20 minutter eller så
å snakke om problemet satt seg
og deretter bare andre spørsmål du har generelt om klassen.
Når det er sagt, hva vi egentlig ønsker å gjøre
er har alle deltar
bruker Spaces ting,
kaste i koden, kaster i forslag,
og snakker om når ting som dette pause
eller ikke fungerer, bare fordi dette er ting som
Jeg vet jeg kom over
da jeg begynte koding,
og var egentlig ganske frustrerende til tider
fordi hvis det er som 2 am før oppgavesettet er grunn,
så - bare for offentliggjøring,
Jeg startet ikke programmering før jeg var en sophomore på college.
Det var snilt av denne rare, ukjente ting
at jeg hørte var ganske kult
og jeg har også hørt det kan være en reell smerte i baken
hvis du går glipp av et semikolon, og det er den eneste feilen holde programmet fungerer
og holde deg fra å gå i dvale,
så definitivt,
hvis du har spørsmål som det,
Hvis du har spørsmål som det, gi meg beskjed,
fordi jeg ønsker å gjøre dette til en god opplevelse for dere.
>> Så har dere alle nedlastede problemet satt ennå?
Kinda vet hvor det er? Okay.
Så vil vi gå til cs50.net, fordi jeg ikke har det på denne kontoen,
trekke opp de problematiske sett,
trekke opp problemet sett 2, og vi skal se på standardutgaven dag.
Vi vil trekke opp spesifikasjonen her.
Bla nedover.
Så vi skal begynne å se på denne delen av spørsmål.
Har dere sett disse shorts ennå?
Okay.
Så det er shorts på løkker,
som er gjort av Tommy, en av hodet undervisning stipendiater.
Det er en på omfang,
Jeg tror gjort av en annen undervisning kar ved navn David
og deretter en på Caesar Cipher også gjort av David.
De er ganske kult.
Har dere vært å se sine shorts så langt?
How've de vært?
Nyttig? Ok, godt å vite.
Hvis de ikke er det, kan du si det.
Men før du gjør det,
har dere sett på disse spørsmålene
i det hele tatt?
>> La oss snakke om dette litt.
Så vi har introdusert de siste par ukene
i foredraget
en rekke forskjellige sløyfer.
Det er for loop,
mens loop, og deretter gjør-mens loop,
og i foredrag, har vi snakket mye om
hvordan disse løkker er alle
nokså lik i mange måter,
og du kan gjøre mye av de samme tingene med en stund loop
som du kan med en for løkke.
Du må bare slags bruk de rette kombinasjonene av variabler og slikt.
og så virkelig
den virkelige skillet mellom alle løkkene er at
noen ganger er de mer nyttige
å bruke dem på en gang enn ved en annen gang.
>> Så for eksempel
mens loop avviker fra en do-mens loop.
Føles alle som de har en god hånd på når
en gjør-mens loop er mer
nyttig eller hva forskjellen er?
>> Jeg tror forskjellen er en gjør-mens loop
går - Jeg vet ikke helt hva terminologien er,
men rekke funksjoner i sløyfen.
De automatisk - det gjør sine runs minst
før det sjekker tilstanden, eller mens loop vil bare kjøre den når
det går kontinuerlig - hvorvidt tilstanden blir oppfylt.
Ja, gjør det fornuftig?
>> La oss ta en titt på en liten bit av koden.
Så bare for å gjenta spørsmålet,
eller svaret, heller;
svaret var at
en stund loop vil sjekke for å se om tilstanden
at du angir er oppfylt
før det renner kroppen av løkken for første gang,
mens do-while løkke vil automatisk kjøre kroppen av loopen,
er hva vi kaller det - det er rart terminologi,
men hvis jeg noen gang sier noe som ikke gir mening, la meg vite -
løkken kroppen er at ting som du putter i mellom klammeparentes.
Og i en gjør-mens loop,
at kroppen får kjørt minst en gang,
og da tilstanden blir kontrollert før det går hver gang på rad.
>> Så egentlig, Sam,
gjør du noe imot å skrive en enkel mens loop
i Spaces?
>> Hvordan sorterer du om som
lage en ny ...?
Jeg bare slette det du har der.
Ja, bare tømme den ut.
>> Vel, jeg tror jeg har dette -
hvilken vil du, en stund, eller ønsker du ...?
Ja, bare en stund sant, skrive noe ut.
Og la oss se.
Alexander, innså jeg at vi aldri introduserte deg.
>> Å, det er fint.
Har du - kan du kode opp en gjør-mens loop for oss?
>> Ja, jeg skal prøve.
Greit, vi bare trekke disse opp på skjermen,
slik at du slags har et håndtak på hva forskjellene er.
>> Så her er hva Sam har gjort.
Han har et heltall jeg ringte
at han har initialisert til 17.
Så sier han mens (int i = 17)
printf ("Mitt navn er Sam.");
Så hva skjer når vi kjører denne koden?
Det er en feil; hva sier feilen?
La oss dra den opp og snakke om det.
Det oppstod en feil, står det.
La oss bla nedover.
Slik at det ga oss denne feilen, og det sa,
"Hei, jeg forventet et uttrykk."
Det er ganske kryptisk.
Ja, så akkurat - og igjen,
vil det være en annen liten bug som vi vil ta i løpet av et sekund.
Men dette er en av de slags rare terminologi ting,
så dette int i = 17
ikke er et uttrykk.
Hva det ser ut som det gjør er det er
erklære et heltall jeg ringte
og sette den til lik til 17
eller, rettere sagt, setter 17 i det int jeg ringte.
Og det ikke fornuftig
i sammenheng med denne mens loop.
Det virker fornuftig, som vi skal se,
i sammenheng med en for løkke, fordi for løkke erklæringer ikke starte
med at for int lik i noe
og går videre.
>> Det gjorde du -
fikse noe, all right.
Her går det; awesome.
Så nå er ting ser litt annerledes ut.
Et par ting har endret seg.
Kan du fortelle oss hva ting har endret seg?
>> Jeg tok ut int, så det er ingen erklæring [hørbar] i stedet for et oppdrag.
Den ene likhetstegn, satte jeg to like tegn, som betyr en lik.
Awesome.
Ja, så hva Sam gjorde han tok ut int
som var her tidligere,
så hvis jeg bare se på dette - dette er hva det var tidligere, sa det int,
som erklærte det - så vi tok ut type.
Det er int, røye, streng, kort,
de kalles typer.
Så du tok ut den type
og deretter tidligere,
Han hadde bare én likhetstegnet
og hva han sa var problematisk om dette ble
når du har en likhetstegnet,
det er en oppgave operatør.
Det er ikke å teste hvorvidt to ting er like.
Det er faktisk å sette noe lik noe.
Vi setter nummer 17 i variabelen i.
Så for å gjøre den slags sammenligning
du må bruke den doble lik,
som er en slags merkelig ting
men er en ganske vanlig feil.
Så en annen ting jeg vil påpeke, hvis du ikke tankene,
er at i
vår funksjon her i int main,
du ser at kroppen vår funksjon
er forskjøvet fra venstre side
med 4 mellomrom eller en tabulator.
Grunnen til at vi gjør dette
er bare for lesbarhet.
Som du kan se i Sams mens loop her,
han gjorde ikke rykke i det hele tatt,
og som ikke påvirker funksjonaliteten av koden.
Det vil kjøre nøyaktig det samme.
>> Så for eksempel, hvis vi kommer opp til toppen her
og trykk vår Play-knappen, vil det bygge den,
det vil kjøre den,
og hva som kommer til å skje?
Hvorfor det likevel si kjører?
>> Fordi det vil terpe hi.
Nettopp, og hvorfor holde det gjenta hi?
>> Fordi heltall aldri endres, så det er alltid 17.
Ja, akkurat, så
la oss se, etter - minner meg om navnet ditt igjen?
Jimmy. Så Jimmy sa at
grunnen til dette repeterer hi igjen og igjen
er fordi denne tilstanden er alltid sant.
Vi har aldri endre verdien av jeg.
Vi aldri endre innholdet i hva som er lagret i den variabelen.
Så på dette punktet fikk vi denne feilen som
programmet generert for mye utgang,
og hvis vi bla ned og type titt på hva som skjer her,
du kan se at det er hi, hi, hi, hi, hi, hi, hi hele veien gjennom.
Awesome.
>> Så slags tilbake til det opprinnelige punktet
at det å ha innrykk her
i kroppen av mens loop påvirke ikke noe.
Programmet fortsatt kjørte helt fint.
Typisk for god stil -
og dette er noe som vi ser etter i oppgavesett -
Vi ber dere om å rykke dette med 4 plasser, som du kan gjøre
ved bare å trykke på tabulatortasten
eller ved å manuelt sette i 4 områder selv.
Cool, greit så la oss gå tilbake og se på
Alexander gjør-stund.
>> Bare litt å ha litt problemer.
Ok, vel la oss arbeide gjennom den.
Er det kult?
>> Ja.
>> Ok, så her vi går.
Dette er koden som Alexander skrev.
Går du med Alex - OK.
Så her er koden som Alex har skrevet.
Så har vi fått vår erklæring viktigste akkurat her,
og så har vi dette heltallsvariabel jeg ringte
blir erklært her.
Vi har en do uttalelse
og så kroppen igjen med disse bukseseler,
så dette er kroppen av do-while -
la meg zoome inn på dette, så det er lettere å lese -
og i kroppen, vi prøver å skrive ut "dette er kroppen",
i + +,
så inkrementere innholdet av i og gjøre dette
før jeg kommer til å bli 3,
og deretter vårt program avsluttes.
>> Så hva skjer når vi kjører dette programmet?
>> Jeg forventet en identifikator.
Ok, så bygge, drifte, oppstår feil.
Hva skjer?
Vi bla nedover her,
vi får dette litt kryptisk ser ting,
forventet semikolon etter toppnivå erklæringen.
Det er ganske rart.
Har noen en idé om hva som kan være det som skjer?
Ganske rart, ja.
>> [Uhørlig] bli erklært utenfor parentesen?
Så det betyr ikke gjelder så når du bruker parenteser?
Så han erklærte denne fyren utenfor som parenteser?
Å, disse gutta - de klammeparentes?
>> Ja.
Ja, akkurat.
Så det viser seg at
du kan faktisk ikke erklære en variabel her som dette.
Hva du kanskje har prøvd å gjøre var -
klippe det ut av det -
du kan enten sette den i løpet av de klammeparentes her
eller et annet alternativ
er å sette det helt utenfor.
Og så disse - avhengig av hvor du faktisk sette erklæringen
av at heltallsvariabel,
du kan få 2 svært ulike typer variabler;
når det er utenfor viktigste,
det er hva vi kaller en global variabel.
Det er utenfor rammen av noen av funksjonene -
det er ikke i en funksjon -
mens hvis vi setter det på innsiden av main,
liker her, så er det som kalles en lokal variabel,
fordi det er lokale til omfanget av main.
Og vi vil snakke litt mer om hva forskjellene er
mellom de to typene og hvorfor du bruker forskjellige typer variabler,
men for nå,
du kan bare beholde alle variablene lokale,
fordi vi ikke har noe behov for globale variabler.
>> Ok, så det er en ting akkurat der.
La oss prøve å kjøre dette igjen, se hva som skjer.
Kjør, får en annen feil.
Zoome inn litt, hva skal vi få?
Vi får dette forventet parentes etter do / stund.
Noen ideer hva som skjer? Dan?
>> Er stund da parentes og deretter -
Jeg vet ikke om du trenger å redeclare int,
men gjøre mens (i <3).
Akkurat, ja.
Så det viser seg at Dan er helt riktig.
Vi trenger ikke å sette denne type her igjen.
Vi kan i stedet drepe den type
og bare gjøre det.
OK.
Jeg vil zoome ut igjen, kan du prøve det en gang.
Se på det, det går vellykket.
Hvis vi rulle ned, "dette er kroppen" skrives ut 3 ganger.
Det er ganske søt.
Godt gjort, godt gjort, folkens.
Godt gjort.
Hvordan er dette kommer så langt?
Anstendig tempo?
Ok, kult.
>> Så, som vi på en måte tilbake til det opprinnelige spørsmålet,
vi - og nå hvis vi ser forskjellen,
du ser at i denne do-mens loop,
betingelsen kommer sist.
Så som datamaskinen leser programmet
siden C-programmer blir henrettet slags i denne rekkefølge,
der de bokstavelig talt starte med den første linjen i main,
og deretter utføre linje 6, linje 7, 8 linje, linje 9,
linje 10 linje 11,
alt dette øverst til høyre her
skal utføre en gang
før vi noen gang teste denne tilstanden for å se
hvorvidt i - eller innholdet av I, heller -
er mindre enn antallet 3.
Og bare hvis en gang vi kommer til linje 12,
innholdet av i er mindre enn 3
vi faktisk hoppe tilbake til linje 7
og deretter gjenta prosessen,
og da vi teste tilstanden igjen og igjen og igjen.
>> Så vi kan kontrastere denne
med - zoome ut igjen,
bla ned til Sams versjon,
vi skal se på dette, litt endret slik at det ikke lenger er en uendelig loop -
der hvis vi zoome inn,
Vi ser det som dette programmet utfører,
det kommer til første erklære int i,
bestemme innholdet jeg være til 0,
og deretter den treffer tilstanden mens loop første,
så i dette tilfellet, denne kroppen, dette printf ("Hei") og jeg + +
vil ikke engang kjøre
mindre jeg er faktisk mindre enn eller lik 2.
Så hvis jeg er 3, for eksempel,
hvis vi setter dette her
lik 4 - eller jeg vil gjøre 3, fordi jeg sa 3 -
og deretter kjøre den,
det vil bygge, det vil kjøre helt fint,
men det vil ikke faktisk skrive ut noe,
fordi den ikke klarte denne testen for det første tilfellet.
Så i klassen, vi slags snakket om hvorfor akkurat disse do-mens sløyfer
er nyttige noen ganger
og hvorfor vi vil bruke den i motsetning til en stund loop.
>> Er der - gjør dere har noen forslag
for hvorfor en gjør-mens loop kan være mer nyttig?
>> Vel, jeg tror gjør-mens sløyfer er hvis du ønsker brukerundersøkelser,
fordi den måten du kan la dem
sette noe i gang, og hvis det er riktig,
vi kan gå videre til resten av programmet,
men hvis det ikke er riktig, så du holder på å spørre brukeren
før du setter riktig inngang.
Ja, akkurat - nøyaktig,
så en gjør-mens loop er nyttig
fordi når ber om brukerens input
fordi du trenger for å få brukerens input før du faktisk kan sjekke det.
Så i pset 1, pset 2,
hvor du ber om brukerens input mye,
det er en nyttig ting å bruke
i motsetning til bare en enkel stund loop.
Hvis du bruker en stund loop, kan du gjøre det samme -
du kan gjøre det samme med en stund loop
som du gjør med en gjør-mens loop.
Du må bare slags har denne dupliserte prosessen
hvor du får innspill først og deretter starte mens loop.
Mens en do-mens loop, du må bare skrive det en gang
og det er en mye renere.
>> OK.
Eventuelle spørsmål?
Fornuftig?
>> The return 0 - det er bare en slags stall eller er det -?
Ja, så vi kan -
vel, vil vi dekke dette litt mer senere
men det viser seg at
denne avkastningen 0 som vi legger
på slutten av hoved hele tiden -
du kan ganske bare ta det som noe vi gjør
for tiden.
Hva vi har begynt å snakke om med funksjoner
slags på slutten av forrige uke og så igjen denne uken
er at en funksjon
tar innganger som er disse tingene i parentes;
disse er to innganger, våre argumenter eller parametere,
hva de er også kalt til vår viktigste funksjon,
og deretter en funksjon frembringer et utgangssignal
som vi kaller en returverdi.
Og returverdien i tilfelle av hoved er denne int,
dette heltall,
og måten du forteller en funksjon, "Hey, dette er hva din utgang
kommer til å være, "er med dette ordet" return ",
dette søkeordet, heller,
og så viktigste retur 0
eller viktigste gi ut 0
er standard i C-programmer
fordi 0 retur fra viktigste middel som
"Hei, alt utført med mitt program helt fint."
Hvis vi skulle sette noe annet enn 0,
som en, for eksempel,
som brukes til å fortelle hvem kjørte dette programmet
at noe gikk galt.
Så når vi får mer involvert med ting over semesteret,
hvis du noen gang ønsker å si,
"Oops, du vet, noe gikk galt med dette programmet,"
snarere enn å ha mitt program krasjer, vil jeg varsle
løperen av mitt program at noe gikk galt,
du kan bruke returverdien,
som vi kaller det, det er ikke 0.
>> Så vi vil dekke det litt mer
når vi får inn funksjoner.
Den slags er fornuftig?
Okay.
Funksjoner er slags bisarre -
Jeg tror for folk som har mye matematikk bakgrunn,
det kommer litt lettere,
spesielt hvis du har litt mer abstrakt matematikk bakgrunn
og du er vant til å snakke om funksjoner
og alle den slags ting.
Men vi skal prøve og dekke dem
og gå pent og sakte som de kommer opp.
Likeledes, hele denne int argc,
char * argv [],
for akkurat nå, kan du også ta det som kjele plate.
Vi har begynt å dekke de litt i foredrag
når vi snakker om argumenter som blir vedtatt i programmer på kommandolinjen,
men i dine oppgavesett og dine programmer,
det er helt greit bare å skrive ugyldig og holde det enkelt.
Og hva dette tomrommet betyr er at
"Hei, er viktigste ikke kommer til å godta noen innganger;
Dette er bare et program vi skal bare kjøre.
Vi skal ikke gi den noe ekstra informasjon
hver gang vi starter den opp å kjøre. "
Så for nå, kan du gjøre dette;
Du kan også selv utelate return 0
på slutten av programmene, og de vil kjøre helt fint,
men jeg anbefaler bare å holde det i.
I et par uker, vil vi begynne å slags
trekke tilbake dekselet litt og forstå mer om
alle de forskjellige lite bevegelige deler.
>> Greit, nå la oss snakke om våre andre spørsmål her.
Så hva betyr "svart identifikator" vanligvis indikere
hvis outputted av Clang?
Jeg tror vi kanskje har sett det allerede i dag.
Kan noen gi en oppsummering av hva det betyr?
La oss se, Kelly - en av de Kellys.
>> Så -
Ja, hva gjør -
>> Jeg tror når du, som, ikke erklære variablene og du prøver å bruke den.
Ja, akkurat, akkurat.
Så hvis du noen gang se denne utgangen
når du prøver og kompilere programmet,
akkurat som Kelly sa,
det betyr at du har brukt en variabel som du ikke erklære
så hvis jeg går tilbake til vårt område,
og jeg gjøre noe sånt
printf (
"Hei% s")
og prøve og fylle ut en% s
med en variabel s som jeg ikke har erklært overalt
og jeg prøver å kjøre den,
du vil se hva jeg får ned på denne nederst til høyre her:
"Bruk av svart identifikator 's'";
det betyr bare at du ikke deklarerer variabelen.
Samme skjer hvis
du har x og du prøver og lagre 7 i det
og jeg ikke erklære X.
Jeg får det samme feilen:
"Bruk av svart identifikator 'x'".
>> Greit,
så Caesar Cipher, som ikke er veldig sikker,
Jeg skal la dere se denne korte, slik å forstå hvorfor,
og forhåpentligvis etter å gjøre denne uken er problemet satt
hvor du faktisk skrive en Caesar Cipher, vil du forstå litt mer
om hva det vil si å være en sikker og usikker -
eller ikke sikker, antar jeg - usikker er litt annerledes.
Den andre tingen var vi har disse andre spørsmål her
om funksjoner
og hva en funksjon er,
og vi slags snakket om at kort når vi snakket om retur verdier;
for noen som har vært å forelese,
kan du oppsummere som har vært til forelese i dag?
OK.
La oss se, la oss ha - kan noen fortelle oss hva en funksjon er?
Kelly?
>> >> I utgangspunktet noe du trekke på noe som er skrevet i biblioteket som er
mer komplisert enn det, og du bare skrive en kort form av det,
så liker du henviser tilbake til det biblioteket, ved hjelp
hele den lange koden og [hørbar].
Ja, akkurat, og du vil legge noe til det?
>> Ja, jeg tror på det som ligner på konseptet med en formel i matematikk
der du bare skrive en formel, og deretter kan du plugge variabler i
og det er det en funksjon er [uhørlig].
>> Ja, så vi har fått et par svar her
som er både veldig bra og rett på.
Det er refererer til kode som er blitt skrevet i biblioteket et sted
som er mer komplisert
og deretter kan du trekke på den koden
og faktisk bruke det ved bare å skrive kortformen av det -
eller, rettere sagt, sitt navn -
og så er det også denne sammenligningen til en formel i matematikk
eller fysikk, alt sånt
der du har en formel
og du kan deretter koble
variablene til den formelen
å deretter få resultatet av formelen,
så du tror på det som som kvadratisk likning.
Tenk hvis stedet for å måtte lære om
hva den kvadratiske formelen er i matte klasse,
du bare hadde en liten kalkulator program som gjorde det for deg.
Har noen bruker kalkulator programmer i matematikk klasser i videregående skole?
Ja, fysikk klasser?
Hvor du kan bare si "Hei, kvadratiske formelen.
Disse er variablene som jeg ønsker å legge inn.
Nå gi meg svaret. "
Det er litt av hva en funksjon er.
Det er en måte for oss å
slags skrive som en liten liten sub program
innenfor våre større program
og bruke den om og om igjen
slik at vi ikke trenger å kopiere og lime inn koden,
vi kan gi den forskjellige innganger og få forskjellige utganger,
det er super praktisk
når du prøver å skrive forskjellige programmer til forskjellige tider.
>> Så for eksempel en funksjon som vi har brukt om og om igjen og om igjen
gjennom hele kurset er printf.
Printf er i seg selv en funksjon
og det viser seg at det er faktisk en ganske lang og komplisert,
stygg leter, fungere å skrive.
Så så enkelt som det virker for oss
å skrive ut ting ut til skjermen,
fordi vi alle bare gjorde det i begynnelsen av avsnittet i dag,
det viser seg at det er faktisk, du vet,
en god par hundre linjer med kode.
Det er ikke noe som jeg noen gang ønsket å skrive, sikkert,
men vi kommer til å bruke den hver dag, det er slags kult,
så vi kommer til å dele den med hverandre,
med forskjellige programmer,
så vi vil være dykking mer i funksjoner;
for tiden, vi er ikke -
den eneste funksjonen vi skal skrive er viktigste.
Viktigste i seg selv er også en funksjon,
og du kan se det fikk sin produksjon,
sine innganger som vi snakket om,
og deretter navnet, som er viktigste.
Viktigste er slag av en - er en spesiell funksjon der.
I C-program, det må være en hovedfunksjon,
og så for nå, har vi på en måte utelatt skriving
prototypen, eller utdeling av, viktigste.
Vi har gitt det til deg,
og vi har nettopp hadde du fylle i form av de blanke feltene.
>> >> Så for det andre problemet sett, trenger vi ikke å
skriv det i den andre funksjonen?
Jeg tror ikke det.
Jeg tror det er alt her.
Ja, så Caesar Cipher,
du trenger ikke å, det ser ikke ut som,
og Vigenere, at du ikke heller,
så - og det viser seg at du ikke noen gang faktisk nødt til å skrive
en funksjon, ikke sant?
Du kaller alltid sette alle koden din innen main,
og mange programmerere gjør det.
Som vi går videre,
vi starter å innføre funksjoner som en måte
å rydde opp koden din,
å gjøre det mer elegant,
i tilfelle du har oppgaver - type som når vi snakket om looper,
hvordan noen ganger er det ting som du ønsker å gjøre igjen og igjen og igjen,
og du har slags naiv måte -
eller hva vi ofte kaller "stråmann" løsning,
er å bare kopiere og lime igjen og igjen -
du kan gjøre det samme med funksjoner hvor du bare kopiere og lime inn
den samme koden igjen og igjen,
men det bloats koden -
det ender opp med å gjøre koden veldig lang -
og det blir også litt forvirrende,
og da betyr det at du ikke er i stand til å like -
hvis du noen gang ønsker å bruke den koden på nytt i et annet program,
du er også fast kopiere og lime det igjen,
så en av de tingene vi skal snakke om er
slags design og stil av programmene,
og så når det er fornuftig å slags
pakke noe opp og sette det som en separat funksjon,
Vi oppfordrer deg til å gjøre det,
og det er noe som igjen,
det er ingen fast regel.
Vi sjelden si at du må skrive en funksjon som heter dette,
men det er mer av en av de tingene du bare utvikle seg over tid
som du skriver flere og flere programmer.
>> Noen flere spørsmål?
Ok, så la oss nå
gå tilbake til denne fyren her,
så jeg er fortsatt i denne delen av spørsmål.
Vi har snakket om alle disse forskjellige typer,
hva er en funksjon, hvorfor skrive funksjoner,
når du kan bare kopiere og lime?
Forhåpentligvis har vi overbevist deg om at du skriver funksjoner er en god ting.
Så nå la oss gå videre til denne MySpace program,
og vi vil bruke litt tid på å gjøre dette.
>> Så, la oss se,
kan jeg ha noen lese dette for meg?
La oss få Mikhaila - vil du leser dette for oss?
>> Du mener tilbake når MySpace -
Tilbake når MySpace var kult.
>> "Tilbake når MySpace var kult,
det var alle raseri til å skrive som dette.
Kanskje det er fortsatt? Jeg er ikke helt sikker.
I alle fall med CS50 Appliance,
CS50 Run, eller CS50 Spaces,
skrive et program som ber brukeren om en melding
og utganger deretter meldingen med sin første bokstaven,
med alle de andre bokstavene i vekslende saken,
pr prøven utgang nedenfor,
hvor boldfaced tekst representerer noen brukerens input.
For enkelhets skyld kan du anta at brukeren
vil bare innspill små bokstaver og mellomrom.
Tenk på dette problemet en mulighet til å praktisere;
vil du ikke bli bedt om å sende inn dette programmet. "
>> Awesome, takk.
Så som Mikhaila sa,
vi kommer til å skrive et program som MySpaces koden.
Så gjorde noen av dere bruker MySpace?
Noen av dere har MySpace-kontoer?
Oh, yeah, yeah!
Det var ganske kult.
[Latter]
Jeg vet det.
Dating meg selv.
Så det vi prøver å gjøre er å skrive et program
som går gjennom
og stor forbokstav
og deretter hver bokstav etterpå -
eller annenhver bokstav etterpå, jeg beklager.
>> Så - og du kan se i dette eksemplet,
Dette er hvordan vi kjører programmet,
og så dette er bare å si: "Vi kjører et program kalt a.out.
Innspill som vi kommer til å gi den
kommer til å bli bedt om det.
Vi skal ikke levere innspill på kommandolinjen. "
Hvis du har fulgt alle forelesningene
og høre om kommandolinjeargumenter,
det er slags der de - som funky syntaks
på main kommer inn med int argc, alt det der,
så her vi ikke bruker det, vi ikke arbeider med noe av det.
Vi skal bare få dette skrevet inn av brukeren,
og så dette andre linje med funky bokstaver
er hva vi ønsker vårt program til produksjonen.
>> Så istedenfor å bruke Appliance eller Run, vil vi bruke Spaces,
fordi vi har fått Spaces,
og så hvis dere vil
få koden til å se noe som dette,
så jeg kommer til å lagre denne revisjonen
bare så du har kjelen plate her
som ser slik ut, int main (void), ingenting i det.
Egentlig er hva vi skal gjøre vi bare slette alt sammen.
Vi ønsker en blank tavle,
fordi vi ikke skal begynne å skrive kode;
heller, vi skal prøve å skrive noen pseudokode
som egentlig bare betyr at vi kommer til å skrive noe som ikke er kode
den slags beskriver hva vi ønsker å gjøre,
litt som David gjorde på den første dagen av forelesning,
eller jeg tror det var den andre dagen av foredrag da han gjorde hele sokker demo.
Dere husker det - se sokker?
Josef var oppe slags skrive ut på engelsk?
Så vi skal gjøre det samme.
>> Så når jeg begynner å skrive pseudokode,
Jeg liker å starte med å se på hva inngangen skal være.
Og jeg gir meg selv et eksempel tilfelle,
så som "takk for add!"
Og da jeg også skrive hva jeg vil at output skal være,
som i dette tilfellet er noe sånt som dette.
Og den slags gir meg en god, liksom utgangspunkt å tenke på,
"Ok, jeg ønsker å ta linje 1
og jeg ønsker å forvandle det til linje 2, "
og den slags hjelper lede min tenkning.
Dette er et bra sted å starte.
En annen måte å tenke på det, også, som vi ganske gå videre
og som du gjør dette i dine egne programmer, er å
tenke typen som hva er kanten saker til dette?
Hva er slags rare scenarier?
Hva er de rare innganger som vi kan få?
Og hva bør disse utganger se ut?
For eksempel, en merkelig inngang
ville være denne,
skape absolutt ingenting,
som hva skal vi sende ut i så fall?
Noe vi ønsker å tenke på, også.
>> Så bare som et spørsmål,
hva kan vi ønsker å sende ut?
Hvis vi ikke får noen innspill i det hele tatt, hva skal vårt program være sender ut?
>> Ingenting.
Ingenting? Høres flott ut.
Så vi vil være sikker på at vi ikke skriver noe ut
hvis vi ikke får noe i.
Cool. Okay.
Så
Jeg kommer til å ringe på et par mennesker som vi går gjennom
og bare finne ut typen som hva den generelle algoritmen er
og vi vil slags begynne å jobbe gjennom dette sammen.
>> Så, la oss se. Missy.
Hvordan tror du vi vil begynne?
Hva ville være et godt sted å begynne her
hvis vi ønsker å forvandle, sier linje 1
på linje 2?
Kan du slags bare forklare meg, på engelsk, hva du tenker?
Ikke engang bekymre kode.
>> Første jeg ville gjøre ville være å
slags direkte brukeren å fortelle dem hva du vil.
Ok, så si,
"Hei, bruker. Jeg vil
en streng "- awesome.
Så la oss skrive dette ned.
Spør brukeren om en streng.
Det høres ut som en god start.
OK.
La oss be Kelly Ren denne gangen.
Hva ville vi da ønsker å gjøre nå?
Hva er slags vår neste -?
>> Samle deres innspill og lagre den som en variabel.
Flott.
Så samle strengen,
lagre den i en variabel.
Så er det noe spesielt vi ønsker å gjøre her?
Ønsker vi å sjekke deres innspill
før -?
>> Ja.
Hva kan vi ønsker å se etter?
>> Vel, du sa vi ikke trenger å sjekke om det er et tall, ikke sant?
Fordi det vil anta at det er små bokstaver?
Ja.
>> Så det viser seg at - ja.
Så getString er garantert å returnere oss en streng.
Det kommer ikke til å returnere et tall til oss eller noe sånt.
Det kan være siffer tegn i strengen, skjønt.
Og de kan vi se bort som vi gjorde kapitaliseringen.
Men en tom streng er helt greit,
slik tilfellet her på linje 4 og 5,
høyre, hvor det er ingen inngang,
og vi har satt noe som produksjonen vår.
Vi trenger ikke å bekymre deg for å sørge for at det er noe i strengen
eller at strengen er minst 4 tegn;
noe er fint.
Så dette er i motsetning for eksempel med like pennies programmer som du skrev
hvor du måtte sørge for at du skulle få ikke-negative tall;
du måtte være sikker på at du får riktig antall dager i en måned.
Og hvordan gjør dere det?
Hvordan ville du gjøre denne testen?
Hva gjorde som krever at du bruker?
>> Do-mens sløyfer.
Do-mens sløyfer, andre typer løkker, også, ja.
Så det viser seg at vi ikke trenger å bruke en løkke i dette tilfellet,
når vi ber om en streng, som er slags hyggelig.
>> Greit, flytte på.
Så, Stella.
Kan du fortelle oss litt om hva vi skal gjøre nå?
Så nå har vi fått streng, har vi den lagret i en variabel;
hva trenger vi å gjøre med strengen?
>> Vi må -
identifisere to -
Ja, bare si det på engelsk, det er fantastisk.
>> Identifiser [hørbar] hovedsteder - eller, store bokstaver.
Ja, så du vil identifisere hvilke som er store og små bokstaver.
Vi kan ikke store eller små bokstaver dem før vi har identifisert hvilke.
Så vi skal sette det inn her.
>> Så, bare tenke på denne prosessen,
hvordan gjør vi dette identifisering?
Vet du, Dan?
Slags hva vi - hva verktøyet vi har for å bruke ut av verktøykassen vår?
>> Jeg ville sette det i en eller annen måte i som en matrise eller hver linje
er sin egen lille boks,
og deretter store bokstaver det derfra eller ikke.
Ok, så ett verktøy vi kan bruke er en matrise.
Hva har vi å se på i strengen,
men å finne ut - vi måtte se på tegnene.
>> Så du har fått til å se på lengden av strengen?
Ja, slik at en del av det er å få lengden på strengen.
Bare av nysgjerrighet, hva vi bruker for å få lengden på en streng?
>> Strlen?
Ja, strlen, vi kaller dette "strlen"
Alle disse strengfunksjoner, så strlen er en funksjon,
og det er super praktisk, fordi vi kan bruke det til bare si,
Hei, strlen: Her er en streng, fortelle meg hvor lenge det er.
I foredraget i dag, snakket David mye om hvordan strlen er implementert,
hva som faktisk skjer bak kulissene.
Men dette er en av de aller fortreffelig hendig seg.
Det finnes andre som også er i strengen biblioteket,
som strcmp, som er stavet "strcmp",
som brukes til å sammenligne strenger til hverandre.
Andre som du vil bruke som strstr,
som er bra for å finne sub strenger og så videre.
For det meste, de alle begynner med str og deretter gå videre til å være noe annet.
Grunnen til at de ikke faktisk stave dem som streng og så videre
er fordi tilbake i som de tidlige dagene av C,
når folk var første skriving og alt det,
de hadde begrensninger på antall tegn du kan bruke
for funksjonsnavn og variabelnavn,
slik at alt er som super kondensert.
Men når du ser noe som begynner med str,
det betyr vanligvis dette har noe å gjøre med en streng.
>> Ok, så du er nødt til å få lengden på strengen,
og da, hva gjør vi med figurene?
Vet du, Sam?
>> Har jeg ingen anelse om, jeg prøvde å finne ut av det.
Jeg vet virkelig ikke - jeg skulle ønske det var noen måte å -
Jeg mener, jeg tror kanskje vi kunne gjøre noe med odds og jevner,
men jeg vet ikke om noen funksjon sånn.
Ja.
>> Men det - det ville ikke nødvendigvis fungere,
fordi da ville få mellomrom for å være -
du må ha plass til å få tips om hvordan -
Okay.
>> Jeg vet ikke - jeg slags tapt på dette punktet.
Ja - nei, nei, nei, disse er gode poeng.
Så det vi trenger å gjøre er, som Sam sa,
vi trenger å spore hvilke bokstaver er de odde bokstaver,
og hvilke som er de enda bokstaver.
Men vi ønsker å sørge for at vi ikke bare ser
ved den odde og like
indekser i strengen,
men heller ser på de odde og like bokstaver i strengen,
så vi må ganske ha dette skillet mellom
bokstaver - som hva er egentlig A, B, C, D, eller så på,
og hva ting er ikke bokstaver, men fortsatt i streng vår.
For eksempel her, som dette utropstegnet er ikke en bokstav,
men det er fortsatt en del av strengen vår, det er fortsatt en røye.
Likeledes, alle disse mellomrom -
det gjør ikke fornuftig å kapitalisere en plass, ikke sant?
Så vi ønsker å sørge for at vi liksom hoppe over dem
samtidig sporing odds og jevner.
>> Så snilt av i vår programmering verktøykasse
så langt, om du vil,
Vi har en rekke forskjellige verktøy som vi har snakket om.
Så en, for eksempel, er variabler,
som vi har snakket om her.
Annet verktøy vi har snakket om er funksjoner.
Så vi har snakket om variabler i pseudokode vår her oppe
som hva vi kommer til å bruke til å lagre vårt bånd.
Vi har snakket om funksjoner for å få lengden på en streng, som strlen.
Vi har snakket om noe annet, og vi har snakket om det
for mye tidligere i avsnitt dag: looper.
>> Hva tror dere om å bruke en løkke i dette programmet?
Jared, hva tror du?
Ville vi bruke en løkke i dette programmet?
>> Sannsynligvis ikke, nei, fordi du ikke trenger å gå gjennom det mer enn én gang.
Ok, trenger du ikke å gå gjennom hva mer enn en gang?
>> Hele strengen.
Høyre, så du trenger ikke å gå gjennom streng hele en gang.
Beklager at laget absolutt ingen mening!
Du trenger ikke å gå gjennom hele strengen mer enn én gang.
Okay.
Hva tror du?
>> Jeg tror at det er bedre å bruke dem
slik at vi kan gjøre som kapitalisere mens
plasseringen av det er [uhørbart] nummer.
Stor, og så utnytte hva?
Ok, så vi sier at
vi bør bruke en løkke fordi vi ønsker å
en stor bokstav, mens det er ikke et tall.
Så - beklager, ville du legge til?
>> Jeg hadde tenkt å si at måten du behandler strengen
og det [uhørbart] skille [uhørlig] på tegn?
Ja.
>> Og da kan vi tildele tallene til -
eller basert på plasseringen av bokstavene i strengen?
Ja.
>> Og identifisere om det er oddetall eller partall, og å kapitalisere brevet selv
mens plasseringen av brevet er [uhørlig] - beklager.
Flott.
>> Så bare en oppsummering.
Kan du minner meg om navnet ditt igjen - jeg beklager.
>> Charlotte.
Charlotte, ok.
Så hva Charlotte sier,
som er helt rett - gosh, dette liker å auto innrykk på meg -
er at hvis vi ser på en streng
som dette på toppen -
"Takk for add" -
som en sekvens av tegn
der den er i stillingen 0,
h er i posisjon 1.
A er ved 2, så vi fikk 3, 4, 5;
plassen er i posisjon 6.
Mens - hva er stillingen f?
7!
O? 8.
R? 9.
Og så har vi 10, og da jeg ikke kan virkelig skrive den uten at det
ganske få rotete på skjermen.
Men dette er faktisk hvordan vi kan snakke om strenger i minnet.
Er det en streng
er en sekvens av tegn,
og når vi refererer til en individuell karakter i en streng,
vi ofte gjøre det ved å henvise til det tegnet posisjon
i strengen,
sannsynligvis på samme måte som vi snakker rundt september
være den niende måneden i året
eller mandag er den første dagen i uken.
Så dette gir oss en måte å
finne ut hvilke som er merkelig versus selv
fordi du kan se her,
hvis vi matche det opp med denne T,
du kan se at alle de aktiverte seg
er at selv posisjoner,
minst for det første ordet,
og deretter ting blir kastet av når vi treffer den plassen,
fordi vi ikke teller denne plassen som et brev,
så det er som om vi startet
og gikk 0, 1, 2, 3, 4, 5,
plass, 6, 7, 8, plass,
9, og deretter 10, 11, 12, og så videre.
>> Kult, så vi definitivt vil ønske å bruke noen form for sløyfe
å gå over hver av karakterene i sving.
Så på dette punktet,
vi vil komme tilbake til vår gamle pseudokode her.
Som en del av denne identifisering av hvilke som
som er store og hvilke som er små,
vi ønsker å gjøre dette i en slags loop.
Loop, kolon.
Hva slags loop, ut av hvilke typer sløyfer som vi har,
synes å være en god en å bruke i dette tilfellet?
>> Jeg tenkte for loop.
Og hvorfor er du tenker på for loop?
>> Fordi den starter på null, og deretter
når vi nå lengden av strengen,
og deretter hver iterasjon du kan [uhørlig], også?
Ja, akkurat.
Så, ut av de forskjellige valg av loops,
vi har for looper, mens sløyfer, og gjør-mens sløyfer.
Hvor en for løkke er spesielt nyttig
er når du ønsker å vite
slags hvor du er i loopen,
hvor mange ganger løkken er utført så langt.
Som er akkurat hva vi ønsker å vite i denne situasjonen,
som Kelly sa,
basert off av Charlottes tidligere kommentar at vi ønsker å vite posisjonen
av tegnet i strengen,
og for loop vil gi oss nettopp det,
fordi hvis vi starter slags ser tilbake på strengen vår,
hvis vi starter vår for løkke på 0,
og vi gå opp gjennom lengden av hele strengen,
så vi kan knytte bokstaven T
med 0 i vår for loop,
bokstaven H med 1 i vår for loop, og så videre,
å gå hele veien til slutten av strengen.
>> Så la oss starte koding dette bare en liten bit
bare så dere får et inntrykk av hva dette ser ut.
Jeg kommer til å lagre denne,
så vi har fått vår pseudokode her,
og jeg kommer til å slette alt.
Så jeg har en blank tavle.
Jeg skal begynne med å skrive int main (void)
{
Jeg skal sette return 0 i
og deretter}.
Så vanligvis når jeg begynner å programmere, dette er hva jeg begynne med.
Jeg skal lagre den slik at dere har det.
Så en av de første tingene vi snakket om var
å få innspill fra brukeren
og lagre den i en streng.
Hvordan får vi innspill fra en bruker?
>> GetString.
GetString, all right.
Så hvis jeg skriver GetString ()
og et semikolon.
La oss prøve å kjøre dette, vil denne kjøre, først av alt?
Og hvorfor vil ikke dette gå?
>> Du må deklarere variabelen.
Jeg må erklære en variabel. Okay.
>> Så hvordan gjør jeg det?
Har du noe imot å skrive noe, dele det?
Og så kan vi trekke den opp.
La oss se, Dan, høyre, greit.
Eller Daniel. Mottatt i, inndata = GetString ().
Awesome.
Vil dette kjøre?
La oss prøve det.
Hit løp, opplasting kildekode, bygg, det oppstod en feil.
Okay.
Så hva skjer her?
Bruk av svart identifikator 'streng'.
>> Vi må inkludere bibliotekene?
Ja, så Dan sier vi må inkludere bibliotekene.
Er det hva du skulle si, Stella? Awesome.
Det er kjempebra, så Stella, kan du
kopiere denne koden ut av Daniels Space?
Hvis du klikker på Daniel Roland Ki, kopiere den,
og da vil du sette inkluderer line i, og deretter lagre den ut?
La meg vite når du er klar.
Så dette inkluderer syntaks er også slags funky;
Det er sånn hash tag,
og det har blant annet, og så er det disse vinkelparenteser.
Husker du hvordan dette fungerer, eller skal jeg sette den opp på denne koden her?
>> Jeg er god.
Okay.
>> Jeg trykket det - jeg var ikke sikker på hvilket bibliotek, skjønt.
Oh, ok - ja, så det er det CS50 biblioteket.
>> Å, la jeg stdio bibliotek.
>> Oh, fikk den - ja, nei, that -
så viser det seg at strengen er faktisk noe som er spesielt for CS50.
Det er faktisk ikke en ekte strengtype
fordi akkurat her, er streng i den type stilling, -
vi erklære en variabel kalt input av typen string -
og vi setter innsiden av innspill
verdien som blir returnert til oss: produksjon av denne GetString funksjon samtale.
Du kan si dette er en funksjon samtale fordi det har parentesene, akkurat som printf gjør,
akkurat som strlen gjør.
Men strengen er faktisk ikke en ekte typen
i C-språk.
Vi har gjort det til en type, og vi vil ta om mer hva det egentlig er
i C, fordi det er en måte å jobbe med strenger;
Vi har nettopp gjort noe for å gjøre det ser litt hyggeligere.
>> Så her går vi.
Her er Stella kode.
Det fikk # include .
Andre mennesker vil kalle dette som en hash inkluderer noen ganger eller en skarp inkludere.
Nå kan vi starte den, kjøre den,
og vi fortsatt får en feilmelding.
La oss se hva som skjer.
"Ubrukt variable" input "."
Ok, så det kult, det er kult.
Jeg mener, det er ikke kult,
fordi vi får en feil og det er ikke kjører,
men hva dette sier er at
Vi har ikke brukt vår variabel, noe som gir mening.
Vi har ikke prøvd å gjøre noe med det.
Dette er en måte som
Clang prøver å hjelpe oss med å gjøre at vi ikke bare bruker variabler
og deretter utilsiktet kalle dem noe annet senere i koden vår,
hjelpe oss til å unngå feil på den måten.
>> Greit, så vi har fått innspill fra brukeren,
vi lagret den i en variabel.
Det neste skritt var å så
begynne å se på alle de tegnene i strengen
og identifisere hvilke som er å bli stor
og hvilke som skal være små.
Og som Kelly og Charlotte brakt opp,
Vi gjør dette ved hjelp av en for-løkke.
Så husker noen syntaksen til en for loop
og ønsker å ta en stikke på bare å skrive
den første linjen i for loop, bare for bit?
Kelly, vil du gi det et forsøk?
>> Ja, så du må initialisere først,
så jeg satte i = 0,
og da jeg gjorde jeg <strlen ().
Er det i Space din - kan jeg dra den opp?
>> Ja, skrudd jeg opp litt, men ja.
>> Ok, la oss dra det opp.
Awesome.
>> Men da jeg visste ikke om du hadde det -
Ja, ok.
Så her er det Kellys fikk: la oss se på det raskt.
Så hun har tatt med CS50 bibliotek på toppen.
Hun er inkludert standard IO biblioteket øverst,
og standard IO har funksjoner som printf,
så hvis du noen gang ønsker å bruke printf, må du den linjen.
Og da hun følger strengen biblioteket,
som vi trenger,
fordi strengen biblioteket har strlen funksjon,
som vi får til i bare litt.
Så hvis vi ser på hva Kelly har gjort her,
kan du lede oss gjennom hva du gjorde?
>> Ja, så - jeg mener, jeg fikk feil, så -
Ja, nei, det er -
>> Så jeg ønsket å ringe strengen at jeg fikk bare "streng".
Jeg ønsket å skrive ut strengen
og da jeg -
Jeg ønsket å like stille strengen som liker en rekke av hver karakter
være annerledes [uhørlig], ikke sant?
Og da jeg ønsket å starte i posisjon 0
og deretter hver 2. plasser,
Jeg hadde tenkt å kapitalisere,
så jeg nettopp beskrev det som 23, fordi jeg var ute på ASCII-tabellen.
Så det er hva jeg tenkte - jeg vet det ikke er riktig.
>> Fikk den, så dette er en god start.
Jeg tror mye av rammeverket er på plass her.
La oss gå gjennom slags linje for linje og se hva som skjer.
Så slik jeg liker å gjøre dette på er å starte bare ved å kompilere koden
og la kompilatoren fortelle meg som hva som er galt med min kode,
fordi kompilatoren er virkelig god til å fortelle deg hva som er galt med koden.
Så hvis vi spiller det, bygge, og det bygger ikke.
Det står at det var en feil,
så hvis vi bla ned og se på den første feilen,
det sa -
Vi blar tilbake til toppen,
vi kan se det er 5 feil som genereres her nede på bunnen.
Oops, det er virkelig avskåret.
Jeg antar det er bare ikke kommer til å få noe bedre.
>> Here we go.
Så er det 5 totalt feil som genereres.
Her kan jeg bare se de første 2,
slik at jeg kan flytte denne opp litt og deretter slags bla opp.
Dette er kommandoen som ble kjørt for å kompilere koden,
og deretter den første feilen var i file.c her:
"Forventet identifisere eller '('", og det var på denne linjen
hvor vi sa string = GetString ().
Du kan se her at det var på linje 8 av file.c,
og da tror jeg dette er tegnet 12 - det er feil.
Så hva som går galt på linje 8 - Kelly?
>> Du trenger bare å kalle det, som, et brev eller noe,
som streng s eller noe?
Ja, så viser det seg at disse spesiell type navn,
så streng, int, røye, kort,
de er alle spesielle nøkkelord,
og du ikke kan faktisk bruke dem som navn på variabler,
fordi kompilatoren ser på det og sier,
"Å, jeg vet det er en type"
slik at du ikke kan faktisk ha en streng variabel kalt streng,
som jeg prøver å gjøre her, og dette vil ikke fungere.
Men i stedet, kan vi kalle det noe sånt som s eller st eller str.
Vi kunne ikke også kalle det int.
Vi kan ikke ha en streng som heter int.
Vi kan ikke ha en streng som heter char, ingen av dem vil fungere.
>> Så får vi bare kaller det er for tiden.
Awesome.
Så hva blir det neste som skjer i denne linjen?
String - denne linjen ser ganske bra?
La oss gi det et forsøk, la oss kjøre den.
Ok, så vi fortsatt får feil.
Denne gangen er vi ned til 4 feil.
Så fikk vi en av dem.
La oss gå opp.
"Uventet type navn 'streng': forventet uttrykk," ja?
>> Ja, det er fordi jeg prøvde å nevne strengen.
Ja, så det ser ut som vi nå også må gå fix
alle disse referanser til streng.
Du kan se det er en referanse til streng her, ett her, ett her,
slik at vi kan flytte alle disse til s.
Flott. Ok, kjøre den på nytt.
Building - en annen feil.
>> Ok, nå er vi nede i én feil,
så int i = s og deretter klammeparentesene.
Så kan du fortelle oss litt om hva du gjorde her, Kelly?
>> Ja.
Det var på linje 10.
>> Jeg vet ikke om vi trengte det hele,
men jeg tror jeg prøvde å -
Jeg skal lagre den slik at du kan følge med.
>> Jeg tror jeg var
prøver å fortelle det til å begynne i posisjon 0
i begynnelsen av min for loop,
så jeg tror kanskje det å si var unødvendig.
Så bare for å oppsummere,
du sa at dette - du prøvde å starte dette i posisjon 0
og få dette - ja,
så jeg tror tidligere også, når du gikk gjennom koden,
du snakket om hvordan du ønsket å behandle strengen som en matrise
slik at vi kan få tilgang til hvert tegn individuelt.
Jeg tror Dan nevnt matriser, også, prøver å konvertere strenger til arrays.
>> Det viser seg at slik under panseret,
en streng er faktisk lagret som en matrise allerede,
og du kan få tilgang til det som en matrise;
det er ingen konvertering som du har å gjøre.
En streng er ikke - så -
en streng er egentlig ikke en matrise,
men du kan få tilgang til det som sådan, fordi alle tegnene er lagret
en rett ved siden av hverandre i minnet,
så hvis du ønsker å få det første tegnet i strengen,
Det er det samme som å få det første heltall i et heltall matrise.
Slik at vi ofte - vi vil
referere til 2 lignende
oh, som en streng, som en matrise,
selv om det egentlig - de svært forskjellige ting,
men du kan behandle dem veldig mye det samme.
Så det viser seg at denne linjen faktisk -
Vi trenger ikke å gjøre noen konvertering,
og faktisk,
Dette er faktisk ikke et gyldig uttrykk,
som er hva vår kompilatoren er å fortelle oss.
Det sier: "Hey, ventet det et uttrykk,
og hva jeg har her er noe som ikke er et uttrykk. "
Å erklære en matrise,
alt du trenger å gjøre er noe som dette med et semikolon,
og deretter fortelle rekke hvor lenge du vil den skal være,
eksempel 5, så denne linjen 10
vil erklære en matrise jeg ringte med 5 heltall i det.
>> Dette er en side, og dette er ikke nødvendig for koden,
men dette er - dette er slags hva erklæringen ser ut.
>> Hvordan ville du ikke bruke røye i [strlen (s)]?
Char i [strlen (s)]?
>> Røye i, og deretter inne i parentesene strlen (s).
Ja, så vi kunne -
vi kunne gjøre dette,
og dette ville erklære - hva ville dette gjøre?
>> Jeg tror det ville erklære en matrise
av, som - av -
oh, trenger du ikke i - oh,
yeah, du definitivt ikke trenger jeg.
Du erklærer en rekke tegn
av lengde s.
Og så hva Sam sier er at
denne linjen 10 - la meg sette noen plass i mellom den og resten slik at vi kan isolere det -
denne linjen 10 ville erklære en matrise
av tegn, strlen (s) verdi av dem,
men vi faktisk trenger den i,
og grunnen til at vi trenger jeg er fordi vi trenger å gi tabellen et navn;
ellers ville vi ikke ha en måte å referere til tabellen senere i koden.
>> Så dette her er rekke navn
og er inne i lengden.
Dette vil gi oss en matrise,
men dette er - igjen, dette er en erklæring.
Det er ikke en oppgave, det er ikke en initialisering.
Hvis vi erklærer denne tabellen som dette,
det er faktisk ikke noe i innholdet i matrisen.
Det er bare junk - hva er der inne.
Og som vi sa,
vi faktisk ikke engang trenger å gjøre denne konverteringen,
fordi vi allerede kan behandle streng s som en matrise.
Jeg vet at vi kjører en litt lang på tid,
men jeg vil bare veldig raskt komme til dette for loop
og viser deg hvordan du får tilgang til enkelte tegn i rekken,
fordi det er nøkkelen for tildeling vår.
Og så får vi la deg gå derfra.
>> Så her har vi en for loop
som ser nesten bra.
Hva er ikke helt nesten der?
What's - hva er ikke helt rett om dette for loop?
>> Ingen klammeparentes?
Ingen klammeparentes, for en.
Vil sørge for at vi har kroppen av loopen med klammeparentes.
Oops, ikke plassen spenne!
Og hva er det neste ting som vi trenger å gjøre med dette loop?
Hvis jeg prøver og kjøre den,
hva denne feilen at jeg får?
Jeg får alle disse feilene - Jeg må initialisere jeg.
Flott.
Så dette blir en løkke - dette er ikke helt der,
men det blir veldig nære.
Denne koden kan vi nå kjøre,
bygge, oppstår det en feil likevel.
Hvorfor er det fortsatt klager,
sier uttrykket er ubrukt,
og det er fordi denne linjen ikke gjøre noe.
Vi gjorde ikke lagre den hvor som helst, vi gjorde ikke lagre resultatet.
Hvor skal vi være redde dette resultatet?
>> S eller jeg?
Nøyaktig, og denne funky syntaks,
dette er med klammeparentesene
betyr tilgang til i-th karakter s.
Det kommer til å være noe som er veldig viktig for oppdraget.
Dessverre, vi nødt til å stoppe her,
slik at Sebastian delen kan komme inn,
men jeg er glad for å bo etter utenfor og vil ta noen spørsmål.
Så takk folkens for kommer.
Dette skal nå laste opp, bygge, drifte.
Vi kan skrive inn en streng som "hallo"
og det skrives "QOX".
[Latter]
>> Så ikke helt der, men beveger seg, får mot de sløyfer!
Takk for at du kom, og jeg skal være utenfor.