Дејвид MALAN: Сите во право, добредојде назад. Ова е CS50. Ова е почеток на недела седум. Така што е време, па мислев дека ние би земе виорот турнеја на тоа каде ние застанавте и каде што ние сега се случува. Значи ова нешто овде би можеле да имаат предизвика некои гнев во прв. Но се надевам, ти си почнуваат да аклиматизирам на она што ова означува тука - ѕвезда претставува покажувач, што е само она што, во смисла повеќе лаик? Па тоа е адреса. Па тоа е адресата на нешто во меморијата. И почнавме да лупам назад на слоеви неколку недели, работите се допаѓа GetString и други такви функции сето ова време се враќаат адресите на работите во меморијата, како адресата на првиот карактер во некои низа. Па ние исто така, воведе valgrind, која ќе започне да се користи за овој проблем во собата, особено за следната проблем во собата, како и. И valgrind го прави она што за нас? Тоа проверки за меморија протекување, и тоа исто така, проверки за злоупотреба на меморија. Тоа може да, со некои веројатност, детектира, ако вашиот код се случува да се допре меморија дека тоа едноставно не треба. Па не мора да излегуваат во јавноста, но ако оди подалеку од границите на некои низа, и ти всушност се кандидира valgrind и предизвика таквото однесување додека valgrind работи во вашата програма е работи во него, ќе добиете пораки вака - "невалидна пишуваат на големина од 4 ", која, да се потсетиме на неколку недели значеше дека имав случајно како на еден int предалеку надвор од границите на низата. И така со големина од 4 значи тука на големината на тој конкретен Инт. Па се земе успокојување во фактот дека valgrind е излез, форматот на тоа, е само крволочен. Тоа е навистина тешко да се види низ хаос за интересни информации. Па што ние го направивме овде е само извадок некои од неколку повеќе интересни линии. Но сфати дека 80% од valgrind е излез ќе биде малку одвраќање. Само се погледне за моделите како овие - неправилен право, неправилен чита, 40 бајти и некои број на блокови се дефинитивно изгубени, клучни зборови, како тоа. И она што се надевам дека ќе видиме некои вид на трага од она што функционира грешка е всушност внатре Во овој случај тука, во она што линијата на мојот код беше грешка очигледно? 26 во датотека наречена memory.c, кој беше на пример ние игравме со во тоа време. Па тоа не е веројатно во Примерок. Тоа е веројатно во мојот код наместо тоа. Па ќе видиме ова повторно и повторно пред долго. Па scanf, ова излезе во неколку форми досега. Видовме sscanf кратко. Тоа беше нешто голем број на ви се нурна во во вашиот подготовките за квиз. И scanf е, всушност, она што CS50 библиотека е со користење под качулка за сосема извесно време, со цел да се добие влез од корисникот. На пример, ако јас се движат во текот на CS50 апаратот тука, дозволете ми да се отвори пример денес дека се вика scanf-0.c И тоа е супер едноставен. Тоа е само неколку линии на код. Но тоа покажува навистина како getInt работи сето ова време. Во оваа програма тука, во линија 16 , Известување дека јас прогласи Инт. Па нема покажувачи, ништо магично таму, само Инт. Потоа, во линија 17, јас го извести корисникот за голем број, те молам. Потоа, во крајот на 18, јас го користам scanf тука. И јас одредено, вид на како printf, дека јас сум очекува цитат unquote проценти i. Значи проценти Јас, се разбира, означува Инт. Но се забележи она што на вториот аргумент да scanf е. Како би ја опишале вториот аргумент по запирката? Што е тоа? Тоа е адресата на х. Значи ова е корисно, бидејќи со обезбедување на scanf со адреса на x, она што не кои ги поттикне таа функција да направам? Не само одат таму, но, исто така, го направи она што? Направи промена на неа. Бидејќи можете да одат таму, тоа е вид на како на сајтот на локација во меморијата. И толку долго како што се обезбеди scanf, или било функција со една таква карта, која функција може да оди таму, и не само погледне на вредност, но исто така може промена на таа вредност, што е корисно ако целта во животот на scanf е да се скенирање на влез од корисникот, посебно од тастатурата. И ѓ означува форматиран, исто како и printf, ѓ означува форматиран стринг кој сакате да печатите. Значи во кратки, оваа линија 18 едноставно вели, обидете се да прочитате int од корисникот тастатура и чувајте го во внатрешноста на x, на без оглед адреса х случува да се живее во. А потоа на крај, линија 19 само вели, Ви благодариме за int, во овој случај. Па дозволете ми да оди напред и да се направи овој. Така бидете scanf 0. Дозволете ми да оди напред и да зумирате внатре Ќе одам да ја извршите оваа со точки коса црта scanf 0. Број, те молам? 50. Ви благодариме за 50. Па тоа е прилично едноставна. Сега што не го прави тоа? Тоа не го прави целиот куп на грешка проверка. На пример, ако јас не соработуваат, и не ми напишеш во голем број, но наместо да пишувам нешто како "Здраво" тоа е само вид на чудно. И така една од работите на CS50 библиотека е тоа за нас за некое време е дека reprompting и reprompting. На retry фраза потсетиме беше во cs50.c, и тоа е причината што getInt во библиотеката CS50 е, всушност, целиот куп на линии долги, бидејќи ние сме проверка за глупави работи како оваа. Не на корисникот даде нас, всушност, int? Дали тој или таа ни даде нешто како по азбучен писмо? Ако е така, ние сакаме да се открие што и се развикам нив. Но, работите стануваат поинтересни во следниот пример. Ако одам во scanf-1.в, што е еден нешто што е фундаментално се промени во овој следната пример? Јас сум со користење char *, се разбира, наместо int. Значи ова е интересно, бидејќи char *, потсетиме, дали е навистина само истото како стринг. Па таа се чувствува како можеби ова е супер едноставна имплементација на GetString. Но јас сум излупени назад слој на CS50 библиотека, па јас сум повикувајќи овој char * сега. Да видиме каде што, ако било каде, ние да тргне наопаку. Линија 17 - Јас повторно се каже, молам да ми даде нешто, во овој случај, низа. А потоа и во следната линија, јас го нарекувам scanf, повторно, давајќи му формат код, но овој пат проценти s. А потоа овој пат, јас сум давајќи тампон. Сега забележите, јас не сум со користење на симболот. Но, зошто е тоа што веројатно во ред овде? Затоа што она што е тампон веќе? Тоа е веќе покажувач. Тоа е веќе адреса. И ајде овој збор "збуни", дозволете ми само ја нарекуваат е, на пример, за едноставност. Но јас сум го нарече тампон затоа што во Генерално, во програмирање, ако имате парче на меморија, која низа навистина само е, може да го наречеме тампон. Тоа е место за складирање на информации. Слични на нешта како YouTube, кога тие се визуелниот, така да се каже, дека само значи тоа е симнување на битови од на интернет и чување на нив во локалните низа, локален парче на меморија, па што може да се види тоа подоцна, без тоа скокнеш или виси на ви, додека изведувате назад. Значи има проблем тука иако, бидејќи јас сум ти го кажувам scanf, се очекува стринг од корисникот. Тука е адресата на парче меморија. Стави дека низа таму. Зошто е тоа така врзани даде ни проблеми, иако? Што е тоа? Сум дозволено за пристап тој дел од меморијата? Знаете, јас не знам. Бидејќи нема тампон е иницијализиран да нешто? Навистина не. И така тоа е она што ние сме биле нарекувајќи ѓубре вредност, која не е формален збор. Тоа само значи дека ние немам идеја што битови се во внатрешноста на четири бајти кои Имам распределени како тампон. Не сум се нарекува Примерок. Јас сум дефинитивно не наречен GetString. Па кој знае што е, всушност, внатрешноста на тампон? А сепак кажувам scanf слепо, оди таму и го стави она што корисникот внесе. Значи она што е најверојатно може да предизвика во нашиот код, ако ние го извршите? Веројатно segfault. Можеби не, но веројатно segfault. И јас велам можеби не затоа што понекогаш ќе го направите, понекогаш да не добие segfault. Понекогаш едноставно имаат среќа, но не е сеедно ќе биде на бубачка во нашата програма. Па дозволете ми да оди напред и да собере. Одам да го направи тоа на старата школа начин. Па ѕвекот цртичка 0, scanf-1, scanf-1.в, Enter. Упс, исто старата школа. Ајде да видиме. Каде и да одам? Ох, char * тампон. О, ти благодарам - Спаси, во ред - многу старата школа. Сите во право, тоа е време. Па јас само го зачувале фајлот по одлуки кои привремено промена пред еден миг. И сега јас го состави рачно со ѕвекот. И сега ќе одам да се оди напред и да ја стартувате scanf-1, Enter. Стринг молам. Јас ќе напишете "Здраво". А сега, еве, каде што, искрено, printf може да е малку досадни. Тоа не е всушност ќе segfault во овој случај. Printf е малку посебна, бидејќи тоа е толку супер најчесто се користи дека суштина printf прави ни корист и реализација, тоа не е валидна покажувач. Дозволете ми да го земе врз себе само да се печати во заграда нула, дури и иако тоа не е нужно што ние самите се очекуваше. Па ние навистина не може лесно да предизвикаат segfault со ова, но јасно ова не е однесувањето сакав. Значи она што е едноставно решение? Па, во scanf-2, дозволете ми да предложи наместо всушност само доделување на char *, дозволете ми да биде малку попаметно за ова, и дозволете ми да ги распредели тампон како секвенца од 16 карактери. За да можам да го направите тоа во неколку начини. Јас апсолутно може да го користи Примерок. Но, можам да се вратиме на недела две, кога Јас само се потребни на целиот куп на карактери. Тоа е само низа. Па да ми наместо редефинира тампон да биде низа од 16 знаци. И сега, кога јас помине тампон во - и ова е нешто што ние не зборуваме за во недела две - но можете да се третираат низа како иако тоа е адреса. Технички, како што видовме, тие се малку поинаква. Но scanf нема ум, ако го предадете името на низа, затоа што она што Ѕвекот ќе направи за нас е во суштина третираат името на таа низа како адресата на парче од 16 бајти. Значи ова е подобро. Ова значи дека сега можам да се надевам да го направите следново. Дозволете ми да одзумирате за момент и го прават scanf-2, составена ред. Сега дозволете ми да го доби коса црта scanf-2. Стринг молам. "Здраво". И тоа се чинеше да работат тоа време. Но некој може да предложи сценарио во кои уште не би можеле да работат? Да? Нешто подолг од 16 карактери. И всушност, можеме да бидеме малку попрецизни. Нешто подолг од 15 карактери, затоа што навистина треба да го имаме на ум дека ни се потребни што обратна коса црта нула имплицитно на крајот од стрингот, која е настрана scanf ќе обично се грижи за за нас. Па да ми се направи нешто како - понекогаш ние само може да оставете го како што. Добро, па сега сме предизвикана нашите сегментација вина. Зошто? Затоа што Јас ја внеле во повеќе од 15 ликови, и така ние сме всушност допре меморија дека јас всушност не треба да има. Значи она што е навистина решение тука? Па, што ако ние треба подолг стринг? Па, ние можеби го прават тоа 32 бајти. Па, што ако тоа не е доволно долго? Како за 64 бајти? Што ако тоа не е доволно долго? Како за 128 или 200 бајти? Она што навистина е решение овде, во општ случај, ако не знаеме во однапред што на корисникот ќе напишете? Тоа е само вид на голема болка во газот, да бидам искрен, кој е зошто на CS50 библиотека има неколку десетина линии на код кој колективно имплементираат GetString низа во начинот на кој ние не треба да знаете однапред што корисникот е случува да напишеш. Особено, ако се погледне назад на cs50.c од пред две недели, ќе видите дека GetString всушност не Не користете scanf на овој начин. Наместо тоа, го чита еден карактер во исто време. Бидејќи оној убаво нешто во врска читање на еден лик е што можеме гарантира себе секогаш да да имаат најмалку еден знак. Јас само може да прогласи знак, а потоа да овие навистина бебе чекори за да се само чита еден карактер во во време од тастатурата. А потоа, она што ќе видите GetString не е секој пат кога истекува на, да речеме, 16 бајти од меморија, го користи Примерок или роднина од него, да одвои повеќе меморија, копирање на старите меморија во новата, а потоа индексирање заедно, добивање еден карактер во еден момент, и кога се работи надвор од таа парче на меморија, тоа фрла подалеку, ја зграпчува поголем парче на меморија, копии стари во нови, а се повторува. И тоа е навистина болка да всушност имплементираат нешто толку едноставно како добивање на влез од корисникот. Така можете да го користите scanf. Можете да користите други слични функции. И многу учебници и онлајн примери се направи, но сите тие се ранливи на проблеми како оваа. И на крајот, добивање на segfault е вид на досадни. Тоа не е добро за корисникот. Но, во најлош случај, она што го прави Тоа во основа го поставите вашиот код изложени на ризик од? Некој вид на напад, потенцијално. Ние разговаравме за еден таков напад - преполнети магацинот. Но, во принцип, ако сте дозволено да претекување тампон, како што правевме на пред неколку недели, со само пишување повеќе од "здраво" на магацинот, можете навистина може да го преземе, потенцијално, компјутер, или барем да се добие на податоците кои не припаѓа на тебе. Значи на кратко, ова е причината зошто имаме оние обука тркала. Но сега, да почнеме да ги симне, како нашите програми веќе не треба, нужно, влез од корисникот. Но, во случај на проблем постави шест, вашиот влез ќе дојдат од огромна речникот со 150 некои чудно илјада зборови. Така да не ќе мора да се грижите за на корисникот произволно влез. Ние ќе ви даде некои претпоставки за таа датотека. Било какви прашања за совети или scanf или корисник влез во воопшто? Сите во право, така брз поглед потоа во еден заостанува тема од пред две недели. И тоа беше овој поим на struct. Не дека - овој поим на struct, која беше она? Што struct стори за нас? Дефинира - е жал? Дефинира променлива тип. Значи на некој начин. Ние сме всушност комбинирање на две теми. Така да со typedef, да се потсетиме дека можеме да прогласи еден вид на нашите сопствени, како синоним, како стринг за char *. Но со користење на typedef и struct, можеме да создаде вистински нашите сопствени структури на податоци. На пример, ако одам назад во gedit тука за само еден миг, и јас одам напред и направи нешто како, дозволете ми да ги зачувате ова како, да речеме, structs.c привремено, јас сум само ќе да се оди напред и вклучуваат standardio.h, int главната неважечки. А потоа во тука, да претпоставиме дека сакам да се напише програма која ги зачувува повеќе студенти од повеќе куќи, на пример. Па тоа е како една registrarial база на податоци на некој вид. Значи, ако јас треба името еден студент, јас може да се направи нешто како char * име, и јас ќе се направи нешто како - всушност, ајде да го користат CS50 библиотека за само еден миг да се направи овој малку поедноставно, па можеме да позајми оние десетици линии на код. И ајде само да биде едноставно. Ние ќе продолжиме да го стринг, и сега GetString. Така тврдам сега што сум ги чуваат името на некои студент, и на домот некои студент, едноставно користење на променливи како што правевме и во една недела. Но претпоставувам дека сега сакате да го поддржуваат повеќе студенти. Сите во право, па моите инстинкти се да се направи низа name2, добива GetString, стринг house2 добива GetString. А потоа нашиот трет студент, ајде да направиме name3 GetString. Добро, така што ова е се надевам дека впечатлива вас, како вид на глупави, бидејќи овој процес навистина никогаш не е ќе заврши, и тоа е само ќе направи мојот код изгледа полошо и полошо и полошо. Но ние го решил овој премногу во недела две. Она што беше нашата релативно чисти решение кога имавме повеќе променливи од истиот тип на податок, кои се сите поврзани, но ние не сакаме овој крволочен хаос на сличен начин именуван променливи? Што правиме наместо неа? Па мислам дека слушнав неколку места. Имавме низа. Ако сакате повеќе примероци од нешто, зошто не ги исчисти сето ова и само велат, дај ми го низа наречен имиња? И сега за сега, ајде тешко код 3. И тогаш ми даде уште една низа наречен куќи, и дозволете ми за сега е тешко код 3. И јас сум масовно исчистени плеткаш дека јас само замислен. Сега, јас сум сепак тешко кодирани 3, но дури и 3 динамички може да дојде од корисник, или argv, или слично. Па ова е веќе почист. Но она што е досадно за ова е дека сега, иако името е некако фундаментално поврзани со на студентот куќа - тоа е еден студент дека јас навистина сакате да го претставуваат - Јас сега имаат две низи кои се паралелни во смисла дека тие се иста големина, и имиња заградата 0 веројатно мапи за куќи заградата 0, и имиња заградата 1 мапи на куќите заградата 1. Со други зборови, дека студент живее во таа куќа, и дека други студентот животи во таа друга куќа. Но сигурно ова може да биде направи дури и повеќе демонтирани. Па, тоа може, во факт. И дозволете ми да оди напред и да се отвори до structs.h, и ќе види оваа идеја тука. Забележите дека сум се користи typedef, како што алудираше на момент пред да го објавиме нашиот сопствен тип на податок. Но јас сум исто така со користење на овој другите клучни зборови наречен struct што ми дава нови податочна структура. И овие податоци структура тврдам се случува да имаат две работи во внатрешноста на тоа - низа наречен име, и низа наречен куќа. И името, ќе одам да се даде на оваа податочна структура се случува да се нарекува студент. Јас би можеле да го наречеме што сакам, но ова семантички направи смисла за мене во мојот ум. Па сега, ако јас отвори подобра верзија на програмата почнав да пишувам таму, дозволете ми да дојдете до врвот. И има некои повеќе линии на код тука, но дозволете ми да се фокусира за моментот на еден. Сум прогласи постојан наречен студенти и хард кодирани 3 за сега. Но сега, забележи како чиста мојот код започнува да се добие. Во линија 22, изјавувам низа на студентите. И ќе забележите дека ученикот е очигледно сега е тип на податок. Затоа што на врвот од оваа датотека, информации Сум вклучени дека хедер датотека дека јас го зафрла само еден миг пред. И дека хедер датотека сосема едноставно имаше оваа дефиниција на еден студент. Па сега, јас сум создаде мојата сопствени податоци тип дека авторите на C години Пред не мислам на однапред. Но нема проблем. Јас може да го направи сам. Па ова е низа наречен студенти, секој од чии членови е студент структура. И јас сакам три од овие во низа. И сега, она што го прави останатото на оваа програма направам? Ми требаше нешто малку произволни. Па од онлајн 24 наваму, Јас iterate 0-3. Јас тогаш побара од корисникот за на студентот име. И тогаш јас го користам GetString како порано. Тогаш го прашувам за куќа на студентот, и јас го користам GetString како порано. Но известување - малку нови парче синтаксата - Јас се уште може да индекс на I-та студент, но како можам да добијам на специфични податоци поле внатрешноста на struct? Па, она што е очигледно нова фигура на синтакса? Тоа е само точка оператор. Ние не сум видел тоа порано. Сте го виделе во pset пет ако сте нурна во веќе со битмапа датотеки. Но точката само значи внатрешноста на оваа struct или повеќе полиња, им даде на точка име, или да ми даде точка куќата. Тоа значи дека оди во внатрешноста на struct и да се оние одредени области. Што значи на остатокот од оваа програма се направи? Тоа не е сите дека секси. Забележете дека јас iterate 0-3, повторно, и јас едноставно креирање на англиски фраза од типот така и така е во таква и таква куќа, поминува во dot името од на i-тата студент и нивните куќа, како и. А потоа на крај, сега ќе почнеме да се добие анален за овој, сега дека ние сме запознаени со она што Примерок и други функции се прави сето ова време. Зошто морам да се ослободи двете името и куќата, иако јас не се јавите Примерок? GetString направив. И тоа беше валкана малку тајна за неколку недели, но GetString има протекување меморија целиот место сите семестар досега. И valgrand конечно ќе откријат овој за нас. Но тоа не е голема работа, бидејќи знам дека јас едноставно може да се ослободи името и куќата, иако технички, да се биде супер, супер безбедна, јас треба да биде прават некои грешка проверка тука. Кои се вашите инстинкти ви кажувам? Што треба да се проверуваат за пред јас да се ослободи она што е стринг, ака која char *? Јас навистина треба да се провери дали студенти заградата јас точка Името не еднакви нула. Тогаш тоа ќе биде во ред за да оди напред и слободни дека покажувач, и истиот или на друг една, исто така. Ако студенти заградата јас точка куќата не е еднаков на нула, ова сега ќе го заштити против агол случај во кој GetString се враќа нешто како ништовни. И видовме пред еден миг, printf ќе заштитат нас до тука од само велејќи нула, која се случува да се погледне чудно. Но барем тоа нема да segfault, како што видовме. Па, дозволете ми да се направи една друга работа тука. structs-0 е вид на глупави програма затоа што јас ги внесете сите овие податоци, а потоа тоа е загубено еднаш на програмата завршува. Но дозволете ми да оди напред и да го направите тоа. Дозволете ми да се направи терминал прозорец малку поголема. Дозволете ми да structs-1, кој е нова верзија на оваа. Јас ќе зумирате малку. И сега дозволете ми да се кандидира точка коса црта structs-1. Студентот име - Дејвид Mather, ајде да направиме Роб Киркланд, ајде да направиме Лорен Leverett. Она што е интересно сега е најава - а јас само знам затоа што Напишав на програмата - постои датотека сега на тековната ми директориумот наречен students.csv. Некои од вас можеби го виделе овие во реалниот свет. Што е CSV датотека? Одвоени со запирки вредности. Тоа е вид на како лош избор верзија на една датотека Excel. Тоа е табела на редови и колони кои можете да ја отворите во програма како Excel, или броеви на Mac. И ако јас ја отворите оваа датотека тука за gedit, информации - и бројките не се таму. Тоа е само gedit кажувам мене линија броеви. Забележите на првата линија на овој датотеката е Давид и Mather. На следната линија е Роб запирка Киркланд. И третата линија е Lauren запирка Leverett. Па што сум создаден? Јас сум сега напишано програма C дека можат ефикасно да се генерираат табеларни пресметки кои може да се отвори во програма како Excel. Не сите дека огромна група на податоци, но ако имате многу поголеми парчиња податоци кои всушност сакаат да манипулира и да графикони на и допаѓа, ова е можеби една начин да се создаде дека податоците. Згора на тоа, CSVs се всушност супер заеднички само за складирање на едноставни податоци - Јаху финансии, на пример, ако добиете берзанските преку нивните т.н. API, бесплатна услуга која ви овозможува да добие моменталната до-на-на-датум акции цитати за компаниите, тие даде податоци назад во супер едноставен CSV формат. Па како не го правиме тоа? Па забележи, поголемиот дел од оваа програма скоро исти. Но информации тука долу, наместо печатење на учениците надвор, on-line 35 наваму, тврдам дека јас сум заштеда на студенти на дискот, па заштеда на датотека. Па забележиш јас сум за прогласување на Датотека * - сега, ова е вид на аномалија во C. За која било причина, датотеката е сите капи, што не е како и повеќето други типови на податоци во C. Но, ова е вграден во тип на податоци, датотеки *. И јас сум за прогласување на покажувач кон датотека, е начинот на кој можете да мислам на тоа. fopen значи отворената датотека. Што фајл сакаш да се отвори? Сакам да отворите датотека дека јас ќе произволно се јавите students.csv. Јас може да се нарече дека нешто сакам. А потоа ги погоди. Она што го прави вториот аргумент да fopen веројатно значи? Право, w за пишување, може да биде r за читање. Има за додавај ако сакате да го додадете редови и не пребришете целата работа. Но сакам само да ја креирате оваа датотека еднаш, па јас ќе го користите цитат unquote w. И знам дека само од тоа читање документацијата, или човекот страница. Ако датотеката не е нула - со други зборови, ако ништо не беше во ред таму - дозволете ми да iterate во текот на студенти 0-3. И сега забележите дека е нешто некогаш толку малку различни за линија 41 тука. Тоа не е printf. Тоа е fprintf за датотеката printf. Па затоа се случува да запишам во датотеката. Која датотека? Оној чие покажувачот ќе се определи како прв аргумент. Тогаш ние наведете формат низа. Тогаш ние прецизира колкав низа сакаме да приклучок во за прв проценти с, и тогаш друга променлива или вториот проценти s. Тогаш ние затвори датотеката со запишам. Отколку што се ослободи меморија како и досега, иако Јас треба да се вратиме и да го додадете некои проверки за ништовни. И тоа е тоа. fopen, fprintf, запишам ми дава способноста да се создаде текстуални датотеки. Сега, ќе видите во проблемот сет пет, која вклучува слики, ќе биде со користење на бинарни датотеки, наместо. Но, во основа, идејата е иста, иако функции да ќе види се малку различни. Па виорот турнеја, но ќе добиете сите премногу запознаен со датотека I/O-- влез и излез - со pset пет. И било какви прашања во врска со почетна основите тука? Да? Што ако се обидете да се ослободи null вредност? Јас верувам, освен ако не слободно има добивано малку повеќе user-friendly, можете да потенцијално segfault. Поминува null се лоши бидејќи јас не Верувам бесплатно пречи да се провери за вас, поради тоа што потенцијално ќе биде отпад време за тоа да се направи за сите во светот. Добро прашање, иако. Сите во право, па овој вид на добива ни со една интересна тема. Темата на проблемот сет пет е криминолошки науки. Барем тоа е еден дел на проблемот во собата. Криминолошки науки генерално се однесува на наплата на информации кои може или не може да се избришани намерно. И така мислев дека сум ти даде брз вкусот на она што е навистина се случува на сите овој пат под хаубата на вашиот компјутер. На пример, ако имате внатрешноста на вашиот лаптоп или десктоп компјутер хард диск, тоа е или механички уред кој всушност се врти - има кружни нешта наречени Одмори плата кои изгледаат доста допаѓа она што го само имаше на екранот тука, иако ова е повеќе старото училиште. Ова е три-и-пол-инчен хард диск. И три и пол инчи однесува на со на работа кога ќе го инсталирате во компјутерот. Многу од вас момци во вашиот лаптопи сега имаат солидна држава дискови, или SSDs, кои немаат подвижни делови. Тие се повеќе како RAM меморија и помалку како овие механички уреди. Но идеи се уште се исти, сигурно како тие се однесуваат на проблемот постави пет. И ако мислите дека за сега на хард диск претставува биде кругот, кој Јас ќе подготви вака тука. Кога ќе се создаде датотека на вашиот компјутер, дали тоа е SSD, или во овој случај, еден постар училиште хард диск, таа датотека се состои од неколку бита. Да речеме дека тоа е овој 0 и 1, целиот куп на 0-ти и 1S. Значи ова е мојот целиот хард диск. Ова е очигледно прилично голема датотека. И тоа е со користење до 0-ти и 1S во тоа дел од физичкиот послужавник. Па, што е тоа што физичкиот дел? Па, излегува дека на хард диск, барем од овој тип, има овие малечки магнетни честички. И тие во суштина имаат север и југ столбови за нив, така што, ако се претвори еден од оние магнетни честички на овој начин, може да се каже дека тоа е што претставува 1. И ако тоа е наопаку југ кон север, може да се каже дека тоа е претставува 0. Па во реалниот физички свет, тоа е како би можеле да претставуваат нешто во бинарни држава на 0 и 1. Така што е сè датотеката е. Постојат еден куп на магнетни честички кои се нивните овој начин или на овој начин, создавајќи модели од 0-ти и 1S. Но излегува кога ќе ја зачувате датотеката, некои информации се зачувани одделно. Па ова е малку маса, директориумот, така да се каже. И јас ќе се јавам оваа колона име, и Ќе му се јавам оваа колумна локација. И јас одам да се каже, да претпоставиме ова е мојот биографија. Мојата resume.doc се чува во локација, да речеме 123. Јас секогаш се обратите за тој број. Но, тоа е доволно да се каже дека само како во RAM меморија, може да се земе на хард диск тоа е GIGABYTE или 200 гигабајти или Terabyte, и може да Бројот сите на бајти. Можете да нумерира сите парчиња од 8 бита. Па ние ќе се каже дека оваа е локација 123. Па овој директориум внатрешноста на мојата оперативен систем се сеќава дека мојот биографија е на локација 123. Но станува интересно кога ја избришете датотеката. Така на пример - и за среќа, поголемиот дел од светот има фатени врз тоа - она ​​што се случува кога ќе повлечете датотека на вашиот Mac OS Ѓубре или вашиот Windows Recycle Bin? Која е целта на тоа го прават? Тоа е очигледно за да се ослободи од датотеки, но она што го прави чинот на влечење и пуштање во вашиот ѓубрето или вашиот Recycle Bin направи на компјутер? Апсолутно ништо, навистина. Тоа е исто како некој фолдер. Тоа е посебен фолдер, да бидете сигурни. Но, дали тоа всушност ја избришете датотеката? Па, не, затоа што некои од вас веројатно биле како, ох по ѓаволите, не сте го сториле значи да го стори тоа. Па ќе кликнете два пати на Ѓубрето или Recycle Bin. Сте појдов наоколу и си обнови на датотеката само со влечење од таму. Па јасно, тоа не е нужно да се избрише. Добро, ти си попаметен од тоа. Вие знаете дека само да го влечете во Ѓубрето или Recycle Bin не значи ти си празнење на ѓубрето. А ти оди до менито, и велиш Празни ѓубрето или Празна Recycle Bin. Тогаш што се случува? Да, така е избришан повеќе. Но сето тоа се случува е тоа. На компјутерот заборава каде resume.doc беше. Но, она што не е променет очигледно на сликата? На битови, на 0-ти и 1S дека тврдам се на местото на некои физички аспект на на хардверот. Тие се уште е таму. Тоа е само на компјутер има заборави она што се. Така, тоа е во суштина ослободени на датотеката битови, така што тие можат да бидат пренаменети. Но не додека не се создадат повеќе датотеки, и повеќе додадени фајлови, и многу повеќе датотеки ќе probabilistically, оние 0-ти и 1S, оние магнетни честички, се пренаменети, Главата или десната страна нагоре, за други датотеки, 0-ти и 1S. Па имате овој прозорец на време. И тоа не е на предвидлив должина, навистина. Тоа зависи од големината на вашиот хард диск и колку додадени фајлови: имате и колку брзо ќе направиме нови. Но, има овој прозорец на време кои таа датотека се уште е совршено обновуваат. Па ако некогаш го користите програми како McAfee или Norton да се обиде да се опорави податоци, сите тие се прави се обидува да враќање на оваа т.н. директориум за дознаам каде вашата датотека беше. А понекогаш и Нортон и ќе каже, датотека е 93% обновуваат. Па, она што значи тоа? Тоа само значи дека некои други датотека случајно заврши со, да речеме, оние делови од вашиот оригиналната датотека. Значи она што е, всушност, се вклучени во обновувањето на податоците? Па, ако немате нешто како Нортон пре-инсталиран на вашиот компјутер, најдобро можете понекогаш може да направите е да се погледне на целиот хард диск во потрага за моделите на битови. И една од темите на проблемот сет пет е дека ќе се бара еквивалент на хард диск, на форензичката сликата на Compact Flash картичка од дигитален фотоапарат, во потрага за 0-ти и 1S дека обично, со висок веројатност, претставуваат почеток на еден JPEG сликата. А вие момци можат да повратат оние слики со претпоставувајќи, ако го видам овој модел на битови на форензичката слика, со голема веројатност, која го означува почетокот на JPEG. И ако видам истата шема повторно, што веројатно го означува почетокот на друг JPEG, и друг JPEG, и друг JPEG. И ова е типично како податоци за обновување ќе работат. Што е убаво за JPEG слики е иако форматот на датотеката сама по себе е малку комплекс, на почетокот на секоја таква датотека е всушност прилично препознатлива и едноставно, како што ќе видите, Ако не сте веќе. Па ајде да донесе поблиски се погледне под на хаубата како да се токму она што е случува, и она што овие 0-ти и 1S се, за да ви даде малку повеќе од контекст за овој посебен предизвик. [Видео репродукција] -Каде вашиот компјутер продавници повеќето на своите постојани податоци. Да го направите тоа, податоците патува од RAM меморија заедно со софтвер сигнали кои му налагаат на хард дискот како да се чуваат тие податоци. На хард дискот кола преведе оние сигнали во напон флуктуации. Овие, пак, контрола на хард диск подвижни делови, некои од неколкуте подвижни делови оставени во современиот компјутер. Некои од сигналите контрола на моторни која се врти метал-обложена Одмори плата. Вашите податоци е, всушност, чуваат на овие Одмори плата. Други сигнали се преселат на читање / запишување глави за читање или пишуваат податоци на Одмори плата. Оваа машинерија толку прецизни дека човечкиот коса дури и не можеше да помине помеѓу глави и се врти Одмори плата. Сепак, сето тоа се работи во страшно брзина. [Крај видео репродукција] Дејвид MALAN: Зголеми малку подлабоко сега во она што е всушност на оние Одмори плата. [Видео репродукција] -Ајде да погледнеме во она што ние едноставно видов во бавно движење. Кога еден краток пулсот на електрична енергија е испратени до читање / запишување глава, ако flips на мал електромагнетно за само мал дел од секунда. Магнет создава терен, што промени на поларитетот на ситното дел на метални честички кои палто секоја послужавник површина. Низа серија на овие мали, обвинет-ап области на дискот претставува еден малку на податоците во бинарен број систем кој се користи од компјутери. Сега, ако струјата е испратен еден начин преку читање / запишување глава, од областа е поларизирано во една насока. Ако сегашниот е испратена во спротивната насока, поларизација е обратна. Како може да се добијат податоци од хард дискот? Само јават на процесот. Така што е на честички на дискот кои се на струја во читање / запишување главата движат. Стави заедно милиони од овие магнетизирани сегменти, и имаш датотека. Сега, парчиња од една датотека може се расфрлани насекаде на диск е Одмори плата, на вид како на неред на трудови на вашиот монитор. Толку специјална дополнителна датотека следи на каде што сè е. Не сакате сте имале нешто слично на тоа? [Крај видео репродукција] Дејвид MALAN: Добро, веројатно не. Па, како и многумина од вас момци Пораснав со овие? Добро, така што е помалку и помалку раце секоја година. Но јас сум мило што си барем запознаени со нив, бидејќи тоа и нашиот сопствен книга демо, за жал, се умира многу бавна смрт тука на блискост. Но тоа е она што, барем, во грбот средно училиште, што се користи употреба за бекап. И тоа беше неверојатно, затоа што може да се сместат 1.4 мегабајти на ова особено диск. И тоа беше висока густина верзија, како што е наведено од страна на вашиот HD, кој има што значи пред HD видео денес. Стандард густина 800 килобајти. А пред тоа, имаше 400-килобајтен дискови. А пред тоа, имаше 5 и 1/4 инчен дискови, кои беа навистина флопи, и малку поширок и повисок од овие работи тука. Но вие всушност може да се види на т.н. флопи аспект на овие дискови. И функционално, тие се, всушност, прилично слична на хард дискови на на барем овој тип. Повторно, SSDs во поновите компјутери работи малку поинаку. Но ако се преселите дека малку метал табот, всушност можете да видите малку куки, или послужавник. Тоа не е метал како оваа. Оваа една е всушност некои поевтини пластичен материјал. И може да се вид на шаване тоа. И сте вистинско само збришан некои број на битови или магнетни честички од овој диск. Па за среќа, нема ништо на неа. Ако тоа нешто е во начинот на кој - и се покрива твоите очи и оние на вашиот сосед - можете да само вид на се повлече овој Целата обвивка надвор како што. Но, има малку пролет, па бидете свесни дека со твоите очи. Па сега ќе мора навистина флопи диск. И она што е извонреден за ова е дека во колку што ова е мал обем застапеност на поголема хард диск, овие работи се супер, супер едноставен. Ако изклинвам дното на тоа, сега дека дека метал нешто е надвор, и кора ги отвори, сите таму е е две парчиња почувствува и т.н. флопи диск со парче метал во внатрешноста. И таму оди половина од мојот диск е содржината. Таму оди уште половина од нив. Но тоа е сè што се вртеше во внатрешноста од вашиот компјутер во недалечното минато. И повторно, да се стави ова во перспектива, колку е голема е повеќето од вашите хард дискови, овие денови? 500 гигабајти, една Terabyte, можеби во компјутер десктоп, 2 терабајти, 3 терабајти, 4 терабајти, нели? Ова е еден мегабајт, дава или зема, кои дури и не може да се вклопат типична MP3 повеќе, овие денови, или некои слични музичка датотека. Па малку сувенир за вас денес, и исто така, да ви помогне контекстуализираме што ние ќе да се донесе здраво за готово сега во проблемот постави пет. Значи тоа се твое да го задржи. Па дозволете ми да транзиција кон каде ќе биде трошење на следните pset, како и. Па ние сме сега во собата оваа страница за - ох, неколку најави брзо. Овој петок, ако би сакал приклучат CS50 за ручек, одат на вообичаено место, cs50.net/rsvp. И финалниот проект - така на наставната програма, ние сме испратени на Конечниот проект спецификација веќе. Сфатат дека тоа не значи дека тоа е поради особено наскоро. Тоа е објавена, навистина, само за да се добие вие момци размислување за тоа. И навистина, супер значајни процент од вас ќе биде справување со конечна проекти на материјалот што го не се ни добивано и во класата, но ќе им почетокот на идната недела. Забележете, сепак, дека спецификации повикува на неколку различни компоненти на конечниот проект. Првиот, за неколку недели, е пред-предлог, прилично секојдневен e-mail на Вашиот ТФ да му каже или она што сте размислува за за вашиот проект, со не се обврзува. Предлогот ќе биде вашиот особено посветеност, велејќи дека, еве, ова е она што Би сакал да се направи за мојот проект. Што мислите? Премногу голема? Премногу мал? Тоа е податлив? И ќе видите на спецификации за повеќе детали. Неколку недели после тоа е статусот Извештајот, што е слично неврзан-маил на вашиот ТФ да каже точно колку далеку зад себе сте во вашата конечна проектот имплементација, проследено со на CS50 Hackathon кои секој е поканет, која ќе биде настан од 20:00 за една вечер до 07:00 AM следното утро. Пица, како што може да ги спомнав во недела нула, ќ бидат послужени во 09:00, Кинески храна во 01:00. И ако сте уште будни во 05:00, ние ќе ве однесе до IHOP за доручек. Па Hackathon е еден од повеќе незаборавни искуства во класата. Потоа спроведувањето се должи, и тогаш climactic CS50 саем. Повеќе детали за сите овие во неделите што доаѓаат. Но, ајде да се вратиме на нешто старата школа - повторно, низа. Па низа беше убаво, бидејќи тоа го решава проблеми како што видовме само момент пред со студентски структури добивање малку надвор од контрола, ако ние сакате да имате студент една, студент две, студент три, студент точки точка точка, некои произволен број на студенти. Па низи, пред неколку недели, swooped во и реши сите наши проблеми на не знаејќи однапред колку многу нешта на некои од типот ние би можеле да сакаат. И видовме дека structs може да ни помогне понатаму организира нашиот код и да ја задржите концептуално слични променливи, како име и куќа, заедно, така што ние можат да ги третираат како еден ентитет, во внатрешноста од кои постојат помали парчиња. Но низи имаат некои недостатоци. Кои се некои од недостатоците ние наишле со низи досега? Што е тоа? Фиксна големина - па иако може да биде во можност да алоцира меморија за низа, откако ќе се знае колку студенти имате, колку знаци можете да од корисникот, еднаш сте распределени на низата, сте вид на насликаните себеси во некој ќош. Бидејќи не можете да вметнете нови елементи во средината на низа. Вие не може да внесете повеќе елементи на крајот на низата. Навистина, ќе мора да прибегне кон создавање на цела нова низа, како што ние си дискутира, копирање на старата во новата. И повторно, тоа е главоболка која GetString се занимава со за вас. Но, повторно, не можеш ни да вметнете нешто во средината на низата доколку стапката не е целосно исполнет. На пример, ако оваа низа тука на големина шест има само пет нешта во него, Па, можете да само тактика нешто кон крајот. Но што ако сакате да вметнете нешто во средината на низа, иако тоа би можело да има пет од шест нешта во него? Па, она што го правиме кога имавме сите на нашите човечки волонтери на сцената во недели минатото? Ако сакавме да се стави некој тука, или овие луѓе како да се помести ова начин, или овие луѓе како да се помести ова начин, а тоа стана скапо. Менувањето на луѓето во внатрешноста на низа заврши додавање и чини ни време, па оттука и многу од нашите n квадрат водење времиња како вметнување вид, за пример, во најлош случај. Па низи се големи, но мора да знае однапред колку е голема што сакате. Па Добро, тука е решение. Ако не знам однапред колку студентите би можеле да имаат, и знам дека еднаш Јас одлучувам, иако, јас сум заглавен со тоа многу студенти, зошто не можам само секогаш распредели двојно повеќе простор како што можеле да помислат дека ми е потребно? Зарем не е тоа разумно решение? Реално, јас не мислам дека ние сме ќе треба повеќе од 50 слотови во низа за средни класа, па да се заокружи. Јас ќе се направи 100 слотови во мојата низа, само така што ние дефинитивно може да се добие број на студенти Очекувам да да биде во некои средни класа. Па зошто да не само се заокружи и да се распределат повеќе меморија, обично, за низа отколку што мислите вие ​​може дури да е потребно? Што е овој едноставен pushback на таа идеја? Сте само трошат меморија. Буквално секоја програма ти пишувам тогаш е можеби со користење двојно повеќе меморија, како што навистина треба. И дека едноставно не се чувствувам како особено елегантно решение. Покрај тоа, таа само ја намалува веројатноста за проблемот. Ако се случи да имаат популарна разбира еден семестар и имаш 101 студенти, вашата програма е уште фундаментално соочува со истиот проблем. Па за среќа, постои решение за оваа реклама сите наши проблеми во форма на структури на податоци кои се посложени од оние ние сме виделе досега. Ова, тврдам, е поврзано листа. Ова е листа на броеви - 9, 17, 22, 26, и 34 - кои се поврзани заедно преку од она што сум подготвен како стрели. Со други зборови, ако сакав да претставуваат низа, можам да ја направам нешто како ова. И јас ќе се стави ова на надземни во само еден миг. Јас би можеле да го направи - Здраво, сите во право. Стојат од страна. Нов компјутер тука, јасна - сите во право. Па ако имам овие броеви во низа - 9, 17, 22, 26, 24 - не мора да скала. Сите во право, па тука е мојата низа - О, боже. Сите во право, па тука е мојата низа. О, боже. [Смеа] Дејвид MALAN: се преправаат. Тоа е премногу напор да се вратиш назад и да ја поправите тоа, па таму - 26. Па ние имаме оваа низа на 9, 17, 22, 26, и 34. За оние од вас може да се види срамно грешка Јас само направи, таму е. Така тврдам дека ова е многу ефикасно решение. Сум распределени како многу ints како Ми треба - една, две, три, четири, пет или шест - и јас сум потоа се чуваат на броеви во внатрешноста на оваа низа. Но, да претпоставиме, тогаш, сакам да се вметне вредност, како на бројот 8? Па, каде се оди? Претпоставувам дека сакате да го вметнете голем број како 20. Па, каде се оди? Таму некаде во средината, или бројот 35 треба да оди некаде на крајот. Но, јас сум сите надвор од просторот. И така ова е основен предизвик на низи кои не се решение. Јас тврдеше дека пред еден миг, GetString решава овој проблем. Ако сакате да го вметнете шестиот број во оваа низа, што е најмалку една решение може да падне повторно на сигурно, исто како што го правиме со GetString? Што е тоа? Па, го прават тоа поголем е полесно, рече отколку да се направи. Ние не мора да може да се направи низа поголема, но она што можеме да направиме? Направете нова низа која е поголема, на големината 6, или можеби големина 10, ако сакаме да се понапред од работите, а потоа копирајте стариот низа во новата, а потоа ослободи стариот низа. Но она што е трчање време сега на тој процес? Тоа е големо O на n, бидејќи копирање се случува да ве чини некои единици на време, па не е толку идеален, ако ние треба да додели нова низа, која ќе да се консумираат двапати повеќе меморија привремено. Копирате старите во нови - Мислам, тоа е само главоболка, која е, повторно, зошто ние напиша GetString за вас. Така што можеме да го направите наместо неа? Па, што ако нашите податоци структура всушност има празнини во неа? Да претпоставиме дека јас се релаксираат мојата цел на постоење на соседни парчиња на меморија, каде што 9 е веднаш до 17, што е Веднаш до 22, и така натаму. И претпоставувам дека 9 може да биде над тука во RAM меморија, и 17 може да биде над тука во RAM меморија, и 22 може да биде над тука во RAM меморија. Со други зборови, не ми требаат дури и назад да се врати повеќе. Јас само треба некако да се нишка игла преку секој од овие броеви, или секоја на овие јазли, како што ќе се јавите на правоаголници како што сум ги нацртано, да се сеќавам како да стигнете до последната како јазол од првиот. Значи она што е програмирање конструкција видовме неодамна со која се може да се спроведе таа тема, или подготвени тука, со која можам имплементираат оние стрели? Па покажувачи, нели? Ако не ги распредели само int, но еден јазол - и од страна на јазол, јас само значи сад. И визуелно, мислам правоаголник. Па еден јазол очигледно треба да содржи две вредности - на int себе, а потоа, како имплицирани од на долниот дел на правоаголник, доволно простор за Инт. Па само размислување напред тука, колкав е овој јазол, овој сад во прашање? Колку бајти за int? Веројатно 4, ако тоа е иста како и обично. А потоа колку бајти за покажувачот? 4. Значи ова сад, или овој јазол, е ќе биде на 8-бајт структура. Ох, и дека е среќен случајно тоа што ние само воведе овој поим на на struct, или структура Ц. Така тврдам дека сакам да се преземе чекор кон оваа пософистицирани имплементација на листа на броеви, поврзани листа на броеви, јас треба да се направи малку повеќе размислување до пред и изјаснат не само int, но struct дека јас ќе се јавам, конвенционално тука, јазол. Ние би можеле да го наречеме нешто што сакаме, но јазол ќе биде тематски во многу од работите да се свртиме кон сега. Внатре во тоа јазол е int n. А потоа оваа синтакса, малку чудно на прв поглед - struct јазол * следната. И сликовито, што е тоа? Тоа е дното половина од правоаголникот што сме го виделе само еден миг пред. Но, зошто сум јас велејќи struct јазол * за разлика од само јазол *? Бидејќи ако тоа покажувачот е да се покажува на друг јазол, тоа е само на адреса на јазол. Тоа е во согласност со она што ние сме дискутира за покажувачи досега. Но, зошто, ако тврдам оваа структура е наречен јазол, морам да кажам struct јазол внатре тука? Токму така. Тоа е вид на глупави реалноста на В На typedef, така да се каже, не има случило досега. Ц е супер буквално. Таа го чита вашиот код врвот до дното, лево кон десно. И додека таа хитови што запирка за крајна линија, погоди што не постои како тип на податок? Јазол, цитат unquote јазол. Но, бидејќи на повеќе опширниот декларација што го направив на првата линија - typedef struct јазол - затоа што доаѓа прво, пред кадрави загради, тоа е вид на како претходна едукација ѕвекот тоа, знаеш што, ми даде struct наречен struct јазол. Искрено, не ми се допаѓа повикувајќи работи struct јазол, struct јазол сите во текот на мојот код. Но јас само ќе го користите еднаш, само внатре, така што јас може ефикасно се создаде еден вид на кружни референца не, покажувач на себе по себе, туку покажувачот до друг на идентична тип. Значи излегува дека на податочна структура вака, има неколку операции кои би можеле да бидат од интерес за нас. Ние можеби ќе сакате да се вметне во листата вака. Ние можеби ќе сакате да ги избришете од листата вака. Ние можеби ќе сакате да пребарувате на листа за вредност, или поопшто, напречни. И напречни е само стилизиран начин на велејќи почетокот на лево и да се движат сите начинот на десно. И известување, дури и со оваа малку повеќе софистицирани податочна структура, нека ме предложи дека ние може да позајми некои од идеите на изминатите две недели и спроведување на функција наречена пребарување вака. Тоа се случува да се вратат точно или лажни, што укажува, да или Не, n е во листата. Својата втора аргумент е покажувач на листата по себе, па покажувач кон јазол. Сите Одам да потоа направите е да прогласат привремена променлива. Ние ќе го наречеме кон меморија од Конвенцијата, за покажувачот. И јас ја доделите еднаква на почнувајќи од листата. И сега забележите додека јамка. Толку долго како покажувач не е еднаква на нула, јас ќе одам да проверам. Е покажувачот стрелката n еднаква на на n, кој беше донесен во? И почекајте една минута - нова парче синтакса. Што е arrow одеднаш? Да? Токму така. Па додека неколку минути, ние се користат нотација точка за пристап до нешто внатрешноста на на struct, ако променливата имате не е на struct себе, туку покажувач кон struct, за среќа, едно парче од синтаксата што конечно го прави интуитивно чувство. На стрелката значи да се следи покажувач, како и нашите стрели обично значи сликовито, и да одат на податочното поле внатре. Па стрелката е истото како точка, но го користиш, кога ќе имаат покажувач. Значи само да повториме тогаш, Ако полето n во внатрешноста на struct наречен покажувачот еднакво еднаква на n, врати вистина. Инаку, ова линија тука - покажувач еднакво покажувачот следната. Па што оваа е тоа, известување, е ако јас сум во моментов посочувајќи на struct кои содржат 9, и 9 не е број Јас сум во потрага за - Претпоставувам дека сум во потрага за n еднаква на 50 - Одам да се ажурира мојот привремено покажувачот да не укаже на овој јазол повеќе, но покажувачот стрелката, која се случува да ме стави тука. Сега, сфатив е виорот вовед. Во средата, ние всушност ќе го правиме ова со некои луѓе и со некои повеќе код со побавно темпо. Но сфати, ние сме сега ги направиме нашите податоци структури посложени, така што нашите алгоритми може да се добие поефикасен, која ќе биде услов за pset шест, кога ќе се вчита во, повторно, оние 150.000 зборови, но треба да го стори тоа ефикасно, и идеално, се создаде програма која работи за нашите корисници кои не се линеарна, не во N квадрат, но во постојана време, во идеален. Ќе се видиме во средата. Воведничар: На следниот CS50, Дејвид заборава својата база случај. Дејвид MALAN: А тоа е како ти пратам текстуални пораки со C. Што - [РАЗЛИЧНИ текстуална порака ИЗВЕСТУВАЊЕ звучи]