[Powered by Google Translate] [Electronic STATISKE LYDER]
ROB: Ok, så hva vi bare brakt deg til er CS50 Spaces.
ALI: Vent, vent tilbake.
Velkommen til avdeling!
ROB: Velkommen til avdeling!
ALI: Yay!
ROB: Supersection!
ALI: Jeg er Ali og dette er Rob.
Ok, nå skal vi forklare Spaces.
ROB: Så hva vi brakte deg til er CS50 Spaces.
Du skal bruke dette mye i seksjonene dine dette semesteret.
I utgangspunktet har vi allerede hadde du laste ned apparatet.
Og du kan tenke på CS50 Spaces som et webgrensesnitt snakke med et apparat
som vi har på noen server et sted.
Så du kan kjøre koden i dette grensesnittet, og vi vil
se hvordan du gjør ting.
Du kan også se på koden til andre mennesker i avsnittet, og -
ALI: Og som noen mennesker har funnet ut, kan du chatte folk på siden.
Og vi vil alle se det, også, så det er spennende.
Kom inn, kom og sitte.
Ta et sete.
>> ROB: Så deler er -
ALI: Nei, nei, kan dere komme.
ROB: Profiler kommer til å være mye mer interaktiv dette semesteret.
ALI: Å, han som -
Oh.
Ok, kult.
Så hvis dere bare kommer inn, kan du gå til denne linken hvis jeg kan få
der, akkurat der.
Vi kan egentlig ikke skrive det, fordi det er ikke styret plass, men denne linken
akkurat her, gå til den på datamaskinene, og du vil gå inn CS50
Mellomrom, som er en ganske kul ting.
Okay.
Har du et problem?
ROB: Så du kan finne problemene -
Vi må være i stand til å skrive dette et sted.
Så hvis du går til cs50.net/psets og dette er hacker supersection -
og du går inn i Hacker utgaven av pset en, se på spesifikasjonen
et sted nede på siden -
>> ALI: Så i utgangspunktet, mens Rob ser, hva vi skal gjøre i
seksjon i dag er det en del av problemene -
ROB: - på side åtte.
ALI: - kalt en del av problemene -
ROB: Seksjon for spørsmål.
ALI: Beklager, en del av spørsmålene.
Og de er det vi kommer til å gå over -
de er hva vi kommer til å gå over i dag i snitt.
Og vi kommer til å kode det på CS50 Spaces, og forhåpentligvis vil fungere.
Og vi kan bare snakke gjennom dem.
Og dere kan stille spørsmål når du føler -
>> ROB: Så dette blir å være en vanlig ting med de fleste psets.
Jeg tror med dette, sier du trenger ikke å levere disse spørsmålene i.
Men ideen er at disse spørsmålene blir satt på pset, og du kan komme
§ å ha disse spørsmålene besvart.
Eller hvis du ikke kommer til delen kan du svare dem på egen hånd eller få
hjelp på kontortid eller noe.
Men dette er spørsmål som er ment å prep deg for oppgaven.
Og på hacker utgave, kan mye av spørsmålene bare være om
utvide din nåværende CS kunnskap.
ALI: Jepp, ganske mye.
>> Ok, så er alle på CS50 Spaces?
Hei, kom inn
SPEAKER 1: Kan vi se hvilken nettadresse en gang til?
ROB: Ja, dette vil være lettere når du faktisk er i seksjonene dine, og
din TF kan bare sende deg nettadressen forhånd.
ALI: Yay, ta plass.
Det er seter her.
Fronten er ikke så ille.
Hva?
Så CS50 Spaces, vi får det.
Har noen noen spørsmål før vi kommer inn - hva?
ROB: Det er ikke engang noen kritt.
[Uhørlig]
ALI: Beklager.
Du kan bruke neglene?
Vi er i en svært low-tech rom for en svært high-tech klasse.
Ok, alle er slags gode?
Har noen fortsatt spørsmål om det?
Som jeg sa tidligere, vi kommer til å gå gjennom den delen av spørsmålene i
de pset spesifikasjoner.
Så det er bare et par problemer som vi kommer til å
kode opp i CS50 Spaces.
Er alle bra?
Okay.
Bra?
ROB: Har du en bærbar PC?
ALI: Du kan henge med Lucas.
Han sitter rett ved siden av deg.
Bonding tid.
>> ROB: Så starte med det første problemet?
ALI: Yeah.
Vi kan starte.
Vil du ha meg -
Jeg kan gå.
Så vil vi gå til pset spesifikasjoner.
Å, hvorfor er det -
ROB: Control.
ALI: Ok, så skal vi inn i svaret disse tingene også?
ROB: Oh, yeah.
Så -
ALI: Oh, gjorde alle se Roberts hovedrollen shorts?
Ok, kult.
ROB: Ja, jeg tror ikke vi nødvendigvis forventet at du skal ha
så det før du kommer til denne delen, men vi kan diskutere dem
problemer på forhånd, siden de er under den delen av spørsmål ting.
Så hvis du ikke har sett det, ikke bekymre deg.
De som har kan prøve og svare.
>> Så det første spørsmålet, hva er en pre-prosessor, hvordan inkludere #
forholde?
Så har noen svar på det?
Ali: Dere kan snakke ut om det.
Sikker, gå fremover.
SPEAKER 2: # include er noen forhåndsskrevne kode, og i stedet for
kopiere det og lime det i programmet, blant annet det ved å bare si,
den pre-prosessor vet at den er der, og at det skal legge det i
senere eller før noe annet skjer.
ALI: Ja, awesome.
Cool.
ROB: Så når du faktisk kompilere et program, er det pre-prosessor dette
første trinn.
Samling skjer i fire store skritt.
Så pre-prosessor er den første store, og det er denne fyren som går
gjennom og ser for alle disse hash symboler.
Og linjer som begynner med en hash, ser pre-prosessor på det og ser
hvis det kan behandle den.
Så # include forteller pre-prosessor for å se etter noen cs50.h
fil og bare kopiere og lime inn innholdet i denne filen.
Så du kan egentlig # include alt du vil, men det er stort sett kommer til å være
. H-filer.
Vi har ikke fått til # define ennå, så det gjør ikke noe.
ALI: Ja, vi bra på den.
Har noen spørsmål om det?
Vi er gode?
Neste spørsmål.
>> SPEAKER 3: På kort, det var noe med c også.?
Er det relevant eller er det irrelevant?
ROB: Om c med pre-prosessor.?
SPEAKER 3: Ja, det gjorde eller jeg gjør noe opp?
ROB: Så kort kan ha vært å vise pre-behandle denne filen og
. gi ut det til en annen c-fil, slik at du kan pre-behandle denne filen -
når du bare kjører ut, gjør hei eller clang hallo.c, gjør du alt
sammenstillingen i ett stort skritt.
Men du kan eksplisitt gjøre det i sine egne trinn.
Så først kan du pre-behandle den.
Så du kan kompilere, så kan du montere, og deretter kan du koble til.
Vi vil komme til disse andre.
Men pre-prosessering, slag du av pre-prosess det, og så går inn i
en annen. c-fil.
Fordi pre-prosessering ikke endres virkelig noe.
Det er bare en haug med kopiere og lime.
Du kan manuelt kopiere og lime det selv.
ALI:. Og for å være klar, er c-fil en C-fil, så det er
skrevet i C-kode.
Så det kommer fra C-kode til C-kode.
Du bare legge mer kode med pund.
ROB: Når du pre-behandlet det, er det fortsatt en gyldig C-fil.
SPEAKER 3: Ok.
ALI: Godt spørsmål.
Jeg liker det.
Ok, neste spørsmål.
>> Hva er kompilatoren?
Anyone?
Ja.
SPEAKER 4: Det endrer pre-behandlet kode i forsamlingen.
ALI: Perfect.
ROB: Ja.
ALI: Cool.
ROB: Så det er hva kompilatoren gjør spesielt
når vi bruker Clang.
I en svært generell forstand, er en kompilator akkurat som å ta kode på ett språk
og snu den til et annet språk.
Så i C -
eller, vel, er Clang tar koden som er i C og omgjøre det til montering.
Og du trenger ikke å være i stand til å forstå sammenstillingen hele tatt.
Men det er det språket som det er å snu det til.
>> ALI: Ok.
Og så, hva er en assembler?
Anyone?
SPEAKER 5: [hørbar] til binær?
ALI: Beklager, hva?
SPEAKER 5: [hørbar] til binær?
ROB: Jepp.
ALI: Ja.
ROB: Så assembler -
assemblykode er virkelig, virkelig nær til hva datamaskinen kan forstå,
men husk at det ikke helt forstår teksten
som er assemblykode.
Du må konvertere den til rett 1s og 0s.
Det er som en direkte oversettelse prosess.
Vi kunne bare gi deg en tabell som kartlegger hva hver
monteringsanvisning betyr.
Men assembler bare gjør dette oversettelse for deg.
Det transformerer assemblerkode inn 1s og 0s.
>> ALI: Og så, for den siste, hva er en linker?
Og hvordan-lcs50 forholde?
Anyone?
ROB: Dette er den vanskeligste og minst forklarte en i kompilatoren video.
ALI: Er det noen som husker seeing-lcs50 i en kommando?
SPEAKER 6: Når du gikk til gjør.
ALI: Det er i make.
Ja, kult, ok.
Er det noen gjetninger eller vage - ja, gå.
SPEAKER 7: Jeg er ikke sikker, fordi kort var virkelig [uhørlig], men det var
noe om å gjøre separate filer med hvert bibliotek og deretter sette
dem alle sammen i ett bibliotek?
ROB: Ja.
Så når du har hallo.c, er det en veldig enkel program.
Du er virkelig bare gjøre en ting i den.
Men når du kommer inn i andre programmer -
og jeg antar selv når du GetString i programmene dine, må du starte
inkludert andre filer.
Så CS50 biblioteket er en slik fil som vi har implementeringer
av GetString og GetInt og alle disse tingene.
Så hva linker gjør er det går rundt og leter gjennom alle disse
filer, se hvor funksjonene er definert, og pass på at når jeg ringer
GetString sted, vet den at GetString betyr at det er den
GetString over i CS50 biblioteket.
Så linker tar bare alle disse filene, knuser dem sammen, og nå
du har en kjørbar.
Så husk, hvis du bruker CS50 bibliotek, må du både
# Include øverst, og deretter også i make-kommandoen, som du
sa du må ha-lcs50.
Så du kan ikke bare ha en.
Så det er bare noe å huske på for fremtidig referanse.
>> SPEAKER 8: Så, la oss si at det var et annet bibliotek, som cs51.h, ville vi
også legge til-lcs51?
ROB: Den eneste grunnen til at dette-lcs50 fungerer perfekt er fordi vi har det settet
opp på et bestemt sted i dine apparater, slik at den vet hva
-Lcs50 midler.
Vi kunne bare gi deg en cs50.c fil, og deretter kan du kompilere det, sier
Clang hallo.c cs50.c, og så ville det være en kjørbar ved å sette
disse to filene sammen.
Det vet at-lcs50 betyr cs50.c over i en katalog som vi angitt i
dine apparater.
Så hvis du ønsker en cs51.c å være specifiable ved å bare si-lcs51,
så vi må også sette den i den katalogen slik at den vet hvor du skal
lete etter den.
ALI: Hva var spørsmålet ditt?
>> SPEAKER 7: Hvorfor må du koble CS50
hvis - wasn't den kopiere / lime på det første trinnet når du pre-behandlet det?
ALI: Vil du ta den?
ROB: Sure.
Så cs50.h filen er atskilt fra cs50.c C-filen.
Har du fått å fungere prototyper i klassen?
Okay.
Så i utgangspunktet er cs50.h filen bare kommer til å kopiere og lime inn -
ALI: Har dere vet hva signaturer er?
Ok, så ganske mye, hvis du ser på -
ROB: La oss late cs50.h er ikke der.
Nå er denne filen -
du gjør streng s = GetString.
Men når vi har kommet til dette punktet i koden, har det ingen anelse om hva
GetString er.
Det vet at det er en funksjon, siden du kaller det.
Men det vet ikke at det faktisk ment å returnere en streng.
Så som jeg sa, string s = GetInt, dette gjør ikke noen mening, siden
du signerer et heltall til en streng.
Men det trenger ikke vite at GetString fornuftig, fordi den ikke
vet at GetString returnerer en streng.
Så hva cs50.h sier er noe sånt som dette.
ALI: Så hva Rob er å skrive er, er det et løfte på en måte at det kommer til å
har denne funksjonen kalles GetString.
ROB: Dette er alt som cs50.h er å kopiere og lime inn her, så vel
som GetInt og alle disse tingene.
Og dette sier bare at GetString ikke tilbake en streng.
Du vet ikke hvordan det er implementert ennå, men når vi kommer til denne linjen, nå
det vet at det riktig returnerer en streng.
>> SPEAKER 9: Så hvis vi ikke bry deg med # include ting og i stedet
bare skrev prototypen for de som vi faktisk kommer til å bruke?
ROB: Yeah.
Så la oss kjøre dette.
SPEAKER 9: Er det?
Så, som standard, vil den gjøre-l til CS50 bare fordi -.
ROB: - uttrykk.
ALI: Ja, fordi som du sa, det er i make-filen.
ROB: cs50.h skjer også å være typedef char * til streng.
Du kan helt ignorere hva det betyr for nå.
Men det er også noe med i cs50.h.
Så nå er ting fungerte helt fint.
Det kjører nøyaktig det samme som den var da vi bare hadde
# include.
Og så inkludert cs50.h skjer med over-inkludere ting du trenger -
liker, trenger du ikke bruke GetInt i dette programmet, men det spiller ingen rolle.
Det vil bare ignorere det.
ALI: Og så når du gjør-lcs50 over her og her, hva skjer
på er at det er å ha den faktiske gjennomførbar koden.
Så det er der det faktisk er, gjør det -
skrive koden for GetString.
Så det er ikke bare et løfte lenger.
Det er faktisk kommer gjennom og ta strengen og alt det der.
Fornuftig?
Spørsmål? OK.
Cool Beans.
>> ROB: Nå kan vi gå videre til selve koden.
ALI: Ok.
Så her er første problemet.
Så det sier skrive et program som ber brukeren om en liten
brev og konverterer den til store bokstaver uten å bruke bitvis
operasjoner, som per prøven utgang nedenfor.
Så du kan se, kjører du programmet med. / A.out, og så er du
kommer til å sette i små a, og deretter programmet skal gi ut kapital
A. Så hvorfor ikke dere alle gi den en sjanse på CS50 Spaces?
Så dere kan alle gå her.
Og du kan slette all koden her.
Og så kan du gå videre og begynne koding tingen.
ROB: Du vil sannsynligvis ønske å bruke getchar, det er
inkludert i CS50 biblioteket.
ALI: Jeg antar det kan være bedre hvis du lagrer den øverste delen.
Så vil du kanskje å bare endre ting i midten.
Gå videre og arbeide.
Føl deg fri til å arbeide med hverandre.
ROB: Og du kan stille spørsmål hvis du har -
>> SPEAKER 10: Hva er en bitvis operasjon?
ROB: Så ignorere det for dette problemet.
ALI: Hvis du ikke vet det, det er bra.
ROB: Vi kommer til å bruke den i det neste problemet.
Men hvis du ikke vet hva en bitvis operatør er, er det helt greit.
SPEAKER 10: Er det som å skru det til ASCII-kode?
ALI: Nei
ROB: Nei
Du kan gjøre det på dette problemet.
SPEAKER 10: Hvordan gjør man det?
Så hvis jeg bare hadde et sted å skrive -
ALI: Eller noe å skrive med.
ROB: Jeg kunne bare slags type i dette.
ALI: Type på toppen.
ROB: Åh, jeg sitter på en mikrofon.
>> Så så vi i foredraget at ASCII-verdien for kapital A er 65 år.
Og kapital B vil være 66, og så videre.
Så du kan bokstavelig talt bruke 'A' til å bety nummer 65.
Liker, er dette verdien 65.
Jeg kan gjøre noe sånt int x = 100 - 'A'. Og nå x vil ha verdien
100-65.
ALI: Du kan kjøre den og vise det.
Oh, kanskje ikke.
Bare hyggelig.
ROB: Jeg måtte skrive den.
SPEAKER 10: Hvordan slår du den tilbake til karakter?
ALI: Så hvis du må få med -
du bare tvinge den til å være røye A, er lik.
ROB: Så det er en -
skillet mellom en røye og et heltall er bare i forhold til størrelse.
Så et heltall skjer å kunne representere ting opp
til, liker, fire milliarder kroner.
En røye er bare i stand til å representere ting opp til 255.
Men det er ingen forskjell mellom dem enn dette.
Så du kan si char c = 65.
Det er samme som å si char c lik 'A'.
ALI: Å, nei.
Det faktisk ikke lagrer ting.
ROB: Nei, du kan ikke gjøre det.
ALI: Det er bare -
[Stønner]
>> ROB: Ok, så hva Ali nettopp skrev var et program som først skriver 100 -
'A' som et heltall, som var 35, som vi forventer, fordi 100 minus ASCII
verdien av A er 65.
Så hun skrives ut ved hjelp% c, noe som betyr tolke det som en char.
Så 100 - en er 35 år.
Tolking at som et tegn skjer for å være hash symbolet.
Hvis du ser på asciitable.com eller hva, vil du se at 35 er
hash symbol.
ALI: Ok, noen andre avklaringer om problemet?
Ok, kan dere gå videre og gjøre det da.
Føl deg fri til å stille spørsmål eller snakke med hverandre.
Eller hvis du allerede har gjort, kan du slappe av.
>> LUCAS: Er de samme klasse, alle små bokstaver i orden og
også store er også i orden, fordi det er noe nyttig for
problemet.
ALI: Godt poeng, Lucas.
Så gjorde dere alle få det?
SPEAKER 11: Ja.
Det er hvordan du gjør det, ikke sant?
ALI: Høyre.
ROB: Yeah.
SPEAKER 11: [uhørlig]
ALI: Greit.
ROB: Hva er spørsmålet spør?
Bare for å konvertere -
ALI: Konverter små til store bokstaver.
Det var det.
ROB: Ok.
ALI: Bør vi skrive det?
Jeg tror vi bare ser på andres.
ROB: Så for de som kan bli sittende fast, en måte -
hvis jeg har noen char c, og la oss si det skjer for å være bokstaven D.
Så nå hvordan kan jeg finne ut hvilken bokstav i alfabetet C er?
Ikke D, men jeg mener, skjer D for å være den fjerde bokstaven i alfabetet.
Og hvis vi begynner å telle fra 0, så er det den tredje bokstaven i alfabetet.
Så hvis A er 0, er B 1, C 2, D er 3, hvordan kan jeg finne ut int posisjon -
hvilken posisjon av alfabetet C er i?
Har noen noen ideer?
ALI: Jeg tror de all koding.
ROB: Hva om den første?
SPEAKER 12: Så uansett hva A er, trekker den første?
ROB: Yeah.
ALI: Ja, awesome.
Så du kan gjøre kapital D -
oh, sorry.
Du tar karakter og du trekker den første, som du sa.
ROB: Så hvis D er noe som 68, og vi trekker A, som er 65 år, så vi får
3, forteller oss at D er den tredje bokstaven i alfabetet
fra 0.
Så du kan bruke det.
Nå vet vi hvilken bokstav i alfabetet, i form av
store bokstaver, eller -
vi kunne gjøre det samme for små bokstaver for å finne ut hva
små bokstaver posisjon vi er i.
Og vi kan bruke det til så konvertere til store bokstaver ved hjelp av en
svært lik idé.
Be om forslag?
>> ALI: Har dere - vent, jeg vet ikke hvor langt dere er.
Er de fleste av dere gjort, er du fortsatt virke, er du fast?
Dere kan rope ut -
fast.
En person sitter fast.
Cool.
Jeg pleier å bli sittende fast, også.
SPEAKER 13: jeg er ferdig.
ALI: Du er ferdig?
Okay.
Ferdig.
SPEAKER 13: [uhørlig]
ALI: Ja, kult.
Er du sjekke at det er i små bokstaver form?
Ok, kult.
Hvor er andre mennesker?
Gjorde dette tipset hjelpe deg, som for un-stikker deg selv?
SPEAKER 14: Ikke egentlig, men bare fordi jeg vet ikke, jeg er ikke
bearbeider det ennå.
ALI: Ok, kult.
Vil du prøve -
eller ønsker du å gå og snakke?
>> ROB: Hva jeg skulle si er -
bruk dette.
Forstår du hvordan vi fikk det posisjon i alfabetet
brevet er i?
SPEAKER 14: Ok, så når du setter ting i ett sitat,
som returnerer et tall?
ROB: Ja.
Det vil bli oversatt til ASCII-verdien den representerer.
Så har du lyst til å gå til ASCII-tabellen eller hva det er?
ALI: Bare en av disse?
ROB: Jepp.
Så når du sette noen av disse symbolene, ignorerer mye av -
ALI: [uhørlig]
ROB: Oh, ved hjelp av markøren.
ALI: Yeah.
Det var spennende.
ROB: Så ignorerer disse seg på venstre side, som er spesielle symboler -
hvis du setter noen av disse symbolene i enkle anførselstegn, så vil det være
oversettes til denne verdien på venstre side.
ALI: Dette er desimaltallet for det.
Det er som en kamper med 65, B til 66, og du vil merke at de er alle i
alfabetisk rekkefølge, noe som gjør en forskjell.
Så, som Rob sier, før, ved at koden, ble vi beregne avstanden fra
den første bokstaven, per se.
Og det vil være den samme, enten det er store eller små bokstaver.
ROB: Så når vi gjorde D, 68 minus A, 65, får vi 3.
Fordi D er tre posisjoner i alfabetet.
ALI: Så hvordan vil du oversette det over til å finne den lille d?
ROB: Yeah.
Så hvis jeg har 3 nå, jeg vet jeg vil gå tre bokstaver i -
vi måtte gå små nå, men la oss si jeg ønsker å gå tre
posisjoner i små bokstaver siden av ting.
Så hvordan kan jeg gjøre det?
Jeg vet små bokstaver en er 97.
Så hvordan finner jeg tre posisjoner i de små bokstaver?
>> SPEAKER 15: Jeg har ett spørsmål faktisk.
ALI: Ja, gå videre.
SPEAKER 15: Så for dette, betyr det egentlig ingen rolle om jeg vet denne posisjonen,
liker, jeg trenger ikke denne tabellen.
ROB: Nope.
Du vil aldri trenge å bruke noen av disse tallene.
Og dette er et viktig poeng i programmene dine at du bør aldri vanskelig
kode noen av disse konstantene.
Bruk 'A'. aldri bruke 65 eller 97.
ALI: De kalles magiske tall, og de er veldig forvirrende.
Som, når du feilsøker en kode, kan du ikke huske hva
du brukte dem for.
Og for oss gradering koden, vil vi ikke egentlig vet hva
du bruker dem for.
Så det er bedre hvis du faktisk bruke tegnene så det gjør
mer fornuftig for folk.
Ok, noen andre spørsmål?
Er flere mennesker gjort, eller -
Jeg tror vi kan kontrollere.
Det er virkelig skummel som du kan se folks kode.
ROB: Yeah.
Vi trenger ikke å gjøre det her.
Vi vet ikke folks navn, heller.
ALI: Oh yeah, vel det gjør det bedre, så vi vil være enda mer objektivt
i stedet for bare tilfeldig plukke noen.
Ikke bekymre deg.
Jeg vil ikke gjøre det.
Hvis du har tilfeldige ting om - never mind.
Okay.
Hvordan er folk gjør?
>> SPEAKER 17: Så den niende linjen skal skrive ut et tegn?
ROB: Ja.
ALI: Yeah.
Så hvis du går ned -
ROB: Oh, kan ikke gjøre det.
ALI: Du vil se at det skrives hash symbol.
SPEAKER 17: Oh, okay.
ROB: Jeg antar en annen måte du kan se på ting er vi skrive ut på begge
tegn.
Første vi skal skrive er bokstaven A.
Den neste vi skal skrive er bare 65 år.
Det vil sannsynligvis kjefte på meg for disse.
Så hvis vi bare kjøre dette, vil du legge merke til at det skrives ut A begge ganger.
Fordi vi ber det samme.
Vi ber det å skrive bokstaven A. Og så vi ber det å skrive ut
nummer 65 tolket som et tegn, som er den samme.
ALI: Har du noe å si?
Oh, bare tuller, beklager.
Greit, hvordan er folk -
ROB: Vi kan bare gå gjennom den.
>> ALI: Ok, så hvordan begynner du?
Anyone?
Som et hint, må vi få noe fra folk, fra typers.
SPEAKER 18: [uhørlig]
ALI: Oh yeah, en rask, perfekt.
Så vi vil skrive -
hva skriver vi?
Anyone?
Eller skal jeg bare skrive det?
Vi faktisk skrive -
ROB: Sure.
ALI: Så vi vil skrive en printf til å be det, så vi kan være
liker, gi meg et tegn.
Ok, og hva så?
Hvorfor er det å gjøre det?
ROB: Jeg vet ikke.
ALI: Ok.
Så nå er vi fortelle dem til å gi oss et tegn.
Men så hvordan kan du faktisk få det tegnet?
SPEAKER 19: Bruk GetString.
ALI: GetString?
Getchar?
Ok, så hva er forskjellen mellom en streng og en røye?
SPEAKER 19: Strenger er en serie, som en rekke av tegn.
>> ALI: Cool, ja.
Så i dette problemet, vi trenger bare å vurdere ett tegn om gangen, så
vi bare kommer til å gjøre getchar for denne forekomsten.
ROB: Vi kunne iverksette en funksjon hvis vi ønsket som tok en hel streng
og gikk over strengen og endret alle små bokstaver til store og hele
store bokstaver til små bokstaver.
Men her er vi bare spørre deg om ett tegn.
ALI: Så nå har vi tegnet her, men da må vi lagre det.
Så da vil vi legge røye c - hva?
SPEAKER 20: Definer variabelen.
ALI: Ja, akkurat.
Så vi har vår karakter.
ROB: Jeg tror du kan være -
du er bare tre plasser i, og det er derfor det er roping på deg.
>> ALI: Ok, kult, nå som vi har tabbe sett, hva skjer videre?
Hva er neste steg?
ROB: Hva vår programmet skal gjøre er å endre en liten bokstav til en
stor bokstav.
Hva hvis jeg måtte gå inn i hash symbol?
Er det -
ALI: Det er et godt symbol.
Vi bruker det mye.
ROB: Er det en gyldig ting jeg kan konvertere til en stor form?
SPEAKER 21: Nei
ALI: Nei
Vi bør sjekke det.
Så kan vi ha en hvis setningen sjekker så hvis c er større enn
eller lik små 'a'-
så hvis vi ser på diagrammet, vil du legge merke til at det må være mellom her,
på 97, og den lille en.
Og det kan være en hvilken som helst av disse, og i trinn helt ned.
Og så er det z på 122.
Og det har å falle mellom disse to verdier.
Gjør det fornuftig?
ROB: Så hvis c ikke er mellom 97 og 122 -
eller du aldri skulle ha behov for å bruke disse tallene - hvis c er ikke mellom 'a' og
'Z' så var det ikke et gyldig tegn for oss til store bokstaver.
ALI: Så i koden form, sier vi at dersom c er større enn eller lik én
Ved små -
wow, hvordan fikk du det?
Ok, er større enn eller lik små 'a', og det må være over
små bokstaver 'z. Så det må være mindre enn eller lik små bokstaver 'z'.
Vi gjør at det er mellom de to.
Da kan vi fortsette med vår glade kode.
Hva?
ROB: Så jeg skjønte vi ville bare fortsette å spørre, hvis vi måtte ikke ha en
liten bokstav.
ALI: Å, jeg var ikke klar over det.
Unnskyld.
>> Ok, så hvis vi skal gjøre som Rob sier, og sørge for at -
Vi kan fortsette å spørre dem, så hva skal vi gjøre?
SPEAKER 22: [uhørlig]
ROB: Yeah.
Vi bør bruke noen form for loop.
Fordi brukeren kan skrive noe ugyldig et uskrevet antall ganger.
Så du kan bruke en stund loop.
Hensikten med en do-mens loop -
bokstavelig talt, den eneste gangen i hele livet du noensinne vil bruke do-
mens sløyfer er når du ber om brukerens input.
Så det faktum vi ber om brukerens input her er et hint om at vi burde
bruke en do-mens loop.
Og hvorfor er det?
Fordi do-mens loop alltid skjer minst én gang.
Så når du spør etter brukerens input, vil du at det skal skje minst en gang.
Og så hvis ting var vellykket, kan du holde det gående.
Hvis ikke, gå tilbake og spør igjen.
>> ALI: Så med andre ord, har vi å gjøre delen.
Og så dette er å fortelle det til å gjøre noe.
Så printf -
skrive ut erklæringen, spørsmål, og også få tegnet, eller forsøke å
få et tegn.
Og så må vi sjekke om det faktisk gjorde det riktig.
Så vi legger forholdene, så sier vi stund, og så har vi
betinget utsagn.
ROB: Men nå har vi snudd tankerekken.
Nå er vi opprinnelig sa om c er i dette området, er det gyldig.
Nå ønsker vi å snu det og si hvis c ikke er i dette området, så vi
må tilbake for å gjøre ting igjen.
ALI: Oh, yeah.
ROB: Så mens dette ikke er sant, vi ønsker å gå tilbake og
be om en annen karakter.
Ser alle det?
Spørsmål om dette?
Okay.
>> Så nå har vi en gyldig tegn på at vi kan store bokstaver.
ALI: Så hva neste skritt for uppercasing det?
SPEAKER 23: Legg 32.
ALI: Du legger -
Unnskyld, hva?
SPEAKER 23: Kan du ikke bare legge 32?
ROB: Så ja, ikke i form av magiske tall.
Du bør bare bruke én quote ting.
SPEAKER 23: Ok, vel -
ROB: Men du kan få 32 -
ALI: Hvordan fikk du nummer 32, antar jeg, er hva vi sier.
SPEAKER 23: [uhørlig]
ROB: Så vi kan komme opp med nummer 32 sammen -
SPEAKER 23: [uhørlig]?
ROB: Yeah.
Men hvis vi kommer til å gjøre det i to trinn vi gjorde før med
stillingen ting.
Så posisjon i alfabetet som c skjer for å være er c minus små
'A'. Så hvis vi gikk inn i en liten 'd', er posisjonen kommer til å være tre.
Og nå ønsker vi å ta ting til store utvalg av ting.
Så nå vår nye c kommer til å bli hovedstaden 'A' pluss posisjon.
Så folk ser hvordan det bringer oss -
vi flytter fra små utvalg, nøyaktig dybde vi var i det
rekkevidde, og går ned i store utvalg, og går så langt
inn i det igjen, som er tenkt å være den samme karakter, men nå
uppercased.
ALI: Og for mennesker som ble forvirret av hvordan han sa 32,
utgangspunktet kombinerte han begge disse inn i en uttalelse.
Så en tilsvarende måte å skrive dette å si at du kan bare slags
erstatning posisjon, c minus 'a' og sette det rett her.
Så hva han gjorde, lkke I -
røye Newc = store 'A' pluss c minus små bokstaver 'a'. Og på grunn av algebra,
du kan flytte dem rundt.
Du kan også si at du kan flytte den rundt så røye Newc = store 'A'
minus små bokstaver 'a' pluss c.
Og dette, vil du legge merke hvis vi går tilbake til diagrammet.
Vi har store bokstaver A er 65 og små bokstaver en er 97.
Så 65-97 er -32.
>> Hei.
Ta et sete.
Oh.
Du kan sitte her.
Cool, ok, awesome.
Velkommen til avdeling.
Du vil merke at forskjellen er 32.
Så det er der han fikk det nummeret.
Men det er ikke, som Rob sier den beste måten å gjøre det, fordi det har merkelig
magic number forvirring.
ROB: Du bør bruke kapital A minus små bokstaver en.
Du bør ikke bruke bare rett 32.
SPEAKER 24: Hvorfor er det igjen?
Hvorfor bør du ikke bruke 32?
ALI: Hvis vi gjorde det, ville det være røye Newc = -32 + c.
Og hvis du ikke ser noen av resten av det, hvis dette er alle borte, og du
bare se dette enkelt linje, så hvordan vet du hva den negative 32 er?
Det er bare malplassert.
ROB: Så programmet ville fungere helt fint.
Det er bare en stil ting.
Noen går inn og leser koden, de er som hva betyr 32?
Kanskje de lkke -
Jeg ville sannsynligvis ikke umiddelbart innse at 32 skjer for å være
Forskjellen mellom en liten bokstav og en stor bokstav, selv om
Vi kommer til å bruke på dette i neste problem.
32 er -
du kan la en kommentar ovenfor det å si 32 er forskjellen mellom
'A' og 'en. Men på det punktet, hvorfor ikke bare bruke 'A' og 'a', og du
trenger ikke kommentaren da.
>> ALI: Det er bare måter ovenfor det er mye renere, stil-messig.
Og så, siden du bare starte programmering -
eller jeg tror ikke, siden du er hacker edi - never mind.
Det er bare en god måte å ha -
det er bedre å ha bedre stil.
Det er lettere for andre å lese.
ROB: Du bør aldri trenge å huske ASCII-tabellen, noensinne.
Du bør bare være i stand til å bruke de enkle anførselstegn.
Spørsmål?
ALI: Alle gode?
ROB: Ok.
Så neste problemet er betydelig.
Så neste problemet ber oss -
ALI: Det neste problemet ber for oss å gjøre det samme, men å bruke
bitvis operatører.
ROB: Og selvfølgelig har vi ikke sett bitvis operatører ennå.
Så vi vil nå diskutere disse.
ALI: Være glade.
De er super gøy.
>> ROB: Så de vanlige operatører, som x pluss y, minus, ganger, divide.
ALI: Skriv det i denne meldingen.
ROB: Det er også%, hvis du ikke har sett det, som du kan bruke ved
prosent symbol.
Men vi vil ikke bruke dem for dette problemet.
Vi ønsker å bruke bitvis operatører.
Nå husk, vi tok det opp på forelesning ett.
Jeg er ikke sikker på om vi har diskutert binær utover det.
Men husk at hver enkelt tall er representert -
vel, alt -
er representert i 1s og 0s i binær.
Så det betyr at når jeg sier tallet 8, jeg tilfeldigvis vite at det er
som, 1000.
Hva bitvis operatører la oss gjøre er bruk på disse biter -
er bruk på disse bitene direkte.
Nå er jeg ikke lenger arbeider i form av åtte.
Jeg arbeider i form av 1000, og jeg ønsker å gjøre ting med dem
individuelle biter.
Så Ali har skrevet bitvis operatører her, men that -
Nummer 8 vil vi bruke som en av våre eksempel tall.
Og den binære representasjon er 1000.
Vi vil bruke et annet nummer, 5 -
faktisk la oss bruke 9 og 5.
Og 5 er binær representasjon er 00 -
0101.
ALI: Er alle gode på det?
Den binære ting?
Det var fra første forelesning?
>> ROB: Så selv om du ikke er helt på toppen av hvordan å konvertere ting til
binær, det er ikke helt viktig for dette problemet.
Vi skal bruke den, men du vil ha mange flere sjanser til å finne ut hvordan du
raskt snu ting i binær.
Så bruker 9 og 5, nå har vi vår bitvis operatører.
Oh, og også, 9 og 5, hvis det er et heltall, så egentlig er det 32 ​​bits,
som betyr at vi har som 0, 0, 0, 0 en rekke ganger, og deretter
101 på slutten.
Det er bare fordi, uansett hva du gjør, i heltall, 32 bits.
Bare fordi vi trenger bare fire biter til å representere ni betyr ikke at vi ikke er
bruke opp de andre 27 bits for bare 0s.
ALI: Bare for å avklare, en av disse tallene det er en 0 eller 1 er en bit.
Dette er 4 biter.
Som så Rob sa at maskiner lagre dem i 32.
Så da ville de ha 32 av enten en 0 eller 1.
Kult?
ROB: bitvis operatører.
Den første som vi vil forholde seg til, la oss gjøre og.
Så hvis vi gjør 9 & 5.
Så hva & gjør er, bit for bit, sammenligner den biter av de to tallene
og hvis begge tall er 1, og det vil igjen en 1.
Hvis en er en 0 og den andre er 1, eller begge er 0s, så det gir en 0.
Så du kan tenke på det som dine logiske ands.
Som du trenger sann og trofast mot return true, men sant og usant er falsk.
Så det er det samme, men nå er vi håndtere det med bare biter.
>> ALI: Så hvis du ser på dette, vil du ha 1 -
du stille dem opp, så det vil være 1 og 0..
Tror dere det ville være - hva ville det vurdere å?
SPEAKER 25: 1.
ALI: Cool.
Eller nei.
Unnskyld.
Så gjør som er fornuftig?
Så hva er den kollektive svaret igjen?
Unnskyld.
Så hvis vi har 1 og 0, så hva får du?
ROB: Så du tenker på hvordan du sier og høyt.
Hvis du har to biter, x og y, må du x og y for å være en for at den
å vurdere å true - eller, for at det å vurdere til 1.
Hvis x eller y er 0, så det evalueres til false eller 0.
LUCAS: Det er godt å huske også at en er sann og 0 er usann.
Så hvis du har sant og usant, er det falskt.
Men så, sant og ekte, sant.
Falsk og usann, falsk.
ALI: Vi har sant og usant.
Så 1 og 0.
Så igjen, beklager, en gang til?
SPEAKER 25: Det ville være 0.
Ja, kult.
Og da har vi 0 og 1 -
SPEAKER 25: [uhørlig]
ALI: Yeah.
Så du kan alltid bytte dem i -
Så hvis du har 0 og 0?
SPEAKER 4: 1?
0?
ROB: Så det er 0.
Det er ikke det at begge tallene må være den samme.
Det er at begge tallene må være en.
ALI: Så begge må være oppfylt for at det skal være sant.
Så det er 0.
Og da har du 1% 1, som er?
ROB: Dette er ganske gode tall.
De har alle mulige -
ALI: Bra jobbet, wow.
Ok, kult.
Så gjør det fornuftig for alle?
>> ROB: Så nå får vi gjøre |.
Og dette kommer til å være svært like, men nå i stedet for x og y som ønsker å
være en for at det å evaluere til en, nå er det bare x eller
y må være en.
ALI: Så en | 0 evalueres til -
KLASSE: 1.
ALI: Cool.
0 | 1 evalueres til -
KLASSE: 1.
ALI: Cool, og deretter 0 | 0 -
KLASSE: 0.
ALI: Ja, og deretter 1 | 1 -
KLASSE: 1.
ALI: Cool.
Så det er som to bitvis operatører.
Awesome.
ROB: Så nå får vi gjøre ^.
ALI: Bør vi gjøre alle av dem?
ROB: Ja, fordi jeg tror vi kommer til å bruke den -
bruker dem alle.
ALI: Ok.
Så -
ROB: Jeg antar vi ikke må.
ALI: Så ^ fungerer ved at du må ha nøyaktig én sann og en falsk.
^ Betyr eksklusivt OR.
Så nå er det ikke -
hvis x og y er begge 1, er det nå falsk.
Det er forskjellen mellom ^ og |, er at OR, kan du ha, hvis x er
sant eller y er sant, så vi er gode.
Nei, sier ^ hvis x er sant, må y være falsk, ellers er det ikke sant.
Har du et spørsmål?
>> SPEAKER 26: [uhørlig]
ALI: Yeah.
Det er slags lignende.
ROB: Ja, så når du kommer til at lav-nivå maskinvare ting, disse er
de ulike operasjonene du arbeider med.
På hardware nivå, vil du bare forholde biter.
Du trenger ikke forholde seg til tall.
ALI: Ok, for ^, eller hvis du har en ^ 0, hva skal det evalueres til?
KLASSE: 1.
ALI: Cool.
Hvis du har
0 ^ 1? KLASSE: 1.
ALI: Cool.
0 ^ 0?
Cool.
Og deretter 1 ^ 1?
KLASSE: 0.
ALI: Cool, awesome.
Den neste -
ROB: Jeg tror disse alt vi har å forholde seg til.
Vi vil bare gjøre disse.
ALI: Den eneste gangen vi har å gjøre -
ROB: Å, som vil være for det siste problemet.
SPEAKER 27: Vent, igjen?
ALI: Beklager, det var spørsmålet ditt?
>> SPEAKER 27: Kan du forklare det igjen?
I ^?
SPEAKER 27: Exclus - Ja.
ALI: Så hva den eksklusive ELLER betyr at det må være utelukkende
en sann og en falsk, så en 1 og en 0, versus med OR, kan du ha -
en av dem har til å være sant, eller begge av dem kan være sant, for det
å vurdere å true.
SPEAKER 27: Så 0 og 0 ville være falsk.
ALI: Yeah.
Men hvis du har en |
1, ville det vurdere å true.
Men hvis du har en ^ 1, som vi gjorde, evaluerer det til false.
Fordi det er ikke utelukkende en er sant.
ROB: Og dette kan eller ikke kan være nyttig, men legg merke til at ^ er
lik bare å ta |
minus &.
Og du kan faktisk tenke på det på denne måten.
^ Er bare øringen alt sammen, men tar ut noen av bitene der
begge var sant.
Så & returnerer alt der begge var sant.
| Returnerer alt hvor en eller begge var sant.
Så trekke det ut fra | gir deg ^.
ALI: Har du spørsmål?
Dette var mye informasjon.
Alle gode?
>> ROB: Vi kan gå over de neste som for det neste problemet, skråstrek
hva er klokka?
De trenger ikke dette før neste problem.
ALI: Jeg trodde det var denne.
ROB: Det er ikke det.
ALI: Er du sikker?
ROB: Ja, jeg er positiv.
ALI: Hvorfor kan ikke vi begynne å gjøre det neste problemet?
Problemet er, igjen, å endre den fra små bokstaver til store bokstaver, og dette
tid til å bruke bitvis operatører.
ROB: Så vi vil -
la oss starte med den binære representasjon av 'A', kapital 'A',
som er 65 år.
Så i binær -
så 'A' = 65, som =, i binær -
Jeg kommer til å rote opp antall 0s - det.
ALI: Så gjør det fornuftig for alle?
Så, 1, ingen 2s, ingen 4s, ingen 8s, nei -
ingen 16S, ingen 32S, og deretter en 64.
ROB: Ja, jeg tror det er en for mange 0s.
ALI: Beklager.
>> ROB: Ok, så vi har 64 sett, og vi har 1 sett, og kombinere dem
sammen, får vi 65.
ALI: Cool bønner?
ROB: Så nå, små bokstaver 'a'-
merke 97 -
hva er forskjellen mellom 97 og 65?
SPEAKER 28: 32.
ROB: Yeah.
Så det er 32, som er sin egen bit, så det kommer til å bli 110001.
Og dette kommer til å være sant for alle mulige tegn.
Så hvis vi tenker på 'D', som kommer til å være 68, som kommer til å være 1.000.011.
Og så små 'd' kommer til å være 68 pluss 32, som er 100, noe som er
kommer til å være det samme som dette var, bare vippe
32 igjen, så 1.100.011.
Så forskjellen mellom en stor og liten bokstav er bare å bla
at 32-bitposisjon.
SPEAKER 29: Er det ikke 1000100?
ROB: Vent, det er 100 -
noe jeg gjorde galt.
Dette var ikke sant.
Jeg tenkte at det var en forskjell på 3, så da jeg bare stakk
den binære 3 på slutten.
Dette bør være rett.
ALI: Takk.
Bra for å peke det ut.
Det var skarp.
Greit, er det klart for folk?
>> ROB: Forskjellen mellom store og små bokstaver versjon er
alltid bare kommer til å være 32, og slik at det alltid kommer til å være en enkelt bit
som må snus for å bytte mellom de to.
ALI: Så i dette tilfellet, å vite forskjellen mellom hovedstaden A og
små bokstaver a er en god ting.
Ikke i koden, men konseptuelt minst, det er bra.
Så dere kan gå videre og kode som i Spaces nå.
Eller skal vi bare snakke om det?
ROB: Vi kan bare snakke om det.
Jeg vet ikke.
Dere kan prøve.
Snakke blant selv for en bit.
Vi vil gi deg en sjanse til å kode den.
[Interposing VOICES]
ALI: - er kult
SPEAKER 30: Dette er som hacker komedie.
ALI: Ja, vi bare fortelle nyheten, går gjennom det.
>> ROB: Og vi er tilbake.
ALI: Det er litt merkelig.
Jeg føler at vi bør ha en CS50 nyheter stasjon og vi kunne
faktisk sitte slik.
ROB: Hacker News.
ALI: Hacker News 50.
ALI: Føl deg fri til å stille spørsmål hvis du er forvirret.
ROB: Er det noen fast?
ALI: Ja, det er en god ting.
ALI: Vent, er du fast i stolen?
Oh.
Jeg var litt bekymret.
ROB: Fordi jeg innså at vi kommer til å ønske
en annen bitvis operatør.
For nå, la oss bare konvertere store til små bokstaver.
ALI: Beklager, fikk alle få at kunngjøringen?
Vi kommer til å gå fra store til små bokstaver.
ROB: Så får vi diskutere små bokstaver til store rett etter det.
Å, nei.
Vi har en feil i dette, som jeg tror vi aldri prøvd å kjøre.
Som er akkurat det røye c må bli erklært utenfor loopen, fordi
dens omfang er begrenset i loop.
SPEAKER 32: I dette tilfellet er det galt å bruke en rekke?
ROB: Eh, trenger du ikke må.
Hvis jeg garantert at kapital "A'- eller små bokstaver 'a' minus kapital 'A'
var nøyaktig én bit, men at du ikke vet det er 32 -
ting ville fungere like bra om det var 16 bit som ble snudd - eller
nei, tror jeg unngå, ikke det -
eller 64 bit ble snudd, muligens.
Men du bør ikke trenger å bruke 32.
Du kan i stedet bruke små bokstaver 'a' minus kapital 'A'.
>> SPEAKER 32: Ok.
Hva du kan gjøre hvis du føler at du skriver for mye er at du kan definere det
øverst.
Så du kan være like, int forskjell = små bokstaver 'a' minus kapital 'A'. Og
så kan du skrive forskjell i stedet.
Som er gyldig.
Men bare ved hjelp av nummer 32 er slags -
SPEAKER 33: Selv om det er på grunn av det faktum at det er 32 bit?
ALI: Yeah.
ROB: Det kan være -
den eneste garantien vi trenger for at du er at forskjellen mellom
små og store er en bit.
Det bør ikke saken at det skjer for å være 32 bit som er snudd.
For tiden betraktninger, vil vi begynne å gå over dette.
Det er greit hvis du ikke er ferdig.
Ikke noe å bekymre seg for.
ROB: Forutsatt c er en stor bokstav -
Vi trenger ikke å anta c er en stor bokstav.
Vi vet c er en stor bokstav etter denne stund loop -
gjør-mens loop.
Så det betyr at det ser omtrent slik ut 'A'. Så hvis vi ønsker å bringe denne
'A' til denne 'a', hva vi trenger å gjøre?
Så hvordan konverterer vi gjør og snu litt?
ALI: Hvordan snu vi det?
>> ROB: Så vi vet at vi ønsker å vende 32 bit.
Så det vil gjøre 'a' minus 'A', eller vi kunne skrive 32, men -
darn det, er det den andre veien rundt.
ALI: Ok så Rob her er beregning det nummeret, magiske tallet 32.
Så han er å finne ut hvor det litt flip området ville være.
Og hva legger vi ut hvor spørsmålstegnene er?
ROB: Hvordan snu vi det litt?
I form av stor bokstav, er det en 0, og vi ønsker å bli en en.
SPEAKER 34: |.
ROB: Yeah.
Så dette er oss si vi tar 'A'. Vi øringen det med 0 -
1000 -
og at = det.
ALI: Betyr det fornuftig for alle?
Vi kan gå gjennom det litt etter litt hvis du vil.
SPEAKER 35: Er du [uhørlig]?
ALI: Hvor er minustegnet?
ROB: Å, du mener her?
ALI: Oh, yeah.
ROB: Så jeg antar dette er oss.
Vi kunne si 32, og nå er vi bare bruker bitvis operatører.
ALI: Vi liker ikke magiske tall.
Vi kommer ikke til å gjøre det.
Jeg mener også vi bør bare bruke en bitvis operator -
SPEAKER 36: Hvis du bruker en ^ A, vil du få 32?
SPEAKER 37: Ja, jeg tror -
ROB: Ja du vil.
ALI: Dette er hvordan du ville ha gjort det for å gå
fra kapital til små bokstaver.
>> Nå kan noen fortelle meg hvorfor Rob og jeg forandret rask og hvordan vi gikk
fra store små bokstaver, i stedet for små bokstaver til
store bokstaver som vi gjorde før?
Har noen noen ideer hvorfor det kan være mer vanskelig?
ROB: Så vi ville gjøre -
ALI: Ja, gå videre.
SPEAKER 38: The | operatør var bare veldig bra for å legge til.
ALI: Ja, akkurat.
ROB: Så hva vi ønsker å gjøre i små bokstaver til store saken er,
konvertere dette 'a'-
så vi ønsker å sette inn noen tall her og bruke noen operatør, slik at det kommer
ut til hovedstaden A. Vi er fortsatt trolig bruker 32 eller annen måte, men nå hvordan gjør vi
få dette til å komme ut til denne?
Så c -
oh, jeg fortsatt ønsker at også -
ALI: Så nå hvis vi konverterer fra små til store bokstaver igjen, så vi
gjør ^ operasjonen, som dere sa.
ROB: Det finnes andre måter du kan gjøre ting.
Mange av de bitvis operatører ende opp med å bli veldig lett definerbare i form
av andre bitvis operatører.
Så jeg hadde tenkt å ikke bruke ^ eller i det hele tatt, men ^ fungerte helt fint.
>> ALI: Ok, så vi kommer til å gå på det siste problemet, som er å grunnleggende -
det siste problemet er å konvertere noe inn binære.
Så, for eksempel, har du 50, og deretter konvertere den til
binære, som er 110010.
Og jeg tror dere alle vet om binærfil fra forelesning.
Og du heller ikke er ment å sette noen ledende 0s inn i den.
ROB: Du kan ignorere denne delen for nå.
Den første pass, kan du gjøre det slik at det er ledende 0s.
Og så kan vi endre det å ha noen ledende 0s, hvis vi har tid.
ALI: Så ikke bekymre deg for det.
Bare prøv å få i binær.
Et godt sted å starte ville være -
ROB: Vi trenger å be om et heltall.
ALI: Oh yeah, det er en god en.
Vi kan begynne med det.
Så du kan endre meldingen.
Så i stedet for et tegn, nå er vi arbeider med heltall.
Kult?
>> ROB: Og nå hva er vår do-while tilstand kommer til å bli?
Det er å be for en ikke-negativt heltall.
ALI: Når vi ønsker å holde spørre brukeren for noe annet?
Når det er mindre enn 0.
ALI: Høyre.
ROB: Mens jeg er mindre enn 0.
ALI: Nå ønsker vi å konvertere den.
Gjør dere har noen ideer om hva du skal gjøre?
Eventuelle inklings?
Ja.
SPEAKER 39: Har vi å konvertere den, eller kan vi bare skrive ut noen 0'er og 1'ere
det ville være riktig nummer?
Kan du gjøre en for løkke og telle ut av kraft av 2?
ROB: Ja.
Du trenger ikke å konvertere jeg til dens binære -
den binære representasjon av jeg vil ikke passe inn i jeg.
Du trenger bare å skrive ut binære representasjon av jeg.
ALI: Med andre ord, trenger du ikke å gå med krefter to.
ROB: Fordi jeg er allerede lagret som binærfiler, slik at du ikke trenger å
konvertere den til binær.
Bare gå over dens binære, og skrive det ut.
Og du kommer til å trenge å bruke bitvis, fordi du ønsker å se på
de faktiske biter.
Du trenger ikke å bruke bitvis, men kan du gjøre.
Og det er faktisk -
du kan bare gjøre krefter av to ved å multiplisere med 2.
Vi vil gå over en av de to siste binære bitvis operatører,
som er denne en.
Så når du tar -
>> ALI: Kan du gå gjennom dem begge?
ROB: Yeah.
Så la oss gå med 9.
Så 9 venstre shift 1 -
hva er igjen shift betyr er flytte bare alle biter til venstre og sette inn en 0.
Så vi flytte alle biter av 9 til venstre en
posisjon, som gir oss -
Så merker vi har flyttet alt forlatt en, og satt inn en 0 på
høyre side.
Hvis vi hadde flyttet til venstre med to, ville vi skifte alt igjen med to,
og sette inn to 0s å fylle i hullene.
Spørsmål?
ALI: Så høyre shift gjør en lignende ting.
Hvis du har 9 høyre shift en da er du bare flytte alt over til
rett, mister du et siffer, så 100 i stedet.
ROB: Så du det er greit at du mister litt som skjedde til å være alt
veien til høyre.
Det finnes ulike typer av riktige skift, men i utgangspunktet du kan tenke på
høyre shift som bare dividere med 2.
Og du kan tenke på venstre skift som å multiplisere med 2.
Så hvis du har konvertert dette -
hvis du konverterte 9 skift 1, som er lik 10010, hvis du faktisk gikk
gjennom den binære og funnet ut hva det var, ville det bare være 18 år.
Vi bare multiplisere med 2.
1001 venstre shift 2 kommer til å være 36.
Vi multipliserer med 4.
Ok, kult, så det er en hendig bitvis operatør for denne.
Mer forvirring?
Ønsker dere å prøve det ut?
Eller vi kan bare hoppe rett inn og starte den?
ROB: Vi bør nok hoppe rett i.
ALI: Ja, OK.
ROB: Og gå gjennom det sammen.
>> ALI: Vel jeg vil bare gå inn i den.
Så som han sa i begynnelsen, skal vi bare gå gjennom litt etter litt.
Så vi kommer til å trenge en loop.
Har noen en idé om den beste form for loop å gå gjennom dette?
Vi har mens looper, gjør-mens looper, for sløyfer.
SPEAKER 40: Do-while loop?
ROB: Så husk hva jeg sa tidligere om, vi bare bruker gjør-mens
looper å få brukerens input.
Du vil aldri ganske mye noen gang bruke dem til noe annet.
ALI: Problemet med do-mens sløyfer er det gjør noe før det sjekker for
tilstanden.
Så, det kan gjøre noe galt -
liker, vondt -
gjøre noe som ikke er mulig.
Så du ønsker å sjekke først.
ROB: Det er mange tilfeller der du kan bruke do-mens sløyfer, men folk
ikke forvent deg å bruke dem med mindre det er brukerens input.
Så vi har brukt vår do-while loop å få i.
Hvor mange ganger er vår sløyfe kommer til å ønske å sløyfe?
Vi ønsker å sløyfe over hver av de biter av I.
Hvor mange biter er i jeg?
SPEAKER 41: 32.
ALI: Yeah.
ROB: Så det er 32 biter.
Vi ønsker ikke å si 32.
Vi i stedet ønsker å si sizeof -
som, har du sett at i klassen ennå?
ALI: Nope.
ROB: Hvorfor står det å bruke den -
sizeof (int) ganger 8 -
ALI: Så er sizeof -
>> SPEAKER 42: [uhørlig]
ALI: Interesting.
Så er sizeof en innebygd C-funksjon hvor det bare forteller deg
antallet av biter i -
ROB: Bytes.
ALI: Bytes, beklager -
antall byte som en variabel har til å lagre en verdi.
Så jeg tror han gikk over i klassen, så er en int 4 byte kanskje.
Kult?
ROB: Men du bør ikke trenger å vite at en int er 4 byte.
Du bør være i stand til å si -
du bør bruke sizeof (int) for å få 4 byte.
Og det er faktisk viktig for noen ting.
En int kanskje ikke være 4 byte.
På en annen datamaskin, kan en int være 8 byte.
Slik at programmet ikke vil fungere på datamaskinen fordi du hardkodet 32
biter når på den datamaskinen skjer for å være 64 bits.
ALI: Så du har det totale antall biter som du vil den skal snu.
Rob: Og forskjellen mellom en byte og en bit er at det
er 8 bits i en byte.
Så sizeof (int) returnerer 4 byte, så må vi mangedoble det
med 8 for å få 32 biter.
>> ALI: Ok, så vi vet det maksimale, og vi vet vi vil gå fra -
vi ønsker å gå gjennom dem alle.
Så vi ønsker å gå fra 0 til numBits.
Så vet noen hvordan å skrive løkken for det?
Anyone?
SPEAKER 43: [uhørlig]
ALI: Så du ønsker å traversere nummer i fra zeroth bit til
første bit, den andre biten, den tredje biten, hele veien til numBits.
Den maksimale antall biter som du kan få til.
ROB: Hva er vanlig sløyfe vi bruker det vi ønsker å gjøre noe x ganger?
ALI: For.
Perfekt.
Så vi har for.
Og så får vi lage en iterator, som ikke kommer til å være i.
ROB: j.
ALI: J = 0.
Så vi vil starte på 0.
Og så skal vi ha tilstanden å være sikker, mens du er
gå gjennom det hver eneste gang -
[Interposing VOICES]
ROB: j.
ALI: j er mindre enn numBits.
Slik at vi ikke ønsker å gjøre den faktiske lik en, fordi de er numBits
totalt, og vi starter på 0.
Så vi faktisk kommer til å ha -
SPEAKER 44: Oh.
ALI: Indeksene ikke slutt på numBits minus en.
ROB: Vi merke bit 0 til 31, vi ikke merke dem 1-32.
ALI: Og så skal vi øke hver gang etter en, fordi vi ønsker å
sjekk hver eneste en.
Så vil vi gå j + +.
>> SPEAKER 45: Hvorfor gjør du det?
SPEAKER 46: Hvorfor skal du gjennom hver bit?
ROB: Så vi ønsker å gå gjennom hver bit og -
Så la oss si at vi har noen tall.
ALI: 68.
ROB: Vi kan bruke 68.
Så det binære kommer til å bli 100100.
Så dette er inne i jeg, og vi ønsker å gå over hver av disse bitene.
Er det en 1?
Skriv ut en.
Er det en 0?
Skriv ut 0.
Så går vi videre til neste bit.
Er det en 1?
Skriv ut en.
Er en 0?
Skriv ut 0.
ALI: Cool, ok.
Nå er vi på riktig indeksen for hvor det bit er.
Hvordan kan vi sjekke det bestemte en?
La oss si at vi på j = 0, så vi ønsker å sjekke 0-indeksen på biten.
Så, i dette tilfellet, denne.
>> Så nå hvordan går vi om sjekk - oh, ville det være denne.
ROB: Yeah.
ALI: Beklager.
Hvordan ville vi gå om å sjekke at man i en viss forstand?
Hvordan ville vi sjekke om det er en 0 eller 1?
Vel let's -
KLASSE: Og en?
ALI: Og?
Ja.
ROB: Så la oss si at vi allerede har en.
Da er dette &, vil dette gå tilbake om det var 1 eller 0.
ALI: Så vi kan gå ned.
Og vi kan gjøre som dere sier, av å gjøre og funksjon.
ROB: int -
hvordan ønsker jeg å si dette -
Isone = jeg.
Og for første bit vi tilfeldigvis være å se på, vi gjør i & 1.
Nå hva vi kommer til å ønske å & ved for den andre biten?
SPEAKER 47: 2.
ROB: Ja, den andre at vi er på to.
ALI: Du vil merke at en har flyttet over til venstre.
Så har vi lært noen bitvis operatører å gjøre det fungere?
ROB: Den neste -
ALI: Ja, ikke sant, akkurat.
Så det er en venstre skift.
I stedet for å alltid sjekke med 1, kommer vi til å skifte den.
Og hvor mange ganger skal vi skifte den?
Hvis vi sjekker zeroth en, så vi kommer til å flytte den over null.
Ja, akkurat.
Så du forlot skifte den ved j.
Perfekt.
Så nå vet vi -
vi har denne int av om det er en, og deretter -
så Rob slags juks her -
og så nå at han skulle videre og han sier bare at hvis det faktisk er 1,
fordi en evaluerer til sann, så vi ikke trenger å si ISF Isone tilsvarer 1 -
så hvis Isone, så vi skriver ut en, og ellers vi ut 0.
>> ROB: Så vårt program har en samlet bug.
Vel, spørsmål om dette først.
SPEAKER 48: Kan du noen gang sette Isone inne fire drift del og
deretter skifte den har seg selv som den siste delen?
Så Isone lik 1 og deretter -
ROB: Ja, det kan du.
Vi kan faktisk vise at når vi fikse feilen som jeg er i ferd med å
diskutere med dere alle.
Legg merke til rekkefølgen vi skal over ting.
Gitt denne binære representasjon, starter vi med zeroth bit.
Hvis det er en 0, så vi skriver -
vel, det er en 0, så vi skriver 0.
Så går vi til den andre biten.
Det er en 0, så vi ut 0.
Så går vi til den tredje biten.
Det er en 1, så vi skriver ut en.
ALI: Så det kommer bakover.
Så hvordan gjør dere foreslå at vi fikse det og gå den andre veien?
SPEAKER 49: [uhørlig]
ROB: Yeah.
Så i stedet for å gå fra 0 til numBits, vil vi gå fra numBits biter til 0.
ALI: Så [uhørlig]
kan alltid gå den andre veien.
ROB: NumBits 1 minus, fordi det er den siste nubmer -
ALI: Fordi det går fra 0 til 31.
Og så får vi alltid sørge for at den er større enn 0, så du ikke går
for langt til høyre.
Og da vil du alltid trekke med 1 for å gå til høyre.
>> ROB: Så nå har vi en omvendt bue, og antallet er tilbake i utskriften
på riktig måte.
SPEAKER 50: Har du ikke endre skift ting også?
ALI: Så ingen.
ROB: Vi gjør de samme operasjonene, bortsett fra nå
i omvendt rekkefølge.
Så i stedet for å gjøre skiftende av numBits minus 1 for å få hva dette
bit er, i stedet for å gjøre det siste, vil vi bare gjøre det først.
Ved å reversere dette opp her, reversere vi rekkefølgen på alt
som skjer inne.
Men vi ønsker ikke å endre hva som skjer inne i det hele tatt.
ALI: Gjør det fornuftig?
Behandler?
Ok, så gjør noen andre har noen andre konseptuelle spørsmål?
ALI: Før vi går inn i punktet hans som er -
ALI: All right, vel gå.
ROB: I stedet for å bruke j for å være vår -
stedet for å bruke j alltid skifte etter, som en venstre shift j, tror jeg det
du sier er like, til j bruke seg selv.
Så for j -
Jeg tror dette er vanskelig - j = 1 << 31.
Er det det jeg vil?
Jeg tror det er << 31.
j> = 1.
j >>, >> Isone, I & J -
så nå i stedet for å bruke -
ALI: Du konstant bevegelse j stedet for å ha en
indeks for å sjekke det.
Det er ikke så ille.
Vi bruker en lignende type logikk.
Så hvis du går tilbake -
oh, men det kommer til å miste det.
Ok, du bare kommer til å skrive det på nytt.
Hvis du oppdager at vi har en << j mengde ganger, og vi var
inkrementering j hver eneste gang med ett trinn, men denne gangen i stedet
de gjør tilveksten av j øverst inne i for loop.
Så i stedet for alltid å flytte det ned -
ROB: Den aller første iterasjon av for-løkken, har vi j er 10000.
Den neste iterasjon av for-løkken er 01000.
Den neste iterasjon er det.
Og 1 er bare kommer til å holde spre seg før vi treffer svært
enden, der nå er det dette.
Den neste, er 1 kommer til å bli presset ut, og j er ikke lenger større
enn eller lik 1..
Jeg kan også sette større enn 0, samme forskjellen.
Og så det er det.
Spørsmål?
Ja.
>> SPEAKER 51: [uhørlig]
ROB: Så det er det samme som -
har du sett j + = 3?
Så dette er det samme som j = J + 3?
Du kan gjøre det for nesten alle operatører i C. Så j >> = 3 er
lik j = j >> 3.
Så det fungerer også med bitvis operatører.
Og jeg skulle ikke ha satt 31 her.
Jeg burde ha satt numBits - 1.
ALI: Yay, ingen magiske tall.
Ok, det er 4:00 skjønt, så hvis dere har å gå - men dette fornuftig?
Må dere har noen andre spørsmål?
ROB: Jeg var også tenkt å kaste i at hvis vi ønsket -
Han har diskutert trefoldig operatør i det hele tatt?
ALI: Nei
Det er greit.
ROB: Så du kan se på det til neste gang.
ALI: Ok, egentlig?
Nå er du bare vise frem.
ROB: Nei, nå det er -
Dette er hva som får folk interessert, og nå vil de gå og se inn i den.
Så nå gjør at det samme, i ett trinn.
Så først sjekke, er I & J 1?
Er det sant?
I så fall ut en 1, annet, skrive ut en 0.
ALI: Men gjør det den andre veien er helt greit også.
Det har den samme logikken.
Så det er ikke som en er -
ROB: På dette punktet, kan vi bli kvitt de klammeparentes, fordi det er bare
en en-linje for loop.
ALI: Ok, så gjør det fornuftig?
Det var snilt av et hopp.
Men det var bare slags syntaks, mer så.
>> Kult?
Andre spørsmål?
ROB: Greit.
ALI: Greit, kult.
Takk for at du kom til delen.