[Powered by Google Translate] Problem seksion Set 2: Edition Hacker
Rob Bowden, Universiteti i Harvardit
Kjo është CS50. CS50.TV
Pra, unë jam Rob. Unë jam një zyrtar i lartë në Kirkland. Ky është viti im i tretë TFing CS50.
Kjo është hera e parë që ne jemi duke ndryshuar nga seksioni tradicionale-leksion-style,
ku ne vetëm lloj i shqyrtimit të asaj që ndodhi në leksion dhe pastaj ju djema të kërkoni pyetje,
Tani për të qenë shumë më problem-bazë, ku ne i përdorim shesheve, dhe -
Oh, kështu që ideja është që të shkoni në këtë link ju çova dhe pastaj ju do të jetë në hapësirë ​​tim.
Nuk ka njeri të ketë një laptop? Rregull.
Pra, ne jemi duke shkuar për të përdorur këtë, dhe ne jemi duke shkuar për të bërë probleme jetojnë në nenin
dhe diskutimin e tyre dhe duke parafytyruar se çfarë është e gabuar
dhe unë mund të tërheqë deri disa nga kodit tuaj, dhe unë mund të diskutoni idetë tuaja.
Pra ka dikush pasur vështirësi?
Ju mund të bisedoni në anën, unë nuk e di nëse do të kemi arsye për këtë.
Tani, si supersection mëparshme, në qoftë se ju keni qenë në atë klasë, ju e dini se çfarë është rreth.
Mbi të gjitha e përcakton P nuk do të jetë këto seksione.
Pra, P-set 2, specifikimet, I guess ju pashë atë në P-1 grup tashmë.
Por ne mund të shohim në P-2 set për atë që ne jemi duke shkuar për të shkuar mbi sot.
Dhe ju do të shihni një seksion të pyetjeve.
Pra, kjo do të jetë në të gjitha p-grupe, nuk do të jetë një pjesë e pyetjeve.
Deri tani ne kemi thënë, "Konsideroni këtë një mundësi për të ushtruar."
Ju nuk do të kërkohet që të paraqesë këtë program.
Ideja është se këto janë menduar të llojit të ndihmuar ju merrni filluar me grupin e problemit.
I guess në edicionin Hacker, shumë prej tyre janë menduar të jetë vetëm të reja, gjëra interesante për të mësuar.
Ata nuk mund të jenë të zbatueshme drejtpërdrejt për të vendosur problemit.
Dhe tani ne nuk jemi duke ju paraqisni ato, por në teori,
për grupe problem më vonë, ju mund të paraqesë ato, dhe kështu ju mund të vijnë ose të nenit
apo të shikojnë pjesën e për të marrë përgjigje, ose ju mund të merrni vetëm ato në tuaj
në qoftë se ju nuk ndiheni si shijuar praninë time.
Pra, - unë mendoj se kjo është e para.
Oh. Gjithashtu, në këto seksione të pyetjeve ne gjithashtu keni të bëni pyetje në lidhje me pantallona të shkurtra.
Kështu që unë mendoj se, në teori, ju jeni menduar për të shikuar këto para vijnë në seksion,
por kjo është në rregull në qoftë se ju nuk e bëni, ne do të shkojnë mbi to anyway.
Kështu që ne mund të fillojë me këto: "Si ka një lak, ndërsa ndryshojnë nga një lak për ta bërë kohë?
Kur është veçanërisht e dobishme fundit? "
Pra, dikush ka ndonjë -?
[Student] për ta bërë, ndërsa loop gjithmonë do të ekzekutojë së paku një herë.
Po. Kështu që është diferenca. Një lak ndërsa - I'll vetëm bëni atë në këtu - ndërsa loop, ne kemi kusht
të drejtë këtu, ndërsa një njeri që, ndërsa, ju nuk keni një gjendje deri sa të kemi këtu poshtë.
Dhe kështu, kur programi juaj është ekzekutuar, dhe ajo merr në lak, ndërsa,
menjëherë kontrollon nëse ky kusht është i vërtetë.
Në qoftë se gjendja nuk është e vërtetë, ai thjesht do të kaloni mbi lak në tërësi.
A-ndërsa loop, si programi është ekzekutuar, ai merr për të "bërë".
Asgjë nuk ndodh në këtë pikë, vetëm vazhdon ekzekutimin.
Atëherë kur ajo hits ", ndërsa," Nëse gjendja është e vërtetë, ajo do të lak mbështesë dhe të bëjë atë përsëri
dhe përsëri dhe përsëri derisa gjendja nuk është e vërtetë dhe vetëm pastaj bie përmes.
Pra, diferenca është, se kjo mund të kaloni të drejtë që nga fillimi.
Kjo domosdoshmërisht ekzekuton një herë dhe pastaj të mund të ekzekutojë herë më shumë nëse gjendja është ende e vërtetë.
Pra, lak, ndërsa do të bëjë atë një herë, ose - lak, ndërsa - ne nuk mund të kenë nevojë për të bërë atë në të gjitha,
që sa më shpejt që ne të merrni atë, nëse gjendja është e rreme, ne vetëm do të kaloni të drejtë mbi të.
Ndërsa për ta bërë, ndërsa loop, ne do të ekzekutojë atë një herë, domosdoshmërisht.
Pastaj, kur të shkoj në gjendje, ne kontrolloni nëse është e vërtetë apo e rreme.
Nëse kjo është e vërtetë, ne do të bëjmë atë përsëri, e nëse ajo është e rreme, ne vetëm do të vazhdojmë duke shkuar.
Pra, kur është veçanërisht e dobishme fundit?
Kështu që unë mund të them se në tërësinë e 4 vjet, 3 vjet, çfarëdo,
që unë kam qenë programimit, unë kam përdorur këtë, si, nën 10 herë.
Dhe ndoshta 5 prej tyre janë në CS50, kur ne jemi futur për ta bërë, ndërsa sythe.
Pra, kur ju të bëni të përdorura-ndërsa sythe?
Kur është - Po?
[Student] Kur ju jeni duke u përpjekur për të marrë të dhëna përdoruesi, ose diçka që ju doni të shikoni -
Po. Pra, për ta bërë, ndërsa unazore, user input është e madhe.
Kjo është arsyeja pse në grupe e para problematike çift, kur ju dëshironi të kërkojë nga shfrytëzuesi, si,
"Jepni një varg," ju nuk mund të vazhdojë derisa ju të merrni atë varg.
Dhe kështu ju, domosdoshmërisht, duhet të pyesni për vargun e të paktën një herë.
Por pastaj, nëse ata përgjigjen diçka të keqe, atëherë ju duhet të lak përsëri dhe kërkoni përsëri.
Por përveç input të përdoruesit, kjo është shumë e rrallë që unë të hasni një rast
ku unë dua të lak "të paktën një herë", por ndoshta më shumë.
Pyetje apo -? Ka dikush përdorur një për ta bërë, ndërsa loop kudo tjetër?
Rregull. Pra, një tjetër është, "Çfarë do të padeklaruar identifikues
zakonisht tregojnë nëse outputted nga tingëllimë? "
Pra, çfarë lloji të kodit mund të shkruaj për të marrë 'identifikues palajmëruar?'
[Student] Kjo x = 2?
Pra, ne vetëm mund të provoni atë në këtu, x = 2.
Ne do të kandidojë kjo - oh, unë nuk e click it. Pra, këtu kemi marrë - të gjithë të drejtë.
"Përdorimi i x identifikuese padeklaruar."
Pra, kjo është identifikues pashpallur, një variabël.
Kjo shpesh do të thërrasë një ndryshore identifikues nje.
Pra, ajo mund të mos e dinë se është në fakt një variabël, por nuk e di se çfarë është.
Pra, kjo është një identifikues.
Pra, pse është ajo padeklaruar? Po.
Pra, të jetë i qartë në terminologji, shpallja e një ndryshore
është kur ju thoni "X int," ose "string y," çfarëdo.
The initialization e ndryshueshme, ose caktimi i variablit,
është kur ju thonë "x = 2."
Kështu që ne mund të bëjmë këto në hapa të veçantë, int x, x = 2, dhe derisa - ne mund të kemi një bandë e stuff në këtu -
por deri në këtë linjë ndodh, x është uninitialized ende, por ajo ka qenë deklaruar.
Dhe kështu që ne mund të bëjmë të qartë atë në 1 line, dhe tani ne jemi deklaruar dhe fillimit.
Pyetje?
Dhe në fund, "Pse nuk është Shifrës Cezari shumë të sigurt"?
Pra, së pari, nuk dua të them se kushdo se çfarë Shifrës Cezari është?
[Student] Cezari Shifrës vetëm është se ju hartë, ju zhvendoset çdo letër,
një numër i caktuar i letrave të shkojë gjatë, dhe për të shkuar mbrapa mbi, dhe kjo nuk është shumë e sigurt, sepse
ka vetëm 26 opsionet e mundshme dhe ju vetëm duhet të provoni çdo 1 nga ata deri sa ju të merrni atë.
Oh. Pra, unë duhet të përsëris?
Shifër Cezari, it's - Unë do të thotë, ju do të merret me atë në problemet që ju -
ose unë mendoj edicionin standard të caktuar të problemit që nuk është në edicionin e hacker.
Pra, në edicionin e standardit të vendosur problemin, ju merrni një mesazh si, "Hello World,"
dhe ju gjithashtu kanë një numër si 6, dhe ju merrni këtë mesazh, dhe çdo karakter individual,
ju rrotullohen atë me 6 pozicione në alfabetin.
Pra, 'h' në përshëndetje do të bëhet h-i-j-k-l-m-n.
Kështu letra e parë do të jetë n. Ne bëjmë të njëjtën gjë me të e.
Në qoftë se ne kemi një, si, z apo diçka, atëherë ne të përfundojë përsëri rreth për të 'A'.
Por çdo karakter merr cycled 6 karaktere vonë në alfabetin, dhe kjo nuk është shumë e sigurt
pasi që nuk janë vetëm 26 mundësitë për sa mënyra që ju mund të përfundojë një letër të vetme.
Kështu që vetëm ju mund të provoni të gjitha 26 prej tyre dhe, me sa duket, për një mesazh të gjatë të mjaftueshme,
vetem 1 nga ato 26 gjërat e mundshme do të jetë i lexueshëm,
dhe një lexueshëm do të jetë mesazhi origjinal.
Pra, kjo nuk është një mënyrë shumë e mirë për encrypting asgjë në të gjitha.
Palidhur me ato pantallona të shkurtra, "Çfarë është një funksion?"
Pra, çfarë është një funksion? Po.
[Student] Është si një pjesë të veçantë të kodit që ju mund të telefononi për të shkuar nëpër dhe pastaj të marrë vlerën e kthimit të çdo gjë.
Po. Kështu që unë do të përgjigjem edhe atë duke iu përgjigjur tjetër - ose edhe vetëm me përsëritje përgjigjur në një tjetër.
Ju mund të përdorni funksionet në vend të vetëm kopjimi dhe pasting kodin pushim.
Vetëm të marrë atë kod, e vënë atë në një fuction, dhe pastaj ju mund të telefononi vetëm funksionin
kudo që ju keni qenë kopjimi dhe pasting.
Pra, funksionet janë të dobishme.
Kështu që tani ne do të bëjmë problemet aktuale.
I pari. Pra, ideja e një të parë, ju të kalojë atë një varg, dhe pavarësisht nga -
ose e bën atë të thonë të gjitha të vogla? Ajo nuk thonë të gjitha të vogla.
Pra, mesazhi mund të jetë çdo gjë, dhe - oh no. Ai e bën.
"Për thjeshtësi, ju mund të supozojmë se përdoruesi do vetëm input letra vogle dhe hapësira."
Pra, ne të kalojë atë një mesazh me vetëm shkronja Fjala dhe pastaj ne alternative
midis kapitalit dhe të vogla - ne ndryshim vargu të jenë kapitale dhe të vogla, me rotacion.
Pra, para se të ju jap një të dytë për të edhe zhyten në problem,
çfarë është gjëja e parë që ne duhet të bëjmë?
Oh, çfarë nuk kam thjesht klikoni mbi? Oh, unë vetëm klikuar në një email në këtu.
Pra, gjëja e parë që ne duhet të bëjmë - jam duke kërkuar në një të gabuar?
A është kjo pjesë e kësaj një?
Jo, ato janë ende në atje, pse.
Mirë, ende këtu.
Tani ne nuk mund të supozojmë -? Po. Këtu ne nuk mund të supozojmë se kjo është vetëm të vogla dhe hapësira.
Deri tani ne duhet të merren me faktin që letra mund të jetë çdo gjë që ne duam që ata të jenë.
Dhe kështu gjëja e parë që ne duam të bëjmë është vetëm të marrë mesazhin.
Ne vetëm duhet për të marrë një varg, varg s = getString, në rregull.
Tani ky problem, ka disa mënyra për të bërë atë.
Por ne do të duan të përdorin operatorët bitwise këtu.
A ka njerëz të cilët ose nuk ishin në supersection,
apo diçka, dhe nuk e di se çfarë janë operatorët bitwise?
Apo si ato lidhen me ASCII në ndonjë mënyrë?
[Student] Unë nuk ishte në supersection, por unë e di se çfarë janë operatorët bitwise.
Rregull. Pra, atëherë unë nuk kam për të shkuar mbi bazat e tyre, por unë do të shpjegojë
ajo që ne jemi duke shkuar për të dëshironi të përdorni këtu.
Pra, 'A': Përfaqësimi Binary e kapitalit A, numri është 65.
Unë jam vetëm duke shkuar për të parë në - 41 do të jetë 01.000.001.
Kështu që duhet të jetë në 65 dhjetor, kështu që kjo është përfaqësimi binar i A. kapitalit karakter
Tani, përfaqësimi binar i karakterit me të vogla 'a'
do të jetë e njëjta gjë, pothuajse. Është se - 6, yeah. Kjo është e drejtë.
Kapitali në mënyrë binare A, Fjala binare 'a'.
Pra, vërejmë se dallimi në mes të A dhe 'a' është kjo pak vetme.
Dhe kjo ndodh të jetë pak 32, bit përfaqësojnë numrin 32.
Dhe kjo ka kuptim që A është 65; 'a' është 97.
Dallimi në mes tyre është 32.
Kështu që tani ne e dimë që ne mund të konvertohet nga A në 'A', duke marrë një
dhe bitwise oring atë, me - që duket si një 1.
Kjo është një bitwise OSE, me 00100000, dhe që do të japë na 'një.'
Dhe ne mund të merrni nga 'një' në një nga bitwise anding
me 11, 0 në atë vend, 11.111.
Pra, kjo do të na japë pikërisht atë 'a' ishte, por anuloni këtë pak individuale,
kështu që ne do të kemi 01000001, unë nuk e di nëse kam të numëruara drejtë.
Por kjo teknikë e bitwise oring për të marrë nga kapitali të vogle,
dhe bitwise anding për të marrë nga Fjala në kryeqytetin nuk është ekskluzive për A.
Të gjitha letrat, K vs K, Z vs z,
të gjithë ata janë vetëm do të ndryshojnë pak nga ky e vetme.
Dhe kështu që ju mund të përdorni këtë për të ndryshuar nga çdo shkronj te vogle me ndonjë shkronjë dhe anasjelltas.
Rregull. Pra, një mënyrë e lehtë për të marrë nga kjo - kështu që në vend që të
shkruar nga çfarëdo 1011111 është - një mënyrë e lehtë për të përfaqësuar këtë numër, dhe kjo nuk është një
që unë shkova gjatë në supersection, por tildë (~) është një tjetër operatori bitwise.
Çfarë ~ nuk është ajo shikon në përfaqësimin bit.
Le të marrin ndonjë numër.
Kjo është vetëm disa numri binar, dhe çfarë ~ nuk është vetëm flips të gjitha bit.
Pra, kjo ishte një 1, tani një 0, kjo është një 0, tani një 1, 010100.
Pra, kjo është e gjitha e bën ~. Pra, 32 do të jetë numri - shpëtoj se -
kështu 32 do të jetë numri 00.100.000, dhe kështu ~ i kësaj do të jetë
ky numër deri këtu që unë anded 'a' me.
A të gjithë të shohin se? Kjo është shumë e zakonshme, si kur ju doni të kuptoj se
për gjëra më vonë që ne mund të shohim, kur ne duam të shohim nëse -
ose ne duam gjithçka, çdo grup të vetëm pak përveç 1
ju kanë tendencë për të bërë ~ nga pak se ne nuk duam të caktuar.
Pra, ne nuk duam të vendosur 32 bit, kështu që ne nuk i ~ 32.
Rregull. Kështu që ne mund të përdorni të gjithë ata këtu.
Të gjithë të drejtë, kështu që është në rregull në qoftë se ju nuk jeni bërë, ne do të ecim ngadalë gjatë së bashku,
apo të ecin mbi këtë, kështu që - përmes këtë. Ecin nëpër këtë.
Pra, ne kemi vargun tonë, dhe ne duam të lak mbi çdo karakter në atë varg dhe të bëjë diçka për të.
Pra, si nuk kemi lak mbi një varg? Çfarë duhet të përdorë?
Unë nuk jam duke shkuar për të bërë atë në këtu. Po.
Pra, unë kam iterator tim, dhe ai tha: atë, por si mund ta di se sa shumë karaktere janë në varg?
Strlen (s), pastaj i + +.
Pra, ajo që unë kam bërë këtu nuk është mënyra më e mirë për të bërë gjërat.
Does anyone know pse?
Sepse ju jeni të kontrolluar gjuhën e vargut çdo herë të vetme.
Pra, ne do të duan të lëvizin strlen, unë mund të them deri këtu, int Gjatësia = strlen (s)
dhe pastaj nuk i <gjatësi, dhe në rast se ju nuk e keni parë atë më parë,
Unë mund gjithashtu të bëjë int = 0, gjatësia = strlen (s).
Dhe kështu kjo është disi e preferueshme, sepse tani unë kam kufizuar fushëveprimin
i gjatësi variabile vetëm për këtë 'për' lak, në vend të deklaruar atë para
dhe se ajo gjithmonë ekziston, dhe në rast se ju nuk e keni kapur se pse kjo është e keqe,
ose pse origjinale ishte e keqe, it's - të fillojë në për lak.
I kontrolluar gjendjen. Është I <gjatësinë e S?
Pra, gjatësia e ve, le të punojnë me "hello" tërë kohës.
Kështu gjatësia e S, h-E-l-l-O. Gjatësia është 5.
Pra, i = 0, gjatësia është 5, kështu që unë nuk është <5, kështu që lak vazhdon.
Pastaj ne do të shkojmë përsëri. Ne kontrolluar gjendjen. Është I <gjatësinë e hello?
Pra, le të shikoni gjatësinë e hello. H-E-l-l-O. Kjo është 5, unë nuk është <5, kështu që ne vazhdojmë përsëri.
Pra, ne jemi të llogaritjes, ne jemi duke numëruar hello, për çdo ripërsëritje e lak,
edhe menduar se kurrë nuk do të ndryshojë, ajo gjithmonë do të jetë 5.
Pra, ne vetëm mos harroni 5 deri para, dhe tani gjithçka është më mirë.
Pra iterating mbi vargut të tërë.
Çfarë ne duam të bëjmë për çdo karakter të vargut?
[Student folur, i pakuptueshëm]
Po. Pra, nëse karakteri është jo-alfabetik, atëherë ne vetëm duam të kaloni mbi të.
Sepse ne vetëm kujdesen për letrat alfabetikë, ne nuk mund të kapitalizojë një numër.
Pra, si mund ta bëni këtë? Pra gjendjen tonë, kështu që nëse ne duam diçka - kontrolloni nëse është e alfabetike.
Pra, si nuk kemi të kontrolloni këtë?
[Student] Ju mund të përdorni vetëm funksionin është alfa.
Është që përfshihen në qoftë prej këtyre, apo çdo përfshijnë si char.h, apo diçka?
Le të mos e përdorni funksion është alfa dhe përdorni eksplicite - kështu që ne kemi s [i],
që është karakteri i tetë i ve, kujtojmë se një vargu është një grup të karaktereve,
kështu që karakteri i tetë i s.
Tani, në qoftë se ajo është një letër kryeqyteti, ne e dimë se duhet të jetë në një gamë të veçantë.
Dhe çfarë është që shkojnë?
Po. Pra, nëse s [i] është ≥ 65, dhe s [i] është ≤ 90, çfarë duhet të bëj në vend?
Po. Kështu që ju kurrë nuk duhet absolutisht edhe duhet të dini vlerat ASCII e asgjë ndonjëherë.
Kurrë nuk mendojnë për numrat 65, 90, 97 dhe 102, apo çfarëdo qoftë ajo është.
Ju nuk keni nevojë - 112 -? Ju nuk keni nevojë të dini ato në të gjitha. Kjo është gabim shumë.
Vetëm të përdorni të vetme quote karaktere, konstanta e vetme kuotë. Kështu "A" dhe më pak se 90 është "Z."
Dhe kjo është dukshëm më e mirë - Unë nuk do të dinë pjesa e sipërme e kokës sime që është 90 Z.
Unë e di se pjesa e sipërme e kokës sime se 'Z' është kryeqyteti Z.
Pra, për aq kohë sa kjo është në rangun e kapitalit A deri Z kapitalit, ose ne mund të kontrolloni për Fjala,
Ose në qoftë se ajo është në varg ≥ 'a' dhe ≤ z.
Pra, kjo është gjendja jonë.
Stil për ku për të vënë këto gjëra ndryshon.
Unë do të bëj atë si kjo.
Tani, çfarë ne duam të bëjmë?
Ne e dimë se kjo letër është një karakter, një karakter alfabetik.
Pra, ne duhet të alternativ midis nëse kjo tani duhet të jetë një letër kapitalit ose me shkronja të vogla.
Si nuk kemi të mbajnë gjurmët e të cilave ne duam njëri që ajo të jetë?
[Zërat Student, pakuptueshëm]
Pra, po, por më lejoni të kontrolloni.
Moduli 0-2 u tha, ishte një sugjerim hedhur jashtë, dhe unë jam dakord me këtë.
Përveç njoftimit se, si - është ky rast? Po.
Është çdo një tjetër, por ne nuk mund Moduli 2 nga unë, ose unë mod 2, pasi
E vëreni se Shkupi është kryeqyteti dhe 'a' është Fjala? Por ka një hapësirë ​​të ndarë ato?
Pra, ata do të jetë i njëjtë mod 2, por ata janë raste të ndryshme.
[Pyetja Student, pakuptueshëm]
Po. Pra, ne jemi vetëm duke shkuar për të mbajtur një akuzë.
Ne gjithashtu mund të bëjë që në qoftë se ketu kemi kërkuar, që mund të marrë një pak i ngathët
në për deklaratat loop, unë do të vënë atë deri këtu.
Pra numërimin int = fillon në 0.
Dhe kështu tani, unë jam duke shkuar për të numëruar sa karaktere alfabetike ne kemi pasur.
Pra, ne jemi në mënyrë të pashmangshme do të numëruar + + pasi kemi gjetur një tjetër karakter alfabetik.
Por, kështu që tani ju jeni duke thënë, nëse mod Pika 2.
Pra, çfarë nëse mod akuzë 2? Oh. Unë do të bëj == 0 tani për tani.
Ne gjithashtu do të shkojnë mbi atë. Kështu që nëse mod akuzë 2 == 0, atëherë çfarë?
[Studentët përgjigje, pakuptueshëm]
Pra, ne duam që ajo të përfundojë uppercase.
Ka 2 raste; uppercase dhe të vogla janë 2 raste.
Pra, nëse ne jemi në Fjala ne kemi nevojë për ta bërë atë uppercase.
Nëse kjo është uppercase ne nuk duhet të bëjmë asgjë.
Por, a ka një mënyrë - shouldn't kanë kthyer -
që ne as nuk duhet të kontrolloni nëse kjo është uppercase ose Fjala?
Çfarë mund të bëjmë që gjithmonë të siguruar që ne gjithmonë të përfundojë deri në uppercase?
Pra, ajo që ne njoftim e bëri për Fjala 'a', çka nëse ne e bëmë këtë të njëjtën gjë e saktë për të uppercase Një?
A uppercase një ndryshim, ose e bën ndryshimin vlerë?
Po. Kështu që çdo letër kryeqyteti bitwise anded me ~ 32 do të jetë që karakteri njëjta uppercase
sepse për çdo karakter uppercase pak 32 nuk është vendosur.
Pra, nëse ne duam të sjellë karakterin s [i], ne duam që ajo të bëhet vogle ose uppercase.
Pra, në qoftë se ajo ishte e vogla, ajo tani është uppercase, në qoftë se ajo ishte uppercase, është ende uppercase, dhe kjo është ajo.
Kam thënë këtë në supersection: Ju mund të përdorni 32 nëse ju dëshironi, por unë priren të preferojnë bërë 'një' - Një,
në vend të vetëm 32 thjeshtë, sepse ajo mund të jetë çdo pak tjetër.
Pas pak 32, ajo mund të jetë ndonjë nga këto, ose ne nuk do të kemi mjaft
numrat për të përfaqësuar të gjithë personazhet.
Pra, nëse ju merrni bit 32, ajo mund të jetë 64 bit, ajo mund të jetë pak 128.
Ndonjë nga këto copa mund të jetë pak e që dallon në mes të mëdha dhe të vogla.
Unë nuk duhet të duhet të dinë se ajo është pak 32.
Unë mund të përdorni këtë 'A' - Një për të marrë pak që ndryshon në mes të dy
pa pasur nevojë të mbështetet në numrin magjik që është 32.
Dhe kështu tani, tjetër numërimin ishte i rastësishëm, dhe kështu çfarë unë dua të bëj?
[Student përgjigjet, pakuptueshëm]
[Student] Çfarë është ajo?
Unë do të bëj atë në 1 sekondë.
Kështu që tani, nëse unë dua të - unë dua të bëni të sigurtë karakteri tani është vogla,
dhe kështu që unë mund ose me 32, dhe 'një' 32 që do të thotë - A.
Por njoftim, me të njëjtin arsyetim si ai i mëparshmi, që nëse
Letra ishte tashmë vogla, pastaj oring me 32 thjesht e mban atë Fjala.
Ajo nuk ka ndryshuar karakterin origjinal.
Por tani unë nuk kam për të shmangur duke thënë: "Në qoftë se kjo është Fjala, vetëm harrojmë për këtë,
në qoftë se është uppercase, pastaj të ndryshojë atë. "
Kjo është shumë më i përshtatshëm për të bërë këtë.
[Student] Ah se strategjia e zbritur MËDHAJA nga puna Fjala qoftë se nuk ishin 32?
Në qoftë se kjo ishte, si, 34 apo diçka?
Pra, ju duhet të dini se dallimi në mes të 2 është -? 1 >> bit.
Kjo mund të jetë pak më shumë se 1, për aq kohë sa të gjitha bit poshtë këtë pozicion janë të njëjta.
Pra, ne kemi nevojë për të paktën 26 karaktere - ose, ka 26 karaktere.
Pra, ne kemi nevojë për të paktën 26 numrat për të përfaqësuar ndryshimin -
Ndryshimi midis A dhe 'një' ka të jenë të paktën 26,
apo tjetër ne nuk do të kemi përfaqësuar të gjithë numrat kapitale.
Kjo do të thotë që A, në qoftë se ne të fillojë në 1, ajo do të përdorë të gjitha këto copa,
të gjitha këto 5 bit e para, për të përfaqësuar gjithçka me anë të Z.
Kjo është arsyeja pse pak më tej, apo kjo pak, pak më tej është ai që është zgjedhur për të dalluar mes A dhe 'një'.
Kjo është edhe arsyeja pse, në tabelën ASCII, ka 5 simbole ndarëse shkronja kapitale nga letrat Fjala.
Që ata janë simbolet, 5 ekstra që sjell deri 32 duke qenë dallimi mes tyre.
[Student] Pra, ne mund të bëjmë atë, sepse ASCII është dizajnuar në atë mënyrë.
Po. Por ASCII - ndryshimi mund të jetë të dyja këto copa.
Si, në qoftë se një ishin 10000001, dhe 'një' ishte 11100001 - harroj, çfarëdo.
Por nëse do të ishte kjo, atëherë ne ende mund të përdorin 'një' - A.
Kjo është vetëm tani diferenca midis A dhe 'a' është ende këto 2 bit.
Unë mendoj se është shkruar 48. A është 32 + 64? Unë mendoj se është?
Ajo do të vazhdojë të jetë 2 copa; çdo karakter të vetëm, si, Z dhe z, K dhe K,
ata ende do të ketë të njëjtat copa saktë të përcaktuara me përjashtim të atyre 2 copa.
Pra, për sa kohë që është gjithmonë e vërtetë, pavarësisht nga nëse jeni duke përdorur ASCII ose ndonjë sistem tjetër,
për aq kohë sa nuk ka vetëm një numër i caktuar i bit që janë të ndryshme për çdo karakter,
atëherë kjo works fine.
Është vetëm se 32 u krijua për shkak se ajo është e para që ne ndoshta mund të përdorni. Best >>.
Unë priren të preferojnë, në rast se ju nuk e keni parë, nëse bllok është vetëm një linjë të vetme,
ju mund të shpëtoj nga formatimin e teksteve kaçurrel, kështu që unë priren të preferojnë bërë këtë.
Gjithashtu, ju e dini se si ne mund të bëjmë gjëra të tilla si s [i] + = 1?
Ju gjithashtu mund të bëjë s [i] bitwise DHE = 32.
Dhe bitwise OR = 32.
Gjithashtu, numërimin e mod 2 == 0.
Pra mos harroni se - unë nuk do të shkruaj atë - çdo jo-zero vlera është e vërtetë, dhe 0 është e rreme.
Pra, "në qoftë se mod akuzë 2 == 0" është njëlloj si të thuash "nëse nuk llogariten mod 2."
Unë ndoshta do të kishte ndryshuar vetëm linjat dhe tha, "nëse numërimi mod 2,
nuk OSE 1, tjetër nuk DHE 1, "kështu që unë nuk kam nevojë për" jo. "
Por kjo punon ashtu si edhe.
Dhe çfarë tjetër mund të bëj këtu?
Ju mund të kombinohen ato me tresh në qoftë se ju të kërkuar, por atëherë kjo do të bëjë vetëm gjëra të çrregullt
dhe ndoshta më e vështirë për të lexuar, kështu që ne nuk do të bëjë këtë.
Çdokush ka ndonjë sugjerime të tjera?
Është që të gjithë problemi kërkuar? Oh yeah.
Kështu shpëtoj nga këto rreshta bosh, tani ne do të shtypura f,% s duke qenë një për strings,
Ne do të shtypura f, s.
Tani le të drejtuar atë. Nuk kam bërë asgjë të gabuar?
Kjo është një \ "; Unë dua një n.
Rregull. Tani ne do të drejtuar atë. Kjo ndoshta do të bërtas në mua.
Strlen është në string.
Pra, kjo është gjë e bukur për tingëllimë është ajo ju tregon se çfarë është në të,
vend të KPK cilat vetëm thotë, "Hej, keni harruar diçka, unë nuk e di se çfarë ishte."
Por kjo do të thoni, "do të thoshte që të përfshijë string."
Kështu që unë nuk kam të menjëhershëm për asgjë, kështu që nuk është thënë asgjë.
Por ne do të bëjmë shembullin e tyre, "Thanks 4 add me".
Që duket e drejtë. Hooray.
Kështu të kthehen në kryesore tuaj, unë kurrë nuk pothuajse të bërë atë.
Kjo është fakultative. Dhe kryesore është funksioni i vetëm për të cilin ajo është fakultative.
Nëse ju nuk kthehen asgjë nga kryesor, është supozuar se keni menduar të ktheheni 0.
Pyetje?
Rregull. Deri tani problemi i dytë.
"Kujtojnë nga leksioni dytë 2 javë që shkëmbejnë vlerat 2 variablave 'duke kaluar
ato 2 ndryshore në një funksion (edhe nëse quhet swap) nuk bën pikërisht të punojnë, së paku jo pa 'pointers. "
Dhe injorojnë pointers deri sa të kemi për ta.
Ne duam që të bie në ujdi 2 variabla, ne nuk jeni duke përdorur një funksion për të bërë atë.
Ne jemi ende duke shkuar për të bërë atë në kryesore si ajo thotë.
Por për të përdorin ato 2 variabla, ne nuk duam që të përdorni një ndryshore të përkohshme.
Ka 2 mënyra për ta bërë këtë.
Ju mund ta bëni atë duke përdorur operatorët tradicionale tuaj binar.
Pra, nuk e di ndokush një mënyrë të shpejtë dhe të pista për të bërë këtë?
Ajo mund të vërtetë të marrë një minutë të të menduarit. Nëse kam -
Unë do të ngritur problemin e deri si ata kërkojnë. Pra, nëse unë kam 2 variablave, A, e cila është vetëm një numër të plotë
që ata japin mua, dhe të ndryshueshme shuma B, i cili është një tjetër numër i plotë që unë jam dhënë.
Pra, nëse unë kam këto 2 variablave, tani unë dua të bie në ujdi tyre.
Tradicionale, duke përdorur operatorët rregullta tuaj binare, dua të them, si +, -, ÷.
Jo operatorët bitwise të cilat veprojnë në binar.
Pra, duke përdorur -, +, ÷, dhe të gjithë ata.
Ne mund të bie në ujdi duke bërë diçka si a = a + b dhe b = a - b, a = a - b.
Pra, shikoni mendje e shëndoshë, dhe pastaj ne do të shohim se pse veprat.
Le të thonë se a = 7, b = 3, atëherë a + b do të jetë 10.
Pra, ne jemi tani duke vendosur një = 10, dhe pastaj ne jemi duke bërë b = a - b.
Kështu ne duke bërë b = një - b, e cila do të jetë 7, dhe b = një - b përsëri,
ose një = një - b. Cila do të jetë 10-7 cili është 3.
Deri tani, të saktë, ishte "një" 7, b ishte 3, dhe tani është 7 b dhe 'a' është 3.
Kështu që ka kuptim lloj, 'a', është kombinimi i 2 numrave.
Në këtë pikë, 'a', është kombinim, dhe pastaj ne jemi zbritur nga b origjinale,
dhe pastaj ne jemi zbritur nga çfarë ishte origjinale 'një'.
Por kjo nuk funksionon për të gjithë numrat.
Për të parë këtë, le të konsiderojmë një sistem, kështu që ne zakonisht mendojmë e integers si 32 bit.
Le të punojmë në diçka që është vetëm si 4 copa.
Shpresojmë që unë të dalë me një shembull të mirë tani.
Pra, unë e di, kjo do të jetë e lehtë.
Le të thonë se numrat tanë janë 2 1111, dhe 1111, kështu që ne jemi në binar të drejtë tani.
Në decimale aktuale, në qoftë se ju doni të mendoni për atë në këtë mënyrë, a = 15 dhe b = 15.
Dhe kështu që ne presim, pasi ne bie në ujdi tyre - ata as nuk duhet të jenë numra të njëjta,
por unë e bëri atë në këtë mënyrë.
Le të mos e bëni ato numrat e njëjta. Le të bëjmë 1111 dhe 0001.
Pra a = 15 dhe b = 1.
Pasi ne bie në ujdi tyre, ne presim 'a' të jetë 1 dhe b të jetë 15.
Pra, hapi ynë i parë është a = a + b.
Numrat tona janë vetëm 4 bit gjerë, kështu 'një,' e cila është 1111, + b, e cila është 0001,
do të përfundojë si 10000, por ne vetëm kemi 4 bit.
Deri tani a = 0.
Dhe tani ne duam të vendosur b = a - b - në fakt, kjo ende punon jashtë të përkryer.
a = a - b - le të shohim nëse kjo punon jashtë të përkryer.
Kështu pastaj b = 0 - 1, e cila do të jetë ende 15, dhe pastaj një = një - b, e cila do të jetë 1.
Ndoshta kjo e bën punën.
Unë ndjehen si ka një arsye se nuk punon duke përdorur të rregullt.
Mirë, kështu që duke punuar mbi supozimin se ai nuk punon me operacione binare të rregullta,
dhe unë do të shikoni për - unë do të Google për të parë në qoftë se është e vërtetë.
Pra, ne duam të bëjmë atë duke përdorur operatorët bitwise, dhe këtu është dhënë XOR.
Pra, duke futur XOR (^) në qoftë se ju nuk e keni parë atë ende.
Kjo është, përsëri, një operator bitwise kështu që vepron pak nga pak, dhe it's -
Nëse keni bit 0 dhe 1, atëherë kjo do të jetë 1.
Nëse ju keni copa 1 dhe 0, ajo do të jetë 1, ju keni copa dhe 0 0 ajo do të jetë 0,
dhe në qoftë se ju keni copa 1 dhe 1 ajo do të jetë 0.
Pra, kjo është si OSE. Nëse njërin prej bit janë të vërteta, kjo është 1, por ndryshe OR, ajo nuk mund të jetë dy copa që janë të vërteta.
OSE do të jetë kjo 1, XOR do të ketë këtë jetë 0.
Pra, ne do të duan të përdorin XOR këtu.
Mendoni se ajo për një minutë, unë jam duke shkuar për Google.
E pra, ju nuk mund të lexoni se, unë jam aktualisht në faqen swap XOR algorithm.
Shpresojmë se kjo do të shpjegojë se pse unë can't -
Kjo është saktësisht algoritmi që ne vetëm e bëri.
Unë ende nuk e shihni se pse - Unë duhet të ketë zgjedhur vetëm një shembull të keq,
por ky rast ku 'a' ka ndodhur të bëhet 0, pas gjetjes në 5 bit, kështu që tani 'a' eshte 0,
kjo është ajo që quhet "overflow numër i plotë."
Sipas Wikipedia, "Ndryshe swap XOR, ky ndryshim kërkon që ai përdor disa metoda
për të garantuar se x + y nuk shkakton një vërshim ujërash numer i plote. "
Pra, kjo nuk kanë probleme, kjo ishte overflow integer, por kam bërë diçka të gabuar.
Nuk jam i sigurt. Unë do të përpiqemi për të dalë me një tjetër.
[Student] E pra, nuk është integer overflow kur ju jeni duke u përpjekur për të vënë një numër në atje
më e madhe se shuma e copa që ju keni caktuar?
Po. Ne kemi 4 bit. That's - kemi pasur 4 bit, ne pastaj të përpiqet për të shtuar 1 të saj, kështu që ne fund me 5 copa.
Por pak i pestë merr vetëm prerë, yeah.
Ajo mund të vërtetë -
[Student] A do të hedhin ju një gabim, ose e bën këtë - se do të hedhin një gabim?
Nr Pra, nuk ka asnjë gabim. Kur ju merrni në nivelin e kuvendit, një pak të veçantë
diku është vendosur që të tha se nuk kishte një mbushje e tepërt, por në C ju lloj i vetëm nuk merren me këtë.
Ju në të vërtetë nuk mund të merren me atë nëse ju përdorni udhëzime të veçanta kuvendit në C.
Le të mendojmë për shkëmbim XOR.
Dhe unë mendoj se artikulli i Wikipedia mund të ketë qenë gjithashtu duke thënë se -
Pra, ajo gjithashtu solli deri aritmetikë modulare, kështu që unë mendoj unë ishte, në teori, duke bërë aritmetikë modulare
kur kam thënë se 0-1 është 15 herë.
Kështu që mund të vërtetë - në një procesor të rregullt që bën 0-1 = 15.
Që ne fund deri në 0, ne zbres 1, kështu që atëherë ajo vetëm përfundon kthyer rreth për 1111.
Pra, ky algoritëm mund të vërtetë punojnë, a + b, a - b, b - një, që mund të jetë në rregull.
Por ka disa procesorë të cilat nuk bëjnë këtë, dhe kështu që nuk do të jetë mirë në ato ato të veçanta.
Swap XOR do të punojë në çdo procesor. Rregull.
Ideja është se ajo është menduar të jetë i njëjtë, edhe pse.
Ku ne jemi duke përdorur XOR në një farë mënyre të marrë informacion të dy në 1 të variablave,
dhe pastaj të largohen nga të dhënat e variablave individuale përsëri.
Pra, ka njeri të ketë ide / përgjigja?
[Student përgjigje, pakuptueshëm]
Pra, kjo duhet të punojnë, dhe gjithashtu, XOR është commutative.
Pavarësisht nga të cilat për këto 2 numra të ndodhë të jetë në deri këtu,
Ky rezultat do të jetë e njëjtë.
Pra, a ^ b ^ b është një.
Ju gjithashtu mund të shihni këtë shkrim si një ^ = b, b = a ^, ^ a = b përsëri.
Pra, kjo është e drejtë, dhe për të parë se pse kjo punon, mendoj se e bit.
Duke përdorur një numër smallish, le të themi, 11.001 dhe 01.100.
Pra, kjo është 'një', kjo është b.
Pra, a ^ = b.
Ne do të jeni të vendosur = 'A' të XOR e këtyre gjërave 2.
Kështu 1 ^ 0 është 1; 1 ^ 1 është 0; 0 ^ 1 është 1, dhe 0 ^ 0 është 0; 1 ^ 0 është 1.
Pra 'a', në qoftë se ju shikoni në numër decimal, ajo do të jetë -
ju nuk do të jeni për të parë shumë nga një marrëdhënie midis origjinale 'a' dhe 'a i ri,'
por duke kërkuar në copa, 'a', tani është si një rrjetë e informacionit
të dy origjinale 'A' dhe b origjinal.
Pra, nëse ne marrim b ^ a, ne shohim se ne do të përfundojë deri në origjinal 'një'.
Dhe në qoftë se ne kemi marrë origjinalin 'a' ^ i ri 'a', ne shohim ne fund deri në b origjinal.
Kështu (a ^ b) ^ b = 'një.' Origjinal
Dhe (a ^ b) ^ një = b origjinal.
Nuk është - një tjetër mënyrë për të parë këtë është XOR asgjë në vetvete është gjithmonë 0.
Pra, 1101 ^ 1101, të gjitha bit do të jetë e njëjtë.
Pra, kurrë nuk do të jetë një rast ku 1 është një 0 dhe tjetri është 1.
Pra, kjo është 0000.
Njëjtë me këtë. (A ^ b) ^ b është si një ^ (b ^ b).
(B ^ b) do të jetë 0, a ^ 0 është vetëm do të jetë "një", pasi që të gjitha bit janë 0.
Pra, të vetmet që do të jenë aty ku 'a' ishte fillimisht një 1 - kishte ato.
Dhe ideja njëjtë këtu, unë jam goxha i sigurt se edhe commutative.
Po. Unë kam thënë para se ajo ishte commutative.
The ^ 'a', dhe kjo është asociativ, kështu që tani (b ^ a) ^ a.
Dhe ne mund të bëjmë b ^ (a ^ a).
Dhe kështu përsëri, ne të merrni b origjinal.
Pra, 'a', tani është kombinimi i 'a', b dhe së bashku.
Përdorimi tonë të ri combo 'a', ne themi b = combo 'a' ^ B origjinal, ne marrim origjinal 'një'.
Dhe tani një combo = 'a' ^ B re, e cila ishte origjinale - ose që tani është se çfarë ishte 'një' ose b.
Kjo është në këtë rast këtu poshtë. Kjo është = b, b vjetër.
Deri tani gjithçka është kthyer në mënyrë swapped.
Në qoftë se ne të vërtetë shikuar në copa, b = a ^ b, do të XOR këto 2,
dhe përgjigja do të jetë ky, dhe pastaj a = a ^ b është XORing këto 2 dhe përgjigja është kjo.
Pyetje? Rregull. Pra fundit është disi në mënyrë të konsiderueshme më e vështirë.
[Student] Unë mendoj se ai ka një pyetje në lidhje me të. Oh >>, sorry.
[Student] Çfarë është në të vërtetë më të shpejtë? Në qoftë se ju përdorni këtë XOR, apo është në qoftë se ju të deklarojë një ndryshore të re?
Pra, çfarë është në të vërtetë më të shpejtë, duke deklaruar një ndryshore të re ose të përdorur XOR të bie në ujdi?
Përgjigja është, në të gjitha gjasat, një ndryshore të përkohshme.
Dhe kjo është për shkak se një herë është hartuar poshtë - kështu në nivelin e kuvendit,
nuk ka gjë të tillë si variabla lokale apo ndonjë variablave të përkohshme ose ndonjë të këtij stuff.
Ata po ashtu si - ka memorie, dhe nuk janë regjistrat.
Regjistrat janë ku gjërat janë aktive ndodh.
Ju nuk mund të shtoni 2 gjëra në kujtesë, ju shtoni 2 gjëra në regjistra.
Dhe ju sjellë gjërat nga kujtesa në regjistrat që pastaj shtoni ato,
dhe pastaj ju mund të vënë ato përsëri në kujtesë, por të gjithë veprimi ndodh në regjistrat.
Pra, kur ju jeni duke përdorur qasje të përkohshme ndryshueshme, zakonisht ajo që ndodh është
këto 2 numra janë tashmë në regjistrat.
Dhe pastaj nga kjo pikë e tutje, pasi të keni swapped ato,
ajo vetëm do të fillojë përdorimin e regjistrit tjetër.
Kudo ju kishte qenë duke përdorur b, ai vetëm do të përdorin regjistrin që ishte tashmë ruajtjen 'a'.
Kështu që nuk ka nevojë të bëjë asgjë për të vërtetë të bërë shkëmbim. Po?
[Student] Por ajo gjithashtu merr më shumë memorie, e drejtë?
Ajo do të marrë vetëm më shumë memorie në qoftë se ajo ka nevojë për të ruajtur atë ndryshore të përkohshme.
Ashtu si në qoftë se ju përdorni më vonë se ndryshore të përkohshme përsëri diku,
pastaj - ose ju të caktojë diçka në atë variable përkohshëm.
Pra, në qoftë se në çdo moment në kohë 'a,' b në temp kanë vlera të dallueshme apo diçka,
atëherë ajo do të ketë vende të dallueshme në kujtesë, por është e vërtetë se
ka shumë variabla të lokale të cilat vetëm do të ekzistojnë në regjistrat.
Në të cilin rast, ajo kurrë nuk është vënë në kujtesë, dhe kështu ju nuk jeni të humbur kujtesën.
Rregull. Pyetja e fundit është pak më shumë.
Kështu që këtu, në këtë aplikim CS50, nuk është një fjalor.
Dhe arsyeja për këtë është për shkak se [? B66] është një spell checker ku ju do të jetë me shkrim
duke përdorur tabelat hash apo përpiqet ose disa struktura të dhënave.
Ju do të jeni të shkruar një spell checker, dhe ju do të jeni duke përdorur këtë fjalor për të bërë këtë.
Por për këtë problem, ne vetëm do të shikoni për të parë nëse një fjalë të vetme është në fjalor.
Pra, në vend të ruajtjen e fjalor të tërë në disa strukturën e të dhënave
dhe pastaj të kërkoni mbi një dokument të tërë për të parë nëse çdo gjë është misspelled,
ne vetëm duan të gjejnë 1 fjalë. Pra, ne vetëm mund të skanoni mbi fjalorin gjithë
dhe në qoftë se nuk kemi gjetur fjalën në fjalor të tërë, atëherë ajo nuk ishte aty.
Nëse ne scan mbi fjalor të tërë dhe nuk shohin fjalën, atëherë ne jemi të mirë, ne kemi gjetur atë.
Ai thotë këtu se ne duam të fillojmë të shikojmë në file-trajtimin e funksionit C-së,
që ne duam për të lexuar fjalorin,
por unë do të jap aluzion këtu si në të cilën funksionet që ju duhet të mendoni.
Unë do të shkruaj ato në hapësira.
Pra, ato kryesore që ju do të dëshironi të shikoni në të f hapur dhe pastaj, në mënyrë të pashmangshme, f mbyllur,
i cili do të shkojë në fund të programit tuaj, dhe f f scan.
Ju mund të përdorë gjithashtu edhe f lexuar, por ju ndoshta nuk dëshironi të
për shkak se - ju nuk do të përfundojnë që kanë nevojë.
F f scan është ajo që ju do të jeni duke përdorur të scan mbi fjalorin.
Dhe kështu ju nuk keni nevojë për kodin lart zgjidhje, vetëm të përpiqet dhe si pseudo-kod rrugën tuaj
për një zgjidhje, dhe pastaj ne do të diskutuar atë.
Dhe në fakt, pasi unë tashmë ju dha këto, në qoftë se ju shkoni në ndonjë terminal apo aplikim shell tuaj,
Unë do të - Unë zakonisht - në qoftë se ju nuk e keni parë ende, unë nuk e di nëse ju e bëri në klasë,
por njeriu, kështu që faqet njeriu, janë mjaft të dobishme për kërkim në shumë e shumë çdo funksion.
Kështu që unë mund të bëjë, si, f njeri, scan f.
Kjo është tani për info familjes f scan e funksioneve.
Unë mund të bëjë f njeri, të hapura, dhe se do të jepni të dhënat e kësaj.
Pra, nëse ju e dini se çfarë ju jeni duke përdorur funksion, ose ju jeni duke lexuar kodin
dhe ju të shihni disa funksion dhe ju jeni si, "Çfarë do të bëni këtë?"
Vetëm se njeriu funksion emrin.
Ka disa shembuj të pazakontë ku ju mund të keni për të thënë
pëlqen. njeri 2 se emri i funksionit, ose njeriu që emri 3 funksion,
por ju vetëm duhet të bëjë që në qoftë funksion njeri emri nuk do të ndodhë për të punuar herë të parë.
[Student] Kështu që unë jam duke lexuar faqen njeri për të hapur, por unë jam ende i hutuar se si të përdorin atë dhe programin.
Rregull. Një shumë e faqeve njeriu janë më pak se të dobishme.
Ata janë më të dobishme në qoftë se ju tashmë e dini se çfarë bëjnë ata
dhe atëherë ju vetëm duhet të mbani mend rendin e argumenteve apo diçka.
Ose ata mund të ju jap një pasqyrë të përgjithshme, por disa prej tyre janë shumë të madhe.
Ashtu si f f scan, gjithashtu. Kjo ju jep informacion për të gjitha këto funksione,
dhe 1 vijë këtu poshtë ndodh për të thënë, "F scan f lexon nga pika string ose lumë."
Por f hapur. Pra, si do ne përdorim f hapur?
Ideja e një programi që ka nevojë për të bërë fotografinë I / O është që
keni nevojë për të hapur dosjen që ju doni të bëni gjëra me të, dhe në mënyrë të pashmangshme,
lexoni gjëra nga ajo dosje dhe të bëjë gjëra me ta.
F hapur është ajo që ne përdorim për të hapur dosjen.
Gjë që ne të kthehemi, kështu që ajo fotografi nuk duam të hapur, kjo na jep e -
këtu ai thotë se "/ user / share / dict / words".
Kjo është skedari që ne duam të hapur, dhe ne duam të hapur -
ne duhet të specifikojë në mënyrë eksplicite nëse ne duam të hapur atë për të lexuar ose në qoftë se ne duam të hapur atë për të shkruar.
Ka një çift i kombinimeve dhe sende, por ne duam të hapur këtë për lexim.
Ne duam për të lexuar nga dosja.
Pra, çfarë e bën këtë kthim? Ajo kthen një yll file (*),
dhe unë vetëm do të tregojë gjithçka në f ndryshueshme, kështu që *,
përsëri, kjo është një tregues, por ne nuk duan të merren me pointers.
Ju mund të mendoni si f, f tani është e ndryshueshme që ju jeni do të përdorin për të përfaqësuar file.
Pra, nëse ju dëshironi të lexoni nga file, ju keni lexuar nga f.
Nëse ju doni për të mbyllur dosjen, ju mbyllni f.
Pra, në fund të programit, kur ne duam të pashmangshme për të mbyllur dosjen, çfarë duhet të bëjmë?
Ne duam për të mbyllur f.
Deri tani funksionin fundit fotografi që ne do të dëshironi të përdorni është scan f, f f scan.
Dhe çfarë është ajo që e bën Scans mbi dosjen e kërkuar për një model të ndeshjes.
Looking në faqen njeri këtu, ne shohim int f f scan, injorojnë vlerën e kthimit për tani.
Argumenti i parë është * fotografi lumë, kështu që argumenti i parë ne do të duan të kalojnë është f.
Ne jemi skanim mbi f.
Argumenti i dytë është një format string.
Unë do t'ju jap një varg format të drejtë tani.
Unë mendoj se ne të ndodhë për të thënë, 127s \ n, një shumë që është e panevojshme.
Ideja e asaj që string format është, është që ju mund të mendoni për f scan si e kundërta e f shtypura.
Pra f shtypura, f shtypura ne gjithashtu e përdorin këtë lloj të parametrit format,
por në f shtypura atë që ne po bëjmë është - le të shohim në një ekuivalente.
Pra shtypura f, dhe nuk ka në fakt edhe f f shtypura, ku Argumenti i parë do të jetë f.
Kur keni shkruar f, ne mund të themi diçka si, "print 127s \ n" dhe pastaj në qoftë se ne të kalojë atë një varg,
ajo do të shtypura këtë varg dhe pastaj një linjë të re.
Çfarë do të thotë 127, unë jam goxha i sigurt, por unë kurrë nuk kam kufizuar veten për atë,
Ju nuk do të duhet edhe të them '127 'në f shtypura,
por çfarë do të thotë është shtypur para 127 karaktere.
Kështu që unë jam goxha i sigurt se është rasti. Ju mund të Google për këtë.
Por në një tjetër unë jam gati pozitive kjo do të thotë se.
Pra, kjo është shtypur para 127 karaktere, pasuar nga një linjë të re.
F f scan tani, në vend të kërkuar në një ndryshore dhe shtypje atë,
ajo do të shikojmë në disa vargun, dhe dyqan në modelin e ndryshueshme.
Le të përdorni të vërtetë f scan në një shembull tjetër.
Pra, le të thonë se kemi pasur disa int, x = 4,
dhe ne të kërkuar për të krijuar një varg bërë nga - të kërkuar për të krijuar varg
që ishte si, kjo do të dalë shumë më vonë,
diçka që është vetëm si 4.jpg.
Pra, kjo mund të jetë një program, ku ju do të keni counter shuma,
përmbledhur kundër i, dhe ju doni për të ruajtur një bandë e imazheve.
Pra, ju doni të ruani i.jpg, ku i është një përsëritje e lak tuaj.
Pra, si nuk kemi bërë këtë varg për atë JPEG?
Në qoftë se ju të kërkuar për të shkruar 4.jpg, ne mund të them vetëm f shtypura, d.jpg%,
dhe pastaj ajo do të shtypura për atë JPEG.
Por në qoftë se ne duam për të shpëtuar 4.jpg string, ne përdorim f scan.
Pra string s - në të vërtetë ne can't - karakteri, char s, le të shkojë 100.
Kështu që unë thjesht shpallur disa koleksion prej 100 karaktereve,
dhe kjo është ajo që ne jemi në mënyrë të pashmangshme do të jetë ruajtjen atë JPEG in
Pra, ne jemi duke shkuar për të përdorur f scan, dhe format, se si ne do të themi d.jpg%
në mënyrë që të shtypur 4.jpg, formati i kësaj do të jetë d.jpg%.
Pra, format është d.jpg%, ajo që ne duam të zëvendësojë d% me të është x,
dhe tani ne kemi nevojë për të ruajtur atë varg diku.
Dhe ku ne jemi duke shkuar për të ruajtur këtë varg është në array s.
Kështu që pas këtë linjë të kodit, s, në qoftë se ne shtyp, f% s e s ndryshueshme,
ajo do të shtypura 4.jpg.
Pra, f f scan është e njëjtë si scan f, përveç tani ajo është duke kërkuar mbi këtë skedë
për atë për të ruajtur në s.
Kjo është ajo që argumenti i fundit do të jetë.
Ne duam për të ruajtur - "Scan familjen e funksioneve f scans në të dyja sipas formatit si u përpoq më poshtë.
Nëse ndonjë janë ruajtur në pikat vend që ju mund të ktheheni - "
Jo, ne mund të jetë e mirë. Më lejoni të mendoj për një të dytë.
Pra scan f nuk - çfarë dreq është funksion i cili bën këtë?
Pra scan f nuk do të marrë një numër të plotë dhe të bëjë dot muri.
Ajo do të [Mumbles].
Ruaj variabël string int int në C.
Çfarë është kjo variabël, ose çfarë është ky funksion quhet?
Po. That's - po. Pra, ajo që unë u përcaktuar për ju para se të ishte s f shtypura,
cila - që e bën kuptim shumë më tepër, pse unë tha se kjo ishte më shumë si f shtypura.
Scan f është ende lloj si f shtypura, por f s shtypura do të scan atë gjatë
dhe zëvendësuar variablat dhe tani ruajtur atë në një varg.
Në vend të shtypjes, ajo ruan atë në një varg.
Kështu që injorojnë tërësisht. Ju mund ende mendoj se e specifier format si si ajo e f shtypura.
Deri tani, në qoftë se ne të kërkuar për të bërë gjënë e 4.jpg, ne do të bëjmë f s print, x për këtë.
Pra, çfarë po bën scan f - çfarë është pyetja juaj do të jetë?
[Student] Unë jam i hutuar vetëm në atë që ne jemi duke u përpjekur për të bërë të drejtë këtu
me atë JPEG. Mund ta shpjegoni atë kohë 1 më shumë?
Pra, kjo ishte - kjo është relevent pak për f f scan tani, me shpresë, ajo do ta lidhë përsëri në një lloj mënyre.
Por ajo që unë fillimisht kishte për qëllim për të treguar ishte - kjo është në të vërtetë drejtpërdrejt relevante për këto [? F5]
Ju jeni do të jetë duke përdorur f s shtypura, ku thonë se ne kemi 100 imazhe,
dhe ju dëshironi të lexoni imazhin 1.jpg 2.jpg,, 3.jpg.
Pra, në mënyrë që të bëni këtë, ju duhet të f hapur, dhe pastaj ju duhet të kalojë në vargun që ju doni të hapur.
Pra, ne do të duan për të hapur 1.jpg, në mënyrë që të krijojë vargun që është 1.jpg,
f bëjmë s shtypura nga% d.jpg--ne nuk e bëjmë për int i = 0.
i <40, i + +.
Pra, f% s print d.jpg e i.
Kështu që pas këtë linjë, tani ndryshueshme ose array s do të 1.jpg.
Ose, 0.jpg, 1.jpg, 2.jpg. Dhe kështu që ne mund të hapur, nga ana tjetër, çdo imazh për lexim.
Pra, kjo është ajo që është shkruar f bën. A keni parë se çfarë është shkruar f tani është duke bërë?
[Student] Mirë, kështu që është e marrë - kjo krijon një varg, something.jpg, dhe pastaj ruan atë.
Po. Ajo krijon - kjo është një tjetër string format, ashtu si f scan dhe f shtypura,
ku ajo fut të gjithë e variablave në argumentin e dytë, mund të jetë s në krahasim me i.
Ndoshta - Unë do të thotë, se është rasti. Por çfarëdo që është e argumenteve.
Ajo do të futur të gjitha variablave në varg format
dhe pastaj dyqan në tampon tonë, që ne e quajmë se një tampon, kjo është ajo ku ne jemi ruajtjen string.
Pra, ne jemi ruajtjen brenda s string saktë-formatuar, d% duke qenë zëvendësuar me 4.
[Student] Pra, nëse ne e bëmë këtë, është f ndryshueshme vetëm do të ricaktuar?
Po. Pra, ne duhet të mbyllë f origjinal para se të bëjnë këtë.
Por - dhe pastaj edhe në qoftë se nuk ka pasur një f hapur deri këtu, atëherë ne do të duhet të them -
Po. Por kjo do të hapë një njëqind fotografi të ndryshme.
[Student] Por ne nuk do të jetë në gjendje për të hyrë ose - në rregull.
Rregull. Pra scan f, f f scan, është lloj i të njëjtën ide,
por në vend të, në vend të ruajtjen atë në një varg, kjo është më shumë si ju jeni tani
shkuar më shumë se një pickim dhe model përputhen kundër atij vargut dhe ruajtjen e rezultateve në variablave.
Ju mund të përdorni f scan për të kuptoj se diçka si 4.jpg, dhe dyqan në integer 4 x int shuma.
Kjo është ajo që ne mund të përdorim për të scan f.
F f scan do të bëjë që në rreshtin e komandave.
Unë jam në të vërtetë goxha i sigurt se kjo është ajo që biblioteka CS50 bën.
Pra, kur ju thoni: "merrni int," kjo është scan f-ing mbi - f scan është mënyra që ju të merrni të dhëna të përdoruesit.
F f scan do të bëjë të njëjtën gjë, por duke përdorur një skedar të scan gjatë.
Kështu që këtu, ne jemi skanim mbi këtë file.
Modeli që ne jemi duke u përpjekur që të shkojë me disa string që është 127 karaktere të gjatë
ndjekur nga një linjë të re
Kështu që unë jam goxha i sigurt se ne mund edhe të them vetëm "ndeshjen s," pasi në fjalor
ne të ndodhë të kemi, ne jemi duke garantuar asnjë fjalë është se gjatë,
dhe gjithashtu f f scan, mendoj unë, do të ndalet në vijën e ri pa marrë parasysh se çfarë.
Por ne do të përfshijnë linjë të re në ndeshje, dhe -
[Student] Nëse ne nuk përfshijnë linjë e re, nuk do të gjeni një pjesë të fjalës?
Ajo - çdo - duke kërkuar në fjalor -
Pra, në fjalor, këto janë të gjitha fjalët tona.
Secili prej tyre është në një linjë të re.
F scan do të marr këtë fjalë.
Nëse ne nuk përfshijnë linjë të re, atëherë është e mundur që f ardhshëm scan thjesht do të lexoni linjë të re.
Por duke përfshirë linjë të re, atëherë thjesht do të injorojë linjë të re.
Por ne kurrë nuk do të merrni një pjesë të fjalës, pasi ne jemi gjithmonë të lexuar deri në një linjë të re, pa marrë parasysh se çfarë.
[Student] Por, çfarë nëse ju kërkoni për fjalën "cissa", si cissa.
Do të gjeni se, dhe thonë se kjo është një ndeshje?
Pra, këtu ne - kjo do të lexoni në - kjo është në fakt një pikë e mirë.
Ne kurrë nuk jeni duke përdorur aktuale - fjala ne jemi duke kërkuar për të është i pari command line argument.
Pra, fjala string = argv 1.
Pra string ne jemi duke kërkuar për të është argv 1.
Ne nuk jemi duke kërkuar për një fjalë në të gjitha në f tonë scan.
Ajo që ne po bëjmë me scan f po bëhet çdo fjalë në fjalor,
dhe pastaj një herë ne kemi atë fjalë që ne jemi duke shkuar për të përdorur strcmp për të krahasuar ato.
Ne jemi duke shkuar për të krahasuar fjalën tonë dhe atë që ne vetëm të lexojnë in
Pra në mënyrë të pashmangshme, ne do të përfundojë duke bërë një bandë e scan fs
derisa ajo ndodh pikërisht kështu që f scan do të kthehet -
ajo do të kthehet një, për aq kohë sa ajo ka krahasohen një fjalë të re,
dhe ajo do të kthehet diçka tjetër sa më shpejt që ajo ka dështuar në ndeshjen fjalën.
Ne jemi duke lexuar mbi fjalor të tërë, ruajtjen rresht pas rreshti çdo fjalë në s ndryshueshme.
Atëherë ne jemi krahasuar me fjalën s, dhe në qoftë se krahasimi == 0,
strcmp ndodh për të sjellë 0 nëse një ndeshje është bërë.
Pra, në qoftë se ajo ishte 0, atëherë ne mund të shtypura f, përputhet,
apo fjala është në fjalor, ose çdo gjë që ju doni të shtypura f.
Dhe pastaj - ne nuk duam të f mbyllur pa pushim.
Kjo është lloj gjë që ne duam të bëjmë, dhe ne nuk jemi vetëm në kërkim të fjalës në fjalor.
Pra, ne mund të bëjë që, nëse ne të kërkuar për të shikoni për modelin e tyre, cissa, si ju tha më parë,
në qoftë se kemi dashur të shohim për atë model, atëherë ajo do të dështojë në rast
për shkak se nuk është në fakt një fjalë, por një nga fjalët në fjalor ndodh që të ketë që në të.
Pra, kjo do të përputhen me këtë fjalë, por kjo mesin e fjalës nuk është një fjalë në vetvete.
Por kjo nuk është se si ne jemi duke e përdorur atë, ne jemi duke lexuar në çdo fjalë
dhe pastaj krahasuar fjalën e kemi me atë fjalë.
Pra, ne jemi gjithmonë në krahasojmë fjalët të plota.
Unë mund të dërgoni nga zgjidhjet finalizuar më vonë.
Kjo është lloj i gati përgjigjen e duhur, unë mendoj.
[Komenti Student, pakuptueshëm]
Oh, nuk kam marrë shpëtoj se para? Char s, unë mendoj se kemi thënë 127 - harroj atë që është më e madhe.
Ne do të bëjmë vetëm 128, kështu që tani s është kohë e mjaftueshme.
Ne nuk kemi nevojë për të shtypur çdo gjë.
Ne jemi gjithashtu do të duan që të ketë për të mbyllur dosjen tonë, dhe që duhet të jetë në lidhje me përgjigjen e duhur.
CS50.TV