>> ROB: Okej.
Välkommen till det första avsnittet.
Jag är Rob.
>> JOSEPH: Jag är Josef.
>> ROB: Så ska vi dyka rätt i.
Första sak att prata om är Appliance.
Så förhoppningsvis de flesta av er har hämtat det redan.
Men du kan se instruktionerna vid cs50.net/appliance.
Åh gud, nu är jag självmedveten.
Jag hör fortfarande det.
>> JOSEPH: Wow, det låter som det är desorienterad.
>> ROB: Så en del människor har haft problem med det, så vänta inte tills
den sista minuten av problemet satt till försöka lösa Appliance och
reda på att det inte fungerar.
>> JOSEPH: Och om något inte fungerar och du behöver hjälp, kan du gå till
cs50.net/discussion där vi ha ett forum där man
kan skicka dina frågor.
Och vi kommer till dem så småningom.
>> ROB: Okej.
Så detta är vad Appliance ser ut som.
Återigen, det är bara en helt separat operativsystem som körs inom
oavsett operativsystem du kör på din bärbara dator.
Och de huvudsakliga delar du använder är gedit.
Så förhoppningsvis detta har redan blivit en välbekant plats.
Terminalen.
>> Och du kan också köra Chrome inom Appliance.
Det har varit ett par personer som har rapporterat internet
inte i Appliance.
Och några av dem har bara antagit att det inte är tänkt att vara
internet i Appliance.
Men ja, det är tänkt att vara Internet.
>> Jag ska säga det just nu, men det gör det inte verkligen betyder någonting.
Om internet inte fungerar, detta är vad du brukar behöva
att köra för att fixa det.
Om du har internet-problem, inte minns det, bara lägga upp den på
Diskutera, och vi kommer att säga, kör det.
Men Internet ska arbeta.
>> Så det enda andra sak - ja, ingenting annat är verkligen relevant.
Men jag ville bara påpeka att -
se i denna nedre högra hörnet.
Så alla dina apparater bör ha en IP-adress.
Och senare på terminen, detta IP adress kommer att bli mer relevant när
du arbetar på webben p-set, eftersom du kommer att kunna komma åt
webbplats du arbetar på från din lokal Chrome genom att använda denna IP-adress.
>> Men vad jag tycker om att använda IP-adressen för - och du behöver inte göra det här, jag
vill bara påpeka det -
är här.
Så detta är ett terminalfönster på min Mac, är det inte i
Appliance alls.
Och du kan slå upp vad Detta kommando gör.
Men jag ska direkt till SSH till min Appliance.
Jag vet inte vad IP är.
>> JOSEPH: 168 -
>> 168.224.1.0.
>> ROB: Så när jag är klar med detta, logga in
Nu, i princip, är detta identiskt med ett terminalfönster i min apparat.
Så jag ganska mycket aldrig fungerat inifrån själva apparaten.
Jag alltid har den igång i bakgrunden minimeras
och SSHed in i den.
>> Problemet med detta är att du inte kommer för att kunna använda gedit lätt
direkt från detta.
Men om du vill vara en riktig coolt hacker, så ska du få använda en
kommandorad textredigerare ändå.
Så Vim och Emacs och Nano, alla dessa Vilka alternativ.
Nano tenderar att vara det enklaste.
Och jag tror att det inte har någon syntaxmarkering.
Åh, nej, det gör det helt.
Så du kan använda Nano, eftersom att man är ganska lätt.
>> Du ser alla dessa kommandon vid bottnen.
Denna lilla morot symbol.
Om du inte har sett det förut, kommer du förmodligen se det mycket nu.
Det innebär i allmänhet styr morot, som längst ned till vänster på tangentbordet
styrtecken.
Så här är det säger mig här nere -
åh, det är inte avskurna om jag zoomar in
Så Control, är X hur Jag ska avsluta.
Och det säger att jag kan träffa Y för Ja, för att spara, N för Nej.
Så det är Nano.
>> Vim och Emacs tenderar att vara något mer komplicerat och överväldigande.
Men du kan få van vid det, och Du kommer att älska det.
Så det är det.
>> JOSEPH: Du behöver inte göra det.
>> ROB: Ja.
Du är fri att använda gedit för resten av terminen.
Så någon apparat relaterade frågor?
Eller har du några tankar om vad måste talas om om
apparaten?
Ja.
>> SPEAKER 1: När du SSHed in din sak, var lösenordet Crimson?
>> ROB: Ja.
Lösenordet för det mesta i Appliance går
vara Crimson.
>> TALARE 2: Installera som en riktig IDE på apparaten, kommer det att fungera?
>> ROB: Jag föreställer mig Eclipse har en Fedora version, i vilket fall, ett ja,
du kan göra det.
Det är nog inte riktigt värt det.
>> TALARE 2: OK.
Så det är nog lättare om jag ville använder Eclipse, använd bara de infödda och
sedan ladda upp till -
>> ROB: Åh, är det också förmodligen lättare.
Men du kan få det att fungera inom Appliance.
>> JOSEPH: Och för kameran, frågan var, kan du installera en annan
IDE apparatens insida?
>> ROB: Eclipse är en Exempel på en IDE.
Någon annan apparat frågor?
Okej.
>> Så kommer vi nu att gå vidare till kommandoraden gränssnitt-relaterade saker, så CLI.
Och återigen, jag kommer bara att arbeta i här, eftersom detta är identiskt med
arbetar inom ett terminalfönster inom Appliance.
Hur är det teckensnitt ser?
Är det tillräckligt stor?
Okej.
>> Så det finns en hel del kommandon som du bör få ganska van vid
under hela terminen.
De två stora för navigering är ls, lista filerna i den här katalogen, och
cd, så byta katalog.
Så jag kan byta till skrivbordet och sedan ett mycket vanligt mönster är cd till en
katalog och omedelbart ls vilka är i katalogen.
>> Människor också ibland inte inser att Tab slutförande är en sak.
Så som cd, vh, och då jag slog Tab.
Jag skriver nästan aldrig ut det hela.
Och sedan om jag fortsätter att slå Tab igen, kommer den automatiskt
börja lista för mig.
Så jag kan cd vhosts, lokal värd.
Och det är bara att gå till -
i fall du inte har hört termen tidigare, är katalog bara ett annat ord
för mappen.
Så nu om du ser -
låt oss ta det till toppen.
>> Så nu om du ser inom parentes, du se den lilla tilde, snedstreck, vhost,
slash, lokal värd.
Så tilde avser att till min hemkatalog.
Det är en katalog du är i när du SSH i.
Det är den katalog du befinner dig i när man öppnar en terminal.
Det är där du börjar.
Och så är jag inne i min hemkatalog, och jag är insidan av vhost
katalog insidan av min hemkatalog.
Och så är jag inne i den lokala värd katalog inne i det.
>> Så några andra användbara saker med cd -
eller bra, i allmänhet, så dot alltid hänvisar till den aktuella katalogen.
Cd, är prick ett ganska värdelöst kommando.
Men det förändras till det aktuella katalogen.
En mer användbar en i termer av cd är prick, punkt, vilket är
bara gå upp en katalog.
>> Och observera att dessa -
Jag vill säga alias, men dessa symboler, prick, och prick, prick, som arbete
för ganska mycket varje kommando du är kommer att tänka på att köra.
Så som CD är nog där du kommer att med användning av de flesta, men dessa är inte
saker som bara cd förstår.
Det är ganska mycket något hela din kommandorad förstår.
En hel del program förstår prick och prick, prick.
>> Så de andra användbara sådana - cd, bindestreck.
Så det kommer att föra mig till senaste katalog som jag var i.
Så ibland jag ska göra något liknande, åh, jag arbetar här.
Och jag ser något fel med någonting, och Jag går undersöka det genom att gå till
några random katalog någonstans.
Och jag vet inte om det kommer Låt mig i det.
Det kommer.
Så då jag göra vad jag vill i den här katalogen.
Bla, bla, bla, bla, bla.
Och jag var som, okej, jag vill ha att gå tillbaka till där jag var.
cd, streck, och det leder mig tillbaka.
>> Så jag kommer att kasta en hel del av dessa på dig i dag.
Jag förväntar mig inte att du ska memorera alla av dem.
Det är liksom bara vet att de finns.
Och sedan senare när du är som, hmm, jag vill gå tillbaka till den
katalog som jag var precis på, oh, vänta, något sådant existerar.
Du behöver inte bara in i hela katalogen igen.
>> JOSEPH: Och så småningom kommer du bara använda dem om och om igen, och
det ska bli muskelminne.
>> ROB: Ja.
Så hur jag sa tidigare, att tilde är din hemkatalog.
Så jag kan cd, tilde.
Men jag har inte ens till göra det om jag bara -
Jag ska gå tillbaka till katalogen så det är inte en meningslös exempel.
Men om jag gör bara cd, det är också den samma som, gå till min hemkatalog.
Jag gör Command, K.
>> JOSEPH: Du kan också skriva klart, det ord, och det borde klara det.
>> ROB: Och jag tycker också Control, L också gör det.
Så många olika sätt.
Jag tror att det finns vissa skillnader där tydlig och kontroll, L kommer bara
verkligen driva det till toppen och Jag kan fortfarande rulla tillbaka.
Kommando, K bokstavligen förstör allt, och du
kan inte rulla tillbaka upp.
Åtminstone är det hur det fungerar i iTerm2.
Jag vet inte hur andra saker -
oh.
>> Med SSHing, så om du är på Windows, du kommer att behöva ladda ner PuTTY
För att SSH eftersom Windows inte har som en inbyggd SSH verktyg.
Från Mac kan du bara SSH direkt från ett terminalfönster.
OK.
Frågor?
>> Med ls, så något att vänja sig med de flesta av dessa kommandon är -
Tja, jag ska bara göra ett.
Ls, bindestreck, l..
Så streck, l är vad vi ska att kalla en flagga till ls.
Och en hel del av dessa kommandon har flaggor som du kan skicka till dem.
Så i detta fall, är streck, l en flagga som talar om för den att ge mig en fullständig
notering av all information av dessa filer.
>> Så vi ser här att skrivbordet var ändrad den 30 juli kl 00:54.
Nedladdningar ändrades 6 september.
Dessa är de nuvarande storlek och byte av dessa kataloger.
Du behöver inte förstå allt detta.
>> Här grejer till vänster, dessa drwx s, som kommer att bli mycket mer relevant
senare när du måste ta itu med -
som har att göra med vem som har behörighet att titta på dessa filer.
Och så om du inte var den enda användaren på denna dator, skulle du kunna
säg, OK vill jag vara den enda tillåtet att titta på den här filen, eller jag är
kommer att låta alla att titta på den här filen.
Så någon annan på min dator kan titta på denna fil.
Jag vet inte ens vad det här - vad innebär det gör?
>> JOSEPH: Jag är inte helt säker, faktiskt.
>> ROB: Ingen aning.
>> JOSEPH: Men om du inte vet, det finns ett bra kommando som du kan använda
att berätta vad utgången betyder.
Och om du skriver in människan före kommandot -
så M-A-N. ROB: Man.
Så man är en annan som är mycket användbar.
Och mannen, ls.
Så man-sidorna, de har båda kommandon som du kommer att använda
på kommandoraden, och de har också funktioner som är relevanta
med C. Så du kan människan -
och jag ignorerade 3.
Men man 3 printf kommer att föra upp till C-versionen av printf.
Men om jag gör bara man printf, är detta kommer att ta upp kommando printf
som händer på kommandoraden.
>> Så mannen, ls.
De man-sidor kan vara ganska överväldigande.
Men här ser du den här informationen av alla dessa flaggor som ls
förstår.
Så om vi går till dash, l, och -
Jag kommer bara att kasta det på dig.
Men för att söka, du vill att först slå på frågan
märke eller snedstreck knappen.
Så snedstreck.
>> Och då kan jag söka för vad jag vill.
Så jag kommer att hugga för streck, l..
Och där var det.
Så använd en lång lista format.
Det hjälper inte mig att lista ut vad just den kolumnen betydde, men jag
antar någonstans här Det skulle förklara det.
Så använd man-sidorna för varje kommando att du inte omedelbart förstår.
>> Jag är ganska säker på att du kan till och med mannen, mannen.
Ett gränssnitt till nätet referenshandböcker.
Åh, en sista en som kanske är en aning relevant är ls, bindestreck, en.
Så märker om jag gör just ls, Jag får dessa fem filer.
Om jag gör ls, dash, en, jag får mycket fler filer.
Så sak gemensamt mellan alla dessa nya filer är pricken förväg.
>> Så konventionen är att en fil som börjar med en punkt är dolt.
Så du vill inte se att filen du vill inte ha den bråka med
din kataloglistning.
Det är bara när du uttryckligen frågar, okej, ls, bindestreck, en, visa mig.
I en står för alla filer, inklusive dolda sådana.
Så några andra kommandon.
Åh, frågor på den punkten?
Ja.
>> TALARE 3: När du gör ls, a, vad är pricken, pricken?
>> ROB: Åh.
Så det här är vad jag pratade om.
Det är samma sak där Jag kan gärna cd, punkt, punkt.
Så tekniskt, punkt och prick, prick är filer som finns i varje enskild
katalog där dot-filen refererar till den aktuella katalogen.
Så om jag cd, punkt, jag ska bara att stanna i katalogen.
Och prick, prick alltid hänvisar till den föregående katalog en nivå upp.
Så om jag går in i loggar och ls, bindestreck, al, Vi ses prick, prick. cd till prick, prick
leder mig till föregående katalog.
Yeah.
OK.
>> Så en annan ganska viktig kommandot rm.
Så det är vad vi ska att använda för att ta bort den.
Och låt mig verkligen göra en kommando först.
Så mkdir.
Mkdir är hur du kan skapa kataloger.
Och jag ska skapa en temporär katalog och gå in i den temporära katalogen.
Och som väntat, det är tomt.
Men om jag ls, bindestreck, ett, jag har fortfarande prick och prick, punkt, eftersom prick avser
den aktuella katalogen.
Och prick, hänvisar prick till föregående katalog.
Och de kommer alltid att finnas oavsett den katalog du befinner dig i.
>> Och det här är en helt onödig kommando, utan beröring.
Jag bara använda det, eftersom det är ett enkelt sätt att skapa filer.
Så röra en trycker b, tryck c är bara kommer att skapa tre filer som kallas a,
b och c som är helt tomma.
Så poängen med mig skapar de i första plats är bara så att rm är
hur vi kan ta bort dem.
Så rm, en.
Det kommer att fråga mig, ta bort regelbunden tom fil a?
Och så kommer jag säga ja.
>> Så om jag vet att jag vill radera den filen utan att vara
du uppmanas att ta bort vanlig tom fil?, sedan rm, bindestreck, f kommer att bli det
flagga som säger, tvinga ta bort utan även vilket fick mig, åh, du är
säker på att du vill ta bort filen?
Ja, jag är säker.
Så rm, bindestreck, fb kommer bara göra det utan att fråga.
>> Så låt oss göra några fler kataloger.
mkdir, tmp2, cd, tmp2, röra en, tryck b.
OK.
Så nu vill jag ta bort tmp2 som en katalog.
Så rm tmp2.
Du kan inte ta bort tmp2, det är en katalog.
Så frågan här är att rm inte omedelbart arbeta med kataloger.
Det är mer tänkt för filer som icke-katalogfiler.
>> Och så vad vi kan göra här är rm, bindestreck, r..
Det står för rekursivt, vilket kan inte betyder någonting för dig ännu.
Men när du kommer till rekursion, det kommer att innebära mer.
Så rm, bindestreck, r, tmp2 kommer att rekursivt gå in i den katalogen.
Så ner i katalog tmp2?
Ja, vi går in i det.
Vill vi ta bort tmp2 / a?
Ja.
Vill vi ta bort tmp2 / b?
Ja.
Nu vill vi ta bort katalog tmp2?
Ja.
Och så nu katalogen och allt inuti
om den har tagits bort.
>> Det är tekniskt en kommando rmdir som du kan använda för att ta bort
kataloger, men det fungerar bara på tomma kataloger ändå.
Och för att se till att, låt oss bara do mkdir, tmp2 igen.
Tmp2 trycker en.
OK.
Så om jag försöker ta bort dirtmp2, det ska säga, katalog inte tom.
Så jag använder ganska mycket aldrig att ta bort dir-kommandot i alla fall, eftersom rm, streck,
r kommer att arbeta med tomma kataloger och icke-tomma kataloger.
>> Och även om jag inte vill ha att gå igenom det hela processen för
fallande i katalogen och ta bort varje enskild fil, rm,
streck, rf, tmp2.
Och nu är det borta.
>> Något att vara försiktig om är rm, bindestreck, rf.
Och det skrämmer mig att ens skriva det, för om jag av misstag
tryck på Retur eller något.
Så rm, bindestreck, rf, tilde skulle, utan vilket fick mig, inte f ingen uppmaning
mig, kommer den automatiskt att ta bort hela min hemkatalog och
allt i den.
Så du kanske tror att det är en dum sak att göra.
Och ja, det är det.
>> Men det kan hända mycket enkelt genom olycka om, säg, jag ville ta bort
min snedstreck, vhost katalog.
Och bara i snabb maskinskrivning, Jag råkar göra detta.
Det kommer att ta bort rekursivt både min hemkatalog och vhost katalogen
i denna speciella katalog som bara råkar inte existerar just nu.
Men det skulle ändå bort hela min hemkatalog.
Åtminstone genom att inte ha en f, det skulle uppmana mig först.
Och jag skulle vara som, åh, nej, jag vill inte göra det.
Men folk, snedstreck, inklusive jag har en tendens att komma in i
vana att alltid rf-ning.
Till och med vanliga filer som jag kan bara RM, c, jag brukar bara rm, bindestreck, rf, c..
Var bara försiktig när du är rf-ning.
>> SPEAKER 4: Vad gör C göra?
>> ROB: C är jag pratar om att C-fil i den här katalogen, som rm, c..
>> JOSEPH: Och mer farligt, om du använder en stjärna, hänvisat till allt i
katalogen.
Så vad jag brukar vanligtvis göra är att jag vill gå in i en katalog och jag vill
ta bort alla filer i det.
Så rm, bindestreck, rf, stjärna.
>> ROB: Ja.
Rm, tankstreck, rf, stjärna.
>> JOSEPH: Och om du inte är försiktig vilken katalog du befinner dig i -
Jag var inte i temp, men jag var av misstag i min hemkatalog,
då ska jag ta bort allt i min hemkatalog.
Och jag har faktiskt gjort det förut, och Jag tror att du har gjort det här förut, eller
Jay har gjort det förut.
>> ROB: Jag har av misstag bort -
så ignorera detta kommando för lite.
>> JOSEPH: Inte kul.
>> ROB: Så i slash bin är en gäng binära filer där det kan
vara bekanta uppstickare som klang.
Tja, klang och i princip alla dessa saker som jag kör på kommando
linje finns i denna snedstreck bin.
>> JOSEPH: Liksom ls är i här.
>> ROB: Så prick, snedstreck, ls skulle lista den här katalogen.
>> JOSEPH: Rm är också i den här katalogen.
>> ROB: Jag har av misstag rm, rf-ed bin, som tog bort något kommando jag kunde
möjligen någonsin vill.
Vilket då jag bara installera en nya Appliance på den punkten.
>> JOSEPH: Så vara mycket försiktig när du använder det här kommandot.
>> PUBLIK: [OHÖRBAR]?
>> ROB: Ja.
Det är också en dålig vana att komma in.
Om du märker, är jag nu -
Tja, du kan inte märka, men min zoom-in kanske kan.
Så jag är nu root @ apparaten.
Så jharvard är användaren som vi vill att du alltid ska använda.
Root är den användare som har behörighet att göra vad som helst.
>> Så märker när jag är jharvard, om jag försöker cd -
vad är en katalog som?
Åh, är roten ett bra exempel.
Så cd, rot.
Permission denied.
För om vi tittar på denna notering -
och igen, behöver du inte att helt förstå detta.
Men dessa tre streck säger att inte låta någon annan
användare i den här katalogen.
Och katalogen råkar ägas av användaren root.
>> Så det faktum att jag är jharvard och ingen en som inte är root tillåts i
denna katalog, innebär att att jag är kommer att få tillstånd nekas när jag
försök att gå in i den.
Så när jag är root, jag har tillstånd att göra vad som helst, inklusive
ta bort viktiga filer till Appliance och
förstör det hela.
>> Så det är en dålig vana att komma in bara vandra runt
operativsystem som root.
Jag gör det ändå.
Frågor?
Och jag ska avsluta rot, stanna som jharvard.
OK.
>> Mer relevanta kommandon.
Så gå tillbaka till vår temp, det mv kommandot står för drag.
Du kan flytta en.
Nu vill vi kalla det b, så nu det kallas b..
Eller kanske vi vill flytta b upp en katalog.
Så nu den här katalogen är tom.
Jag ska gå tillbaka till min hemkatalog, och Vi ser att b är här, eftersom
hemkatalog var en katalog upp från den katalog som B hade varit i.
>> Det finns också cp.
Så cp är kopiera super avsnitt, prick, text.
Jag kan kalla det är, prick, text.
Nu har vi båda super avsnitt, prick, text, och s, prick, text.
Detta fungerar även på kataloger.
Jag rf-ed en enda fil.
Så cp -
väl, låt oss först försöka cp, tmp, tmp2.
Så utelämna katalog tmp.
Så lik rm, standardbeteendet är att inte arbeta med kataloger.
>> Och återigen i samma rm, standard beteenden - bra, att få det att fungera
med kataloger är en, streck-r borta.
Så kopiera rekursivt temp katalog i tmp2.
Och så nu har vi både tmp och tmp2, och det är inte så bra eftersom tmp
var tomt i första hand.
Tmp2.
>> Nu kopierar tmp i tmp2.
Och vi ser att tmp2 har också den fil en, eftersom katalogen och
allt inne i det katalogen har kopierats.
Och det kan vara något bra om, säger du arbetar
på problem set en -
eller faktiskt, senare problem apparater är ännu viktigare, eftersom det
kommer att bli en hel drös av filer och ting.
>> Men om du bara vill, för en delad andra, du gillar, okej, jag är
kommer att prova något annat.
Låt mig bara kopiera hela min pset1 katalog i pset1 backup så att om
Jag sluta skruva upp saker, jag kan gå tillbaka in i min backup-katalog.
Det finns mer lämpliga sätt att versionshantering säkerhetskopiering av din kod, men
Detta är alltid ett snabbt sätt att bara göra att du har en kopia av något
att du håller på att ändra.
>> Så eko är också en engångs kommando som slags sillily kommer bara ut till den
kommandorad exakt vad du ville eko.
Så echo hi.
Vi ska bara skriva hej.
Echo hallå världen.
Vi kommer att skriva ut hallå världen.
Som kommer i bruk när du börja kombinera kommandon.
>> Och återigen, förvänta dig inte att du helt förstår detta ännu, men det är
något att se.
Och sedan om du googla efter exempel eller om du inser att du vill göra
något, kan det vara till hjälp.
Så låt oss, som ett exempel, så ls, bindestreck, l..
Så här ser jag utgången av ls, bindestreck, l..
Och jag säger, OK, jag vill lagra det i en fil.
All denna utgång här, jag vill ha att sätta i en separat fil.
>> Så denna lilla större än symbol är vad vi kommer att ringa.
Vi omdirigera utdata till en fil.
Låt oss kalla filen bla, eftersom det är vad jag brukar alltid kalla det.
Så nu ser vi att vi har en fil bla här.
Och om jag öppnar upp det, jag ser det är exakt utsignalen från kommando
att jag sprang bara.
Och på samma sätt kan du -
om detta var till en fil, detta är att få input från en fil.
Vad är ett kommando som jag -
>> JOSEPH: Jag tror att du kan använda mindre eller mer, förmodligen.
>> ROB: Men vad sägs om bara mindre bla?
Jag vet inte.
Om du kommer in i detta scenario, som det finns psets att det är bra för.
>> JOSEPH: Du kan rör det i eko.
Rör filen till ekot att se den.
>> ROB: Det är pipa.
>> JOSEPH: Förlåt.
>> ROB: Okej.
Så detta matas ut till en fil.
Det är få texten från filen och överlämna det till programmet.
Och du kommer också se den här killen.
Så det här är typ att göra båda samtidigt.
Och faktiskt, jag ska presentera två nya kommandon bara att använda sig av det.
>> Historien är en praktisk kommando som är just kommer att skriva ut en lista över
något jag någonsin köra ett kommando.
Så ser vi här allt som jag har varit igång hela tiden.
Massor av ls-talet.
>> Och ett annat användbart kommando är grep att dess syfte är att söka över
text leta efter mönster, bra, letar efter vad du
vill att det ska leta efter.
Och så en praktisk användning här är, säg vi vill ta tag i historien.
Och jag vill leta efter kommandon där jag - vad är en
användbar en att leta efter?
>> JOSEPH: [OHÖRBAR]?
>> ROB: Eller låt oss bara titta för alla berör, oavsett orsak.
Så det här är vad det kommer att se ut.
Och du behöver inte helt förstår det.
Men tanken är här, är historia ger samma utgång den gjorde här
där det är att skriva ut hela historia av allt jag någonsin springa.
Vi är sedan förbigående att -
så istället för att skriva ut den på skärmen, Vi vill skicka det till
kommandot grep som söker alla förekomster av ordet beröring.
>> Och så använder denna kombination av verktyg historia och grep, kan jag se, OK,
Här är alla kommandon jag någonsin springa, och här är en ganska vanlig man.
Vi är på botten.
Och det är också ger mig kommandot Jag bara sprang som hade
Ordet touch i det.
Men röret är en ganska bra sak för kombinering av flera program.
Och faktiskt, det är en genväg för låt mig utgång historia att lämna bla, och
låt mig grep använda filen bla så vad jag vill se över.
Så röret är bara en genväg för dessa två kommandon.
Ja.
>> SPEAKER 4: [OHÖRBAR]?
>> ROB: Ja.
Vad är -
Oh.
Låt oss testa.
Så katt, hund, fisk.
Så jag vill grep.
Dash, r, återigen, kommer att bli rekursivt, så jag vill sjunka ner
alla kataloger.
Jag vill rekursivt grep för alla - och låt mig tillfälligt få
detta ur vägen.
Ignorera mig.
OK.
>> Så jag vill tillfälligt grep för alla förekomster av ordet fisk.
Och så här vad jag gör är grepping rekursivt för ordet fisk.
Och stjärnan betyder över alla dessa filer i den här katalogen.
Och så det gav mig en Åtkomst nekad, eftersom det inte är tillåtet att läsa att
viss fil.
Men det fann fisk i filen, testa.
>> Jag kan också säga, speciellt, jag bara vill titta i filen bla, i
vilket fall kommer det inte att hitta något.
Jag vill bara att titta i filen, testa.
Det finns fisk.
Det är ett ganska användbart kommando veta i allmänhet.
Det finns några alternativ att GREP som är tänkt att vara mer
programmerare vänlig, men jag brukar att fortfarande falla tillbaka på grep.
Frågor?
OK.
>> Finns det andra kommandon?
Oh.
Bara en engångs en som jag alltid tycker är kul är cal.
Så märker när jag är i denna vackra helskärmsläge, jag har ingen liknande topp
verktygsfältet eller något.
Så cal ger mig bara en trevlig liten kalender som är rätt
nu avskurna, antar jag.
Men trevligt litet kommando.
>> JOSEPH: Det är [OHÖRBAR].
Andra kommandon som du kan ha sett innefattar klang och göra.
Vi kommer att gå igenom dem i mer i detalj senare.
Men om du har jobbat på den PSET, bör du vara
bekanta med dem.
>> ROB: Okej.
Frågor på kommandoraden saker?
Okej.
Så låt oss gå vidare till något C-relaterade saker.
Variabler matte.
OK.
Så precis som vi hade matte i Scratch, Du kan också använda matematik i C.
>> Innan vi kommer till det helt och hållet, så variabler.
Tänk på att när du deklarerar en variabel som int x eller float y, du
måste ge det skriver innan variabelnamnet.
Så typer vi har sett hittills är int, flyta, dubbel, lång lång, vilket jag
vet faktiskt inte om vi har sett det hittills.
>> Det finns några andra.
Vi ser röding.
Det är kort, vilket är som det är motsatsen till lång lång där det är
mindre än ett heltal.
Vi har också sett sträng.
Vad är speciellt med snöre?
Varför skulle jag säga att det är inte riktigt som int?
>> SPEAKER 4: Det finns egentligen inte.
>> ROB: Ja.
Så den enda anledningen till att vi har sträng beror på att när du gör
hash, inkludera cs50.h.
Och vi får se exempel på det senare - åh, som inte hanterar det väl -
där cs50.h gör något i linje med typ
def, röding stjärna, sträng.
>> Och så det säger att vi inte ens vet vad en röding stjärna är ännu.
Men detta säger vi vill ha sträng.
Varje plats som du har använt sträng, du kunde ha använt röding stjärna,
som faktiskt är en typ som förekommer i C-språket.
Men vi kommer till det.
Åh, och det går rätt tillbaka.
Neat.
>> Så samma sak med bool där sant och falskt.
Det är egentligen inte en inbyggd typ i C. Istället är det bara, har detta
värdet noll?
Sedan ska vi bara tänka att det är falskt.
Innebär detta har värdet -
väl, har detta något värde som inte är noll?
Då vi anser att det är sant.
Så en är sant, två är sant, något skilt från noll är sant.
Så de är de.
Frågor om deklarerar variabler och variabeltyper och allt det där?
Yeah.
>> SPEAKER 4: För länge länge, i boken, det sa att det skulle vara lång lång int.
Men kommer bara lång lång fungera?
>> ROB: Så dessa typ modifierare.
Så int x.
Så kan vi också säga unsigned int x.
Vi kan säga kort int x.
Vi kan säga lång lång int x.
Men ganska mycket av de saker jag just sagt, unsigned int, kort int,
lång lång int, kan du bli av med int och det kommer bara ta
att du menade int.
Så osignerade x, vilket bara innebär -
du vet hur normalt med en int, du kan säga x lika negativ 3?
Med en unsigned int, det kan du inte.
>> JOSEPH: Och återigen, för kameran, den Frågan var, vad är skillnaden
mellan långa långa int och bara lång lång?
>> ROB: Ja.
Så jag kommer nästan aldrig skriva långa långa int.
Jag kommer att skriva länge länge.
>> JOSEPH: Några frågor?
>> ROB: OK.
Så dum liten påminnelse om det är hur Vi deklarerar en variabel och initiera
variabeln och förklara en annan variabel och initiera
allt i ett steg.
Så deklarationen av variabeln och initieringen variabel behöver inte
till, men kan vara på samma rad.
>> Så vi har standard matematikoperatorer att du är van vid -
plus, minus, dividera, tider.
Det finns också modulo, där vi får se.
Det är inte, åtminstone i C, en inbyggd ström
exponentiering cirkumflex operatören.
Tja, det finns en cirkumflex operatör, men det är inte makt.
>> JOSEPH: Men det är inte exponentieringen, Ja.
>> ROB: Använd inte cirkumflex att anta att det betyder
som kvadrat eller vad.
Så några saker att ha i tänka om division.
Jag ska stå.
Så förklarade initialize svar.
Så vi säger float svar är lika med 1 delat med 10.
Skriv svar till två decimaler.
>> Och detta är den sortens saker som jag skulle människan printf att räkna ut att
vad sjutton gör%, prick, 2f detta?
Och det betyder bara, ja, ignorera 0,2.
Och%, är f vad vi använder att skriva ut att flyta.
Den 0,2 säger, skriv ut som flyter upp till två decimaler.
Så det här programmet har en bugg, och du kanske har sett detta tidigare i någon
innan CS kurs.
Men vad är det bugg?
>> SPEAKER 5: Zero.
>> ROB: Ja.
Så när vi säger, lika svar 1 dividerat med 10, vi vill ha det
svara för att vara 0,1.
Men ett dividerat med 10, en är en heltal, är 10 ett heltal.
Och så när vi gör ett heltal dividerat med ett heltal, vi kommer att komma tillbaka
ett heltal.
Så 1 delat med 10 är 0,1.
>> Eftersom det måste ge oss ett heltal, det är bara att kasta bort det
decimal och säger att svaret är 0.
Och så när vi trycker svara här, det kommer att skrivas ut 0,00.
>> JOSEPH: Och precis som en notering, det faktiskt kastar bort vad som finns efter
decimalkomma.
Så om du i stället hade 6 delat med 10, du kanske tror att det skulle ge dig
0,6 och då skulle man runda upp till 1.
Men egentligen, vad händer när den skriver uppgifter som det är att det droppar det som är
efter decimalkommat.
Så 0,6 blir 0.
>> ROB: Ja.
Och vi säger truncate för det.
Så när ni kastade till en int, decimaltrunkeras.
Så fix för det - det finns faktiskt två.
Och jag kommer att göra det andra, eftersom detta är en mycket enklare lösning.
>> Så en fix är använda flottar i divisionen.
Och egentligen, du bara behöver göra en av dem en flottör.
Men det är något tydligare bara för att göra dem båda flyter.
Så 1,0 delat med 10,0 är dividera två flottar.
Så svaret kommer att hamna en flottör, och så kommer du
rätt att skriva ut 0.10 här.
>> Något som inte fungerar så bra om det vill, ja, visst var det lätt
tillräckligt för att omvandla en till en flyta genom att göra det 1.0.
Men tänk om istället hade vi två heltal som int x är lika med 1 och int y
är lika med 10, och då vi ville ha att göra x dividerat med y?
Så det är inte lätt att bara göra X.0 eller något.
>> Så fixa till som gjutning.
Så gjutning är ett sätt på C för att konvertera från en variabel till en annan.
Så här, 1 är ett heltal.
Och genom att sätta denna flottör framför det är vi gjutning 1 till en flottör.
Och så detta kommer att konvertera den 1 till 1,0.
Och detta kommer att konvertera den 10 till en 10,0.
>> Och då saker beter sig på liknande sätt som tidigare version vi bara visade
var, som väntat, får vi 0,10 och det kommer att skriva ut det.
Och vi kan göra det med variabler, också.
Så vi kan säga, float x dividerat med float y.
>> JOSEPH: Några frågor?
>> ROB: Så precis som i vanlig matematik, Vi har operatörs företräde.
Så i matematik klass, du är mer benägna att kalla det ordning av verksamheten.
Här är den officiella termen operatör företräde.
Men operatören företräde, eller de flesta operatörer, är som du förväntar dig.
>> Så precis som i matte, 2 gånger 10 är kommer att grupperas närmare än
detta 10 delat med 2 och sedan 2.
Ordningen på verksamheten, kommer den att göra 2 gånger 10, 10 delat med 2, och sedan
det ska göra 20 plus 5 plus 2.
Så det är som förväntat, och du kan använda parenteser för att gruppera uttryck.
Du kan inte använda hakparenteser till grupputtryck.
Yeah?
>> TALARE 5: Kan du faktiskt bara gå tillbaka en sekund?
Kan du kasta en int till en sträng?
>> ROB: Så i C, du kan kasta vad som helst du vill vad du vill.
Det betyder inte att det är en bra sak att göra.
Så när du kastar en int till en sträng, innebär att -
och vi kommer att få in i denna mycket mer grundligt -
>> JOSEPH: Långt senare.
>> ROB: Jag ville inte säga mycket senare, så jag försökte ändra min mening.
Vi kommer att komma in i det mycket mer noggrant senare var egentligen när du har ett
strängvariabel -
så en sträng kan vara godtyckligt länge, eller hur?
Och vi har sagt att en int är fyra byte och långa långa är åtta
byte och en flottör är fyra byte.
Så en sträng, precis som en int, har endast ett visst antal bitgrupper till den.
Och det kommer att bli fyra byte.
>> Men en sträng kan vara ganska godtyckligt länge, eller hur?
Så hallå världen redan, om det är 10 tecken eller vad som helst, det är redan
kommer att vara över 4 byte Jag kan passa in i en sträng.
Och så hur strängar fungerar egentligen är att de är där i minnet att strängen
hålls.
>> Och så här, när jag säger sträng x lika hallå världen, insidan av x är
säger bara, åh, hej världen lagras på denna särskilda plats i minnet.
Så om vi försöker att kasta ett heltal till en sträng, då vi försöker tolka
vissa slumpmässiga delen av minnet som en sträng.
Och som nästan alltid bryter saker.
>> JOSEPH: Men om det förvirrar dig, kommer vi att täcka det
mer ingående senare.
>> ROB: Ja.
Det är dit du ska att få in tips.
Och det är en viktig bit av två veckor i denna kurs.
>> HÖGTALARE 6: Fungerar det som objekt på andra språk eller inte egentligen?
>> ROB: Så med andra språk, föremål skulle vara representerade med hjälp av pekare.
Det är inte samma sak, dock.
Några tankar?
>> JOSEPH: Nej.
Inga tankar.
>> ROB: OK.
>> JOSEPH: Next.
>> ROB: Bara att gå med det.
Okej.
Så modulo.
Precis som vi har plus, minus, dividera och multiplicera.
Så modulo är en du kan inte har sett förut.
Och det bara säger, ge mig återstoden av.
Så 55% 10.
Resten av att göra 55 delat med 10 skulle vara 5.
Så 55% 10 är 5.
Och 3% 5 skulle vara 3.
8% 8 kommer att vara 0.
16% 15 blir 1.
>> JOSEPH: En sak att notera med detta, också, är det kanske inte fungerar som förväntat
om du använder ett negativt tal.
Så negativ 5% 4, en del människor kanske tror det är -
Vad skulle du tänka negativt 5% 4 skulle vara?
>> SPEAKER 5: One.
>> JOSEPH: Så en del människor säger en, en del människor säger negativt.
Men vad -
>> ROB: Jag skulle inte ens ha sade en av dem.
>> JOSEPH: Två, sorry.
Vissa människor säger -
>> ROB: Tre.
>> JOSEPH: Tre?
>> ROB: Negativ -
vad var det - negativ fem -
>> JOSEPH: Tre, tre, tre.
Ursäkta.
Eftersom modulo, generellt, när du har sett det på andra ställen, oftast innebär det
returnera ett positivt tal, eller hur?
>> ROB: Så när vi säger i matematik,% 10-talet, de tenderar att vilja ge dig -
om vi mod med 10, då räknar vi med att få ett nummer mellan 0 och 9.
Här inne är det inte så att du kommer att få negativa tal returneras.
>> JOSEPH: Så negativ 5% 4 skulle vara negativt 1.
>> ROB: Men det är sällsynt att du är mod-ning negativa tal till att börja med.
Hoppa över detta.
>> JOSEPH: Ja.
>> ROB: Meh.
OK.
Så en sista sak att påpeka om flyter är att det är ett farligt beteende,
men flyter är inte en exakt representation.
Så gå tillbaka till byte igen, kom ihåg att en int är alltid fyra byte och en
float är alltid fyra bitgrupper.
Så Lucas exempel är ganska bra.
>> Så tänk på 1 dividerat med 3.
Så 0,3333333.
Om jag bara har 32 bitar, hur kan Jag lagrar 0,33333 exakt?
Och kanske, av någon anledning, säger du, okej, ja, låt oss bara säga
att denna speciella 1011001, låt oss bara säga att skulle vara 0,333333.
Tja, du har bara ett begränsat antal dessa bitar, så det är omöjligt att
representera varenda flyttals värde ges bara 32 bitar.
>> Tja, det är omöjligt att företräda någon flyttal givet oändligt -
väl, gett någon ändligt antal bitar.
Så frågan här är, väl, när vi använde för att skriva ut till två decimaler,
Vi fick rätt få svaret 0,10.
Men under huven, det är verkligen lagras så nära som möjligt för att
0.10 eftersom dessa bitar kan representera.
Är det på nästa bild?
Eller är det inte?
>> JOSEPH: Ja, det är det.
>> ROB: Blegh, blegh.
>> JOSEPH: Ja, kan du bara Dra noterna upp lite.
>> ROB: Jag kommer bara att zooma i den sista på det.
Jösses, det är [OHÖRBAR].
Så det numret.
Det är det som skrivs ut om vi kör det programmet.
Och märker att det är egentligen inte en stor sak om vi bara bry sig om som
2-3 decimaler.
Som vi bara ursprungligen ut 0,10, och det är därför vi såg inget fel.
Men när vi börjar komma in i exakt, exakt antal att det är
representerar, ser vi att det inte kan exakt representerar 0,1.
>> Och en del av problemet här är, okej, det är bra, men, ja,
första, vad händer om vi försökte göra, Svaret är lika är lika med 0,1?
Kommer det att returnera sant eller falskt?
Och så det är svårt att säga.
Jag tror att det faktiskt kan returnera sant.
Kommer det först -
Jag vet inte.
Svaret är när du börjar att göra med flyttalsvärden, du ganska
mycket bör inte använda jämlikhet på grund av denna bristande precision.
>> Och för allt du vet, det är den hundrade decimal att
flyttal kunde inte att korrekt hantera.
Och så jämställdheten kommer bara att misslyckas med även om antalet - om du hade varit
använda exakta siffror, siffrorna bör har exakt samma.
Det är under loppet av liknande 50 beräkningar med dessa flytande
punkt värden, kan felet bygga upp och upp och upp, och
det blir bara fel.
>> JOSEPH: Och det har varit riktigt kända exempel på att detta händer.
Liksom NASA ingenjörer har fått detta fel, orsakar raketer att explodera in
luften efter att de har lanserats.
Och massor av frågor som denna.
Så ja.
>> HÖGTALARE 6: När du säger 0.3 f, betyder trunkera resten?
Eller går det uppåt eller nedåt?
>> ROB: Kommer printf runt det?
>> JOSEPH: Jag tror printf klipper.
>> ROB: OK.
Så kan vi på samma sätt gå i motsatt riktningen av denna, där, i detta fall,
närmast det skulle kunna representera 0.1 var med detta nummer.
Närmast det skulle kunna representerar 0,2 är i den motsatta
riktning, 0,199999996356 eller något.
Så om vi gick i den riktningen av saker, då printf 0.3 f skulle återvända
1.99 istället för 2.00.
>> JOSEPH: Och jag är inte helt säker på det.
Du kanske vill skriva en liten, liten program för att bara kontrollera att.
>> ROB: Men, vad vi är säkra på är att om du försökte kasta den till en
int, och gjutning till en int kommer att bringa den att trunkera decimal, om
du försöker kasta 1.9999999 till en int, får du 1.
Och så bör du i allmänhet använda rund funktion i mattebiblioteket.
Frågor?
OK.
>> JOSEPH: Så går vidare till villkor och booleska uttryck.
Så du har sett dessa innan.
Och egentligen vill jag se till att min Datorn är i rätt format här.
Space.
Tyvärr, vi kommer att ha att göra en lite med cutoff vid kanterna.
>> Men ja, har ni sett detta tidigare i Scratch.
Så denna rätt här är ett uttryck som används i
en villkorssats.
Så svara större än noll kommer berätta sant eller falskt.
Och dessa är verkligen viktigt, eftersom de tillåter oss att införa
logik i vår kod.
>> Så till exempel, är detta ett program skriven i Scratch som ber användaren
för ett heltal och berättar för dem om det heltal som de gav dig var en
positivt eller negativt tal.
Och omvandlingen över här för att se är du först skriva ut ett uttalande,
ge mig ett heltal.
Och sedan ber du dem för ett heltal.
>> Och sedan använda villkorslogik över här för att kontrollera om det numret
var faktiskt större än noll eller inte.
Så här har vi ett booleskt uttryck insidan av en villkorlig Om uttalande.
Finns det några frågor?
Finns det några frågor om det?
OK.
>> Så det finns mer än bara större än, naturligtvis.
Du kan bygga booleska uttryck genom att använda de flesta av de möjliga saker som du
skulle tänka på i matematik.
Så större än.
Det borde vara en mindre än.
Ursäkta.
Och avståndet.
>> ROB: Gud förbjude att du lämnar den.
>> JOSEPH: Okej.
Så större än, mindre än, större än, eller lika med, mindre
än, eller lika med.
Vi använder dubbla jämlikar för att kontrollera om jämlikhet, eftersom enstaka lika medel
uppdrag, eller hur?
Ja.
Och då kan vi också inte lika med använder utropstecken, lika.
>> Och detta utropstecken kan också utvidgas så att om du vill
att invertera någon form av Boolean uttryck, kan du göra det.
Så detta kommer att utvärderas till sant endast om svaret är mindre
än eller lika med noll.
Har du frågor om det?
OK.
>> Så kan du också kombinera dessa uttryck som använder logiska och och
logisk Or.
Så det här är bara Och symbolen, som bör vara Skift, 7.
Och detta är röret symbol, som är inte en bokstav L. Det är en
det är precis ovanför Enter.
Så du använda två av dessa för att symbolisera logisk Och den logiska Or.
>> Så det här kommer bara returnera true om svar är en, två, tre eller fyra.
Och det kommer bara att returnera sant om svar är utöver det på vardera sidan.
Så det är inte en, två, tre, eller fyra.
Och det sätt som du skulle använda att i ett uttryck -
>> ROB: Eller en nolla eller en fem.
>> JOSEPH: Noll eller en fem.
Ursäkta.
Ja, ja, ja.
OK.
Och här borta nu, på samma sätt som du skulle använda det uttrycket, en mindre
uttryckssidan av en Om villkor uttalande, skulle du även använda den för
samma sätt genom att bara sätta den inne i parenteserna if.
Så här printf kommer endast avfyras om svar är en, två, tre eller fyra.
Har du frågor om att kombinera uttryck?
>> Så det finns en annan villkorlig konstruera vi kallar en If / Else.
Så i princip, innebär det nu, OK, om något jag ville kolla var inte
sant, sedan gå till Else och utföra det andra åtgärder.
Så i detta fall, frågade jag användaren för ett heltal.
Ger heltal större än noll?
Ja?
Nåväl, då de plockade ett positivt tal.
Om inte, så måste den ha varit negativ eller en nolla.
Så du valde ett negativt tal eller en nolla i det här fallet.
Ja.
Eller en nolla.
>> Och sedan har vi även om / Else, Om och annat.
Så här låter oss utföra en sekvens av saker bara om de första misslyckas.
Så i det här fallet, nu vi gör det sista du väljer noll.
Så om de varken plockat en positiv eller ett negativt tal, då de måste
har plockat noll.
Så det bara går ner kedja så här.
>> Så ett exempel på hur en Om skiljer sig från -
en Om / Else skiljer sig från bara en sekvens av Ifs.
Och detta är en vanlig fråga som folk frågar är, ja, om du får som en
95 i CS50, vad kommer detta program berätta?
>> SPEAKER 5: Du fick ett A.
>> JOSEPH: Ja.
Du fick varenda en av dem rätt.
Du fick ett A, du fick ett B, du fick ett C och ett D, eller hur?
Så alla dessa blir utvärderade i ordning.
Så medan en 95 är större än 90, är ​​det också större än 80, är ​​det också
större än 70, och det är också större än 60.
Så du har alla dessa kvaliteter.
Och jag antar att du skulle bara är intresserad av A.
>> Det sättet att fixa det är att ersätta de med Else / Ifs.
Så i det här fallet ser det att 95 är större än 90, och då det gör
inte bedöma resten av uttalanden.
Eventuella frågor om det?
>> Så det finns en annan villkorlig sorts struktur som vi har här, som vi
kallar en switch-sats.
Så detta gör att du i princip kontrollera vad värdet av ett nummer som du lägger
i switch-satsen är.
Så i det här fallet, vi byter på n, och vi säger, åh, om n är
en, sedan skriva ut det uttalandet.
Och sedan bryta, vilket innebär utgång ur switch-satsen.
>> Om det inte var en, då, ja, precis småningom kontrollera alla dessa fall.
Och så kollar om det är en eller två eller tre, och den skriver därefter.
Och vad denna standard nyckelordet här nere medel är om de inte in någon
av dem, då säger ogiltig.
Så låt oss säga att jag ber om n och användaren ger mig fyra.
Tja, matchar det inget av dessa fall, så det kommer att skriva ut vad som finns i
Standard avsnitt.
Ja, fråga?
>> TALARE 5: Kan du använda Boolean uttryck i stället för
en, två, eller tre?
>> JOSEPH: Så frågan är kan du använda Booleska uttryck i stället för en,
två och tre?
Och i C, tror jag att du kan inte göra det.
Men på andra språk, som du kanske möter i slutet av
termin som JavaScript, du kan.
Tja, skulle du behöva för att beräkna först detta värde och sedan använda den i
byta uttalande.
Yeah?
>> ROB: Så en del av nyttan med omkopplaren uttalanden är att tänka på om du gjorde detta
som en Om / Else, så som om n är lika med lika med ett eller vad.
Else / Om n är lika med är lika med två, vad som helst.
Else / Om n är lika med är lika med tre.
Så hur programmet skulle köra är det skulle sekventiellt gå den lista
och kolla, är n en?
Nope.
Är n två?
Nope.
Är n tre?
Yeah.
Gör det här.
>> Medan med switch uttalanden, är det faktiskt kunna sammanställa det att vara
riktigt snabbt.
Och så fort det står switch, det säger, okej, n är två, jag är
omedelbart kommer att hoppa dit Jag ska börja köra.
Jag tänker inte först kontrollera, är n en, är n två?
Det kan omedelbart börja göra vad den ska göra.
>> Och på grund av detta, kan det inte ta booleska villkor.
Annars skulle det ha att göra med sekventiell, liksom, okej, är n
större än noll?
Else är n större än 10 eller vad som helst.
>> JOSEPH: I det här fallet, om du använt Om / Else, Ifs, då växeln skulle
kör ungefär tre gånger snabbare än om / Else If.
Vi kan organisera strömbrytare så så att vi inte bryter
efter varje fall.
Så i detta fall, jag uppdelning av siffror som vi väljer i en och
två är inte höga siffror och tre är en hög siffra.
>> Så i det här fallet, är om n en eller två, det kommer att träffa målet och så kommer det
falla igenom, eftersom det finns ingen paus.
Och det kommer att hamna här.
Så om vi väljer en, kommer den att göra det printf och sedan bryta så att ingen av
detta utförs.
Och naturligtvis, om de kommer in i tre eller något annat, så kommer det att hoppa
dem och inte gå dit, och det kommer att utföra i stället
motsvarande linje.
Finns det några frågor om det?
Ja?
>> SPEAKER 4: Skulle du får ett felmeddelande om du hade en paus efter fall en men det
hade inte något för den att göra?
>> JOSEPH: Så frågan är skulle du få ett fel om du har en paus efter
skift en men det finns inget att göra?
Och svaret är nej.
Du kommer inte att faktiskt få ett felmeddelande.
Ja, mm hmm.
>> Så som en slags liten förändring här, Jag ska sätta en printf här.
Whoops.
Så vad skulle det ut om Jag satte en i som insats?
Yeah.
Det skulle säga dig att det inte tog ett stort antal gånger, eller hur?
Eftersom det skulle slå det första fallet, det skulle inte gå sönder, och det skulle falla
genom att det andra fallet.
Eventuella frågor om det?
>> ROB: Hade du en annan fråga?
>> JOSEPH: OK, svalna.
Okej.
Så finns det något annat vi kallar en ternära operatör som är i grunden en
alternativa syntax att göra Om och då annars.
Och det kan du göra allt på en rad.
Så i detta program, Jag ber användaren för n.
Och om n är större än 100, säger jag dem att de valde ett stort antal.
Annat jag berätta för dem att de plockade en låg siffra.
>> Så vi kan använda det här riktigt långa syntax, sträng, S, och sedan kontrollera om n är
större än 100 och tilldela det därefter.
Men vi kan göra så mycket mer kortfattade med hjälp av denna ternära operatören syntax
vilket innebär en fråga varumärke och ett kolon.
Så frågetecknet är i huvudsak att ställa en fråga, eller hur?
>> ROB: kanske zooma in på det.
>> JOSEPH: Ja.
Bra punkt.
Så detta är den ternära operatören.
Jag först ställa frågan, är n större än 100?
Om det är, då kör jag den första del före tjocktarmen.
Om det inte är, då kör jag den andra delen efter kolon.
Så om n är större än 100, då plockar hög och sätter
som i strängen s.
Om n är mindre än 100, plockar låg och sedan sätter det i strängen s..
Så det kommer att kondensera denna stor bit ner i just det en rad.
>> TALARE 5: Är det populärt?
>> JOSEPH: Ja, det är ganska populärt för saker där i huvudsak du vill
gör ett uppdrag baserat på någon form av tillstånd.
Och i det här fallet, vi försökte att tilldela ett värde till sträng s.
Det är inte så -
Jag antar att jag inte riktigt föredrar den i övriga fall.
Men det är särskilt användbart för detta uppdrag.
>> ROB: Det är ett ganska vanligt mönster där du har någon variabel som
du ska säga, om något, ställa denna variabel till en värde, annat, ange
denna variabel till ett annat värde.
Och det är det scenario där använda en ternär.
>> JOSEPH: Och du sparar massor av linjer, eller hur?
Och det bara gör din kod utan tvekan lite mer lättläst.
Ja, fråga?
>> HÖGTALARE 6: För en trefaldigt, kan du gå, string s jämlikar s, frågetecken?
Och då kan du ha, säg, fem olika alternativ.
Och beroende på vad det antal n var, skulle du välja en av dem?
>> JOSEPH: Så frågan är, är det en sorts syntax där du kan göra sträng
s är lika med n, och sedan har mer än två alternativ efter att frågetecken?
Och ett enkelt svar är nej, det finns inte verkligen ett bra sätt att göra det, om inte
du vill bo flera ternära operatörer inuti varandra.
>> Du kan göra som n större än 100, frågetecken, och sedan en annan
ternära operatör, n är större än 50, frågetecken, och bo på det sättet.
Men i detta scenario, är din kod få slags oläsbart och rörigt,
och det kan vara bättre att bara gå till en Om / Else uttalande på den punkten.
>> ROB: Och dessutom, som en sidoanteckning, PHP felaktigt implementerar ternära
operatören så att kapslade ternaries inte ens fungerar som de ska.
>> JOSEPH: Ja.
Så det blir lite förvirrande, speciellt när du går
till olika språk.
>> ROB: Det är förvirrande nog att språk är fel om det.
>> JOSEPH: Så egentligen, bara för att klargöra, inte alla vet vad som
% S gör här borta?
Eventuella frågor om det?
Jag antar att bara för kameran, den% s i grund och botten låter oss sätta en platshållare
för en sträng.
Och sedan i slutet, vi ange att variabel som vi vill sätta in i detta
platshållare är s.
Så att i grunden tar s och det sätter den in här.
Och så kommer det att skriva ut, du valde en hög eller du valde en låg siffra.
OK.
>> Så loopar kan du utföra saker i cirkulära rörelser, eller hur?
Du kanske har stött på detta i Skrapa i form av evigt loopar
eller Upprepa tills eller Upprepa en viss antal gånger.
Så varför är det bra för oss?
Tja, i C, låt oss säga att vi har denna sång förs i Scratch att
sjunger, är detta den låten som aldrig tar slut.
Det går bara om och om och för alltid och för evigt.
Tja, kan man inte riktigt göra ett program som har ett oändligt antal printf
uttalanden i det, eller hur?
>> Så i detta scenario, ett sätt att du skulle kunna göra detta arbete och
att få det att skriva ut för alltid är att istället använda en while-slinga.
Så en while-slinga kommer att utföra vad som är i kroppen av de två hängslen som
tillhör det baserat på vad tillståndet är.
Så i detta speciella exempel tidigare, om Vi vill skriva ut det här för alltid, vad
kan vi göra?
Jo, visst, eller hur?
>> Så här sortens kombinerar idén av några booleskt uttryck
tillsammans med en slinga.
Och vi lärde oss om Boolean uttryck tidigare.
Så när tillståndet inuti att Medan fortfarande sant, denna slinga
kommer att köra på och på och på.
Och i det här fallet, om vi bara leverera det med sann, orsakar detta en oändlig
slinga som skriver låten om och om och den som vi önskade innan utan
att ha ett program som har ett oändligt antal printf uttalanden, vilket är
inte möjligt.
>> Så mer fängslande, fast, Du kan använda denna med en
variabel och ett tillstånd.
Så låt oss säga att vi vill upprepa fras, totalt loopy, 10 gånger.
Så vad du kan göra med en while-slinga är kan du först initiera en räknare
variabel utsida Medan slingan till 10.
Och sedan i princip, varje gång du går genom Medan slingan, skriva ut dig
uttalandet och sedan minska räknevariabeln förrän i slutet,
någon gång, när vi subtrahera jag nog gånger, 1 från I tillräckligt många gånger -
och bara för att klargöra, jag minus minus betyder att jag är lika jag minus 1.
>> Det kommer i princip ta jag ner till punkt där när jag slog noll, detta
tillstånd är inte längre sant och så det kommer ut ur loopen.
Så helt loopy endast skriver ut 10 gånger.
Har du frågor om en while-slinga?
OK.
>> Så det finns ett sätt som vi kan göra det vi just gjorde på ett mer koncist sätt med
vad vi kallar en For loop.
Så en For-slinga består av en initiering, ett tillstånd och en
uppdatering, precis som vi hade innan i denna Medan slinga.
Så låt oss ta en titt.
I denna Medan slinga, hade vi en initiering, sedan hade vi en
skick att vi kontrollerat.
Och sedan hade vi en uppdatering steg på toppen.
>> Med en For loop, detta i grunden tar dessa tre saker och kondenserar det
ner i en linje.
Så det första som det gör i För loop är initieringen.
Och då du gör ett semikolon, och sedan du gör det tillstånd, som jag
större än noll går därborta, och sedan steg uppdateringen.
Så detta blir utfört på slutet av slingan.
Så dessa två program är väsentligen ekvivalenta.
>> Några frågor?
Så vad är en skillnad mellan dessa två?
Kan någon peka ut det?
Det kan vara lite subtil.
Det är bara en mycket liten skillnad.
Ja?
>> TALARE 5: Du skulle inte kunna använda I variabeln utanför För loop
[OHÖRBAR]?
>> JOSEPH: Exakt.
Så det här är något som vi kommer till senare kallad variabel omfattning.
Men i grunden, det int i liv utanför denna Medan slinga.
Så när denna Medan slinga görs köra, kommer jag att kunna använda jag senare
på i programmet.
>> Av följande skäl: med detta För loop, detta int jag är scoped insidan av denna För loop.
Och eftersom det är insidan av denna del i För loop börjar det
på parentesen och slutar med den lockiga stag där.
Allt som har deklarerats inuti här kan inte användas utanför.
Så om jag försöker använda jag utanför, det ska säg mig, svart symbol.
Och i grunden, jag skulle inte kunna använda den.
>> ROB: Och ja, för 10 år sedan, i bokstavligen alla fall, klammerparenteser är
vad du använde för att bestämma räckvidden för en variabel.
Så där, int jag lika med 10 deklareras inuti denna
set av klammerparenteser.
Och så då, så länge som du försöker använda jag innan denna klammerparentes, det är bra.
Du kan se när du skriver gör du se streck, streck, std, lika, C99.
>> Så det är en senare version av C som GCC har genomförts som också ger
denna genväg.
Så här används för att inte tillåtas i C. Och du kan se varför, eftersom detta int
Jag är utanför denna klammer men det är fortfarande anses vara i
omfattningen av dessa klammerparenteser.
Men detta är en mycket bekväm sak, och så är det en bra förlängning.
>> JOSEPH: Några frågor?
OK.
Så vad är mer användbart är att ibland du vill sorts dynamik i
din loop, eller hur?
Du vill inte bara nödvändigtvis skriva ut helt loopy hela tiden, du
vill räkna ner från 10 eller något.
Och så du kan använda räknarvariabeln inne i nämnda slinga samt.
Och i det här fallet, det här programmet bara räknar ner från 10 hela vägen ner.
Och vad betyder det inte att skriva ut?
Det skrivs inte ut noll, rätt, för när -
Ja, det också inte skriver ut 11.
>> Så det inte skrivs ut noll, för när Jag är noll, kom ihåg, det utvärderar
tillståndet innan det går på att exekvera slingan.
Och när jag är noll, är det falskt, så den inte skriva ut räknar ner
noll, bara skriver ut räkning ner 10 hela vägen ner till 1.
Om vi ​​ville faktiskt det att skriva ut noll, då skulle vi sätta ett likhetstecken
efter det att denna är större än-tecken.
OK.
>> Så ett sätt att göra validering av indata, vilket är när du ber användaren att göra
något, vill du se till att de följer dina instruktioner, är att använda
While loop, eller hur?
Så i det här fallet, jag ber för ett positivt tal så är jag
väntar på inmatning.
>> Och då jag kollade Medan ingången är mindre än noll, hålla ber dem.
Så länge de ger mig ett nummer det är inte positivt, tiden ställer,
hålla frågar, tiden ställer.
Men vad är slags konstigt om det här?
Eller vad tycks inte optimalt om denna struktur här?
Någon?
Ja?
>> HÖGTALARE 6: Du upprepar instruktionen två gånger.
>> JOSEPH: Höger.
Så vi har två printf uttalanden här, eller hur?
Så det finns ett sätt som vi kunde få detta bara ner till en som skulle göra våra
kod lättare att läsa och lite mer ren.
Och då vi inte skulle behöva har få in dubbelt så bra.
Och ett sätt du kan göra detta är med hjälp av en Do-While-loop.
>> Och en Do-While-loop är i grunden en annan form av en while-slinga där
allt inom klammerparenteserna blir körs minst en gång.
Så här förklarar jag, int ingång, utanför först.
Och då säger jag bara, gör det instruktion medan inmatning
är mindre än noll.
Så det träffar Do först.
Det kommer alltid att utföra detta åtminstone en gång, så det kommer alltid att be användaren
för inmatning minst en gång.
Och sedan utvärderar den ingången, och det händer i en cirkel.
Ja, fråga?
>> HÖGTALARE 6: Finns det något sätt att göra det [OHÖRBAR] slag, som om du säger,
GetString, och någon [OHÖRBAR]
finns det något sätt att [OHÖRBAR]
>> JOSEPH: Så frågan är, är det en sätt att göra validering av indata om användaren
sätter inte i rätt typ av variabel?
Så om vi ber om en int och de ge oss en sträng istället.
Och i de funktioner som vi genomför för dig, getInt, GetString i alla
dessa funktioner, de faktiskt redan göra den sortens grundtyp ingång
valideringen under huven.
Så om du använder de funktioner som vi gav dig, behöver du inte verkligen måste.
>> Men om du vill titta mer på hur du faktiskt kan göra det, kan du titta
under huven på filen I/O--
inte filen, standard I / O-funktioner som en läsning från standard input och
standard ut.
Och du kan få en bättre känsla om hur du kan göra det.
>> ROB: En fråga är dock specifikt med exempel som du
sagt, förvänta dig en sträng och jag anger en int.
Hur skulle du se skillnad mellan avsiktligt vilja ha
sträng 123 kontra att vilja det int 123?
Så sträng, det är ganska mycket det finns ingen validering, det är precis vad de
angett att du kommer att tolka som en sträng.
>> Int är lättare, eftersom oavsett den input du tar från användaren, är du
alltid med en sträng.
Och så att strängen kan du sedan kolla, är alla dessa
faktiskt numeriska siffror?
>> JOSEPH: OK.
Har du frågor om en Do-While-loop?
>> ROB: Åh, och det är också -
gå tillbaka till omfattning, en något gemensamt misstag försöker använda vissa lokala
variabel inifrån denna Do-While slinga insidan av detta tillstånd.
Och faktiskt, om vi bara blev av detta och sade, int input är lika
GetInt, då kompilatorn kommer att skrika på oss, eftersom indata inte finns
utanför tillämpningsområdet för dessa klammerparenteser.
>> JOSEPH: Och det är därför vi behöver denna lineup här.
OK.
Så kan man också bryta sig ur en loop tidigt om du vill.
Så det här är ett annorlunda sätt att genomföra det som vi just genomfört.
Och istället för att använda villkoret inom parentes, vi använder en
Om uttalandet insidan av kroppen av Do-While-loop.
>> Och i grund och botten, när ingången är äntligen större än noll, kommer vi
bryta sig ut ur loopen.
Och så kommer vi att gå alla vägen hit.
Och du kan se att detta skulle förmodligen att föredra i denna
scenario, eftersom det är en liten lite renare och lite
lite lättare att läsa.
Detta, du slags har extra rader i den.
Det är bara lite fulare, Jag antar, i en mening.
Ja, fråga?
>> SPEAKER 4: Kommer bryta bara få dig av en uppsättning av hängslen?
>> JOSEPH: Höger.
Så frågan är kommer bara att bryta får du ut av en loop?
Och svaret är ja.
Så om du har kapslade för loopar, för exempel, om jag har för int jag lika med 0
fram till 10 och sedan för int J är lika med 0 till 10, om jag bryter ut ur inner
slinga, jag kommer fortfarande att gå till den yttre slingan.
Så det kommer att fortsätta att utföra operationer på utsidan.
Eventuella frågor om det?
Ja?
>> TALARE 5: Men bryta endast funktioner för klammerparenteser, inte för andra
påståenden?
[OHÖRBAR]
>> JOSEPH: Så frågan är kommer att bryta endast funktion för loopar i motsats till
övriga uttalanden som om?
Och ja, det är fallet, eftersom du bryta ut i en slinga, höger,
i en mening.
>> ROB: I de allra flesta fall är det Detta är den typ av Om något,
sedan bryta.
Så du behöver inte bryta gälla If som omslag runt den.
Och också, det är inte mycket av en slinga, men kom ihåg att switchar är också
brutit ut i form av pauser.
Vi såg raster som används med växlar innan.
>> JOSEPH: Och du kan även använda dem i medan slingor och för slingor.
Några frågor?
OK.
Så nästa upp är funktioner.
Så du kanske har använt en av dessa BYOB block i din Scratch projektet.
Och detta i grund och botten tillåter du definiera en uppsättning
instruktioner som ska följas.
>> Och vad jag menar med det är låt oss tänka tillbaka till matte, höger, algebra.
Du har vad vi kallar en funktion av x, någon variabel, och låt oss säga att detta
Funktionen är f av x är lika med x plus 5.
Så du kan tänka på f på x som denna svarta box som tar 15 i och sedan
producerar 20.
>> Så mer generellt, är en funktion något som tar några ingångar och
sedan producerar några utgångar.
Och varför är funktioner bra?
De är bra för ett antal skäl.
Så gör någon vill ta ett knivhugg på vilken organisation innebär?
När det gäller varför funktioner är till någon hjälp?
Ja?
>> SPEAKER 4: Det gör din kod mer lättläst.
>> JOSEPH: Höger.
Så en av de saker som är det gör din kod mer lättläst, eller hur?
Istället för att ha som int x är lika med x gånger x gånger x, kan jag få kub av x,
vilket är mer lättläst och mer begriplig för en läsare.
>> Organisationen är också i fråga om dela upp koden i hanterbara
portioner, så att istället för att försöka genomföra detta allt i ett långt avsnitt
i huvud, kan du slags dela upp in liksom, OK, låt oss skriva en funktion
att kub något, låt oss skriva ett fungera till torget något.
Så att du kan dela upp den i små, små delar som du kan hantera
i stället för att försöka ta itu med ett stort problem på en gång.
>> ROB: Eller till och med små, små delar som du och en partner kan tackla.
>> JOSEPH: Ja.
>> ROB: Så istället för båda du försöker att implantera en
fungera på samma gång.
>> JOSEPH: Förenkling.
Den som vill ta en gissning?
Ja?
>> SPEAKER 5: Mer upprepning.
>> JOSEPH: Höger.
Så en sak som du kan göra med förenkling är att det är typ av på
samma linjer som återanvändbarhet är att när jag skriver en kub funktion, jag kan
bara använda den om och om och om igen igen i mitt program i stället för att skriva
x gånger x gånger x över och om och om igen.
Och förenkling här också bara betyder att det gör din kod slags
lättare att felsöka när du delar detta upp in funktioner.
För då kan man lokalisera var dina problem sorts är.
Några frågor?
>> Så en annan idé är abstraktion, eller hur?
Denna svarta låda.
Som vet du vad getInt gör för att ta emot synpunkter från användaren?
Vi har inte riktigt sagt, eller hur?
Allt vi har sagt är getInt gör exakt vad den säger att den gör.
Så även om vi inte berätta hur det fungerar, du fortfarande känner.
>> Så i detta fall, är detta en fyrdubbel funktion som gör
olika saker för en ingång att alstra en utsignal.
Och du kan fyrdubbla ett nummer genom att multipliceras med fyra.
Eller så kan det vi kallar bitars flytta den med två.
Och vi kommer att täcka detta lite senare.
Och det finns ingen anledning att veta hur detta Funktionen fungerar faktiskt så länge det
arbetar som anges.
>> Så under huven, skulle jag vara liknande, återinmatningstider
åtta dividerat med två.
Och du skulle inte veta, eller hur?
Allt du behöver veta är Det gör vad den säger.
Så det är den användbar sak om abstraktion.
>> Och en annan sak är slags denna idé att lokalisera din kod till någon
särskilt avsnitt.
Så om du har ett problem, gör du inte måste gå över din kod försöker
att åtgärda var problemet var.
Så i det här fallet, genomfört jag kub fel.
Jag trodde att kuben var multiplicera genom tre.
>> Så i det här fallet, är detta ett program som har bara multiplicera med tre
överallt.
Och det är ett annat program som har factored kub ut i en funktion.
Och så nu, om jag vill fixa mitt misstag här, jag måste fixa varenda rad
av kod i programmet.
Medan å andra sidan, om jag använder funktion, jag behöver bara ändra
vad som var fel på ett ställe.
>> Så i datavetenskap, vi ringa in-och utgångar.
Ingångar kallas parametrar eller argument och utgångar kallas
returnera värden.
Och vi får se hur det hjälper oss att sortera av definiera en funktion i en sekund.
Så det här är en funktionsdefinition för cubing.
Så det tar en ingång, och sedan återgår det antal gånger
sig själv tre gånger.
Så låt oss bryta ner det.
>> Så vi har en funktionshuvudet, vilket i grund och botten består av tre saker.
Så vi har de parametrar som är, som jag sa tidigare, det
ingångar i denna funktion.
Och sedan ger vi den funktion ett namn.
I det här fallet, det kallas kub.
Och ange sedan vi vilken typ av returvärdet är.
>> Så i detta fall, min kub funktion tar in ett heltal och det också
returnerar ett heltal.
Så om jag passera i två, två är ett heltal, den återgår åtta till mig, som
är ett heltal.
Så tillbaka typ namnparametrar.
Frågor om det?
>> Och då är returvärdet faktiskt specificeras i slutet genom att säga avkastning
och sedan återvänder allt innehåller returvärdet.
Så i det här fallet, om vi sätter allt tillsammans, tar en funktion i
parametrar, det kallas något, och det återgår något som är den typ
att vi säger att det skulle bli.
Några frågor?
>> Så hur använder vi en funktion?
Tja, vi skriver en funktion och sedan vi använder det i vårt program, eller hur?
Så jag kallade det kub, och då kan jag använda kuben.
>> Men vad som är viktigt att notera är att orderfrågor.
Om jag har kub nedan viktigaste, det är kommer att köra in i kuben.
Och vid det här laget, det finns inget kallas kub i programmet, och det är
bara kommer att bli som jag har ingen aning om vad kuben är.
>> Så det kommer att säga, implicit förklaring funktion.
Det är fel som dyker upp.
Och så i detta fall, är kub nedan huvud, så det inte kommer
att veta om det.
>> TALARE 5: Så huvud är oftast den sista funktionen definieras?
>> JOSEPH: Så frågan är, är huvud oftast det sista
sak som du skulle definiera?
Och nr.
Det är för att vi brukar vilja huvud att vara i toppen, eller hur?
För det är det första du vill programmeraren öppnar
program för att se.
Och så hur löser vi det här problemet om vi intresserad av huvud att vara överst, men
funktioner som vi vill ha, vi vill ha dem ligga under huvud ännu kunna använda
dem inne i huvud?
>> Tja, vi använder det vi kallar en funktion prototyp.
Så vad en funktionsprototyp i huvudsak är det första tar det som
signaturen eller funktionshuvudet av vad vi vill genomföra ned
här, och vi satte den på den övre delen av ett program.
>> Så i det här fallet, säger vi att, ja, senare i vårt program, vi ska
att göra ett löfte att genomföra detta Funktionen kallas int kub, som tar
ett heltal ingång.
Så nu, eftersom det är över huvud, viktigaste, det kommer att säga, oh, ja,
senare i programmet, det kommer att bli där så jag kan hänvisa till det, så jag ska
bara låta det gå igenom för nu.
>> Och sedan i botten, vi genomföra kub.
Och sedan huvud kommer bara säga, bra kommer det slags länk
dessa två symboler tillsammans.
Och vi kommer att täcka vad som betyder senare.
Och så det ska veta att detta är den kub funktion som den ska använda.
>> ROB: Den [OHÖRBAR] om att vilja Huvud i botten eller
topp, jag har sett båda.
Det finns saker som bara gillar att sätta huvud i botten.
Men när ett projekt blir särskilt stora, oftast huvud är i en
fil alla sina egna.
Och vid denna punkt, som den int kub linje skulle -
insida stdio.h är ett gäng rader precis som det int
kub int ingångsledning.
>> Och så dessa prototyper är saker som du tenderar att sätta in header-filer, på
vilken punkt, det spelar ingen roll.
Tja, det spelar ingen roll.
De som alltid går i toppen.
Och om huvud är inte en fil alla sina egna, du behöver inte oroa dig för att sätta
individuella funktionsprototyper i filen.
>> JOSEPH: Och vi kommer till det lite Lite senare när Rob börjar prata
om att sammanställa.
Och så finns det också en skillnad mellan parameter och argument.
Och parameter är precis vad Vi kallar dessa ingångar när
vi definiera funktionen.
Och vi kallar det ett argument när vi faktiskt för in funktionen.
>> Så i detta fall, är detta en parameter, som vi sagt tidigare.
Och när vi faktiskt använder den där borta, kub av x, då x i sig är
vad vi kallar ett argument till funktionen kub.
>> ROB: Så parameter argument är -
det är denna skillnad, mycket förvirrad omväxlande.
Vid denna punkt, för mig, det är som en av dessa ord att när jag ser det ut i
det vilda, jag kan inte låta bli att omedelbart frågan om de använder den i
rätt sammanhang eftersom Skillnaden är subtil nog att bara
alla tenderar -
Jag säger nästan alltid argument oavsett vad jag menar.
>> Joseph: Och funktioner är också användbara för det vi kallar biverkningar.
Så en funktion kan ta några ingångar, och det kan också producera inga utgångar.
Så i detta fall, är jag definierar en subrutin som inte har någon
returvärde.
Och för att specificera det använder vi vad vi kallar ett tomrum här.
Och så bieffekt av denna funktion är att det bara skriver stuff
ut till sidan.
Det behöver faktiskt inte ta några ingångar, och det gör inte
faktiskt ger några utgångar.
>> Men detta skulle kunna vara användbara i den meningen om du vill, till exempel, felsöka
något i ditt program, om du vill att skriva en liten subrutin som
skriver ut, låt oss säga, innehållet minne eller något.
Och så dessa biverkningar är ibland användbara utanför ramen
för precis som in-och utgångar.
Några frågor?
>> Och för att avsluta detta segment, vad gör det här programmet göra?
Jag ska ge er ett par sekunder att läsa igenom det.
Vid en mycket grundläggande nivå, vad vi vill säga är att det byter x och y, eller hur?
>> Så hur många av er som faktiskt tror detta kommer att byta x och y?
Räck upp handen.
Ingen.
OK.
Vem tror att det kommer inte byta x och y?
Och summan av det var inte hela rummet.
Så en del människor är osäker.
OK.
Det är rimligt.
>> Så låt oss gå igenom vad som händer när du faktiskt ringa funktioner först i
För att svara på denna fråga.
Så det här är vad minne slags ser ut.
Det är ungefär som en förenklad modell vad minnet ser ut när
du kör ett program.
Så det finns något som kallas stapeln här nere och
något som kallas högen.
Och dessa växer mot mitt i minnet.
>> Så i detta särskilda fall, när du kallar en funktion, det
får sätta på stacken.
Och sedan det som finns i det Funktionen stannar i vad vi kallar att
funktionens stackram.
Och så för att få en fin visualisering av detta, let's - till exempel, hade vi
programhuvud tidigare.
Och inne i huvud, ringde vi kub.
Så huvud skulle först gå på stacken rama, eftersom det är den första funktionen
det kallas.
>> Och sedan när kuben kallas inuti huvud, blir det sätta på toppen av huvud
insidan av minnet.
Så vad du ser här är att kuben har sina egna parametrar och dess
egna lokalbefolkningen.
Så när du faktiskt skicka något till en funktion, de parametrar som det
får är kopior av det som var gått in från huvud.
>> Och att sorts förklara detta, låt oss gå igenom ett program.
Så vi har stacken, det är bara stapeln partiet.
Och det vi gör är att vi först initiera x och y till ett och två.
Så vi har dessa små lådor.
De sitter i huvud stack rama på stacken.
De innehåller ett och två.
>> Nu kallar vi swap.
Vad som händer är att vi passerar x-och y i swap, och swap skapar sina egna kopior
av dessa variabler för att använda inne av sin stack ramen.
Så nu där borta, har vi en, som innehåller det värde som x hade, och b,
som innehåller det värde som y hade.
Så ett, två.
>> Och du kommer att märka att det är separata från x och y på insidan av huvud.
Så vi nu skapa en temporär variabel som innehåller en.
Vi satt en lika med b, så det förändringar från en till två.
Och då kommer vi in ​​b lika till temp, som är ett.
>> Och så nu vi lämnar ut av denna funktion.
När du stänger av funktionen, den stack ram blir dök upp i stacken.
Vi kallar det driva.
Du trycker en bunt ram på stacken och du pop om från stacken.
Och så vad som händer är allt som var i det stack ram slags bara
går upp i lågor.
Och så det finns inte längre.
>> Men vad är det vi ser?
Vi aldrig faktiskt förändrat värden för x och y, eller hur?
Så de stannade lokal till huvud.
Och genom att skicka saker till swap, vi faktiskt aldrig bytt dessa värden.
Och vad kallar vi det här?
Vi kallar detta passerar genom värde.
>> Så i C, när du passerar saker i funktioner, går det dem med värde och
gör en kopia av dem för den funktion som ska användas.
Och vi kommer att lära sig om något som kallas passerar genom hänvisning senare, men det är
ett sätt du kan lösa detta problem.
Men vi kommer inte att oroa sig för det förrän senare.
>> ROB: Och faktiskt, den termen, som passerar genom hänvisning, betyder så C inte ens
passerar genom att referera.
C uteslutande har förbi värde.
Oavsett vad du gör, är du alltid passerar en kopia av något.
Det är bara det att, som jag slags nämnt som tidigare med pekare
och att en sträng är egentligen bara fyra byte som pekar på någonstans i minnet.
>> Tja, om jag har denna sträng och det är säger det är där strängen -
väl, om jag har denna pekare till detta plats i minnet, så jag kan skicka en
kopia av denna pekare till en funktion, och att funktionen fortfarande vet var i
minnet är.
Så båda dessa pekare pekar till samma plats i minnet och
det är hur vi ska kunna att ändra saker utanför
nuvarande stack ram.
>> JOSEPH: Vill du göra sammanställa?
>> ROB: Nej, det är 05:30.
>> JOSEPH: OK.
Det är 05:30.
OK.
Så vi kommer att täcka sammanställa Jag antar i nästa avsnitt, eller din avdelning
ledare kommer då.
Och -
>> ROB: Några frågor?
>> JOSEPH: Några frågor?
Ja?
>> SPEAKER 5: Använda strängar från CS50, något funktioner som vi vill använda för
de kommer att vara som C-funktioner.
CS50 har inte gått in och gjorde ytterligare.
>> ROB: Rätt.
Någon av C som [OHÖRBAR], du skulle använda dem på våra strängar.
>> JOSEPH: Och en sista sak jag vill nämna är att vi har en stilguide
för denna klass.
>> ROB: Oh, ja.
>> JOSEPH: Så om du har kommit från en programmering bakgrund innan du
kanske har vissa konventioner när du skriver kod som att sätta
hängslen på samma linje eller särskild sätt att indrag
eller namnge dina variabler.
I denna klass, som vi vill följa en specifik stilguide bara för att,
Tja, om du går ut och arbeta i industri, du kommer att vänta
att följa stilguiden för företag där du går till.
>> Som till exempel, Facebook tror jag har en särskild typ av namngivning
konvention.
Och det finns skillnader mellan kamel hölje variabler och precis som
separera dem med understreck.
Och dessutom, jag tror viktigast, liksom till exempel indrag, eller hur?
>> Vi klamrar börjar där tillståndet är, och de
finns på nästa rad.
Och vi också sätta klammerparenteserna i även om det är bara en rad.
Och många gånger, det finns sätt att göra den där du kan lämna dessa hängslen
av om det är endast en rad under Om uttalandet.
Men i denna klass, som vi vill följa en specifik stilguide bara så att du får
van vid sånt.
>> ROB: Ja, och Style 50 kommer att driva denna stilguide, och vi är
kommer att använda Style 50 till grad din kod.
Så det underlättar för oss och förhoppningsvis ska inte göra saker som
mycket värre för dig med tanke på standardiserad stil bör inte vara att
orealistiskt.
>> JOSEPH: Och slutligen, för att hitta den stil går du till manual.cs50.net/style.
Och ja.
>> SPEAKER 4: Kommer ni att genomdriva eventuella tecken per rad?
>> ROB: Ja.
>> JOSEPH: Tyvärr, killar.
>> ROB: Det är som en av de enda.
På denna punkt är jag OK med 120.
Jag är OK med att säga 120 tecken per rad.
Jag förstår att det finns någon gräns.
Jag tror att 80 är så liten, men vi genomdriva det.
>> JOSEPH: Personligen tror jag med C, 80 tecken är mer OK.
När du börjar få till andra språk som JavaScript och PHP, inte
så rimligt att bara begränsa den till 80 tecken.
OK.
Tja, det var super sektionen.
Finns det någon som vill ha godis?
>> SPEAKER 4: Ja.