[Powered by Google Translate] [Недела 3] [Дејвид Џ Malan - Универзитетот Харвард] [Ова е CS50. - CS50.TV] Дозволете ми да ни ја насочи во правец на тоа каде што застанавте последен пат, кој беше почнуваат да мислат малку повеќе од околу синтакса и се обидува да се размислува малку помалку за сите дреболии кој ги зема малку време да се аклиматизирам на досега во однос на semicolons и загради и тркалезните загради, да започнете преземањето работи малку на повисоко концептуално ниво така што проблемите со кои се сега на проектот за решавање во текот на следните неколку недели се случува да се вклучат многу повеќе во повисоко ниво концептуални проблеми и малку помалку во синтаксички како што Засукајте ги ракавите и вашите раце валкани со некои од синтаксата од овие последниве неколку недели. Значи се потсетиме дека минатата недела воведовме овој поим на низа. Како и низа на англиски јазик може да се опише како што? >> [Нечујни студент одговор] Жал ми е? Една колекција од? >> [Нечујни студент одговор] >> Океј, добро. А за собирање на предмети. Значи видовме низи во нула. Ако се случи да се користи за pset 0 една од листите на гребење дека можете да влечете работи како портокали и банани во, попис на сорти, тоа е вид на како што низа е. А потоа повеќе технички, во контекст на вистински компјутер, низа е едноставно соседни парче на меморија. Со други зборови, имаш бајт, а потоа уште еден бајт, а потоа уште еден бајт, а потоа уште еден бајт, и ако сте биле за да се подготви оние бајти во слика, тие ќе се вратат назад кон назад да се врати. Тоа е она што ние подразбираме под соседни. Така, тоа е бајт број 1, а потоа 2, потоа 3. Тоа не значи до тука, тука, тука, тука. Низа е соседни парче на 0 или повеќе бајти. Па што се тие корисни за? Сеќавам имавме овој вид на смислена пример за квиз оценки чување на луѓето во програма да се пресмета вашиот квиз просек за некои разбира, и се сети дека би можеле да почнете со пишување таа програма со декларирање на променлива quiz1. Тогаш ние би можеле да имаат уште една променлива наречена quiz2. Но, тогаш, ако имало 3 квизови во оваа класа, quiz4. Или ако има неделна квиз, тоа ќе биде quiz5, quiz6, quiz7. Значи вие ќе треба сите овие променливи декларирани во внатрешноста на главниот или некаде на друго место во вашата програма, и проблемот со овој пристап, лесно иако тоа е само да копирате и залепите, тоа е само многу брзо станува огромен. Дај Боже ти всушност имаат 30 квизови или 50 квизови. Ако тоа е како средно училиште стил дневна поп квиз, тогаш едноставно мора смешно долга листа на променливи се декларирани, и тоа само многу брзо излегува од контрола. Тоа е грдо, тоа е тешко да се одржи, тоа е многу полесно да се направи печатна грешка ако добиете 1 број погрешиле некаде во вашата програма. Значи ние воведе поимот низа наместо тоа. И се сети дека ние спроведува оваа програма од тоа малку нешто како ова. Дозволете ми да одат во Извор денешната 3 Понеделник директориум и отвори низа, која ја видовме последен пат. И иако имало неколку нови C трикови тука, меѓу нив идејата за постојана, потсетиме дека го донесовме повеќе лебди во суштина со користење на оваа синтакса: плови, тогаш името на променливата, тогаш ние се користи квадратни загради навистина за прв пат, и она што го правевме во внатрешноста на оние квадратни загради е ефективно стави број. Но, наместо на ставање голем број, ја ставив оваа капитализирани збор, квизови. И она што беше мотивација за ставање на капитализирани збор како квизови и потоа со употреба на трик линија 17 е тука за да всушност даде дека бројот? Која беше мотивацијата таму? Да. [Нечујни студент одговор] >> Токму така. Ако сакаме да се смени вредност 2, ние само треба да ја промените во 1 место бидејќи се разгледа - Јас дури и не се сеќавам што оваа програма не е точно, но ако сте само го видиш гледате квизови, тестови. Гледаш квизови, тука долу повеќе квизови. Значи, ако ние не го имаат ова постојано, оваа употреба на остар дефинира, ние би го напишале 2, потоа 2, потоа 2, потоа 2, што е добро. Тоа би било исто како точни. Но, претпоставувам дека следната година имаме 3 квизови во CS50. Па морам да одам и ажурирање на кодот, јас треба да го прекомпајлирате, но проблемот е ако го направам нешто глупаво, како што се превиди 1 споменување на 2 и да заборавите да го приклучиш во 3, целата програма многу добро може да се скрши. Значи ние сме само бара неволја. Значи идејата за постојана е за сите факторинг некои парче на податоци, дали тоа е стринг или знак или плови или што, и прогласување 1 место, така што ќе се поподготвени да го промените во иднина. И тоа е, исто така, искрено, малку полесно да се прочита, бидејќи ако само мислам на тоа сега, тоа е квизови, или ние дури и може да го преименувате нешто како NUMBER_OF_QUIZZES или нешто повеќе експлицитни. Кодот само станува малку повеќе од очигледна, како на она што таа го прави, и се прашувате малку помалку она број 2 може да се случи да значи. Па постојана нема ништо фундаментално со низи. Низата беше воведена по пат на овие квадратни загради. Значи забележите дека во линија 23 ќе побара од корисникот ", беа Што вашиот квиз резултати?" Тогаш ние само ја имаат оваа јамка која очигледно го прашува корисникот за нивните оценки. Како? Тоа iterates 0-2. И велам 2 бидејќи квизови во сите настапи во моментов 2. Па тоа iterates од 0 до 2, а потоа печати Квиз # нешто од нешто, а потоа го користи GetFloat да се добие вредност од корисникот. Значи забележите ова е единствената друга нова фигура на синтаксата од минатата среда. Ако сакате да го зачувате нешто во одредена локација во таа низа, можете повторно го користите квадратни загради. Па таму е малку дихотомија тука. Првиот пат кога ќе го користите квадратни загради го користите за да одредите колку е голема дека сакате низа да биде. Но, следниот контекст тука, каде што повторно вработуваат овие загради значи, каде што во таа низа сакаш да се стави некои вредност? И разликата тука може да се заклучи од контекст. Забележете тука имаме тип на податоци, тогаш имаме името на променливата, тогаш ние имаме квадратни загради со голем број внатре, запирка. Тоа е тоа. Значи тоа е изјава. Тоа е исто како да сме го направиле нешто како плови grade1; плови grade2; но повторно, ова многу брзо devolves во премногу копирате, паста, Така, наместо ние само да го поедностават како такви, што значи отсега имаме одделение кои можат да бидат зачувани во заградата 0, имаме уште одделение кои можат да бидат зачувани во заградата 1, но што ако јас глупак и, на пример, мојата јамка оди дотаму - На пример, јас го прават овој помала или еднаква на, кој се потсетиме беше извор на претходните бубачка - која ефективно значи дека на некои трети случајно повторување на овој циклус Јас го користам заградата 2. Ефикасно, што може да се случи тука? Жал ми е? [Студент] Тоа се случува да биде заменет. >> Е тоа ќе биде заменет? Што ќе биде заменето? Ова буквално е велејќи дека го замени она што е на локација 2 со повратната вредност на GetFloat. Но, проблемот е колку е голема е низа во овој момент во приказната? [Нечујни студент одговор] >> Низата се уште е само на големината 2 поради низата, како и секоја променлива, беше прогласен за прво, пред да го користи, и ние наведени тука, бидејќи на оваа постојана дека имам 2 оценки што јас ќе одам да се стави. Но запомнете, компјутерски научници започне сметано од 0. Така првото место во таа низа е заградата 0. На следната локација е 1. Оваа работа е некогаш толку малку предалеку во текот на страна. Значи со други зборови, ако јас всушност имале оваа низа - и дозволете ми да видиме колку добро оваа соработува тука за нас - ако имам низа што јас сум едноставно подготвени како што следува и јас сум распределени простор за 2 елементи, би можел да се подготви овој вака во меморијата каде што овој голем бело платно е. Тоа е само RAM меморија имам во мојот компјутер, свирка на RAM меморија, 2 свирки на RAM меморија, што, но овие 2 кутии сега поединечно претставува плови, 32 бита. Значи, ако го ставам 1 број тука како 1,0, а потоа го ставам друг број тука како 3,2 но тогаш јас не заградата 2, тоа е како ставање нешто тука. И како на сликата сугерира, ништо нема. Тоа е вид на како ничија земја, бидејќи јас не се праша оперативниот систем да ми даде оваа трета квиз. Ако јас не го сакаат тоа третата квизот, јас треба да имаа предвидливост да побара од оперативниот систем за тоа со прогласување квизови да не биде 2 но да наместо да се изедначи 3. Значи со други зборови, сликата што ние ефективно имаат при рака изгледа вака тука. Оваа повторно е ничија земја. Подобро да не се обиде пишување вредности тука. Но, повторно, бидејќи компјутерски научници сметаат од 0, кога зборуваме за оваа локација во низа, што би требало да биде локацијата 0, ова би требало да биде локација 1, и тоа дури и не постојат бидејќи ние само побара од оперативниот систем за 2 такви места. Значи оние од вас со претходно програмирање искуство од други јазици да знаете дека ова не е секогаш случај со низи или работи вика вектори. Наместо тоа, можете само да ја задржите додавањето на и додавање на и додавање на работи кои треба да низи, која, искрено, имавме таа способност во нула и уште ни се чини дека го откажале тука бидејќи со C сте програмирање многу повеќе експлицитно. Тоа е само ти и компјутер токму сега, и компјутерот е само случува да се направи она што ќе го каже да го стори. Значи, ако само го кажам да ви даде 2 плови по пат на линија 22 тука, тоа е сите ви се случува да се вратам од оперативниот систем: простор за 2. Толку повеќе се вашите програми случува повремено да биде кабриолет во врска со низи. Ова е само вид на природата на ѕверот што сите од нас се погрешни, и во одреден момент ќе многу веројатно индекс надвор од границата на вашиот низа. И тоа е само фенси начин да се каже дека отиде во заградата нешто и нешто беше само премногу голема за голем број. Ќе отиде надвор од границите на својата низа. Но наопаку сега е тоа. Остатокот од оваа програма навистина нема ништо фундаментално врска со низи. Тоа е само за некои едноставни аритметички за компјутери просек. Значи имаме тука во овој за јамка овде прво променлива наречена сума што се иницијализира на 0. Тогаш ние iterate од 0 до 2 повторно и се додаваат на тој збир променлива на ith одделение, па заградата 0, тогаш заграда 1. И тогаш како би направиле во основно училиште да се пресмета просек, ние едноставно се земе дека сума, подели со вкупниот број на тестови, а потоа за добра мерка што ние го нарекуваме функција тука наречен круг. Сега, како настрана, она што е договорот со овој parenthetical int on-line 34? Тоа би можело да се излезе веќе во дел, не се навистина разговаравме за тоа формално тука, но она што е оваа int во parens веројатно правиш? >> [Нечујни студент одговор] Да, ова се однесува на кастинг или typecasting, што значи земање 1 податочен тип и конвертирање на друг. Вие не може да го направите ова со сите типови на податоци, бидејќи понекогаш тоа ќе биде малку чудно. Но, во овој случај, ако се врати вредноста на круг е плови затоа што, после сите, јас сум со земање на плови и поделба од страна на голем број, како 2, Одам да се врати со подвижна запирка. Но основно училиште луѓе навистина не сакаат да знаат дека нивната просечна беше 93,4 бидејќи тие ќе сфатат тие некогаш биле толку блиску до дека 95 заокружување точка. Затоа сакаме да наместо користење int да заокружуваат сите до најблискиот цел број, кој во овој случај ќе биде 94 со ниту еден момент по него. Значи тоа е само малку математички трик. И ние ќе се врати на овој поим на кастинг, бидејќи тоа ќе има последици, ако не се откриени веќе, за проблемот во собата 2. Значи низа тогаш, може да се мисли на - тоа се случува да ме насмее целиот ден. Тоа изгледа вака ако нацрта слика од неа, но клучот е дека големината е исто така избрана од Вас кога ќе го побараат тоа од оперативниот систем. Било какви прашања, тогаш на низи? Да. [Нечујни студент прашање] Ах, добро прашање. Прашањето е што се случува со нула 0 во низа? Тоа не постои во овој контекст. Дека постои само во контекст на стрингови, која ние сме за да се дојде до во само еден миг. Но, за низа, како во овој случај, сите ќе добиете е она што ве прашам на оперативниот систем за. И како настрана, за да не ова да биде јасно, Продолжувам да велејќи дека ве прашам на оперативниот систем, да побара од оперативниот систем. Оперативен систем, како што веројатно знаете, е Mac OS, Windows, Linux. Кога сте повикувајќи функции како GetFloat или сте прогласување променливи како оценки, на крајот на денот кога ќе се ефективно бара некој друг да ви даде дека меморијата бидејќи ние како аспиранти програмери немаат идеја како да се всушност физички пристап до меморијата. Но некој не: оперативниот систем. Значи покрај нас се презентира со доста икони и менија и папки и слично што го гледате на вашиот десктоп, дали Mac или PC, оперативни системи, исто така, направи ниско ниво световниот работи, високо технички работи на управување со гигабајт или 2 гигабајти на меморија што имате, менаџирање на процесорот кој го имате, и така натаму. Значи, кога сте пишување код, сте навистина hooking во вашиот оперативен систем во таа смисла. Одам да мора да се намали тоа. Во ред. Други прашања во врска со низи? Не? Во ред. Па на транзицијата природно од низи е, всушност, на тема која е малку познато. И ние погледна некогаш толку кратко на овој последен пат премногу. Ова беше стринг пример од средата. Оваа низа пример е прилично едноставна програма, и јас сум всушност поедноставен од страна на неколку линии за целите на денешниот ден. Сите тоа го прави во линија 19 е да се добие стринг од корисникот, продавници се во променлива наречена s. Потоа, во линија 22 па натаму тоа е очигледно печатење стрингот 1 карактери во линија. Но, како што го прават тоа? Ние сме за прогласување на променлива i, поставување еднакви на 0, и ова станува стара навика сега. Ние не го видел ова до среда, но можете да вид на подразбирам од своето име strlen само враќа она кога е дадена? Должината на стрингот. Значи, ако јас го помине низа, цитат-unquote Давид, тоа е се надевам дека ќе се врати да ме бројот 5, бидејќи на Давид. Значи тоа е неговата цел во животот е да се земе стринг, дали хард кодирани од вас или во овој случај вклучени како променлива, како аргумент, и фигури што должината на стрингот е. Па еве сега ние сме задолжување некои нотација од претходниот квиз пример. Ова нема никаква врска со пловки, нема ништо да се направи со квизови, но излегува дека малку бела лага ние сме ти го кажувам бидејќи недела 1 е дека низа не постои во C. А низа на крајот на денот е навистина само една низа. Тоа е низа од бајти, па бајт, бајт, бајт, бајт, кој се потсетиме е само 8 бита, така дел од меморијата, дел од меморијата, дел од меморијата, дел од меморијата. И средствата со кои серијата се спроведува е со ставање на првиот карактер тука, тогаш тука, тогаш овде, тогаш тука, да се врати назад да се врати во меморијата на компјутерот. Значи, ако си сакал да ги запишува еден збор како ЗДРАВО, ќе стави 1 карактер H, тогаш Е, тогаш L потоа L, тогаш О - 5 знаци во вкупен - некаде во RAM на Вашиот компјутер. Но клучот детали тука е дека тие ќе се вратат назад кон назад да се врати, веднаш до еден на друг. Кога кога велам е [i], што на англиски јазик е ова ми даде? Што е [i] претставуваат во овој случај? Да. [Студент] На ith карактер во стрингот. >> Токму така. На ith карактер во стрингот. Сега, јас ќе започне во 0 како на моите за телефонска линија тука, но тоа е добро, бидејќи сè започнува сметано од 0. Така е [0] ќе претставуваат писмо H во збор како ЗДРАВО, Кликнете [1] се случува да претставуваат писмо како Е со еден збор како ЗДРАВО, и така натаму. И она што го чини да се прави на секоја итерација на овој циклус е привремено чување на ith карактер во променлива наречена в, која е само знак, а потоа ние сме печатење в така што на крајот на денот што оваа програма не е следново. Ако одам во изворниот директориум а јас ја string1 и јас одам напред и да ја стартувате string1, а потоа напишете збор како ЗДРАВО, Внесете, сите тоа го прави е печати ја оваа 1 карактер во исто време. Значи има можност за прочистување тука. Јас сум вид на прави повеќе работа, иако тоа е повеќе јасно можеби овој начин, отколку што е потребно. Кој линија код овде можам веројатно фрлаат заедно? Да. Линија 24. Во линија 24 Јас сум прогласување на променлива в. Јас сум чување на ith карактер е во него, но тогаш јас сум со користење в тука. Па јас сум користење на C, па се чувствувам како да сум не само да фрли линија 24 настрана. [Нечујни студент коментар] >> Токму така. Значи, кога станува збор за зборуваме за дизајн на програми, забележите оваа мала поедноставување на кодот, што е само како може да се чита, но сфати дека е е само една променлива, нејзиниот тип на податок е низа, така е [i] е само ќе да веднаш се врати да ви о карактер во стрингот. И ако сакате да го испечатите, тоа е во ред. Вие само треба да користите% в затоа што не си печатење стринг, сте печатење лик во серијата, и тоа исто така има ефект на печатењето на ith карактер. И се потсетиме само разликата е навистина од минатата недела со користење printf е тоа што додека во неделите минатото ќе направи нешто супер едноставен како случаеви% s, тогаш името на низа тука, сега сме нуркање во малку подлабоко под хауба и велејќи: не печати низа; печатење на еден лик во него. Значи можеме да направиме нешто малку различен тука, бидејќи има 1 друга - не бубачка бидејќи оваа програма е во право, но јас го правам нешто глупаво што ги спомнав накратко во средата. Но размислување назад, колку дизајн оваа програма може да се подобри уште повеќе? Да. [Нечујни студент одговор] >> О, добро. Значи се потсетиме дека ќе воведе втор променлива наречена n последен пат, кои се чини дека се налути бидејќи мојата цел втор пред беше само да се фрлаат променлива како непотребни, но се сети дека во средата ние всушност го направи ова. Ја променив за телефонска линија за да всушност имаат запирка тука, тогаш n = strlen, а потоа овде јас не можам > [Нечујни студент одговор] >> Токму така. Јас не сум сеќавајќи strlen повторно и повторно и повторно, бидејќи се сеќавам како за телефонска линија работи. Дури и ако тие почнат да добиете повеќе комплицирано изглед, потсетиме дека нешто пред првата запирка е иницијализација, што се случува еднаш. Состојбата, сепак, е во средината, и ова добива проверуваат секој пат кога ќе одиме низ јамката. Значи тоа е вид на глупаво да се прашуваат компјутерот истото прашање повторно и повторно - Што е должината на Ало? Што е должината на Ало? Што е должината на Ало? - бидејќи како што ќе видиме денес и во среда, ова е дефинитивно случува да се земе време, и тоа не е многу добра употреба на време, бидејќи да дознаам должината на стрингот всушност потребно малку напор. Тоа не е моментален, како што е во некои јазици. Па со менување на оваа до n, цената јас плаќам е она? Ние сме сведоци трампа тука. Јас може да заштедите време со тоа што не прашуваат истото проклето прашање повторно и повторно, но тоа нема да ме чини нешто, што е она? [Студент] Вие изгуби одредена сума на меморија. >> Токму така. Тоа ќе ме чини некои меморија. Значи во овој случај тоа не чини мене што? Друг 32 бита, бидејќи n е само int, како имплицирани од зборот int тука. Но, дали е тоа во ред? Искрено, тоа е веројатно во ред, бидејќи ако мислите дека за тоа, на подолг стринг е, толку повеќе време ќе одам да се трошат бидејќи strlen се случува да се нарекува повторно и повторно и повторно за секој повторување на јамка. И овие денови, мојот Mac има 2 свирки на RAM меморија, овие денови 4 свирки на RAM меморија понекогаш. Мислам дека можат да си дозволат 4 од овие бајти за да всушност забрза работите. Но, ова ќе биде трампа и тема навистина во програмирање и во компјутерската наука на никогаш навистина станува ништо бесплатно. Ако сакате да се подобри нешто тука, ќе мора да плаќаат за тоа во друга страна некако. Простор наспроти време во овој случај. Значи ова беше сите водечки нагоре кон нешто криптичната вака, кои, како што веројатно сфатиле до сега, всушност, вели? [Нечујни студент одговор] >> Да, па ова е, не заборавајте да пиете вашиот Ovaltine, всушност користење на алгоритам наречен ROT13, Рот 1-3, што само значи ротирање сите букви 13 места, што значи земе, а потоа додадете 13 до неа и да си одат точка, точка, точка сите на патот до 13-ти писмо далеку, го прават истото за Б и Ц и за D и така натаму. И така, ако ние всушност претворање на оваа тука со промена од 13 места, ние ќе се вратам на она што имаше малку Ralphie, кој беше, не заборавајте да пиете вашиот Ovaltine. Но сега за проблемот во собата 2, во стандардниот издание барем, мора да се вид на направите тоа сами enciphering, и имаме некако да се земе во влез како овој и ја шифрира или дешифрирате. Значи кој од овие основи вид на не води до таа можност? Ајде да ги разгледаме во овој трет пример тука. Прво на сите, се вика ASCII. Што значи ASCII се однесува назад? American Standard Code за размена на информации, што е навистина долго начин да се каже што? Што е ASCII? [Нечујни студент одговор] >> Што е тоа? >> [Студент] А карактер на сајтот. >> А карактер на сајтот. Тоа едноставно мапи броеви на писмата, бидејќи во светот има стандардизирани што броевите ќе претставуваат она букви, така што сите од нас може да користат компјутери и нашите програми се сите само компатибилни кога станува збор за печатење работи на екранот. Значи се потсетиме дека 65 се случува да претставуваат, 97 се случува да претставуваат мали букви а. И така оваа едноставна програма тука ASCII е земајќи предност на фактот - дека светот знае дека главниот град е 65 - а таа е само печатење на мапирање. Па пред да нурне во овој код, дозволете ми наместо отвори прозорецот на терминалот. Дозволете ми да оди напред и да ја направат ASCII, а потоа нека е само да ја извршите оваа работа само за да ја расипам излез. И тоа само го прави ова: навистина голем табелата, што само ми кажува сите на различните кодови за сите на различните букви. Па супер едноставна програма, но јас не треба да се тешко кодот оние 52 линии на производство: 26 големи, 26 мали букви. Наместо тоа, го направив овој програмски со неколку рунди. Забележи она што го направив тука. Јас потврди од i е 65 до 65 + 26 затоа што сакав да испечатите 26 букви во англиската азбука, i + + на секоја итерација, а сега забележите ова повторно. Тоа е повторување на нашиот пријател typecasting при што ќе се конвертира 1 тип на податоци во друга затоа што сакам да се направи во оваа програма? Сакам да смета бројно бидејќи тоа е како јас пораснав броење - 65, 66, 67, и така натаму - но јас не сакаат да се печати само на броеви. Сакам да се печати на писмото проследено со број. Сакам да се печати: број, Б: број, но можам да го направите ова со исти точно променлива. Па јас испечатите% c како случаеви за лик, % D како случаеви за цифра или број. Тогаш што можам да го приклучиш во за оние 2 променливи? Јас прв пат го приклучиш во ликот еквивалент на i, а потоа печати i себе. Значи забележите ова е премногу едноставно работи. Исто како што може да фрли од плови кон int со цел да се оди од реалниот број на цел број, тука можам да одам од int на знак, што е малку чудно - сосема не планирам врз реалниот свет - но во компјутери на знак е само број под хауба, па ние сме се некогаш толку експлицитни тука на компјутер, велејќи: printf, печати не дека сум како 65, ги печатите од тоа како неговите нумерички еквивалент. И испоставува јас технички дури не е потребно тоа. Она што го правев пред еден миг е експлицитно леење со впишување она што тип на податок Сакам да си одам од и кон. Но забележите дека јас веќе имам оваа случаеви% c и оваа друга% c случаеви тука. Иако ова не е int, компјутерот ќе сфати дека знак, тоа е само int под хауба. Значи, ако јас всушност прекомпајлирате ова и повторување на ASCII програма, забележите сепак едноставно работи затоа што компјутерот ќе сфати дека постои оваа преписка. Сега, тоа е повеќе важно да се направи експлицитна кастинг во светот на плови да ints затоа што ти си, всушност правејќи пресметува одлука: фрлаат се што по децималната точка. Тука има навистина ништо да се фрли далеку, бидејќи еден лик е само број, и низа е само низа од карактери. Значи, кога станува збор време за спроведување на некои енкрипција или декрипција, како е тоа што ние всушност може да го преведе нешто како ова глупости за, Бидете сигурни да пиеш своето Ovaltine? Што ако знаеме токму сега - ајде да се земе како претпоставка - дека клучот, бројот, дека ние сме ротирачки сите од овие писма од страна, е број 13? Па отидовме од буквата Б сè до О на почетокот на реченицата, Бидете сигурни да пиеш своето Ovaltine, бидејќи ако го направам Б и тогаш ќе одам C, D, E, F, G, H, I, J, K, L, M, N, O, тоа е зошто енкрипција на буквата Б станува O затоа што само додаде 13 до неа. Значи, ако сакам да се дешифрирате ова, јас всушност треба да ги преземат O и потоа извадете 13 од него. Или, искрено, затоа што има 26 букви во азбуката, ова е прекрасно симетрична, ние исто така може само додадете 13 и ние ќе се вратам на писмото Б Но, како да одите за спроведување на вакво нешто во Цезар или навистина манипулирање жици воопшто? Ако буквата Б е она број? Што е буквата Б? Така, тоа е 66, нели? Значи, ако буквата А е 65 и буквата Б е 66, па 66, сите што треба да направите е да додадете 13 до неа, и оваа ми дава 79. И ако ние одиме за нашата мала измамник лист, 79 навистина мапи кон О Но, постои малку агол случај. Што е, да речеме, на буквата Z? Ако го правиме 66 + 25 за да се добие сè до крајот на азбуката, ние сме во 91. 91 + 13 ми дава 104, и погоди што? 104 не се изедначи со латинична буква. Да се ​​вратиме на малку измамник лист овде. Ако јас повторување на оваа програма во апаратот, напомена дека 104, ако се навратам на прозорецот на терминалот, 104 е очигледно мали ч. Значи ние треба некои клучни трик тука со цел да бидете сигурни дека кога ќе започне во Z и се додаваат 13 до тоа ние не сакаме да се задржи само фалсификување напред кон поголеми и поголеми броеви. Што ние навистина сакаме да се направи? Сакате да заврши околу. Значи испаѓа, како што видовме веројатно во делот сега или во проблемот сет спецификации се сфатив дека таму е оваа друг оператор во C, кој исто така е знакот за процент, Но, додека ние се користи% тука за да одредите случаеви, Знаеме дека, особено за проблемот сет 2, таму е исто така нешто како ова: int x = y% z. Дозволете ми да го презентира ова како многу генерички форма на ова. Процент значи она што во програмскиот јазик? >> [Студент] модул. Modulo, која е фенси начин да се каже остатокот. Иако има мало разлика со дефиницијата таму, ова значи поделба y со z, но не се врати резултатот на таа поделба; наместо тоа, го врати остатокот. Значи, ако y е всушност 3 и z е, всушност, 2, 3 поделено со 2 е 1 со остатокот од 1, Значи она што не x всушност еднакви во ова сценарио? 1. Ова е таква едноставна, ниско ниво на идеја. Потребно е малку време да се вашиот ум обвиткана околу тоа бидејќи тоа е веројатно е време, бидејќи можете дури мораше да се грижи за остатоците и всушност ги користат за нешто намерно, но во овој случај едноставниот факт дека може да одат од голем број како 3 на релативно мал број, како 2, а потоа заврши околу ефикасно со користење на остатокот на помала вредност како 1 ќе биде непроценливо трик дека можеме да го користиме и за нешто како Цезар и оваа друга работа Vigenere во проблем во собата 2, но тоа ќе биде периодично трик во текот на семестарот. Оваа едноставна, едноставна идеја на само преземање на остатокот воопшто ќе ни овозможи да заврши околу. И како што започнете ја репродукцијата повеќе со низи, како што започнете ја репродукцијата повеќе со меморијата, ова ќе станува повеќе и повеќе на еден моќен трик. Така било какви прашања, тогаш на ASCII или претставување на стрингови како низи? И ние ќе го земам 1 изрез понатаму. Да. [Нечујни студент прашање] >> Добро прашање. Што значи тоа кога една променлива има ѕвездичка пред тоа? Дозволете ми да го одложи одговарање дека во секој детал, но што се однесува до темата познат како покажувач. Совети треба да направите со меморија, и ние сме всушност денес полагање на прв чекор кон таа дискусија, но сега за сега, дозволете ми да се преправам дека ѕвездата не постои и ние ќе продолжи да повикува жици жици, наместо користење на char *, која веројатно сте го виделе пред да и јас ќе ги ставам на екранот во само еден миг како закачка. Па ние ќе се вратам на тоа во начинот на кој повеќе детали отколку многумина од вас веројатно ќе се допаѓа. Конечно, не денес. Да. [Нечујни студент прашање] Во она контекст имаш да обезбеди знак за лик? >> [Студент] Да. Значи по дифолт, кога ќе не стави +, само позитивни броеви се претпоставува. Значи, ако само напишете број 1, тоа е позитивно 1. Ако навистина сакате да наведете негација на вредност, вие буквално треба да направите -1 на вашата тастатура. Но, ова веројатно не е вашето прашање. >> [Нечујни студент одговор] Добро прашање. Во ред. Значи ова треба да се направи, јас се соберат, со некој вид на бубачка сте налетале затоа што се конвертирање на број на карактери, но некако негативност се вклучија, и така ликот само излезе munged некако. Па за сега, дозволете ми да поедноставуваат малку додека не се врати на овој вид на тема. За сега, мислам на нештата на овој начин - и ова е симплификација. Но, во светот на цел број, имате како многу делови на располагање? Имате 32 бита. И досега, ние разговаравме за вкупниот број на цели броеви што тоа може да претставува е околу 4 милијарди долари во вкупните бидејќи имате 32 бита, па тоа е 2 до 32, па тоа е околу 4 милијарди долари. Но видовме една недела или 2 пред тоа навистина не имаат опсег на броеви од 0 на до 4 милијарди долари. Опсегот наместо оди од околу негативните 2 милијарди до позитивни 2 милијарди долари. Но ова, тогаш моли на прашањето, како да претставуваат поимот негативни 2 милијарди а камоли негативни 1? За сега, можеме да поедноставуваат и речеме дека ние ќе треба да користите најлева малку на оние 32 бита, и ако тоа е 1 е негативен број, и ако тоа е 0 тоа е позитивен број. Проблемот со тоа поедноставен застапеност на негативни броеви е дека ако сте биле намерно се умен и се обидува да го конвертирате од еден лик на голем број или обратно, не постои такво нешто како негативни карактер. Во светот на ASCII, кој се користи само 8 битови, сите 8 на оние делови прашање, и најлева малку нема никаква врска со негативност. И само да биде јасно, кога велам најлева делови, потсетиме дека кога сме направиле ни малку поврзани со примери во првата недела потсетиме дека ние привлече работи како 1001101, нешто како ова. Кога велам најлева малку, јас само буквално значи 1 дека ти пишувам на целиот пат во текот на левата. Значи во светот на ликовите не постои поимот на негативност, така што најлева малку всушност има нешто да се направи со ASCII, нема никаква врска со негативност. Така што звучи како - и надвор од контекст тоа е тешко да се одговори точно - но некако, кодот е збунувачки дека најлева малку што ги претставуваат како негативна вредност кога тоа навистина беше дел од ликот во прашање. И повторно, јас сум oversimplifying бидејќи компјутери всушност направи нешто малку познавач од само промена која најлева малку до 1 за негативен предзнак наспроти 0. Тие наместо тоа, ако сте љубопитни за Google, користете нешто обично се нарекува додаток на 2, што е малку пософистициран на пристап но идејата е на крајот на истата. Значи во кратки, тоа мораше да го направи со фактот дека сте биле масажа голем број на знак или обратно, но вашиот код не беше осведомен на фактот дека 1 од тие делови имаше значење во нумерички светот. Тоа не е случај со ликот светот. Но, тоа звучи како да дефинира, во кој случај симулација сега. Други прашања. Во ред. Па досега, на сите програми што сум напишал презеле влез можеби од корисникот во форма на функции како GetInt, GetString, или ако сте биле читање напред во разни книги или онлајн референци, себе си да се користат функции како Scanf која, искрено, ние ги користиме во CS50 библиотека. Но во една недела или 2, ние всушност ќе ви покаже како библиотека CS50 се спроведува така што можеме да ги преземат тие обука тркала исклучи целосно. Но излегува постои друг начин да се добие влез од корисникот. Всушност, самите себе се користат командната линија аргументи за неколку недели. Секој пат кога имаме кандидира ѕвекот или имаме работи направи, ние не само што ја внеле ѕвекот, Внесете, не сме ја внеле направи, Enter. Што ние обично напишани по зборот ѕвекот на нашиот терминал прозорци брзо? [Студент] името на датотеката. >> Името на датотеката, нели? Hello.c или mario.c или што и соодветните името на датотеката е. И во таа смисла она што сте навистина направено се што сте под влијание на однесувањето на ѕвекот бидејќи сигурно народот кој го напиша ѕвекот немаше поим дека малку стар ви требаше да се напише програма наречена mario.c години подоцна. Па ти мораше да некако влијаат врз однесувањето на таа програма, и дека програмата ѕвекот мораше да биде напишан на таков начин што тоа може да го прифати влез од вас со додавање на зборовите на линија пред корисник хитови Enter. Значи излегува дека за некое време ние сме биле прогласување речиси сите наши програми да започне вака - int главната (празно) - а потоа ние си отиде понапред и почнав да пишувам нашиот код. И ние би можеле да имаат некои остри вклучува на врвот на датотека, но речиси сите наши програми досега почнаа со овој иако може да се гледа во делот, во книги, онлајн референци дека ова не всушност треба да бидат неважечки. Друга легитимна форма за ова да преземат е int argc, а потоа стринг avg []. Па сега што е ова значи? Излегува дека argc, што е човечки конвенција - може да се нарече ова foo, но тоа само ќе биде многу помалку јасни за читателите - argc само е аргумент на функција наречена главниот кој претставува она? Што значи argc стои за оние кои се запознаени? [Нечујни студент одговор] >> Да, број на аргументи или аргумент брои. Тоа е толку едноставно како што. Колку аргументи беа донесени на оваа програма? Што значи тоа? Ако на командната линија сум се кандидира нешто како ова - ѕвекот mario.c-- argc кога ќе притиснете ентер се случува да се земе на вредноста на, донекаде збунувачки, 2. Значи излегува дека argc е аргумент брои, но од историски причини, името на самата програма е вклучена во кои брои. Значи argc е 2 кога напишав ѕвекот mario.c. Што значи argv содржи? Прво на сите, argv изгледа како стринг, но не сосема бидејќи од минатата среда и сè повеќе и повеќе денес, овие загради означуваат што? Тоа е низа. Нема број во низа, и дека треба да се направи смисла интуитивно бидејќи луѓето кои пишуваше ѕвекот години сигурно немаше идеја колку зборови луѓе како нас би тип во конзолата пред притискање на Enter. Значи во овој случај тука тие го прогласија за функцијата главен како преземање низа на аргументите, 0 или повеќе аргументи. Тие не знаат однапред колку има, па таму е намерно внатре нема број од овие квадратни загради. Но, фактот дека квадратни загради се таму се кажува на компјутерот, очекуваат низа. Argv е само стенографија нотација за аргументот за векторот. А вектор е фенси начин да се каже низа, и низа е фенси начин да се каже листа или колекција. Значи ова само значи дека ако напишете главната вака наместо како тоа, како ние сме го прави тоа во последните неколку недели, Вашата програма сега има моќ да го прифати аргументите од командната линија така што не морате да се напише Марио, а потоа притиснете ентер, потоа внесете голем број за колку блокови високи сакате пирамида да биде, потоа притиснете Enter повторно. Ние дури и не треба да се користи GetString повеќе или GetInt или GetFloat за тоа прашање. Ние може само да очекуваме на корисникот да напишеш тие зборови во конзолата себе исто како и авторите на ѕвекот одлучија дека ќе биде навистина досадни програма ако се компајлира вашиот код прво внесе ѕвекот, притиснете ентер, тогаш ние рековме на корисникот, ве молиме внесете го името на датотеката што сакате да ги собере, тогаш напишете mario.c и притиснете Enter. Но тоа е токму она што го правеле на нашите корисници на изминатите неколку недели. Ние ги користиме GetString и чекаме додека програмата се извршува за да ги прашува за влез. Тоа не треба да биде случај. Значи во овој пример тука, сега имаме низа argv, и тоа исто така е симплификација, обука тркала дека многу скоро ќе падне. Ова е повеќе соодветен начин на пишување на оваа алтернатива декларација од главните бидејќи излегува дека она што ние го задржи повикувајќи низа всушност има ѕвезда, ѕвездичка, во нејзиниот вистински дефиниција, но ова само изгледа комплицирано, тоа е збунувачки на прв, па ние се поедностави само со создавање синоним на сорти во CS50 библиотека која мапи char * на овој повеќе user-friendly збор стринг. Значи, да всушност се обидуваат ова. Дозволете ми да оди напред и да се отвори gedit тука. Дозволете ми да оди напред и да се отвори argv на 1. Оваа програма очигледно отпечатоци на аргументи, но во англиски термини, од страна гледајќи во овој код, што значи ова не поконкретно? Ако јас тип во командната a.out foo бар, она што добива печатено во мојата црна и бела прозорецот? A.out foo бар, Enter. Оди напред. Да. >> [Нечујни студент одговор] Добро. Значи a.out, нова линија, foo, нова линија, бар, нова линија. Зошто е ова? Ние сигурно може да се потврди во само еден миг. Ова е вид на меки линија код.  Тоа само отпечатоци нова линија само да се направат нештата поубава на екранот. Ова е циклус кој е процесирањето од 0 на до argc, и ова е зголемување, на секоја итерација + +. Значи ова е сега велат печати низа, како имплицирани од овој% s. Avg [i] е прилично многу исти идеја од претходниот пример. Ние се користат да се јавите на променливата е, сега се вика, произволно, argv. Ова значи печати ith аргумент дека се напишани на командната линија, а потоа по целата оваа работа е направено, само за добра мерка печати една нова линија. Да видиме тоа. Дозволете ми да се отвори прозорецот на терминалот. Дозволете ми да ги собере argv од 1, и сега дозволете ми да се кандидира argv од 1, Enter. Hmm. Во ред. Ајде да се кандидира foo бар. Интересно. Baz. И ако некогаш сте се прашував зошто јас напишеш ова, ова е само исто така глупаво компјутерски науки конвенција. Во светот често треба само вербална placeholders за зборови. Значи, ако сакате да се зборува за некои генерички стрингови, компјутерски научници само имаат тенденција да се каже foo кога тие треба случаен збор, тогаш тие велат бар ако тие треба втор случаен збор, тогаш тие велат baz ако тие треба трета зборот, тогаш тие велат qux ако тие треба четвртиот збор, и потоа, тука е огромна религиозна дебата онлајн за тоа што доаѓа по qux, па можете да ги Google дека за да дознаам што други произволни збор треба да биде. Но овие немаат значење она, иако foo бар, ако на Google тоа, дека не има смисла, која е дел од етимологијата тука. Значи сето ова е тоа тогаш е печатењето 1 од овие низи по линија. Значи, ако јас наместо тоа, сепак, сакав да се добие малку познавач, Претпоставувам дека јас не сакам да се печати секоја низа по линија; Сакав да се печати секој карактер од секој стринг по линија. Како можев наместо направите тоа? Што ми е потребно да се промени за оваа програма ако сакам да се печати не секој збор но сакам да се печати секој збор буква по буква по буква, тогаш следниот збор буква по буква по буква? Како ние да ги комбинирате овие идеи досега? Да. [Студент]% c. >> Ред. Значи ние некаде треба% c. Добро, бидејќи не сакам да се печати целата жици, сакам да се печати карактери. Што друго? [Нечујни студент одговор] >> Интересно. Значи ние треба вид на втората димензија тука сега бидејќи мислам на argv како низа, но тоа е низа од стрингови. Но, како што на, како, 15 минути, што е стринг? Тоа е низа од карактери. Значи, навистина, argv е низа од низа на знаци, низа од низи од карактери. Значи излегува дека можеме да го користиме само повеќе квадратни загради нотации. Значи, да го направите тоа. Во врвот на оваа јамка на линија 19, ќе одам да iterate од I до argc, но потоа јас ќе одам да го направите ова: за - Не можам да го користам сега. Ми треба уште една променлива, бидејќи сакам да iterate во текот на зборови но потоа исто така во текот на буквите во зборови па јас вид на имаат вертикална оска и хоризонталната оска, вид на концептуално. Значи int j добива 0, тогаш сакам да направам ѕ додека ѕ е помалку од - и јас ќе чисти ова во малку. Како можам да iterate во текот на букви во низа? Ние направивме овој момент пред. Strlen на avg [i]. Добро. И повторно, јас сум одлуки малку неефикасност тука со тоа што не создавање n или што и да, но ние ќе се вратам на тоа. Па сега ѕ + +. Сега морам да се алинеја понатаму тука. Што ми сега сакаат да се печати на секоја итерација? [Нечујни студент одговор] >> Значи [i] ќе ми даде збор. [I] [j], како вид на матрица. Оние од вас со математика-Y средини, ние сме вид на индексирање дури и подлабоко во оваа матрица или оваа низа од низи, Оваа 2-димензионална структура. Па сега ајде да видиме што се случува овде. Дозволете ми да се отвори мојот поголем терминален прозорец. Дозволете ми повторување направи на argv на 1. И јас сум зезнав тука, што е добра лекција, бидејќи јас заборавив да го направите тоа. Имплицитно наведува "strlen" C библиотека функција со непотпишана тип '- Јас дури и не знаат што остатокот од тоа средство, но сум видел оваа пред тоа, имплицитно прогласување. Секогаш кога ќе ја видите оваа грешка, што значи ова обично значи? [Нечујни студент одговор] >> заборавив библиотека до врвот. Но, чекајте. Обично сум зезнав, бидејќи јас заборавив CS50 библиотека, но тоа е таму. Обично сум зезнав, бидејќи јас сум заборавил стандард I / O. И искрено, јас дури и не треба ова. Ние не користите GetString денес. Па што сум јас недостасува? Има уште една библиотека која сега треба да се користи повремено се нарекува string.h, и ова е само уште една библиотека која има повеќе функции кои не се во стандарден I / O. Значи, да се вратиме на мојот голем терминален прозорец. Во ред. Сега, по ѓаволите, претпоставувам дека не е во ред. Јас бев со користење на CS50 библиотека. Значи можеме да го надминете овој во кој било од 2 начини. Можеме да ги преземат обука тркала надвор право сега и едноставно го направите ова, или вид ајде на задржи тоа поедноставување само за сега, ставете ова назад во, се реши тој проблем, а сега да се вратиме на прозорецот на терминалот. Така да биде јасно, во библиотеката CS50 не е само функции, тоа е исто така клучен збор стринг, која е причината зошто таа грешка едноставно се случи. Значи тука ќе одиме. Јас фиксна и на библиотеката прашања. Enter. Добро. Argv од 1, foo бар, Enter. Одличен. Така, сега имаме секоја буква од секој збор печатени 1 на линија, кои не го прават за многу интересна програма, но известување сега ние имаме способност не само на процесирањето преку зборови но исто така и преку индивидуални букви во зборови, што звучи страшно познато дури и за наједноставните апликации како scrambling букви во низа се допаѓа ова. Ајде да одиме напред и да ни го одземе 5-минутна пауза тука. И кога ќе се вратиме, ќе почнам да зборувам за ефикасноста со кои можеме да го направиме овие работи подобро. Во ред. Ние сме назад. Благодарение на еден од нашите TFS кој игра многу bananagrams, ние всушност имаат еден куп на карактери со нас тука денес физички инкарниран со овие мали пластични делови, и дозволете ми предложи дека оваа празни бели чеша тука претставува RAM меморија во мојот компјутер - лаптоп, десктоп, што - и изгледа како многу од тоа затоа што ако почнеме сечкање до овој RAM меморија во мали бајт големина парчиња, ајде произволно да се каже дека нешто што големината и дека матно претставува - таму ќе одиме, и ајде да одзумирате малку тука - да речеме нешто што големина претставува еден бајт. Па ние навистина може да се соберат целиот куп на бајти или карактери во внатрешноста на оваа меморија, како што е предложено од страна на релативната големина тука. Па претпоставувам дека сега целта е да се алоцира меморија за низа. Како го прави ова всушност работат? Во програмите ние сме пишување, ние обично користат GetString, но сега, јасно, не е тоа друг канал преку кој може да се добие корисник влез во argv преку командната линија аргументи. Но, она што навистина се случува под хаубата? Излегува ако ние го нарекуваме - ајде дојдете назад кон GetString - функцијата GetString во библиотеката CS50, корисникот е прашани за стринг, корисникот видови во некои збор - да ја наречеме Здраво. И ние сме биле велејќи дека во изминатите неколку недели дека повратната вредност на GetString е всушност низа, како зборот Здраво. Но, она што е GetString навистина прави? Како корисник видови во ЗДРАВО, Внесете, GetString се пронајдат, океј, колку знаци е ова? Ова е H-Е-Л-Л-О. Па затоа треба да се распредели, таа треба да побара од оперативниот систем - Линукс во овој случај - најмалку 5 бајти за чување Здраво. И она што потоа продолжува да се направи откако ќе се врати оние 5 бајти од оперативниот систем е да нокаутирам ЗДРАВО да се врати назад да се врати да се врати. И така она што е навистина се вратија од GetString е парче на податоци што личи ова. Но, ова е малку непрецизен затоа што излегува дека тоа не е толку едноставно како само чување ЗДРАВО во меморијата на компјутерот бидејќи претпоставувам дека мојата програма што го пишувам во C тогаш повици GetString повторно, и следниот збор на корисникот видови во е Bye, bye. Па, јас треба да одговара тој збор BYE некаде во меморијата. Не можам да напердашвам Здраво. На пример, не сакам на компјутерот само да започнете пребрише вака оригиналниот збор, бидејќи јас се уште може да се употребува зборот ЗДРАВО во променлива некаде на друго место во мојата програма. Значи Б-Y-E мора да заврши некаде на друго место во меморијата. Но, на конвенцијата обично е дека следната низа ќе одвои веројатно, но не секогаш, се случува да се заокружи во следниот достапни мемориска локација. И ако не сум побара од оперативниот систем за било која меморија откако последен пат се јавив GetString, шансите се на зборот BYE се случува да се заокружи веднаш по зборот ЗДРАВО во меморијата. Но, во овој момент можеби може да се види каде потенцијален проблем се јавува. Бидејќи следниот делови од меморијата, следниот бајти кои беа само бесплатно - чисти бели чеша - во меморијата на компјутерот беа веднаш до ЗДРАВО, се чувствува како прв стринг прашав за да одеднаш сега се промени бидејќи јас сум во суштина се промени до HELLOBYE наместо некако demarcing почетокот на BYE и на крајот на ЗДРАВО. Значи излегува дека она што е навистина се случува под хауба, која може да се крие во онлајн референци или дел или книги или воопшто не само уште е дека постои всушност намерно демаркацијата меѓу зборовите во меморијата на компјутерот. И всушност, во овој случај тука, наместо само да ги ставите BYE веднаш до ЗДРАВО, наместо тоа, на компјутерот става посебен карактер, специјални null карактер, така да се каже, која е претставена со маркер со обратна коса црта 0. Па скратам приказната, да се потсетиме дека ликовите се претставени во ASCII. ASCII е само мапирање помеѓу броеви и букви, и повеќето од тие писма започне околу 65 за капитални А, но излегува сигурно може да претставува број 0 како цел број или во бинарна, и испоставува светот одлучи долго, многу одамна, "Знаеш што?" "Ајде резерва бројот 0 како не претставуваат никакви знаци на тастатурата - "Не букви, без броеви, без интерпункција. 0 е посебен." "Тоа ќе биде посебен null карактер, и ние ќе го напише како \ 0". Разликата е во тоа ако ние едноставно напиша 0, 0 е лик. Потсетиме дека постојат ASCII кодови за 0, за 1, за 2, за 3 бидејќи карактерот 0 е различен од бројот 0. И можете да видите дека ако се погледне назад од недела 1 кога првпат зборуваше за ASCII, 0 и 1 и 2 и 3 на целиот пат до 9 имаа свои ASCII кодови. Тие не се случајно, 0 до 9. Тие се многу различни. Значи 0 едноставно значи "Јас сум посебно" и \ 0 значи, буквално: "Јас не сум 0 карактер." "Јас сум оваа посебна вредност, на нула карактер." Па јас всушност треба уште една од овие, бидејќи јас не може да ја направи истата грешка двапати. Значи по зборот BYE ние сме, исто така, ќе треба уште една од овие нула карактери. Дозволете ми да го дофати ми пенкало овде и дозволете ми да брзо привлече друг \ 0 така што по сум ги распрашувала оперативен систем за 2 жици преку GetString проследено со уште еден повик да GetString, тоа е она што е, всушност, во меморијата. Значи, кога ќе се вратам низа, јас сум навистина добивање назад тоа, и кога ќе го добиете следниот стринг, јас сум навистина добивање назад тоа. Значи ова моли на прашањето, strlen, прв од сите, она што треба да се врати? Кога ќе се јавам strlen на стрингот s и ги беше зборот ЗДРАВО дека корисникот ја внеле во, што не ние очигледно дека должината на ЗДРАВО беше неколку минути? Тоа беше 5, нели? H-Е-Л-Л-О. И тоа е навистина како strlen дела. Го враќа она што нормално човечко суштество би очекувале должината на стрингот да биде. Но, во реалноста, колку е голема е низа од знаци кои се чување здраво? Тоа е всушност 6. Значи strlen не се спомене дека фактот за вас. Но под хаубата на компјутерот е навистина користење на 6 бајти за чување на 5-писмо збор, и ова е вистина без разлика колку долго зборот. Има секогаш ќе биде посебен нула раскинувањето карактер на крајот од стрингот да demarc неговата вкупна должина. Па тогаш ако сте сега лицето спроведување strlen 20, 30 години, како да одите за спроведување strlen себе? Земаме здраво за готово дека тоа постои, исто како и ние земаме здраво за готово дека printf постои, но ако ЗДРАВО е зборот во прашање и она што го имам во меморијата е нешто што личи ова, ако мораше да reimplement strlen затоа што беа замолени да или затоа што, искрено, не сте знаеле strlen постоеле - ти мораше да се тркалаат ова на свој - како може да се спроведе strlen кога се дава нешто што личи ова? Сега кога знаеме низа е низа, може да iterate преку секоја од индивидуални ликови користење на нешто како - Да се ​​обидеме да го направите тоа на мува. Дозволете ми да одат во апаратот. Дозволете ми да се создаде новата датотека, strlen.c. Дозволете ми да одат напред и сега ги вклучуваат stdio.h така што имаме пристап до printf. Дозволете ми да се направи int главната (празно). О. Јас само ќе го направите ова на мојот сопствен сега за сега тогаш. [Chuckles] Ви благодариме. Тоа е она што јас го правам. Во ред. Значи пред се свртев на екранот, јас внесе сето тоа. И сега што јас ќе одам да направите е следново: printf ("Дај ми стринг:") Тоа е само меки инструкции. Сега дозволете ми да го направите = GetString стринг е. Јас веќе треба да се направи промена сега. Јас сум со користење на CS50 библиотека одеднаш, па дозволете ми да оди напред и да напишеш во cs50.h. И сега ајде да го направите ова: printf ("Должината е:% d, strlen [S] - и јас не сум направиле досега. Што друго можам да додадете на оваа програма? [Студент] string.h. >> String.h. Па за сега, ние сме со користење strlen, па ајде бидете сигурни дека на компајлерот не знае каде е тоа, па малку здрав разум се провери. Јас сум добивање на стринг во алинеја 8, а во алинеја 9 Јас сум печатење нејзината должина со% d. Значи, да оди напред и да се отвори ова. Имаме направи strlen - компајлира во ред - strlen - дозволете ми да зумирате - Enter, Н-Е-Л-Л-О, Enter. Должината е 5. Океј, па strlen изгледа да се работи, но светот го знаев тоа. Па ајде сега спроведе strlen се како што следува. Дозволете ми да ја искористам оваа библиотека далеку. Ние веќе не имаат пристап до string.h бидејќи јас дури и не знаат дека тоа постои. Но, тоа е во ред затоа што може да се спроведе strlen себе и да го имаат се низа наречен влез, и сега јас треба да дознаам должина на овој стринг. Па како можам да го направите ова? Што ако го направам - да видиме како да го направите тоа - Што сакате да правите? [Нечујни студент одговор] >> Океј. Значи можеме да го направите ова во еден куп начини. Дозволете ми да се обиде да се земе овој пристап. Дозволете ми да се даде int променлива i, па започнува од 0. И дозволете ми да кажам ова: додека влез [i] не е еднакво на што? \ 0. Така што се испоставува, како во случајот со сите знаци кога ги пишувам буквално во програмата, мора да се користат единечен наводник не двојни наводници. Значи, ако јас се пишување на писмо, јас би го сториле тоа, буквата b би го сторил тоа. Ова, пак, ќе биде стринг, а не индивидуален карактер. Па сакам \ 0 буквално. Што сакам да се направи во овој циклус? Всушност, ми треба друга променлива, па int должина добива 0. Дури и ако не се сигурни зошто почнавме начинот на кој ние не, сега дека ние ќе надолу овој пат, она што сакам да го направите on-line 9? должина + + и потоа надолу тука на 10 линија, враќање должина. Па, како е strlen спроведува? Тоа е всушност спроведени веројатно се допаѓа ова. Можеби лицето користи за телефонска линија, можеби не додека јамка - кој знае? Ние навистина ќе треба да се погледне под хауба на вистински изворен код во некои фајл наречен string.c веројатно. Но, тука ајде да размислиме за она што го правам. Јас сум прогласување на променлива наречена i, поставување еднаква на 0. Јас сум потоа прогласување друга променлива наречена должина, поставување еднаква на 0. Тогаш јас велам, додека о лик во влез не е еднаква на специјални null карактер, \ 0, зголемување на должината. Но, штом ith карактер е тоа посебен карактер, што се случува со јамка? Тоа кратки кола. Се запира, што значи дека потоа веднаш се врати должина. Значи, ако јас не се плеткаш, ајде да одиме напред и да се вратам на мојот терминален прозорец. Дозволете ми да прекомпајлирате. И јас не ја зафркнам. Некомпатибилни redeclaration на библиотека функција strlen. Значи јас се обидував да се премногу паметни за моето добро тука. Компајлерот всушност не знае дека постои функција наречена strlen иако не сме вклучени во библиотеката. Тоа е во ред. Сеедно. Ние сме само ќе да соработуваат тогаш. Ајде да ја преименувате оваа должина. Дозволете ми да се промени употребата на тоа да должина тука, а тоа ќе го направи ѕвекот посреќни. Како настрана, бидејќи некои од овие функции се толку ебам заедничко - strlen, prinf - тие всушност имаат вид на специјален статус. И така ѕвекот само знае малку нешто посебно за нив. Тоа не е секогаш случај со повеќето функции, па затоа ние се викна на. Дозволете ми да се обиде повторно. За среќа, таа работеше тоа време. Па сега дозволете ми да се кандидира мојот strlen програма. Дај ми стринг: H-Е-Л-Л-О, Enter. И јас се зезнав. Зошто? >> [Нечујни студент одговор] >> Токму така. Значи имам себеси тука многу убав бесконечна јамка бидејќи иако сум зголемување, должината на секоја итерација, она што сум јас не е јасно тоа? Јас не сум јас зголемување,. Во ред. Лесно Фикс. Да? Во ред. Бр Сега ние ќе се кандидира судир на некои други вообичаени грешки кога ми треба голема заграда. И искрено, овој код почнува да изгледа грдо, па ние ќе земе прободе во чистење на ова во еден момент. Но, сега сум зголемување, двете должина и јас. Искрено, јас веќе гледаат можност за подобрување тука, но ние ќе се вратам на тоа. Па сега ајде да бидете сигурни дека ние сме најмалку напредок. Ова се случи на неколку од вас, и јас запоставени да се спомене и тоа однапред. Кога имате несреќата на сценарио како ова, како да го надминете овој краток за рестартирање на апаратот или на вашиот компјутер или затворање на прозорецот? Тоа е всушност лесно. Контрола Ц ќе испрати оваа мала морков симбол C и дека само престане повеќето програми. Ако имате навистина лоша бесконечна јамка што се печатење работи бесконечно многу пати, понекогаш можеби ќе треба да ја погоди контрола Ц илјада пати да се направи тоа го слушаме. Па само се реализира сега, бидејќи јас не сум печатење ништо, тоа беше прилично лесно. И технички, еднаш е доволно, но јас се нетрпеливи и јас обично го погоди тоа што многу пати. Значи strlen. Дај ми стринг: ЗДРАВО. Е тоа ќе функционира овој пат? Во ред. Друга вообичаена грешка. Мора да прекомпајлирате. Тоа беше намерно, дека еден. Во ред. Значи strlen, H-Е-Л-Л-О, Enter. Одличен. Па сега имаме strlen до 5. Значи имаме буквално reimplemented дека тркалото. Па сега ајде да чисти ова, бидејќи тоа не ме импресионираше со дизајнот на мојот код. Што може да ние јасно елиминира во оваа програма да се чисти ова? [Нечујни студент одговор] >> Да. Буквално, ние сме лекување на i и должина идентично. Па зошто да не само да се паметни и да каже, додека должина? Наместо тоа, ајде да го наречеме должина да започне со тоа, се иницијализира до 0 затоа што по дифолт низата нема должина додека не дознаам што е тоа. Сега ние го направите ова, и сега ова е прилично елегантен програма. Една променлива. Ми се исчистени, стеснети до. Па сега ајде да се вратиме на мојот терминален прозорец. Ајде да одиме напред и да ја извршите оваа. Направете strlen. Изгледа добро. Стартувај strlen повторно Enter. Дај ми стринг: Здраво, Ентер. И се чини дека се работи како 5. Сега, да биде јасно, ако не го напишал, на пример, ЗДРАВО во 1 стринг а потоа BYE во друга, ние сигурно може да имаат повеќе зборови. Ако изразот Јас всушност сакаше да напишеш не беше ЗДРАВО но, на пример, Здраво светот, известувањето дека она што ние не би имале е оваа ситуација тука, нели? Тоа би укажуваат на тоа дека тоа е 2 жици. Сигурно може да имаат простор бар карактери, па ако ние всушност ја внеле во еден подолг фраза како Hello World, она што навистина ќе мора во меморијата изгледа малку нешто слично таму. Во ред. Било какви прашања, тогаш за застапување тука на жици? Не? Во ред. Па јас реков претходно дека повикува strlen повторно и повторно намерно, како што веројатно не е најдобра идеја, бидејќи ви се случува да се прави едночудо на работа повторно и повторно и повторно. Всушност, она што вид на работа е потребно за да пронајдат должината на стрингот, очигледно? Мора да почне на почетокот и потоа да се погледне, погледнете, изгледа, погледнете, погледнете додека конечно да се види дека посебен карактер, на која точка, ах, сега знам на должината. Па порано кога имавме strlen се нарекува повторно и повторно и повторно, причина јас предложи беше глупаво е затоа што повторно, дека изгледало како тоа. Тоа нема да се промени секој пат кога ќе iterate преку некои јамка, па правиш непотребни работи. Во исто време, ви треба да знаете, како настрана, дека компајлери како ѕвекот овие денови се развиени во текот на многу години, и компајлерот писатели, програмери, се прилично паметни. И така излегува дека ѕвекот и други компајлери всушност може да дознаам дека, во ред, да, ти напиша strlen во вашата состојба, која технички значи дека ние ќе го наречеме повторно и повторно и повторно. Но паметни компајлерот всушност може да се оптимизира оние видови на сиромашните корисник одлуки од вашиот код да се поправи работите. Значи не само сфатат дека понекогаш компајлер е попаметен од нас и вид на ќе ги кријат нашите сопствени грешки. Но секако кога станува збор за проблем поставува и слично, да се размислува за оние фундаментално погрешни дизајн одлуки потенцијално од проста причина што ние би се прави начин повеќе работа отколку што навистина треба да направите. Но, колку повеќе работа? Во случај на Hello World, да почнеме да се генерализира на големината на овој проблем. Што е должината на проблем или големината на проблемот кога зборот на корисникот внесе во е ЗДРАВО? Тоа е очигледно 5, можеби 6. Плус или минус 1. Сеедно. Тоа е толку блиску ние само ќе го наречеме 5. Значи она што е големината на проблемот тука кога се обидувам да дознаам должината на Ало? Тоа е 1, 2, 3, 4, 5, а можеби и 6 за последниот карактер, но, ајде да се генерализира дека како n. Значи n, само променливата n, е она што компјутерски научници обично ќе го користи за да се опише големината на проблемот, а проблемот на дофат на раката е колку долго е ЗДРАВО? Колку време strlen земам? Таа ги зема од редот на n чекори, каде што секој чекор значи поглед на карактерот, погледне во карактер, погледнете карактер. И имавме оваа дискусија некое време назад, бројот на операции нешто потребно. На првиот ден на класа имавме сите чудно застане, а потоа сите почнаа спарување надвор едни со други со цел да се всушност смета идеално колку луѓе се наоѓале во просторијата. И ние исто така, направи уште една работа која ако јас наместо тоа го правеше старата школа начин на само почетна 1, 2, 3, 4, 5, 6 и така натаму, и тоа, големината на тој проблем беше со големина n. Имаше n луѓе во собата. Но можев да го забрза дека до, нели? Основно училиште стил би можел да почне пребројување во 2s. 2, 4, 6, 8, 10, 12. И дека се чувствува толку многу побрзо, и навистина е тоа. Тоа е буквално два пати толку брзо, но повторно, ако уште 400 луѓе влезе во оваа соба сите одеднаш, тие алгоритми ќе преземе уште 400 или можеби 200 чекори. Но, од друга страна, ако ние навистина се паметни и ние наместо да ги имаат сите од себе си брои, се потсетиме како тоа алгоритам работи. Вие сите станав. Дозволете ми да брзо напред кон ова. Вие сите застана, можете поврзан исклучите, а потоа половина од вас седна, половина од вас седна, половина од вас седна, и на секоја итерација на овој циклус од недела 0, ние преполовен проблемот на дофат на раката и отиде до n / 2, потоа n / 4, тогаш n / 8. И импликација на тоа е дека ако уште 400 луѓе одиме во соба, не е голема работа, ќе ни требаат уште 1 круг, а не уште 400 круга, а не 200 повеќе круга. И така приказната што изјави пред извесно време мораше да се направи малку нешто со тоа. Ова црвена линија, тука е линеарна, тоа е право, а тоа е етикетиран како N затоа што е големината на проблемот расте, ако вашиот алгоритам или програма со која сте решавање е потребно n чекори, можеме да го прикажат како права линија, каде што е потребно повеќе време поголеми од големината на проблемот. И twosies пристап, сметајќи 2, 4, 6, 8, сеуште права линија, само малку подобро. Таа ги зема малку помалку време, па жолта линија е под црвената линија точка за точка. Но, дури и подобро беше ова светиот грал на она што се нарекува логаритамска време каде што дури и ако повторно го удвои бројот на луѓе во собата, ние двојно големината на тој телефон книга од првиот ден на класа, не е голема работа, тоа трае уште 1 страница солза, зема уште 1 седнува со цел да се реши проблемот што е двапати поголема. И така разговорот ние сега се дојде до почнете да имаат се како ние всушност ги реши проблемите ефикасно ако земеме предвид наједноставните проблеми како овој? Да претпоставиме дека имаме 8 вратите зад кои се некои броеви, и секоја од овие броеви не се подредени во било кој начин, тие се само случајни броеви зад овие врати, и ние го поставуваме прашањето, како да одите за наоѓање на број - кој знае - 7 зад овие врати? Што би, човечко, се направи со цел да ме најде бројот 7 ако повторно секој од овие се врати и да ја видите вредноста што треба да се отвори вратата? Што вашиот алгоритам ќе биде можеби? [Нечујни студент одговор] >> Па почнете со левото и да се отвори вратата, ја отвори вратата, се отвори вратата. И во најлош случај, колку долго е тоа ќе не однесе да се најде бројот 7? И повторно, тие не се решат, па тоа не е лесно како, добро, јас ќе одам да ја отвори 7 вратата. Тоа би можело да ни се земе, максимално, 8 чекори. Во најлош случај, 7 е случајно на самиот крај на линијата на вратите, па ние можеби ќе мора да се обиде сите n врати. Значи повторно тука, ние се чини дека имаат еден линеарен алгоритам. Всушност, ние го сторивме тоа само неколку години. Еден од вашите претходници беше оспорена токму со оваа каде што не има дигитална верзија, наместо имаше табла со некои парчиња хартија на неа. И она што мислев дека сум би направите е да се земе брз поглед назад во тоа како отиде, еден од најдобрите а можеби и повеќето непријатно можности на сцената да има демонстрација токму тука на Сандерс. Имавме 2 реда на броеви. Ние сме само ќе се погледне во она што се случува тука со Sean за врвот на овие редови. Освен ако никој никогаш повторно волонтери во CS50, имавме благословот на Sean да се задржи ова на камерата, па тој знае дека стотици луѓе се гледа ова сега со години. Но, Шон направи една неверојатна работа - или не тој - во, всушност, ни се најде одреден број. Да видиме како тој реши овој алгоритам, така што ние ќе продолжиме овој разговор пред долго за тоа како ќе најдеме работи ефикасно. [Malan на видео] имам скриен зад овие врати на бројот 7, но подвиткано далеку во некои од овие врати, како и други не-негативни броеви, и вашата цел е да се мисли на оваа горниот ред на броеви како само низа или само низа од парчиња хартија со бројки зад нив, и вашата цел е, само користење на врвот низа тука, ми се најде бројот 7. И ние сме тогаш ќе критика како да одите за тоа го правам. >> Ред. [Malan] ни се најде бројот 7, те молам. [Смеа] [Malan] Не [смеа] 5, 19, 13, [смеа]. Тоа не е трик прашање. 1. [Смеа] Во овој момент вашиот резултат не е многу добра, па што би можело да продолжувам да одам. [Смеа] 3. Оди на. Искрено, не можам да им помогне, но се прашувам што сте дури и размислува за. [Смеа] Само горниот ред, па имаш 3 лево. Значи ме најдеш 7. [Студенти мрморејќи] [Malan] 17. [Студенти мрморејќи] [Malan] 7! [Аплауз] Така во средата ние ќе се нурне во оваа и повеќе софистицирани алгоритми за наоѓање нешта. Сега за сега ние ќе те оставам со Шон и да видиме што во средата. [CS50.TV]