[MUSIK SPELA] ANDI Peng: Detta är CS50, och Välkommen till vecka två avsnitt. Detta är faktiskt medan vecka två av våra class-- faktiskt, den första veckan har vi haft avsnitt. Handuppräckning, hur många av er alla kom till super avsnittet i förra veckan? OK, det är OK. Det är ok. Hur många av er såg super avsnitt förra veckan? OK. Och ni gjorde bra på problem ställa in ett? Så jag kommer att ta det att vi har ett gäng riktigt intelligenta barn i denna klass och saker och ting kommer att bli bra. OK. Så first-- Först ska vi bara gå till kort gå över dagordningen för idag. Vi pratar om kurs logistik. En hel del av er förmodligen har frågor om hur saker och ting fungerar i den här kursen. Vi kommer att besvara dem. Vi kommer att kortfattat gå över loopar i fallet någon av er missade super avsnitt. Vi pratar om ASCII kartläggning. Vi pratar om matriser, funktioner, kommandoradsargument. Och slutligen, vad ni förmodligen alla verkligen vill vara här för att lära sig om, är din pset2. Vi kommer att ha några trevliga trick och tips för hur man gör det. OK. Också det andra, vi har massor av godis här. Alla som gillar godis, bara komma upp hit. Ta några. Jag har ett gäng. Vi har en ton på kontoret. Jag vill verkligen inte att äta godis hela dagen. Ni borde äta allt godis, eftersom jag tog den här för er. Bara äta godis. Det kommer att finnas godis varje avsnitt. Så först, vem är jag? Mitt namn är Andi Peng. Jag är chef TA CS50 här på Yale. Och förutom det kommer jag också be-- Om någon skulle like-- din löpning kompis, din axel att gråta på. Om natten innan din pset due, du har ingen aning om vad som händer, hit me up. Vi kommer att ömka tillsammans, et cetera. Bara vet att jag är här som en resurs för dig som frontlinjen hjälpa er räkna ut hur att lösa problem i CS50 och utanför. Min e-post är andi.peng@yale.edu. Jag ska också skicka ut en enskild e-post med mitt telefonnummer i det så att inte alla på Internet kan se mitt telefonnummer. Tveka inte att ringa mig när som helst. Allvarligt, är min telefon oftast knutna till min hand. Jag kan inte svara inom ett par minuter. Jag kan inte svara inom ett par timmar. Men jag kan garantera dig, om du e-maila mig, om du kallar mig, text mig, kommer jag att svara inom 24 timmar. Ofta kommer jag svara före att eftersom jag förstår att alla har fått en del problem, och du vill att dina svar besvaras mycket snabbt. Men om du ringer me 30 minuter innan den bit som beror torsdag night-- vara, Andi, hjälp mig, Jag har inte started-- jag kan ge du att axel att gråta på. Men det kan vara dags att tänka på hur man inte ska göra det nästa gång. OK. Oj. Hur går jag tillbaka? Det går vi. Så i den här kursen, vi har en ton stöd för alla. Förutom att bara sektioner här, som du varje vecka får spendera 90 underbara minuter med mig, Vi har också kontorstid. Hur många av er har redan varit kontorstid för att få hjälp? Bra. Det är riktigt bra att se, eftersom vi har en personalstyrka på över 45 resebyråerna och certifikatutfärdare utbildad för denna kurs som är här för att hjälpa er med era psets. Måndagar de är hålls i TEAL klassrum i 17 Hill House här vid Yale. Tisdagar och torsdagar, de är hålls i commons. 8:00 till 11:00 ganska mycket varje vardag. Kom in, kom ut. Eventuella problem, nej problem-- just kommit in, och sedan ska vi hjälpa dig med det. För det andra, förutom att kontorstid och sektioner, har vi också shorts. Har någon någonsin sett ett par av shorts eller genomgångar i videor på hemsidan? OK. Så de är riktigt, riktigt bra. Vår härliga Harvard produktion laget där borta på den skolan norrut, har de filmade och producerade dessa otroliga genomgång videor. De tar dig steg för steg genom hur man ska gå om att lösa ett problem. Ofta, om du är förvirrad om ett enkelt koncept, en sällsam begrepp, ta en titt, eftersom vi förmodligen en kort om det någonstans på vår hemsida. Och det är oftast en stor resurs att leta efter när du först förlorat på hur man hanterar ett problem. För det tredje har vi också study50 och reference50. Så studera 50 på webbplats är bara en länk. Det är, tror jag, study.cs50.net eller något sådant. Bara Googla det. Vi har massor av bilder som framställts. Vi har massor av shorts och walkthroughs-- saker hela kompilerade mycket trevligt och snyggt för er alla att bläddra igenom, ser några begrepp att du är förvirrad om. Det skulle förmodligen vara täckt därborta i study50. Reference50-- liknande. Vi har en hel del olika anteckningar lätt tillgängliga för ditt förfogande. Och slutligen, har vi vad som är kallas CS50 Diskutera, ett forum där, om kvällen innan du gör dina problem, säger, du har en fråga. Logga in på CS50 Diskutera. Ställ din fråga. Och sedan något av hundreds-- kanske thousands-- av kamrater tar denna klass på nätet kommer att logga in. Och kanske någon kan få ditt svar innan TA burk. Det är i huvudsak bara en online-forum som vi kan alla använder för att diskutera våra problem. Det är coolt. OK. Så problemet sätter. Vi är på väg rätt i tjock problem ställa in två. Många av oss har redan kämpade genom problembild en. Vi vet redan att kanske väntar för den sista natten för att göra din pset är inte det smartaste man kan göra i CS50. Tips och tips i huvudsak för framgång läsa hela spec. Hur många av er har redan läs spec för pset 2? OK. Det är en fast mängd. Jag vet att ni har förmodligen erkänt nu specifikationer är riktigt långt. De är riktigt, riktigt länge. Det är verkligen svårt att läsa varje rad av det noggrant ord för ord. Du vill bara skumma där Det säger åt dig att göra något. Jag kan garantera er, gör inte det. Om du gör det, är du förmodligen kommer att sakna någonstans där det talar om för dig hur man startar ett problem eller det talar om för dig vad du ska namn ditt problem eller det talar om för dig, Detta är förmodligen det bästa sättet att börja göra ditt problem. Och då kommer du att gå förlorade. När du försöker läsa din spec halvvägs igenom, en hel del av den viktiga information-- att du inte kommer att kunna verkligen tillgång. Så läs hela spec. Försök att läsa hela spec innan du kommer till avsnittet, för då, när vi tala om pset, vi alla kan ha en idé om vad som händer på. Det andra är detta ett koncept att jag ska vilja referera en hel del under kursens gång termin. Men i huvudsak möta oss halvvägs, eller hur? Mig, din TA och Jason som kurs manager och SCAZ som din professor och David som din professor och alla de andra härliga resebyråerna i den här kursen, assistenter i denna course-- Vi kommer att göra vårt bästa att se till att du är inställda upp för att lyckas i denna kurs. Vi kommer att hålla avsnitt. Vi kommer att hålla kontorstid. Vi kommer att svara i telefonen samtal, svara på dina e-postmeddelanden, göra allt vi kan för att göra att dina frågor besvaras. Men hjälpa oss också. Träffa oss halvvägs. Om du kommer till kontorstid inte har gått till avsnitt, inte efter att ha sett föreläsningarna, som inte har någon aning om vad som pågår, att se ut, hjälp mig. Jag kommer att se ut, ja, jag är ledsen. Det kan vara dags att låna som axel att gråta på, eftersom jag är inte säker vad jag kan göra för att hjälpa dig om du inte försöker att åtminstone hjälpa själv lite i början. Träffa oss halvvägs. Du vet, kom beredd att svara och få redo att engagera sig i materialet. Det gör saker så mycket enklare för alla inblandade. Ja, det är ganska mycket det. Betygssättning. Så på kursplanen, det är ganska djupgående om hur vi klass. Men i huvudsak fördelningen i detta är 50% av din klass kommer att vara de psets, som är härlig, eftersom det är där du spendera stora Majoriteten av din kurs tid på. Quizzes 40%, och din slutliga projektet kommer att vara 10%. Det kommer att finnas två frågesporter hela loppet av terminen. Jag tror att tid och datum är också noterat på kursplanen. Det sätt som vi kommer vara klassificera dina psets är att vi har i huvudsak fyra värderingar som vi tilldelar varje lönegrad. Vi har ett värde på tillämpningsområde, korrekthet, design och stil. Så som ni ser, det är den typen av vår formel för att beräkna psets. Tre vi ger mest vikt korrekthet, eftersom det självklart din coach ska testa i de fall att vi vill att det ska testa. Ni har alla check50 till ditt förfogande. Det är en mycket användbar funktion att ni kan alla ladda upp din kod till våra servrar, där vi kommer att kolla upp det åt dig. Och du har sett dem Frowny ansikten, smiley ansikten. De är riktigt, riktigt bra. Var inte det student som gillar försöker att hårdkoda in alla svar på dem. Jag har definitivt sett en pset där någon såg alla värden check50 och de bara hårdkodad in-- om detta nummer, skriva ut det här numret. Om detta antal, skriva ut det numret. Gör inte det. Även om tekniskt check50 är korrekt, ditt sätt att lösa Problemet är inte korrekt. Så bara använda check50 sparsamt. Men också se till att du förstå hur det fungerar, programmet fungerar förutom check50, eftersom vi inte kan testa alla möjligt fall av check50. Vi kommer att testa några av dem. Design är i huvudsak hur väl utformad är din kod? Om du är kopierings klistra multipel rader kod många, många gånger. Kanske du inte har riktigt den bästa designen i koden. Kanske är det dags att lägga till att slingan. I huvudsak är det här bara alla om att försöka göra din kod, försöker skriva din kod så effektivt som möjligt så att ditt program körs så fort som möjligt. Slutligen har vi stil. Så stil är typ av en godtyckligt, subjektivt sikt. Jag vet att vi officiellt har en stil 50 guide för CS50, där det säger, åh, du bör ha ett utrymme här. Du bör typ av format koden på detta sätt. Du bör nämna saker på detta sätt. Jag bryr mig egentligen inte, per se, hur du väljer att styla din kod, precis så länge du stanna konsekvent. Till exempel, om du vill Lämna ett mellanslag efter fyra innan fyra loop, bara göra det varje gång. Inte typ av göra det. Gör inte det andra tider. Om du gillar att hålla lockigt hängslen utrymme på ett visst sätt, bara alltid göra det på det sättet. Inte typ av göra det någonstans här och någonstans inte där. När vi klassificera, det är verkligen svårt om jag har ingen aning om hur du formatera din kod, saker är knäppt och på sin plats. Om du bara hålla det konsekvent, är det mycket lättare för mig som större för att kunna läsa din kod. Det är mycket lättare för dig som student för att kunna titta igenom din kod och se vad som är fel med det slash varför det finns problem. Style är en av de enklaste saker ni kan göra för att få full poäng. I huvudsak, om du bara bryr sig, om du betalar fem minuter av uppmärksamhet till din kod varje vecka, bör du att få hela stilpoäng. Slutligen har vi vad som kallas multiplikatorn utrymme. Scope-- jag vet att det är en stor ord, särskilt i denna klass. Men omfattning, allt det betyder är att du försöker de psets till bästa förmåga. Om du sätter in tre av dina fyra problem och inte ens försöka sista, är du förmodligen kommer att förlora några poäng på omfattning. Även om du bara börja problemet, gör ditt bästa för att gå igenom det. Även om det inte fungerar, vrid den i, eftersom det visar och demonstrerar för oss att du försöker att du försökte problemet set det bästa av din förmåga. Och då kan vi ge dig full poäng för räckvidd. Scope är också mycket viktigt när vi tala om lägsta pset poäng droppe. Så under loppet av termin, ni har nio psets. Och vi faktiskt kommer att släppa den lägsta poäng av dessa nio, men bara om du har full omfattning poäng. Så om du vänder på ett ofullständigt pset, Tyvärr kan vi inte släppa det en, eftersom din räckvidd punkter inte slutförts. Så även om du har den fruktansvärda vecka där du är döende och du är sjuk eller din hund dör, din katt dör, och du överbelastad med läxor, bara försöka pset. Gör det till det bästa av din förmåga. Om det inte fungerar, det spelar ingen roll. Bara slå in. Åtminstone kan vi ge du pekar på ansträngning. A för insats i denna klass. Åtminstone lägsta poängen droppe för ansträngning. Så ja. Det är ganska mycket det. Finns det någon som har några frågor så långt på hur vi klass i klassen? Eller någon av dessa? Vilken som helst av dessa så far-- sektioner kontorstid? Häftigt. OK. Så det här är ett ämne som ingen man verkligen tycker om att prata om. Jag vet inte riktigt gillar att prata om det. Ni vill egentligen inte att höra mig tala om det. Men tyvärr, vi alla måste prata om det. David tillbringade 20 minuter en föreläsa prata om det. Och som är föremål akademisk hederlighet. Så vi alla här förmodligen har skrivit en essä gång i vår Yale karriär. Vi har förmodligen fått ett samtal där vi har blivit tillsagda att inte plagiera vår uppsats, eftersom detta arbete är inte vårt. I datavetenskap, vi har samma typ av koncept. Allt arbete som du skickar, all kod som du skriver bör vara kod som du har skrivit. Borde inte vara kod som du har kopieras från någon annanstans. Borde inte vara kod som du har googlade och plumsade i och du vet inte riktigt om det fungerar. Du har lite av en känsla av vad det gör, men inte riktigt. När du är osäker, i huvudsak, det bara vara rimliga. På vår kursplan, vi har en hel lista med saker vi ser som rimliga kontra inte rimligt. Exempelvis rimlig är du och din vän diskuterar vad det bästa sättet att gå om logiskt lösa ett problem. Det är ganska rimligt. Vad skulle inte vara rimligt är om du killar fick tillsammans, skrev samma kod, och vände i samma kod. Det är inte rimligt. Samma sak, typ av en uppsats. Om du vill diskutera med din vän, hey, Detta är vad jag vill skriva om. Dessa är de steg som jag vill vidta för att skriva om det, bra. Det är underbart. Vänligen samarbeta med varandra. Om ni börjar skriva samma sak, vända i samma uppsats, är det mindre OK. Så när du är osäker, bara inte göra det. Här har vi i CS50, har vi skript som körs för att automatisera testa inte bara riktigheten av din kod, men också det unika i din kod. Så snälla inte sätta oss i det läge att behöva hänvisa ditt ärende till ExComm. Vänligen bara för alla, låt oss bara gör detta till en underbar upplevelse. Alla lär sig bättre, vi alla är gladare, och vi är alla inrättas för att lyckas i denna kurs. Något som är mycket unikt denna klass som jag tror att alla borde verkligen uppmärksamma är att vi har vad heter ånger klausul i vår kursplan. Så i huvudsak, inom 72 timmar, om du tror att du har gjort något du vet inte riktigt var lämpligt, kom till oss. Vi lovar att inom 72 timmar Vi kommer att hantera ärendet själva utan att hänvisa till en högre myndighet i administrationen. Så om du kommer till mig och säger: Andi, hej, jag är verkligen ledsen, men jag tror att det finns ett par rader i mitt kod i går kväll som jag typ av googlade, fick av Stack Overflow, kopiera och klistras in, och jag är verkligen, verkligen ledsen om det, låt mig veta. Please do not bara låta det gro och bara hoppas att jag fånga den. Vi kommer att fånga den. Just kommit till mig. Låt mig veta inom 72 timmar. Vi ska räkna ut en lösning. Och vi lovar att vi inte kommer att hänvisa till universitetsmyndigheter i huvudsak. Så det är i ditt bästa intresse att bara vara ärlig mot alla deltar i kursen. OK. OK. Så nu snabbt innan Jag går vidare, inte någon har frågor om logistik om hur kurser vi ska köra, hur sektioner går att köra, något av detta? OK. Yeah. PUBLIK: [OHÖRBAR]? ANDI PENG: Ja. Så quizzes-- hur många av er är i måndag / onsdag avsnitt? Hur många av er är i tisdag / torsdag? OK, så det är en fast splittring här. Så det sätt som vi kör det vid Yale är att vi kommer att ha två separata quizzes-- en för varje section-- som kommer att fattas under lektionstid. Jag tror att det är oktober, i slutet av oktober, något liknande, som vecka ett av testet. Ja, så bara komma till klassen. På den måndag eller onsdag, du tar testet. På den tisdag eller torsdag, du tar ett annat frågesport. Men samma material kommer att täckas. Yeah. Bra fråga. Yeah. PUBLIK: Var ska vi gå att kontrollera våra kvaliteter? ANDI PENG: Ja. Så jag kommer att skicka ut ett e-post oavsett varje vecka när frågesporter är graded-- eller, ledsen, när psets betygsätts. Psets vanligen vänt i vid middagstid eller fredag. Så jag lovar att jag kommer att försöka få dem tillbaka till dig genom middagstid följande fredag. När jag grad en pset, kommer jag att skicka en anmälan på betyget boken som talar om din poäng kan ses på nätet. Så just denna vecka, efter att jag avsluta gradering förra veckans psets, ni kommer att få en e-post anmälan berätta, Hej det är där du gå för att se dina betyg. Och du kan se varje uppdelning av dina betyg. Du kan se kommentarerna. Åh, snabb sak också. Kommentarsfältet i den stora Boken är där jag kommer förmodligen tillbringar större delen av min tid betygssättning. Så en sak som är verkligen viktigt när ni tittar på dina betyg på din psets är inte bara ute på den fysiska ställningen men också tar tid att verkligen läsa mina kommentarer. Ofta som ger dig feedback om hur du löser ett problem. Om du behöver göra något lite bättre, konstruktiv kritik är vanligtvis bäst ges i de kommentarerna. Så snälla, snälla, jag kommer att spendera tid på att skriva kommentarer. Snälla, jag skulle verkligen uppskatta det om ni skulle läsa dessa synpunkter. OK. Häftigt. Okej. Så vi kommer att börja prata och bara granska snabbt en del av materialet från vecka noll bara så vi är på höger sida för börjar denna veckas problem. Så medan slingan är en av de tre typer av slingor vi diskuterat tidigare i denna klass. Ett tag slinga i huvudsak är skriven i syntaxen där, medan ett visst villkor, göra det upprepade gånger, eller hur? Tänk på det i den här bilden här. Du kommer att börja på en viss punkt i koden. Du kommer att komma in i slingan skick if-- jag inte veta-- x är mindre än ett. Om det är sant, du kommer att exekvera slingan. Och du kommer att fortsätta göra det igen, igen, igen, över och over-- vilket är varför det är ett loop-- tills ditt tillstånd blir falskt. Så på detta sätt, en while-slinga är ett av de enklare sätten att skriva någon form av tillstånd som behöver upprepa om och om och om igen. Bara vara försiktig när du skriver någon form av slinga att du har en exit skick som samt en uppdatering av vad det är så att din loop inte bara köra om och om igen oändligt. I vilket fall som helst, du kommer att vilja vara säker att du ändrar någon aspekt av koden eller i slutet av slingan bara för att se till att du har ett sätt av framsteg mot villkoret att du vill träffa till slut. Innebär det vettigt att alla? Vi vill inte bara vara fångas upp i denna spiral där Vi går runt och runt och det finns inget sätt att bryta slingan. Och varje slinga i huvudsak har ett sätt att göra det. OK. För det andra, många av er i dina Mario psets antagligen tvungen att anställa denna typ av slinga. Det kallas en gör while-slinga. Först av allt, kan någon berätta för mig vad skillnaden mellan en gör while-slinga och en while-slinga är? Yeah. PUBLIK: Det gör while-slinga körs först [OHÖRBAR]. ANDI PENG: Ja, exakt. Så en gör while-slinga alltid gör vad är inuti do, inom hakparenteserna där och gör detta villkor innan kontroll för the-- ledsen, gör det koden innan kontroll av tillståndet. Och det är särskilt relevant för oss här i denna klass, eftersom de flesta gånger vi kommer att vilja uppmana användaren för någon form av ingång. Och sedan, beroende på ingången de ger oss, då kan vi utvärdera, oh, gör Vi måste få dem igen? Så i Mario, om användaren gav dig en negativ höjd, till exempel, du kommer att första prompt och göra vad som är inuti. Då du kommer att kontrollera stund. Du vet, är negativ 1, är att ett positivt tal? Om det inte, jag kommer att gå tillbaka och upprepa göra och upprepa och upprepa och upprepa tills de slutligen ge dig ett nummer som du vill, att vi alla kan använda i vår kod. Det är ganska viktigt för väsentligen varje inmatning från användare. Jag kan garantera dig någon tid i en pset där Vi ber dig att mata in någon form av kod, vi är förmodligen kommer att ge dig ett testfall där vi är kommer att ge dig något dåligt som är kommer att försöka bryta koden. Om vi ​​försöker be dig att mata in ett heltal, kan vi bara ge er en sträng och se hur du skulle hantera det. Om vi ​​ber dig att använda en ålder, vi kan ge dig ett negativt tal att se hur du skulle hantera det. Se bara till att ni testar för fall där du inte får det bästa input, låt oss bara säga. Och en gör while-slinga är ofta det bästa sätt att designa din kod så att den uppfyller direktivets tillämpningsområde. OK. OK. Så det här är förmodligen den mest komplex slinga av de tre att vi har tittat på hittills. Och det verkar mycket skrämmande vid första. Men jag garanterar dig, när ni få kläm på hur man använder en for-loop, det är en av de mest användbara saker, mest användbara verktyg i din arsenal för att gå vidare i denna klass. Så till exempel, i Scratch, vi hade detta mycket enkelt block som bara sa upprepa detta viss fraser visst antal gånger. Förresten, SAJ-- det är SCAZ Andi Jason. Vi skriver ofta våra e-postmeddelanden SAJ. Om vi ​​säger SAJ, inte förväxlas. Det är bara vi. Så i Scratch, kunde vi ha ett block som sagt, jag upprepar älskar SAJ! 10 gånger. Väldigt enkelt. Logiken bakom detta är en mycket, mycket enkelt, eller hur? Jag vill först gå igenom första tid och ser att, för andra gången och se att tredje gången, osv och så vidare, tills du träffar till 10. Och hur vi skulle innebära att kod är bara genom en enkel for-loop. Så för, du kommer att deklarera din variabel här, i detta fall, med en int. Vi kommer att kalla den i. Vi kommer att initiera den till 0. Och stopp utgåvan är kommer att vara i är mindre än 10. Och uppdateringen kommer att vara i ++. Och inom slingan, det kommer att exekvera tills slutligen det träffar änden av Skick- där fall, det kommer att bryta slingan. Det bör finnas saker som du killar har alla slags sett förut och var tvungen att göra för ditt problem ange ett. Finns det någon som har några frågor om efter loopar just nu? OK. Bra. OK. Så för er som har läs pset spec för denna vecka vet att vi kommer att behöva anställa något som kallas ASCII och ASCII tabellen. Så David i föreläsning gick över kortfattat hur datorer essentially-- allt kodas i en dator i binär, i nollor och ettor. Och det sätt som datorer kan att lagra olika värden utöver till nollor och ettor är genom att kartlägga dessa siffror för att representera andra siffror eller i huvudsak andra tecken. Så i detta fall, en ASCII table-- allt den gör är kart tecken eller tecken, till nummer. Så källkoden filen i din computer-- det ser, hey, ett gäng nollor och ettor, nollor och ettor, nollor och ettor. Det är vad som lagras i faktiska minne på din dator. Men när vi människor vill kommunicera med datorn, vi want-- säga, till exempel, Om jag vill att versaler A, Jag kommer att behöva något sätt att tala om för datorn, åh, när jag skriver versaler A, menar jag denna representation i binär. Och så som vi gör som kastade en godtyckliga sak som kallas en ASCII tabellen, där vi, som människor, som programmerare, för en tid sedan, vi godtyckligt beslutat att vi skulle tilldela dessa nummer värden till dessa tecken. Så ni kan google detta online. Jag tror att det finns en länk till den i din pset-- bara en ASCII karta bord, ASCII tabell. Det översätter bara binär siffror till tecken. Och det kommer att bli mycket användbart för ditt problem set när du vill beräkna något eller om du vill visa vissa tecken eller heltal eller manipulera vissa tecken. Det kommer att bli mycket viktigt att ni alla vet hur man navigerar en ASCII tabellen. Så till exempel versaler A representeras av antalet 65. Och gemener a representeras av 97. Därför är det viktigt att veta att Skillnaden mellan de två värdena är 32. Ofta, om du behöver konvertera från en till den andra, är skillnaden 32. Och oroa dig inte om du är snäll förvirrad på detta först. Vi ska gå över hur vi skulle använda denna i själva koden. OK. Så för de av er med bärbara datorer ut, känn dig fri att dra upp en ASCII tabellen, eftersom dessa kommer förmodligen kräver ni att referera vad karaktärerna är. OK. Så att veta att vissa tecken mappas till vissa nummer, om jag skulle köra bara den första linje som code-- printf en, små bokstäver a, minus versaler A. Finns det någon har en gissning om vad som skulle vara utskrift av skärmen just nu? Så först av allt, vad gör gemener en representerar? Vilket nummer är att kodas i ASCII-tabellen. Förlåt? PUBLIK: 97? ANDI PENG: 97, bra. Och vad är versaler A? PUBLIK: 65. ANDI PENG: Så vad är 97 minus 65? Publik: 32. ANDI PENG: OK. Så vad tycker ni kommer att hända när jag ingång som kodrad i min dator? PUBLIK: [OHÖRBAR]. ANDI PENG: Tyvärr tala. Inga problem. Detta är en mycket säker miljö, minus kameran. Vi kommer alla att-- inga bekymmer. Bara vi alla kommer att låtsas som det är bara vi kylning i det här rummet. Inga problem. Ingen fråga är för dum. Inget svar är en dum svar. Jag förmodligen kommer att göra misstag under min undervisning. Allvarligt, killar, bara slänga ut det. Var säker på dig själv, du vet? Så vad var det? Vem sade att förra svar? OK. Shout så trevligt och tydlig. PUBLIK: 32? ANDI Peng: 32. OK, låt oss köra den här koden och se om det är vad som händer. OK. Så som ni kan typ av se, den typiska notation jag har ställa dig här för hur vi skulle anställa någon form av program i vår dator. Vi har vår huvudsakliga funktion inom vår huvuduppgift. Jag kommer bara att kopiera klistra in den här kodraden. Också vara försiktig när ni kopierar och klistrar in koden. Ibland är vissa operatörer inte klistra över korrekt. I så fall, minus tecknet var faktiskt ett streck. Och så att datorn inte plocka upp. Så jag var tvungen att gå tillbaka och fysiskt skriva in det. Bara vara försiktig när ni gör det. OK. Vi kommer att köra det här. Så vi kommer att cd i vår section2. Jag har kallat det här programmet asciimath. Så kom ihåg, när vi kör någon program, vi vill först kompilera den genom att köra det genom vårt märke. Och sedan vill vi faktiskt köra programmet genom att göra punkt snedstreck. Så vi kommer att ./asciimath. Höger, det går vi. Och vi ser 32. Bra gjort. Du förtjänar en bit godis. Candy för dig. Förlåt. Okej. OK. Så vi kan gå tillbaka till vårt exempel här. Aah, nr. Aah. OK. Jag kommer bara att hålla det så. OK. OK. Så när ni kan se, kan vi göra massor av mycket intressanta saker, en hel del mycket coola saker, en hel del mycket komplicerade saker som involverar ASCII-tecken och siffror. När du kommer ner till ledningen fem, det är en hel del att följa. Vi kommer inte att gå genom sektionen. Känn dig fri att, om du kan, resonera ut på papper först på vad som ska hända när du matar in en sådan sträng värden. Till exempel i den sista raden, har vi z-- vilket representerar en viss number-- en-- som också representerar en vissa number-- plus 1 modulos 26 plus gemener en. Om ni fortsätta läsa genom dessa, du kan se ett mönster kommit upp i hur vi manipulera koden. Jag mycket, mycket tyder efter avsnitt er alla killar gå vidare och input de alla i din dator och se vilken typ av siffror kommer ut och resonemang genom varför de är händer, eftersom dina psets det ska bli riktigt viktigt för dig att förstå varför vissa saker händer. Alla dessa bilder kommer att finnas på nätet. Så inga bekymmer om att försöka fysiskt kopiera ner anteckningar. Allt är på nätet. Detta avsnitt i sig kommer att vara online. All min källkod som Jag kör kommer att vara online. Yeah. Har du fortfarande har en fråga? PUBLIK: Vad är modulos? ANDI PENG: OK. Så modulo är en operatör som kommer att vara ganska viktigt att dina killar s pset här. Så sätt att operatörerna i C och i programarbetet är att du har vad som kallas division symbol och modulen symbol, som är precis som ett procenttecken. Så i C, när du gör ett heltal dividerat med ett heltal med ett snedstreck, C har en tendens att vilja skära bort alla decimaler, eftersom ett heltal vill konvertera till ett heltal. Det kommer inte att vilja vara en dubbel med ett gäng decimaler allt efter det. Så om jag gör 3 delat med 2, det kommer att stänga av 0,5 och bara ge er en. Så det är något att vara mycket försiktig med när du är gör någon form av matematik i programmering, är att siffrorna du får kanske inte är numren att du tänkte, vilket är anledningen till avrundning i din sista pset är så viktigt. Modulo ger dig resten. Så till exempel, om jag gjorde 3 modulo 2-- så tre procenttecken 2-- Det skulle ge dig resten av det. Så 3 delat med två är 1,5. Det är ett resten av 1. Det skulle ge dig en, som är resten av det. Så när ni flyttar genom ASCII-tabellen, modulo kommer att hamna något som är mycket viktigt, och vi kommer att diskutera det senare. OK. Så något som är söt, ganska nya och ganska unik att vi har diskuterat denna vecka begreppet vad en matris är. Så array är den första typ av datastruktur att vi kommer att möter i denna klass. All datastruktur är någon form av godtycklig, bokstavligen saker som strukturen att vi som programmerare har skapat, att vi har lagt ned vår kod som kan innehålla andra delar av koden. Så i denna mening en array-- se det som ett arkivskåp, där om du öppnar olika hyllorna i din arkivskåp, du kan komma åt olika saker. Till minne, är en grupp bara göra samma sak på din dator. Du kan ha olika blocks-- vi kalla dem indices-- av en matris. Det är precis som ett block, en hylla med minne att vi har skapat i din dator som du kan mata in vissa saker i olika utrymmen. Så med en array, du alltid måste specify-- Du måste ange förklara en matris i följande format. Du ska först ange datatyp som du vill skapa i matrisen. Om jag vill ha en array av heltal, Jag kommer att sätta int direkt. Om jag vill ha en array med strängar, Jag kommer att sätta strängar där, namnet på din array, och sedan du kommer att ha hakparenteser. Och innanför hakparenteser, du är kommer att ha storleken på din array. Något som är väldigt viktigt för Kom ihåg när du skapar arrayer är att när du skapar en matris, kan den storleken inte att förändras. Så om du vet att just nu du har ett utbud av storlek 10, du vet att jag kommer att ha 10 celler inom eller 10 index inom denna samling, och det kommer aldrig att expandera eller minska oavsett vad, och att det finns för närvarande bara 10 block av rymden fördelas i ditt minne som kan lagra upp till 10 saker av vad du har lagt. Så på detta sätt, en array datatyp, datastrukturen som är en array skiljer sig mycket från vissa andra vi kommer att täcka senare i den här kursen. Yeah. Till exempel, om du ville skapa en array storlek 3 som innehöll variabler av integer-- Åh, förlåt, för temperature-- och temperatur, av Naturligtvis är ett heltal. Så vi skulle skapa int, som är den datatyp av vad vi vill lagra. Vi kommer att kalla detta temperaturer till förmån för nomenklatur namngivning något som vi alla förstår. Och vi kommer att få hakparenteser. Och vi vill ha tre siffror. Så vi kommer att sätta tre inne i den. Något som verkligen viktigt att hålla i minnet är att arrayer noll indexeras. Allt detta betyder är att du börja med index på 0, och du kör upp genom storleken på matrisen minus ett. Så till exempel här, vi har en rad storlek 3. Det kommer att kunna att hålla tre värden. Men siffrorna themselves-- att nummer, arrayen, som index, arrayen är 0 till 2. Så killar, vara riktigt, riktigt försiktig när du går igenom dina problem som och skapa någon form av array, eftersom många av de gånger det är verkligen, verkligen lätt att glömma det. Jag har faktiskt inte har index 3, som jag för närvarande bara har index för två. Och om du försöker åtkomst till tredje indexet, det kommer att vara vad är kallas noll terminator. Det kommer inte att faktiskt existerar i arrayen. Och datorn är kommer inte att gilla det. Så var försiktig när du tillgång till saker bara att se till att du kommer ihåg att arrayer är noll indexeras. OK. Så det första exemplet är bara ett sätt att skapa en array. Det andra exemplet jag har nedan är bara ett separat sätt att skapa vad som är samma data struktur som vi just har matas in. Så i stället för att fysiskt kör igenom och sätta i temperatur av 0 lika oavsett temperatur 1 lika oavsett, temperatur 2 jämlikar vad som helst, jag kunde faktiskt bara direkt skapar allt i en rad i temperatur hakparenteser jämlikar. Och meddelande i det här fallet, behöver du inte att ange hur stor din array är, eftersom datorn kommer att gå igenom och se till att det finns tre element i dessa klammerparenteserna. Och det kommer att veta, OK, Jag behöver en rad storlek 3. Du kommer inte att behöva in det på följande sätt. Och även, ja, på det sättet. Finns det någon som har några frågor om hur vi gör arrayer eller hur strukturen av en matris fungerar? Yeah. PUBLIK: [OHÖRBAR]? ANDI PENG: Ja, exakt. Så om du skulle förklara och initiera en array följande metod, vilket är det andra sättet, Du kan bara lämna dem. Och datorn automatiskt vet att det måste räkna hur många element är i dessa klammerparenteser, separerade med kommatecken. Så här ser de 65, 87, 30. Så att datorn vet, åh, det finns tre heltal. Jag vet att skapa en array namn temperatur med tre element i den. Bra fråga. Yeah. PUBLIK: Är det inte möjligt att skapa en array med olika typer av data som kan föras in i det? Till exempel med heltal [OHÖRBAR]? ANDI Peng: Vid tillämpning i denna klass, nej, just nu. När du skapar en data strukturera som en array, du berätta dator, hej, jag behöver dig att fördela så mycket minne i min hårddisk, med varje cell som är en visst antal bitar. Kom ihåg att vi lärt oss i veckan noll att olika uppgifter typer har olika storlekar? Så till exempel, en sträng är ett annat belopp av utrymme än en char, som är en annorlunda mängd utrymme från ett heltal. Och så om du inte anger och du mixa och matcha vilka typer av variabler du har datorns kommer att bli mycket förvirrad. Och det kommer inte att veta hur mycket minne för att ge dig. Så i syfte att rätten nu, datorer kan bara erkänna en typ av en matris. Bra fråga. OK. Så naturligtvis den andra fråga som vi har är, ja, nu när vi har skapat en matris och vi har lagt alla dessa saker i gruppen, hur är vi kommer att kunna komma åt den? Så den typiska struktur som vi alltid tillgång till en array är vår härliga for-loop. Jag lovar er att vi ska vara se en hel del av den här mannen här. I huvudsak, när du vill att mata in värden i en matris eller om du vill komma åt dem, bästa sättet att göra det är en for-loop, eftersom en for-loop, du hur många gånger du kommer att vilja gå igenom arrayen, eftersom du har ett stopp upplaga, eller hur? Och varje gång du kör igenom, kan du komma åt ett annat element i matrisen. Och även, detta är en anledning till varför typiskt börjar vi vår för slingor på 0 värde, eftersom när du öppnar arrayer, du kan komma åt noll index. Och så paralleller mycket snyggt. Ni kan ha velat skriver för int i lika med 1. i är mindre än eller lika med 3. Men det skulle inte fungera riktigt lika bra här, eftersom du bara har inslag av 0, 1 och 2. Och så om du skulle börja din i på elementet 1, 2 och 3, du kommer att hamna igång av gränserna för din samling, och dåliga saker kommer att hända. Så jag hoppas att ni ser segue varför i de tidigare klasserna Vi lärde er hur du kör och formatera en for-loop det sätt som vi var. Det beror på, nu har vi transitioned in matriser, du kan se varför de 0 lånar sig mycket fint att komma åt. Så hur vi gör det är that-- jag bara skriva ut det här till förmån för att skriva ut det. Men jag har min platshållare, kommatecken. Och den faktiska åtkomst del sker. Namnet på arrayen kallades temperatur. Så det är temperatur och i-te elementet i uppsättningen. Så som för slingan går igenom, det kommer att börja på 0. Det kommer att skriva ut 0. Index för denna uppsättning. Sedan kommer det att skriva ut ut det första elementet. Sedan kommer det att skriva ut ut den andra en. Och sedan ska vi bryta. Är alla klara på hur som händer? Bra. Okej. Så här har vi ett sätt att sade om vi inte ville till hårdkoda in-- mig som programmerare. Jag ville inte rent fysiskt sätta i varje enskilt element i denna matris. Om jag ville i stället har användaren ingångsvärden, vad är det bästa sättet att göra det? Tja, här har jag skapat denna härliga funktion, där kan jag förklara en array. Så int scores-- låt oss bara säga att vi vill göra en array som höll kvaliteter av alla 18 av eleverna här i detta avsnitt. Jag tror att vi har en bit mer än 18 barn i dag. Men exempelvis skull, låt oss bara anta att vi hade 18. Jag skulle skapa en array namn poäng med typen int, eftersom poäng, naturligtvis, är siffror. Och jag kommer att ha 18 inom hakparenteser, eftersom det är hur många studenter I vill kunna lagra massor av. Och hur jag skulle fylla matrisen är att jag skulle köra den genom en for-loop av Naturligtvis med 0 är min 0. index. Och sedan med 18 är min stoppa upplaga, eftersom det finns 18 element i arrayen. Och sedan kommer jag att göra printf, Enter göra mål för student-- yada yada yada. Kan någon berätta för mig varför här är jag utskrift i plus 1 och inte i? Det är lite av en trick fråga, inte riktigt. Det gör faktiskt inte fysiskt påverka driften av koden. Yeah. PUBLIK: [OHÖRBAR] 0? ANDI PENG: Ja, exakt. Det är lite pinsamt att säga, hej, du är 0. student i den här klassen. Det är lite konstigt. Så oss, som människor, inte riktigt gillar att tänka på hur datorer tänker. Så även om i dator, det lagra värden i 0: te indexet, när vi är människor, gör vi inte riktigt vilja hänvisa till oss som noll. Så när jag bara skriva ut det, Jag kommer att skriva ut och lägga till 1 bara för tydlighetens skull. Så när jag skriver ut, jag kommer att vara kunna skriva ut studenter 1 till 18. Det faktiskt inte påverka driften av koden på något sätt, som jag skriver ut. Men var försiktig när du faktiskt tillgång till uppsättningen. När du ser poängen i, märker här jag faktiskt åtkomst till 0:e index och inte ett plus 0-- eller 1 plus 1, i detta fall, index så att det är faktiskt klart. Är alla slags OK på hur detta löper genom och med varje index jag sätta ett värde i arrayen och skapa en array med 18 nummer att användaren kommer att ingång? OK. Häftigt. OK. Vi har nu flytta in i något som är ganska relevant för denna pjäs inställd liksom. Jag har föreläsning, David-- ledsen, du hade en fråga? PUBLIK: Kan du förstora den? ANDI PENG: Ja, så jag försökte. Men jag vet inte. Av någon anledning, denna version av PowerPoint är verkligen inte fungerar väl med displayen. Så vi ska bara att hålla det så här. Alla dessa kommer att laddas upp på nätet. Ledsen, killar. Yeah. OK. Så kan vi också ha strängar. Så om ni faktiskt notice-- jag vet Rob gick över detta i föreläsningen att han did-- en sträng är faktiskt bara en uppsättning av tecken, om man tänker på det, eller hur? En sträng är ett namn eller ett mening eller ett ord, eller hur? Om jag skulle skapa en sträng som heter Andi-- bara mitt namn, A-N-D-I. Du tänker på det som bara en variabel. Men egentligen, det är uppdelade i bara en rad tecken. Så det har fått en karaktär en lagrad i ett gruppvärde. Det har fått en karaktär n lagras i andra index och så vidare och så vidare. Så på ett sådant sätt, vi faktiskt har denna typ med strukturen som i plats för våra strängar. Så här, om jag skulle mata in ordet "äta" - så sträng ord lika få sträng. Om jag skulle mata in ordet "äta", att är fysiskt sätt som min dator lagrar strängen i mitt minne. Och om jag ville gå igenom det och tryck som out-- så för in i är lika med noll, kom ihåg, i föreläsning, vi täckt något som kallas strlen, eller längden av strängen. Eftersom jag egentligen inte vet hur stor matrisen är oavsett användarens inputting-- Exempelvis inmatas jag ordet "äta", och jag vet som är tre tecken, eller hur? Så jag kunde sätta i en tre där och allt kommer att bli bra. Men om din användarinmatnings något det är en annan antal värden, du kommer att inte att kunna verkligen vet att när du programmerar din kod. Så det sätt som vi hanterar testfall som det är att vi har något kallas strlen, som ligger bara en funktion som talar om hur länge en sträng är. Så strlen av ord. Mitt ord är äter. n är lika strlen av ord. Kan någon berätta för mig vad som värde faktiskt finns rätt? Vad n representerar rätt nu, i det här exemplet, om jag hade äta? Publik: 3. ANDI PENG: 3, exakt. Så vi har för int i lika noll, n är lika med 3, i huvudsak. Och jag kommer att köra tills det är mindre än 3i ++. Och det kommer att i huvudsak gå igenom och göra samma sak. Det kommer att skriva ut varje värde och ger dig E-A-T. Det är bara anger en olika sätt att skriva det. Det kommer att vara till stor hjälp. Yeah. PUBLIK: Vad är fördelarna med att sätta n är lika med strlen ord inuti som för loop [OHÖRBAR]? ANDI PENG: Ja. Så om jag skulle att-- säga, till exempel, om jag skulle göra det och sedan do-- oop-- att i min kod, det skulle faktiskt vara att göra som samma sak. Men det sätt som David förklarade det under föreläsning, om någon av er killar kom ihåg, var att, som människor, som programmerare, vi verkligen försöker programmera vår koden så att vår dator har att arbeta så liten som möjligt, så att vår kod är mycket effektiv. Så om jag var tvungen att, vad skulle ske genom mitt för loop är att jag först skulle förklara en variabel som heter i kommer att vara 0. Jag kommer att kontrollera, oh, vad är strlen av ord? Åh, är strlen 3. Så är jag mindre än tre? Ja det är det. Jag kommer att köra. Och sedan den andra gången tillbaka runt slingan, kommer jag att öka i. Jag kommer att bli en. Och jag kommer att kontrollera, oh, men vad är strlen av ordet? Åh, det är tre. Och gör det verkar typ av slöseri, varje gång du kör genom öglan, att kontrollera funktionen, även om strlen av ord aldrig förändras? Så det är extra kraft för en dator. När du börjar prata om saker som finns miljarder och miljarder och miljarder platser lång, föreställa din dator att fysiskt gå igenom och kontrollera alla att varje enskild tid. Det är därför, att bara göra för effektivitetens skull, vi tenderar att bara göra detta, eftersom detta sätt vi bara anropa funktionen en gång i början, och att varje gång det går igenom det kommer att lagra värdet 3 där, att du inte måste ständigt kontrollera varje gång. Yeah. PUBLIK: Förlåt. Bara [OHÖRBAR]. Kan du int n lika strlen och sätta att över utsidan av for-slingan också? ANDI PENG: Ja. Du kan göra det, absolut. Anledningen till att vi har det här är eftersom det sätt en for-loop arbeten är att det kallas en lokal variabel i den mening att allt du är skapa insida för slingan bara finns inne i for-slingan. Så variabeln i endast existerar i dessa konsoler. Och här variablerna n också bara förekommer i dessa konsoler. Så om du skulle använda strlen av ord flera gånger ner nedan absolut det bästa sättet att göra det skulle vara att förklara den upp upp så att du inte behöver göra det en gång. Yeah. PUBLIK: Varför har du en ny rad efter den procentuella se om du vill lägga alla bokstäverna bredvid den separera? ANDI PENG: Åh, jag ville skriva ut dem alla på varje rad. Det spelar ingen roll. Ja, det är en formatering. Det är en bra fråga, men. Ja, om jag ville skriva ut allt på bara en rad, Jag skulle inte ha streck i. OK. Alla bra? OK. Häftigt. Så jag tror att jag har pratat tillräckligt. Ni tur att gå igenom kod och berätta vad som är fel här. Var är felet? Så som ni kan se, har jag förklarade en ny array av typen sträng som heter klass. Och jag har inmatade Sam, Jess och Kim i den. Och jag försöker skriva ut alla element i uppsättningen. Kan någon berätta för mig varför detta kommer att ge mig problem? Jag ska ge er 10 sekunder att tänka på detta. OK. Yeah? PUBLIK: Är vänster centrum lika med 3 eller [OHÖRBAR]? ANDI PENG: Rätt. Så hur många gånger är detta faktiskt kommer att gå igenom denna loop? PUBLIK: Fyra. ANDI PENG: Exakt. Det kommer att genom fyra gånger. Det kommer att gå igenom vid 0, 1, 2, och 3, eftersom sitt rätta element är i är mindre än eller lika med 3. Det kommer inte att sluta när det är 2. Det kommer att hålla gå tills den träffar 3. Och som vi vet, det finns bara tre element i våra faktiska array. Om vi ​​försöker komma åt den fjärde element eller index för 3, du kommer att träffa någonstans i minnet som inte existerar. Det kallas noll terminator. Ingenting kommer att vara där. Datorn kommer inte att vara mycket nöjd med dig. Yeah. Finns det någon som har några frågor om varför det hände? Det är ett gemensamt område att undvika. Yeah. PUBLIK: Gör inte den första Skjut också har en rad 2? ANDI PENG: Nej Så i huvudsak, när du gör en matris, att fästet höger där, som number-- alla det talar om för dig är hur många element jag har. Det är faktiskt inte berätta mig index av något. Så i detta fall, jag vet att jag vill att skriva med tre platser, med tre fysiska platser till hålla vad jag vill hålla. Så det är därför nummer tre är där. Men om jag ville att faktiskt få tillgång till det, om jag ville säga, printf klass fäste nummer, sedan du kommer att faktiskt sätta den fysiska indexet där. Ja, bra fråga. PUBLIK: Så är den fysiska index ska vara [OHÖRBAR]? ANDI PENG: Jag är ledsen. Kan du tala lite? PUBLIK: Så är den fysiska index [OHÖRBAR] vart och ett av lådorna? [OHÖRBAR]? ANDI PENG: Ja. Så jag kommer att gå tillbaka till här. Tänk på här. Vi har en rad storlek 3. Det finns tre platser, som, fysiska platshållare i här. Men de är namngivna 0, 1 och 2. Så om jag ville komma åt dem, det sätt som jag åt dem är printf av vad jag ville här. Du skulle behöva skriva ut ut namnet på den, för då datorn vet, åh, jag måste se i denna array för 0:e indexet. Yeah. Men storleken på det ändrar inte. Storleken är 3, oavsett hur du märka dem. OK. Alla bra? PUBLIK: Så varje gång jag [OHÖRBAR]? ANDI PENG: OK. Så i detta fall, gör vi inte riktigt komma in i det just nu i kursen. Men vet att en string-- som jag sade tidigare, en sträng är i huvudsak en array av tecken. Så om jag kan skapa en array strängar, jag typ av har en rad array tecken, eller hur? Så i detta fall, eftersom jag har en array med strängar, om du skulle mata in ett riktigt långt ord, som fortfarande tar upp bara en plats, eftersom det är en sträng. Men om du skulle tänka på karaktärerna i denna samling, då tar upp en hel del mer tecken än någon av de andra ord är. Inte riktigt viktigt för just nu. Men det är bara allmänt hur det fungerar. OK. Så det här är något jag kommer att låta dig göra en hel del under loppet av terminen. Jag behöver vila min röst. Ni måste stimulera er. En hel del av er förmodligen måste sova nu. Jag mata slumpmässiga problem där vi som en klass eller du med en partner bredvid dig kommer tillbringa ett par minuter att diskutera om hur vi skulle gå om att lösa eller skapa ett program som detta. Så just nu, vill vi att skapa en program-- vi kommer att kalla det upper.c-- som omvandlar ett gement ord till en överklass string-- versaler, sorry. Ord i strängar, ledsen, är synonymt. Jag kommer att ändra dem att betyda samma sak. Yeah. Ta ett par minuter. Det behöver inte vara skriven på valfritt språk. Bara i pseudokod kod eller logiskt hur vi skulle även gå om att göra ett sådant problem. Yeah. [SIDE SAMTAL] Jag märkte också att ni can-- Jag sorts ser redan programmet. Jag antar att min brist på presentatör läget är ett problem. Men det är okej. [SIDE SAMTAL] Ja, snälla, killar. Kom få godis. Kom få godis. PUBLIK: Yes! [SIDE SAMTAL] ANDI PENG: Också, ja, Jag ska börja kasta godis på människor som inte svara på frågor. Så du bör alla svara på frågor. Eller jag antar att människor som svarar på frågor. Ja, tvärtom. [SIDE SAMTAL] PUBLIK: [OHÖRBAR] ANDI PENG: Ja. Yeah. [SIDE SAMTAL] Okej, killar. Ta ut, ytterligare 10 sekunder. [SIDE SAMTAL] OK, killar. Så innan vi börjar försöker faktiskt fysiskt skriva kod, en god vana att utveckla är att vi vill första typen av skäl logiskt hur vi skulle göra det. Du vill vara säker på, innan du fysiskt börjar försöka koda i Mario, att du gör Se till att du har din pseudokod. Som tar dig genom vad du behöver för att skapa så att när du fysiskt skriva ditt program senare, du är bättre på att fånga upp fel i din kod och sånt. Så vi ska bara börja by-- på engelska, i pseudokod, Finns det någon som vill ge mig en generisk förklaring om hur vi skulle gå om att göra detta? Yeah. PUBLIK: [OHÖRBAR]. ANDI PENG: Visst, inga bekymmer. PUBLIK: Kan du be den eller fråga någon att få sträng 1-- ja, sträng, och då-- ANDI PENG: Ja, så det här är en bra start. Jag ska börja skriva, ledsen, som du talar. So-- PUBLIK: --Den gemener siffror är högre, eller hur? Eller de gemener har höga siffror? ANDI PENG: Exakt. PUBLIK: Så då kan vi subtrahera 32 från vad [OHÖRBAR]. ANDI PENG: Great. Så vi slags har en allmän mening om hur man arbetar på det här problemet. Att veta att vi har sådan lärt den fysiska sätt som strängar lagras i minnet, vad gör du redan vet att du kommer att förmodligen måste skriva in din kod För att gå igenom strängen? Publik: För loop. ANDI PENG: A för loop, exakt. Bra. Så vi slags har en generisk pseudo nedskrivna den typen av ger dig noterar på hur du skulle flytta om att lösa problemet. Nu när du har det, du kan referera till den till senare när du försöker faktiskt skriva din kod. Så vi kan faktiskt gå hit. Och jag har en funktion som kallas upper.c-- där det är-- av bara en tom mall just nu som ni kommer att hjälpa mig att räkna ut om hur man skriver denna rad av code-- inte kodrad. Det kommer att finnas flera rader kod. När du startar någon form tom pset, vad är det första jag behöver komma ihåg att göra? PUBLIK: [OHÖRBAR]. ANDI PENG: Great Yep. Inkludera. stdio.h. Ofta är detta en av de mest enkla misstag folk kommer att göra när de är skriva, är att de ska glömma att ta med en viktiga bibliotek som de behöver. Så om det är kontorstid och du är som, Jag vet inte varför min kod inte fungerar. Kan du berätta för mig varför det inte fungerar? Vi kommer att säga har du #include? Du bör #include det. OK. Så vi har standard-I / O här. Är det den enda biblioteket vi kommer att behöva här? Vad ska vi göra? Förlåt. Någon bara skrika ut det? PUBLIK: [OHÖRBAR]. ANDI PENG: Det gå du. OK. Och hur går jag om att starta någon form funktion, någon form av huvuduppgift inom vårt program? Int main. OK. Vad gör jag sätta in här? Vad är det första du vill göra? Om vi ​​vill få en sträng från användaren, Vad ska vi ha att göra på denna första raden? Tyvärr, ni bara känner fri att tala och högt. Bara skrika ut vad. PUBLIK: Be användaren? ANDI PENG: Hur gör vi det? Ask-- jag kommer att skriva "be användaren"? PUBLIK: Printf. ANDI PENG: OK. Printf. Vad vill jag printf? PUBLIK: Skriv in något. ANDI PENG: Gillar du det? Killar, låtsas som om jag är en dator. Fysiskt berätta varje steg att jag måste skriva in här? Gör jag något fel? Skulle jag ha skrivit något? PUBLIK: Du måste offerter. ANDI PENG: Jag behöver citat? OK. OK. PUBLIK: Och sedan nya linjen. Semikolon. ANDI PENG: Semikolon? OK. God. PUBLIK: Och kanske ange att du vill ha det med gemener? ANDI PENG: Great. Ni skrattar åt mig glömmer att sätta ett semikolon. Jag garanterar att du någonstans under loppet av denna klass, du kommer att glömma att sätta ett semikolon, och det tar dig tre timmar att räkna varför din kod inte fungerar. Det har hänt oss alla. Det kommer förmodligen att hända dig. Få en bra vana att använda semikolon. OK. PUBLIK: Vill du att göra det omvända snedstrecket i? ANDI PENG: Visst. Vill du göra bakstreck? PUBLIK: Ja. ANDI PENG: Great. OK. Vad ska jag göra nu? PUBLIK: Få sträng. ANDI PENG: Få sträng. Så vad ska jag skriva? Någon? PUBLIK: String s. ANDI Peng: String s. PUBLIK: getString. ANDI PENG: Någon, kan du berätta var denna funktion getString kommer ifrån? PUBLIK: string.h. ANDI PENG: string.h? Tror du att det är från string.h? PUBLIK: [OHÖRBAR]. ANDI PENG: Det gå du. Det är från CS50.h. Om du alltid förvirrad om var en biblioteksfil är eller sidhuvudfilen är, google rally string.h, och jag ska säga dig vilka är alla de funktioner som som är i string.h. OK. Så nu när jag har skapat en sträng och jag har fråga användaren om det, Jag har sparat den i en variabel heter s, vad behöver jag göra nu? PUBLIK: Kontrollera om det är i små bokstäver. ANDI PENG: Förlåt? PUBLIK: Kontrollera om det är i små bokstäver. ANDI PENG: Okej, låt oss göra det. Hur gör jag det? Faktiskt, när det gäller av klassen just nu, Vi ska bara anta att allt att vi ingången är redan i gemener. Om du ville kolla, skulle du bara lägga till en villkorssats som kontrolleras, sprang att genom varenda arrayelement och kontrolleras om det är mellan vissa värden. Jag har glömt vad numret av värden på gemener är. Du kan leta upp det på ASCII tabellen. Men ja, det är en riktigt bra poäng. Men just nu, vi kommer bara att anta att alla strängar vi input är i gemener. OK. Så hur skulle jag gå om detta problem nästa? Publik: För loop. ANDI PENG: För loop? OK. Säg mig vad jag ska skriva. PUBLIK: För int i lika med 0. ANDI PENG: OK. Målgrupp: Åh, faktiskt, så du gör ett kommatecken och gör n är lika strlen. ANDI PENG: Så viktig sak att jag tror att hon har märkt här är att vi inte har att säga int n andra gången vi gjorde detta. Bara vet att i en för loop när du förklara, du faktiskt inte behöver int av andra gången du gör en variabel. Man kan säga n strlen. PUBLIK: Av s. ANDI PENG: s. OK. PUBLIK: Sedan ett semikolon. ANDI PENG: Visst. PUBLIK: Och sedan [OHÖRBAR] n. Då ++ i. ANDI PENG: Great. Okej. Vad vill vi inne detta för loop nu? Kom ihåg att om vi ska gå igenom en sträng och kör genom en rad, Vi vill kontrollera saker i den. Vad ska vi behöva? Detta är kanske det knepiga delen nu. Någon har en gissning? OK. Så först, hur ska vi även få tillgång till? Hur gör vi ens första check eller åt ett element i arrayen? Hur gör vi det? Vad är notation vi använder för att göra det? Vad är namnet på denna array kallas? Det kallas s, eller hur? Kom ihåg att varje sträng är alltid en array. Så s fäste i, eller hur? För det är det aktuella värdet eller indexvärde vi kollar. Och vi kommer att ställa in det lika att-- vi vill ha ett gement värde, eller hur? Vi vill vända det lower-- ledsen, vi vill ha ett versalt. Vi vill stänga av gemener värde i ett versalt. Och så like-- jag är ledsen, vad heter du? PUBLIK: Heidi. ANDI PENG: Förlåt? PUBLIK: Heidi. ANDI PENG: Heidi. Som Heidi sa inledningsvis, vi är nog kommer att behöva the-- vi är förmodligen kommer att behöva subtrahera 32 oavsett charc som är, eller hur? Eftersom på en ASCII bord, skillnaden mellan en liten bokstav och en stor bokstav är 32. Så när vi gör detta, vi är nog kommer att vilja subtrahera 32, eller hur? Så vi ska göra s i. Förstår alla varför jag gjorde det? Eftersom just nu, i vår samling, Vi kollar det 0. index, eller hur? Och i 0:e index för sträng, det är det första tecknet. Och den karaktär vi tänker att anta att det är gemener. Om vi ​​vill göra det versaler, vi måste subtrahera 32 från dess värde, eftersom det i vår ASCII bord, det är hur vi får det till nästa motsvarande värde som gör det versaler. Förstår alla det? Yeah. PUBLIK: Kan du också do små bokstäver en minus-- ANDI PENG: Ja, så det är faktiskt riktigt bra. Jag kommer att komma tillbaka till det fråga efter att vi gör detta. Yeah. Och sedan om jag vill se vad som händer, Jag förmodligen kommer att vill skriva ut, eller hur? Någon berätta för mig vad Jag vill skriva ut här. PUBLIK: printf procent c backslash [OHÖRBAR]. Det är värdet på [OHÖRBAR] s i. ANDI PENG: si, ledsen? PUBLIK: [OHÖRBAR]. ANDI PENG: Jag vet inte. Vad tror du? Målgrupp: Tja, jag wouldn't-- Jag antar att jag inte skulle bring-- Jag skulle ta det ut insidan, eftersom [OHÖRBAR]. ANDI PENG: Åh, du skulle ha gjort det? PUBLIK: Ja. ANDI PENG: Låt oss lämna det på det sätt det är, och jag ska förklara varför senare. Kom ihåg att även när du har en platshållare, du vill lägga parentes runt den. Okej. Så detta bör vara en fast funktion här. Låt oss köra den och se om det sammanställer. Gör övre. Hoppsan. Det ser inte alltför bra. Varför händer detta? Som med alla fel, du vill gå tillbaka och börja med den första, eftersom typiskt ett fel orsaker massor av andra fel efter det. Här ser vi upper.c: 18: 25, som berättar mig i detta program som heter upper.c, på ledningen 18, fel underförstått att förklara bibliotek av funktioner strlen med typ unassigned-- bla, jag vet inte vad som händer efter det. Allt det säger mig just nu att något händer på strlen. Och datorn är förvirrad, eftersom Det är som jag vet inte vad strlen är? Vad gör det förmodligen berätta om du missar? PUBLIK: Du saknar [OHÖRBAR]. ANDI PENG: Du har rätt. Exakt. Så det här är där det är viktigt att se till att varje funktion som du använder i din kod är att ha rätt rubrik fil till biblioteket, annars du kommer att få massor av fel och koden kommer inte att veta vad som händer. Så vi kommer att inkludera string.h här. Nu när vi försöker kompilera övre. Kompilera korrekt. Låt oss köra det här programmet. Så skriver något i gemener. Vad vill ni att skriva? Shout ut något. Okej, Charly gick bara in. Vi kommer att skriva Charly namn. Charly med gemener. Och förhoppningsvis, förhoppningsvis är detta kommer att skrika ut och spotta ut Charly i versaler. Jippie! inte alla förstår hur Jag gick om att lösa det? Det sätt som jag kan manipulera med hjälp heltal att lösa något som Jag vill göra i strängar, eftersom tecken och heltal kan refereras på samma sätt, därför att ASCII kartläggning. Så för att gå tillbaka till din punkt, om jag ville sätta här i stället för 32 versaler A minus gemener en precis som att det skulle fungera lika bra, eftersom det är helt enkelt bara Skillnaden mellan dessa två värden. Om jag vill göra den här igen-- charly. Å nej. Jag tror att vi gick på fel sätt, ja? PUBLIK: [OHÖRBAR] gemener a. ANDI PENG: Det gå du. Japp. Och ut spottar charly. Så var försiktig när du subtrahera värden att komma ihåg vilken som är större än den andra. Till exempel, här uppe jag glömde att gemener a är faktiskt större än versaler A. Så när jag försökte att subtrahera dem på andra sätt runt, fick jag negativ 32. Och min dator var som, Jag vet inte vad det är. Det är sannolikt bara någon slumpmässig värde som inte är mycket bra. Och så se till att du är subtrahera i rätt längd att hitta det tecken du vill. OK. Är det någon förvirrad om hur vi gick om att skriva den här funktionen? OK. Så egentligen, en funktion redan finns i biblioteket kallas ctype.h. Bibliotekets kallas ctype.h. Denna funktion är faktiskt redan skriven för dig. Det kallas för övre. Och så i syfte att detta pset, du kommer att finna att du verkligen vill använda en hel del av de funktioner som finns inom ctyp biblioteket. Till övre, sänka, är övre, är lower-- de är alla funktioner att du kommer att kunna använda mycket, mycket snabbt i din egen kod som gör exakt vad detta innebär. Vi skrev ut hur man konverterar en sträng till versaler. Men detta är faktiskt koden att någon annan har skrivit och att du kan komma åt via en annan funktion. Yeah? PUBLIK: Så du bara kopiera A: s där och gör det för varje enskild bokstav? ANDI PENG: Ja, eftersom jag inte bryr sig om de värden som gäller. Jag bryr mig bara att skillnaden mellan dem är 32, eller hur? Skillnaden mellan gemener B och versaler B är också 32. Och skillnaden mellan c och versaler C är alltid 32. Jag har bara bry sig om skillnaden mellan de två, eftersom alla bokstäver följer samma mönster, eller hur? Om jag har skillnaden mellan en av dem, Jag vet vad skillnaden mellan dem alla är. Bra fråga. Yeah. Alla bra? OK. Oop. OK. Så ett annat koncept som är kommer att vara mycket användbart när du fortsätta att utveckla koden är denna idé att skapa funktioner eller abstraktion. Så just nu har vi alla tagit algebra. I algebra, är du lärde att det finns denna underbara sak som kallas en funktion maskin, där om du ingång ett slags nummer, Det genomsyrar denna underbara funktion och ut poppar en annan utgång, eller hur? I koden, händer samma sak i någon form av funktion. Så jag kunde fysiskt skriver i min kropp på min kod ett allmänt meddelande som faktiskt gör oavsett kroppen av koden gör. Men utanför det, kan jag också skriva många olika funktioner att göra många olika saker. Till exempel har vi redan började använda några av dem. Printf-- som är en funktion som någon annan har redan skrivit att vi kan ringa in vår kod. För att upper-- i detta fall, upper-- är en annan funktion Vi har skrivit att vi kan ringa i vår kod. Och så jag gissa varför göra Vi har även funktioner? Varför inte vi bara plopp det alla i samma kodrad? Det gör det enkelt för alla. Tja, resonemanget bakom att är först och främst, organisation. Det är verkligen irriterande att gå genom någons kod och en funktion som printf. Om ni verkligen visste vad Funktionen printf innebar att skriva, Det är, som, 1000 rader kod. Om varje gång jag ville att printf något, Jag var tvungen att skriva 1000 rader kod, det skulle vara riktigt irriterande att läsa, höger? Det är därför vi har bara skapade denna abstrakt funktion att vi redan har någon annan har skrivit någon annanstans. Och varje gång måste vi använda den i vår kod, vi måste bara säga printf. Och det är i stånd att använda funktionen någon annan har skrivit i vår kod. Det gör det lättare organisatoriskt att läsa koden. För det andra är det en förenkling. Det förenklar stegen vi har att vidta för att lösa våra problem. Printf, funktioner som printf, funktioner som till övre är alla saker som gör att vi kan förenkla vår kod ner så det är lättare. Och sista är återanvändbarhet. Så det faktum att vi har en funktion som kallas printf som vi kan kalla många olika gånger och gör att den kan återanvändas. Om jag skulle skriva printf, Jag bara skriva det en gång. Det finns bara i att en plats. Om jag ville göra det igen, skulle jag måste kopiera och klistra in allt detta i min andra kodrad. Det är därför om vi skapar en funktion som existerar utanför våran, Vi kan bara uppmana det och återanvända det när vi behöver så att det är mycket enklare för oss som program för att skriva. Så det sätt som vi skulle faktiskt skriva en funktion är mycket likt, eller hur? Detta är kanske det första exempel där vi ska se en funktion ta på en stil annorlunda än vår int main tomrum. I det här fallet, om jag ville skriva en funktion som kallas q, eller hur? Och int värde här är alla talar om för mig, vad vill jag här funktion för att återvända till mig? Om jag vill kub ett heltal, Jag kommer att vilja ingång. Dessa är de parametrar. Jag ska till ingångarna ett värde av typen int. Och jag kommer att återvända annan typ av värde int. Och här, som ni kan se, allt jag gör är cubing oavsett min ingång är som min produktion och skicka tillbaka den. Så allt här funktionen gör är tar någon form av heltal. Det multiplicerar det med sig två gånger så att det kuber i kraft. Och sedan återgår oavsett att produktionen är. Så i detta fall, det är två rader av kod som vi var tvungna att skriva extra. Men om vi ville ringa på detta flera gånger, det är mycket lättare att skriva att man line just här som är i kuben än måste gå igenom flera gånger. Så det sätt som väsentligen vilken som helst formatering för någon form av funktion kommer att existera är som här. Så vi har funktionsnamnet. I det här fallet, det kallas kub. Och vi name it kub eftersom Det är lätt att komma ihåg. Du kan namnge den torget och Det kan faktiskt vara cubed. Spelar ingen roll. Bara ett namn som du är tilldela din funktion. Denna rätt här, int, är typ av parametern du behöver. Så vad gör denna funktion behöver för att fungera? Tja, behöver det en ingång. Jag döpte den ingång. Du kan namnge det vad du vill. Men jag behöver något av typen int. Det kommer att faktiskt utföra vad är inne i här, kroppen av funktionen. Och sedan returtypen just här, detta int-- allt det säger mig är att denna funktion är kommer att återvända till mig i int. Så det kommer att ta in en int, och det kommer att ge dig tillbaka en int. Förstår alla hur formatering av detta slag fungerar? Häftigt. OK. Så bli inte orolig om det verkar lite abstrakt just nu. Detta är något som vi kommer att prata om. Vi kommer att dyka djupare senare i kursen. Det sätt som någon form av högre nivå abstraktion av dessa saker och ting fungerar är att, i minne, i datorn, allt lagras i denna typ av stapeln, ska jag säga. Så där uppe i toppen. Jag vet inte om du killar kan se att väl. Jag ska försöka att zooma in. Här på toppen, vi har den fysiska texten av vad datorn är interpreting-- alla nollor och ettor som finns inom vår dator. Och sedan har vi det initierade data- och oinitierade uppgifter, vad vi kallar globala variabler. Så variabler som finns över alla program och över hela din, huvudsak kod. Inga bekymmer om ni är typ av oklar på detta. Det spelar egentligen ingen roll just nu. Och sedan har vi vad som är kallas en hög i en stapel. Tänk på en stapel bokstavligen som precis som en stapel av saker, en stapel av olika saker skjuts på toppen av varandra att lagra de olika variabler och syntax i din kod. Och så här längst ner, Vi har miljövariabler av vad du utför inom bara din lilla kodrad. Och vi kommer bara att zooma in på själva stacken delen. Så just här, om vi skulle för att zooma in på just detta område av stapeln, Detta är vad det ser ut. Och det är faktiskt ganska viktigt När ni talar om funktioner, eftersom märker att minne på din dator lagrar variablerna och funktionerna och parametrarna för både din funktion och dina huvudsakliga variabler på olika platser. Så just nu, främst är själva funktionen att du utför i en kod. Du har dess parametrar lagras här och dess lokala variabler lagras här. Lokal variabel betyder bara någon variabel som bara finns i den funktionen. Och ovanpå det, du har detta separat funktion kallad kub. Du har som är parametrar liksom dessa lokalbefolkningen. Och anledningen till att du kan se här är att det händer när kuben tar in en värde från din huvuduppgift är att det faktiskt är att kopiera det över. Så om jag ville kub 2 och tillbaka 8, att 2 faktiskt inmatas som en parameter och det är kopieras över så att du har det befintliga på två olika platser i minnet. Och du måste vara mycket försiktiga på att komma ihåg som en av dem du faktiskt manipulera. Och ett exempel på vad som hände det skulle vara mycket, mycket dåligt Det finns just här. Så här har jag fått, i teorin, ett program just här, en huvuduppgift att jag förklara en int x är lika med 1. Jag förklara en annan int y är lika med två. Och då jag kör den genom denna funktion kallad swap, där jag antar att det är att byta de två värdena. Och sedan kommer jag att skriva ut dem, eller hur? Det är vad jag vill ha det här programmet för att göra. Så låt oss komma ner och ta en titt. Så om jag faktiskt skriva en annan funktion, som ni kan se, vi har vår huvuduppgift här. Och sedan har vi vår andra funktion här. Void swap. Void betyder bara att det är inte kommer att återvända något. Funktionsnamnet är kallat swap, och det är kommer att intag två variabler, int a och INT B, från [OHÖRBAR] funktion. Så i huvudsak in här, vi är passerar x och y i denna funktion. Och om vi skulle skapa this-- så vi vill ha att skapa en temporär värde, eller hur? Vi kommer att tilldela den till en. Och sedan en kommer att nu lika b. Och b kommer att vara tillbaka där temp värdet var, som är en, för när du vill byta saker, du kan inte bara vilja byta dem. Du måste hålla ett ut här så att det kommer ihåg vad det är, eftersom när du byta ut en, du glömmer vad det ursprungliga värdet var, eller hur? Så i teorin, det här programmet ska fungera, eller hur? Om jag ville byta två, bör de byta. Så låt oss köra den och se om det fungerar. Så när ni kan se, x var en gång en och y var en gång två. Och om jag skriva ut, x är fortfarande ett och y är 2. Hmm, går detta program inte vara arbetar det sätt som jag vill att det ska fungera. Finns det någon som vill ta ett skott på gissa varför detta hände? Det har att göra med hur att olika saker är lagras på olika platser i minnet. OK. Så ni behöver inte oroa dig för mycket om detta just nu. Men vet att kuben lokala variablerna var a och b, för här i vår funktion, Vi har förklarat a och b som variablerna som finns inom kuben, denna funktion. Men som ni kan se, de parametrar som det tar i var lagras här. Men vi var inte faktiskt återvänder något. Vi var faktiskt inte ändra x- och y. Vi var bara ändra a och b. Vi hade kopierat x och y i något som kallas a och b. Men vi aldrig manipulerade x och y själva. Är ni ser hur som händer? Är att vi helt enkelt har kopierat det över, men vi har faktiskt inte hållit reda på var de var i minnet. Och så nu datorn ser, åh, jag har köra den här saken genom denna härliga funktion. Men x och y är fortfarande x och y. Ingenting har hänt med dem på grund av det faktum att dessa parametrar och lokala variabler lagras i en annan placera i minnet. Och detta är en högre nivå koncept som vi ska börjar se senare i kursen. Men bara vet att detta är ett problem som kan inträffa och att vi ska räkna ut sätt om hur man itu med detta senare i kursen. OK. Okej. Så den sista konceptet vi är verkligen kommer att täcka det kommer att vara till nytta för pset den här veckan är vad som kallas kommandoradsargument. Så Rob i sin föreläsning gick igenom typ av kort på hur dessa fungerar. I huvudsak vet att när du skriver som en huvudfunktion, när vi skrev funktioner tidigare i det förflutna, Vi hade int main tomrum. Och anledningen till att vi hade tomrum där berodde på att våra program inte behöver ingångsvärden för att köra, eller hur? När jag sprang Mario, det gjorde jag inte behöver faktiskt bara skriva in något när jag körde Mario. Jag kunde uppmana användaren senare. Men det kommer inte alltid att vara fallet. Till exempel, i detta veckans problem uppsättningar, du kommer att bli ombedd att i Förutom att köra ditt program, du kommer att vilja ingång vissa saker i rak som du köra program. Så hur gör vi som kallas en kommandorad argument som är som ett argument du kan mata in direkt som du försöker köra programmet. Så notation för detta, det är ganska komplicerad ut, men det är verkligen inte så svårt. Så int main-- det är bara din huvudsakliga funktion. Into argc komma sträng argv parentes. Så allt som säger är att detta int argc-- allt som talar om för dig är att de är antalet argument datorn ska förvänta sig. Så en sak som är verkligen viktigt att hålla reda på är den fysiska namnet på ditt program räknas som en av dessa argument. Så om jag ville ha mitt program kör plus en ytterligare kommandoraden argument, jag är faktiskt kommer att ha två. Argc är faktiskt kommer att vara två. Och sedan string argv bracket-- allt som gör, Det ger mig en array med strängar som är kommer att bara visa och lagra vad alla dessa kommandoradsargumenten är. Så till exempel, om jag ville ha detta program, ./copy INFILE outfile, eller hur? Det är bara en typisk linux kommando. Vad är egentligen argc? Hur många kommandoradsargument är det faktiskt i det här? Allt detta gör är att göra en kopia av en infil av namnet på en fil och det kopierar den till en annan fil, eller hur? Det är allt detta gör. Som ni kan se, jag gör det på en rad utan att faktiskt behöva programmet. Vilken är vår argc i det här fallet? Hur många argument har vi? PUBLIK: Tre? ANDI PENG: Vi har tre, exakt. Så det är mycket intuitivt att tror bara att det är bara den infil och utfil. Men vet att den fysiska namn program du kör räknas som en. Så i det här fallet, är argc faktiskt tre. Vad sägs om, vad är argv 0? Kom ihåg att alla av kommandoradsargumenten lagrades i en array av strängar. Så om jag försöker komma åt det, vad skulle argv konsol 0 ge mig? PUBLIK: [OHÖRBAR]. ANDI PENG: Exakt. Det skulle ge mig pricken slash kopiera, eftersom det är den 0:e elementet, den första elementet i min array. Vad sägs om argv 1? PUBLIK: infil. ANDI PENG: INFILE, exakt. Vad sägs om argv 2? PUBLIK: utfil. ANDI PENG: utfil. Detta är ett lite knepigt nu. Vad tror ni att argv 3 kommer att ge mig om jag försökte skriva ut det? PUBLIK: [OHÖRBAR]? ANDI PENG: Har du en hand upp? Yeah. Publik: En alternativ. ANDI PENG: Exakt. Så minns föreläsning som vi ha i slutet av en ras något kallas en null terminator? Vi kommer att komma in i denna också längre fram i klassen. Men vet att i notation, hur din dator vet att det är slutet av uppsättningen är att det sätter något som kallas en null terminator eller ett tankstreck noll. Så om du försöker att få tillgång till argv 3, du kommer att slå denna streck 0. Detta är ännu mer av en kuggfråga. Vad sägs om argv 4? Så det här är förbi null terminator, förbi gränserna för vårt utbud. Vad tror du kommer att hända när vi försöker att göra det? PUBLIK: [OHÖRBAR]? ANDI PENG: Förlåt? Säg att en lite högre? PUBLIK: [OHÖRBAR]. ANDI PENG: Ja. Det är namnet på den område du kommer troligen få. Men vet att argv 4-- som låter dig komma åt platser i datorns minne som du verkligen bör inte vara röra, eftersom Just nu vet du vad argv är. Du vet att det är en samling av storlek 3 som har punkt kopiera, infil och utfil. Om du försöker att gå så långt utöver att att du är förbi noll terminator, datorn har förmodligen lagrade något i argv 4. Och du borde verkligen inte vara tillträde till argv 4, eftersom du har en fil skåp och du är bara få tillgång till dessa tre hyllor. Men om du försöker att nå långt utöver hyllan var du får, du kommer att börja jävlas med andra saker i din dators minne. Det kommer att bli riktigt, riktigt illa. Så bara vet det. Var mycket försiktig så att du inte bara slumpmässigt börja åtkomst till element i en array som inte var vad du ville skapa. Japp. OK. Så vi kommer att göra en annan terminal exempel här. OK. Så Rob snabbt föreläsning häromdagen gick genom detta exempel, där han hade int main int argc sträng argv konsoler, som talar om för mig att jag är kommer att ha kommandoradsargument. Han har, om argc lika lika 2-- minns, lika likar betyder jämförelse. Om det är lika med 2, så är jag tryckningen hej, oavsett den första element i arrayen är. Else tryck, hallå världen. Vad kommer detta att hända väsentligen? Kan någon bara förklara Engelska vad detta program gör? Yeah. PUBLIK: Om någon skrivit in ett kommando och sade att deras för- och efternamn, Det kommer inte bara att skriva ut första och säga, hej, oavsett ditt förnamn är. ANDI PENG: OK, låt oss köra den. Så till exempel, om jag skulle göra den här filen gör hello att-- hello att-- Vad vill du att jag ska ingång? PUBLIK: Först och efternamn. ANDI PENG: Först och efternamn? Spaces? PUBLIK: Ja. ANDI PENG: Kan någon berätta mig just nu, vad är argc? Helt rätt där? Oops, sorry. Låt mig gå tillbaka. Hur många kommandoradsargument är-- ni kan inte riktigt se. Men jag ska försöka att zooma in. Jag försöker. Ja, det finns tre, eller hur? Det är dot snedstreck Hej, Det är Andi, och det är Peng. Så vad tycker ni här Programmet kommer att skriva ut? Oh. Åh förlåt. Fel namn. Det skrivs ut, hallå världen. Finns det någon som vill förklara varför det händer? Yeah? PUBLIK: [OHÖRBAR]. ANDI PENG: Exakt. Så här är villkorad är, om argc lika lika med 2. Så bara i det fall att det finns två kommandoradsargument. Då kommer jag att skriva ut, Hej, det är vad som helst. Men annars, jag ska skriva ut bara, hallå världen. Så gör någon vill att ge mig ett exempel hur jag skulle kunna faktiskt få det att skriva ut värdet av argv 1? Vad skulle jag behöva input här? Bara en sak, eller hur? Eftersom punkt hej till redan räknas som det första argumentet. Jag har bara en ytterligare. Så dot hej om jag bara göra Andi. Hej, Andi. Förstår alla varför det händer? Yeah. PUBLIK: Så utrymmet mellan kommando line-- är det [OHÖRBAR]? ANDI PENG: Nej Så utrymmet i en kommandorad argument, x, att berätta för din dator att detta är början på en ny sträng. Så sträng argv här-- det butiker alla dina kommandon linjeargument i strängar. Och så utrymmet i kommandoraden argument-- allt som gör är att berätta dig, detta är i slutet av en sträng och det är dags att gå vidare till en annan. Yeah. Detta är ganska viktigt för din pset, eftersom du är kommer att testa dessa. Så är det någon som har eventuella frågor om detta? OK bra. Yeah? PUBLIK: Så anledningen till att du skulle sätta heltalsargument calc istället av [OHÖRBAR] skulle vara när du vill att skriva ytterligare information till [OHÖRBAR]? ANDI PENG: Ja, exakt. Vissa program kräver att du att mata in ett Kommandoradsargumentet att den passerar in och som använder denna. Yeah. PUBLIK: Så vad händer om [OHÖRBAR]? ANDI PENG: Tja, vad jag har att göra att sedan ändra i mitt program? PUBLIK: Bara 3. ANDI PENG: Varför är det händer, tror du? PUBLIK: Eftersom [OHÖRBAR]. PUBLIK: Du skulle behöva ändra det till 2 [OHÖRBAR]. Publik: 1 och 2. ANDI Peng: 1 och 2, exakt. Så i detta fall, skulle du förmodligen vill ha två printf statements-- en som tryckt argv 1 och den som skrivs ut argv 2. Här. Jag kan faktiskt göra det riktigt snabbt. Här har du. Oh. Inte riktigt vad du ville ha. Men om ni röra runt med formatering, kommer det att komma ut. Yeah. Häftigt. Jag vet att vi är lite ont om tid. Men jag ska bara snabbt tillbringa en par minuter går igenom helpful-- PUBLIK: Du har två minuter. ANDI PENG: Jag har två minuter? Tack. Några snabba PSET tips. Så för denna pset, rekommenderar jag starkt, som sagt, alla att läsa spec. Du kommer att skriva tre programs-- en kallas initials.c, som kallas caesar.c, en som heter vigenere.c. Några viktiga tips som ni verkligen vill att hålla mind-- så det är denna funktion kallas atoi-- som jag vilja säga, en trois. Oklart om det är faktiskt hur du säger det. Men allt det gör, det är inmatning. Den konverterar en sträng till en int. Så en representerar ASCII till i heltal. Det är bara konvertera ASCII värden till heltalsvärden. Så kom ihåg argv, matrisen som lagrar alla dina kommandon linje arguments-- den lagrar dem alla som strängar. Och så om du vill kunna har en av dem blir ett heltal, du kommer att ha att använda detta värde här. Modulo, som vi täckte tidigare i klassen idag, gör att du kan ha Resten av vad du har. Så om vi har verkligen, verkligen ett stort antal i Caesar, tänk om vi har slut av en sträng av Vigenère? Hur kommer ni att kunna att få det att slå runt? Om jag slog z och jag vill det att gå tillbaka till en, Hur ska jag få som att linda runt? Förmodligen vill använda modulo där någonstans. För det andra, bläddra runt biblioteket. ctype.h. Det är ett nytt bibliotek som vi har. Du hittar en hel del riktigt, riktigt användbar functions-- isupper, islower, TOUPPER, tolower, isalpha, et cetera. Alla funktioner som kommer att vara till stor nytta när du försöker räkna ut, är denna karaktär en liten bokstav? Hur gör jag omvandla denna sträng till ett versalt? Alla dessa saker kommer att bli mycket, till stor hjälp för din pset. OK. Kontorstid ikväll är 8:00 till 11:00 i TEAL klassrummet morgon samt onsdag och torsdag kväll. Kontorstider är allmänningar. Mycket föreslår ni alla komma igång direkt, eftersom du inte vill vara den barn som torsdag kväll har problem skickar in din pset och som, jag vet inte vad jag ska göra. Jag började, jag slutade lade jag. Försök att ge dig själv lite utrymme, eftersom koden problem uppstår alltid. Du vill vara säker på att du ger dig själv en hel del tid för att kunna att slutföra psets. Häftigt. Jag ska hänga här. PUBLIK: Är detta online redan? ANDI PENG: Jag vet inte om det är redan finns på nätet, men det kommer att bli. Jag ska hänga runt här om någon har några frågor redan. Tack för att du kom.