ROB BOWDEN: Detta är den mer bekväm sektion, men det betyder inte att om du känns som du inte är bekvämare Du kommer inte att lära sig saker här. Så låt oss komma igång. Har du diabilder kommer rätt in i saker. Är jag på väg att bara ta det just nu? Byta bärbara datorer. ALLISON: Du vill inte presentera dig, Rob? ROB BOWDEN: Åh, jag är Rob. Detta är min femte året TF-ing CS50. GABRIEL: Jag är Gabriel. Jag är chef TF i CS50. Jag var TF förra året och i år. ALLISON: Och jag är Alison, och detta är mitt andra år TF-ing CS50. ROB BOWDEN: Okej, så denna sak till vänster, förhoppningsvis du har sett det förut. Om inte för att du hämta det själv, du borde ha sett det i föreläsning. Så detta är CS50 apparaten, och han gjorde en något av en beskrivning av den i föreläsning. Men i grunden är det bara du kör ett operativsystem systemet inom ditt operativsystem system så att vi kan ge dig program utan att behöva att oroa sig, oh är detta kommer att arbeta med både Windows och Mac, eller om någon av er redan använder Linux, Linux. Det är bara tänkt att vara en vanlig spel fältet så alla har exakt samma miljö. Så om du har inte ner detta redan, du ska ladda ner det, eftersom du är kommer att behöva det för problemet set. Och det är en två gigabyte ladda ner, så det kan ta ett tag. På Harvard det ska gå fort. Så CS50 apparaten. Nu i början kommer vi att tala om bara en massa kommandorad grejer, och så med det, menar jag att arbeta i denna lilla miljö här. Och märker alla saker Jag säger just här just nu kommer att fungera om du är inne i en terminal apparatens insida, eller om du är inne i gedit terminalfönster apparatens insida. Så de miljöerna är identiska. Men jag ska gå en tredje väg. Och märker här nere här liten IP-adress här. Så du behöver inte göra detta, men det här IP address-- nu om Jag-- utom det blockeras av det här. OK, så att IP-adressen över i en terminal här-- så denna terminal över här är en terminal i min Mac. Så det här är inte på något sätt för tillfället förknippas med den apparat alls. Och om du är på Windows, då är du kommer att behöva ladda ner något speciellt för denna, särskilt människor tenderar att använda Putty, P-U-T-T-Y. Så vad jag ska göra är att skriva SSH och sedan den IP-adressen. Tja, jharvard på den IP-adressen. Så 192.168.24.220. Denna skrämmande budskap, ignorera det. Skriv bara ja. Detta är CS50 i en låda. Den frågar efter ditt lösenord. Och så i en hel del av dessa sammanhang där den frågar efter lösenordet [OHÖRBAR]. Vi har fått många frågor där det säger att det är faktiskt inte skriva. Den visar inte du karaktärerna i lösenordet som du skriver, om något, för en säkerhetsfunktion, för om någon tittar över axeln och de ser star star star star, då de vet att ditt lösenord är fyra tecken. Så tanken är att det kommer att fråga dig om ditt lösenord, typ. Det kommer inte att visa du tecknen, men det är faktiskt acceptera dem. I det här fallet, när du någonsin se en lösenordsruta hantera apparaten, den lösenord kommer att vara crimson. Så crimson. Och nu här inne i detta fönster som är i min Mac, Jag är i grund och botten har exakt samma uppfattning såsom insidan av en terminal i apparaten. Så du behöver inte göra det här. Du kan göra allt du vill apparatens insida. Jag nästan aldrig faktiskt göra något i apparaten. Jag nästan alltid minimera det och nu Jag jobbar SSH i apparaten. Om något, om du ha en långsammare dator, Du kan märka en skillnad. Jag gör det därför att jag föredrar denna terminalfönster. Den har några funktioner som Jag kan dela fönstret, och nu kan jag SSH in genom apparaten. Jag fick två SSH händer på en gång. Om din dator är särskilt långsam och du arbetar i apparaten, och du inser att detta är verkligen laggar, oavsett. Tenderar att vara mycket snabbare om du är SSH-ed in. Men annars kan du arbeta åt båda hållen. PUBLIK: Vad innebär SSH detta? ROB BOWDEN: Secure skal, något sådant? Vad innebär SSH detta? GABRIEL: Secure shell. ALLISON: Det är bara säkert skal. ROB BOWDEN: Secure shell. Det är ett protokoll som dig-- det ett säkert protokoll, så krypteras. Människor kan inte snoka nätverket och se vad du säger till någonting du är SSH-ed till. Och faktiskt, i olden dagar av CS50, så år 2009 när jag var en nybörjare, det sätt som du arbetat med CS50 problemsamlingar, var du SSH-ed till viss server att vi gav dig tillgång till, och du arbetat med det. Så du hade inte det här grafisk apparaten. Ni hade inte gedit. Ni hade inte alla dessa saker som du kan visuellt peka och klicka. Du var tvungen att jobba i detta gränssnitt. Jag föredrar att arbeta i detta gränssnitt. Så en del av vad vi ska att gå till över just nu är ett gäng av kommandon som du bör börjar bli bekant med som du går med i kursen. Och ärligt talat, när du vänja sig vid dem, det är så mycket snabbare att fungera i denna miljö än det är att arbeta med finder, dra och klicka på saker. Så här är vi. Nu har jag bara SSH-ed in, och så standard location-- du såg några av dessa kommandon i klassen, men vi ska gå igenom dem alla igen. Standardplatsen är vi i är hemkatalogen. Och katalog, bara ett annat ord för mapp. Så vi är i hemkatalogen. Skriv ls, lista filerna i den här katalogen. Uppenbar jag skapade en blah.c tidigare. Så vi har en skrivbordskatalogen. Du märker det syntaxmarkering? Den ljusblå markering indikerar en katalog och den raka vita visar bara en vanlig fil. Så det kommer att bli några andra färger som du ser. En körbar fil är förmodligen kommer att vara grön eller nåt sånt. OK, så vi är i hemkatalogen. Nu om jag vill gå in i en annan katalog, cd kommandot jag vill. Så byta katalog, och sedan passera namnet på katalogen att du vill gå in. Så här har vi fyra alternativ. Jag kan gå in i nedladdningar, och nu ser vi Här har man uppdaterat denna parentes att säga att jag är i ~ / downloads. Så vad är tilde? Det är en förkortning för din hemkatalog. Så nästan allt du gör kommer att vara till din hemkatalog, och pwd är bara ett kommando Jag använder en gång under ett år som bara skriver ut den aktuella katalogen. Och så du ser här att ~ / Nedladdningar verkligen löser till / home / jharvard / downloads. Så / home / jharvard är min hemkatalog. Så vi kan cd dot dot. Nu dot dot är en speciell katalog som alltid hänvisar till en katalog upp. Så om jag är i ~ / downloads, sedan cd dot dot kommer att föra mig till Tilde. Vad tror vi cd dot dot kommer att föra mig till nu? Det kommer att föra mig till / home. Så tilde av utskriftsarbetskatalogen, Jag är i nu / home / jharvard. en katalog upp från det, Nu står det här / home. Nu cd dot dot. Nu är jag i rotkatalogen, och du kan inte göra det igen. Du ska bara stanna i rotkatalogen för evigt. I rotkatalogen har en hel massa saker som, om man vill titta på, du kan. Till exempel, om jag går till bin, innehåller det alla dessa binärer, såsom LS, och cd, och alla dessa saker. Så dessa kommandon behöver existerar någonstans i systemet, och det är i / bin. Men nästan allt du gör är kommer att vara från din hemkatalog. Och cd utan några argument som helst, du kunde säga cd ~, behöver inte. cd kommer att ge dig tillbaka till din hemkatalog. En sista. cd - kommer att ta dig tillbaka till den senaste katalogen som du var i. Så jag bara cd'd två gånger i rad, så min förra katalogen var hemkatalogen. Om jag går till snedstreck bin, och nu låt oss gå upp och in användaren. Användare aktie. Låt oss gå till användar aktie. Nu är jag nu i användar aktie. cd - tillbaka i bin. Så detta blir särskilt användbar när du have-- och det kommer att växla. Så användarandel, back bin, aktiekorgen. Så det här blir användbart. Du kan hitta dig själv att ha många, många, många kapslade kataloger. Och du vill göra något riktigt snabbt i en övre katalog. Du går till den katalogen, gör förändringar och sånt, och nu vill du åka tillbaka till där du var. cd -. Jag är alltid frustrerad när jag råkar gå till den katalogen jag ville göra jobbet i. Jag får alltid frustrerad när jag gjorde det i två steg istället för ett steg, eftersom det innebär att cd - går att sätta i den mellanliggande läge istället för där jag vill gå. Så vi ser alla listfiler. Vi vet hur att ta sig runt så här långt. Så nu ska vi prata om att redigera filer. Så i denna kurs, du är nästan alltid förväntas använda gedit. Om du vill kan du ta nästa steg och börja lära en kommandorad text redaktör. Så olika alternativ finns. Och de som är nog kommer att vara relevant för dig, Vi har Nano, Vim och Emacs. Så Nano är nybörjare kommandorad textredigerare. Så Nano låt oss gå på blah.c jag skapade tidigare. Det är bara denna standard C-fil. Och du ser en massa grejer pågår på den nedre delen av skärmen, och uppenbarligen blah.c innehåller denna C-kod. Så i detta särskilda redaktör, vad det säger på bottom-- nu detta cirkumflex symbol, Vi ser detta ^ G, ^ X, ^ O. Så att i nästan alla sammanhang som du ser, du kanske se att cirkumflex symbol i andra platser på nätet, på Stack Overflow, något liknande. Den hänvisar nästan alltid att styra. Så för att avsluta jag vill göra Kontroll X. Kontroll X, lämnar. Och jag kan använda min pil för att flytta runt. Märker jag inte kan peka och klicka lätthet. Du måste använda din pil för att flytta runt. Det kan finnas en inställning att peka och klicka. Men låt oss göra några ändringar. Nu Kontroll X att gå exit. Det kommer att säga spara modifierad buffert. Nu prompten, y för ja, n utan. Kontroll C för att avbryta. Jag ska bara säga ja. Filnamn att skriva. Standard är filen att det redan är. Hit Enter. OK. Nu har jag just redigerat den filen, sparade den, och det ändras. Så Nano är det enklaste textredigerare vänja sig. Alternativen är Vim och Emacs. De är högre nivå textredigerare som har en mycket brant inlärningskurva. Så min personliga preferenser är Vim. Och det har en mängd olika alternativ. Och när du vänjer till det kommer du aldrig vill gå till någon annan textredigerare för att du bara har så många saker tillgängliga för dig i dessa, men det tar en riktigt lång tid att lära sig. Så kanske du bara vill tvinga själv just nu för att vänja sig vid det, men jag skulle säga att det är värt det. Men det är svårt. Och sedan Emacs. Jag kämpar alltid i Emacs eftersom Jag vet hur man gör absolut ingenting. Tydligen Emacs inte som standard installeras på apparaten. Vi kommer förmodligen att tillägga att som en standardinstallationer. När du lär dig en av Vim eller Emacs, det finns inga övertygande skäl att någonsin lära den andra, men det är en helt annan stil. OK så det är att redigera textfiler. PUBLIK: Om du har fastnat i Vim just nu, hur gör we-- ROB BOWDEN: Det finns flera lägen i Vim, och det finns hela tutorials på att lära Vim. Så om du råkar vara i infoga läget för du skriver in text som du kan anger som på olika sätt, men jag är hur man får in infogningsläge. I eller få ut av någon särskild läge som du är i, bara fly. Och du bara bash Escape för att få av alla kapslade lägen din i. Bara OK, nu är jag tillbaka i normalläge. Och så i normalläge, ett kolon. Du ser det längst ner. Och sedan q. Så q kommer att sluta om du har gjort ändringar, som I-- har jag gjort ändringar? Jag har gjort ändringar tydligen. Så om du har gjort ändringar, ska det säger att du kan sätta ett utropstecken. Jag kommer att kalla det en smäll. Så du kan sätta ett förbud att bara sluta utan att göra något, eller kolon wq kommer att spara och avsluta. Så w i allmänhet skriva. Så skriver filen. Jag kan skriva och sluta. Eller du kan ha bara qx slam, q bang bara att få ut av det oberoende om eventuella ändringar som du har gjort. Okej, så nu ska vi go-- vi kan skapa filer. Låt oss börja ta bort filer. Och jag ska bara kasta i en snabb nytt kommando, handlag. Så röra foo. Peka bar. Peka Baz. Om jag ls, nu ser vi att dessa filer finns. De är helt tom. Så touch är bara en enkel sätt av en, [OHÖRBAR]. Två, tekniskt bara för att staten det, uppdaterar den tidsstämplarna. Så alla filer som du skapar har en tidsstämpel i samband med det. Så baz skapades den September 14 vid 16:21. Det är nu 16:22, så om Jag rör baz igen, vi se att baz var mest nyligen ändrats vid 16:22. Men annars jag nästan aldrig titta på tidsstämplar på filer. Så beröring, här jag bara använder den för att skapa några snabba filer. Okej, så nu rm är den kommando som vi bryr oss om här. Och vi kan rm bu. Säg bort regelbunden tom fil boo. Och vi kan skriva y, och nu är det avlägsnar. rm Baz. Avlägsna vanlig tom fil baz och typ n utan. Nu är det inte har tagits bort. Så bar och baz fortfarande existerar. Foo är borta. GABRIEL: Fortsätt prata. ROB BOWDEN: Great. Så irriterande meddelande Här, ta bort regelbundna empty-- Vad gör du där nere? Ta regelbundna tom fil. Så om vi inte vill vara besväras av det meddelandet, Vi kan slänga in här -f flagga, och så det är kraft. Och nu om jag rm -f, det kommer inte att säger vill du ta bort den här filen. Det kommer bara göra det. Och ls, jag ser inte bar där längre. Nu är en potentiellt farligt kommando. Det tenderar att inte alltför illa. Vi kommer tillbaka i en andra hur Det kan bli riktigt farligt. Och låt oss skapa lite temp katalog. mkdir, ett annat kommando. Så mkdir är ett kommando som gör en katalog. Och nu med ls ser vi denna fina ljus blåmarkerade temp katalog. Jag kan cd i temp. Och jag kan mkdir foo. cd till foo. mkdir bar. cd i baren. Så vi ser att vi kan lätt få i några ganska djupa häckning. Nu hur tar jag bort en katalog? rmdir. Så om jag bara rakt försöka rm, som vi gjorde med en vanlig fil, rm bar kommer att säger kan inte ta bort bar. Det är en katalog. Det finns ett speciellt kommando för ta bort kataloger, typ av. Så rmdir bar. Nu bar är borta. OK, så rmdir jag använder ganska mycket aldrig. Anledningen being-- nu ska vi gör en vanlig fil bar här. Så rmdir boo. rmdir. Det gick inte att ta bort foo. Directory inte tom. Så du kan inte använda ta bort dir på en katalog som har saker i den. Så du har några alternativ. Du kan gå in i den katalogen, ta bort allt för hand, och sedan komma ut och rmdir katalogen. Det låter självklart irriterande. Tänk om det finns tusentals filer i det? Tja, kan du rm *. Vi pratar om * på en sekund. Det innebär i princip allt. Men ännu bättre, så rm -r. Så rm -r-- i en hel del sammanhang, -r betyder rekursiv, som vi ska tala om vad rekursiva medel i flera veckor. Men det innebär i princip travers helheten av den här katalogen och ta bort allt. Så rm -r foo kommer att säga ner i katalogen foo? Ja. Ta regelbundna tom fil foo / bar? Ja. Avlägsna katalogen foo? Ja. Så nu foo och allt inom det har tagits bort. Nu kan få särskilt irriterande when-- låt oss röra 1, tryck 2, tryck 3. Kunde ha en hel massa filer. Om jag ville, jag skulle kunna skapa tusentals filer i här. Och rm -r foo går vara ganska irriterande. Ja, ja, ja, ja, ja, ja. Med många fler filer du snabbt se hur många gånger Jag skulle behöva skriva ja. Nåväl, vi såg precis innan hur vi kan bli av att behöva skriva ja, -f. Så mkdir foo cd foo kontakt 1 2 3. OK, så rm -rf foo kommer att blint bort foo helt. Ingen uppmaning. Ingen som helst. Foo är borta. Så jag brukar använda det här kommandot hela tiden. Som sagt, det är en mycket farligt kommando, för om jag gör något liknande detta, kommer det inte att fråga dig. Det kommer att vara borta. Och det händer ganska ofta, och även i högre nivå CS kurser. Ibland får vi se något där någon säger jag av misstag vår rm rf-ed mitt hem katalog och alla mina P: n är borta. Och det är förödande, men det finns ingen papperskorg. Det finns ingen det finns inget för dig att hämta. Det är bara borta. Ännu värre skulle vara något i stil med rm -rf /. Så vi bara diskuterat att rotkatalogen. Den rymmer alla de filer på ditt system. Saker tenderar att bli ganska rörigt När du tar bort saker som ls, och cd, och alla av dem. PUBLIK: Vad är skillnaden mellan RM, rf, och rm * ROB BOWDEN: Så rm * - ALLISON: Fråga var vad är skillnaden mellan RM, rf, och rm *. ROB BOWDEN: Så rm *. Star generellt sätt alla innehållet i den här katalogen. Försöker tänka på annat sätt att visa stjärnan. Tja, stjärna faktiskt generellt innebär matchar något mönster. Så om jag har en fil som heter dog1, Rör dog2 trycker cat1 trycker cat2. Så ls * 1 kommer att skriva ut cat1 och dog1, eftersom den stjärnan kan fyllas i with-- att man måste vara där, men stjärnan kan vara antingen katt eller hund. Det är ett wild card. Det är ordet jag letar efter. Wild card. Eller jag kunde ls hund *, och Jag fick se dog1, dog2. Så de listar filerna att matcha det speciella mönster. Du kan använda ls på detta sätt. Ls * stjärniga matchar något. Så det kommer att skriva ut alla innehållet i den här katalogen eftersom alla av dem matchar. Det kommer inte att skriva ut något i övre nivå kataloger. Om jag har en underkatalog, foo, och Rör 1 2 3-- så nu om rm * stjärna, avlägsna cat1, CAT2, dog1, dog2. Det går inte att ta bort foo. Det är en katalog. Så stjärnan expanderar till alla filer i katalogen. Så tekniskt rm * är som att säga rm cat1, cat2, dog1, dog2, foo. Medan rm -rf, tekniskt stjärna skulle uppnå vad vi vill, men rm -rf-- om jag går ut ur detta katalog, rm -rf temp, som kommer att gå in i temp och rekursivt ta bort allting. Så stjärna är separat i det som förstås by-- så här saken att jag kör in, denna sak som att fråga mig för kommandon och därefter genomföra och göra dem, jag kallar det mitt skal. Och så detta skal är själv ett program. Och om jag ville, jag kunde köra in / bin / bash. Skalet kallas bash. Och nu märker vi något har något förändrats, och det beror på mina inställningar för skalet är något annorlunda. Men nu är jag tekniskt sett kör ett skal i min ursprungliga skal, och jag kan avsluta det skal, och nu Jag är tillbaka till min toppnivå skal. Syftet med att säga som är-- stjärnan. Så stjärnan är något förstås av bash. Så rm -rf är -rf flagga förstås av bara rm. Den vet att när du passera en -rf att du vill att det ska rekursivt ta bort alla filer utan att fråga. Stjärnan är något som förstås genom bash att när du säger rm *, bash kommer inte att säga hey rm *, ta bort stjärnan. Bash kommer att säga rm * avlägsna cat1, CAT2, dog1, dog2. Det automatiskt kommer att expandera alla filer i katalogen. Och på liknande sätt tilde är en annan symbol som bash förstår. När du säger cd ~ expanderar bash det till din hemkatalog. Andra frågor hittills? OK så vi ska börja gå snabbt. Tab avslutad. Bara att kasta det där ute. Många människor gör inte inser detta existerar. Så om jag skriver cd dow, jag vill gå in hämtningar. Jag behöver inte skriva nloads. Jag kan bara trycka Tab. Så det erkänner att dow är ett prefix som matchar inte något annat i denna katalog, så det kommer att slutföra det åt dig. Nu kan jag gå in. Jag gör också att rekursivt. Så mkdir foo. Låt oss gå in i foo. mkdir bar. Så gå tillbaka till mitt hem katalog, kan jag se nedladdningar. Nu slår fliken igen, automatiskt kommer att fylla i foo. Det är den enda katalog. Utslagning fliken igen, automatiskt kommer att fylla i bar. Så nu är jag i (~ Nedladdningar / foo / bar). Så här fliken färdigställande, när jag kom till kontorstid, och jag står över någons axel, och de kommer rm D-O-W-N-L-O-A-D-S, jag dör. Bara flik, flik, flik, flik. Så definitivt använt flik. Och på samma sätt upp och ner, många människor just det hände aldrig hit upp och ner. Det kommer att gå igenom tidigare kommandon, så om du bara sprang något, och du vill köra den igen, bara hålla upp tills du kommer till den. OK. Så snabb, vissa andra saker. Låt oss gå tillbaka till temp. Låt oss skapa några filer. Så här, jag är bara kommer att lista några ord. hund, katt, jama. Låt oss göra hund, fisk. Så nu rep är en mycket användbara kommandon som du använder för att söka i hela filer för en viss text, och tekniskt kan man göra riktigt komplexa uttryck för att matcha. Så här, om jag grep, och vad vill jag söka efter? Låt oss säga att jag söker för katter, och Jag vill söka alla dessa filer. Så hur gör jag alla dessa filer? Star. Så i filen man, har jag katt. Jag kunde förmodligen ha kallade det något bättre, därför att det ser ut som linjenummer eller något. Men i filen jag har en linje med katt. I filen två Jag har en linje med katt. Så nu kan jag se in filen ett och se oh yeah, den filen hade katt. Kallelse filen tre inte motsvar eftersom katten inte är där. Jag kan grep för mjau. Endast fil två har mjau. Så det här kan du kombinera, igen, med -r, som som jag sa tidigare ofta innebär rekursiv. Och så jag kan komma upp hit, grep -r för varje fall of-- låt oss redigera detta bara för att kasta en katt där. Så grep -r för någon instans av katt i hela den här katalogen. Och det kommer rekursivt söka på underkataloger. Så i baz, det finns katt. I temp / 2, det finns katt. Och i temp / 1 finns det katt. Så det är att söka i filer. Nu kan du också använda ett fynd. Och så tycker är specifikt om söker filer med ett givet namn. Så låt oss göra lite mer. Låt oss gå in i nedladdningar. Peka dog1. Peka CAT2. Peka cat_dog. Peka Catcat. Så jag vill hitta alla filer med hund i namnet. Så hitta, och för den längsta tid jag aldrig ihåg Hur hitta fungerat, tills jag slutligen läsa något som gjorde det så klart. Så hitta, automatiskt rekursiv. Du behöver inte passera en r. Så hitta prick. Vi har inte pratat om prick än. Medan dot dot alltid innebär en katalog upp. Dot betyder alltid den aktuella katalogen. Så jag kunde rm -r prick i samma sätt som jag kan rm -rf *. I slutändan de åstadkomma samma sak. rm -rf prick kommer att ta bort hela den aktuella katalogen. OK, som jag inte vill göra det. Men hitta prick. Så rekursivt söka i den aktuella katalog, och nu är allt efter detta är ett gäng flaggor som du använder för att utesluta saker från returen. Så hitta prick returnerar allt som den kan hitta från den aktuella katalogen. De är alla filer rekursivt söka. Vi får se några av dem i en sekund. Men om du undrar hur jag gör att, så Command K, åtminstone i min terminal i Mac rensar den. Kontroll L rensar allmänhet det för någon form av terminal. Du kan också skriva klart. Och om du någonsin får in i en konstig scenario-- Det har hänt mig ett par time-- där färgerna på dina prompter är alla trasslat till, eller om du kan inte se något som skrivs när du skriver, eftersom ibland som bakgrundsfärg är inställd samma som förgrundsfärg och nu kan du inte se teckensnitten. Reset är något som bara återställer du till standard svart bakgrund, vit front, eller vad du ställa dem till. Så var var vi? Hitta prick. Så nu är allt förbi detta punkt begränsar resultaten till något som matchar det givna mönstret. Så här vill jag söka allt med namnet katten. Jag fick ingenting. Varför är det så? Tja, jag bara söker något med just namnet katten. Om jag vill söka något som har vissa mönster och cat-- citat är tekniskt nödvändigt, men jag kastar dem där. Så nu den hittar Catcat eftersom det är det enda som har någon godtycklig mönster följt av katten. Jag kan sätta katten *, och nu hitta Catcat, cat_dog, CAT2, eftersom de är allt med katt i början följt av någonting. Du kan kombinera detta. Om du vill söka efter alla C-filer som du har, kan du göra * .c. Vi har blah.c här. Så det är en find fungerar. Du kan söka. Den har en massa flaggor för ytterligare begränsningar. Och en av dem, låt oss säga -d. Så föråldrat. Åh, det är inte vad jag vill. Inte -d. Typ d. Så hitta dot - typ d. Så vad som just gjorde är jag söker för alla filer i den aktuella katalogen med en-- d står för directory-- katalog typ. Detta återställer alla kataloger i den aktuella katalogen. Och typ F är alla regelbundna filer, alla icke kataloger. Så det är bara en exempel på andra sätt som du kan begränsa den andra sökningen än bara namnet på filen. Det har varit 30 minuter. Still going. ALLISON: Jag ska knäppa genom. Det ska vara bra. ROB BOWDEN: Så en del andra saker. Nu bang, utropstecken. Så att i allmänhet means-- ja, låt oss se ett exempel. Så! F, vad att göra? Väl det verkar ha upprepad find dot -typ f. Hur är det? G? Som bara grep -r katt *. Så bang du kan använda för att upprepa en nyligen gjort kommando. Så om jag skriver gre, det kommer att åter run! de kommandon som började med gre mest nyligen. Och du kan se alla dessa kommandon med historia. Så historien. Dessa är alla kommandon Jag har rymt idag. Och ja, det är inte bokstav begränsad till idag, men jag har bara använt detta apparat i dag. Det är din helheten av historia av din bash shell, förutom att det skär av någon gång. PUBLIK: Vad händer om du gör historia [OHÖRBAR] kommandot och ett fel i resultatet kommer fortfarande skriva ut the-- ROB BOWDEN: Ja, om det finns en fel i ett av dessa commands-- så låt oss säga, är att en error kommandot hittades inte. Fortfarande förekommer i historien. Okej. Övriga frågor om vad som helst? Så det är smällen. Nu, verkligen användbart kommando, man. Så det ger dig handbok för ett givet kommando. Så låt oss säga man ls, så Detta visar mig ls. Den listar kataloginnehåll. Och det är här jag ser att det är dessa olika flaggor som finns. Så vi ser att ls -l finns om vi skulle läsa det. ls -l ger mig denna fullständig lista över de katalog med vem som äger filen, storleken av filen, den den modifierade tidsstämpel. Så ls -a är en annan som du kanske faktiskt använder något ofta. -al är min vanligaste flagga denna senaste ls. Så -a, märker att det finns en hel del fler filer än bara ls. ls -a. Vad är gemensamt med alla dessa filer? De börjar med en punkt. Så detta är en konvention i Linux som filer som börjar med en punkt är dolda. Så det betyder bara att när vi bara raka ls, eller vi söker den här katalogen med hjälp av upphittaren motsvarande, eller Windows Explorer motsvarande, som vi vill inte se dessa punktfiler. De förorenar bara synen på saker. Så de är dolda om du inte uttryckligen be dem med något i stil med -a. Så jag kan cd i .local, och jag ser att det i sig är en katalog med en delad katalog, och program och bla bla bla. Så prick, filer de bara dolda. OK, så andra viktiga sådana. Jag har ett par som jag kan hoppa. Låt oss bara riktigt snabbt prata om de fil omdirigering saker. Så det finns en hel komplex serie av saker du kan göra med dessa, men bara för att se dem, låt oss säga, eko. Ett annat kommando. Riktigt dum kommando. Allt det gör är att skriva ut vad jag säger det till. Så echo hej. Det ekade bara hej till skärmen. Hej världen. Echoes hallå världen. Så ett kommando eller en symbol som pucklar förstår är större än symbol, och som är utdata till en fil symbol. Så om jag utgång detta till foo, finns det nu en fil heter foo, inuti vilket är hallå världen. Så märker att när jag upprepar hallå världen röret i foo, det inte echo hej världen. Istället sattes i filen foo. Och ett annat kommando bara att kasta den på dig, katt. Det är ett enkelt sätt att bara helt visa innehållet i filen så att jag inte behöver öppna en textredigerare för att visa det. Så att innehållet i det foo fil är hallå världen. Och jag kunde katt blah.c, innehållet är det. Återigen, detta är kommandon som, inte gör det förväntar du har dem alla i minnet. Tanken är att du har sett dem. Kanske du arbetar med något, och du är som jag är trött på att öppna den här filen. Jag önskar jag kunde bara titta på innehållet riktigt snabbt. Du kan göra det, då se tillbaka och säga åh jag minns något liknande som finns, och det är katten. Så det går till en fil. Nu finns det inte riktigt något bra exempel på att läsa från en fil än. Vad är något som tar något från standard in? Någon enkel linux kommando? När vi kommer till det, i ett par veckor alla piece-- bra, denna vecka har du en bit där man börjar ta input från användaren. Och så brukar du skriver den ingången vid tangentbordet. Istället för att skriva att inmatning på tangentbordet, kan du i stället rör i från en fil så att när du gör Mario, ./mario, rör i från en viss fil, och det kommer att köra Mario programmet. Inte förväntar sig input på tangentbordet, det är istället bara att läsa linjer från foo fil. Så större än foo tar den i foo fil, och mindre än foo tar saker från foo filen och använder den som underlag till detta program. Och bara för att se det, kan vi också upprepa foo bar baz, och sedan i stället för en större än, låt oss göra två till foo. Vad gör det? Det lägger bara till filen. Så istället märker om jag eko bla in foo och sedan katt foo, det är bara bla. Så när du utdata till en fil, det helt skriver över den filen. Om du bara vill lägga till, dubbel [? väghyvlar. ?] Och sist är röret. Pipe blir mycket mer komplicerat, där det tar för utsignalen från ett kommando och matar in den i nästa kommando. Så lite gemensam sak, historia. Så, ugh, jag vill inte titta på detta. Visa mig alla kommandon i min historia där jag grep-ed för något. Nej, det är förvirrande. Visa mig alla kommandon där jag hitta. Alla hitta kommandon jag någonsin sprang. Så historien. Nu historia utgångar till screena denna lista med kommandon men jag vill inte utsignal i skärmen. Istället ska jag röret det till grep. Så låt oss grep efter alla förekomster av fyndet. Så nu i stället för grep tagande ingången, istället of-- grep kan hantera så input-- vi är använder grep lite annorlunda här. Så istället för att skriva en lista över saker som vi ville söka och sade grep tar som indata. Så om jag bara grep hitta, det väntar på att jag ska skriva saker. Så katt hej hitta. Hej. Hitta. Lägg märke till varje gång jag skriver hitta Det erkänner att jag skrivit Sök. Så i stället för detta, kommer sök filer för fyndet. Så historien kommer nu att ut en lista på alla kommandon. Vi lägger denna produktion, och vi leder in den i grep, och så den spottar ut alla instanser av fyndet. Anledningen till att jag sa att det skulle vara förvirrande är om Jag-- det är fortfarande förvirrande. Om jag grep för grep. Lägg märke till att det är ganska mycket alltid visar kommandot jag bara sprang eftersom det kommandot själv har grep inne i den. OK, så alla frågor om vad som helst? Och jag ska föra den över på denna punkt. Förhoppningsvis är detta en trevlig översikt över alla kommandon att du inte behöver ha memorerade, men dessa utgör en fast 95% av vad jag göra på kommandoraden. Tänk också på att kommandoraden själv, är pucklar ett programmeringsspråk, och så när du får till det, du kanske vill göra riktigt komplicerade saker. Och så har saker som loopar och ifs, och alla av dem att du kommer att vänja sig med dina programmeringsspråk. Men det är bortom tillämpningsområdet för detta avsnitt. OK, så inga frågor? ALLISON: Ingen? GABRIEL: Kommer ni att-- ALLISON: Jag kan göra det på min om du vill. Vi kan se vad som händer. ROB BOWDEN: Av till Allison. ALLISON: Woo. Du är en svårt att följa, Rob. Vill du att jag ska byta med dig? Eller du fick, OK. Jag ska försöka att inte riktigt vara så långa där. Låt oss se om detta kommer fungerar som jag vill. Kanske? Haha! Ja. Så jag ska bara snabbt gå genom variabler, loopar, villkorssatser, och lite på kompilatorn. Om du har frågor på helst ska du stoppa mig. Killarna kommer att påminna mig att upprepa din fråga ifall jag glömmer, men bör inte vara så illa. Så variabler, ja. Vi har ingen av er Skrap bitar här. Jag är säker på att de flesta av er, om du hade någon form av spel som du har skapat med Scratch, du hade att hålla reda på något liknande poäng, eller tid, eller något liknande. Så de lysande orange bitar som vi ser det är bara Scratch form variabler, och du kommer definitivt att att med hjälp av variabler hela ditt program. Om du inte är, jag är inte riktigt säker på vad du gör. Men hur som helst, stor sak, definiera variabler. Med C varje variabel har att ha en typ deklareras, så jag gav dig en mycket allmänhet en på toppen. Så du har din typ och sedan vad du bestämmer dig för att ringa din variabel. Så i detta fall, typ i variabellistan. Vi har tre exempel. Char av något klass, av ett A, vilket är vad Jag är säker på att ni alla vill ha att få i denna klass. Du kan definiera flera variabler på en linje så länge de är alla av samma typ, vilket är vårt andra exempel där där du har tre variabler, x, y och z. De är alla flottar. Och då kan du också, i denna sista exempel med int poäng och nummer lag, kan du initiera dem där. Så i mitten exempel där vi bara flyta på x, y och z, de är inte initierats ännu. De har inget värde. Eller de har sopor värden. Och om du försöker och använda dem, kompilatorn kommer att skrika på dig. Du måste både deklarera och initiera variablerna. Så i detta sista, vi gör båda. Vi deklarerar variabler av poäng och antal lag, och vi initiering dem, vilket ger dem deras ursprungliga värden av 7 och 4 respektive. Cool. Alla bra? Grymt. OK, så vissa konventioner. Om ni har läst genom stil 50, dessa är bara saker som vi skulle vilja för dig att genomföra i din stil. Så meningsfulla namn. Om du börjar kalla saker bara x, y och z, särskilt när du kommer in längre program, du är förmodligen kommer att förvirra dig själv och vara som vad är denna variabel hänvisar till. Jag har ingen aning om vad detta innebär. Så om det är tänkt att hålla en poäng, kalla det poäng. Om det är tänkt att hålla några svar eller leda, ge den ett namn som detta. För slingor, som vi kommer att komma in i nästa bild, enstaka brev variabler är bra. ROB BOWDEN: I, j och k är bara konventioner för loopar att alla förväntar sig att kallas i, j och k. Du kan ringa them-- jag ser raden kolumn eller rad samtal ibland två nästlade loopar och det är även typ av standard. Men i och j är fullständigt klarlagd. ALLISON: Ja, i och j du är helt bra. För tydlighetens skull som i vissa av era P-apparater, det kan vara meningsfullt att ha mer beskrivande saker där bara att hålla reda på det. Men jag tror i, j och k tror jag de allra flesta av oss all användning. ROB BOWDEN: Med dessa konventioner, så stil är viktigt. Det är en av de fyra axlarna där du är klassificerade, och det är så lätt att bara gå över din P satt i slutet och se till att att det inte finns stilistiska misstag. Så se till att du tabba korrekt. Se till att dina variabler namnges. Lämna några kommentarer. Det är mycket lätt att få dessa punkter. Du behöver inte tänka på allt i syfte att få dessa punkter. Du behöver inte räkna ut något. Det är bara att göra det ser ganska. ALLISON: Faktum är att vi har stil 50, vilket kommer att tala om var du messing upp om du stöka på stil och kommer att berätta exakt vad du behöver rätta och hur du behöver för att fixa det. Det är också bara bra att nämna att det är kurspolitik att om du är på kontoret timmar och din kod är en enda röra, Vi kan vägra att hjälpa dig tills det ser trevligare. Så börjar rätt, hålla en konsekvent stil, du också bara kommer att göra era liv mycket enklare när du försöker gå igenom felsöka. Om du försöker lista ut där du saknar en klammerparentes och de är överallt, du är bara gör ditt eget liv svårare. Så stämma överens med stil. Jag lovar att det kommer att göra ditt liv enklare. Det kommer att göra våra liv enklare. Alla kommer att vara mycket lyckligare. Och det är vad du vill. GABRIEL: Din klass kommer att vara högre. ALLISON: Ja, och din klass. Om din TF är som du, tenderar att vara gynnsam. Okej, och sedan bara den andra punkten här. Konsekvent initieringar. Så när vi såg, kan du deklarera och initiera saker. Flera variabler på samma linje. En sak som vi vill att ni inte göra är att förklara vissa variabler och inte initiera dem på samma linje som du initierar andra. Så i fall som gjorde meningslöst, Vi har exemplet här där vi förklarar ints i variabler av fjärde Dimes och pennies, men kvartalen och pennies har ingen initialvärde. Vi har inte initierats dem, men rätt i mitten finns vi redan initierats Dimes till 0. Så antingen gör kvartal, Dimes, småpengar. Eller håll lika 0. Dimes motsvara 0. Pennies motsvara 0, eller vad dessa initialvärden är. Stor sak med stil, vara konsekvent. När du är osäker vara konsekvent. Men följ för vår stilguide. Cool. Alla bra där? PUBLIK: Var är stilguide? ALLISON: Stilen guide är on-- vad är hemsidan? GABRIEL: Jag tycker det är manual.cs50.net/-- ALLISON: Style? GABRIEL: Style. Japp. ALLISON: Ja. Så frågan, var är stil 50. manual.cs50.net/style. Ja? PUBLIK: Om vi ​​definierar variabler, är det OK om vi sätter som [OHÖRBAR] som int poäng och sedan int mål. Så skulle du säga att nu har vi fick definiera dem tillsammans? ALLISON: Så fråga bör du har redundant kod När du definierar variabler som int poäng och på nästa rad int spel? ROB BOWDEN: Det finns definitivt fall där redundant kod är dåligt. Jag skulle inte anser att redundant kod. Jag nästan aldrig förklarar flera variabler på samma linje någonsin. Och om något, är det för att brukar jag lämna någon form av kommentar förklarar vad variabeln är till för. Så jag ska säga int poäng snedstreck snedstreck. Håller reda på vad som helst. Totalt snedstreck snedstreck. Så det är mycket grosser på det sättet att sätta dem alla på samma linje. Jag bara aldrig sätta dem på samma rad. ALLISON: Jag tycker det är personliga preferenser på denna punkt. PUBLIK: Betyder det går för för slingor och sånt också? ROB BOWDEN: Like inuti? Liksom int i lika med 0 kommatecken Längden är lika med något? Att du inte har ett val. Med för slingor initieringen part-- så du kanske har bara sett int i är lika med 0 semikolon i mindre än vad semikolon i plus plus. Att int i lika med 0, tekniskt kan du också göra vad vi såg tidigare med kommatecken syntax. int i är lika med 0 kommatecken j är lika med 3 kommatecken k är lika med 5. Du har inte ett val att dela upp att upp i flera rader, och det är standard. Att se det där är bra. ALLISON: Awesome. Tja, bekväm segue i slingor. Så ja, här har vi några exempel av loopar som ni såg i Scratch. Och naturligtvis alla dessa kan bara återskapas i C. Och de i grund och botten gör att du att upprepa några avsnitt av kod tills ett visst villkor är uppfyllt, som vi kommer att komma in rätt efter att ha talat om loopar med villkorssatser. Så vi har tre huvudtyper. För samtidigt, och gör samtidigt, vilket vi alla går igenom just nu. Så första är för slingor. Så för vissa villkor, utföra detta kodblock. Vi har denna coola lilla diagram här längst ned. Men i grund och botten har du i er för att första raden, du kommer att initiera variablerna. Så som vi pratade om, är jag lika med 0 eller i är lika med 10. Oavsett vad du behöver att variabel för att vara det kommer att initieras där, deklareras och initieras till något värde. Så då har vi några tillstånd som händer att kontrollera våra variabel mot något. Så i fallet det typiska fallet där kanske du vill ha den här delen av koden att exekvera fem gånger. Så skulle vi ha int jag är lika med 0, och vi vill att det ska vara när jag är mindre än 5. Så att villkoret är bara kommer att kontrollera att varje gång. Om detta villkor utvärderas till true, det är kommer att köra koden, vilket är precis vad denna lilla diagrammet visar. Och så utför det. Den uppdaterar en variabel, vilket är vad vi ser i den sista delen av vår för loop initiering där. Så det ska bara fortsätta göra det här tills detta villkor inte är uppfyllt, och då kommer det att gå ur slingan och fortsätta går vidare med resten av ditt program. Alla bra där? Cool. Så här är ett exempel, mycket liknande till något jag just pratade om. Så vi vill bara skriva ut Detta är CS50 10 gånger. Så ni ser här har vi vår för, och då är vi initiera variabeln i för att vara lika med 0. Vårt tillstånd kollar att det är mindre än 10. Så utvärderas till sant när vi först start, och sedan uppdaterar vår variabel varje gång att det faktiskt utför och skriver ut detta är CS50. Och kommer att upphöra efter 10 gånger. Cool. Så medan slingorna är upp nästa. Och som ni ser här, vi bara har vissa medan det Skick- fråga? PUBLIK: Hur kan jag hoppa faktiskt bara inte ett nummer, men två siffror [OHÖRBAR] Jag plus plus plus? ALLISON: Så frågan var hur kan du uppdatera din variabel av mer än en åt gången. Så jag plus plus kommer uppdatering av en varje gång. Om du vill uppdatera den genom två, kan du göra mig plus lika med 2. ROB BOWDEN: Har du sett plus jämlikar i föreläsning än? PUBLIK: [OHÖRBAR]. ALLISON: Det är effektivt Samma sak som jag är lika i plus 2. Så det kommer att ta den och uppdatera den med två varje gång. Plus är lika är bara något Vi kallar syntaktisk socker. ROB BOWDEN: Ja, de som finns för ganska mycket alla aritmetiska operatorer. Så i gånger är lika med skulle fördubbla antalet. j klyftan är lika med 3 är densamma som j lika j dividerat med 3. ALLISON: Eller minus lika med 2 skulle eller sänkas i med två varje gång. ROB BOWDEN: Även mod jämlikar. Du har inte sett bitvisa operatörer, men cirkumflex lika och et-tecken är lika, alla dessa existerar. ALLISON: Så många gånger, framför allt med din första par P-apparater, du kommer att förmodligen uppstegning av en, så jag plus plus, j plus plus är alla saker du kommer att typiskt använder. Men att uppdateringsvillkor är helt inom din kontroll. Du kan uppdatera den oavsett steg eller på det sätt du väljer att. Kanske du även vill att det ska vara ett slumptal ibland. Men ja, det finns massor av saker du kan göra med det. Du är inte begränsad till i plus plus. ROB BOWDEN: Bara så ni vet att det finns, det också finns i annan form, plus plus i. Så om du någonsin söka på nätet och råkar se plus plus i, ganska mycket betyder samma sak. ALLISON: Cool. Bra? Grymt. Så medan slingor. Mycket lik. Du har något villkor. Det viktigaste att lägga märke till här är istället för att ha tre olika delar att ställa upp, har vi en. Vi har bara några villkor som är som kontrolleras. Och på samma sätt, så länge att villkoret utvärderas till true, din kod kommer att köras. Och om det är falskt, det kommer att avsluta, flytta till nästa del av ditt program. Så detta är typ av like-- vad ett bra exempel på sökning för vissa normala tillstånd? GABRIEL: Även sant. ALLISON: Du kan göra medan sant. Jo, 1 är lika med 1. ROB BOWDEN: Du kan göra while-- bara istället för att använda en for-loop, Du kan alltid koda en for-loop i en while-slinga, så jag är större än 0 eller medan jag är mindre än 10. ALLISON: Awesome. Och sedan har vi göra medan slingor, som är bra för validering användaren, där du vill få något från ditt användarnamn, se om det är giltigt, och fortsätter sedan därifrån. Så en av de saker att veta är med en göra medan är att det kommer att köra, och så kommer det att åter köra om detta villkor är uppfyllt. Så förmodligen det bästa sättet att göra detta är bara för att se ett exempel här. Så som jag nyss nämnde, användar validering är verkligen useful-- eller gör whiles är verkligen användbart med validering användaren. Så det här är bara att gå att åter uppmana vissa användar tills de kommer in ett positivt tal, som kan vara till nytta för din P set den här veckan. Och så i detta fall, när vi initialt köra programmet, det kommer att skrivas ut ange ett positivt tal. Det kommer att få några inmatning från användaren, och sedan det kommer att kontrollera den ingången mot villkoret att du har angett för det. Så i detta fall det kommer att kontrollera. Det kommer att säga, OK, är vår ingång negativt, eller är det 0 eller negativt, vilket skulle vara ogiltigt. Så då skulle det åter prompt. Fråga? PUBLIK: Är det samma då som en while-slinga om du bara kopierade den koden och satte den [OHÖRBAR] while-slinga? ALLISON: Så fråga skulle denna vara samma som bara en stund loop om vi skulle bara kopiera while-loopen ovan. Så i detta fall, är din while-slinga kommer att kontrollera tillståndet först. Så i detta fall, om vi försökte att skriva som bara en while-slinga, Det skulle säga när ingång är mindre än ett. Men vi har inte en ingång för den. PUBLIK: Om du [OHÖRBAR] while-slinga inklusive denna kod, men då du klarat koden ovanför while-loopen också. Du hade bara denna kod [OHÖRBAR] while-slinga. ALLISON: Det skulle vara samma sak, ja. Så du kan bara write-- istället för att ha en do-- ja. GABRIEL: Men det är mer elegant. ALLISON: Ja, det är mer elegant. Du kan komma in i design och vad inte, men ja, du kan helt göra det. Fler frågor? OK, cool. Så vi har pratat mycket om villkor med alla dessa slingor som vi har, så vi faktiskt komma in förhållandena i booleska uttryck. Återigen, du använder dessa i C, så bara typ av övergång från mer grafiskt gränssnitt att faktiskt kodning. Cool, så stor en, om. I grund och botten bara tillåter oss att införa viss logik i vårt program och kontroll sys villkor. Så i detta fall, OK, är n större än 0? Ja det är, så att du kan utföra detta. Det är bara att kolla lite förutsatt att du har in, vilket jag tror att vi alla är bekväm med att kontrollera villkoren. Cool. Så om annat är din andra, du kan säga OK, om detta är sant, göra det första. Annars vill jag att du standard och göra något annat. Som i det här fallet, du antingen välja en positivt tal eller ett negativt tal. Du har bara två alternativ. Du behöver den för att utföra oberoende vad dina användaringångar. Så du kan säga ja, är det som är större än 0? Cool. Skriv ett positivt tal. Om det inte är, skriva ut en negativ. Alla bra? Och så en sak att förstå är att, om den, om villkoret är uppfyllt, else kommer aldrig också genomföra. Endast en av dessa kommer att exekvera i taget. Så det är en avvägning. Du får inte ha båda. Du har antingen det första villkoret. Du har antingen om eller annat, inte båda. Som sedan kan göra saker ännu mer komplicerat, eftersom du kan göra om, annars är det, och sedan annanstans. Så i detta fall, vi har tre villkor. Och återigen, är endast en av dessa kommer att hamna avrättas. Så du kanske undrar ja, vad händer om du har något som kan möta två av dessa. Kanske vad du än matar in uppfyller både villkoret ty om och else if. Endast sak som kommer att köra ALLISON: Så fort den hittar något att den uppfyller de villkor för att utvärderas till true, är vad som det kommer att springa och inget annat. Så om du hade det här numret mellan 0 och 5 för din första, eller är detta nummer mellan 3 och 5 för annat om en del, och du anger number-- Jag sa 0 och 5 och-- 4. Det kommer att drabba den första. Det kommer att säga OK, detta nummer är mellan 0 och 5. Kör och lämna. Det kommer aldrig att träffa den andra alternativet. Cool? Grymt. OK vi också switch-satser om du vill få ännu more-- eller ledsen, omkopplaren är nästa. Jag får framför mig här. Återigen, multipel om block där som jag just sa är så fort du hittar ett villkor som är uppfyllda och en if else if annat, det lämnar. Om du behöver kontrollera flera saker, du är kommer att vilja använda detta eftersom Det kommer att kontrollera varje gång här. Så det här kommer att gå genom, och om det är större än eller lika med 90, det kommer att skriva ut det. Och det kommer att gå igenom och kontrollera varenda en av dem. PUBLIK: Så detta skulle vara mer buggig än [OHÖRBAR]. Skulle det vara som [OHÖRBAR]? ALLISON: Frågan är skulle detta vara buggy eller gör detta göra vad du vill. Det beror egentligen på vad du vill från ditt program. PUBLIK: Jag menar som om du sätter 90 i. ALLISON: Om du sätter 90-- PUBLIK: [OHÖRBAR]. GABRIEL: Du kommer att få två saker. ALLISON: Du kommer att få två saker. Ja, två. ROB BOWDEN: Two? ALLISON: Nej. ROB BOWDEN: Fyra. Om du sätter 90, det kommer att säga att du fick ett A, du fick ett B, du fick ett C, du fick en D. PUBLIK: [OHÖRBAR]. ALLISON: Höger. Så jag beror på vad du vill ha från dig program. Ibland behöver du kontrollera flera saker. Du får mycket djupare in i vad god design är som du går framåt. Det viktiga att inser är att detta kommer att kontrollera alla fyra villkoren här. Medan om det var en om annars om annat om annars skulle det drabba det första fallet, Det skulle skriva ut att du fick ett A och göras. ROB BOWDEN: Även om vi beslutat att ändra det till om och större än eller lika med 90, om och större än eller lika med 80, och mindre än eller lika med 89, om n är större än eller lika med 70, och n är mindre än eller lika med 79, så det kommer att vara korrekt. Det kommer att göra vad vi vill, men det fortfarande kontrollerar varenda det. Så medan man i det första scenariot, om vi ange 90 med bara om annars om annars om, och vi går in i 90, sedan det kommer att rätta till. Det kommer att kontrollera den första en, skriv ut du fick ett A, hoppa allt, eftersom det redan hittat en som fungerar. Samtliga fall är ömsesidigt uteslutande baserat på om else if else if. Så det kommer att utföra först om, då är det gjort. Det kommer att gå till slutet. Medan om vi ändrar detta är vad jag var säga med mindre än eller lika med 89. Det kommer att kontrollera den första. Det kommer att skrivas ut. Det kommer att kontrollera den andra. Det kommer inte att skriva ut. Kontrollera den tredje. Kommer inte att skriva ut. Kontrollera fjärde. Nu tryckningen. Så i det fallet, det annars om version, eftersom dessa fall utesluter varandra, det är bättre användning om annars om annars om, eftersom det kommer att ha färre kontroller av villkoren än denna version. ALLISON: Awesome. Så en annan sak som vi kan gör är switch uttalanden. I grund och botten en switch uttalande tar i någon variabel, i detta fall det är n, och avgör vilket fall att utföra. Så det här är också en där dina ärenden bör vara typ av ömsesidigt uteslutande. Så i detta fall, om vi att vi får en etta, det är kommer att matcha vad det variable-- oavsett värdet på n är att ett av dessa fall, så 1, 2, eller 3, och skriva ut motsvarande rad. Och sedan om du märker här, Vi har också en standard, som du kan för att tänka på som din andra. Så om du väljer ett annat nummer förutom 1, 2, och 3 i det här fallet det är bara att skriva ut ogiltig. Avgöra när man ska använda IFS kontra om annans kontra omkopplarna går vara något som ni kommer att se utforma klok som du börjar skriva mer komplicerade program, och det finns inga fasta regler om när du ska använda dem. Det beror egentligen på din sammanhang. ROB BOWDEN: Och bara att kasta ut den där eftersom den är mer bekväm sektion. Switchar, tenderar de att be-- så du är begränsad i antalet sätt du kan använda dem, eftersom ifs, tillståndet kan vara ganska mycket vad du vill. Med omkopplare fallen måste vara siffror, eller tekniskt de kan vara tecken, men tecken, som vi får se, är bara siffror. Så de måste vara siffror, men växlar är verkligen mer effektiva än om annars om annars om, eftersom även tar exemplet before-- bra, betyget exemplet verkar bra. Bra låt oss säga här, vi i stället göra detta som en if else if else if scenario. Så om n är lika är lika med 1, skriva ut du plockat en låg siffra. Om annars om n är lika med är lika med 2, du plockat ett medium nummer. Annars om jämlikar lika 3, hög. Else ogiltig. Så låt oss säga att det var vårt scenario. Så låt oss säga att vi anger 4, så vi förväntar oss ogiltig. Det sätt som om det annars om annat om tillvägagångssätt kommer att fungera är kontrollerar det första villkoret. Det är inte nöjd. Så kontrollerar vi det andra villkoret. Det är inte nöjd. Kontrollera det tredje villkoret. Inte nöjd. Så vi går till annat och skriva ut ogiltig. Det sätt switchen fungerar är det samman ner i vad vi ska att ringa ett hopp tabell. Huvudtanken varelse att när du anger 4, Det kan omedelbart gå till standard. Det behöver inte kontrollera am I fall 1? Nej det är inte det. Fall 2? Nope. Fall 3? Nope. Default. OK, måste detta vara där jag vill, och sedan köra det. Nej, omedelbart hoppar den till standard. Eller det jag skriver 2, det omedelbart kommer att gå till 2 utan att behöva gå igenom fallet 1. Så på det sättet, realistiskt nuförtiden som är inte så mycket av en effektivitetsvinst. Vanligtvis datorer är ganska snabbt, och det är inte så bra. Men det är så att switchar är snabbare. Om du verkligen försöker att optimera, använd en switch. ALLISON: Cool. Och då har vi ternära operatör. Så jag vet att jag nämnde tidigare ordet syntaktiska socker. Så det är bara saker som gör din kod mycket mer koncis. Så det här är ett av dessa fall. Så ternära operatör är frågetecken kolon som vi ser i linje string s är lika med n större än 100 frågetecken hög kolon låg. Så i princip hur detta fungerar är det n är större än 100 är ett tillstånd. Så jag tror att det kan vara meningsfullt. Det är som att ställa en fråga. Det säger oh, är n större än 100. Vem vet? Och om det beräknas till sant, det kommer att ge dig det första som är upptagna där, vilket är högt. Annars det kommer att ge dig låg. Så det här är bara en riktigt enkel och effektivt sätt att göra som en om annat. Det är allt det är. Och om vi skulle skriva detta som om annat villkorat, det skulle vara om n är större än 100, returnera hög. Else, retur låg. Detta är bara ett mycket mer koncist sätt att skriva det. ROB BOWDEN: Så det här exemplet är när du gör något så här, är detta mönstret där jag använder ternära väldigt ofta. Så vi har inte talat om omfattningen ännu, men jag hatar att se sträng s semikolon. Om n är större än 100, är ​​lika med s höga. Else, lika s låga. Så detta mönster, dessa fem rader av kod bokstavligen 100% av tiden kan överföras till vad var uppe med en ternär. Så ternära, en rad kod. Den om annat, fem. Det är ett exempel som jag pekar ut varenda gång. Detta skulle bra ställe för ett ternärt operatör. Det är så ren. Men människor tenderar att aldrig använda den. ALLISON: Ta bort Gabe. GABRIEL: Så nu ni alla lärt sig i föreläsning den här veckan att allt i ett Datorn är binärt, eller hur? Precis som lamporna här. Du kan antingen slås på och av. Och efter allt, jag menar bokstavligen allt. Vissa siffror och tecken och strängar, och till och med den kod som du skriver när det blir kompileras till maskinkod kod och sånt, så det hela handlar om att 0: s och 1 ". Och så när vi har att göra med heltal, vilket är något som är tekniskt mycket enkelt, borde vi kunna göra saker som att lägga dem, vilket är förmodligen en av de enklaste saker du kan göra för två heltal, eller hur? Så addition och subtraktion fungerar precis som det fungerar i decimalform, utom här är det binärt, eller hur? Så det är i basen två. Så tillsätt 1 plus 1. Det ger 0 och 1 bär över. Och bara fortsätta att göra det, så nu desto mer intressant fråga. Vi vet hur man representera alla positiva heltal i datorn, men låt oss göra detta till en övning. Låtsas att ni är alla 1960 eller något som försöker skapa en dator, och du har att komma med ett sätt att lagra minus 1, till exempel, eller minus någon heltal för den delen. Hur skulle du göra det? Några idéer? Bara kasta något på mig. Ja? PUBLIK: [OHÖRBAR] utse ett särskilt om din [OHÖRBAR]. GABRIEL: Du kan ange en särskild bit, som kommer att vara 0 eller 1. Låt oss säga att en om det är positivt och 0 om det är negativt. Och sedan resten av bit bara för att lagra numret. Cool. Så det är en mycket bra idé. Vi har, jag vet inte, 200. Och om den första biten är påslagen, då är det plus 200. Om den är avstängd, är det minus 200. Cool. Det finns bara en liten Problemet med detta, vilket är om vi försöker sammanfatta saker. Så tänk att vi har 11111 här, och vi summera detta med 00100 vad som helst. Om dessa två är positivt, det är bra. Men om någon av dem är negativ, precis som låt oss säga att denna bit här är den som är ansvarig for-- Jag ska göra en separate-- så detta innebär att antalet här är positivt. Detta innebär att denna nummer här är negativt, eller hur? Men sen när du är kommer att sammanfatta dem, du behöver en if-sats säger oh om detta är 0, då min summa blir något annorlunda, eller hur? Så det finns en något smartare sätt att göra att, som kallas två-komplement. Så i princip vad vi göra är att vi definierar minus 1 att vara det som om Vi lägger upp till 1 ger oss 0. Låt mig upprepa det. Så låt oss säga att det här är 1. Vad är det som naturligt i positiva heltal läggs till som ger oss 0? Vad händer om vi försöker lägga till det här numret? Vi kommer att have-- OK, så låt oss lägga till. Vi kommer att ha 1 plus 1 är 0, och sedan bär över. Och sedan ska vi få 0 igen. Jag börjar bli förvirrad. Och du kommer att få 0 och 0 och 0 och 0 och 0 och 0. Massor av 0-talet. Vid den allra sista, vi är inte kommer att kunna bära den över, eftersom låt oss säga att vi bara handlar med en byte, så endast 8 bitar. Så vad datorn gör som standard är bara glömmer att [OHÖRBAR] OK? Så detta är vad som kallas tvåkomplementet. Vi definierar bara minus 1 för att vara sak här att om du lägger det till 1 skulle ge dig 0. Och det är ganska coolt eftersom vi inte riktigt behöver sent för att genomföra en annan typ av summan beroende på om det är en negativt eller ett positivt tal. Är det vettigt? Så en sak som vi gör här för att omvandla mellan en positiv och en negativ heltal sedan vända vi allt, och då kan vi lägga till 1 till det numret. Om du försöker göra det själv på en bit papper, du kommer att se att är vettigt. Men om jag tar detta nummer Här är det fem. Så om jag vänder allt här, så 1, 1, 1, 1, 1. Flip, flip, flip. Och då jag till 1 till det. Jag kommer att ha exakt minus 5. OK? Detta gör slags känsla för om du försöker att sammanfatta detta med att antalet att vi hade tidigare, vilket was-- låt oss vända detta igen. Det var 101 och massor av 0-talet. Om du försöker lägga till dessa två nummer tillsammans, du kommer att få exakt 0. OK. Några frågor? PUBLIK: [OHÖRBAR] GABRIEL: Vad menar du? PUBLIK: Negativ till positiv [OHÖRBAR]. GABRIEL: Nej, du vänder och du lägger 1 alltid. Yeah. OK, så tecken kodas också binärer. Vi har ASCII tabell, som ni också såg i föreläsning, eller hur? Så det är i grunden en kartläggning av saker. Och här kan jag inte nog betona att för en dator, en och 65 är bokstavligen samma sak. Så om jag skriver något i stil med char c är lika med ett, jag kunde samtidigt bara skriva 65 här, och det skulle vara exakt samma, OK? Det finns ingen skillnad alls. Vi tenderar oftast att sätta tecken i variabler av typen. Char, inte för att de är i stort sett gjord för det, men eftersom av humant konvention. Men du kan bara ta itu med heltal istället för variabler av typen char, och du ska vara bra. Den enda egentliga skillnaden mellan en char c och en int i är att en int har fyra byte i de flesta system, medan en röding har en byte. De är i huvudsak Samma sak när det gäller data. Så vad kommer att skriva här? Här vi skriver ut en siffra med hjälp av printf med ett plus 1, och precis som heltal, tecken kan summeras, så tecken kan också summeras. Så det här är exakt 65. Så det kommer att bli 66, och här har vi 65 plus lite minus stor A, som kommer att vara, vet jag inte riktigt vet. Men det kommer att vara precis gapet mellan versaler och och mindre bokstäver, så Vi kommer att få liten, eller hur? Yeah. Så detta kommer att skriva ut en karaktär vilket är exakt det här. Bra? Några frågor? Här har vi ett gäng olika typer för numeriska variabler. Vi pratar redan om int. Float är bara ett sätt att-- detta verkligen roligt, för när jag först lärde mig att programmera tillbaka i dag med Python, det första program jag någonsin försökt skriva, jag såg att det fanns en typ som kallas in och en typ som kallas float. Och flottören var för alla reella tal. Så då frågade jag varför ska Jag någonsin använda en int då? För om jag kan använda alla reella tal med en flottör, Jag skulle bara sluta använda ints, eller hur? Eftersom reella tal är ungefär som mer generiska. Det visar sig att detta är inte fallet i datorer eftersom de är i huvudsak olika saker. Så heltal och flyter, den verksamhet som du gör med dem är väsentligt annorlunda, eftersom av det sätt som de lagras, OK? Vi ska prata lite lite mer om det i en sekund. Så dubbel är bara en större flyta. Vanligtvis i de flesta system, en flottör är fyra byte, precis som en int. Och en dubbel är åtta byte. En lång lång är egentligen bara en symbol att du lägger till en typ som int. Du säger lång lång int så här. Lång lång int x för att göra det längre. Så i de flesta system kommer att ge åtta byte i stället för de vanliga fyra. Och du kan faktiskt släppa in, så det kan bara säga lång lång, och det fungerar också, OK? Du kan också göra andra saker som unsigned int, eller igen bara osignerade skulle också fungera. Och det skulle göra x vara en variabel som allt är positivt, så du kan inte riktigt få negativa siffror på det sätt som vi såg här uppe. Så efter underbart flyttal och precision. Det är en av anledningarna till att du vill använda ints istället för flottar, eftersom ints är 100% exakt, eller hur? Det är precis det numret. För flytande punkter, om du säga svaret är lika med ett över 10-- Jag råkar ha denna specifika program här, float.c. Som skriver ut till 20 decimaler. 1 dividerat med 10, och att vanligtvis är 0,1, eller hur? Men här om vi gör flyta och då vi kör det, Vi ser att det inte är exakt 0,1. Det är 0,149 någonting. Och varför är det? Eftersom du inte riktigt kan representera alla enda möjliga reella tal i minnet eftersom det finns uncountably många av dem. Så vi är tekniskt bara kan representera en ändlig mängd av dem med en begränsad mängd data. Men det är riktigt intressant. Nu tigger frågan om hur man skulle gå representera detta med bitar, eller hur? Så hur är flöten lagras? Med heltal var det lätt. Men med flöten som du vill att maximera utbudet, och du vill kunna representera stora mängder och mycket små siffror som 0.000001 samtidigt. Så återigen, samma spel. Har någon någon aning om hur vi skulle kunna gå representera flyta i minnet? Bara kasta något. Ja, tack. PUBLIK: [OHÖRBAR] som om det var två ints och en är den [OHÖRBAR] och en varelse allt efter decimalkommat. GABRIEL: OK, cool. Så två olika heltal. Du kan ha 12.45, så det är 12 och 45. Nice. Vad ere du ska säga? Samma sak? Yeah? PUBLIK: [OHÖRBAR] notation där du separera basen. GABRIEL: Vetenskaplig notation, ja det är oftast vad som händer. Så detta är vad som kallas mantissan. Det är vad är egentligen det nummer, och sedan exponenten är precis där kommatecknet är, eller hur? Så detta kommer att bli något av formen 1, 2, 3, 4, 5 gånger 10 till minus 4. Jag insåg that-- ja, exakt. Och då detta 10 till minus 4 är kommer att definiera var kommatecknet är, OK? I Brasilien använder vi kommatecken. Här ni använda en prick. Så en prick. Och det här är coolt, för då kan du fokusera massor av dina bitar på den här killen Här, på mantissan och då är kommer att vara din faktiska precision. Och du kan göra detta antingen i decimal eller i det binära baserade systemet. Det finns olika sätt att genomföra detta. Frågor? Ja? PUBLIK: Hur många platser efter decimal [OHÖRBAR]? GABRIEL: Det är en komplicerad fråga, eftersom det är aldrig riktigt 100% exakt, för som ni ser här, för några siffror är det 100% exakt. Jag tror att om vi sätter 0.5 här, det kommer att bli 100% exakt. Det kommer att bli 0,500000. Så i det fallet, det är perfekt. Men i andra fall, det är mycket mindre perfekt. Enligt min erfarenhet, som upp till fyra, fem decimaler är ganska exakt. Om du använder en dubbel, det kommer att vara mycket mer exakt än så, okej? ROB BOWDEN: Så bara för att kasta lite mer sammanhang på flottar, Jag minns aldrig 100% hur spec av flottar faktiskt fungerar, men jag tror du alltid att minnas att flottörerna börjar få rörigt. Så tanken är att när du blir riktigt, riktigt stora siffror eller riktigt, riktigt litet antal, vi börjar blir värre och värre till att differentiera mellan två nära flyter. Så hur jag gillar att tänka på är med flyttal vaghet, det finns två flottörer som om jag försöker ange dem i C, trots det faktum att de är olika nummer, de kommer att bli tolkas som samma nummer, eftersom vi inte kan lagra dem på olika sätt. Vi måste använda samma bitar. Och så när vi kommer till riktigt, riktigt stort antal, pratar som 10 till 300 eller någonting, det är på den punkten att 10 till 300 eller 5 gånger 10 till 300 kan inte särskiljas från 7 gånger 10 till 300. Så det är en ganska stor skillnad mellan de två numren. Men sen när man kommer ner till det normala intervallet saker, du tenderar att vara ganska bra på att differentiera. Och sedan när du kommer ner riktigt små, du också få ganska dåligt igen. Så som ett helt gäng 0.0000, blir det ganska dåligt. GABRIEL: Ja, så en snabb anteckning. Aldrig göra detta. Försök aldrig att jämföra flyter använder jämlikar är lika, eftersom även om de är nästan samma, nästan samma är inte detsamma. Så vad du brukar göra är du subtraherar dem, ta det absoluta värdet av det, och se om det är mindre än 0,0001 eller något liknande, OK? Och cool. Jag vet att många människor har någon bakgrund i Java, särskilt de som gjorde AP datavetenskap, eller hur? Och Java är ett språk som till största delen bygger på C, den har ett par mycket stora skillnader. Men för loopar och ifs, och sånt att de är alla samma syntax. Jag har några program för att visa detta. Så till exempel, ett enkelt hello world. Detta är hallå världen i C, som du killar är definitivt bekant med, och detta och detta är i Java. Så i Java har vi här public class, hallå världen, och public static void viktigaste, och stråk args. De sträng args går att visas i C inom kort. Men låt oss inte gå dit än. Just nu har vi tomrum här, vilket innebär det viktigaste är inte att ta några argument. Och så har vi System.out.println, är det, och att typ av motsvarande för printf. Här har vi inte verkligen behöver det omvända snedstrecket n eftersom utskrifts ln gör det åt dig. Det lägger till bakstreck n vid slutet av linjen. Men om du går in i något som en för, dig kan se att de är ungefär samma sak. Så initiering, och skick, och uppdatering är-- Jag missade en plats här-- de är ungefär samma sak, utom Java har som några fler hög nivå grejer. Här kan vi göra plus att jag och Java automatiskt gör det jag här, vilket är ett heltal, till en sträng, och sedan lägga den två strängar tillsammans. Här i C behöver vi göra &% d. Linjen här, det för ser exakt likadan ut. Och om vi tittar på om de ifs även ser exakt likadan ut, eller hur? Så de verkliga stora skillnaderna är i de saker som du ser här. Public static, tomrum, och då offentliga klass om. Så Java har vad är kallas en virtuell maskin. Och det är väldigt mycket baserat på vad kallas objektorienterad programmering, vilket är en mycket, mycket vanligt paradigm för programmering nuförtiden. Och denna klass sak är vad du ser, något från objektorientering, är du skapa en klass och sedan kan härleda föremål från den klassen. Vi ska inte prata för mycket om det i CS50, men det är definitivt något riktigt coolt, speciellt om du vill gå in mer sofistikerade webbutveckling vid slutet av banan, som skickar din slutgiltiga projektet och några trevliga ramar och grejer. Så i princip tanken är att du vill inte att åter genomföra någonting, så du skapar något som är mycket generiska, liksom formen, och sedan skapa former från det, och sedan från var och en av dessa former, skapar du några mer specifika former i tre dimensioner eller nåt sånt. Och de har denna hierarki som de ärva från de andra, så alla funktioner och alla variabler som den stora formen här har, alla dessa kommer att få, och alla dessa är kommer att ha, och så vidare och så vidare. Så det är den grundläggande idén. C har inte det, men C ++ har den typen av inslag. Och Java är starkt påverkad av objektorientering, så det är därför du ser klass här hela tiden. Och den andra är Detta Java Virtual Machine. Så det här, tror jag, är en mycket smart idé. Så vad folk som uppfann java gjorde är De ville inte kompilera sin kod två gånger om de var tvungna att köra den i en Windows, eller en Mac eller Linux, så vad de gör är de bokstavligen kör något liknande apparaten, men du egentligen inte se det hända. Så de kör en virtuell maskin i datorn, vilket är i princip som en mini operativsystem. Och att rörelse systemets syfte i livet är bara att köra vad som kallas bytekod. Så i stället för i C, hur vi skulle sammanställa denna är att göra om, och sedan köra ./if. Jag glömde det omvända snedstrecket i. I Java, skulle du göra först Java C för att kompilera den, if.c. Det är inte C. Det är dot java. Och då måste man köra inte ./. Du får den nya filen if.class, men du kan inte riktigt körda if.class nu bara som vi gjorde förr. Det här är inte en körbar. Du måste köra. Du måste mata in det i ett program som heter Java, och att programmet är den virtuella maskinen, och sedan gör du if.class, eller om. Ja. Och så det fungerar. OK så detta är typ av virtuell maskin som händer. C inte har det, så om jag skulle sätta detta program i en Windows-maskin, det skulle inte fungera i C. I Java den gör. Frågor? Cool. Det är om du av super avsnitt för idag.