[Powered by Google Translate] DAVID MALAN: Dette er CS50, og dette er starten på uke 1.
Hva vi trodde vi skulle gjøre i dag er å ta en titt tilbake på
noe mange av dere har sikkert gått forbi for noen
tid nå og kan se litt kjent.
Denne saken her, dette er selvfølgelig i -
PUBLIKUM: Science.
DAVID MALAN: Science center.
Så dette er faktisk en av de tidligste datamaskiner
tilbake fra 1940-tallet.
Det var en av de første elektromekaniske datamaskinene
som var i stand til spesielt lang,
selvbærende beregninger, og hva vi faktisk ser i
Vitensenteret er bare en liten del av denne tingen.
Hva vi trodde vi skulle gjøre da er å ta en titt tilbake på en video
som ble gjort for en tid siden, og introduserer dette
tingen til verden.
Og du vil se fra musikk og stemme som faktisk de
var svært lykkelige tider.
>> [VIDEOAVSPILLING]
-En triumf av matematiske og mekaniske ferdigheter er dette
flott ny automatisk kalkulator ved Harvard University.
Intrikate problemer i matematikk, satt gjennom
maskin i kodet form på tape, er nøyaktig løst på en
minutters brøkdel av tiden nødvendig for menneskelig
beregningen.
Designet for å fremskynde alle former for matematiske og vitenskapelige
forskning, vil det gigantiske mekaniske hjernen fungerer for United
States Navy til krigens slutt.
>> DAVID MALAN: Så det du kanskje ikke vet er at det var i
dette samme enhet som et begrep vi alle nå ta ganske mye
for gitt ble skapt, som en bug.
Så en av ingeniørene som arbeider i denne datamaskinen
bokstavelig talt funnet en liten møll i maskinen som resulterte
i noen feilaktige beregninger.
Og som historien går at møll ble tapet til denne loggen
journal her, tilbake fra september 9 i 1940-noe,
og dermed ble født for verden begrepet "bug".
Så fra nå av vi vurdere feil å være noen form for feil i
programmer, enten menneskeskapte eller, i dette tilfellet, insekter.
>> Så noen kunngjøringer, som vi fortsetter.
Så CS50 har tradisjon for å tilby lunsjer slags på
de fleste fredager i løpet av semesteret, hvor vi tar 30 til
40 studenter til ild og is in the Square for casual
chitchat, snakke om informatikk,
snakke om fremtiden.
Vi inviterer studenter og venner fra industrien for å chatte opp
studenter så vel.
Virkelig mot en slutt for å gjøre hva som er en ganske stor klasse
alle de mer intime, minst en gang i mens for
undergrupper av studenter.
Så hvis du ønsker å bli med oss ​​denne fredagen, 01:15, gå til
CS50.net/lunch å RSVP.
Og vi vil gjøre dette recurringly, så ikke bekymre deg hvis du ikke
blant de første 30 eller så denne uken.
>> Så skriftlærde notater.
Et ord på de ressurser som vil nå begynne å være tilgjengelig
til elever i klassen.
Slik at hoder må ikke være nede under forelesninger
skrible ned alt jeg sier og så videre, hva vi gjør
i stedet er å gi fra lærerstaben en
kanoniske sett med notater.
Så vi har en av våre pedagogiske karer, Andrew Sellergren,
som sitter ned hver uke, gjennomgår videoer, og deretter
skriver ned hva vi tror er en ganske
autoritativ sett med notater.
Og Andrews glad, også, for å sette snarky fotnoter i
bunnen.
Så du vil forhåpentligvis nyte disse som et oppslagsverk for
moro, og også komme quiz tid, som en mulighet til å vurdere
hva som skjedde i enkelte forelesninger.
Så de er knyttet til forelesninger siden.
>> Oppgavesettet 0, i mellomtiden, er ute.
Og i form av ressurser tilgjengelig for deg -
walkthrough.
Milo ledet den første på fredag.
Det ble filmet, sette på nettet innen lørdag.
Og så skjønner, hvis du ikke er helt sikker på hvor du skal begynne,
for dette eller fremtidige p-sett, alltid slå først til
gjennomgang eller video av dette.
Seksjonering pågår, på cs50.net/section er der du
skal sende dine preferanser, hvis du ikke har
allerede, etter i dag.
Fordi seksjoner vil starte førstkommende søndag, mandag,
og tirsdag.
Vi gjør seksjoner de tre dagene, hver uke i
semester for det meste.
Og vi også introdusere igjen, ulike spor.
Så vil du bli spurt om dette seksjonering form, hvis du
har ikke sett det allerede, hvis du er blant de mindre
komfortabel, mer komfortabel, eller et sted i mellom.
Og hvis du er liksom på gjerdet, vanligvis et sted i
mellom er hva de fleste studenter ender opp med å sjekke.
Kontortid begynner i kveld.
>> Så Scratch er ganske lav nøkkel, selv om det er ganske naturlig
å kjøre inn diverse bugs, eller være usikker på hvordan du
gjennomføre noe.
Så innse at vi vil starte kontortid denne uken.
De vil være på Annenberg mandag, tirsdag, onsdag,
Torsdag 20:00 til 11:00 under hjernen pause.
Øvre classmen kan komme inn, og hvis du noen gang har problemer med å få
i døren, fordi de vil være å dra, bare snakke din vei
i og forklarer du med CS50.
Vanligvis 20 til 30 av oss i staben vil være der for å hjelpe
du en mot en.
>> Ved ankomst ideen er dette: du ta med laptop,
vil du ha din lader, vil vi ha ekstra strømledninger,
spesielt langs sørveggen av Annenberg der
det er massevis av stikkontakter.
Og det viktigste inngangsporten til kontoret timer Q & A er å gå til
cs50.net/discuss og å legge
spørsmålet ditt der.
Og for å merke det med pset 0 eller pset 1, uansett uke
kan skje for å være.
Og så hva vi skal gjøre er å ha en tabell av undervisning stipendiater
og selvfølgelig assistenter, vanligvis 8 eller 10 eller så av oss,
går gjennom, holde et våkent øye på tavlen, og
plukker ut spørsmål egentlig så raskt vi kan,
henvise deg til relaterte innlegg hvis du ikke har funnet dem
dere, online referanser, som hensiktsmessig.
Og hvis det er problemer, som det uunngåelig
vil bli, eller det bare er mer fornuftig å sitte ned en mot en,
arbeide gjennom problemer med noen.
>> Eller du bare komme i kontortiden virkelig
trenger den tankegangen.
Du ønsker ikke å gå gjennom det elektroniske skjemaet, kan du
virkelig ønsker å møte med noen.
Kommunisere det til oss, og hva som vil skje er når
Spørsmålet har blitt sett av en medarbeider, og vi
bestemme, yup, bør dette bli sendt til en av de 20 eller
30 gruppemedlemmer her lokalt, vil du se øverst til venstre dette
Litt Angi kø begynner å blinke på cs50.net /
diskutere.
Og dette er å fortelle deg at du nå har blitt invitert, så
å snakke, å gå inn i køen.
Og ved å klikke på den knappen, vil navnet ditt deretter vises på
en iPad at CS50 greeter, en av kursets hoder, vil
være å holde i nærheten av inngangen Annenberg, som vil deretter
se som avbildet her, de studentene som har spørsmål om
venstre, for personalet som er til stede på høyre side.
Og med et klikk på venstre og høyre, nettleseren vil
begynne å blinke så snart, for eksempel, professor McGonnagal
er klar til å se deg på et bestemt bord i Annenberg.
>> Så vi gjorde noen av det siste året.
Vi har restartet kontortid og
re-implementert mye av programvaren.
Så innser at dette vil bli varmet opp denne uken.
Men også innse også i år tidligere, som du kanskje har hørt
fra venner, hadde kontortid faktisk 50 til
150 studenter på en gang.
Og det er rett og slett ikke mulig for oss å håndtere at
effektivt, en mot en, hele kvelden.
Og så hva vi egentlig skal prøve å gjøre dette året er
kapitalisere på det faktum at mange av spørsmålene er
ofte spurt og kan ofte bli bedre besvart
asynkront.
Så du kan liksom tenke gjennom de ansatte svar,
og vi kan tenke gjennom koden din, uten oppvarmet
trykk på nødvendigvis sliter
gjennom det side ved side.
Så vi regner med at omtrent en tredjedel eller halvparten av spørsmålene
vil bli sendt i person, og vi vil prøve å rive av som
mange som en halv eller mer elektronisk,
i kontortiden.
Og vi vil fortsette å bruke Diskuter
i løpet av uken også.
>> Og til slutt, innser at dette kurset kan tas bestått / ikke bestått.
Så hvis du er på gjerdet, eller bare tenke at du er virkelig
ikke sikker på om dette er verden for deg, eller er dette virkelig
ganske fremmed for deg, skjønner at dette er en flott måte
for å få opp litt selvtillit som å gå inn i
klasse, som jeg gjorde ærlig, år siden.
Og så har fem uker til liksom finne ut for
selv om du ønsker å bo bestått / ikke bestått, bytte til et brev
klasse, eller lignende.
Og vanligvis hva bestått / ikke bestått gjør, tror jeg, for studenter er
at hvis du putter i at 10 timer, 20 timer, hva det
kan være på noen problemer, og du stanger hodet
mot veggen,
og du egentlig bare ikke kan jage noe ned, og du
har så mange andre ting du trenger å gjøre, ærlig, hva jeg
tror bestått / ikke bestått er, tar det kanten av av
situasjoner som det.
Hvor du har tatt ting 90% av veien.
Du vet, det er ikke helt perfekt.
Men du fikk mye ut av det, likevel.
Så vurdere bestått / ikke bestått som å gi deg som
mental modell, kanskje.
>> All right, så forrige uke vi due i Scratch, og vi
snakket om programmering på en ganske høy grafisk nivå.
Og i dag er vi gjøre overgangen til et språk
kalles C, et lavere nivå programmeringsspråk oppå
som mange moderne språk er nå bygget, inkludert noen
av de som vi skal bruke mot begrepet slutt.
Og syntaktisk, hvordan de ser ut
er alle ganske like.
Så la oss begynne å gjøre denne overgangen her.
Så dette var et program i forrige uke som var den enkleste av
Hello World programmer.
Det rett og slett skrevet til skjermen hallo verden, med en
lite snakkeboble kommer ut av katten.
Vel, hvis vi begynner nå å oversette dette til en annen
språk, innser at ideene i dag og på onsdag
er identiske, men syntaksen begynner å endre.
Så mens forrige uke hadde vi, når grønne flagget klikket, sier
hallo verden.
I dag skal vi ha int, viktigste, annullert, printf,
avkastning, med en annen syntaks i der også.
Klammeparentes og parenteser og sitater, og whatnot.
Men innser at kjernen av ideen her er trykkteknikker,
og til slutt det faktum at main er nå kommer til å være
synonymt med starten av et program.
Viktigste kommer til å være der det grønne flagget spark ting av.
>> Så la oss nå erte hverandre noen av byggesteinene her
før vi dykke inn noen konkrete eksempler.
Så vi kalte dette en uttalelse i forrige uke, der det er bare
en instruksjon.
Gjør dette - i dette tilfellet, si hei verden.
Vel i C, hvis vi ser på bare den linjen, dette er hvordan vi er
kommer til å begynne å uttrykke den aktuelle puslespillbit:
printf ("Hello World");.
Og nå skal vi erte disse fra hverandre mer og mer over tid,
men innser at det er et mønster her.
Så en har vi denne tingen kalt printf, som er
hovedsak analogt til ordet Say.
Det er hva det kommer til å gjøre.
Printf, betyr og f her "formatert".
Så det betyr bare at du kan sette inn
ulike estetiske detaljer.
Så quote unquote er begynnelsen på hva vi skal
å begynne å ringe en streng.
Et ord, en setning, en setning.
En streng i et programmeringsspråk er en sekvens av null
eller flere tegn.
So h-e-l-l-o, komma, og så videre er,
sitat unquote, en streng.
Og nå backslash n, litt syntaktisk merkelig, men vi
allerede definert som forrige uke som betyr hva?
Det er bare en ny linje.
Det er bare en måte å formidle til datamaskinen du ønsker
tilsvarende trykke Enter der, men du ikke
vil faktisk trykke Enter, og derfor rotet opp alle
formatering av selve programmet.
Nå parentes vedlegge denne strengen, åpen paren og
nær paren, og innsiden av det er vår streng.
Fordi det er fordi i C, og andre programmeringsspråk
språk, som ting printf ta argumenter, eller ta
parametre.
>> Så begynne å tenke nå på denne lilla Si blokk som en
funksjon, som en metode, som en prosedyre.
Du kan virkelig kalle det hva du vil for nå, men
det er liksom en miniatyr program som bare gjør én
ting, i en enkelt linje, ikke mindre.
Så er printf også hva vi kommer til å begynne å kalle en
funksjon, og funksjoner gjør noe - i dette tilfellet
skriver en formatert streng på skjermen -
men fungerer også ta argumenter eller parametere.
Og ved argumenter eller parametere, takk, mener vi
at deres atferd kan bli påvirket av hva du passerer i
innsiden av parentesene.
Så i dette tilfellet, skal printf behov fortalt hva de skal skrive ut, og vi
bare pass på, i anførselstegn her, strengen som vi
faktisk ønsker å skrive ut.
Og semikolon på slutten av denne linjen er bare en
historisk ordensforstyrrelser hvorved ved slutten av de fleste kodelinjer,
du setter et semikolon for å gjøre super klar til datamaskinen
at denne linjen med kode slutter her.
Nå er dette bra fordi vi vil se som programmer får mer
kompleks, vil semikolon gjør super klare til oss mennesker,
og også datamaskinen hvor kodelinjer start og slutt.
Innse at noen språk ikke har noen
av disse samme detaljer.
Og faktisk, i JavaScript, trenger du ikke alltid trenger noe
som semikolon.
Men mer om det som kommer.
>> Så looper.
Vi hadde noe sånt, veldig intuitivt, opplagt, gjør
noe igjen og igjen og igjen.
Liker å sette på sokker, eller si hei, i dette tilfellet.
Vel, som starter i dag i C, kan vi uttrykke dette Scratch
blokkere så while (true) printf ("Hello World").
Så merker vi begynner å bygge på bokstavelig puslespillet
stykke fra før.
Vi har samme lilla blokken, men det er på innsiden av dette
hakeparentes Alltid blokk, og den beste måten å oversette det
til C er som følger.
Det er ingen Alltid søkeord.
Du kan ikke bare skrive f-o-r-e-v-e-r i C.
Så det nærmeste analog er stund.
>> Nå while (true) virker litt dum fordi gjør verdien
av ekte gang endres?
Antagelig ikke.
Det er som å si mens en, mens på, mens sant.
Det er alt det samme, er sant alltid tilfelle.
Så denne sløyfen er faktisk inducing hva slags loop?
Bare en uendelig løkke, høyre.
En Alltid loop eller som vi kalte det i forrige uke,
bare en uendelig loop.
Så noen ganger det er ille.
Noen ganger det er en bug, noen ganger det er derfor du får
spinning badeball eller timeglass eller lignende.
Men i dette tilfellet har vi bevisst, uansett
grunn, ønsket å skrive det samme igjen
og igjen og igjen.
Eller i tilfelle som en klokke, vil du gjøre
noe igjen og igjen og igjen.
Så uendelige løkker kan være fornuftig.
Og dette er hvordan i C kan vi oversette Alltid til koden.
>> Så nå dette er en litt mer konkret.
Vi hadde gjenta 10 ganger med følgende utsagn.
Så while (true) ikke fungerer helt der, fordi sann er
alltid sant.
Så hvis vi i stedet se på C versjon, nå syntaksen får en
litt mer kryptisk.
Men for å være ærlig når du begynner å se dette, blir det hele
ganske kjent raskt.
Så dette er det som kalles en for-løkke.
En for loop kommer til å fortelle datamaskinen til å gjøre noe
igjen og igjen og igjen så lenge
disse tingene er sanne.
Nå hva mener vi med det?
Vel, det er tre deler til en for løkke, og vi kommer til å
komme tilbake til dette i sammenheng med faktiske
eksempler i et øyeblikk.
Så ikke bekymre deg hvis det ikke synker helt i alt på en gang.
Men int i = 0 er, lang historie kort, sier gi meg en
variabel som er av typen heltall, så gi meg et nummer
jeg ringte, og initialisere den til 0.
Det er å gi meg som en algebraisk variabel x og
initialisere den til 0.
Men i dette tilfellet vi kalte det jeg.
Så i midten, sier det jeg er mindre enn 10 år.
Det forteller datamaskinen gjør følgende ting så lenge
som jeg er mindre enn 10 år.
Og selvsagt det begynner mindre enn 10 fordi
den starter på 0.
Så til slutt, kan du kanskje gjette hva jeg + + betyr.
Det er en liten bit av syntaks som bare betyr øke i.
Så legg 1 til i, igjen og igjen og igjen.
>> Og slik som vi vil se denne sløyfen, denne syntaksen, heller, implementerer
nøyaktig det samme som, ærlig, i Scratch var bare så
mye lettere å uttrykke.
Gjenta 10, og du er ferdig.
I C, og i de fleste programmeringsspråk, må vi være en
litt mer instruktivt for datamaskinen og faktisk
angi noe sånt som dette.
Men vi vil komme tilbake til dette og andre syntaks.
>> Hva om variabler?
I Scratch hadde vi noe som disse oransje blokker,
hvor jeg kunne erklære en variabel.
La oss vilkårlig kaller det teller.
La oss starte den til 0, og deretter
la oss alltid gjøre noe.
I dette tilfellet i Scratch jeg sier telleren, slik at
katt kommer til å ha en liten tale boble som taler
nummeret som er i denne variabelen.
Og da har vi endre teller med 1.
Så alle dette er pakket inne i et Alltid lås.
Så vi allerede nå har byggesteinene i C med
å oversette dette.
>> En måte vi kunne gjøre det er dette.
Gi meg et heltall, kall det teller.
Initialisere den til 0
i første linje det.
While (true), så jeg stjeler den ideen fra bare et øyeblikk
siden, gå videre og gjøre følgende.
Skriv ut disken, og deretter øke telleren,
igjen og igjen og igjen.
Eller igjen, + + betyr bare legge en til noe.
Men det er et nytt stykke av syntaks her.
Hva er hopping ut som ikke blant våre tidligere eksempler?
Ja, dette% d.
Så du kan kanskje antyde hva dette gjør, ærlig, basert
på hva Scratch blokken gjør.
Men igjen i C, vi må bare være litt mer bestemt
når det gjelder å uttrykke oss selv.
>> Så printf ("% d \ n").
Vel de fleste av at vi kan kaste bort så kjent.
Sitatene betyr bare det er en streng, backslash n
er bare en ny linje.
Så den eneste nye er her% d.
Og alt som er er en plassholder.
% D skal betegne et desimaltall.
Og% d betyr datamaskinen, sette et desimaltall her.
Vel, hva du ønsker å sette det?
Vel, som du kan kanskje antyde, etter kommaet si vi
counter, som er navnet på en variabel som vi erklært eller
skapte et par linjer tidligere.
Så dette er bare C måte å plugge i en variabel i en
string dynamisk.
Fordi derimot, hvis jeg hadde i stedet gjort noe sånt
dette, printf ("counter"), hva ville dette
programmet i stedet gjøre, formodentlig?
Det vil bokstavelig talt ut "counter".
Som ikke er en effekt som jeg ønsker.
Jeg trenger å erstatte i noen numerisk verdi.
Så vi får se at funksjoner da, som printf kan ta ikke
bare bare enkle argumenter, som
"Hello World".
De kan ta sitat unquote komma, og deretter noen variabler
som vil få plugget inn, som vi skal se forrige strengen
via disse% sign plassholdere.
>> Vel hva om boolske uttrykk?
Boolske uttrykk var disse verdiene, sanne eller usanne.
Ja eller nei.
1 eller 0.
På eller av.
Så i Scratch de ser ut som dette, og legge merke til at
bunn blokk her er faktisk sammen
av to mindre blokker.
Så jeg slags dras og slapp tre biter i et puslespill
sammen for å gjøre det lenger puslespillbit det slik at jeg
kunne formidle ideen om at jeg ønsker x være mindre enn y og
y til å være mindre enn z.
Og så jeg kan oversette disse to separate linjer som følger.
Den øverste kan være svært trivially oversatt til C,
med bare x <y.
Kanskje med noen parenteser for godt mål.
Og deretter i C, trenger du ikke skrive og å betegne
sammen av noe.
Du i stedet skrive &&.
Og som vi vil til slutt se, skjer en enkelt ampersand til
bety noe annet.
Så && betegner bare tanken på AND.
>> Så igjen, selv om dette begynner å se ganske komplisert,
ett av formålene med å innføre Scratch, foruten
bare å ha en slags morsom på rampen der du kan gjøre
noe som er veldig grafisk, og animerte, og
shareable og lignende, er også å formidle ideen om at
alle ideene vi begynner dykke inn i dag og fremover
er nedfelt i selv så enkelt
grensesnittet siden dag én.
Hva med denne her?
>> Slik at forholdene.
Så Scratch blokken på venstre det ser
litt mer komplisert.
Men det er bare noen å dra og
slippe av kjente stykker.
Hvis x er mindre enn y, si det.
Else if x er større enn y, si det.
Else, kan vi logisk anta at det er inferred at
de må være like.
Så si at de er like.
Nå i C på høyre, samme ting.
Og legg merke til at klammeparentes kommer til å bli en
funksjon i C og andre språk som gjør denne typen
av innkapsling.
Akkurat som om blokken er dette gule ting som er liksom
flytte den lilla blokken inne i den.
Tilsvarende er disse bukseseler -
disse klammeparentes -
ment å trylle frem den samme ideen til å omfavne en eller flere
linjer med kode som er rykket inn i dem.
Så på høyre side her, hvis x mindre enn y, printf
("X er mindre enn y").
Else if x er større enn y, skrive ut det samme.
Else skrive ut at de er like.
>> Så kort sagt, det er en ganske direkte kartlegging eller oversettelse
av språket vi har sett så langt, inkludert for noen
av de mer avanserte funksjonene.
Så du ikke kan bruke dette for prosjektet, eller kanskje ikke
skal bruke dette for prosjektet denne uken.
Men vi har disse tingene kalt arrays i C. I Scratch,
de heter lister.
Og vi så disse med Fruitcraft RPG forrige uke.
Den lille blå fyren som gikk rundt, plukke opp
kirsebær og appelsiner og lignende.
Vel i Scratch, som ble gjennomført med dette oransje
blokkere som inneholder ord, i dette tilfellet, er vi bokstavelig talt
legge "oransje" til en
variabel kalt inventar.
Så i C, er denne syntaksen kommer til å få litt mer kryptisk.
Og vi vil komme tilbake til dette i neste uke, og gjøre mer
interessante ting i verden av kryptografi med det.
Men på bunnen her, disse to linjene hovedsak
oversette til hva vi gjør i ett Scratch blokkere opp der.
Men mer om det som kommer.
>> Så setter det sammen, her er et program i C. Så la oss
raskt erte hverandre noen av bitene av syntaks her, men
så la oss faktisk begynne å skrive noen kode, gjøre
deg med noen av verktøyene vi skal bruke, og se om vi
kan bygge på nå noen av disse grunnleggende byggesteinene fra
forrige uke, nå syntaktisk i C. Så på toppen her, dette
er kanskje en av de mest kjedelige programmer du kunne
skrive i de fleste noen programmeringsspråk.
Men det er liksom har spesiell betydning fordi det er den
kanoniske program som en hvilken som helst datamaskin vitenskapsmann skriver når
undervisning noen et programmeringsspråk -
Hallo verden program.
>> Så på toppen, ser vi denne oppfatningen av # include
og deretter, i festemateriell, stdio.h.
Vi kommer til å komme tilbake til det, men egentlig hva som
betyr at det er en fil i denne verden kalt standarden
I / O, stdio dot h, og det er bare en tekstfil som
noen skrev år siden.
Og innsiden av denne tekstfilen er en hel haug med
funksjoner, eller metoder eller prosedyrer, som noen andre
skrev at vi nyter godt av fordi vi
kan nå bruke denne personens kode.
Funksjonene han eller hun skrev.
I dette tilfellet, printf er ikke noe som jeg skrev, er det
ikke noe som CS50 skrev.
Det er noe som noen skrev år siden og satt i en
fil som heter stdio.h og da, som en side, sette
en annen del av funksjon i en annen fil.
Men vi vil komme dit.
>> Så # include er bare vår måte å si, i
C, gi meg tilgang til funksjoner som noen andre skrev.
Og i dette tilfellet bryr jeg fordi jeg vil printf.
Nå får vi int main (void).
Så dette er en av disse tingene, ærlig, at på dag 0,
ganske mye jeg har å slags sone ut, fordi det er bare
ikke interessant
intellektuelt, noen av syntaksen.
Men for nå vet at funksjoner, ellers kjent som
prosedyrer, eller metoder, generelt produsere noen verdi.
De gjør noe.
De kommer opp med et svar.
De produserer utgang.
Så int neste to main er bare vår stenografi måte å si
at denne funksjonen, denne prosedyren, til slutt kommer
å gi deg tilbake et nummer.
Og hvorfor det er, vil vi komme tilbake til.
Viktigste er bare standard internasjonal standard for standard
funksjon som kommer til å bli henrettet i et C-program når
du kjører den.
Void betyr bare denne tingen, viktigste, tar ikke
argumenter, i dette tilfellet.
Så jeg blir super eksplisitt.
Det er ingen strenger i det, er det ingen komma.
Void betyr ingen argumenter til main.
>> Nå til slutt, heldigvis, de to siste linjene er kjent.
Inne i klammeparentes har vi en printf
og vi har en retur.
Og avkastningen er slags uheldig at vi må
sette det der, fordi i dette tilfellet ikke det gjør alt som
mye av interesse.
Men i et dataprogram, når en funksjon returnerer 0,
som betyr alt er vel.
Ingenting gikk galt.
Derimot, hvis en funksjon returnerer 1, eller negativ 1, eller
negative 1337, eller noen tilfeldige tall som det, at
betyr vanligvis at en feil faktisk har oppstått.
Så hvis du er på Mac eller PC, hvis du noen gang har sett
noen irriterende melding fordi datamaskinen har krasjet eller
frosset, og det er en kryptisk feilmelding,
og deretter noen kode, som system kode
1,2,3,4, noen nummer,
som er generelt en unødvendig detalj å fortelle
de fleste av oss mennesker, men det er det noen funksjon eller noen
programmet har faktisk returnerte, en ikke-null verdi.
Og fordelen med dette er at 0 betyr alle så vel, og
da du egentlig har en uendelig rekke ting som
kan gå galt.
Som er grunnen til at de valgte 0 for god og en annen verdi enn null for
dårlig, som vi skal snart se.
>> Så la oss gå videre og skrive dette.
Så husker at den andre dagen jeg brukte min Mac til å åpne opp en
terminal-vinduet, og da jeg åpnet opp tekstprogram, som
TextEdit, og jeg begynte å skrive noe kode.
Vel det er greit.
Men din erfaring kommer til å være annerledes på en Mac, eller
på en Solaris maskin, en Linux-datamaskin, uansett operativsystem
system du tilfeldigvis skal bruke.
Og så i løpet, hva vi i stedet for å bruke er noe
kalt CS50 Appliance.
Så CS50 Appliance er et nedlastbart stykke programvare
som lar deg kjøre et operativsystem som heter Linux,
spesielt Fedora Linux, på din egen Mac eller PC.
Og du gjør dette ved å laste ned noe som kalles en hypervisor.
Så alt dette skal dokumenteres i oppgavesettet en.
Og du vil bli guidet mot hva du trenger å laste ned.
Men sluttresultatet, om du har en Mac eller PC, er du
laste ned noen gratis programvare.
Du kan deretter laste ned CS50 Appliance, og du fortelle at
fri programvare - hypervisoren -
å kjøre CS50 Appliance i et vindu på datamaskinen.
Og det som skjer er dette.
>> Jeg har nå, legge merke til her, synes det å være en stasjonær
miljø.
Og la meg faktisk krympe dette enkelt vindu.
Så dette er nå min Mac, med et lite vindu her, og inne
av dette vinduet skjer for å være en helt
annet operativsystem.
Faktisk er det denne startmenyen her nede, som minner om
Vinduer, som har en hel haug med undermenyer, inkludert
en link til CS50 manuell, Dropbox og lignende.
Og hva dette miljøet er nå en standard miljø
at alle av oss kan nå bruke, slik at uansett hva din
datamaskinen er, hva du har installert på det, hva versjon
av Mac OS eller Windows du kjører, vi alle har nå
samme miljø.
Og nå i dette miljøet kan vi begynne å skrive noe kode.
>> Så jeg kommer til å gå videre og åpne et program som heter gedit.
Dette kan sammenlignes med Notepad.exe eller
TextEdit på Mac.
Og dette er bare en super enkel tekstredigering program
som ser ut som dette ved første øyekast.
Nå på toppen, jeg har en hvit palett, nederst jeg
har denne sorte vinduet som sier jharvard @ apparatet.
Og det er fordi brukerkontoen som vi pre-laget
for alle kalles John Harvard.
Han har en mappe hvor alle sine filer kommer til å gå, og
her er der vi kan begynne å skrive noe kode.
Så la meg gå videre her og zoome inn bare litt, og jeg er
kommer til å gjøre # include , int main (void), og
så jeg kommer til å gjøre printf ("Hello World")
, Tilbake 0.
Nå er alle ganske svart og hvitt.
>> La meg gå videre og gjøre en ting å lære gedit hva jeg
faktisk gjør.
La meg gå til Lagre som.
Jeg kommer til å velge på venstre side her jharvard.
Så igjen, selv om du aldri har brukt Linux før, ærlig
disse dager, er alle av dem devolving inn hovedsak
samme type grensesnitt -
Mac OS, Windows og Linux.
Så jeg valgte jharvard hjem-mappe her.
Og jeg kommer til å lagre denne filen som hallo.c.
Så på toppen, jeg skrev hallo.c; navngi en C
program med. c utvidelsen er
hva er vanlig praksis.
Og jeg traff Lagre.
Og nå hva som er hyggelig er at jeg har effektivt lært gedit,
at dette er en C-program.
Legg merke til at min svart og hvit tekst er nå fargekodet, eller
syntaks markert, som bare trekker oppmerksomheten min til
ulike semantiske deler av programmet.
Øverst til venstre der, som mine programmer får mer komplisert, jeg
kommer til å ha en oversikt over alle de tingene jeg har skrevet.
Så det er det der oppe.
Så la meg nå zoome ut og gå ned til denne terminalvindu.
>> Så dette er kanskje nytt for mange mennesker.
Hvis du aldri har brukt en kommandolinje miljø, har du aldri
brukt DOS, eller du aldri har brukt Linux, eller du har aldri åpnet
Mac OS terminal vindu, det er mange ting du
kunne gjøre med GUI, som peker, og klikke, og
å dra og slippe, og lignende, men generelt -
sikkert i verden av informatikk -
ved hjelp av en kommandolinje, der du ikke har musen
generelt, du har bare tastaturet, er faktisk mye
kraftigere enn grensesnitt, når du blir acclimated til
ulike kommandoer.
Og du liksom fri deg selv ønsker å peke og klikke
på alt.
Så i gedit vi liksom har det beste fra begge verdener.
Vi kan dra og slippe tekst, kan vi se det
hyggelig og fargekodet.
Men når det gjelder tid til å kjøre programmet vårt, vil vi noen ganger
bare bruke denne lille vinduet her.
>> Så jeg kommer til å gå videre og gjøre dette.
I bunnen svart og hvitt vindu, kommer jeg til å gå videre
og skrive clang.
Og clang er navnet på en kompilator.
Det er et program som konverterer min kildekoden
inn, så objektkode.
0'er og 1'ere, som vi så kort forrige uke.
Husker fra forrige uke, lovet vi at vi skulle
gå fra noe sånt som dette - vi trengte å være
noe sånt som dette -
og dette er absolutt ikke noe som et menneske kommer
å gjøre manuelt.
Så i stedet vi kommer til å bruke et program, og at programmet i
dette tilfellet kalles Clang.
Og navnet på programmet mitt er hallo.c.
Så for å kompilere hallo.c fra kildekoden til
objekt-kode eller 0'er og 1'ere, bør det være nok å bare gjøre
dette og trykker Enter.
>> Ok, ingenting synes å ha skjedd.
Men jeg vet nå, eller fra forrige uke, at standardnavnet
et program, når skrevet i C, er tåpelig kalles a.out.
Mest uinteressante navn du kan komme opp med.
A er den første bokstaven i alfabetet, er ut hva som var
outputted, men det får så være.
Dette er mitt program, og nå dot slash, som vi skal se, er
faktisk bare en slags sikkerhetsfunksjon, fordi
a.out er et program jeg skrev.
Det kom ikke med datamaskinen min, er det
ikke i Programfiler.
Det er ikke i Mac OS programmappa.
Jeg trenger å være super eksplisitt med datamaskinen, og si
dette programmet, a.out, er i gjeldende mappe, den
gjeldende katalog.
Og måten du representerer dette i et miljø som dette
er prikk representerer hva mappen du er i.
Og så. / Betyr bare kjøre a.out
i gjeldende mappe.
Og jeg kjører dette med Enter, og voila, min aller første program.
>> Nå la meg ta et skritt tilbake.
Dette vinduet er litt liten, og innse at bunnen
igjen av apparatet her er et annet ikon.
Det ene er Chrome, som bør være ganske kjent, bare en web
Nettleseren innsiden av apparatet.
Og svart og hvitt symbol er bare en
større terminal-vinduet.
Så hvis det blir litt irriterende å sortere av har bare
denne lille lille bit av et vindu som å samhandle
med programmer, kan vi i stedet gjøre dette.
Og nå la meg begynne å skrive noen snart
å være kjente kommandoer.
ls.
Så ls er kommandoen for notering.
Så i en Mac OS eller Windows, vil du vanligvis dobbeltklikker en
mappen, og voila, du ser alle de forskjellige filer
og mapper.
I en kommandolinje miljø, hvor du bare kan skrive
kommandoer eller tekst, er ls tilsvarende.
Så vis meg hva som er i denne katalogen.
>> Nå er det en haug med ting her som er både litt
kjent og litt ukjent.
Men legg merke til at akkurat som Windows og Mac OS, jharvard
har en stasjonær mappe.
Så noen ikoner som er på skrivebordet mitt skje
å være i den mappen.
Det er en nedlastinger mappe, ting som
Chrome kan sette der.
Dropbox.
Så apparatet kommer med innebygd støtte for Dropbox
slik at over semesteret, kan du synkronisere med din Dropbox
konto, slik at alle programmer er sikkerhetskopiert.
De er tilgjengelig på den andre datamaskinen.
Hvis noe noensinne går galt med apparatet, kan du
veldig enkelt gjenopprette fra Dropbox.
Slik at mappen er der for det.
Det er to filer som jeg har gjort - hallo.c
og a.out.
Og deretter til høyre er det noen andre mapper som vi vil
komme til mot slutten av semesteret, med web
programmering.
Så når jeg gjør. /, A.out, Enter, som sier gå
i katalogen er jeg i, nåværende katalog, og kjør
program kalt a.out rett der.
>> All right, så det er fint og bra, men det er ikke alle som
attraktivt å skrive et program som heter hjelpe a.out.
Så vi kan faktisk gjøre dette litt annerledes.
Så i stedet for bare å kjøre clang, hallo.c, la oss legge
det som kalles en kommandolinje argument.
Så en kommandolinje argument, eller en bryter i dette tilfellet, er bare
et annet ord eller en frase som du skriver i en melding etter
programmet du vil kjøre.
Så i dette tilfellet, er clang programmet jeg ønsker å kjøre,-o
betyr utgang til en fil som ikke lenger heter a.out.
Utgang en fil som heter Hallo, og gjør det ved å kompilere den
siste ord på linjen, hallo.c.
Så kort sagt, er dette en svært marginal forbedring, der
i stedet for å ha dette stupidly navngitt fil a.out,
Jeg kan nå gjøre clang-o hello, så hallo.c, og
trykk Enter.
Ingenting ser ut til å skje, men igjen mye som med 0 - når
ingenting synes å skje som betyr noe galt skjedde -
så la oss gjøre ls nå, Enter, og faktisk jeg nå
har en god dag program.
Så hvis jeg skriver hei nå, kommando ikke funnet.
OK,. /.
Så helt riktig.
Så fordi dette programmet skrev jeg, og det kom ikke med
datamaskinen,. / hallo, Enter, betyr
Jeg kjører nå hei.
>> Så det er det der.
Nå hva vi vil til slutt få til mer og mer kommandolinje
argumenter som tillater oss å gjøre mer, men bare for dem for
hvem dette kan være gamle lue, la meg faktisk gå inn i en
katalog her og bare gi deg en teaser av hvordan ellers vi
kunne gå om å implementere hallo verden.
La meg gå inn på her, og jeg kommer til å åpne den.
Så egentlig, jeg kommer til å forklare hva jeg gjør, så
dette er nyttig.
La meg opp igjen.
>> Så jeg har gjort dette i lang tid.
Så merker over på høyre er det et par av
kataloger som er merkelig navn source1m og source1w.
Dette er bare dumt konvensjonen vi bruker.
Kilde betyr bare kildekoden, betyr en dette er uke én, og
m betyr at det er mandag, og w betyr at det er onsdag.
Så ingenting kryptisk der.
Det er bare stenografi notasjon.
Disse blå ting er mapper, ellers kjent som
kataloger.
Jeg ønsker å gå inn i den mappen nå, og på en vanlig datamaskin
Jeg kunne bare dobbeltklikker på en mappe ikon og
det er alle mine filer.
Men i en kommandolinje miljø, kan jeg ikke helt gjøre
det, så i stedet, må jeg endre kataloger manuelt.
Så hvis jeg skriver cd og deretter source1m, Enter, legge merke til at
min spør, ting i hvitt til venstre, nettopp endret.
Og så ja, da det bare sa parenteser og deretter
liten latter, tilde symbol, som bare mente jeg var
i John Harvard hjemmekatalog, hans Mine dokumenter,
hans personlige filer.
Men nå i parentes står det ~ / source1m.
Dette betyr bare jeg er i en mappe som heter source1m
som er i John Harvard hjemmekatalog.
Så hvis jeg nå ønsker å liste opp filene i denne mappen, lett
spørsmålet, skriver jeg bare ls.
Og nå ser jeg alle filene som jeg pre-laget for dagens
foredrag, som alle, eller de fleste av dem, skjer
å slutte på. c..
>> Så la meg gå videre nå og kjøre gedit av et program kalt
holloway.c, som er skrevet av noen tilfeldige hacker
på internett, ser det litt som dette.
Og vi kommer ikke til å gå gjennom dette i noen
detalj, men for de mer komfortable, spesielt hvis
du ønsker å ta en gjetning på hva dette programmet gjør her.
Trygg, uansett om du er mindre eller mer komfortabel,
vi ikke engang komme til denne typen ting innen utgangen av
dette semesteret.
Dette er hva som er et eksempel på en uklar C konkurranse, som
betyr skrive mest kryptiske ser programmet du muligens
kan å overgå andre smarte mennesker, som er tilsvarende
prøver å skrive ting og vise frem at de kan skrive
mer kryptiske ting enn deg.
Så dette er ikke et eksempel på en velskrevet programmet fra
perspektiv av stil, er dette et eksempel på et program som
vinner en konkurranse, for folk prøver å
være vage og abstrakte.
>> Så hvis vi kjører denne tingen, la meg gå inn i min terminal-vinduet,
så å si.
Så svart og hvitt miljø kalles
terminalvindu generelt.
La meg gå videre og kompilere den.
Jeg har ikke tenkt å bruke clang, fordi dette programmet er en
litt kryptisk og det er behov for en annen
kompilator, en som heter GCC.
Men det gjør det samme.
Det tar kildekoden til objektkode.
Og nå hvis jeg kjører a.out, det programmet du
bare så gjør dette.
Slik at fyren som året vant den konkurransen.
Anyhow, vi ikke går i riktig retning, per se.
>> Så la oss faktisk prøver å nå erte hverandre hva vi kan gjøre
med disse grunnleggende byggesteinene for å gjøre mer og mer
interessante programmer.
Så vi har skrevet et program, har vi kjørt et program.
Nå kan vi faktisk forenkle og ikke lenger trenger å skrive
ordet clang ved ledeteksten.
Det viser seg som våre programmer får mer kryptisk, vi kan, eller
mer kompleks heller, kan vi faktisk kjøre denne kommandoen.
Så la meg gå tilbake til mitt hjem katalog, så å si, la meg
fjerne - rm er fjern kommandoen - jeg kommer til å fjerne
filen som heter a.out og Hallo.
Og nå merker i en kommandolinje miljø, mye som i
en GUI, får du beskjed om det. Jeg kan ikke klikke på en knapp skjønt, jeg
å skrive y for ja, y for ja.
Og nå hvis jeg skriver ls igjen, legg merke til at de grønne
programmer - a.out og hei -
er borte.
Pass rm.
Det kan gjøre dårlige ting, akkurat som du kan ved å dra
ting til papirkurven.
>> Så la oss nå gå videre - og jeg kunne gjøre dette - clang-o
hallo, hallo -
Jeg er allerede lei skrive denne kommandoen.
Selv om jeg skrev det litt raskt.
Så vi kan i stedet gjør hei.
Så sørg ikke en kompilator.
Det er bare en vennlig program som følger med Linux, i dette
tilfelle - operativsystemet -
som automatiserer prosessen med å sette sammen programmer.
Så i stedet for å huske clang-o filnavn og
Deretter så videre, spesielt når disse linjene blir lengre og
lenger, kan jeg bare skrive gjøre.
Og dette kommer til å spytte ut en hel haug med ting som
Vi vil til slutt se dette semesteret.
Men legg merke nå hvis jeg skriver ls, hallo er tilbake i katalogen min.
Og faktisk jeg kan kjøre den med. / Hallo.
Så sørg bare automatiserer prosessen med å kjøre det som var,
i dette tilfellet, en mye lengre, mer komplekse kommando.
Så vi kommer til å begynne å bruke merke, bare fordi det er mye
mer brukervennlig.
>> Men la oss nå gjøre en mer interessant program
enn bare si hei.
Så i programmene vi har skrevet så langt det er viktigste.
Det er bare standard ting som sparker alt av.
Men det er andre funksjoner der ute også, og
stdio.h er ting som vi så på toppen av vår
filen før, og at det som er kjent som standard bibliotek.
Innsiden av standard biblioteket er en hel haug av funksjoner
at noen andre skrev, og vi kan begynne å bruke disse
funksjoner for å skrive mer
interessante programmer oss selv.
>> Så la meg gå tilbake til apparatet.
Jeg kommer til å lukke dette terminalvinduet.
Jeg kommer til å lukke de tingene vi skrev tidligere, og bare gå
inn hallo.c, og legge merke til nå kan jeg gjøre følgende.
Hei verden er ikke alle som interessant, jeg vil gjerne
tilpasse dette programmet for meg selv.
Så i stedet for å si verden, kommer jeg til å
gå foran og si -
Jeg kunne skrive David - men dette virkelig er liksom
fundamentalt den samme.
Men la oss prøve ut dette plassholder idé.
Husk at i C, heller i printf, hadde vi disse
plassholdere, og det er mer enn bare% d.
Så% d var rask tilregnelighet sjekk.
Ok, desimaltall, det er det.
Desimalsifre, det er alt.
Så% c, som vi vil møte, kommer til å være et tegn.
Sett en karakter her, en bokstav a til z,
eller tegnsetting symbol.
En enkelt karakter,% f, noen som vet fra andre språk?
Så et flyttall.
Et reelt tall.
Så det er ikke et desimaltall - dette er faktisk et reelt tall med
desimaltegn, og noen flere sifre til venstre
og høyre for det.
% S, streng.
Som vi kommer til å se ganske ofte.
En streng, igjen, er bare et ord, en setning, en sekvens av
individuelle tegn.
Og til slutt, LLD?
Så dette er mer av et hjørne sak.
Lang, lang desimal.
Så hvis du ønsker ikke bare et tall som er denne store, du
ønsker et større antall, er du nødt til å oppgi til
datamaskinen som det er av en bestemt størrelse.
>> Så la oss finpusse dette litt.
Snarere enn bare hardt kode i David, la meg litt
dynamisk si% s.
Så satt% s her, som er en plassholder for en streng.
Så la meg gjøre komma, og deretter "David" over her.
Nå er ikke alle som intellektuelt interessant,
fordi alt jeg har gjort nå er å lage virkelig mer arbeid for
maskinen.
Heller enn å fortelle datamaskinen gjør alt dette på en gang, er jeg nå
sier gjør dette og sette inn en streng her til slutt, komma,
her er at strengen.
Så dette er ikke en bedre forbedring, men det er minst
et skritt mot en mer interessant program.
Fordi nå, la meg gå videre og gjøre dette vinduet litt
større, la meg gå videre og kjør make hallo.
Og nå,. / A.out ikke fungerer, hvorfor?
Greit, nå det heter hei.
Så igjen gjøre, og også clang med a-o, omdøpt
program for å være noe mer interessant.
Og voila: Nå står det hei David.
>> Greit, fortsatt en dum program.
Så la oss nå faktisk gå tilbake hit og introdusere begrepet
av en variabel.
Ville det ikke vært fint om jeg kunne erklære en variabel
hvis typen er streng?
Og variabelens verdi kommer egentlig fra brukeren
ham eller henne selv.
Så vilkårlig, jeg kommer til å ringe min variable s, som er
bare en vanlig konvensjon når du har en variabel kalt
strengen.
Jeg kommer til å gjøre likhetstegn, og da kommer jeg til å kalle en
funksjon kalt GetString.
Så GetString er ikke noe som kommer innebygd i C. Det er
en funksjon som CS50 personalet skrev egentlig bare for
disse første par ukene, for å forenkle prosessen med
få brukerundersøkelser og få brukerens input i form
av strenger eller tall, og slikt.
Så GetString er som printf, men tydeligvis heller enn
skrive det kommer til å gjøre hva navnet sier, får en streng.
Men å bruke GetString, vi nødt til å gjøre en endring
her, utover dette.
Så intuitivt, dette programmet, forhåpentligvis, skal liksom
få en streng fra brukeren, og deretter hva det kommer til å gjøre
med strengen, kalt s?
Det er bare kommer til å skrive den ut, ikke sant?
Fortsatt ikke et stimulerende program fordi alt det som skjer
å gjøre er å plugge i den verdien i hvor% s
sier det skal gå.
>> Så la oss se minst dette i aksjon.
La meg spare og zoome ut.
Nå i min terminal-vinduet her nede, den lille bit av en,
la meg igjen gjør hei.
Ok, og ah, pokker, jeg fikk en hel haug med feil.
La meg rulle opp, og vi ser vår første -
så la oss faktisk gjør dette i en enda større vindu, slik at du
kan se hvor dårlig jeg skrudd opp -
så sørg hei.
Ok, det er en katastrofe, ikke sant?
Jeg har skrevet tre linjer med kode, og
Det har gitt meg 12 feil.
Så hvorfor er dette?
Så heldigvis, ofte når du ser mange, mange feil
spytter ut med en gang, det er egentlig bare fordi du har
forvirret maskinen opp her.
Og det er fortsatt forvirret av den tiden det kommer ned her.
Og så begynner det bare snubler, og snubler, og
spytter ut mer skremmende ting enn faktisk gjelder.
Så generelt, alltid starte med det øverste.
>> Så den aller øverste forekomst av rødt,
feilmelding er dette.
Bruk av svart identifikator streng, jeg
mener standard i?
Jeg gjorde ikke det.
Jeg mente streng, men dette er på grunn, også, ordet strengen
at jeg fortsette å bruke verbalt faktisk
finnes ikke i C heller.
Det er noe vi kommer til å bruke bare for den første uken eller to
her, men det finnes i en fil som heter cs50.h.
Så for nå, vet at det er denne andre bibliotek som
Personalet skrev, så det er blitt skrevet mer nylig enn
stdio.h.
Men innsiden av cs50.h er en definisjon, et synonym for
sorterer, skaper det dette ordet streng.
>> Så nå la meg gå tilbake til min terminal-vinduet.
Jeg kommer til å fjerne hele dette rotet ved Ctrl-L. Vi vil bare
tørk alt rent, og jeg kommer til å gå videre og gjøre
Hei igjen, Enter.
Så hva har skjedd nå?
Nå er alle disse feilene gikk bort.
Så hva har jeg egentlig gjort?
Jeg har nettopp lært datamaskinen som strengen finnes, og det er
i den filen som heter cs50.h.
Så stoppe klagende, fordi du nå vet hvor du finner
den funksjonen erklæring så å si.
Hvor det eksisterer i verden.
>> Så nå er jeg kommer til å gå videre og kjøre hallo.
Jeg synes å ha en uendelig løkke, ingenting skjer.
Så jeg trenger å skrive noe her, ikke sant.
Den første linjen med kode i programmet mitt var GetString.
Så det er bokstavelig talt venter for meg å få en streng.
Så i den forstand ja, det er en uendelig loop.
Tilsynelatende i GetString er standard oppførsel at vi
skrev - de ansatte -
som sier bare vente og vente og vente og vente og vente,
inntil brukeren gir deg en streng ved å skrive noe i.
Så la meg gå videre og skriv inn D-a-v - i-d, Enter.
Og det er det, hallo David.
>> Nå virker dette som det er bare en handling?
La meg gå videre og skrive Tommy.
Inn, ok, synes å bli arbeider.
Arbeider for Rob, arbeider for Zamyla, fungerer for - OK.
Så det kommer til å fungere, mest sannsynlig.
Så det bør skrive ut hva vi faktisk gi det,
og vi kan være litt vanskelig her.
La oss se om vi gjør noe sånt hello.
Kan gå over her, la oss se, kopiere, lime.
Jeg har ikke tenkt å være i stand til å lime det mange ganger her.
Lim, ok, Shift + Ctrl + V. Så hva kunne
skje det er ille her?
>> Ok, så segfaults.
Så noen av dere med tidligere bakgrunn vil vite at
generelt, noe som gir datamaskiner mange innganger når de er
sannsynligvis ikke ment å motta lange navn som dette - dårlig
ting skjer.
Faktisk, i en verden av nettet også, skjer dette ganske mye,
slik at når du designer en nettside, når du er
utforme Facebook, må du gjøre vilkårlige beslutninger opp
front, som hvor lenge vil noens
Facebook brukernavn være?
Eller hvor lenge vil noen fornavn være?
Hvor lenge vil noens telefonnummer være og lignende.
Og hvis programmerere gjør dårlige forutsetninger, programmer bryte
fordi du prøver å gi dem mer effekt, mer input
snarere enn de har hukommelse.
Eller RAM tildelt for det, og så hvis jeg nå trykker på Enter,
at programmet faktisk fungerte, fordi vi var på biblioteket
og vi faktisk forventet denne spesielle saken.
Men utvilsomt dette semesteret, vil du skrive minst én
program som vil si disse ordene.
Husk dette uker fra nå, kanskje to dager fra nå.
Segmentering feil er en dårlig ting.
Det vil se i å gjøre noe som datamaskinen
forutså ikke.
Og i så fall, du, programmerer, ikke hadde forutsett.
Mye som hva denne haug med sokker, det var ulike
hjørne saker vi kunne ha møtt.
Tilsvarende i programmer hvis du ikke forventer hvor lenge er
noens navn kommer til å bli.
Eller hva om jeg har en ondsinnet bruker, og hans eller hennes navn er
faktisk ganske kort, men de prøver bare
å rote med meg?
Hva kommer til å bli oppførselen av mitt program?
Vel, i så fall kan noe faktisk krasje.
>> Så la oss gjøre dette.
I 90 minutter er dette en forferdelig lang tid
å gjøre informatikk.
Hvorfor ikke vi komme inn i vanen med å ta en fem minutters
pause her, og når vi kommer tilbake, vil vi dykke inn i noen
mer komplekse og overbevisende programmer?
Fem minutter.
>> OK.
Så en rask kommentar.
Jeg fortalte at selv om dette var på skjermen før, hva
kom ut av munnen min var cs50.net/rsvp.
Dette er riktig. cs50.net/lunch.
Så nå kan du prøve RSVPing for dette på / lunsj.
Men la oss gjøre dette nå.
Så dette har vært super rask, super nytt for mange folk.
Gammelt hat for noen folk.
Så la oss spole tilbake for bare et øyeblikk, og se hvordan vi kom til
Dette hello world utgang bare et øyeblikk siden.
>> Så først, er det denne CS50 Appliance.
Igjen, stykke programvare, problem sett 1 kommer til å fortelle
deg hvordan du laster ned den, hvor du laste den ned, hva du skal klikke
og så videre.
Og så når du følger disse instruksjonene, vil du kunne
å maksimere vinduet, og en Mac eller PC vil se en
litt noe sånt som dette.
En svart bakgrunn, et hjem-mappe på toppen der alle
filene dine går, en papirkurv kan øverst til venstre,
en meny nederst.
Så igjen, ganske lik i ånden til Mac OS eller Windows,
selv om det skjer for å være Linux.
Så hva gjorde vi neste gjøre?
Vel, vi begynte å skrive programmer.
Og husker fra forrige uke at alt som trengs for å skrive en
Programmet er en enkel tekst editor,
som Notisblokk eller TextEdit.
Oppriktig, kan du også bruke Microsoft Word.
Men dårlige ting til slutt vil skje, fordi det er en veldig
hardhendte løsning for å skrive et program, pluss det vil
lagre den i feil fil format.
Men det er bare en tekst editor, en tekstbehandler, er alt som er
for å skrive et program.
>> Så i CS50 Appliance, kan vi gjøre dette på en enkel måte.
Vi kan bare klikke på dette ikonet nederst til venstre.
Og igjen, satt problem 1 vil råde deg om dette, og voila -
du får svart og hvitt grensesnitt hvor vi kan begynne
skrive kode.
Så la oss begynne å skrive en super enkelt program igjen.
Jeg kommer til å gå opp til Fil, Lagre, og jeg kommer til å ringe
dette, la oss si, hello2.c.
Og jeg bare forteller den ved å klikke på jharvard, legg den
i sin hjemmekatalog, jeg gjør egentlig ikke bryr
hvor dette går.
Og deretter Lagre.
Og nå kan jeg begynne å skrive mitt program.
Og jeg husker fra tidligere at jeg må skrive int
main (void).
Zoom inn på øverst til venstre.
Og da vil jeg si printf, ta to.
Og nå et linjeskift, nær sitat, lukker
parentes, semikolon.
Og så går jeg ned hit til min terminal vindu som er
innebygd i gedit, bare for enkelhets skyld.
Og jeg kommer til å gå videre og skrive gjør hallo, men ikke
hei alene, hello2.
>> Så min fil heter hello2.c. Filen min derfor
skal kalles hello2, i dette tilfellet.
Dammit, hva gjorde jeg galt?
All right, så jeg tydelig utelatt en linje, hvis du husker hva
tidligere programmer ser ut.
Men la oss se om vi ikke kan erte dette fra hverandre.
Dessverre har de fleste mennesker som skriver programmene som
vi skriver ikke programmer ikke forenkle ting så bra.
Så vi må slags skumme over hva som ikke helt gjøre
ane her og se om vi kan finne ut hva som er galt.
Den aller første linjen der sier implisitt erklære C
biblioteket funksjon printf med type int.
OK, jeg forsto en del av det.
Men det synes å være alluding til det faktum at jeg brukte printf
feil, liksom.
Og hvilken måte er det galt?
Jeg visste bare ikke lære datamaskinen som det er i en fil
kalt stdio.h.
Nå er det bare å bare huske nå at printf er
i stdio.h, og faktisk det vil være andre
funksjoner i den samme filen som vi blir vant til.
>> Så nå la meg gå videre og traff Ctrl-L å bare klart at
bort, kjører gjøre hello2, og voila.
Og denne kommandoen igjen, mer komplisert enn vi vil forklare for
dagens formål.
Men det ble kjørt clang, og clang tar kildekode og
spytter ut 0'er og 1'ere.
Og de 0'er og 1'ere i dette tilfellet kalles det?
Ok, objektkoden.
Og filen som de er i er kalt, så,
hello2, i dette tilfellet.
Fordi min tekstfil var hello2.c, Enter.
Og nå har jeg ta to utropstegn, utropstegn
punkt, utropstegn.
All right, så vi har nå muligheten til å få strenger,
tilsynelatende.
Vel, hva annet kan vi få fra brukerne?
>> Vel i CS50 biblioteket, det er andre funksjoner som
kommer til å forenkle våre liv i disse første dagene.
Getchar, GetDouble, GetFloat, GetInt,
GetLongLong, GetString.
Vel, la oss rive av den enkleste av disse først.
GetString gjør bokstavelig talt det.
Det sitter bare der og venter på at brukeren skriver noe i,
og så snart jeg skriver noe i og trykk Enter, det
gjør noe med den verdien.
Så la oss gå tilbake til det eksemplet for å se nøyaktig hva
GetString gjorde.
La meg gå videre og åpne opp i gedit, hallo.c, og husker
som rett før pause, er dette der vi slapp.
>> Så la oss nå erte dette fra hverandre i litt mer detalj.
Så på linje 6, er det to ting
skjer i øyeblikket.
Likhetstegnet skiller første halvår og andre halvår.
Så på venstre side av likhetstegnet, vi
sier streng s.
Og så, bare lekmann vilkår, hva er streng s
gjør, tror du?
Det er å skape en hva?
Så det er å lage en streng som heter s.
Nå hva betyr det egentlig?
Vel, det å reservere plass for en streng som heter s.
Det er ikke helt riktig.
Hva er dette å gjøre?
Vel datamaskiner, som dere vet, har harddisker, det er der
filene er lagret.
Datamaskiner har RAM, og det er der programmene er lastet
mens de kjører.
Så når du dobbeltklikker på et ikon og Microsoft Word åpner
opp, er Microsoft Word kjører, så å si, i RAM, som er
den elektroniske delen av datamaskinen.
Ikke det fysiske, mekaniske delen som er spinning, hvor
blir vanligvis lagret lang sikt.
Så streng s er ganske mye å fortelle datamaskinen gi meg
nok RAM til å passe en streng.
Nå det er en bit av en overforenkling, fordi
hvor stor er strengen skal?
Vel vi faktisk ikke vet ennå, så i ukene som kommer
vi vil faktisk trekke tilbake laget som er streng og
Vi vil fortelle deg hva det egentlig er.
Streng, for nå, er bare en fin forenkling av vår verden.
Men string s erklærer en streng kalt s, for nå.
Erklærer en streng.
Det forbeholder noen plass i RAM for strengen brukeren er
i ferd med å skrive.
>> La oss nå se på høyre side av likhetstegnet.
Så det sier GetString ().
Og en liten mental helse sjekk.
Det faktum at det er ingenting inne i parentesen
antyder hva om GetString?
Det tar ingen argumenter.
Det vil si, du kan ikke påvirke sin atferd på noen måte.
Hver gang du bruker den, vil det bli en streng og det er det.
Derimot, printf, forhåpentligvis sin oppførsel gjør
endres hver gang.
Ellers er det en ganske ubrukelig utskrift funksjonen hvis
det gjør det samme.
Hvis det skrives ut alltid David eller noe
vilkårlig hele tiden.
Så gjør printf fornuftig å ha et argument.
GetString ikke virkelig trenger et argument, fordi jeg ønsket
å få en streng fra brukeren, og det er brukeren som kommer
å forsyne dynamikk ved å skrive i ulike bokstaver
hver gang ved tastaturet.
>> Så hva gjør GetString gjør slutt?
Tenk på det som denne lille svarte boksen.
Og dette svarte boksen tar ingen inngang, men når du banke på
det, spytter det ut en streng som brukeren har skrevet inn
Og det faktum at det er et likhetstegn det betyr å ta
hva er spytte ut på høyre side og lagre den i
hva som skjer på venstre side.
Så likhetstegn her, er det faktisk ikke betyr
likestilling, det heller teknisk betyr oppdraget.
Ta verdien på høyre side, og sette den i
variabelen på venstre.
Så det er alt som skjer der.
>> Nå i linje 7, vi ringer printf.
Så printf forhåpentligvis blir litt kjedelig nå.
Så ut en formatert streng.
Hva streng?
Skrive ut, "h-e-l-l-o,% s
! \ N ".
Greit, så hva ønsker jeg å plug-in for% s?
Bokstavelig talt, hva er lagret i s.
Så i dette tilfellet, lite sunn fornuft sjekk, hvor mange argumenter gjør
printf ta?
Ok, jeg hørte en.
Jeg hørte en gang.
To, hørte jeg to.
Og hva med tre?
Ok, tre?
Utmerket.
Tre mulige svar, er bare én av dem riktig.
Så argumenter igjen påvirke atferden til en funksjon.
I det siste, gjorde printf bare ta ett argument.
"Hello World" var et enkelt argument.
Men nå, legge merke til hvor denne komma er.
Dette komma er utenfor sitat / unquote, noe som betyr
hei printf, her kommer et annet argument.
>> Så komma i de fleste programmeringsspråk
skill flere argumenter.
Så svaret her er definitivt ikke en, fordi
det er denne komma.
Så minimalt, er printf tilsynelatende tar to
argumenter denne gangen.
Men muligheten for et lurespørsmål her er hva
om dette komma?
Betyr dette at det er faktisk tre argumenter?
Dette, dette, og dette.
Så nei, fordi det komma er inne i anførselstegn, som
betyr at det er egentlig bare et estetisk av engelsk.
Det har ingenting å gjøre med antall
argumenter i dette programmet.
Så dette komma er utenfor de doble anførselstegn.
Og deretter tilbake 0.
For nå la oss bare slags ta dette på tro for
i dag, og bare vet at når funksjonene er ferdig utfører
linjer med kode, bør de generelt returnere noen verdi.
I dette tilfellet, bare fordi viktigste må returnere en int,
det er bare måten språket C fungerer.
>> Så fordi noe gikk galt, føles som dette programmet
fint, jeg bare hardkodet i retur 0.
Men i kontrast, og jeg kommer til å skrive dette i pseudokode
nå, gjorde mye som Josef da vi gjorde sokken
eksempel forrige uke.
Hvis noe gikk galt - dette er ikke selve koden - gikk
galt, og deretter gå tilbake, la oss si, en.
Else tilbake 0.
Så dette er hvor vi skal med dette.
Dette er ikke faktiske C-kode, bare pseudokode.
Men dette er hvordan du kan returnere
forskjellige mulige verdier.
Men for nå er jeg bare kommer til å gå videre og returnere 0.
Greit, noen spørsmål så langt på syntaks, funksjonalitet,
eller lignende?
Ja, i ryggen.
>> PUBLIKUM: [uhørlig]
DAVID MALAN: Kan du snakke litt høyere?
Hvorfor gjorde dette programmet return 0, og?
PUBLIKUM: [uhørlig]
DAVID MALAN: Å, det er fordi jeg fikk lat, beklager.
Ingen god faglig respons, returnere 0.
Jeg kan slags berge dette, ved å si teknisk C, hvis viktigste
ikke eksplisitt returnere en verdi, vil 0 bli returnert
automatisk for deg.
Som er sant, jeg er ikke bare dekker opp.
Men, jeg burde ha gjort det på denne måten.
Ingen interessant takeaway enn at andre enn min feil.
Ja?
>> PUBLIKUM: Vanligvis når du skriver i tomrommet, betyr at du
ikke tilbake noe.
DAVID MALAN: Riktig.
Hvis du i stedet angir du før navnet på en funksjon, for
forekomst her, ugyldig, deretter funksjonen
returnerer ikke noe.
Og derfor vil jeg bare si, retur eller ingenting i det hele tatt,
og det ville være konsekvent.
Og vi vil komme tilbake til det.
Og bare FYI, en av fangstene med å lære
programmering i en verden som har hundrevis av bøker og
hundrevis av nettsteder der ute er at du vil alltid
se annen syntaks i forskjellige bøker
av forskjellige personer.
Innser vi vil gjøre vårt beste i seksjoner og foredrag for å være
konsekvent.
Men noen ganger vil du se motstridende syntaks.
Så når du er i tvil, bare spør.
Og generelt, vil vi ta vare på forelesninger og seksjoner til
nesten alltid presentere det på den riktige måten.
Og jeg sier nesten alltid, fordi sak.
Andre spørsmål?
>> PUBLIKUM: Eksisterer% s utsiden av apparatet?
DAVID MALAN: Har% s eksisterer utenfor enheten?
Ja.
Så% s har å gjøre med C. Det faktum at vi bruker den i
apparatet har fundamentalt ingenting å gjøre med
funksjonene i språket vi bruker.
Faktisk, forrige uke da vi brukte min Mac, skrev jeg
C-kode på min Mac.
Jeg kunne ha brukt% s på min Mac, og du kan bruke den på
Windows-datamaskinen hvis du installerer en kompilator, som
Visual Studio fra Microsoft.
Så% s.
Alt vi gjør inne i dette vinduet i dag har til
gjøre med C. Og fundamentalt ingenting å gjøre med
operativsystemet i spørsmålet.
Derimot, den svarte og hvite terminal-vinduet - når
Jeg skriver ting som ls, og rm, og cd -
som har å gjøre med operativsystemet og
navigere rundt.
Ja.
PUBLIKUM: Jeg mente biblioteket, CS50 biblioteket.
DAVID MALAN: Ok, så hvis du mener søkeordet streng, at
bare eksisterer i CS50 biblioteket, riktig.
Som ikke finnes i C selv, og faktisk i et par
uker vil vi kaste bort CS50 biblioteket og starte
å gjøre ting fra bunnen selv, så å si.
Andre spørsmål?
Ja.
>> PUBLIKUM: [uhørlig]
DAVID MALAN: Godt spørsmål.
Er kommandoene store og små bokstaver?
Og la meg gjøre en forskjell her.
Så kommandoer er generelt de tingene vi skal skrive på
bunnen av vinduet, i terminal-vinduet.
Noe opp her vil være uttalelser eller C-kode.
Men i begge tilfeller, er svaret den samme, ja.
Begge disse miljøene, C kode øverst og
operativsystem kommandolinjen på
bunn, er case sensitive.
Så du må kapitalisere GetString med stor G,
kapital S. Du må skrive printf i alle små bokstaver.
Du må skrive ls i alle små bokstaver.
Så i nesten enhver situasjon dette semesteret, sak vil i
Faktisk saken.
Ja.
>> PUBLIKUM: [uhørlig]
DAVID MALAN: Ah, så greit, hva om vi hadde en fil
kalt hello.d.
Så det viser seg D er et programmeringsspråk.
Og så i noen tilfeller kan vi faktisk skrive et program i
filen og få den samlet på den måten.
Vi kan, og faktisk, korte svaret er, vet jeg ikke.
Så vi kommer til å gjøre dette.
La meg gå videre og opprette en ny fil.
Og spin her, ærlig generelt, er når noen tvil
dette semesteret, og du har apparatet eller datamaskinen
åpne, gå videre og prøve noe.
Så jeg kommer til å lagre en fil som heter hello.d.
Lagre dette.
Og jeg kommer til å kjøre gjøre hallo Enter.
Det syntes å antyde at c var mer sannsynlig
enn d, i dette tilfellet.
Andre spørsmål.
Ja.
>> PUBLIKUM: [uhørlig]
DAVID MALAN: Ok, si at når mer.
PUBLIKUM: [uhørlig]
DAVID MALAN: Hvordan vil du gå om diagnostisering som eller
feilsøking det?
Så mest sannsynlig, fordi de er forskjellige språk,
mest sannsynlig at du vil få en helt
annet program outputted.
Du vil få helt forskjellige feilmeldinger.
Og også bare i form av design, ville det uten tvil være en
dårlig design beslutning om å skrive to forskjellige
språk med nesten identiske navn filer, i
nøyaktig samme katalog, ved hjelp av en
automatisk verktøy som gjør.
Så jeg kan også trekke tilbake og si i 15 år med å gjøre dette,
aldri gjort den feilen.
Kunne skje.
Men det er bare forskjellige, tror jeg,
logistiske forsvar på plass.
Pluss feilmeldingene som ville følge, som ville
slutt avsløre hva problemet er.
Men en mulig hjørne tilfelle.
>> All right, så la oss introdusere bare et par andre
funksjoner her nå, så vi kan begynne å bygge opp i mer
og mer komplekst program.
Så først av alt, matematikk.
Så matematiske eksempler er bare slags lett i den første uken.
Dette er ikke å si at all programmering er om
matematikk.
Absolutt, forstå ulike funksjoner i
matematikk, algebra spesielt, er
ganske relevant her.
I høyere nivå CS klasser, lineær algebra,
kalkulus og lignende.
Men innser det meste av hva vi skal gjøre dette semesteret reduserer ikke
til matematikk, og absolutt ikke til aritmetikk, per se, men egentlig
å bare logikk og nøye tenking.
Og så denne koblingen som informatikk har lenge hatt,
spesielt på videregående skole nivå, med matematikk, er en
litt misvisende.
Fordi de fleste av programmene som vi skal skrive, egentlig, er
slags høyere nivå og fokus på å løse problemer som,
sikker, kan bruke noen addisjon, subtraksjon, og ulike
matematiske formler eller lignende,
men på slutten av dagen, det handler om å tenke og ikke
bare gjennomføre det du kanskje har gjort på som en TI
kalkulator i videregående skole.
>> Så med det sagt, la oss nå gjøre noe med disse
matematiske operatorer som finnes, slik at vi kan reise
over noen av de underliggende ved programmering, eller i
dette tilfellet C. Så det er, som CS50 biblioteket foreslått,
og i dag er vi bare bruker GetString - og i et øyeblikk
kanskje en annen funksjon -
men det er forskjellige datatyper i en datamaskin.
På slutten av dagen, datamaskiner vet bare 0'er og 1'ere.
Men husker at forrige uke snakket vi om det binære systemet
å representere tall, som tallet 0 og 1, og 2,
hele veien på opp til 8, som i Nates video.
Og så kan vi telle mye høyere som vi
gjorde på scenen her.
Men hvis du ønsker å representere ikke bare tall, men bokstaver,
vi, menneskene, måtte komme opp med noen vilkårlig
konvensjoner, der hvis på slutten av dagen i hele mitt datamaskin
har er evnen til å uttrykke 0'er og 1'ere, godt vi hadde bedre
begynne standardisere mønstre av 0'er og 1'ere som representerer
forskjellige ting.
Et mønster av 0'er og 1'ere som representerer bokstaven a.
Mønstre av 0'er og 1'ere som representerer bokstaven z.
Mønstre av 0'er og 1'ere som representerer fargen blå, eller
rød, eller lignende.
Vi må bruke alle disse 0'er og 1'ere å uttrykke oss i
forskjellige sammenhenger, i forskjellige måter som ikke er
nødvendigvis numerisk.
>> Så i form av representasjon, har C ulike datatyper,
og vi har sett en av disse så langt.
Vi så int, og legg merke til hva som er ikke er på skjermen
akkurat nå er streng.
String ikke, faktisk, eksisterer i C. Igjen, det er en
forenkling vi presenterer for første
par uker.
En røye er en individuell karakter.
En flottør er et reelt tall, med et desimaltegn og numre til
venstre og høyre for det.
En dobbel er hva, for de med tilbake før bakgrunn?
Så en dobbel er dobbelt noe.
Legger dobbelt så mye presisjon.
Så hva betyr dette?
Så i hver av disse tilfellene har verdens slags standardisert
hvor mange biter som brukes for å representere
hver av disse tingene.
Så hvis du har sett Nates ASCII video allerede for en del
av pset 0, eller senere denne uken vil du, vil du sannsynligvis vet
som ASCII -
karakter representasjoner -
bruke hvor mange biter?
Og du kan selv husker fra vår demo forrige uke om hvordan
mange mennesker var på scenen.
Så 7 eller 8, typisk.
Så 8 generelt, og det er noe som heter som utvidet
ASCII som bruker alle 8 bits, i stedet for 7.
Men generelt, snakker vi i potenser av 2, slik at i dette tilfellet, 8.
Så en røye i et programmeringsspråk er vanligvis 8 biter.
Så en int er generelt 32 biter.
En flottør er generelt 32 biter.
En dobbel er generelt 64 bits.
Og hva betyr det?
Det betyr at du kan representere større tall, eller i tilfelle
av reelle tall, kan du ha mye flere tall etter
desimal.
Mye mer presisjon, i så fall.
Nå er en lang lang er dessverre navngitt.
Så det er en int som er 32 bits.
Det er en lang som er, nope, 32 biter.
Og en lang lang som er 64 bits.
Men noen av dem er kontekstsensitive, det avhenger
hva slags datamaskin du har.
Så generelt, vil vi angir i en lekser eller i en quiz når
det teller faktisk.
Men poenget er at det er alle disse forskjellige
representasjoner her.
>> Så la oss faktisk dykke inn i et program.
Snarere enn å skrive dette fra scratch, la meg gå videre
og åpne opp fra dagens kildekoden - som alle er
online - hvis du ønsker å tinker rundt på nettet, eller avkastning på
Onsdag med apparatet på datamaskinen, instruksjoner
som vil koble på kurset hjemmeside.
Her er en super enkelt program.
Men det har en liten noe nytt på toppen som
vi ikke hadde før.
En hel masse blå linjer med tekst.
Så disse blå linjene representerer kommentarer.
Så det er ganske nyttig i et program for å kunne skrive
noen kommentarer til deg selv, eller til kolleger eller venner, eller
undervisning stipendiater, den slags beskrive hva som skjer i
denne filen, men har ingenting å gjøre med C-kode selv.
Ingenting å gjøre med programmet funksjonelt, det er bare
estetikk.
Så på den måten du gjør dette i C er du vanligvis starter
kommentarer med / *, og du ender dine kommentarer med
* /.
Og hvis du er virkelig anal og liker å tegne slags bilder,
så du ville sette en hel masse stjerner, vil du gjøre en
liten boks som dette.
Men ingen av som teller.
Det eneste som betyr noe er den aller første
og den aller siste.
Dette er det som kalles en multi-line kommentar.
Og det er bare menneskelig konvensjonen til ofte gjør stjernene og boksen
ting i som dette hvis du har mye ledig tid.
>> Så etter at du har skrevet i noen kommentarer, generelt, kommer
de faktiske guts av programmet.
Her er vår velkjente # include .
Og bare rask, dette er nødvendig eller ikke nødvendig?
PUBLIKUM: Nødvendig.
DAVID MALAN: Så det er faktisk ikke nødvendig.
Så hvorfor, skjønt, er det ikke nødvendig?
Så det er ingen printf.
Faktisk.
Alt vi gjør i dette programmet er matematikk.
Så jeg kan faktisk slette det.
Så du trenger ikke alltid å inkludere noe som helst
toppen av et program.
>> Så la oss forenkle dette litt.
Og nå merke til hva dette programmet gjør.
Ikke mye av interesse.
int x = 1.
Vel, hva er dette gjort?
Vel, tenker tilbake til den mentale modellen fra før.
Den venstre side av dette uttrykket gjør hva?
Skape rom for et heltall.
Så hvor mye plass?
Vel, skjedde vi å vite nå at det er 32 biter.
Tidligere var en streng teknisk 32 bits, men mer
på at det i fremtiden.
Men en int er 32 bits.
Så dette uttrykket på venstre her, int x bare sier hei
operativsystem, gi meg 32 biter av RAM -
ellers kjent som 4 byte RAM -
slik at jeg kan sette et heltall i det rommet.
Hva heltall ville du satt?
Vel, bare nummer 1.
int y får 2, gjør akkurat det samme selv om
nummer er større, i forhold til sin størrelse.
Selve nummeret er fortsatt bare 32 bits.
Det er bare mønsteret av biter er annerledes
Representerer en mot 2.
int z sier nå gi meg en annen 32 biter, kall det z, og sette
summering av 1 og 2 i det.
Så nå z er antagelig lagring verdien 3,
og deretter tilbake 0.
>> Nå er dette programmet, det gjør noe av interesse?
Slik at det faktisk ikke gjør noe interessant, i alle
forstand, fordi hvorfor? Det gjør litt matematikk.
Men det er ikke returnere svaret, ikke sant.
Den returnerer 0.
Det er ikke ut svaret.
Så dette programmet er fundamentalt verdiløse, som det
står nå.
Det gjør noe arbeid.
Det kommer til å ta litt flere sekunder, eller mikrosekunder, til
kjøre, men det er faktisk ikke gjør noe
nyttig for den menneskelige.
>> Så la oss faktisk nå åpne math2, hvor nå er jeg faktisk
utskrift resultatet.
Så dette også kan utledes fra våre tidligere eksempler.
Hvis jeg ønsker å gjøre noen enkle matematikk, int x = 1, y
= 2. z er en pluss to nå.
Hva dette kommer til å skrive ut åpenbart?
Bare 3.
Så rask tilregnelighet sjekk.
La meg flytte inn i denne katalogen.
Så cd source1m.
La meg gå videre og skrive gjør math2.
Ingen feilmeldinger kom ut, så la meg kjøre -
ikke a.out--la meg kjøre math2. Enter.
Og faktisk, skrives det ut tre.
Vel la oss ta en titt på en variant av dette.
I math3.c har vi nå dette eksempelet her.
>> Så dette er litt interessant.
Så i dette her, er svaret kommer til å få en delt 10,
og merker jeg har erklært det som en dupp.
Hvorfor vil jeg at det skal være en flåte?
Vel, det er en brøkdel.
Det kommer til å være et reelt tall.
Så det kommer til å bli 0,1, forhåpentligvis - 10%, i dette tilfellet.
Og hva gjør jeg da vil skrive ut?
Vel, dette svaret.
Vel, la oss erte disse fra hverandre først.
Så på venstre side, erklærer en
flyte, kall det svarer.
På høyre side, gjør en dividert med 10 og sette det
answer innsiden av variabelen.
Nå ser denne linjen litt mer kryptisk.
Men legg merke noen kjente funksjoner. % Betyr her kommer en
plassholder.
f betyr her er et flyttall, bare en ekte
nummer, noe med et desimaltegn.
0,2 betyr hva?
Noen som vet fra tidligere erfaring?
To desimaler.
Så vi ikke har sett dette før, men det er bare en måte å
trene litt mer kontroll over printf og
ordtaket ikke gi meg 30 poeng etter desimaltegnet,
i stedet gi meg bare to.
>> Og så la oss gå videre og kjøre denne.
Så sørg for matematikk 3, og nå la meg kjøre matte 3, Enter.
Og det er ikke riktig.
Vi synes å ha oppdaget vår første ekte bug.
Vel, kanskje jeg bare ikke ser godt nok etter.
Så la meg gå opp her, og la meg sette 20 desimal
punkt steder der.
Og la meg kompilere dette, må math3, kjøre.
Ganske sikker på at en delt på 10 er ikke 0..
Så hva er det som skjer?
Vel OK, så egentlig er det ikke har å gjøre med dette.
Det er en god tanke.
Dette er egentlig bare en tilfeldighet
at vi gjør dette.
Men bare for å bevise at dette ikke er det, vil jeg
returnere noe tilfeldig.
Ikke gjør dette hjemme, fordi det er bare galt.
Men gjør math3, la meg kjøre den.
Så har ingenting å gjøre med hva jeg er tilbake, har bare å gjøre
med hva jeg skriver.
Men jeg hørte det her nede.
Hva?
PUBLIKUM: Så vi trenger å skrive tallene i
divisjonen som -
>> DAVID MALAN: Ok bra.
Så vi trenger å skrive tallene som deltar i
divisjon her som flytpunktverdier selv.
Så problemet er her som før: C, som med mye
språk, har ulike datatyper.
Og disse datatyper, for eksempel, er disse her.
Og datatyper i spørsmålet her, når jeg skriver en og da jeg
Type 10, er trolig hva datatyper?
Så det er nok en int, ikke sant?
Det er definitivt ikke en flåte fordi det er ingen desimal
punkt eller noe sånt.
Så egentlig har jeg en int delt av et int.
>> Så interessant ting om matematikk og en datamaskin er at
Hvis du gjør divisjon med heltall -
1 delt på 10, er ja 0,1.
Men når du dele et heltall ved et heltall, den
Svaret må også være et heltall bare fordi, for nå.
Og hva er konsekvensen da?
Vel, lik hvis svaret er 1 delt på 10 0,1, hva
datamaskinen skal gjøre er har jeg ingen anelse om hvordan å
representerer 0,1, fordi det er et flyttall, ikke en
heltall, det kommer til å hogge av alt etter
desimaltegn og bare vise deg 0 i begynnelsen.
Og det faktum at det som skrives som et flyttall
verdi, det er bare et estetisk ting.
Det er fordi jeg tvinge datamaskinen til å skrive ut dette som en
flytpunktverdi.
Og faktisk har jeg erklært det som en dupp, men regnestykket er
skjer over her.
>> Så la meg faktisk fikse dette i en ganske enkel måte.
Hvorfor kan jeg ikke bare gjøre 10,0 og 1,0, men
teknisk jeg kunne komme unna med bare å gjøre en av disse.
Nå la meg gå videre og gjøre math3.
La meg gå videre og nå kjøre math3, Enter.
Og nå, oh boy.
Nå har vi et nytt problem helt.
Så bedre, rett, vi er nærmere 0,1, men hva tydelig er
galt her?
Med mindre vi har løyet for deg i år, ikke sant?
1 delt på 10 er faktisk ikke helt 0,1, så hva er
virkelig skjer her?
Vel du kan slags grunn gjennom dette logisk.
Hvis en datamaskin har bare en begrenset mengde RAM for å begynne
med, og faktisk en datamaskin bare bruker 32 bits for en
flytpunktverdi, står det til grunn at med en
endelig antall biter, 32 i dette tilfellet, ja, det kan du
representerer en masse ting.
Det er faktisk fire milliarder ulike verdier kan være
representert med 32 biter, 2 til 32, men det er fortsatt begrenset.
Så problemet er at det er et uendelig antall ekte
tall, ikke sant.
Hvis du gir meg et reelt tall, kan jeg alltid finne deg en
litt større, litt mindre, ved bare å tilpasse
tall som er etter desimaltegnet.
Så hvis du ikke har et uendelig antall bits, du
kan umulig representere en uendelig
antall reelle tall.
>> Så det er denne iboende unøyaktighet i datamaskiner, og
dette blir utløst over hele tiden, selv i de enkleste
programmer som dette.
Men også i noen svært reelle problemstillinger så vel.
Faktisk, la oss ta et øyeblikk å bare ta en titt på
noe som faktisk har skjedd i virkeligheten.
Vi vil se bare de første par minutter, og deretter
vi vil poste linken på nettet.
Men dette er testament til hva som kan gå galt, ganske
ærlig, i en svært tragisk måte når disse tingene er ikke
verdsatt eller bare vi mennesker gjør feil når det gjelder
slike gjennomføringen detaljer av moderne datamaskiner.
>> [Video spiller]
-Vi har nå tilbake til tekniske katastrofer på moderne Marvels.
Datamaskiner.
Vi har alle kommet til å akseptere de ofte frustrerende problemene
som går med dem.
Bugs, virus og programvare glitches er små priser til
betale for enkelhets skyld.
Men i high tech og høy hastighet militære og plass
program-applikasjoner, kan den minste problemet være
foredles til katastrofe.
4. juni 1996, utarbeidet forskere å lansere en ubemannet
Ariane 5-raketten.
Det var bærer vitenskapelige satellitter konstruert for å
etablere nøyaktig hvordan jordens magnetfelt
samhandler med solvinder.
Raketten ble bygget for den europeiske romfartsorganisasjonen ESA og
tok av fra sitt anlegg på kysten av Fransk Guyana.
>> -At om ca 37 sekunder inn i flyturen, først de
lagt merke til noe gikk galt, at dysene var
svingbare på en måte de virkelig ikke burde.
40 sekunder inn i flyturen, tydelig kjøretøy
var i trøbbel, og det er da de tok beslutningen om å
ødelegge det.
En rekke verneleder med enorm guts trykket på
knappen, sprengte raketten før det kan bli en
fare for offentlig sikkerhet.
>> -Dette var jomfruturen av Ariane 5, og
ødeleggelse fant sted på grunn av en feil innebygd i
rakett programvare.
>> -Problemet på Ariane var at det var et tall som
krever 64 bits til å uttrykke og de ønsket å konvertere den
til et 16 bits tall.
De antok at antallet var aldri
kommer til å bli veldig stor,
at de fleste av disse sifrene i 64 bit nummer var 0s.
De var galt.
>> -Den manglende evne til ett program for å godta
slags tall generert av en annen var i roten av
svikt.
Programvareutvikling hadde blitt en svært kostbar del av
ny teknologi.
Ariane 4 raketten hadde vært veldig vellykket.
Så mye av programvare laget for det ble også brukt
i Ariane 5.
>> -Det grunnleggende problemet var at Ariane 5 var raskere,
akselerert raskere.
Og programvaren ikke hadde stått for det.
>> -Ødeleggelsen av raketten var en stor økonomisk
katastrofe, alt på grunn av et minutt programvarefeil.
Men dette var ikke første gang datakonvertering problemer hadde
plaget moderne rakett-teknologi.
>> DAVID MALAN: Vi lar det bli med det.
Men dette er testament til hvor aktuelt med noen av
disse laveste nivået detaljer som vi har begynt å
utforske dag er.
Så selv om du får litt distrahert kanskje av noen av
syntaksen og arcaneness her, innser at over
Begrepet vi være fokusert bare på hvordan gjeldende dette er å
verdener langt utover CS.
Vi vil se deg på onsdag.