Роб BOWDEN: Здраво, јас сум Роб Бауден, и ајде да зборуваме за quiz0. Значи, првото прашање. Ова е прашањето каде што ви е потребно да се кодот на бројот 127 во бинарното светилки. Ако си сакал, би можеле направите редовните конверзија од bi-- или, од децимални на бинарни. Но, тоа е веројатно нема да се земе многу време. Мислам, можете да дознаам дека, Добро, 1 е таму, 2 е таму, 4 е во таму, 8 е во таму. Полесен начин, 127 е 128 минус еден. Дека најлева сијалица е 128-битна. Па 127 е навистина само сите на други светилки, бидејќи тоа е најлевата сијалица минус 1. Тоа е тоа за тоа прашање. Прашање еден. Значи со 3 битови може да претставуваат 8 различни вредности. Зошто, тогаш, е 7 најголемата ненегативни децимални цел број може да се претставуваат? Па, ако ние може само претставуваат 8 различни вредности, тогаш она што се случува да биде застапување е од 0 до 7. 0 зазема една од вредностите. Прашање две. Со n битови, колку различни вредности може да ви претставуваат? Значи, со n битови, имаш 2 можни вредности за секој бит. Значи имаме 2 можни вредности за првиот бит, 2 можни вредности за вториот, 2 можно за третиот. И така тоа е 2 пати 2 пати 2 и на крајот одговорот е 2 на n. Прашање три. Што е 0x50 во бинарен? Па се сеќавам дека хексадецимален има многу јасна конверзија на бинарни. Па еве, ние само треба да се погледне во 5 и 0 независно. Значи она што е 5 во бинарен? 0101, тоа е 1 бит и 4 малку. Што е 0 во бинарен? Не незгодно. 0000. Па само ги стави заедно, и тоа е целосна број во бинарен. 01.010.000. И ако си сакал да можеш полетување дека најлева нула. Тоа е ирелевантно. Па тогаш алтернативно, она што е 0x50 во децимална? Ако сака, може could-- ако сте повеќе удобно со бинарни, може да се земе дека бинарни одговор и конвертирате дека во децимала. Или ние може само да се сеќавам дека хексадецимален. Така што 0 е во 0-то место, а 5 е во 16 да се на прво место. Па еве, ние имаме 5 пати 16 до прво, плус 0 пати 16 до нула, е 80. И ако сте го гледаше во Наслов на прашањето, тоа беше CS 80, кој беше еден вид на алудираат на одговорот на овој проблем. Прашање пет. Имаме оваа гребење скрипта, која е повторување 4 пати путер од кикирики желе. Така како ние сега кодот кој во Ц? Па, ние here-- имаат дел во задебелени букви е само дел ќе мораше да се спроведе. Па ние имаме 4 јамка што е looping 4 пати, printf-ИНГ путер од кикирики желе, со нова линија како проблем бара. Прашање шест, друг гребење проблем. Гледаме дека ние сме во засекогаш јамка. Ние сме велејќи дека променливата i и тогаш јас incrementing од 1. Сега сакаме да го направите тоа во C. Има повеќе начини би можеле да го направи тоа. Еве ние се случи да се шифрираат засекогаш јамка како додека (вистинска). Значи ние се изјасни променливата i, само како имавме променлива i во гребење. Прогласи променлива i, а засекогаш додека (вистинска), велиме променливата i. Значи printf% i-- или можете да сум користел% d. Велиме дека променлива, и тогаш тоа зголемување, јас ++. Прашање седум. Сега ние сакаме да се направи нешто многу слично на Марио точка в од проблемот постави еден. Ние сакаме да се печати овие hashtags, ние сакаме да се печати пет од страна на три правоаголник на овие хашови. Па како можеме да го направи тоа? Па, ние ви даде целата куп на код, а вие само мора да се пополни во печатените мрежа функција. Значи она што не PrintGrid изгледа? Па ти си минато ширина и висина. Па ние имаме надворешен 4 јамка, што е looping во текот на сите од редовите на овој мрежа кои сакаме да ги испечатите. Тогаш имаме интер-вгнездени 4 јамка, тоа е печатење над секоја колона. Значи за секој ред, ние печати за секоја колона, еден хаш. Потоа на крајот на редот се печати една нова линија за да отидете на следниот ред. И тоа е тоа за целата мрежа. Прашање осум. А функција како PrintGrid се вели дека имаат пропратен ефект, но не враќање вредност. Објаснување на разликата. Значи ова се потпира на вас сеќавајќи она што пропратен ефект е. Па, враќање value-- знаеме PrintGrid не има повратната вредност, бидејќи Овде пишува неважечки. Па ако нешто се враќа неважечки навистина не се врати ништо. Значи она што е пропратен ефект? Па, пропратен ефект е нешто што вид на опстојува по функција краја тоа не беше само што се врати, и тоа не беше само од влезови. Така, на пример, ние може да промени глобалната променлива. Тоа ќе биде пропратен ефект. Во конкретниов случај, многу важно пропратен ефект печати на екранот. Така што е пропратен ефект дека PrintGrid има. Ние печати овие нешта на екранот. И може да се мисли на дека како пропратен ефект, бидејќи тоа е нешто што продолжува по оваа функција завршува. Тоа е нешто надвор од опсегот на оваа функција која на крајот се менува, содржината на екранот. Прашање девет. Размислете за програмата подолу, на која линија броеви се додадени за доброто на дискусијата. Значи во оваа програма ќе се само повикувајќи GetString, чување на тоа во оваа променлива s, а потоа печатење таа променлива е. ОК. Така објасни зошто линија е присутна. # Include cs50 точка ч. Зошто ние треба да # Include cs50 точка ж? Па ние сме повикување на GetString функција, и GetString е дефинирана во cs50 библиотека. Значи, ако ние не имаат # Include cs50 точка ж, ќе се добие тоа имплицитно декларација на GetString функција грешка од компајлерот. Значи ние треба да се вклучат library-- ние треба да го вклучите хедер датотека, или на друго место на компајлерот нема признае дека GetString постои. Објасни зошто линија два е присутен. Па стандард IO точка ч. Тоа е иста како и претходниот проблем, освен наместо да се занимаваат со GetString, ние зборуваме за printf. Значи, ако ние не се каже што треба да вклучуваат стандардни IO точка ж, тогаш ние не би можеле да за користење на printf функцијата, затоа што на компајлерот не ќе знае за тоа. Why-- она ​​што е значењето на неважечки во согласност четири? Значи тука имаме int главната (празно). Тоа е само дека ние не се добива никакви командната линија аргументи до главна. Запомнете дека ние може да се каже int Главната int argc низа argv загради. Па овде само велат празнина да се каже се игнорира командната линија аргументи. Објасни, во однос на меморијата, точно што GetString во согласност шест враќа. GetString се враќа блок на меморија, низа од карактери. Тоа е навистина враќање на Покажувач на првиот карактер. Запомнете дека стрингот е знак ѕвезда. Така е е покажувач на првиот карактер во она што низа е што корисникот влезе на тастатурата. И дека меморијата се случува да се malloced, така што меморијата е во грамада. Прашање 13. Размислете за програмата подолу. Така што сите тоа го прави програмата е printf-ИНГ 1 поделено со 10. Па кога составува и извршува, оваа програма излези 0.0, иако 1 поделено со 10 е 0.1. Значи, зошто е тоа 0,0? Па, тоа е затоа што на целобројни поделба. Па е цел број 1, 10 е цел број. Па 1 поделено со 10, се се третира како цели броеви, и Ц, кога правиме број поделба, ние скратувајќи било децимална точка. Па 1 поделено со 10 е 0, а потоа ние се обидуваме да се печати дека како плови, така што нула печатени како плови е 0,0. И тоа е причината зошто ние се добие 0.0. Размислете за програмата подолу. Сега сме печатење 0.1. Па нема број поделба, ние сме само печатење на 0,1, но ние сме тоа печатење до 28 децимални места. И ние се добие оваа 0,1000, целиот куп на нули, 5 5 5, бла бла бла. Значи прашањето е зошто тоа го прави печати, наместо точно 0,1? Значи причината тука е сега подвижна запирка непрецизност. Запомнете дека плови само 32 бита. Па ние само може да претставува конечен број на подвижна запирка вредности со оние 32 битови. Па тука е крајот бескрајно многу подвижна запирка вредности, и има бесконечно многу променливи каматни точка вредности во помеѓу 0 и 1, и ние сме очигледно во можност да претставуваат уште повеќе вредности од тоа. Значи ние треба да се жртвуваат за да се да биде во можност да го претставуваат поголемиот вредности. Значи вредност како 0,1, очигледно ние не може да претставува дека точно. Така, наместо на претставување на 0,1 правиме најдоброто што може да претставува овој 0.100000 5 5 5. И тоа е прилично блиску, но за голем број на апликации ќе мора да се грижите за подвижна запирка непрецизност, затоа што едноставно не може да претставува сите лебдат поени точно. Прашање 15. Размислете кодот подолу. Ние сме само печатење на 1 плус 1. Значи не постои трик тука. 1 плус 1 евалуира до 2, и тогаш ние печатење тоа. Ова само отпечатоци 2. Прашање 16. Сега сме печатење карактер 1 плус карактерот 1. Па зошто да не, тоа не печати истото? И карактерот 1 плус карактер 1, ликот 1 има ASCII вредност 49. Па ова е навистина велејќи дека 49 плус 49, и во крајна линија тоа се случува да се печати 98. Значи ова не печати 2. Прашање 17. Заврши спроведувањето на чудни подолу на таков начин дека функцијата враќа true ако n е непарен и лажни ако n е дури. Ова е одлична намена за современи оператор. Значи, нашите аргумент n, ако n мод 2 еднакво на 1, и тоа значи дека n поделено од 2 имаше остатокот. Ако n поделено со 2 имаше потсетување, дека значи дека n е непарен, па ние се врати вистина. Друго return false. Вие исто така може да се направи N современи 2 еднаквите нула, return false, друг се врати вистина. Размислете за рекурзивен функција подолу. Па ако n е помал или еднаков на 1, се врати 1, друго враќање n пати ѓ од n минус 1. Значи она што е оваа функција? Па, ова е само факториел функција. Ова е убаво претставен како n факториел. Па се сомневаат 19 сега, ние сакаме да се земе овој рекурзивен функција. Ние сакаме да се направи тоа итеративен. Па, како го правиме тоа? И за вработените решение, и повторно има повеќе начини можете да го направиле дека, ние започнуваме со оваа int производ е еднаква на 1. И во текот на овој за телефонска линија, ние ќе да се размножуваат производ на крајот заврши со целосна факториел. Значи за int i е еднаква на 2, i е помалку од или еднакво на n, i ++. Може да се прашуваат зошто јас еднаква 2. Па, не заборавајте дека тука ние треба да бидете сигурни дека нашата база буква. Па ако n е помала или еднаква 1, ние сме само враќање 1. Па овде, ние започнуваме на i е еднаква на 2. Па ако јас се 1, а потоа the-- или ако n беа 1, а потоа на за телефонска линија не ќе се изврши на сите. И така ние би само враќање на производот, што е 1. Слично на тоа, ако n се нешто помалку од 1-- ако е 0, негативни 1, whatever-- ние се уште ќе се врати 1, која е токму она што рекурзивен верзија го прави. Сега, ако n е поголема од 1, тогаш ние ќе да се направи најмалку една повторување на овој циклус. Па да речеме n е 5, а потоа ние сме случува да се направи производ пати е еднакво на 2. Па сега производ е 2. Сега сме случува да се направи производ пати е еднакво на 3. Сега е 6. Пати на производот е еднаква на 4, сега е 24. Пати на производот е еднаква на 5, сега е 120. Па тогаш во крајна линија, ние сме враќање 120, што е правилно 5 факториел. Прашање 20. Ова е една, каде што мора да се пополни во оваа табела со секој даден алгоритам, нешто што видовме, дека одговара на овие алгоритамски рок пати овие асимптотска бегство пати. Значи она што е алгоритам што е омега на 1, но голема О од n? Така што не може да биде бескрајно многу одговори тука. Оној што видовме веројатно повеќето често е само линеарно пребарување. Значи во најдобар случај сценарио, ставка ние сме во потрага по е во почнувајќи од листата и така со омега на 1 чекори, првото нешто што го провери, ние само веднаш се врати кој го најдовме ставка. Во најлош случај сценарио, стварта е на крајот, или ставка не е во листата на сите. Значи ние треба да го бара на целата листа, сите n елементи, а тоа е зошто тоа е о од н. Па сега тоа е нешто што е и омега на n најавите n и голема О од n најавите n. И на повеќето релевантни работа видовме тука е се спојат вид. Па се спојат вид, се сеќавам, е во крајна линија тета на n log n, во која се дефинирани тета ако двата омега и големи О се исти. И n најавите n. Што е нешто што е омега на N и O на n квадрат? Па, повторно има повеќе можни одговори. Еве ние се случи да се каже меур вид. Вметнување вид, исто така, ќе работат тука. Запомнете дека меур вид има што оптимизација, каде што, ако сте во можност да се добие преку целата листа без потреба да се направи било свопови, тогаш, добро, ние веднаш може да се врати што листата е сортирана да почне. Значи во најдобар случај, тоа е само омега на n. Ако тоа не е само убаво подредени листа за да започне со тоа, тогаш имаме О од n квадрат свопови. И, конечно, имаме избор вид за n квадрат, и омега и големи О. Прашање 21. Што е цел број претекување? Па повторно, слични на претходните, имаме само finitely многу делови за да ги претставуваат цел број, па можеби и 32 бита. Да речеме дека имаме потпишано број. Потоа на крајот на највисоко Позитивните ние може да претставува е 2 до 31 минус 1. Значи она што се случува ако се обидеме да тогаш подигање кој број? Па, ние ќе одиме од 2 до 31 минус 1, на целиот пат до негативен 2 до 31. Значи овој број overflow е кога ќе се задржи incrementing, и на крајот може да не се добие било повисоко и тоа само обвива целиот пат назад околу да негативна вредност. Што во врска со buffer overflow? Па тампон overflow-- сетам што тампон е. Тоа е само еден дел од меморијата. Нешто како низа е тампон. Па на buffer overflow е кога ќе се обидат да пристапите до меморијата по завршувањето на кои низа. Значи, ако имате низа од големината 5 и вие се обидат да пристапат низа заграда 5 или 6 или држач држач 7, или нешто надвор од крајот, или дури и нешто below-- низа заграда негативни 1-- сите од нив се тампон поплавите. Сте допирање меморија во лоши начини. Прашање 23. Така што во овој еден што треба за спроведување на strlen. А ние ви кажам дека можете да претпостави не ќе биде нула, така да не треба да се направи проверка за ништовни. И постојат повеќе начини може да го направи тоа. Тука ние само се земе лесно. Почнуваме со контра, n. n е броење колку знаци постојат. Па ние со почеток во 0, а потоа ние iterate во текот на целата листа. Е S држач 0 еднаква на нула терминатор карактер? Запомни ние сме во потрага по нула терминатор карактер за да се утврди колку долго нашите стринг е. Тоа се случува да се прекине сите релевантни стринг. Така е и држач 0 еднакви до нула терминатор? Ако тоа не е, тогаш ние ќе треба да погледнете Полиса заградата 1, а заградата 2. Ние Продолжувам да одам додека не најдете нула терминатор. Откако ќе го најде, тогаш n содржи вкупната должина на стрингот, а ние само може да се врати тоа. Прашање 24. Значи ова е една, каде што мора да се направи пласирам. Значи едно е добар во еден начин, но на кој начин тоа е лошо? Па еве, се спојат вид има тенденција да да биде побрз од балон вид. Кој рече that-- добро, повеќе одговори тука. Но главната е дека меурот вид е омега на n за Подредена листа. Запомнете дека табелата само видов порано. Така меур сорти омега на n, најдобар случај сценарио е тоа е во можност да се оди само преку листата еднаш, се утврди еј ова нешто е веќе подредени, и за возврат. Се спојат вид, без разлика што ќе го направите, е омега на n најавите n. Значи за Подредена листа, меур вид ќе биде побрзо. Сега, она што за поврзани листи? Па поврзана листа може да расте и се намалува да одговара како многу елементи како што е потребно. Кој рече that-- така обично директна споредба се случува да биде поврзан листа со низа. Значи иако низи може лесно да расте и да се намали да се вклопи како многу елементи колку што е потребно, а поврзана листа во споредба со array-- некоја низа има случаен пристап. Можеме индекс во кој било одреден елемент на низата. Значи за поврзани листа, не можеме да само оди на петтиот елемент, ние треба да напречни од почетокот се додека не се дојде до петтиот елемент. И тоа се случува да не спречи прави нешто како бинарни пребарување. Говорејќи на бинарни пребарување, бинарни пребарување има тенденција да биде побрзо отколку линеарна пребарување. Кој рече that-- Значи, можно нешто е дека не можете да направите бинарен пребарување на поврзани листи, можете само да го направи тоа на низи. Но веројатно уште поважно, не можете да направите бинарни пребарување на низа која не е сортирана. Однапред можеби ќе треба да се најде решение низата, и само тогаш може ќе го направите бинарни пребарување. Значи, ако вашата работа не е сортирани да започне со тоа, тогаш линеарната пребарување може да биде побрзо. Прашање 27. Па сметаат дека програмата подолу, која ќе биде во следниот слајд. И ова е една каде сме ќе сакаат да изрично вредностите за различни променливи. Значи, да се погледне во тоа. Па се редат еден. Имаме int x е еднаква на 1. Тоа е единственото нешто што се случи. Значи во линија еден, можеме да видиме во нашите маса, што y, a, b, и tmp се сите затворена. Значи она што е X? Па ние само го постави еднаков на 1. А потоа се редат две, добро, гледаме дека y е поставено на 2, и маса е веќе пополнува за нас. Па x e 1 и Y е 2. Сега, алинеја три, ние сме сега во внатрешноста на swap функција. Што се поминува да се разменуваат? Минавме симболот x за a, и симболот y за b. Каде проблемот порано изјави дека на адресата на x е 0x10, и адресата на y е 0x14. Па a и b се еднакви на 0x10 и 0x14, соодветно. Сега во линија три, кои се x и y? Па, ништо не се промени за x и y во овој момент. Иако тие се внатрешноста на главниот оџак рамка, тие се уште ги имаат истите вредностите што беше порано. Не сме изменета било меморија. Па x е 1, y е 2. Сите во право. Па сега што рековме int tmp еднаква на ѕвезда на. Значи во согласност четири, сè е иста, освен за tmp. Не сме промениле вредности за ништо освен за мали. Ние сме поставување мали еднаква на Ѕвездена. Што е ѕвезда на? Па, поени на X, па Ѕвездена се случува да се еднакви x, што е 1. Значи се што е копиран надолу, и мали е поставен на 1. Сега на следната линија. Ѕвездена еднаква ѕвезда б. Па по линија five-- и повторно, сè е ист со исклучок што Ѕвездена е. Што е ѕвезда на? Па, ние едноставно се рече ѕвезда на x. Па ние сме менување х на еднаков ѕвезда б. Што е ѕвезда б? y. б поени на y. Па ѕвезда b е y. Па ние сме поставување на х еднаква на Y, и сè друго е исто. Па ќе видиме во следниот ред дека x е сега 2, а останатите се само копирани надолу. Сега во следната линија, ѕвезда б еднаква мали. Па, ние едноставно се рече ѕвезда b е y, па ние сме поставување у еднаква на мали. Сè друго е исто, па сè добива копирани надолу. Ние сме поставување у еднаква на мали, што е еден, а сè друго е исто. Сега конечно, линија седум. Ние сме назад во главната функција. Ние сме по трампа е завршена. Го изгубивме а, б, и мали, но на крајот ние не се менува секој вредности на ништо во овој момент, ние само копија x и y надолу. И гледаме дека x и y се сега 2 и 1, наместо на 1 и 2. На swap успешно извршена. Прашање 28. Да претпоставиме дека ќе се судрите пораки за грешки подолу текот на работното време следната година како CA или ТФ. Советува како да го надминете секоја од овие грешки. Толку недефиниран однос на GetString. Зошто и вие може да видите ова? Па, ако ученикот е со користење на GetString во нивниот код, тие се правилно хаш вклучени cs50 точка ж да го вклучите cs50 библиотека. Па, она што тие треба да се поправи оваа грешка? Тие треба да се направи цртичка lcs50 на командната линија кога тие се составувањето. Значи, ако тие не го положи ѕвекот цртичка lcs50, тие се нема да има вистински код кој имплементира GetString. Прашање 29. Имплицитно прогласување библиотека функција strlen. Па ова сега, тие не се направиле правилното хаш се вклучат. Во конкретниов случај, хедер датотека тие треба да се вклучат е низа точки час, вклучувајќи и низа точка ж, сега на student-- сега компајлерот има пристап до декларации на strlen, и таа знае дека вашиот код е користење на strlen правилно. Прашање 30. Повеќе проценти конверзии од податоците аргументи. Па што е ова? Добро се сеќавам дека овие проценти signs-- како тие се релевантни за printf. Значи во printf можеме да percent-- ние може да печати нешто како посто обратна коса црта n. Или ние може да печати како посто, простор, посто, просторот, посто. Значи за секоја од овие проценти знаци, ние треба да помине променлива на крајот на printf. Значи, ако ние велиме printf paren проценти Јас обратна коса црта n блиску paren, добро, велиме дека ние сме случува да се печати цел број, но тогаш не го положи printf цел број за да всушност се печати. Значи тука повеќе проценти конверзии од податоците аргументи? Тоа е велејќи дека имаме целиот куп на проценти, а ние немаме доволно променливи всушност да се пополни во тие проценти. И тогаш дефинитивно, на прашањето 31, дефинитивно изгуби 40 бајти во една блокови. Значи ова е Valgrind грешка. Ова се велејќи дека некаде во вашиот код, имате распределба односно 40 бајти големи, па можете malloced 40 бајти, и никогаш не сте го ослободил. Најверојатно сте само треба да се најдат некои меморија излегуваат во јавноста, и да се најде каде што треба да ослободи овој блок од меморија. И прашање 32, валиден запишување на големината 4. Повторно ова е Valgrind грешка. Ова не треба да се направи со меморија протекување сега. Ова е, повеќето likely-- Мислам, тоа е некој вид на неважечки меморија права. И најверојатно ова е некои вид на buffer overflow. Каде што треба низа, можеби цел број низа, и нека е велат дека тоа е на големината на 5, а ти обидете се да се допре низа заградата 5. Значи, ако се обидете да се напише дека вредност, тоа не е парче меморија кои, всушност, ќе имаат пристап до, и толку си оди за да се добие оваа грешка, велејќи валиден запишување на големината 4. Valgrind се случува да се признае сте се обидуваат да допрат меморија несоодветно. И тоа е тоа за quiz0. Јас сум Роб Бауден, и ова е CS50.