[Powered by Google Translate] Afsnit Problem Set 2: Hacker Edition
Rob Bowden, Harvard University
Det er CS50. CS50.TV
Så jeg er Rob. Jeg er en senior i Kirkland. Dette er mit tredje år TFing CS50.
Det er første gang, at vi skifter fra det traditionelle-foredrag-stil sektion,
hvor vi bare lidt gennemgang hvad der skete i foredrag og så jer stille spørgsmål,
nu at være meget mere problem-baseret, hvor vi bruger Spaces, og -
Åh, så idéen er at gå til dette link jeg sendte dig, og så vil du være i mit Space.
Er der nogen der ikke har en bærbar computer? Okay.
Så vi kommer til at bruge det, og vi vil gøre problemerne bor i afsnit
og diskutere dem og finde ud af hvad der er galt
og jeg kunne trække nogle af din kode, og jeg kunne diskutere dine ideer.
Så har nogen haft svært?
Du kan chatte på siden, jeg ved ikke, om vi vil have grund til.
Nu, ligesom den forrige supersection, hvis du var på den klasse, du ved, hvad det handler om.
På alle P sæt der kommer til at være disse sektioner.
Så P-sæt 2, specifikationer, jeg tror du så det på P-sæt 1 allerede.
Men vi kan se på P-sæt 2 for, hvad vi kommer til at gå over i dag.
Og du vil se et afsnit med spørgsmål.
Så det vil være i alle de P-sæt, der vil være en del af spørgsmålene.
Indtil videre har vi sagde, "Overveje dette en mulighed for at øve."
Du vil ikke blive bedt om at indsende dette program.
Tanken er, at de formodes at slags hjælpe dig i gang med problemet sæt.
Jeg gætter på Hacker udgave bliver en masse af dem formodes at bare være nye, interessante ting at lære.
De kan ikke være direkte anvendelig på problemet sæt.
Og lige nu er vi ikke have du sender dem, men i teorien,
for senere problem sæt, kan du indsende dem, og dermed kan du enten komme til afsnit
eller se sektion for at få de svar, eller du kan bare få dem på din egen
hvis du ikke har lyst til at nyde min tilstedeværelse.
Så - jeg tror, ​​det er den første.
Oh. Også under disse dele af spørgsmål, vi også har du stille spørgsmål om de shorts.
Så jeg gætte, i teorien, du skulle se dem før de kom til afsnittet,
men det er fint, hvis du ikke gør det, vil vi gå over dem alligevel.
Så vi kan starte med disse: "Hvordan kan en while-løkke adskiller sig fra en gør-while-løkke?
Hvornår er det sidste særligt nyttigt? "
Så nogen der har nogen -?
[Student] gør-while-løkke altid vil udføre mindst én gang.
Ja. Så det er forskellen. En while-løkke - æ bare gøre det på her - mens loop, har vi den betingelse
lige her, mens en gør-mens, behøver du ikke have en tilstand, indtil vi komme herned.
Og så, når dit program er fuldbyrdende, og det bliver til while-løkken,
den straks kontrollerer, om denne tilstand er sand.
Hvis denne betingelse ikke er sandt, vil det bare springe over løkken helt.
Gør-while-løkke, som programmet udfører, det bliver til "gør."
Der sker ikke noget på dette punkt, bare fortsætter fuldbyrdende.
Så når det rammer ", mens", hvis betingelsen er sand, vil det loop tilbage og gøre det igen
og igen og igen, indtil tilstanden er ikke sandt, og så bare falder igennem.
Så, idet forskellen er, at det kan springe lige fra starten.
Dette nødvendigvis udfører én gang og derefter kan udføre flere gange, hvis betingelsen er stadig sandt.
Så mens løkken vil kun gøre det én gang, eller - mens loop - vi måske ikke behøver at gøre det på alle,
da så snart vi kommer til det, hvis betingelsen er falsk vil vi bare hoppe direkte over det.
Hvorimod do-while-løkke, vil vi udføre det én gang, nødvendigvis.
Derefter, når vi kommer til den betingelse, vi kontrollere, om det er sandt eller falsk.
Hvis det er sandt, vil vi gøre det igen, hvis det er falsk, vil vi bare fortsætte med at gå.
Så hvornår er det sidstnævnte særligt nyttig?
Så jeg kan sige, at i samtlige de 4 år, 3 år, uanset hvad,
at jeg har været programmering, har jeg brugt dette, ligesom, under 10 gange.
Og sandsynligvis 5 af dem er i CS50 når vi indfører do-while-løkker.
Så når du brugt do-while-løkker?
Hvornår er det - yeah?
[Student] Når du forsøger at få bruger-input, eller noget, du vil kontrollere -
Yeah. Så gør-while-løkker, bruger input er den store.
Det er derfor på de første par problematiske sæt, når du ønsker at spørge brugeren, ligesom,
"Giv mig en streng," du kan ikke fortsætte, indtil du får denne streng.
Og så du, nødvendigvis, nødt til at spørge efter strengen mindst én gang.
Men så hvis de besvarer noget dårligt, så er du nødt til at sløjfe tilbage og spørge igen.
Men bortset fra bruger-input, det er meget sjældent, at jeg støder på en sag
hvor jeg vil sløjfe "mindst én gang", men muligvis mere.
Spørgsmål eller -? Har nogen brugt en gør-while-løkke andre steder?
Okay. Så den næste er, "Hvad betyder sort identifikator
angiver normalt hvis udsendt ved Klang? "
Så hvad slags kode kunne jeg skrive for at få 'kaldenavn der?'
[Student] At x = 2?
Så vi kan bare prøve det her, x = 2.
Vi vil køre dette - oh, jeg ikke klikke på det. Så her får vi - okay.
"Brug af kaldenavn x."
Så det er det kaldenavn, en variabel.
Det vil ofte kalder en variabel en identifikator.
Så det kan ikke vide, det er faktisk en variabel og kan ikke vide, hvad det er.
Så det er en identifikator.
Så hvorfor er det sort? Yeah.
Så for at være klar med terminologi, erklæringen af ​​en variabel
er, når du siger "INT x" eller "string y," hvad.
Initialiseringen af ​​variablen, eller overdragelse af den variable,
er, når du siger "x = 2".
Så vi kan gøre dem i separate trin, int x, x = 2, og indtil - kan vi få en masse ting herinde -
men indtil denne linje sker, x fortsat initialiseret, men det er blevet erklæret.
Og så kan vi selvfølgelig gøre det i 1 linie, og nu er vi erklære og initialisering.
Spørgsmål?
Og endelig: "Hvorfor er det Cæsar Cipher ikke meget sikker?"
Så det første, er der nogen ønsker at sige, hvad Cæsar Cipher er?
[Student] Caesar Cipher bare er, at du kortlægger, du skifter hvert bogstav,
et vist antal bogstaver går over, og flytte tilbage over, og det er ikke meget sikker, fordi
Der er kun 26 mulige løsninger, og du bare nødt til at prøve hver 1 af dem, indtil du får det.
Oh. Så skal jeg gentage?
The Caesar Cipher, det er - jeg mener, vil du beskæftige sig med det på de problemer, du -
eller jeg gætte standardudgaven af ​​det problem sæt, der ikke er på hacker udgave.
Så på den standard udgave til problemet sæt, får du en besked som: "Hello, world"
og du også har et tal som 6, og du tager den besked, og hver individuel karakter,
du rotere det med 6 positioner i alfabetet.
Så 'h' i hello ville blive h-i-j-k-l-m-n.
Så det første bogstav ville være n. Vi gør det samme med e.
Hvis vi har en, gerne, z eller noget, så vi wrap tilbage rundt til »en«.
Men hver karakter får cyklet 6 tegn senere i alfabetet, og det er ikke meget sikker
da der kun er 26 muligheder for hvor mange måder, du kan vikle et enkelt bogstav.
Så du kan bare prøve alle 26 af dem, og formentlig i lang nok besked,
kun 1 af disse potentielle 26 ting kommer til at være læselig,
og den læselige man vil være den oprindelige meddelelse.
Så det er ikke en meget god måde at kryptere noget som helst.
Relateret til disse shorts, "Hvad er en funktion?"
Så hvad er en funktion? Ja.
[Student] Det er ligesom et separat stykke kode, som du kan ringe til at gå igennem og derefter få returværdien af ​​hvad som helst.
Yeah. Så jeg vil besvare det ved også at besvare den næste - eller gentag ved også bare besvare den næste.
Du kan bruge funktionerne i stedet for bare at kopiere og indsætte kode igen og igen.
Bare tage denne kode, læg det i en fuction, og så kunne du bare kalde funktionen
hvor du har været kopiere og indsætte.
Så funktioner er hensigtsmæssige.
Så nu vil vi gøre reelle problemer.
Den første. Så tanken om den første er, du passerer det en streng, og uanset -
eller står der med små bogstaver? Det siger ikke alle små bogstaver.
Så budskabet kan være hvad som helst, og - åh nej. Det gør.
"For nemheds skyld kan du antage, at brugeren vil kun input små bogstaver og mellemrum."
Så vi give det en besked med kun små bogstaver og så må vi skifte
mellem kapital og små bogstaver - vi ændre strengen til at være store og små, skiftevis.
Så før vi giver dig en anden til selv dykke ned i problemet,
hvad er den første ting, vi skal gøre?
Åh, hvad gjorde jeg bare klikke på? Åh, jeg lige har klikket på en e-mail her.
Så det første vi skal gøre - jeg kigger på det forkerte?
Er denne del af dette?
Nej, det er stadig derinde, selv om.
Okay, her stadig.
Nu kan vi ikke påtage -? Ja. Her kan vi ikke antage, at det kun er små bogstaver og mellemrum.
Så nu har vi at gøre med det faktum, at bogstaverne kan hvad vi vil have dem til at være.
Og så den første ting, vi ønsker at gøre, er bare få beskeden.
Vi skal bare brug for at få en streng, string s = GetString, okay.
Nu er dette problem, der er et par måder at gøre det.
Men vi vil ønsker at bruge bitvise operatører her.
Er der folk, der enten ikke var på supersection,
eller noget, behøver og ikke ved, hvad bitvise operatører er?
Eller hvordan de relaterer til ASCII på nogen måde?
[Student] Jeg var ikke på supersection, men jeg ved, hvad bitvise operatører er.
Okay. Så jeg behøver ikke at gå over det grundlæggende i dem, men jeg vil forklare
hvad vi vil ønsker at bruge her.
Så 'A': Binær repræsentation af kapital A, antallet er 65 år.
Jeg skal bare se på - 41 bliver 01.000.001.
Så det burde være 65 i decimal, så dette er den binære repræsentation af den karakter kapital A.
Nu den binære repræsentation af den karakter små bogstaver "a"
vil være det samme, næsten. Er det - 6, ja. Det er rigtigt.
Så binær kapital A, binær små 'a'.
Så bemærke, at forskellen mellem A og »a« er denne enkelt bit.
Og det sker for at være den 32 bit, den smule, der repræsenterer antallet 32.
Og det giver mening, idet A er 65, »a« er 97.
Forskellen mellem dem er 32 år.
Så nu ved vi at vi kan konvertere fra A til 'a' ved at tage A
og bitvise ORing det med - det ligner en 1.
Dette er en bitvise OR, med 00100000, og det vil give os 'en'.
Og vi kan få fra 'a' til A ved bitvis AND
med 11, 0 på dette sted, 11111.
Så dette vil så give os præcis, hvad 'a' var, men annullere denne individuelle bit,
så vi har 01000001, jeg ved ikke, om jeg talte ret.
Men denne teknik bitvis OR-ingsorgan at komme fra kapital til små bogstaver,
og bitvis AND at komme fra små bogstaver til kapital er ikke eksklusiv til A.
Alle de breve, K vs K, Z vs z,
alle af dem er lige til at afvige fra denne enkelt bit.
Og så kan du bruge denne til at skifte fra en lille bogstav til enhver stort bogstav og vice versa.
Okay. Så en nem måde at komme fra dette - så i stedet for at skulle
skrive ud, hvad 1011111 er - en nem måde at repræsentere dette nummer, og dette er ikke en
at jeg gik over i supersection, men tilde (~) er en anden bitvis operatør.
Hvad ~ gør, er det ser på bit repræsentation.
Lad os tage et vilkårligt antal.
Dette er blot nogle binære tal, og hvad ~ er er det bare vender alle bits.
Så det var en 1, nu et 0, er dette en 0, nu en 1, 010.100.
Så det er alt ~ gør. Så 32 bliver nummeret - slippe af med det -
så 32 vil være nummer 00.100.000, og så ~ af dette vil være
dette nummer op her, at jeg ANDed 'a' med.
Skal alle se det? Det er temmelig almindeligt, ligesom når du ønsker at finde ud af
til senere ting, som vi måske ser, når vi ønsker at se, om -
eller vi vil have det hele, hver eneste bit sæt bortset fra 1
du har tendens til at gøre ~ af bit, som vi ikke ønsker indstillet.
Så vi ønsker ikke, at 32 bit sæt, så vi ~ af 32.
Okay. Så vi kan bruge alle dem her.
Okay, så det er fint, hvis du ikke er færdig, skal vi langsomt gå over sammen,
eller gå over dette, så - gennem dette. Gå gennem dette.
Så vi har vores streng, og vi ønsker at sløjfe over hvert tegn i denne streng og gøre noget for det.
Så hvordan gør vi sløjfe over en streng? Hvad skal vi bruge?
Jeg har ikke tænkt mig at gøre det på her. Yeah.
Så jeg har min iterator, og han sagde det, men hvordan kan jeg vide, hvor mange tegn er i strengen?
Strlen (s), så jeg + +.
Så hvad jeg har gjort her, er ikke den bedste måde at gøre tingene på.
Er der nogen vide, hvorfor?
Fordi du tjekker sproget i strengen hver eneste gang.
Så vi vil ønsker at flytte strlen, kunne jeg sige op her, int længde = strlen (s),
og derefter skal jeg <længde, og i tilfælde af at du ikke har set det før,
Jeg kunne også gøre int i = 0, længde = strlen (s).
Og så dette er noget at foretrække, da jeg nu har begrænset rækkevidden
af variabel længde til netop denne 'for' loop, i stedet for at erklære det før
og at det altid eksisterer, og i tilfælde af at du ikke fange hvorfor det er dårligt,
eller hvorfor den oprindelige var dårlig, det er - starter på for-løkken.
Jeg tjekkede den betingelse. Er I <længden af ​​s?
Så længden af ​​s, lad os arbejde med "hello" hele tiden.
Så længde s, H-e-l-l-o. Længden er 5.
Så i = 0, længde er 5, så jeg ikke <5, så sløjfen fortsætter.
Så går vi igen. Vi tjekker tilstanden. Er I <længden af ​​hej?
Så lad os se hvor lang hej. H-e-l-l-o. Det er 5, og jeg er ikke <5, så vi fortsætter igen.
Så vi beregne, vi regner goddag, for hver iteration af løkken,
selv troede det aldrig kommer til at ændre, det er altid vil være 5.
Så vi skal bare huske 5 op foran, og nu alt er bedre.
Så iteration over hele strengen.
Hvad ønsker vi at gøre for hvert tegn i strengen?
[Student set uforståelig]
Yeah. Så hvis karakter er ikke-alfabetisk, så vi bare ønsker at springe over den.
Fordi vi kun bekymrer sig om bogstaver i alfabetet, og vi kan ikke udnytte et nummer.
Så hvordan kan vi gøre det? Så vores tilstand, hvis vi ønsker noget så - tjek om det er alfabetisk.
Så hvordan kan vi kontrollere det?
[Student] Du kan bare bruge funktionen er alpha.
Er det inkluderet i en af ​​disse, eller nogen omfatte lignende, char.h eller noget?
Lad os ikke bruge er alpha-funktionen, og brug den eksplicit - så vi har s [i],
der er den ottende karakter s, så husk at en streng er en række tegn,
så den ottende karakter s.
Nu, hvis det er et stort bogstav, vi ved, det skal være i et bestemt område.
Og hvad er det interval?
Yeah. Så hvis s [i] er ≥ 65, og s [i] er ≤ 90, hvad skal jeg gøre i stedet?
Yeah. Så du bør absolut aldrig selv nødt til at kende ASCII værdier noget nogensinde.
Aldrig tænke på tallene 65, 90, 97 og 102, eller hvad det er.
Du behøver ikke - 112 -? Du behøver ikke at kende dem overhovedet. Det er også forkert.
Brug kun de enkelt-citationstegn, ét tilbud konstanter. Så 'A' og mindre end 90 er 'Z.'
Og det er væsentligt bedre - jeg ville ikke vide fra toppen af ​​mit hoved, at Z er 90.
Jeg kender fra toppen af ​​mit hoved, at 'Z' er hovedstad Z.
Så så længe det er i området for kapital A til kapital Z, eller vi kan tjekke for små bogstaver,
Eller hvis det er i intervallet ≥ 'a' og ≤ z.
Så det er vores betingelse.
Stilen for hvor til at sætte disse ting varierer.
Jeg vil gøre det på denne måde.
Nu, hvad vi ønsker at gøre?
Vi ved, at dette brev er et tegn, et bogstav.
Så vi er nødt til at veksle mellem, om det nu skulle være et stort bogstav eller et lille bogstav.
Hvordan kan vi holde styr på hvilken en vi ønsker det skal være?
[Student stemmer, uforståelige]
Så ja, men lad mig tjekke.
Modul 0-2 blev sagt, var et forslag smidt ud, og jeg er enig med det.
Bortset varsel at, ligesom - er dette tilfældet? Yeah.
Det er hver anden, men vi kan ikke modul 2 af i, eller jeg mod 2, da
bemærke, at E er kapital og »a« er små? Men der er en plads, der adskiller dem?
Så de kommer til at være den samme mod 2, men de er forskellige sager.
[Student spørgsmål, uforståelig]
Yeah. Så vi vil bare holde en optælling.
Vi kunne også gøre det i her, hvis vi ønskede, det kan få en lidt uhåndterlig
i for-løkken erklæringer, vil jeg sætte det op her.
Så int count = starter ved 0.
Og så nu, jeg skal tælle, hvor mange alfabetiske tegn, vi har haft.
Så vi uundgåeligt kommer til at tælle + +, da vi fandt en anden bogstav.
Men, så nu du siger, hvis tæller mod 2.
Så hvad nu hvis tæller mod 2? Oh. Jeg vil gøre == 0 for nu.
Vi vil også gå over det. Så hvis tæller mod 2 == 0, hvad så?
[Studerende svar, uforståelige]
Så vi vil have det til at ende store bogstaver.
Der er 2 sager, store og små bogstaver er de 2 sager.
Så hvis vi er med små bogstaver er vi nødt til at gøre det store bogstaver.
Hvis det er stort at vi ikke behøver at gøre noget.
Men, er der en måde - Burde er vendt -
at vi ikke engang behøver at kontrollere, om det er store eller små bogstaver?
Hvad kan vi gøre for altid sikre, at vi altid ender hos store bogstaver?
Så mærke til, hvad vi gjorde for små 'a', hvad nu hvis vi gjorde dette samme nøjagtige ting til store bogstaver A?
Har store bogstaver En ændring, eller gør værdien forandring?
Yeah. Så enhver stort bogstav bitvis ANDed med ~ 32 vil være den samme store bogstaver
fordi for enhver store bogstaver den 32. bit ikke er indstillet.
Så hvis vi ønsker at bringe tegnet s [i], vi vil have det til at blive små eller store bogstaver.
Så hvis det var små, er det nu store bogstaver, hvis det var store bogstaver, er det stadig store bogstaver, og det er det.
Jeg sagde dette i supersection: Du kan bruge 32, hvis du vil, men jeg er tilbøjelig til at foretrække at gøre 'a' - A,
i stedet for bare 32, fordi kan være enhver anden bit.
Efter den 32 bit, kan det være en af ​​disse, eller vi ville ikke have nok
numre til at repræsentere alle tegnene.
Så hvis du får 32 bit, kan det være det 64 bit, kan det være det 128 bit.
Enhver af disse bits kunne være lidt, der skelner mellem store og små bogstaver.
Jeg bør ikke være nødvendigt at vide, at det er den 32 bit.
Jeg kan bruge denne 'a' - A for at få den smule, der varierer mellem de to
uden at skulle stole på det magiske tal, der er 32 år.
Og så nu, ellers tæller var ulige, og så hvad jeg ønsker at gøre?
[Student svar, uforståelig]
[Student] Hvad er det?
Jeg vil gøre det i 1 sekund.
Så nu hvis jeg ønsker at - jeg vil være sikker på den karakter er nu små bogstaver,
og så jeg kan eller henholdsvis 32 og 32 betyder 'et' - A.
Men læg mærke til, af samme begrundelse som den forrige, at hvis
Brevet var allerede små bogstaver, så ORing med 32 bare holder det små bogstaver.
Det har ikke ændret den oprindelige karakter.
Men nu er jeg ikke behøver at undgå at sige, "Hvis det er små, bare glemme alt om det,
hvis det er store bogstaver, derefter ændre det. "
Det er meget mere bekvemt at gøre dette.
[Student] ville denne strategi for at trække det store fra det lille arbejde, hvis det ikke var 32?
Hvis det var ligesom, 34 eller noget?
Så skal du vide, at forskellen mellem de 2 er -? >> 1 bit.
Det kunne være mere end 1 bit, så længe alle bittene under denne position er de samme.
Så vi har brug for mindst 26 tegn - eller, der er 26 tegn.
Så vi har brug for mindst 26 numre til at repræsentere forskellen -
Forskellen mellem A og 'a' skal være mindst 26,
ellers ville vi ikke have repræsenteret hele kapitalen numre.
Det betyder, at A, hvis vi begynder med 1, det vil bruge alle disse bits,
alle disse første 5 bit, til at repræsentere alt gennem Z.
Det er derfor, den næste bit, eller denne bit, den næste bit er den, der har valgt at skelne mellem A og 'a'.
Det er også derfor, i ASCII-tabellen er der 5 symboler adskiller store bogstaver fra små bogstaver.
Da det er de symboler, de ekstra 5, som bringer op 32 er forskellen mellem dem.
[Student] Så vi kunne gøre det, fordi ASCII er designet på den måde.
Ja. Men ASCII - forskellen kan også være begge disse bits.
Ligesom, hvis A var 10000001, og 'a' var 11100001 - jeg glemmer, uanset hvad.
Men hvis det var det, så kunne vi stadig bruge 'a' - A.
Det er bare nu forskellen mellem A og »a« er stadig disse 2 bit.
Jeg tror, ​​det er skrevet 48. Er det 32 ​​+ 64? Jeg tror det er?
Det ville stadig være 2 bit, hver enkelt tegn, gerne, Z og z, K og k,
de ville stadig have nøjagtig de samme bits, der bortset fra de 2 bit.
Så så længe det er altid sandt, uanset om vi bruger ASCII eller et andet system,
så længe der er kun et bestemt antal bits, der er forskellige for hver karakter,
så det fungerer fint.
Det er bare, at 32 blev oprettet, fordi det er den første, vi eventuelt kunne bruge. >> Cool.
Jeg har en tendens til at foretrække, hvis du ikke har set, hvis blokken er kun en enkelt linje,
du kan slippe af med de krøllede parenteser, så jeg har tendens til at foretrække at gøre dette.
Også, du ved, hvordan vi kan gøre ting som s [i] + = 1?
Du kan også gøre s [i] bitvise OG = 32.
Og bitvis OR = 32.
Også tælle mod 2 == 0.
Så husk at - jeg vil ikke skrive det - alle ikke-nul værdi er sandt, og 0 er falsk.
Så "hvis count mod 2 == 0" er det samme som at sige "hvis ikke tælle mod 2".
Jeg ville sandsynligvis har netop vendt linjerne og sagde, "hvis count mod 2,
gør det eller 1, ellers AND 1, "så jeg ikke behøvede den" ikke ".
Men det virker lige så godt.
Og hvad kan jeg gøre her?
Du kan kombinere dem med ternære hvis du ønskede, men så det ville bare gøre tingene Messier
og sandsynligvis sværere at læse, så vi vil ikke gøre det.
Nogen der har nogen andre forslag?
Er det alt det problem bad om? Oh yeah.
Så slippe af med disse tomme linjer, nu vi vil printe f,% s er det år for strygere,
Vi vil udskrive f, s.
Lad os nu køre den. Har jeg gjort noget forkert?
Det er en \ ", jeg vil have en n.
Okay. Nu vil vi køre den. Det vil sandsynligvis yell på mig.
Strlen er i string.h.
Så dette er det gode ved Dunk er det fortæller dig, hvad det er i,
i stedet for GCC, som bare siger: "Hey, du glemte noget, jeg ved ikke hvad det var."
Men det vil fortælle mig, "Du skal indbefatte string.h."
Så jeg ikke bede om noget, så det er ikke at sige noget.
Men vi vil gøre deres eksempel, "Thanks 4 the add".
Det ser rigtigt. Hurra.
Så vender tilbage til din primære, jeg næsten aldrig gør det.
Det er valgfrit. Og main er den eneste funktion, som det er valgfrit.
Hvis du ikke returnerer noget fra vigtigste, er det antaget, at du mente at returnere 0.
Spørgsmål?
Okay. Så nu det andet problem.
"Genopkald fra uge 2 andet foredrag at bytte 2 variabler 'værdier ved at passere
disse 2 variabler til en funktion (selvom kaldet swap) ikke ligefrem virker, i hvert fald ikke uden 'pointers'. "
Og ignorere pointers indtil vi kommer til dem.
Vi ønsker at bytte 2 variabler, og vi bruger ikke en funktion til at gøre det.
Vi vil stadig gøre det i main ligesom det siger.
Men at bruge disse 2 variabler, ønsker vi ikke at bruge en midlertidig variabel.
Der er 2 måder at gøre dette.
Du kan gøre det ved hjælp af dine traditionelle binære operatorer.
Så er der nogen kender en hurtig og beskidt måde at gøre det?
Det kan faktisk tage et minut at tænke på. Hvis jeg har -
Jeg vil sætte problemet op ligesom de spørger. Så hvis jeg har 2 variabler, A, der er lige et heltal
at de giver mig, og sum variabel B, som er en anden heltal, jeg får.
Så hvis jeg har disse 2 variabler, nu vil jeg til at bytte dem.
Den traditionelle, ved hjælp af din almindelige binære operatorer, jeg mener, ligesom +, -, ÷.
Ikke bitvise operatører, der virker på binær.
Så ved hjælp -, +, ÷, og alle dem.
Vi kunne bytte ved at gøre noget i retning af en = a + b, og b = a - b, a = a - b.
Så tilregnelighed kontrollere, og så vil vi se, hvorfor det virker.
Lad os sige a = 7, b = 3, så a + b vil være 10.
Så vi sætter nu a = 10, og så gør vi b = a - b.
Så vi laver b = a - b, som vil være 7, og b = a - b igen,
eller en = a - b. Som vil være 10 - 7, som er 3.
Så nu, rigtigt, »a« var 7, b var 3, og nu b er 7 og »a« er 3.
Så den slags giver mening; 'a' er en kombination af de 2 numre.
På dette tidspunkt, »a« er kombinationen, og så er vi fratrække den oprindelige b,
og så er vi fratrække, hvad der var den oprindelige 'en'.
Men det virker ikke for alle numre.
For at se denne, lad os overveje et system, så vi normalt tænker på heltal som 32 bit.
Lad os arbejde på noget, der er kun ligesom 4 bit.
Forhåbentlig kommer jeg op med et godt eksempel lige nu.
Så jeg ved, det vil være let.
Lad os sige vores 2 tal er 1111, og 1111, så vi er i binær lige nu.
I faktiske decimaler, hvis du ønsker at tænke på det på den måde, en = 15 og b = 15.
Og så forventer vi, efter at vi bytte dem - de behøver ikke engang at være de samme tal,
men jeg gjorde det på denne måde.
Lad os gøre dem ikke de samme numre. Lad os gøre 1111 og 0001.
Så a = 15 og b = 1.
Efter vi bytte dem, forventer vi 'a' til at være 1 og b til at være 15.
Så vores første skridt er en = a + b.
Vores numre er kun 4 bit brede, så 'en', som er 1111, + b, som er 0001,
kommer til at ende med at blive 10000, men vi har kun 4 bit.
Så nu a = 0.
Og nu ønsker vi at sætte b = a - b - faktisk, det virker stadig perfekt.
a = a - b - lad os se om det virker perfekt.
Så b = 0 - 1, hvilket stadig ville være 15, og derefter en = a - b, hvilket ville være 1.
Måske dette virker.
Jeg føler som om der er en grund til det ikke virker ved brug af almindeligt.
Okay, så arbejder ud fra den antagelse, at det ikke virker med regelmæssige binære operationer,
og jeg vil kigge efter - jeg vil Google for at se, om det er sandt.
Så vi ønsker at gøre det ved hjælp af bitvise operatører, og clue her er XOR.
Så indfører XOR (^), hvis du ikke har set det endnu.
Det er, igen, en bitvis operatør, så det virker lidt efter lidt, og det er -
Hvis du har bit 0 og 1, så vil dette være 1.
Hvis du har de bits 1 og 0, vil det være 1, har du bits 0 og 0 det vil være 0,
og hvis du har de bits 1 og 1 det vil være 0.
Så det er ligesom OR. Hvis en af ​​de bits er sande, det er 1, men i modsætning til OR, kan det ikke være begge bits, der er sande.
Eller ville have dette være 1, ville XOR have dette være 0.
Så vi vil ønske at bruge XOR her.
Tænk over det et øjeblik, jeg har tænkt mig at Google.
Nå, kan du ikke læse det, jeg er i øjeblikket på XOR swap algoritme side.
Forhåbentlig vil dette forklare, hvorfor jeg kan-ikke -
Det er netop den algoritme, vi lige har gjort.
Jeg kan stadig ikke se hvorfor - jeg må have lige hentet et dårligt eksempel,
men dette tilfælde, hvor 'a' tilfældigvis blive 0, efter at komme til 5 bits, så nu »a« er 0,
det er, hvad der kaldes "heltalsoverløb".
Ifølge Wikipedia, I modsætning til XOR swap ", denne variation kræver, at den bruger nogle metoder
at sikre, at x + y ikke forårsager et heltalsoverløb. "
Så det har dog problemer, og dette var heltalsoverløb, men jeg gjorde noget forkert.
Jeg er ikke sikker. Jeg vil prøve at komme op med en anden.
[Student] Tja, er ikke heltalsoverløb når du forsøger at sætte et nummer i der
større end den mængde bits du har tildelt?
Yeah. Vi har 4 bits. That's - vi havde 4 bits, vi derefter forsøge at lægge 1 til det, så vi ender med 5 bits.
Men den femte bit bare bliver afskåret, ja.
Det kan faktisk -
[Student] Betyder det smider du en fejl, eller er det - ville det kaste en fejl?
Nej Så der er ingen fejl. Når du kommer til forsamlingen niveau, en speciel bit
et eller andet sted er indstillet, at sagde, at der var et overløb, men i C du slags bare ikke beskæftige sig med det.
Du kan faktisk ikke beskæftige sig med det, medmindre du bruge specielle monteringsvejledning i C.
Lad os tænke over XOR swap.
Og jeg tror, ​​at Wikipedia-artiklen kunne have også sagt, at -
Så det også opdraget modulær aritmetik, så jeg gætte, jeg var i teorien gør modulær aritmetik
da jeg sagde, at 0 - 1 er 15 igen.
Så det kan faktisk - på en almindelig processor, der gør 0 til 1 = 15.
Da vi ender på 0, vi trækker 1, så så er det bare ombrydes tilbage rundt til 1111.
Så denne algoritme kan faktisk arbejde, a + b, a - b, b - a, det kunne være fint.
Men der er nogle processorer, der ikke gør det, og så det ville ikke være fint i disse specifikke dem.
XOR swap vil arbejde på en processor. Okay.
Ideen er, at det er meningen at være den samme, selv om.
Hvor vi bruger XOR en eller anden måde få information om begge i 1 af de variabler,
og træk derefter oplysninger om de enkelte variabler igen.
Så er der nogen har ideer / svaret?
[Student svar, uforståelig]
Så dette bør arbejde, og også, XOR er kommutativ.
Uanset hvilken rækkefølge disse 2 numre tilfældigvis i op her,
dette resultat vil være den samme.
Så en ^ b er b ^ en.
Du kan også se dette skrives som en ^ = b, b ^ = a, a ^ = b igen.
Så det er rigtigt, og at se, hvorfor det virker, tænk på de bits.
Ved hjælp af en smallish tal, lad os sige 11001, og 01.100.
Så dette er 'a', det er b.
Så en ^ = b.
Vi vil være fastsættelse 'a' = til XOR af disse 2 ting.
Så 1 ^ 0 er 1, 1 ^ 1 er 0, 0 ^ 1 er 1 og 0 ^ 0 er 0, 1 ^ 0 er 1.
Så 'en', hvis man ser på det decimaltal, går det at være -
du kommer ikke til at se meget af et forhold mellem den oprindelige »a« og den nye »a«
men ser man på de bits, »a« er nu ligesom en maske af oplysningerne
af både den oprindelige »a« og den oprindelige b.
Så hvis vi tager b ^ a, ser vi, at vi vil ende op på den oprindelige 'en'.
Og hvis vi tager den oprindelige 'a' ^ den nye 'et', ser vi ender vi på den oprindelige b.
Så (a ^ b) ^ b = den oprindelige 'en'.
Og (a ^ b) ^ a = den oprindelige b.
Der er - en anden måde at se dette er noget XOR selv er altid 0.
Så 1101 ^ 1101, er alle delene vil være den samme.
Så der er aldrig kommer til at være et tilfælde, hvor 1 er et 0 og den anden er 1.
Så det er 0000.
Den samme med denne. (A ^ b) ^ b er som en ^ (b ^ b).
(B ^ b) vil være 0, a ^ 0 er bare at være 'a', da alle bits er 0.
Så de eneste, der kommer til at være, hvor »a« var oprindelig en 1 - havde dem.
Og den samme idé her, jeg er temmelig sikker på det er også kommutativ.
Yeah. Jeg sagde før, at det var kommutativ.
Den ^ 'en,' og det er associative, så nu (b ^ a) ^ a.
Og vi kan gøre b ^ (a ^ a).
Og så igen, vi får den oprindelige b.
Så »a« er nu en kombination af 'a' og b sammen.
Ved hjælp af vores nye combo 'a' vi sige b = combo 'a' ^ den oprindelige b, får vi den oprindelige 'en'.
Og nu en = combo 'a' ^ den nye b, som var den oprindelige - eller som nu, hvad der var 'a' eller b..
Det er denne sag hernede. Dette er = b, gamle b.
Så nu er alt tilbage i den byttet rækkefølge.
Hvis vi faktisk set på de bits, b = a ^ b, vil XOR disse 2,
og svaret vil være det, og derefter en = a ^ b er XORing disse 2 og svaret er det.
Spørgsmål? Okay. Så den sidste er noget betydeligt vanskeligere.
[Student] Jeg tror, ​​han har et spørgsmål om det. >> Åh, undskyld.
[Student] Hvad er faktisk hurtigere? Hvis du bruger denne XOR, eller er det, hvis du erklærer en ny variabel?
Så hvad er faktisk hurtigere, om en ny variabel eller bruge XOR at bytte?
Svaret er, efter al sandsynlighed, en midlertidig variabel.
Og det er fordi, når den er kompileret ned - så på samlingen niveau,
Der er ikke sådan noget som lokale variabler eller midlertidige variable eller nogen af ​​disse ting.
De er ligesom - der er hukommelse, og der er registre.
Registre er hvor tingene aktivt sker.
Du behøver ikke tilføje 2 ting i hukommelsen, du tilføjer 2 ting i registre.
Og du sætter tingene fra hukommelsen i registre for derefter at tilføje dem,
og så skal du måske sætte dem tilbage i hukommelsen, men alle handlingen sker i registre.
Så når du bruger den midlertidige variable tilgang, som regel, hvad der sker, er
disse 2 numre er allerede i registre.
Og så fra dette punkt på, efter du har byttet dem,
det vil bare begynde at bruge den anden register.
Overalt du havde brugt b, vil det bare bruge registret, som allerede var lagring 'a'.
Så det behøver ikke at gøre noget til rent faktisk at gøre ombytningen. Ja?
[Student] Men det tager også mere hukommelse, right?
Det vil kun tage mere hukommelse, hvis det er nødvendigt at gemme denne midlertidige variabel.
Ligesom hvis du senere bruge det midlertidige variabel igen et eller andet sted,
så - eller du tildele noget til den midlertidige variabel.
Så hvis du på noget tidspunkt «a, 'b i temp har forskellige værdier eller noget,
så det kommer til at have forskellige steder i hukommelsen, men det er rigtigt,
Der er mange lokale variabler, som kun vil findes i registrene.
I så fald, er det aldrig sat i hukommelsen, og så du aldrig spilder hukommelse.
Okay. Sidste spørgsmål er en smule mere.
Så her i CS50 apparat er der en ordbog.
Og grunden til dette er, fordi [? B66] er en stavekontrol, hvor du vil skrive
bruger hash tabeller eller forsøger eller nogle datastrukturen.
Du kommer til at skrive en stavekontrol, og du skal bruge denne ordbog til at gøre det.
Men for dette problem, er vi bare at kigge op for at se om et enkelt ord findes i ordbogen.
Så i stedet for at gemme hele ordbogen i nogle datastruktur
og derefter kigger over et helt dokument for at se om noget er stavet forkert,
Vi ønsker blot at finde 1 ord. Så vi kan bare scanne hele ordbogen
og hvis vi aldrig finde ordet i hele ordbogen, så det var der ikke.
Hvis vi scanner over hele ordbog og kan se ordet, så vi er gode, vi fandt det.
Der står her, at vi ønsker at begynde at kigge på C sagsakter håndtering af funktion,
da vi ønsker at læse i ordbogen,
men jeg vil give tippet her, hvilke funktioner, du bør tænke på.
Jeg skriver dem på Spaces.
Så de vigtigste, du ønsker at se på, er f åbne og derefter, uundgåeligt, f lukket,
som vil gå i slutningen af ​​dit program, og f scan f..
Du kan også bruge f læse, men du sandsynligvis ikke ønsker at
fordi det - du ikke ender med at skulle det.
F scan f er hvad du skal bruge til at scanne over ordbogen.
Og så behøver du ikke at kode op løsningen, bare prøve og lignende pseudo-kode på din måde
til en løsning, og så vil vi diskutere det.
Og faktisk, da jeg allerede har givet dig disse, hvis du går ind i enhver terminal eller opvaskemaskinens shell,
Jeg vil - jeg plejer - hvis du ikke har set endnu, jeg ved ikke, hvis du gjorde i klassen,
men mennesket, så manden sider, er ganske nyttigt for at kigge på stort set enhver funktion.
Så jeg kan gøre, ligesom, man f, scan f..
Dette er nu den info om scanningen f familie af funktioner.
Jeg kunne også gøre mennesket f, åbne, og det vil give mig nærmere oplysninger om denne.
Så hvis du ved hvad funktion, du bruger, eller du læser koden
og du kan se nogle funktion, og du er ligesom, "Hvad betyder dette?"
Bare mand, funktion navn.
Der er et par af underlige eksempler, hvor du måske nødt til at sige
gerne. mand 2, at funktionen navn, eller menneskeskabte 3, at funktionsnavn,
men du behøver kun at gøre det, hvis mennesket funktionsnavn ikke sker at arbejde første gang.
[Student] Så jeg læser den mand side for åben, men jeg er stadig forvirret om, hvordan man bruger det, og programmet.
Okay. En masse af man-siderne er mindre end nyttige.
De er mere nyttigt, hvis du allerede ved, hvad de gør
og så er du bare nødt til at huske rækkefølgen af ​​de argumenter eller noget.
Eller de kan give dig et generelt overblik, men nogle af dem er meget overvældende.
Ligesom f scan f,. Også Det giver dig de oplysninger om alle disse funktioner,
og 1 linje hernede sker for at sige, "F scan f læser fra strengen punktet eller stream."
Men f åbne. Så hvordan ville vi bruge f åben?
Ideen om et program, som skal gøre fil I / O er, at
skal du først åbne den fil, du ønsker at gøre ting med, og uundgåeligt,
læse ting fra denne fil og gøre ting med dem.
F åbent er, hvad vi bruger til at åbne filen.
De ting, vi kommer tilbage, så hvad fil vil vi åbne, det giver os -
herinde der står "/ user / share / dict / ord."
Det er den fil, vi ønsker at åbne, og vi ønsker at åbne den -
vi er nødt til eksplicit at angive, om vi ønsker at åbne det at læse eller hvis vi ønsker at åbne det at skrive.
Der er et par af kombinationer og kram, men vi ønsker at åbne dette for læsning.
Vi ønsker at læse fra filen.
Så hvad betyder dette afkast? Den returnerer en fil stjerne (*),
og jeg vil bare vise alt i den variable f, så *,
igen, det er en pegepind, men vi ønsker ikke at beskæftige sig med pegepinde.
Du kan tænke på f så, f er nu den variabel, du vil bruge til at repræsentere filen.
Så hvis du ønsker at læse fra filen, du læse fra f.
Hvis du ønsker at lukke filen, du lukker f.
Så i slutningen af ​​programmet, når vi uundgåeligt vil lukke filen, hvad skal vi gøre?
Vi ønsker at lukke f.
Så nu den sidste fil funktion, vi vil ønsker at bruge, er scan f, f scan f..
Og hvad det gør, er det scanner over filen på udkig efter et mønster til at matche.
Ser man på manden side her ser vi int f scan f, ignorere returværdien for nu.
Det første argument er den fil * stream, så det første argument, vi vil ønsker at passere er f.
Vi scanning over f..
Det andet argument er en formatstreng.
Jeg vil give dig en formatstreng lige nu.
Jeg tror, ​​at vi tilfældigvis sige, 127s \ n, en masse, der er unødvendig.
Tanken om, hvad det format strengen er, er du kan tænke på scan f som det modsatte af print f.
Så print f, print f vi også bruge denne type format parameter,
men i trykt f hvad vi laver, er - lad os se på en tilsvarende.
Så print f, og der er faktisk også f print f, hvor den første argument vil være f..
Når du udskriver f, kunne vi sige noget lignende, "print 127s \ n" og derefter, hvis vi passere det noget snor,
det kommer til at udskrive denne streng, og derefter en ny linje.
Hvad 127 betyder, jeg er temmelig sikker på, men jeg har aldrig begrænset mig til det,
Du ville ikke engang behøver at sige '127 'i print f,
men hvad det betyder er at udskrive de første 127 tegn.
Så jeg er temmelig sikker på det er tilfældet. Du kan google for det.
Men i det næste er jeg næsten positiv betyder det, at.
Så dette er udskrive de første 127 tegn, efterfulgt af en ny linje.
F scan f nu, i stedet for at se på en variabel og udskrive det,
det kommer til at se på nogle snor, og gemme mønsteret i den variable.
Lad os rent faktisk bruger scan f i et andet eksempel.
Så lad os sige vi havde nogle int, x = 4,
og vi ønskede at skabe en streng lavet af - ønskede at skabe strengen
det var ligesom, det vil komme op langt senere,
noget, der er ligesom 4.jpg.
Så dette kunne være et program, hvor du vil have sum tæller,
opsummere imødegå i, og du ønsker at gemme en masse billeder.
Så du vil gemme i.jpg, hvor i er nogle iteration af din løkke.
Så hvordan kan vi gøre denne streng til at JPEG?
Hvis du ønskede at udskrive 4.jpg, kunne vi bare sige print f,% d.jpg,
og så ville det udskrive for at JPEG.
Men hvis vi ønsker at gemme strengen 4.jpg, vi bruger scan f.
Så streng s - faktisk vi kan-ikke - tegn, char s, lad os gå 100.
Så jeg netop erklæret nogle vifte af 100 tegn,
og det er hvad vi uundgåeligt kommer til at gemme, at JPEG i.
Så vi vil bruge scan f, og formatet, hvordan vi ville sige% d.jpg
for at udskrive 4.jpg er formatet af dette vil være% d.jpg.
Så formatet er% d.jpg, hvad vi ønsker at erstatte% d med, er x,
og nu vi er nødt til at gemme denne streng eller andet sted.
Og hvor vi vil gemme denne streng er i array s.
Så efter denne linje kode, s, hvis vi udskriver f,% s af den variable s,
det kommer til at udskrive 4.jpg.
Så f scan f er det samme som scan f, undtagen nu er det kigger over denne fil
for hvad man skal gemme i sek.
Det er, hvad den sidste argument vil være.
Vi ønsker at gemme - "Scan f familie af funktioner scanninger i begge efter format som forsøgte nedenfor.
Hvis nogen er gemt på den placering punkter, du kan vende tilbage - "
Nej, vi kan være godt. Lad mig tænke et sekund.
Så scan f ikke - hvad dælen er den funktion, som gør det?
Så scan f er ikke til at tage et heltal og gøre dot jpg.
Det kommer til at [Mumbles].
Gem int variabel i snor int C.
Hvad er denne variabel, eller hvad kaldes denne funktion?
Ja. That's - ja. Så hvad jeg definere til dig før var s print f,
der - det giver meget mere mening, hvorfor jeg sagde det var meget mere som print f..
Scan f er stadig lidt ligesom print f, men s print f kommer til at scanne det over
og erstatte de variable og nu gemme det i en streng.
I stedet for at udskrive det, gemmer den det i en streng.
Så ignorere det helt. Du kan stadig tænke på format Projekteringsvejledning som ligesom i print f.
Så nu, hvis vi ønskede at gøre det 4.jpg ting, ville vi gøre s print f, x af dette.
Så hvad scan f gør - hvad der var dit spørgsmål vil være?
[Student] Jeg er bare forvirret på, hvad vi forsøger at gøre lige her
med det JPEG. Kan du forklare, at 1 mere tid?
Så det var - det er mindre Relevante til f scan f nu, forhåbentlig, vil det binde tilbage i en slags måde.
Men hvad jeg oprindeligt havde til hensigt at vise var - dette er faktisk direkte relevant for disse [? F5]
Du skal bruge s print f, hvor siger vi har 100 billeder,
og du ønsker at læse billedet 1.jpg, 2.jpg, 3.jpg.
Så for at gøre det, skal du f åben, og så er du nødt til at passere i den streng, du vil åbne.
Så vi ønsker at åbne 1.jpg, for at skabe den streng, der er 1.jpg,
vi gør s print f af% d.jpg--vi ikke gøre for int i = 0.
i <40, i + +.
Så s print f% d.jpg af i.
Så efter denne linje, nu variabel eller array s kommer til at 1.jpg.
Eller 0.jpg, 1.jpg, 2.jpg. Og så vi kan åbne efter tur hvert billede for læsning.
Så det er, hvad s udskriver f gør. Kan du se hvad s udskriver f er nu gør?
[Student] Okay, så det tager - det skaber en streng, something.jpg, og derefter gemmer den.
Ja. Det skaber - det er en anden format streng, ligesom scan f og print f,
hvor den indsætter alle de variabler i det andet argument, kan være s modsætning til i.
Måske - Jeg mener, det er tilfældet. Men uanset rækkefølgen af ​​argumenterne er.
Det kommer til at indsætte alle de variabler i det format strengen
og derefter gemme i vores buffer, vi kalder en buffer, det er hvor vi opbevare strengen.
Så vi gemmer inde i s den korrekt-formateret streng, idet% d blevet erstattet med 4.
[Student] Så hvis vi gjorde dette, er den variable f bare at forflytte?
Ja. Så vi bør lukke den oprindelige f før du gør dette.
Men - og derefter også, hvis der ikke var en f åbner op her, så ville vi nødt til at sige -
Yeah. Men det ville åbne hundrede forskellige filer.
[Student] Men vi ville ikke være i stand til at få adgang til eller - okay.
Okay. Så scan f, f scan f, er lidt den samme idé,
men i stedet for, i stedet for at lagre det i en streng, er det mere som om du er nu
går over en brod og mønstertilpasning over denne streng og lagring af resultaterne i variabler.
Du kan bruge scan f for at parse over noget lignende 4.jpg, og gemme heltal 4 i sum int x.
Det er, hvad vi kan bruge scan f for.
F scan f vil gøre det på kommandolinjen.
Jeg er faktisk temmelig sikker på det er, hvad CS50 biblioteket gør.
Så når du siger, "få int," det er scan F-ing over - scan f er den måde, du får input fra brugeren.
F scan f kommer til at gøre det samme, men ved hjælp af en fil til at scanne over.
Så her er vi scanner over denne fil.
Det mønster, vi forsøger at matche er nogle streng, der er 127 tegn lang
efterfulgt af en ny linie
Så jeg er temmelig sikker på, vi kunne endda bare sige "match s," da i ordbogen
vi tilfældigvis har, vi garanteret ingen ord er, at lange,
og også f scan f, jeg tror, ​​vil stoppe ved den nye linje uanset hvad.
Men vi vil inkludere den nye linje i kampen, og -
[Student] Hvis vi ikke inkluderer den nye linje, ville det ikke finde dele af et ord?
Det - hver - se på ordbogen -
Så i ordbogen, er disse alle vores ord.
Hver enkelt er på en ny linje.
Scanningen f kommer til at afhente dette ord.
Hvis vi ikke medtager den nye linje, så er det muligt, at den næste scanning f bare vil læse den nye linje.
Men herunder nye linje, så vil bare ignorere den nye linje.
Men vi vil aldrig få en del af et ord, da vi altid læser op til en ny linje, uanset hvad.
[Student] Men hvad nu, hvis du søger efter ordet "Cissa," som Cissa.
Vil det finde det, og sige, det er en kamp?
Så her er vi - det vil læse i - det er faktisk en god pointe.
Vi aldrig bruger den nuværende - det ord, vi leder efter, er den første Kommandolinjeargumentet.
Så snor, ord = argv 1.
Så strengen, vi leder efter, er argv 1.
Vi er ikke på udkig efter et ord på alle i vores scan f.
Hvad vi gør med scan f er at få hvert ord i ordbogen,
og så når vi har det ord vi vil bruge strcmp at sammenligne dem.
Vi vil sammenligne vores ord, og hvad vi lige har læst i.
Så uundgåeligt, vi kommer til at ende med at gøre en masse scan fs
indtil det bare så sker det, at scan f vil vende tilbage -
det vil vende tilbage en, så længe det har matchet et nyt ord,
og det vil vende tilbage noget andet, så snart den har undladt at matche ordet.
Vi læser hele ordbogen, lagring linie for linie hvert ord i den variable s.
Så vi sammenligner ord med s, og hvis sammenligningen == 0,
strcmp sker for at bringe 0, hvis en kamp blev lavet.
Så hvis det var 0, så vi kan printe f, matchet,
eller ord er i ordbogen, eller hvad du ønsker at udskrive f.
Og så - vi ønsker ikke at f lukke igen og igen.
Det er den slags ting, vi ønsker at gøre, og vi er ikke bare på udkig efter ord i ordbogen.
Så vi kunne gøre det, hvis vi ønskede at lede efter deres mønster, Cissa, som du sagde før,
hvis vi ønskede at lede efter det mønster, så det ville svigte i sagen
fordi det er faktisk ikke et ord, men et af ordene i ordbogen tilfældigvis har det i det.
Så det ville matche dette ord, men denne delmængde af ordet er ikke et ord i sig selv.
Men det er ikke, hvordan vi bruger det, vi læser i hvert ord
og derefter sammenligne det ord vi har med det ord.
Så vi er altid sammenligne hele ord.
Jeg kan sende de færdige løsninger senere.
Dette er slags næsten det rigtige svar, tror jeg.
[Student kommentar, uforståelig]
Åh, jeg slippe af med det før? Char s, jeg gætter vi sagde 127 - jeg har glemt hvad det største er.
Vi vil bare gøre 128, så nu s er lang nok.
Vi har ikke brug for at udskrive noget.
Vi vil også gerne have at lukke vores fil, og det burde handle om det rigtige svar.
CS50.TV