[Powered by Google Translate] Дел Проблем Намести 2: Хакер издание
Роб Бауден, Универзитетот Харвард
Ова е CS50. CS50.TV
Значи, јас сум Роб. Јас сум висок во Киркланд. Ова е мојата трета година TFing CS50.
Тоа е прв пат дека ние се менуваат од традиционалниот предавање стил дел,
каде што само вид на преглед што се случи во предавање и потоа вие момци поставуваат прашања,
сега да биде многу повеќе врз база на проблем, каде што ние ги користиме простори, и -
О, па идејата е да се оди со врски што водат Ви испратив, а потоа ќе биде во мојот простор.
Не секој има лаптоп? Во ред.
Па ние ќе биде со користење на овој, а ние ќе се прави проблеми живеат во делот
и да дискутираме за нив и да пронајдат она што не е во ред
и јас може да се повлече до некои од вашиот код, и јас би можеле да разговараат за своите идеи.
Значи има некој имал тешкотии?
Можете да разговарате на страна, јас не знам дали ќе имаме причина за тоа.
Сега, како и претходните supersection, ако сте биле во таа класа, знаеш што тоа е за.
На сите на P поставува таму ќе биде овие секции.
Значи P-сет 2, спецификации, претпоставувам дека го видов на P-сет 1 веќе.
Но, можеме да погледнеме во P-сет 2 за она што ние ќе треба да се случува во текот денес.
И ќе видите дел од прашањата.
Па ова ќе биде во сите P-сетови, ќе има дел од прашањата.
Досега сме рече: "Внимавај можност да ја практикуваат."
Вие не ќе биде побарано да поднесе оваа програма.
Идејата е дека овие би требало да се вид на ви помогнеме да започнете со проблемот во собата.
Претпоставувам за Хакер издание, многу од нив би требало да биде само нови, интересни работи да се научат.
Тие не можат да бидат директно применливи за проблемот сет.
И сега ние не имаш ќе ги поднесе, но во теорија,
за подоцна проблемот сетови, може да ги достават и на тој начин можете да дојде до дел
или види го делот за да го добиете одговори, или едноставно можете да ги добиете на вашиот сопствен
ако не се чувствуваат како ужива моето присуство.
Па - Мислам дека ова е првиот.
О. Исто така, во рамките на овие делови на прашања ние исто така ви поставуваат прашања во врска со шорцеви.
Па претпоставувам, во теорија, си требал да се види овие пред да дојдат во дел,
но тоа е во ред, ако не, ќе одиме над нив во секој случај.
Значи можеме да почнеме со овие: "Како се додека јамка се разликуваат од не-додека јамка?
Кога е последниот особено корисно? "
Значи некој има било -
[Студентски] На не-додека јамка секогаш ќе се изврши барем еднаш.
Да. Па тоа е разликата. А додека јамка - I'll само го прават тоа за тука - додека јамка, имаме состојба
токму тука, додека не-време, вие не мора состојба додека не се фаќате тука.
И така, кога вашата програма е извршување, и тоа добива на време јамка,
таа веднаш проверува дали оваа состојба е точно.
Ако тој услов не е точно, тоа само ќе го прескокнете во текот на циклусот сосема.
Do-додека јамка, како што на програмата се извршува, таа добива на "не".
Ништо не се случува во овој момент, само продолжува извршување.
Тогаш кога хитови на "време", ако состојбата е вистина, јамка ќе се врати и да го повториш
и повторно и повторно се додека состојбата не е вистина, а потоа само паѓа преку.
Значи, разликата е во тоа, дека ова може да прескокнете право од самиот почеток.
Ова значи извршува еднаш, а потоа може да се изврши повеќе пати ако состојбата се уште е вистина.
Па додека јамка само што ќе го направи тоа еднаш или - додека јамка - ние не треба да го направи тоа на сите,
бидејќи штом ќе дојде до тоа, ако состојбата е false, ние само ќе го прескокнете право над неа.
Каде што не-додека јамка, ние тоа ќе го изврши еднаш, мора.
Потоа, кога ќе дојде до состојба, ние се провери дали е точно или неточно.
Ако тоа е вистина, ние ќе го направи тоа повторно, ако е неточно, ние само ќе продолжи да оди.
Значи, кога е второто особено корисно?
Па можам да кажам дека во целост од 4 години, 3 години, без разлика,
дека сум бил програмирање, јас се користи ова како под 10 пати.
И веројатно 5 од нив се во CS50 кога ние сме за воведување на не-додека петелки.
Па кога не сте користеле не-додека петелки?
Кога е - Да?
[Студентски] Кога сте се обидува да добие корисник влез, или нешто што сакате да се провери -
Да. Така не се прави додека петелки, корисник влез е голем.
Тоа е причината зошто на првите неколку проблемот сетови, кога сакате да побара од корисникот, како,
"Дајте ми еден конец," не може да продолжи додека не се добие дека стрингот.
И така, мора, треба да прашате за стринг барем еднаш.
Но, тогаш, ако тие одговори нешто лошо, тогаш треба да се јамка назад и побара повторно.
Но, освен корисник влез, тоа е многу ретка дека јас се сретне со случајот
каде што сакате да го поминете "барем уште еднаш", но можеби и повеќе.
Прашања или - Дали некој користи не-додека јамка никаде на друго место?
Во ред. Значи следниот еден е, "Што значи непријавена идентификатор
обично укажуваат ако outputted со ѕвекот? "
Значи каков вид на код можам да пишувам за се 'непријавена идентификатор?
[Студентски] дека x = 2?
Па ние само да го пробате овде, x = 2.
Ние ќе ја извршите оваа - О, јас не кликнете на неа. Значи тука добиваме - сите права.
"Употреба на непријавена идентификатор х."
Значи тоа е непријавена идентификатор, променлива.
Тоа често ќе се јавите на променлива идентификатор.
Така што не може да знаат дека тоа е всушност една променлива, таа не знае што е тоа.
Така, тоа е идентификатор.
Значи, зошто е тоа непријавени? Да.
Значи да биде јасно на терминологијата, декларацијата на променливата
е кога ќе се каже "int x," или "стринг y", сеедно.
Почетокот на променлива, или доделување на променлива,
е кога ќе се каже "x = 2."
Значи можеме да направиме овие во одделни чекори, int x, x = 2, а до - можеме да имаме еден куп на работи тука -
но до оваа линија се случува, x се уште деиницијализира, но тоа е декларирана.
И така ние очигледно може да го стори во 1 линија, а ние сега се наведува и иницијализацијата.
Прашања?
И, конечно, "Зошто не е шифра Цезар многу безбедна?"
Значи прво, дали некој сака да каже што Спортот Цезар е?
[Студентски] Цезар шифра само е дека сајтот, можете префрлат секоја буква,
одреден број на букви поминат, и се движи назад во текот, и тоа не е многу безбеден, бидејќи
има само 26 можни опции и вие само треба да се обиде секој 1 на оние додека не го добие.
О. Значи, јас треба да се повторуваат?
На Цезар шифра, it's - мислам, ќе се занимаваат со тоа на проблемите со кои сте -
или Претпоставувам дека стандардна верзија на проблемот сет кој не е на хакерски издание.
Така, на стандардна верзија на проблемот во собата, ќе добиете порака како: "Здраво, свет"
и ти исто така имаат голем број како 6, и да ве однесе на таа порака, и секој индивидуален карактер,
го ротираат со 6 позиции во писмото.
Па 'ж "во здраво ќе стане ж-з-ѕ-к-л-м-н.
Така првото писмо ќе биде n. Ние го правиме истото со e.
Ако имаме, како, z или нешто, тогаш заврши назад околу да "А".
Но, секој карактер добива cycled 6 карактери подоцна во писмо, и тоа не е многу безбеден
бидејќи постојат само 26 можностите за колку начини може да се заврши една буква.
Така да само да го пробате сите 26 од нив и, веројатно, за доволно долго пораката,
само 1 на оние можни 26 нешта се случува да биде читлива,
и читливи еден ќе биде оригиналната порака.
Значи тоа не е многу добар начин на енкрипција ништо на сите.
Поврзани со оние шорцеви, "Што е функција?"
Значи она што е функција? Да.
[Студентски] Тоа е како посебен дел од кодот кој можете да се јавите да одат преку и потоа да се врати вредноста на сеедно.
Да. Па јас ќе го одговори на, исто така, одговарајќи на следниот - или повторување на исто така, само одговарање на следниот.
Можете да ги користите функциите наместо само копирање и вметнување код одново и одново.
Само да тој код, стави го во fuction, а потоа може само да се јавите на функција
каде сте биле копирање и вметнување.
Значи функции се корисни.
Па сега ние ќе направиме вистинските проблеми.
Првиот. Па идејата на Првиот е, ќе го помине низа, и без оглед на -
или не го велат сите мали? Тоа не велат дека сите мали букви.
Па пораката може да биде ништо, и - О, не. Тоа го прави.
"За едноставност, може да се претпостави дека корисникот само ќе влез мали букви и празни места."
Па ние го положат порака со само мали букви, а потоа ние заменик
меѓу капиталот и мали - ние промена на стринг за да биде капитал и мали букви, наизменични.
Па пред да ви даде една секунда за да дури и се нурне во проблемот,
Што е првото нешто што ние треба да направите?
О, што никако не можев да само кликнете на? О, јас само кликна на е-маил тука.
Така првото нешто што треба да направите - трагам во погрешно еден?
Дали е ова дел од оваа?
Не, тие се уште се таму, иако.
Океј, уште тука.
Сега не можеме да се претпостави - Да. Овде не може да се претпостави дека тоа е само мали букви и простори.
Па сега ние треба да се справи со фактот дека писмата може да биде она што сакаме од нив да биде.
И така првото нешто што сакате да направите е само да ја добие пораката.
Ние само треба да се низа, низа s = GetString, во ред.
Сега овој проблем, постојат неколку начини да ја направиш.
Но, ние се случува да сакате да го користите bitwise оператори овде.
Дали постојат луѓе кои или не биле во supersection,
или нешто, и не знам што bitwise оператори?
Или како тие се однесуваат на ASCII на било кој начин?
[Студентски] Јас не сум бил во supersection, но знам што bitwise оператори.
Во ред. Па тогаш јас не треба да се оди во текот на основите од нив, но јас ќе објаснам
она што се случува да сакате да го користите овде.
Значи "А": бинарно претставување на капитал, бројот е 65.
Јас сум само ќе се погледне - 41 ќе биде 01.000.001.
Така што треба да биде 65 во децимална; па ова е бинарно претставување на ликот капитал А
Сега, бинарната претстава на ликот мали букви "а"
ќе биде истото, што е речиси. Е дека - 6, да. Ова е во право.
Значи бинарни капитал А, бинарни мали "а".
Значи забележите дека разликата помеѓу А и "а" е ова еден малку.
И ова се случува да биде 32 малку, малку претставува бројот 32.
И кој што има смисла бидејќи е 65; "а" е 97.
Разликата меѓу нив е 32.
Така, сега знаеме дека може да се конвертира од А до "а" со преземање на
и bitwise тоа oring, со - што личи на 1.
Ова е bitwise ИЛИ, со 00100000, и тоа ќе ни даде "на".
И ние може да се добие од "а" до A од bitwise ANDing
со 11, 0 во тоа место, 11111.
Значи ова тогаш ќе ни даде токму она "а" е, но откажете од оваа индивидуа малку,
па ние ќе мора 01000001, јас не знам дали сум ги броел право.
Но, оваа техника на bitwise oring да се добие од капиталот во мали букви,
и bitwise ANDing да се добие од мали до капитал не е ексклузивна за А
Сите букви, К vs К Ш vs z,
сите од нив се само ќе се разликуваат од оваа единствена малку.
И за да можете да го користите ова да се промени од било мали букви на секоја буква и обратно.
Во ред. Така лесен начин на добивање од тоа - па наместо да
пишувам од она 1011111 е - лесен начин на претставување на овој број, и ова не е една
дека отидов во supersection, но тилда (~) е уште bitwise оператор.
Што ~ не е изгледа во малку застапеност.
Да го земеме било кој број.
Ова е само дел бинарен број, и она што ~ се тоа е само flips сите битови.
Значи ова беше 1, а сега е 0, ова е 0, сега 1, 010.100.
Значи тоа е сите ~ прави. Значи 32 ќе биде бројот - се ослободи од тоа -
па 32 ќе биде бројот 00.100.000, и така ~ на ова ќе биде
овој број се тука дека јас ANDed 'а' со.
Не сите се види тоа? Ова е прилично честа, како кога сакате да дознаам
за подоцна работи што може да се види, кога сакаме да се види дали -
или ние сакаме сè, секој малку сет освен 1
ќе имаат тенденција да се направи ~ на малку што не сакаме во собата.
Значи ние не сакаме на 32-битна собата, па ние не ~ на 32.
Во ред. Значи можеме да го користиме сите оние тука.
Добро, така што тоа е во ред, ако не завршиш, ние полека ќе одиме заедно,
или да одиме во текот на овој, така - преку ова. Прошетка низ ова.
Значи ние имаме стринг, и ние сакаме да јамки низ секој лик во таа низа и направи нешто со неа.
Така како ние да јамки низ низа? Она што ние треба да го користите?
Јас не одам да го направи тоа за тука. Да.
Значи имам iterator, и тој го рече, но како можам да знам колку карактери се во низа?
Strlen (а), а потоа i + +.
Значи она што го направив тука не е најдобар начин на вршење на работите.
Дали некој знае зошто?
Затоа што ти си проверка на јазикот на стрингот секој пат.
Значи ние се случува да сакаат да се движат strlen, можам да кажам се тука, int должина = strlen (а),
а потоа можам <должина, и во случај да не сте го виделе претходно,
Јас, исто така може да го направи int i = 0, должина = strlen (а).
И така ова е малку подобро, бидејќи сега сум ограничи опсегот
на променливата должина на само овој "за" јамка, наместо тоа прогласување пред
и дека секогаш постои, и во случај да не фати зошто тоа е лоша,
или зошто оригиналот беше лошо, it's - започне во за телефонска линија.
Јас проверив состојба. Е з <должината на пријавите?
Значи должината на с, ајде да работиме со "здраво" за целото време.
Значи должината на с, ж-е-л-л-о. Должина е 5.
Значи i = 0, должина е 5, па не е <5, па циклусот продолжува.
Потоа одиме повторно. Ние провериш состојбата. Е з <должината на здраво?
Значи, да проверите должината на здраво. H-е-л-л-о. Тоа е 5; јас не е <5, па ќе продолжиме повторно.
Значи ние сме пресметување, сметаме здраво, за секој повторување на јамка,
дури мислев дека никогаш нема да се промени, тоа е секогаш ќе биде 5.
Па ние само се сеќавам 5 до пред, и сега се 'е подобро.
Значи процесирањето во текот на целиот стринг.
Што сакаме да се направи за секој карактер на стрингот?
[Студентски земено, неразбирливо]
Да. Значи, ако карактерот не е алфабетско, тогаш ние само сакаме да ја прескокнете над неа.
Бидејќи ние само се грижат за алфабетското писмо, ние не може да профитираат број.
Па како можеме да го направите ова? Значи, нашата состојба, па ако сакаме нешто - проверете дали е азбучен.
Така како ние да се провери ова?
[Студентски] Треба само да ја користите функцијата е алфа.
Е дека се вклучени во било кој од овие, или било кој вклучува како, char.h или нешто?
Да не го користат е алфа функција, и употреба на експлицитни - па ние имаме s [i],
тоа е осмиот карактер е, запомнете дека низа е низа од карактери,
па осмиот карактер е.
Сега, ако тоа е голема буква, знаеме што треба да биде во еден специфичен опсег.
И што е тоа опсег?
Да. Па ако е [i] е ≥ 65 години, и е [i] е ≤ 90, што треба да направам наместо неа?
Да. Значи вие никогаш не треба апсолутно дури и треба да знаете ASCII вредности за ништо досега.
Никогаш не мислам на броеви 65, 90, 97 и 102, или што и да е.
Вие не треба - 112 - не треба да знаат оние на сите. Тоа е во ред премногу.
Користат само еден цитат карактери, еден цитат константи. Значи А и помалку од 90 е "З"
И ова е значително подобро - јас не знам од врвот на мојата глава дека Z е 90.
Знам од врвот на мојата глава дека 'Z' е главен град З
Толку колку што тоа е во опсег од главниот град од А до капитал Z, или можеме да се провери за мали букви,
Или ако е во опсег ≥ "а" и ≤ z.
Значи тоа е нашата состојба.
Стил за тоа каде да се стави овие работи варира.
Јас ќе го направи тоа како оваа.
Сега, она што сакаме да направам?
Знаеме дека ова писмо е лик, по азбучен карактер.
Значи ние треба да го менува дали тоа сега треба да биде голема буква или мали букви.
Како ние да ги пратите на кој што сакаме да биде?
[Студентски гласови, неразбирливо]
Така да, но дозволете ми да се провери.
Модул 0-2 беше речено, беше предлог исфрлен, и јас се согласувам со тоа.
Освен забележи дека, како - е тоа така? Да.
Тоа е секој друг, но не можеме модул 2 од i, или јас современи 2, од
забележите дека Е е капитал и "а" е со мали букви? Но, има простор одделување на нив?
Значи тие се случува да бидат исти современи 2, но тие се различни случаи.
[Студентски збор, неразбирливо]
Да. Значи, ние сме само ќе го задржи брои.
Ние, исто така може да го направи тоа во овде, ако сакаме, а тоа може да се добие малку тежок за употреба
во за телефонска линија декларации; Јас ќе ја ставам тука.
Значи int count = започнува од 0.
И така сега, јас ќе одам да брои колку азбучен карактери имавме.
Така ние неизбежно ќе брои + +, бидејќи ние откривме друг азбучен карактер.
Но, па сега сте велејќи дека ако брои современи 2.
Па што ако брои современи 2? О. Јас ќе направам == 0 за сега.
Ние исто така ќе одат над тоа. Значи, ако брои современи 2 == 0, тогаш што?
[Студентите одговор, неразбирливо]
Значи, ние сакаме тоа да се заокружи големи букви.
Постојат 2 случаи; големи и мали се 2 предмети.
Значи, ако ние сме во мали ние треба да се направи големи букви.
Ако тоа е големи ние не треба да правиш ништо.
Но, има ли начин - shouldn't се превртува -
дека ние дури и не треба да се провери дали е големи или мали букви?
Што можеме да направиме за секогаш да бидете сигурни дека ние секогаш завршуваат во големи?
Значи забележи она што ние го сторивме за мали "а", што ако ние го сторивме тоа исто точно нешто во големи букви А?
Дали големи букви А промена, или не вредност промени?
Да. Па секоја буква bitwise ANDed со ~ 32 ќе биде истата голема буква
бидејќи за било голема буква на 32 битна не е поставена.
Значи, ако сакаме да се донесе ликот на [i], ние сакаме тоа да стане мали или големи букви.
Значи, ако тоа е со мали букви, тоа е сега големи, ако тоа е големи, тоа е уште големи букви, и тоа е тоа.
Ова го реков во supersection: Можете да ги користите 32 ако сакате, но јас го преферираат прави "а" - А,
наместо едноставно 32, бидејќи тоа може да биде било која друга малку.
По 32-битна, тоа може да биде било кој од овие, или ние не би имале доволно
броеви да ги претставуваат сите на ликовите.
Значи, ако добие 32-битна, тоа би можело да биде 64 битна, тоа би можело да биде 128 битна.
Било која од овие делови може да биде малку што го разликува помеѓу големи и мали букви.
Јас не треба да треба да знаат дека тоа е 32-битна.
Јас да го користите овој "а" - А да се добие малку се разликува помеѓу две
без потреба да се потпрат на магичната бројка која е 32.
И така сега, друго брои беше чудно, и така она што сакам да направам?
[Студентски одговори, неразбирливо]
[Студентски] Што е тоа?
Јас ќе го направам во 1 секунда.
Па сега ако сакам да - сакам да бидете сигурни дека карактерот е сега мали букви,
и така јас може или за 32, а "а" 32 значење - А
Но, огласот, од ист резонирање, како и претходната, дека ако
писмото беше веќе мали букви, тогаш oring од 32 само чува мали букви.
Тоа не е променет оригиналниот карактер.
Но сега не мора да се избегне велејќи: "Ако тоа е со мали букви, само да заборавите за неа,
ако тоа е големи, тогаш тоа се промени. "
Тоа е многу полесно да го направите тоа.
[Студентски] ќе дека стратегијата на одземање на големи од мали работи, ако не беше 32?
Ако тоа беше, како, 34 или нешто?
Значи, вие треба да знаете дека разликата помеѓу 2 е - >> 1 малку.
Тоа може да биде повеќе од 1 малку, додека сите делови под оваа позиција се исти.
Значи ние треба најмалку 26 карактери - или, постојат 26 карактери.
Значи ние треба најмалку 26 броеви да претставува разликата -
Разликата меѓу А и "а" мора да биде најмалку 26,
или на друго место не би го претставувале сите главни броеви.
Тоа значи дека, ако почнеме од 1, тоа се случува да го користите сите овие битови,
сите овие првите 5 битови, претставува сe преку З
Тоа е зошто на следната малку, или ова малку, следниот бит е оној што е избран да се направи разлика меѓу А и 'на.'
Тоа е, исто така, зошто, во ASCII табелата, има 5 симболи одвојување големи букви од мали букви.
Бидејќи тие се симболи, дополнителни 5 што ги носи до 32 да биде разликата меѓу нив.
[Студентски] Значи, ние би можеле да го направи тоа, бидејќи ASCII е дизајниран на тој начин.
Да. Но ASCII - разликата, исто така, може да биде и двете од овие битови.
Како, ако беа 10000001 и "а" е 11100001 - да заборавам, сеедно.
Но, ако се ова, тогаш ние се уште може да се користи "а" - А
Тоа е само сега разликата помеѓу А и "а" е уште овие 2 бита.
Мислам дека тоа е напишано 48. Тоа е 32 + 64? Мислам дека е тоа?
Тоа, сепак, ќе биде 2 бита; секој карактер, како, Z и Z, К и К,
тие се уште ќе имаат исти точно битови во собата, освен за оние 2 бита.
Толку колку што тоа е секогаш точно, без оглед на тоа дали ние сме со користење ASCII или некои други систем,
додека има само одреден број на битови кои се различни за секој лик,
тогаш тоа функционира добро.
Тоа е само дека 32 беше формирана, бидејќи тоа е првиот ние би можеле да го користите. >> Кул.
Имам навика да претпочитаат, во случај да не сте виделе, ако блок е само една линија,
можете да се ослободите од големи загради, па се трудам да преферираат ова.
Исто така, знаеш како можеме да ги правите нештата како и [i] + = 1?
Можете исто така да направам е [i] bitwise И = 32.
И bitwise ИЛИ = 32.
Исто така, смета современи 2 == 0.
Значи се сеќавам тоа - јас нема да го напишам - сите не-нулта вредност е вистина, а 0 е лажна.
Па "ако брои современи 2 == 0" е иста како и велејќи: "ако не смета современи 2."
Јас веројатно ќе имаат само спротивен на линии и рече, "ако брои современи 2,
прават или 1, друг го стори и 1 ", така што јас не треба" не ".
Но, ова работи само како добро.
И што друго да правам тука?
Можете да ги комбинирате со троичен ако си сакал, но тогаш тоа само ќе се направат работите Messier
и веројатно повеќе тешко да се прочита, па ние нема да го стори тоа.
Секој имате било какви други предлози?
Е дека сите проблеми побара? Oh yeah.
Така да се ослободи од овие празни линии, сега ние ќе печати ѓ,% s биде еден за жици,
Ние ќе се печати ѓ, с.
Сега ајде да ја стартувате. Направив ништо погрешно?
Тоа е \ "; Сакам n.
Во ред. Сега ќе го работи. Тоа веројатно ќе се развикам мене.
Strlen е во string.h.
Значи ова е убаво нешто за ѕвекот е тоа ти го кажува она што е во,
наместо GCC што само вели: "Еј, ти заборави нешто, не знам што е тоа."
Но, ова ќе ми кажеш, "значи да се вклучат string.h."
Па јас не прашува за ништо, па тоа не е велејќи дека ништо.
Но, ние ќе го направи нивниот пример, "thanks 4 the add".
Тоа изгледа добро. Ура.
Па враќање кон вашиот главен, јас речиси никогаш не го направи тоа.
Тоа е задолжително. И главниот е единствената функција за која не е задолжително.
Ако не се врати ништо од главните, се претпоставува дека ќе треба да се вратат 0.
Прашања?
Во ред. Така, сега вториот проблем.
"Да се ​​потсетиме од втора предавање недела 2 дека Замена 2 променливи" вредности со полагање
тие 2 променливи за функција (дури и ако се нарекува swap) не е точно работат, барем не без "совети".
И да го игнорира совети се додека не се дојде до нив.
Ние сакаме да се разменуваат 2 променливи, ние не користите функција да го стори тоа.
Ние уште ќе го стори во главниот како што се вели.
Но да ги користат овие 2 променливи, ние не сакаме да се користи привремена променлива.
Постојат 2 начини да го направите тоа.
Можете да го направите со вашиот традиционалните бинарни оператори.
Па дали некој знае брз и валкан начин тоа да го направам?
Тоа всушност може да потрае една минута на размислување. Ако имам -
Ќе се постави проблемот до како што побара. Значи, ако имам 2 променливи, А, што е само целобројна
дека тие ми даде, и збирот променлива Б, што е уште еден цел број кој сум дал.
Значи, ако имам овие 2 променливи, сега сакам да ги трампа.
Традиционалните, со користење на вашите редовни бинарни оператори, мислам, како +, -, ÷.
Не bitwise оператори кои дејствуваат на бинарни.
Значи со користење на -, + ÷, и сите оние.
Ние би можеле да се разменуваат со нешто како = a + b и b = a - b, a = a - b.
Значи, разумност провери, а потоа ќе видиме зошто тоа работи.
Да речеме = 7, b = 3, тогаш a + b ќе биде 10.
Па ние сме сега поставувајќи = 10, а потоа правиме b = a - b.
Значи ние сме прави b = a - б, која ќе биде 7, и b = a - b повторно,
или = а - б. Која ќе биде 10-7 што е 3.
Па сега, правилно, беше "а" 7, б беше 3, а сега b е 7 и "а" е 3.
Така што вид на логично; "а" е комбинација на 2 броја.
Во овој момент, "а" е комбинација, а потоа ние сме одземање на оригиналниот б,
а потоа ние сме одземање од она што беше оригиналниот "на".
Но, тоа не функционира за сите броеви.
Да се ​​види ова, ајде да се разгледа систем, па ние обично мислат на цели броеви како 32 бита.
Ајде да работиме на нешто што е само како 4 бита.
Се надевам дека ќе излезе со добар пример во моментов.
Значи, знам, тоа ќе биде лесно.
Да речеме нашите 2 броја се 1111, и 1111, па ние сме во бинарен во моментов.
Во реалниот децимали, ако сакате да се размислува на тој начин, a = 15 и б = 15.
И така ние се очекува, откако ќе ги трампа - тие дури и не мора да бидат исти броеви,
но тоа го правев овој начин.
Да се ​​направи не ги истите броеви. Да направиме 1111 и 0001.
Значи = 15 и б = 1.
Откако ќе ги трампа, ние очекуваме 'а' да биде 1 и б на 15.
Значи нашиот прв чекор е = a + b.
Нашите броеви се само 4 бита широк, па "на", кој е 1111, + b, која е 0001,
ќе заврши се 10.000, но имаме само 4 бита.
Па сега = 0.
И сега ние сакаме да го поставите b = a - b - всушност, ова сè уште работи надвор совршено.
A = A - B - да видиме дали ова работи надвор совршено.
Па тогаш б = 0-1, која, сепак, ќе биде 15, а потоа = a - б, која ќе биде 1.
Можеби ова не функционира.
Се чувствувам како да има причина тоа не функционира со користење на регуларни.
Океј, па работат на претпоставката дека тоа не функционира со редовни бинарни операции,
и јас ќе барате - Ќе Google да се види дали тоа е вистина.
Значи, ние сакаме да го направи тоа со помош bitwise оператори, а поим овде е XOR.
Значи, воведување на XOR (^), ако не сте го виделе досега.
Тоа е, повторно, операторот bitwise така делува малку од малку, и it's -
Ако имате битови 0 и 1, тогаш ова ќе биде 1.
Ако имате битови 1 и 0, тоа ќе биде 1, имате битови 0 и 0 тоа ќе биде 0,
и ако имате битови 1 и 1 тоа ќе биде 0.
Па тоа е како ИЛИ. Ако било кој од битови се вистинити, тоа е 1, но за разлика ИЛИ, тоа не може да биде и битови кои се вистинити.
Или ќе има ова да биде 1, XOR ќе треба ова да биде 0.
Па ние ќе сакате да го користите XOR тука.
Размисли за тоа за една минута, јас ќе одам на Google.
Добро, вие не може да се прочита дека, јас сум моментално на XOR swap алгоритам страница.
Се надевам ова ќе објасни зошто јас што не се -
Ова е точно алгоритам што ние едноставно не.
Јас се уште не гледам зошто - Јас мора да само зедов еден лош пример,
но овој случај каде што 'A' се случи да стане 0, по добивање на 5 парчиња, па сега "а" е 0,
тоа е она што се нарекува "број претекување."
Според Википедија, "За разлика од XOR, swap, оваа варијација бара тоа што користи некои методи
да се гарантира дека x + y не предизвикува целобројна претекување. "
Значи ова има проблеми, тоа е цел број преливник, но јас не нешто погрешно.
Јас не сум сигурен. Ќе се обидам да излезе со уште еден.
[Студентски] Па, не е цел број претекување кога ќе се обидуваш да се стави број таму
поголем од износот на битови што се наменети?
Да. Имаме 4 бита. That's - имавме 4 бита, тогаш ние се обидете да додадете 1 до тоа, па на крајот ќе заврши со 5 бита.
Но, петтиот малку само се отсечени, да.
Тоа би можело всушност -
[Студентски] Дали тоа ќе фрли грешка, или дали тоа - тоа ќе фрли грешка?
Не Значи нема грешка. Кога ќе стигнете до собранието ниво, посебно малку
некаде е поставено тоа, вели имаше преливник, но во C сте вид на само не се занимаваат со тоа.
Ти всушност не може да се справи со неа, освен ако не се користат специјални собранието инструкции во C.
Ајде да размислиме за XOR swap.
И мислам дека статијата на Википедија може, исто така, се вели дека -
Па затоа, исто така, израснати модуларен аритметика, па претпоставувам дека беше, во теорија, прави модуларен аритметика
кога реков дека 0-1 е 15 повторно.
Така што може всушност - на редовна процесор кој го прави 0-1 = 15.
Бидејќи ние завршуваат на 0, ние одземе 1, па потоа тоа само обвива назад околу да 1111.
Значи овој алгоритам всушност би можеле да работат, а + б, А - б, б - еден, а тоа може да биде добро.
Но, има некои процесори кои не го сторат тоа, па тоа не би било во ред во овие специфични оние.
XOR swap ќе работи на било кој процесор. Во ред.
Идејата е дека тоа би требало да биде иста, иако.
Каде што ние сме со користење XOR некако да добиете информации на двете во 1 на променливи,
а потоа се повлече на информации на поединечните променливи повторно.
Значи не секој имате идеи / одговорот?
[Студентски одговор, неразбирливо]
Значи ова треба да работат, а исто така, XOR е комутативен.
Без оглед на тоа кој редослед овие 2 броја се случи да биде во се тука,
овој резултат ќе биде ист.
Значи ^ б е б ^ а.
Вие исто така може да се види ова напишано како ^ = б, б ^ = a, A ^ = b повторно.
Значи ова е во право, и да се види зошто тоа функционира, мислам на битови.
Користење на помала број, да речеме 11.001 и 01.100.
Значи ова е "a", ова е б.
Значи ^ = b.
Ние ќе биде поставување 'A' = на XOR за овие 2 работи.
Значи 1 ^ 0 е 1; 1 ^ 1 е 0, 0 ^ 1 е 1, и 0 ^ 0 е 0, 1 ^ 0 е 1.
Толку "а," ако се погледне на децимален број, тоа нема да биде -
вие нема да видите многу на врската помеѓу оригиналот "а" и новата "а"
но гледајќи на битови, "а" е сега како мрежа на информации
и на оригиналниот "а" и оригиналниот б.
Значи, ако ние се б ^ а, можеме да видиме дека ние ќе се заокружи во оригинална 'на.'
И ако се земе оригиналниот "а" ^ новиот 'на' можеме да видиме на крајот ќе заврши во оригинална б.
Значи (а ^ б) ^ b = оригиналниот "на".
И (a ^ b) ^ а = оригиналниот б.
Постои - уште еден начин на гледање на ова е нешто XOR себе е секогаш 0.
Значи 1101 ^ 1101, сите делови се случува да бидат исти.
Па таму никогаш не се случува да биде случај каде што 1 е 0, а другата е 1.
Па ова е 0000.
Истото со ова. (A ^ b) ^ б е како ^ (б ^ б).
(Б ^ б) ќе биде 0; на ^ 0 е само ќе биде "еден", бидејќи сите битови се 0.
Па само оние кои се случува да биде и онаму каде "a" првично беше 1 - имале оние.
И истата идеја тука, јас сум прилично сигурен дека тоа е комутативен.
Да. Јас реков пред тоа беше комутативен.
На ^ 'а', и тоа е асоцијативно, па сега (б ^ а) ^ а.
И можеме да направиме б ^ (a ^ а).
И така еднаш, ние се добие оригиналниот б.
Значи "а" сега е комбинација на "а" и б заедно.
Користење на нашата нова комбо "а" ние велиме б = комбо "а" ^ оригиналниот б, ние се добие оригиналниот "на".
А сега = комбо "а" ^ новата б, кој беше оригиналниот - или што е сега она што беше "а" или б.
Тоа е овој случај овде. Ова е = b, стари б.
Така, сега сè е назад во сменил ред.
Ако ние всушност погледна на битови, b = a ^ b, ќе XOR овие 2,
а одговорот ќе биде тоа, и тогаш = a ^ b е XORing овие 2 и одговорот е ова.
Прашања? Во ред. Така за последен пат е нешто значително потешко.
[Студентски] Мислам дека тој има прашање во врска со тоа. >> О, извинете.
[Студентски] Што е всушност побрзо? Ако го користите овој XOR, или тоа е ако се изјасни за нова променлива?
Значи она што е, всушност, побрзо, објавувајќи нова променлива или со користење XOR да се разменуваат?
Одговорот е, во сите веројатноста, привремена променлива.
А тоа е затоа што еднаш тоа е компајлирана надолу - па во собранието ниво,
не постои такво нешто како локални променливи или било привремени променливи или било кој од овие работи.
Тие се само како - има меморија, и постојат регистри.
Регистри каде работите се активно се случува.
Не го додадете 2 работи во меморијата; ќе додадете 2 работи во регистрите.
И ќе ви доведе работите од меморијата во регистри за да потоа да ги додадете,
и тогаш можеби ќе ги стави повторно во меморијата, но сите акција се случува во регистрите.
Значи, кога сте со користење на привремена променлива пристап, обично она што се случува е
овие 2 броја се веќе во регистрите.
И тогаш од тој момент натаму, откако сте ги сменил,
тоа само ќе започнете со користење на други регистар.
Каде што бил со користење б, тоа само ќе го користите регистар што веќе складирање "на".
Па затоа не треба да направите нешто за да всушност направиме swap. Да?
[Студентски] Но, тоа исто така ги зема повеќе меморија, нели?
Тоа само ќе биде потребно повеќе меморија, ако треба да се складираат дека привремена променлива.
Како ако подоцна ја користат таа привремена променлива повторно некаде,
потоа - или да доделите нешто за таа привремена променлива.
Значи, ако во било која точка во времето "на" Б во Темп имаат различни вредности или нешто,
тогаш тоа се случува да имаат различни локации во меморијата, но точно е дека
постојат многу локални променливи кои само ќе постои во регистрите.
Во кој случај, тоа никогаш не се стави во меморија, и така да никогаш не си губи меморија.
Во ред. Последното прашање е малку повеќе.
Значи тука, во овој CS50 апаратот, постои речникот.
А причината за ова е затоа [? B66] е правопис Проверка каде што ќе бидат писмено
користење на хаш маси или обиди или некои податоци структура.
Сте ќе треба да се пишува Проверка на правопис, а вие ќе треба да се користи овој речник да го направат тоа.
Но, за овој проблем, ние сме само ќе се погледне нагоре да видам ако еден збор е во речникот.
Така, наместо за чување на целиот речник во некои податоци структура
а потоа во потрага над целиот документ за да ја видите ако нешто е погрешно напишани,
ние само сакаме да се најде 1 збор. Па ние само може да ги скенира преку целиот речник
и ако никогаш не наоѓаме зборот во целиот речник, тогаш тоа не беше таму.
Ако ние скенирање во текот на целиот речник и гледам зборот, тогаш ние сме добро, ние ја најдов.
Таа вели дека овде ние сакаме да почнете да барате во датотека ракување функција на C,
Бидејќи ние сакаме да го прочитате во речникот,
но јас ќе им даде на закажаната тука, како на кој функции треба да се размислува за.
Јас ќе ги пишувам на простори.
Па главната оние што ќе сакаат да се погледне во се ѓ отворен, а потоа, неминовно, ѓ затворен,
кој ќе оди на крајот на вашата програма, и ѓ скенирање ѓ.
Вие исто така може да се користи ѓ читаат, но најверојатно не сакаат да
бидејќи тоа - вие не завршуваат потреба за ова.
F скенирање ѓ е она што ви се случува да се користи за скенирање во текот на речникот.
И така не треба да кодот до решение, едноставно се обидуваме и како псевдо-кодот на вашиот пат
до решение, а потоа ние ќе разговараме за тоа.
И всушност, бидејќи јас веќе ти дал овие, ако одите во било кој терминал или школка апаратот е,
Јас би - Јас обично - ако не сте го виделе досега, не знам, ако не во класа,
но човекот, а човекот страници, се прилично корисни за гледање на доста било функција.
Значи можам да направам, како, човек ѓ, скенирање ѓ.
Ова е сега на информации за ѓ скенирање семејството на функции.
Јас, исто така може да го направи човекот ѓ, отворен, и дека ќе ми даде детали за тоа.
Значи, ако знаете што функција го користите, или што ти ја читаш код
и ќе видите некоја функција и сте како: "Што значи ова правам?"
Само човек што името на функцијата.
Постојат неколку чудни примери каде што може да се каже
слично. Man 2 дека името на функцијата, или man 3 дека името на функцијата,
но вие имате само уште да го направи тоа ако човекот името на функцијата не се случи да се работи за прв пат.
[Студентски] Затоа, јас сум читање на човекот страница за отворени, но јас сум уште се збунети за тоа како да го користат и програмата.
Во ред. Многу од man страниците се помалку од корисни.
Тие се повеќе од корист, ако веќе знаат што прават
и тогаш само треба да се запамети редоследот на аргументи или нешто.
Или тие може да ви даде општ преглед, но некои од нив се многу големо.
Како ѓ скенирање ѓ, исто така. Тоа ви дава информации за сите овие функции,
и 1 алинеја доле случува да се каже, "Ф скенирање ѓ чита од стрингот точка или поток."
Но ѓ отвори. Значи, како ние ќе го користи ѓ отворен?
Идејата за програмата која треба да се направи датотека I / O е дека
прво треба да се отвори датотеката која сакате да се прават работите со, и неизбежно,
прочитате нешта од таа датотека и да работи со нив.
F отворен е она што ние ги користиме за отворање на датотеката.
Она што се назад, па она датотека сакаме да се отвори, тоа ни дава -
тука тој вели: "/ Корисник / share / речник / зборови."
Ова е датотека која сакаме да се отвори, и ние сакаме да ја отворите -
ние треба да експлицитно дали сакаме да се отвори тоа да се чита или ако сакаме да се отвори тоа да пишувам.
Има неколку комбинации и работи, но ние сакаме да ја отворите оваа за читање.
Ние сакаме да чита од датотеката.
Значи она што го прави ова возврат? Тој се враќа на датотека ѕвезда (*),
и јас само ќе покаже се што е во променлива ѓ, па *,
повторно, тоа е покажувач, но ние не сакаме да се справи со покажувачи.
Можете да замислите ѓ како, f е сега променлива ви се случува да ги користите за да претставуваат датотека.
Значи, ако сакате да прочитам од датотеката, ќе прочитате од Ф.
Ако сакате да го затворите датотеката, ќе го затворите ѓ.
Па на крајот на програмата, кога ние неизбежно сакате да го затворите датотеката, она што треба да направам?
Ние сакаме да се затвори ѓ.
Па сега на последната датотека функција која ние ќе сакате да го користите е скенирање ѓ, ѓ скенирање ѓ.
И она што го прави тоа е скенира преку датотека во потрага по шема да се совпаѓаат.
Гледајќи човек страница тука, ние гледаме int ѓ скенирање ѓ, игнорирајте вратената вредност за сега.
Првиот аргумент е датотека * поток, па првиот аргумент ние ќе сакате да го положат е ѓ.
Ние сме скенирање над Ф.
Вториот аргумент е формат стринг.
Јас ќе ви даде формат стринг во моментов.
Мислам дека се случи да се каже, 127s \ n, многу од тоа е непотребно.
Идејата на она што формат стринг е, е можете да мислам на скенирање ѓ како спротивност на печатење ѓ.
Значи печатење ѓ, печатење ѓ ние исто така го користат овој тип на формат параметар,
но во печатените ѓ она што го правиме е - ајде да погледнеме еквивалентно.
Значи печати ѓ, и таму е всушност исто така ѓ печатење ѓ, каде што првиот аргумент ќе биде ѓ.
Кога ќе се печати ѓ, ние може да се каже нешто како, "печати 127s \ n" а потоа ако го поминат некои стринг,
тоа се случува да се печати овој стринг, а потоа нова линија.
Што 127 значи, јас сум прилично сигурен, но јас никогаш не сум си ограничен на тоа,
Вие дури и не ќе треба да се каже '127 'во печатените ѓ,
но што значи тоа е печатење на првата 127 карактери.
Па јас сум прилично сигурен дека тоа е случај. Можете да ги Google за тоа.
Но во следниот Јас сум речиси позитивни тоа значи дека.
Значи ова е печатење на првата 127 карактери, проследена со нова линија.
F скенирање ѓ сега, наместо да гледа во променлива и печатење на тоа,
тоа се случува да се погледне во некои стринг, и чување на шема во променлива.
Ајде да всушност употреба скенирање ѓ во различен пример.
Па да речеме имавме некои int, x = 4,
и сакавме да се создаде низа направени од - сакав да се создаде низа
тоа беше како, ова ќе дојде до многу подоцна,
нешто што е исто како 4.jpg.
Значи ова може да биде програма каде што ќе има сума контра,
сумира спротивстави i, а сакате да ги зачувате еден куп на слики.
Значи сакате да ги зачувате i.jpg, каде што некои повторување на вашата телефонска линија.
Така како ние да се направи овој стринг за тоа JPEG?
Ако сакаше да се печати 4.jpg, ние може само да се каже печатење F,% d.jpg,
и тогаш тоа ќе печати за тоа JPEG.
Но, ако сакаме да се спаси стринг 4.jpg, ние ги користиме скенирање ѓ.
Значи стринг е - всушност ние што не се - карактер, знак е, ајде да одиме 100.
Па јас само прогласи некои низа на 100 карактери,
и тоа е она што ние неизбежно ќе биде зачувување на кои JPEG внатре
Така ние ќе да се користи скенирање ѓ, како и формат, како би рекле% d.jpg
со цел да се печати 4.jpg, форматот на ова ќе биде% d.jpg.
Значи формат е% d.jpg, она што сакаме да го замени% d со е x,
и сега ние треба да ги чувате дека низа некаде.
И каде одиме да го зачувате овој стринг е во низата е.
Па по оваа линија код, и, ако ние печати F,% s на променливата е,
тоа се случува да се печати 4.jpg.
Значи ѓ скенирање ѓ е иста како и скенирање ѓ, освен сега е во потрага над оваа датотека
за што да се сместат во с.
Тоа е она што на последните аргумент ќе биде.
Ние сакаме да ја запази - "Скенирање ѓ семејството на функции скенира и во согласност со формат како обиде подолу.
Ако некој се чуваат во локацијата поени може да се врати - "
Не, ние може да биде добро. Дозволете ми да мислам за една секунда.
Значи скенирање ѓ не - она ​​што е грижам е функција која го прави тоа?
Значи скенирање ѓ нема да преземе број и не точка jpg.
Тоа се случува да [мрмори].
Зачувај int променлива во низа int C.
Што е оваа променлива, или она што е на оваа функција се нарекува?
Да. That's - да. Значи она што јас го дефинирање на вас пред да беше ги печати ѓ,
кој - што го прави многу повеќе смисла, затоа реков дека е многу повеќе како печати ѓ.
Скенирање f е уште вид на како печати ѓ, но ги печати ѓ е ќе го скенира преку
и да ја замени променливи и сега се чува во низа.
Наместо печатење тоа, го зачувува во низа.
Значи игнорираат тоа целосно. Сеуште можете да мислам на форматот назначувач како што е како онаа на печатените ѓ.
Па сега, ако сакаме да го стори 4.jpg работа, ние не би го направил и печатење f, x ова.
Значи она што скенирање ѓ прави - што беше твоето прашање ќе биде?
[Студентски] Јас сум само збунети од тоа што ние се обидуваме да се направи во право тука
со тоа JPEG. Може да се објасни дека 1 повеќе време?
Значи ова беше - тоа е помалку relevent да ѓ скенирање ѓ сега, се надевам, ќе врзуваат назад во некој вид на патот.
Но, она што првично беше намера да се покаже беше - ова е всушност директно релевантни за овие [? F5]
Сте ќе биде со користење на печати ѓ, каде што, да речеме имаме 100 слики,
и сакате да прочитате на сликата 1.jpg, 2.jpg, 3.jpg.
Значи, со цел да го направат тоа, треба да ѓ отворен, а потоа ќе мора да поминат во низа што сакате да го отворите.
Значи, ние би сакале да се отвори 1.jpg; со цел да се создаде нишка што е 1.jpg,
ние ги печати ѓ на% d.jpg--ние не направи за int i = 0.
i <40, i + +.
Па ги печати ѓ% d.jpg на i.
Па по оваа линија, сега променлива или низа s ќе 1.jpg.
Или 0.jpg, 1.jpg, 2.jpg. И така ние може да се отвори, пак, секоја слика за читање.
Значи тоа е она што ги печати ѓ прави. Дали ви се види она што е печати ѓ сега правиш?
[Студентски] Океј, па тоа е преземање - тоа создава низа, something.jpg, а потоа продавници неа.
Да. Тоа создава - ова е уште еден формат стринг, исто како и скенирање ѓ и печатење ѓ,
каде што го внесува сите променливи во вториот аргумент, може да биде и како што се противат на i.
Можеби - Мислам, тоа е случај. Но, без оглед на редоследот на аргументите.
Тоа се случува да вметнете сите променливи во формат стринг
а потоа сместат во нашите тампон; ние го нарекуваме дека тампон, тоа е каде што ние сме чување на стрингот.
Значи ние сме чување внатрешноста на е правилно форматирана стринг,% d биле заменети со 4.
[Студентски] Значи, ако ние го сторивме тоа, е променлива ѓ само ќе биде прераспореден?
Да. Значи ние треба да го затвори оригинални ѓ пред тоа.
Но - и тогаш, исто така, ако не беа ѓ отвори тука, тогаш ние ќе треба да се каже -
Да. Но, тоа ќе отвори стотици различни датотеки.
[Студентски] Но, ние не ќе биде во можност да пристапите или - во ред.
Во ред. Значи скенирање ѓ, ѓ скенирање ѓ, е вид на истата идеја,
но наместо, наместо за чување на тоа во низа, тоа е повеќе како што се сега
случува во текот на операција и модел за појавување против таа низа и чување на резултатите во променливи.
Можете да ги користите скенирање ѓ да го анализирам над нешто како 4.jpg, и чување на број 4 во износ int x.
Тоа е она што можеме да го користиме скенирање ѓ за.
F скенирање ѓ се случува да го направите тоа на командната линија.
Јас сум всушност прилично сигурни дека тоа е она што библиотеката CS50 прави.
Значи, кога ќе се каже ", се int", тоа е скенирањето ѓ-ИНГ над - скенирање ѓ е начинот на кој ќе го добиете корисник влез.
F скенирање ѓ се случува да го прават истото, но со користење на датотека за скенирање одново.
Па еве, ние сме скенирање над оваа датотека.
Моделот ние се обидуваме да одговара на некои стринг е 127 карактери
проследено со нова линија
Па јас сум прилично сигурен дека ние дури и може само да се каже "одговара на", бидејќи во речникот
ние се случи да има, ние сме загарантирана нема збор е дека долго,
и ѓ скенирање ѓ, мислам, ќе застане на нова линија без разлика што.
Но, ние ќе вклучуваат нова линија на натпреварот, и -
[Студентски] Ако не вклучува нова линија, не ќе најдат делови на зборот?
Тоа - секој - во потрага на речникот -
Значи во речникот, овие се сите наши зборови.
Секој од нив е во нов ред.
Ѓ скенирање се случува да ги собереш овој збор.
Ако ние не вклучуваат нова линија, тогаш е можно дека следната скенирање ѓ само ќе прочитате нова линија.
Но вклучувајќи нова линија, тогаш само ќе го игнорираат новиот линија.
Но, ние никогаш нема да добие дел од збор, бидејќи ние сме секогаш за читање до нова линија, без разлика што.
[Студентски] Но, што ако барате зборот "cissa", како cissa.
Ќе најдете дека, и велат дека тоа е натпревар?
Па овде - тоа ќе прочитате во - ова е всушност добра точка.
Ние никогаш не сте со користење на струја - зборот што го барате е првиот командата.
Значи стринг, збор = argv 1.
Па стринг што го барате е argv 1.
Ние не сме во потрага за еден збор на сите во нашата скенирање ѓ.
Што правиме со скенирање ѓ е добивање на секој збор во речникот,
а потоа еднаш имаме тој збор ние ќе го користите strcmp да ги споредите.
Ние ќе се споредуваат нашиот збор и што можеме само да читате внатре
Па неизбежно, ние ќе завршуваат прави еден куп на скенирање FS
додека тоа само така се случува, дека скенирање ѓ ќе се врати -
ќе се врати еден, колку што има исти нов збор,
и ќе се врати нешто друго штом тоа не успеа да одговара на зборот.
Читаме во текот на целиот речник, чување линија по линија секој збор во променлива s.
Тогаш ние се споредуваат збор со с, и ако споредба == 0,
strcmp се случува да се донесе 0 ако еден натпревар е направен.
Значи, ако тоа е 0, тогаш можеме да печатиме ѓ, кои се исти,
или збор во речникот, или што и да сакате да печатите ѓ.
А потоа - ние не сакаме да ѓ затвори одново и одново.
Ова е вид на нешто што сакате да го направите, а ние не се само барате збор во речникот.
Значи, ние би можеле да го направат тоа, ако сакаме да се погледне за нивната шема, cissa, како што рече пред,
ако сакаме да се погледне за тој модел, тогаш тоа ќе пропадне во случај
бидејќи тоа не е всушност еден збор, но еден од зборови во речникот се случува да има во него.
Така што ќе одговара на овој збор, но ова подмножество на зборот не е самата збор.
Но, тоа не е начинот на кој ние го користите, ние ја читаш во секој збор
и потоа споредувајќи го зборот што го имаме со тој збор.
Па ние сме секогаш во споредба со полно зборови.
Можам да испраќам конечната решенија подоцна.
Ова е вид на речиси вистинскиот одговор, мислам.
[Студентски коментар, неразбирливо]
О, никако не можев да се ослободи од таа пред тоа? Char е, претпоставувам рековме 127 - заборавам она што најголем е.
Ние само ќе направи 128, па сега s е доволно долго.
Ние не треба да се печати ништо.
Ние сме, исто така, ќе сакаат да имаат да ги затвориме нашите датотека, и дека треба да биде околу вистинскиот одговор.
CS50.TV