>> ROB: Greit.
Velkommen til den første delen.
Jeg er Rob.
>> JOSEPH: Jeg er Joseph.
>> ROB: Så vi vil dykke rett i.
Første ting å snakke om Er apparatet.
Så forhåpentligvis de fleste av dere har lastet det ned allerede.
Men du kan se instruksjonene på cs50.net/appliance.
Å gud, nå er jeg sjenert.
Jeg kan fortsatt høre det.
>> JOSEPH: Wow, høres det ut som det er desorientert.
>> ROB: Så noen mennesker har hatt problemer med det, så ikke vent til
i siste øyeblikk av problemet satt til prøve og løse Appliance og
finne ut at det ikke fungerer.
>> JOSEPH: Og hvis det er noe som ikke fungerer og du trenger hjelp, kan du gå til
cs50.net/discussion hvor vi ha et forum hvor du
kan legge inn spørsmål.
Og vi vil komme til dem til slutt.
>> ROB: Greit.
Så dette er hva Appliance ser ut.
Igjen, det er bare en helt egen operativsystem som kjører innenfor
uansett hvilket operativsystem du kjører på din bærbare PC.
Og de viktigste tingene du vil skal bruke er gedit.
Så forhåpentligvis har allerede bli et kjent område.
Terminalen.
>> Og du kan også kjøre Chrome innenfor Appliance.
Det har vært et par personer som har rapportert internett
ikke jobbe i Appliance.
Og noen av dem har bare antatt at det ikke er ment å bli
Internett i Appliance.
Men ja, er det ment å være internett.
>> Jeg vil si det akkurat nå, men det gjør ikke egentlig betyr noe.
Hvis internett ikke fungerer, Dette er hva du pleier å trenge
å kjøre for å fikse det.
Hvis du har Internett-problemer, ikke husker det, bare legge det ut på
Diskuter, og vi vil si, kjøre det.
Men internett bør jobbe.
>> Så den eneste andre ting - ja, ingenting annet er virkelig relevant.
Men jeg ville bare påpeke at -
se i denne nederste høyre hjørne.
Så hver av dine apparater skal ha en IP-adresse.
Og senere i semesteret, denne IP -postadresse vil bli mer aktuelt når
du arbeider på nettet p-sett, fordi vil du være i stand til å få tilgang til
nettsiden du jobber med fra din lokale Chrome ved hjelp av denne IP-adressen.
>> Men det jeg liker å bruke IP-adressen for - og du trenger ikke å gjøre dette, jeg
bare ønsker å peke det ut -
er her.
Så dette er et terminalvindu på min Mac, er dette ikke i
Apparatet i det hele tatt.
Og du kan se opp hva denne kommandoen gjør.
Men jeg kommer til å SSH direkte til min Appliance.
Jeg vet ikke hva IP er.
>> JOSEPH: 168 -
>> 168.224.1.0.
>> ROB: Så når jeg er ferdig med dette, må du logge inn
Nå, i utgangspunktet, er denne identisk med en terminalvindu innenfor mitt Appliance.
Så jeg ganske mye faktisk aldri jobbet innenfra selve apparatet.
Jeg bare alltid har den i gang i bakgrunnen minimert
og SSHed inn i den.
>> Problemet med dette er at du ikke kommer for å kunne bruke gedit lett
direkte fra denne.
Men hvis du ønsker å være en virkelig kul hacker, så bør du bli vant til et
kommandolinje tekst editor uansett.
Så Vim og Emacs og Nano, alle disse er forskjellige alternativer.
Nano en tendens til å være den enkleste.
Og jeg tror det har ingen syntax highlighting.
Å, nei, det gjør det helt.
Så du kan bruke Nano, fordi at man er ganske lett.
>> Du ser alle disse kommandoene på bunnen.
Denne lille gulrot symbol.
Hvis du ikke har sett det før, vil du trolig se det mye nå.
Det betyr som regel kontroll gulrot, som nederste venstre på tastaturet
kontroll karakter.
Så her er det forteller meg ned her -
Å, det er ikke avskåret hvis jeg zoomer inn
Så Control, er X hvordan Jeg kommer til å avslutte.
Og det står jeg kan treffe Y for Ja, for sparing, N for Nei.
Så det er Nano.
>> Vim og Emacs har en tendens til å være litt mer komplisert og overveldende.
Men du kan bli vant til det, og da vil du elske det.
Så det er det.
>> JOSEPH: Du trenger ikke å gjøre det.
>> ROB: Yeah.
Du står fritt til å bruke gedit for Resten av semesteret.
Så noen apparatrelaterte spørsmål?
Eller har du noen tanker om hva annet trenger å bli snakket om om
apparatet?
Ja.
>> SPEAKER 1: Når du SSHed inn ting, var passordet Crimson?
>> ROB: Yeah.
Passordet for stort sett alt i Appliance kommer
å være Crimson.
>> SPEAKER 2: Installer som en ekte IDE på apparatet, vil det fungere?
>> ROB: Jeg kan tenke meg Eclipse har en Fedora-versjonen, og i så fall, ja,
du kan gjøre det.
Det er nok egentlig ikke verdt det.
>> SPEAKER 2: OK.
Så det er nok lettere hvis jeg ønsket å bruke Eclipse, bare bruk den innfødte og
så laste opp til -
>> ROB: Åh, er det også trolig lettere.
Men du kan få det til å fungere innenfor Appliance.
>> JOSEPH: Og for kameraet, spørsmålet var, kan du installere en annen
IDE innsiden av Appliance?
>> ROB: Eclipse er en eksempel på en IDE.
Andre apparater spørsmål?
OK.
>> Så vi vil nå gå videre til kommandolinjen grensesnitt-relaterte ting, så CLI.
Og igjen, jeg bare kommer til å jobbe i her, fordi dette er identisk
arbeider innenfor et terminalvindu innenfor Appliance.
Hvordan er det skrift ute?
Er det stort nok?
OK.
>> Så det er mange kommandoer som du bør bli ganske vant til
gjennom hele semesteret.
Den store to for å navigere er ls, liste filene i denne katalogen, og
cd, så endre katalogen.
Så jeg kan endre til skrivebordet og deretter en veldig vanlig mønster er cd til en
katalog og umiddelbart ls hva er i katalogen.
>> Folk også noen ganger ikke skjønner at Tab ferdigstillelse er en ting.
Så ut som cd, vh, og da jeg traff Tab.
Jeg nesten aldri skriver ut hele greia.
Og så hvis jeg holder treffer Tab igjen, vil det automatisk
starte oppføringen for meg.
Så jeg kan ikke CD vhosts, lokale verten.
Og det er bare å gå til -
i tilfelle du ikke har hørt uttrykket før, er katalogen bare et annet ord
for mappen.
Så nå hvis du ser -
la oss ta med at til toppen.
>> Så nå hvis du ser i parentes, du se den lille tilde, slash, vhost,
slash, lokale verten.
Så tilde, refererer at til min hjemmekatalog.
Det er en katalog du er i når du SSH i.
Det er den katalogen du er i når du åpner opp en terminal.
Det er der du starter.
Og så er jeg inne i min hjemmekatalog, og jeg er inne i vhost
katalogen innsiden av min hjemmekatalog.
Og da er jeg inne i den lokale vert katalogen innsiden av det.
>> Så noen andre nyttige ting med cd -
eller godt, generelt, så dot alltid refererer til gjeldende katalog.
Cd, er dot en ganske verdiløs kommando.
Men det forandrer seg til gjeldende katalog.
En mer nyttig en i form av cd er prikk, prikk, som er
bare gå opp en katalog.
>> Og merk at disse -
Jeg ønsker å si aliaser, men disse symboler, prikk, og prikk, prikk, de som arbeidet
for ganske mye noen kommando du er kommer til å tenke på å kjøre.
Så ut som cd er sannsynligvis der du vil være ved hjelp av de fleste, men disse er ikke
ting som bare cd forstår.
Det er ganske mye noe hele kommandolinje forstår.
En rekke programmer forstå prikk og prikk, prikk.
>> Så de andre nyttige seg - cd, dash.
Så det kommer til å bringe meg til siste katalog som jeg var i.
Så noen ganger vil jeg gjøre noe sånt, oh, jeg jobber her.
Og jeg ser noen feil med noe, og Jeg skal gå undersøke det ved å gå til
noen tilfeldige katalogen et sted.
Og jeg vet ikke om det vil la meg i det.
Det vil det.
Så da jeg gjøre hva jeg vil i denne katalogen.
Blah, blah, blah, blah, blah.
Og jeg var som, all right, jeg vil å gå tilbake til der jeg var.
cd, dash, og det bringer meg rett tilbake.
>> Så jeg kommer til å kaste mye av disse på deg i dag.
Jeg forventer ikke at du å huske alle.
Det er slags bare vet at de eksisterer.
Og så senere når du er som, hmm, jeg ønsker å gå tilbake til
katalog som jeg var bare på, oh, vent, noe sånt eksisterer.
Du trenger ikke å bare skrive inn hele katalogen på nytt.
>> JOSEPH: Og til slutt vil du bare bruke dem om igjen og om igjen, og
det vil bli muskel minne.
>> ROB: Yeah.
Så hvordan jeg sa tidligere, at tilde er hjemmekatalogen.
Så jeg kan cd, tilde.
Men jeg trenger ikke engang å gjøre det hvis jeg bare -
Jeg skal gå tilbake til katalogen så det er ikke en meningsløs eksempel.
Men hvis jeg bare gjøre cd, det er også den samme som, gå til min hjemmekatalog.
Jeg gjør Command, K.
>> JOSEPH: Du kan også skrive klart, ord, og det bør klare det.
>> ROB: Og jeg tror også Control, L gjør det også.
Så mange forskjellige måter.
Jeg tror det er noen forskjeller der klar og kontroll, L vil bare
virkelig presse den til toppen og Jeg kan fortsatt rulle tilbake.
Command, K bokstavelig talt ødelegger alt, og du
kan ikke bla opp igjen.
I det minste, det er hvordan det fungerer i iTerm2.
Jeg vet ikke hvordan andre ting -
oh.
>> Med SSHing, så hvis du er på Windows, du er nødt til å laste ned PuTTY
for å SSH siden Windows ikke ha som en innebygd SSH verktøyet.
Fra Mac, kan du bare SSH direkte fra et terminalvindu.
OK.
Spørsmål?
>> Med ls, så noe å bli vant til med de fleste av disse kommandoene er -
vel, jeg skal bare gjøre én.
Ls, dash, l.
Så dash, l er hva vi skal å ringe et flagg til ls.
Og mange av disse kommandoene har flagg at du kan gå over til dem.
Så i dette tilfellet, er dash, l et flagg som forteller det til å gi meg en full
oppføring av alle opplysninger av disse filene.
>> Så vi ser her at skrivebordet var endret 30. juli kl 12:54.
Nedlastinger ble endret 6. september.
Dette er den nåværende størrelse og byte av disse katalogene.
Du trenger ikke å forstå alt dette.
>> Dette ting på venstre side, disse drwx tallet, som vil bli mye mer relevant
senere når du har å forholde seg til -
som har å gjøre med hvem som har tillatelse å se på disse filene.
Og så hvis du ikke var den eneste brukeren på denne datamaskinen, vil du være i stand til
si, OK, skal jeg være den eneste lov til å se på denne filen eller jeg er
kommer til å tillate alle å se på denne filen.
Så noen andre på min datamaskin kan se på denne filen.
Jeg vet ikke engang hva dette - hva betyr dette?
>> JOSEPH: Jeg er ikke helt sikker, faktisk.
>> ROB: Ingen anelse.
>> JOSEPH: Men hvis du ikke vet, det er en nyttig kommando som du kan bruke
å fortelle deg hva resultatet betyr.
Og hvis du skriver i mennesket før kommandoen -
slik at M-A-N. ROB: Man.
Så mannen er en annen som er svært nyttig.
Og mannen, ls.
Så man-sidene, har de begge kommandoer som du skal bruke
på kommandolinjen, og de har også funksjoner som vil være relevante
med C. Så du kan mennesket -
og jeg ignorert tre.
Men mannen tre printf kommer til å bringe opp C-versjonen av printf.
Men hvis jeg bare gjøre mennesket printf, er dette kommer til å få opp kommando printf
som skjer på kommandolinjen.
>> Så mann, ls.
Man-sidene kan være ganske overveldende.
Her, men vil du se denne oppføringen av alle disse flaggene som ls
forstår.
Så hvis vi går til dash, l, og -
Jeg kommer bare til å kaste dette på deg.
Men for å søke, vil du først treffe spørsmålet
mark eller slash-knappen.
Så slash.
>> Og så kan jeg søke for hva jeg vil.
Så jeg kommer til å kutte for dash, l.
Og det var det.
Så bruk en lang liste format.
Det hjelper ikke meg å finne ut hva den aktuelle kolonnen mente, men jeg
anta et sted i her det ville forklare det.
Så bruker man sidene for enhver kommando at du ikke umiddelbart forstår.
>> Jeg er ganske sikker på at du kan til og med mann, mann.
Et grensesnitt til den elektroniske referansehåndbøker.
Oh, en siste en som er kanskje litt relevant er ls, dash, en.
Så merke hvis jeg bare gjøre ls, Jeg får disse fem filer.
Hvis jeg gjør ls, dash, en, jeg får mye flere filer.
Så ting til felles mellom alle disse nye filer er prikken på forhånd.
>> Så konvensjonen er at en fil som begynner med en prikk er skjult.
Så du ikke ønsker å se denne filen, du ønsker ikke å ha det rotet med
katalogoppføring.
Det er bare når du eksplisitt be, all right, ls, dash, en, vis meg.
Den en står for alle filer, inkludert skjulte seg.
Så noen andre kommandoer.
Oh, spørsmål på dette punktet?
Ja.
>> SPEAKER 3: Når du gjør ls, en, hva er prikk, prikk?
>> ROB: Oh.
Så dette er hva jeg snakket om.
Det er det samme hvor Jeg kan gjerne cd, prikk, prikk.
Så teknisk sett prikk og prikk, prikk er filer som finnes i hver enkelt
katalogen der dot filen refererer til gjeldende katalog.
Så hvis jeg cd, prikk, jeg bare går å bo i katalogen.
Og prikk, refererer alltid prikk til forrige katalogen ett nivå opp.
Så hvis jeg går inn logger og ls, dash, al, Jeg skal se prikk, prikk. cd til prikk, prikk
bringer meg til den forrige katalogen.
Yeah.
OK.
>> Så en annen ganske viktig kommandoen rm.
Så det er det vi skal å bruke til å fjerne.
Og la meg faktisk gjøre en annen kommando først.
Så mkdir.
Mkdir er hvordan du kan opprette kataloger.
Og jeg vil opprette en midlertidig katalog og gå inn i den midlertidige katalogen.
Og som forventet, er det tomt.
Men hvis jeg ls, dash, en, jeg har fortsatt prikk og prikk, prikk, fordi dot refererer til
gjeldende katalog.
Og dot refererer prikk til forrige katalogen.
Og de vil alltid eksistere uansett katalogen du er i.
>> Og dette er et helt unødvendig kommando, men touch.
Jeg bare bruker det, fordi det er en enkel måte å opprette filer.
Så ta på en, berører b, berøre c er bare kommer til å lage tre filer som kalles en,
b og c som er helt tom.
Så poenget med meg å lage de i første omgang er bare slik at rm er
hvordan vi kan fjerne dem.
Så rm, en.
Det kommer til å spørre meg, fjern vanlig tom fil en?
Og så vil jeg si ja.
>> Så hvis jeg vet at jeg ønsker å slette filen uten å bli
bedt om det, fjerner regelmessig tom fil?, deretter rm, dash, f kommer til å være det
flagg som sier, tvinge fjerne uten selv å spørre meg, oh, er du
sikker på at du vil slette filen?
Ja, jeg er sikker.
Så rm, dash, fb vil bare gjøre det uten å spørre.
>> Så la oss gjøre noen flere kataloger.
mkdir, TMP2, cd, TMP2, berøre en, berøring b.
OK.
Så nå ønsker jeg å fjerne TMP2 som en katalog.
Så rm TMP2.
Du kan ikke fjerne TMP2, det er en katalog.
Så problemet her er at rm ikke umiddelbart arbeidet på kataloger.
Det er bare ment for filer som non-katalogfiler.
>> Og så hva vi kan gjøre her er rm, dash, r.
Som står for rekursivt, som kanskje ikke bety noe for deg ennå.
Men når du kommer til rekursjon, det vil bety mer.
Så rm, dash, r, TMP2 kommer til å rekursivt gå inn i den katalogen.
Så ned i katalogen TMP2?
Ja, la oss gå inn på det.
Ønsker vi å fjerne TMP2 / a?
Ja.
Ønsker vi å fjerne TMP2 / b?
Ja.
Nå ønsker vi å fjerne katalogen TMP2?
Ja.
Og så nå katalogen og alt inni
av den har blitt fjernet.
>> Det er teknisk sett en kommando rmdir som du kan bruke til å fjerne
kataloger, men det fungerer bare på tomme mapper uansett.
Og for å se det, la oss bare gjøre mkdir, TMP2 igjen.
TMP2, berører en.
OK.
Så hvis jeg prøver å fjerne dirtmp2, det vil si, katalogen ikke er tom.
Så jeg ganske mye aldri bruke remove dir kommandoen uansett, fordi rm, dash,
r vil fungere på tomme mapper og ikke-tomme kataloger.
>> Og også, hvis jeg ikke ønsker å ha til gå gjennom at hele prosessen med
synkende i katalogen og fjerne hver enkelt fil, rm,
dash, rf, TMP2.
Og nå er det borte.
>> Noe å være forsiktig om er rm, dash, rf.
Og det skremmer meg å selv skrive det, fordi hvis jeg ved et uhell
trykk Enter eller noe.
Så rm, dash, rf, tilde ville, uten spørre meg, vil ikke f ber ikke
meg, vil det automatisk fjerne Hele min hjemmekatalog og
alt i den.
Så du tror kanskje det er en dum ting å gjøre.
Og godt er det.
>> Men det kan skje veldig enkelt ved ulykke om, sier jeg ønsket å fjerne
min slash, vhost katalog.
Og akkurat i rask typing, Jeg tilfeldigvis gjør dette.
Som vil fjerne rekursivt både min filområde og vhost katalogen
i dette bestemte katalogen som bare skjer ikke eksisterer akkurat nå.
Men dette vil likevel fjerne Hele min hjemmekatalog.
Minst ved ikke å ha en f, det ville spørre meg først.
Og jeg vil være som, oh, nei, jeg ønsker ikke å gjøre det.
Men folk, slash, inkludert meg har en tendens til å komme inn i
vane å alltid rf-ing.
Selv vanlige filer som jeg kan bare RM, c, jeg har en tendens til å bare rm, dash, rf, c.
Bare vær forsiktig når du er rf-ing.
>> SPEAKER 4: Hva gjør C gjøre?
>> ROB: C er jeg snakker om at C-fil i denne katalogen, som rm, c.
>> JOSEPH: Og mer farlig, hvis du bruker en stjerne, refererer det til alt i
katalogen.
Så det jeg vanligvis pleier å gjøre, er jeg vil gå inn i en katalog, og jeg ønsker å
fjerne alle filene i det.
Så rm, dash, rf, stjerne.
>> ROB: Yeah.
Rm, dash, rf, stjerne.
>> JOSEPH: Og hvis du ikke er forsiktig hvilken katalog du er i -
Jeg var ikke i temp, men jeg var et uhell i min hjemmekatalog,
så skal jeg fjerne alt i min hjemmekatalog.
Og jeg har faktisk gjort det før, og Jeg tror du har gjort dette før eller
Jay har gjort det før.
>> ROB: Jeg har ved et uhell fjernet -
så overse at kommandoen for en bit.
>> JOSEPH: Ikke morsomt.
>> ROB: Så i skråstreken bin katalogen er en haug av binære filer der det vil
være kjent seg som klang.
Vel, klang og i utgangspunktet alle disse ting som jeg kjører på kommando
linjen er i denne slash bin katalogen.
>> JOSEPH: Som ls er i her.
>> ROB: Så prikk, slash, ls ville liste denne katalogen.
>> JOSEPH: Rm er også i denne katalogen.
>> ROB: Jeg har ved et uhell rm, rf-ed bin, som fjernet enhver kommando jeg kunne
muligens noensinne vil ha.
Som da jeg bare installere en ny Appliance på det tidspunktet.
>> JOSEPH: Så vær veldig forsiktig når du bruker denne kommandoen.
>> PUBLIKUM: [uhørbart]?
>> ROB: Ja.
Det er også en dårlig vane å komme inn.
Hvis du legger merke til, er jeg nå -
vel, kan du ikke legge merke til, men min zoom-in kanskje kan.
Så jeg er nå root @ apparatet.
Så jharvard er brukeren vi ønsker du alltid skal bruke.
Root er brukeren som har tillatelse å gjøre absolutt alt.
>> Så legger merke til når jeg er jharvard, hvis jeg prøver å cd -
hva er en katalog som?
Oh, er roten et godt eksempel.
Så cd, rot.
Tillatelse nektet.
Fordi hvis vi ser på denne nettsiden -
og igjen, trenger du ikke å helt forstå dette.
Men disse tre streker sier som ikke la noen andre
brukeren inn i denne katalogen.
Og katalogen skjer med være eid av brukeren root.
>> Så det faktum at jeg er jharvard og ingen en som ikke er roten er tillatt i
denne katalogen, det betyr at jeg er kommer til å få tillatelse nektes når jeg
prøv å cd inn i den.
Så når jeg er root, jeg har tillatelse til å gjøre absolutt alt, inkludert
slette viktige filer til Appliance og
ødelegge hele greia.
>> Så det er en dårlig vane å komme inn bare vandre rundt
operativsystem som root.
Jeg gjør det likevel.
Spørsmål?
Og jeg vil avslutte rot, opphold som jharvard.
OK.
>> Mer relevante kommandoer.
Så kommer tilbake til vår temp, den MV kommandoen står for flyttingen.
Du kan flytte en.
Nå ønsker vi å kalle det b, så nå er det som kalles b.
Eller kanskje vi ønsker å flytte b opp en katalog.
Så nå denne katalogen er tom.
Jeg skal gå tilbake til min hjemmekatalog, og vi ser at b er i her, fordi
hjemmekatalog var en mappe opp fra katalogen som b hadde vært i.
>> Det er også cp.
Så cp er kopiere super-delen, prikk, tekst.
Jeg kan kalle det er, prikk, tekst.
Nå har vi både super-delen, prikk, tekst, og s, prikk, tekst.
Dette fungerer også på kataloger.
Jeg rf-ed en enkelt fil.
Så cp -
vel, først la oss prøve cp, tmp, TMP2.
Så utelate katalogen tmp.
Så lik rm, standard oppførsel er å ikke jobbe på kataloger.
>> Og igjen, i likhet med rm, standard adferd - vel, få det til å fungere
med kataloger er en, dash-r unna.
Så kopiere rekursivt temp katalog i TMP2.
Og så nå har vi både tmp og TMP2, og det er ikke så nyttig siden tmp
var tom i første omgang.
TMP2.
>> Nå la oss kopiere tmp inn TMP2.
Og vi ser at TMP2 har også filen en, fordi katalogen og
alt innsiden av det katalogen ble kopiert.
Og det kan være noe nyttig hvis, sier du jobber
på oppgavesettet ett -
eller faktisk, senere problem sett er enda viktigere, fordi det
vil være en hel haug av filer og ting.
>> Men du bare vil, for en splitt andre, du liker, all right, jeg er
kommer til å prøve noe annerledes.
La meg bare kopiere hele mitt pset1 katalog i pset1 backup slik at hvis
Jeg ender opp med å skru opp ting, jeg kan gå tilbake til min backup-katalogen.
Det er mer hensiktsmessige måter å versjons sikkerhetskopiering koden din, men
Dette er alltid en rask måte å bare gjøre at du har en kopi av noe
at du er i ferd med å endre.
>> Så ekko er også en one-off kommando som slags sillily vil bare skrive ut til
kommandolinje nøyaktig hva du ønsket å ekko.
Så ekko hi.
Vi vil bare skrive hei.
Echo hello world.
Vi vil skrive ut hello world.
Som kommer i bruk når du begynne å kombinere kommandoer.
>> Og igjen, ikke forvent deg til helt forstår dette ennå, men det er
noe å se.
Og så hvis du Googling for eksempler eller du innser at du ønsker å gjøre
noe, kan det være nyttig.
Så la oss, som et eksempel, så ls, dash, l.
Så her ser jeg resultatet av ls, dash, l.
Og jeg sier, OK, jeg ønsker å lagre det i en fil.
Alt dette produksjonen her, jeg vil ha å sette inn i en egen fil.
>> Så dette litt større enn symbol er hva vi kommer til å ringe.
Vi omdirigere utgang til en fil.
La oss kalle filen blah, fordi det er hva jeg pleier alltid å kalle det.
Så nå ser vi at vi har en fil blah akkurat her.
Og hvis jeg åpner den opp, vil jeg se det er nøyaktig output fra kommandoen
at jeg bare løp.
Og på samme måte, kan du -
hvis dette var utgang til en fil, denne er få innspill fra en fil.
Hva er en kommando som jeg -
>> JOSEPH: Jeg tror du kan bruke mindre eller mer, sannsynligvis.
>> ROB: Men hva med bare mindre blah?
Jeg vet ikke.
Hvis du kommer inn i dette scenariet, som det er psets at det er nyttig for.
>> JOSEPH: Du kan rør det inn i ekko.
Pipe filen til ekko for å se det.
>> ROB: Det er rør.
>> JOSEPH: Beklager.
>> ROB: Greit.
Så dette er utgang til en fil.
Dette er få teksten fra filen og overlate den til programmet.
Og du vil også se denne fyren.
Så dette er slags gjøre begge deler på en gang.
Og faktisk, vil jeg presentere to nye kommandoer bare for å gjøre bruk av den.
>> Historien er en hendig kommando som er bare kommer til å skrive ut en liste over
noe jeg noensinne har kjørt en kommandolinje.
Så vi ser her alt som jeg har vært i gang hele denne tiden.
Masse ls tallet.
>> Og en annen nyttig kommando er grep som dens formål er å søke over
tekst på jakt etter mønstre, vel, på jakt etter hva du
vil at den skal se etter.
Og så en praktisk bruk her er, si vi ønsker å ta tak i historien.
Og jeg ønsker å se etter kommandoene der jeg - hva er en
nyttig en skal se etter?
>> JOSEPH: [uhørbart]?
>> ROB: Eller la oss bare se for alle berører, uansett grunn.
Så dette er hva det vil se ut.
Og du trenger ikke å fullstendig forstå det.
Men ideen er her, er historie gir samme effekt som den gjorde her
hvor det er å skrive ut hele Historien om alt jeg noensinne har kjørt.
Vi er så passerer det -
så i stedet for å skrive den ut på skjermen, vi ønsker å gi denne til
Kommandoen grep som er på jakt etter alle forekomster av ordet berøring.
>> Og så bruker denne kombinasjonen av verktøy historie og grep, kan jeg se, OK,
her er alle kommandoene jeg noensinne kjøre, og her er noe vanlig en.
Vi er på bunnen.
Og det er også noe som gir meg kommandoen Jeg bare løp som hadde
Ordet touch i det.
Men røret er en ganske nyttig ting for å kombinere flere programmer.
Og faktisk, det er en snarvei for la meg utgangs historie til fil blah, og
la meg grep'e bruker filen blah så det jeg ønsker å se over.
Så røret er bare en snarvei for de to kommandoer.
Ja.
>> SPEAKER 4: [uhørbart]?
>> ROB: Ja.
Hva er -
Oh.
La oss teste.
Så katt, hund, fisk.
Så jeg ønsker å grep'e.
Dash, r, igjen, kommer til å være rekursivt, så jeg ønsker å stige ned
alle kataloger.
Jeg ønsker å rekursivt grep for alle - og la meg midlertidig få
dette ut av veien.
Ignorer meg.
OK.
>> Så jeg ønsker å midlertidig grep for alle forekomster av ordet fisk.
Og så her er hva jeg gjør er grepping rekursivt for ordet fisk.
Og stjerne betyr at over alle disse filene i denne katalogen.
Og så det ga meg en Permission Denied, fordi det ikke er lov til å lese det
bestemt fil.
Men det finnes fisk i filen, test.
>> Jeg kan også si, spesielt, bare jeg ønsker å se i filen blah, i
hvilket tilfelle det ikke vil finne noe.
Jeg bare ønsker å se i filen, test.
Det vil finne fisk.
Det er en ganske nyttig kommando å vite generelt.
Det er noen alternativer til GREP som er ment å være mer
programmerer vennlig, men jeg har en tendens å fortsatt falle tilbake på grep.
Spørsmål?
OK.
>> Er det andre kommandoer?
Oh.
Bare en one-off en som jeg alltid finne for å være morsomt er cal.
Så legger merke til når jeg er i denne herlige fullskjermmodus, har jeg ingen som topp
verktøylinjen eller noe.
Så cal bare gir meg en fin liten kalenderen som passer
nå avskåret, antar jeg.
Men fint lite kommando.
>> JOSEPH: Det er [uhørbart].
Andre kommandoer som du måtte ha sett inkluderer klang og gjøre.
Vi skal gå over dem i nærmere senere.
Men hvis du har jobbet med den PSett, bør du være
kjent med dem.
>> ROB: Greit.
Spørsmål om kommandolinje ting?
OK.
Så la oss gå videre til noen C-relaterte ting.
Variabler matematikk.
OK.
Så akkurat som vi hadde matte i Scratch, du kan også bruke matematikk i C.
>> Før vi kommer til det helt, så variable.
Husk at når du erklære en variabel som int x eller float y, du
nødt til å gi det skriver før variabelnavnet.
Så typene vi har sett så langt er int, float, double, lang lang, som jeg
faktisk ikke vet om vi har sees at så langt.
>> Det er noen andre.
Vi har se røye.
Det er kort, som er som det er motsatte av lang lang hvor det er
mindre enn et helt tall.
Vi har også sett streng.
Så hva er spesielt streng?
Hvorfor skulle jeg si det er ikke helt som int?
>> SPEAKER 4: Det spiller egentlig ikke eksisterer.
>> ROB: Yeah.
Så den eneste grunnen til at vi har streng er fordi når du gjør
hash, inkluderer cs50.h.
Og vi får se eksempler på dette senere - oh, som ikke håndterer det godt -
hvor cs50.h gjør noe langs linjene av typen
def, røye stjerne, streng.
>> Og slik det er å si at vi ikke gjør det selv vet hva en char stjernen er ennå.
Men dette sier vi ønsker streng.
Noe sted du har brukt streng, du kunne ha brukt røye stjerne,
som faktisk er en type som eksisterer i C-språk.
Men vi får til det.
Oh, og det går rett tilbake.
Neat.
>> Så samme med bool hvor sant og usant.
Det er egentlig ikke en innebygget type i C. I stedet er det bare, har dette
verdien null?
Så får vi bare vurdere det å være falsk.
Betyr dette har verdien -
vel, har dette noe verdi som ikke er null?
Deretter vil vi vurdere det til å være sant.
Så man er sant, to er sant, noe forskjellig fra null er sant.
Så de er de.
Spørsmål om erklære variabler og variable typer og alt det?
Yeah.
>> SPEAKER 4: For lenge lenge, i boken, det sa det måtte være lang lang int.
Men vil bare lang lang jobbe?
>> ROB: Så disse type modifikatorer.
Så int x.
Så vi kan også si usignert int x.
Vi kan si kort int x.
Vi kan si lang lang int x.
Men stort sett alle av de tingene jeg nettopp sa, unsigned int, short int,
lang lang int, kan du bli kvitt int og det vil bare anta
at du mente int.
Så usignerte x, noe som bare betyr -
du vet hvor normalt med en int, du kan si x er lik negative 3?
Med en usignert int, kan du ikke.
>> JOSEPH: Og igjen, for kameraet, Spørsmålet var, hva er forskjellen
mellom lang lang int og akkurat lenge lenge?
>> ROB: Yeah.
Så jeg vil nesten aldri skrive lang lang int.
Jeg vil skrive lang lang.
>> JOSEPH: Noen spørsmål?
>> ROB: OK.
Så dum liten påminnelse om det er slik vi deklarere en variabel og initial
variabelen og erklærer en annen variable og initial
alt i ett trinn.
Så erklæringen av variable og initialisering variable har
til, men kan være på samme linje.
>> Så vi har standard matematiske operatorer at du er vant til -
pluss, minus, dele, ganger.
Det er også modulo, som vi skal se.
Det er ikke, i hvert fall i C, en innebygd strøm
eksponensieringen caret operatør.
Vel er det en cirkumflekstegn operatør men det er ikke strøm.
>> JOSEPH: Men det er ikke potenser, Ja.
>> ROB: Ikke bruk cirkumflekstegnet å anta at det betyr
som squared eller hva.
Så noen ting å huske på tankene om divisjon.
Jeg skal stå.
Så erklærte initialize svaret.
Så vi sier float svar tilsvarer en delt på ti.
Skriv ut svaret med to desimaler.
>> Og dette er den slags ting som jeg ville mennesket printf å finne ut at
hva pokker gjør%, prikk, 2f bety?
Og det betyr bare, vel, ignorerer 0,2.
Og%, er f hva vi bruker å skrive ut til å flyte.
Den 0,2 sier, print som flyte til to desimaler.
Så dette programmet har en feil, og du kan har sett dette før i noen
før CS kurset.
Men hva er det bug?
>> SPEAKER 5: Zero.
>> ROB: Yeah.
Så når vi sier, er lik svar 1 delt på 10, vi vil at
besvare å være 0,1.
Men en dividert med 10, 1 er et heltall, er 10 et heltall.
Og så når vi gjør et heltall delt på et heltall, skal vi komme tilbake
et helt tall.
So 1 dividert med 10 er 0,1.
>> Siden det er behov for å gi oss et heltall, det er bare kommer til å kaste bort at
desimal og si at svaret er 0.
Og så når vi skriver ut svaret her, det kommer til å skrive ut 0.00.
>> JOSEPH: Og akkurat som et notat, er det faktisk kaster bort hva som er etter
desimaltegn.
Så hvis du i stedet hadde seks delt på 10, du kanskje tror at det vil gi deg
0,6 og så ville du runde opp til en.
Men egentlig, hva skjer når det skriver oppgaver er det at det faller det som er
etter desimaltegnet.
Så 0.6 gjør det blir 0.
>> ROB: Yeah.
Og vi vil si avkorte for det.
Så når du kastet til en int, desimalen er avkortet.
Så fiks for det - det er faktisk to.
Og jeg kommer til å gjøre det andre, fordi dette er en mye enklere løsning.
>> Så en fix er å bruke flyter i divisjonen.
Og egentlig, trenger du bare å gjøre en av dem en flåte.
Men det er noe klarere bare å gjøre både av dem flyter.
Så 1,0 delt på 10,0 er dividere to flyter.
Så svaret vil ende opp med å bli en dupp, og så vil du
riktig ut 0.10 her.
>> Noe som ikke fungerer så godt om det er, vel, sikker, det var lett
nok til å konvertere en til en flyte ved å gjøre det 1,0.
Men hva om stedet vi hadde to heltall som int x er lik 1 og int y
lik 10, og da vi ønsket å gjøre x delt på y?
Derfor er det ikke lett å bare gjøre X.0 eller noe.
>> Så at reparasjonen som skal kaste.
Så støping er en måte C for å omdanne fra en type til en annen variabel.
Så her, 1 er et helt tall.
Og ved å sette denne flyte foran det, blir vi kastet en til en flåte.
Og så dette vil konvertere den en til en 1,0.
Og dette vil konvertere 10 til 10.0.
>> Og så ting oppfører seg på samme måte som forrige versjonen vi bare viste
der, som forventet, får vi 0,10 og det vil skrive ut som.
Og vi kan gjøre dette med variabler, også.
Så vi kan si, float x delt på float y.
>> JOSEPH: Noen spørsmål?
>> ROB: Så akkurat som i vanlig matte, vi har operatør forrang.
Så i matte klasse, er det mer sannsynlig å kalle det rekkefølgen på operasjonene.
Her er den offisielle betegnelsen operatør forrang.
Men operatørstyrer, eller de fleste operatører, er som du forventer.
>> Så akkurat som i matte, er to ganger ti kommer til å bli gruppert tettere enn
dette 10 delt på to og deretter to.
Rekkefølgen av operasjonene, vil det gjøre to ganger 10, 10 delt på to, og deretter
det vil gjøre 20 pluss fem pluss to.
Så det er som forventet, og du kan bruke parenteser til å gruppere uttrykk.
Du kan ikke bruke hakeparenteser å gruppere uttrykk.
Yeah?
>> SPEAKER 5: Kan du faktisk bare gå tilbake ett sekund?
Kan du kaste en int til en streng?
>> ROB: Så i C, du kan kaste noe du vil alt du vil.
Det betyr ikke at det er en god ting å gjøre.
Så når du kaster en int til en streng, betyr at -
og vi skal gå inn på dette mye mer grundig -
>> JOSEPH: Mye senere.
>> ROB: Jeg ønsker ikke å si mye senere, så jeg prøvde å endre min setning.
Vi skal gå inn på det mye mer grundig senere der egentlig når du har en
string variabel -
så en streng kan være vilkårlig lang, ikke sant?
Og vi har sagt at en int er fire byte og lang lang er åtte
byte og en float er fire byte.
Så en streng, akkurat som en int, har bare et visst antall byte til det.
Og det vil være fire byte.
>> Men en streng kan være ganske vilkårlig lange, ikke sant?
Så hallo verden allerede, hvis det er 10 tegn eller hva, det er allerede
kommer til å bli i løpet av de fire byte Jeg kan passe inn i en streng.
Og så hvordan strenger virkelig fungerer er at de er der i minne at strengen
blir holdt.
>> Og så over her, når jeg sier streng x lik hello world, innsiden av x er
bare si, oh, hello world lagres på dette spesielle sted i minnet.
Så hvis vi prøver å kaste et heltall til et streng, så vi prøver å tolke
noen tilfeldig del av minne som en streng.
Og som nesten alltid bryter ting.
>> JOSEPH: Men hvis det forvirrer deg, vil vi dekke det
mer i dybden senere.
>> ROB: Yeah.
Det er her du kommer å komme inn i pekere.
Og det er en betydelig del av to uker med dette kurset.
>> SPEAKER 6: Fungerer det like gjenstander i andre språk eller ikke egentlig?
>> ROB: Så med andre språk, gjenstander ville bli representert ved hjelp av pekere.
Det er ikke det samme, skjønt.
Noen tanker?
>> JOSEPH: Nei.
Ingen tanker.
>> ROB: OK.
>> JOSEPH: Neste.
>> ROB: Bare gå med det.
OK.
Så modulo.
Akkurat som vi har pluss, minus, dele, og formere seg.
Så modulo er en du kan ikke har sett før.
Og det bare sier, gi me resten av.
Så 55% 10.
Resten av å gjøre 55 delt av 10 ville være fem.
Så 55% 10 er fem.
Og 3% 5 ville være tre.
8% 8 vil være 0.
16% 15 vil være 1.
>> JOSEPH: En ting å merke seg med dette, også, er det kanskje ikke fungerer som forventet
hvis du bruker et negativt tall.
Så negativ 5% 4, noen mennesker kanskje tror det er -
hva ville du tenke negativt 5% 4 ville bli?
>> SPEAKER 5: One.
>> JOSEPH: Så noen sier én, noen folk sier negativt.
Men hva -
>> ROB: Jeg ville ikke engang ha sa en av dem.
>> JOSEPH: To, beklager.
Noen folk sier -
>> ROB: Tre.
>> JOSEPH: Tre?
>> ROB: Negativ -
hva var det - negative fem -
>> JOSEPH: Tre, tre, tre.
Unnskyld.
Fordi modulo, generelt, når du har sett det andre steder, vanligvis betyr det
returnere et positivt tall, ikke sant?
>> ROB: Så når vi sier i matematikk,% 10-tallet, de har en tendens til å ønske å gi deg -
hvis vi mod med 10, så forventer vi å få et tall mellom 0 og 9..
I her, er det ikke tilfelle at du vil få negative tall returnert.
>> JOSEPH: Så negativ 5% 4 ville være negativ en.
>> ROB: Men det er sjelden at du er mod-ing negative tall til å begynne med.
Hopp over dette.
>> JOSEPH: Yeah.
>> ROB: Meh.
OK.
Så en siste ting å påpeke om flyter er det er en farlig atferd,
men flyter er ikke en eksakt representasjon.
Så kommer tilbake til byte igjen, husk at en int er alltid fire byte og en
float er alltid fire byte.
Så Lucas 'eksempel er ganske bra.
>> Så tenk på en delt på tre.
Så 0,3333333.
Hvis jeg bare har 32 bits, hvordan kan Jeg lagrer 0,33333 egentlig?
Og kanskje, uansett grunn, sier du, all right, vel, la oss bare si
at denne 1011001, la oss bare si at bør være 0,333333.
Vel, du har bare et begrenset antall de biter, så det er umulig å
representerer hver eneste flyttall verdi gitt bare 32 bits.
>> Vel, det er umulig å representere noen floating point verdi gitt uendelig -
også, gis en hvilken som helst endelig antall biter.
Så spørsmålet her er, vel, når vi brukte å skrive ut til to desimaler,
vi gjorde riktig får svaret 0,10.
Men under panseret, er det virkelig blir lagret så nært som mulig til
0,10 som de bitene kan representere.
Er dette på neste lysbilde?
Eller er det ikke?
>> JOSEPH: Ja, det er det.
>> ROB: Blegh, blegh.
>> JOSEPH: Ja, kan du bare trekke notene opp litt.
>> ROB: Jeg skal bare zoome in på den siste som.
Oh my gosh, det er [uhørbart].
Så det nummeret.
Det er det som vil bli skrevet ut hvis vi kjøre dette programmet.
Og legg merke til det er egentlig ikke en stor avtale hvis vi bare bry seg om som
02:58 desimaler.
Som vi bare opprinnelig trykt 0,10, og det er derfor vi så ingenting galt.
Men når vi begynner å komme inn i eksakt, eksakt antall at det er
representerer, ser vi at det ikke kan nøyaktig representerer 0,1.
>> Og en del av problemet her er like, all right, det er fint, men, vel,
første, hva om vi prøvde å gjøre, Svaret er lik lik 0,1?
Er det kommer til å returnere sant eller usant?
Og så det er vanskelig å si.
Jeg tror det faktisk kan returnere true.
Vil det første -
Jeg vet ikke.
Svaret er når du begynner å håndtere med flyttall verdier, du ganske
mye bør ikke bruke likestilling på grunn av dette imprecision.
>> Og for alt du vet, det er hundre desimal at
flyttall var ikke i stand å gi korrekt behandling.
Og så likestilling vil bare mislykkes selv om antallet - hvis du hadde vært
med nøyaktige tall, tallene bør har vært den samme.
Det er i løpet av like 50 beregninger ved hjelp av disse flytende
punkt verdier, kan feilen bygge opp og opp og opp, og
ting bare blir feil.
>> JOSEPH: Og det har vært veldig kjente eksempler på at dette skjer.
Som NASA ingeniører har fått denne feil, forårsaker raketter å eksplodere
luften etter at de har blitt lansert.
Og massevis av saker som dette.
Så ja.
>> SPEAKER 6: Når du sier 0,3 f, betyr det avkorte resten?
Eller gjør avrunde den opp eller ned?
>> ROB: Vil printf rundt det?
>> JOSEPH: Jeg tror printf avkorter.
>> ROB: OK.
Så kan likeledes gå i motsatt retning av denne, hvor, i dette tilfellet
det nærmeste det kunne representere 0,1 var med dette nummeret.
Den nærmest det kan være i stand til å utgjøre 0,2 er i den motsatte
retning, 0,199999996356 eller noe.
Så hvis vi gikk i den retningen av ting, så printf 0,3 f vil returnere
1,99 i stedet for 2,00.
>> JOSEPH: Og jeg er ikke helt sikker på det.
Det kan være lurt å skrive en liten, liten program for å bare sjekke det.
>> ROB: Skjønt, hva vi er sikker på er at hvis du prøvde å kaste det til en
int, og støping til en int skal få den til å avkorte desimal, hvis
du prøve å kaste 1.9999999 til en int, vil du få en.
Og så bør du generelt bruke runde funksjon i regnestykket biblioteket.
Spørsmål?
OK.
>> JOSEPH: Så går videre til forholdene og boolske uttrykk.
Så du har sett dette før.
Og faktisk, la meg forsikre meg Datamaskinen er i riktig format her.
Plass.
Beklager, vi nødt til å håndtere en litt med cut-off på kantene.
>> Men ja, har dere sett dette før i Scratch.
Så dette her er et uttrykk som brukes i
et betinget utsagn.
Så svare større enn null vilje fortelle deg ekte eller falsk.
Og dette er veldig viktig, fordi de tillater oss å presentere
logikken i koden vår.
>> Slik at for eksempel, er dette et program skrevet i spillene som ber brukeren
for et helt tall og forteller dem enten heltallet at de ga deg var en
positivt eller negativt tall.
Og konverteringen over her for å se er du først skrive ut erklæringen,
gi meg et heltall.
Og så spør dem for et heltall.
>> Og så bruker du betinget logikk enn her for å sjekke om dette tallet
var faktisk større enn null eller ikke.
Så her har vi en boolsk uttrykk innsiden av en betinget Hvis uttalelse.
Er det noen spørsmål?
Er det noen spørsmål om det?
OK.
>> Så det er mer enn bare større enn, selvfølgelig.
Du kan konstruere boolske uttrykk bruker det meste av den slags ting du
ville tenke på i matematikk.
Så større enn.
Det burde være en mindre enn.
Unnskyld.
Og avstanden.
>> ROB: Gud forby du forlater den.
>> JOSEPH: Greit.
Så større enn, mindre enn, større enn, eller lik, mindre
enn, eller lik.
Vi bruker doble likemenn for å se etter likestilling, fordi enkelt tilsvarer midler
oppdrag, ikke sant?
Ja.
Og da kan vi heller ikke lik ved bruker utropstegn, er lik.
>> Og dette utropstegnet kan også utvides slik at hvis du vil ha
å invertere noen form for boolsk uttrykk, kan du gjøre det.
Så dette vil vurdere å true hvis svaret er mindre
enn eller lik null.
Eventuelle spørsmål om det?
OK.
>> Så du kan også kombinere disse uttrykk ved hjelp av logisk Og og
logisk Or.
Så dette er bare Og symbolet, som bør være Shift, 7.
Og dette er røret symbol, noe som er ikke en lavere tilfelle L. Det er den ene
det er rett ovenfor din Enter-tasten.
Så du bruke to av disse for å symbolisere logisk Og den logiske Or.
>> Så dette vil bare returnere true hvis svaret er en, to, tre eller fire.
Og dette vil bare returnere true hvis svaret er utenfor det på hver side.
Så det er ikke bare én, to, tre, eller fire.
Og måten du vil bruke at i et uttrykk -
>> ROB: Eller en null eller en fem.
>> JOSEPH: Null eller en fem.
Unnskyld.
Ja, ja, ja.
OK.
Og over her nå, på samme måte som du ville bruke det uttrykket, en mindre
uttrykk side av en If betinget uttalelse, vil du også bruke den til
samme måte ved bare å sette den på innsiden av parentes i hvis setningen.
Så dette printf vil bare fyre hvis svaret er en, to, tre eller fire.
Eventuelle spørsmål om å kombinere uttrykk?
>> Så det er en annen betinget konstruere vi kaller en If / Else.
Så i utgangspunktet, betyr dette nå, OK, hvis noe jeg ønsket å sjekke var ikke
sant, så gå til Else og utføre det andre tiltak.
Så i dette tilfellet, spurte jeg brukeren for et heltall.
Er det hele tall større enn null?
Ja?
Vel, da de plukket et positivt tall.
Hvis ikke, så det må ha vært negativ eller null.
Så du plukket et negativt tall eller en null i dette tilfelle.
Ja.
Eller en null.
>> Og så har vi også Hvis / Else, Hvis og Else.
Så dette lar oss utføre en sekvens av ting bare hvis de første som mislykkes.
Så i dette tilfellet, nå vi gjør den siste du plukke null.
Så hvis de verken plukket en positiv eller et negativt tall, så de må
har plukket null.
Så går det bare nedover kjede som dette.
>> Så et eksempel på hvordan en Hvis er forskjellig fra -
en If / Else er forskjellig fra bare en sekvens av Ifs.
Og dette er et vanlig spørsmål som folk spør er, vel, hvis du kommer som en
95 i CS50, hva vil dette Programmet forteller deg?
>> SPEAKER 5: Du fikk en A.
>> JOSEPH: Ja.
Du fikk hver enkelt en av dem riktig.
Du fikk en A, du fikk en B, du fikk en C og en D, ikke sant?
Så alle disse bli evaluert i orden.
Så lenge en 95 er større enn 90, er det også større enn 80, er det også
større enn 70, og den er også større enn 60..
Så du fikk alle disse karakterene.
Og jeg antar at du ville bare vil at A.
>> Den måten å fikse det på er å erstatte de med Else / If 's.
Så i dette scenariet, ser det ut til at 95 er større enn 90, og den gjør
ikke vurdere resten av uttalelsene.
Eventuelle spørsmål om det?
>> Så det er en annen betinget slags struktur som vi har her som vi
kaller en bryter uttalelse.
Så dette kan du i utgangspunktet sjekke hva verdien av et tall du putter
inn i bryteren uttalelse er.
Så i dette scenariet, vi bytter på n, og vi sier, oh, hvis n er
en, deretter skrive den uttalelsen.
Og deretter bryte, noe som betyr exit ut av bryteroppstillingen.
>> Hvis det ikke var en, så, vel, bare til slutt sjekke alle disse tilfellene.
Og så den sjekker om det er en eller to eller tre, og det skrives deretter.
Og hva denne standard søkeord ned her måte er hvis de ikke oppgi noen
av dem, så si Ugyldig.
Så la oss si at jeg ber for n og brukeren gir meg fire.
Vel, matcher det ingen av disse tilfellene, så det vil skrive ut hva som er i den
Standard delen.
Ja, spørsmålet?
>> SPEAKER 5: Kan du bruke boolsk uttrykkene istedenfor
en, to, eller tre?
>> JOSEPH: Så spørsmålet er kan du bruke Boolske uttrykk i stedet for én,
to og tre?
Og i C, jeg tror deg kan ikke gjøre det.
Men i andre språk, som du kanskje støter ved enden av
semester som Javascript, du kan.
Vel, ville du må beregne første at verdien og deretter bruke den i
bryter uttalelse.
Yeah?
>> ROB: Så en del av fordelen av bryteren uttalelser er å tenke på hvis du gjorde dette
som en If / Else, slik som hvis n er lik tilsvarer én eller hva.
Else / Hvis n er lik lik to, uansett.
Else / Hvis n er lik lik tre.
Så hvordan programmet ville kjøre er det ville sekvensielt gå ned den listen
og sjekke, er n en?
Nope.
Er n to?
Nope.
Er n tre?
Yeah.
Gjør dette.
>> Mens med bryter uttalelser, er det faktisk i stand til å kompilere det å være
veldig fort.
Og så snart det står bryteren, det sier, all right, n er to, er jeg
umiddelbart kommer til å hoppe til der Jeg skal begynne å kjøre.
Jeg kommer ikke til å først sjekke, n er en, er n to?
Det kan umiddelbart begynne å gjøre hva det er ment å gjøre.
>> Og på grunn av at det ikke kan ta boolske forhold.
Ellers ville det ha å gjøre sekvensiell, som, all right, er n
større enn null?
Else er n større enn 10 eller hva.
>> JOSEPH: I dette tilfellet, hvis du har brukt Hvis / Else, If, da bryteren ville
kjøre ca tre ganger raskere enn If / Else, If.
Vi kan organisere bryteren i en slik en slik måte at vi ikke bryter
etter hver av tilfellene.
Så i dette tilfellet, jeg partisjonere tall som vi velger til én og
to er ikke høye tall og tre er et høyt tall.
>> Så i dette tilfellet, dersom n er en eller to, det vil treffe saken og deretter vil det
falle gjennom, fordi Det er ingen pause.
Og det vil ende opp her.
Så hvis vi plukke en, vil den gjøre printf og deretter bryte slik at ingen av
Dette blir utført.
Og selvfølgelig, hvis de kommer inn i tre eller noe annet, så det vil hoppe
de og ikke gå dit, og det vil utføre i stedet
tilsvarende linje.
Er det noen spørsmål om det?
Ja?
>> SPEAKER 4: Vil du få en feilmelding hvis du hadde en pause etter sak en, men det
hadde ikke noe for det å gjøre?
>> JOSEPH: Så spørsmålet er vil du få en feil hvis du har en pause etter
sak en, men det er ingenting å gjøre?
Og svaret er nei.
Du vil faktisk ikke får en feilmelding.
Ja, mm hmm.
>> Så som en slags liten endring her, Jeg kommer til å sette en printf her.
Whoops.
Så hva ville dette ut hvis Jeg satte en i som innspill?
Yeah.
Det ville fortelle deg det tok ikke et høyt antall ganger, ikke sant?
Fordi det ville treffe det første tilfellet, det vil ikke gå i stykker, og det ville falle
gjennom til det andre tilfellet.
Eventuelle spørsmål om det?
>> ROB: Hadde du et annet spørsmål?
>> JOSEPH: OK, avkjøles.
OK.
Så det er noe annet vi kaller en trefoldig operatøren som er utgangspunktet en
alternativ syntaks å gjøre Hvis og deretter Else.
Og det kan du gjøre alt på én linje.
Så i dette spesielle program, Jeg ber brukeren om n..
Og hvis n er større enn 100, sier jeg dem de plukket et høyt antall.
Else jeg fortelle dem at de plukket et lavt tall.
>> Så vi kan bruke dette veldig lang syntaks, streng, S, og deretter sjekke om n er
større enn 100 og tilordne det tilsvarende.
Men vi kan gjøre dette mye mer konsis ved hjelp av denne trefoldig operatør syntaks
som omfatter et spørsmål mark og et kolon.
Så spørsmålstegnet er i hovedsak stiller et spørsmål, ikke sant?
>> ROB: Kanskje zoome inn på det.
>> JOSEPH: Ja.
Godt poeng.
Så dette er det ternære operatør.
Første gang jeg stiller spørsmålet, er n større enn 100?
Hvis det er, så jeg utføre den første del før tykktarmen.
Hvis det ikke er det, så jeg utføre andre del etter kolon.
Så hvis n er større enn 100, da den plukker høyt og setter
at i streng s.
Hvis n er mindre enn 100, plukker den lave og deretter setter det inn strengen s.
Så det vil kondensere dette stor del ned i bare den ene setningen.
>> SPEAKER 5: Er det populært?
>> JOSEPH: Ja, det er ganske populært for ting der egentlig du ønsker å
gjør en oppgave basert på en slags tilstand.
Og i dette tilfellet, vi prøvde å tilordne en verdi til strengen s.
Det er ikke slik -
Jeg trenger vel egentlig ikke foretrekker det i andre tilfeller.
Men det er spesielt nyttig for dette oppdraget.
>> ROB: Det er en ganske vanlig mønster der du har litt variabel som
du kommer til å si, hvis noe, satt denne variabelen til én verdi, ellers, satt
denne variabelen til en annen verdi.
Og det er scenariet der bruker en trefoldig.
>> JOSEPH: Og du sparer massevis av linjer, ikke sant?
Og det gjør bare koden uten tvil en litt mer lesbar.
Ja, spørsmålet?
>> SPEAKER 6: For et trefoldig, kan du gå, string s lik s, spørsmålstegn?
Og så kan du ha, sier, fem forskjellige alternativer.
Og avhengig av hva antallet n var, ville du velge en av dem?
>> JOSEPH: Så spørsmålet er, er det en slags syntaks hvor du kan gjøre string
s lik n, og deretter ha mer enn to alternativer etter at spørsmålstegnet?
Og et enkelt svar er nei, det er ikke virkelig en god måte å gjøre det med mindre
du ønsker å hekke flere trefoldig operatørene inne i hverandre.
>> Du kan gjøre som n større enn 100, spørsmålstegn, og deretter en annen
ternært operatør, n er større enn 50, spørsmålstegn, og hekker det på den måten.
Men i den situasjonen, er koden får slags uleselig og rotete,
og det kan være bedre å bare gå til en If / Else uttalelse på dette punktet.
>> ROB: Og også, som en side note, PHP feilaktig implementerer trefoldig
operatør slik at nestet ternaries ikke engang fungerer som de skal.
>> JOSEPH: Yeah.
Så det blir litt forvirrende, spesielt når du går
til forskjellige språk.
>> ROB: Det er forvirrende nok at språk er galt med det.
>> JOSEPH: Så egentlig, bare for å avklare, vet alle hva som
% S gjør over her?
Eventuelle spørsmål om det?
Jeg antar bare for kameraet, den% s utgangspunktet lar oss sette en plassholder
for en streng.
Og så på slutten, vi spesifisere at variabel vi ønsker å sette inn i dette
plassholder er s.
Så som i utgangspunktet tar s og det setter det inn her.
Og så skrives det ut, du plukket en høy eller du plukket et lavt tall.
OK.
>> Så looper tillate deg å utføre ting i sirkulære bevegelser, ikke sant?
Du har kanskje støtt på dette i Ripe i form av Alltid looper
eller gjenta til eller gjenta en bestemt antall ganger.
Så hvorfor er dette bra for oss?
Vel, i C, la oss si at vi har dette sang implementert i Scratch at
synger, er dette sangen som aldri slutter.
Det går bare videre og videre og på for evig og alltid.
Vel, kan du egentlig ikke lage et program som har et uendelig antall printf
uttalelser i det, ikke sant?
>> Så i dette scenariet, en måte at du kan gjøre dette arbeidet og
å gjøre det ut for alltid er å i stedet bruke en while-loop.
Så en while-loop vil utføre hva som er i kroppen av de to tannregulering som
tilhører det basert på hva tilstanden er.
Så i dette spesielle eksempel før, hvis vi ønsker å skrive ut dette for alltid, hva
kan vi gjøre?
Vel, sikker, ikke sant?
>> Så denne typen kombinerer ideen av noen boolsk uttrykk
sammen med en løkke.
Og vi har lært om boolsk uttrykk tidligere.
Så når tilstanden innsiden av at mens fortsatt sant, denne sløyfen
vil kjøre på og av og på.
Og i dette tilfellet, hvis vi bare levere det med sann, dette fører til en uendelig
løkke som skriver ut sangen av og på og på som vi ønsket før uten
ha et program som har en uendelig antall printf-setninger, som er
ikke mulig.
>> Så mer overbevisende, skjønt, du kan bruke denne med en
variabel og en tilstand.
Så la oss si at vi ønsker å gjenta frase, helt sprø, 10 ganger.
Så hva kan du gjøre med en while-loop er kan du først klargjøre en teller
variable utenfor Mens sløyfe til 10 år.
Og så i utgangspunktet, hver gang du går gjennom Mens loop, du skriver ut
erklæringen og deretter redusere telleren variable inntil på slutten,
på et tidspunkt, når vi trekker jeg nok ganger, en fra jeg nok ganger -
og bare for å avklare, jeg minus minus betyr at jeg er lik jeg minus en.
>> Dette vil i utgangspunktet bringe I ned i punkt der en gang jeg traff null, dette
tilstand ikke lenger er oppfylt, og slik at de kommer ut av sløyfen.
Så helt sprø bare skriver ut 10 ganger.
Eventuelle spørsmål om en while-loop?
OK.
>> Så det er en måte vi kan gjøre det vi bare gjorde i en mer kortfattet måte med
det vi kaller en for løkke.
Så en for løkke består av en initialisering, en tilstand, og en
oppdatering, akkurat som vi hadde før i denne Mens sløyfe.
Så la oss ta en titt.
I denne Mens sløyfe, hadde vi en initialisering, da vi hadde en
betinger at vi sjekket.
Og så hadde vi en oppdatering trinn på toppen.
>> Med en for løkke, tar dette utgangspunktet disse tre tingene og kondenserer det
ned i en linje.
Så det første som det gjør i For sløyfe er initialisering.
Og så gjør du et semikolon, og deretter du gjør tilstanden, som er jeg
større enn null, går der, og deretter oppdateringstrinnet.
Så dette blir utført på enden av sløyfen kroppen.
Så disse to programmene er i det vesentlige ekvivalente.
>> Eventuelle spørsmål?
Så hva er en forskjell mellom disse to?
Kan noen peke det ut?
Det kan være litt subtil.
Det er bare en svært liten forskjell.
Ja?
>> SPEAKER 5: Du ville ikke være i stand til å bruke I variable utenfor For sløyfen
[Uhørbart]?
>> JOSEPH: Nettopp.
Så dette er noe vi skal få til senere kalt variabel omfang.
Men egentlig, dette int i livet utenfor denne Mens sløyfe.
Så når denne Mens sløyfe er gjort gjennomføring, vil jeg kunne bruke jeg senere
on i programmet.
>> Mens med dette For loop, dette int jeg er omfangs innsiden av denne For loop.
Og fordi det er på innsiden av dette parti av For-løkke, som starter
på parenteser og ender med krøllete brace der borte.
Alt som er erklært innsiden av her kan ikke brukes utenfor.
Så hvis jeg prøver å bruke jeg utenfor, det vil fortell meg, undeclared symbol.
Og egentlig, ville jeg ikke være i stand til å bruke den.
>> ROB: Og vel, for 10 år siden, i bokstavelig talt alle tilfeller, klammeparentes er
hva du brukte til å bestemme omfanget av en variabel.
Så i det, int jeg tilsvarer 10 er erklært innsiden av denne
satt av klammeparentes.
Og så så så lenge du prøver å bruke jeg før denne klammeparentes, det er greit.
Du kan se når du skriver gjør, du se dash, dash, std, lik, c99.
>> Så det er en nyere versjon av C som GCC har implementert som også gir
denne snarveien.
Så dette pleide å ikke være tillatt i C. Og du kan se hvorfor, fordi dette int
Jeg er ute av denne klammeparentes, men det er fortsatt anses å være i
Omfanget av disse klammeparentes.
Men dette er en veldig praktisk ting, og så er det en god forlengelse.
>> JOSEPH: Noen spørsmål?
OK.
Så hva er mer nyttig er at noen ganger du ønsker slags dynamikk i
loop, ikke sant?
Du ønsker ikke å bare nødvendigvis ut helt sprø hele tiden, du
vil telle ned fra 10 eller noe.
Og så du kan bruke tellervariabelen innsiden av det sløyfe også.
Og i dette tilfellet, er dette program bare teller ned fra 10 hele veien ned.
Og hva betyr det ikke ut?
Det skrives ikke ut null, riktig, fordi når -
Ja, det også ikke skrives ut 11.
>> Så det ikke skrives ut null, fordi når Jeg er null, husk, det evaluerer
tilstanden før det går videre å utføre sløyfen kroppen.
Og når jeg er null, er dette falsk, så det trenger ikke skrive ut teller ned
null, det skrives bare ut telling ned 10 hele veien ned til en.
Hvis vi faktisk ønsket det å skrive ut null, Da ville vi sette et likhetstegn
etter dette større enn-tegn.
OK.
>> Så en måte å gjøre validering av inndata som er når du ber brukeren om å gjøre
noe, vil du sørge for at de følge dine instruksjoner, er å bruke
While løkke, ikke sant?
Så i dette tilfellet, ber jeg for et positivt tall, og da er jeg
venter på innspill.
>> Og da jeg sjekket Mens inngangen er mindre enn null, fortsette å spørre dem.
Så så lenge de gir meg et nummer som ikke er positiv, fortsette å spørre,
fortsette å spørre, fortsette å spørre.
Men hva er slags merkelig om dette?
Eller hva synes ikke optimal om denne strukturen akkurat her?
Anyone?
Ja?
>> SPEAKER 6: Du gjentar instruksjonen to ganger.
>> JOSEPH: Høyre.
Så vi har to printf uttalelser her, ikke sant?
Så det er en måte vi kan få dette bare ned til en som ville gjøre
koden lettere å lese og en litt mer ren.
Og så ville vi ikke å har Get i dobbelt så godt.
Og en måte du kan gjøre dette på er ved hjelp av en Do-while-loop.
>> Og en Do-while-loop er i utgangspunktet en annen form for a While løkke der
alt innenfor klammeparentes blir utført minst en gang.
Så her, erklærer jeg, int input, utenfor først.
Og så jeg bare sier, gjør dette instruksjon mens inngang
er mindre enn null.
Så det treffer Do først.
Det vil alltid utføre dette minst en gang, så det vil alltid spørre brukeren
om inndata minst én gang.
Og så vurderer den inngangen, og det foregår i en sirkel.
Ja, spørsmålet?
>> SPEAKER 6: Er det en måte å gjøre det [Uhørbart] typer, som hvis du sier,
GetString, og noen [uhørbart]
er det en måte å [uhørbart]
>> JOSEPH: Så spørsmålet er, er det en måte å gjøre validering av inndata hvis brukeren
setter ikke i riktig type variabel?
Så hvis vi ber om en int og de gi oss en streng i stedet.
Og i de funksjonene som vi implementerer for deg, GetInt, GetString i alle
disse funksjonene, de faktisk allerede gjøre den slags grunnleggende type innspill
validering under panseret.
Så hvis du bruker funksjonene som vi ga deg, trenger du egentlig ikke må.
>> Men hvis du ønsker å se mer på hvordan du kan faktisk gjøre det, kan du se
under panseret på filen I/O--
Ikke fil, standard I / O-funksjoner som en leser fra standard input og
standard ut.
Og du kan få en bedre følelse på hvordan du kan gjøre det.
>> ROB: Ett problem, skjønt, er spesielt med eksempelet du
sa, forventer du en streng og jeg legger inn en int.
Hvordan ville du fortelle forskjellen mellom forsettlig ønsker det
string 123 versus ønsker den int 123?
Så streng, det er ganske mye det er ingen validering, det er bare hva de
tastet du vil tolke som en streng.
>> Int er enklere, fordi uansett innspill du tar fra brukeren, er du
alltid å ta en streng.
Og slik at strengen kan du da sjekk, er alle disse
faktisk sifre?
>> JOSEPH: OK.
Eventuelle spørsmål om en Do-while-loop?
>> ROB: Oh, og dette er også -
går tilbake til omfang, noe vanlig feil er å prøve å bruke noen lokale
variabel fra denne Do-Mens sløyfe inne i denne tilstanden.
Og faktisk, hvis vi bare ble kvitt dette og sa, int innspill lik
GetInt, da kompilatoren vil kjefte på oss, fordi inngangs ikke eksisterer
utenfor rammen av disse klammeparentes.
>> JOSEPH: Og det er derfor vi trenger denne lineup her.
OK.
Så du kan også bryte ut av en løkke tidlig hvis du vil.
Så dette er en annerledes måte å gjennomføre det vi nettopp gjennomført.
Og i stedet for å bruke tilstanden innenfor parenteser, bruker vi en
Hvis uttalelsen innsiden av kroppen av Do-Mens sløyfe.
>> Og i utgangspunktet, når inngangen er endelig større enn null, vil vi
bryte ut av sløyfen.
Og så skal vi gå hele veien ned her.
Og du kan se at dette ville sannsynligvis være å foretrekke i denne
scenario, fordi det er litt litt renere og litt
litt lettere å lese.
Mens dette, du liksom har ekstra linjer i det.
Det er bare litt styggere, Jeg antar, på en måte.
Ja, spørsmålet?
>> SPEAKER 4: Vil bryte bare få deg ut av ett sett med tannregulering?
>> JOSEPH: Høyre.
Så spørsmålet er vil bryte bare komme deg ut av en sløyfe?
Og svaret er ja.
Så hvis du har nestet For looper, for eksempel, hvis jeg har for int jeg er lik 0
inntil 10 og deretter For int J er lik 0 inntil 10, hvis jeg bryter ut av det indre
loop, vil jeg fortsatt gå til den ytre sløyfe.
Så det vil holde utfører operasjoner på utsiden.
Eventuelle spørsmål om det?
Ja?
>> SPEAKER 5: Men bryte bare funksjoner for klammeparentes, ikke for andre
uttalelser?
[Uhørbart]
>> JOSEPH: Så spørsmålet er vil bryte kun virker i sløyfer i motsetning til
andre utsagn som Hvis?
Og ja, det er tilfelle, fordi du bryte ut av en loop, ikke sant,
på en måte.
>> ROB: I de aller fleste tilfeller er det dette er den slags Hvis noe,
deretter bryte.
Så du trenger ikke å bryte å gjelde If som innpakning rundt det.
Og også, er dette ikke mye av en loop, men husk at bryterne er også
brutt ut av ved pauser.
Vi så pauser blir brukt med brytere før.
>> JOSEPH: Og du kan også bruke dem i mens looper og looper.
Eventuelle spørsmål?
OK.
Så neste opp er funksjoner.
Så du kan ha brukt en av disse BYOB blokker i Lotteri-prosjektet.
Og dette gir i utgangspunktet du kan definere et sett av
instruksjoner som skal følges.
>> Og hva jeg mener med det er la oss tenke tilbake til matematikk, høyre, algebra.
Du har det vi kaller en funksjon av x, noen variable, og la oss si dette
Funksjonen er f av x er lik x pluss fem.
Så du kan tenke på f av x som dette svart boks som tar 15 inn og deretter
produserer 20.
>> Så mer generelt, er en funksjon noe som tar noen innganger og
da produserer noen utganger.
Og hvorfor er funksjoner god?
De er bra for en rekke årsaker.
Så ønsker noen til å ta et stikk til hvilken organisasjon betyr?
Når det gjelder hvorfor funksjonene er nyttige?
Ja?
>> SPEAKER 4: Det gjør koden mer lesbar.
>> JOSEPH: Høyre.
Så en av de tingene er det som gjør koden mer lesbar, ikke sant?
I stedet for å ha lignende int x er lik x ganger x ganger x, kan jeg ha kube av x,
som er lettere å lese og mer forståelig for en leser.
>> Organisasjonen er også i form av splitte opp koden din inn i håndterbare
porsjoner, slik at i stedet for å prøve å implementere dette i ett lang seksjon
i hoved, kan du liksom dele den opp inn som, OK, la oss skrive en funksjon
i Cube noe, la oss skrive et fungere til torget noe.
På den måten kan du dele den opp i bittesmå, små deler som du kan takle
i motsetning til forsøk på å takle et stort problem på en gang.
>> ROB: Eller til og med små, små deler som du og en partner kan takle.
>> JOSEPH: Yeah.
>> ROB: Så i stedet for begge du prøver å implantere en
fungere samtidig.
>> JOSEPH: Forenkling.
Alle som ønsker å ta en gjetning?
Ja?
>> SPEAKER 5: Mer repetisjon.
>> JOSEPH: Høyre.
Så en ting som du kan gjøre med forenkling er at det er liksom på
de samme linjene som re-brukervennlighet er at når jeg skriver en kube funksjon, kan jeg
bare bruke den om og om igjen og om igjen igjen i mitt program i stedet for å skrive
x ganger x ganger x om og om og om igjen.
Og forenkling her også bare betyr det gjør koden slags
lettere å feilsøke når du splitte dette opp i funksjoner.
Fordi da kan du lokalisere hvor dine problemer liksom er.
Eventuelle spørsmål?
>> Så en annen idé er abstraksjon, ikke sant?
Denne svarte boksen.
Som vet du hva GetInt gjør å motta innspill fra brukeren?
Vi har egentlig ikke fortalt deg, ikke sant?
Alt vi har fortalt deg er GetInt gjør akkurat det den sier den gjør.
Så selv om vi ikke fortelle deg hvordan det fungerer, du fortsatt kjenner.
>> Så i dette tilfellet, er dette et firemannsrom funksjon som gjør
forskjellige ting for en inngang for å produsere et utgangssignal.
Og du kan firedoble en rekke ved å multiplisere det med fire.
Eller du kan det vi kaller bit skifte det med to.
Og vi vil dekke dette litt senere.
Og det er ikke nødvendig å vite hvordan dette funksjonen fungerer faktisk så lenge det
fungerer som oppgitt.
>> Så under panseret, kan jeg være lignende, returnere inngangs ganger
åtte dividert med to.
Og du ville ikke vite, ikke sant?
Alt du trenger å vite er den gjør det den sier.
Så det er nyttig ting om abstraksjon.
>> Og en annen ting er liksom denne ideen av lokalisering koden din til en
bestemt del.
Så hvis du har et problem, gjør du ikke må gå over koden din prøver
å fikse der problemet var.
Så i dette tilfellet, implementert jeg kube galt.
Jeg trodde kube ble multiplisere av tre.
>> Så i dette tilfelle, er dette en program som nettopp har multiplisere med tre
overalt.
Og det er et annet program som har priset kube ut i en funksjon.
Og så nå hvis jeg ønsker å fikse min feil her, må jeg fikse hver enkelt linje
av koden i dette programmet.
Mens på den annen side, hvis jeg benytte funksjon, jeg trenger bare å endre
hva som var galt på ett sted.
>> Så i informatikk, vi kaller inn-og utganger.
Innganger kalles parametere eller argumenter, og utganger er kalt
returnere verdier.
Og vi vil se hvordan dette hjelper oss med å sortere for å definere en funksjon i et andre.
Så dette er en funksjon definisjon for cubing.
Så det tar en inngang, og deretter den returnerer at antall ganger
seg selv tre ganger.
Så la oss bryte dette ned.
>> Så vi har en funksjon header, som egentlig består av tre ting.
Så vi har parameterne, som er, som jeg sa tidligere, det
input i denne funksjonen.
Og så gir vi funksjonen et navn.
I dette tilfellet, det heter kube.
Og da vi spesifisere hva den type av returverdien er.
>> Så i dette tilfellet, min kube funksjon foregår i et heltall, og det er også
returnerer et heltall.
Så hvis jeg passerer i to, er to et heltall, den returnerer åtte til meg, som
er et helt tall.
Så tilbake typenavn parametere.
Spørsmål om det?
>> Og deretter returverdien er faktisk spesifisert på slutten ved å si retur
og deretter tilbake uansett inneholder returverdi.
Så i dette tilfellet, hvis vi setter det hele sammen, tar en funksjon
parametere, det heter noe, og den returnerer noe som er den typen
at vi sier det skulle være.
Eventuelle spørsmål?
>> Så hvordan skal vi bruke en funksjon?
Vel, vi skriver en funksjon, og deretter vi bruker det i programmet vårt, ikke sant?
Så jeg kalte det kube, og Da kan jeg bruke kuben.
>> Men det som er viktig å merke seg Er det en ordre saker.
Hvis jeg har kube under hoved, er det kommer til å kjøre inn i kuben.
Og på dette punktet, er det ingenting kalt kube i programmet, og det er
bare kommer til å være som, jeg har ingen anelse om hva kube er.
>> Så det vil si deg, implisitt erklæring funksjon.
Det er feil som dukker opp.
Og så i dette tilfellet, er kuben under viktigste, så er det ikke til
å vite om det.
>> SPEAKER 5: Så viktigste er vanligvis den siste funksjonen definert?
>> JOSEPH: Så spørsmålet er, er hoved vanligvis den siste
ting som du vil definere?
Og nei.
Det er fordi vi vanligvis liker hoved å være på toppen, hva?
Fordi det er det første du ønsker programmereren åpne
program for å se.
Og så hvordan skal vi løse dette problemet av vi ønsker viktigste å være på toppen, men den
funksjoner som vi ønsker, vi vil ha dem å være under hoved men likevel være i stand til å bruke
dem innsiden av hoved?
>> Vel, vi bruker det vi kaller en funksjon prototype.
Så hva en funksjon prototype hovedsak er er det første tar det
signaturen eller funksjonen header av hva vi ønsker å implementere ned
her, og vi setter det på toppen av et program.
>> Så i dette tilfellet, sier vi at, vel, senere i programmet vårt, vi skal
å lage et løfte om å gjennomføre dette funksjon kalt int kube, som tar
et heltall innspill.
Så nå, fordi det er over hoved, viktigste, det kommer til å si, oh, vel,
senere i programmet, som kommer til å være det slik at jeg kan referere til det, så jeg vil
bare la det gå gjennom for nå.
>> Og så i bunnen, vi implementere kube.
Og da hoved vil bare si, vel, vil det liksom kobling
disse to symbolene sammen.
Og vi vil dekke hva som betyr senere.
Og så det skal vite at dette er den kube funksjon som den skal brukes.
>> ROB: The [uhørbart] om å ville Hoved nederst eller
topp, jeg har sett begge deler.
Det er ting som bare liker for å sette hoved nederst.
Men når et prosjekt blir spesielt stort, vanligvis hoved er i en
fil alle sine egne.
Og på det punktet, som int kube linjen ville -
innsiden av stdio.h er en gjeng linjer akkurat som at int
kube int linjeinngang.
>> Og så disse prototypene er ting du en tendens til å sette inn header-filer, på
hvilket tidspunkt, spiller det ingen rolle.
Vel, det spiller ingen rolle.
De som alltid går på toppen.
Og hvis viktigste er ikke en fil alle sine egne, du trenger ikke å bekymre deg om å sette
individuelle funksjons prototyper i filen.
>> JOSEPH: Og vi får til det litt litt senere når Rob begynner å snakke
om kompilering.
Og så er det også en forskjell mellom parameter og argument.
Og parameter er akkurat det vi kaller disse inngangene når
Vi definerer funksjonen.
Og vi kaller det et argument når vi faktisk passere den inn i funksjonen.
>> Så i dette tilfelle, er dette en parameter, som vi sa før.
Og når vi faktisk bruker det over det, kube av x, så x selv er
hva vi kaller et argument til funksjonen kuben.
>> ROB: Så parameter argumenter er -
Det er dette skillet, veldig forvirret om hverandre.
På dette punktet, for meg, er det som en av de ordene som når jeg ser det ut i
vill, jeg kan ikke hjelpe, men umiddelbart spørsmål om de bruker det i
den riktige sammenheng, fordi Forskjellen er subtil nok til at bare
alle har en tendens -
Jeg nesten alltid si argument uavhengig av hva jeg mener.
>> Joseph: Og funksjoner er også nyttig for det vi kaller bivirkninger.
Så en funksjon kan ta ingen innganger, og det kan også produsere ingen utganger.
Så i dette tilfellet, er jeg å definere en subrutine som ikke har noen
returnere verdien.
Og for å spesifisere det, bruker vi hva vi kaller et tomrom over her.
Og slik bivirkning av denne funksjonen er at det skrives bare ting
ut til siden.
Det trenger faktisk ikke ta noen inngangene, og den ikke gjør
faktisk gi noen utganger.
>> Men dette kan være nyttig i den forstand hvis du vil, for eksempel, debug
noe i programmet, hvis du vil ha å skrive litt subrutine som
skrives ut, la oss si, innholdet minne eller noe.
Og så disse bivirkningene er noen ganger nyttig utenfor rammen
av bare liker innganger og utganger.
Eventuelle spørsmål?
>> Og for å avslutte dette segmentet, hva betyr dette programmet gjøre?
Jeg skal gi dere et par sekunder til å lese gjennom det.
På et helt grunnleggende nivå, hva vi ønsker å si er at den bytter x og y, ikke sant?
>> Så hvor mange av dere faktisk tror Dette vil bytte x og y?
Rekk opp hånden.
Ingen.
OK.
Som mener at det vil ikke bytte x og y?
Og summen av den var ikke hele rommet.
Så noen mennesker er ikke sikker.
OK.
Det er rimelig.
>> Så la oss gå gjennom hva som skjer når du faktisk ringe funksjoner først i
For å besvare dette spørsmålet.
Så dette er hva minne liksom ser ut.
Dette er liksom som en forenklet modell av hva minne ser ut når
du kjører et program.
Så er det noe som heter stabelen her nede og
noe som kalles haugen.
Og disse vokser mot midt i minnet.
>> Så i dette tilfellet, da du kaller en funksjon, det
blir satt på stakken.
Og da alt som er inneholdt i denne funksjonen forblir i det vi kaller det
funksjonens stack ramme.
Og så for å få en fin visualisering av dette, let's - for eksempel, hadde vi
-programmet tidligere.
Og innsiden av hoved, vi kalte kube.
Så hoved ville først gå på stakken ramme, fordi det er den første funksjonen
som heter.
>> Og så når kube kalles innsiden av Hoved, blir det satt på toppen av hoved
innsiden av minne.
Så hva vil du legge merke til her er at kuben har sine egne parametere og dens
egne lokalbefolkningen.
Så når du faktisk passere noe å en funksjon av parameterne som det
blir er kopier av det som var gått inn fra hoved.
>> Og for å liksom forklare dette, la oss går gjennom et program.
Så vi har bunken, og dette er bare stabelparti.
Og det vi gjør er vi først initial x og y til en og to.
Så vi har disse små boksene.
De sitter i hoved stack ramme på stakken.
De inneholder en og to.
>> Nå kaller vi swap.
Hva som skjer er vi passere x og y inn swap, og swap skaper sine egne kopier
av disse variablene å bruke inne av sin stabel rammen.
Så nå over det, har vi en som med verdien x hadde, og b,
som inneholder verdien y hadde.
Så en, to.
>> Og du vil merke at dette er separate fra x-og y innsiden av hoved.
Så vi nå opprette en midlertidig variabel til å inneholde en.
Vi satt en lik b, så det endringer fra en til to.
Og da vi satt b lik temp, som er en.
>> Og så nå avslutter vi ut av denne funksjonen.
Når du avslutter ut av funksjon, den stack ramme blir popped av stabelen.
Vi kaller det push.
Du trykker på en stabel ramme på stakken og du pop hvis av stabelen.
Og så det som skjer er alt som var i den bunken ramme liksom bare
går opp i flammer.
Og slik som ikke lenger eksisterer.
>> Men hva ser vi ikke?
Vi har aldri egentlig endret Verdiene av x og y, rette?
Så de bodde lokale til hoved.
Og ved å sende ting til swap, vi faktisk aldri endret disse verdiene.
Og hva kaller vi dette?
Vi kaller dette bestått av verdi.
>> Så i C, når du passerer ting inn funksjoner, det går dem etter verdi og
lager en kopi av dem for den funksjon som skal brukes.
Og vi vil lære om noe som kalles passerer ved henvisning senere, men det er
en måte du kan løse dette problemet.
Men vi vil ikke bekymre deg at før senere.
>> ROB: Og faktisk, det uttrykket, bestått ved henvisning, betyr så C ikke engang
passerer ved å referere.
C utelukkende har bestått av verdi.
Uansett hva du gjør, er du alltid passerer en kopi av noe.
Det er bare det at, som jeg liksom nevnt som før med pekere
og at en streng er egentlig bare fire bytes peker til et sted i minnet.
>> Vel, hvis jeg har denne strengen, og det er forteller meg at er der strengen -
vel, hvis jeg har denne pekeren til dette plasser i minnet, så jeg kan passere en
kopi av pekeren til en funksjon, og at funksjonen fortsatt vet hvor i
memory det er.
Så begge disse pekere peker til det samme sted i hukommelsen, og
det er hvordan vi kommer til å være i stand å endre ting utover
nåværende stack ramme.
>> JOSEPH: Ønsker du å gjøre kompilering?
>> ROB: Nei, det er 05:30.
>> JOSEPH: OK.
Det er 05:30.
OK.
Så vi vil dekke kompilering Jeg antar i neste avsnitt, eller din seksjon
lederen vil på det tidspunktet.
Og -
>> ROB: Noen spørsmål?
>> JOSEPH: Noen spørsmål?
Ja?
>> SPEAKER 5: Bruke strenger fra CS50, noe funksjoner som vi ønsker å bruke for
de, som vil være som C-funksjoner.
CS50 har ikke gått inn og gjort noe ekstra.
>> ROB: Riktig.
Enhver av C som [uhørbart], du ville bruke de på våre strenger.
>> JOSEPH: Og en siste ting jeg vil nevne er at vi har en stilguide
for denne klassen.
>> ROB: Å, ja.
>> JOSEPH: Så hvis du har kommet fra en programmering bakgrunn før, du
kan ha visse konvensjoner når du skriver kode som å sette
bukseseler på samme linje eller bestemt måter innrykk
eller navngi variablene.
I denne klassen, ønsker vi å følge en bestemt stil guide bare fordi,
vel, hvis du går ut og jobbe i industri, du kommer til å bli forventet
å følge stilen guide av selskap som du går til.
>> Som for eksempel Facebook Jeg tror har en bestemt form for navngiving
konvensjonen.
Og det er forskjeller mellom kamel casing variabler og akkurat som
skille dem med understrek.
Og også, tror jeg det viktigste, som for eksempel innrykk, ikke sant?
>> Vi klammeparentes starte der tilstanden er, og de
er på den neste linje.
Og vi har også satt klammeparentes i selv om det er bare én linje.
Og mange ganger, det finnes måter å gjøre det der du kan la disse bukseseler
av hvis det er bare én linje under Hvis uttalelsen.
Men i denne klassen, ønsker vi å følge en bestemt stil guide bare slik at du får
brukes til den slags ting.
>> ROB: Yeah, and Style 50 kommer til å håndheve denne stilen guide, og vi er
kommer til å bruke stil 50 til grad koden din.
Så det gjør ting enklere for oss og forhåpentligvis bør ikke gjøre ting som
mye verre for deg gitt standardisert type bør ikke være så
urealistisk.
>> JOSEPH: Og til slutt, for å finne stilen Guide, gå til manual.cs50.net/style.
Og ja.
>> SPEAKER 4: Skal du håndheve noen tegn per linje?
>> ROB: Ja.
>> JOSEPH: Sorry, folkens.
>> ROB: Det er som en av de eneste.
På dette punktet, jeg er OK med 120.
Jeg er OK med å si 120 tegn per linje.
Jeg forstår at det er en grense.
Jeg tror 80 er så liten, men vi håndheve det.
>> JOSEPH: Personlig synes jeg med C, 80 tegn er mer OK.
Når du begynner å få til andre språk som Javascript og PHP, ikke
så rimelig å bare begrense det til 80 tegn.
OK.
Vel, det var super-delen.
Er det noen som vil ha godteri?
>> SPEAKER 4: Ja.