[Powered by Google Translate] § Problem Set 2: Hacker Edition
Rob Bowden, Harvard University
Dette er CS50. CS50.TV
Så, jeg Rob. Jeg er en senior i Kirkland. Dette er mitt tredje år TFing CS50.
Det er første gang at vi er i endring fra den tradisjonelle forelesningen stil delen,
der vi bare slags vurdere hva som skjedde i foredraget, og deretter dere stille spørsmål,
nå å være mye mer problembasert, der vi bruker Spaces, og -
Oh, så tanken er å gå til den linken jeg sendte deg, og da vil du være i verdensrommet min.
Er det noen som ikke har en bærbar PC? Okay.
Så vi kommer til å bruke dette, og vi kommer til å gjøre problemene lever i seksjon
og diskutere dem og finne ut hva som er galt
og jeg kan trekke opp noen av koden din, og jeg kan diskutere dine ideer.
Så har noen hatt problemer?
Du kan chatte på siden, jeg vet ikke om vi vil ha grunn til det.
Nå, som den forrige supersection, hvis du var på den klassen, vet du hva det handler om.
På alle P sett det kommer til å være disse delene.
Så P-set 2, spesifikasjoner, jeg antar du så det på P-set en allerede.
Men vi kan se på P-set 2 for hva vi kommer til å gå over i dag.
Og du vil se en del av spørsmålene.
Så dette blir i alle P-sett, det vil være en del av spørsmålene.
Så langt har vi sa, "Tenk på dette en mulighet til å praktisere."
Du vil ikke bli bedt om å sende inn dette programmet.
Ideen er at disse er ment å slags hjelpe deg i gang med oppgaven.
Jeg antar på Hacker utgaven, er mange av dem skal bare være nye, interessante ting å lære.
De kan ikke være direkte anvendbart i oppgavesettet.
Og akkurat nå er vi ikke har det du sender dem, men i teorien,
for senere oppgavesett, kan du sende dem, og dermed kan du enten komme til seksjon
eller se delen for å få svar, eller du kan bare få dem på din egen
hvis du ikke føler for å nyte mitt nærvær.
Så - jeg tror dette er den første.
Oh. Også under disse delene av spørsmålene ber vi også at du har spørsmål om shorts.
Så jeg antar, i teorien, du skal se disse før du kommer til delen,
men det er fint hvis du ikke; vi vil gå over dem uansett.
Så vi kan starte med disse: "Hvordan skiller en stund loop fra en do-mens loop?
Når er siste spesielt nyttig? "
Så noen har noen -?
[Student] gjør-mens loop vil alltid utføre minst én gang.
Ja. Så det er forskjellen. En stund loop - Jeg skal bare gjøre det på her - mens loop, vi har tilstanden
akkurat her, mens en do-stund, trenger du ikke har en tilstand før vi får her nede.
Og så, når programmet er å utføre, og det blir til mens loop,
det sjekker umiddelbart hvis denne tilstanden er sant.
Hvis denne betingelsen ikke er sann, vil det bare hoppe over løkken helt.
Do-mens loop, som programmet utfører, blir det til "gjøre."
Ingenting skjer på dette punktet, fortsetter bare å kjøre.
Så når den treffer "mens", hvis betingelsen er sann, vil det loop tilbake og gjøre det igjen
og igjen og igjen før tilstanden er ikke sant, og så bare faller gjennom.
Så forskjellen er at dette kan hoppe rett fra start.
Dette utfører nødvendigvis gang og deretter kan utføre flere ganger hvis tilstanden er fortsatt sant.
Så mens loop vil bare gjøre det en gang, eller - mens loop - vi trenger kanskje ikke å gjøre det i det hele tatt,
siden så snart vi får den, hvis betingelsen er usann, vil vi bare hoppe rett over den.
Mens do-mens loop, vil vi utføre det en gang, nødvendigvis.
Deretter, når vi kommer til tilstanden, sjekker vi om det er sant eller usant.
Hvis det er sant, vil vi gjøre det igjen, hvis det er falsk, vil vi bare fortsette å gå.
Så da er det sistnevnte spesielt nyttig?
Så jeg kan si at i sin helhet av de 4 år, 3 år, uansett,
at jeg har vært programmering, har jeg brukt dette, som, under 10 ganger.
Og sannsynligvis 5 av dem er i CS50 når vi introduserer do-mens sløyfer.
Så når har du brukt do-mens sløyfer?
Når er - ja?
[Student] Når du prøver å få brukerens input, eller noe du ønsker å sjekke -
Ja. Så gjør-mens sløyfer, brukerundersøkelser er den store.
Det er derfor på de første par oppgavesett, når du ønsker å spørre brukeren, som,
"Gi meg en streng," du kan ikke fortsette før du får den strengen.
Og så du, nødvendigvis må be om strengen minst én gang.
Men så hvis de svarer noe dårlig, så må du sløyfe tilbake og spør igjen.
Men annet enn brukerens input, er det svært sjelden at jeg møter en sak
der jeg ønsker å sløyfe "minst en gang", men muligens flere.
Spørsmål eller -? Har noen brukt en do-mens loop noe annet sted?
Okay. Så den neste er, "Hva betyr svart identifikator
vanligvis indikerer om outputted av clang? "
Så hva slags kode jeg kunne skrive for å få 'svart identifikator?
[Student] That x = 2?
Så vi kan bare prøve det her, x = 2.
Vi vil kjøre dette - oh, jeg klikker på den. Så her får vi - alle rett.
"Bruk av svart identifikator x."
Så det er svart identifikator, en variabel.
Det vil ofte kaller en variabel en identifikator.
Så det kanskje ikke vet det er faktisk en variabel, det vet ikke hva det er.
Så det er en identifikator.
Så hvorfor er det svart? Ja.
Så for å være tydelig på terminologi, erklæring av en variabel
er når du sier "int x" eller "streng y", uansett.
Initialisering av variabelen eller tildeling av variabelen,
er når du sier "x = 2".
Så vi kan gjøre disse i separate trinn, int x, x = 2, og inntil - vi kan ha en haug med ting her -
men inntil denne linjen skjer, er x fortsatt initialisert, men det har blitt erklært.
Og så kan vi selvsagt gjøre det i en linje, og nå er vi erklære og initialiseres.
Spørsmål?
Og til slutt: «Hvorfor er Caesar Cipher ikke veldig sikker?"
Så først, ønsker alle å si hva Caesar Cipher er?
[Student] Caesar Cipher bare er at du kartlegge, skifter du hver bokstav,
et visst antall bokstaver går over, og flytte tilbake over, og det er ikke veldig sikker fordi
det er bare 26 mulige alternativer, og du trenger bare å prøve hver 1 av dem til du får den.
Oh. Så skal jeg gjenta?
Caesar Cipher, det er - jeg mener, vil du bli håndtere det på de problemene som du -
eller jeg antar standardutgaven av problemet sett som ikke er på hacker utgaven.
Så på standardutgaven til oppgavesettet, får du en melding som "Hei, verden,"
og du har også et tall som 6, og ta deg denne meldingen, og hver enkelt karakter,
du rotere det ved 6 stillinger i alfabetet.
Så 'h' i Hallo ville bli h-I-J-K-L-m-n.
Så det første brevet ville være n. Vi gjør det samme med e.
Hvis vi har en, liker, z eller noe, så vi vikle tilbake rundt til 'en.
Men hver karakter får syklet 6 tegn senere i alfabetet, og det er ikke veldig sikker
siden det er bare 26 muligheter for hvor mange måter du kan pakke en enkelt bokstav.
Så du kan bare prøve alle 26 av dem og, antagelig, for en lang nok melding,
bare 1 av de mulige 26 ting kommer til å være leselig,
og leselig man skal være den opprinnelige meldingen.
Så det er ikke en veldig god måte å kryptere noe som helst.
Relatert til disse shorts, "Hva er en funksjon?"
Så hva er en funksjon? Ja.
[Student] Det er som et eget stykke kode som du kan ringe for å gå gjennom og deretter få tilbake verdien av hva.
Ja. Så jeg skal svare på det ved å også svare på neste - eller gjenta ved også bare svare på neste.
Du kan bruke funksjoner i stedet for bare å kopiere og lime inn koden igjen og igjen.
Bare ta den koden, legg den i en fuction, og deretter kan du bare kalle funksjonen
hvor du har vært kopiere og lime inn.
Så funksjoner er nyttige.
Så nå skal vi gjøre faktiske problemer.
Den første. Så ideen om den første er, passerer du en streng, og uavhengig av -
eller står det med små bokstaver? Det sier ikke alle små bokstaver.
Så meldingen kan være noe, og - oh no. Det gjør.
"For enkelhets skyld kan du anta at brukeren bare innspill små bokstaver og mellomrom."
Så vi passerer det en melding med bare små bokstaver og vi veksle
mellom små og store - vi endre strengen til å være store og små, vekslende.
Så før vi gir deg et sekund å selv dykke ned i problemet,
hva er det første som vi trenger å gjøre?
Oh, hva jeg bare klikke på? Åh, jeg bare klikket på en e-post her.
Så det første vi må gjøre - jeg ser på feil en?
Er denne delen av denne?
Nei, de er fortsatt der, skjønt.
Ok, her fortsatt.
Nå kan vi ikke anta -? Ja. Her kan vi ikke anta at det er bare små og mellomrom.
Så nå må vi håndtere det faktum at bokstavene kan være hva vi vil at de skal være.
Og så det første vi vil gjøre er å få den meldingen.
Vi trenger bare å få en streng, streng s = GetString, ok.
Nå dette problemet, er det et par måter å gjøre det på.
Men vi kommer til å ønske å bruke bitvis operatører her.
Er det folk som enten ikke var på supersection,
eller noe, og ikke vet hva bitvis operatører er?
Eller hvordan de forholder seg til ASCII på noen måte?
[Student] Jeg var ikke på supersection, men jeg vet hva bitvis operatører er.
Okay. Så da jeg ikke trenger å gå over det grunnleggende av dem, men jeg skal forklare
hva vi kommer til å ønske å bruke her.
Så 'A': Binær representasjon av kapital A, er nummer 65.
Jeg skal bare se på - 41 kommer til å bli 01000001.
Så det bør være 65 i desimal, så dette er den binære representasjon av tegnet kapital A.
Nå den binære representasjonen av tegnet små bokstaver 'a'
kommer til å være det samme, nesten. Er det - 6, ja. Dette er rett.
Så binær kapital A, binær små 'a ".
Så merker at forskjellen mellom A og 'a' er dette eneste bit.
Og dette skjer for å være 32 bit, bit representerer nummer 32.
Og det er fornuftig ettersom A er 65, 'a' er 97.
Forskjellen mellom dem er 32.
Så nå vet vi at vi kan konvertere fra A til 'a' ved å ta en
og bitvis øringen det, med - som ser ut som en 1.
Dette er en bitvis OR, med 00100000, og som vil gi oss 'a ".
Og vi kan få fra 'a' til A ved bitvis Anding
med 11, 0 i dette stedet, 11111.
Så dette vil da gi oss nøyaktig hva 'a' var, men utjevne denne personen bit,
så vi har 01000001, jeg vet ikke om jeg regnet rett.
Men denne teknikken bitvis øringen å komme fra hovedstaden til små bokstaver,
og bitvis Anding å komme fra små til kapital er ikke eksklusivt for A.
Alle bokstavene, K vs k, Z vs z,
alle av dem er bare kommer til å variere fra dette enkelt bit.
Og så kan du bruke denne til å skifte fra enhver liten bokstav til noen stor bokstav og vice versa.
Okay. Så en enkel måte å komme fra dette - så i stedet for å måtte
skrive ut hva 1011111 er - en enkel måte å representere dette nummeret, og dette er ikke en
at jeg gikk over i supersection, men tilde (~) er et annet bitvis operatør.
Hva ~ gjør er det ser på litt representasjon.
La oss ta noen tall.
Dette er bare noen binært tall, og hva ~ gjør det bare snur alle biter.
Så dette var en 1, nå en 0, er dette en 0, nå en 1, 010 100.
Så det er all ~ gjør. Så 32 kommer til å være nummer - bli kvitt det -
så 32 kommer til å være nummer 00100000, og så ~ av dette kommer til å bli
dette nummeret opp her at jeg ANDed 'a' med.
Ser alle det? Dette er ganske vanlig, som når du ønsker å finne ut
for senere ting som vi kan bli seende, når vi ønsker å se om -
eller vi vil ha alt, hver eneste bit sett med unntak av 1
du har en tendens til å gjøre ~ av den biten som vi ikke ønsker innstilt.
Slik at vi ikke vil at 32 bit sett, så vi ~ av 32 år.
Okay. Så vi kan bruke alle de her.
Greit, så det er fint hvis du ikke er ferdig, skal vi sakte gå over sammen,
eller gå over dette, så - gjennom dette. Gå gjennom denne.
Så vi har vår streng, og vi ønsker å sløyfe over hvert tegn i strengen og gjøre noe til det.
Så hvordan gjør vi sløyfe over en streng? Hva skal vi bruke?
Jeg har ikke tenkt å gjøre det på her. Ja.
Så jeg har min iterator, og han sa det, men hvordan vet jeg hvor mange tegn i strengen?
Strlen (s), og deretter i + +.
Så det jeg har gjort her er ikke den beste måten å gjøre ting på.
Vet noen hvorfor?
Fordi du sjekker språket strengen hver eneste gang.
Så vi kommer til å ønske å flytte strlen, kunne jeg si opp her, int lengde = strlen (s),
og deretter må jeg <lengde, og i tilfelle du ikke har sett det før,
Jeg kan også gjøre int i = 0, lengde = strlen (s).
Og så dette er noe å foretrekke, siden nå har jeg begrenset omfang
av variabel lengde til nettopp dette "for" loop, i stedet for å erklære det før
og at det alltid finnes, og i tilfelle du ikke ta hvorfor det er dårlig,
eller hvorfor den opprinnelige var dårlig, det er - starte på for loop.
Jeg sjekket tilstanden. Er jeg <lengden på s?
Så lengden på s, la oss jobbe med "hallo" hele tiden.
Slik at lengden av s, h-e-l-l-o. Lengde er 5.
Så i = 0, lengde er 5, så jeg ikke <5, så sløyfen fortsetter.
Så går vi igjen. Vi sjekker tilstanden. Er jeg <lengden på hallo?
Så la oss sjekke lengden på hello. H-e-l-l-o. Det er 5; jeg er ikke <5, så vi fortsetter igjen.
Så vi beregner vi regner hallo, for hver iterasjon av loopen,
selv trodde det aldri kommer til å endre, det er alltid kommer til å være 5.
Så vi bare husker 5 foran, og nå er alt er bedre.
Så iterating over hele strengen.
Hva ønsker vi å gjøre for hvert tegn i strengen?
[Student sett uforståelig]
Ja. Så hvis karakteren er ikke-alfabetisk, så vi vil bare hoppe over det.
Fordi vi bare bryr seg om alfabetiske bokstaver, vi ikke kan kapitalisere et nummer.
Så hvordan kan vi gjøre dette? Så tilstanden vår, så hvis vi vil ha noe - sjekk om det er alfabetisk.
Så hvordan sjekker vi dette?
[Student] Du kan bare bruke funksjonen er alfa.
Er det inkludert i en av disse, eller noen har lignende, char.h eller noe?
La oss ikke bruke er alfa-funksjonen, og bruke den eksplisitte - så vi har s [i],
som er den åttende karakter s, husk at en streng er en rekke tegn,
så det åttende tegnet av s.
Nå, hvis det er en stor bokstav, vet vi at det må være i et bestemt område.
Og hva er det området?
Ja. Så hvis s [i] er ≥ 65, og s [i] er ≤ 90, hva bør jeg gjøre i stedet?
Ja. Så du bør absolutt aldri engang trenger å vite ASCII verdier av noe noen gang.
Aldri tenke på tallene 65, 90, 97 og 102, eller hva det er.
Du trenger ikke - 112 - du trenger ikke å vite de i det hele tatt. Det er også galt.
Bare bruke én sitatteikn, single sitat konstanter. Så 'A' og mindre enn 90 er 'Z.'
Og dette er betydelig bedre - jeg ville ikke vite av toppen av hodet mitt at Z er 90.
Jeg vet av toppen av hodet mitt at "Z" er hovedstaden Z.
Så så lenge dette er i størrelsesorden av kapital A til hovedstaden Z, eller vi kan se etter små bokstaver,
Eller hvis det er i området ≥ 'a' og ≤ z.
Så det er vår tilstand.
Stilen for hvor du skal plassere disse tingene varierer.
Jeg skal gjøre det slik.
Nå, hva vi ønsker å gjøre?
Vi vet at dette brevet er et tegn, en alfabetisk tegn.
Så vi trenger å veksle mellom om dette skal nå være en stor bokstav eller en liten bokstav.
Hvordan skal vi holde styr på hvilken som vi vil det skal være?
[Student stemmer, uforståelige]
Så ja, men la meg sjekke.
Modul 0-2 ble sagt, var et forslag kastet ut, og jeg er enig med det.
Bortsett merke til at, som - er dette tilfelle? Ja.
Det er alle andre, men vi kan ikke modul 2 av i, eller jeg mod 2, siden
merke til at E er kapital og 'a' er små? Men det er en plass skiller dem?
Så de kommer til å være den samme mod 2, men de er forskjellige tilfeller.
[Student spørsmål, uforståelig]
Ja. Så vi bare kommer til å holde en greve.
Vi kan også gjøre det her hvis vi ønsket, det kan bli litt uhåndterlig
i for loop erklæringer; vil jeg sette det opp her.
Så int count = starter på 0.
Og så nå, jeg kommer til å telle hvor mange alfabetiske tegn vi har hatt.
Så vi uunngåelig kommer til å telle + + siden vi fant en annen alfabetisk tegn.
Men, så nå du sier om teller mod 2.
Så hva om telle mod 2? Oh. Jeg skal gjøre == 0 for nå.
Vi vil også gå over det. Så hvis teller mod 2 == 0, hva så?
[Studenter svaret, uforståelige]
Så vi vil at det skal ende opp med store bokstaver.
Det er 2 saker, store og små bokstaver er de to sakene.
Så hvis vi er i små bokstaver vi trenger å gjøre det store bokstaver.
Hvis det er store vi ikke trenger å gjøre noe.
Men, er det en måte - shouldn't har snudd -
at vi ikke engang trenger å sjekke om det er store eller små bokstaver?
Hva kan vi gjøre for å alltid sørge for at vi alltid ender opp på store?
Så legger merke til hva vi gjorde for små 'a', hva om vi gjorde dette samme ting til store bokstaver A?
Har store bokstaver En endring eller gjør verdiendring?
Ja. Så noen stor bokstav bitvis ANDed med ~ 32 kommer til å være den samme stor bokstav
fordi for noen stor bokstav den 32. bit ikke er satt.
Så hvis vi ønsker å bringe tegnet s [i], vi vil ha det til å bli små eller store bokstaver.
Så hvis det var små, er det nå store, hvis det var store, er det fortsatt store bokstaver, og det er det.
Jeg sa dette i supersection: Du kan bruke 32 hvis du vil, men jeg har en tendens til å foretrekke å gjøre "et" - A,
istedenfor bare ren 32, fordi det kan være en hvilken som helst andre bit.
Etter 32 bit, kan det være noen av disse, eller vi ville ikke ha nok
tall til å representere alle tegnene.
Så hvis du får 32 bit, kan det være 64 bit, kan det være på 128 bit.
Noen av disse bitene kan være litt som skiller mellom store og små bokstaver.
Jeg bør ikke trenger å vite at det er 32 bit.
Jeg kan bruke denne 'a' - A for å få litt som skiller mellom de to
uten å måtte stole på det magiske tallet som er 32.
Og så nå, ellers teller var merkelig, og så hva ønsker jeg å gjøre?
[Student svar, uforståelig]
[Student] Hva er det?
Jeg vil gjøre det i 1 sekund.
Så nå hvis jeg vil - Jeg vil være sikker på at karakteren er nå små,
og så jeg kan eller ved 32, og 32 betyr 'a' - A.
Men legg merke til, av samme resonnement som den forrige, at hvis
brevet var allerede små bokstaver, så øringen med 32 bare holder det små bokstaver.
Det har ikke endret det opprinnelige karakter.
Men nå har jeg ikke trenger å unngå å si: "Hvis det er små, bare glem det,
hvis det er store bokstaver, og deretter endre det. "
Det er mye mer praktisk å gjøre dette.
[Student] Vil at strategien å trekke store fra små arbeid hvis det ikke var 32?
Hvis det var, liker, 34 eller noe?
Så må du vite at forskjellen mellom de 2 er -? >> 1 bit.
Det kan være mer enn 1 bit, så lenge alle biter nedenfor denne posisjonen er de samme.
Så vi trenger minst 26 tegn - eller er det 26 tegn.
Så vi trenger minst 26 tall å representere forskjellen -
Forskjellen mellom A og 'a' må være minst 26,
eller annet vi ikke ville ha representert alle hovedstedene tall.
Det betyr at A, hvis vi starter på 1, det kommer til å bruke alle disse bitene,
alle disse første 5 biter, for å representere alt gjennom Z.
Det er derfor den neste bit, eller dette litt, er neste bit den som er valgt å skille mellom A og 'en.
Det er også grunnen til at, i ASCII-tabellen, det er 5 symboler som skiller store bokstaver fra små bokstaver.
Siden de er symboler, de ekstra 5 som bringer opp 32 er forskjellen mellom dem.
[Student] Så vi kunne gjøre det, fordi ASCII er laget på den måten.
Ja. Men ASCII - forskjellen kan også være både av disse biter.
Som, hvis A var 10000001, og 'a' var 11100001 - jeg glemmer, uansett.
Men hvis det var dette, så vi kan fortsatt bruke 'a' - A.
Det er bare nå forskjellen mellom A og 'a' er fortsatt disse to biter.
Jeg tror det er skrevet 48. Er det 32 ​​+ 64? Jeg tror det er?
Det vil fortsatt være to biter, hver eneste karakter, som, Z og z, K og k,
de ville fortsatt ha de samme bits satt bortsett fra de to biter.
Så lenge det er alltid sant, uavhengig av om vi bruker ASCII eller noen andre systemer,
så lenge det er bare et visst antall biter som er forskjellige for hvert tegn,
så det fungerer fint.
Det er bare at 32 ble satt opp fordi det er den første vi kunne bruke. >> Cool.
Jeg pleier å foretrekke, i tilfelle du ikke har sett, hvis blokken er bare en enkelt linje,
du kan bli kvitt de klammeparentes, så jeg pleier å foretrekke å gjøre dette.
Også, vet du hvordan vi kan gjøre ting som s [i] + = 1?
Du kan også gjøre s [i] bitvis AND = 32.
Og bitvis OR = 32.
Også telle mod 2 == 0.
Så husk det - jeg vil ikke skrive det - noen annen verdi enn null er sant, og 0 er usann.
Så "hvis teller mod 2 == 0" er den samme som å si "hvis ikke telle mod 2."
Jeg ville sannsynligvis ha bare snudd linjene og sa, "hvis teller mod 2,
gjør det eller 1, andre gjør det og 1, "slik at jeg ikke trenger det" ikke ".
Men dette fungerer like bra.
Og hva annet kan jeg gjøre her?
Du kan kombinere dem med trefoldig hvis du ville, men da det ville bare gjøre ting Messier
og sannsynligvis vanskeligere å lese, så vi vil ikke gjøre det.
Alle som har noen andre forslag?
Er det alt problemet bedt om? Oh yeah.
Så bli kvitt disse tomme linjer, nå vil vi ut f,% s er en for strykere,
Vi vil skrive ut f, s.
Nå la oss kjøre den. Gjorde jeg noe galt?
Det er en \ ", jeg vil ha en n.
Okay. Nå skal vi kjøre den. Det vil sannsynligvis kjefte på meg.
Strlen er i string.h.
Så dette er det fine med Clang er den forteller deg hva den er i,
i stedet for GCC som bare sier "Hei, du glemte noe, jeg vet ikke hva det var."
Men dette vil fortelle meg, "Du er ment å inkludere string.h."
Så jeg ikke be om noe, så det er ikke å si noe.
Men vi vil gjøre sitt eksempel, "Takk 4 add".
Det ser rett. Hurra.
Så tilbake til hovedsiden, jeg nesten aldri gjøre det.
Det er valgfritt. Og viktigste er den eneste funksjonen som det er valgfritt.
Hvis du ikke kommer tilbake noe fra main, er det antatt at du mente å returnere 0.
Spørsmål?
Okay. Så nå det andre problemet.
"Recall fra uke 2 nest forelesning på at bytte to variabler verdier ved å sende
de to variablene til en funksjon (selv om kalt swap) ikke akkurat fungerer, i hvert fall ikke uten 'pekere. "
Og ignorere pekere til vi kommer til dem.
Vi ønsker å bytte to variabler, vi bruker ikke en funksjon for å gjøre det.
Vi fremdeles kommer til å gjøre det i hoved som det står.
Men for å bruke disse to variablene, ønsker vi ikke å bruke en midlertidig variabel.
Det er 2 måter å gjøre dette.
Du kan gjøre det ved hjelp av tradisjonelle binære operatorer.
Så vet noen en rask og skitten måte å gjøre det?
Det kan faktisk ta et minutt å tenke på. Hvis jeg har -
Jeg skal sette problemet opp som de spør. Så hvis jeg har to variabler, A, som er bare et heltall
at de gir meg, og summen variabel B, som er en annen heltall som jeg får.
Så hvis jeg har disse to variablene, nå vil jeg bytte dem.
Den tradisjonelle, ved hjelp av din vanlige binære operatører, mener jeg, som +, -, ÷.
Ikke bitvis operatører som virker på binær.
Så bruker -, +, ÷, og alle disse.
Vi kunne bytte ved å gjøre noe som en = a + b, og b = a - b, a = a - b.
Så, sunn fornuft sjekk, og så får vi se hvorfor det fungerer.
La oss si a = 7, b = 3, så a + b kommer til å bli 10 år.
Så vi nå setter a = 10, og deretter vi gjør b = a - b.
Så vi gjør b = a - b, som kommer til å være 7, og b = a - b igjen,
eller a = a - b. Som kommer til å være 10 - 7 som er tre.
Så nå, riktig, 'a' var 7, b var 3, og nå b er 7 og 'a' er 3.
Så den slags er fornuftig, 'a' er kombinasjonen av de to tall.
På dette punktet, 'a' er kombinasjonen, og så skal vi trekke ut den opprinnelige b,
og så skal vi trekke ut hva som var den opprinnelige 'en.'
Men dette fungerer ikke for alle tall.
For å se dette, la oss vurdere et system, så vi vanligvis tenker på heltall som 32 biter.
La oss arbeide med noe som er bare som 4 biter.
Forhåpentligvis kommer jeg opp med et godt eksempel akkurat nå.
Så, jeg vet, dette vil være lett.
La oss si at våre to tall 1111, og 1111, så vi er i binær akkurat nå.
I faktiske desimaler, hvis du ønsker å tenke på det på den måten, a = 15 og b = 15.
Og så vi forventer, etter at vi bytte dem - de trenger ikke engang å være de samme tallene,
men jeg gjorde det på denne måten.
La oss gjøre dem ikke de samme tallene. La oss gjøre 1111 og 0001.
Så en = 15 og b = 1.
Etter at vi bytte dem, forventer vi 'a' for å være 1 og b for å være 15.
Så vår første trinnet er a = a + b.
Våre tall er bare 4 biter bred, så 'en,', som er 1111, + b, som er 0001,
kommer til å ende opp med å bli 10000, men vi har bare 4 biter.
Så nå a = 0.
Og nå ønsker vi å sette b = a - b - faktisk, dette fortsatt fungerer perfekt.
a = a - b - la oss se om dette fungerer perfekt.
Så deretter b = 0 - 1, som ville fremdeles være 15, og deretter en = a - b, noe som ville være en.
Kanskje dette virker.
Jeg føler at det er en grunn til at det ikke fungerer med vanlig.
Ok, så legger til grunn at det ikke fungerer med vanlige binære operasjoner,
og jeg vil se etter - Jeg vil google for å se om det er sant.
Så vi ønsker å gjøre det ved hjelp av bitvis operatører, og ledetråd her er XOR.
Så introduserer XOR (^) hvis du ikke har sett den ennå.
Det er, igjen, en bitvis operatør slik at den fungerer litt etter litt, og det er -
Hvis du har de bit 0 og 1, så dette vil være en.
Hvis du har bitene 1 og 0, vil det være en, har du bit 0 og 0 det vil være 0,
og hvis du har bitene 1 og 1 vil det være 0.
Så det er som OR. Hvis en av bitene er sant, er det en, men i motsetning til OR, kan det ikke være begge biter som er sant.
Eller ville ha dette være en, ville XOR ha dette være 0.
Så vi kommer til å ønske å bruke XOR her.
Tenk på det et øyeblikk, jeg skal til Google.
Vel, du kan ikke lese det, jeg er for tiden på XOR swap algoritmen side.
Forhåpentligvis vil dette forklare hvorfor jeg L ° vernes -
Dette er nøyaktig den algoritmen som vi nettopp gjorde.
Jeg ser fortsatt ikke hvorfor - jeg må ha plukket et dårlig eksempel,
men dette tilfellet hvor 'a' skjedde til å bli 0, etter å komme til 5 biter, så nå 'a' er 0,
det er det som kalles "heltallsoverflyt."
Ifølge Wikipedia, "I motsetning til XOR swap, krever denne varianten at den bruker noen metoder
for å garantere at x + y ikke forårsaker heltalloverflyt. "
Så dette har problemer, dette var heltallsoverflyt, men jeg gjorde noe galt.
Jeg er ikke sikker. Jeg skal prøve å komme opp med en annen.
[Student] Vel, er ikke heltallsoverflyt når du prøver å sette et tall i det
større enn mengden biter du har tildelt?
Ja. Vi har 4 biter. That - vi hadde 4 biter, vi så prøve å legge 1 til det, slik at vi ender opp med 5 biter.
Men den femte bit bare blir avskåret, ja.
Det kan faktisk -
[Student] kaster du en feil, eller gjør det - ville det kaste en feil?
Nei Så det er ingen feil. Når du kommer til forsamlingen nivå, en spesiell bit
et sted er satt som sa at det var en overflyt, men i C snilt av deg bare ikke beskjeftige seg med.
Du faktisk ikke kan takle det, med mindre du bruker spesielle monteringsanvisning i C.
La oss tenke XOR swap.
Og jeg tror Wikipedia-artikkelen har kanskje også vært å si at -
Så det tok også opp modulær aritmetikk, så jeg antar jeg var i teorien gjør modulær aritmetikk
da jeg sa at 0 - 1 er 15 igjen.
Så det kan faktisk - på en vanlig prosessor som gjør 0 - 1 = 15.
Siden vi ender opp på 0, trekker vi en, så da det brytes bare tilbake rundt til 1111.
Så denne algoritmen kan faktisk fungere, a + b, a - b, b - a, det kan være fint.
Men det er noen prosessorer som ikke gjør det, og så det ikke ville være fint i de bestemte seg.
XOR swap vil fungere på alle prosessorer. Okay.
Tanken er at det skal være den samme, skjønt.
Hvor vi bruker XOR å liksom få informasjon både inn en av variablene,
og trekk deretter ut informasjon om de enkelte variablene igjen.
Så har noen ideer / svaret?
[Student svar, uforståelig]
Så dette skal fungere, og også er XOR kommutativ.
Uansett hvilken rekkefølge disse 2 tallene tilfeldigvis er i her oppe,
dette resultatet skal være den samme.
Så en ^ b er b ^ en.
Du kan også se dette skrevet som en ^ = b, b ^ = a, a ^ = b igjen.
Så dette er rett, og for å se hvorfor dette fungerer, tenk på de biter.
Ved hjelp av en smallish nummer, la oss si 11001, og 01100.
Så dette er 'a', dette er b.
Så en ^ = b.
Vi kommer til å sette 'a' = til XOR av disse 2 tingene.
Så 1 ^ 0 er 1, 1 ^ 1 er 0, 0 ^ 1 er 1, og 0 ^ 0 er 0, 1 ^ 0 er en.
Så 'a, "hvis du ser på desimaltall, kommer det til å være -
du kommer ikke til å se mye av et forhold mellom den opprinnelige 'a' og den nye 'a'
men ser på bitene, 'a' er nå som en maske av informasjonen
av både den opprinnelige 'A' og den opprinnelige B.
Så hvis vi tar b ^ a, ser vi at vi vil ende opp på den opprinnelige 'en.'
Og hvis vi tar den opprinnelige 'a' ^ den nye 'a, "vi ser vi ender opp på den opprinnelige b.
Så (a ^ b) ^ b = den opprinnelige 'en.'
Og (a ^ b) ^ a = den opprinnelige B.
Det er - en annen måte å se dette er noe XOR selv er alltid 0.
Så 1101 ^ 1101, blir alle biter kommer til å være den samme.
Så det aldri kommer til å bli en sak der en er en 0 og den andre er en.
Så dette er 0000.
Det samme med denne. (A ^ b) ^ b er som en ^ (b ^ b).
(B ^ b) kommer til å være 0, a ^ 0 er bare kommer til å være "en", siden alle bitene er 0.
Så de eneste som kommer til å være der 'a' var opprinnelig en 1 - hadde de.
Og den samme ideen her, jeg er ganske sikker på at det er også kommutativ.
Ja. Jeg sa før at det var kommutativ.
Den ^ 'a', og det er assosiativ, så nå (b ^ a) ^ en.
Og vi kan gjøre b ^ (a ^ a).
Og så igjen, får vi den opprinnelige b.
Så 'a' er nå en kombinasjon av 'a' og b sammen.
Ved hjelp av vår nye combo 'a' vi si b = combo 'a' ^ den opprinnelige b, får vi den opprinnelige 'en.'
Og nå a = combo 'a' ^ den nye b, som var den opprinnelige - eller som nå hva var 'a' eller b.
Det er denne saken her nede. Dette er = b, gamle b..
Så nå er alt tilbake i byttet rekkefølge.
Hvis vi faktisk sett på bitene, b = a ^ b, skal XOR disse to,
og svaret kommer til å bli dette, og deretter a = a ^ b er XORing disse to, og svaret er dette.
Spørsmål? Okay. Så den siste er noe betydelig vanskeligere.
[Student] Jeg tror han har et spørsmål om det. >> Beklager.
[Student] Hva er egentlig raskere? Hvis du bruker denne XOR, eller er det hvis du deklarerer en ny variabel?
Så hva er faktisk raskere, erklærte en ny variabel eller bruke XOR å bytte?
Svaret er, i all sannsynlighet, en midlertidig variabel.
Og det er fordi når den er utarbeidet ned - så i forsamlingen nivå,
Det finnes ikke noe slikt som lokale variabler eller eventuelle midlertidige variabler eller noen av disse greiene.
De er akkurat som - det er minne, og det er registre.
Registrene er hvor ting er aktivt skjer.
Du trenger ikke legge to ting i minnet, du legge til 2 ting i registre.
Og du tar ting fra minnet, i registre for deretter legge dem,
og deretter kan du sette dem tilbake inn i minnet, men all handlingen skjer i registre.
Så når du bruker den midlertidige variabelen tilnærming, vanligvis hva som skjer er
disse to numrene er allerede i registre.
Og deretter fra det punktet på, etter at du har byttet dem,
det vil bare begynne å bruke den andre register.
Uansett hvor du hadde brukt b, vil det bare bruke registeret som allerede lagring 'a ".
Slik at det ikke trenger å gjøre noe for å faktisk gjøre swap. Ja?
[Student] Men det tar også mer minne, ikke sant?
Det vil bare ta mer minne hvis det er behov for å lagre det midlertidig variabel.
Som hvis du senere bruke den midlertidige variabelen igjen et sted,
da - eller du tilordne noe til det midlertidige variabelen.
Så dersom det på noe tidspunkt 'a' b i temp har forskjellige verdier eller noe,
så det kommer til å ha forskjellige steder i minnet, men det er sant at
det er mange lokale variabler som bare eksisterer i registre.
I så fall, er det aldri satt inn i minnet, og slik at du aldri kaster bort minne.
Okay. Siste spørsmål er litt mer.
Så her, i denne CS50 maskinen er det en ordbok.
Og grunnen til dette er fordi [? B66] er en stavekontroll der du skal skrive
bruker hash tabeller eller prøver eller noen datastruktur.
Du kommer til å skrive en stavekontroll, og du kommer til å bruke denne ordboken til å gjøre det.
Men for dette problemet, er vi bare kommer til å se opp for å se om et ord er i ordboken.
Så i stedet for å lagre hele ordboken i noen datastruktur
og deretter se over et helt dokument for å se om noe er stavet feil,
vi bare ønsker å finne en ord. Så vi kan bare skanne over hele ordboken
og hvis vi aldri finne ordet i hele ordboken, så det var ikke der.
Hvis vi skanne over hele ordbok og ser ordet, da vi er gode, vi fant det.
Det står her at vi ønsker å begynne å se på C journal-håndtering funksjon,
siden vi ønsker å lese ordboken,
men jeg vil gi hint her om hvilke funksjoner du bør tenke på.
Jeg skal skrive dem på Spaces.
Så de viktigste du ønsker å se på er f åpen og så, uunngåelig, f lukket,
som vil gå på slutten av programmet, og f scan f.
Du kan også bruke f lese, men du sannsynligvis ikke vil
fordi det - du ikke ender opp som trenger det.
F scan f er hva du skal bruke til å skanne over ordlisten.
Og så du trenger ikke å kode opp løsningen, bare prøve og liker pseudo-koden din vei
til en løsning, og så får vi diskutere det.
Og faktisk, siden jeg allerede ga deg disse, hvis du går inn i noen terminal eller apparatets skall,
Jeg ville - Jeg pleier - hvis du ikke har sett ennå, jeg vet ikke om du gjorde i klassen,
men mannen, så mannen sidene, er ganske nyttig for å se på ganske mye noen funksjon.
Så jeg kan gjøre, liker, mann f, skanning f.
Dette er nå info om skanningen f familien av funksjoner.
Jeg kan også gjøre mannen f, åpne, og som vil gi meg detaljer om det.
Så hvis du vet hvilken funksjon du bruker, eller du leser koden
og du ser noen funksjon, og du er som "Hva gjør dette?"
Bare mannen som funksjon navn.
Det er et par av rare eksempler der du kan ha å si
liker. man 2 som funksjon navn, eller man 3 som fungerer navn,
men du trenger bare å gjøre det hvis man funksjonsnavn skjer ikke å jobbe for første gang.
[Student] Så jeg leser mannen siden for å åpne, men jeg er fortsatt forvirret om hvordan du bruker det, og programmet.
Okay. Mange av man-sidene er mindre enn nyttig.
De er mer nyttig hvis du allerede vet hva de gjør
og du trenger bare å huske rekkefølgen på argumentene eller noe.
Eller de kan gi deg en generell oversikt, men noen av dem er veldig overveldende.
Som f scan f, også. Det gir deg informasjon om alle disse funksjonene,
og 1 linje ned her skjer for å si, "F scan f leser fra strengen punkt eller bekk."
Men f åpne. Så, hvordan ville vi bruke f åpen?
Ideen om et program som må gjøre fil I / O er at
må du først åpne filen du ønsker å gjøre ting med, og uunngåelig,
lese ting fra denne filen og gjøre ting med dem.
F åpen er det vi bruker til å åpne filen.
Ting vi kommer tilbake, så hva filen vil vi åpne, det gir oss -
her står det "/ user / share / dict / ord."
Dette er filen som vi ønsker å åpne, og vi ønsker å åpne den -
vi må eksplisitt angi om vi ønsker å åpne den for å lese eller hvis vi ønsker å åpne den for å skrive.
Det er et par kombinasjoner og sånt, men vi ønsker å åpne dette for lesing.
Vi vil lese fra filen.
Så hva gjør denne avkastningen? Den returnerer en fil stjerne (*),
og jeg vil bare vise alt i variabelen f, så *,
igjen, det er en peker, men vi ønsker ikke å forholde seg til pekere.
Du kan tenke på f som er f nå variabelen du skal bruke til å representere filen.
Så hvis du ønsker å lese fra filen, du leste fra f.
Hvis du ønsker å lukke filen, lukker du f.
Så på slutten av programmet når vi uunngåelig vil lukke filen, hva skal vi gjøre?
Vi ønsker å lukke f.
Så nå den siste filen funksjon som vi kommer til å ønske å bruke er scan f, f scan f.
Og hva det gjør er det skanner over filen på jakt etter et mønster å matche.
Ser på mannen siden her, ser vi int f scan f, ignorere returverdien for nå.
Det første argumentet er filen * stream, så det første argumentet vi kommer til å ønske å passere er f.
Vi skanner enn f.
Det andre argumentet er et format streng.
Jeg vil gi deg et format streng akkurat nå.
Jeg tror vi tilfeldigvis å si, 127s \ n, mye av det er unødvendig.
Ideen om hva som formatstrengen er, er at du kan tenke på scan f som det motsatte av print f.
Så print f, print f vi også bruke denne typen format parameter,
men i print f hva vi gjør er - la oss se på en tilsvarende.
Så ut f, og det er faktisk også f print f, der det første argumentet kommer til å være f.
Når du skriver ut f, kan vi si noe sånt som "print 127s \ n" og hvis vi passerer det noen streng,
det kommer til å skrive ut denne strengen og deretter en ny linje.
Hva 127 betyr, er jeg ganske sikker på, men jeg har aldri innskrenket meg til det,
Du ville ikke engang trenger å si '127 'i utskriften f,
men hva det betyr er skrive de første 127 tegn.
Så jeg er ganske sikker på at det er tilfelle. Du kan google for det.
Men i den neste er jeg nesten positivt, betyr det at.
Så dette er skrive de første 127 tegn, etterfulgt av en ny linje.
F scan f nå, i stedet for å se på en variabel og skrive den ut,
det kommer til å se på noen streng, og lagre mønsteret inn i variabelen.
La oss faktisk bruke skanning f i en annen eksempel.
Så la oss si at vi hadde noen int, x = 4,
og vi ønsket å lage en streng laget av - ønsket å lage strengen
som var som, dette vil komme opp mye senere,
noe som er akkurat som 4.jpg.
Så dette kan være et program der du vil ha summen teller,
oppsummere telleren jeg, og du vil spare en haug med bilder.
Så du vil lagre i.jpg, hvor jeg er noen gjentakelse av loopen din.
Så hvordan skal vi gjøre denne strengen for at JPEG?
Hvis du ønsker å skrive ut 4.jpg, kunne vi bare si print f,% d.jpg,
og da ville det ut for at JPEG.
Men hvis vi ønsker å lagre strengen 4.jpg, bruker vi scan f.
Så streng s - faktisk vi L ° vernes - karakter, røye s, la oss gå 100.
Så jeg nettopp erklært noen utvalg på 100 tegn,
og det er det vi uunngåelig kommer til å bli lagring som JPEG i.
Så vi kommer til å bruke skanning f, og formatet, hvordan vi ville si% d.jpg
for å skrive ut 4.jpg, er formatet på dette kommer til å være% d.jpg.
Så formatet er% d.jpg, hva vi ønsker å erstatte% d med er x,
og nå trenger vi å lagre strengen et sted.
Og hvor vi kommer til å lagre denne strengen er i tabellen er.
Så etter denne linjen med kode, s, hvis vi skriver ut f,% s av den variable s,
det kommer til å skrive ut 4.jpg.
Så f scan f er den samme som skanningen f, bortsett fra nå det ser over denne filen
for hva som kan lagres i s.
Det er hva det siste argumentet skal være.
Vi ønsker å lagre - "Scan f familie av funksjoner skanner både i henhold til formatet som prøvde nedenfor.
Hvis noen blir lagret i festepunktene du kan returnere - "
Nei, vi kan være bra. La meg tenke et sekund.
Så scan f ikke - hva pokker er funksjonen som gjør det?
Så scan f ikke kommer til å ta et heltall og gjøre dot jpg.
Det kommer til å [mumbles].
Lagre int variabel i string int C.
Hva er denne variabelen, eller hva er denne funksjonen heter?
Ja. That - Ja. Så det jeg definerer deg før var s print f,
som - som gjør mye mer fornuftig, hvorfor jeg sa det var mye mer som print f.
Scan f er fortsatt litt som print f, men s print f kommer til å skanne det over
og erstatte variablene og nå lagre det i en streng.
I stedet for å skrive den ut, lagrer den det i en streng.
Så ignorere det helt. Du kan fortsatt tenke på formatet specifier som sånn av print f.
Så nå, hvis vi ønsket å gjøre 4.jpg ting, ville vi gjøre s print f, x av dette.
Så hva scan f gjør - hva ble spørsmålet ditt kommer til å bli?
[Student] Jeg er bare forvirret om hva vi prøver å gjøre her
med at JPEG. Kan du forklare det en gang til?
Så dette var - det er mindre relevante for f scan f nå, forhåpentligvis vil det knytte tilbake på noen slags måte.
Men det jeg opprinnelig hadde tenkt å vise var - dette er faktisk direkte relevant for disse [? F5]
Du kommer til å bruke s print f, hvor si vi har 100 bilder,
og du ønsker å lese 1.jpg image, 2.jpg, 3.jpg.
Så for å gjøre det, må du f åpen, og deretter må du passere i strengen du vil åpne.
Så vi ønsker å åpne 1.jpg, for å lage strengen som er 1.jpg,
vi gjør s print f av% d.jpg--vi ikke gjøre for int i = 0.
i <40, i + +.
Så s print f% d.jpg av jeg.
Så etter denne linjen, nå variabelen eller matrisen s kommer til å 1.jpg.
Eller, 0.jpg, 1.jpg, 2.jpg. Og så kan vi åpne i sin tur hvert bilde for lesing.
Så det er hva som er ut f gjør. Ser du hva som er ut f nå gjør?
[Student] Ok, så det tar - det skaper en streng, something.jpg, og deretter lagrer den.
Ja. Det skaper - dette er et annet format streng, akkurat som skanning f og print f,
der det settes alle variabler i det andre argumentet, kan være s i motsetning til i.
Kanskje - Jeg mener, det er tilfelle. Men uansett den rekkefølgen som argumentene er.
Det kommer til å sette alle variablene i formatstrengen
og deretter lagre i buffer vår, vi kaller det en buffer, er det der vi lagrer strengen.
Så vi lagrer innsiden av s riktig-formatert streng, etter å ha% d blitt erstattet med 4.
[Student] Så hvis vi gjorde dette, er variabelen f bare kommer til å bli omplassert?
Ja. Så vi bør lukke den opprinnelige f før du gjør dette.
Men - og da også, hvis det ikke var en f åpne opp her, så vi trenger å si -
Ja. Men det ville åpne hundre forskjellige filer.
[Student] Men vi ville ikke være i stand til å få tilgang til eller - OK.
Okay. Så scan f, f scan f, er slags av den samme ideen,
men i stedet for, i stedet for å lagre den i en streng, er det mer som du er nå
gå over en brodd og mønstergjenkjenning mot strengen og lagring av resultatene i variabler.
Du kan bruke skanning f å analysere over noe som 4.jpg, og lagre heltall 4 inn summen int x.
Det er hva vi kan bruke skanning f for.
F scan f kommer til å gjøre det på kommandolinjen.
Jeg er faktisk ganske sikker på at dette er hva CS50 biblioteket gjør.
Så når du sier, "få int," det er scan f-ing over - scan f er måten du får inndata fra brukeren.
F scan f kommer til å gjøre det samme, men ved hjelp av en fil for å søke over.
Så her er vi skanning i denne filen.
Det mønsteret vi prøver å matche er noen streng som er 127 tegn
etterfulgt av en ny linje
Så jeg er ganske sikker på at vi kunne selv bare si "matche s", siden i ordlisten
vi måtte ha, vi garantert ingen ord er så lang,
og også f scan f, tror jeg, vil stoppe på den nye linjen, uansett hva.
Men vi vil inkludere ny linje i kampen, og -
[Student] Hvis vi ikke inkluderer den nye linjen, ville det ikke finne deler av et ord?
It - hver - se på ordlisten -
Så i ordboken, disse er alle våre ord.
Hver og en er på en ny linje.
Skanningen f kommer til å plukke opp dette ordet.
Hvis vi ikke tar med den nye linjen, så er det mulig at den neste scan f vil bare lese den nye linjen.
Men inkludert ny linje da vil bare ignorere den nye linjen.
Men vi vil aldri få en del av et ord, siden vi alltid lese opp til en ny linje, uansett hva.
[Student] Men hva hvis du søker etter ordet "cissa," som cissa.
Vil det finne det, og sier det er en kamp?
Så her er vi - det vil lese i - dette er faktisk et godt poeng.
Vi kommer aldri å bruke den gjeldende - ordet vi leter etter er den første kommandolinjen argument.
Så streng, ord = argv en.
Så strengen vi leter etter er argv en.
Vi er ikke ute etter et ord i det hele tatt i vår scan f.
Hva vi gjorde med skanning f blir hvert ord i ordboken,
og deretter når vi har det ordet vi kommer til å bruke strcmp å sammenligne dem.
Vi kommer til å sammenligne våre ord og hva vi bare lese i.
Så uunngåelig, vi kommer til å ende opp med å gjøre en haug med skanning fs
før det bare så skjer at skanning f vil returnere -
det vil returnere en, så lenge det har matchet et nytt ord,
og det vil returnere noe annet så snart den har ikke klart å matche ordet.
Vi leser over hele ordboken, lagring linje etter linje hvert ord i det variable s.
Deretter vi sammenligner ordet med s, og hvis sammenligningen == 0,
strcmp skjer for å bringe 0 hvis en kamp ble gjort.
Så hvis det var 0, så kan vi skrive ut f, matchet,
eller ordet er i ordboken, eller hva du vil skrive ut f.
Og så - vi ønsker ikke å f lukke igjen og igjen.
Dette er den type ting vi ønsker å gjøre, og vi er ikke bare ute etter ord i ordlisten.
Slik at vi kunne gjøre det, hvis vi ønsket å se etter deres mønster, cissa, som du sa før,
hvis vi ønsket å se etter dette mønsteret, så det ville mislykkes i saken
fordi det er egentlig ikke et ord, men en av de ord i ordboken tilfeldigvis har det i den.
Så det ville matche dette ordet, men denne undergruppen av ordet er ikke et ord i seg selv.
Men det er ikke slik vi bruker det, vi leser i hvert ord
og deretter sammenligne ordet vi har med det ordet.
Så vi alltid sammenligner fulle ord.
Jeg kan sende ut de endelige løsningene senere.
Dette er slags nesten det rette svaret, tror jeg.
[Student kommentar, uforståelig]
Oh, jeg bli kvitt det før? Char s, antar jeg vi sa 127 - jeg glemmer hva den største er.
Vi får bare gjøre 128, så nå er er lang nok.
Vi trenger ikke å skrive noe.
Vi kommer også til å ønske å ha å lukke våre fil, og det bør være om det rette svaret.
CS50.TV