ROB: Okay. Velkommen til den første sektion. Jeg er Rob. JOSEPH: Jeg er Josef. ROB: Så vi vil dykke ret i. Første ting at snakke om er Appliance. Så forhåbentlig de fleste af jer har downloadet det allerede. Men du kan se vejledningen ved cs50.net/appliance. Åh gud, nu er jeg selvbevidst. Jeg kan stadig høre den. JOSEPH: Wow, det lyder som det er desorienteret. ROB: Så nogle mennesker har haft problemer med det, så du skal ikke vente, indtil det sidste minut af problemet indstillet til forsøge at løse Appliance og at finde ud af, at det ikke virker. JOSEPH: Og hvis noget ikke fungerer og du har brug for hjælp, kan du gå til cs50.net/discussion hvor vi have et forum, hvor du kan sende dine spørgsmål. Og vi vil komme til dem i sidste ende. ROB: Okay. Så dette er hvad den Appliance ser ud. Igen, det er bare et helt andet operativsystem, der kører inden for uanset operativsystem du kører på din bærbare computer. Og de vigtigste ting, du vil skal bruge er gedit. Så forhåbentlig har allerede blevet et velkendt site. Terminalen. Og du kan også køre Chrome inden for Appliance. Der har været et par af mennesker der har rapporteret internet ikke arbejde i Appliance. Og nogle af dem har netop antaget at der ikke formodes at være internet i Appliance. Men ja, er der formodes at være internet. Jeg vil sige det lige nu, men det gør ikke virkelig betyder noget. Hvis internettet ikke fungerer, dette er hvad du har tendens til brug til at køre for at ordne det. Hvis du har internet problemer, ikke huske det, bare skrive det på Diskuter, og vi vil sige, at køre det. Men internettet skal arbejde. Så den eneste anden ting - ja, intet andet er virkelig relevant. Men jeg ville bare påpege, at - se i denne nederste højre hjørne. Så hver af dine apparater bør har en IP-adresse. Og senere i semesteret, denne IP adresse vil blive mere relevante, når du arbejder på internettet p-sæt, fordi vil du være i stand til at få adgang til websted, du arbejder på fra din lokal Chrome ved hjælp af denne IP-adresse. Men hvad jeg kan lide at bruge IP-adressen for - og du behøver ikke at gøre dette, jeg blot ønsker at påpege det - er her. Så dette er en terminal vindue på min Mac, er dette ikke i Appliance overhovedet. Og du kan se op, hvad denne kommando gør. Men jeg har tænkt mig at SSH direkte til min Appliance. Jeg ved ikke, hvad IP er. JOSEPH: 168 - 168.224.1.0. ROB: Så når jeg er færdig med dette, logge ind Nu, dybest set, det er identisk med et terminal vindue i mit Appliance. Så jeg temmelig meget faktisk aldrig fungeret indefra selve apparatet. Jeg har bare altid det kører i baggrunden minimeret og SSHed ind i det. Problemet med dette er, at du ikke går til let at kunne bruge gedit direkte fra dette. Men hvis du ønsker at være en virkelig cool hacker, så skal du vænne dig til en kommandolinje tekst editor alligevel. Så Vim og Emacs og Nano, alle disse er forskellige alternativer. Nano har en tendens til at være den nemmeste. Og jeg tror, ​​det har noget syntaksfremhævning. Åh, nej, det helt gør. Så du kan bruge Nano, fordi at man er temmelig let. Du kan se alle disse kommandoer nederst. Denne lille gulerod symbol. Hvis du ikke har set det før, vil du sandsynligvis se det en masse nu. Det betyder generelt kontrol gulerod, ligesom nederste venstre del på dit tastatur kontrol karakter. Så her er det fortæller mig hernede - Åh, det er ikke skåret væk, hvis jeg zoome ind Så Control X er hvor Jeg har tænkt mig at afslutte. Og det siger jeg kan ramme Y for Ja, for at spare, N for Nej Så det er Nano. Vim og Emacs tendens til at være lidt mere kompliceret og overvældende. Men du kan vænne dig til det, og så vil du elske det. Så det er det. JOSEPH: Ingen grund til at gøre det. ROB: Ja. Du er velkommen til at bruge gedit til resten af ​​semestret. Så enhver apparat-relaterede spørgsmål? Eller har du nogen tanker om, hvad der ellers behov for at blive talt om om apparatet? Ja. SPEAKER 1: Når du SSHed ind i dit ting, var kodeordet Crimson? ROB: Ja. Adgangskoden til stort set alt i Appliance går være Crimson. SPEAKER 2: Installer som en rigtig IDE på apparatet, vil det fungere? ROB: Jeg forestiller mig Eclipse har en Fedora-version, i hvilket tilfælde, ja, du kan gøre det. Det er nok ikke virkelig det værd. SPEAKER 2: OK. Så det er nok nemmere, hvis jeg ønskede at bruge Eclipse, bare bruge den indfødte og derefter uploade til - ROB: Åh, det er sandsynligvis også lettere. Men du kan få det til at virke inden for Appliance. JOSEPH: Og til kameraet, er spørgsmålet var, kan du installere en anden IDE indersiden af ​​Appliance? ROB: Eclipse være en eksempel på en IDE. Andre apparater spørgsmål? Ok. Så vi vil nu gå videre til kommandolinjen grænseflade-relaterede ting, så CLI. Og igen, jeg bare kommer til at arbejde i her, fordi det er identisk med arbejde inden for et terminal vindue inden for Appliance. Hvordan denne skrifttype leder? Er det stort nok? Ok. Så der er en masse kommandoer, du skal komme temmelig brugt til hele semesteret. De to store til at navigere er ls, liste filerne i denne mappe, og cd, så skifter mappe. Så jeg kan skifte til skrivebordet og derefter et meget almindeligt mønster er cd til en bibliotek og straks ls Hvad er der i kataloget. Folk også undertiden ikke klar at Tab afslutning er en ting. Så ligesom cd, vh, og så jeg ramte Tab. Jeg næsten aldrig skrive ud hele ting. Og så hvis jeg holde rammer Tab igen, vil det automatisk begynde notering for mig. Så jeg kan cd vhosts, lokale vært. Og det er bare at gå til - i tilfælde af at du ikke har hørt udtrykket før, bibliotek er bare et andet ord for mappe. Så nu, hvis du ser - lad os bringe det til toppen. Så nu, hvis du kan se i parentes, du se den lille tilde, skråstreg, vhost, skråstreg, lokale vært. Så tilde, der refererer til mit hjem bibliotek. Det er et bibliotek, du er ind, når du SSH i. Det er det bibliotek, du er i, når du åbner en terminal. Det er hvor du starter. Og så er jeg inde i mit hjem bibliotek, og jeg er inde i vhost mappe inde i mit hjem bibliotek. Og så er jeg inde i den lokale vært bibliotek inde i det. Så nogle andre nyttige ting med CD - eller godt, i almindelighed, så dot altid refererer til den aktuelle mappe. Cd, prik er en temmelig værdiløs kommando. Men det ændrer sig til aktuelle mappe. En mere nyttig en i form af cd er prik, prik, der er bare gå et bibliotek. Og bemærk, at disse - Jeg ønsker at sige aliaser, men disse symboler, prik, og prik, prik, der arbejder for stort set enhver kommando, du er kommer til at tænke på at køre. Så ligesom cd er nok, hvor du vil være ved hjælp af de fleste, men disse er ikke ting, der bare cd forstår. Det er temmelig meget noget hele din kommandolinjen forstår. En masse programmer forstår prik og prik, prik. Så de andre nyttige dem - cd, Dash. Så det kommer til at bringe mig til sidste mappe, som jeg var i. Så nogle gange vil jeg gøre noget lignende, åh, jeg arbejder her. Og jeg ser nogle fejl med noget, og Jeg vil gå undersøge det ved at gå til nogle tilfældige mappe eller andet sted. Og jeg ved ikke, om det vil lad mig derinde. Det vil. Så jeg gør, hvad jeg vil i denne mappe. Blah, blah, blah, blah, blah. Og jeg var ligesom, okay, jeg vil at gå tilbage til hvor jeg var. cd, bindestreg, og det bringer mig tilbage. Så jeg har tænkt mig at smide en masse af disse på dig i dag. Jeg forventer ikke, at du huske dem alle. Det er slags bare vide at de findes. Og så senere, når du er ligesom, hmm, jeg ønsker at gå tilbage til bibliotek, jeg var bare på, oh, vent, noget, der eksisterer. Du behøver ikke at bare skrive på alle kategorier igen. JOSEPH: Og til sidst vil du bare bruge dem igen og igen, og det vil blive muskel hukommelse. ROB: Ja. Så hvordan jeg sagde før, at tilde er dit hjem bibliotek. Så jeg kan cd, tilde. Men jeg behøver ikke engang at gøre det, hvis jeg bare - Jeg vil gå tilbage til den mappe, så det er ikke en meningsløs eksempel. Men hvis jeg bare gøre cd, det er også den samme som, gå til mit hjem bibliotek. Jeg gør Kommando, K. JOSEPH: Du kan også skrive klar, ord, og det bør klare det. ROB: Og jeg tror også Control L også gør det. Så masser af forskellige måder. Jeg tror, ​​der er nogle forskelle, hvor klar og Kontrol, L vil bare virkelig skubbe det til toppen og Jeg kan stadig bladre tilbage. Kommando, K bogstaveligt ødelægger alt, og du kan ikke rulle op igen. I det mindste, det er hvordan det fungerer i iTerm2. Jeg ved ikke, hvordan andre ting - oh. Med SSHing, så hvis du er på Windows, du er nødt til at hente PuTTY For at SSH da Windows ikke har ligesom en indbygget SSH værktøj. Fra Macs, kan du bare SSH direkte fra et terminal vindue. OK. Spørgsmål? Med ls, noget så at vænne sig til med de fleste af disse kommandoer er - Nå, jeg vil bare gøre én. Ls, bindestreg, l. Så streg, jeg er, hvad vi vil at kalde et flag til ls. Og en masse af disse kommandoer har flag at du kan videregive til dem. Så i dette tilfælde, streg, jeg er et flag der fortæller den til at give mig en fuld notering af alle de oplysninger, af disse filer. Så vi ser her, at skrivebordet var ændret den 30. juli at 12:54. Downloads blev ændret ved 6. september. Det er den aktuelle størrelse og bytes af disse mapper. Du behøver ikke at forstå alt dette. Denne ting til venstre, disse drwx s, der vil blive langt mere relevant senere, når du er nødt til at beskæftige sig med - der har at gøre med, hvem der har tilladelser til at se på disse filer. Og så hvis du ikke var den eneste bruger på denne computer, vil du være i stand til sige, OK, skal jeg være den eneste lov til at se på denne fil eller jeg kommer til at give alle til at se på denne fil. Så en anden på min computer kan se på denne fil. Jeg ved ikke engang, hvad det - hvad betyder dette gøre? JOSEPH: Jeg er ikke helt sikker, faktisk. ROB: Ingen idé. JOSEPH: Men hvis du ikke kender, er der et nyttigt kommando, som du kan bruge fortælle dig, hvad outputtet betyder. Og hvis du skriver i mennesket før kommandoen - så M-A-N. ROB: Man. Så mennesket er en anden som er meget nyttigt. Og mand, ls. Så man-sider, har de begge kommandoer, du skal bruge på kommandolinjen, og de har også funktioner, der vil være relevante med C. Så du kan mennesket - og jeg ignorerede 3. Men mennesket 3 printf vil bringe op C version af printf. Men hvis jeg bare gøre mennesket printf, er dette kommer til at opdrage kommandoen printf der sker på kommandolinjen. Så mand, ls. Man-siderne kan være temmelig overvældende. Her vil man dog se denne liste af alle disse flag, ls forstår. Så hvis vi går til tankestreg, l, og - Jeg bare at smide det på dig. Men for at søge, du ønsker til første hit på spørgsmålet mark eller skråstreg knappen. Så skråstreg. Og så kan jeg søge for hvad jeg vil. Så jeg har tænkt mig at skære til instrumentbrættet, l.. Og det var der. Så brug en lang liste format. Det hjælper mig ikke regne ud, hvad som bestemt søjle betød, men jeg antage et eller andet sted i her Det ville forklare det. Så bruger man-pages for enhver kommando at du ikke straks forstå. Jeg er temmelig sikker på at du kan endda mand, mand. En grænseflade til online referencemanualer. Åh, en sidste en, der er måske lidt relevant er ls, bindestreg, et. Så varsel, hvis jeg bare gøre ls, Jeg får disse fem filer. Hvis jeg gør ls, Dash, en, jeg få en masse flere filer. Så ting til fælles mellem alle disse nye filer er dot forhånd. Så konventionen er, at en fil, begynder med en prik er skjult. Så du ikke ønsker at se, at filen, du ønsker ikke at have det rod med din katalogliste. Det er kun, når du udtrykkeligt spørger, okay, ls, bindestreg, en, vis mig. Den a står for alle filer, herunder skjulte dem. Så nogle andre kommandoer. Åh, spørgsmål på dette punkt? Ja. SPEAKER 3: Når du gør ls, en, hvad er prik, prik? ROB: Oh. Så dette er hvad jeg talte om. Det er den samme ting, hvor Jeg kan lide cd, prik, prik. Så teknisk set prik og prik, prik er filer, der findes i hvert enkelt mappe, hvor dot-filen refererer til den aktuelle mappe. Så hvis jeg cd, prik, jeg bare at bo i kataloget. Og prik, prik henviser altid til den forrige mappe et niveau op. Så hvis jeg går ind i træstammer og ls, bindestreg, al, Jeg vil se prik, prik. cd til prik, prik bringer mig til den forrige mappe. Ja. OK. Så en anden temmelig vigtigt Kommandoen er rm. Så det er, hvad vi vil bruge til at fjerne. Og lad mig faktisk gøre en anden kommando først. Så mkdir. Mkdir er, hvordan du kan oprette mapper. Og jeg vil oprette en midlertidig mappe og gå ind i det midlertidige bibliotek. Og som forventet, er det tomt. Men hvis jeg ls, bindestreg, en, jeg har stadig dot og prik, prik, fordi prik refererer til den aktuelle mappe. Og prik, prik refererer til forrige mappe. Og de vil altid eksistere, uanset den mappe du er i. Og det er en helt unødvendig kommando, men touch. Jeg er bare at bruge det, fordi det er en nem måde at oprette filer. Så røre ved en, touch b, touch c er blot kommer til at lave tre filer, der kaldes en, b og c, der er helt tom. Så pointen mig skabe dem i den første sted er lige så rm er hvordan vi kan fjerne dem. Så rm en. Det kommer til at spørge mig, fjerne regelmæssig tom fil a? Og så vil jeg sige ja. Så hvis jeg ved med sikkerhed, at jeg ønsker at slette filen uden at skulle være bedt om det, fjerne regelmæssig tom fil?, så rm, bindestreg, f kommer til at være den flag, der siger, tvinge fjerne uden Endda uden at spørge mig, åh, er du sikker på du ønsker at slette filen? Ja, jeg er sikker. Så rm, bindestreg, fb vil bare gøre det uden at spørge. Så lad os gøre nogle flere mapper. mkdir, TMP2, cd, TMP2, røre ved en, touch-B. OK. Så nu ønsker jeg at fjerne TMP2 som en mappe. Så rm TMP2. Du kan ikke fjerne TMP2, det er en mappe. Så spørgsmålet her er, at rm ikke straks arbejde på mapper. Det er kun beregnet til filer som ikke-biblioteksfiler. Og så hvad vi kan gøre her er rm, bindestreg, r. Det står for rekursivt, hvilket måske ikke betyder noget for dig endnu. Men når du kommer til rekursion det vil betyde mere. Så rm, bindestreg, r, TMP2 kommer til at rekursivt gå ind i denne mappe. Så ned i mappen TMP2? Ja, lad os gå ind i det. Ønsker vi at fjerne TMP2 / a? Ja. Ønsker vi at fjerne TMP2 / b? Ja. Nu ønsker vi at fjerne mappen TMP2? Ja. Og så nu biblioteket og alt inde det er blevet fjernet. Der er teknisk set en kommando rmdir som du kan bruge til at fjerne mapper, men det virker kun på tomme mapper alligevel. Og for at se det, så lad os bare gøre mkdir, TMP2 igen. TMP2, røre ved en. OK. Så hvis jeg prøver at fjerne dirtmp2, vil det sige, biblioteket ikke er tom. Så jeg temmelig aldrig bruge remove dir kommando alligevel, fordi rm, bindestreg, r vil arbejde på tomme mapper og ikke-tomme mapper. Og også, hvis jeg ikke ønsker at skulle gå igennem hele denne proces faldende i mappen og fjerne hver enkelt fil, rm, bindestreg, rf, TMP2. Og nu er det væk. Noget at være forsigtig om, er rm, bindestreg, rf. Og det skræmmer mig at selv skrive det, fordi hvis jeg ved et uheld trykke Enter eller noget. Så rm, bindestreg, rf, tilde ville, uden spørge mig, har f ikke anledning mig, vil det automatisk fjerne Hele mit hjem bibliotek, og alt i den. Så du tror måske det er en dum ting at gøre. Og godt, det er. Men det kan ske meget let ved ulykke, hvis, siger, jeg ønskede at fjerne min slash, vhost bibliotek. Og bare i hurtig indtastning, Jeg ved et uheld gøre dette. Det vil fjerne rekursivt både min hjemmebibliotek og vhost biblioteket i dette særlige bibliotek, der bare tilfældigvis ikke eksisterer lige nu. Men det ville stadig fjerne Hele mit hjem bibliotek. Mindst ved ikke at have en f, det ville bede mig først. Og jeg ville være ligesom, åh, nej, jeg ønsker ikke at gøre det. Men folk, skråstreg, herunder mig en tendens til at komme ind i vane altid rf-ing. Selv almindelige filer, som jeg bare kan RM, c, jeg har en tendens til bare rm, bindestreg, rf, ca. Bare vær forsigtig, når du er rf-ing. SPEAKER 4: Hvad betyder C gøre? ROB: C er, jeg taler om, at C-fil i denne mappe, at rm, ca. JOSEPH: Og mere faretruende, hvis du bruger en stjerne, henviser det til alt i Vejviseren. Så hvad jeg normalt har en tendens til at gøre, er jeg nok gå ind i en mappe, og jeg ønsker at fjerne alle de filer derinde. Så rm, bindestreg, rf, stjerne. ROB: Ja. Rm, bindestreg, rf, stjerne. JOSEPH: Og hvis du ikke er forsigtig hvad mappe du befinder dig i - Jeg var ikke i temp, men jeg var et uheld i mit hjem bibliotek, så vil jeg fjerne alt i mit hjem bibliotek. 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 uheld fjernet - så ignorere denne kommando for lidt. JOSEPH: Ikke sjovt. ROB: Så i skråstreg bin bibliotek er en bundt af binære filer, hvor der vil vær være kendte dem som klang. Nå, clang og dybest set alle disse ting, som jeg kører på kommando linje er i denne skråstreg bin. JOSEPH: Ligesom ls er i her. ROB: Så dot, skråstreg, ls ville liste denne mappe. JOSEPH: Rm er også i denne mappe. ROB: Jeg har ved et uheld RM, rf-ed bin, som fjernede enhver kommando jeg kunne eventuelt nogensinde ønsker. Hvilket så jeg bare geninstallere en ny Appliance på dette punkt. JOSEPH: Så vær meget forsigtig, når du bruger denne kommando. PUBLIKUM: [uhørligt]? ROB: Ja. Det er også en dårlig vane at komme ind. Hvis du bemærker, er jeg nu - godt, kan du ikke mærke, men mit zoom-in måske kan. Så jeg er nu root @ apparatet. Så jharvard er brugeren, vi ønsker du altid bruge. Root er den bruger, der har tilladelse at gøre hvad som helst. Så mærke til, når jeg er jharvard, hvis jeg prøver at cd - hvad er en mappe, der? Åh, rod er et godt eksempel. Så cd, rod. Tilladelse nægtet. For hvis vi ser på denne liste - og igen, behøver du ikke at helt forstå dette. Men disse tre streger siger som ikke lader nogen anden bruger i denne mappe. Og biblioteket sker være ejet af brugeren root. Så det faktum, at jeg er jharvard og nej en, der ikke rod er tilladt ind denne mappe, det betyder, at jeg er kommer til at få tilladelse nægtet når jeg prøv at cd ind i det. Så når jeg rod, jeg har tilladelse til at gøre absolut alt, herunder slette vigtige filer på apparatet og ødelægge hele ting. Så det er en dårlig vane at komme ind blot går rundt dit operativsystem som root. Jeg gør det alligevel. Spørgsmål? Og jeg vil afslutte rod, ophold som jharvard. OK. Flere relevante kommandoer. Så gå tilbage i vores temp, den Kommandoen mv står for træk. Du kan flytte et. Nu ønsker vi at kalde det b, så nu er det hedder b.. Eller måske vi ønsker at flytte b et bibliotek op. Så nu denne mappes tom. Jeg vil gå tilbage til mit hjem bibliotek, og vi se, at b er her, fordi home bibliotek var en mappe op fra den mappe, B havde været i. Der er også cp. Så cp er kopiere super sektion, dot, tekst. Jeg kan kalde det er, prik, tekst. Nu har vi begge super sektion, prik, tekst og s, prik, tekst. Dette virker også på mapper. Jeg rF-ed en enkelt fil. Så cp - Nå, lad os prøve cp, tmp, TMP2. Så udelade mappen tmp. Så ligner RM, standard opførsel er ikke at arbejde på mapper. Og igen, svarende til RM, standard adfærd - godt, at få det til at virke med mapper er en, streg-r væk. Så kopiere rekursivt temp biblioteket i TMP2. Og så nu har vi både TMP og TMP2, og det er ikke så nyttigt, da tmp var tom i første omgang. TMP2. Lad os nu kopiere tmp i TMP2. Og vi ser, at TMP2 har også filen en, fordi biblioteket og alt inde i det mappe er kopieret. Og det kan være noget nyttigt hvis siger du arbejder på problemet indstille en - eller faktisk, senere problem sæt er endnu vigtigere, fordi der vil være en hel flok af filer og ting. Men du blot ønsker at for en split sekund, du kan lide, okay, jeg er kommer til at prøve noget anderledes. Lad mig bare kopiere hele min pset1 biblioteket i pset1 sikkerhedskopi, så hvis Jeg ender skrue tingene op, kan jeg gå tilbage til min backup mappe. Der er mere hensigtsmæssige måder versionering sikkerhedskopiere din kode, men det er altid en hurtig måde at bare gøre at du har en kopi af noget at du er ved at ændre. Så ekko er også en one-off kommando, slags sillily vil bare udskrive til kommandolinje præcis, hvad du ønskede at ekko. Så echo hej. Vi vil bare udskrive hej. Echo hej verden. Vi vil udskrive hej verden. Der kommer i brug, når du begynde at kombinere kommandoer. Og igen, forventer ikke, at du helt forstå det endnu, men det er noget at se. Og så hvis du Googling for eksempler eller du indser du ønsker at gøre noget, kan det være nyttigt. Så lad os, som et eksempel, så ls, bindestreg, l. Så her ser jeg output af ls, bindestreg, l.. Og jeg siger, OK, jeg ønsker at gemme det i en fil. Alt dette output her, jeg vil at sætte ind i en separat fil. Så denne lille større end symbol er, hvad vi vil kalde. Vi omdirigere output til en fil. Lad os kalde filen bla, fordi det er hvad jeg har en tendens til altid kalde det. Så nu ser vi, at vi har et fil bla lige her. Og hvis jeg åbner den op, vil jeg se, det er præcis output fra kommandoen at jeg løb bare. Og på samme måde, kan du - hvis dette var output til en fil, denne er at få input fra en fil. Hvad er en kommando, som jeg - JOSEPH: Jeg tror, ​​du kan bruge mere eller mindre, sandsynligvis. ROB: Men hvad bare mindre bla? Det ved jeg ikke. Hvis du kommer ind i dette scenario, ligesom der er psets, at det er nyttigt for. JOSEPH: Du kan rør det i ekko. Pipe filen i ekko at se det. ROB: det er rør. JOSEPH: Undskyld. ROB: Okay. Så dette er output til en fil. Det er at få teksten fra filen og udlevere dem til programmet. Og du vil også se denne fyr. Så dette er en slags gør begge på én gang. Og faktisk vil jeg præsentere to nye kommandoer bare for at gøre brug af det. Historien er en handy kommando, der er lige kommer til at udskrive en liste over noget jeg nogensinde har kørt en kommandolinje. Så vi ser her, alt det, jeg har kørt hele denne tid. Masser af ls er. Og en anden nyttig kommando er grep at dens formål er at søge over tekst leder efter mønstre, ja, leder efter hvad du ønsker det skal se efter. Og så en praktisk anvendelse her er, siger vi ønsker at få fat i historien. Og jeg ønsker at søge efter kommandoerne hvor jeg - hvad er en nyttigt en til at kigge efter? JOSEPH: [uhørligt]? ROB: Eller lad os bare kigge efter alle rører, uanset årsagen. Så dette er hvad det vil se ud. Og du behøver ikke helt at forstå det. Men ideen er her, er historie giver det samme output det gjorde here hvor det er at udskrive hele historie af alt, jeg nogensinde har kørt. Vi derefter passerer det - så i stedet for at udskrive det til skærmen, vi ønsker at videregive det til kommando grep der er på udkig efter alle forekomster af ordet berøring. Og så ved hjælp af denne kombination af værktøjer historie og grep, kan jeg se, OK, her er alle de kommandoer, jeg nogensinde har løbe, og her er en noget fælles én. Vi er i bunden. Og det er også at give mig kommandoen Jeg løb bare der havde Ordet røre i det. Men røret er en temmelig nyttig ting for at kombinere flere programmer. Og faktisk, det er en genvej for lad mig output historie at indgive blah, og lad mig grep bruge fil blah som hvad jeg ønsker at kigge forbi. Så røret er blot en genvej for disse to kommandoer. Ja. SPEAKER 4: [uhørligt]? ROB: Ja. Hvad er - Oh. Lad os prøve. Så kat, hund, fisk. Så jeg vil til grep. Dash, r, igen, kommer til at være rekursivt, så jeg vil gerne ned ned alle mapper. Jeg ønsker at rekursivt grep for alle - og lad mig midlertidigt få dette ud af vejen. Ignorer mig. OK. Så jeg vil gerne midlertidigt grep for alle forekomster af ordet fisk. Og så her, hvad jeg gør er grepping rekursivt for ordet fisk. Og stjerne betyder over alle disse filer i denne mappe. Og så det gav mig en Permission Denied, fordi det ikke er tilladt at læse, at bestemt fil. Men det fandt fisk i filen, test. Jeg kunne også sige specifikt, jeg kun ønsker at se i filen bla, i hvilket tilfælde det ikke vil finde noget. Jeg ønsker kun at kigge i filen, test. Det vil finde fisk. Det er en temmelig nyttig kommando at vide i almindelighed. Der er nogle alternativer til grep der formodes at være mere programmør venlige, men jeg har en tendens til stadig at falde tilbage på grep. Spørgsmål? OK. Er der andre kommandoer? Oh. Blot en one-off, som jeg altid finde på at være sjove er cal. Så mærke til, når jeg er i denne dejlige fuld skærm, jeg har ingen lignende top værktøjslinje eller noget. Så cal bare giver mig en dejlig lille kalender, der er rigtigt nu afskåret, antager jeg. Men dejligt lille kommando. JOSEPH: Det er [uhørligt]. Andre kommandoer, som du måtte have set omfatter klang og gøre. Vi vil gå over dem i mere detaljeret senere. Men hvis du har arbejdet på den PSET, skal du være bekendt med dem. ROB: Okay. Spørgsmål om kommandolinje ting? Ok. Så lad os gå videre til nogle C-relaterede ting. Variable matematik. OK. Så ligesom vi havde matematik i Scratch, du kan også bruge matematik i C. Før vi kommer til det helt, så variabler. Husk, at når du erklære en variabel ligesom int x eller float y, du nødt til at give det at skrive før variabelnavnet. Så typer, vi har set hidtil, er int, float, dobbelt, lang lang, hvilket jeg faktisk ikke ved, om vi har ses, at hidtil. Der er nogle andre. Vi har se char. Der er kort, der er som det er modsatte af lang lang, hvor det er mindre end et heltal. Vi har også set streng. Så hvad er det særlige ved streng? Hvorfor skulle jeg sige, det er ikke helt som int? SPEAKER 4: Det er ikke rigtig eksisterer. ROB: Ja. Så den eneste grund til at vi har snor er fordi, når du gør hash, omfatter cs50.h. Og vi vil se eksempler på dette senere - åh, betyder det ikke håndtere det godt - hvor cs50.h laver noget i retning af typen def, char stjerne, streng. Og så siger, at vi ikke engang vide, hvad en char stjerne er endnu. Men det siger vi ønsker streng. Ethvert sted du har brugt streng, du kunne have brugt char stjerne, som faktisk er en type, der findes i C-sprog. Men vi vil komme til at. Åh, og det går helt tilbage. Neat. Så samme med bool hvor sandt og falsk. Det er egentlig ikke en indbygget type C. I stedet er det bare, har det værdien nul? Så vil vi lige overveje det at være falsk. Har dette værdien - godt, har det nogen værdi, der ikke er nul? Så vil vi anser det for at være sandt. Så man er sandt, to er sandt, noget nonzero er sandt. Så det er dem. Spørgsmål om at erklære variabler og variable typer og alt det? Ja. SPEAKER 4: For lang lang, i bogen, det sagde det skulle være lang lang int. Men vil bare lang lang arbejde? ROB: Så disse type modifikatorer. Så int x. Så kan vi også sige unsigned int x. Vi kan sige kort int x. Vi kan sige lang lang int x. Men temmelig meget nogen af ​​disse ting, jeg lige har sagt, unsigned int, kort int, lang lang int, kan du slippe af med INT og det vil bare antage at du mente int. Så usignerede x, hvilket blot betyder - du ved, hvor der normalt med en int, du kan sige x lig negativ 3? Med en usigneret int, kan du ikke. JOSEPH: Og igen, for kameraet, Spørgsmålet var, hvad er forskellen mellem lang lang int og lige længe længe? ROB: Ja. Så jeg vil næsten aldrig skrive lang lang int. Jeg vil skrive lang lang. JOSEPH: Eventuelle spørgsmål? ROB: OK. Så dum lille påmindelse om, er, hvordan vi erklærer en variabel og initialisere de variable og erklære en anden variabel og initialisere det hele i én arbejdsgang. Så erklæringen af ​​variable og initialiseringen variabel ikke har til, men kan være på den samme linje. Så vi har standard matematiske operatører at du er vant til - plus, minus, dividere, gange. Der er også modulo, som vi vil se. Der er ikke, i det mindste C, en indbygget magt eksponentiering indskudsmærke operatør. Tja, der er en hat operatør, men det er ikke magt. JOSEPH: Men det er ikke eksponentiering, Ja. ROB: Brug ikke indskudsmærke at antage, at det betyder ligesom firkantede eller hvad. Så nogle ting at huske på tankerne om division. Jeg vil stå. Så erklærede initialisere svar. Så vi siger float svar lig med 1 divideret med 10. Udskriv svar til to decimaler. Og dette er den slags ting, jeg ville mennesket printf at regne ud, at hvad dælen betyder%, prik, mener 2f? Og det betyder bare, ja, ignorere 0.2. Og% f er, hvad vi bruger at udskrive til at flyde. 0,2 siger, print, flyde til to decimaler. Så dette program har en fejl, og du kan har set det før i nogle før CS kursus. Men hvad er det bug? SPEAKER 5: Zero. ROB: Ja. Så når vi siger, er lig med svar 1 divideret med 10, vi ønsker besvare til 0,1. Men 1 divideret med 10, 1 er en heltal, 10 er et heltal. Og så når vi gør et heltal divideret med et heltal, vi kommer til at komme tilbage et heltal. Så 1 divideret med 10 er 0,1. Da det er nødvendigt at give os et heltal, det er bare at smide væk, at decimal og sige, at svaret er 0. Og så når vi udskriver besvare her, det kommer til at udskrive 0.00. JOSEPH: Og lige som en note, er det faktisk smider, hvad der er efter kommaet. Så hvis du i stedet havde 6 divideret med 10, du måske tror, ​​at det ville give dig 0,6 og så ville du runde op til 1. Men faktisk, hvad der sker, når det skriver opgaver, det er, at det falder, hvad der er efter kommaet. Så 0,6 gør bliver 0. ROB: Ja. Og vi vil sige truncate for. Så når du kaster til en int, decimalen er afkortet. Så fix for det - der er faktisk to. Og jeg har tænkt mig at gøre det andet fordi denne ene er en meget nemmere fix. Så en fix er at bruge flåd i divisionen. Og virkelig, du kun behøver at gøre en af ​​dem en float. Men det er noget klarere bare at gøre dem begge flyder. Så 1,0 divideret med 10,0 er dividere to flydere. Så svaret vil ende med at blive en float, og så vil du korrekt udskrive 0.10 her. Noget, der ikke fungerer så godt om der er, ja, ja, det var let nok til at konvertere 1 til en flyde ved at gøre det 1.0. Men hvad hvis man i stedet havde vi to heltal ligesom int x er lig med 1 og int y lig 10, og så ville vi at gøre x divideret med y? Så det er ikke nemt at bare gøre X.0 eller noget. Så fix til, der er udslagsgivende. Så støbning er en måde i C for at omdanne fra én variabel til en anden. Så her, 1 er et helt tal. Og ved at sætte denne float foran det, vi casting 1 til en float. Og så dette vil konvertere 1 til 1,0. Og det vil konvertere 10 til et 10,0. Og så tingene opfører sig på samme måde som tidligere version vi bare viste hvor, som forventet, får vi 0.10 og det vil udskrive det. Og vi kan gøre dette med variabler, også. Så vi kan sige, float x divideret med float y. JOSEPH: Eventuelle spørgsmål? ROB: Så ligesom i almindelig matematik, vi har operatør forrang. Så i matematik klasse, er du mere tilbøjelige at kalde det rækkefølgen af ​​operationer. Her den officielle betegnelse er operatør forrang. Men operatøren forrang, eller de fleste operatører, er som du ville forvente. Så ligesom i matematik, 2 gange 10 er kommer til at blive grupperet nøjere end denne 10 divideret med 2 og derefter 2. Rækkefølgen af ​​operationer, vil det gøre 2 gange 10, 10 divideret med 2 og derefter det vil gøre 20 plus 5 plus 2. Så det er som forventet, og du kan bruge parenteser til at gruppere udtryk. Du kan ikke bruge kantede parenteser at gruppere udtryk. Ja? SPEAKER 5: Kunne du rent faktisk bare gå et sekund? Kan du kaster en int til en streng? ROB: Så i C, du kan kaste noget du ønsker at noget, du ønsker. Det betyder ikke, det er en god ting at gøre. Så når du kaster en int til en streng, det betyder - og vi vil komme ind i dette langt mere grundigt - JOSEPH: Meget senere. ROB: Jeg ønskede ikke at sige meget senere, så jeg prøvede at ændre min sætning. Vi vil komme ind i det meget mere grundigt senere hvor virkelig når du har en streng variabel - så en streng kan være vilkårligt lang, right? Og vi har sagt, at en int er fire bytes og Lang Lang er otte byte og en flyder er fire byte. Så en snor, ligesom en int, kun har et vist antal bytes til det. Og der vil være fire bytes. Men en streng kan være temmelig vilkårligt længe, ​​right? Så hej verden allerede, hvis det er 10 tegn eller hvad, det er allerede kommer til at være over 4 byte Jeg kan passe ind i en streng. Og så hvordan strings virkelig arbejde, er, at de, hvor i hukommelsen denne streng bliver holdt. Og så over her, når jeg siger strengen x lig hej verden, inde i x er siger bare, åh, hej verden er gemt på dette særlige sted i hukommelsen. Så hvis vi forsøger at kaste et heltal til en snor, så vi prøver at tolke en tilfældig del af hukommelsen som en streng. Og der næsten altid bryder ting. JOSEPH: Men hvis det forvirrer dig, vil vi være der dækker det mere i dybden senere. ROB: Ja. Det er her, du kommer at komme ind pointere. Og det er en væsentlig bid på to uger i dette kursus. SPEAKER 6: Virker det som objekter på andre sprog ikke rigtig eller? ROB: Så med andre sprog, genstande ville være repræsenteret ved hjælp af pointers. Det er ikke det samme, selv om. Nogen tanker? JOSEPH: Nej. Ingen tanker. ROB: OK. JOSEPH: Næste. ROB: Bare gå med det. Ok. Så modulo. Ligesom vi har plus, minus, dele og formere sig. Så modulo er en du kan ikke har set før. Og det bare siger, giver mig resten af. Så 55% 10. Den resterende del af at gøre 55 divideret med 10 ville være 5.. Så 55% 10 er 5. Og 3% 5 være 3. 8% 8 vil være 0. 16% 15 vil være 1. JOSEPH: En ting at bemærke med dette, også, er det måske ikke fungerer som forventet hvis du bruger et negativt tal. Så negativ 5% 4, nogle mennesker måske tror det er - hvad ville du tænke negativt 5% 4 ville være? SPEAKER 5: One. JOSEPH: Så nogle mennesker siger ét, nogle mennesker siger negativ. Men hvad - ROB: Jeg ville ikke engang have den ene af dem. JOSEPH: Two, undskyld. Nogle mennesker siger - ROB: Tre. JOSEPH: Tre? ROB: Negativ - hvad var det - negative fem - JOSEPH: Tre, tre, tre. Undskyld. Fordi modulo generelt når du har set det andre steder, det betyder normalt, returnere et positivt tal, right? ROB: Så når vi siger i matematik,% 10'ere, de har tendens til at ønsker at give dig - hvis vi Mod af 10, så vi forventer at få et tal mellem 0 og 9. I her, det er ikke sådan, at du vil få negative tal returneres. JOSEPH: Så negativ 5% 4 vil være negativ 1.. ROB: Men det er sjældent, at du er mod-ing negative tal til at begynde med. Spring dette. JOSEPH: Ja. ROB: Meh. OK. Så en sidste ting at påpege om flåd er det en farlig adfærd, men flåd er ikke en eksakt repræsentation. Så gå tilbage til bytes igen, husker at en int altid er fire bytes og et flyderen altid fire byte. Så Lucas eksempel er temmelig godt. Så tænk på 1 divideret med 3. Så 0,3333333. Hvis jeg har kun 32 bits, hvordan kan Jeg gemmer 0,33333 præcist? Og måske, uanset af hvilken grund, du siger, okay, ja, lad os bare sige at denne særlige 1011001, lad os bare sige, at skulle være 0,333333. Nå, har du kun et begrænset antal disse bits, så det er umuligt at repræsentere hver eneste floating point værdi givet blot 32 bits. Tja, det er umuligt at repræsentere nogen decimaltalsværdi givet uendelig - godt, givet nogen endeligt antal bit. Så spørgsmålet her er, ja, når vi brugte udskrive til to decimaler, vi har foretaget en korrekt få svaret 0.10. Men under hætten, det er virkelig blive lagret som tæt som muligt på 0,10 da disse bits kan repræsentere. Er det på det næste dias? Eller er det ikke? JOSEPH: Ja, det er det. ROB: Blegh, blegh. JOSEPH: Ja, du kan bare trække tonerne lidt op. ROB: jeg bare at zoome i den sidste på det. Åh min gosh, det er [uhørligt]. Så nummer. Det er, hvad der vil blive udskrevet hvis vi køre dette program. Og bemærk det er ikke virkelig en big deal hvis vi kun er at bekymre sig om ligesom 02:58 decimaler. Ligesom vi kun oprindeligt trykt 0,10, og det er derfor, vi så noget forkert. Men når vi begynder at komme ind i eksakte nøjagtige antal, at det er repræsenterer, ser vi, at det ikke kan præcis repræsentere 0.1. Og en del af problemet her er ligesom, okay, det er fint, men, ja, første, hvad nu hvis vi forsøgte at gøre, Svaret er lig lig 0,1? Er det kommer til at returnere sandt eller falsk? Og så det er svært at sige. Jeg tror, ​​det faktisk kunne returnere sandt. Vil den først - Det ved jeg ikke. Svaret er, når du begynde at behandle med kommeværdier du smukke meget skal ikke bruge ligestillingen på grund af denne unøjagtighed. Og til alle du kender, det er hundrededel decimal at floating point var ikke i stand til korrekt håndtere. Og så kønnene vil bare ikke selv selv om antallet - hvis du havde været hjælp præcise tal, tallene bør har været nøjagtig det samme. Det er i løbet af lignende 50 beregninger med disse flydende point-værdier, kan fejlen bygge op og op og op, og tingene bare galt. JOSEPH: Og der har været virkelig berømte eksempler på, at dette sker. Ligesom NASA ingeniører har fået denne forkerte, der forårsager raketter til at eksplodere i luften efter de er blevet lanceret. Og masser af spørgsmål som dette. Så ja. SPEAKER 6: Når du siger 0,3 f, betyder det afkorte resten? Eller er det runde op eller ned? ROB: Vil printf runde det? JOSEPH: Jeg tror printf trunkater. ROB: OK. Så vi kan ligeledes gå i den modsatte retning af det her, i dette tilfælde, tættest at det kan være 0.1 var med dette nummer. Det tætteste det kunne være i stand til at udgør 0,2 er i den modsatte retning, 0,199999996356 eller noget. Så hvis vi gik i den retning af ting, så printf 0,3 f ville vende tilbage 1,99 i stedet for 2,00. JOSEPH: Og jeg er ikke helt sikker på det. Du vil måske skrive en lille, lidt program til lige tjekke det. ROB: Selvom, hvad vi er sikre på, er, at hvis du forsøgte at kaste det til en int, og casting til en int kommer til at få det til at afkorte decimal, hvis du forsøger at kaste 1.9999999 til en int, får du 1. Og så skal du normalt bruge rund funktion i matematik biblioteket. Spørgsmål? OK. JOSEPH: Så går videre til betingelser og boolske udtryk. Så du har set disse før. Og faktisk, lad mig gøre sikker på min computer er i det rigtige format her. Space. Undskyld, vi kommer til at beskæftige en lidt med cutoff ved kanterne. Men ja, har du fyre set før i Scratch. Så dette her er et udtryk som anvendes i en betinget erklæring. Så besvare større end nul vilje fortælle dig sande eller falske. Og disse er virkelig vigtigt, fordi de tillader os at introducere logik i vores kode. Så for eksempel er et program skrevet i Scratch, der spørger brugeren for et heltal, og fortæller dem, om heltal, at de gav dig, var en positivt eller negativt tal. Og omdannelsen herover for at se, er du først udskrive erklæringen, give mig et heltal. Og så spørger du dem for et heltal. Og så skal du bruge betinget logik i her for at kontrollere, om dette nummer var faktisk større end nul eller ikke. Så her har vi en boolsk udtryk indersiden af ​​en betinget Hvis erklæring. Er der nogen spørgsmål? Er der nogen spørgsmål om det? OK. Så der er mere end bare større end, selvfølgelig. Du kan konstruere boolske udtryk bruge det meste af den slags ting, du ville tænke på i matematik. Så større end. Det burde være en mindre end. Undskyld. Og afstanden. ROB: Gud forbyde du forlader den. JOSEPH: Okay. Så større end, mindre end, større end eller lig med, mindre end eller lig med. Vi bruger dobbelt ligemænd til at kontrollere for lighed, fordi enkelt lig midler opgave, right? Ja. Og så kan vi heller ikke lig med bruge udråbstegn, lig. Og dette udråbstegn symbol kan også udvides, så hvis du vil at vende enhver slags Boolean udtryk, kan du gøre det. Så dette vil evaluere til sand hvis svaret er mindre end eller lig med nul. Eventuelle spørgsmål om det? OK. Så du kan også kombinere disse udtryk ved hjælp af logisk And og logisk eller. Så dette er blot And symbol, som bør være Shift 7. Og det er røret symbol, som er ikke en lavere sag L. Det er den ene der er lige over din Enter-tasten. Så du bruge to af disse til at symbolisere logisk Og logisk OR. Så det vil kun returnere sand, hvis svar er en, to, tre eller fire. Og det vil kun returnere sand, hvis svar er ud over, at der på begge sider. Så det er ikke en, to, tre eller fire. Og den måde, du ville bruge at i et udtryk - ROB: Eller et nul eller et fem. JOSEPH: Nul eller en fem. Undskyld. Ja, ja, ja. OK. Og herovre nu, på samme måde, som du ville bruge det udtryk, en mindre udtryk side af en Hvis betinget erklæring, ville du også bruge det samme måde ved blot at sætte det inde i parentes i If-sætningen. Så denne printf vil kun blive udløst, hvis svar er en, to, tre eller fire. Eventuelle spørgsmål om at kombinere udtryk? Så der er en anden betinget konstruere vi kalder en If / Else. Så dybest set, det betyder nu, OK, hvis noget jeg ønskede at tjekke ikke var sandt, så gå til Else og udføre den anden handling. Så i dette særlige tilfælde, spurgte jeg brugeren om et heltal. Er det hele tal større end nul? Ja? Nå, så de plukkes et positivt tal. Hvis ikke, så må det have været negativ eller et nul. Så du plukket et negativt tal eller et nul i dette tilfælde. Ja. Eller et nul. Og så har vi også If / Else, Hvis og Else. Så det lader os udføre en sekvens af ting, hvis de første mislykkes. Så i dette tilfælde, vi nu laver den sidste du vælger nul. Så hvis de hverken plukket en positiv eller et negativt tal, så skal de har plukket nul. Så det bare går ned i kæde som denne. Så et eksempel på, hvordan en Hvis det er forskelligt fra - en If / Else er forskellig fra bare en sekvens af Ifs. Og det er et fælles spørgsmål, folk spørger er, godt, hvis du får som en 95 i CS50, hvad vil dette Programmet fortæller dig? SPEAKER 5: Du fik et A. JOSEPH: Ja. Du fik hver eneste en af ​​dem til højre. Du fik en A, du fik en B, du fik et C og et D, right? Så alle disse bliver evalueret i orden. Så mens 95 er større end 90, er det også større end 80, er det også større end 70, og det er også mere end 60. Så du fik alle disse kvaliteter. Og jeg formoder, du ville kun ønsker A. Den måde at løse det er at erstatte dem med Else / If 's. Så i dette scenario, den ser, at 95 er større end 90, og så gør det evaluerer ikke resten af de udsagn. Eventuelle spørgsmål om det? Så der er en anden betinget slags struktur, som vi har her, som vi kalde en switch-statement. Så det giver dig mulighed for stort set kontrollere hvad værdien af ​​et nummer, du sætter i switch-statementet er. Så i dette scenario, vi skifter på n, og vi siger, åh, hvis n er en, så udskrive denne erklæring. Og derefter bryde, hvilket betyder exit ud af switch-statementet. Hvis det ikke var en, så, ja, bare i sidste ende kontrollere alle disse sager. Og så det tjekker, om det er en eller to eller tre, og den udskriver i overensstemmelse hermed. Og hvad denne standard søgeord hernede middel er, hvis de ikke har indtastet nogen af dem, så siger Invalid. Så lad os sige, at jeg beder om n og brugeren giver mig fire. Tja, det passer ingen af ​​disse sager, så det vil udskrive hvad der er i standard sektion. Ja, spørgsmål? SPEAKER 5: Kan man bruge Boolean udtryk i stedet for én, to eller tre? JOSEPH: Så spørgsmålet er, kan du bruge Boolske udtryk i stedet for én, to og tre? Og i C, jeg tror du kan ikke gøre det. Men på andre sprog, som du måske støde på udgangen af semester som JavaScript, du kan. Nå, ville du nødt til at beregne første denne værdi og derefter bruge det i skifte erklæring. Ja? ROB: Så en del af fordelen ved kontakt udsagn er at tænke på, hvis du gjorde det som en If / Else, så gerne, hvis n er lig med svarer til en eller hvad. Else / Hvis n er lig med lig med to, uanset hvad. Else / Hvis n er lig med lig med tre. Så den måde, programmet vil køre, er det vil sekventielt gå ned denne liste og tjek, er n en? Nope. Er n to? Nope. Er n tre? Ja. Gør dette. Betragtninger med switch udsagn, er det faktisk er i stand til at kompilere det at være rigtig hurtigt. Og så snart det siger switch, det siger, okay, n er to, er jeg straks kommer til at springe til, hvor Jeg skulle begynde at udføre. Jeg har ikke tænkt mig at først kontrollere, er n et, er n to? Det kan umiddelbart begynde at gøre hvad det er meningen at gøre. Og på grund af det, kan det ikke tage boolske betingelser. Ellers ville det have at gøre det sekventiel, ligesom, okay, er n større end nul? Else er n større end 10 eller hvad. JOSEPH: I dette tilfælde, hvis du har brugt Hvis / Else, Ifs, så kontakten ville køre cirka tre gange hurtigere end If / Else If. Vi kan arrangere kontakten i sådan en måde, som vi ikke bryder efter hvert af tilfældene. Så i dette tilfælde, jeg opdele numre, som vi vælger i én og to er ikke høje tal, og tre er et stort antal. Så i dette tilfælde, hvis n er en eller to, det vil ramme sagen, og så vil det falde igennem, fordi der ikke er nogen pause. Og det vil ende her. Så hvis vi vælger en, vil det gøre det printf og derefter bryde således at ingen af dette udføres. Og selvfølgelig, hvis de kommer ind i tre eller noget andet, så vil det springe dem, og ikke gå der, og det vil udføre i stedet tilsvarende linje. Er der nogen spørgsmål om det? Ja? SPEAKER 4: Vil du får en fejl, hvis du havde en pause efter sag en, men det ikke have noget for det at gøre? JOSEPH: Så spørgsmålet er ville du få en fejl, hvis du har en pause efter og små én, men der er ikke noget at gøre? Og svaret er nej. Du vil faktisk ikke få en fejl. Yeah, mm hmm. Så som en slags lille ændring her, Jeg har tænkt mig at sætte en printf her. Whoops. Så hvad ville dette udskrive, hvis Jeg sætter en i som input? Ja. Det vil fortælle dig, det ikke tage et højt antal gange, right? Fordi det ville ramme det første tilfælde ville det ikke i stykker, og det ville falde igennem til det andet tilfælde. Eventuelle spørgsmål om det? ROB: Har du har et andet spørgsmål? JOSEPH: OK, afkøles. Ok. Så der er noget andet, vi kalder en ternære operatør som er dybest set en alternativ syntaks til at gøre Hvis og så Else. Og det kan du gøre det hele på én linje. Så i dette program, Jeg beder brugeren for n. Og hvis n er større end 100, siger jeg dem de plukkes et højt tal. Else Jeg fortæller dem, at de plukket et lavt tal. Så vi kan bruge dette virkelig lang syntaks, snor, S, og derefter kontrollere, hvis n er større end 100 og tildele det i overensstemmelse hermed. Men vi kan gøre det meget mere kortfattet ved at bruge denne ternære operatør syntaks som omfatter et spørgsmål mark og et kolon. Så spørgsmålstegnet er hovedsagelig stille et spørgsmål, right? ROB: Måske zoome ind på det. JOSEPH: Ja. God pointe. Så dette er den ternære operatør. Jeg først stille spørgsmålet, er n større end 100? Hvis det er, så jeg udføre den første del før tyktarmen. Hvis det ikke er, så vil jeg udføre anden del efter kolon. Så hvis n er større end 100, så det opfanger højt og sætter der i streng s. Hvis n er mindre end 100, det opfanger lav og så sætter det ind i strengen s. Så det vil kondensere denne store luns ned i bare denne ene linje. SPEAKER 5: Er det populært? JOSEPH: Ja, det er meget populært for ting, hvor det væsentlige, du ønsker at ikke en opgave baseret på en slags tilstand. Og i dette tilfælde, vi forsøgte at tildele en værdi til strengen s. Det er ikke så - Jeg behøver vel ikke rigtig foretrækker den i andre tilfælde. Men det er især nyttig til denne opgave. ROB: Det er en smuk fælles mønster hvor du har nogle variabel, du kommer til at sige, hvis noget, sæt variablen til en værdi, ellers, sæt denne variabel til en anden værdi. Og det er det scenario hvor bruge en tredelt. JOSEPH: Og du gemmer masser af linjer, right? Og det bare gør din kode velsagtens en lille smule mere læsevenlig. Ja, spørgsmål? SPEAKER 6: For et ternære, kan du gå, string s ligemænd s, spørgsmålstegn? Og så kunne du have, siger, fem forskellige muligheder. Og afhængigt af, hvad antallet af n var, ville du vælge en af ​​dem? JOSEPH: Så spørgsmålet er, er der en slags syntaks, hvor du kan gøre strengen s lig n, og så har mere end to Valg efter at spørgsmålstegnet? Og et simpelt svar er nej, er der ikke virkelig en god måde at gøre det, medmindre du ønsker at indlejre flere ternære operatører inde i hinanden. Du kan gøre ligesom n større end 100, spørgsmålstegn, og derefter en anden ternære operatør, n større end 50, spørgsmålstegn, og reden det på den måde. Men i dette scenario, din kode er få slags ulæselig og rodet, og det ville være bedre at bare gå til en If / Else redegørelse på dette punkt. ROB: Og også, som en side bemærkning, PHP forkert gennemfører ternære operatør sådan at indlejrede ternaries ikke engang arbejde som de burde. JOSEPH: Ja. Så det bliver en lille smule forvirrende, især når du går til forskellige sprog. ROB: Det er forvirrende nok, at sprog er forkert om det. JOSEPH: Så faktisk, bare for at afklare, gør alle ved, hvad det % S gør herovre? Eventuelle spørgsmål om det? Jeg gætter bare for kameraet,% s dybest set lader os sætte en pladsholder for en streng. Og så til sidst, vi angive, at variabel vi ønsker at sætte ind i denne pladsholder er s. Så dybest set tager s og det sætter det i her. Og så vil det udskrive, du valgte en høj eller du plukket et lavt tal. OK. Så sløjfer giver dig mulighed for at udføre ting i cirkulære bevægelser, right? Du har måske stødt på dette i Scratch i form af Forever sløjfer eller Gentag Indtil eller Gentag en bestemt antal gange. Så hvorfor er det godt for os? Tja, i C, lad os sige, at vi har denne sang implementeret i Scratch, at synger, er sangen , der aldrig ender. Den bliver bare ved og ved og for evigt og evigt. Nå, kan du ikke rigtig lave et program , der har et uendeligt antal printf udsagn i det, ikke? Så i denne situation, en måde at du kan gøre dette arbejde, og for at gøre det udskrive evigt er til i stedet bruge en while-løkke. Så en while-løkke vil udføre, hvad der er i kroppen af ​​de to seler, tilhører det baseret på, hvad tilstanden er. Så i dette særlige eksempel før, hvis vi ønsker at udskrive dette for evigt, hvad kan vi gøre? Nå, sikker, right? Så denne slags kombinerer ideen nogle Boolsk udtryk sammen med en løkke. Og vi lærte om Boolean udtryk tidligere. Så når betingelsen indersiden af at mens stadig sandt, denne løkke vil køre på og på og på. Og i dette tilfælde, hvis vi bare levere det med sand, dette bevirker en uendelig løkke der udskriver sangen om og om og da vi ønskede før uden har et program, der har en uendelig Antallet af printf udtalelser, der er ikke mulig. Så mere overbevisende, selv om, du kan bruge dette med en variabel og en betingelse. Så lad os sige at vi vil gentage sætning, helt loopy, 10 gange. Så hvad du kan gøre med en while-løkke er kan du først initialisere en tæller variabel uden for Mens løkke til 10. Og så dybest set, hver gang du går gennem While loop, du udskriver erklæringen, og derefter du mindske tællervariablen indtil slutningen, på et tidspunkt, når vi trækker jeg nok gange, 1 fra I nok gange - og bare for at tydeliggøre, I minus minus betyder, at jeg er lig I minus 1. Det vil som udgangspunkt bringe jeg ned til punkt, hvor når jeg ramte nul, dette betingelse er ikke længere sandt, og så det kommer ud af sløjfen. Så helt loopy udskriver kun 10 gange. Eventuelle spørgsmål om et Mens loop? OK. Så der er en måde, vi kan gøre, hvad vi lige gjorde i en mere kortfattet måde med hvad vi kalder en for-løkke. Så en for-løkke består af en initialisering, en tilstand, og en opdatering, ligesom vi havde før i denne Mens løkke. Så lad os tage et kig. I denne Mens loop, vi havde en initialisering, så havde vi en betingelse, at vi kontrolleret. Og så havde vi en opdatering trin på toppen. Med en for-løkke, det dybest set tager disse tre ting og kondenserer det ned i en linje. Så det første, at det gør i For løkke er initialiseringen. Og så skal du gøre et semikolon, og derefter du gør den betingelse, som er jeg større end nul går derovre, og derefter opdateringen trin. Så det bliver udført på slutningen af ​​løkken kroppen. Så disse to programmer er væsentlige tilsvarende. Eventuelle spørgsmål? Så hvad er en forskel mellem disse to? Kan nogen påpege det? Det kan være lidt subtil. Det er bare en meget lille forskel. Ja? SPEAKER 5: Du ville ikke være i stand til at bruge I variabel uden For-løkken [Uhørligt]? JOSEPH: Præcis. Så det er noget, vi vil komme til senere kaldet variabel rækkevidde. Men det væsentlige, det int i liv uden for dette Mens løkke. Så når denne Mens løkke er færdig udførelse, vil jeg være i stand til at bruge jeg senere på i programmet. Hvorimod med dette For-løkke, denne int jeg er scoped inde i denne For-løkke. Og fordi det er inde i denne del i For-løkke, der starter ved parenteser og slutter med den klammeparentes derovre. Noget, der er erklæret inde i her kan ikke bruges uden for. Så hvis jeg forsøger at bruge jeg udenfor, det vil fortælle mig, sort symbol. Og i det væsentlige, ville jeg ikke være i stand til at bruge det. ROB: Og godt 10 år siden, i bogstaveligt alle tilfælde krøllede parenteser er hvad du har brugt til at bestemme omfanget af en variabel. Så i der, int jeg svarer til 10 deklareres på indersiden af ​​dette sæt krøllede parenteser. Og så så så længe du forsøger at bruge I før denne klammeparentes, det er fint. Du vil måske se, når du skriver at gøre, du se instrumentbrættet, bindestreg, std, lig, C99. Så det er en nyere version af C, der GCC har gennemført, som også giver denne genvej. Så dette bruges til at ikke være tilladt i C. Og du kan se, hvorfor, fordi denne int Jeg er uden for dette klammeparentes men er det stadig anses for at være i omfanget af disse krøllede parenteser. Men dette er en meget bekvem ting, og det er en god forlængelse. JOSEPH: Eventuelle spørgsmål? OK. Så hvad er mere nyttige er, at nogle gange du ønsker slags dynamik i dit loop, right? Du ønsker ikke at bare nødvendigvis udskrive helt loopy hele tiden, du ønsker at tælle ned fra 10 eller noget. Og så kan du bruge tællervariablen indersiden af ​​denne løkke samt. Og i dette tilfælde, dette program blot tæller ned fra 10 hele vejen ned. Og hvad betyder det ikke udskrive? Det udskriver ikke nul, ret, fordi når - Ja, det også udskrives ikke 11. Så det udskrives ikke nul, fordi når Jeg er nul, husk, det vurderer tilstanden før det går på at udføre løkken kroppen. Og når jeg er nul, det er falsk, så det ikke udskrive tælle ned nul, det bare udskriver optælling ned 10 hele vejen ned til 1. Hvis vi faktisk ønskede det til at udskrive nul, så ville vi sætte et lighedstegn efter denne større end tegn. OK. Så en måde at gøre input validering, der er, når du beder brugeren om at gøre noget, du ønsker at sikre, at de følge dine anvisninger, er at bruge While loop, right? Så i dette tilfælde, jeg spørger for et positivt tal, og så er jeg venter på input. Og så jeg tjekket Mens indgangen er mindre end nul, at spørge dem. Så så længe de giver mig et tal det er ikke positivt, at spørge, holde stille, at spørge. Men hvad er en slags underligt ved det? Eller synes ikke hvad optimal om denne struktur lige her? Nogen? Ja? SPEAKER 6: Du gentage instruktion to gange. JOSEPH: Right. Så vi har to printf udsagn her, ikke? Så der er en måde, vi kunne få det bare ned til en, der ville gøre vores kode lettere at læse og et lidt mere ren. Og så ville vi ikke have at har Kom i dobbelt så godt. Og en måde du kan gøre dette er ved hjælp af en gør-while-løkke. Og en Do-While løkke er dybest set en anden form for en while-løkke, hvor hvad der er inden for de krøllede parenteser bliver henrettet mindst én gang. Så i her, erklærer jeg, int input, uden først. Og så vil jeg bare sige, at gøre dette instruktion mens input er mindre end nul. Så det rammer Do først. Det vil altid udføre denne mindst én gang, så det vil altid bede brugeren for input mindst én gang. Og så vurderer, at input, og det går på i en cirkel. Ja, spørgsmål? SPEAKER 6: Er der en måde at gøre det [Uhørligt] typer, ligesom hvis du siger, GetString, og nogen [uhørligt] er der en måde at [uhørligt] JOSEPH: Så spørgsmålet er, er der en måde at gøre input validering, hvis brugeren ikke sat i den rigtige type variabel? Så hvis vi beder om en int, og de give os en streng i stedet. Og i de funktioner, som vi implementerer for dig, GetInt, getString i alle disse funktioner, de faktisk allerede gøre den slags grundtype input valideringen under kølerhjelmen. Så hvis du bruger de funktioner, som vi gav dig, behøver du ikke virkelig nødt til. Men hvis du ønsker at se mere på, hvordan du rent faktisk kan gøre det, kan du kigge under kølerhjelmen på filen I/O-- ikke filen, standard I / O-funktioner som en læser fra standard input og standard output. Og du kan få en bedre fornemmelse af, hvordan du kan gøre det. ROB: Et spørgsmål, selv om, er specifikt med det eksempel, du sagt, du forventer en streng og jeg indtaste en int. Hvordan vil du fortælle forskellen mellem bevidst ønsker det streng 123 versus ønsker int 123? Så streng, det er temmelig meget er der ingen validering, det er bare hvad de indtastet du vil fortolke som en streng. Int er nemmere, fordi uanset input du tager fra brugeren, er du altid tage en streng. Og så streng, du derefter kan check, er alle disse faktisk numeriske cifre? JOSEPH: OK. Eventuelle spørgsmål om et Do-While loop? ROB: Åh, og det er også - gå tilbage til rækkevidde, en noget fælles fejl prøver at bruge nogle lokale variabel fra inden for dette Do-While loop inde i denne tilstand. Og faktisk, hvis vi bare sluppet af dette og sagde, int input lig GetInt, så compileren vil råbe på os, fordi input ikke eksisterer uden for rammerne af Disse krøllede parenteser. JOSEPH: Og det er derfor, vi brug for denne lineup her. OK. Så du kan også bryde ud af en loop tidligt, hvis du ønsker det. Så dette er en anden måde gennemføre det, vi netop gennemført. Og i stedet for at anvende betingelsen i parentes, vi ved hjælp af en Hvis meddelelsen indersiden af ​​kroppen af Do-While løkke. Og dybest set, når indgangen er endelig større end nul, vil vi bryde ud af sløjfen. Og så vil vi gå hele vejen herned. Og du kan se, at dette ville formentlig blive foretrukket i denne scenarie, fordi det er lidt lidt renere og lidt lidt nemmere at læse. Dette, du slags have ekstra linjer i det. Det er bare en lille smule grimmere, Jeg gætter på, i en vis forstand. Ja, spørgsmål? SPEAKER 4: Vil kun bryde få dig ud af et sæt seler? JOSEPH: Right. Så spørgsmålet er, vil kun bryde få dig ud af en løkke? Og svaret er ja. Så hvis du har indlejret For loops, for eksempel, hvis jeg har for int I lig 0 indtil 10 og derefter Til int J er lig med 0 indtil den 10., hvis jeg bryder ud af den indre loop, vil jeg stadig gå til den ydre sløjfe. Så det vil holde udfører operationer på ydersiden. Eventuelle spørgsmål om det? Ja? SPEAKER 5: Men bryde fungerer kun for krøllede parenteser, ikke for andre udsagn? [Uhørligt] JOSEPH: Så spørgsmålet er, vil bryde kun fungere efter sløjfer i modsætning til andre udsagn som nu hvis? Og ja, det er tilfældet, fordi du bryde ud af en løkke, til højre, i en vis forstand. ROB: I langt de fleste tilfælde, er det dette er den slags Hvis noget, derefter bryde. Så du behøver ikke at bryde til at gælde for , hvis der er indpakning omkring det. Og dette er ikke meget af en løkke, men husk, at afbrydere er også brudt ud af ved pauser. Vi så pauser bliver brugt med kontakter før. JOSEPH: Og du kan også bruge dem i mens løkker og sløjfer. Eventuelle spørgsmål? OK. Så næste op er funktioner. Så du måske har brugt en af ​​disse BYOB blokke i dit Scratch projektet. Og det dybest set giver at definere et sæt anvisninger skal følges. Og hvad jeg mener med det er lad os tænke tilbage til matematik, til højre, algebra. Du har, hvad vi kalder en funktion af x, nogle variable, og lad os sige det funktion er f af x er lig x plus 5. Så du kan tænke på f af x som denne sorte boks, der tager 15 i og derefter producerer 20. Så mere generelt, en funktion er noget, der tager nogle input og derefter producerer nogle udgange. Og hvorfor er funktioner godt? De er gode for en række årsager. Så er der nogen ønsker at tage et stik på, hvad organisationen betyder? Med hensyn til hvorfor funktioner er nyttig? Ja? SPEAKER 4: Det gør din kode mere læsbar. JOSEPH: Right. Så en af ​​de ting er det gør din kode mere læsbar, right? I stedet for som int x er lig med x gange x gange x, kan jeg have terning af x, som er lettere at læse og mere forståeligt for en læser. Organisationen er også i form af opdele din kode i håndterbare portioner, således at i stedet for at forsøge at gennemføre alt dette i én lang sektion i hoved, kan du slags splitte det op ind ligesom, OK, lad os skrive en funktion i Cube noget, så lad os skrive et fungere til firkantet noget. På den måde kan du dele den op i små, små dele, som du kan tackle i modsætning til at forsøge at tackle et stort problem på én gang. ROB: Eller selv små, små dele, du og en partner kan tackle. JOSEPH: Ja. ROB: Så i stedet for begge Forsøger du at implantere en fungere på samme tid. JOSEPH: Forenkling. Nogen ønsker at tage et gæt? Ja? SPEAKER 5: Mere gentagelse. JOSEPH: Right. Så én ting, du kan gøre med forenkling er, at det er lidt på samme måde som genbrugelighed er, at når jeg skriver en terning funktion, kan jeg bare bruge det igen og igen og igen igen i mit program i stedet for at skrive x gange x gange x end og igen og igen. Og forenkling her også bare betyder, at det gør din kode slags nemmere at fejlsøge, når du opdele dette op i funktioner. Fordi så kan du lokalisere hvor dine problemer slags er. Eventuelle spørgsmål? Så en anden idé er abstraktion, right? Denne sorte boks. Ligesom ved du hvad GetInt gør til at modtage input fra brugeren? Vi har ikke rigtig fortalt dig, ikke? Alt, hvad vi har fortalt dig, er GetInt gør præcis, hvad det siger, det gør. Så selv om vi ikke fortælle dig, hvordan det virker, har du stadig kender. Så i dette særlige tilfælde, er det en firedobbelt funktion, der gør forskellige ting til en indgang at frembringe et udgangssignal. Og du kan firdoble en række ved at multiplicere det med fire. Eller du kan, hvad vi kalder bitskift det med to. Og vi vil dække dette lidt senere. Og der er ingen grund til at vide, hvordan denne fungerer funktionen, så længe det virker som anført. Så under kølerhjelmen, kunne jeg være ligesom, returnere input gange otte divideret med to. Og du ville ikke vide, vel? Alt du behøver at vide er det gør hvad den siger. Så det er nyttig ting om abstraktion. Og en anden ting er slags denne idé lokalisere din kode til en bestemt afsnit. Så hvis du har et problem, du ikke nødt til at gå hele din kode forsøger at fastsætte, hvor problemet var. Så i dette tilfælde, implementeret jeg terning forkert. Jeg troede terning var multiplicere med tre. Så i dette tilfælde, er dette et program der bare har at gange med tre overalt. Og der er et andet program, der har indregnet terning ud i en funktion. Og så nu, hvis jeg ønsker at lave min fejl her, jeg er nødt til at løse hver enkelt linje kode i dette program. Mens på den anden side, hvis jeg bruger funktion, jeg behøver kun at ændre hvad der var galt på ét sted. Så i datalogi, vi ringe input og output. Indgange kaldes parametre eller argumenter, og udgange kaldes returnere værdier. Og vi vil se, hvordan det hjælper os med at sortere af definere en funktion i en anden. Så dette er en funktion definition for cubing. Så det tager et input, og derefter den returnerer at antal gange selv tre gange. Så lad os bryde det ned. Så vi har en funktion header, som dybest set består af tre ting. Så vi har parametrene, som er, som jeg sagde før, inputs til denne funktion. Og så giver vi funktionen et navn. I dette tilfælde hedder den terning. Og så skal vi angive, hvad den type af returværdien. Så i dette tilfælde min terning funktion tager et heltal, og det også returnerer et heltal. Så hvis jeg går i to, to er et heltal, den returnerer otte til mig, hvilket er et helt tal. Så tilbage typenavn parametre. Spørgsmål om det? Og så er returværdien faktisk angivet i slutningen ved at sige afkast og derefter returnere uanset indeholder returværdien. Så i dette tilfælde, hvis vi sætter det hele sammen, en funktion tager i parametre, det hedder noget, og den returnerer noget, er den type at vi siger, at det skulle være. Eventuelle spørgsmål? Så hvordan kan vi bruge en funktion? Nå, skriver vi en funktion og derefter vi bruger det i vores program, right? Så jeg kaldte det terning, og så kan jeg bruge terning. Men hvad der er vigtigt at bemærke, er nævnte rækkefølge spørgsmål. Hvis jeg har terning under main, det er vil løbe ind i terningen. Og på dette punkt, er der intet kaldet terning i programmet, og det er bare at være ligesom, jeg har ingen idé om, hvad terningen er. Så det vil fortælle dig, implicit erklæring af funktionen. Det er den fejl, der dukker op. Og så i dette tilfælde, terning er under vigtigste, så det kommer ikke at vide det. SPEAKER 5: Så vigtigste er normalt Den sidste funktion defineret? JOSEPH: Så spørgsmålet er, er vigtigste normalt den sidste ting, som du ville definere? Og nej. Det er fordi vi normalt gerne main at være på toppen, right? Fordi det er den første ting, du ønsker programmøren åbner program at se. Og så hvordan løser vi dette problem for vi ønsker vigtigste at være på toppen, men den funktioner, som vi ønsker, vi vil have dem at være under main alligevel være i stand til at anvende dem inde i main? Nå, vi bruger det, vi kalder en funktion prototype. Så hvad en funktion prototype væsentlige er det først tager, hvad signaturen eller funktionen header af, hvad vi ønsker at gennemføre ned her, og vi sætter det på toppen af ​​et program. Så vi siger i dette tilfælde, ja, senere i vores program, vil vi at gøre et løfte om at gennemføre denne funktion kaldet int terning, som tager et heltal input. Så nu, fordi det er over hoved, main, går det til at sige, åh, ja, senere i programmet, er der kommer til at være der, så jeg kan henvise til det, så jeg vil bare lade det gå igennem for nu. Og derefter ved bunden, vi gennemfører terning. Og derefter vigtigste vil bare sige, godt, vil det sortere link disse to symboler sammen. Og vi vil dække, hvad der betyder senere. Og så vil vide, at dette er den terning funktion, den skal bruge. ROB: Den [uhørligt] om at ville main forneden eller top, jeg har set begge. Der er ting, der bare kan lide at sætte vigtigste nederst. Men når et projekt bliver især store, normalt vigtigste er i en fil alle sine egne. Og på det tidspunkt, som int terning linje ville - indersiden af ​​stdio.h er en flok af linjer ligesom at int terning int input linje. Og så disse prototyper er ting, du tendens til at sætte ind i header-filer, på hvilket tidspunkt, det gør ikke noget. Tja, det gør ikke noget. De går altid på toppen. Og hvis hoved er ikke en fil alle sine egne, du behøver ikke at bekymre dig om at sætte enkelte funktion prototyper i filen. JOSEPH: Og vi vil komme til at lidt lidt senere, da Rob begynder at tale om kompilering. Og så er der også en forskel mellem parameter og argument. Og parameter er lige, hvad Vi kalder disse input, når vi definere funktionen. Og vi kalder det et argument, når vi faktisk passere det ind i funktionen. Så i dette tilfælde, er en parameter, som vi sagde før. Og når vi rent faktisk bruger det derovre, terning af x, så x selv er hvad vi kalder et argument til funktionen terningen. ROB: Så parameter argumenter er - der er denne forskel, meget forvirret flæng. På dette punkt, for mig, det er ligesom en af de ord, når jeg ser det i naturen, kan jeg ikke hjælpe, men straks spørgsmålet om, hvorvidt de bruger det i den rette sammenhæng, fordi Forskellen er subtil nok, at bare alle har tendens - Jeg næsten altid sige argument uanset hvad jeg mener. Josef og funktioner er også nyttige for det, vi kalder bivirkninger. Så en funktion kan tage nogen input, og det kan også producere nogen udgange. Så i dette særlige tilfælde, er jeg definerer en subrutine, der ikke har returværdi. Og for at præcisere, at vi bruger hvad vi kalder et tomrum herovre. Og så den bivirkning af denne funktion er, at det bare udskriver ting ud til siden. Det behøver faktisk ikke tage nogen input, og det ikke faktisk producere eventuelle udgange. Men dette kan være nyttigt i den forstand, hvis du vil, for eksempel, debug noget i dit program, hvis du ønsker til at skrive en lille subrutine der udskriver, lad os sige, at indholdet hukommelse eller noget. Og så disse bivirkninger er undertiden anvendelig uden for den sammenhæng af bare gerne input og output. Eventuelle spørgsmål? Og for at afslutte denne særlige segment, hvad betyder dette program gøre? Jeg vil give jer et par sekunder at læse igennem den. På et meget grundlæggende niveau, hvad vi ønsker at sige, at det swaps x og y, right? Så hvor mange af jer rent faktisk tror, dette vil bytte x og y? Løft din hånd. Ingen. OK. Der mener, at det vil ikke bytte x og y? Og summen af ​​det var ikke hele rummet. Så nogle mennesker er ikke sikker. OK. Det er rimeligt. Så lad os gå igennem, hvad der sker, når du faktisk kalde funktioner først i For at besvare dette spørgsmål. Så dette er hvad hukommelse slags ligner. Det er lidt ligesom en forenklet model af, hvad hukommelse ser ud, når du kører et program. Så der er noget, der hedder stakken herned og noget, der hedder den bunke. Og disse vokse i retning af midt i hukommelsen. Så i dette særlige tilfælde, hvor du kalder en funktion, er det bliver sat på stakken. Og så hvad der er indeholdt i denne funktionen forbliver i det, vi kalder at funktionens stack ramme. Og så for at få en flot visualisering af dette, let's - for eksempel, havde vi program vigtigste tidligere. Og inde i hoved, vi kaldte terning. Så main ville først gå på stakken indramme, fordi det er den første funktion det hedder. Og da terning kaldes indersiden af vigtigste, det bliver lagt på toppen af ​​hoved indersiden af ​​hukommelsen. Så hvad vil du bemærke her er, at terning har sine egne parametre og dens egne lokale. Så når du rent faktisk passerer noget til en funktion af de parametre, som den får er kopier af, hvad der var gået fra main. Og for at slags forklare dette, lad os gå gennem et program. Så vi har stakken, og dette er bare stakken del. Og hvad vi gør, er vi først initialisere x og y til et og to. Så vi har disse små bokse. De sidder i hoved stak ramme på stakken. De indeholder et og to. Nu kalder vi swap. Hvad der sker, er vi passerer x og y i swap og swap skaber sine egne kopier af disse variabler til brug inde dens stakramme. Så nu derovre, har vi en, der indeholder den værdi, x havde, og b, der indeholder den værdi, y havde. Så en, to. Og du vil opdage, at dette er adskilt fra x og y inde i main. Så vi nu oprette en midlertidig variabel til at indeholde en. Vi sætter en lige til B, så det ændringer fra et til to. Og så satte vi b lige temp, som er én. Og så nu vi afslutte ud af denne funktion. Når du afslutter ud af funktion, stakrammen bliver poppet fra stakken. Vi kalder det skubbe. Du skubber en stak ramme på stakken og du pop, hvis off stakken. Og så hvad der sker, er alt det, var i den stakramme slags bare går op i flammer. Og så der ikke længere eksisterer. Men hvad gør vi mærke? Vi har faktisk aldrig ændret værdier af x og y, right? Så dem forblev lokal til hoved. Og ved at sende ting i swap, vi faktisk aldrig ændret disse værdier. Og hvad kalder vi det her? Vi kalder denne forbifarten af ​​værdi. Så i C, når du passerer ting ind funktioner, den passerer dem værdi og gør en kopi af dem på funktionen at bruge. Og vi vil lære om noget, der hedder passerer ved henvisning senere, men det er en måde, du kan løse dette problem. Men vi vil ikke bekymre dig om at indtil senere. ROB: Og faktisk dette begreb, passerer ved henvisning, er så C ikke engang passerer ved henvisninger. C har udelukkende forbi værdi. Ligegyldigt hvad du gør, er du altid passerer en kopi af noget. Det er bare det, som jeg slags nævnt at før med pointere og at en streng er egentlig bare fire bytes peger på et sted i hukommelsen. Tja, hvis jeg har denne streng, og det er fortæller mig, at er, hvor strengen - Tja, hvis jeg har denne pegepind til denne placere i hukommelsen, så kan jeg passere en kopi af denne pointer til en funktion, og denne funktion ved stadig hvor i hukommelse det er. Så begge disse pejlemærker peger til det samme sted i hukommelsen, og det er, hvordan vi kommer til at være i stand til at ændre ting ud over nuværende stakramme. JOSEPH: Har du lyst til at gøre kompilere? ROB: Nej, det er 05:30. JOSEPH: OK. Det er 05:30. OK. Så vi vil dække kompilere Jeg gætter på næste afsnit, eller din afdeling leder vil på dette punkt. Og - ROB: Eventuelle spørgsmål? JOSEPH: Eventuelle spørgsmål? Ja? SPEAKER 5: Brug strenge fra CS50, enhver funktioner, som vi vil bruge til dem, der vil være ligesom C-funktioner. CS50 er ikke gået ind og gjort nogen ekstra. ROB: Korrekt. Enhver af C ligesom [uhørligt], kan du ville bruge dem på vores strenge. JOSEPH: Og en sidste ting, jeg ønsker at nævne, er, at vi har en styleguide for denne klasse. ROB: Åh, ja. JOSEPH: Så hvis du er kommet fra en programmering baggrunden, før du kan have visse konventioner, når du skriver kode som at sætte seler på samme linje eller særlige måder at indrykke eller navngive dine variabler. I denne klasse, vi ønsker at følge en bestemt stil guide, bare fordi, godt, hvis du går ud og arbejde i industrien, er du nødt til at blive forventes at følge den stil vejledning af selskab, hvor du gå til. Ligesom for eksempel, Facebook tror jeg har en særlig form for navngivning konvention. Og der er forskelle mellem kamel husets variabler og ligesom adskille dem med understregninger. Og også, jeg tror, ​​de fleste vigtigere, ligesom for eksempel indrykning, right? Vi krøllede parenteser starter hvor tilstanden er, og de er på næste linje. Og vi også sætte krøllede parenteser i selvom det er kun én linje. Og en masse gange, er der måder at gøre den, hvor du kan efterlade disse seler fra, hvis det er kun én linje under Hvis erklæring. Men i denne klasse, vi ønsker at følge en bestemt stil guide bare så du får bruges til den slags ting. ROB: Ja, og Style 50 kommer til at håndhæve denne stil guide, og vi er kommer til at bruge Style 50 til lønklasse din kode. Så det gør tingene lettere for os og forhåbentlig bør ikke gøre ting, meget værre for dig givet standardiseret stil bør ikke være, at urealistisk. JOSEPH: Og endelig, for at finde den stil , skal du gå til manual.cs50.net/style. Og ja. SPEAKER 4: Vil du gennemtvinge eventuelle tegn per linje? ROB: Ja. JOSEPH: Undskyld, drenge. ROB: Det er ligesom en af ​​de eneste. På dette punkt er jeg OK med 120. Jeg er OK med at sige 120 tegn per linje. Jeg forstår at der er en vis grænse. Jeg tror 80 er så lille, men vi håndhæve det. JOSEPH: Personligt synes jeg, med C, 80 tegn er mere OK. Når du begynder at komme til andre sprog som JavaScript og PHP, ikke så rimeligt at blot begrænse det til 80 tegn. OK. Nå, det var super sektion. Er der nogen der vil have slik? SPEAKER 4: Ja.