[Powered by Google Translate] DAVID MALAN: Detta är CS50, och detta är början av vecka 1. Vad vi trodde vi skulle göra i dag är att ta en titt tillbaka på något som många av er har förmodligen gått förbi för några tid nu och kan se lite bekant. Denna sak här, är detta naturligtvis i - Publiken: Science. DAVID MALAN: Science Center. Så det här är faktiskt en av de tidigaste datorerna tillbaka från 1940-talet. Det var en av de första elektromekaniska datorerna som kunde särskilt lång, självunderhållande beräkningar, och vad vi faktiskt ser i science center är bara en liten bit av det här. Vad vi trodde vi skulle göra då är att ta en titt tillbaka på en video som gjordes för en tid sedan, att införa detta sak i världen. Och du kommer att se från musik-och röst som verkligen de var mycket lyckliga tider. [VIDEOAVSPELNING] -En triumf för matematisk och mekanisk skicklighet är det stor ny automatisk räknare vid Harvard University. Intrikata problem i matematik, få igenom den maskin i kodad form på band, är noggrant lösas på ett minut bråkdel av den tid som krävs för mänsklig beräkning. Designad för att påskynda alla former av matematiska och vetenskapliga forskning kommer jätte mekaniska hjärnan arbeta för FN Påstår marinen fram till krigsslutet. DAVID MALAN: Så vad du kanske inte vet är att det var i samma enhet som en term vi alla nu tar ganska mycket för givet myntades, som en bugg. Så en av de ingenjörer som arbetar i den här datorn bokstavligen hittade en liten fjäril i maskinen som ledde I vissa felaktiga beräkningar. Och som historien går att mal var tejpade till denna logg journal här tillbaka från September 9 1940-någonting, och därmed föddes för världen termen "bug". Så hädanefter anser vi fel vara någon sorts misstag i program, oavsett om människor eller, i detta fall, insekter. Så några meddelanden, som vi går vidare. Så CS50 har en tradition av att erbjuda luncher för slags på flesta fredagar under terminen, där vi tar 30 till 40 studenter till eld och is in the Square för casual kallprat, talar om datavetenskap, tala om framtiden. Vi bjuder alumner och vänner från industrin att chatta upp elever. Verkligen mot ett slut för att göra vad som är en ganska stor klass allt mer intim, minst en gång i medan undergrupper av studenter. Så om du vill gå med oss ​​på fredag, 1:15 PM, gå till CS50.net/lunch till OSA. Och vi ska göra det återkommande och så att inte oroa dig om du inte är bland de första 30 eller så den här veckan. Så skriftlärde anteckningar. Ett ord på de resurser som nu börjar bli tillgängliga till elever i klassen. Så att era huvuden inte behöver vara nere under föreläsningar klottra ner allt jag säger och så vidare, vad vi gör istället ge från lärarkåren en kanoniska uppsättning anteckningar. Så vi har en av våra lärare medmänniskor, Andrew Sellergren, som sitter ner varje vecka, granskar videor och sedan skriver ner vad vi tycker är en ganska auktoritativ uppsättning anteckningar. Och Andreas förtjust, även att sätta snarky fotnoter i botten. Så du förhoppningsvis njuta av dessa som en uppslagsbok för roligt och även komma frågesport tid, som en möjlighet att granska vad som hände i enskilda föreläsningar. Så de är kopplade på föreläsningarna sidan. Problembild 0, under tiden, är ute. Och i fråga om de resurser som finns tillgängliga för dig - genomgången. Milo ledde den första på fredag. Det filmades, satte på nätet genom lördag. Och så inser, om du inte riktigt säker på var du ska börja, detta eller framtida p-apparater, alltid vända först till genomgång eller video därav. Sektionering pågår, vid cs50.net/section är där du bör lämna dina inställningar, om du inte har redan i dag. Eftersom avsnitten börjar denna kommande söndag, måndag, och tisdag. Vi delar dessa tre dagar, varje vecka termin för det mesta. Och vi introducerar också, återigen, olika spår. Så du blir ombedd om detta sektionering form, om du har inte sett det redan, om du är bland de mindre bekväm, bekvämare, eller någonstans mittemellan. Och om du är typ av på staketet, i allmänhet någonstans i mellan är vad de flesta studenter hamnar kontroll. Öppettider börjar ikväll. Så Scratch är ganska låg nyckeln, även om det är ganska naturligt att köra i olika buggar, eller vara osäker på hur genomföra något. Så inse att vi kommer att börja kontorstid denna vecka. De kommer att vara på Annenberg måndag, tisdag, onsdag, Torsdag, 20:00 till 11:00 under hjärnans paus. Övre classmen kan komma in, och om du någonsin har problem med att få i dörren, eftersom de kommer att svepa, bara prata dig i och förklara att du är med CS50. Normalt 20 till 30 av oss i personalen kommer att vara där för att hjälpa du en på en. Vid ankomsten tanken är denna: du tar med din bärbara dator, du har din laddare kommer vi ha extra strömkablar, särskilt längs den södra väggen i Annenberg där det finns massor av eluttag. Och den viktigaste inkörsporten till kontoret timmar Q & A är att gå till cs50.net/discuss och att lägga din fråga där. Och att märka den med pset 0 eller pset 1, oavsett veckan kanske råkar vara. Och vad vi ska göra är att ha en tabell med undervisning stipendiater och naturligtvis assistenter, i allmänhet 8 eller 10 eller så av oss, går igenom, håller ett vakande öga på tavlan, och plockning av frågor verkligen så snabbt vi kan, hänvisa dig till relaterade tjänster om du inte har hittat de er, online referenser som är lämpligt. Och sedan om det finns problem, eftersom det oundvikligen kommer att bli, eller det bara är mer förnuftigt att sitta ner en på en, arbete genom problem med någon. Eller du kommer bara in kontorstid verkligen behöver detta tänkesätt. Du vill inte gå igenom det elektroniska formuläret, du verkligen vill träffa någon. Kommunicera det till oss, och vad som kommer att hända är när Frågan har setts av en anställd, och vi bestämma Japp, bör detta sändas till ett av de 20 eller 30 lagmedlemmar här lokalt, kommer du att se uppe till vänster här lite Ange kö knappen börjar blinka på cs50.net / diskutera. Och detta säger att du nu har blivit inbjuden, så att tala, att komma in i kön. Och genom att klicka på den knappen kommer ditt namn att visas sedan på en iPad som CS50 greeter, en av kursens huvuden, kommer att hålla nära ingången Annenberg kommer som sedan ser som avbildas här, de studenter som har frågor om vänster, de anställda som befinner sig till höger. Och med ett klick på vänster och höger, din webbläsare kommer börja blinka så snart som, till exempel, professor McGonnagal är redo att se dig på en viss tabell i Annenberg. Så vi gjorde en del av det senaste året. Vi har startat kontorstid och åter genomföras mycket av programvaran. Så inser att detta kommer att värma upp denna vecka. Men också inser också i år tidigare, som ni kanske har hört från vänner, hade kontorstid faktiskt 50 till 150 studenter på en gång. Och det är helt enkelt inte möjligt för oss att hantera detta effektivt, en på en, under hela kvällen. Och så vad vi verkligen kommer att försöka göra i år är kapitalisera på det faktum att många frågor är vanliga och kan ofta bättre besvaras asynkront. Så du kan sortera på tänka igenom personalens svar, och vi kan tänka igenom din kod, utan den uppvärmda tryck nödvändigtvis kämpar genom den sida vid sida. Så vi uppskattar att ungefär en tredjedel eller hälften av frågorna kommer att skickas i person, och vi ska försöka plocka ut som många som en halv eller mer elektroniskt, under kontorstid. Och vi kommer att fortsätta att använda Diskutera hela veckan också. Och slutligen inser att denna kurs kan tas godkänd / underkänd. Så om du är på staket eller bara tror att du är riktigt inte säker på om detta är världen för dig, eller detta är verkligen ganska främmande för dig, inse att detta är ett underbart sätt att få upp lite självförtroende som att kliva in i klass, som jag gjorde ärligt talat, år sedan. Och sedan har fem veckor att sortera enligt figur ut för själv om du vill bo godkänd / underkänd, byta till en bokstav grad, eller liknande. Och typiskt vad godkänd / underkänd gör, tror jag, för studenter är att om du sätter in att 10 timmar, 20 timmar, vad det kan vara på vissa problem, och du banka huvudet mot väggen, och du verkligen bara inte kan jaga något ner och du har så många andra saker du behöver göra, ärligt talat, vad jag tror godkänd / underkänd är tar det udden av situationer sånt. Där du har tagit saken 90% av vägen. Du vet, det är inte helt perfekt. Men du fick mycket ut av det, ändå. Så anser godkänd / underkänd som ger dig ett mental modell, kanske. Okej, så i förra veckan vi dök in Scratch och vi talade om programmering på en ganska hög grafisk nivå. Och idag gör vi en övergång till ett språk kallas C, en lägre nivå programmeringsspråk ovanpå som många moderna språk byggs nu, inklusive några av de vi kommer att använda mot begreppet slut. Och syntaktiskt, hur de ser ut är alla ganska lika. Så låt oss börja att göra denna övergång här. Så detta var ett program förra veckan som var den enklaste av hallå världen-program. Det skrivs helt enkelt skärmen hallå världen, med en liten pratbubbla som kommer ut katten. Tja, om vi börjar nu att översätta detta till en annan språk, inser att de idéer idag och på onsdag är identiska, men syntaxen börjar ändras. Så medan förra veckan hade vi, när grön flagg klickade, säger hallå världen. Idag ska vi ha int, huvud, tomrum, printf, avkastning, med någon annan syntax i där också. Klammerparenteser och parenteser, och citat, och allt. Men inser att kärnan av idén här är tryckning, och slutligen det faktum att stora nu kommer att bli synonymt med start av ett program. Huvud ska vara där den gröna flaggan sparkar saker. Så nu ska vi retas isär några av byggstenarna här innan vi dyka in några konkreta exempel. Så vi kallade detta ett uttalande förra veckan, där det är bara en instruktion. Gör detta - i det här fallet, säger hej världen. Väl i C, om vi tittar på just den linjen, det är hur vi kommer att börja uttrycka just pusselbit: printf ("Hello World"),. Och nu ska vi reta dem isär mer och mer med tiden, men inser att det finns ett mönster här. Så en, vi har denna sak kallad printf, vilket är huvudsak analogt med ordet Say. Det är vad det kommer att göra. Printf innebär och f här "formaterad". Så det betyder bara att du kan infoga olika estetiska detaljer. Så citerar unquote är början på vad vi ska att börja ringa en sträng. Ett ord, en fras, en mening. En sträng i ett programmeringsspråk är en sekvens av noll eller flera tecken. Så h-e-l-l-o, komma och så vidare är, citat unquote, en sträng. Och nu bakstreck N, lite syntaktiskt udda, men vi redan definierats som förra veckan så sätt vad? Det är bara en ny rad. Det är bara ett sätt att förmedla till den dator som du vill motsvarande slå på Enter där, men du inte vill verkligen trycka Enter och därför förstöra alla formateringen av din faktiska program. Nu parentes bifoga denna sträng, öppna föräldra och nära paren, och insidan av det är vår strängen. Eftersom det beror i C och andra program språk, som tar saker printf argument, eller ta parametrar. Så börja tänka nu denna lila Säg blocket som funktion, som en metod, som ett förfarande. Du kan verkligen kalla det vad du vill för nu, men Det är en slags miniatyr program som bara gör en sak, i en enda rad, inte mindre. Så printf är också vad vi ska börja ringa en funktion och funktioner gör något - i det här fallet skriver en formaterad sträng till skärmen - men fungerar också ta argument eller parametrar. Och med argument eller parametrar, tack, menar vi att deras beteende kan påverkas av vad du passerar i insidan av parenteser. Så i det här fallet, kan printf behov tillsagda vad de ska skrivas ut och vi bara passera i, inom citationstecken här, sträng som vi faktiskt vill skriva ut. Och semikolon på slutet av denna linje är bara en historiska olägenhet där i slutet av de flesta rader kod, du sätter ett semikolon för att göra Super Clear till datorn att den här kodraden slutar här. Nu är bra eftersom vi ser som program får mer komplex kommer semikolon gör super klart för oss människor, och även datorn, där rader kod början och slut. Inse att vissa språk inte har några av dessa samma detaljer. Och i själva verket i JavaScript, behöver du inte alltid behöver något som semikolon. Men mer om det framöver. Så loopar. Vi hade något sådant, mycket intuitivt självklart, gör något igen och igen och igen. Som att sätta på strumpor eller säga hej, i detta fall. Tja, med start idag i C, kan vi uttrycka denna Scratch blockera som samtidigt (sant) printf ("Hello World"). Så märker vi börjar bygga på bokstavligen pusslet bit från förr. Vi har samma lila block, men det är insidan av detta parentes alltid block och det bästa sättet att översätta det till C är följande. Det finns ingen evigt sökord. Du kan inte bara skriva f-O-R-e-v-e-r i C. Så den närmaste analogen är stund. Nu, medan (sant) verkar lite dumt eftersom inte värdet av äkta någonsin förändring? Förmodligen inte. Det är som att säga medan en, medan, medan sann. Det är alla samma sak, gäller alltid fallet. Så denna slinga är faktiskt framkalla vilken typ av loop? Bara en oändlig slinga, höger. Ett evigt slinga eller som vi kallade det förra veckan, bara en oändlig loop. Så ibland det är illa. Ibland är en bugg, ibland det är därför du får den snurrande badboll eller timglas eller liknande. Men i detta fall, vi medvetet, oavsett Därför ville skriva samma sak igen och igen och igen. Eller i fallet av som en klocka, du vill göra något igen och igen och igen. Så oändliga slingor kan vara meningsfullt. Och det är hur i C vi kan översätta alltid till koden. Så nu här är lite mer specifik. Vi hade upprepa 10 gånger följande uttalande. Så medan (true) inte fungerar riktigt där, eftersom sant är alltid sant. Så om vi istället tittar på C versionen, nu syntaxen får en lite mer kryptisk. Men för att vara ärlig när du börjar se detta, blir det allt ganska bekant snabbt. Så detta är vad som kallas en for-slinga. En for-slinga ska tala om för datorn att göra något igen och igen och igen så länge som dessa saker är sanna. Nu vad menar vi med det? Tja, det finns tre delar till en for-slinga, och vi kommer att komma tillbaka till detta i samband med den faktiska exempel i ett ögonblick. Så oroa dig inte om det inte riktigt sjunka in alla på en gång. Men int i = 0 är lång historia kort, säger ge mig en variabel som är av typen heltal, så ge mig ett nummer kallade jag och initiera den till 0. Det är att ge mig som en algebraisk variabeln x och initiera den till 0. Men i detta fall vi kallade det jag. Sedan i mitten, säger i är mindre än 10. Det talar datorn gör följande saker så länge som jag är mindre än 10. Och självklart börjar mindre än 10, eftersom det börjar på 0. Då slutligen, kan du gissa kanske vad jag + + medel. Det är en liten bit av syntax som betyder bara öka i.. Så lägg 1 till i, igen och igen och igen. Och så får vi se denna slinga, denna syntax snarare implementerar precis samma sak som, uppriktigt sagt, i Scratch var bara så mycket lättare att uttrycka. Upprepa 10, och du är klar. I C och i de flesta programmeringsspråk, måste vi vara en lite mer lärorik för datorn och faktiskt Ange något sådant. Men vi ska återkomma till detta och andra syntax. Hur är det med variabler? I Scratch vi hade något som dessa oranga block, där jag kunde deklarera en variabel. Låt oss kalla godtyckligt det disk. Låt oss initiera den till 0 och sedan låt oss för alltid göra något. I det här fallet i Scratch jag säger räknaren, så katt kommer att ha en liten pratbubbla som är talar det antal som finns i denna variabel. Och sedan har vi ändra disk med 1. Så allt detta är lindat inuti en evigt lås. Så vi redan nu har byggstenarna i C med för att översätta denna. Ett sätt vi kan göra det är det. Ge mig ett heltal, kalla det disk. Initiera den till 0 i den första raden där. Medan (sant), så jag stjäl den idén från bara ett ögonblick sedan gå vidare och göra följande. Skriv ut disken och sedan öka räknaren igen, och igen, och igen. Eller igen, + + betyder bara tillägga 1 till något. Men det finns en ny bit av syntaxen här. Vad hoppa ut så inte bland våra tidigare exempel? Ja, den här% d. Så du kan kanske sluta vad detta gör, ärligt talat, baserat om vad Scratch blocket gör. Men återigen i C, har vi bara vara lite mer speciellt när det gäller att uttrycka oss. Så printf ("% d \ n"). Väl de flesta av som vi kan kasta bort som bekant. Citaten betyder bara att det är en sträng, omvänt snedstreck N är bara en ny rad. Så det enda nya är här% d. Och allt som är är en platshållare. % D kommer att beteckna ett decimaltal. Och% d betyder dator, sätta ett decimaltal här. Nå, vad som du vill lägga dit? Tja, som ni kan kanske sluta, efter kommatecknet vi säger räknare, det är namnet på en variabel som vi deklarerade eller skapade ett par rader tidigare. Så detta är bara C: s sätt att koppla in en variabel i en sträng dynamiskt. Eftersom däremot om jag istället hade gjort något liknande detta printf ("räknare"), vad skulle detta programmet göra istället, förmodligen? Det kommer bokstavligen ut "räknare". Vilket inte innebär att jag vill ha. Jag behöver ersätta på något numeriskt värde. Så vi får se till att fungerar då, liksom printf kan inte ta bara enstaka argument, som "Hello World". De kan ta kommatecken citat unquote och sedan några variabler som kommer att få pluggas in, som vi ska se föregående strängen via dessa%-tecknet platshållare. Väl vad om booleska uttryck? Booleska uttryck var dessa värden, sant eller falskt. Ja eller nej. 1 eller 0. På eller av. Så i Scratch de ser ut så här, och märker att bottenblocket här är faktiskt tillsammans av två mindre block. Så jag typ av dra och släppa tre pusselbitar tillsammans för att göra det längre pusselbit där så att jag kan förmedla tanken att jag vill x för att vara mindre än y och y att vara mindre än z.. Och så jag kan översätta dessa två separata linjer enligt följande. Den översta kan vara mycket trivialt översättas till C, med bara x är bara vårt sätt att säga, i C, ge mig tillgång till funktioner som någon annan skrev. Och i det här fallet jag bryr eftersom jag vill printf. Nu får vi int main (void). Så det här är en av dessa saker, ärligt talat, att den dag 0, ganska mycket jag har att typ av zon ut, eftersom det är bara inte intressant intellektuellt, en del av syntaxen. Men nu vet att funktioner, annars känd som förfaranden eller metoder, vanligen producerar något värde. De gör något. De kommer fram till ett svar. De producerar utdata. Så int bredvid viktigaste är bara vår stenografi sätt att säga att denna funktion detta förfarande så småningom kommer för att ge dig tillbaka en siffra. Och varför det är, vi kommer tillbaka till. Main är bara den förvalda världsstandard för standard funktion som kommer att få utföras i ett C-program när du kör det. Void betyder bara denna sak, huvud, sker ingen argument, i detta fall. Så jag är super tydlig. Det finns inga strängar i det, det finns inga kommatecken. Void innebär inga argument to main. Nu sist, tack och lov, de sista två raderna är bekanta. Inuti klammerparenteser har vi en printf och vi har en återgång. Och avkastningen är typ av olyckligt att vi måste lägga den där, eftersom det i detta fall inte gör allt det mycket av intresse. Men i ett datorprogram, när en funktion returnerar 0, det betyder allt är bra. Ingenting gick fel. Om däremot en funktion returnerar 1, eller negativ 1, eller negativ 1.337, eller några slumptal som detta, att innebär i allmänhet att ett fel verkligen har uppstått. Så om du är på din Mac eller PC, om du någonsin sett några irriterande meddelanden eftersom datorn har kraschat eller frysta, och det finns ett kryptiskt felmeddelande och lite kod, som systemkod 1,2,3,4, ett visst antal, som är allmänt en onödig detalj att berätta De flesta av oss människor, men det är vad någon funktion eller något Programmet har faktiskt återvänt, en icke-noll värde. Och nyttan av detta är att 0 betyder allt också, och så har du i huvudsak ett oändligt antal saker som kan gå fel. Det är därför de valde 0 för gott och ett värde skilt från noll för dåligt, eftersom vi snart se. Så låt oss gå vidare och skriva detta. Så minns att den andra dagen jag använde min Mac för att öppna upp en terminalfönster, och sedan jag öppnade upp text programmet, liksom Textredigerare, och jag började skriva lite kod. Jo det är bra. Men din erfarenhet kommer att vara annorlunda på en Mac, eller på en Solaris-dator, en Linux-dator, oavsett operativsystem system du råkar använda. Och så i kursen, vad vi istället att använda är något kallas CS50 Appliance. Så CS50 Appliance är en nedladdningsbar mjukvara som tillåter dig att köra ett operativsystem som heter Linux, specifikt Fedora Linux på din egen Mac eller PC. Och du gör det genom att ladda ner något som kallas en hypervisor. Så allt detta kommer att dokumenteras i problembild 1. Och du kommer att styras mot vad du behöver ladda ner. Men slutresultatet, oavsett om du har en Mac eller PC, är du ladda ner några gratis programvara. Du hämtar sedan CS50 Appliance, och du säger att fri programvara - den hypervisor - att köra CS50 Appliance i ett fönster på din dator. Och vad som händer är det. Jag har nu, märker här verkar det som att vara en stationär miljö. Och låt mig faktiskt krympa denna enda fönster. Så det här är nu min Mac, med ett litet fönster här, och inuti av detta fönster råkar vara en helt annat operativsystem. I själva verket finns det här startmenyn här nere, som påminner om Fönster, som har en massa undermenyer, inklusive en länk till CS50 manuell, Dropbox och liknande. Och vad denna miljö är nu en vanlig miljö att vi alla nu kan använda, så att oavsett vad din dator är, vad du har installerat på den, vilken version av Mac OS eller Windows du kör, vi alla nu har samma miljö. Och nu i denna miljö kan vi börja skriva lite kod. Så jag kommer att gå vidare och öppna ett program som heter gedit. Detta är jämförbart med notepad.exe, eller TextEdit på en Mac. Och detta är bara en super enkel text redigeringsprogram som ser ut så här vid första anblicken. Nu högst upp, jag har en vit palett, längst ner jag har denna svart fönster som säger jharvard @ apparaten. Och det beror på att det användarkonto som vi redan skapat för alla heter John Harvard. Han har en mapp där alla hans filer kommer att gå, och Här är där vi kan börja skriva lite kod. Så låt mig gå vidare här och zooma in bara lite, och jag är kommer att göra # include , int main (void), och då ska jag göra printf ("Hello World") , Returnera 0. Nu är alla helt svart och vitt. Låt mig gå vidare och göra en sak att lära gedit vad jag faktiskt gör. Låt mig gå Spara som. Jag ska välja den vänstra sidan här jharvard. Så återigen, även om du aldrig har använt Linux tidigare, ärligt talat dessa dagar, är alla av dem delegera till väsentligen samma typ av gränssnitt - Mac OS, Windows och Linux. Så jag valde jharvard hemmapp här. Och jag kommer att spara filen som hej.c. Så högst upp, skrev jag hej.c, namnge en C program med. c. förlängningen är vad är vanligt. Och jag slog Spara. Och nu vad är trevligt är att jag faktiskt har lärt gedit, att detta är ett C-program. Lägg märke till att min svartvit text nu färgkodade, eller syntax, som bara drar min uppmärksamhet till olika semantiska delar av programmet. Längst upp till vänster där, som mina program blir mer komplexa, jag är kommer att ha en sammanfattning av alla de saker som jag har skrivit. Så det är det där uppe. Så låt mig nu zooma ut och gå ner till den här terminalfönster. Så det här är kanske nytt för många människor. Om du aldrig har använt en miljö kommandorad, du har aldrig använt DOS, eller om du har aldrig använt Linux eller du har aldrig öppnat Mac OS terminalfönster, det finns en hel del saker du skulle kunna göra med GUI, som pekar, och klicka och dra och släppa, och liknande, men i allmänhet - säkert i världen av datavetenskap - med hjälp av en kommandorad, där du inte har musen allmänhet, du bara tangentbordet, är faktiskt en hel del mer kraftfull än gränssnitt, när du väl anpassat sig till olika kommandon. Och du typ av fri själv för att behöva peka och klicka på allt. Så i gedit vi sortera på är det bästa av två världar. Vi kan dra och släppa text kan vi se det trevligt och färgkodade. Men när det blir dags att köra vårt program kommer vi ibland bara använda denna lilla fönstret här. Så jag kommer att gå vidare och göra det. I botten svart och vitt fönster, jag ska gå vidare och skriva klang. Och klang är namnet på en kompilator. Det är ett program som konverterar min källkod till, så objektkod. 0 och 1, som vi såg i korthet förra veckan. Minns från förra veckan lovade vi att vi skulle gå från något liknande - vi behövde vara ungefär så här - och detta är verkligen inte något som en människa kommer att göra manuellt. Så istället ska vi använda ett program, och att programmet detta fall kallas klang. Och namnet på mitt program är hej.c. Så för att sammanställa hej.c från källkod till objektkod eller 0 och 1, bör det räcka att bara göra detta och tryck på Retur. Okej, ingenting verkar ha hänt. Men jag vet nu, eller från förra veckan, att standardnamnet ett program, när skriven i C, är dåraktigt kallas a.out. De flesta ointressant namn du kan komma med. A är den första bokstaven i alfabetet, ut är vad som var matas, men så var det. Detta är mitt program, och nu prick snedstreck, som vi ska se, är faktiskt bara en sorts säkerhetsfunktion, eftersom a.out är ett program jag skrev. Det kom inte med min dator är det inte i Program Files. Det är inte i Mac OS är mappen Program. Jag behöver vara super tydlig med datorn och säga detta program a.out, är i den aktuella mappen, den aktuella katalogen. Och hur du representerar detta i en miljö som denna är prick representerar vad mapp du befinner dig i. Och så. / Betyder bara köra a.out i den aktuella mappen. Och jag kör det här med Enter, och voila, min allra första programmet. Låt mig ta ett steg tillbaka. Detta fönster är en liten liten, och inse att den nedre vänster av apparaten här är en annan ikon. En är Chrome, som bör vara ganska bekant, bara en webb webbläsare inuti apparaten. Och denna svartvita symbolen är bara en större terminalfönster. Så om det blir lite irriterande att sortera om har bara denna lilla bit av ett fönster som man kan interagera med program, kan vi göra utan detta. Och nu låt mig börja skriva några snart att känna kommandon. ls. Så ls är kommandot för notering. Så i ett Mac OS eller Windows, skulle du vanligtvis dubbelklicka på en mappen och sedan, voila, ser du alla de olika filer och mappar. I en kommandorad miljö, där du bara kan skriva kommandon eller text, är ls motsvarande. Så visa mig vad som finns i den här katalogen. Nu finns det en massa saker här som är både lite välbekant och lite främmande. Men märker att precis som Windows och Mac OS, jharvard har en stationär mapp. Så några ikoner som finns på mitt skrivbord hända att vara i den mappen. Det finns en nedladdningar mapp saker som Chrome kan sätta dit. Dropbox. Så apparaten levereras med inbyggt stöd för Dropbox så att under terminen kan du synkronisera med din Dropbox konto så att alla dina program säkerhetskopieras. De är tillgängliga på den andra datorn. Om något någonsin går fel med apparaten kan du mycket lätt att återhämta sig från Dropbox. Så att mappen är där för det. Det finns två filer som jag gjorde - hej.c och a.out. Och sedan till höger finns några andra mappar som vi ska få mot slutet av terminen, med webb programmering. Så när jag gör det. /, A.out, Enter, som säger gå i katalogen jag i, den aktuella katalogen, och kör program som heter a.out där. Okej, så det är trevligt och bra, men det är inte alla som tvingande att skriva ett program som kallas hjälp a.out. Så vi kan faktiskt göra det lite annorlunda. Så istället för att bara köra klang, hej.c, låt oss lägga vad som kallas en argumentation kommandorad. Så ett argument eller en switch i detta fall, är bara annat ord eller en fras som du skriver på ett snabbt efter det program som du vill köra. Så i detta fall är klang programmet jag vill köra,-o betyder utgång en fil som inte längre kallas a.out. Utgång en fil som heter hej, och gör det genom att sammanställa sista ordet på raden, hej.c. Så kort sagt, är detta en mycket marginell förbättring, där istället för att ha den här dumt namngiven fil a.out, Jag kan nu göra klang-o hej då hej.c och sedan trycka Enter. Ingenting verkar hända, men återigen mycket gärna med 0 - när ingenting verkar hända det betyder inget fel hände - så låt oss göra ls nu Enter, och faktiskt jag nu har ett hej program. Så om jag skriver hej nu, kommando hittades inte. OK,. /. Så exakt rätt. Så eftersom detta program jag skrev, och det kom inte med datorn. / hej, Enter, innebär Jag kör nu hej. Så det är det där. Nu vad vi så småningom kommer till mer och mer kommandoraden argument som tillåter oss att göra mer, men bara för dem för vem detta kan vara gammal hatt, låt mig faktiskt gå in i en katalog här och bara ge dig en teaser på hur annars vi kunde gå om att genomföra hej världen. Låt mig gå in på här, och jag kommer att öppna den. Så egentligen, jag ska förklara vad jag gör, så detta är användbart. Låt mig tillbaka upp. Så jag har gjort detta en lång tid. Så märker över till höger finns ett par kataloger som konstigt namnges source1m och source1w. Detta är bara dumt konvention vi använder. Källa betyder bara källkod betyder 1 är vecka ett, och m betyder att det är måndag, och w betyder att det är onsdag. Så inget kryptisk där. Det är bara förkortning. Dessa blå saker är mappar, annars känd som kataloger. Jag vill gå in i den mappen nu och på en normal dator Jag kunde bara dubbelklicka på en mapp ikon och Det finns alla mina filer. Men i en kommandorad miljö kan jag inte riktigt göra att, så istället måste jag byta kataloger manuellt. Så om jag skriver cd och sedan source1m, Enter, märker att min ledtexten sak i vitt till vänster, precis förändrats. Och så faktiskt, när det sa bara parenteser och sedan de liten squiggle, tilde symbolen, som bara innebar att jag var i John Harvard hemkatalog, hans Mina dokument, hans personliga filer. Men nu inom parentes står ~ / source1m. Detta innebär bara att jag är i en mapp som heter source1m Det är i John Harvard hemkatalog. Så om jag vill nu att lista filerna i denna mapp, lätt fråga skriver jag bara ls. Och nu ser jag alla filer som jag redan skapats för dagens föreläsning, vilka alla, eller de flesta, hända att sluta på. c.. Så låt mig gå vidare nu och köra gedit av ett program kallat holloway.c, som är skriven av några random hackare på Internet, ser att en liten här. Och vi kommer inte att gå igenom detta en något detalj, men för de mer bekväm, särskilt om du vill ta en gissning om vad detta program gör här. Lita, oavsett om du är mer eller mindre bekväm, vi inte ens få till något sådant i slutet av den här terminen. Detta är vad är ett exempel på en förvrängd C tävling, vilket medel skriver mest kryptiska ser program du möjligen kan att överträffa andra smarta människor som är lika försöker skriva saker och visa upp att de kan skriva mer kryptiska saker än du. Så detta är inte ett exempel på en välskriven program från perspektiv av stil, är detta ett exempel på ett program som vinner en tävling, för människor som försöker vara vaga och abstrakta. Så om vi kör den här grejen, låt mig gå in i min terminalfönster, så att säga. Så denna svartvita miljö kallas terminalfönster allmänhet. Låt mig gå vidare och kompilera den. Jag tänker inte använda klang, eftersom detta program är ett lite kryptiskt och det krävs en annan kompilator, en som heter GCC. Men det gör samma sak. Det tar källkoden till objektkod. Och nu om jag kör a.out, det programmet du såg bara gör detta. Så att stipendiaten det året vann den tävlingen. Hur som helst, vi kommer inte åt det hållet, i sig. Så låt oss faktiskt försöka nu retas isär vad vi kan göra med dessa grundläggande byggstenar för att göra mer och mer intressanta program. Så vi har skrivit ett program, har vi kör ett program. Nu kan vi faktiskt förenkla och inte längre behöver skriva Ordet klang vid prompten. Det visar sig som våra program får mer kryptisk, vi kan, eller mer komplex snarare kan vi köra faktiskt detta kommando. Så låt mig gå tillbaka till min hemkatalog, så att säga, låt mig bort - RM är den bort kommandot - Jag ska ta bort filen heter a.out och hej. Och nu märker på en kommandorad miljö, ungefär som i ett GUI får du ombeds göra det. Jag kan inte klicka på en knapp men, jag måste skriva Y för ja, y för ja. Och nu om jag skriver ls igen, märker att de gröna program - a.out och hej - är borta. Akta rm. Det kan göra dåliga saker, precis som du kan genom att dra saker till din papperskorgen. Så låt oss nu gå vidare - och jag kunde göra detta - klang-o hej, hej - Jag är redan uttråkad skriva det kommandot. Även om jag skrev det lite snabbt. Så vi kan istället göra att hej. Så gör inte en kompilator. Det är bara en vänlig program som levereras med Linux, i detta fall - operativsystemet - som automatiserar processen att sammanställa program. Så istället för att komma ihåg klang-o filnamn och då så vidare, särskilt när dessa rader blir längre och längre, kan jag skriva bara göra. Och detta kommer att spotta ut en hel massa saker som Vi kommer så småningom se denna termin. Men märker nu om jag typ LS, hej är tillbaka i min katalog. Och faktiskt jag kan köra den med. / Hej. Så gör bara automatiserar processen med att köra det som var, i detta fall en mycket längre och mer komplexa kommando. Så vi kommer att börja använda märke, bara för att det är mycket mer användarvänlig. Men nu ska vi göra ett mer intressant program än bara säga hej. Så de program vi har skrivit hittills finns Main. Det är bara den förvalda sak som sparkar allting. Men det finns andra funktioner ute också, och stdio.h är det som vi såg på toppen av vår filen innan, är och vad som kallas standard biblioteket. Inuti standardbiblioteket är en massa funktioner att någon annan skrev, och vi kan börja använda dessa funktioner för att skriva mer intressanta program själva. Så låt mig gå tillbaka till apparaten. Jag ska stänga terminalfönstret. Jag ska stänga saker vi skrev tidigare, och bara gå till hej.c, och märker nu kan jag göra följande. Hej världen är inte så intressant, jag skulle vilja anpassa programmet för mig själv. Så istället för att säga värld jag ska gå vidare och säga - Jag kunde skriva David - men detta är verkligen typ av grunden densamma. Men låt oss prova denna platshållare idé. Minns att i C, snarare printf hade vi dessa platshållare, och det finns mer än bara% d. Så% d var snabb sanity check. Okej, decimaltal, det är det. Decimaler, det är allt. Så% c, som vi kommer att möta, kommer att bli ett tecken. Sätt ett tecken här, ett brev A till Z, eller skiljetecken symbol. En enda tecken,% f, någon vet från andra språk? Så ett flyttal värde. Ett reellt tal. Så inte ett decimaltal - detta är faktiskt ett reellt tal med en decimalkomma och ett visst antal siffror till vänster och höger om den. % S, snören. Det vi kommer att se ganska ofta. En sträng, igen, är bara ett ord, en fras, en sekvens av enskilda tecken. Och slutligen, LLD? Så detta är mer av ett hörn fall. Lång, lång decimal. Så om du vill inte bara ett nummer som är det stora, du vill ha en större nummer, du kommer att behöva ange till datorn om att den är av en viss storlek. Så låt oss tweak detta lite. Snarare än att bara hårt kod i David, låt mig något dynamiskt säga% s. Så lägg% s här, som är en platshållare för en sträng. Låt mig göra kommatecken, och sedan "David" här. Nu är inte så intellektuellt intressant, eftersom allt jag har gjort nu är att skapa verkligen mer arbete för datorn. Hellre än att tala om för datorn gör allt detta på en gång, är jag nu säger gör detta och infoga en sträng här så småningom, kommatecken, här är att strängen. Så detta är inte en större förbättring, men det är minst ett steg mot en mer intressant program. För nu, låt mig gå vidare och göra det här fönstret lite större, låt mig gå vidare och kör make hej. Och nu,. / A.out inte fungerar, varför? Okej, nu är det kallas hej. Så återigen göra, och även klang med-o, omdöpt till programmet ska vara något mer intressant. Och voila: nu säger Hej David. Okej, fortfarande en dum program. Så låt oss nu faktiskt gå tillbaka hit och införa begreppet av en variabel. Skulle det inte vara trevligt om jag kunde deklarera en variabel vars typ är sträng? Och variabelns värde kommer faktiskt från användaren sig själv. Så godtyckligt, kommer jag att ringa min variabel s, som är bara en vanlig konvention när du har en variabel som heter strängen. Jag ska göra likhetstecken, och sedan ska jag ringa en funktion kallad GetString. Så GetString är inte något som kommer inbyggd i C. Det är en funktion som CS50 personalen skrev egentligen bara för dessa första veckorna, för att förenkla processen för få indata och få användardata i form av strängar eller tal, och sådant. Så GetString är som printf, men uppenbarligen snarare än skriva ut det kommer att göra vad namnet säger, få en sträng. Men att använda GetString, vi kommer att behöva göra en förändring Här utöver detta. Så intuitivt, det här programmet, förhoppningsvis, kommer att på något sätt få en sträng från användaren, och sedan vad det kommer att göra med den strängen, kallas S? Det kommer bara att skriva ut det, eller hur? Fortfarande inte ett stimulerande program eftersom allt det kommer att göra är att ansluta detta värde i var% s säger att det borde gå. Så låt oss åtminstone se detta i handling. Låt mig spara och zooma ut. Nu i min terminalfönster här nere, den lilla bit av en, Låt mig återigen göra göra hej. Okej, och ah, fan, jag fick en massa fel. Låt mig rulla upp, och vi ser vårt första - så låt oss faktiskt göra detta i ett ännu större fönster så att du kan se hur illa jag skruvas upp - så gör hej. Okej, det är en katastrof, eller hur? Jag har skrivit tre rader kod, och Det har gett mig 12 fel. Så varför är det här? Så lyckligtvis ofta när du ser många, många fel spotta ut på en gång, det är verkligen bara för att du har förvirrad datorn här uppe. Och det är fortfarande förvirrad av den tid det blir här nere. Och så börjar bara snubbla och snubbla och spotta ut mer skrämmande saker än vad som faktiskt gäller. Så i allmänhet, alltid börja med den översta. Så mycket översta instans av rött, felmeddelande är det. Användning av odeklarerat identifieringssträng, jag betyder standard i? Det gjorde jag inte. Jag menade sträng, men det beror på att även ordet strängen att jag håller med verbalt faktiskt finns inte i C heller. Det är något vi kommer att använda bara för den första veckan eller två här, men det finns i en fil som heter cs50.h. Så nu, vet att det är det här andra bibliotek som Personalen skrev, så det skrivits mer nyligen än stdio.h. Men inne i cs50.h är en definition, en synonym för sorterar, skapar detta ord strängen. Så nu låt mig gå tillbaka till min terminalfönster. Jag ska rensa hela den här röran av Ctrl-L. Vi ska bara torka allt rent, och jag kommer att gå vidare och göra Hej igen, Enter. Så vad har hänt nu? Nu alla dessa fel gick bort. Så vad har jag gjort egentligen? Jag har precis lärt datorn som strängen finns, och det är i den fil som heter cs50.h. Så sluta klaga, för nu vet du var du hittar som fungerar förklaring så att säga. Om det existerar i världen. Så nu ska jag gå vidare och köra hej. Jag verkar ha en oändlig slinga, ingenting händer. Så jag måste skriva något här, rätt. Den första raden i koden i mitt program var getString. Så det är bokstavligen väntar på mig att få en sträng. Så i den meningen ja, det är en oändlig loop. Uppenbarligen i GetString är standardbeteende att vi skrev - personalen - som säger bara vänta och vänta och vänta och vänta och vänta, tills användaren ger dig en sträng genom att skriva något i. Så låt mig gå vidare och skriv in D-A-V - i-d, Enter. Och det är det, hej David. Nu verkar det som om det är bara en handling? Låt mig gå vidare och skriva in Tommy. Enter, okej, verkar fungera. Fungerar för Rob, arbetar för Zamyla, arbetar för - okej. Så det kommer att fungera, troligen. Så det borde skriva ut vad vi faktiskt ge det, och vi kan vara lite svårt här. Låt oss se om vi gör något liknande hej. Kan gå hit, låt oss se, kopiera, klistra in. Jag tänker inte kunna klistra så många gånger här. Klistra in, okej, Skift + Ctrl + V. Så vad kan hända att är dåligt här? Okej, så, segfaults. Så några av er med tidigare bakgrund vet att generellt, vilket ger datorer massor av ingångar när de är förmodligen inte tänkt att ta emot långa namn som denna - dåliga saker händer. Faktum i världen av webben, även händer detta ganska lite, där när du designar en webbplats, när du är utforma Facebook, måste du göra godtyckliga beslut upp front, liksom hur länge kommer någons Facebook användarnamn vara? Eller hur länge kommer någon förnamn vara? Hur länge kommer någon telefonnummer vara och liknande. Och om programmerare göra dåliga antaganden, program bryter eftersom du försöker ge dem mer effekt, mer input snarare, än de har minne. Eller RAM avsatts för det, och så om jag nu trycka Enter, programmet faktiskt arbetade, eftersom vi var på biblioteket och vi väntat faktiskt just detta fall. Men utan tvekan den här terminen kommer du skriva minst en program som kommer att säga dessa ord. Kom ihåg detta veckor nu, kanske två dagar nu. Segmenteringsfel är en dålig sak. Det kommer att hänvisa till din göra något som datorn inte förutse. Och i så fall, du, programmerare, inte förutse. Ungefär som vad denna hög med strumpor, det var olika hörn fall vi kunde ha stött på. Likaså i program om du inte räknar inte hur länge är någons namn kommer att bli. Eller vad händer om jag har en illvillig användare, och hans eller hennes namn är faktiskt ganska kort, men de försöker bara att bråka med mig? Vad kommer att bli beteende mitt program? Tja, i så fall kan något krascha faktiskt. Så låt oss göra det här. Under 90 minuter är detta en väldigt lång tid att göra datavetenskap. Varför inte vi för vana att ta en fem minuters bryta här, och när vi kommer tillbaka kommer vi dyka in några mer komplexa och spännande program? Fem minuter. Okej. Så en snabb kommentar. Jag har hört att om detta var på skärmen innan, vad kom ut ur min mun var cs50.net/rsvp. Detta är korrekt. cs50.net/lunch. Så nu kan du prova RSVPing för detta på / lunch. Men låt oss göra det här nu. Så det här har varit supersnabb, super nytt för en massa folk. Gamla hatt för vissa människor. Så låt oss spola tillbaka för bara ett ögonblick, och se hur vi kom till detta hej världsproduktionen nyss. Så först, det finns här CS50 Appliance. Återigen, som mjukvara, problem 1 kommer att berätta hur man ladda ner den, var att ladda ner den, vad att klicka och så vidare. Och sedan när du följer dessa instruktioner, kommer du att kunna att maximera ditt fönster, och din Mac eller PC kommer att se en lite ungefär så här. En svart bakgrund, en hemmapp överst där alla dina filer går, en papperskorg längst upp till vänster, en meny längst ner. Så återigen, ganska lika i anden till Mac OS eller Windows, även om det råkar vara Linux. Så vad gjorde vi göra härnäst? Tja, vi började skriva program. Och minns från förra veckan om att allt som behövs för att skriva en Programmet är en enkel textredigerare, som Anteckningar eller Textredigerare. Ärligt talat, kan du även använda Microsoft Word. Men dåliga saker kommer så småningom att hända, eftersom det är en mycket hårdhänta lösning för att skriva ett program, plus att det kommer spara den i fel filformat. Men det är bara en textredigerare, en ordbehandlare, är allt som behövs för att skriva ett program. Så i CS50 Appliance kan vi göra detta på ett enkelt sätt. Vi kan bara klicka på den här ikonen nere till vänster. Och igen, ställ problem 1 kommer att råda dig om detta, och voila - du får detta svartvita gränssnitt där vi kan börja skriva kod. Så låt oss börja skriva en super enkelt program igen. Jag ska gå upp till File, Save, och jag kommer att ringa detta, låt oss säga, hello2.c. Och jag bara säger det genom att klicka på jharvard, uttryckte det i sin hemkatalog, jag vet inte riktigt bryr där detta går. Och sedan på Spara. Och nu kan jag börja skriva mitt program. Och jag minns från tidigare att jag måste skriva int main (void). Zooma in uppe till vänster. Och då vill jag säga printf, ta två. Och nu en nyrad, nära citat, nära parenteser, semikolon. Och då går jag ner hit till min terminalfönster som är inbäddade i gedit, bara för bekvämlighet. Och jag kommer att gå vidare och skriva gör hej, men inte hej ensam, hello2. Så min fil heter hello2.c. Min fil därför bör kallas hello2, i detta fall. Fan, vad jag gör fel? Okej, så jag utelämnade helt klart en rad, om du minns vad tidigare program ser ut. Men låt oss se om vi inte kan reta detta isär. Tyvärr har de flesta människor som skriver de program som vi skriver program inte förenkla saker så bra. Så vi måste slags skumma över vad som inte riktigt göra känner här och se om vi kan lista ut vad som är fel. Den allra första raden där säger implicit att förklara C biblioteksfunktion printf med typen int. OK, jag förstod en del av det. Men det verkar vara anspelar på det faktum att jag använde printf fel på något sätt. Och vilket sätt är det fel? Jag bara inte lära datorn att det är i en fil kallas stdio.h. Nu har jag bara bara memorera nu printf är i stdio.h, och faktiskt blir det andra tjänster i samma fil som vi kommer vänja sig vid. Så nu låt mig gå vidare och träffa Ctrl-L till bara klart att bort, köra göra hello2, och voila. Och detta kommando igen, mer komplex än vi förklara för dagens ändamål. Men det kördes klang och klang tar källkod och spottar ut 0 och 1. Och de 0 och 1 i detta fall kallas vad? Okej, objektkod. Och filen som de är i kallas, så hello2, i det här fallet. Eftersom min textfil var hello2.c, Enter. Och nu har jag ta två utropstecken, utropstecken punkt, utropstecken. Okej, så vi har nu möjlighet att få strängar, tydligen. Tja, vad mer kan vi få från användarna? Väl i CS50-biblioteket, det finns andra funktioner som kommer att förenkla våra liv i dessa första dagarna. Getchar, GetDouble, getFloat, getInt, GetLongLong, GetString. Nåväl, låt oss plocka bort det enklaste av dessa första. GetString gör bokstavligen det. Det sitter bara där och väntar på att användaren skriver något i, och så snart jag skriver något i och tryck Enter, det gör något med det värdet. Så låt oss gå tillbaka till det exemplet för att se exakt vad GetString gjorde. Låt mig gå vidare och öppna upp i gedit, hej.c, och minns denna rätt före pausen, det är där vi slutade. Så låt oss nu retas detta isär i lite mer detalj. Så på rad 6, det finns två saker händer just nu. Likhetstecknet är att separera första halvan och den andra halvan. Så på vänster sida om likhetstecknet, vi säga strängen s.. Och då, precis lekmannaspråk, vad är sträng s gör, tror du? Det skapar en vad? Så det är att skapa en sträng som kallas s.. Nu vad betyder det egentligen? Tja, det reservera utrymme för en sträng som heter s. Det är inte helt rätt. Vad är detta gör? Tja datorer, som ni vet, har hårddiskar, det är där dina filer lagras. Datorer har RAM-minne, och det är där program laddas medan de kör. Så när du dubbelklickar på en ikon och Microsoft Word öppnar upp, Microsoft Word körs, så att säga, i RAM, vilket är den elektroniska delen av din dator. Inte den fysiska, mekaniska delen som är spinning, där data lagras i allmänhet lång sikt. Så sträng s är ganska mycket säger datorn ger mig tillräckligt med RAM för att passa en sträng. Nu är lite av en grov förenkling, eftersom hur stor är den sträng kommer att? Jo vi vet faktiskt inte ännu, så i de kommande veckorna vi kommer faktiskt dra tillbaka det lager som är sträng och Vi ska berätta vad det egentligen är. String, för nu är bara en trevlig förenkling av vår värld. Men sträng s deklarerar en sträng som heter s, för nu. Deklarerar en sträng. Förbehåller utrymme i RAM för strängen användaren är om att skriva. Låt oss nu titta till höger om likhetstecknet. Så det står GetString (). Och en liten sanity check. Det faktum att det inte finns något inuti parentesen innebär vad om GetString? Det tar inga argument. Det är, kan du inte påverka dess beteende på något sätt. Varje gång du använder det, kommer det att få en sträng och det är det. Däremot printf, förhoppningsvis dess beteende inte ändras varje gång. Annars är det en ganska värdelös utskrift funktion om det gör samma sak. Om det skrivs alltid David eller något godtycklig hela tiden. Så printf är klokt att ha ett argument. GetString egentligen inte behöver ett argument, eftersom jag ville för att få en sträng från användaren och det är användaren som händer att leverera den dynamik genom att skriva i olika bokstäver varje gång på tangentbordet. Så vad getString gör slut? Tänk på det som denna lilla svarta låda. Och denna svarta låda tar ingen ingång, men när du bang på den, spottar ut en sträng som användaren har skrivit in Och det faktum att det finns ett likhetstecken finns medel ta vad spotta ut på höger och förvara den inuti vad som är på vänster sida. Så likhetstecken här, det faktiskt inte betyder jämställdhet, det ganska tekniskt betyder uppdrag. Ta värdet till höger, och placera den i variabel till vänster. Så det är allt som händer där. Nu i linje 7, vi ringer printf. Så printf förhoppningsvis blir lite tråkigt nu. Så ut en formaterad sträng. Vilken sträng? Skriv ut, "H-E-L-L-O,% s ! \ N ". Okej, så vad vill jag plug-in för% s? Bokstavligen är vad som lagras i talet. Så i det här fallet, lite förstånd check, hur många argument inte printf ta? Okej, jag hörde en. Jag hörde en gång. Två, jag hörde två. Och hur tre? Okej, tre? Utmärkt. Tre möjliga svar, är endast en av dem korrekt. Så argument påverkar åter beteendet hos en funktion. Förr i tiden tog printf bara ta ett argument. "Hello World" var ett enda argument. Men nu märker där denna kommatecken. Denna kommatecken ligger utanför citatet / unquote, vilket innebär hej printf, här kommer ett andra argument. Så kommatecken i de flesta programmeringsspråk separata flera argument. Så svaret är här definitivt inte en, eftersom Det är denna kommatecken. Så minimalt är printf tydligen tar två argument den här gången. Men möjligheten för en kuggfråga här är vad om detta kommatecken? Innebär detta att det finns faktiskt tre argument? Detta, detta och detta. Så nej, eftersom det komma är insidan av citat, som betyder att det är egentligen bara en estetisk engelska. Det har ingenting att göra med det antal argument i detta program. Så denna kommatecken ligger utanför de dubbla citattecken. Och sedan tillbaka 0. För nu ska vi bara sorts ta en om tro för idag, och bara vet att när funktionerna görs utför kodrader, bör de återvänder allmänhet något värde. I det här fallet, bara för att stora måste returnera en int, Det är precis som språket C fungerar. Så eftersom ingenting gick fel, känns som det här programmet är bra, jag bara hårt kodad i gengäld 0. Men i kontrast och jag kommer att skriva detta i pseudokod Nu gjorde ungefär som Josef när vi gjorde strumpan exempel förra veckan. Om något gick fel - det är inte faktiska koden - gick fel, sedan tillbaka, låt oss säga, 1. Annars återvänder 0. Så det är där vi är på väg med detta. Detta är inte den faktiska C-kod, bara pseudokod. Men detta är hur du kan återvända olika möjliga värden. Men nu är jag bara att gå vidare och returnera 0. Okej, några frågor hittills på syntax, funktionalitet, eller liknande? Ja, i ryggen. PUBLIK: [OHÖRBAR] DAVID MALAN: Kan du tala lite högre? Varför gjorde 0 programmet tillbaka, och? PUBLIK: [OHÖRBAR] DAVID MALAN: Åh, det är därför jag fick lat, tyvärr. Ingen bra akademisk svar tillbaka 0. Jag kan typ av rädda detta genom att säga tekniskt C, om huvud inte uttryckligen returnera ett värde, kommer 0 returneras automatiskt åt dig. Vilket är sant, jag är inte bara täcker upp. Men jag borde ha gjort det här sättet. Inget intressant takeaway än att andra än mitt misstag. Ja? PUBLIK: Vanligtvis när du skriver in ogiltig, innebär att du inte tillbaka något. DAVID MALAN: Rätt. Om istället anger du före namnet på en funktion för exempel här, tomrum, då funktionen inte tillbaka någonting. Och därför vill jag bara säga, avkastning eller ingenting alls, och det skulle vara konsekvent. Och vi ska komma tillbaka till det. Och bara FYI, en av fångsterna med inlärning programmering i en värld som har hundratals böcker och hundratals webbplatser där ute är du kommer alltid se olika syntax i olika böcker av olika personer. Inser att vi kommer att göra vårt bästa i sektioner och föreläsningar som konsekvent. Men ibland kommer du att se motstridiga syntax. Så när du är osäker, fråga bara. Och i allmänhet, vi tar hand i föreläsningar och sektioner nästan alltid presentera den på rätt sätt. Och jag säger nästan alltid, eftersom typexempel. Övriga frågor? PUBLIK: Har% s existerar utanför apparaten? DAVID MALAN: Har% s existerar utanför apparaten? Ja. Så% s har att göra med C. Det faktum att vi använder det i apparaten har grunden ingenting att göra med funktioner i språket vi använder. Faktum förra veckan när vi använde min Mac, skrev jag C-kod på min Mac. Jag kunde ha använt% s på min Mac, och du kan använda den på Windows-datorn om du installerar en kompilator, som Visual Studio från Microsoft. Så% s. Allt vi gör insidan av fönstret idag måste göra med C. Och grunden ingenting att göra med operativsystemet i fråga. Däremot svartvitt terminalfönster - när Jag skriver saker som ls, och RM, och cd - som har att göra med operativsystemet och navigera runt. Ja. PUBLIK: Jag menade biblioteket, CS50 biblioteket. DAVID MALAN: Okej, så om du menar sökordet strängen att endast finns i CS50 biblioteket, korrekt. Det finns inte i C själv, och faktiskt i ett par veckor kommer vi att kasta bort CS50 biblioteket och börja göra saker från grunden själva, så att säga. Övriga frågor? Ja. PUBLIK: [OHÖRBAR] DAVID MALAN: Bra fråga. Är kommandon skiftlägeskänslig? Och låt mig göra en distinktion här. Så kommandon är i allmänhet de saker vi ska skriva på längst ner i fönstret, i terminalfönstret. Allt upp här skulle vara uttalanden eller C-kod. Men i båda fallen är svaret detsamma, ja. Båda dessa miljöer, C-koden vid toppen och operativsystem kommandoraden på botten, är skiftlägeskänsliga. Så du måste kapitalisera GetString med kapital G, kapital S. Du måste skriva printf i gemener. Du måste skriva ls i gemener. Så i nästan varje situation denna termin, fall kommer i Faktum, materia. Ja. PUBLIK: [OHÖRBAR] DAVID MALAN: Ah, så okej, tänk om vi hade en fil kallas hello.d. Så visar det sig D är ett programmeringsspråk. Och så i vissa fall, kan vi skriva faktiskt ett program i filen och få den sammanställda på det sättet. Vi kan, och faktiskt, korta svaret är, jag vet inte. Så vi kommer att göra detta. Låt mig gå vidare och skapa en ny fil. Och snurra här, ärligt i allmänhet är när någon tvekan den här terminen, och du har din apparat eller dator öppna, gå vidare och prova något. Så jag kommer att spara en fil som heter hello.d. Spara den här. Och jag kommer att köra göra hej Enter. Det tycktes dra slutsatsen att c var mer sannolikt än d, i det här fallet. Övriga frågor. Ja. PUBLIK: [OHÖRBAR] DAVID MALAN: Okej, säga ännu en gång. PUBLIK: [OHÖRBAR] DAVID MALAN: Hur skulle du gå tillväga diagnostisera det eller felsökning det? Så mest troligt, eftersom de är olika språk, mest troligt att du skulle få en helt annat program utmatas. Du skulle få helt olika felmeddelanden. Och även bara när det gäller design, skulle det vara utan tvekan en dålig design beslut som skall skriva två olika språk med nästan identiskt namngivna filer, i exakt samma katalog, med användning av en automatisk verktyg som gör. Så jag kan också trycka tillbaka och säga i 15 år att göra detta, aldrig gjort det misstaget. Kan hända. Men det är bara olika, tror jag, logistiska försvar på plats. Plus felmeddelanden som skulle bli följden, som skulle småningom avslöja vad problemet är. Men en eventuell hörn fall. Okej, så låt oss införa bara ett par andra funktioner här nu, så att vi kan börja bygga upp i mer och mer komplexa program. Så först av allt, matematik. Så matematiska exempel bara typ av lätt i den första veckan. Detta är inte att säga att all programmering handlar om matematik. Visst, att förstå olika funktioner i matematik, algebra är särskilt ganska relevant här. I högre nivå CS klasser, linjär algebra, kalkyl, och liknande. Men inser det mesta av vad vi ska göra den här terminen minskar inte till matematik, och definitivt inte till aritmetik, per se, men egentligen bara logik och noggrann tänkande. Och så denna koppling att datavetenskap har länge haft, särskilt på gymnasiet, med matematik, är en lite missvisande. Eftersom de flesta av de program som vi ska skriva, egentligen, är slags högre nivå och fokusera på att lösa problem som, Visst kan använda vissa addition, subtraktion, och olika matematiska formler eller liknande, men i slutet av dagen handlar det om att tänka och inte bara genomföra vad man kunde ha gjort på som en TI kalkylator på gymnasiet. Så med det sagt, låt oss nu göra något med dessa matematiska operatorer som förekommer så att vi kan resa över några av de underliggande aspekterna av programmering, eller detta fall C. Så det finns, som CS50 biblioteket föreslog, och idag har vi bara använder GetString - och i ett ögonblick kanske en annan funktion - men det finns olika datatyper i en dator. I slutet av dagen, datorer vet bara 0 och 1. Men minns att förra veckan talade vi om det binära systemet att företräda antal, som antalet 0 och 1 och 2, hela vägen på upp till 8, som i Nates video. Och då kan vi räkna mycket högre som vi gjorde på scenen här. Men om du vill representera inte bara siffror utan bokstäver, vi, människor, ska komma med någon godtycklig konventioner, varvid om i slutet av dagen alla min dator har är förmågan att uttrycka 0 och 1, och vi hade bättre börja standardisera mönster av 0 och 1 som representerar olika saker. Ett mönster av 0 och 1 som representerar bokstaven a. Mönster för 0 och 1 som representerar bokstaven Z. Mönster för 0 och 1 som representerar färgen blå, eller röd, eller liknande. Vi måste använda alla dessa 0 och 1 för att uttrycka oss i olika sammanhang, på olika sätt som inte är nödvändigtvis numeriskt. Så när det gäller representation har C olika datatyper, och vi har sett en av dem hittills. Vi såg int och varsel vad som inte på skärmen just nu är sträng. Strängen inte i själva verket finns i C. Återigen, det är en förenkling vi presenterar för första par veckor. En röding är en särprägel. En flottör är ett reellt tal, med en decimalpunkt och nummer till vänster och höger om den. En dubbel är vad, för dem med ryggen före bakgrund? Så en dubbel är dubbelt någonting. Lägger dubbelt så mycket precision. Så vad betyder det? Så i alla dessa fall har världen sorts standardiserad hur många bitar används för att representera alla dessa saker. Så om du har sett Nates ASCII video redan för en del från pset 0 eller senare i veckan kommer du, vet du säkert att ASCII - tecken representationer - Använd hur många bitar? Och du kan även ihåg från vår demo förra veckan om hur många människor var på scenen. Så 7 eller 8, typiskt. Så generellt 8, och det finns något som kallas förlängda ASCII som använder alla 8 bitar i stället för 7. Men i allmänhet, talar vi i befogenheter 2, så i detta fall, 8. Så en röding på ett programmeringsspråk är vanligtvis 8 bitar. Så en int är i allmänhet 32 ​​bitar. En flottör är i allmänhet 32 ​​bitar. En dubbel är i allmänhet 64 bitar. Och vad betyder det? Det innebär att du kan representera större tal, eller i fallet av reella tal, kan du ha en mycket mer siffror efter decimal. Mycket mer precision, i så fall. Nu en lång lång är tyvärr heter. Så det finns en int som är 32 bitar. Det finns en lång som är, nix, 32 bitar. Och en lång lång som är 64 bitar. Men några av dem är sammanhangsberoende, det beror vilken typ av dator du har. Så i allmänhet, vi anger i ett läxor eller i en frågesport om det betyder faktiskt. Men poängen är att det finns alla dessa olika representationer här. Så låt oss faktiskt dyka in ett program. Hellre än att skriva här från början, låt mig gå vidare och öppna upp från dagens källkod - som alla är online - om du vill mixtra runt på nätet, eller avkastning på Onsdag med apparaten på datorn, instruktioner som kommer att länka på kursens hemsida. Här är en super enkelt program. Men det har fått en liten något nytt i toppen som Vi hade inte tidigare. En massa blå textrader. Så dessa blå linjerna representerar kommentarer. Så det är ganska användbart i ett program för att kunna skriva några kommentarer till dig själv, eller till kollegor eller vänner, eller undervisning medmänniskor, den sortens beskriva vad som händer i den här filen, men har ingenting att göra med C-kod själv. Ingenting att göra med programmet funktionellt, det är bara estetik. Så hur du gör detta i C är du vanligtvis startar din kommentarer med / * och du avslutar dina kommentarer med * /. Och om du är riktigt anal och gillar att rita sorts bilder, då du skulle sätta en hel del stjärnor, skulle du göra en liten låda som denna. Men ingen av som räknas. Det enda som betyder något är den allra första och det sista. Detta är vad som kallas en multi-line kommentar. Och det är bara mänskligt konvention för ofta gör stjärnorna och box saker i så här om du har en hel del ledig tid. Så efter att du har skrivit i några kommentarer, i allmänhet, kommer de faktiska tarmar av programmet. Här är vår välbekanta # include . Och bara snabbt är detta nödvändigt eller inte nödvändigt? Publiken: Nödvändigt. DAVID MALAN: Så det är faktiskt inte nödvändigt. Så varför, är det dock inte nödvändigt? Så det finns ingen printf. Verkligen. Allt vi gör i detta program är matematik. Så jag kan faktiskt ta bort det. Så du behöver inte alltid måste omfatta något på toppen av ett program. Så låt oss förenkla det lite. Och nu märker vad detta program gör. Inte mycket av intresse. int x = 1. Nå, vad är detta gör? Jo, tänker tillbaka på den mentala modell från förr. Den vänstra sidan av detta uttryck gör vad? Skapa utrymme för ett heltal. Så hur mycket utrymme? Tja, råkar vi veta nu att det är 32 bitar. Tidigare var en sträng tekniskt 32 bitar, men mer på det i framtiden. Men en int är 32 bitar. Så detta uttryck till vänster här, int x bara säger hej operativsystem, ge mig 32 bitar RAM - annars känd som 4 bytes RAM - så att jag kan sätta ett heltal i det utrymmet. Vad heltal ville du sätta? Tja, bara nummer 1. int y får 2, gör exakt samma sak även om nummer är större, i termer av dess omfattning. Antalet i sig är fortfarande bara 32 bitar. Det är bara mönstret av bitar skiljer sig representerar 1 mot 2. int z säger nu ge mig en annan 32 bitar, kalla det z och sätta summering av 1 och 2 där. Så att nu z förmodligen lagra värdet 3, och sedan tillbaka 0. Nu här programmet, det gör något av intresse? Så det faktiskt inte gör något intressant, något mening, eftersom varför? Det gör lite matte. Men det är inte återvänder svaret rätt. Det återvänder 0. Det är inte ut svaret. Så detta program är i grunden värdelöst, eftersom det står nu. Det gör en del arbete. Det kommer att ta ett visst antal sekunder, eller mikrosekunder, till kör, men det är faktiskt inte göra något användbara för människa. Så låt oss faktiskt nu öppna math2 där nu är jag faktiskt skriva ut resultatet. Så detta kan också härledas från våra tidigare exempel. Om jag vill göra några enkla matematik, int x = 1, y = 2. z är 1 plus 2 nu. Vad kommer detta att skriva ut tydligen? Bara 3. Så snabbt förstånd kontrollera. Låt mig gå in i denna katalog. Så CD source1m. Låt mig gå vidare och skriva gör math2. Inga felmeddelanden kom ut, så låt mig köra - inte a.out--Låt mig köra math2. Enter. Och mycket riktigt, tryckt ut 3. Nåväl låt oss ta en titt på en variant av denna. I math3.c har vi nu det här exemplet här. Så här är ganska intressant. Så i den här här, svara kommer att få 1 dividerat med 10, och märker har jag förklarat det som ett flöte. Varför vill jag att det ska vara en flottör? Tja, det är en bråkdel. Det kommer att vara ett reellt tal. Så det kommer att bli 0,1, förhoppningsvis - 10%, i det här fallet. Och vad vill jag då skriva ut? Nåväl, detta svar. Nåväl, låt oss retas dessa isär först. Så på den vänstra sidan, förklara en flyta, kalla det svara. På höger sida, gör 1 dividerat med 10 och sätta det svara insidan av variabeln. Nu ser denna linje lite mer kryptisk. Men märker några bekanta funktioner. % Betyder här kommer en platshållare. f betyder här är ett flyttal värde, bara en verklig nummer, något med en decimal. 0,2 betyder vad? Någon som vet av tidigare erfarenhet? Två decimaler. Så vi har sett det här förut, men det är bara ett sätt att utövar lite mer kontroll över printf och talesättet inte ger mig 30 poäng efter decimalkommat, istället ge mig bara 2. Och låt oss gå vidare och köra. Så gör matte 3, och nu vill jag köra matematik 3, Enter. Och det är inte rätt. Vi tycks ha stött vår första äkta bugg. Tja, kanske jag bara inte ser tillräckligt nära. Så låt mig gå upp här, och låt mig säga 20 decimal punkt platser där. Och låt mig sammanställa denna, gör math3, springa. Ganska säker 1 delat med 10 är inte 0. Så vad händer? Jo okej, så egentligen är det inte har att göra med det här. Det är en bra tanke. Detta är egentligen bara en tillfällighet att vi gör det här. Men bara för att bevisa att det inte är det, jag tillbaka något slumpmässigt. Gör inte detta hemma, eftersom det är bara fel. Men gör math3, låt mig köra den. Så har ingenting att göra med vad jag tillbaka, bara för att göra med vad jag skriver. Men jag hörde det här nere. Vad? PUBLIK: Så vi måste skriva siffrorna i divisionen som - DAVID MALAN: Okej bra. Så vi måste skriva siffrorna som deltar i division här som flyttal själva. Så problemet är här som tidigare: C, som med en mycket språk, har olika datatyper. Och de datatyper, till exempel, är dessa här. Och datatyper i fråga här, när jag skriver 1 och sedan jag typ 10, är ​​förmodligen vad datatyper? Så det är förmodligen en int, eller hur? Det är definitivt inte en flottör eftersom det inte finns någon decimal punkt eller något liknande. Så egentligen har jag en int dividerat med en int. Så intressant sak om matematik och en dator är att om du gör division med heltal - 1 dividerat med 10, ja är 0,1. Men när du dela ett heltal med ett heltal, det Svaret måste också vara ett heltal bara för att, för nu. Och vad är innebörden då? Tja, är lika om svaret är 1 dividerat med 10 0,1, vad datorn ska göra är att jag har ingen aning om hur man representerar 0,1, eftersom det är ett flyttal värde, inte en heltal, det kommer att hugga av allt efter decimalkomma och bara visa dig 0 i början. Och det faktum att det är ut som ett flyttal värde, det är bara en estetisk sak. Det beror på att jag är att datorn för att skriva ut detta som en flyttal. Och faktiskt har jag förklarat det som en flottör, men matte är händer här borta. Så låt mig faktiskt fixa detta i en ganska enkelt sätt. Varför inte jag bara 10,0 och 1,0, men tekniskt jag kunde komma undan med att bara göra en av dem. Låt mig gå vidare och göra math3. Låt mig gå vidare och nu kör math3, Enter. Och nu, oh boy. Nu har vi ett nytt problem helt och hållet. Så bättre, höger, vi är närmare 0,1, men vad klart är fel här? Om vi ​​inte har ljugit för dig i år, eller hur? 1 delat med 10 är faktiskt inte riktigt 0,1, så vad är verkligen händer här? Tja du kan typ av orsak till detta logiskt. Om en dator har endast en begränsad mängd av RAM för att börja med, och faktiskt en dator bara använder 32 bitar för en flyttal, är det förståeligt att med en ändligt antal bitar, 32 i detta fall, ja, kan du representerar en massa saker. Det är faktiskt 4 miljarder olika värden kan vara representerade med 32 bitar, 2 till 32, men det är fortfarande begränsad. Så problemet är att det finns ett oändligt antal verkliga nummer, till höger. Om du ger mig ett reellt tal, kan jag alltid hitta dig en något större, något mindre, med bara tweaking siffror som är efter decimalkommat. Så om du inte har ett oändligt antal bitar, du kan omöjligen utgöra en oändlig antal av reella tal. Så det finns denna inneboende vaghet i datorer och Detta blir trippade över hela tiden även i de enklaste av program som detta. Men även i vissa mycket verkliga problem också. I själva verket, låt oss ta en stund att bara ta en titt på något som faktiskt hände i verkligheten. Vi ska titta bara den första par minuter, och sedan Vi kommer lägga länken nätet. Men detta är ett bevis på precis vad som kan gå fel, helt ärligt talat, på ett mycket tragiskt sätt när dessa saker är inte uppskattat eller bara vi människor gör misstag när det gäller dessa typer av genomförandet uppgifter om moderna datorer. [Video spelas] -Vi återvänder nu till tekniska katastrofer Modern Marvels. Datorer. Vi har kommit alla att acceptera de ofta frustrerande problem som går med dem. Buggar, virus och buggar programvara är små priser till betala för bekvämlighet. Men i högteknologiska och hög hastighet militära och rymden programmet applikationer kan minsta problemet vara förstoras i katastrof. Den 4 juni 1996, beredd forskarna att lansera en obemannad Ariane 5 raketen. Det bar vetenskapliga satelliter för att fastställa exakt hur jordens magnetfält interagerar med solvinden. Raketen byggdes för Europeiska rymdorganisationen och lyfte från sin anläggning på kusten av Franska Guyana. -Vid ungefär cirka 37 sekunder in i flygningen, först de märkt något gick fel, att munstyckena var svängbar på ett sätt de verkligen inte borde. Omkring 40 sekunder in i flygningen, klart fordonet var i trubbel, och det är när de tog beslutet att förstöra den. En serie skyddsombud med enorma tarmar tryckte på knappen, sprängde raketen innan det kan bli en fara för den allmänna säkerheten. -Det här var den jungfruresa i Ariane 5, och förstörelsen ägde rum på grund av ett fel inbäddad i raket programvara. -Problemet med Ariane var att det fanns ett antal som kräver 64 bitar för att uttrycka och de ville omvandla det till ett 16-bitars tal. De antog att antalet var aldrig kommer att bli mycket stor, att de flesta av dessa siffror i 64 bitars tal var 0s. De hade fel. -Oförmåga ett program för att acceptera typ av nummer genereras av en annan var roten till felet. Mjukvaruutveckling hade blivit en mycket kostsam del av ny teknik. Ariane 4 raket hade varit mycket framgångsrikt. Så mycket av den programvara som skapats för den användes också i Ariane 5. -Det grundläggande problemet var att Ariane 5 var snabbare, accelereras snabbare. Och mjukvaran inte hade redovisats för det. -Förstörelsen av raketen var en mycket stor ekonomisk katastrof, allt på grund av en minut programvarufel. Men detta var inte första gången data konvertering problem hade plågat modern raketteknologi. DAVID MALAN: Vi lämnar vid detta. Men detta är ett bevis på hur tillämpliga även några av Dessa lägsta nivån detaljer som vi har börjat utforska idag är. Så även när du blir lite distraherad kanske av några av syntaxen och arcaneness här inse att under term vi kommer att fokuseras bara på hur tillämplig är att världar långt bortom CS. Vi kommer att se dig på onsdag.