[Музички] Роб BODEN: Во ред. Значи, прво нешто што прво, на видео од познато лице. [Видео репродукција] -Во ред. Ова е CS50, а тоа е почетокот на три недела. Жал ми е што не може да биде таму со вас денес, но дозволете ми да се воведе Сопствени Роб CS50 е Боден. [Крај видео репродукција] [Аплауз и овации] Роб BODEN: На филмографија во дека видеото е фантастично. Во ред е. Значи прво, има уште еден ручек. Тоа е утре во 01:15. Нема ручек овој петок. Тоа е со Quora. И Томи се уште не е тука, но еден од на луѓето таму е поранешниот CF главата, Томи McWilliam. Па тој е забавно дечко. Треба да дојде. Во ред е. Па минатата недела, почнавме да се распадне за тоа што низа навистина е. Ние сме познати од почетокот дека тоа е низа од карактери. Но, минатата недела, ние delved во фактот дека она што е навистина низа од карактери, добро, ние сега имаме низи од карактери. И знаеме дека низа, тоа е низа на ликовите, на самиот крај, имаме оваа специјална null бајт, овој обратна коса црта 0, тоа го означува крајот на стрингот. И така низа е низа од ликови, но можеме да имаме повеќе од само низа од карактери, можеме да имаме низа од ниту тип на работа што го сакаме. Значи, ако се сеќавате од минатата недела, Возраст програма која Дејвид воведе навистина брзо. Па првото нешто ние ќе треба да направите е да побара од корисникот за цел број, број на луѓе во собата. Откако ќе го имаат тоа цел број, ние сме прогласување низа. Забележите оваа заградата синтакса. Сте ќе треба да се навикнеш на тоа. Па ние сме прогласување на низа од цели броеви наречен возрасти, и постојат n броеви во оваа низа. Значи овој модел токму тука, ова 4 int i изнесува 0, i е помал од n, јас плус плус, кој е, исто така, ќе биде шемата дека ќе добиете многу навикнати. Затоа што тоа е доста како сте секогаш ќе iterate преку низи. Па се сеќавам дека n е должината на нашите низа. И така тука, ние сме постојано бара за возраста на лицето јас во собата. По ова, ние одиме надолу, и за она што произволни причина, тогаш ние печатење колку години тие ќе да биде една година од сега. И работи таа програма, ајде да направи возрасти, точка црта возрасти. Па бројот на луѓе во собата, да речеме постојат три. И да каже, првиот човек е 13, Следниот е 26, а последниот е 30. Па тогаш тоа ќе iterate преку овие три луѓе, печати од 14, 27, и 31. Па се сеќавам дека кога ќе се изјаснат за спектар на големина n, индексите во таа низа, низа има вредности и индексите 0, 1, 2, сите начин до n минус 1. Па кога ќе рече дека има три лица во соба, и ќе стави тука првиот повторување преку овој јамка, јас ќе биде 0. Па во индекс 0. Ние сме давање на прва возраст на корисникот влегува во собата. Потоа, во следните една, ние сме влегуваат во Вториот N корисникот ќе влезе, и во до две, последните n. Така забележите дека низа од големината три нема ништо во индексот три. Ова не е валиден. Во ред е. Значи, ќе се вратам овде. Па сега дека ние сме се занимаваа со низи, имаме некои блискост. Сега ние ќе треба да се движи кон команда линија аргументи, кои ќе бидат прилично релевантни за овој проблем во собата. Па до сега, секогаш кога сте прогласена вашиот главен функција, ние сме рече int главната неважечки. Па празнина само значи дека ние не сме ги донесе аргументи на оваа функција. Сега ние ќе се види дека главната може да потрае неколку аргументи. Еве ние ги нарекуваме int argc и гудачки argv голема заграда. Во загради, уште еднаш, што укажува на дека ние сме се занимаваат со низи. Значи тука, стринг argv загради, ние сме се занимаваат со низа на стрингови. Па argc, што се случува за да се покаже колку аргументи ние сме предадена на оваа програма. И да видиме што тоа значи, ајде да се затвори ова. OK. Па до сега, ние сме се кандидира секој програма како точка црта возрасти. Ние исто така може, на командната линија, минатото помине аргументи, на тој начин терминот, команда линија аргументи. Така, првиот аргумент, Здраво светот. Па еве, argc ќе биде три. Тоа е пребројувањето на аргументи на командната линија. Argc е секогаш најмалку 1, бидејќи точка сека возрасти, сама по себе, се брои како една од на командната линија аргументи. Тогаш здраво е прв. Ако точка црта возрасти е 0., тогаш здраво е прв, и светот е Вториот по командата. Па низа argv, ние ќе треба да се види, содржи стрингови, точка црта возраст, здраво, и светот. И, по барање на Давид, ние ќе да игра видео воведување тоа. [Видео репродукција] -До сега во програмите ние сме напишани, ние се изјасни Главната како int главната неважечки. И сето ова време, таа празнина има едноставно се определи, програмата не презема командната линија аргументи. Со други зборови, кога корисникот води програма, тој или таа може да обезбеди команда линија аргументи со пишување дополнителни зборови или фрази, откако на програмата именува во конзолата. Па, ако не сакате вашата програма да се аргументите од командната линија, една или повеќе такви зборови, ние треба да го замени поништат со неколку аргументи. Па ајде направите тоа. Вклучуваат CS50.h. Вклучуваат стандардни io.h. Int главната. И сега, наместо на празнината, јас ќе одам да наведете int наречен argc, и низа на стрингови наречен argv. Сега, argc и argv се едноставно конвенции. Би можеле да се нарече овие аргументи повеќето нешто што сакаме. Но, она што е важно е дека argc е на int затоа што, по дефиниција, тоа е ќе содржи аргумент брои, број на зборови во вкупните дека корисник го има отчукува во неговата или нејзината линија. argv, пак, аргументот за векторот, е ќе всушност се низа складирање сите зборови дека корисникот има внесе во неговата или нејзината линија. Ајде да се продолжи да се направи нешто сега со една или повеќе од овие командната линија аргументи. Особено, да одиме напред и печати она што зборот на корисникот видови по името на програмата во конзолата. Отворена заграда. Блиску заграда. Printf проценти на обратна коса црта и запирка. И сега јас треба да кажам printf она што вредност да го приклучиш во кои случаеви. Сакам првиот збор што корисникот има внесе по името на програмата, и така јас ќе одам да се определи argv заградата 1, во близина заграда, точка-запирка. Сега, зошто заградата 1 и не заградата 0? Па, што се испоставува, автоматски се чуваат во argv 0 се случува да биде вистински име програмата. Така, првиот збор што корисникот видови по името на програмата е, конвенција, ќе биде се чуваат во argv 1. Ајде сега се компајлира и ја извршите оваа програма. Направи argv 0, точка црта argv 0. И сега зборот како здраво. Enter. И ние го имаме, здраво. [Крај видео репродукција] Роб BODEN: Во ред. Затвори тоа. Па Гледано во таа програма што ние само воведен за нас, добро, само да се покаже, ако ние печати argv 0, да, сега што е тоа, argv 0, точка црта argv 0. Значи, како што се очекуваше, тоа е печатење на името на програмата, бидејќи argv 0 е секогаш ќе биде името на програмата. Но, ајде да се направи нешто малку поинтересна. Па во проблемот сет, ќе биде воведен на оваа функција, atoi. Значи она што ние ги користиме atoi за? Што се случува да го конвертирате низа на цел број. Значи, ако јас го положат низа, еден два три, да atoi, дека ќе ја конвертираме таа на број, еден два три. Па ние ќе да се конвертира прв командата на цел број, а потоа само печати дека цел број. Значи, во основа, ние сме вид на reimplementing getint, само цел број е внесен во командната линија наместо во програмата интерактивно. Па тогаш, што argv 0, ајде да направиме тоа овде, и затворете тоа. Па трчање argv 0, и ајде да влезат во цел број, еден два три четири една две. Па тоа ќе печати број, еден два три четири една две. Постојат некои суптилностите да atoi дека тоа ќе престане да се грижат за ништо надвор валидна нумерички карактер, но тоа не е важно. Па што мислите што се случува ако го направам ова? Сегментација вина. Значи, зошто е тоа? Ако се погледне назад во нашата програма, ние сме конвертирање argv 1, првиот аргумент по името на програмата, да биде цел број. Но, не постои аргумент проследен по името на програмата. Па еве, ние се види дека ова е грешка програма, бидејќи, ако ние се обидуваме да го стартувате без никакви аргументи, тоа само ќе несреќата. Значи уште една заедничка шема ќе видите е нешто како, ако argc е помалку од две, што покажува дека немало најмалку името на програмата и Првиот аргумент, тогаш ние ќе се направи нешто како printf, не е доволно командната линија аргументи. Тоа е најверојатно не е добра да се печати, тоа е веројатно нешто, како треба да внесете цел број на командната линија. Јас само ќе го заврши тука. А потоа се врати 1. Па се сеќавам дека на крајот на нашата програма, ако се вратиме 0, тој вид на покажува успех. И главните исто така автоматски се враќа 0 ако не се направи. Па еве, ние сме retuning 1 за да се покаже дека тоа не е успех. И може да се врати она што го сакате, само, 0 означува успех, и ништо друго укажува неуспех. Па ајде да ја извршите оваа верзија на нештата. Па сега, ако ние не влезе во командната линија аргумент, тоа правилно ќе ти каже нас, не е доволно командната линија. Не заврши реченицата. Друго, ако ние всушност го положи еден, тоа може да заврши програмата. Значи ова е како ќе се користи argc во цел да се провери бројот на командната линија аргументи кои се всушност помина. Па ајде направи оваа програма е малку повеќе комплицирано, и се погледне на вториот повторување на нештата. Па сега, ние не само за печатење на Првиот командата. Тука, ние сме процесирањето од int i изнесува 0, i е помала argc, јас плус плус, и печатење argv, индексот i. Значи овој модел, повторно, ова е иста модел како и досега, освен наместо на повикување на променливата n, ние сме со користење argc. Значи ова е процесирањето над секоја индекс во низа, и печатење на секоја елемент во таа низа. И така, кога ќе ја извршите оваа програма, добро, Јас не влезат во кои било командната линија аргументи, па тоа само отпечатоци името на програмата. Ако јас внесете еден куп работи, тоа ќе печати една, секој на свој линија. OK. Па ајде да ја искористам оваа еден чекор понатаму. И наместо печатење секој аргумент на сопствената линија, ајде да се печати секоја карактер на секој аргумент по сопствена линија. Па се сеќавам дека argv е низа на стрингови. Значи она што е стринг, но низа на карактери? Па тоа значи дека argv е навистина низа од низа на карактери. Па земајќи предност на тоа, ајде да се игнорира овој за сега. Ајде да се разгледа на низа argv 0. Значи, ако сакаме да се донесе секој карактер на argv 0 по сопствена линија, тогаш сакам да го стори модел ние сме навикнати, i е помала од должината на низата, кои тука се strlen на, тоа е не она што сакате да го направите, стринг Кликнете ОК еднаква argv 0. Па јас е помал од должината на нашите низа, која во овој случај е низа на карактери, јас плус плус. И така, како што видовме минатата недела, тој е идеален ако се движиме дека strlen надвор на состојбата, бидејќи n ќе биде додавањето на strlen на коментарите дека секој пат кога одам низ јамката, а тоа е нема да се менува. Па ние ќе го еднаква на n овде во собата. OK. Па сега, ние сме процесирањето над секој индекс во низа. И така, ако сакаме да се печати секоја карактер во таа низа, проценти c е знамето сакаме да се користи за карактери. И сега заградата јас се случува да биде низа, индексот карактер i, па ако низа беа здраво. тогаш е 0 ќе биде h, s држач 1 ќе биде Е, и така натаму. Па сега ние сакаме да се комбинираат овие две работи. Ние сакаме да се печати секој карактер на секоја командна линија аргумент. Па ние ќе мора вгнезден за телефонска линија. И конвенционално, првиот контра е јас, следниот ќе биде ѕ, n ќе биде strlen на argv јас, јас е помал од n, јас плус плус. И сега наместо печатење argv јас, па argv заградата јас се случува да индекс - дека ќе биде на i-тиот командната линија аргумент, argv i, j ќе биде jth карактер на аргументот i-тата. Јас ќе се ослободи од овој тука сега бидејќи ние го стави во таа јамка. Така е еквивалентно на низа на еднаквите argv i, а потоа на заградата ѕ. Па, ние не треба да се изјасни оваа променлива е. Наместо тоа, ние само ќе се комбинираат овие две во она што го имавме, argv i, j. ЗВУЧНИК 1: [нечујни]. Роб BODEN: Добар повик. Значи ова е скршен. Ако јас всушност го имаше, ние би се реализира ова. Па контра Јас се грижат за во овој особено за јамка е ј, на iterator. Па ќе се кандидира во проблеми, веројатно бескрајна јамка, ако ние доколку не фиксна тоа. Тоа е причината зошто ние сме, исто така, зборува денес за дебагирање. OK. Па ајде да ја извршите оваа програма. И ајде да всушност додадете посебен printf токму тука дека само ќе печати друга линија, бидејќи тоа значи кога ќе стартувате програмата, ќе има празно линија помеѓу секој карактер на секој командата. Па, ќе видиме што значи тоа. OOP. Добив некои бубачки. Грешка имплицитно наведува библиотека функција strlen. Па ќе се вратам во нашата програма, јас заборавив да хаш вклучуваат string.h. Па string.h се случува да биде хедер датотека, кој се декларира функцијата strlen. Добро, го компајлира. Сега, ајде да го работи. Па токму тоа. Тоа се случува да се печати нашите име на програмата, Здраво светот. Тоа се случува да се печати секоја работа, секој карактер, на посебна линија. OK. Па ајде всушност ја искористам оваа еден чекор понатаму. И наместо користење string.h, ајде да размислуваат за тоа како ние би се имплементираат нашите сопствени strlen функција. Па јас веднаш ќе даде функција потпис. Па ајде јавете се во my_strlen, а тоа е случува да се земе низа како аргумент, и ние очекуваме да се врати должината на стрингот. Значи, каде е тој тип? Да. OK. Значи се сеќавам од претходниот слајд дека беше, исто така, од минатата недела, дека низа од карактери, добро, стринг, па да речеме ова е нашата низа s. Значи, ако на е стринг, здраво, а потоа, H-Е-Л-Л-О, во меморијата, кој се случува да биде, а потоа тоа обратна коса црта 0 лик. Па како можеме да станеме должината на ОК? Па, трикот е во потрага по овој реакции 0 лик, ова null терминатор. Па на алгоритмот се случува да биде нешто како неколку доволно карактери тоа - ајде да ја имаат оваа страна претставуваат некој шанкот, да ја наречеме оваа int должина. Значи, почнувајќи од овде, ние сме ќе iterate преку нашиот стринг. Така, првиот карактер, тоа е H, и тоа не е се врати намали на 0, така должината е 1. Iterate на следниот знак, Е, и тоа не е обратна коса црта 0. Должина е 2. L, 3. L, 4. О, 5. И, конечно, ќе ја достигнеме обратна коса црта 0, и така што средства, и, овој стринг е завршена. Па ајде врати 5. Така всушност спроведување дека, прво, мојата n должина е еднаква на 0, мојата десна рака. И ние ќе iterate - ЗВУЧНИК 1: [нечујни] Роб BODEN: О, пука. Добар повик. Бум. Па n должина е еднаква на 0. Па сега, должина, додека S не еднакви и тогаш, обратна коса црта 0. Значи се сеќавам, ова обратна коса црта 0, тоа е вистински карактер, и тоа покажува на крајот на низа. Исто како и, исто така, обратна коса црта n е вистински карактер. Обратна коса црта 0 се случува да се покаже на крајот од нашиот стринг. Не сакам да се стави дека постои. И додека на индексирани од должина не е еднаква на нула терминатор, а потоа ние сме само ќе за зголемување должина. Па тогаш, на крајот на нашата програма, должина на крајот ќе биде 5 во овој случај. А ние само ќе се вратат должина. OK. Па сега овде, јас не направи my_strlen. Ајде да се собере за да бидете сигурни сè тече непречено. Беше правам во 2? Или беше тоа 1? Што треба да се направи. Во ред е. Значи ова е argv 2. Работи како што се очекуваше, иако беше дека оној што тоа го правеше во? Да. OK. Оваа верзија на нештата не треба на printf нова линија по него, но тоа не прават разлика. OK. Така работеше како што се очекува. Сега ние дури и може да се комбинираат овој уште еден чекор понатаму, каде најава тука, добро, Прво, ние сме грабање на strlen на argv Јас, а потоа ние сме процесирањето над секој лик во таа низа. Па наместо тоа да го направам, што ако ние само се комбинираат оваа логика на чекање додека ние хит обратна коса црта 0 право во тоа за јамка? Па iterate додека argv i, j не не се еднакви обратна коса црта 0. Па ајде да се кандидира во прв план. Во ред е. Па еве, оваа состојба е велејќи - ајде да се расчисти тоа. Па сега, нека ова биде наш argv. Значи, кога јас само се стрча таа програма пред, argv е низа од стрингови. И така, ако јас го стартувате со точка црта argv 2, Здраво светот, тогаш argv сам по себе е должина 3, за argv нула, здраво, и светот. И во внатрешноста на секоја од овие индексите е, себе низа, каде што ова ќе биде точка, ова ќе биде коса црта, не знам ако тоа беше вистинската насока, јас не мислам дека тоа беше. А-Р-V цртичка, треба повеќе простор. Ајде да се намали во оваа низа. A-R-V израмнување 0, а потоа обратна коса црта 0. А потоа во неред ќе биде здраво. Да речеме, H-Е обратна коса црта 0. И, конечно, W-О обратна коса црта 0. Па на алгоритмот дека ние само напишав, на вгнездени јамки, што тие се прави е, ние прво треба на се спротивстави на i и j тогаш. Ова ќе биде полесно со кодот на екран, Да се ​​вратиме на ова. OK. Така забележите дека јас е на iterator тоа е процесирањето над секоја команда линија аргумент. И ѕ е iterator процесирањето над секој лик во таа командата. Па што оваа најскриената printf прави е, имаме printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, но сега, argv 0 7 ќе еднакви обратна коса црта 0. Па тогаш ние излезете дека за јамка, и сега јас iterates до 1. И сега ние ќе печати argv 1 0, argv 1 1 - Па, сега, бидејќи јас ги намалат здраво кратко, argv 1 2 повторно ќе биде обратна коса црта 0. И така, прираст I и продолжи, а така натаму, додека не се печати од сите светот, а тоа се три командната линија аргументи, а ние ќе излезете надвор од најоддалечените јамка, како и завршиме нашата програма. OK. Па ајде да се врати тука. Па ќе се здобијат со некои блискоста со командната линија аргументи на овој Посебен проблем во собата. Сега, дебагирање. Па најверојатно веќе мораше да го направи некои грешки со вашиот претходен проблем во собата. И еден многу лесен начин за дебагирање, прво, да се погледне во кабриолет програма. Па, шетање низ оваа програма, ние ќе побара од корисникот за број, се фати дека цел број, а потоа, произволно, имаме време јамка дека е само ќе Decrement Јас се додека не е еднаква на 10. Ајде само да се претпостави Јас сум влегуваат цел број поголем од 10. Па јас Намалување додека не е еднаква на 10. А потоа имаме уште додека јамка дека, додека јас не се еднакви на 0, ние сме ќе ми Decrement со 3. Па ако видите намерата на бубачки тука, тоа е дека ова ќе Намалување i за биде 10, а потоа тоа додека јамка волја декриминирачките i од 10, до 7, 4, 1, на негативните 2, на негативни 5, и така натаму, да негативна бесконечност, бидејќи јас ќе всушност никогаш не се изедначи 0. А потоа на крајот на оваа програма, имаме foo функција која е случува испечатите дека јас. Значи ова е краток и тривијални програма, и бубачка е очигледно, особено откако јас само рече она бубачка беше. Но намерата тука е, добро, ова може да всушност изгледа како некои од вашите решенија од алчен од последниот Проблемот наместена, а можеби немаат некои бесконечна јамка во вашата програма, и немате идеја што е тоа што предизвикува. Така многу корисен за дебагирање техника е само да додадете printfs сите над вашиот код. Па еве јас сакам printf надвор првиот додека јамка. И тука сакам printf, и јас само ќе ми се печати. Јас дури и ќе се направи првата додека јамка, јас. Надвор, секунда, додека јамка. Уште еднаш, печати внатре од тука, вредноста i. И ајде да ја извршите оваа. Па дот коса црта дебагирање. Внесете цел број. Ајде да направиме 13. И бум. Можеме да видиме дека ние сме бесконечно looping внатрешноста на вториот додека јамка. Па сега ние знаеме што бубачка е. Но printf дебагирање е совршено одлично, но штом вашите програми се повеќе и повеќе комплицирано, постојат повеќе софистицирани решенија за Прв работите работа. Значи, да се отстранат сите овие printfs. И ајде да бидете сигурни дека јас не се скрши нешто. OK. Па на програмата ние ќе да се воведе се нарекува GDB, за ГНУ дебагерот. Па, всушност, да се отстрани за дебагирање за второ, и да debug повторно. Па, всушност, прво, добра лекција во командната линија аргументи. Забележете дека ова ѕвекот команда која е составувањето сè е тоа што поминал во командната линија, овие командната линија аргументи. Па токму онака како што се случува да биде со користење на командната линија аргументи, како што направи пред, и како што ќе во PSET 2, тоа е како ѕвекот ги користи. Па се забележи дека оваа прва знаме, цртичка ggdb3, што тоа зборува е, ѕвекот, треба да се состави оваа датотека со Намерата дека ние на крајот ќе треба да го debug. Толку колку што имате тоа знаме, тогаш можеме да GDB дебагирање. И тоа ќе се отвори на ГНУ дебагерот. Па така постојат многу команди што треба да се навикнеш на. Првиот што ќе веројатно веднаш треба е Run. Значи она што е Стартувај случува да се направи? Тоа се случува да се започне нашата програма. Значи се кандидира, почнувајќи програмата, програмата бара од нас за цел број, 13. И тогаш тоа е бесконечна looping како се очекува, освен јас отстрани printfs, па ние дури и не се види тоа. Излезе нормално. Ох. Можно е дека тоа завиткани сите обратно, да се вратиме - игнорирајќи тоа. Се претпостави дека не ја напуштил нормално. Има комплициран одговор на тоа. Па сега, тоа не е многу корисно. Па само трчање нашата програма внатрешноста на овој дебагерот не ни помогне во било која начин, бидејќи ние би можеле да имаат само направено точка го намали дебагирање надвор gdb. Па една команда која Ќе веројатно - и јас ќе престанам ова. Контрола-D или да престанам, и работа. Па ајде да се отвори повторно. Друга команда која најверојатно ќе веднаш сакате да се користи за да се скрши. Па ние ќе се скрши на главниот сега за сега, а потоа јас ќе објаснам тоа. Добро, тука гледаме дека постави точка на прекин во оваа линија во debug.c. Па што пауза значи дека кога ќе внесете ден, на програмата ќе продолжи да работи додека не Јас хит точка на прекин. Значи, кога ќе се погоди се кандидира, програмата започнува, а потоа го скрши штом тоа влегува во главната функција. Се скрши главна ќе биде нешто прилично често се направи. И сега, да те запознаам некои повеќе команди. Се забележи, дека тоа е велејќи дека ние скрши на линијата 11, која е printf, внесете цел број. Па команда Следна ќе биде како ние одиме на следната линија код. Ова се случува да ни овозможи да се повлече преку нашата програма линија по линија. Значи следниот. Сега линија 12, ние ќе за да се добие број. Следната. И ако едноставно притиснете Ентер, тоа ќе Повтори последното нешто што го направи. Па јас не треба да напишеш Следниот секој пат. Па внесете број, 13. Па сега, линија 14, а јас е поголема од 10, а јас ќе направам следно. И гледаме дека се случува да се з намалување. Па ние ќе да се з Намалување повторно. Па сега, уште една корисна команда е Print. Па Печати ќе испечатите вредноста на променлива. Ајде да го изнесам вредност на променливата i. Ајде да се печати i. Тоа се случува да се каже дека е 11. Сега ние Следна повторно додека i е поголема од 10. Па јас сеуште поголема од 10, бидејќи тоа е 11. Јас минус минус. Ајде јас печати повторно. Како што се очекуваше, тоа е 10. Па сега, следната. Тоа е се вратам на состојба, i е поголема од 10, но јас сега е 10, па тоа не е поголема од 10, така што очекуваме тоа да падне од додека јамка. А сега ние сме под таа линија на кодот. И друга команда, листа, е само ќе за да се прикаже Претходната и следната неколку линии на код, во случај да се изгуби. Па ние само излезе ова додека јамка, и сега ние се влезени во оваа додека јамка, линија 18. Така, додека јас не се еднакви 0. И, веднаш, јас сум минус 3 еднакво, а ние ќе забележите, ова само ќе продолжи да оди. И ние може да се з печати. Секоја команда вид на има кратенки. Така што p е краток за печатење. Значи можеме да p i. Само држете n, или да прави Next. Печати јас повторно. Гледаш сега е негативен 167. Па ова ќе трае вечно, но не навистина засекогаш, затоа што само виде, тоа всушност, ќе заврши во некоја точка. Така што почнува gdb. Но ајде да направиме уште една работа во gdb. Ух, дебагирање. Значи, во овој конкретен случај, бесконечна јамка се случи да биде во внатрешноста на главната функција. И сега за сега, само прифати дека јас сум случува да се движат на бесконечна јамка во на foo функција. Само сети се дека, на крајот од овој програма, добро, ова беше првично повикувајќи foo, која беше само ќе ми се печати. Но сега ние сме повикувајќи foo, што е ќе Намалување i додека не е 0, и а потоа печати таа променлива. OK. Спаси. Направи дебагирање. И сега, gdb дебагирање. OK. Значи, ако јас само се кандидира, тогаш јас не одам да да биде во можност да всушност чекор низ моите Програмата линија по линија. Па ајде да се скрши во главните, и потоа внеси ја стартувате. Така одат преку овој, printf, внесете цел број, да добијат цел број, 13. Па ние ќе да се задржи, намалување до i е поголема од 10. Тогаш ние ќе треба да падне преку додека јамка, и да се на линија - ајде да се отвори во посебен прозорец. Па ние decremented додека јас веќе не бев поголема од 10, а потоа ние нарекува функцијата, foo. Значи она што се случи веднаш штом ќе се погоди функција foo, добро, се јавив foo, и тогаш јас веќе не имал контрола над gdb. Па штом ќе се погоди Следна на оваа линија, работи продолжи до тоа се случи, каде што на програмата постоеле кога - се претпостави дека не постои крајот. Видовте што пауза за малку иако. Па зошто да не го изгуби контрола над програмата во тој момент? Па, кога ќе напишеш следниот, што оди до буквалното следната линија на кодот кој ќе се изврши. Па по линија 21, на следната линија код што ќе го изврши е линија 22, што е, излегувањето од главната. Па јас не сакам да се оди само на следната линија код. Сакам да одам во функција, foo, а потоа, исто така, чекор по чекор оние линии на код. Па за тоа, имаме алтернатива. Ајде да престанам дека повторно. Се скрши главната. Ух, 1, следната, следниот, 13, следната, следната, следниот, внимателно, пред да удри линија foo. OK. Па сега, ние сме на линија 21, каде што ние го нарекуваме foo. Ние не сакаме следната да напишеш, затоа што само ќе се јавите на функција foo, и оди на следното линија код. Она што сакаме да го користите е чекор. Па постои разлика помеѓу Чекор и Следно, каде Чекор чекори во функционираат, и Следна оди во текот на функција. Тоа само ги извршува интегритет на функцијата и го задржува оди. Па чекор ќе ни донесе во функција, foo. И гледаме тука, сега, ние сме назад во ова додека јамка тоа е, во теорија, ќе продолжи засекогаш. И ако го погоди чекор, кога тоа не е дури и функција да се јавите, тогаш тоа е идентична со Next. Па тоа е само кога сте на линија која е повик функција која Чекор се случува да се разликуваат од Next. Па чекор ќе ни донесе тука. Чекор, чекор, чекор, чекор, чекор, чекор, и ние само ќе бесконечна јамка засекогаш. Па можеби ќе се навикнеш на тоа како вашиот начин на идентификување на бесконечна петелки, е само држи овој Enter копчето за да види каде ќе заглавиш. Постојат подобри начини да го направите тоа, но За сега тоа е совршено доволно. И стилски, за да одговара на стилот 50, јас треба да се направи ова. OK. Така што едно последната команда да се воведе. Добро, ајде да gdb дебагирање внатре Така, наместо на кршење на главната, ако јас знае foo функција е, исто така, проблем, тогаш јас би можеле да имаат само рече, се скрши на foo, наместо. Да речеме јас се скрши на двете главни и foo. Така можете да го поставите како многу поминувања како сакате. Кога ќе внесете ден, тоа се случува да застане на - ooh, ајде да прекомпајлирате, бидејќи Ја променив работи. Ќе видите оваа линија, Предупредување, извор датотека е понова од онаа извршна. Па тоа значи дека јас само отиде во тука и го смени овие да се во согласност со Стил 50, но јас не прекомпајлирате програмата. Па GDB ме прави свесни за тоа. Јас ќе престанам, да debug повторно, хит gdb дебагирање. OK. Па сега, да се вратиме на она што го правев. Се скрши главната, пауза foo. Сега, ако јас ја стартувате програмата, така што е ќе продолжи се додека хитови точка на прекин. Дека прекин се случува да да биде првиот во главните. Сега, наместо за правење на следната, следниот, следната, следната, следниот, се додека не го погоди foo, јас да напишете продолжи, која ќе продолжи додека не го погоди следната точка на прекин. Морам да влезат во цел број во прв план. Продолжи ќе продолжи се додека не го погоди следната точка на прекин, а тоа е дека функција на foo. Па Стартувај ќе трае до го погоди точка на прекин, но ти само внесете ден кога ти си почеток на програмата, а потоа, од тогаш па натаму, тоа е продолжи. Ако јас само се скрши главни и потоа истрча, тоа ќе се скрши на Главната, а потоа продолжи. Бидејќи јас не имаат брејк на foo, влезе во цел број, тогаш сега сум нема да се скрши на foo. Тоа е само ќе да бесконечна јамка се додека тоа. OK. Па тоа е Вовед во gdb. Треба да почнете да го користите во твојот проблем комплети. Тоа може да биде многу корисна да се идентификуваат грешки. Ако, всушност, само, линија по линија, одете преку вашиот код, и споредба на она што е всушност, се случува со она што се очекува да се случи, тогаш тоа е прилично тешко да го изгубиле Вашиот бубачки. OK. Па минатата недела Дејвид израснати овој тајна-клуч криптографија работи за прв пат, каде што ние не сакаме лозинки само да се чуваат на нашите компјутер во некои обичен текст фајл, каде некој може да дојдат и само отворете го и прочитајте нив. Идеално, тие ќе бидат криптирани на некој начин. И во проблем во собата 2, ќе се занимаваат со еден метод на енкрипција, или, добро, два методи, но тие не се толку големи. Ако го направите на хакерите издание, ти си исто така ќе треба да се занимаваат со дешифрира некои работи. Значи прашањето сега е, добро, дури и ако имаме најсилните енкрипциски алгоритам во светот, ако изберете особено сиромашните лозинка, тогаш тоа нема да ви помогнат многу, бидејќи луѓето се уште ќе биде во можност да го дознаам. Дури и ако гледањето на шифрирана стринг и личи на хаос на ѓубре што не значи ништо за нив, ако тие уште само треба да се обиде на неколку лозинки да го дознаам, а потоа ќе не се многу безбеден. Па гледајќи видео дека прави таа точка. [Видео репродукција] -Каска, можете демон. Што се случува? Што ви се прави за да се ќерка ми? -Дозволете ми да се воведе брилијантен млади пластичен хирург, д-р Филип Schlotkin, најголемиот нос работа човек во целиот вселената, и Беверли Хилс. -Ваше Височество. -Нос работа? Јас не ги разбирам. Таа веќе имаше нос работа. Тоа беше слатка шеснаесет присутни. -Не. Тоа не е она што мислите. Тоа е многу, многу полошо. Ако не ми даде комбинација на воздухот штит, д-р Schlotkin ќе даде својата ќерка назад нејзината стара носот. -Не. Од каде ти е тоа? -Во ред. Јас ќе кажам. Јас ќе кажам. Не, тато. Не, вие не мора. -Ти си во право, драга моја. Јас ќе го изгубиле Вашиот нов нос. Но јас нема да му кажам на комбинација, без разлика што. -Многу добро. Д-р Schlotkin, дали вашето најлошото. -Ми беше задоволство. [Алатки СЕ наострен] -Не. Чекаат. Чекаат. Јас ќе кажам. Јас ќе кажам. -Знаев дека тоа ќе работат. Во ред е. Дај ми го. -Комбинацијата е еден. -Една. -Една. -Два. -Два. -Два. -Три. -Три. -Три. -Четири. -Четири. -Четири. -Пет. -Пет. -Пет. -Значи комбинацијата е еден, два, три, четири, пет. Тоа е stupidest комбинација Што некогаш сум го слушнал во мојот живот. Тоа е вид на нешто идиот ќе има врз неговиот багаж. -Благодарам, Ваше Височество. -Што направи? -Го исклучив ѕидот. -Не ти не. Ќе се исклучи на целиот филм. -Јас мора да се притисне погрешна копче. -Па, го стави назад. Стави филмот назад. -Да, г-дине. Да, господине. -Да одиме, Арнолд. Дојди, Гречен. Се разбира, ти знаеш дека јас ќе уште треба да ви сметка за ова. [Крај видео репродукција] Роб BODEN: Во ред. Па сега дека ние сме веќе зборуваме за безбедноста на некој начин, убаво малку филм постер, така што во последниве дена, овие прашања со зимскиот следење сè. Тоа може да биде тешко да се чувствуваат како тебе имаат некој вид на приватноста во онлајн светот, иако не можел да кажам можете поголемиот дел од деталите на призма. Па движат надвор призма, ние нема да се зборува за тоа, сега се размислува за вашиот лаптоп. Значи тука, сакам да се префрлат на мојот вистински профил, со моето мало пингвинче. Па имам лозинка сет, и дека лозинка е она што го сакате да биде. Но запомнете дека она што јас сум влезете во со, така што ова најава брза, некои програма. Тоа е некој програма со која беше напишано од страна на некои лице. И така, тоа лице, ако тие се особено штетен, тие би можеле да реков, во ред, па ако лозинката дека влегувањето ми е еднаква на мојата вистински лозинка, или тоа е еднаква за некои посебни лозинка - Давид е одличен или нешто - потоа да ги споделите внатре Така малициозен програмер би можеле да имаат пристап до сите на вашите Macs, или Прозорци, или ништо. Така што не е многу на загриженост, бидејќи, Мислам, ова е најава на програмата тоа е транспортирана со OS X, стотици или илјадници луѓе имаат разгледа овој код. И така, ако, во вашиот код некаде, каже дали овој стринг е еднаква на еднаквите Дејвид е страшно, најава, тогаш некој е ќе биде, како, чекај. Ова не е во право. Ова не треба да биде тука. Значи тоа е еден начин ние се работи да биде вид на безбеден. Но, мислам за дури и програми што ќе пишувам. Да речеме сте го напишале за логирање програма. Значи ова најава програма со која го напиша, па очигледно, сте добар програмер. Вие нема да се стави било малициозни ако x е еднаква еднаква на Давид е одличен во вашиот код. Но оваа програма, она што го го користите да ги собере на оваа програма? Нешто како ѕвекот. Па што ако лицето кое се случило со пишува ѕвекот посебен латински во ѕвекот нешто како, ако сум составувањето на Влезот програма, а потоа внесете го овој код во најава програма со која вели дека, ако x е еднаква еднаква на Давид е страшно? Па не сосема уште, но ние имаме иста Прашањето овде, каде ѕвекот, добро, илјадници, ако не и десетици илјади луѓе, го погледна ѕвекот, имаат погледна својот линии на код и рече: Во ред е, нема ништо лошо тука. Очигледно, никој не прави ништо овој малициозен. Но она што е самата ѕвекот, како, што ако јас ги собере ѕвекот? Што ако имам некои компајлерот дека собира ѕвекот дека внесува во ѕвекот оваа специјална hack кој се вели дека, во ред, кога ќе ги собере ѕвекот, а потоа извршна јас се специјално треба да изгледа внатрешноста на логирање програма и вметнете оваа лозинка, е еднаква на еднаквите Дејв е страшно? Па се сеќавам дека вашиот компајлер себе треба да се состави во некоја точка. Значи, ако што ќе изберат да ги собере ѕвекот со, сам по себе е злопамтило, тогаш ќе може да се зезнав на целиот начин одредување на линија. Па еве, ние имаме Кен Томпсон и Денис Ричи. Значи ова е иконски сликата. Денис Ричи е на вистинскиот. Тој е голем - доста напиша C. Значи можете да благодарам него за оваа класа. Кен Томсон е на левата страна. Две од нив во основа напиша на UNIX. Па, тие беа главните соработници во UNIX. Имаше некои други. Па Кен Томпсон, во одреден момент, тој победи на Тјуринговата награда. И наградата Туринг, јас сум секогаш слушнале тоа референцирани овој начин, тоа е Нобеловата награда на компјутерските науки. Па на Тјуринговата награда, тој мора да даде својот говор. И тој го дава овој многу познат говор сега, наречен Рефлексии на верувајќи Доверба, која ние сме поврзани да на вебсајт разбира. И во овој говор, вели тој, во ред, па напишав на UNIX, а сега сите на Вие луѓе сте користење на UNIX. Сега, сетете денес дека Линукс е директен потомок на UNIX. OS X директно користи на UNIX. Windows не толку многу, но многу на идеи беа земени од UNIX. Па тој оди до сцената и вели: Во ред е, сум го напишала на UNIX. И само така вие момци знам, јас сум можете да се најавите во секој еден од вашите компјутери. Откако го поставив една од овие специјални ако x еднакво еднаква на Кен Томсон е страшно, тогаш јас сум дозволено да се најавите. Па луѓето се како, добро, Како го направи тоа? Ги свртевме погледите кон логирање програма и ништо не е таму. Тој е како, добро, јас изменета на компајлерот да се логирате во најава програма така што за логирање програма сега ќе имаат дека x е еднаква еднаква на Кен Томпсон е неверојатна. И тие велат, добро, тоа не е точно. Ние сме во потрага на компајлерот, и компајлерот не имате било какви линии на кодот слично. Тој е како, во ред, но она што сте составувањето на компајлер со? И тие мислат, и тој е, како, добро, Јас сум оној кој ти дал компајлерот сте со користење да ги собере на компајлерот, па сте составувањето на компајлер, дека сам по себе е злопамтило, и ќе се скрши на страната за логирање програма. Значи, во основа, во тој момент, постои постои начин може да се погледне на изворот кодот на најавниот програма за да го видиш она што не е во ред. Ти дури и не може да се погледне во Изворниот код на компајлерот за да го видиш она што не е во ред. Ќе треба да се погледне на машина код, вистинските бинарната датотека на Составувач компајлерот за да ја видите, чекај, овие линии на код не треба да биде тука. Но Кен Томпсон го зеде еден чекор понатаму и вели, добро, постојат овие посебни програми кои, всушност, да ви помогне да го прочитате бинарни програми, и така, ако некој се користи таа програма за чита бинарни, тие ќе ги видите овие линии на код. Тој пат е изменета овие програми е да се каже, сите право, ако сте во потрага по компајлерот, не покажуваат ова особено сет од бинарни. Па тогаш ќе треба да се земе дека еден чекор понатаму и, во основа, што би можеле да имаат преземат повеќе нивоа на околни, и во одреден момент, никој не е всушност ќе треба да се проверува. Па Поуката од оваа приказна е, ти си нема да се пишува Ѕвекот во оваа класа. Сте ќе биде со користење на качување Ѕвекот многу во оваа класа. За сите што знаете, ѕвекот е злопамтило програма која е саботирање на секој единствена програма некогаш сте состави. И да те оставам на тој застрашувачки се напомене дека, ќе се видиме во среда. [Аплауз] ЗВУЧНИК 2: На следната CS50. ЗВУЧНИК 3: Не се осмелуваат да се каже. Можете да го направите тоа. Сте го направиле тоа порано, можете да го направите ова денес, можете да го направите ова утре. Што сте го правеле со години. Само оди до таму и го правиме ова. Можете да го направите тоа. [Музички]