>> [Musikk spilles]
>> DAVID MALAN: All right.
Velkommen tilbake.
Dette er CS50, og dette er Uke One, Fortsatte.
Så en av grunnene til at vi har bestått rundt teknologier som
Google Glass er at de kommer med noe som kalles en API, et
Application Programming Interface.
Og hva dette betyr er at med riktige filer og med den rette
dokumentasjon, kan du faktisk skrive programvare for selv enheter som dette.
>> Og så hva vi har i tankene mot semestre slutten er, hvis et prosjekt
involverer, sier Google Glass kan appell, vil vi se hva vi kan gjøre i
når det gjelder å hekte deg opp med noen låne maskinvare samt
offentlig tilgjengelig API, slik at du kan faktisk begynne å lage programvare
som kjører på den samme Google Glass.
>> En annen enhet som vi har spilt med i det siste at vi trodde kunne være
moro på semesterets slutt er denne lille tingen her.
Det kalles Leap Motion, og hva du er å se er teknisk sett en
reklame for enheten, men det snakker til hva dette
Enheten er i stand til.
Og det, også, kommer med en API via som du kan skrive programvare for å
styre din egen datamaskin på en måte ganske like denne minutters film her.
>> [VIDEOAVSPILLING]
>> [END VIDEOAVSPILLING]
>> Så akkurat nå, skjer denne enheten til implementeres som en liten USB
kontakt som du kan plugge inn datamaskin, men jeg ville ikke bli overrasket
hvis ikke lang tid før vi har slike teknologier i neste batch av PC
og Mac-maskiner, slik at du kan, faktisk, samhandle med den i
en måte sånn.
Faktisk, det jeg tenkte jeg skulle gjøre, også er Jeg trakk opp en liten demonstrasjon
programmet som følger med denne programvaren.
Så jeg har satt den lille sensoren foran min laptop.
>> Og som du kan se, innser det allerede at min hånd er det
kontrollere den.
Og alt dette programmet gjør er swimmingly små ting som dette.
Men du kan se at, ja, Jeg har fem fingre der.
Hvis vi kan få den til å gjøre alt 10, du kan forestille deg en pen piano
anvendelse eller lignende.
Så hvis du ønsker å komme opp etter klasse dag og lek med det som
vel, er du velkommen til.
Så mer om det mot semesterets slutt.
>> Så et par av administrative kunngjøringer.
En, gjør delen av denne fredag midt på dagen på cs60.net/section.
At nettadressen er på kursets hjemmeside også.
I mellomtiden, skjønt, supersections vil debut denne søndagen.
Supersections er en engangs ting, fordi det tar oss litt tid til å jobbe
ut hvem som er i hvilken seksjon og hvor.
>> Så førstkommende søndag, vil det være en seksjon for de mindre komfortable,
en seksjon for de mer behagelig.
Og de av dere et sted i mellom er velkommen til å gå til
én av eller begge eller ingen av delene.
Begge disse vil bli filmet.
De vil være i et større auditorium enn en seksjon normalt ville være i.
Men målet her er å utstyre deg med noen trøst med problemet satt en,
med C, med CS50 apparatet, dette helg, selv før du finner ut din
formelle delen oppdrag.
Så du møter din TF og mindre gruppe sectionmates i om
en ukes tid.
>> Kontortid, i mellomtiden, har pågått.
Må ta nytte av dem i kveld eller i morgen kveld hvis du ønsker.
Oppgavesettet 0 skyldes på fredag.
Dette er en dag senere enn jevnlig planlagt torsdag.
Men med problem sett en, vil du se at det inneholder noen warm-up
øvelser som du selv kan utvide
Torsdag frist til fredag.
Oppgavesettet 1, i mellomtiden, vil debut på kurset hjemmeside førstkommende
Fredag, hvis du ønsker å krølle opp med det som jeg gjorde en gang sent
Fredag ​​kveld på rommet ditt.
>> Så cs50.net/appliance er stedet hvor du kan få CS50 apparatet
at vi begynte å bruke på mandag.
Vi vil bruke det litt mer i dag.
Men trygg på at problemet satt en spesifikasjonen vil lede deg gjennom
nettopp trinnene du må å få den opp og kjører.
Så ikke bekymre deg om du gjør det før PSett 1 hvis du vil helst ikke.
>> OK.
Så vi så på mandag kl kildekode, men i sammenheng med en ny
programmeringsspråk, nemlig C. Og C, i motsetning til Scratch, er ikke grafisk.
Det forundrer ikke biter.
Det er mer engelsk-lignende syntaks.
Og det er et par skritt involvert i faktisk skrive og kjøre en
program i C, fordi foruten kilde kode som dette, trenger du noe
kalt en kompilator.
Og i lekmann vilkår, hva gjør en kompilator for oss?
Yeah.
>> STUDENT: Den konverterer koden at du skriver til 0'er og 1'ere.
>> DAVID MALAN: Good.
Så det konverterer koden som vi skrive til 0'er og 1'ere.
Den konverterer såkalte kildekoden til objektkode, sistnevnte som ser
litt noe sånt som dette.
Og det er din CPU, hjernen innsiden av datamaskinen, som på grunn av
menneskene som skapte disse datamaskinene, vite hva disse sekvensene
av 0'er og 1'ere gjennomsnittet.
>> Kanskje det betyr print.
Kanskje det betyr tillegg.
Kanskje det betyr subtraksjon.
Kanskje det betyr vise grafikk.
Det er forhåndsdefinerte punktmønstre at verden har besluttet mener
visse ting.
Men for det meste i dette kurset, vi skal jobbe på et høyere nivå, og
Vi tar for gitt at det finnes ting som kompilatorer som kan
gjøre våre kildekoden funksjon i måten vi har tenkt.
>> Så programmet skrev vi først sist uke og deretter begynte å port, så å
snakke, til C denne fortid Mandag, var dette.
Når grønne flagget klikket, si hei.
Dette var selvfølgelig skrevet i spillene.
Og jeg hevdet at tilsvarende program i C så litt
noe sånt som dette.
>> Så det jeg tenkte vi skulle gjøre først er, la oss erte hverandre hva som ser, først
blikk, riktignok, som ganske uforståelige syntaks, men du vil begynne å merke
mønstre ganske raskt.
Hva vil vi også gjøre i dag er å gi du med en mental modell for noen
kanonisk, noen standard konstruerer i programmering.
Og så får vi faktisk få våre hender skitne med noen eksempler, så vel.
>> Så for de av dere mer komfortabel, innser at denne uken og deretter neste
uke kan meget vel være litt for anmeldelse.
Men spesielt når hacker utgave av oppgavesettet en går ut på
Kursets hjemmeside på fredag, tror jeg du vil finne at selv som du fyller inn
noen blanks i løpet av neste uke eller to, vil du begynne å bli stadig mer
utfordret og møter nye og nyere ting.
>> Så la oss erte dette programmet fra hverandre noen få linjer samtidig.
På toppen har vi det er teknisk kalles en
preprocessor direktiv.
Dette er bare en linje med kode som sier med innholdet av en fil,
kalles standard I / N, standard inngang - eller, sorry, standard I / O, standard
input / output,. t, inne av mitt eget program.
>> Så med andre ord, hvis jeg skrev dette program med en enkel tekst editor som
gedit, jo enklere tilsvarende noe som Microsoft Word, som
instruksjon, # include stdio.h, er bare kommer til å fortelle kompilatoren, ta tak i
Innholdet i den andre filen, stdio.h, og lim dem rett her.
>> Nå, hvorfor jeg bry meg?
Hva var det vi hevder er innsiden av denne filen kalt stdio.h, som er lagret
et sted på harddisken min, eller i dette tilfelle, et sted i CS50 apparatet?
Noen andre satt den der for meg.
Men hva er det?
>> Ja, så det er en erklæring av en funksjon som heter printf.
Så printf minnes den funksjonen som viser ord og tegn og
tall på skjermen ved budgivning min.
Men jeg ville ikke skrive det.
CS50 ikke skrive det.
Noen år siden skrev det, og de hovedsak ga oss oppskriften på det
i en fil kalt stdio.h.
Slik at første linje bare gir meg tilgang til funksjoner som noen andre
skrev år siden, blant som er printf.
>> Nå, neste linje jeg kommer til å vinke min hånd på, i hvert fall til neste uke.
Men for nå, vet at int main (void) er hovedsakelig den samme som denne
gul puslespill brikke når grønt flagg klikket.
Verden, år siden bestemte at hvis du skriver et program i
språk som heter C, begynner du programmet med en linje
som ser slik ut.
I omtrent en ukes tid, vil det gjøre fornemme hva int er, hva tomrommet er.
Men for nå, bare tenk på det som denne gule puslespill brikke.
>> Nå neste, har vi en klammeparentes fulgt av en annen nær klammeparentes,
så å si.
Og vi vil se disse gjennom programmer i C, samt
JavaScript og PHP.
Og disse bare kapsle relaterte linjer med kode.
Den åpne klammeparentes hovedsak sier, her kommer noen kode.
Og den lukkede krøllete spenne, som er vinklet i den andre retning, bare
betyr, det er det for den relevante koden.
>> Så saftig linje i denne første Programmet er det siste, printf,
quote-unquote, hallo verden.
Og jeg ringte ting mellom sitater hva siste gang?
Så det er en streng.
Og en streng er bare teknikken betegnelse for en sekvens av
tegn, et ord, en setning.
Selv en enkelt bokstav kunne være dobbelt sitert.
Men det er en sekvens av null eller flere tegn.
>> Backslash-n, skjønt, ser litt rart.
Men det bare betydde noe enkelt til datamaskinen.
Hva er omvendt skråstrek-n?
Ny linje.
Så det er bare spesiell sekvens av tegn på at verden har bestemt seg
del sette et linjeskift rett der, fordi kompilatoren vil faktisk få
forvirret, som regel, hvis du, veldig forståelig, men på feil måte, bare
begynne å trykke Enter for å sette nye linjer i koden.
Du må være litt mer eksplisitt med backslash-n.
>> Og vi vil se det er noen andre slike mønstre for spesialtegn.
For eksempel, hvis du ønsket la din tankene vandre til et hjørne tilfellet,
anta at jeg ønsket å skrive ut en dobbelt anførselstegn på skjermen for
uansett grunn, ville det synes å være litt problematisk, ikke sant?
Fordi hvis jeg legger en dobbel sitat i midten av "hallo, verden," uansett
grunnen, hvorfor det synes potensielt problematisk?
Det bryter strengen.
>> Kompilatoren er bare et program.
Et program som en kompilator er bare kommer å lese koden din topp til bunn,
venstre mot høyre.
Og hvis ser tre doble anførselstegn i stedet av to, det er ikke til å kjenne
hvis du mener at tingen til venstre bør være streng, eller det å
høyre, eller hele greia.
Det er tvetydig, og så hva en typisk kompilatoren vil gjøre er å frik bare ute,
og gi deg noen feilmelding, og gjør du håndtere problemet.
>> Så gitt at backslash-n betyr en ny linje, hva ville instinktene dine nå
begynne å være hvis du ønsket å inkludere noe unormalt som en dobbel
sitere innsiden av denne ellers siterte streng?
Skråstrek-dobbelt anførselstegn.
Og så får vi se dette slags mønster også.
>> Hvis du ønsker å gjøre noe litt merkelig, vil du finne at den
løsninger ofte følger et mønster, og backslash
betegner en escape-sekvens.
Og det betyr bare noe spesielt at vi trenger å representere en
annen måte.
Som for hvordan du representerer en skråstrek, vel, vil vi
komme tilbake til det.
Men svaret, også, faktisk litt opplagt.
>> Så la oss nå introdusere noen andre programmering konstruerer
som du så i spillene.
Du har sikkert tatt for gitt allerede hvis du allerede har prøvd seg på
Problemet satt 0.
Men la oss nå introdusere syntaksen i C for disse ellers ganske intuitivt
ideer, i det minste noen av dem.
>> Så denne oppfatningen av en tilstand eller en gren, mens vi tidligere
representerte det med kode som så som dette på venstre side i Scratch -
hvis x er mindre enn y, så si det -
i stedet nå i C - la meg finpusse inn på den enkleste sak -
vi bare kommer til å si, hvis, åpner parentes, er noe sant - en
Boolske uttrykket kommer til å gå hvor jeg har sagt tilstand -
sluttparentes, så hva som er innsiden av de klammeparentes.
>> Så også her de klammeparentes er typen som Scratch er
U-formede biter i et puslespill.
Hva som er inni disse klammeparentes.
I dette tilfellet, slash slash.
Og legg merke til dette er en fremtidsrettet slash, ikke omvendt skråstrek.
Skråstrek, skråstrek, for de som har programmert
før, betyr bare -
det er bare en kommentar.
En kommentar er ikke en linje av koden, per se.
Det er en linje av engelsk som deg, menneske, har skrevet til deg selv
kanskje minne deg på å gjøre noe, for å forklare til deg selv, til å forklare
noen andre, hva koden gjør.
Det er bare en beskrivende kommentar.
>> Nå, selvfølgelig, kan vi ha en toveis gaffel i veien like ved å gjøre dette, en
treveis gaffel i veien ved å gjøre dette, og hvis du fortsetter dette
mønster, kan du ha fire-veis, fem-veis, seks-veis gafler i veien hvis
du trenger for å håndtere, ja, at mange forhold.
Og så merker parallellitet her -
if (betingelse), else if (betingelse), og den eneste som er litt
merkelig er den siste, som er nettopp det annet.
Men igjen, er denne identisk konseptuelt, til hva vi har gjort
dag, selv om det vil syntaksen ta litt å bli vant til.
>> Nå, i dette eksempel, er det annen merkelig syntaks.
Vi ser printf igjen, åpen parentes, og sluttparentes.
Og innsiden av det en sitert streng.
I parentesene, i sammenheng av printf, gå til venstre
og høyre for hva?
Hva beskriver vi at sitert strengen som mer generelt?
>> Så det er et argument.
Hver gang du har en funksjon, som printf, og deretter en åpen paren og en
nær paren og noe på innsiden av det, enten det er en streng, eller en
heltall, eller noe annet, ting i mellom disse parentes kalles
et argument.
>> Og et argument påvirker bare funksjonens oppførsel.
I dette tilfellet er det ganske klart hvordan.
x <y er hva som blir vedtatt i, så å si, som et argument.
Og printf kommer til å skrive ut akkurat det.
Fordi sikkert, personen år siden som iverksettes printf hadde ingen anelse
hva vi menneskelige etterfølgere var kommer til å bruke printf for.
Så det er derfor argumenter eksisterer, til påvirke atferd etter en funksjons
blitt skrevet.
>> Nå, boolsk uttrykk.
Vi har sett dette før i spillene.
Det viser seg i C kan du også "eller" dem sammen, så å si.
To loddrette streker betyr at denne blokken av koden, dette gjør dette, vil
utføre hvis den første betingelsen er sann eller den andre betingelsen er sann.
Og selv om du kanskje ikke har gjort dette i Scratch, kunne du faktisk
gjøre dette i Scratch, og du kan også uttrykke deg annerledes -
hvis den første tilstand og den andre tilstanden er sant, så hva er
innsiden av klammeparentes.
>> Og akkurat som en side, grunnen til det er en dobbel-tegn og en dobbel
vertikale linjen, vil vi se til slutt at en enkelt vertikal stang og en
enkelt ampersand faktisk har forskjellig mening i C. Så for nå,
at duplisering av symboler er tilsiktet.
>> Så la oss innføre, kort, denne annen bit av syntaks.
Denne ikke helt bære over til Scratch, men jeg påstår at jeg kan
gjennomføre forestillingen om en if else, hvis annet, hvis annet, hvis annet utsagn ved hjelp av
noe som kalles en bryter uttalelse.
Og den eneste grunnen til at dette virkelig eksisterer er å bare gi deg, programmerer,
litt annen måte å løse noen problem, selv om det logisk
ikke gi deg noen nye evner.
>> Med det mener jeg dette.
Når du sier bryteren, og deretter et mellomrom, og deretter i parenteser, inne
som går et uttrykk -
og dette kan være en liten ikke-innlysende i begynnelsen, men dette er ikke et argument,
teknisk, fordi switch er ikke en funksjon.
Så for nå, bare anta at vi bruker parentes på forskjellige steder
for forskjellige grunner.
>> Så bryter på uttrykket betyr at jeg kan sette en variabel innsiden av de
parenteser der det står uttrykk.
Og så hvis det variable -
anta det heter x, og det er bare et heltall -
Da kan jeg oppsummere i lysbilde min her er noe som dette.
Hvis x er min variabel, og jeg ønsker å gjøre noe hvis x
lik 1, kan jeg gjøre det.
>> Hvis jeg i stedet ønsker å gjøre noe hvis x er to, kan jeg gjøre det.
Annet, hvis jeg ønsker å gjøre noe annet helt, kan jeg ha en standard sak
og da jeg gjør dette andre ting.
Så på den måten, er det tilsvarende en hvis x er lik lik 1, annet hvis annet,
men jeg nevner dette nå bare fordi vi vil se det igjen.
Men for nå, bare vet at den finnes.
>> OK.
Så disse siste par er litt mer komplisert ved første øyekast, men de gjør
noe ganske grei.
En for loop i C er en del av koden som bare gjør noe nytt og
igjen og igjen.
Og den eneste irriterende ting om det er det er at det er litt kryptisk
å uttrykke deg i denne sykliske mønster, men verden på standardisert
på følgende måte.
>> Når du bruker en for loop, har du fått i parenteser på nytt.
Og legg merke til de to semikolon der inne.
De to semikolon separate tre forskjellige uttrykk innsiden av
parentes.
Den ene er de såkalte initializations.
Den ene er den såkalte stand.
Og en er de såkalte oppdateringer.
>> Sett på i det abstrakte, er dette fullstendig ikke-åpenbare, så la oss se
på et konkret eksempel.
I Scratch hadde vi en gjentakelse blokk.
Og denne blokken sa gjenta 10 ganger, sier "Hei, verden». La meg hevder for
nå, og vi vil komme tilbake til dette, og Dette vil også få mer kjent for
du før lang, tilsvarende C Koden kan sies å være dette -
en for setning og et mellomrom, et par parentes, legger merke til semikolon i
der, som skiller tre distinkte ting, initialiseringen,
tilstand, og oppdateringen.
>> Og ta en gjetning hva det første gjør.
Int i = 0.
I grove lekmann vilkår, hva er som gjør for oss, sannsynligvis?
Så ja.
Det å erklære en variabel kalt i, og det er å gi det hva verdien?
0.
Så det å lage en variabel kalt Jeg, lagring verdien 0 i det.
Det er den såkalte initialisering.
>> Ok, nå har jeg hevdet før at den midtre tingen, I
<10, er tilstanden.
Så hva gjør?
Vel, hva for loop gjør når en med et program for løkke blir kjørt, er
hver gang maskinen løper igjennom denne sløyfen, fra topp til bunn, topp til
bunnen, akkurat som dere gjorde da telle dere og sitte ned,
igjen og igjen og igjen, maskinen går
å sjekke at tilstanden.
Og hvis jeg er mindre enn 10, det vil gjøre det igjen.
Dersom i er mindre enn 10, det vil gjøre det igjen.
Dersom i er mindre enn ti, det vil gjøre det igjen.
Så det synes å antyde at forhåpentligvis jeg er i endring.
Ellers ville vi ha en uendelig loop.
Og ja, er jeg i endring, fordi siste ting etter semikolon der
er den noe kryptiske syntaksen i + +.
Men de av dere som har gjort dette før, betyr at bare
ganske enkelt hva?
>> STUDENTER: [interposing VOICES].
>> DAVID MALAN: Legg en til jeg.
Økning i.
Så vi så en Scratch puslespill stykke for det, faktisk.
Det så ikke ut som i + +, men som bare betyr ganske enkelt, øke den
verdsetter jeg etter en hver gang du gjør dette.
Så bokstavelig, starter du med initialisering jeg til 0.
Du kan deretter sjekke tilstanden.
Er 0 mindre enn 10?
Ja.
Vi går gjennom løkken.
>> Det neste jeg hevder datamaskinens kommer til å gjøre er det som skjer
å øke i.
Så jeg er nå en.
Den kontrollerer tilstanden.
Er en mindre enn 10?
Selvfølgelig.
Så gjør det igjen.
Da er det trinn i + + til to.
Er to mindre enn 10?
Ja.
Og igjen og igjen og igjen.
Og til slutt, på grunn av pluss-plussing, får vi i tilsvarer 10.
Er 10 mindre enn 10?
Vel, tydeligvis ikke.
Og det er det punktet hvor for loop stopper like.
Og hvis du har mer kode på skjerm ned nedenfor, datamaskinen
fortsetter å kjøre den koden i stedet.
>> Så igjen, selv om dette skal ser og føles litt rart på
først, i hvert fall for de av dere som har aldri programmert før, det
bokstavelig reduserer konseptuelt til hva som er ellers en veldig
grei puslespill brikke i Scratch.
>> All right, jeg lovet at det ville være andre analoger i Scratch.
Det er denne også.
Og vi så dette kort sist.
Men husk alltid blokkere i bunnen av?
Det gjør bare noe for alltid?
Jeg hevdet at du kan implementere Dette på denne måten.
Og du kan faktisk gjennomføre dette i en haug med forskjellige måter.
>> Men mens loop er bare en annen måte i C for å uttrykke deg selv.
På slutten av dagen, kan du ikke gjøre noe med en while-loop som du
kan ikke med en for-løkke.
Så de er på slutten av dag funksjonelt sett like.
Men det tillater deg å uttrykke deg litt annerledes i
på følgende måte.
>> Med mens loop, det er hva som er i parenteser som er sjekket igjen og
igjen og igjen.
Og så snart det uttrykket er usant, da løkken stopper utfører,
og datamaskinen fortsetter å kjøre hva andre koden du
har i filen.
>> Men det som er interessant her er at jeg bokstavelig talt skrevet sant.
Og sant er en type boolsk verdi, en sann eller falsk verdi.
Så kunne true noen gang blitt falsk hvis jeg har bokstavelig talt
hardkodet det inn i programmet mitt?
Så no.
Det er litt rart at jeg gjorde dette.
Men sant er sant.
Det er ingen plus-plussing.
Det er ingen bruk av variabler i her.
Så fordi jeg hardkodet mens sant, dette løkke er alltid kommer til å evaluere
igjen og igjen og igjen.
>> Så hvor mange ganger er hello world kommer til å skrive ut på skjermen?
Evig.
Et uendelig antall ganger til batteriet dør eller noen andre eksterne
hendelsen skjer.
Så dette er nok ikke det beste programmet å skrive, fordi hvis brukeren
kan aldri slutte programmet, er det sannsynligvis ikke hva du hadde tenkt.
>> Men noen ganger, programmer bør har en uendelig loop.
For eksempel har hvis datamaskinen en klokke på det, er det sikkert ville være
fint om din klokke det holder å oppdatere seg for alltid, om enn en gang
sekund eller hvert minutt eller noe slikt.
Så selv uendelige løkker har sin plass.
>> OK.
Til slutt, denne.
Og dette er en liten smule annerledes funksjonelt, og vi vil komme tilbake til
dette sannsynligvis i PSett en.
Men det er en annen type løkke kalt en gjøre mens loop.
Og den eneste forskjellen her mellom en gjøre mens loop og, si, en stund loop,
er at tilstanden ikke er avmerket før du kjører koden, men etter
du utføre koden.
Så øverst for den stund loop, mens gjøre mens
sjekker den på bunnen.
>> Og dette betyr bare at mens loop typisk vil utføre flere ganger
eller færre ganger enn en while-loop?
Potensielt flere ganger, fordi en gjøre mens loop er tydelig sier gjør dette,
bare etter som peker du sjekke Hvis tilstanden inne i
parentes er sant.
>> Så får vi se dette igjen sannsynligvis i PSett en.
Hvis du noen gang ønsker å gjøre noe på minst én gang, og deretter kanskje noen mer
ganger, er dette en god konstruere å bruke.
Men en stund loop, derimot, vil sjekke tilstanden først.
Og det er det for løkker i C, gjør mens, samtidig, og for løkker.
Og igjen, kartlegge de ganske pent tilbake i Scratch, bortsett fra denne ene ikke
helt har samme analoge i spillene.
>> Vel, hva med nå, variabler?
Så dette er hvordan jeg erklært en variabel syntaktisk den andre dagen.
Jeg hadde en int, som jeg hevdet er et helt tall.
Jeg hadde da en variabel kalt teller, og deretter et semikolon.
Så hva er denne linjen med kode gjør?
Dette er ganske enkelt, erklærte en variabel -
som er, spør maskinen, gi meg noe minne, gi meg noen biter - i
som jeg kan lagre hva?
En int.
Og semikolon betyr bare slutten av linje med kode.
>> Nå er den andre linjen trolig ganske guessable.
Hva er teller = 0; gjør?
Det tilordne 0 for å motvirke.
Og så dette er det andre ting det er litt irriterende
versus, sier algebra.
Mens det i algebra, betyr likhetstegnet likemenn, her i C, lik
tegnet betyr oppdraget.
Så det betyr sette hva som er på den rette i hva som er til venstre.
Og vi vil se et annet symbol, lik likemenn, når vi ønsker å faktisk teste
for kvalitet, noe plagsomt.
>> Men dette er en lite ineffektive.
Det er litt irriterende at jeg har å erklære en variabel og
deretter gi den en verdi.
Så C faktisk lar oss forenkle dette og bare gjøre alt på en gang.
Du kan deklarere variabelen til venstre.
Du kan fortsatt gjøre oppdrag på rett ved å sette det likhetstegn
midten.
Slik på slutten av dagen, disse to er tilsvarende, men dette, ærlig,
er trolig bedre vane å komme inn bare fordi det er litt mindre
kode, er det litt lettere å lese, og det strammer bare opp
koden, så å si.
>> Eventuelle spørsmål så langt på looper, av variabler, på vilkår, på
Boolske, enten teknisk eller konseptuelt?
OK.
Så nå denne neste man får en litt mer interessant.
Og dette er et eksempel jeg satte opp i fjor tid som bare kartlegger en Scratch eksempel
over til C.
>> Så en funksjon.
I lekmann vilkår, er det en funksjon?
Kom til å være dristigere med svaret ditt.
Hva er en funksjon?
>> STUDENT: Har noe.
>> DAVID MALAN: Hva er det?
>> STUDENT: Har noe.
>> DAVID MALAN: Har noe.
OK.
Vi begynner der.
Så en funksjon gjør noe.
Så det er et stykke kode som er hovedsak implementert andre steder som
faktisk gjør noe.
Nå, hva er interessant om en funksjon er at det kan ta inndata,
og den kan produsere utgang.
Og la oss ta faktisk en titt på denne.
>> Så mannen bak gardin var bevisst et øyeblikk siden.
Her har vi et bord.
Men anta at dette faktisk representerer en stor boks.
Dette er altså en såkalt svart boks.
Og generelt, i design, i datamaskinen vitenskap, svarte bokser bare referere til
biter av funksjonalitet som noen har implementert, og du ikke
nødvendigvis vet eller bryr seg hvordan det er implementert under panseret.
Du bare bryr deg at denne svarte boksen, som vi vil nå begynne å kalle en
funksjon, gjør noe.
>> Så, for eksempel, hvis denne svarte boksen på scenen her representerer printf, en
funksjon, vet jeg fra tidligere eksempler printf som tar ett eller flere
argumenter, og den første av dem argumenter skal være en streng, som
"Hei, verden». Vel, hvis jeg er den personen skriving av program, og jeg vil
å bruke printf, jeg, for eksempel, kan ta et stykke blankt papir her og en
sort tusj og skrive på det -
Jeg stavet "verden" -
H-E-L-L-O.
>> Så jeg skal ta min sort tusj og jeg skal skrive, så stor og leselig som jeg kan på
dette stykke papir, "hallo, verden," Og nå har jeg hevder dette er mitt argument.
Dette er en streng representert med et stykke hvitt papir.
Og mitt innspill nå til funksjonen printf kommer til å være dette.
Så jeg kaller printf, passerer det argumentet som innspill til det.
>> Og nå vet jeg ikke hvordan den personen som skrev printf gjorde det år siden, men
Jeg vet fra sin dokumentasjon som sitt formål i livet er å skrive hva jeg
gi til den som input.
Og så, selv om denne implementeringen er ukjent for meg
under panseret, nå Jeg ser, oh, er det gjort.
Det er skrevet ut noe på skjermen.
Og nå kontroll over programmet, hvis det var flere linjer med kode, ville
har nå returnert til meg.
Og så det faktum at Colton -
velsigne hans hjerte, gjemmer seg her etter et bord foran alle dere -
er bevisst på at jeg ikke vet og jeg bryr meg ikke hvor printf er
implementert.
Jeg bare vet, igjen, fra sin dokumentasjon, hva den gjør og hvordan jeg
er ment å bruke den.
>> Nå husker at printf kunne få litt mer sofistikert.
Igjen, vi bare snakker om tilsvarende Scratch si blokk.
Men jeg gjorde også dette siste gang.
Jeg ønsket å gjøre mitt hallo programmet en litt mer dynamisk og ikke bare vanskelig
kode noe sånt som "verden", og definitivt ikke vanskelig kode noe
vilkårlig som D-A-V-I-D inn i programmet.
Jeg ønsket å spørre brukeren om hans eller hennes navn, og deretter gjøre noe med
strengen som de leverer.
>> Så det er noe litt annerledes her. printf, et øyeblikk siden,
gjorde faktisk gjøre noe, men det returnerte ikke noe for meg.
Høyre?
Colton ikke gi meg noe tilbake, ingen stykke papir.
Det var bare en bivirkning.
Min gir "hallo, verden" som en argumentet til Colton resulterte i
bivirkning av et ord, noen ord, vises på skjermen.
>> getstring, men er litt annerledes. getstring er også en
fungere, men den returnerer noen verdi.
Det betyr ikke bare har en estetisk bivirkning.
Det gir meg faktisk, at personen ringer eller bruker funksjonen,
noe tilbake.
Så i dette tilfellet, er getstring heter med getstring åpen
paren, nær paren.
Har getstring derfor ta noen argumenter eller innspill?
Nei, det virker ikke.
Dens formål i livet er bare for å få en streng.
Den trenger ingen flere detaljer enn det.
Så la meg gå videre og late som, igjen, dette er black box ikke printf,
men getstring, og la meg, personen skriver dette programmet, ringe eller bruke
getstring ved bare å skrive G-E-T-S-T-R-I-N-G, åpner paren, nær
paren, getstring.
>> Nå har jeg ingen anelse om hvordan CS50 ansatte implementert getstring, men jeg vet at
hvis jeg venter lenge nok, vil det gjøre sitt ting under panseret, kanskje ved hjelp
noen variabler, kanskje ved hjelp av noen forhold, kanskje ved hjelp av noen looper,
kanskje bruke enkelte funksjoner, kanskje bruker -
bare prøver å stall - kanskje ved hjelp noen andre programmeringsspråk funksjoner.
Men hvis jeg venter lenge nok - i virkeligheten, i datamaskinen, skjer dette
superrask -
hvis jeg venter lenge nok, denne funksjonen getstring kommer til å få en streng
fra brukeren, som trolig er å skrive det ut på tastaturet sitt, og
så, når du getstring er gjort få disse tegnene fra brukerens
og å lagre dem i en streng, som funksjon, getstring, kommer til å ha
klar for meg noen utgang som jeg er kommer til å hente ved hjelp av
oppdrag operatør.
>> Og hvis jeg går faktisk inn i produksjonen her har Obosi sjenerøst
deltok, uten å vite dette i avansere, ved å skrive sitt navn på dette
variabel, som representerer en streng.
Nå betyr oppdraget operatør, selv selv om dette kan føles litt
overflødige, jeg faktisk trenger å lage min egen kopi av denne.
Fordi på venstre hånd side - whoops! -
merker at jeg egentlig har streng navn på venstre side.
Så jeg også kommer til å gjøre min egen kopi av denne.
Og dette er litt av en hvit løgn, fordi vi vil se i en uke eller to
gang at strenger er faktisk ikke hva de synes å være.
>> Men for nå, her er verdien som returneres.
Her er min egen kopi av det etter med oppdraget operatør.
Og nå, hva jeg ønsker å gjøre nå?
Vi har nå den andre av to linjer med kode.
Så jeg nå ønsker å kalle printf.
La oss late nå at den svarte boksen er tilbake igjen for å være
printf og ikke getstring.
>> Printf denne gangen kommer til å ta hvor mange argumenter?
Så ser, det er som to.
Det er to komma i det, men en av disse komma, er det
innsiden av sitater.
Så det første argumentet er bokstavelig talt kommer til å være dette.
H-E-L-L-O, komma, prosent s, skråstrek-n.
Og nå er jeg gir ikke ett argument, men to argumenter til printf.
>> Og hva som printf skal gjøre med disse to innganger etter at jeg passerer dem i
som argumenter?
Det er ment for å ta den andre av dem, som jeg kalte navn, slik at
andre arket jeg skrev ut et øyeblikk siden kalles navn.
Det kommer til å koble av verdien inne av den variabelen inn i plassholderen,
% S, slik at, igjen, på bare et øyeblikks tid, vil vi se en bivirkning av
etter å ha kalt printf, der vi nå se ikke "hallo, verden," men "hallo,
Obosi. "
>> Så en stor applaus til begge våre frivillige, bare én av dem visste
dette ville skje.
OK.
Så, kanskje, enkelt som det var, sikkert, hvis du allerede er kjent
med en slik, forhåpentligvis vil du aldri glemme at spesielt visuelt av hvordan
funksjonene fungerer.
>> Så det er mer enn bare getstring.
Innsiden av CS50 bibliotek, det er en hel del funksjoner, som alle
balanseføres bare for å gjøre det klart som vi skrev disse funksjonene.
Vanligvis, i C, nesten alle andre funksjon du skal bruke er små bokstaver.
Men vi bevisst bruk blokkbokstaver bare for å gjøre det klart at disse
er trening hjul slags som vi vil bruk for bare noen få uker at
forenkle prosessen med å få input fra brukeren.
>> Det CS50-biblioteket ikke gjør noe at du selv ikke kunne gjøre ved
bare ved hjelp av C-kode fra en oldschool lærebok.
Men igjen, vi bruker dem som trening hjul av sorterer for bare et par
uker, slik at vi kan bli kvitt den kompleksiteten som du vil snart forstå
selv for å gjøre noe som relativt enkelt som å få
input fra en bruker.
>> Så vet at du vil ha tilgang å getchar, GetDouble -
doble.
Omverden - og deretter GetFloat.
Hva er en float?
La oss starte der.
>> STUDENT: [uhørlig].
>> DAVID MALAN: Yeah.
Det er et tall med en desimal.
Så mens en int er et helt tall, noe er bare et tall med 0 til 9,
et antall repetisjoner derav, en float er noe
med en desimal.
Og en dobbel, i mellomtiden, er også en tall med en desimal, men mer
tall etter kommaet punkt, potensielt.
>> Så vi vil komme tilbake til dette før lenge.
Men vanligvis, og hver av disse typer data, hver av disse typer variabler
at et bibliotek som vårt kan gå tilbake til deg, bruker ulike antall bits til
lagre informasjon.
Vanligvis en Char, som bare betyr ett tegn, bruker 8 bits.
Og det er faktisk i tråd med vår byte av frivillige forrige uke som
kom opp og representerte en Ascii tegn om gangen.
Så en Char er 8 bits.
>> En flottør skjer for å være 32 bits, typisk.
Og en dobbel, som du kanskje skjønner, er faktisk 64 bits, som er bare mer,
som betyr at du kan ha større tall eller mer presisjon.
Men igjen, mer om det en annen gang.
GetLongLong, i mellomtiden, men dumt heter, er egentlig bare en
heltall som er dobbelt så stor, dobbelt så lang, potensielt, som en vanlig
heltall, 64 bits i stedet for 32.
Og GetString vi har brukt.
>> Men det viser seg, i CS50 bibliotek, som er implementert, så vi får se, i
form av de to filer, en av hvilke kalles cs50.h, har to andre
datatyper i det.
Boolske ikke finnes i C. Du kan simulere dem ved bare å bruke 0'er og 1'ere
gjennom programmene dine.
Men vi i CS50 bibliotek har opprettet symbolene "true" og "false"
å representere en og 0 slik at du ikke må hardt kode noe
bokstavelig talt som 1 og 0.
Men vi får se dem igjen.
>> String, også, ikke eksisterer.
Og det er derfor jeg nevnte det er litt av en hvit løgn for nå.
Men vi vil skrelle tilbake som lag før lenge.
Men for nå, er en streng en sekvens av tegn.
>> I mellomtiden, i C, ja du har ulike datatyper.
Legg merke til disse er små.
Så funksjonene så deg et øyeblikk siden blir funksjonene skrevet av CS50 at
vil komme tilbake til deg en verdi som faller inn i en av disse klassene.
>> Et par jukse ark bare å plante frøet her. printf ikke bare
ta% s som plassholdere.
Det tar% d for desimal heltall, eller% ville jeg jobbe i tillegg.
% F flyter poengverdi. % C er for en røye, hvis du ønsker å bare plugge en
tegnet inn i en ferdig formatert streng som vi har gjort, kan du bruke% c.
>> Og så, litt irriterende,% lld er for en lang, lang Desimalheltallet,
noe som betyr at bare hvis du trenger en virkelig stort tall, og du bruker noe
kalt en lang lang, som vi vil komme tilbake til i en PSett, kan du bruke% lld til
fortelle printf, plugg i en virkelig stor heltall her på grunnlag av det andre eller
noen andre argument.
>> Og til slutt, lovet jeg at det er noen annen flukt
sekvenser som printf støtter.
Vi har sett backslash-n.
Backslash-r du kan se.
Det er liksom en old-school ting.
Hvis du noen gang brukt en ekte skrivemaskin år siden, og du trakk på kranken
som ikke bare roteres hjulet flytte lineup, den også flyttet
hele greia hele veien tilbake over til venstre, vel, skråstrek-r bare
hovedsak flytter markøren tilbake til begynnelsen av linjen
uten å bevege den ned.
Men igjen, mer om det, kanskje i fremtiden.
>> Skråstrek-sitat, skråstrek-dobbel sitat, backslash-backslash er
løsning på den bitte liten gåte Jeg antydet tidligere.
Og omvendt skråstrek-0 er faktisk ganske interessant.
Men vi vil komme tilbake til som før lenge.
>> Så la meg gå inn i, nå, det CS50 apparatet, og la oss faktisk gjør en
rask varme opp med ett av eksemplene vi allerede, og deretter gå videre til
noe litt mer komplisert.
Så hvis jeg åpner opp mitt program kalt gedit -
dette er min grafisk editor.
Og jeg kan gjøre det -
la meg lukke vinduet der -
ved hjelp av dette ikonet her nede, gedit, i nederste venstre
hjørne ved siden av menyen.
>> Jeg kommer til å gå videre og videre, og lagre dette eksemplet inn i, sier John
Harvards mappe.
John Harvards mappen er bare hans hjem katalogen der alle sine filer leve
som standard.
Og jeg kommer til å lagre dette som en fil som heter hallo-0.c.
Og jeg har valgt dette navnet bare så det på linje med eksempelkode på
kursets hjemmeside og i YouTube-videoer på nettet.
>> Så nå skal jeg begynne å skrive min første programmet.
La meg zoome inn for lesbarhet.
Og jeg kommer til å gå foran og si int viktigste tomrom, som er akkurat sånn
gul puslespill brikke som begynner et program.
Jeg har fått inn i vanen over år med åpningen min krøllete brace, deretter
også lukke den og deretter gå tilbake til hvor jeg ønsker å sette min kode, bare
fordi det hjelper meg å holde alt balansert, særlig ettersom min
Programmet blir lang.
>> Og nå, her kommer jeg til å gå videre og si: printf, sitere unquote,
hello world, skråstrek-n, nær sitat, sluttparentes, semikolon.
Så jeg bare gjenta alt vi har tatt for gitt så langt.
Nå skal jeg å zoome ut.
>> Og dette terminal-vinduet ned her, hva har jeg lov til å gjøre i denne svarte
og hvite vinduet?
Hva kan jeg bruke det til?
Så dette er hvor jeg kjøre kommandoer og hvor jeg kan kompilere ting.
Og jeg kommer til å holde det enkelt.
Jeg kommer til å bruke et program kalt Gjør, som ikke er
teknisk sett en kompilator.
Kompilatoren er kalt Clang, men vi vil komme tilbake til det i et
uke eller to tid.
>> For nå er jeg bare kommer til å skrive gjøre hallo-0, Men de av dere som var
sammenligne i ditt sinn hva jeg nettopp tastet til hva jeg burde ha skrevet kan
vet allerede at jeg gjorde noe galt her.
Nå er det klart noen feil.
Før jeg selv se på hva de er, noe tanker om hva jeg gjorde galt?
>> STUDENTER: [interposing VOICES].
>> DAVID MALAN: Yeah.
Jeg mangler bibliotekets header-fil.
Noen av disse. H filer kalles header filer, og de kollektivt
tilhører tingene heter biblioteker.
Bibliotekene er bare biter av kode at andre skrev.
Så standard [? jeg?] Biblioteket er en samling av filer som inneholder koden
at andre skrev.
>> Så jeg mangler det.
Så hvorfor får jeg en feil?
Vel, la meg bla tilbake i min terminal-vinduet her.
Og dessverre, i C, som i mange programmeringsspråk, spesielt
hvis det er alt nytt for deg, feilen meldinger er presise, men de er også
ganske kryptisk.
Og feilen her, i rødt, er "Implisitt erklære bibliotek funksjon
printf med type ", og da er det ruller til neste linje, "int const char *,
... "Det blir bare virkelig overveldende raskt.
>> Men hva du bør begynne å gjøre, hvis, igjen, ny i alt dette, er bare å
begynne å lete etter søkeord.
Åpenbart kan jeg ikke forstå halvparten av ordene jeg ser ennå.
Du vil, selv om det i en ukes tid.
Men jeg ser printf.
Og det skulle begynne, før lenge, til jogge hukommelsen, all right, printf.
Noe er galt med printf.
Gjorde jeg stave det feil?
Nei, det ser ikke ut som - oh.
Jeg kan ikke bruke den med mindre jeg underviser kompilatoren at den finnes.
Og så, igjen, gå med dine instinkter, selv om du ikke egentlig forstår
selve feilmeldinger.
>> Og ja, er løsningen her å bare omfatte den på toppen av filen
sånn, resaving min fil med Kontroll-S eller Fil-menyen.
Og hvis jeg nå gå tilbake her nede, Jeg kommer til å klare dette.
Kontroll-L er bare en fin måte å tømme skjermen.
Og så skal jeg skrive "make hei 0 "Enter, og nå er jeg fortsatt se en
kryptiske sekvens av symboler, men vi vil komme tilbake til det.
Det er det som gjør gjør for deg.
Det er å automatisere prosessen med å ta en ganske irriterende kommando som involverer
Klang, selve kompilatoren.
Men det faktum at jeg fikk ingen feil betyr at denne tingen skal fungere.
>> Så jeg nå kommer til å gjøre - la meg zoome inn igjen -
./hello-0 Enter, og ja, jeg ser "Hei, verden». Så la oss nå forsterke
dette aldri så litt bare for å replikere trinnene vi ment.
Jeg kommer til å endre navn på dette med Lagre som for å hello1.c.
Og nå skal jeg til å erklære en variabel kalt navn, så string navn,
og jeg kommer til å sette i det Verdien av sitat-unquote
D-A-V-I-D-tett sitat semikolon.
Og nå skal jeg til å erstatte "verden" med hva som plassholder for en streng?
% S.
>> Og nå, hvor mange argumenter bør printf ta denne gangen?
Så to.
Så jeg går utenfor de anførselstegn.
Jeg skriver "navn" etter komma.
Men jeg har gjort noe annet galt denne gangen.
Men la oss anta at jeg ikke skjønner det ennå.
La meg gå opp her.
>> Og legg merke til, også, jeg får litt lei av å skrive "make hallo 0" hele
tid, "make" og alt dette.
Så det viser seg, i Linus kan du ofte trykker pil opp på din
tastaturet, og du kan faktisk bla gjennom alle kommandoene som jeg har
henrettet tidligere å bare nå.
Så hvis jeg gjør det, opp, opp, det er få hallo 0.
Jeg vil ikke ha det.
Jeg vil bare endre det til hallo en denne gangen, Enter.
Til slutt, som vil spare deg litt tid.
>> OK.
Dessverre er det en feil.
Så la meg bla opp.
Dette ser ut som jeg virkelig slaktet dette programmet.
Jeg mener, min Gud, er det to linjer med kode, og sine 10 linjer med feil.
Men se på den øverste først.
Bruk av undeclared identifikator streng.
Sa jeg mener standard jeg n?
Nei jeg gjorde ikke det.
Jeg mente streng.
>> Men hvor er strengvariabelen typen erklærte DD vi si?
Så det er i CS50 biblioteket.
Så det ikke være nok, i disse første par uker, bare for å bruke
hva C gir oss.
Jeg er også kommer til å gå opp her, og jeg kunne sette den over eller under, men jeg skal
bare holde det alfabetisk å holde ting ryddig.
Jeg kommer til å inkludere cs50.h, som er forhåndsinstallert for
du på CS50 apparatet.
Og det er åpen kildekode, slik at selv folk på internett kan bruke det på sin
egne datamaskiner.
Men det kommer med CS50 apparatet.
>> Så nå la meg gå tilbake og rekompilere dette med make hallo en.
Pokker.
Nok en feil.
La meg bla opp til den første, skjønt.
Denne er en litt komplisert.
Multi-tegns tegnkonstant.
Det hjelper ikke meg.
Men legg merke til, er Clang minst litt litt anstendig, der med et lite
grønn caret symbol, er det å si her er der jeg skrudd opp.
Hvorfor er det peker, med det lille grønn pil, til den enkle sitat neste
til mitt navn?
>> Så dette er en av de tingene du bare venne seg til, særlig hvis du har vært
programmering i Python eller JavaScript, eller andre språk der denne detaljen
spiller ingen rolle.
I C, gjør det uansett.
Hvis du er erklære en streng, som er en sekvens med 0 eller flere tegn,
du faktisk må bruke anførselstegn.
Så jeg faktisk trenger å endre dette tilbake å åpne sitat, lukke sitat, med
doble anførselstegn.
Apostrof har sin plass, men bare når du bruker enkelte
tegn, men mer om det en annen gang.
For nå, de doble anførselstegnene er nødvendig.
>> Så nå, la meg gå tilbake til terminalen min vinduet, gjør hallo en.
Og hvem er trygg?
Er dette programmet nå går å kompilere riktig?
OK.
Så tre av oss tror dette.
OK.
Enter.
Og det faktisk gjorde.
Så det er ingen feil denne gangen, selv om dette programmet har fått litt
mer komplekse.
Hvis jeg nå gjøre dot slash hallo 1, Enter, det kommer til å si "hallo, David."
>> Men la oss gjøre den tredje iterasjon av dette, hvor den
Programmet er virkelig dynamisk.
La meg gå videre og endre filen navn, bare for konsistens med
filene du har tilgjengelig til deg etterpå online.
Enter.
Og nå skal jeg gå inn og ikke lagre "David" hard kodet her.
Hva kan jeg gjøre for å veldig enkelt forbedre dette programmet?
>> Jeg kunne ringe getstring.
Det kan være litt ikke-innlysende hva som er ferd med å skje, så jeg kommer
å faktisk legge til en annen linje, printf, og si navn, tykktarm, nær sitat, bare
å gi brukeren en rask på skjermen.
Og nå skal jeg til å gå her, og jeg er kommer til å bruke min hurtigtast.
Jeg kommer til å gå opp, opp, og endre hallo en til hei 2, Enter.
Og heldigvis, jeg gjør fremskritt.
>> Og nå skal jeg til å gå opp til dot slash hei og
endre det til to, Enter.
Og nå mitt program -
Jeg vil zoome inn - blir litt penere.
Navnet skal være, la oss si Rob denne gangen, Enter, hallo, Rob.
Vi kan gjøre det igjen.
Navn, Lauren, Enter.
Navn, Joseph, Enter.
Navn, la oss prøve å være vanskelig, Enter.
Eh.
Det er egentlig ikke en bug.
Så det er bare litt stygg.
Så kanskje vi kunne løse dette i fremtiden, ikke nå.
>> Men hvordan ville du instinktivt gå om adressering
at særlig utfordring?
Det ser bare dumt.
Hvordan kan du unngå ting ser dum?
Slik at vi kunne gjøre, OK, jeg hørte et par av ting, en tilstand og en loop.
Vi kunne bruke, en, en tilstand, for å sjekke det som er lengden av strengen
brukeren ga oss?
Og hvis det er 0, det er bare sitere unquote, de bare trykke Enter, deretter
kanskje jeg skulle kjefte på dem og be dem igjen.
Men hvordan be en trenger dem igjen?
Vel, jeg har også hørt loop, og jeg kunne gjøre det igjen og igjen og igjen
spørre brukeren etter det samme.
>> Vel, la oss gjøre en annen eksempel med en annen
funksjon i CS50 biblioteket.
La meg avslutte denne filen.
La meg lage en ny.
Og jeg skal kalle det adder.c, bare fordi det er lett å gjøre enkel aritmetikk,
selv om dette vil være helt uimponerende med hva du kan gjøre
med enhver moderne datamaskin.
>> Men la meg gå videre nå og -
Jeg har lært min lekse sist gang - inkluderer cs50.h, inkluderer stdio.h, int
viktigste tomrom, som, for nå vil jeg bare ta på blind tro, men vi vil anta
som vil forstå hva det betyr før lenge.
Og jeg kommer til å si noe som "gi meg en int."
>> Og nå, hvordan får jeg en int?
Jeg vil til slutt erklære en variabel kalt x av type int og
lagre i det et heltall fra brukeren.
Så det var en munnfull.
Men hvis noen ønsker å foreslå, hvordan erklærer jeg et heltall kalles x?
Int x.
>> Så det er virkelig så enkelt.
Gi meg en int.
Kall det x.
Nå bruker jeg tilordningsoperatoren.
Og hvordan skal jeg oppbevare fra igjen en verdi på brukeren?
Jeg ønsker ikke å kalle getstring, selvsagt, men heller getint.
Noen argumenter?
Nei.
Så det er åpent paren, nær paren umiddelbart, og deretter en
semikolon slutter linjen.
>> Nå la meg gjøre dette igjen.
Gi meg en annen int.
Denne gangen skal jeg gjøre int, la oss kalle det y, lik getint.
Og nå la meg gjøre noe super-enkel som litt matematikk.
Så printf, er summen av% d plassholder for en int.
Og% d, punktum, skråstrek-n.
>> OK.
Så det er faktisk ikke matematikk.
Men hvis jeg ønsker å si summen av dette verdi pluss denne verdien tilsvarer dette
annen verdi, hvor mange argumenter inn Totalt skal jeg være å gi printf,
til slutt?
Så fire, ikke sant?
Denne strengen og deretter de tre verdier.
Så x er det første jeg ønsker å være plugget i første til% d.
y kommer til å bli den neste.
>> Og nå er jeg slags ønsker å si z, men z ikke eksisterer.
Men det er ikke en stor avtale.
For hva ville du gjøre instinktivt, spesielt hvis du hadde en
grafisk kalkulator, hva du skriver?
Hva med x pluss y?
Så det er ikke en faktisk variabel.
Det er bare summen av to andre variabler.
Og det er helt legitimt.
C forstår sikkert enkel aritmetikk som dette.
>> Semikolon, lagre.
Nå la meg gå ned her og skriver at huggorm, Enter.
Ingen feil, så det er fremgang også.
Skriv huggorm.
Og en annen hurtigtast, hvis du begynner å gå lei
med alle kommandoene -
hvis du begynner å skrive en kommando, som dot slash annonse, og det er der
kjedsomhet spark i, kan du vanligvis treffer Tab å ha maskinen fullføre
resten av uttrykket for deg hvis det ikke er tvetydig hva som skal komme etter annonsen.
>> Så la meg gå videre nå og du klikker på Enter.
Gi meg en int, 1, 2, og heldigvis er det tre.
Men som alltid, testing programmer bør ikke redusere til
bare prøve det en gang.
La meg prøve et hjørne sak, som negativ 1, gi meg en, og at ett
sjekker ut også.
Og jeg sannsynligvis vil gjøre litt mer grundige tester, men jeg er ganske
komfortabel med hvor det er på.
>> Vel, nå la oss prøve et annet program at denne gangen bruker en
litt annen syntaks.
La meg lage en ny fil.
Jeg vil kalle dette conditions0.c til linje opp med noen eksempelkode på nettet.
Og la meg gå videre og gjøre inkludere cs50.h, inkluderer
stdio.h, i hoved ugyldig -
OK.
Det vi går.
Vi har vår standard standardtekst.
>> Og denne gangen skal jeg si printf, "Jeg vil gjerne ha en int, please" bare for å
gjøre prompt litt mer vennlig.
Og nå ønsker jeg å få en int fra brukeren.
Jeg kommer til å kalle det n denne gangen, bare fordi n høres ut som nummer.
getint, og nå, hva gjør Jeg ønsker å gjøre med det?
Vel, hvis n er - og jeg vil zoome inn -
hvis n er større enn 0, vil jeg å gjøre følgende -
printf "Du plukket et positivt tall." Else, jeg kommer til å skrive printf "Du
plukket en negativ
nummer. "All right.
Så dette programmet, selv om jeg gjorde det fort, ser rett syntaktisk.
La meg prøve dette.
Gjør tilstand 0.
Synes å kjøre.
Tilstand 0, inn.
La oss gi det en int 50 år.
Jeg plukket et positivt tall.
La oss prøve det igjen.
Tilstand 0.
Negativ 50.
Jeg plukket et negativt tall.
>> Men nå, la meg velge hva vi vil holde ringer et hjørne sak, som er mer
en interessant sak som du tror kan gi deg noen problemer, 0.
Nå er jeg ganske sikker på at dette er en av de hjørne tilfeller der null er
verken positiv eller negativ, så min program, men i syntaktisk
korrigere - det kompilerer, det går - er ikke logisk riktig.
Så hva er den enkel fiks her hvis jeg vil å oppdage, hvis jeg ønsker å håndtere n
lik 0 separat?
>> Så hvis n er lik 0, da vil jeg si noe som printf "Du plukket 0".
La meg prøve dette nå.
La meg gå tilbake hit, fjerner mitt vindu, og rekompilere.
Hm.
En feil generere.
Men jeg vil du sjekke hvis n er lik 0.
>> Så igjen, en annen dum ting å venne seg til, er likhetstegn
tilordningsoperatoren.
Så dette er faktisk feil i det, teknisk sett, selv om kompilatoren
beskyttet meg fra meg selv, ville vi teknisk mulig å kopiere 0 til n, som
er ikke det jeg ønsker.
Jeg ønsker å teste for likestilling med lik lik.
Og så nå kan være min bedre løsning.
>> La meg faktisk resave dette som, si, conditions1, for å være ny og forbedret.
Så nå hvis jeg rekompilere dette, det ville gjøre forholdene -
whoops - gjør conditions1 dot slash conditions1, Enter, "Jeg vil gjerne ha en int,
takk. "Jeg kommer til å gå videre og skriver 50.
Det er fortsatt god.
Negative 50, fortsatt god.
0, og den faktisk oppdaget at jeg plukket 0.
>> Så hva mer kan jeg nå gjøre med dette?
Vel, vi kan sikkert gjøre mer komplekse ting.
Men det jeg ønsker å foreslå er at vi ender på dette notatet her.
Hvis vi trekker opp dette, vil du se, kanskje, en favoritt tegneserie av deg
frem til i dag kan du aldri har forstått.
Og det er om kvaliteten på latter du bør få med CS vitser.
Så det er omtrent riktig.
>> Men mer overbevisende, jeg trodde jeg ville gi oss en liten teaser for mandag.
Så vi har begynt å bruke heltall.
Vi har henvist til flyter.
Vi har selv referert til dobbeltrom, som, igjen, gi deg tall
etter desimaler.
>> Men det viser seg at flyter og dobbeltrom, og, egentlig, datamaskiner,
fundamentalt, ikke kan uttrykke noen verdier presist.
Vi vet fra matematikk klasser som du kan ha hvilket som helst antall sifre etter at
desimaltegn.
Og du kan selv sette en loddrett strek å si disse gå på for alltid.
>> Dessverre kan du ikke egentlig gjøre det i en datamaskin.
Og så hjørne tilfeller oppstår.
For eksempel anta at du er gjør noe økonomisk.
Du gjør matematikk med prosenter, og
med kroner og øre.
Og disse cent ikke nødvendigvis oppstillingen.
Vel, det viser seg at fraksjoner av pennies kan begynne å legge opp når
modellert med et datasystem på en slik måte at smart
mennesker kan dra nytte.
>> Og de av dere som ikke har sett, ville jeg gjerne gi deg en 30-sekunders teaser av
en fantastisk film som kalles Office Space, som vil male et bilde av en
problemet vi skal takle første på mandag.
Hvis vi kunne heve volumet litt, jeg gir deg 30
sekunder av kontorlokaler.
>> [VIDEOAVSPILLING]
>> -Jeg mener, du, du har ikke vært vist opp og du får beholde jobben.
>> -Egentlig, jeg blir forfremmet.
>> -Jeg kunne programmere et virus som ville rive det stedet av store tid.
>> -Vel, hvordan virker det?
>> -Hver gang det er en bank transaksjon hvor interessen er beregnet, og det
er tusenvis om dagen, avslutter datamaskinen opp med disse fraksjoner av en cent.
>> -Men jeg har ikke tenkt å gjøre noe ulovlig.
>> -Ulovlig?
Samir, dette er Amerika.
>> -Vi må sverge til Gud.
>> -Hvis ingen vet om dette men oss, ok?
Ingen familiemedlemmer, ingen kjærester, ingen.
>> -Selvfølgelig.
>> -Agreed.
>> -Ikke bekymre deg, mann.
Jeg vil ikke si det til noen heller.
>> [END VIDEOAVSPILLING]
>> DAVID MALAN: Så dette er altså CS50, som var Office Space, og det vil alle
fornuftig på mandag.
Se deg da.
>> FORTELLER: Ved neste CS50, Rob justerer å være utenfor
Harvard måltid plan.