[MUSIK SPELA] DAVID MALAN: Hej, alla. Detta är CS50: s supersection. Tilldelade Sektioner kommer inte start för en vecka. Och så idag, jag är här with-- MARIA: Maria. DAVID MALAN: --to faktiskt ta en titt på problem ställa in ett, kursens första veckorna av material, få dig orienterad med CS50 IDE, lite Linux, det operativsystem som är körs på IDE, samt titta på några av övergången från Scratch C ledande upp till problembild en. Så utan vidare, i problembild en, du kommer att vara presenterad för CS50 IDE, som Detta webbaserade programmering miljö som vi använder för att skriva program. Det har utformats för att se mycket påminner om en typisk dator system som kör ett operativsystem system som kallas Linux. Men det är i så kallade molnet, vilket innebär att alla i klassen kan faktiskt ha hans eller hennes egen räkning och använda det, liksom. Så de flesta av er har förmodligen aldrig använt en Linuxmiljö före eller kanske även en kommandorad miljö. Och en kommandorad miljön är annorlunda. Det är all text. Det är alla tangentbordskommandon. Och det är ingen Mousing, inga ikoner, ingen dialog fönster, inga menyer. Det är rent text. Så i början, det slags av känns som ett steg bakåt i fråga om finess. Men det slutar upp att vara en hel del mer kraftfull, förvisso, för datavetare, i slutändan. Så låt oss ta en titt. Här är jag på CS50.io, via vilken du kan logga in på CS50 IDE. Och ungefär som i Scratch, det finns tre huvudområden till den här skärmen. Så på vänster sida, vi har vad blir filhanteraren. Och det finns denna mapp på topp, som är just nu tom eftersom jag blev av alla mina filer innan supersection. Och det är där vi ska Spara C-filer som vi skriver. Längst upp till höger, har vi en plats där all vår kod kommer att bli skriven. Och faktiskt, om jag klickar på den här plus, detta kommer att låta mig välja Ny fil. Och här kan jag börja skriva C-kod eller, verkligen, ett antal andra språk. Och sedan i botten där det säger jharvard @ ide50-- och din vilja säga något lite different-- vad detta kallas? Terminalfönster. Ja. Så terminalfönstret är den så kallade kommandorad gränssnitt som du kan interagera med det underliggande operativsystemet. Och nu ska vi till gör mycket liten nytta av this-- bara för att sammanställa, för att titta på felmeddelanden som vi ser, och att köra våra program. Men i slutändan kommer vi att göra så mycket mer, liksom. Och du kan även installera program och administrera din arbetsyta inom CS50 IDE, liksom. Men mer om det en annan gång. Så låt oss gå vidare och skriva ett mycket enkelt program bara att gå igenom en uppvärmning av hej.c, som kanske är det enklaste program som vi kan skriva. Jag har redan öppnat en ny flik. Jag kommer att gå vidare och säga innehålla standard io.h. Sedan int main (void). Och sedan printf ("hello, world" bakstreck n, nära citationstecken, nära parenteser och semikolon. Okej. Så nu märker mitt fönster är untitled. Så jag väldigt snabbt gå att gå upp till Arkiv, Spara. Och det är viktigt att Jag kallar det inte "Hej." Så en mycket vanligt misstag, särskilt i problembild en, är att misstag bara ringa upp din programmet "vatten" eller "giriga" eller "Mario" eller "kredit" eller liknande. Men du verkligen vill göra att du har filändelsen eftersom det är det enda sättet att kompilatorn och även kodeditorn vet att du är faktiskt skriva C-kod. Så låt mig gå vidare och klicka på Spara. Och nu också, vad CS50 IDE har gjort för oss är det också syntax markerat allt. Så det har gjort allt mycket färgglada. Och hela syftet med som inte fungerar. Det är bara att dra mina ögon till konceptuellt olika delar av detta program. Så låt oss gå vidare och sammanställa denna. Och jag kan sammanställa denna i ett par olika sätt. Och i vecka ett, den old-school sätt som vi gjorde Det var bokstavligen på kommandot line-- "klang hej.c." Och då jag trycker på Retur. Och ingenting verkar hända i terminalfönstret. Men vad gjorde förändringar i IDE? Om igen, IDE betyder bara Integrerad utvecklingsmiljö. Det är ett fint sätt att säga denna integrerade utveckling miljö för att utveckla programvara. Så vad gjorde förändringar i användargränssnittet? Vad gjorde du märker som är annorlunda, Maria? MARIA: Jag märkte något under IDE50 mapp upp här. DAVID MALAN: Ja. Så här uppe, inte bara vi har "hej.c." Vi har också "a.out", som är typ av en dum namn för ett program. Men i själva verket är det standardnamn för en programmet när du bara kompilera din kod och inte tala om för kompilatorn vilken fil till utgång. Så om jag vill köra, jag måste tala om compiler-- eller rättare sagt, jag behöver berätta arbetsytan som jag vill köra program som kallas "a.out." Ange. Och det finns "hej, värld. "nu" ./ ". är faktiskt viktigt. Även om normalt bara vi skriva namnen på kommandon, när det är ett program som du har skriftligt, vill du säga "./" eftersom det uttryckligen talar om Linux att du vill köra ett program som heter "a.out" det är i det här, där dot innebär denna katalog att jag är för närvarande i, vilket råkar vara kallad arbetsyta "a.out. För om jag sa bara "a.out" Enter, Jag kommer att få "a.out kommandot inte hittade "eftersom computer-- eftersom jag uppfann "a.out;" Det kom inte med computer-- inte vet var du ska leta efter det, även om det är rätt under min näsa, så att säga. OK. Så vi kan ändra det till vara "klang -o hej hej.c." Och om jag slog in, vilket program kommer detta att utgång för mig? Vad är namnet på filen? Ja, på baksidan. Det är rätt. "Hallå." Så "hello" kommer att vara namnet på programmet eftersom vi har använt en så kallad kommandoraden argument, som är bara ett sätt att ändra beteende kompilatorn faktiskt utgång ett specifikt filnamn. Och faktiskt, om jag zooma ut och titta upp här, nu har jag inte bara "a.out" och "hej.c", men även "Hej," liksom. Så nu kan jag göra "./hello," Enter. Och det finns "Hello, World." Men lastly-- och detta kommer nu att konventionen vi använder hela termin, typically-- är du kan också bara säga "gör hej." Och faktiskt, det säger det är upp hittills, eftersom det redan finns. Låt mig gå vidare och ta bort, med rm kommandot, både "a.out" - och säga "ta bort vanlig fil a.out?" Det betyder bara, är du säker på att du vill ta bort det? Jag kommer att säga ja. Och sedan kommer jag att ta bort "Hej", men inte "hej.c." Jag kommer att säga "ja" explicit, men "y" är tillräcklig, liksom. Och nu märker om jag skriver ls-- som minns, innebär list-- det listar alla av filerna i min mapp. Och faktiskt, om jag zooma ut och titta på övre vänstra, Det bekräftar att det är i denna mapp, även om det är märkt som IDE50 upp här och inte arbetsyta, det är bara "hej.c." Så nu här nere, om jag gör "make hello," Enter, nu ser jag en mycket längre kommando men en mer sofistikerade kommando som händer att vara användbara i de kommande veckorna. Och nu kan jag säga "./hello." Så låt oss ta en snabb rundtur någon annan Linux-kommandon. Varför tar vi inte ett steg tillbaka och faktiskt titta på C mer allmänhet, övergår från Scratch C, och sedan avslutas med en blick vid det första problemet som i C. Okej. Så jag kommer att gå vidare och bara ren upp min arbetsyta med kontroll-L bara att hålla skärmen ren. Men det har ingen funktionell påverka något annat. Minns att vi har sett några kommandon nu. Så vi har sett klang, som i allmänhet du kommer inte att köra manuellt längre. Vi ska istället använda make. Men vi såg även ls, som visar en lista över filerna i min katalog. Och nu varför är there-- det är två filer nu, "hej" och "hej.c." Varför finns det en stjärna eller en asterisk efter "hej"? Vad gjorde att betyda, baserat på vad vi såg i veckan en? Vad tror du? Vad gör stjärnan betyda? MARIA: For-- programmet "hello"? DAVID MALAN: "Hej *". Ja. Oh, ja? Åh, körbar. Det är rätt. Så det innebär att "hello" är körbar. Så ja, det är därför Jag kan göra "./hello." Okej. Så vad mer kan jag göra här? Tja, visar det sig att jag kan även skapa kataloger. Så låt mig gå vidare och skapa, exempelvis en "pset1" katalogen. Och problemet specifikations kommer att få dig att göra just detta, så att du inte behöver komma ihåg i dag. Men "mkdir pset1" verkar ha någon inverkan. Men återigen, inget felmeddelande är i allmänhet en bra sak. Så om jag skriver "ls" now-- ah, nu Jag har en körbar fil som heter "Hej", en C-fil som heter "hej.c." Och sedan snedstreck, så att tala, innebär att detta är en katalog. Så ja, nu vill jag öppna det. Och jag tror inte dubbelklicka på det som i ett GUI, en grafisk miljö. Jag istället säga "cd pset1." Ange. Inget intressant verkar ha hände utom min lilla prompten här-- detta är Linux sätt att påminna mig där jag är, så vad mappen är öppen. Det är bara talar om för mig uttryckligen i motsats till grafiskt. Och om jag skriver "ls" varför jag ser en annan uppmana omedelbart, tror du, när jag visa innehållet i pset1? MARIA: Du behöver antagligen inte har något där inne. DAVID MALAN: Ja. Så då har vi uppenbarligen inte skapade något i det eftersom jag just skapade katalogen. Nu, om jag ville skapa en file-- för Exempelvis kunde jag skapa en ny fil. Och då kunde jag gå till Spara och spara den som, som "mario.c" om du gör standardversionen av pset en. Och sedan, precis som alla Mac eller PC, bara Välj mappen "pset1, Spara. Och nu filen är tom. Men låt oss zooma in igen för en sekund. Låt oss göra ls här. Nu ser vi "mario.c". Så det finns några andra kommandon som är värt att hålla i minnet över time-- klar, eller Ctrl-L är vad jag har varit slår; mkdir vi har sett; rm vi har sett, liksom, som är för att ta bort eller radera en fil. Akta dig kan also-- och om du tittar på online tutorials, kommer du rm -rf är ett mycket vanligt sätt att säga ta bort en mapp som har saker i den. Bara vara super, super försiktig. -rf betyder rekursivt bort vad det är du försöker ta bort och våld ta bort den. Så rekursiva medel om det är en mapp med en mapp med en mapp med en mapp, radera dem alla. Och våld innebär inte ens frågar mig ja eller nej, jag säker? Så det är en super farlig sätt radera massor av saker snabbt. Men beware-- alltför ofta gör en orädd elev av misstag raderar, säg, pset en, till exempel. MARIA: Och om de bara gör -r, kommer de att be dem om varje enskild fil. DAVID MALAN: Vilket är måttligt irriterande. MARIA: Ja. DAVID MALAN: Så det är därför så många av oss, ingår själv, är i vanan att använda -rf. Men det är farligt. Så köparen akta. Och då mv är typ av intressant namngivna. Så detta är kommandot flytta, vilket känns lite konstigt eftersom du verkligen kan använda den för att flytta filer från en plats till en annan. Till exempel, antar att jag trasslat till. Antag att jag skapade en ny fil för pset. Och jag sparat den som "greedy.c." Men antar att jag av misstag spara den i IDE50-- så i min arbetsyta själv och inte i pset1. Du kan se så mycket uppe till vänster. Det finns "greedy.c." Och det finns några lösningar. Så en, kan jag använda super användarvänligt sätt för att bara dra och släppa den. Och det skulle faktiskt åtgärda problemet. Men i dag, vi försöker titta på de mer svårbegripliga men kraftfulla sätt att göra detta. Så låt mig ta "ls" i pset1. Och jag bara se "mario.c." Låt mig gå vidare och göra "cd ..". Så CD igen är förändring katalog. ".." Betyder vad, men? Förra gången jag sa "cd pset1 "att gå in pset1. Så när jag säger "cd ..", vad gör jag? Bakåt. Ja. Så det kommer att den så kallade överordnade. Gå en nivå upp, som spännande ur en mapp. Så Enter. Och faktiskt, ser vad det gjorde. Det berörde mig bara till arbetsytan istället av in pset1, som är i arbetsutrymmet. Och nu om jag skriver "ls", det finns en hel del saker. Där finns "greedy.c". Så nu vill jag använda mv att bokstavligen flytta "greedy.c" i pset1. Och så en hel del Linux-kommandon fungerar precis så här. De tar inga argument eller de tar en argument eller de tar två kommandorad argument och så vidare. Och i det här fallet, är det bokstavligen göra vad det står, om än succinctly-- flytta greedy.c in pset1. Ange. Ingenting verkar hända. Men om jag gör en ls igen, giriga är borta. Och om jag gör "cd pset1", Enter, och sedan Är igen, nu är det på rätt plats. Som en sidoreplik, om för vissa reason-- speciellt Om du har återkommande nätverksanslutning eller du går runt campus med din laptop lock stängd och sedan öppna upp igen och din arbetsplats verkar något ur synk, no big deal. Bara ladda din webbläsare fönster, och det ska omsynkronisering så att den vänstra filhanterare ser exakt som terminalfönstret. Oroa dig inte. När du är osäker, ladda om sidan, så länge du har sparat redan filerna. OK. Så mv kan också användas för att byta namn på filer. Och låt oss ta en titt på denna sista kommandot här. Så suppose-- och detta är super vanligt, även på ett tidigt stadium. Vissa elever ibland skapa en fil kallas, låt oss säga-- vad en annan? Som "WATER.C." Så jag ska bara skrika, för utan anledning, med stora bokstäver. Men detta är inte den korrekta namnet på filen om bara för att vårt problem set specifikation inte berätta att spara filen som alla caps "WATER.C." I stället räknar vi "water.c" med gemener. Och, i själva verket är detta problematiskt eftersom check50, ett program du kommer att mötas i problem ställa ett som automatiskt testar riktigheten av din kod kommer att skrika på dig om det inte kan hitta "water.c" i gemener. Så jag behöver för att fixa detta. Så många olika sätt att gör det, varav det första skulle vara att kontrollklicka eller högerklicka filnamnet och bara ändra Byt namn. Helt bra att göra det. Men återigen, i dag, låt oss gör det lite snyggare. Låt oss använda mv att ändra "WATER.C" till "water.c." Så kan du också använda det första argumentet att döpa om det till det andra argumentet Om det andra argumentet är inte i Faktum är att en mapp eller ett katalognamn. Okej. Och slutligen, lite trick-- så jag är i min arbetsyta katalog för tillfället. Om jag vill komma in pset en, Jag kan verkligen skriva "cd pset1." Men det är så jobbigt att skriva "pset1" eller längre filnamn eller katalognamn fortfarande. Så mycket ofta i Linux, vad du kan göra är att börja skriva "pse" och bara få uttråkad, slå Tab, och låt dator lista ut det för dig. Super bra att komma in i den vana. Den enda haken är om du har flera filer eller mappar som börjar med bokstaven "p" eller "ps" du kan ha att skriva några fler innan Datorn vet vad de ska göra. MARIA: Vi gillar genvägar. DAVID MALAN: Detta kommer spara så mycket tid. Och även, som vi sade i föreläsning, du kan bläddra i historien, upp och ner, att hitta nyligen avrättades kommandon, liksom. Okej. Så nu, låt oss vända vår uppmärksamhet tillbaka till ett enkelt program, hallå världen. Så vi har sammanställt denna exakt. Och nu varför vi inte tar titta på datatyper och sedan övergå från några motsvarande Scratch block till C. MARIA: Awesome. Så nu när du har börjat skriva program i C, vi kommer att börja prata om datatyper och variabler. Så vissa datatyper som du skulle vilja veta börjar nu är de som är markeras i blått. Så vi har int först, som står för heltal. Och det håller tal, som ni kan ha guessed-- så 1, 2, 3, och alla andra heltal att du kan tänka dig. DAVID MALAN: Och också negativ. MARIA: Och även negativa, yep. Och 0. Sedan har vi flottar, som är flyttal. Så det är alla reella tal som har decimaler. Så 5,0, 5,2, och ännu mer siffror efter decimalkommat, samt, och även negativa. Sedan har vi röding som är ett tecken. Så jag tror att vi pratade om detta i föreläsning idag. Men vi har bokstäver, till example-- A, B, C- som kan lagras som en röding. Men sedan har vi en hel del fler symboler som kan lagras som en röding. Och de lagras som ASCII. Och sedan har vi bool, vilka är Booleans. Och de utvärderas till Sant eller Falsk eller 1 respektive 0. DAVID MALAN: Och minns att bool kommer från CS50 biblioteket. Så det är inte inbyggd i C, men det är super bra att begreppet sant och falskt. Och även om du kan think-- kul faktum. En bool tekniskt behöver hur många bitar, verkligen, för att representera sant kontra falskt? Hur många bitar tror du du skulle behöva, maximalt? Ja, bara en. Så visar det sig att C kan inte ge dig bara en bit. Den minsta måttenhet du kan få är åtta. Så det är lite slösaktigt de du med användning av en hel bitgrupp, eller åtta bitar, att representera Sant eller falskt. Men det är precis som det är implementeras i C av CS50 biblioteket. MARIA: och sedan de som vi är inte kommer att tala om i så stor utsträckning rätt now-- dubbel, det är för större flottar. Lång lång och kort är också för heltal. DAVID MALAN: Faktiskt. I hacker upplagan av pset en, Vi använder faktiskt lång lång. Men för Standard Edition, det borde inte vara nödvändigt. MARIA: Cool. OK. Så operators-- du bör vara förmodligen bekant med de flesta av dessa. Dessutom, +; subtraktion, -. För multiplikation, har vi *. Så inte X som vi brukar använda. Division, har vi det omvända snedstrecket. Och modulo är vår sista operatör som Vi kommer att prata om just nu. Det är en operatör som tillåter oss att ta resten av en division. Så om vi har 4% 2, 4 uppdelad med 2 är två med en återstod av 0. Så 4% 2 är 0. 4% 3 är en. 4% 5 är 4, som du kunde ha gissat. Och kom ihåg när man använder alla dessa operatörer att använda PEMDAS reglerna. DAVID MALAN: Så för att vara tydlig, om du gör 4% 2, varför är det 0, exakt? MARIA: Eftersom 4 dividerat med 2 är två med en återstod av 0. Så modulo ger oss om att resten som motsats till resultatet av divisionen. DAVID MALAN: Och faktiskt, vad vi hittar här till hjälp efter att i vissa problem det är inte nödvändigtvis en, Om du vill ha effekt att begränsa dig själv till en nummerserie som 0 till något, du kan använda modulo att linda runt tidigare än som 2 miljarder eller värdet 4 miljarder som Vi har pratat om i föreläsningen. MARIA: Ja. Och även i "giriga" vi kanske. DAVID MALAN: Ja, problem ange ett, liksom. MARIA: Ja, trevligt. DAVID MALAN: Bra tips. MARIA: Förlåt. Boolean expressions-- så för Boolean operatörer, Vi kommer att tala om alla av dessa som du ser här. Så just nu har vi två likhetstecken anges för jämlikar. Så de är för jämförelse. Hittills har vi bara sett en likhetstecken. Det är då vi tilldelar ett värde till en variabel. Så om vi har sett int n = 5, sedan Vi har tilldelat 5 till variabeln n. Men om vi vill använda == för jämförelse kan vi kontrollera om n == 5. Och om n == 5, då det är sant. Så Booleska operatorer tillåter oss, i princip, att utvärdera Boolean uttryck till Sant eller falskt. Så inte equals-- vi har utropstecken och jämlikar. Så kunde vi också kontrollera om n inte lika 5-- så n! = 5. Mindre än, mindre än eller lika med, större än, större än eller lika med, och sedan har vi den logiska OCH och logiska OR. Och de ger oss möjlighet att utvärdera flera booleska uttryck tillsammans att i princip komma tillsammans som en hel booleskt uttryck. Så om vi vill hitta ett nummer, säger, som är större än 5 men mindre än 15 samtidigt, skulle vi använda den logiskt AND för att se om n är större än 5 && n mindre än 15. DAVID MALAN: Och här, också, det är verkligen lätt tidigt att oavsiktligt Använd bara en enda et-tecken eller en enda vertikal bar. Och förhoppningsvis kompilatorn kommer skrika på dig eftersom de faktiskt har en helt annan innebörd. För de nyfikna, de är används för bitvisa operationer, arbetar på enskilda bitar. Men du vill att par av dem här. Och super viktigt är att första, likhetstecknet, som är jämställdhets operatör motsats till uppdraget operatören. MARIA: Och det lodräta strecket är beläget mellan Delete och Retur. DAVID MALAN: Ja. På en typisk amerikanskt tangentbord. MARIA: Japp. Så låt oss hoppa rätt in villkorssatser. I Scratch, du har redan sett, förmodligen, om uttalanden som gör att du kan kontrollera om något är sant, då göra något annat. Så du kan ha velat för att kontrollera om din sprite är vidröra någon annan sprite eller gränsen på skärmen. Och då kanske du har velat avsluta spelet eller göra något annat. Så syntax för att är "if (villkor)." Så om din sprite vidrör något, ska du är inne i klammerparentes. Sedan har vi if-else uttalanden. Else tillåter oss att göra något om villkoret att vi kontrollera i början är inte sant. Så om spriten vidrör gräns gör detta, annars göra något annat. Så annars göra något annat. Sedan har vi en kort exempel på detta. Så om (military_time <12), vi vill printf "God morgon!" Annars ska vi printf "God afton!" Grundläggande exempel. DAVID MALAN: Good. MARIA: Cool. Så nu har vi switch uttalanden. Växla uttalanden i allmänhet burk tillåter oss att göra en hel del av samma sak att vi bara pratade om med if-satser. Till exempel, just nu har vi allmänna form av switch uttalande som tillåter oss att ta en variabel som heter n och jämföra det med en hel del olika värden, som här vi har kallat constant1, constant2. Vi kan ha en mycket mer. Och de kallas fall. Så om vi har en switch statement-- och detta verk endast för integers-- vi har en variabel i detta fall är n. Om variabeln n är lika med constant1, vi kommer att utföra en viss kodsträng eller något som vi vill göra. Och då skulle vi bryta. Så pausen innebär att switch-satsen kommer att sluta utföra om n är lika med constant1, och sedan ditt program kommer att fortsätta. Det kommer att lämna ut ur byta uttalande och det kommer fortsätta att göra något annat. Om emellertid n inte är lika med constant1, då fallet för constant2 kommer att kontrolleras. Så om n är lika constant2, den andra kodsträng kommer att utföras. Och då kommer det att bryta om det är lika med den. Och då kan vi ha also-- inte nödvändigtvis, though-- en standard fall som kommer att hända om n inte är lika något av de fall som du har listat. Och i normalfallet, vi också behöver inte en paus nödvändigtvis eftersom en övergång uttalande vet att det måste upphöra efter standard fallet om så är fallet. DAVID MALAN: Men stilist, Vi sätter alltid det där. MARIA: Ja. DAVID MALAN: Ja. Så speciellt när du börjar, särskilt om bland de mindre bekväma, jag skulle personligen bara rekommendera stick med IFS och ifs-annans och if-else-om-annans och så vidare om bara eftersom de är lite mer okomplicerat. Detta är en fin optimering, eller ibland även estetiskt det gör koden mer lättläst. Och faktiskt, förmodligen mid-terminen får vi se ett problem ställa in var det bara ser bättre och lättare att läsa för människorna med hjälp av en switch uttalande. Men oroa dig inte om klamrar sig fast vid detta för tidigt. MARIA: Ja. Om du har en hel del om uttalanden, Det kanske bara inte mycket läsvärd. Det kanske inte är mycket snabb för dig att gå igenom den. Så byter uttalanden kan vara mycket användbart, liksom. Och även, inte remember-- inte glömmer att sätta raster där. DAVID MALAN: Minns inte detta. MARIA: För då kan du falla genom från ett fall till ett annat. Så låt oss säga att fallet constant1 hade inte en break i det. Då kanske vi faller igenom inuti fallet constant2. Och vi vill inte göra det om Vi har redan nått målet constant1 och det är lika med n. Så, till exempel, om vi har en variabel n som innehåller ett klassnummer, och vi vill se vad det klass är-- om n är lika med 50, vi kommer att skriva ut "CS50 är Introduktion till datalogi I. " Då vi kommer att bryta. Och det är allt. Om emellertid, n är lika 51, kommer vi att skriva ut "CS51 är Inledning till datalogi II. " Sedan, återigen, vi kommer att bryta. Men om då vi sätter 124, 61, alla annat nummer som du kan tänka dig, eller program inte kommer att erkänna det. Så det kommer att säga, "Tyvärr, jag är inte är bekant med den klassen. " Och det kommer att bryta. DAVID MALAN: Så du kan verkligen se if, annars om, annars tanken här. Det är bara annorlunda syntax för uttrycka exakt samma idé. MARIA: Exakt. Nu har vi våra ternära operatörer. Så ternära operatörer har tre parts-- ett villkor, något att göra om detta villkor är sant, och sedan något att göra Om detta villkor är falskt. Så ni ser, i princip, syntax det här. Vi har frågetecken, och sedan the-- vad vi kalla detta? DAVID MALAN: Kolon. MARIA: Colon. Tack. Förlåt. Så låt oss titta på vårt exempel till se om vi kan förstå this-- class_num == 50. Så här ser vi vår Boolean operatör == som jämför den variabla class_num till 50. Så class_num lagrar ett heltal. Och om det heltal är lika med 50, då är vi kommer att lagra "David Malan" inuti strängen professor. Om klassens nummer inte lika 50 ", inte David Malan" kommer att bli professor. DAVID MALAN: Tack. Och så detta verkar motsvarar vad skulle du säga, vid första anblicken? MARIA: För mig verkar det som om-else uttalanden. DAVID MALAN: Ja. Och i själva verket är denna typ av en nätt en eyeliner, så att säga, för att genomföra exakt logiken i if-else men gör allt i ett steg. MARIA: Exakt. Ja. Så if-else uttalanden kanske ta upp en hel del utrymme. De kan vara för lång för något så enkelt som detta. Så detta kan vara mycket kortfattad och mycket trevlig. Så nu ska vi till att titta på verkställande något om och om igen, så kontroll av en skick flera gånger och sedan fortsätta att göra något medan villkor är sant. Så detta leder oss fint in medan slingor. Till vänster har vi vår första while. Så medan något är sant, göra något om och om igen. Så se till att märka att vår förutsättning för detta är validerad på toppen. Medan vårt andra loop-- vi kallar att en gör-while loop-- vi gör något, sedan kontrollera vi för ett tillstånd. Och om detta villkor fortsätter att vara sant, vi gå tillbaka och göra saken igen. Så den viktigaste skillnaden är där villkoret kontrolleras för. Och koden kan aldrig vara exekveras om villkoret inte är sant med while-loopen. Medan med do-while loop, har vi koden som alltid genomförs minst en gång. Och sedan när villkoret fortsätter att vara sant, vi kan gå tillbaka och upprepa igen inuti. Varför tror du att vi skulle använda en gör-while-slinga över en while-slinga? Höger. Så om vi vill att uppmana användaren för någon form av inmatning, om vi vill be dem ange sitt namn, Vi vill åtminstone be dem en gång. Och om de anger det namnet, är vi inte kommer att be dem igen eftersom vi redan vet det. Men om de inte anger deras namn, eller om de ange något som är uppenbarligen inte ett namn, vi fortfarande vill fortsätta be dem för deras namn. DAVID MALAN: Och föreläsning hade vi en såhär med få positiva int exempel där det finns inget att Kontrollera först att du har inte ens fått en int. Så vi vill göra this-- få ett int från user-- så kolla det, kanske, igen och igen och igen. MARIA: Exakt. För loops-- OK. För loopar kan tillåta oss att göra nästan exakt samma sak, liksom. Det är faktiskt exakt samma sak. Så det finns inget som du kan göra med loopar att du inte skulle kunna att göra med while-slingor. Men för loopar kan tyckas lite lite mer komplicerat syntaktiskt eftersom de har tre delar inuti vad var innan bara skick med while-slingor. Så den första delen som du havet, längst till vänster, vi har "int dvärgar = 0." Så det är där vi initiera vår variabel. Då har vi ett semikolon och "dvärgar <7." Så det är där ute villkoret faktiskt är. Så det är vad vi skulle ha bara sätta i tiden loop-- "medan dvärgar <7." Här, som går i mitten av vår för slinga. Så "dwaves <7." Och sedan vår sista delen är "dvärgar ++" som är där vi uppdaterar vår variabel. Så det viktiga att inse är att detta kommer att gå igenom detta för loop sju gånger och köra sju gånger. Så vi har sju dvärgar, och de är alla kommer att säga, "Jag är här för att hjälpa dig, Snövit " eftersom de är redo att hjälpa Snövit. Med medan loopar, skulle vi ha gjort initieringen och uppdatering inte inne i skick, återigen, men antingen före eller inuti while att se till att we-- eftersom Vi behöver alltid dessa delar. Så för att se till att vi har dem, skulle vi har fortfarande lagt till dem på, inte bara innanför parentes. DAVID MALAN: Och så det ser like-- i föreläsningen, till exempel, Jag nästan alltid använda, som, i och n och ganska tråkiga variabler. Det ser ut som du kan använda mer skickligt namngivna variabler, också. MARIA: Ja, det är faktiskt mycket trevligt att använda lite mer beskrivande variabler eftersom särskilt om någon annan är läsa din code-- kanske du är grader eller om du samarbetar med somebody-- du vill se till att de förstår vad du gör. OK. Så detta är något mycket funky-- for-loop i en for-loop. Jag vet inte om vi har sett det här förut. Antagligen inte. Men vi kan faktiskt ha this-- så loopar i stället för slingor. Så är det någon som vill kanske gå mig genom vad som händer här? DAVID MALAN: Jag tar en stab. MARIA: Cool. DAVID MALAN: OK. Så spoiler-- vi vill skriva ut grejer det är i det nedre högra hörnet det. MARIA: Rätt. Jaja. DAVID MALAN: Så vi har bara sätta det prov utgång där. Så jag kan sluta från översta slinga som du är iteration över rader de yttersta slinga, så att säga. Och du iterera över kolonner med den innersta slingan. Och intuitivt, detta bör förhoppningsvis vettigt på grund av naturen av varje program vi har sett före, printf, som är den funktion vi använder, i slutändan, har möjlighet att skriva ut saker ut huvudsak rad för rad. Liksom, när du har matas ut en ny linje, det finns ingen fördubbling tillbaka och skriva ut något högre i skärmen, åtminstone inte använder printf så här. Och så i det avseendet, gör det meningen att den yttersta slingan bör hänvisning till raderna eftersom för varje given rad, du kommer att vilja skriva ut XXXXX, och sedan gå vidare till nästa rad, XXXXX. Så rader komma först. Och sedan inom varje rad, du skriver ut kolumner. Om du försökte göra det motsatta, skulle det förmodligen inte kommit ut som du tänker. MARIA: Ja. Vi kunde inte bara gå tillbaka till föregående rad med printf. DAVID MALAN: Och vad är intressant per dagens pratstund om omfattning, faktiskt, är den raden är en int som är förklarat i den översta slingan. Men märker att det fortfarande insida, så att säga, klammerparenteserna som omedelbart efter, även om det inte är tekniskt inom dessa klammerparenteserna. Så raden är i omfattning för helheten av kodsträng, både inne i den yttre for-slingan och insidan av det inre för slingan. Men däremot, där är kolumn i omfattning? Den rörliga kolumn? Ja, endast i insidan slingan. Och det är OK eftersom vi inte tillgång till den utanför dess klammerparenteserna. Allt vi gör är att skriva ut en ny linje i slutet där. Så att i själva verket är OK. Så det här har effekten, det ser ut som, för att göra tre rader och fyra kolumner. MARIA: Rätt. Så först går vi igenom vårt första raden. Och just i vår första raden, gör vi fyra kolumner inne i första raden. Så vi skriver ut fyra X: s. Och då kan vi lämna för loop, eftersom Vi har redan skrivs ut fyra X: s. Och vi ut en ny linje. Och sedan går vi igenom samma process för ytterligare två rader att göra totalt tre. DAVID MALAN: Och det är värt att notera att det är bara en artefakt på teckensnittet, det faktum att provutgången verkar så mycket längre, som om det finns mer rader än kolumner. Men det är bara för att X är högre än den är bred. Det är allt som händer där, plus det vita utrymmet mellan raderna. MARIA: Rätt. Häftigt. DAVID MALAN: Okej. Så en snabb titt på problem ange ett, ta några frågor, och sedan skjuta? Okej. Så problemet sätta en, det finns tre primära utmaningar, i slutändan. Men först, hittar du att problemet satt specifikation, som med många av psets i höst, kommer att guida dig genom några uppvärmningsövningar, pekar du ut några resurser att du kanske eller kanske inte har sett redan. Exempelvis CS50 har en svit av shorts, som är korta videofilmer, inte olik denna, men att är mycket ämne specific-- kanske fem minuter, 10 minuter i längd på slingor eller om villkor eller på algoritmer eller senare på mer avancerade ämnen, liksom. Och vi generellt bädda de i problemet uppsättningar så att eleverna har en resurs med vilken att granska material som kan ha redan kommit upp i föreläsning eller avsnitt. Men detta sätt är det mer fokuserad och mer på sina fingertoppar. Vi tenderar också att bädda in i problem sätter saker som kallas genomgångar. Så nästan alla de exempel jag gör i föreläsning, på scen här, vi också har skjutit på kameran i föra fram ett mer långsammare, en mer intim genomgång av mig på min laptop i nämnda lag, rad för rad så att i klassen, vi kommer ofta skumma igenom något eller någon kommer interject med en svara på en fråga. Men det betyder inte nödvändigtvis att sjunka i för alla i publiken. Så att du hittar koden genomgångar för de flesta av exemplen att vi gör här i föreläsning så att du kan gå igenom den i din egen takt och bakåt eller framåt eller hoppa helt och hållet, om du vill. Det finns ofta ett fåtal warm-up frågor som be dig att sortera av förstärka detta material och se till att du är bekväm innan du fortsätta med resten av pset. Och sedan, naturligtvis, finns det pset själv. Och en av de saker vi mycket medvetet göra i CS50 är nästan varje ointressant eller intellektuellt ointressant mekaniska steg som du kanske måste göra är nästan alltid mycket väl dokumenterade. Under begreppet, vi ska börja ställa mer retoriska frågor som minns hur man gör det ena eller det? Men generellt, hittar du att problemsamlingar får du genom mekaniken av något så att intressanta, intellektuella utmaningar slutligen lämnas till dig studenten. Med det sagt, Zamyla, som vi hålls hänvisar dag i föreläsning, är en av våra longtime personal medlem som också innehar genomgångar på specifika PSET problem som Mario och giriga, men inte vatten i år. Och det är i dessa walkthroughs att hon ofta erbjuder några tips och tricks för hur man ska gå, aldrig berätta exakt vad de ska göra, men rather-- som ett tillstånd, Om du will-- ger dig åtminstone en par idéer så att det är upp till dig, i slutändan, att besluta hur man närma sig dem. MARIA: Typ av som en hög nivå förståelse av logiken i vad Vi ber er att göra. DAVID MALAN: Exakt. Och, faktiskt, Zamyla s genomgångar är avsedda att besvara den ofta frågade frågan om var jag började, särskilt när dessa långa specifikationer lite skrämmande med tanke på all text och bilder som de har i dem. Så water.c, hittar du efter att du har slutfört det, är faktiskt relativt enkelt. Absolut är ett gäng ni kommer att bang era huvuden mot väggen försöker ta reda på varför det inte att sammanställa eller varför den inte fungerar korrekt. Men när du är klar med det och när du har spenderat lite tid brottas med någon av de buggar som du kan ha, du kommer att upptäcka att det är en mycket kort program. Det kan göras på bara några rader kod, varav de flesta vi har sett här i föreläsning redan om du monterar rätt byggstenar. Och som vi föreslår här, kommer det att fråga du ange hur många minuter någon tar en dusch på campus. Vi anger i problemet ställa in flödeshastigheten för vatten i, liksom, ett lågt flöde dusch huvudet, ungefär som Seinfeld klippet vi såg igår eller den motsatta därav. Och då du bara har att göra lite matematik, really-- aritmetik med C för att berätta oss hur många, ungefär, flaskor med vatten är att motsvarande om vi är tar en n-minuters dusch. Nu, i mario.c, detta kommer att vara en något längre program. Det är fortfarande inte kommer att vara så här långt. Bara några rader längre än water.c. Men det kommer att bli tillfälle att återskapa den gamla skolan Mario pyramid från Super Mario Brothers eller någon uppföljning på. Det kommer inte att se ut som sötare eller lika färgstark som en där. Vi ska bara använda små hashtags som vi har här på skärmen med hjälp av ASCII-text. Men det kommer att approximera samma idé. Och det kommer att bli en utöva som vid första anblicken verkar ganska simple-- bara skriva ut en enkel pyramid. Men det finns ett par egenskaper här som är intressanta. Lägg märke till att den högra kanten av pyramiden faktiskt har två bredd. Så det finns två lika höjd kolumner, vilket gör det kräver lite bit tanke att göra säker på att du får det precis rätt, som motsats till bara en perfekt vinklad linje. Så det är en bit av ett hörn fall men matchar själva spelet. Och det är också icke-självklar vid första blick hur du skriver ut blanktecken. Så när jag tittar på exempel på utdata här-- och det är också i spec-- det typ av ser ut som en rektangel, men en diagonal av rektangel har avhugget, och det är bara vita ytor, så att säga. Och så en vanliga Frågan här är alltid bra, hur gör jag flyttar hashtags över till höger? Eller hur kan jag skriva ut tomma utrymmen? Och det är faktiskt lättare än de flesta studenter tror. Höger? Du kan approximera det visuellt genom att bara slå på mellanslagstangenten en eller två gånger eller tre gånger. Och så även om med printf vi nästan alltid skriva ut en sträng eller en int eller ett ord som "Hej, världen "eller en serie av ord, Du kan också bara skriva ut citationstecken, utrymme, unquote. Och det kommer att faktiskt ge en blank där. Så ha det i åtanke och inte overthink redan. Du måste verkligen besluta rad för rad för rad, inte olikt ditt exempel en stund sedan, hur många av dessa kolumner vara vita ytor och hur många av dem bör vara hashtags. Det kommer att ta lite tid, men det är i slutändan en logisk pussel av slag. MARIA: Ja. Men logiken i gå rad för rad kommer att vara till stor nytta här. DAVID MALAN: Ja. Jag tror exempelkoden du gave-- även även om det inte var ett komplett program. Du måste fortfarande int och huvud och ogiltiga och #include stdio.h, en hel del av saker från föreläsningen. Men byggstenar verkar vara där. Och sedan slutligen är något lite mer algoritm. Så visar det sig att varje gång du gå in i CVS eller närbutik och någon händer dig på kassör räkningar eller mynt som förändring, det visar sig att de, människor, oavsett om de vet det eller inte, använder troligen vad kallas en girig algoritm, där om du är skyldig, säger, $ 21 i förändring eftersom av någon anledning du köpte något mycket billigt med en mycket stor faktura på CVS, det skulle vara riktigt irriterande om kassörskan gav dig 21 singlar eller, värre ändå en hel del mynt. Snarare, vad en förnuftig person är förmodligen kommer att göra är att de ska att ta en $ 20- och sedan en $ 1 bill, och hand du bara två räkningar i detta fall. MARIA: Så de är ute efter att minimera den förändring som de ger tillbaka till dig. DAVID MALAN: Exakt. Och samma affär med mynt, liksom. Om du är skyldig, säger, $ 0,50, förhoppningsvis du inte vill ha 50 öre. Du istället vill ha två kvartal, till exempel. Nu, gör detta antar att kassören har nog av varje valör som han eller hon kanske vill ge dig. Men vi tillåter dig att ta lika mycket i problemet. Och målet i slutändan, är att genomföra i C-kod en girig algoritm. Så att användaren tillåts för att skriva in hur mycket ändra han eller hon är skyldig med dollar och ören, någon form av flyttals värde förmodligen. Och då måste man göra matten och räkna ut algoritm, ja, hur många mynt kan jag ge du minimalt för att ge dig exakt den mängd av förändring. Men det kommer att bli en några knepiga delar här, eller hur? Som det finns hela inexakthet fråga. MARIA: Exakt. Så flyttal värden har vaghet. Har vi prata om det här i föreläsning idag? DAVID MALAN: Vi gjorde sista gången i föreläsningen. Vi pratade om vaghet. Och du inte vill lura användaren hur mycket förändring han eller hon är skyldig. Och så genomgång, i problemet set specifikationen, fundera, i slutändan, att hur du kan minska de vaghet fel, potentiellt. Det kan undvikas, förvisso, för ingångarna vi pratar om. Och, faktiskt, pennies-- kanske vi ska skjuta till Zamyla, Jag tror, ​​för trick där. Så i slutändan, hittar du en progression av problem den här veckan, varav den första är ganska liten, sedan medium, sedan en lite större. Men alla av dem använder byggnaden kvarter från den senaste veckan, från denna supersection, problem set specifikation sätter dig på otaliga resurser. Men ändå, om alls kämpar, särskilt bland de mindre bekväma utan tidigare bakgrund, komma till kontorstid På måndag och tisdag och Onsdag och torsdag. Gå till CS50 Diskutera via kursens hemsida, via vilken du kan chatta med personal och klasskamrater. Men i slutändan, jag tror att bästa råd är bara börja tidigt. Det är inte den typ av klass som du bör start psets på onsdag natt, eller ännu värre torsdag kväll. MARIA: Mitt bästa råd är ha börjat vid Måndag. DAVID MALAN: måndag. Så om du inte har startat already-- nej. Men även om inte måndag, sedan tisdag. Ju tidigare desto bättre. Och det är orsaken till att Kursen har så många sena dagar är för att ge dig en bit av en psykologisk press att börja tidigare, men ändå låta saker slip när saker tar längre tid än du förväntar dig. MARIA: Och du vill använda kontorstid så mycket du kan, alltför. DAVID MALAN: Några frågor? Okej. Tja, varför inte vi ajournera här?