1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 Роб Боуден: Привіт, я Роб Боуден, і давайте поговоримо про 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 З п бітів, скільки різних Значення можуть ви уявляєте? 27 00:01:14,610 --> 00:01:19,080 Так, з п бітів, у вас є 2 Можливі значення для кожного біта. 28 00:01:19,080 --> 00:01:22,300 Таким чином, ми маємо два можливих значення для перший біт, 2 можливих значення 29 00:01:22,300 --> 00:01:24,450 для другого, 2 можливо для третього. 30 00:01:24,450 --> 00:01:28,730 І таким чином, це в 2 рази 2 рази 2, і в кінцевому рахунку, відповідь на 2 л. 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 01010000. 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 Отже, як же ми тепер код, що в C? 59 00:02:42,800 --> 00:02:47,730 Ну, у нас є here-- частина жирним шрифтом це єдина частина, потрібно було реалізовувати. 60 00:02:47,730 --> 00:02:51,950 Тому у нас є 4 петлі, який зациклення 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 а потім збільшуючи I на 1. 66 00:03:05,000 --> 00:03:09,580 Тепер ми хочемо зробити, що в С. Є декілька способів ми могли б зробити це. 67 00:03:09,580 --> 00:03:12,840 Тут ми випадково закодувати назавжди петля як деякий час (правда). 68 00:03:12,840 --> 00:03:16,600 Таким чином, ми оголошуємо змінну I, просто у нас був змінну я в порожньому. 69 00:03:16,600 --> 00:03:21,950 Оголосіть змінну 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 Ми хочемо, щоб роздрукувати ці хештеги, ми хочемо, щоб надрукувати п'ять 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 цикл, який циклу 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 в цієї змінної х, а потім друк цієї змінної с. 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 Так стандарт ю точка ч. 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 і в C, коли ми робимо цілий підрозділ, ми усікти будь-яку десяткову точку. 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 травня 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 що функція повертає істину, якщо п непарне і помилково, якщо п парне. 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 Тому наша аргумент п, якщо н модулю 2 дорівнює 1, а 210 00:09:24,530 --> 00:09:28,030 що означає, що п ділиться на 2 мав залишок. 211 00:09:28,030 --> 00:09:33,270 Якщо п ділиться на 2 мав залишок, що означає, що п непарне, тому ми повернемося вірно. 212 00:09:33,270 --> 00:09:34,910 Інакше ми повернутися помилковим. 213 00:09:34,910 --> 00:09:39,070 Ви також могли б зробити п по модулю 2 рівних нулю, повернутися помилковим, інакше повертає істину. 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 ще повернення п раз е н мінус 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 Це красиво представлені як н факторіала. 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 Так що для междунар я дорівнює 2, я це менше або дорівнює 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 Так ось тут, у нас починаються я дорівнює 2. 236 00:10:34,830 --> 00:10:39,090 Ну, якби я був один, то the-- або якщо н були 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 Точно так же, якщо н були що-небудь менш 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 >> Тепер, якщо п більше 1, то ми збираємося 243 00:10:54,660 --> 00:10:56,550 робити щонайменше один ітерації цього циклу. 244 00:10:56,550 --> 00:11:00,630 Так скажімо, п 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, але більша O п? 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 Тому ми повинні шукати Весь список, все п 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 >> Так що тепер це щось, це і омега н лог н, і велика O н лог н. 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 н лог п, де тета визначається якщо обидва омега і великий виведення однакові. 271 00:12:16,920 --> 00:12:17,580 Обидва п § п. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Щось, що це омега п, і O п квадрат? 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 Таким чином, в кращому випадку, це просто омега п. 282 00:12:43,185 --> 00:12:45,960 Якщо це не просто красиво упорядковано список для початку, 283 00:12:45,960 --> 00:12:48,270 то у нас є O п квадраті свопи. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 І, нарешті, у нас є вибір роду для п квадрат, як омега і великий О. 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 Добре знову, як і раніше, у нас є тільки кінцеве число бітів 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 Таким чином, це число переповнення коли ви тримаєте збільшуючи, 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 >> А як щодо переповнення буфера? 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 Так переповнення буфера, коли Ви намагаєтеся отримати доступ до пам'яті 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 Почнемо з прилавка, п. п вважаючи, скільки символів є. 321 00:14:21,780 --> 00:14:25,560 Отже, ми починаємо з 0, і тоді ми перебрати весь список. 322 00:14:25,560 --> 00:14:29,092 >> Хіба з кронштейном 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, S кронштейна 2. 328 00:14:42,850 --> 00:14:45,050 Ми не продовжуємо, поки ми знайти нульовий термінатор. 329 00:14:45,050 --> 00:14:48,580 Після того, як ми знайшли його, то п містить загальна довжина рядка, 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 Але головний з них, що бульбашкова сортування є омегою п для відсортованого списку. 339 00:15:12,930 --> 00:15:14,950 >> Пам'ятайте, що стіл, який ми тільки що бачили раніше. 340 00:15:14,950 --> 00:15:17,600 Так міхур сортує омегу н, в кращому випадку 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 не злиття роду, незалежно від того, що ви робите, є омега н лог н. 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 У нас є інтервал х дорівнює 1. 376 00:16:45,457 --> 00:16:47,040 Це єдине, що трапилося. 377 00:16:47,040 --> 00:16:50,440 Таким чином, на першій лінії, ми бачимо в нашому Таблиця, що у, а, б, і TMP все 378 00:16:50,440 --> 00:16:51,540 затемнені. 379 00:16:51,540 --> 00:16:52,280 Так що ж таке х? 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 А потім вибудовуються два, ну, ми бачимо, що у встановлений у 2, 383 00:16:58,770 --> 00:17:00,550 і таблиця вже заповнюється для нас. 384 00:17:00,550 --> 00:17:03,040 Так х представляє 1 і Y 2. 385 00:17:03,040 --> 00:17:05,890 >> Тепер, лінія три, ми зараз всередині функції підкачування. 386 00:17:05,890 --> 00:17:07,560 Що ми пройти, щоб поміняти? 387 00:17:07,560 --> 00:17:11,609 Ми пройшли амперсанд х для і амперсанд у до б. 388 00:17:11,609 --> 00:17:15,160 Де проблема раніше зазначено, що адреса X 389 00:17:15,160 --> 00:17:17,520 є 0x10, а також адресу у є 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Так і б дорівнюють 0x10 і 0x14, відповідно. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Тепер на третій лінії, якими є хну? 394 00:17:26,250 --> 00:17:28,554 Ну, нічого не змінилося о х і у в цій точці. 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 Так х дорівнює 1, у дорівнює 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 Ми не змінили які-небудь значення ні про що для TMP крім. 404 00:17:47,130 --> 00:17:49,230 Ми створюємо TMP рівну зірка. 405 00:17:49,230 --> 00:17:50,620 Що таке зірка? 406 00:17:50,620 --> 00:17:56,240 Ну, а точки х, так зірки збирається рівній х, який є 1. 407 00:17:56,240 --> 00:18:00,080 Так що все копіюється вниз, і TMP встановлюється в 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 Ну, ми тільки що сказали, зірка є х. 413 00:18:13,720 --> 00:18:16,400 Таким чином, ми міняємо х на рівну зірки б. 414 00:18:16,400 --> 00:18:18,960 Що таке зірка б? у. б вказує на у. 415 00:18:18,960 --> 00:18:21,030 Так зірка б це у. 416 00:18:21,030 --> 00:18:25,140 Так ми встановлюємо х одно у, а все інше те ж саме. 417 00:18:25,140 --> 00:18:29,130 Отже, ми бачимо в наступному ряду, що х є зараз 2, а решта просто копіюються вниз. 418 00:18:29,130 --> 00:18:31,120 >> Тепер в наступному рядку, зірка б дорівнює TMP. 419 00:18:31,120 --> 00:18:34,740 Ну, ми тільки що сказали, зірка Ь у, так ми встановлюємо у одно TMP. 420 00:18:34,740 --> 00:18:37,450 Все інше те ж саме, таким чином, все копіюється вниз. 421 00:18:37,450 --> 00:18:42,050 Ми встановлюємо у рівну TMP, який є один, а все інше те ж саме. 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 Ми втратили A, B, і TMP, але в кінцевому рахунку ми 426 00:18:48,972 --> 00:18:51,180 Не зміна значень ні про що в цей момент, 427 00:18:51,180 --> 00:18:52,800 ми просто скопіювати хну вниз. 428 00:18:52,800 --> 00:18:56,490 І ми бачимо, що х і у Тепер 2 і 1 замість 1 і 2. 429 00:18:56,490 --> 00:18:58,160 Своп успішно виконала. 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 нижче протягом робочого дня в наступному році, як Каліфорнія або TF. 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 ми могли б відсотків, що ми могли б надрукувати що-небудь 460 00:20:08,890 --> 00:20:11,380 як відсотків я зворотну косу риску н. 461 00:20:11,380 --> 00:20:15,310 Або ми могли б надрукувати, як відсоток I, простір, відсотків я, простір, відсотків я. 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 дужка відсотків я зворотну косу риску н тісні Хлопець, 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 І, швидше за все, це який- роду переповнення буфера. 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