[Musik spiller] DAVID MALAN: Hej, alle. Dette er CS50 s supersection. Tildelte Sektioner vil ikke starte for en anden uge. Og så i dag, jeg er her med-- MARIA: Maria. DAVID MALAN: --to faktisk tage et kig på problemet sæt en, kursets første uger af materiale, få dig orienteret med CS50 IDE, lidt Linux, det operativsystem, der er kører på IDE, samt se på nogle af overgangen fra Scratch til C førende op til problem angive én. Så uden videre, i problemet angive én, du kommer til at være introduceret til CS50 IDE, som er denne web-baseret programmering miljø, som vi bruger med henblik på at skrive programmer. Det er blevet designet til at se meget minder om en typisk computer system, der kører et operativsystem system kaldet Linux. Men det er i den såkaldte sky, hvilket betyder, at alle i klassen kan faktisk have hans eller hendes egen regning og bruge det, så godt. Så de fleste af jer nok har aldrig brugt et Linux-miljø før eller måske selv en kommandolinje miljø. Og en kommandolinje miljø er anderledes. Det er alt tekstmæssige. Det er alle tastatur kommandoer. Og det er ingen Mousing, ingen ikoner, ingen dialog vinduer, ingen menuer. Det er rent tekst. Så i første omgang, den slags af føles som et skridt tilbageskridt i forhold til raffinement. Men det ender med at blive en masse mere kraftfuld, helt sikkert, for en datalog, i sidste ende. Så lad os tage et kig. Her er jeg på CS50.io, via hvilke du kan logge ind CS50 IDE. Og meget gerne i Scratch, er der tre primære områder til denne skærm. Så på den venstre side, har vi hvad der vil være den fil browser. Og der er denne mappe på top, som er lige nu tomme siden jeg sluppet af alle mine filer før supersection. Og det er her, vi får redde C filer, som vi skriver. Øverst til højre, har vi et sted, hvor alle vores kode kommer til at få skrevet. Og ja, hvis jeg klikker på denne plus, dette kommer til at lade mig vælge Ny fil. Og her kan jeg begynde at skrive C-kode, eller, virkelig, en række andre sprog. Og derefter ved bunden, hvor det siger jharvard @ ide50-- og dit vil sige noget lidt different-- hvad var det hedder? Terminalvindue. Ja. Så terminalvinduet er den såkaldte kommandolinje grænseflade via hvilken man kan interagere med det underliggende operativsystem. Og for nu, vi vil gør meget lidt brug af denne-- bare for at kompilere, at se på fejlmeddelelser, som vi ser, og til at køre vores programmer. Men i sidste ende, vil vi at gøre så meget mere, så godt. Og du kan endda installere software og administrere din arbejdsplads inden CS50 IDE, så godt. Men mere om det en anden gang. Så lad os gå videre og skrive et meget simpelt program, bare at gå gennem en varm-up af hello.c, som måske er den enkleste program, vi kan skrive. Jeg har allerede åbnet en ny fane. Jeg har tænkt mig at gå videre og siger omfatter standard io.h. Så int main (void). Og så printf ("Hej, verden" backslash n, tæt tilbud, nære parenteser og semikolon. Okay. Så nu mærke til mit vindue er uden titel. Så jeg meget hurtigt gå at gå op til Fil, Gem. Og det er vigtigt, at Jeg kalder det ikke "Hej." Så en meget almindelig fejl, især i problem angive én, er at uheld bare ringe til din program "vand" eller "grådige" eller "Mario" eller "kredit" eller lignende. Men du rent faktisk ønsker at gøre at du har filtypen fordi det er den eneste måde, compiler og også kodeeditoren ved, at du er faktisk skriver C-kode. Så lad mig gå videre og klik på Gem. Og nu også, hvad CS50 IDE har gjort for os er det også syntaks fremhævet alt. Så det er gjort alt meget farverig. Og hele formålet med det er ikke funktionelt. Det er bare at trække mine øjne for begrebsmæssigt forskellige stykker af dette program. Så lad os gå videre og kompilere dette. Og jeg kan kompilere denne i et par måder. Og i uge en, old-school måde, vi gjorde det var bogstaveligt talt på kommando line-- "klang hello.c." Og så er jeg ramt Enter. Og intet synes at ske i terminalvinduet. Men hvad gjorde forandring i IDE? Hvis igen, IDE betyder blot, Integrated Development Environment. Det er en fancy måde at sige denne integrerede udvikling miljø for udvikling af software. Så hvad gjorde ændre sig i brugergrænsefladen? Hvad lagde du mærke der er anderledes, Maria? MARIA: Jeg har bemærket noget under IDE50 mappen heroppe. DAVID MALAN: Ja. Så heroppe, ikke kun har vi "hello.c." Vi har også "a.out", som er form for en dum navn til et program. Men ja, det er standard navn for en program, når du bare kompilere din kode og ikke fortælle compileren hvad fil til output. Så hvis jeg ønsker at køre dette, jeg nødt til at fortælle compiler-- eller rettere, jeg har brug for at fortælle arbejdsområdet, som jeg ønsker at køre programmet hedder "a.out." Enter. Og der er "Hej, verden. "nu" ./ ". er faktisk vigtigt. Selvom vi kun normalt skrive navnene på kommandoer, når det er et program, du har skrevet, vil du sige "./" fordi der eksplicit fortæller Linux at du ønsker at køre et program kaldet "a.out" det er i denne, hvor dot betyder denne mappe, som jeg er i øjeblikket i, hvilket sker for at være kaldet arbejdsområde, "a.out. For hvis jeg bare sagde "a.out," Enter, Jeg har tænkt mig at få "a.out kommandoen ikke fundet ", fordi computer-- fordi jeg opfandt "a.out;" det kom ikke med computer-- ikke ved, hvor man skal lede efter det, selvom det er rigtigt under min næse, så at sige. OKAY. Så vi kunne ændre dette til være "klang -o hej hello.c." Og hvis jeg ramte Enter, hvilket program vil dette output for mig? Hvad er navnet på den fil? Ja, i ryggen. Det er rigtigt. "Hej." Så "hej" vil være navnet på programmet fordi vi har brugt en såkaldt kommandolinje argument, som er lige en måde at ændre adfærd compileren til rent faktisk output en bestemt filnavn. Og ja, hvis jeg zoome ud og se op her, nu har jeg ikke kun "a.out", og "hello.c", men også "Hej", så godt. Så nu kan jeg gøre "./hello," Enter. Og der er "Hej, verden." Men lastly-- og dette vil nu blive konventionen vi bruger hele semester, typically-- er du kan også bare sige "make hej." Og ja, det siger det er op til dato, fordi det findes allerede. Lad mig gå videre og fjern, med rm-kommandoen, både "a.out" - og sige "fjerne almindelig fil a.out?" Det betyder blot, er du sikker på du vil slette den? Jeg har tænkt mig at sige ja. Og så jeg har tænkt mig at fjerne "hej", men ikke "hello.c." Jeg har tænkt mig at sige "ja" eksplicit, men "y" er tilstrækkelig, så godt. Og nu mærke til, hvis jeg skriv ls-- der, husker, betyder list-- det viser alle af filerne i min mappe. Og ja, hvis jeg zoome ud og se på øverst til venstre, Det bekræfter, at hvad der er i denne mappe, selv selvom det er mærket som IDE50 heroppe og ikke arbejdsområde, det er bare "hello.c." Så nu hernede, hvis jeg do "make goddag," Enter, nu kan jeg se en meget længere kommando, men en mere sofistikerede kommando, der foregår at være nyttige i de kommende uger. Og nu kan jeg sige "./hello." Så lad os tage en hurtig rundvisning nogle andre Linux-kommandoer. Så hvorfor vi ikke tage et skridt tilbage og faktisk se på C mere Generelt overgang fra Scratch til C, og derefter slutte af med et kig ved første problem angivet i C. All right. Så jeg har tænkt mig at gå videre og bare ren min arbejdsplads med ctrl-L bare at holde skærmen neat. Men der har intet funktionelt påvirke andet. Husk på, at vi har set et par kommandoer nu. Så vi har set klang, som generelt du ikke behøver at udføre manuelt længere. Vi vil i stedet bruge make. Men vi så også ls, som viser en notering af filerne i min mappe. Og nu, hvorfor er there-- der har to filer nu, "goddag" og "hello.c." Hvorfor er der en stjerne eller en stjerne efter "hej"? Hvad gjorde at betyde, baseret på hvad vi så i uge en? Hvad synes du? Hvad betyder stjernen betyde? MARIA: for-- programmet "hej"? DAVID MALAN: "Hej *". Ja. Oh, yeah? Åh, eksekverbar. Det er rigtigt. Så det betyder, at "hello" er eksekverbar. Så ja, det er derfor, Jeg kan gøre "./hello." Okay. Så hvad kan jeg gøre her? Tja, det viser sig, jeg kan også oprette mapper. Så lad mig gå videre og skabe, for eksempel en "pset1" bibliotek. Og problemet sæt specifikationer vil have du gør netop dette, så du ikke behøver at huske i dag. Men "mkdir pset1" synes at have nogen effekt. Men igen, ingen fejlmeddelelse er generelt en god ting. Så hvis jeg skriver "ls" nu-- ah, nu Jeg har en eksekverbar fil kaldet "Hej", en C-fil kaldet "hello.c." Og så efterfølgende skråstreg, så at tale, betyder, at dette er et bibliotek. Så ja, nu vil jeg åbne den. Og jeg tror ikke dobbeltklikke på det ligesom i en GUI, en grafisk miljø. Jeg stedet sige "cd pset1." Enter. Intet interessant synes at have skete undtagen min lille prompt her-- det er Linux 'måde at minde mig, hvor jeg er, så hvad mappen er åben. Det er bare fortæller mig udtrykkeligt i modsætning til grafisk. Og hvis jeg skriver "ls," hvorfor kan jeg se en anden Spørg straks, tror du, når jeg vise indholdet af pset1? MARIA: Du behøver sandsynligvis ikke har noget derinde. DAVID MALAN: Ja. Så har vi selvfølgelig skabt noget der fordi jeg lige oprettet mappen. Nu, hvis jeg ønskede at skabe et file-- for Eksempelvis kunne jeg oprette en ny fil. Og så kunne jeg gå til Gem og gemme det som, som, "mario.c", hvis du laver standard udgave af pset én. Og så, som enhver Mac eller pc, bare vælge mappen "pset1, Gem. Og nu filen er tom. Men lad os zoome ind igen for en anden. Lad os gøre ls her. Nu ser vi "mario.c". Så der er et par andre kommandoer, er værd at holde sig for øje i løbet time-- klar, eller holde Ctrl-L er, hvad jeg har været at ramme; mkdir vi har set; rm vi har set, så godt, hvilket er til at fjerne eller slette en fil. Pas på, du kan also-- og hvis du ser ved online tutorials, vil du rm -rf er en meget almindelig måde at sige slette en mappe, der har ting i det. Bare være super, super forsigtig. -rf betyder rekursivt slette, hvad det er du forsøger at slette og med magt slette den. Så rekursive midler, hvis det er en mappe med en mappe med en mappe med en mappe, slette dem alle. Og med magt betyder ikke engang spørger mig ja eller nej, er jeg sikker på? Så det er en super farlig måde sletning masser af ting hurtigt. Men beware-- alt for ofte gør en frygtløs studerende uheld sletter, siger, pset én, f.eks. MARIA: Og hvis de bare gør -r, kommer de at spørge dem om hver enkelt fil. DAVID MALAN: Hvilket er moderat irriterende. MARIA: Ja. DAVID MALAN: Så det er derfor så mange af os, selv inkluderet, er i vane med at bruge -rf. Men det er farligt. Så køber, pas på. Og så MV er slags interessant navn. Så dette er farten kommandoen, som føles lidt underligt fordi du rent faktisk kan bruge det til flytte filer fra et sted til et andet. For eksempel antage, at jeg rodet op. Antag, at jeg har oprettet en ny fil for pset. Og jeg gemte det som "greedy.c." Men formoder jeg ved et uheld gemme det i IDE50-- så i min arbejdsplads selv og ikke i pset1. Du kan se så meget øverst til venstre. Der er "greedy.c." Og der er et par løsninger. Så man kan jeg bruge super brugervenlig måde for bare at trække og slippe den. Og det ville faktisk løse dette problem. Men i dag, vi forsøger at se på de mere mystiske men kraftfulde måder at gøre dette. Så lad mig tage "ls" i pset1. Og jeg kun se "mario.c." Lad mig gå videre og gøre "cd ..". Så CD igen er forandring mappe. ".." Betyder Men hvad? Sidste gang jeg sagde "CD pset1 "at gå ind pset1. Så når jeg siger "cd ..", hvad gør jeg? Tilbage. Ja. Så det kommer til at den såkaldte forælder. Gå et niveau op, ligesom spændende ud af en mappe. Så Enter. Og ja, se hvad det gjorde. Det flyttede mig lige ind i arbejdsområde i stedet af i pset1, som er i arbejdsområde. Og nu, hvis jeg skriver "ls" der er en hel masse ting. I der er "greedy.c". Så lad mig bruge mv til bogstaveligt talt flytte "greedy.c" ind pset1. Og så en masse Linux kommandoer fungerer præcis som denne. De tager ingen argumenter, eller de tager en argument eller de tager to kommandolinje argumenter og så videre. Og i dette tilfælde, er det bogstaveligt gør hvad det siger, omend succinctly-- flytte greedy.c ind pset1. Enter. Intet synes at ske. Men hvis jeg bruger en ls igen, grådige er væk. Og hvis jeg gør "cd pset1", Enter, og derefter ls igen, nu er det på det rigtige sted. Som en sidebemærkning, hvis der for nogle reason-- især hvis du har intermitterende netværksforbindelse eller du går rundt campus med din bærbare computer låg lukket og derefter åbne det op igen og din arbejdsplads forekommer noget ude af sync, nogen big deal. Bare genindlæse din browser vinduet, og det skal resync så den venstre filbrowser ser ud præcis ligesom terminalvindue. Ikke at bekymre dig. Når du er i tvivl, genindlæse siden, så længe du har gemt filerne allerede. OKAY. Så mv kan også bruges til at omdøbe filer. Og lad os tage et kig på denne sidste kommando her. Så suppose-- og det er super almindeligt, også tidligt. Nogle elever lejlighedsvis oprette en fil kaldes, lad os say--, hvad der er en anden? Ligesom "WATER.C." Så jeg vil bare råbe, for ingen grund til, i alle hætter. Men dette er ikke korrekte navn for filen hvis blot fordi vores problem sæt specifikation ikke fortælle dig at gemme filen som alle hætter "WATER.C." I stedet forventer vi "water.c" med små bogstaver. Og i virkeligheden er dette problematisk, fordi check50, et program, du vil at mødes i problemer indstille en, der automatisk tester rigtigheden af ​​din kode kommer til at råbe på dig, hvis det ikke kan find "water.c" i små bogstaver. Så jeg har brug for at løse dette. Så mange forskellige måder at gøre dette, hvoraf den første ville være at Ctrl-klik eller højreklik filnavnet og bare ændre Omdøb. Helt fint at gøre det. Men igen, i dag, lad os gør det lidt mere avanceret. Lad os bruge mv til at ændre "WATER.C" til "water.c." Så kan du også bruge det første argument at omdøbe den til det andet argument hvis det andet argument er ikke i Faktisk en mappe eller en mappe navn. Okay. Og endelig, lidt trick-- så jeg er i mit arbejdsområde mappe i øjeblikket. Hvis jeg ønsker at komme ind pset én, Jeg kan helt sikkert skrive "cd pset1." Men det er så besværligt at skrive "pset1" eller længere filnavne eller mappenavne stadig. Så meget ofte i Linux, hvad du kan gøre, er at begynde at skrive "PSE" og bare keder sig, ramte Tab, og lad computerens tallet det ud for dig. Super nyttigt at komme ind i denne vane. Den eneste fangst er, hvis du har flere filer eller mapper, der starter med bogstavet "p" eller "ps", du måtte have at skrive et par mere før Computeren ved, hvad de skal gøre. MARIA: Vi kan godt lide genveje. DAVID MALAN: Dette vil spare dig så meget tid. Og også, som vi sagde i foredrag, du kan rulle op i historien, op og ned, at finde nyligt henrettet kommandoer, samt. Okay. Så nu, lad os vende vores opmærksomhed tilbage til et simpelt program, hej verden. Så vi har samlet det nøjagtigt. Og nu, hvorfor vi ikke tager et kig på datatyper og derefter overgangen fra nogle svarende Scratch blokke til C. MARIA: Awesome. Så nu, at du er begyndt skrive programmer i C, vi kommer til at begynde at tale om datatyper og variabler. Så nogle datatyper, som du ønsker at vide starter nu er dem, der er fremhævet med blåt. Så vi har int først, som står for heltal. Og der holder heltal, som du kunne have guessed-- så 1, 2, 3, og andre heltal at du kan tænke på. DAVID MALAN: Og også negativ. MARIA: Og også negative, jep. Og 0. Så har vi flåd, som er flydende tal. Så det er alle de reelle tal der har decimaler. Så 5.0, 5.2, og endnu mere cifre efter kommaet, samt, og også negative. Så har vi char som er et tegn. Så jeg tror, ​​vi talte om dette i forelæsning i dag. Men vi har bogstaver, example-- A, B, C-- der kan gemmes som en char. Men så har vi en masse flere symboler der kan gemmes som en char. Og dem gemmes som ASCII. Og så har vi bool, som er Booleans. Og dem evalueres til Sandt eller Falsk eller 1 og 0, hhv. DAVID MALAN: Og tilbagekaldelse, der bool kommer fra CS50 biblioteket. Så det er ikke indbygget i C, men det er super nyttigt at have begrebet sandt og falsk. Og selvom du måske tror-- sjovt kendsgerning. En bool teknisk brug, hvor mange bits, sandhed, at repræsentere Sandt versus Falsk? Hvor mange bits tror du du behøver, maksimalt? Ja, kun én. Så det viser sig, at C kan ikke give dig bare en smule. Den mindste måleenhed du kan få, er otte. Så det er lidt ødsel de du er ved hjælp af en hel byte eller otte bits, at repræsentere Sandt eller falsk. Men det er bare den måde, det er gennemført i C ved CS50 biblioteket. MARIA: Og så dem, vi er ikke vil tale om så udførligt lige nu-- dobbelt, det er til større flåd. Lange lange og korte er også for heltal. DAVID MALAN: Ja. I hacker udgave af pset én, vi rent faktisk bruger lang lang. Men for standard udgave, det burde ikke være nødvendigt. MARIA: Cool. OKAY. Så operators-- du bør være formentlig bekendt med de fleste af disse. Addition, +; subtraktion, -. For multiplikation, har vi den *. Så ikke X, som vi plejer at bruge. Division, har vi backslash. Og modulo er vores sidste operatør, vi kommer til at snakke om lige nu. Det er en operatør, der giver os mulighed for at tage resten af ​​en division. Så hvis vi har 4% 2, 4 delt med 2 er 2 med en resterende del af 0. Så 4% 2 er 0. 4% 3 er 1. 4% 5 er 4, som du kunne have gættet. Og husk, når du bruger alle disse operatører til at anvende de PEMDAS reglerne. DAVID MALAN: Så for at være klar, hvis du gør 4% 2, hvorfor er, at 0, præcist? MARIA: Fordi 4 divideret med 2 er 2 med en rest på 0. Så modulo giver os, at resten som i modsætning til resultatet af divisionen. DAVID MALAN: Og ja, hvad vi vil finde det nyttigt for er, at i nogle problemer det er ikke nødvendigvis en, Hvis du vil have den følge at begrænse dig selv til en nummerserie like 0 gennem noget, kan du bruge modulo til at ombryde omkring tidligst ligesom 2 mia eller 4 milliarder værdi, vi har talt om i foredraget. MARIA: Ja. Og selv i "grådige" vi måske. DAVID MALAN: Ja, i Problemet angive én, så godt. MARIA: Ja, dejligt. DAVID MALAN: God vink. MARIA: Beklager. Boolean expressions-- så for booleske operatorer, vi kommer til at snakke om alt af disse, som du ser her. Så lige nu har vi to lighedstegn anført for ligemænd. Så de er til sammenligning. Indtil videre har vi kun set én lighedstegn. Det er, når vi tildeler en værdi til en variabel. Så hvis vi har set int n = 5, så vi har tildelt 5 til variablen n. Men hvis vi ønsker at bruge == til sammenligning, kan vi kontrollere, om n == 5. Og hvis n == 5, så er det sandt. Så booleske operatører tillade os, dybest set, at evaluere Boolean udtryk for Sandt eller falsk. Så ikke equals-- vi har udråbstegn og ligemænd. Så kunne vi også kontrollere, om n ikke lig 5-- så n! = 5. Mindre end, mindre end eller lig med større end, større end eller lig med og så har vi den logiske AND og den logiske OR. Og dem giver os mulighed for at vurdere flere booleske udtryk sammen til stort set komme sammen som en hel boolsk udtryk. Så hvis vi ønsker at finde en række, siger, der er større end 5, men mindre end 15 på samme tid, ville vi bruge logisk OG operatøren at se hvis n er større end 5 && n mindre end 15. DAVID MALAN: Og her, også, det er virkelig nemt tidligt uheld bruge bare en enkelt-tegn eller en enkelt lodret streg. Og forhåbentlig compileren vil råber på dig, fordi de rent faktisk har en meget forskellig betydning. For dem nysgerrige, de er anvendes til bitvise operationer, opererer på enkelte bits. Men du vil have par af dem her. Og super vigtigt, er, at første, lighedstegnet, der er lighed operatør som modsætning til opgaven operatør. MARIA: Og den lodrette bar er placeret mellem Slet og Retur. DAVID MALAN: Ja. På en typisk amerikansk tastatur. MARIA: Yep. Så lad os springe lige ind betingede udsagn. I Scratch, har du allerede set, sandsynligvis, hvis udsagn, der giver dig mulighed for at kontrollere, om noget er sandt, så gøre noget andet. Så du måske har ønsket at kontrollere, om din sprite er rører en anden sprite eller grænsen af ​​skærmen. Og så skal du måske have ønsket at afslutte spillet eller gøre noget andet. Så syntaksen for at er ", hvis (betingelse)." Så hvis din sprite rører noget, så skal er inde i de krøllede parenteser. Så har vi if-else udsagn. Else giver os mulighed for at gøre noget hvis den betingelse, at vi kontrollere for i starten er ikke sandt. Så hvis sprite rører grænsen gøre dette, ellers gøre noget andet. Så ellers gøre noget andet. Så har vi en kort eksempel på dette. Så hvis (military_time <12), vi ønsker at printf "God morgen!" Andet, vi kommer til at printf "God aften!" Grundlæggende eksempel. DAVID MALAN: God. MARIA: Cool. Så nu har vi switch udsagn. Skift udsagn i almindelighed kan tillade os at gøre en masse af det samme at vi bare snakkede omkring med hvis udsagn. For eksempel, lige nu har vi den generelle form af switch-statementet der giver os mulighed for at tage en variabel kaldet n og sammenligne det med en masse af forskellige værdier, som her vi har kaldt constant1, konstant2. Vi kan have en masse mere. Og dem kaldes sager. Så hvis vi har en switch statement-- og dette værker kun for integers-- vi har en variabel i dette tilfælde, der er n. Hvis variablen n er lig med constant1, vi vil udføre nogle stump kode eller noget, som vi ønsker at gøre. Og så ville vi bryde. Så pausen betyder, at switch-statementet vil stoppe udførelsen hvis n er lig med constant1, og derefter dit program vil fortsætte. Det vil afslutte ud af skifte redegørelse og det vil fortsætte med at gøre noget andet. Men hvis n ikke lig constant1, så tilfældet for konstant2 vil blive kontrolleret. Så hvis n er lig konstant2, at andre kodestykke vil blive henrettet. Og så er det vil bryde hvis det er lig med det. Og så kan vi have also-- ikke nødvendigvis, though-- en standard tilfælde der vil ske, hvis n ikke er lig nogen af ​​de tilfælde, som du har angivet. Og i standard tilfældet, har vi også ikke brug for en pause nødvendigvis fordi switch-statementet vil vide at det skal ende efter standard tilfældet, hvis det er tilfældet. DAVID MALAN: Men stilistisk, vi altid sætte det i der. MARIA: Ja. DAVID MALAN: Ja. Så især når starter ud, især hvis blandt de mindre komfortable, ville jeg personligt bare anbefaler stick med de hvis'er og hvis'er-elses og if-else-if-elses og så videre, hvis der kun fordi de er lidt mere ligetil. Dette er en dejlig optimering, eller nogle gange endda æstetisk det gør koden mere læsbar. Og faktisk formentlig mid-semester vil vi se et problem sæt, hvor det bare ser bedre og lettere at læse for mennesker ved hjælp af en switch-statement. Men du behøver ikke bekymre dig om klamrer sig til denne for tidligt. MARIA: Ja. Hvis du har en masse, hvis udsagn, det måske bare ikke være meget læsbar. Det er måske ikke være meget hurtig for dig at gå igennem det. Så skifter udsagn kan være meget nyttigt, samt. Og også, ikke remember-- ikke glemmer at sætte pauserne derinde. DAVID MALAN: Må ikke huske dette. MARIA: Fordi så kan du falde igennem fra sag til sag. Så lad os sige, at sagen constant1 afse en pause erklæring i det. Så kunne vi falder igennem inde tilfælde konstant2. Og vi ønsker ikke at gøre det, hvis vi har allerede nået tilfælde constant1 og det er lig med n. Så for eksempel, hvis vi har en variabel n, der indeholder en klasse nummer, og vi ønsker at se, hvad der klasse is-- hvis n er lig med 50, vi kommer til at udskrive "CS50 er Introduktion til Datalogi I. " Så vi kommer til at bryde. Og det er det. Men hvis n er lig til 51, vil vi at udskrive "CS51 er Introduktion til datalogi II. " Så igen, vi kommer til at bryde. Hvis så vi sætter dog 124, 61, enhver andet nummer, som du måske tænke på, eller programmet ikke vil at erkende, at. Så det kommer til at sige, "Undskyld, jeg er ikke bekendt med denne klasse. " Og det kommer til at bryde. DAVID MALAN: Så kan man virkelig se IF, ellers hvis, ellers idé her. Det er bare anderledes syntaks for udtrykker nøjagtig samme idé. MARIA: Præcis. Nu har vi vores ternære operatører. Så ternære operatører har tre parts-- en tilstand, noget at gøre, hvis denne betingelse er sand, og derefter noget at gøre hvis denne betingelse er falsk. Så du ser, dybest set, syntaksen af ​​her. Vi har spørgsmålstegnet, og så til-- hvad gør vi kalder det? DAVID MALAN: tyktarmen. MARIA: Colon. Tak. Undskyld. Så lad os se på vores eksempel til se, om vi kan gøre følelse af denne-- class_num == 50. Så her ser vi vores boolesk operator == der sammenligner den variable class_num til 50. Så class_num lagrer et heltal. Og hvis det heltal lig 50, så er vi kommer til at gemme "David Malan" inde i strengen professor. Hvis klassen nummer ikke lig 50 ", ikke David Malan" bliver professoren. DAVID MALAN: Tak. Og så synes dette svarer til hvad ville du sige, ved første øjekast? MARIA: For mig ser det ud ligesom hvis-andet udsagn. DAVID MALAN: Ja. Og i virkeligheden er dette slags af en smuk én liner, så at sige, for at gennemføre nøjagtigt logik if-else men gør alt i ét trin. MARIA: Præcis. Ja. Så hvis-else udsagn måske tage op en masse plads. De kan være for lang til noget så simpelt som dette. Så det kan være meget kortfattet og meget flot. Så nu vil vi ind at se på udføre noget igen og igen, så kontrol for en tilstand flere gange og derefter fortsætter med at gøre noget mens denne betingelse er sand. Så dette bringer os fint ind mens sløjfer. Til venstre har vi vores første while-løkke. Så mens noget er sandt, gøre noget igen og igen. Så sørg for at lægge mærke til, at vores tilstand her er valideret på toppen. Hvorimod med vores anden loop-- vi kalder at en gør-mens loop-- vi gør noget, derefter kontrollere vi for en tilstand. Og hvis denne betingelse fortsætter med at være sandt, vi gå tilbage og gøre de ting igen. Så den vigtigste forskel er, hvor tilstanden kontrolleres for. Og koden kan aldrig være udføres, hvis betingelsen ikke er rigtigt med while-løkken. Hvorimod med gør-mens loop, vi har koden der altid udføres mindst én gang. Og derefter, mens tilstanden fortsætter med at være sandt, vi kan gå tilbage og gentage igen indeni. Så hvorfor tror du, vi ville bruge en gør-while-løkke over en while-løkke? Højre. Så hvis vi ønsker at bede bruger til en slags input, hvis vi ønsker at spørge dem at indtaste deres navn, vi ønsker at mindst spørge dem én gang. Og hvis de kommer ind det navn, vi er ikke vil stille dem igen fordi vi allerede kender det. Men hvis de ikke indtaster deres navn, eller hvis de indtaste noget, der er naturligvis ikke et navn, vi stadig ønsker at fortsætte beder dem om til deres navn. DAVID MALAN: Og i foredraget havde vi en ligesom dette med få positive int eksempel, hvor der er noget at tjek først, fordi du ikke har endda fået en int. Så vi ønsker at gøre denne-- få en int fra user-- derefter kontrollere det, måske, igen og igen og igen. MARIA: Præcis. For loops-- OK. For løkker kan tillade os at gøre næsten præcis de samme ting, så godt. Det er faktisk præcis det samme. Så der er ikke noget, du kan gøre med for løkker at du ikke ville være i stand at gøre med, mens sløjfer. Men efter sløjfer kan synes lidt smule mere kompliceret syntaktisk fordi de har tre dele inde i hvad var før blot tilstand med mens sløjfer. Så den første del, som du havet, venstre-mest, vi har "int dværge = 0." Så dette er, hvor vi initialisere vores variabel. Så har vi et semikolon og "dværge <7." Så det er her ude betingelse faktisk er. Så det er, hvad vi ville have sætte bare i imens loop-- ", mens dværge <7." Her der går i midt i vores for-løkken. Så "dwaves <7." Og så vores sidste del er "dværge ++," der hvor vi opdaterer vores variabel. Så det vigtigste til at indse, er, at dette kommer til at gå igennem denne for-løkke syv gange og udføre syv gange. Så vi har syv dværge, og de er alle kommer til at sige, "Jeg er her til at hjælpe dig, Snehvide " fordi de er klar at hjælpe Snehvide. Med mens løkker, ville vi have gjort initialiseringen og ajourføring ikke inde i tilstand, igen, men enten før eller inde i while-løkke at sikre, at we-- fordi vi altid brug for disse dele. Så for at sikre, at vi har dem, ville vi har stadig tilføjet dem på, bare ikke i parentes. DAVID MALAN: Og så det ser like-- i foredraget, for eksempel, Jeg næsten altid bruge, ligesom, i og n og temmelig kedeligt variabler. Det ser ud som du kan bruge mere dygtigt navngivne variabler, også. MARIA: Ja, det er faktisk meget rart at bruge lidt mere beskrivende variabler fordi især hvis en anden er læse din code-- måske du er grader eller hvis du samarbejder med somebody-- du ønsker at sikre, at de forstå, hvad du laver. OKAY. Så det er noget meget funky-- for-løkke inde i en for-løkke. Jeg ved ikke, om vi har set det før. Sikkert ikke. Men vi kan faktisk have denne-- så løkker i stedet for løkker. Så er der nogen ønsker at måske gå mig gennem hvad der foregår her? DAVID MALAN: Jeg tager et stik. MARIA: Cool. DAVID MALAN: OK. Så spoiler-- vi ønsker at udskrive de ting der er i det nederste højre hjørne der. MARIA: Right. Ja, ja. DAVID MALAN: Så vi har bare sætte det prøve output der. Så jeg kan udlede af den øverste løkke, at du er iteration løbet rækker de yderste løkke, så at sige. Og du iteration løbet kolonner med den inderste sløjfe. Og intuitivt, dette bør forhåbentlig giver mening på grund af naturen af hvert program vi har set før, printf, som er funktion vi bruger, i sidste ende, har mulighed for at udskrive ting i det væsentlige linje for linje. Ligesom, når du har udlæses en ny linje, der er nr fordobling tilbage og udskrivning noget højere på skærmen, mindst ikke bruger printf som denne. Og så i den forbindelse, det gør forstand, at den yderste sløjfe bør der henvises til rækkerne fordi for hver given række, du vil ønsker at udskrive XXXXX, og derefter gå videre til den næste række, XXXXX. Så rækker komme først. Og derefter inden for hver række, du udskriver kolonner. Hvis du har forsøgt at gøre det på den modsatte, ville det nok ikke komme ud som du ønsker. MARIA: Ja. Vi kunne bare ikke gå tilbage til forrige række med printf. DAVID MALAN: Og hvad er interessant pr dagens snak om rækkevidde, faktisk er, at rækken er en int der er erklæret i den øverste løkke. Men bemærk at det stadig er indersiden af, så at sige, de krøllede parenteser, som følge umiddelbart, selvom det er ikke er teknisk inden for disse krøllede parenteser. Så række er i omfang for hele den kodestykke, både indersiden af ​​den ydre sløjfe til og inde i det indre for løkken. Men I tilfælde, hvor er kolonne i omfang? Den variabelkolonne? Ja, kun i indvendige løkke. Og det er OK, fordi vi ikke få adgang til det uden for sine krøllede parenteser. Alt vi gør, er udskrift af en ny linje i slutningen der. Således at der i virkeligheden er OK. Så dette har den virkning, det ligner, gøre tre rækker og fire søjler. MARIA: Right. Så først vi går igennem vores første række. Og netop i vores første række, gør vi det fire kolonner inde i første række. Så vi udskrive fire X'er. Og så kan vi gå ud for-løkken, da vi har allerede udskrives fire X'er. Og vi udskrive en ny linje. Og så går vi gennem samme proces for to flere rækker at gøre alt tre. DAVID MALAN: Og det er værd at bemærke er det bare en artefakt af skrifttype, den kendsgerning at prøven output synes så meget højere, som om der er mere rækker end kolonner. Men det er bare fordi X er højere end den er bred. Det er alt, hvad der sker der, plus det hvide mellemrum mellem linjerne. MARIA: Right. Afkøle. DAVID MALAN: Okay. Så et hurtigt kig på problemet angive én, tage eventuelle spørgsmål, og derefter udsætte? Okay. Så i problemer indstille en, er der tre primære udfordringer, i sidste ende. Men først, vil du finde at problemet sæt specifikation, som med mange af psets dette efterår, kommer til at gå dig gennem et par warm-up øvelser, pege dig ud et par ressourcer at du måske eller måske ikke allerede har set. For eksempel, CS50 har en suite af shorts, som er korte videoer, ikke ulig det, men at er meget emne specific-- måske fem minutter, 10 minutter i længde på sløjfer eller på eller om algoritmer eller senere mere avancerede emner, så godt. Og vi generelt integrere dem ind i problemet sæt så eleverne har en ressource, som til anmeldelse materiale, der kan have allerede kommet op i foredrag eller afsnit. Men på denne måde er det mere fokuseret og mere ved hånden. Vi har også en tendens til at integrere i problemer sætter tingene kaldes walkthroughs. Så næsten alle de eksempler, jeg gør i foredrag på scenen her, vi også har skudt på kameraet i fremme en mere langsommere, en mere intim gennemgang af mig på min laptop af denne kodeks, linje for linje således at der i klassen, vil vi ofte skimme noget eller nogen vil indskyde med en svar på et spørgsmål. Men det betyder ikke nødvendigvis synke i for alle i publikum. Så finder du koden walkthroughs for de fleste af eksemplerne at vi gør her i foredrag, så du kan gå igennem det i dit eget tempo og spole frem eller tilbage eller springe helt, hvis du gerne vil. Der er ofte et par Warm-up spørgsmål, bede dig om at sortere i styrke dette materiale og sørg for, at du er comfy før du fortsætte med resten af ​​pset. Og så, selvfølgelig, der er den pset selv. Og en af ​​de ting, vi meget bevidst gøre i CS50 er næsten hver uinteressant eller intellektuelt uinteressant mekanisk skridt, du måske nødt til at gøre er næsten altid meget veldokumenteret. I løbet af udtrykket, vi får begynder at spørge mere retoriske spørgsmål gerne huske, hvordan man gør dette eller hint? Men generelt, kan du finde at problemet sæt får du gennem mekanik af noget, så de interessante, intellektuelle udfordringer er i sidste ende overladt til dig den studerende. Med det sagt, Zamyla, til hvem vi holdes i dag med henvisning i foredrag, er en af ​​vores mangeårige medarbejdere medlem, der også har walkthroughs på specifikke pset problemer som mario og grådige, men ikke vand i år. Og det er i dem, walkthroughs, at hun ofte tilbyder nogle tips og tricks til hvordan vi kommer videre, aldrig fortæller dig præcis hvad du skal gøre, men rather-- som en tilstand, Hvis du will-- giver dig mindst en par ideer, så det er op til dig, i sidste ende, at beslutte hvordan man griber dem. MARIA: Lidt ligesom et højt niveau forståelse af logikken i hvilke vi beder dig om at gøre. DAVID MALAN: Præcis. Og i virkeligheden, Zamyla s walkthroughs er beregnet at besvare det ofte stillede spørgsmålet om, hvor jeg begyndte, især når disse lange specifikationer er lidt skræmmende givet al tekst og billedsprog, som de har i dem. Så water.c, vil du finde efter du har fuldført den, er faktisk relativt ligetil. Absolut er en flok af jer kommer til at bang jeres hoveder mod muren forsøger at regne ud, hvorfor det ikke kompilere eller hvorfor det ikke kører korrekt. Men når du er færdig med det, og når du har brugt tid brydning med en hvilken som helst af de fejl, du måtte have, du opdage, at det er en meget kort program. Det kan gøres på blot et par linjer kode, hvoraf de fleste vi har set her i foredrag allerede, hvis du samle de rigtige byggesten. Og som vi foreslår her, det vil bede dig til at angive, hvor mange minutter er nogen, der tager et brusebad på campus. Vi angiver i problemet indstille hastigheden af ​​strømmen af ​​vand i, ligesom, en lav-flow bruser hoved, ligesom den Seinfeld klip vi så i går, eller det modsatte deraf. Og så er du bare nødt at gøre en smule matematik, really-- aritmetisk ved hjælp af C for at fortælle os, hvor mange, groft, flasker vand er, at der svarer til hvis vi er tage en n-minutters brusebad. Nu, i mario.c, det vil at være en smule længere program. Det er stadig ikke til at være så lang. Bare et par linjer længere end water.c. Men det vil være mulighed at genskabe den gamle skole Mario pyramide fra Super Mario Brødre eller nogle opfølgende. Det kommer ikke til at se ud som smukkere eller så farverig som, at man der. Vi er lige kommer til at bruge lidt hashtags ligesom vi har her på skærmen hjælp ASCII-tekst. Men det vil tilnærme den samme idé. Og det vil være en udøve denne ved første øjekast synes temmelig simple-- bare udskrive en simpel pyramide. Men der er et par karakteristika her, der er interessante. Bemærk, at den længst til højre kant pyramiden har faktisk bredde to. Så der er to ens højde kolonner, som gør det kræve lidt bit tanke at gøre at du får at helt rigtigt, som modsætning til blot en perfekt vinklet linje. Så det er lidt af et hjørne sag men matcher selve spillet. Og det er også ikke-indlysende ved første blik, hvordan du udskriver hvide rum. Så når jeg ser på den prøve output her-- og det er også i spec-- det slags ligner et rektangel, men en diagonal af rektangel er blevet hugget, og det er bare hvide rum, så at sige. Og så en ofte stillede Spørgsmålet her er altid godt, hvordan kan jeg flytte hashtags over til højre? Eller hvordan kan jeg udskrive de tomme rum? Og det er faktisk nemmere end de fleste studerende tror. Højre? Du kan tilnærme det visuelt ved blot rammer mellemrumstasten én eller to gange eller tre gange. Og så selvom med printf vi næsten altid udskrive en streng eller en int eller et ord som "Hej, verden "eller en række af ord, du kan også bare udskrive tilbud, plads, citat slut. Og der vil faktisk give du en hvid plads der. Så holder det i tankerne, og ikke overthink dette. Du er virkelig nødt til at beslutte række for række for række, ikke ulig dit eksempel en øjeblik siden, hvor mange af dem, kolonner skal være hvide rum og hvor mange af dem bør være hashtags. Det vil tage lidt tid, men det er i sidste ende en logik puslespil slags. MARIA: Ja. Men logikken for at gå række efter række kommer til at være meget nyttigt her. DAVID MALAN: Ja. Jeg tror, ​​at prøven kode, du gave-- selv selvom det ikke var et komplet program. Du har stadig brug int og vigtigste og ugyldige og # include stdio.h, en masse af de ting fra foredraget. Men byggestenene synes at være der. Og så endelig er noget lidt mere algoritmisk. Så det viser sig, at hver gang du gå i CVS eller nærbutik og nogen hænder du på kasserer regninger eller mønter som forandring, det viser sig, at de, mennesker, uanset om de ved det eller ej, sandsynligvis ved hjælp af, hvad der er kaldes en grådig algoritme, hvorved hvis du er skyldte, siger, $ 21 i ændring, fordi en eller anden grund du har købt noget meget billig med en meget stor regning på CVS, det ville være virkelig irriterende, hvis kasserer gav dig 21 singler, eller, værre endnu, en hel masse mønter. Snarere, hvad en fornuftig person er sandsynligvis vil gøre, er at de kommer at få fat i en $ 20- og derefter en $ 1-regningen, og hånd du blot to regninger i denne sag. MARIA: Så de søger at minimere den ændring, de giver tilbage til dig. DAVID MALAN: Præcis. Og samme deal med mønter, så godt. Hvis du skylder, siger, $ 0,50, forhåbentlig du ikke ønsker 50 øre. Man i stedet ønsker to kvartaler, for eksempel. Nu, dette gør antager at kassereren har nok af enhver pålydende værdi, der han eller hun måske ønsker at give dig. Men vi giver dig mulighed for at påtage sig lige så meget i problemet. Og målet i sidste ende, er at gennemføre i C-kode en grådig algoritme. Så brugeren er tilladt at skrive, hvor meget ændre han eller hun skylder med dollars og cents, en slags flydende komma værdi sandsynligvis. Og så er du nødt til at gøre det math og finde ud af algoritmisk, godt, hvor mange mønter kan jeg give du minimalt at give dig præcis det beløb af forandring. Men der vil være en få tricky dele her, ikke? Ligesom der er det hele unøjagtighed problem. MARIA: Præcis. Så floating point værdier har upræcise. Har vi taler om dette i forelæsning i dag? DAVID MALAN: Vi gjorde det sidste gang i forelæsning. Vi talte om unøjagtighed. Og du ikke ønsker at snyde brugeren hvor meget forandring, han eller hun skylder. Og så walkthrough, i problemet sæt specifikationer, give nogle tanker, i sidste ende, at hvordan du kan mindske dem unøjagtighed fejl, potentielt. Det kan undgås, i hvert fald, for de input, vi taler om. Og faktisk pennies-- måske vi udskyde til Zamyla, Jeg tror, ​​for de tricks der. Så i sidste ende, vil du finde en progression af problemer i denne uge, hvoraf den første er temmelig lille, derefter medium, så en lidt større. Men alle dem bruger bygningen blokke fra denne sidste uge, fra dette supersection, problem sæt specifikationer sætter dig på utallige ressourcer. Men stadig, hvis overhovedet kæmper, især blandt de mindre behagelige uden forudgående baggrund kommer til kontortid mandag og tirsdag og Onsdag og torsdag. Gå til CS50 Diskuter via kursets hjemmeside, via hvilken du kan chatte med personale og klassekammerater. Men i sidste ende, jeg tror bedste råd er bare starte tidligt. Det er ikke den slags klassen, som du bør starte psets på onsdag nat, eller værre torsdag aften. MARIA: Mit bedste råd er at have startet med mandag. DAVID MALAN: mandag. Så hvis du ikke har startet already-- nej. Men selv om det ikke mandag så tirsdag. Jo tidligere jo bedre. Og det er grunden til den Kurset har så mange sene dage er at give dig lidt af en psykisk pres at starte tidligere, men stadig lade tingene glider, når tingene tager længere tid end du forventer. MARIA: Og du ønsker at gøre brug af kontortid så meget som du kan, også. DAVID MALAN: Eventuelle spørgsmål? Okay. Tja, hvorfor vi ikke udsætte her?