Дејвид MALAN: Во ред. Значи ова е CS50, а тоа е сега на почетокот на три недела. Па до сега, ние сме Пишувам програми во C кои изгледаат малку нешто како ова овде. Значи имаме неколку остри вклучува на врвот. Имаме int, главно, празнина, и тогаш нешто да се направи во средината, некои малку код во внатрешноста на таа функција. Но клучот е фактот дека ние сме велејќи празнина тука. Па празнина, сето ова време, наведува дека оваа програма, кога се работи, само може да се стартува преку своето име. Вие не може да внесете било која друга зборови или броеви по името на програмата, кога тоа трчање. Така, на пример, ако програмата беа компајлирана во датотека наречена здраво, можете да направите ./hello, но тоа е тоа. Единствениот начин на кој што можете да обезбеди влез на оваа програма е со повикување на функција. На пример, што функција сме користеле досега да се добие влез од корисникот? ПУБЛИКАТА: Земете стринг. Дејвид MALAN: За да добиете низа, или се int, или сте виделе други, дури и ако не сте ги користи, сепак, како да се долго, долго и слично. Но, претпоставувам дека ние всушност сакаат да започнат пишување на програми кои се малку повеќе разновиден, и, искрено, малку повеќе како команди кои сте добивање, се надевам, малку навикнати да. Како ЦД простор Dropbox. Ова, се разбира, промени Користење на вашиот именик, претпоставувајќи ќе бидете во домот на Џон Харвард директориумот, на вашиот Dropbox папка. Во меѓувреме, на команда вака создава нов директориум наречен pset2, како што може да има веќе, или наскоро за проблем ќе постави два. Направи Здраво, се разбира, е командната кој гради програма наречена здраво од фајл наречен здраво точка в. И во секоја од овие случаи, сега, ние сме имале обезбеди аргументот на т.н. командната линија, што трепкаше брза, така што марка не знае што да се изгради, и така дека mkdir знае што папка да се создаде, и така што cd знае каде сакате да одите. Но, до сега, ние ги велејќи дека главната, вашиот стандарден функција, има празнина израз во внатрешноста на овие загради, што значи дека не може да се земе било аргументи. Значи почнувајќи од денес, она што се случува да се направи е, ние ќе треба да почнат поддршка вакви работи дури. Всушност, во овој случај, кој ќе не обично рачно внесете, Направи е тоа за нас, не постојат еден, но еден, два, три дополнителни жици по програмата наречена ѕвекот. Така како ние да се постигне тоа? Па, почнувајќи од денес, во случаите каде што сакаме да обезбеди влез преку т.н. командната линија, ние си оди за да започне додавајќи тука она што е во yellow-- замена на празнина со int argc запирка низа argv отворена заграда блиску заграда. Сега ова е интересно за неколку причини. Еден, тоа се случува да ги споделите со нас пишуваат програми кои се малку повеќе динамика. Но, уште убедливо, тоа се случува да се отвори сега разговор за она што навистина може да низи да се користат, за она што низа навистина е под капакот на моторот, до следната недела кога ќе почнеме нуркање во уште подлабоко за тоа како машината е правење на сите на овој материјал работа. Но, за сега, ајде да се подготви, можеби, некоја слика. Кога ќе се напише програма со главните прогласи на овој начин, како што главна зема два аргументи, на int and-- она ​​што тип на податок е вториот аргумент? ПУБЛИКАТА: Низа. Дејвид MALAN: Низа. Така што изгледа на прв поглед како што е стринг, но забележите квадратни загради. Потсетиме последен пат воведовме поимот за низа. И низи користат квадратни загради во неколку контексти. Можете да го користите на плоштадот загради да одат во низа и да добијат одреден елемент, како држач 0 или држач 1 или држач 2. Но видовме, ако на кратко, минатата недела дека исто така ги користат овие квадратни загради да прогласи големината на низа, ако се знае однапред колку ints или колку жици или што и да всушност сакаат. Значи излегува има трето контекст тука дека нема број во на квадратни загради. Кога ќе се определи, како што имам овде, име на нешто како argv, што е само стилизиран начин велејќи дека аргументот за векторот, кој е уште еден фенси начин на велејќи низа на аргументи, отворена заграда блиску заграда само значи дека не мора знае однапред колку е голема низата ќе биде, но знаеш дека се случува да биде низа. Па ако не го знаете број не го стави таму, за отворена заграда блиску заграда значи дека argv не е стринг, но низа на жици. Па синтаксички, ако сетам на минатата недела, тоа е многу сличен на ставот нешто како int возраст отворен заградата, и тогаш нешто потоа. Така што тоа изгледа? Ајде всушност нацрта слика. Па кога ќе ја извршите оваа програма со главните откако два аргументи што е дефинирано во на оние загради, можете во суштина имаат најмалку две парчиња меморија предаден на вас под хауба. Еден, како што ќе привлекува како овој правоаголник, се случува да се нарече argc. И само како брзо повториме, она што е податоци за видот на argc? Па тоа е int. Па голем број се случува да одат во argc-- врти дека се залага за аргумент брои. Во меѓувреме, јас сум подготвен argv како низа. И јас навистина не знам колку долго тоа ќе биде, така и за цели денешната точка точка точка. Тоа би можело да се на некои должина. Но јас сум на сликата тука најмалку четири правоаголници. Па argv парче меморија која продавници низа стринг string точка точка точка, и argc е само една парче меморија за цел број. Па сега, ајде да бидеме малку попрецизни. Ако, кога имам жици во оваа низа, наречен argv, сакам да се добие во нив поединечно, исто како и минатата недела, ние сме случува да се користи нотација како argv заградата 0 да се добие првото нешто низа. Argv заградата 1 за да го добиете Втората работа, и така натаму. Клучот тука е ние сме се уште 0 indexed-- ние сме сè уште сметајќи од 0. Па сега е нека всушност стави нешто во ова. Ако јас да се состави програма наречена hello од фајл наречен здраво точка в, и тогаш да работи таа програма со точка намали Здраво, она што го прави мојот компјутер, мојот лаптоп, изгледа под хаубата во моментот кога ја стартувате точка намали Здраво и притиснете Ентер? Па, ова е можеби она што може да се опише како содржина на вашиот компјутер меморија, или RAM-- Случаен Пристап меморија. Со други зборови, на компјутерот, некако за вас магично, става на бројот 1 во argc, АКА argcount, и го става буквално низа ./hello во argv заградата 0. Јас немам идеја, искрено, што е во argv држач 1 или 2 или 3, бидејќи ако корисникот не има внесе ништо освен ./hello, ние ќе се претпостави дека овие најверојатно ѓубре вредности, така да се каже. Оние делови од меморијата постои, но тоа не е до нас да се погледне во нив, затоа што на argcount е само еден. Сега, пак, ако го пишуваат работи друга програма, CD, што е повеќе правилно команда, во вашиот трепне prompt-- CD простор Dropbox-- кога ќе ја стартувате тоа, ефикасно, Кога на CD програма се работи, argc, во внатрешноста на меморија мојот компјутер, е за најмногу најкраток вториот број 2. А потоа argv заградата o има CD, argv заградата 1 има Dropbox, а потоа се разбира командата заврши, така што сите на оваа меморија во суштина оди и се користи за нешто друго. И тоа е причината зошто велам само дел од секундата. Во меѓувреме, ако правиме mkdir pset2, сликата изгледа речиси ист, но со различни жици внатре argv. Ако го направам ѕвекот цртичка здраво Здраво точка в, истата идеја. Повеќе работи се пополнува за argv и argc, се разбира, е 4. Значи со други зборови, иако оваа низа може да биде точка точка точка, на некои променлива должина, така да се каже, секогаш знае каде на крајот од него е, бидејќи argc се случува да ви кажам во кој момент ќе мора да престанат во потрага на елементи во argv. Можете само да се погледне во четири вкупно во овој случај. Па ајде сега да ги разгледаме во, можеби, едноставна програма. Оној кој само вели здраво да некој како Zamyla. Така тврдам јас ќе одам да се напише програма во само еден миг преку која јас не можеше да стори ./hello простор Zamyla, а потоа сакам мојата програма да се печати нешто супер-едноставно како "здраво, Zamyla." Во минатото сме се користи getstring. Па во минатото, дури и ако сте нови на програмирање, шансите се можете да разбивам програма која користи getstring а потоа користи printf да се каже Здраво на Zamyla. Но ајде да не ги користат getstring тоа време. Нека наместо мене да одат во Appliant и не вклучуваат стандардни Јас О точка ч. Дозволете ми, исто така, вклучуваат CS50 точка ч. Сега int главната, и сега сум нема да направи празнина денес. Наместо тоа, јас ќе одам да направите int argc низа argv отворена заграда блиску заграда, не наведувајќи број. И сега тука е мојата т.н. да се направи. Она што јас ќе одам да направите сега е, јас сум случува да се направи малку на скок на верата, Одам да се претпостави дека на корисникот случува да се користи оваа програма правилно, и јас сум едноставно ќе се прават printf Здраво,% sn. Па ништо ново таму. Но јас сакам да сега стави она што зборот на корисникот видови по името на програмата. Значи, ако јас не ./hello простор Zamyla, јас сакате да некако програмски пристап цитирам unquote "Zamyla." па јас можат да одат во мојот аргумент вектор, мојата низа на стрингови, и ако командата, повторно, беше ./hello простор Zamyla, што бројот сакам да се стави во argv тука? ПУБЛИКАТА: 1. Дејвид MALAN: 1, бидејќи заградата 0 испоставува се случува да биде име на програмата, како што видовме. Па заградата 1 е првиот збор дека, на корисникот, ги внеле. Одам да се оди напред и да заштедите ова. Одам да одиме во мојата папка каде што сум сместен оваа датотека. Одам да прават здраво 3. Добро комп IO е. ./hello Zamyla Enter. Што направив погрешно? Бев изненаден себеси за само еден миг таму. Што направив погрешно? ПУБЛИКАТА: Име. Дејвид MALAN: на датотеката всушност, наречен hello3.c. И Јас го направив тоа само за конзистентност, затоа што ние сме имаше hello.c во минатото во онлајн код. Значи, да го надминете овој ./hello заградата цртичка 3 Zamyla. Enter. И сега имаме здраво, Zamyla. Во меѓувреме, јас да го промените ова биде Роб, или навистина било кој друг збор. Но, ајде да се разгледа во корнер случај. Она што може да очекувате да се случи ако Не внесете го името на сите граѓани на сите? ПУБЛИКАТА: Грешка. Дејвид MALAN: грешка на некој вид, можеби. Ајде да видиме. Enter. Нула. Значи printf е, всушност, се малку заштитни нас тука, и буквално печатење отворен paren нула, но дури и полоши работи може да се случи. И само за да се покаже нешто што апсолутно не треба да прават, да одиме во тука и да почне ѕиркаа наоколу. Нели? Ако знам дека сликата во меморија е во суштина ова, argv заградата 1 има Zamyla, argv држач 0 има ./hello, или ./hello-3. Она што е во заградата 2? За да можам да одговорам на тоа прашање од мене, нели? Јас само може да го промени 1 до 2. Сега можам да прекомпајлирате здраво 3, ./hello3 Ајде да зумирате и притиснете Ентер. Whoops. Не цитат. Интересно. Па тоа е вид на кул види што друго е тука. Па што друго е во внатрешноста на мојот лаптоп? Ајде да го одбрани со заграда 3. Направи hello3, ./hello-3. Љубопитни. И сега ајде да се навистина bold-- 50. Значи тоа е навистина нуркање длабоко во меморијата на компјутерот ми е. 50 индекси во. Така бидете здраво 3 ./hello-3. Љубопитни. Добро, сега јас сум само ќе добиете невнимателни. Ајде да одиме во 5000. Во ред. Па да ми прекомпајлирате. Направи hello3, ./hello-3. Во ред. Сега некои од вас, може да биде сијалица случува надвор. Колкумина од вас имаат види оваа порака и пред тоа? Во ред. Значи, зошто? Коефициенти are-- и има различни нешта што може да предизвика ова, и јасно вие сте во добра company-- имаме јасно предизвика она што се нарекува на сегментација на вина. И скратам приказната за денес, јас се допреле еден сегмент на меморија дека не треба да има. Каде што еден сегмент само значи парче меморија дека не треба да има. Сега на компјутерот гарантира дека ако јас работи ./helloZamyla дека јас може да го допре argv биде заградата 0 и argv заградата 1. Но argc е вредност 2, тоа значи дека јас сум само allowed-- тоа е вид на честа system-- на допир заградата 0 и заградата 1. Ако одам било подалечно, има апсолутно ќе биде меморија таму. Мојот RAM меморија постои физички во компјутерот. Но кој знае што е таму? Всушност, јас се кандидирам повеќе програми на едно време. Јас би можеле да имаат seen-- ако не беа го прават тоа на Appliant но на мојот Mac или PC-- Јас би можеле да имаат види содржината на е-маил. Сум видел инстант порака Јас неодамна испратени. Нешто што може да биде бавни околу меморија можеше да се пристапи од страна на начин на оваа произволна квадратни заградата нотација. Или, уште полошо, може да имаат најде еден од моите лозинки дека јас неодамна би внеле во, дека Програмата се чуваат во меморијата, така што ми се идентификувате и тогаш само вид на го остави во RAM меморија, додека не се откажат од таа програма. И навистина, ова е еден од опасноста и еден овластувањата на користење на јазикот како В. Ќе имаат непречен пристап на целата содржина меморија на програмата, и што лошите момци може дури и за тие cases-- особено кога ние стигнете до веб програмирање кон крајот на семестарот, ние ќе враќате оваа topic-- е ѕиркаат наоколу, потенцијално, некој е компјутер меморија и да се најде таков љубопитни работи како што видовме таму. Или уште полошо но сепак, лозинки дека или таа, тогаш може да се користат да се направи лоши работи. Па јасно дека не треба да се направи ова, бидејќи чудни работи почнуваат да се случуваат. Всушност, ова е програма паѓа. Ова ќе биде еквивалент на Mac OS или Windows програма прозорец само исчезнуваат. Неочекуван грешка. Во командната линија на животната средина гледаме нешто како ова. Но, тоа е зошто е јас сум едноставно допирање меморија која не припаѓа на мене. Значи, да се одбранат од ова малку поинаков начин од страна гледајќи во оваа програма тука. Значи, повторно, скелетот што сме го виделе earlier-- и сум истакна овој пат int. И сето ова време има главна навистина се врати вредност. Иако во поголемиот дел од нашите предавања примери ние никогаш не сум некогаш врати ништо во главниот. Ние само напиши printf блиску кадрава голема заграда и тоа е тоа. Но за слободни, што компајлерот се прави за вас, ефикасно, се враќа 0 за вас. Врти out-- и тоа е малку counterintuitive-- дека 0 е добро. Тоа не значи лажни сама по себе. 0 е добар, и сите не-0 вредност, на светот одлучи, може да значи грешка. Значи, ако некогаш сте Слободен простор нешто на вашиот компјутер, или програма штотуку починал на вас и сте добиле некои погрешни прозорец на вашиот екран, велејќи грешка негативни 49 или грешка 23-- некои навидум произволни value-- тоа е затоа што програмер има хард-кодирани вредност како негативни или позитивни 49 23 да претставува било кој број, се осмелувам да кажам, од 4 милијарди можни нешта што може да тргне наопаку во програмата. Па, како би можел да се Предноста на овој себе? Па, дозволете ми да се отвори програма дека сум го напишала во однапред, и ѕиркаат наоколу на интернет наречен здраво 4. И тоа е речиси идентични, освен што нејзините доби малку грешка проверка. Во овој случај, јас сум повторно прогласена за Главната преземање два аргументи, но овој пат, на линијата 17, известување Јас го правам малку здрав разум чек. Јас сум си сигурен дека argc еднаква изнесува 2. Бидејќи ако е така, што значи дека може безбедно допре не само заградата 0, но заградата 1. И јас одиме напред и да испечатите, во овој случај, Zamyla или Роб или што и зборот ми чука надвор. А сега само за да добие малку повеќе правилно, Одам да експлицитно се врати 0 за да се означи се е добро. Ништо лошо се случило. Но со Конвенцијата, јас ќе одам да врати 1, или искрено било кој не-0 вредност, ако нешто не беше во ред. Сега на корисникот нема да навистина се забележи она што се случува. Всушност, ако јас одам во овој директориум, ние зумирате и прават здраво 4, ./hello-4 Zamyla се однесува како што се очекува. Но, ако јас наместо не тип ништо, ништо не чини да се случи, но тоа не несреќата. И ако јас Наместо да направи нешто како Роб е PROCTOR во Thayer-- споделување произволни информации. Но информации, argv 1, 2, 3, 4, и 5 сега треба да постои во меморијата. Тоа, исто така, она што не е мојата програма очекува, бидејќи Сум проверил дали argc еднаква на еднаквите 2 или не. Па јас сум сега одбрана од ова. Сега, како настрана, ние programmer-- или поточно ние users-- никогаш да се види дека 0 или 1, но со користење на алатка наречена грешки, или други алатки, како што ќе видиме, пред долго, програмер всушност може да се види она што би можеле да бидат ќе е во ред внатрешноста на вашата програма. Значи, која било прашања во врска argc? Да. ПУБЛИКАТА: Сум видел каде што не сте имале карактер, [Беззвучен] само рече низа ѕвезда г, како карактер ѕвездичка запирка. Дали се тие еквивалент тука? Дејвид MALAN: Тие се. Значи, прашањето е, што треба повремено се гледа програми како овој, што не велат низа argv заграда но наместо тоа се каже нешто како знак ѕвезда argv заграда. И таму е дури и други варијанти кои може да се види. Тие се навистина еднакви. За сега, имаме овие вид на обука тркала на во форма на низа во CS50 библиотека, но во нешто повеќе од една недела или па ние си оди за да ја отстрани таа опструкција целосно и, всушност, погледнеме во она што знак и ѕвездата се, и како тие се однесуваат на меморија застапеност поопшто. Па ние ќе се вратам на тоа. Други прашања во врска со нашите argv или argc? Да. ПУБЛИКАТА: Зошто го врати грешка [Беззвучен]? Дејвид MALAN: Зошто го направи тоа врати грешка only-- ох! Во претходниот случај, кога беа futzing околу со меморијата, зошто тоа само се врати грешка кога навистина внесе голем број? Кратко одговорот е, ние само што влегов среќа. Општо земено, на компјутер доделува меморија во парчиња, и тоа ми даде доволно голем дел што Добив далеку, без да бидат забележани, на допирање заградата 2, 3 заградата, заградата 50, но штом ќе се наметнува мојата среќа, јас отидов надвор од границите на парче меморија оперативниот систем мене ми дава. А тоа е кога тоа стегна и рече, не. Сегментација грешка. Да. ПУБЛИКАТА: Како компјутерот знаат вредноста на argc? Дејвид MALAN: Како функционира компјутер знаат вредноста на argc? Кога ќе ја стартувате програмата, таа програма, од природата на трепкање брза, е предаден на низата на зборови кои се напишани во конзолата, тоа беше внесе во конзолата. И така тоа е вашиот оперативен систем, кој суштински се населува аргументи главниот проект за вас. Па тоа е една од услугите дека ќе го добиете, вид на тајно под хаубата на оперативен систем. Други прашања? Да. ПУБЛИКАТА: Што значи основни депонија значи? Дејвид MALAN: Што значи основни депонија значи? Па тоа е добро прашање. И дозволете ми да се врати во овој директориум овде. И ќе забележите дека Имам нова датотека таму. Тоа е навистина наречен јадро, а тоа е всушност обично пристојна големина на датотека. Што е во суштина слика содржината на меморијата мојата програма или RAM меморија кога се урнал. И тоа ќе биде корисно, потенцијално, дијагностички, откако ќе се зборува во иднина предавање и делот за дебагирање, бидејќи ти всушност може да го стори еквивалент на дигитални аутопсијата на таа датотека да им помогне дознаам она што не е во ред во вашата програма. Да. ПУБЛИКАТА: Дали argc команда во себе, или можете да го името нешто? Дејвид MALAN: Добро прашање. Е argc команда во себе, или можете да го името нешто? Тоа дефинитивно не е некоја команда. Тоа е едноставно променливата име или името на аргумент е, и така апсолутно ние може да се нарече ова foo, ние може да се нарече овој бар, кои имаат тенденција да биде зелено зборовите што компјутер научник оди. Но со Конвенцијата, ние ги користиме argc и argv. Но тоа е само човечка конвенција, ништо повеќе. Во ред. Па излезе, јас сум бил кажува малку бели lie-- и искрено, во иднина, ќе видите ние сме се кажува на другите бели лаги. Но, за сега, ние ќе да лупам назад еден од нив. Во овој случај тука кога јас претходно трчаше програма како ./hello или ./hello-3 Zamyla, имавме содржината на мојот меморија компјутер во потрага околу, како ова. Но се потсетиме што стринг е. Што да кажеме пред една недела што е низа е всушност под хаубата? ПУБЛИКАТА: низа на карактери. Дејвид MALAN: Тоа е низа од карактери, нели? Па ние би можеле да имаат низа на жици, но, пак, низа е низа од карактери. Значи, ако јас навистина сакате да бидете анален кога ќе се подготви оваа слика, Јас навистина треба да се цртање тоа малку повеќе вака, при што, во секоја од овие индекси на моите argv низа, постои себе цела низа кој сам по себе е во низа. И сега бела лага ние сме кажувам денес е дека на сликата не изгледаат вака. Всушност, малку плоштади се обично надвор од големите правоаголници таму. Но ние ќе се вратам на тоа пред долго. Но, ова е ./hello обратна коса црта 0, дека да се биде посебен карактер што демаркира крајот на стринг, и ние го добивме уште една по Име Zamyla е. Па што значи тоа? Па, дозволете ми да оди напред и да отвори две други примери кои се достапни онлајн. Една од нив е наречен argv1.c и другиот е argv2. Тоа е супер-едноставен програма која е различна од минатото програми во тоа што сега јас сум со користење argc и argv тука. И сега сум интегрирање со за телефонска линија во согласност 18, од i = 0 на до argc. И она што сум јас ќе го стори со оваа линија код овде? На англиски јазик. Ова очигледно покажува користењето на argc. Но, на англиски јазик, што значи го прават тоа, ако јас ја извршите оваа програма? Да? ПУБЛИКАТА: Тоа се случува да се печати вашите екран онолку пати колку што сакате. Дејвид MALAN: Токму така. Значи она што зборови тип во конзолата, тоа е ќе изливам ги во мене по еден на линија. Значи, да оди напред и да го направите тоа. Дозволете ми да одам во мојот именик и прават argv1 ./argv1. И сега, ајде да се задржи едноставна. Ајде да не прават ништо во прв. Тоа го правеше печати една работа, а тоа е навистина името на програмата, затоа што тоа е во заградата 0. Ако јас сега велат foo, тоа се случува да се направи овие две, а ако кажам foo bar, тоа се случува да се каже овие три работи. Сега тоа е нешто интересно, можеби. Но, да се потсетиме дека argv е низа од стрингови, но низа е низа од карактери, за да можеме да ги преземат работите до еден степен и применуваат дека основните логика и направи код кој изгледа малку повеќе криптичната, очигледно. Но по тоа што имаат вгнезден јамка, нешто слично на она што може да се сети од Марио, На пример, ако го направи тоа на овој начин. Па сега забележите на линија 19, јас сум повторно процесирањето над моите аргументи, од 0 на до argc. А сега во согласност 21-- сум позајмување трик од минатата week-- Јас сум проверка што е Должината на argv заградата јас. Јас сум чување на тој одговор во n. И тогаш јас сум интегрирање од ѕ на до n, каде што j е иницијализиран на 0. Значи, конвенцијата за броење. Откако сте јас се користи, ако имате вгнездени јамка, не можете да го користам повторно, во спротивно ќе clobber, потенцијално, на вредност надвор од внатрешниот циклус. Па јас сум со користење ѕ од Конвенцијата. Ние може да се користат k. Ако имате повеќе од к, најверојатно имаат премногу гнездење, обично. Но сега, забележи мојот printf линија е малку поинаква. Јас не сум печатење на% s, јас сум печатење% c, кои, се разбира, е случаеви за знак. И сега забележите оваа синтакса. Нова. Ние не го видел. Но, логично, тоа само значи добиете о низа во argv и да добијат jth што? ПУБЛИКАТА: карактер. Дејвид MALAN: карактер во таа низа. Значи со користење квадратни загради проследено со квадратни загради, ова е одличен прв во жици argv е, и потоа на втората квадратни загради со j е нуркање во ликовите на таа низа во argv. И тогаш, само за добра мерка, Јас печатење нова линија овде. Па сега дозволете ми да оди напред и да се отвори до малку поголем прозорец па ние може да се види во акција. Дозволете ми да одам во таа папка. А сега го прават argv-2-- whoops-- направи argv-2, ./argv 2. Enter. И тоа е малку тешко да читаат вертикално, но тоа е навистина името на програма, проследено со празен ред. Сега дозволете ми да оди напред и да го направи foo. Слично на тоа тешко да се прочита, но тоа е навистина печатење по еден знак на линија. И ако го направам бар, тоа е сега печатење на овие линија по линија. Па готова брза тука не е толку многу тоа, Леле, погледнете во овој уредни нов трик каде што можете да добиете на содржината на специфични карактери низа е, туку како ние сме преземањето на овие основни идеи како индексирање во низа, а потоа индексирање во низа што беше во таа низа, и само примена на истите идеи за малку пософистицирани примери. Но основите навистина не имаат се менува, дури и од минатата недела. Сега ова е вид на навремени, во кои, да се потсетиме, во неделата нула игравме со телефон книга како оваа. И иако ова е очигледно физички парчиња хартија, можете вид на може да се мисли на телефон книга како низа. Секако, ако сте во ситуација да reimplement овој парчиња овие парчиња хартија во компјутер, веројатно ќе се користи нешто како низа за складирање на сите оние имиња и броеви од сите на патот преку З. Значи ова е убаво, бидејќи тоа ни овозможува можност, можеби, да се разгледа како може да да ги спроведе такво нешто. Како и со серија на врати тука. Значи, ако јас could-- ни треба еден доброволно да дојдат горе. Ајде да видиме. Непознат лицето можеби, запознаени лице можеби. Како за во портокалово? Овде. Портокалова кошула, ајде нагоре. Ајде да одиме напред и сега потег овие врати во текот на страна, се движат на овие од патот за миг. Што е вашето име? AJAY: Дејвид MALAN: Ajay. Давид. Убаво да ви се исполнат. Во ред. Значи имаме зад овие шест врати дигитално на screen-- или, поточно, седум врати на screen-- целиот куп на броеви. И јас сум ви кажал ништо во advance-- договорено? AJAY: Ништо однапред. Дејвид MALAN: Се што сакам да го направите сега е да се најде за мене, и за нас, навистина, бројот 50, еден чекор во исто време. AJAY: Број 50? Дејвид MALAN: Бројот 50. И може да се открие она што е зад секоја од овие врати само со допир со прстот. По ѓаволите. [Смеа] [Аплауз] Многу добро направено. Во ред. Имаме една прекрасна подарок награда за вас тука. Вашиот Трансферот на филмови ние дискутира минатата недела. AJAY: О, човеку. О, јас никогаш не сум видел Spaceballs. Дејвид MALAN: Spaceballs. Во ред. Значи се одржи на само еден момент. How-- ајде да се направи овој на способен moment-- како си оди за наоѓање на број 50? AJAY: Ги избрав по случаен избор. Дејвид MALAN: Значи сте одбрале случајно и доби среќен. AJAY: Да. Дејвид MALAN: Добро. Одличен. Па сега, сте имале не добивано и среќа, што друго може да се случи зад овие врати? Значи, ако јас одам напред и открие овие броеви тука, тие всушност се во случаен редослед. И најдобро би можеле да имаат направено, искрено, е од страна, во крајна линија, во најлош случај, проверка на сите нив. Значи имаш супер-среќа, кој не е она што би ја нарекол алгоритам. Да, Congrats. Но сега let's-- хумор мене, ако може. Ајде да одиме во ова јазиче тука. И тука се броеви во јасно она што се чини дека е случаен избор, и тие беа. Но, сега, ако јас наместо барање дека зад овие врати се броеви кои се подредени. Целта сега е да се, исто така, ни се најде бројот 50. Но го направи тоа algorithmically и кажете ни како сте ќе за тоа. И ако го најдете, ве филмот. Вие не го најдете, ќе го даде назад. AJAY: Значи, ќе одам да се провери на крајот прво, за да се утврди дали there's-- [Смеа и аплауз] Дејвид MALAN: Еве. Ајде да ги разгледаме во еден на претходниците на Ajay, Шон, кој не бил толку среќен. Добро, така што вашата задача тука, Шон, е следниот. Имам скриени зад овие врати на бројот седум, но подвиткано далеку во некои од овие врати како и други не-негативни броеви. И вашата цел е да се мисли на ова горниот ред на броеви, како само низа. Ние сме само една низа на парчиња хартија со броеви зад нив. И вашата цел е, само со помош на врвот низа тука, најдете ме на бројот седум. И ние сме тогаш ќе го критикувам како да одите за тоа го правам. Најди ги ни на бројот седум, ве молам. Не 5, 19, 13. Тоа не е трик прашање. 1. Во овој момент вашиот резултат не е многу добро, така што би можело да продолжувам да одам. 3. Оди на. Искрено, не можам да им помогне, но се прашувам она што сте дури и размислува за. Шон: Јас можам да земам само од горниот ред. Дејвид MALAN: Само горниот ред. Значи имаш три лево. Па ме најдете 7. [ПУБЛИКАТА извици ПРЕДЛОЗИ] Така и на оние кои беа неверојатни за многу различни причини. Значи ова е местото каде што застанавте пред еден миг, и клучните увид тука беше овие врати имаше броеви зад нив кои биле подредени, идеален готова брза за што е тоа што можете да направите фундаментално подобро во овој втор example-- и, навистина, тоа беше на Sean прв обид со случајни броеви како before-- но штом бидејќи овие броеви се подредени, многу сличен на телефон книга, она што може да ти очигледно направам? Или како можете да потпора тоа знаење? Да. ПУБЛИКАТА: Вие одите на половина [Беззвучен]. Дејвид MALAN: Да. Токму така. Па првичната инстинкт на Ajay беше за да се провери на крајот, како што се сеќавам, а потоа ние вид на готови на пример брзо. Но, ако ние почнавме да го направите ова повеќе методично заедно оние линии, но почнувајќи можеби во средината, бидејќи тие се подредени, веднаш штом ќе се открие број 16, затоа ние know-- и ајде да го прават токму that-- ние Затоа знам дека 50, во денешниот случај, мора да биде на десно. Значи исто како и во недела нула кога ние раскина телефонот книга на половина и ја фрли половина од проблемот настрана, истата идеја овде. Ние може да се фрли во оваа половина од на проблемот веднаш. И најверојатно тоа што може да направи algorithmically, Откако ќе знаете дека 50 мора да биде на правото, ако е насекаде, е да се обидат таму, во средината на останатите врати. Се разбира, 50 е повисока од 42, за да можеме да фрли оваа останатите четвртина од проблемот настрана, и, конечно, да се идентификува нешто како 50. Но, како и со именик, овие броеви беа дадени на нас веќе во по некаков ред, што ни остава со прашањето, како да се работи во сортирани цел? И, искрено, по која цена? Тоа е една работа да се го подаде телефонот книга а потоа ги импресионира вашите пријатели со наоѓање телефонски број навистина брзо, нели? Кинење 32 страници цел да се најде лице од 4 милијарди страници, рековме беше еден екстремен пример. Но, колку време ќе го земе Веризон да се најде дека телефонот книга? Колку време ќе ни се да го решите овие седум броеви? Тоа е прашање што ние сме досега целосно игнорирани. Значи, да одговори на ова прашање сега. И сите ние сме надвор од филмови сега, но ние имаме некои стрес топки. Ако, на пример, осум волонтери не би ум ни се приклучи овде? Ајде да одиме напред и да се направи, како за четири од вас, три од вас? Добијат некои нови лица. И четири од вас таму? И now-- да не пристрасност here-- и број осум овде на крајот. Ајде до. Во ред. Значи она што го имаме тука за секој од вас е број. Ако сакате да одите напред, ја искористам оваа број. Што е вашето име? ARTIE: Artie. Дејвид MALAN: Artie, во ред. Ти си број 1. Амин: Амин. Дејвид MALAN: Амин. Давид. Ти си број 2. И да оди напред, како што рака Ви листови хартија, редат себе во предниот дел на музика стои во истиот редослед како до таму. Енди: Здраво, Енди. Дејвид MALAN: Енди, тоа е убаво да те видам. Број 3. Јаков Јаков. Дејвид MALAN: Јаков, број 4. Добредојдовте на бродот. Донација: Грант. Дејвид MALAN: Грант. Број 5. Alanna: Alanna. Дејвид MALAN: Alanna, број 6. FRANCES: Френсис. Дејвид MALAN: Френсис, број 7. И? Рејчел: Рејчел. Дејвид MALAN: Рејчел, број 8. Во ред. Оди напред и да си во оваа цел. Дозволете ми да се стави еден останатите музика стојат во место. Каде што ви е потребно стојат? Во ред. Оди напред и само ги ставаш броеви каде што публиката може да ги види во, музичка опрема со кои се соочува нанадвор. И се надевам, нашата прва разумност проверка here-- 4, 2, 6. Ох-ох. Чекај малку. Ние немаме 8. Морам да ви иселат од на пример некако. Не Не, тоа е во ред. Ајде да видиме. Можеме да го направите тоа. Стојат од страна. Таму одиме. Точни. Во ред. Значи, сега имаме 8, 1, 3 7, 5. Во ред. Одличен. Значи, прашањето на дофат на раката е, во која цена, и преку она што метод, да ние всушност го решите овие броеви тука така што можеме вид на може да работи наназад, во крајна линија, и decide-- тоа е навистина импресивна, тоа е навистина ефикасен, што може да се подели и освојување на телефон книга? Тоа е навистина ефикасно дека Јас може да се подели па владеј оние дигитални парчиња хартија на одборот, дали можеби тоа ќе ни чини богатство во време или енергија или процесорот циклуси да се всушност нашите податоци во некои по некаков ред? Значи, да побара тоа прашање. Значи прво исклучи, овие бројки се во доста случаен редослед, и јас одам да предложи еден алгоритам, или процес со кој можеме да го решите овие луѓе. Одам да се пристапи оваа убава наивно. И јас одам да го признае дека тоа е вид на многу за мене да заврши мојот ум околу целиот сет на податоци одеднаш. Но знаеш што? Одам да се направи некои многу едноставна маргинална поправки. 4 и 2 се на ред, ако Целта е да одат од 1 на до 8. Па да знаете што? Одам да имате момци се разменуваат, ако ви се префрлите физички позиции и Вашиот парчиња хартија. Сега 4 и 6, овие се во ред. Одам да ја напуштат оние биде. 6 и 8, тие се во ред. Ќе заминат да бидат. 8 AND1, на ред. Ако вие двајца не би ум Замена. Сега 8 и 3, ако вие момци би можел да се разменуваат. 8 и 7, ако вие момци би можел да се разменуваат. И 8 и 5, ако вие момци би можел да се разменуваат. Сега, јас се направи? Не, очигледно не. Но, јас го направија ситуација подобро, нели? Што беше името, повторно, број 8? Рејчел: Рејчел. Дејвид MALAN: Значи Рејчел има ефикасно клобуркаше до прилично далеку, сè до крајот на мојата низа на броеви овде. И така тој проблем е вид на решени. Сега, јасно, 2 се уште треба да се движат по малку, и 4 и 6 и 1. Но, јас се чини дека добиле малку поблиску до решение. Значи, да ја применувате оваа наивна хеуристичка повторно. 2 и 4, во ред. 4 и 6, во ред. 6 и 1, mm-mm. Ајде swap. 6 и 3, mm-mm. Ајде swap. 6 и 7 е во ред. 7 и 5, бе. Ајде swap. А сега 7 и 8. И она што е вашето име повторно? FRANCES: Френсис. Дејвид MALAN: Френсис. Па сега Френсис е дури и подобар позиција, бидејќи сега 7 и 8 се правилно клобуркаше до врвот. Па 2 и 4, во ред. 4 и 1, swap ајде. 4 и 3, swap ајде. 4 и 6, ти си во ред. 6 и 5, swap ајде. И сега овие момци се добри. Ние сме речиси таму. 2 и 1, на ред, па се разменуваат. И сега дозволете ми да се направи здрав разум чек. 2 и 3, 3 и 4, 4 и 5, 5 и 6, 6 и 7, 8. Добро, така што ние сме направиле. Но по која цена не јас средиме овие броеви тука? Па, колку чекори направив јас потенцијално земе кога сортирате овие луѓе? Па, ние ќе се вратам на тоа прашање. Но, искрено, ако сте ја добиле малку досадно, тоа е вид откривајќи во дека ова не е можеби најефикасен алгоритам. И навистина, искрено, јас сум потење сè повеќе и повеќе одење напред и назад. Дека не се чувствуваат особено ефикасни. Па ајде пробајте нешто друго. Ако вие момци би можеле да ги ресетирате себе за овие осум вредности. Добра работа. Ајде да ги разгледаме дигитално, за само момент пред да се обиде нешто друго, во она што едноставно се случи. Тука, ти си за да ја видите визуелизација на овие осум луѓе при сина и црвена барови претставуваат броеви. Повисокиот бар, поголем број. Пократко бар, толку е помал број. И она што ви се случува да се види е во случаен редослед повеќе од осум од нив. Си оди за да се види овие барови добивање подредени по истиот алгоритам, или сет на инструкции, кои ќе го наречеме отсега меур вид. Значи забележите, секој втор или така, два такта се осветлува во црвена, се во споредба со компјутер. А потоа ако големите бар и малку бар се надвор од употреба, тие се заменети за мене. Сега ова е неверојатно досадни за да се види ова, секако, за многу долго време, но забележите takeaway-- голем барови се движи кон десно, малку барови се движи кон лево. Ајде да прекинете овој процес и го забрза тоа да биде многу побрзо, за да можеме да добие на високо ниво смисла на она што, навистина, меур вид го прави. Всушност, тоа е клокотот до десната страна на листата, или низа, поголеми барови. И обратно, малку барови се жуборот својот пат надолу на лево, иако со побрзо темпо отколку што претходно го правеше. Значи, потешко да се види со луѓето, но визуелно тоа е навистина она што се случува. Но, ајде да се обидеме фундаментално поинаков пристап сега. Ајде пробајте друг алгоритам што ви треба момци започне во овие оригинални позиции, што беше оваа цел тука. И ајде да одиме напред сега. И јас одам да се направи нешто уште поедноставно, нели? Во ретроспектива, Замена на парови повторно и повторно, речиси малку паметни. Ајде да се прават работите уште повеќе наивно, каде што ако сакам да го решите овие луѓе, дозволете ми да ги бараме за најмалите елемент. Значи, токму сега, 4 е најмал број сум го видел. Одам да се сеќавам на тоа. Не, 2 е подобро, и се сеќавам дека. 1 е уште помала. 3, 7, 5. Во ред. One-- она ​​што е вашето име повторно? ARTIE: Artie. Дејвид MALAN: Artie. Значи, Artie, повелете. Одам да ви се повлече на линијата. Ако може да се врати тука. И јас треба да се направи простор за него. Имаме одлука точка тука. Како да се направи простор за Artie тука на почетокот, каде што број 1 припаѓа? ПУБЛИКАТА: Shift. Дејвид MALAN: Во ред, би можеле да се префрлат сите. Но нудиме оптимизација. Дека се чувствува малку досадни за мене да прашам четири лица да се движат на целиот пат. Што друго можам да направам? ПУБЛИКАТА: Исклучете ги. Дејвид MALAN: Исклучете ги. И она што е вашето име повторно? Јаков Јаков. Дејвид MALAN: Јаков, се движат. Многу поефикасно само за да имаат Јаков трампа локации со Artie, за разлика од принудувајќи сите четири од овие луѓе, Ви благодарам многу, да нивната правилна позиција. Што е убаво за Artie сега, тој е во правилна позиција. Да го направиме тоа повторно. 2, тоа е најмал број сум го видел. 3, 7, 5. Во ред. 2 е дефинитивно најмалиот. Не мора да се направи било работа. Да го направиме тоа повторно. 6. Најмалиот? 8. Не бе. 4? Ooh. Дозволете ми да се сетам на 4. 3. Дозволете ми да се сетам на 3. 7, 5. Најмал број Јас сум види на оваа помине е 3. Ако сакате ајде надвор. Каде одиме да се стави? И она што е вашето име? Alanna: Alanna. Дејвид MALAN: Alanna, ние сме ќе мора да ви иселат. Но тоа е поефикасна, само да се разменуваат две лица, отколку да имаат повеќе луѓе всушност се користи за создавање завршена. Сега ајде да го направите ова повторно. Одам да изберете 4, па ајде надвор. И кој се случува да се движат? Број 8, се разбира. Ако јас сега се најде бројот 5, ајде надвор. Број 8 се случува да се исели повторно. Јас сум сега се случува да се најде бројот 6 во место. 7 во место. 8 во место. Она што го направија сега е нешто што се нарекува избор вид, и ако се визуелизира ова, тоа е случува да се чувствуваат малку различен. Ајде да одиме напред и од оваа мени тука, овој visualization-- ајде да го промените ова to-- ајде, Firefox. Ајде да го промените ова селекција вид. И ајде да се забрза како и досега, и да почне визуелизација сега. И овој алгоритам има поинаков изглед. На секоја итерација, искрено, тоа е дури и повеќе јасна. Јас сум само изборот на најмалиот елемент. Сега, искрено, добив малку среќа што време, со тоа што подредени супер-брз. Елементи беа случајни. Тоа не е, како што ќе на крајот види, фундаментално побрзо. Но, да видиме по трет и последен пристап тука за тоа што се случува. Значи, да оди напред и да ја ресетирате вас момци една конечна време да биде во овој ред тука. И сега, јас ќе одам да да биде малку повеќе умен, само за да коло од нашите алгоритми. Одам да го направите тоа. Одам да не одат напред и назад толку многу. Искрено, јас сум уморен од сето ова traversing. Јас сум само случува да се земе она што јас сум со оглед на почетокот на листата, и јас одам да го решите дека тогаш и таму. Значи тука сме. Број 4. Одам да внесете број 4 во Подредена листа. Направи. Тврдам сега, и само да се направи ова повеќе јасни, овој дел од мојата листа е сортирана. Тоа е вид на глупави барање, но навистина 4 се подредени во листа на големина на една. Сега, јас ќе одам да ги преземе за број 2. Број 2 Јас сум сега ќе вметнете во вистинското место. Значи каде 2 припаѓа? Очигледно, овде. Така одат напред и се движи назад, ако може. И зошто не сте момци само да вашата музика со вас стои тоа време. И ајде да насилно вметнете сте во почетокот на листата. Па малку повеќе работа. Морав да се движи околу Јаков, и она што е вашето име? Амин: Амин. Дејвид MALAN: Амин. Но барем јас не одам напред и назад. Јас сум само преземање на работите како што одат. Јас сум само да ги ставите на вистинското место. 6, ова е всушност прилично лесно. Ајде да вметнете таму, ако Само сакав да се движат повеќе од малку. Број 8, исто така, прилично лесно. Право таму. По ѓаволите. Број 1 не можеме само разменуваат со Амин тука, затоа што се случува да се плеткаш на ред. Значи ние треба да биде малку повеќе умен. Значи, Artie, ако може врати за момент. Ајде да одиме напред и да се префрлат сега, за разлика од нашите претходни алгоритми, да се направи простор за Artie токму тука на почетокот. Па на крајот на денот, јас сум вид на прави она што сакав да се избегне порано. И така ми алгоритам е вид на промени, интелектуално, од она што првично беше. Јас сум само прави менувањето на друго место. Сега сум на 3. Ох, гајле. Ние треба да направите повеќе работа повторно. Па ајде да им помогнам. Ајде да се движи 8, 6, 4-- ох oh-- и 3 се случува да одам таму. Така барем мала заштеда тоа време. 7, не премногу работа да се направи. Значи, ако сакате да pop- назад, ајде да го внесете. И на крај, 5, ако сакате да поп назад, ние треба да ви се менуваат, вас, ви, до пет е на место. Па сега да се види тоа во еден високо ниво графички, да го направиме тоа алгоритам визуелизација еден дополнителен време. Така што ова ќе се јавите вметнување вид. Ние ќе се кандидира како брзо, и го пушти овде. И тоа, исто така, има поинакво чувство. Тоа е еден вид на добивање на подобро и подобро, но тоа никогаш не е совршена додека не одат во и изедначи во овие празнини. Затоа што, повторно, јас сум само го доби она што Јас сум се дадени од лево кон десно. Па јас не се толку среќа дека сè беше совршено. Тоа е причината зошто ние имавме овие мали mispositions дека сме ги решиле со текот на времето. Значи сите овие алгоритми се чини дека работи во малку различни чекори. Всушност, кој ќе ви го кажам е најдобар или најбрз досега? Меур вид, првиот? Изборот вид, вториот? Вметнување вид, третиот? Слушнав дека некои видови избор. Други мисли? Значи излегува дека сите од овие алгоритми се фундаментално само како ефикасна како секој other-- или, обратно, како што неефикасен како и секоја друга, затоа што може да го направите во основа подобро од сите три на овие алгоритми. И тоа е малку бела лага, исто така. кога велам како ефикасна или како неефикасни, тоа е најмалку за супер-големи вредности на n. Кога имаме само осум луѓе тука, или можеби 50 или така барови на екранот, сте апсолутно ќе забележите разликите меѓу овие три алгоритми. Но, како што n, број на лица, или бројот на броеви, или бројот на луѓето во телефонот книга, или бројот на веб-страници во базата на податоци на Google добива поголем и поголем, ќе видиме дека сите овие три алгоритми се всушност прилично сиромашни. И ние може да направи суштински подобро од тоа. Ајде да ги разгледаме, конечно, во она што овие алгоритми би можеле да звучи како во контекст на неколку други како и по пат на овој визуелизација тука кои ќе ни се запознаам со голем број на алгоритми. Ајде да одиме напред и да им честитаме нашите учесници овде, од кои сите се подредени многу добро. Ако сакате да се земе разделба подарок. Можете да ги задржи вашите броеви, како и. И она што ќе видите, или подобро слушаат, сега, е тоа што ние се стави звуци на секое од овие барови и тоа се дружат со софтверот, различни фреквенции на звукот, можете да ги комбинирате вашиот ум повеќе audioly околу тоа што секое од тие нешта изгледа. Од кои првата е вметнување вид [Тонови] Ова е меур вид. [Тонови] Вид селекција. [Тонови] Нешто што се нарекува спојување вид. [Тонови] Gnome вид. [Тонови] Тоа е тоа за CS50. Ние ќе се видиме во средата. Раскажувач: И сега, "Длабоко Мисли "од Daven Farnham. Зошто е тоа за телефонска линија? Зошто да не го прават тоа подобро? Би се направи пет јамка. [Смеа]