[MUSIC SPILLE] DAVID MALAN: Hei, alle sammen. Dette er CS50 er supersection. Tildelte §§ vil ikke starte for en uke. Og så i dag, jeg er her with-- MARIA: Maria. DAVID MALAN: --to faktisk ta en titt på problem satt en, kursets første ukene av materialet, få deg orientert med CS50 IDE, litt av Linux, operativsystemet som er kjører på IDE, samt se på noen av overgangs fra Scratch til C ledende opp til oppgavesettet en. Så uten videre, i oppgavesettet en, du kommer til å være introdusert til CS50 IDE, som Dette web-basert programmering miljø som vi bruker for å skrive programmer. Det er blitt designet for å se meget minner om en vanlig datamaskin system som kjører et operativsystem system kalt Linux. Men det er i den såkalte nettskyen, som betyr at alle i klassen kan faktisk ha sin egen konto og bruke den, også. Så de fleste av dere sikkert har aldri brukt et Linux-miljø før eller kanskje enda en kommandolinje miljø. Og en kommandolinje Miljøet er forskjellig. Det er all tekstlig. Det er alle tastaturkommandoer. Og det er ingen musefunksjonen, ingen ikoner, ingen dialog vinduer, ingen menyer. Det er rent tekst. Så i starten, det slag føles som et skritt bakover i form av raffinement. Men det ender opp med å bli mye kraftigere, absolutt, for en datamaskin vitenskapsmann, til slutt. Så la oss ta en titt. Her er jeg på CS50.io, via som du kan logge inn CS50 IDE. Og mye som i Scratch, er det tre hovedområder til denne skjermen. Så på venstre side har vi hva som vil være den filbehandleren. Og det er denne mappen toppen, som er akkurat nå tom siden jeg ble kvitt all min filer før supersection. Og det er der vi vil lagre C-filer som vi skriver. Øverst til høyre, har vi et sted der alt av koden vår kommer til å bli skrevet. Og faktisk, hvis jeg klikker dette pluss, dette kommer til å la meg velge ny fil. Og her kan jeg begynne å skrive C-kode eller egentlig, en rekke andre språk. Og deretter på bunnen hvor den sier jharvard @ ide50-- og dine vil si noe litt different-- hva dette kalles? Terminalvindu. Yeah. Så terminalvinduet er den såkalte kommandolinjen grensesnitt via som du kan samhandle med det underliggende operativsystemet. Og for nå, vi kommer til å gjøre svært lite bruk av dette-- bare for å kompilere, for å se på feilmeldinger som vi ser, og for å kjøre våre programmer. Men til slutt, vi skal for å gjøre det mye mer, så vel. Og du kan til og med installere programvare og administrere din arbeidsplass innen CS50 IDE, også. Men mer om det en annen gang. Så la oss gå videre og skrive et meget enkelt program bare å gå gjennom en warm-up av hello.c, som er kanskje det enkleste programmet vi kan skrive. Jeg har allerede åpnet opp en ny fane. Jeg kommer til å gå videre og si inkluderer standard io.h. Så int main (void). Og så printf ("Hello, World" backslash n, nær sitat, nære parentes og semikolon. Greit. Så nå legger merke til vinduet mitt er untitled. Så jeg er veldig raskt kommer å gå opp til File, Save. Og det er viktig at Jeg kaller ikke dette "hei." Så en veldig vanlig feil, spesielt i oppgavesettet en, er å tilfeldigvis bare ringe din program "vann" eller "grådig" eller "Mario" eller "kreditt" eller lignende. Men du faktisk ønsker å gjøre at du har den filtypen fordi dette er den eneste måten kompilatoren og også kode editor vet at du er egentlig skrive C-kode. Så la meg gå videre og klikk på Lagre. Og nå, også, hva CS50 IDE har gjort for oss er det også syntaks uthevet alt. Så det er gjort alt veldig fargerik. Og hele hensikten med som ikke er funksjonell. Det er bare å trekke øynene mine konseptuelt forskjellige brikker av dette programmet. Så la oss gå videre og kompilere dette. Og jeg kan kompilere dette i et par måter. Og i en uke, er old-school måte som vi gjorde det var bokstavelig talt på kommando line-- "klang hello.c." Og så traff jeg på Enter. Og ingenting ser ut til å skje i terminalvinduet. Men hva gjorde endring i IDE? Der, igjen, IDE betyr bare Integrated Development Environment. Det er en fancy måte å si dette integrert utviklingsmiljø miljø for utvikling av programvare. Så hva gjorde endring i brukergrensesnittet? Hva la du merke som er annerledes, Maria? MARIA: Jeg la merke til noe under IDE50 mappe opp her. DAVID MALAN: Yeah. Så her oppe, ikke bare har vi "hello.c." Vi har også "a.out", som er slag av en dum navn på et program. Men ja, det er standardnavnet for en program når du bare kompilere koden din og ikke fortelle kompilatoren hva filen til utgang. Så hvis jeg ønsker å kjøre dette, jeg må fortelle compiler-- eller rettere sagt, jeg trenger å fortelle arbeidsplass som jeg ønsker å kjøre programmet som heter "a.out." Gå. Og det er "hallo, verden. "nå" ./ ". er faktisk viktig. Selv om normalt bare vi skrive navnene på kommandoer, når det er et program du har skrevet, vil du si "./" fordi som eksplisitt forteller Linux som du ønsker å kjøre et program som heter "a.out" det er i dette, hvor dot betyr denne katalogen at jeg for øyeblikket i, som skjer for å være kalt arbeidsplassen "a.out. Fordi hvis jeg bare sa "a.out," Enter Jeg kommer til å få "-kommandoen a.out ikke fant "fordi computer-- fordi jeg oppfunnet "a.out;" det kom ikke med computer-- ikke vet hvor du skal lete etter den, selv om det er rett under nesen, så å si. OK. Så vi kan endre dette til være "klang -o hallo hello.c." Og hvis jeg trykker Enter, hva program dette kommer til utgang for meg? Hva er navnet på filen? Ja, i ryggen. Det er riktig. "Hallo." Så "hallo" kommer til å være navnet på programmet fordi vi har brukt en såkalt kommandolinje argument, som er like en måte å endre virkemåten til kompilatoren å faktisk utgang et bestemt navn fil. Og faktisk, hvis jeg zoome ut og se opp her, nå har jeg ikke bare "a.out" og "hello.c", men også "hallo", også. Så nå kan jeg gjøre "./hello," Enter. Og det er "hallo, verden." Men lastly-- og dette vil nå bli stevnet vi bruker hele semester, typically-- er du også bare si "make hei." Og ja, det sier det er opp å date fordi det finnes allerede. La meg gå videre og ta med rm kommandoen, både "a.out" - og si "fjern vanlig fil a.out?" Det betyr bare at, er du sikker på at du vil slette det? Jeg kommer til å si ja. Og så kommer jeg til å fjerne "Hallo", men ikke "hello.c." Jeg kommer til å si "ja" eksplisitt, men "y" er tilstrekkelig, så vel. Og nå merke hvis jeg skriver ls-- som husker, betyr list-- det viser alle av filene i mappen min. Og faktisk, hvis jeg zoome ut og se på øverst til venstre, det bekrefter at det er i denne mappen, selv om den er merket som IDE50 opp her og ikke arbeidsområde, det er bare "hello.c." Så nå her nede, hvis jeg do "gjøre hallo," Enter Nå ser jeg en mye lengre kommando, men en mer sofistikert kommando som kommer å være nyttig i ukene som kommer. Og nå kan jeg si "./hello." Så la oss ta en rask tur noen andre Linux-kommandoer. Så hvorfor ikke vi ta et skritt tilbake og faktisk se på C mer generelt, overgangen fra Scratch til C, og deretter konkludere med en titt ved den første problem satt i C. All right. Så jeg kommer til å gå videre og bare ren opp min arbeidsplass med Ctrl-L bare å holde skjermen ryddig. Men som ikke har noen funksjonell innvirkning på annen måte. Husk at vi har sett noen kommandoer nå. Så vi har sett klang, som du vanligvis slipper å utføre manuelt lenger. Vi vil i stedet bruke sminke. Men vi så også ls, som viser et oversikt over filene i katalogen min. Og nå hvorfor er det-- det to filer nå, "Hei" og "hello.c." Hvorfor er det en stjerne eller en Stjernen etter "hallo"? Hva gjorde at betegne, basert på hva vi så i uke én? Hva synes du? Hva gjør stjernen bety? MARIA: For-- programmet "Hallo"? DAVID MALAN: "Hei *". Yeah. Å, ja? Oh, kjørbar. Det er riktig. Slik det betyr at "hallo" er kjørbar. Så ja, det er derfor Jeg kan gjøre "./hello." Greit. Så hva annet kan jeg gjøre her? Vel, det viser seg at jeg kan også opprette kataloger. Så la meg gå videre og skape, for eksempel en "pset1" katalogen. Og problemet satt spesifikasjonen vil ha deg gjøre akkurat dette, slik at du ikke trenger å huske i dag. Men "mkdir pset1" synes til å ha noen innvirkning. Men igjen, ingen feilmelding er generelt en god ting. Så hvis jeg skriver "ls" now-- ah, nå Jeg har en kjørbar fil som heter "Hallo", en C-fil som heter "hello.c." Og så den etterfølgende skråstrek, så å tale, betyr at dette er en katalog. Så ja, nå ønsker jeg å åpne den. Og jeg ikke dobbeltklikke på det som i et GUI, et grafisk miljø. Jeg i stedet si "cd pset1." Gå. Noe interessant synes å ha skjedde bortsett fra min lille teksten her-- dette er Linux sin måte minner meg hvor jeg er, så hva mappen er åpen. Det er bare å fortelle meg eksplisitt i motsetning til grafisk. Og hvis jeg skriver "ls", hvorfor ser jeg en annen spør en gang, tror du, når jeg vise innholdet i pset1? MARIA: Du har sannsynligvis ikke har noe der inne. DAVID MALAN: Yeah. Så da vi ikke har åpenbart skapt noe der inne fordi jeg nettopp opprettet katalogen. Nå, hvis jeg ønsket å lage en file-- for eksempel, kan jeg lage en ny fil. Og så jeg kunne gå til Lagre og lagre det som, som "mario.c" hvis du gjør standardutgaven av PSet en. Og så, som en hvilken som helst Mac eller PC, bare velge mappen "pset1, Save. Og nå filen er tom. Men la oss zoome inn på nytt for andre. La oss gjøre ls her. Nå ser vi "mario.c". Så det er et par andre kommandoer som er verdt å holde i tankene over tid-- klar, eller Ctrl-L er hva jeg har vært trykket; mkdir vi har sett; rm vi har sett, også, som er for å fjerne eller slette en fil. Pass deg du kan also-- og hvis du ser på elektronisk opplæring, vil du rm -rf er en svært vanlig måte å si slette en mappe som har ting i den. Bare være super, super forsiktig. -rf betyr rekursivt slett hva det er du prøver å slette og tvangs slette den. Så rekursiv hjelp hvis det er en mappe med en mappe med en mappe med en mappe slette dem alle. Og makt betyr ikke engang spør meg ja eller nei, jeg er sikker? Så det er en super farlig måte slette masse ting raskt. Men beware-- altfor ofte gjør en uforferdet student ved et uhell sletter, sier PSet en, for eksempel. MARIA: Og hvis de bare gjøre -r, de kommer å spørre dem om hver enkelt fil. DAVID MALAN: Hvilken er moderat irriterende. MARIA: Yeah. DAVID MALAN: Så det er derfor så mange av oss, inkludert seg selv, er i vane å bruke rf. Men det er farlig. Så kjøper pass. Og så mv er slags interessant navngitt. Så dette er farten kommando, som føles litt rart fordi du faktisk kan bruke den til å flytte filer fra ett sted til et annet. For eksempel anta at jeg messed up. Anta at jeg opprettet en ny fil for PSet. Og jeg lagret det som "greedy.c." Men antar jeg tilfeldigvis lagre det i IDE50-- så i min arbeidsplass selv og ikke i pset1. Du kan se så mye på øverst til venstre. Det er "greedy.c." Og det er noen løsninger. Så en kan jeg bruke super brukervennlig måte for bare å dra og slippe den. Og det ville faktisk løse dette problemet. Men i dag, vi prøver å se på de mer uforståelige men effektive måter å gjøre dette på. Så la meg ta "ls" i pset1. Og jeg bare se "mario.c." La meg gå videre og gjøre "cd ..". Så CD igjen er endringen katalogen. ".." Betyr hva, skjønt? Sist gang jeg sa "cd pset1 "for å gå inn pset1. Så når jeg sier "cd ..", hva gjør jeg? Bakover. Yeah. Så det kommer til den såkalte overordnede. Gå ett nivå opp, som spennende ut av en mappe. Så Enter. Og ja, se hva den gjorde. Den beveget meg bare inn i arbeidsområdet stedet av inn pset1, som er i arbeidsområdet. Og nå hvis jeg skriver "ls", det er en hel haug med ting. I det "greedy.c". Så nå la meg bruke mv bokstavelig flytte "greedy.c" inn pset1. Og så mye av Linux-kommandoer fungerer akkurat som dette. De tar ingen argumenter eller de tar én argument eller de ta to kommandolinjen argumenter og så videre. Og i dette tilfellet, er det bokstavelig talt gjøre hva det står, riktignok succinctly-- flytte greedy.c inn pset1. Gå. Ingenting ser ut til å skje. Men hvis jeg gjør en ls igjen, er grådig borte. Og hvis jeg gjør "cd pset1", Enter, og deretter ls igjen, nå er det på rett sted. Som en side, hvis for noen reason-- spesielt hvis du har uregelmessig nettverkstilkobling eller du vandre rundt campus med den bærbare datamaskinen lokk lukket og deretter åpne den opp igjen og arbeidsområdet synes noe ute av sync, ingen big deal. Bare laste nettleseren din vindu, og det skal resync slik at den venstre filbehandleren ser nøyaktig som terminalvinduet. Ikke vær redd. Når du er i tvil, oppdater siden, så lenge du har lagret filene allerede. OK. Så mv kan også brukes til å endre navn på filer. Og la oss ta en titt på denne siste kommandoen her. Så suppose-- og denne er super felles, også tidlig. Noen studenter tidvis lage en fil kalt, la oss say-- hva som er en annen? Like "WATER.C." Så jeg vil bare hyle, for ingen grunn til, i alle caps. Men dette er ikke Riktig navn på filen hvis bare fordi vår oppgavesettet spesifikasjonen ikke fortelle deg å lagre filen som all caps "WATER.C." I stedet, forventer vi "water.c" med små bokstaver. Og, faktisk, er dette problematisk fordi check50, et program du kommer å møtes i problem satt en som automatisk tester riktigheten av koden din kommer til å kjefte på deg hvis den ikke kan finne "water.c" i små bokstaver. Så jeg trenger å fikse dette. Så mange forskjellige måter å gjøre dette, hvorav den første ville være å kontrollere Klikk eller høyreklikk filnavnet og bare endre Gi nytt navn. Helt greit å gjøre det. Men igjen, i dag, la oss gjøre det litt mer avansert. La oss bruke mv for å endre "WATER.C" til "water.c." Så du kan også bruke det første argumentet å endre navnet til det andre argumentet hvis det andre argumentet er ikke, i Faktisk, en mappe eller et katalognavn. Greit. Og til slutt, litt trick-- så jeg er i min arbeidsplass katalog for øyeblikket. Hvis jeg ønsker å komme inn PSet en, Jeg kan sikkert skrive "cd pset1." Men det er så kjedelig å skrive "pset1" eller lengre filnavn eller mappenavn fortsatt. Så veldig ofte i Linux, hva du kan gjøre er å begynne å skrive "PSE" og bare gå lei, traff Tab, og la datamaskinen finne det ut for deg. Super nyttig å komme inn som vane. Den eneste haken er hvis du har flere filer eller mapper med start med bokstaven "p" eller "ps", du kan ha å skrive noen flere før datamaskin vet hva de skal gjøre. MARIA: Vi liker snarveier. DAVID MALAN: Dette vil spare deg så mye tid. Og også, som vi sa i foredraget du kan bla opp i historien, opp og ned, å finne nylig utført kommandoer, så vel. Greit. Så nå, la oss vende oppmerksomheten tilbake til et enkelt program, hallo verden. Så vi har satt sammen denne nøyaktig. Og nå hvorfor ikke vi ta en titt på datatyper og deretter overgang fra noen tilsvarSkrape blokker til C. MARIA: Awesome. Så nå som du har begynt skrive programmer i C, vi kommer til å begynne å snakke om datatyper og variabler. Så noen datatyper som du ønsker å vite starter nå er de som er uthevet i blått. Så vi har int første, som står for heltall. Og som holder heltall, som du kan ha guessed-- så 1, 2, 3, og andre heltall som du kan tenke på. DAVID MALAN: Og også negativ. MARIA: Og også negative, ja. Og 0. Da har vi flyter, som er flyttall. Så det er alle de reelle tallene som har desimaler. Så 5,0, 5,2, og enda mer sifre etter desimaltegnet, så vel, og også negative. Da har vi char som er et tegn. Så jeg tror vi snakket om dette i forelesning i dag. Men vi har bokstaver, for example-- A, B, C-- som kan lagres som en char. Men så har vi mye flere symboler som kan lagres som en char. Og de lagres som ASCII. Og så har vi bool, som er Booleans. Og de som vurderer å Sant eller Falsk eller 1 og 0, henholdsvis. DAVID MALAN: Og huske at bool kommer fra CS50 biblioteket. Så det er ikke bygget inn C, men det er super nyttig å ha den oppfatningen av ekte og falske. Og selv om du kanskje think-- morsomt faktum. En bool teknisk trenger hvor mange biter, virkelig, å representere sant versus usant? Hvor mange biter du tror gjøre du trenger, maksimalt? Ja, bare en. Så det viser seg at C kan ikke gi deg bare en bit. Den minste måleenheten du kan få er åtte. Så det er litt bortkastet de du er ved hjelp av en hel byte, eller åtte biter, å representere Sant eller usant. Men det er bare slik det er implementert i C ved CS50 biblioteket. Maria: Og så de som vi er ikke kommer til å snakke om så omfattende rett now-- dobbel, det er for større flyter. Lang lang og kort er også for heltall. DAVID MALAN: Ja. I hacker utgave av PSet en, vi faktisk bruker lang lang. Men for standardutgaven, Det skulle ikke være nødvendig. MARIA: Cool. OK. Så operators-- du bør være sannsynligvis kjent med de fleste av disse. Tillegg, +; subtraksjon, -. For multiplikasjon, har vi *. Så ikke den X som vi vanligvis bruker. Divisjon, har vi den backslash. Og modulo er vår siste operatør som vi kommer til å snakke om akkurat nå. Det er en operatør som tillater oss å ta resten av en deling. Så hvis vi har 4% 2, 4 delt ved 2 er to med en rest på 0. Så 4% 2 er 0. 4% 3 er en. 4% 5 er 4, som du kunne ha gjettet. Og husk når du bruker alle disse operatørene å bruke PEMDAS regler. DAVID MALAN: Så for å være klart, hvis du gjøre 4% 2, hvorfor er det 0, egentlig? MARIA: Fordi fire dividert 2 er to med en rest på 0. Så modulo gir oss at resten som i motsetning til resultatet av divisjonen. DAVID MALAN: Og ja, hva vi finner dette nyttig for er at i noen problemer det er ikke nødvendigvis en, hvis du vil ha den virkning å begrense deg selv til en rekke tall som 0 gjennom noe, du kan bruke modulo å vikle rundt tidligere enn som 2 milliarder eller 4 milliarder verdien som vi har snakket om i forelesningen. MARIA: Yeah. Og selv i "grådig" vi kan. DAVID MALAN: Ja, i Problemet satt en, også. MARIA: Ja, fint. DAVID MALAN: Good hint. MARIA: Sorry. Boolsk expressions-- så for boolske operatører, vi kommer til å snakke om alt av disse som du ser her. Så akkurat nå, har vi to likhetstegn oppført for likeverdige. Slik at de er for sammenligning. Så langt har vi bare sett en likhetstegn. Det er når vi tildeler en verdi til en variabel. Så hvis vi har sett int n = 5, deretter vi har tildelt fem til variabelen n. Men hvis vi ønsker å bruke == for Til sammenligning kan vi sjekke om n == 5. Og hvis n == 5, så det er sant. Så boolske operatorer tillate oss, i utgangspunktet, å evaluere boolsk uttrykk til Sant eller usant. Så ikke equals-- vi har utropstegn og likemenn. Så vi kan også sjekke om n ikke lik 5-- så n! = 5. Mindre enn, mindre enn eller lik større enn, større enn eller lik og så har vi den logiske AND og den logiske OR. Og de tillater oss å evaluere flere boolske uttrykk sammen i utgangspunktet komme sammen som en hel boolsk uttrykk. Så hvis vi ønsker å finne et nummer, si, som er større enn 5, men mindre enn 15 på samme tid, vil vi bruke logisk AND-operatoren for å se om n er større enn 5 && n mindre enn 15. DAVID MALAN: Og her, også, det er veldig lett tidlig uhell bruker bare en enkelt-tegn eller en enkelt loddrett strek. Og forhåpentligvis vil kompilatoren kjefte på deg fordi de faktisk har en helt annen betydning. For de nysgjerrige, de er brukes for bitvis operasjoner, opererer på enkelte biter. Men du vil par av dem her. Og super viktig er at første, likhetstegnet, som er det likestilling operatør som motsetning til oppdraget operatør. MARIA: Og den vertikale linjen er ligger mellom slette og Return. DAVID MALAN: Ja. På en typisk amerikansk tastatur. MARIA: Jepp. Så la oss hoppe rett inn betinget utsagn. I Scratch, har du allerede sett, sannsynligvis, hvis uttalelser som lar deg sjekke om noe er sant, så gjøre noe annet. Så du kanskje har lyst å sjekke om din sprite er berøre noen andre sprite eller grensen av skjermen. Og da du kanskje har lyst til å avslutte spillet eller gjøre noe annet. Så syntaksen for at er "if (tilstand)." Så hvis din sprite berører noe, da trenger er inne i klammeparentes. Da har vi if-else uttalelser. Else tillater oss å gjøre noe hvis betingelsen at vi se etter i begynnelsen er ikke sant. Så hvis sprite berører grensen gjør dette, andre gjøre noe annet. Så ellers gjøre noe annet. Da har vi et kort eksempel på dette. Så hvis (military_time <12), vi ønsker å printf "God morgen!" Else vi kommer til å printf "God kveld!" Grunnleggende eksempel. DAVID MALAN: Good. MARIA: Cool. Så nå har vi switch uttalelser. Slå uttalelser generelt kan tillate oss å gjøre mye av det samme at vi bare snakket om med hvis uttalelser. For eksempel, akkurat nå har vi det generell form av bryteren uttalelse som tillater oss å ta en variabel kalt n og sammenligne det med en masse forskjellige verdier, som vi her har kalt constant1, constant2. Vi kan ha mye mer. Og de som er kalt tilfeller. Så hvis vi har en bryter statement-- og dette fungerer bare for integers-- vi har en variabel i dette tilfellet det er n. Hvis variabelen n er lik constant1, vi vil utføre noen kodebit eller noe som vi ønsker å gjøre. Og så ville vi bryte. Så pause betyr at bryter uttalelse vil stoppe utføring hvis n er lik constant1, og deretter programmet vil fortsette. Det vil gå ut av bryter uttalelse og det vil fortsette å gjøre noe annet. Hvis imidlertid, n ikke lik constant1, deretter sak for constant2 vil bli kontrollert. Så hvis n er lik constant2, som andre kodeutklippet vil bli henrettet. Og så vil det bryte Hvis det er lik den. Og så kan vi ha also-- ikke nødvendigvis, though-- en standard sak, som vil skje hvis n ikke lik noen av sakene som du har oppført. Og i standard tilfelle, vi også trenger ikke en pause nødvendigvis fordi den bryter uttalelse vil vite at det er behov for å avslutte etter standard tilfellet hvis det er tilfelle. DAVID MALAN: Men stilistisk, vi alltid sette den inn der. MARIA: Yeah. DAVID MALAN: Yeah. Så spesielt når du starter opp, spesielt hvis blant de mindre komfortabel, ville jeg personlig bare anbefaler å holde fast med ifs og ifs-andens og if-else-if-andens og så videre hvis bare fordi de er litt mer oversiktlig. Dette er en fin optimalisering, eller noen ganger også estetisk det gjør koden mer lesbar. Og faktisk, sannsynligvis mid-semester får vi se et problem satt der det ser bare bedre og lettere å lese for mennesker ved hjelp av en bryter uttalelse. Men ikke bekymre deg klamrer seg til dette for tidlig. MARIA: Yeah. Hvis du har mye av hvis uttalelser, det kan bare ikke være veldig lesbar. Det er kanskje ikke veldig fort for deg å gå gjennom den. Så bytter uttalelser kan være meget nyttig, i tillegg. Og også, ikke remember-- ikke glemmer å sette pausene der. DAVID MALAN: Husker ikke dette. MARIA: Fordi da du kan falle gjennom fra en sak til en annen. Så la oss si at saken constant1 hadde ikke en pause uttalelse i den. Så vi kan falle gjennom inne sak constant2. Og vi ønsker ikke å gjøre det hvis Vi har allerede nådd saken constant1 og det er lik n. Så, for eksempel, dersom vi har en variabel n som inneholder en klassenummer, og vi ønsker å se hva som klasse er-- hvis n er lik 50, vi kommer til å skrive ut "CS50 er Introduksjon til Computer Science I. " Vi så kommer til å bryte. Og det er det. Hvis, derimot, er lik n til 51, kommer vi til å skrive ut "CS51 er Introduksjon til Computer Science II. " Så, igjen, vi kommer til å bryte. Men hvis så vi setter 124, 61, noe annet nummer som du kan tenke på, eller programmet ikke kommer å erkjenne at. Så det kommer til å si: "Beklager, jeg er ikke kjent med at klasse ». Og det kommer til å bryte. DAVID MALAN: Så du kan virkelig se if, else if, ellers ideen her. Det er bare annerledes syntaks for uttrykker nøyaktig samme idé. MARIA: Nettopp. Nå har vi våre trefoldig operatører. Så trefoldig operatører har tre parts-- en tilstand, noe å gjøre hvis at betingelsen er sann, og deretter noe å gjøre Hvis denne betingelsen er usann. Så du ser, i utgangspunktet, syntaksen til det her. Vi har spørsmålstegn, og deretter the-- hva kaller vi dette? DAVID MALAN: Kolon. MARIA: Colon. Takk skal du ha. Beklager. Så la oss se på vårt eksempel til se om vi kan få følelse av dette-- class_num == 50. Så her ser vi vår boolsk operator == som sammenligner det variable class_num til 50. Så class_num butikker et heltall. Og hvis det heltall lik 50, da er vi skal lagre "David Malan" inne i streng professor. Hvis klassenummer ikke tilsvare 50 ", ikke David Malan" kommer til å være professor. DAVID MALAN: Takk. Og så dette synes tilsvarer hva vil du si, ved første øyekast? MARIA: For meg virker det som if-else uttalelser. DAVID MALAN: Yeah. Og faktisk, er denne typen av en pen liner, så å si, for å implementere nøyaktig logikken i if-annet men gjør alt i ett trinn. MARIA: Nettopp. Yeah. Så hvis-else uttalelser kan ta opp mye plass. De kan være for lang for noe så enkelt som dette. Så dette kan være svært konsis og veldig hyggelig. Så nå skal vi inn å se på gjennomføre noe igjen og igjen, så sjekker for en tilstand flere ganger og deretter fortsetter å gjøre noe mens den tilstanden er sant. Så dette bringer oss pent inn mens sløyfer. Til venstre har vi vår første mens loop. Så mens noe er sant, gjøre noe igjen og igjen. Så sørg for å legge merke til at vår tilstanden her er validert på toppen. Mens med våre andre loop-- vi kaller at en gjør-mens loop-- vi gjør noe, så vi sjekker for en tilstand. Og hvis den tilstanden fortsetter å være sant, vi gå tilbake og gjøre ting på nytt. Så den største forskjellen er der betingelsen er sjekket for. Og koden kan aldri være henrettet hvis tilstanden er ikke true med mens loop. Mens med do-while loop, har vi koden som alltid utføres minst én gang. Og så mens tilstanden fortsetter å være sant, vi kan gå tilbake og iterere igjen inne. Så hvorfor tror du vi ville bruke en gjør-mens loop over en stund loop? Høyre. Så hvis vi ønsker å be bruker for noen form for input, hvis vi ønsker å spørre dem å oppgi sitt navn, vi vil i det minste be dem en gang. Og hvis de går inn det navnet, vi er ikke kommer til å spørre dem igjen fordi vi allerede vet det. Men hvis de ikke angir deres navn, eller om de skriv noe som er åpenbart ikke et navn, vi fortsatt ønsker å fortsette spør dem på i deres navn. DAVID MALAN: Og i forelesningen hadde vi én som dette med få positive int eksempel, der det er ingenting å sjekk først fordi du ikke har selv fått en int. Så vi ønsker å gjøre dette-- får en int fra user-- deretter sjekke det, kanskje, igjen og igjen og igjen. MARIA: Nettopp. For loops-- OK. For looper kan tillate oss å gjøre nesten akkurat det samme, så vel. Det er faktisk akkurat det samme. Så det er ingenting som du kan gjøre med for løkker at du ikke ville være i stand å gjøre med mens sløyfer. Men etter looper kan virke litt litt mer komplisert syntaktisk fordi de har tre deler inne hva var før bare tilstand med mens sløyfer. Så den første delen som du havet, venstre-mest, har vi "int dverger = 0." Så det er her vi initial vår variabel. Da har vi et semikolon og "dverger <7." Så dette er der ute tilstanden faktisk er. Så det er det vi vil ha satt bare i mens loop-- "mens dverger <7." Her, som går i midt i vår for loop. Så "dwaves <7." Og da er vår siste delen er "dverger ++," som er der vi oppdaterer vår variabel. Så det viktigste å innse er at dette kommer til å gå gjennom dette for loop syv ganger og kjøre sju ganger. Så vi har sju dverger, og de er alle kommer til å si: "Jeg er her for å hjelpe deg, Snehvit " fordi de er klare å hjelpe Snow White. Med mens løkker, ville vi ha gjort initialisering og oppdatering ikke inne i tilstand, igjen, men enten før eller inne i sløyfen mens å sørge for at we-- fordi vi trenger alltid disse delene. Så for å være sikker på at vi har dem, ville vi har fortsatt lagt dem på, bare ikke i parentesen. DAVID MALAN: Og slik ser like-- i foredraget, for eksempel, Jeg bruker nesten alltid, liker, jeg og n og ganske kjedelige variabler. Det ser ut som du kan bruke mer kløktig heter variabler, også. MARIA: Ja, det er faktisk veldig fin å bruke litt mer beskrivende variabler fordi spesielt hvis noen andre er leser code-- kanskje du sorterer eller hvis du samarbeider med somebody-- du vil være sikker på at de forstår hva du gjør. OK. Så dette er noe veldig funky-- for loop inne i en for loop. Jeg vet ikke om vi har sett dette før. Sannsynligvis ikke. Men vi kan faktisk ha dette-- så looper i stedet for loops. Så er det noen som ønsker å kanskje gå meg gjennom hva som skjer her? DAVID MALAN: Jeg skal ta en stikke. MARIA: Cool. DAVID MALAN: OK. Så spoiler-- vi ønsker å skrive ut ting som er lavt i høyre hjørne der. MARIA: Høyre. Ja, ja. DAVID MALAN: Så vi har bare sette at prøven utgang der. Så jeg kan slutte fra øverste løkke som du er itera over rader de ytterste løkke, så å si. Og du gjentar løpet kolonner med den innerste løkken. Og intuitivt, dette burde forhåpentligvis er fornuftig grunn av natur hvert program vi har sett før, printf, som er funksjonen vi bruker, til slutt, har evnen til å skrive ut ting ut i det vesentlige linje for linje. Som, når du har avgitt en ny linje, det er ingen dobling tilbake og skrive noe høyere i skjermen, i det minste ikke å bruke printf som dette. Og så i den forbindelse, gjør det forstand at den ytterste løkke skal henvise til radene fordi for hver gitt rad, du kommer til å ønske å skrive ut XXXXX, og deretter gå videre til neste rad, XXXXX. Så rekker komme først. Og deretter innen hver rad, du skriver ut kolonner. Hvis du prøvde å gjøre det på den motsatte, ville det sannsynligvis ikke komme ut som du har tenkt. MARIA: Yeah. Vi kunne ikke gå tilbake til forrige rad med printf. DAVID MALAN: Og hva er interessant per dagens prat om omfang, faktisk, er at rad er en int som er deklarert i den øverste løkken. Men legg merke til at det fortsatt er innsiden av, så å si, klammeparentes som umiddelbart følge, selv om det ikke er teknisk innenfor disse klammeparentes. Så rad er i omfang for helheten av kodeutklippet, både på innsiden av den ytre sløyfe for og innsiden av det indre av sløyfen. Men derimot, der er kolonne i omfang? Variabelen kolonne? Ja, bare på innsiden loop. Og det er OK fordi vi ikke tilgang til den utenfor sine klammeparentes. Alt vi gjør er skrive ut en ny linjen helt på slutten der. Så det faktisk er OK. Så dette har effekt, ser det ut som, for å gjøre tre rader og fire kolonner. MARIA: Høyre. Så først går vi gjennom vår første rad. Og bare i vår første rad, gjør vi det fire kolonner på innsiden av første rekke. Så vi skrive ut fire X-er. Og så kan vi gå ut for loop, siden Vi har allerede skrevet ut fire X-er. Og vi ut en ny linje. Og så går vi gjennom samme prosess for to flere rader for å lage en total av tre. DAVID MALAN: Og det er verdt å merke seg er det bare en gjenstand på skriften, det faktum at prøven utgang synes så mye høyere, som om det er mer rader enn kolonner. Men det er bare fordi X er høyere enn den er bred. Det er alt som skjer der, pluss det hvite området mellom linjene. MARIA: Høyre. Kjølig. DAVID MALAN: All right. Så en rask titt på oppgavesettet en, ta noen spørsmål, og deretter utsette? Greit. Så i oppgavesettet en, det er tre- primære utfordringer, til slutt. Men først, finner du at problemet satt spesifikasjonen, som med mange den psets denne høsten, kommer til å gå deg gjennom noen oppvarmingsøvelser, peke deg ut noen ressurser som du kanskje eller kanskje ikke har sett allerede. For eksempel, CS50 har en pakke med shorts, som er korte videoer, ikke i motsetning til dette, men er veldig emne specific-- kanskje fem minutter, 10 minutter i lengde på løkker eller på betingelser eller på algoritmer eller senere mer avanserte emner, så vel. Og vi vanligvis legge ned de inn i problemet settene slik at studentene har en ressurs som en anmeldelse av materiale som kan ha allerede kommet opp i foredrag eller delen. Men denne måten er det mer fokusert og mer på fingertuppene. Vi pleier også å bygge inn i problem setter ting kalt walkthroughs. Slik at nesten alle eksemplene jeg gjør i foredraget på scenen her, vi også har skutt på kamera i fremme en mer tregere, en mer intim gjennomgang av meg på min laptop av denne koden, linje for linje slik at i klassen, vil vi ofte skumme gjennom noe eller noen vil skyte inn med en svare på et spørsmål. Men det betyr ikke nødvendigvis synke i for alle i publikum. Slik at du finner kode walkthroughs for de fleste av eksemplene som vi gjør her i foredrag, slik at du kan gå gjennom det i ditt eget tempo og spole bakover eller fremover eller hoppe helt, hvis du ønsker. Det er ofte noen warm-up spørsmål som be deg om å sortere av forsterke dette materialet og sørg for at du er komfortabel før du fortsetter med resten av PSet. Og så, selvfølgelig, det er den PSet selv. Og en av de tingene vi veldig bevisst gjøre i CS50 er nesten hver uinteressant eller intellektuelt uinteressant mekanisk skritt som du kan ha å gjøre er nesten alltid svært godt dokumentert. I løpet av semesteret, vil vi begynner å spørre mer retoriske spørsmål som husker hvordan du gjør dette, eller at? Men generelt, finner du at oppgavesett får du gjennom mekanikerne av noe slik at de interessante, intellektuelle utfordringer blir til slutt overlatt til deg studenten. Med det sagt, Zamyla, til hvem vi holdt henviser i dag i foredraget er en av våre mangeårige ansatte medlem som også innehar walkthroughs på bestemte PSet problemer som mario og grådig, men ikke vanne i år. Og det er i de walkthroughs at hun ofte har noen tips og triks for hvordan du går frem, aldri fortelle deg nøyaktig hva du skal gjøre, men rather-- som en tilstand, hvis du will-- gi deg minst en par ideer, slik at det er opp til deg, til slutt, for å avgjøre hvordan å nærme seg dem. MARIA: liksom som et høyt nivå forståelsen av logikken i hvilken Vi ber deg om å gjøre. DAVID MALAN: Nettopp. Og, faktisk, Zamyla s walkthroughs er ment å svare på ofte spurte spørsmål om hvor jeg begynte, spesielt når disse lange spesifikasjoner litt skremmende gitt all tekst og bilder som de har i dem. Så water.c, finner du etter at du har fullført det, er faktisk relativt ukomplisert. Absolutt er en gjeng dere kommer til å banke hodet mot veggen prøver å finne ut hvorfor det ikke er kompilering eller hvorfor den ikke kjører riktig. Men når du er ferdig med det, og når du har brukt litt tid bryting med noen av feilene som du måtte ha, du vil finne at det er et meget kort program. Det kan gjøres i løpet av få linjer med kode, hvorav de fleste vi har sett her i foredraget allerede, hvis du monterer de riktige byggesteinene. Og som vi foreslår her, det kommer til å spørre du angi hvor mange minutter noen tar en dusj på campus. Vi angir i problemet angi hastigheten av vannstrømmen i, som, en lav-flow dusj hode, mye som Seinfeld klipp vi så i går eller det motsatte av denne. Og så må du bare å gjøre litt matte, really-- aritmetikk med C for å fortelle oss hvor mange, omtrent, flasker med vann er at tilsvarende hvis vi er ta en n-minutters dusj. Nå, i mario.c, dette kommer å være en litt lengre program. Det er likevel ikke til å være så lenge. Bare noen få linjer som er lengre enn water.c. Men det kommer til å være mulighet å gjenskape den gamle skolen Mario pyramide fra Super Mario Brødre eller noen oppfølgings. Det kommer ikke til å se så penere eller like fargerik som at man der. Vi er bare nødt til å bruke litt hashtags som vi har her på skjermen ved hjelp av ASCII-tekst. Men det vil tilnærmet den samme ideen. Og det kommer til å bli en utøve som ved første øyekast virker ganske simple-- bare skrive ut en enkel pyramide. Men det er et par kjennetegn her som er interessant. Legg merke til at den høyre kant pyramiden faktisk har bredde to. Så det er to like høyde kolonner, som gjør det krever litt litt av tanken å gjøre sikker på at du får det helt riktig, som i motsetning til bare en perfekt vinklet linje. Så det er litt av et hjørne saken men matcher selve spillet. Og det er også ikke-åpenbare først øyekast hvordan du skriver ut det hvite området. Så når jeg ser på sample utgangs her-- og det er også i spec-- det slags ser ut som et rektangel, men en diagonal rektangel har blitt kappet av, og det er bare mellomrom, så å si. Og så en vanlige Spørsmålet her er alltid godt, hvordan flytter jeg de hashtags over til høyre? Eller hvordan skriver jeg det tomme rom? Og det er faktisk enklere enn de fleste studenter tror. Høyre? Du kan tilnærme det visuelt ved bare trykke på mellomromstasten en gang eller to eller tre ganger. Og så selv om med printf vi nesten alltid skrive ut en streng eller en int eller et ord som "hei, verden "eller serie av ord, du kan også bare skrive ut sitat, plass, unquote. Og som faktisk vil gi du et hvitt område der. Så hold det i tankene, og ikke overthink dette. Du må virkelig bestemmer rad for rad for rad, ikke ulikt ditt eksempel en øyeblikk siden, hvor mange av disse kolonnene skal være mellomrom og hvor mange av dem bør være hashtags. Det vil ta litt tid, men det er til slutt en logikk puslespill av former. MARIA: Yeah. Men logikken går rad for rad kommer til å være svært nyttig her. DAVID MALAN: Yeah. Jeg tror eksempelkoden du gave-- selv men det var ikke et komplett program. Du må fortsatt int og hoved og ugyldig og #include stdio.h, en masse ting fra forelesningen. Men byggesteinene ser ut til å være der. Og så til slutt er noe litt mer algoritmisk. Så det viser seg at hver gang du gå inn i CVS eller storkiosk og noen hender deg på kasserer regninger eller mynter som endring, det viser seg at de, mennesker, om ikke de vet det eller ikke, bruker antakelig hva som er kalt en grådig algoritme, der hvis du skylder, sier $ 21 i endring fordi en eller annen grunn du har kjøpt noe veldig billig med en veldig stor regning på CVS, det ville være veldig irriterende hvis den kasserer ga deg 21 singler, eller verre ennå, en hel masse mynter. Snarere hva en fornuftig person er sannsynligvis kommer til å gjøre, er at de kommer å ta en $ 20- og deretter a-bill 1 $, og hånd du bare to regninger i så fall. MARIA: Så de er ute etter å minimere endringen at de gir tilbake til deg. DAVID MALAN: Nettopp. Og samme avtale med mynter, så vel. Hvis du skylder, sier, $ 0,50, forhåpentligvis du ikke vil at 50 pennies. Du stedet ønsker to- kvartalene, for eksempel. Nå gjør dette anta at kassereren har nok av hver valør som han eller hun kanskje ønsker å gi deg. Men vi tillater deg å anta like mye i problemet. Og målet til slutt er å implementere i C-kode en grådig algoritme. Slik at brukeren får lov å skrive inn hvor mye endre han eller hun skyldte med dollar og øre, en slags flytende punktet verdien sannsynligvis. Og så må du gjøre regnestykket og finne ut algoritmer, vel, hvor mange mynter kan jeg gi du minimalt for å gi deg akkurat den mengden endring. Men det kommer til å bli en noen vanskelige deler her, ikke sant? Som om det er hele unøyaktighet problemet. MARIA: Nettopp. Så flyttall verdiene har unøyaktighet. Har vi snakke om dette i foredraget i dag? DAVID MALAN: Vi gjorde det siste gang i forelesning. Vi snakket om unøyaktighet. Og du ikke ønsker å lure brukeren av hvor mye forandring han eller hun er skyldig. Og så walkthrough, i oppgavesettet spesifikasjonen, gi noen trodde til slutt, som til hvordan du kan redusere de imprecision feil, potensielt. Det er unngåelig, absolutt, for inngangene vi snakker om. Og, faktisk, pennies-- kanskje vi skal utsette til Zamyla, Jeg tror, ​​for triksene der. Så til slutt, vil du finne en progresjon av problemene denne uken, hvorav den første er ganske liten, deretter medium, så litt større. Men alle av dem bruker bygningen kvartaler fra denne siste uken, fra denne supersection, Problemet satt spesifikasjon setter deg på utallige ressurser. Men likevel, hvis i det hele tatt sliter, spesielt blant de mindre komfortable med ingen tidligere bakgrunn, kommer til kontortid på mandag og tirsdag og Onsdag og torsdag. Gå til CS50 Diskuter via kursets hjemmeside, via hvor du kan chatte med ansatte og klassekamerater. Men til slutt, tror jeg beste råd er bare å starte tidlig. Det er ikke den type klasse som deg bør starte psets onsdag natt, eller verre torsdag kveld. MARIA: Mitt beste råd er å ha startet innen mandag. DAVID MALAN: mandag. Så hvis du ikke har startet already-- no. Men selv om ikke mandag, så tirsdag. Jo tidligere jo bedre. Og det er grunnen til den Kurset har så mange sene dager er for å gi deg en bit av en psykisk press å starte tidligere, men fortsatt la ting skli når ting tar lengre tid enn du forventer. MARIA: Og du ønsker å gjøre bruk av kontortid så mye du kan, også. DAVID MALAN: Eventuelle spørsmål? Greit. Vel, hvorfor ikke vi utsette her?