1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 Роб BOWDEN: Здраво, јас сум Роб Бауден, и ајде да зборуваме за quiz0. 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> Значи, првото прашање. 5 00:00:14,545 --> 00:00:17,750 Ова е прашањето каде што ви е потребно да се кодот на бројот 6 00:00:17,750 --> 00:00:21,270 127 во бинарното светилки. 7 00:00:21,270 --> 00:00:23,550 Ако си сакал, би можеле направите редовните конверзија 8 00:00:23,550 --> 00:00:25,950 од bi-- или, од децимални на бинарни. 9 00:00:25,950 --> 00:00:28,300 Но, тоа е веројатно нема да се земе многу време. 10 00:00:28,300 --> 00:00:31,750 Мислам, можете да дознаам дека, Добро, 1 е таму, 2 е таму, 11 00:00:31,750 --> 00:00:33,650 4 е во таму, 8 е во таму. 12 00:00:33,650 --> 00:00:39,280 Полесен начин, 127 е 128 минус еден. 13 00:00:39,280 --> 00:00:42,013 Дека најлева сијалица е 128-битна. 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 Па 127 е навистина само сите на други светилки, 16 00:00:47,860 --> 00:00:51,420 бидејќи тоа е најлевата сијалица минус 1. 17 00:00:51,420 --> 00:00:52,800 Тоа е тоа за тоа прашање. 18 00:00:52,800 --> 00:00:54,060 >> Прашање еден. 19 00:00:54,060 --> 00:00:56,710 Значи со 3 битови може да претставуваат 8 различни вредности. 20 00:00:56,710 --> 00:01:01,000 Зошто, тогаш, е 7 најголемата ненегативни децимални цел број може да се претставуваат? 21 00:01:01,000 --> 00:01:04,050 Па, ако ние може само претставуваат 8 различни вредности, 22 00:01:04,050 --> 00:01:07,430 тогаш она што се случува да биде застапување е од 0 до 7. 23 00:01:07,430 --> 00:01:08,745 0 зазема една од вредностите. 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> Прашање две. 26 00:01:11,190 --> 00:01:14,610 Со n битови, колку различни вредности може да ви претставуваат? 27 00:01:14,610 --> 00:01:19,080 Значи, со n битови, имаш 2 можни вредности за секој бит. 28 00:01:19,080 --> 00:01:22,300 Значи имаме 2 можни вредности за првиот бит, 2 можни вредности 29 00:01:22,300 --> 00:01:24,450 за вториот, 2 можно за третиот. 30 00:01:24,450 --> 00:01:28,730 И така тоа е 2 пати 2 пати 2 и на крајот одговорот е 2 на n. 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> Прашање три. 33 00:01:31,100 --> 00:01:33,450 Што е 0x50 во бинарен? 34 00:01:33,450 --> 00:01:39,490 Па се сеќавам дека хексадецимален има многу јасна конверзија на бинарни. 35 00:01:39,490 --> 00:01:43,180 Па еве, ние само треба да се погледне во 5 и 0 независно. 36 00:01:43,180 --> 00:01:45,110 Значи она што е 5 во бинарен? 37 00:01:45,110 --> 00:01:48,400 0101, тоа е 1 бит и 4 малку. 38 00:01:48,400 --> 00:01:49,900 Што е 0 во бинарен? 39 00:01:49,900 --> 00:01:50,520 Не незгодно. 40 00:01:50,520 --> 00:01:52,180 0000. 41 00:01:52,180 --> 00:01:54,970 Па само ги стави заедно, и тоа е целосна број во бинарен. 42 00:01:54,970 --> 00:01:57,640 01.010.000. 43 00:01:57,640 --> 00:02:00,439 И ако си сакал да можеш полетување дека најлева нула. 44 00:02:00,439 --> 00:02:01,105 Тоа е ирелевантно. 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> Па тогаш алтернативно, она што е 0x50 во децимална? 47 00:02:05,733 --> 00:02:08,649 Ако сака, може could-- ако сте повеќе удобно со бинарни, 48 00:02:08,649 --> 00:02:11,340 може да се земе дека бинарни одговор и конвертирате дека во децимала. 49 00:02:11,340 --> 00:02:13,870 Или ние може само да се сеќавам дека хексадецимален. 50 00:02:13,870 --> 00:02:21,140 Така што 0 е во 0-то место, а 5 е во 16 да се на прво место. 51 00:02:21,140 --> 00:02:25,990 Па еве, ние имаме 5 пати 16 до прво, плус 0 пати 16 до нула, 52 00:02:25,990 --> 00:02:27,520 е 80. 53 00:02:27,520 --> 00:02:29,710 И ако сте го гледаше во Наслов на прашањето, 54 00:02:29,710 --> 00:02:32,920 тоа беше CS 80, кој беше еден вид на алудираат на одговорот на овој проблем. 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> Прашање пет. 57 00:02:35,420 --> 00:02:40,320 Имаме оваа гребење скрипта, која е повторување 4 пати путер од кикирики желе. 58 00:02:40,320 --> 00:02:42,800 Така како ние сега кодот кој во Ц? 59 00:02:42,800 --> 00:02:47,730 Па, ние here-- имаат дел во задебелени букви е само дел ќе мораше да се спроведе. 60 00:02:47,730 --> 00:02:51,950 Па ние имаме 4 јамка што е looping 4 пати, printf-ИНГ путер од кикирики желе, 61 00:02:51,950 --> 00:02:53,910 со нова линија како проблем бара. 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> Прашање шест, друг гребење проблем. 64 00:02:57,490 --> 00:03:00,210 Гледаме дека ние сме во засекогаш јамка. 65 00:03:00,210 --> 00:03:05,000 Ние сме велејќи дека променливата i и тогаш јас incrementing од 1. 66 00:03:05,000 --> 00:03:09,580 Сега сакаме да го направите тоа во C. Има повеќе начини би можеле да го направи тоа. 67 00:03:09,580 --> 00:03:12,840 Еве ние се случи да се шифрираат засекогаш јамка како додека (вистинска). 68 00:03:12,840 --> 00:03:16,600 Значи ние се изјасни променливата i, само како имавме променлива i во гребење. 69 00:03:16,600 --> 00:03:21,950 Прогласи променлива i, а засекогаш додека (вистинска), велиме променливата i. 70 00:03:21,950 --> 00:03:25,260 Значи printf% i-- или можете да сум користел% d. 71 00:03:25,260 --> 00:03:27,985 Велиме дека променлива, и тогаш тоа зголемување, јас ++. 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> Прашање седум. 74 00:03:30,830 --> 00:03:35,560 Сега ние сакаме да се направи нешто многу слично на Марио точка в од проблемот постави еден. 75 00:03:35,560 --> 00:03:39,110 Ние сакаме да се печати овие hashtags, ние сакаме да се печати пет 76 00:03:39,110 --> 00:03:40,700 од страна на три правоаголник на овие хашови. 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 Па како можеме да го направи тоа? 79 00:03:43,162 --> 00:03:45,370 Па, ние ви даде целата куп на код, а вие само 80 00:03:45,370 --> 00:03:47,560 мора да се пополни во печатените мрежа функција. 81 00:03:47,560 --> 00:03:49,540 >> Значи она што не PrintGrid изгледа? 82 00:03:49,540 --> 00:03:51,480 Па ти си минато ширина и висина. 83 00:03:51,480 --> 00:03:53,520 Па ние имаме надворешен 4 јамка, што е looping 84 00:03:53,520 --> 00:03:57,650 во текот на сите од редовите на овој мрежа кои сакаме да ги испечатите. 85 00:03:57,650 --> 00:04:01,250 Тогаш имаме интер-вгнездени 4 јамка, тоа е печатење над секоја колона. 86 00:04:01,250 --> 00:04:06,210 Значи за секој ред, ние печати за секоја колона, еден хаш. 87 00:04:06,210 --> 00:04:10,045 Потоа на крајот на редот се печати една нова линија за да отидете на следниот ред. 88 00:04:10,045 --> 00:04:11,420 И тоа е тоа за целата мрежа. 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> Прашање осум. 91 00:04:13,675 --> 00:04:17,170 А функција како PrintGrid се вели дека имаат пропратен ефект, но не враќање 92 00:04:17,170 --> 00:04:17,670 вредност. 93 00:04:17,670 --> 00:04:19,209 Објаснување на разликата. 94 00:04:19,209 --> 00:04:23,080 Значи ова се потпира на вас сеќавајќи она што пропратен ефект е. 95 00:04:23,080 --> 00:04:25,180 Па, враќање value-- знаеме PrintGrid не 96 00:04:25,180 --> 00:04:28,180 има повратната вредност, бидејќи Овде пишува неважечки. 97 00:04:28,180 --> 00:04:31,150 Па ако нешто се враќа неважечки навистина не се врати ништо. 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 Значи она што е пропратен ефект? 100 00:04:33,620 --> 00:04:36,620 Па, пропратен ефект е нешто што вид на опстојува 101 00:04:36,620 --> 00:04:39,500 по функција краја тоа не беше само што се врати, 102 00:04:39,500 --> 00:04:41,340 и тоа не беше само од влезови. 103 00:04:41,340 --> 00:04:44,970 >> Така, на пример, ние може да промени глобалната променлива. 104 00:04:44,970 --> 00:04:46,590 Тоа ќе биде пропратен ефект. 105 00:04:46,590 --> 00:04:49,000 Во конкретниов случај, многу важно пропратен ефект 106 00:04:49,000 --> 00:04:51,070 печати на екранот. 107 00:04:51,070 --> 00:04:53,110 Така што е пропратен ефект дека PrintGrid има. 108 00:04:53,110 --> 00:04:54,980 Ние печати овие нешта на екранот. 109 00:04:54,980 --> 00:04:56,370 И може да се мисли на дека како пропратен ефект, 110 00:04:56,370 --> 00:04:58,690 бидејќи тоа е нешто што продолжува по оваа функција завршува. 111 00:04:58,690 --> 00:05:01,481 Тоа е нешто надвор од опсегот на оваа функција која на крајот 112 00:05:01,481 --> 00:05:03,380 се менува, содржината на екранот. 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> Прашање девет. 115 00:05:05,839 --> 00:05:07,880 Размислете за програмата подолу, на која линија броеви 116 00:05:07,880 --> 00:05:09,740 се додадени за доброто на дискусијата. 117 00:05:09,740 --> 00:05:13,480 Значи во оваа програма ќе се само повикувајќи GetString, чување на тоа 118 00:05:13,480 --> 00:05:16,220 во оваа променлива s, а потоа печатење таа променлива е. 119 00:05:16,220 --> 00:05:16,720 ОК. 120 00:05:16,720 --> 00:05:19,090 Така објасни зошто линија е присутна. 121 00:05:19,090 --> 00:05:20,920 # Include cs50 точка ч. 122 00:05:20,920 --> 00:05:23,820 Зошто ние треба да # Include cs50 точка ж? 123 00:05:23,820 --> 00:05:26,180 Па ние сме повикување на GetString функција, 124 00:05:26,180 --> 00:05:28,840 и GetString е дефинирана во cs50 библиотека. 125 00:05:28,840 --> 00:05:31,600 Значи, ако ние не имаат # Include cs50 точка ж, 126 00:05:31,600 --> 00:05:35,760 ќе се добие тоа имплицитно декларација на GetString функција грешка 127 00:05:35,760 --> 00:05:36,840 од компајлерот. 128 00:05:36,840 --> 00:05:40,110 Значи ние треба да се вклучат library-- ние треба да го вклучите хедер датотека, 129 00:05:40,110 --> 00:05:42,870 или на друго место на компајлерот нема признае дека GetString постои. 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> Објасни зошто линија два е присутен. 132 00:05:46,140 --> 00:05:47,890 Па стандард IO точка ч. 133 00:05:47,890 --> 00:05:50,430 Тоа е иста како и претходниот проблем, 134 00:05:50,430 --> 00:05:53,310 освен наместо да се занимаваат со GetString, ние зборуваме за printf. 135 00:05:53,310 --> 00:05:56,654 Значи, ако ние не се каже што треба да вклучуваат стандардни IO точка ж, 136 00:05:56,654 --> 00:05:58,820 тогаш ние не би можеле да за користење на printf функцијата, 137 00:05:58,820 --> 00:06:00,653 затоа што на компајлерот не ќе знае за тоа. 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Why-- она ​​што е значењето на неважечки во согласност четири? 140 00:06:05,260 --> 00:06:08,010 Значи тука имаме int главната (празно). 141 00:06:08,010 --> 00:06:10,600 Тоа е само дека ние не се добива никакви командната линија 142 00:06:10,600 --> 00:06:12,280 аргументи до главна. 143 00:06:12,280 --> 00:06:17,390 Запомнете дека ние може да се каже int Главната int argc низа argv загради. 144 00:06:17,390 --> 00:06:20,400 Па овде само велат празнина да се каже се игнорира командната линија аргументи. 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> Објасни, во однос на меморијата, точно што GetString во согласност шест враќа. 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString се враќа блок на меморија, низа од карактери. 149 00:06:31,640 --> 00:06:34,870 Тоа е навистина враќање на Покажувач на првиот карактер. 150 00:06:34,870 --> 00:06:37,170 Запомнете дека стрингот е знак ѕвезда. 151 00:06:37,170 --> 00:06:41,360 Така е е покажувач на првиот карактер во она што низа е 152 00:06:41,360 --> 00:06:43,510 што корисникот влезе на тастатурата. 153 00:06:43,510 --> 00:06:47,070 И дека меморијата се случува да се malloced, така што меморијата е во грамада. 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> Прашање 13. 156 00:06:50,450 --> 00:06:51,960 Размислете за програмата подолу. 157 00:06:51,960 --> 00:06:55,579 Така што сите тоа го прави програмата е printf-ИНГ 1 поделено со 10. 158 00:06:55,579 --> 00:06:57,370 Па кога составува и извршува, оваа програма 159 00:06:57,370 --> 00:07:01,170 излези 0.0, иако 1 поделено со 10 е 0.1. 160 00:07:01,170 --> 00:07:02,970 Значи, зошто е тоа 0,0? 161 00:07:02,970 --> 00:07:05,510 Па, тоа е затоа што на целобројни поделба. 162 00:07:05,510 --> 00:07:08,580 Па е цел број 1, 10 е цел број. 163 00:07:08,580 --> 00:07:11,980 Па 1 поделено со 10, се се третира како цели броеви, 164 00:07:11,980 --> 00:07:16,380 и Ц, кога правиме број поделба, ние скратувајќи било децимална точка. 165 00:07:16,380 --> 00:07:19,590 Па 1 поделено со 10 е 0, а потоа ние се обидуваме 166 00:07:19,590 --> 00:07:24,410 да се печати дека како плови, така што нула печатени како плови е 0,0. 167 00:07:24,410 --> 00:07:27,400 И тоа е причината зошто ние се добие 0.0. 168 00:07:27,400 --> 00:07:28,940 >> Размислете за програмата подолу. 169 00:07:28,940 --> 00:07:31,280 Сега сме печатење 0.1. 170 00:07:31,280 --> 00:07:34,280 Па нема број поделба, ние сме само печатење на 0,1, 171 00:07:34,280 --> 00:07:37,100 но ние сме тоа печатење до 28 децимални места. 172 00:07:37,100 --> 00:07:41,810 И ние се добие оваа 0,1000, целиот куп на нули, 5 5 5, бла бла бла. 173 00:07:41,810 --> 00:07:45,495 Значи прашањето е зошто тоа го прави печати, наместо точно 0,1? 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> Значи причината тука е сега подвижна запирка непрецизност. 176 00:07:49,640 --> 00:07:53,410 Запомнете дека плови само 32 бита. 177 00:07:53,410 --> 00:07:57,540 Па ние само може да претставува конечен број на подвижна запирка вредности со оние 32 178 00:07:57,540 --> 00:07:58,560 битови. 179 00:07:58,560 --> 00:08:01,760 Па тука е крајот бескрајно многу подвижна запирка вредности, 180 00:08:01,760 --> 00:08:04,940 и има бесконечно многу променливи каматни точка вредности во помеѓу 0 и 1, 181 00:08:04,940 --> 00:08:07,860 и ние сме очигледно во можност да претставуваат уште повеќе вредности од тоа. 182 00:08:07,860 --> 00:08:13,230 Значи ние треба да се жртвуваат за да се да биде во можност да го претставуваат поголемиот вредности. 183 00:08:13,230 --> 00:08:16,960 >> Значи вредност како 0,1, очигледно ние не може да претставува дека точно. 184 00:08:16,960 --> 00:08:22,500 Така, наместо на претставување на 0,1 правиме најдоброто што може да претставува овој 0.100000 5 5 185 00:08:22,500 --> 00:08:23,260 5. 186 00:08:23,260 --> 00:08:26,306 И тоа е прилично блиску, но за голем број на апликации 187 00:08:26,306 --> 00:08:28,430 ќе мора да се грижите за подвижна запирка непрецизност, 188 00:08:28,430 --> 00:08:30,930 затоа што едноставно не може да претставува сите лебдат поени точно. 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> Прашање 15. 191 00:08:33,380 --> 00:08:34,679 Размислете кодот подолу. 192 00:08:34,679 --> 00:08:36,630 Ние сме само печатење на 1 плус 1. 193 00:08:36,630 --> 00:08:38,289 Значи не постои трик тука. 194 00:08:38,289 --> 00:08:41,780 1 плус 1 евалуира до 2, и тогаш ние печатење тоа. 195 00:08:41,780 --> 00:08:42,789 Ова само отпечатоци 2. 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> Прашање 16. 198 00:08:44,700 --> 00:08:49,450 Сега сме печатење карактер 1 плус карактерот 1. 199 00:08:49,450 --> 00:08:52,110 Па зошто да не, тоа не печати истото? 200 00:08:52,110 --> 00:08:57,680 И карактерот 1 плус карактер 1, ликот 1 има ASCII вредност 49. 201 00:08:57,680 --> 00:09:04,840 Па ова е навистина велејќи дека 49 плус 49, и во крајна линија тоа се случува да се печати 98. 202 00:09:04,840 --> 00:09:06,130 Значи ова не печати 2. 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> Прашање 17. 205 00:09:09,271 --> 00:09:11,520 Заврши спроведувањето на чудни подолу на таков начин 206 00:09:11,520 --> 00:09:14,615 дека функцијата враќа true ако n е непарен и лажни ако n е дури. 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 Ова е одлична намена за современи оператор. 209 00:09:19,330 --> 00:09:24,530 Значи, нашите аргумент n, ако n мод 2 еднакво на 1, и 210 00:09:24,530 --> 00:09:28,030 тоа значи дека n поделено од 2 имаше остатокот. 211 00:09:28,030 --> 00:09:33,270 Ако n поделено со 2 имаше потсетување, дека значи дека n е непарен, па ние се врати вистина. 212 00:09:33,270 --> 00:09:34,910 Друго return false. 213 00:09:34,910 --> 00:09:39,070 Вие исто така може да се направи N современи 2 еднаквите нула, return false, друг се врати вистина. 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> Размислете за рекурзивен функција подолу. 216 00:09:43,640 --> 00:09:46,920 Па ако n е помал или еднаков на 1, се врати 1, 217 00:09:46,920 --> 00:09:50,430 друго враќање n пати ѓ од n минус 1. 218 00:09:50,430 --> 00:09:52,556 Значи она што е оваа функција? 219 00:09:52,556 --> 00:09:54,305 Па, ова е само факториел функција. 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 Ова е убаво претставен како n факториел. 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> Па се сомневаат 19 сега, ние сакаме да се земе овој рекурзивен функција. 224 00:10:02,310 --> 00:10:04,530 Ние сакаме да се направи тоа итеративен. 225 00:10:04,530 --> 00:10:05,874 Па, како го правиме тоа? 226 00:10:05,874 --> 00:10:07,790 И за вработените решение, и повторно има 227 00:10:07,790 --> 00:10:11,090 повеќе начини можете да го направиле дека, ние започнуваме со оваа int производ 228 00:10:11,090 --> 00:10:11,812 е еднаква на 1. 229 00:10:11,812 --> 00:10:13,520 И во текот на овој за телефонска линија, ние ќе 230 00:10:13,520 --> 00:10:17,590 да се размножуваат производ на крајот заврши со целосна факториел. 231 00:10:17,590 --> 00:10:21,870 Значи за int i е еднаква на 2, i е помалку од или еднакво на n, i ++. 232 00:10:21,870 --> 00:10:24,130 >> Може да се прашуваат зошто јас еднаква 2. 233 00:10:24,130 --> 00:10:28,380 Па, не заборавајте дека тука ние треба да бидете сигурни дека нашата база буква. 234 00:10:28,380 --> 00:10:32,180 Па ако n е помала или еднаква 1, ние сме само враќање 1. 235 00:10:32,180 --> 00:10:34,830 Па овде, ние започнуваме на i е еднаква на 2. 236 00:10:34,830 --> 00:10:39,090 Па ако јас се 1, а потоа the-- или ако n беа 1, а потоа на за телефонска линија 237 00:10:39,090 --> 00:10:40,600 не ќе се изврши на сите. 238 00:10:40,600 --> 00:10:43,190 И така ние би само враќање на производот, што е 1. 239 00:10:43,190 --> 00:10:45,920 Слично на тоа, ако n се нешто помалку од 1-- 240 00:10:45,920 --> 00:10:49,290 ако е 0, негативни 1, whatever-- ние се уште ќе се врати 1, 241 00:10:49,290 --> 00:10:52,260 која е токму она што рекурзивен верзија го прави. 242 00:10:52,260 --> 00:10:54,660 >> Сега, ако n е поголема од 1, тогаш ние ќе 243 00:10:54,660 --> 00:10:56,550 да се направи најмалку една повторување на овој циклус. 244 00:10:56,550 --> 00:11:00,630 Па да речеме n е 5, а потоа ние сме случува да се направи производ пати е еднакво на 2. 245 00:11:00,630 --> 00:11:02,165 Па сега производ е 2. 246 00:11:02,165 --> 00:11:04,040 Сега сме случува да се направи производ пати е еднакво на 3. 247 00:11:04,040 --> 00:11:04,690 Сега е 6. 248 00:11:04,690 --> 00:11:07,500 Пати на производот е еднаква на 4, сега е 24. 249 00:11:07,500 --> 00:11:10,420 Пати на производот е еднаква на 5, сега е 120. 250 00:11:10,420 --> 00:11:16,730 Па тогаш во крајна линија, ние сме враќање 120, што е правилно 5 факториел. 251 00:11:16,730 --> 00:11:17,510 >> Прашање 20. 252 00:11:17,510 --> 00:11:22,480 Ова е една, каде што мора да се пополни во оваа табела со секој даден алгоритам, 253 00:11:22,480 --> 00:11:25,735 нешто што видовме, дека одговара на овие алгоритамски рок 254 00:11:25,735 --> 00:11:28,060 пати овие асимптотска бегство пати. 255 00:11:28,060 --> 00:11:33,270 Значи она што е алгоритам што е омега на 1, но голема О од n? 256 00:11:33,270 --> 00:11:35,970 Така што не може да биде бескрајно многу одговори тука. 257 00:11:35,970 --> 00:11:39,790 Оној што видовме веројатно повеќето често е само линеарно пребарување. 258 00:11:39,790 --> 00:11:42,050 >> Значи во најдобар случај сценарио, ставка ние сме 259 00:11:42,050 --> 00:11:44,050 во потрага по е во почнувајќи од листата 260 00:11:44,050 --> 00:11:47,400 и така со омега на 1 чекори, првото нешто што го провери, 261 00:11:47,400 --> 00:11:49,740 ние само веднаш се врати кој го најдовме ставка. 262 00:11:49,740 --> 00:11:52,189 Во најлош случај сценарио, стварта е на крајот, 263 00:11:52,189 --> 00:11:53,730 или ставка не е во листата на сите. 264 00:11:53,730 --> 00:11:56,700 Значи ние треба да го бара на целата листа, сите n 265 00:11:56,700 --> 00:11:58,480 елементи, а тоа е зошто тоа е о од н. 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> Па сега тоа е нешто што е и омега на n најавите n и голема О од n најавите n. 268 00:12:04,880 --> 00:12:08,650 И на повеќето релевантни работа видовме тука е се спојат вид. 269 00:12:08,650 --> 00:12:12,950 Па се спојат вид, се сеќавам, е во крајна линија тета 270 00:12:12,950 --> 00:12:16,920 на n log n, во која се дефинирани тета ако двата омега и големи О се исти. 271 00:12:16,920 --> 00:12:17,580 И n најавите n. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Што е нешто што е омега на N и O на n квадрат? 274 00:12:21,970 --> 00:12:23,990 Па, повторно има повеќе можни одговори. 275 00:12:23,990 --> 00:12:26,440 Еве ние се случи да се каже меур вид. 276 00:12:26,440 --> 00:12:28,840 Вметнување вид, исто така, ќе работат тука. 277 00:12:28,840 --> 00:12:31,400 Запомнете дека меур вид има што оптимизација, каде што, 278 00:12:31,400 --> 00:12:34,630 ако сте во можност да се добие преку целата листа 279 00:12:34,630 --> 00:12:37,402 без потреба да се направи било свопови, тогаш, добро, 280 00:12:37,402 --> 00:12:40,110 ние веднаш може да се врати што листата е сортирана да почне. 281 00:12:40,110 --> 00:12:43,185 Значи во најдобар случај, тоа е само омега на n. 282 00:12:43,185 --> 00:12:45,960 Ако тоа не е само убаво подредени листа за да започне со тоа, 283 00:12:45,960 --> 00:12:48,270 тогаш имаме О од n квадрат свопови. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 И, конечно, имаме избор вид за n квадрат, и омега и големи О. 286 00:12:55,610 --> 00:12:56,850 >> Прашање 21. 287 00:12:56,850 --> 00:12:58,870 Што е цел број претекување? 288 00:12:58,870 --> 00:13:02,160 Па повторно, слични на претходните, имаме само finitely многу делови 289 00:13:02,160 --> 00:13:04,255 за да ги претставуваат цел број, па можеби и 32 бита. 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 Да речеме дека имаме потпишано број. 292 00:13:09,180 --> 00:13:12,800 Потоа на крајот на највисоко Позитивните ние може да претставува 293 00:13:12,800 --> 00:13:15,910 е 2 до 31 минус 1. 294 00:13:15,910 --> 00:13:19,370 Значи она што се случува ако се обидеме да тогаш подигање кој број? 295 00:13:19,370 --> 00:13:25,320 Па, ние ќе одиме од 2 до 31 минус 1, на целиот пат до негативен 2 296 00:13:25,320 --> 00:13:26,490 до 31. 297 00:13:26,490 --> 00:13:29,470 Значи овој број overflow е кога ќе се задржи incrementing, 298 00:13:29,470 --> 00:13:32,330 и на крајот може да не се добие било повисоко и тоа само 299 00:13:32,330 --> 00:13:34,520 обвива целиот пат назад околу да негативна вредност. 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> Што во врска со buffer overflow? 302 00:13:37,779 --> 00:13:39,820 Па тампон overflow-- сетам што тампон е. 303 00:13:39,820 --> 00:13:41,000 Тоа е само еден дел од меморијата. 304 00:13:41,000 --> 00:13:43,350 Нешто како низа е тампон. 305 00:13:43,350 --> 00:13:46,120 Па на buffer overflow е кога ќе се обидат да пристапите до меморијата 306 00:13:46,120 --> 00:13:47,880 по завршувањето на кои низа. 307 00:13:47,880 --> 00:13:50,410 Значи, ако имате низа од големината 5 и вие 308 00:13:50,410 --> 00:13:53,700 се обидат да пристапат низа заграда 5 или 6 или држач држач 7, 309 00:13:53,700 --> 00:13:56,610 или нешто надвор од крајот, или дури и нешто 310 00:13:56,610 --> 00:14:00,790 below-- низа заграда негативни 1-- сите од нив се тампон поплавите. 311 00:14:00,790 --> 00:14:02,810 Сте допирање меморија во лоши начини. 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> Прашање 23. 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 Така што во овој еден што треба за спроведување на strlen. 316 00:14:09,100 --> 00:14:11,630 А ние ви кажам дека можете да претпостави не ќе биде нула, 317 00:14:11,630 --> 00:14:13,790 така да не треба да се направи проверка за ништовни. 318 00:14:13,790 --> 00:14:16,190 И постојат повеќе начини може да го направи тоа. 319 00:14:16,190 --> 00:14:18,440 Тука ние само се земе лесно. 320 00:14:18,440 --> 00:14:21,780 Почнуваме со контра, n. n е броење колку знаци постојат. 321 00:14:21,780 --> 00:14:25,560 Па ние со почеток во 0, а потоа ние iterate во текот на целата листа. 322 00:14:25,560 --> 00:14:29,092 >> Е S држач 0 еднаква на нула терминатор карактер? 323 00:14:29,092 --> 00:14:31,425 Запомни ние сме во потрага по нула терминатор карактер 324 00:14:31,425 --> 00:14:33,360 за да се утврди колку долго нашите стринг е. 325 00:14:33,360 --> 00:14:35,890 Тоа се случува да се прекине сите релевантни стринг. 326 00:14:35,890 --> 00:14:39,400 Така е и држач 0 еднакви до нула терминатор? 327 00:14:39,400 --> 00:14:42,850 Ако тоа не е, тогаш ние ќе треба да погледнете Полиса заградата 1, а заградата 2. 328 00:14:42,850 --> 00:14:45,050 Ние Продолжувам да одам додека не најдете нула терминатор. 329 00:14:45,050 --> 00:14:48,580 Откако ќе го најде, тогаш n содржи вкупната должина на стрингот, 330 00:14:48,580 --> 00:14:49,942 а ние само може да се врати тоа. 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> Прашање 24. 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 Значи ова е една, каде што мора да се направи пласирам. 335 00:14:56,050 --> 00:14:59,810 Значи едно е добар во еден начин, но на кој начин тоа е лошо? 336 00:14:59,810 --> 00:15:02,980 Па еве, се спојат вид има тенденција да да биде побрз од балон вид. 337 00:15:02,980 --> 00:15:06,530 Кој рече that-- добро, повеќе одговори тука. 338 00:15:06,530 --> 00:15:12,930 Но главната е дека меурот вид е омега на n за Подредена листа. 339 00:15:12,930 --> 00:15:14,950 >> Запомнете дека табелата само видов порано. 340 00:15:14,950 --> 00:15:17,600 Така меур сорти омега на n, најдобар случај сценарио 341 00:15:17,600 --> 00:15:20,010 е тоа е во можност да се оди само преку листата еднаш, се утврди 342 00:15:20,010 --> 00:15:22,270 еј ова нешто е веќе подредени, и за возврат. 343 00:15:22,270 --> 00:15:25,960 Се спојат вид, без разлика што ќе го направите, е омега на n најавите n. 344 00:15:25,960 --> 00:15:29,200 Значи за Подредена листа, меур вид ќе биде побрзо. 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> Сега, она што за поврзани листи? 347 00:15:32,430 --> 00:15:36,070 Па поврзана листа може да расте и се намалува да одговара како многу елементи како што е потребно. 348 00:15:36,070 --> 00:15:38,489 Кој рече that-- така обично директна споредба 349 00:15:38,489 --> 00:15:40,280 се случува да биде поврзан листа со низа. 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 Значи иако низи може лесно да расте и да се намали 352 00:15:44,050 --> 00:15:47,130 да се вклопи како многу елементи колку што е потребно, а поврзана листа 353 00:15:47,130 --> 00:15:49,600 во споредба со array-- некоја низа има случаен пристап. 354 00:15:49,600 --> 00:15:52,960 Можеме индекс во кој било одреден елемент на низата. 355 00:15:52,960 --> 00:15:56,430 >> Значи за поврзани листа, не можеме да само оди на петтиот елемент, 356 00:15:56,430 --> 00:16:00,260 ние треба да напречни од почетокот се додека не се дојде до петтиот елемент. 357 00:16:00,260 --> 00:16:03,990 И тоа се случува да не спречи прави нешто како бинарни пребарување. 358 00:16:03,990 --> 00:16:08,150 Говорејќи на бинарни пребарување, бинарни пребарување има тенденција да биде побрзо отколку линеарна пребарување. 359 00:16:08,150 --> 00:16:11,120 Кој рече that-- Значи, можно нешто 360 00:16:11,120 --> 00:16:13,380 е дека не можете да направите бинарен пребарување на поврзани листи, 361 00:16:13,380 --> 00:16:14,730 можете само да го направи тоа на низи. 362 00:16:14,730 --> 00:16:18,030 Но веројатно уште поважно, не можете да направите бинарни пребарување 363 00:16:18,030 --> 00:16:20,690 на низа која не е сортирана. 364 00:16:20,690 --> 00:16:23,990 Однапред можеби ќе треба да се најде решение низата, и само тогаш може 365 00:16:23,990 --> 00:16:25,370 ќе го направите бинарни пребарување. 366 00:16:25,370 --> 00:16:27,660 Значи, ако вашата работа не е сортирани да започне со тоа, 367 00:16:27,660 --> 00:16:29,250 тогаш линеарната пребарување може да биде побрзо. 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> Прашање 27. 370 00:16:31,740 --> 00:16:34,770 Па сметаат дека програмата подолу, која ќе биде во следниот слајд. 371 00:16:34,770 --> 00:16:37,790 И ова е една каде сме ќе сакаат да изрично 372 00:16:37,790 --> 00:16:39,980 вредностите за различни променливи. 373 00:16:39,980 --> 00:16:41,990 Значи, да се погледне во тоа. 374 00:16:41,990 --> 00:16:43,160 >> Па се редат еден. 375 00:16:43,160 --> 00:16:45,457 Имаме int x е еднаква на 1. 376 00:16:45,457 --> 00:16:47,040 Тоа е единственото нешто што се случи. 377 00:16:47,040 --> 00:16:50,440 Значи во линија еден, можеме да видиме во нашите маса, што y, a, b, и tmp се сите 378 00:16:50,440 --> 00:16:51,540 затворена. 379 00:16:51,540 --> 00:16:52,280 Значи она што е X? 380 00:16:52,280 --> 00:16:53,860 Па ние само го постави еднаков на 1. 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 А потоа се редат две, добро, гледаме дека y е поставено на 2, 383 00:16:58,770 --> 00:17:00,550 и маса е веќе пополнува за нас. 384 00:17:00,550 --> 00:17:03,040 Па x e 1 и Y е 2. 385 00:17:03,040 --> 00:17:05,890 >> Сега, алинеја три, ние сме сега во внатрешноста на swap функција. 386 00:17:05,890 --> 00:17:07,560 Што се поминува да се разменуваат? 387 00:17:07,560 --> 00:17:11,609 Минавме симболот x за a, и симболот y за b. 388 00:17:11,609 --> 00:17:15,160 Каде проблемот порано изјави дека на адресата на x 389 00:17:15,160 --> 00:17:17,520 е 0x10, и адресата на y е 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Па a и b се еднакви на 0x10 и 0x14, соодветно. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Сега во линија три, кои се x и y? 394 00:17:26,250 --> 00:17:28,554 Па, ништо не се промени за x и y во овој момент. 395 00:17:28,554 --> 00:17:30,470 Иако тие се внатрешноста на главниот оџак рамка, 396 00:17:30,470 --> 00:17:32,469 тие се уште ги имаат истите вредностите што беше порано. 397 00:17:32,469 --> 00:17:34,030 Не сме изменета било меморија. 398 00:17:34,030 --> 00:17:35,710 Па x е 1, y е 2. 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 Сите во право. 401 00:17:37,050 --> 00:17:40,300 Па сега што рековме int tmp еднаква на ѕвезда на. 402 00:17:40,300 --> 00:17:44,410 Значи во согласност четири, сè е иста, освен за tmp. 403 00:17:44,410 --> 00:17:47,130 Не сме промениле вредности за ништо освен за мали. 404 00:17:47,130 --> 00:17:49,230 Ние сме поставување мали еднаква на Ѕвездена. 405 00:17:49,230 --> 00:17:50,620 Што е ѕвезда на? 406 00:17:50,620 --> 00:17:56,240 Па, поени на X, па Ѕвездена се случува да се еднакви x, што е 1. 407 00:17:56,240 --> 00:18:00,080 Значи се што е копиран надолу, и мали е поставен на 1. 408 00:18:00,080 --> 00:18:01,110 >> Сега на следната линија. 409 00:18:01,110 --> 00:18:03,380 Ѕвездена еднаква ѕвезда б. 410 00:18:03,380 --> 00:18:10,000 Па по линија five-- и повторно, сè е ист со исклучок што Ѕвездена е. 411 00:18:10,000 --> 00:18:10,830 Што е ѕвезда на? 412 00:18:10,830 --> 00:18:13,720 Па, ние едноставно се рече ѕвезда на x. 413 00:18:13,720 --> 00:18:16,400 Па ние сме менување х на еднаков ѕвезда б. 414 00:18:16,400 --> 00:18:18,960 Што е ѕвезда б? y. б поени на y. 415 00:18:18,960 --> 00:18:21,030 Па ѕвезда b е y. 416 00:18:21,030 --> 00:18:25,140 Па ние сме поставување на х еднаква на Y, и сè друго е исто. 417 00:18:25,140 --> 00:18:29,130 Па ќе видиме во следниот ред дека x е сега 2, а останатите се само копирани надолу. 418 00:18:29,130 --> 00:18:31,120 >> Сега во следната линија, ѕвезда б еднаква мали. 419 00:18:31,120 --> 00:18:34,740 Па, ние едноставно се рече ѕвезда b е y, па ние сме поставување у еднаква на мали. 420 00:18:34,740 --> 00:18:37,450 Сè друго е исто, па сè добива копирани надолу. 421 00:18:37,450 --> 00:18:42,050 Ние сме поставување у еднаква на мали, што е еден, а сè друго е исто. 422 00:18:42,050 --> 00:18:43,210 >> Сега конечно, линија седум. 423 00:18:43,210 --> 00:18:44,700 Ние сме назад во главната функција. 424 00:18:44,700 --> 00:18:46,350 Ние сме по трампа е завршена. 425 00:18:46,350 --> 00:18:48,972 Го изгубивме а, б, и мали, но на крајот ние 426 00:18:48,972 --> 00:18:51,180 не се менува секој вредности на ништо во овој момент, 427 00:18:51,180 --> 00:18:52,800 ние само копија x и y надолу. 428 00:18:52,800 --> 00:18:56,490 И гледаме дека x и y се сега 2 и 1, наместо на 1 и 2. 429 00:18:56,490 --> 00:18:58,160 На swap успешно извршена. 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> Прашање 28. 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 Да претпоставиме дека ќе се судрите пораки за грешки 434 00:19:03,100 --> 00:19:06,790 подолу текот на работното време следната година како CA или ТФ. 435 00:19:06,790 --> 00:19:08,930 Советува како да го надминете секоја од овие грешки. 436 00:19:08,930 --> 00:19:11,160 Толку недефиниран однос на GetString. 437 00:19:11,160 --> 00:19:12,540 Зошто и вие може да видите ова? 438 00:19:12,540 --> 00:19:15,380 Па, ако ученикот е со користење на GetString во нивниот код, 439 00:19:15,380 --> 00:19:20,310 тие се правилно хаш вклучени cs50 точка ж да го вклучите cs50 библиотека. 440 00:19:20,310 --> 00:19:22,380 >> Па, она што тие треба да се поправи оваа грешка? 441 00:19:22,380 --> 00:19:26,810 Тие треба да се направи цртичка lcs50 на командната линија кога тие се составувањето. 442 00:19:26,810 --> 00:19:29,501 Значи, ако тие не го положи ѕвекот цртичка lcs50, тие се 443 00:19:29,501 --> 00:19:32,000 нема да има вистински код кој имплементира GetString. 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> Прашање 29. 446 00:19:34,170 --> 00:19:36,190 Имплицитно прогласување библиотека функција strlen. 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 Па ова сега, тие не се направиле правилното хаш се вклучат. 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 Во конкретниов случај, хедер датотека тие треба да се вклучат е низа точки час, 451 00:19:45,410 --> 00:19:48,710 вклучувајќи и низа точка ж, сега на student-- сега компајлерот 452 00:19:48,710 --> 00:19:51,750 има пристап до декларации на strlen, 453 00:19:51,750 --> 00:19:54,120 и таа знае дека вашиот код е користење на strlen правилно. 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> Прашање 30. 456 00:19:56,580 --> 00:20:00,240 Повеќе проценти конверзии од податоците аргументи. 457 00:20:00,240 --> 00:20:01,540 Па што е ова? 458 00:20:01,540 --> 00:20:06,470 Добро се сеќавам дека овие проценти signs-- како тие се релевантни за printf. 459 00:20:06,470 --> 00:20:08,890 Значи во printf можеме да percent-- ние може да печати нешто 460 00:20:08,890 --> 00:20:11,380 како посто обратна коса црта n. 461 00:20:11,380 --> 00:20:15,310 Или ние може да печати како посто, простор, посто, просторот, посто. 462 00:20:15,310 --> 00:20:18,950 Значи за секоја од овие проценти знаци, ние треба 463 00:20:18,950 --> 00:20:21,560 да помине променлива на крајот на printf. 464 00:20:21,560 --> 00:20:26,980 >> Значи, ако ние велиме printf paren проценти Јас обратна коса црта n блиску paren, 465 00:20:26,980 --> 00:20:30,270 добро, велиме дека ние сме случува да се печати цел број, 466 00:20:30,270 --> 00:20:33,970 но тогаш не го положи printf цел број за да всушност се печати. 467 00:20:33,970 --> 00:20:37,182 Значи тука повеќе проценти конверзии од податоците аргументи? 468 00:20:37,182 --> 00:20:39,390 Тоа е велејќи дека имаме целиот куп на проценти, 469 00:20:39,390 --> 00:20:42,445 а ние немаме доволно променливи всушност да се пополни во тие проценти. 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> И тогаш дефинитивно, на прашањето 31, дефинитивно изгуби 40 бајти во една блокови. 472 00:20:50,010 --> 00:20:52,350 Значи ова е Valgrind грешка. 473 00:20:52,350 --> 00:20:54,720 Ова се велејќи дека некаде во вашиот код, 474 00:20:54,720 --> 00:20:59,010 имате распределба односно 40 бајти големи, па можете malloced 40 бајти, 475 00:20:59,010 --> 00:21:00,515 и никогаш не сте го ослободил. 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 Најверојатно сте само треба да се најдат некои меморија излегуваат во јавноста, 478 00:21:05,140 --> 00:21:07,650 и да се најде каде што треба да ослободи овој блок од меморија. 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> И прашање 32, валиден запишување на големината 4. 481 00:21:11,910 --> 00:21:13,250 Повторно ова е Valgrind грешка. 482 00:21:13,250 --> 00:21:15,440 Ова не треба да се направи со меморија протекување сега. 483 00:21:15,440 --> 00:21:20,750 Ова е, повеќето likely-- Мислам, тоа е некој вид на неважечки меморија права. 484 00:21:20,750 --> 00:21:23,270 И најверојатно ова е некои вид на buffer overflow. 485 00:21:23,270 --> 00:21:26,560 Каде што треба низа, можеби цел број низа, и нека е 486 00:21:26,560 --> 00:21:30,115 велат дека тоа е на големината на 5, а ти обидете се да се допре низа заградата 5. 487 00:21:30,115 --> 00:21:34,150 Значи, ако се обидете да се напише дека вредност, тоа не е парче меморија 488 00:21:34,150 --> 00:21:37,440 кои, всушност, ќе имаат пристап до, и толку си оди за да се добие оваа грешка, 489 00:21:37,440 --> 00:21:39,272 велејќи валиден запишување на големината 4. 490 00:21:39,272 --> 00:21:42,480 Valgrind се случува да се признае сте се обидуваат да допрат меморија несоодветно. 491 00:21:42,480 --> 00:21:43,980 >> И тоа е тоа за quiz0. 492 00:21:43,980 --> 00:21:47,065 Јас сум Роб Бауден, и ова е CS50. 493 00:21:47,065 --> 00:21:51,104