[Powered by Google Translate] Artikel Problem Stel 2: Hacker Edition
Rob Bowden, Harvard Universiteit
Dit is CS50. CS50.TV
So, ek is Rob. Ek is 'n senior in Kirkland. Dit is my derde jaar TFing CS50.
Dit is die eerste keer dat ons is besig om te verander van die tradisionele lesing-styl artikel,
waar ons net 'n soort van hersiening wat gebeur het in die lesing en dan julle vra vrae,
nou na 'n baie meer probleem-gebaseerde, waar ons Gebruik spasies, en -
O, so die idee is om te gaan na die skakel Ek het julle gestuur, en dan sal jy in my ruimte.
Is daar iemand wat nie 'n laptop? Okay.
So ons gaan om te word deur gebruik te maak van hierdie, en ons gaan om te doen probleme woon in artikel
en bespreek hulle en die uitzoeken wat verkeerd is
en ek kan trek sommige van die kode, en ek kan bespreek jou idees.
So het almal het probleme?
Jy kan chat op die kant, ek weet nie of ons sal rede vir daardie.
Nou, soos die vorige supersection, as jy was op daardie klas, jy weet wat dit gaan.
Op alle P stelle daar gaan wees hierdie afdelings.
So P-set 2, spesifikasies, ek dink jy het dit gesien op P-set 1.
Maar ons kan kyk na P-set 2 vir die wat ons gaan om te gaan oor vandag.
En jy sal sien 'n gedeelte van die vrae.
Sodat dit sal wees in al die P-stelle, daar sal 'n gedeelte van die vrae.
Tot dusver het ons gesê, "Beskou dit 'n geleentheid om te oefen."
Jy sal nie gevra word om hierdie program in te dien.
Die idee is dat dit veronderstel is om te soort van help om te begin met die probleem stel.
Ek dink op die Hacker uitgawe, word 'n baie van hulle veronderstel is om te wees net nuwe, interessante dinge om te leer.
Hulle mag nie direk van toepassing is op die probleem stel.
, En nou is ons nie met u dit stuur, maar in teorie,
vir later probleem stelle, kan jy stuur hulle, en dus kan jy óf artikel
of kyk na die artikel om die antwoorde te kry, of jy kan net kry hulle op jou eie
As jy voel nie soos my teenwoordigheid geniet.
Sodat die - ek dink dit is die eerste een.
Oh. Ook onder hierdie afdelings van die vrae wat ons ook vra jy vrae oor die kortbroek.
So ek dink, in teorie, jy veronderstel is om dit te kyk voordat hulle artikel,
maar dit is goed as jy dit nie doen nie, ons gaan oor hulle in elk geval.
Sodat ons kan begin met hierdie: "Hoe verskil 'n while lus van 'n do-while lus?
Wanneer is die laaste veral nuttig? "
So iemand enige?
[Studente] Die do-while lus sal altyd ten minste een keer uit te voer.
Ja. So wat is die verskil. 'N while lus - I'll doen dit net hier - terwyl loop, het ons die toestand
reg hier, terwyl 'n doen-terwyl jy nie 'n voorwaarde tot kry ons hier af.
En ja, wanneer jou program se uitvoer, en dit kry na die while lus,
dit kontroleer of dit onmiddellik as hierdie toestand is waar.
As daardie toestand is nie waar nie, dit sal net slaan oor die lus heeltemal.
Do-while lus, as die program uitvoer, dit raak aan die "doen."
Niks gebeur op hierdie punt, gaan net voort uitvoering.
Dan wanneer dit treffers die "ruk," as die toestand waar, sal dit loop terug en doen dit weer
en weer en weer totdat die toestand is nie waar nie en dan net val deur.
Dus, die verskil is dat hierdie reg van die begin af kan slaan.
Dit voer noodwendig een keer en dan kan uitvoer meer as die toestand is nog steeds waar.
So sal die while lus net doen dit een keer, of - die while lus - kan ons nie nodig het om dit te doen nie,
sedert sodra ons kry om dit, indien die toestand vals is, sal ons net reg slaan oor dit.
AANGESIEN dat die do-while lus, sal ons dit uit te voer een keer, noodwendig nie.
Dan, wanneer kry ons aan die voorwaarde, ons kyk of dit waar of vals is.
As dit waar is, sal ons doen dit weer, indien dit onwaar is, sal ons net verder gaan.
So wanneer die laaste is veral nuttig?
Sodat ek kan sê dat in die geheel van die 4 jaar, 3 jaar, wat ook al,
dat ek programmering, het ek gebruik gemaak van hierdie, soos, onder 10 keer.
En waarskynlik 5 van hulle is in CS50 wanneer ons die invoering van do-while loops.
So wanneer het jy do-while loops gebruik?
Wanneer is die - ja?
[Studente] As jy probeer om toevoer van die gebruiker, of iets te kry wat jy wil om te kyk -
Ja. So do-while loops, toevoer van die gebruiker is die groot een.
Dit is die rede waarom op die probleem vir die eerste paar stelle, wanneer jy wil die gebruiker te vra, soos,
"Gee my 'n string," jy kan nie voortgaan nie totdat jy daardie string.
En julle, noodwendig nie, moet ten minste een keer te vra vir die string.
Maar dan as hulle iets sleg beantwoord, dan moet jy nodig het om te loop terug en vra weer.
Maar anders as die toevoer van die gebruiker, dit is baie selde dat ek 'n geval teëkom
waar ek wil loop "ten minste een keer", maar moontlik meer.
Vrae of? Het iemand 'n do-while lus nêrens anders gebruik?
Okay. So die volgende een: "Wat het swart identifiseerder
gewoonlik 'n aanduiding of outputted deur kletteren? "
So, watter soort van die kode kon ek skryf te kry "onverklaarde identifiseerder?"
[Studente] dat x = 2?
Sodat ons net kan probeer om dit hier, x = 2.
Ons sal hardloop - oh, ek het dit nie op nie. So hier is ons kry - alles reg.
"Gebruik van onverklaarde identifiseerder x."
So dit is die onverklaarde identifiseer, 'n veranderlike.
Sal dit dikwels noem 'n veranderlike 'n identifiseerder.
Sodat dit dalk nie weet dat dit eintlik 'n veranderlike, dit nie weet wat dit is.
So dit is 'n identifiseerder.
So hoekom is dit receptie.Niet aangemelde? Ja.
So te wees nie duidelik op terminologie, die verklaring van 'n veranderlike
is wanneer jy sê "int x," of "string y," wat ook al.
Die inisialisering van die veranderlike, of die opdrag van die veranderlike,
is wanneer jy sê "x = 2."
Sodat ons dit kan doen in afsonderlike stappe, int x, x = 2, en totdat ons kan 'n klomp dinge hier -
maar totdat hierdie lyn gebeur, is nog steeds x geïnitialiseerd, maar dit verklaar is.
En so kan ons natuurlik doen dit in 1 lyn, en nou is ons verklaar en inisialisering.
Vrae?
En uiteindelik, "Hoekom is die keiser Cipher nie baie veilig nie?"
So die eerste, nie almal wil sê wat die keiser Cipher is?
[Studente] Caesar Cipher is net dat jy die kaart, jy skuif elke brief,
'n sekere aantal van die briewe gaan verby, en beweeg terug oor, en dit is nie baie veilig nie, want
daar is net 26 moontlike opsies en jy het om te probeer om elke 1 van diegene totdat jy dit kry.
Oh. Dus, moet ek herhaal?
Die keiser Cipher, it's - ek bedoel, jy handel met dit op die probleme wat jy
of ek dink die standaard uitgawe van die probleem stel wat is nie op die hacker uitgawe.
So op die standaard uitgawe vir die probleem wat gestel is, kry jy 'n boodskap soos "Hello, world,"
en jy ook 'n getal soos 6, en neem jy die boodskap, en elke individuele karakter,
jy draai dit met 6 posisies in die alfabet.
So die "h" in Hello sou h-i-j-k-l-m-n.
Dus is die eerste brief sou wees. Ons doen dieselfde ding met e.
As ons 'n wil, z of iets, dan is ons terug draai om 'n. "
Maar elke karakter kry gery 6 karakters later in die alfabet, en dit is nie baie veilig
want daar is slegs 26 moontlikhede vir hoe baie maniere waarop jy kan 'n enkele letter draai.
Sodat jy kan net probeer om al 26 van hulle en, vermoedelik, vir 'n lang genoeg boodskap,
slegs 1 van daardie moontlike 26 dinge gaan leesbaar wees,
en die leesbare een gaan na die oorspronklike boodskap te wees.
So dit is nie 'n baie goeie manier om van die versleutelen van enigiets op alle.
Onverwant aan dié kortbroek, "Wat is 'n funksie?"
So, wat is 'n funksie? Ja.
[Studente] Dit is soos 'n aparte stukkie van die kode wat jy kan bel deur te gaan en dan kry die terugkeer waarde van watter.
Ja. So ek sal dit beantwoord deur ook die beantwoording van die volgende - of herhaling deur ook net die beantwoording van die volgende een.
Jy kan gebruik om funksies in plaas van net kopieer en plak van die kode oor en oor weer.
Neem dat die kode, sit dit in 'n fuction, en dan kan jy net noem die funksie
waar jy is kopieer en plak.
So funksies is nuttig.
So nou het ons sal doen om werklike probleme.
Die eerste een. Dus is die idee van die eerste een is, het jy dit slaag 'n string, en ongeag van die -
of sê dit kleinletter? Dit sê nie alle kleinletters.
So kan die boodskap enigiets wees, en - oh no. Dit doen nie.
"Vir eenvoud, kan u aanvaar dat die gebruiker sal net insette klein letters en spasies."
So ons gaan dit 'n boodskap met slegs kleinletters en dan het ons afwissel
tussen hoofletters en klein - ons verander om die string te hoofletters en klein te wees, afgewissel.
So voordat ons gee jou 'n tweede selfs duik in die probleem,
Wat is die eerste ding wat ons nodig het om te doen?
O, wat het ek net op? O, ek het net op 'n e-pos hier gekliek.
Dus is die eerste ding wat ons nodig het om te doen - ek is op soek op die verkeerde een?
Is dit deel van hierdie een?
Nee, dit is nog steeds daar, al is.
Okay, nog steeds hier.
Nou kan ons nie aanvaar? Ja. Hier kan ons nie aanvaar dat dit is slegs onderkasletters en spasies.
So nou het ons te doen met die feit dat die letters kan wees wat ons wil hê hulle moet wees.
En so is die eerste ding wat ons wil doen is net die boodskap kry.
Ons het net nodig het om 'n string te kry, string s = GetString, okay.
Nou is hierdie probleem, daar is 'n paar van die maniere om dit te doen.
Maar ons gaan om te wil bis-operateurs om hier te gebruik.
Is daar mense wat óf was nie by die supersection,
of iets, en nie weet wat bis operateurs is?
Of hoe hulle op enige manier verband hou met ASCII?
[Studente] Ek was nie by die supersection, maar ek weet wat bis operateurs is.
Okay. Ek het dit so is dan nie oor die basiese beginsels van hulle om te gaan, maar ek sal verduidelik
wat gaan ons hier wil gebruik.
So 'A': Binêre voorstelling van kapitaal A, die nommer is 65.
Ek gaan net om na te kyk - 41 gaan wees 01.000.001.
So dit moet 65 in desimale, so dit is die binêre voorstelling van die karakter kapitaal A.
Nou, die binêre voorstelling van die karakter onderkas 'a'
gaan dieselfde ding, amper. Is dat - 6, ja. Dit is reg.
So binêre kapitaal A, binêre kleinletter 'n. "
So opmerk dat die verskil tussen A en 'a' is hierdie enkele bietjie.
En dit gebeur aan die 32 bit, die bietjie wat die getal 32.
En dit maak sin, aangesien 'n 65, 'a' is 97.
Die verskil tussen hulle is 32.
So nou weet ons dat ons kan omskep van A tot 'n "deur die neem van 'n
en bis ORing dit, met wat lyk soos 'n 1.
Dit is 'n bis of, met 00100000, en dat sal gee ons 'n. "
En ons kan kry van 'n "A bis ANDing
11, 0 in daardie plek, 11.111.
So, dit sal dan gee ons presies wat 'n "was nie, maar kanselleer hierdie individuele bietjie,
so ons sal moet 01000001, ek weet nie of ek reg getel het.
Maar hierdie tegniek van bis-ORing te kry van kapitaal te onderkas,
en bis-ANDing van kleinletters tot kapitaal te kry, is nie eksklusief aan A.
Al die briewe, K vs k, Z vs z,
almal van hulle is net deur hierdie enkele bietjie gaan verskil.
En sodat jy kan gebruik om dit te verander van 'n kleinletter 'n hoofletter en vice versa.
Okay. So 'n maklike manier om uit hierdie - in plaas van om te
skryf watter 1011111 is - 'n maklike manier om hierdie getal te verteenwoordig, en dit is nie een
wat ek gegaan het oor in die supersection, maar tilde (~) is 'n ander bis operateur.
Wat ~ doen lyk dit by die bietjie verteenwoordiging.
Kom ons neem 'n aantal.
Dit is net 'n binêre getal, en wat ~ nie is dit net al die stukkies flips.
So dit was 'n 1, nou 'n 0, hierdie is 'n 0, nou 1, 010.100.
So dit is al wat ~ nie. So 32 gaan die nommer - ontslae te raak van daardie -
so 32 gaan na die aantal 00.100.000, en so ~ van hierdie gaan wees
hierdie nommer hier dat ek 'n "met ANDed.
Nie almal sien dat? Dit is redelik algemeen, soos wanneer jy wil om uit te vind
vir later dinge wat ons kan sien, wanneer ons wil om te sien of -
of ons wil alles, elke bietjie stel, behalwe vir 1
jy is geneig om te doen ~ van die bietjie dat ons nie wil hê.
Sodat ons nie wil hê dat die 32 bit stel, sodat ons nie ~ 32.
Okay. Sodat ons kan gebruik maak van al van diegene hier.
Alle reg, sodat dit is goed as jy nie doen nie, sal ons stadig loop oor saam,
of loop oor hierdie, so - deur middel van hierdie. Loop deur middel van hierdie.
So ons het ons string, en ons wil loop oor elke karakter in die string en iets doen om dit te.
So, hoe doen ons loop oor 'n string? Wat moet ons gebruik?
Ek is nie van plan om dit te doen hier. Ja.
So ek het my Iterator, en hy het gesê dit, maar hoe weet ek hoeveel karakters is in die tou?
Strlen (s), dan sal ek + +.
So, wat ek hier gedoen het is nie die beste manier van dinge doen.
Is daar iemand weet hoekom?
Omdat jy die beheer van die taal van die string elke enkele keer.
So ons gaan wil strlen om te beweeg, ek kon sê hier, int lengte = strlen (s),
en dan moet ek <lengte, en in die geval jy het nie gesien dit voor,
Ek kan ook doen int i = 0, lengte = strlen (s).
En so het dit is 'n bietjie beter, aangesien ek nou het die omvang beperk
van die veranderlike lengte te verklaar net hierdie "" loop, in plaas van dit voor
en dat dit bestaan ​​altyd, en in die geval dat jy nie vang waarom dit is sleg,
of waarom die oorspronklike was sleg, it's - begin by die for-lus.
Ek sien die toestand. I <die lengte van s?
So die lengte van s, laat ons werk met "hallo" die hele tyd.
So, die lengte van s, h-e-l-l-o. Lengte is 5.
So i = 0, lengte is 5, so ek is nie <5, so die lus gaan voort.
Dan gaan ons weer. Ons maak seker die toestand. I <die lengte van Hello?
So laat ons gaan die lengte van Hello. H-e-l-l-o. Dit is 5, ek is nie <5, so ons weer voortgaan.
So ons is bereken, het ons hallo is toe, vir elke iterasie van die lus,
selfs gedink dit gaan nooit verander nie, dit is altyd gaan wees 5.
Sodat ons onthou net 5 voor te stel, en nou is alles is beter.
So iterating oor die hele string.
Wat wil ons vir elke karakter van die string te doen?
[Student praat, onverstaanbaar]
Ja. So, as die karakter is 'n nie-alfabetiese, dan het ons wil net daaroor te slaan.
Omdat ons net omgee oor die alfabetiese letters, ons kan nie 'n aantal kapitaliseer.
So, hoe kan ons dit doen? Sodat ons toestand, so as ons iets wil hê - kyk of dit alfabetiese.
So, hoe gaan ons dit doen?
[Studente] Jy kan nie net gebruik maak van die funksie is alfa.
Is dit ingesluit in enige van hierdie, of enige sluit soos, char.h of iets?
Laat ons nie gebruik maak van die alfa-funksie, en die eksplisiete gebruik - sodat ons s [i],
wat is die agtste karakter van s, onthou dat 'n string is 'n verskeidenheid van die karakters,
sodat die agtste karakter van s.
Nou, as dit is 'n hoofletter, ons weet dit het om te wees in 'n spesifieke reeks.
En wat is wat wissel?
Ja. So as [i] is ≥ 65, en s [i] ≤ 90, wat moet ek doen plaas?
Ja. So jy moet absoluut nooit eens die ASCII-waardes van enigiets ooit nodig hê om te weet.
Nooit dink van die nommers 65, 90, 97 en 102, of wat dit ookal is.
Jy hoef nie - 112 - jy hoef nie dié by om te weet? Wat verkeerd is.
Gebruik slegs die enkel-kwotasie karakters, enkel aanhaling konstantes. So 'A' en minder as 90 is "Z."
En dit is aansienlik beter - Ek sou nie weet uit die top van my kop dat Z is 90.
Ek weet uit die top van my kop dat 'Z' is die hoofstad Z.
So lank as wat dit is in die reeks van kapitaal A tot kapitaal Z, of ons kan kyk vir onderkasletters,
Of as dit in die reeks ≥ 'a' en ≤ z.
So dit is ons toestand.
Die styl waar hierdie dinge te sit wissel.
Ek sal dit doen soos hierdie.
Nou, doen wat ons wil om dit te doen?
Ons weet dat hierdie brief is 'n karakter, 'n alfabetiese karakter.
Sodat ons nodig het om te wissel tussen of dit nou 'n hoofletter of 'n kleinletter.
Hoe hou ons die spoor van watter een ons dit wil hê?
[Student stemme, onverstaanbaar]
So ja, maar laat my gaan.
Module 0-2 is gesê, was 'n voorstel uitgegooi, en ek stem saam met wat.
Behalwe kennis dat, soos - is dit die geval? Ja.
Dit is elke ander een, maar ons kan nie module 2 van i, of i mod 2, aangesien
Let op dat E kapitaal en 'a' is kleinletter? Maar daar is 'n ruimte wat skeiding tussen hulle?
So het hulle gaan na dieselfde mod 2, maar hulle is verskillende gevalle.
[Student vraag, onverstaanbaar]
Ja. So ons is maar net gaan om 'n telling te hou.
Ons kan dit ook doen wat hier as ons wou, wat dalk 'n bietjie lomp
in die vir lus verklarings; Ek sal dit hier.
So int tel = begin by 0.
En so nou, ek gaan om te tel hoeveel alfabetiese karakters wat ons gehad het.
Sodat ons onvermydelik gaan tel + + aangesien ons nog 'n alfabetiese karakter.
Maar, so nou wat jy sê as reken mod 2.
So, wat as reken mod 2? Oh. Ek sal doen == 0 vir nou.
Ons sal ook gaan oor dat. So as reken mod 2 == 0, wat dan?
[Studente antwoord, onverstaanbaar]
Daarom wil ons dit aan die einde hoofletters.
Daar is 2 gevalle, hoofletters en kleinletters is die 2 gevalle.
So as ons in klein letters is wat ons nodig het om te maak dit n hoofletter.
As dit is hoofletters ons hoef nie iets te doen.
Maar, daar is 'n manier - shouldn't het gedraai -
dat ons nie eens nodig het om te kyk of dit hoofletters of klein?
Wat kan ons doen om altyd seker maak dat ons altyd eindig op hoofletters?
So let op wat ons gedoen het vir kleinletter 'a', wat as ons het dit gedoen presies dieselfde ding na 'n hoofletter A?
Is hoofletter 'n verandering, of nie die waarde verander?
Ja. So 'n hoofletter bis ANDed met ~ 32 gaan dat dieselfde hoofletters karakter
omdat die 32ste bietjie vir enige hoofletters karakter is nie ingestel.
So as ons wil hê die karakter s [i], wil ons dit onderkas of hoofletters te bring.
So as dit was klein letters, dit is nou hoofletters, al was dit hoofletters, is dit nog hoofletters, en dit is dit.
Ek sê dit in die supersection: Jy kan 32 as jy wil, maar ek is geneig om te verkies om te doen 'a' - 'n,
in plaas van net plain 32, want dit kan enige ander bietjie.
Na afloop van die 32-bis, kan dit enige van hierdie, of sou ons nie genoeg
getalle al die karakters voor te stel.
So as jy die 32-bis, kan dit die 64 bit wees, kan dit die 128 bit.
Enige van daardie stukkies kan die bietjie wat onderskei tussen hoofletters en kleinletters.
Sou ek nie nodig het om te weet dat dit is die 32 bit.
Ek kan dit gebruik om 'n "- die bietjie wat verskil tussen die twee te kry
sonder om staat te maak op die magie getal wat is 32.
En so moet julle nou, anders tel was vreemd, en so wat ek wil om dit te doen?
[Student antwoorde, onverstaanbaar]
[Studente] Wat is dit?
Ek sal dit doen in 1 sekonde.
So nou as ek wil - ek wil om seker te maak die karakter nou onderkasletters,
en daarom kan ek of deur 32, en 32 betekenis 'a' - A.
Maar kennisgewing, deur dieselfde redenasie as die vorige een, dat, indien
die brief was reeds klein letters, dan ORing deur 32 hou dit net klein letters.
Dit het nie verander nie die oorspronklike karakter.
Maar nou het ek nie gesê: "As dit is klein letters, vergeet dit te vermy,
as dit is hoofletters, dan is dit verander. "
Dit is baie meer gerieflik om dit te doen.
[Studente] Sou dat die strategie van die aftrekking van die hoofletters van die kleinletter werk as dit nie was 32?
As dit was, soos 34 of iets?
So, wat jy nodig het om te weet dat die verskil tussen die 2? >> 1 bit.
Dit kan meer as 1 bietjie, so lank as wat al die stukkies onder hierdie posisie is dieselfde.
So ons moet ten minste 26 karakters - of, daar is 26 karakters.
So ons moet ten minste 26 nommers die verskil te stel -
Die verskil tussen A en 'a' het ten minste 26,
of anders sou ons nie verteenwoordig al die hoofstad.
Dit beteken dat A, as ons begin by 1, dit gaan al hierdie stukkies te gebruik,
almal van hierdie eerste 5 stukkies, alles voor te stel deur middel van Z.
Dit is die rede waarom die volgende bietjie, of dit bietjie, die volgende bietjie is die een wat gekies het om te onderskei tussen A en 'n. "
Dit is ook die rede waarom, in ASCII tabel, is daar 5 simbole skei hoofletters van kleinletters.
Sedert dit is die simbole, die ekstra 5 wat bring die 32 synde die verskil tussen hulle.
[Studente] Sodat ons kan dit doen, want ASCII is ontwerp dat die pad.
Ja. Maar ASCII - die verskil kan ook beide van hierdie stukkies.
Soos, as A 10000001, en 'a' is 11100001 - ek vergeet, wat ook al.
Maar as dit was, dan kon ons nog steeds gebruik 'a' - A.
Dit is nou net die verskil tussen A en 'a' is nog steeds hierdie 2 stukkies.
Ek dink dat dit 48 geskryf. Is dit 32 + 64? Ek dink dit is?
Sou dit nog steeds 2 stukkies, elke enkele karakter, soos, Z en z, K en k,
sou hulle nog steeds presies dieselfde stukkies wat behalwe vir die 2 stukkies.
So lank as wat dit is altyd waar is, ongeag van as ons die gebruik van ASCII of 'n ander stelsel,
so lank as wat daar is net 'n sekere aantal bisse wat is verskillend vir elke karakter,
dan is dit werk goed.
Dit is net dat 32 opgestel is, want dit is die eerste een wat ons kan moontlik gebruik. >> Cool.
Ek is geneig om te verkies, in geval jy nie gesien het nie, as die blok is slegs 'n enkele lyn,
jy kan ontslae te raak van die kode tussen krulhakies, so ek is geneig om te verkies om dit te doen.
Ook, jy weet hoe ons die dinge kan doen soos s [i] + = 1?
Jy kan ook 's [i] bis EN = 32.
En bis OF = 32.
, Tel ook mod 2 == 0.
So onthou dat - Ek sal dit nie skryf nie - enige nie-nul waarde is waaragtig en 0 is vals.
So "as reken mod 2 == 0" is dieselfde as om te sê "indien nie tel mod 2."
Ek sou dit waarskynlik net omgekeer die lyne en gesê, "as reken mod 2,
doen of 1, anders die EN 1, "sodat ek het nie nodig om die" nie. "
Maar dit werk net so goed.
En wat anders kan ek hier doen?
Jy kan kombineer hulle met 'n drieledige as jy wou, maar dan wil net maak dinge Messier
en waarskynlik meer moeilik om te lees, sodat ons nie sal doen nie.
Iemand enige ander voorstelle?
Is dat al die probleem gevra vir? O ja.
So ontslae te raak van hierdie leë lyne, nou sal ons druk f,% s om die een vir Strykers,
Ons sal druk f, s.
Laat ons nou loop dit. Het ek iets verkeerd doen?
Dit is 'n \ "; Ek wil 'n.
Okay. Nou sal ons voer dit uit. Dit sal waarskynlik op my skreeu.
Strlen is in string.h.
So, dit is die nice ding oor die geratel is dit vir jou vertel wat dit is in,
in plaas van GCC wat net sê, "Hey, jy iets vergeet, ek weet nie wat dit was nie."
Maar dit sal my vertel, "Jy bedoel string.h in te sluit."
So ek het nie gevra vir enigiets nie, so dit is nie iets te sê nie.
Maar ons sal vir hulle 'n voorbeeld te doen, "thanks 4 the add".
Dit lyk reg. Hoera.
So om terug te keer na jou hoof, ek het byna nooit doen nie.
Dit is opsioneel. En die belangrikste is die enigste funksie waarvoor dit ontwerp is opsioneel.
As jy nie iets uit die hoof terug, is dit veronderstel dat jy bedoel 0 om terug te keer.
Vrae?
Okay. So nou die tweede probleem.
"Herroep van week 2 se tweede lesing dat die uitruiling van 2 veranderlikes se waardes deur '
die 2 veranderlikes na 'n funksie (selfs al genoem swap) nie presies nie werk nie, ten minste nie sonder 'wysers. "
En ignoreer verwysings totdat ons vir hulle.
Ons wil 2 veranderlikes te ruil, maar ons is nie die gebruik van 'n funksie om dit te doen.
Ons is nog steeds gaan om dit te doen in die hoof soos dit sê.
Maar die 2 veranderlikes te gebruik, doen ons nie wil hê dat 'n tydelike veranderlike te gebruik.
Daar is 2 maniere om dit te doen.
Jy kan dit doen deur gebruik te maak van jou tradisionele binêre operateurs.
So ken niemand 'n vinnige en vuil manier om dit te doen?
Dit kan eintlik 'n minuut van denke. As wat ek het -
Ek sal die probleem soos hulle vra. So as ek het 2 veranderlikes, A, wat net 'n heelgetal
dat hulle my gee, en som veranderlike B, wat is 'n ander heelgetal wat ek gegee het.
So as ek het hierdie 2 veranderlikes, nou ek wil om dit te ruil.
Die tradisionele, deur gebruik te maak van jou gereelde binêre operateurs, ek bedoel, soos +, -, ÷.
Nie bis-operateurs wat optree op binêre.
Sodat die gebruik van - +, ÷, en al daardie.
Ons kan ruil deur om iets te doen soos a = a + b en b = a - b, a = a - b.
So, gesonde verstand gaan, en dan sal ons sien waarom dit werk.
Kom ons sê 'n = 7, b = 3, dan is a + b gaan wees 10.
Sodat ons nou die opstel van 'n = 10, en dan is ons besig b = a - b.
So ons doen b = a - b, wat gaan wees 7, en b = a - b weer
of 'n = a - b. Wat gaan wees 10 - 7 wat is 3.
So nou, korrek, "het 'n" 7, b 3, en b is nou 7 en 'a' is 3.
So daardie soort van sin maak, 'a' is die kombinasie van die 2 getalle.
Op hierdie punt, 'a' is die kombinasie, en dan is ons af te trek uit die oorspronklike b,
en dan is ons af te trek uit wat was die oorspronklike 'n. "
Maar dit werk nie vir alle getalle.
Om dit te sien, laat ons kyk na 'n stelsel, sodat ons gewoonlik dink van heelgetalle as 32 stukkies.
Kom ons werk op iets wat net soos 4 stukkies.
Hopelik sal ek kom nou met 'n goeie voorbeeld.
So, ek weet, dit sal maklik wees.
Kom ons sê dat ons 2 nommers is 1111, en 1111, so ons is nou in binêre.
In die werklike desimale, as jy wil om te dink dat dit so 'n = 15 en b = 15.
En so het ons verwag dat, nadat ons ruil hulle hulle nie eens nie om die dieselfde nommers te wees,
maar ek het dit op hierdie manier.
Kom ons maak hulle nie dieselfde getalle. Kom ons doen 1111 en 0001.
So 'n = 15 en b = 1.
Nadat ons hulle ruil, verwag ons 'a' te wees 1 en b te wees 15.
So ons eerste stap is om 'n = a + b.
Ons getalle is slegs 4 bisse wyd, so 'n, wat 1111 + b, wat is 0001,
gaan uiteindelik 'n 10.000, maar ons het net 4 stukkies.
So nou a = 0.
En nou is ons wil te stel b = a - b - eintlik, dit nog steeds werk perfek.
a = a - b - laat ons kyk of dit werk perfek.
So dan b = 0 - 1, wat nog steeds 15, en dan 'n = a - b, wat sou wees 1.
Miskien is dit werk.
Ek voel daar is 'n rede waarom dit nie werk nie gebruik van gereelde.
Okay, so werk op die aanname dat dit nie werk met gereelde binêre operasies,
en Ek sal kyk vir - Ek sal Google om te sien of dit waar is.
So ons wil om dit te doen deur gebruik te maak van bis-operateurs, en die idee hier is XOR.
So, die bekendstelling van XOR (^) indien jy dit nog nie gesien het nie.
Dit is weer 'n bis-operateur, sodat dit bietjie bietjie, en it's optree -
As jy die stukkies 0 en 1, dan is dit sal wees 1.
As jy die stukkies 1 en 0, sal dit 1, het jy die stukkies 0 en 0 dit sal wees 0,
en as jy die stukkies 1 en 1 is dit sal 0.
So dit is soos of. As een van die stukkies is waar, dit is 1, maar in teenstelling, is dit kan nie albei wees stukkies wat waar is.
OF sou dit wees 1, sou XOR dit 0.
So ons gaan wil XOR hier te gebruik.
Te dink oor dit vir 'n minuut, ek gaan na Google.
Wel, jy kan nie lees dat, ek is tans op die XOR swap algoritme bladsy.
Hopelik sal dit verduidelik waarom ek can't -
Dit is presies die algoritme wat ons nou net gedoen het.
Ek sien nog steeds nie waarom - ek moet net opgetel het 'n slegte voorbeeld,
maar hierdie geval waar "'n" gebeur om 0, nadat hy na 5 stukkies, so nou 'a' is 0,
dit is wat genoem word "integer oorloop."
Volgens Wikipedia, "In teenstelling met die XOR swap hierdie variasie vereis dat dit gebruik 'n paar metodes
om te verseker dat x + y veroorsaak nie 'n heelgetal oorloop. "
Sodat hierdie probleme het, dit was integer oorloop, maar ek iets verkeerd gedoen het.
Ek is nie seker nie. Ek sal probeer om vorendag te kom met 'n ander een.
[Studente] Wel, is nie integer oorloop wanneer jy probeer om 'n aantal daar te stel
groter is as die bedrag van die stukkies wat jy het toegeken?
Ja. Ons het 4 stukkies. That's - ons het 4 bisse, ons dan probeer om 1 te voeg, sodat ons met 5 stukkies.
Maar die vyfde bietjie net kry afgesny, ja.
Dit kan eintlik -
[Studente] Beteken dit gooi jy 'n fout, of is dit - sou dit gooi 'n fout?
No daar is dus nie 'n fout nie. Wanneer jy by die gemeente vlak, 'n spesiale bietjie
iewers is ingestel dat het gesê daar was 'n oorloop, maar in C wat jy soort van net gaan nie met dit.
Jy eintlik nie kan hanteer nie, tensy jy gebruik 'n spesiale vergadering instruksies in C.
Laat se dink oor XOR ruil.
En ek dink ook die Wikipedia artikel kon gewees het, sê dat -
So is dit ook laat optrek modulêre rekenkunde, so ek dink ek was, in teorie, modulêre rekenkunde te doen
wanneer ek sê dat 0 - 1 is 15 weer.
So wat kan eintlik op 'n gereelde verwerker wat nie 0 - 1 = 15.
Aangesien ons beland op 0, ons trek 1, So hang dit dan vou net terug om te 1111.
So hierdie algoritme kan eintlik werk, die a + b, die a - b, b - a, wat dalk goed wees.
Maar daar is 'n paar verwerkers wat dit nie doen nie, en so sou dit nie goed wees in daardie spesifieke kinders.
XOR swap sal werk op enige verwerker. Okay.
Die idee is dat dit veronderstel is om dieselfde te wees, al is.
Waar ons gebruik XOR om die een of ander manier kry die inligting van beide in 1 van die veranderlikes,
en dan trek uit die inligting van die individuele veranderlikes weer.
So nie almal idees / die antwoord?
[Student antwoord, onverstaanbaar]
So dit moet werk, en ook XOR is kommutatiewe.
Ongeag van watter volgorde hierdie 2 nommers gebeur om hier te wees,
die resultaat gaan dieselfde te wees.
So 'n ^ b is b ^ a.
Jy kan sien dit ook geskryf as 'n ^ = b, b ^ = a, a ^ = b weer.
So, dit is reg, en om te sien waarom dit werk, dink van die stukkies.
Deur gebruik te maak van 'n kleinerige, kom ons sê 11.001 en 01.100.
So, dit is 'n ", dit is 'n b.
So 'n ^ = b.
Ons gaan opstel van 'a' = die XOR van hierdie 2 dinge.
So 1 ^ 0 1 1 ^ 1 0 0 ^ 1 is 1, en 0 ^ 0 0 1 ^ 0 is 1.
So 'n, "as jy kyk na die desimale getal, is dit gaan wees -
jy gaan nie veel van 'n verhouding tussen die oorspronklike "'n" en die nuwe om te sien 'n "
maar kyk na die stukkies, 'a' is nou soos 'n maas van die inligting
van beide die oorspronklike "'n" en die oorspronklike b.
So as ons b ^ n, sien ons dat ons sal eindig by die oorspronklike 'n. "
En as ons die oorspronklike 'a' ^ die nuwe "," sien ons ons uiteindelik by die oorspronklike b.
So (a ^ b) ^ b = die oorspronklike. "
En (a ^ b) ^ a = die oorspronklike b.
Daar is nog 'n manier om te sien dit is niks XOR self is altyd 0.
So 1101 ^ 1101, word al die stukkies gaan dieselfde te wees.
Daar is dus nie gaan om 'n geval waar 1 is 'n 0 en die ander is 1.
So dit is 0000.
Dieselfde met hierdie. (A ^ b) ^ b is soos 'n ^ (b ^ b).
(B ^ b) gaan wees 0, a ^ 0 is net gaan om te wees "," omdat al die stukkies 0.
So moes die enigstes wat gaan wees waar 'a' was oorspronklik 'n 1 - kinders.
En dieselfde idee hier, ek is redelik seker dat dit is ook kommutatiewe.
Ja. Ek het sê Voor dit was kommutatiewe.
Die ^ a, en dit is assosiatiewe, so nou (b ^) ^ a.
En ons kan doen b ^ (a ^ a).
En so kry ons weer die oorspronklike b.
So 'a' is nou die kombinasie van 'A' en B saam.
Met behulp van ons nuwe combo 'sê ons b = combo 'n "^ die oorspronklike b, kry ons die oorspronklike" a. "
En nou 'n = combo 'a' die nuwe b, wat was die oorspronklike - of wat is nou wat was 'n "of b.
Dit is hierdie geval. Dit is = b, oud b.
So nou is alles terug in die omgeruil einde.
As ons eintlik kyk na die stukkies, b = a ^ b, gaan hierdie 2 XOR,
en die antwoord gaan wees hierdie, en dan 'n = a ^ b XORing hierdie 2 en die antwoord is.
Vrae? Okay. So is die laaste een is 'n bietjie aansienlik moeiliker.
[Studente] Ek dink hy het 'n vraag oor dit. >> Oh, jammer.
[Studente] Wat is eintlik vinniger? As jy hierdie XOR, of is dit as jy 'n nuwe veranderlike verklaar?
So, wat is eintlik vinniger, 'n nuwe veranderlike te verklaar of die gebruik van XOR te ruil?
Die antwoord is, in alle waarskynlikheid, 'n tydelike veranderlike.
En dit is, want sodra dit saamgestel af - so by die vergadering vlak,
daar is geen sodanige ding as plaaslike veranderlikes of enige tydelike veranderlikes of enige van hierdie dinge nie.
Hulle hou net - daar is geheue, en daar is registers.
Registers is waar dinge is aktief gebeur.
Jy voeg nie 2 dinge in die geheue, voeg jy 2 dinge in die registers.
En jy bring dinge van die geheue in registers te voeg dit dan,
en dan kan jy sit hulle terug in die geheue, maar al die aksie gebeur in registers.
So wanneer jy die tydelike veranderlike benadering gebruik, gewoonlik wat gebeur is
hierdie 2 nommers is reeds in registers.
En dan vanaf daardie punt op, nadat jy hulle het verruil,
dit sal net begin met behulp van die ander register.
Oral waar jy het al met behulp van b, dit sal net gebruik maak van die register wat reeds die stoor van 'n. "
Sodat dit nie nodig om enigiets te doen om werklik te doen om die ruiltransaksie. Ja?
[Studente] Maar dit neem ook meer geheue, reg?
Dit sal net meer geheue as dit nodig dat tydelike veranderlike te stoor.
Soos as jy later dat tydelike veranderlike gebruik weer iewers,
dan of jy iets wys dat tydelike veranderlike.
So as by enige punt in die tyd 'n, "B in temp duidelike waardes of iets,
dan is dit gaan afsonderlike plekke te hê in die geheue, maar dit is waar dat
Daar is baie plaaslike veranderlikes wat slegs bestaan ​​in registers.
In welke geval, dit was nog nooit in die geheue, en sodat jy nooit mors geheue.
Okay. Laaste vraag is 'n bietjie meer.
So hier, in hierdie CS50 toestel, daar is 'n woordeboek.
En die rede hiervoor is omdat [B66?] Is 'n speltoetser waar jy skryf
gebruik hash tabelle of probeer of 'n data struktuur.
Jy gaan om te skryf van 'n speltoetser, en jy gaan word met behulp van hierdie woordeboek om dit te doen.
Maar vir hierdie probleem, ons is net gaan om te kyk om te sien as 'n enkele woord in die woordeboek.
So in plaas van die stoor van die hele woordeboek in sommige data struktuur
en dan soek oor 'n hele dokument te sien as daar iets is verkeerd gespel,
ons wil net 1 woord te vind. Sodat ons kan net scan oor die hele woordeboek
en as ons nog nooit die woord in die hele woordeboek, dan was dit nie daar nie.
As ons scan oor die hele woordeboek en doen die woord, dan is ons goed, ons het dit gevind.
Dit sê hier dat ons wil om te begin soek na C se lêer-hantering funksie,
want ons wil die woordeboek te lees,
maar Ek sal die wenk hier watter funksies jy moet dink.
Ek skryf hulle op Ruimtes.
Dus is die belangrikste wat jy sal wil hê om te kyk na f oop en dan, onvermydelik, f gesluit,
wat sal gaan aan die einde van jou program, en f scan f.
Jy kan ook gebruik om f lees, maar jy sal waarskynlik wil nie
want dit - jy uiteindelik nie nodig dat.
F scan f is wat jy gaan word met behulp van die woordeboek te scan.
En sodat jy nie nodig het om die oplossing te kodeer, net probeer en soos pseudo-kode jou pad
'n oplossing, en dan sal ons bespreek dit.
En eintlik, aangesien ek reeds u hierdie het, as jy gaan in 'n terminale of jou toestel se dop,
Ek wil - ek gewoonlik - as jy nog nie gesien het nie, ek weet nie as jy in die klas gedoen het,
maar die mens, so die man bladsye, is baie handig vir die soek op pretty much enige funksie.
Sodat ek dit kan doen, soos, man f, scan f.
Dit is nou die inligting oor die scan f familie van funksies.
Ek kon dit ook doen man f, oop, en dat sal gee my die besonderhede van daardie.
So as jy weet watter funksie wat jy gebruik, of jy lees kode
en jy sien 'n paar funksie en jy soos, "Wat doen dit?"
Regverdige wat funksie naam bysit.
Daar is 'n paar weird voorbeelde waar jy kan hê om te sê
wil. man 2 dat funksie naam, of 'n mens 3 daardie funksie naam,
maar jy het om dit te doen as die mens funksie naam nie gebeur nie die eerste keer om te werk.
[Studente] Dus is ek die lees van die man bladsy vir 'n oop, maar ek is nog steeds verward oor hoe dit en die program te gebruik.
Okay. 'N baie van die man bladsye is minder as nuttig.
Hulle is meer nuttig wees as jy reeds weet wat hulle doen
en dan sal jy net nodig het om die volgorde van die argumente of iets om te onthou.
Of hulle kan gee jou 'n algemene oorsig, maar sommige van hulle is baie oorweldigend.
Soos f f scan, ook. Dit gee jou die inligting vir almal van hierdie funksies,
en 1 lyn sit hier gebeur om te sê, "F scan f lees van die string of stroom."
Maar f oopmaak. So, hoe sou ons gebruik f oop?
Die idee van 'n program wat nodig is om lêer te doen I / O is dat
moet jy eers die lêer oop te maak wat jy wil dinge om te doen met, en onvermydelik,
lees dinge uit daardie lêer en doen dinge saam met hulle.
F oop is wat ons gebruik om die lêer oop te maak.
Die ding wat ons terug te kry, so what lêer wil ons oop te maak, dit gee ons die
hier is dit sê "/ user / share / dict / woorde."
Dit is die lêer wat ons wil hê om oop te maak, en ons wil om dit oop te maak -
het ons uitdruklik spesifiseer of ons wil oop te maak om dit te lees of as ons wil oopmaak om dit te skryf.
Daar is 'n paar kombinasies en stuff, maar ons wil dit oop te maak om te lees nie.
Ons wil om te lees van die lêer.
So, wat doen hierdie opgawe? Dit gee 'n lêer ster (*),
en ek sal net alles in die veranderlike f, so * wys,
weer, dit is 'n wyser nie, maar ons wil nie om te gaan met wysers.
Jy kan dink van f, f nou is die veranderlike wat jy gaan gebruik om die lêer te verteenwoordig.
So as jy wil om te lees van die lêer, jy lees van f.
As jy wil om die lêer te sluit, jy die venster van f.
So aan die einde van die program wanneer ons wil noodwendig die lêer te sluit, wat moet ons doen?
Ons wil hê dat f te sluit.
Dus nou die laaste lêer funksie wat ons gaan wil gebruik is scan f, f scan f.
En wat beteken dit is om dit skanderings oor die lêer soek vir 'n patroon aan te pas.
Op soek na die man bladsy hier, sien ons int f scan f, ignoreer die terugkeer waarde vir nou.
Die eerste argument is die lêer * stroom, so die eerste argument wat ons gaan om te wil om te slaag is f.
Ons skandering oor f.
Die tweede argument is 'n formaat string.
Ek sal aan julle 'n formaat string right now.
Ek dink ons ​​gebeur om te sê, 127s \ n, 'n baie van wat is onnodig.
Die idee van wat formaat string is, is dat jy kan dink van scan f as die teenoorgestelde van die gedrukte f.
So druk f, print f ons ook hierdie tipe van formaat parameter gebruik,
maar in die gedrukte f wat ons doen is - laat ons kyk na 'n ekwivalente.
So druk f, en daar is eintlik ook f print f, waar die eerste argument gaan wees f.
Wanneer jy druk f, kan ons sê iets soos, "print 127s \ n" en dan as ons slaag dit 'n string,
dit gaan hierdie string en dan 'n nuwe lyn te druk.
Watter 127 middel, ek is redelik seker, maar ek het nog nooit beperk myself om dit te,
Jy sal selfs nie nodig '127 'om te sê in die gedrukte f,
maar wat dit beteken, is druk van die eerste 127 karakters.
So ek is redelik seker dat dit die geval is. Jy kan Google vir daardie.
Maar in die volgende een ek is amper positiewe beteken dit dat.
So is dit druk van die eerste 127 karakters, gevolg deur 'n nuwe lyn.
F scan f nou, in plaas van op soek na 'n veranderlike en druk dit,
dit gaan om te kyk na 'n paar string, en die patroon in die veranderlike te stoor.
Kom ons eintlik gebruik scan f in 'n ander voorbeeld.
So laat ons sê ons het 'n paar int x = 4,
en ons wou 'n string te skep - wou die string te skep
dit was soos, dit sal kom veel later,
iets wat net soos 4.jpg.
So, dit kan 'n program waar jy som counter,
som teen i, en jy wil 'n klomp van die beelde op te slaan.
So jy wil i.JPG, waar ek is 'n paar iterasie van jou lus te red.
So hoe maak ons ​​hierdie string vir daardie JPEG?
As jy wou 4.jpg te druk, kan ons net sê print f,% d.jpg,
en dan sal dit druk vir daardie JPEG.
Maar as ons wil hê die string 4.jpg te red, gebruik ons ​​scan f.
So string s - eintlik het ons can't - karakter, char s, laat ons gaan 100.
So het ek net n verskeidenheid van 100 karakters verklaar,
en dit is wat ons onvermydelik gaan word stoor wat JPEG.
So ons gaan scan f te gebruik, en die formaat, hoe sou ons sê% d.jpg
ten einde te druk 4.jpg, is die formaat van hierdie gaan na% d.jpg wees.
So is die formaat is% d.jpg, wat ons wil te vervang met% d x,
en nou het ons nodig dat die string om iewers te stoor.
En waar ons gaan hierdie string te slaan is in die skikking is.
So na hierdie lyn van kode, s, as ons druk f,% s van die veranderlike s,
dit gaan 4.jpg te druk.
So f scan f is dieselfde as scan f, behalwe dit is nou op soek na oor hierdie lêer
vir wat op te slaan in s.
Dit is wat die laaste argument gaan wees.
Ons wil op te slaan - "Scan f familie van funksies skanderings in beide volgens die formaat soos hieronder probeer.
Indien enige gestoor word in die plek wat jy kan terugkeer "
Nee, kan ons goed wees. Laat my dink vir 'n tweede.
So scan f doen nie - wat die heck is die funksie wat beteken dat?
So scan f is nie van plan om 'n heelgetal te neem en dot jpg doen.
Dit gaan [mompel].
Hou int veranderlike in string int C.
Wat is hierdie veranderlike, of wat is hierdie funksie genoem?
Ja. That's - ja. So, wat ek was te definieer aan jou was tevore s print f,
wat - dit maak baie meer sin, hoekom ek gesê het dit was veel meer soos print f.
Scan f is nog steeds soort soos print f, maar s print f gaan om dit te scan
en vervang die veranderlikes en stoor dit nou in 'n string.
In plaas daarvan om dit te druk, stoor dit in 'n string.
Sodat heeltemal ignoreer. Jy kan nog steeds dink van die formaat specific as soos wat druk f.
So nou, as ons wou 4.jpg ding om te doen, sal ons se druk f doen, x van hierdie.
So, wat scan f doen - wat is jou vraag gaan wees?
[Studente] Ek is net verward oor wat ons probeer om te doen reg hier
met wat JPEG. Kan jy verduidelik dat 1 meer tyd?
So dit was - dit is minder relevant f scan f nou, hopelik, sal dit bind terug in 'n soort van manier.
Maar wat ek aanvanklik voornemens is om te wys - dit is eintlik direk relevant is vir dit? F5]
Jy gaan word met behulp van s print f, waar, sê ons het 100 beelde,
en jy wil image 1.jpg 2.jpg 3.jpg te lees.
Dus, ten einde dit te doen, moet jy te f oop, en dan moet jy om te slaag in die string wat jy wil oopmaak.
So sou ons wil oopmaak 1.jpg, ten einde te maak van die string wat 1.jpg,
ons doen is druk f% d.jpg-ons het dit nie doen vir int i = 0.
i <40, i + +.
So s print f% d.jpg i.
So na hierdie lyn, nou die veranderlike of die skikking gaan tot 1.jpg.
Of, 0.jpg, 1.jpg, 2.jpg. En so kan ons oopmaak, op sy beurt, elke beeld vir lees.
So dit is wat s druk f doen. Wil jy sien wat s druk f nou doen?
[Studente] Okay, so dit neem - dit skep 'n string, something.jpg, en dan slaan dit.
Ja. Dit skep - dit is 'n ander formaat string, net soos scan f en print f,
waar dit inserts al die veranderlikes in die tweede argument, kan wees is in teenstelling met die i.
Miskien - ek bedoel, wat die geval is. Maar ongeag die volgorde van die argumente is.
Dit gaan al die veranderlikes in te voeg in die formaat string
en dan slaan in ons buffer, ons noem dat 'n buffer, dit is waar ons die stoor van die string.
So ons is binnekant van s stoor die korrek-geformateerde string,% d is vervang met 4.
[Studente] So as ons dit gedoen het, is die veranderlike f net oorgeplaas gaan word?
Ja. Dus moet ons die oorspronklike f sluit voor om dit te doen.
Maar - en dan ook, as daar nie 'n f oopmaak hier, dan sou ons nodig om te sê -
Ja. Maar dit sou 'n honderd verskillende lêers oopmaak.
[Studente] Maar ons sal nie in staat wees om toegang te verkry of - okay.
Okay. So scan f, f scan f, is 'n soort van die dieselfde idee,
maar in plaas van, in plaas van die stoor dit in 'n string, dit is meer soos jy nou is
gaan oor 'n angel en patroon wat ooreenstem teen daardie tou en die stoor van die resultate in veranderlikes.
Jy kan scan f gebruik om oor iets soos 4.jpg, te ontleed en die heelgetal 4 stoor in die som int x.
Dit is wat ons kan scan f gebruik vir.
F scan f gaan om dit te doen op die command line.
Ek is eintlik redelik seker dat dit is wat die CS50 biblioteek doen.
So wanneer jy sê, "kry int," dit is scan f-ing oor scan f is die manier waarop jy die toevoer van die gebruiker.
F scan f gaan dieselfde ding te doen nie, maar met behulp van 'n lêer te scan oor.
So hier is ons skandering oor hierdie lêer.
Die patroon wat ons probeer om aan te pas is 'n string wat is 127 karakters lank wees
gevolg deur 'n nuwe lyn
So ek is redelik seker dat ons kan selfs net sê "pas s," want in die woordeboek
ons gebeur het, is ons gewaarborg geen woord is so lank,
en ook scan f f, dink ek, sal ophou nie saak wat by die nuwe lyn.
Maar ons sal die nuwe lyn in die wedstryd, en -
[Studente] As ons nie die nuwe lyn, sal dit nie vind nie dele van 'n woord?
Dit - elke - op soek na die woordeboek -
Dus, in die woordeboek, dit is al ons woorde.
Elkeen is op 'n nuwe reël.
Die scan f gaan om hierdie woord te kies.
As ons nie die nuwe lyn, dan is dit moontlik dat die volgende scan f sal net lees die nuwe lyn.
Maar met inbegrip van nuwe lyn sal dan net ignoreer die nuwe lyn.
Maar ons sal nooit deel van 'n woord, want ons is altyd lees tot 'n nuwe reël, maak nie saak wat.
[Studente] Maar wat as jy soek vir die woord "cissa," soos cissa.
Sal dit vind dat, en sê dit is 'n wedstryd?
So hier is ons - dit sal lees in - dit is eintlik 'n goeie punt.
Ons is nooit deur gebruik te maak van die huidige - die woord wat ons soek is die eerste command line argument.
So string, woord = bevat SPASIES 1.
Sodat die string wat ons soek is bevat SPASIES 1.
Ons is nie op soek vir 'n woord op almal in ons scan f.
Wat ons doen met die scan f is om elke woord in die woordeboek,
en dan weer ons het dat die woord wat ons gaan strcmp te gebruik om hulle te vergelyk.
Ons gaan ons woord te vergelyk en wat ons nou net gelees.
So onvermydelik, gaan ons aan die einde om 'n klomp van die scan fs
totdat dit gebeur net so dat scan f sal terugkeer -
dit sal terugkeer, so lank as dit 'n nuwe woord wat ooreenstem,
en dit sal iets anders terug sodra dit in gebreke gebly het om die woord te pas.
Ons lees oor die hele woordeboek, berging reël vir reël elke woord in die veranderlike s.
Dan is ons vergelyk woord met s, en indien die vergelyking == 0,
strcmp gebeur 0 te bring as 'n wedstryd gemaak.
So as dit was 0, dan kan ons druk f, ooreenstem,
of 'n woord in die woordeboek, of wat jy wil f te druk.
En dan - ons wil nie f sluit oor en oor weer.
Dit is die soort van ding wat ons wil doen, en ons is nie net op soek na die woord in die woordeboek.
Sodat ons kon doen nie, as ons wou om te kyk vir hul patroon, cissa, soos jy gesê het voor,
as ons wil om te kyk vir daardie patroon, dan sou dit nie in die geval
want dis nie eintlik 'n woord nie, maar een van die woorde in die woordeboek gebeur wat daarin te hê.
Sodat dit sou ooreenstem met hierdie woord nie, maar hierdie subset van die woord is nie 'n woord self.
Maar dit is nie hoe ons dit gebruik, ons lees in elke woord
en dan die woord wat ons met die woord te vergelyk.
Sodat ons altyd volle woorde te vergelyk.
Ek kan die uitstuur van die oplossings later gefinaliseer.
Dit is 'n soort van byna die regte antwoord, dink ek.
[Student kommentaar, onverstaanbaar]
O, ek het ontslae te raak van daardie voor? Char s, ek dink ons ​​het gesê 127 - ek vergeet wat die grootste is.
Ons sal net doen 128, so nou is is lank genoeg.
Ons hoef nie enigiets te druk.
Ons ook gaan om te wil hê ons lêer te sluit, en wat behoort te wees oor die korrekte antwoord.
CS50.TV