1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Тиждень 2, продовження] 2 00:00:02,270 --> 00:00:04,220 [David J. Малан, Гарвардський університет] 3 00:00:04,220 --> 00:00:06,880 [Це CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Добре. Це CS50, і це в кінці тижня 2. 5 00:00:10,990 --> 00:00:14,410 Якщо ви плануєте бути голодним в цей час завтра, 6 00:00:14,410 --> 00:00:18,620 знати, що ми збираємося провести як невеликою групою завтра, четвер, 1:15 вечора. 7 00:00:18,620 --> 00:00:21,360 Там є URL тут, якщо ви хочете, щоб RSVP. 8 00:00:21,360 --> 00:00:26,740 Місця обмежені, так що вибачте, якщо форма заповнена до того часу ви заповните це. 9 00:00:26,740 --> 00:00:29,300 Інший URL, однак, що може бути цікаво це. 10 00:00:29,300 --> 00:00:32,369 У майже через місяць, курс буде доступна 11 00:00:32,369 --> 00:00:36,890 Все більш широко через EDX, через які люди в Інтернеті буде мати можливість стежити разом, 12 00:00:36,890 --> 00:00:39,380 брати участь у процесі досить активно, насправді. 13 00:00:39,380 --> 00:00:42,270 Вони буду використовувати CS50 і CS50 Appliance Обговорити 14 00:00:42,270 --> 00:00:45,490 і самі різні програмні засоби, які ми вже використали в цьому семестрі. 15 00:00:45,490 --> 00:00:48,710 І одна з ініціатив, які ми хотіли б взяти в якості експерименту в цьому році 16 00:00:48,710 --> 00:00:51,930 , Щоб побачити, як багато змісту, який ми можемо перевести 17 00:00:51,930 --> 00:00:53,960 в інших усних і письмових мов. 18 00:00:53,960 --> 00:00:57,500 Так що, якщо ви могли б мати зацікавленість в участі в цьому проекті 19 00:00:57,500 --> 00:01:02,270 яким ми будемо надавати англійською стенограми і субтитри для лекцій курсу 20 00:01:02,270 --> 00:01:05,450 і шортах і семінарах та секціях і т.п., 21 00:01:05,450 --> 00:01:08,200 якщо ви вільно говорити і писати вільно якусь іншу мову, 22 00:01:08,200 --> 00:01:12,290 ми хотіли б звернутися до вас в цей проект, в якому ви взяти на себе одну або кілька відео, 23 00:01:12,290 --> 00:01:15,200 переводячи їх на мову, ви знаєте досить добре. 24 00:01:15,200 --> 00:01:18,700 >> Щоб дати вам уявлення про інтерфейсі, там даному веб-інтерфейс 25 00:01:18,700 --> 00:01:22,090 , Які ми будемо використовувати, що створить істотно користувальницького інтерфейсу, як це. 26 00:01:22,090 --> 00:01:24,290 Це було мені викладанні деяких Хеллоуїн назад, 27 00:01:24,290 --> 00:01:27,390 і на правій стороні в чорному поруч з цими мітками часу, 28 00:01:27,390 --> 00:01:31,210 Ви побачите різні речі, які вийшли з моїх вуст того дня, 29 00:01:31,210 --> 00:01:34,850 , А потім під ним ви зможете перекласти іншою мовою 30 00:01:34,850 --> 00:01:38,690 саме те, що відображення між ними, в даному випадку, англійського і, скажімо, іспанської мови. 31 00:01:38,690 --> 00:01:40,440 Так що це насправді дуже зручний інструмент. 32 00:01:40,440 --> 00:01:43,370 Ви можете перемотування назад і вперед дуже легко за допомогою сполучень клавіш. 33 00:01:43,370 --> 00:01:47,490 Так що, якщо ви хочете взяти участь в цьому експерименті, і ваші слова бачив і читав 34 00:01:47,490 --> 00:01:51,850 на потенційно тисячі людей там, будь ласка, не соромтеся брати участь. 35 00:01:51,850 --> 00:01:54,350 Одне слово про кошеня з понеділка. 36 00:01:54,350 --> 00:02:00,350 Щоб ми відправили занадто страшно повідомлення, розуміємо, що, як робочий час пропонують 37 00:02:00,350 --> 00:02:03,300 а також розділи пропонують, дизайн, звичайно, дуже багато 38 00:02:03,300 --> 00:02:07,360 , Що студенти співпрацюють і говорити, щоб працювати через проблеми набори 39 00:02:07,360 --> 00:02:11,260 і проблеми разом, і дійсно лінії просто зводиться до того, 40 00:02:11,260 --> 00:02:16,010 знову, робота, яку ви в кінцевому підсумку уявити, повинні бути вашої власної. 41 00:02:16,010 --> 00:02:18,860 І, чесно кажучи, в робочий час це абсолютно нормально, 42 00:02:18,860 --> 00:02:22,240 це повністю можна очікувати навіть поговорити з деякими один поруч з вами. 43 00:02:22,240 --> 00:02:24,370 >> Якщо він чи вона бореться з деякими тему і ви, як: 44 00:02:24,370 --> 00:02:27,940 "Ну, що ж, дозвольте мені дати вам уявлення про деякою рядки коду, який я написав," це нормально, 45 00:02:27,940 --> 00:02:31,250 що відбувається, і це дуже сприяє, я думаю, з процесом навчання. 46 00:02:31,250 --> 00:02:36,750 Там, де лінія перетнула отримує, коли голова нахилена роду тут для занадто багатьох секунд 47 00:02:36,750 --> 00:02:41,160 або хвилин для того, щоб дійсно тільки що були можливості для розблокування вашого друга, 48 00:02:41,160 --> 00:02:44,160 і, звичайно, коли все стає обмін електронною поштою і Dropbox і т.п., 49 00:02:44,160 --> 00:02:45,640 там теж є лінії. 50 00:02:45,640 --> 00:02:48,620 Таким чином, всі кошти відчувати себе комфортно і надихає спілкуватися з друзями 51 00:02:48,620 --> 00:02:52,810 і однокласникам про psets і більше і просто розумію, що те, що ви в кінцевому підсумку представити 52 00:02:52,810 --> 00:02:57,340 повинно бути дійсно продукт вашої творчості, а не хтось інший. 53 00:02:57,340 --> 00:03:00,490 І ось одна з предметно-орієнтованих завдань для pset2, 54 00:03:00,490 --> 00:03:04,740 який вийде пізно ввечері завтра, поринути у світ криптографії, 55 00:03:04,740 --> 00:03:08,970 , Яка є мистецтвом шифрування або скремблювання інформації, 56 00:03:08,970 --> 00:03:12,600 і це в кінцевому рахунку належить до світу безпеці. 57 00:03:12,600 --> 00:03:16,560 Тепер, безпека для більшості з нас приходить у вигляді досить мирської механізмів. 58 00:03:16,560 --> 00:03:19,050 У всіх нас є імена користувачів і паролі, 59 00:03:19,050 --> 00:03:23,450 і у всіх нас є дуже погані імена користувачів і паролі, швидше за все. 60 00:03:23,450 --> 00:03:28,240 >> Якщо ваш пароль так само на декількох веб-сайтах, що, ймовірно, не найкраща ідея, 61 00:03:28,240 --> 00:03:30,070 як ми обговоримо ближче до кінця семестру. 62 00:03:30,070 --> 00:03:34,720 Якщо ваш пароль записується на записки - не жарт - на вашому моніторі, 63 00:03:34,720 --> 00:03:38,350 це теж не обов'язково кращий дизайн, але досить поширене явище. 64 00:03:38,350 --> 00:03:42,470 І якщо ви не використовуєте криптографію для шифрування паролів, 65 00:03:42,470 --> 00:03:44,210 вони особливо вразливі. 66 00:03:44,210 --> 00:03:47,270 Так що якщо ви думаєте, що бути супер розумний, маючи прихований документ Word 67 00:03:47,270 --> 00:03:49,910 десь на вашому жорсткому диску, який має всі ваші паролі 68 00:03:49,910 --> 00:03:53,670 але це в папці, що ніхто не збирається заглянути, що теж не дуже надійний механізм. 69 00:03:53,670 --> 00:03:56,990 І те, що pset2 представить це мистецтво криптографії 70 00:03:56,990 --> 00:04:02,010 і скремблювання інформації, так що такі речі, як паролі все більш безпечною. 71 00:04:02,010 --> 00:04:05,790 Контекст тут є те, що з небезпечною даних 72 00:04:05,790 --> 00:04:07,930 приходить можливість зашифрувати його і, щоб засекретити його. 73 00:04:07,930 --> 00:04:11,470 І ось цей, наприклад, є прикладом зашифроване повідомлення. 74 00:04:11,470 --> 00:04:14,700 Це насправді щось говорить англійською мовою, але це явно не цілком очевидна. 75 00:04:14,700 --> 00:04:18,279 І ми пройшли повне коло сьогодні, щоб дратувати один від одного, що це секретне повідомлення тут. 76 00:04:18,279 --> 00:04:23,490 Але в реальному світі комп'ютерів, речі, навіть не схоже, що вони можуть бути англійські фрази. 77 00:04:23,490 --> 00:04:28,430 Наприклад, це те, що ви можете знайти на стандартній Linux або Mac або UNIX комп'ютер 78 00:04:28,430 --> 00:04:32,070 у файл, який був колись називали файлу паролів. 79 00:04:32,070 --> 00:04:34,200 >> В даний час це були переміщені в інші місця. 80 00:04:34,200 --> 00:04:39,210 Але якщо ви подивитеся в потрібному місці в системі, ви побачите не тільки ваше ім'я користувача 81 00:04:39,210 --> 00:04:43,400 або інших людей в системі, але ви побачите, зашифровану версію пароля. 82 00:04:43,400 --> 00:04:47,980 Дійсно, слово склеп там припускає, що наступні речі в зашифрованому вигляді, 83 00:04:47,980 --> 00:04:52,680 і цей ряд, здавалося б, випадкових літер та символів і цифр і т.д. 84 00:04:52,680 --> 00:04:56,480 можуть бути розшифровані тільки в цілому знаючи деякі таємниці - 85 00:04:56,480 --> 00:04:58,840 секретне слово, секретний номер - 86 00:04:58,840 --> 00:05:03,160 і так насправді, мистецтво криптографії в кінцевому рахунку, зводиться до того, довіряти якійсь 87 00:05:03,160 --> 00:05:05,650 і знаючи те, що хтось не робить. 88 00:05:05,650 --> 00:05:10,090 Таким чином, ми розглянемо це в трохи більш докладно сьогодні і в PSET в майбутньому. 89 00:05:10,090 --> 00:05:12,200 А тепер кілька слів про Pass / Fail. 90 00:05:12,200 --> 00:05:15,360 Тим більше, що деякі з вас пірнув у pset1, техніка, 91 00:05:15,360 --> 00:05:19,080 і зовсім новий світ для себе, розумієш, що розчарування і розгубленість 92 00:05:19,080 --> 00:05:21,700 і тільки технічні труднощі, цілком можна чекати, 93 00:05:21,700 --> 00:05:24,180 Особливо з першим PSET, де є так багато всього нового, 94 00:05:24,180 --> 00:05:27,730 тільки знайомиться з Л. та компакт-диск, і всі ці таємні команди 95 00:05:27,730 --> 00:05:33,050 і нове середовище, і це окремо від фактичного матеріалу та програмування себе. 96 00:05:33,050 --> 00:05:36,940 Так розумію також, що є, звичайно, робочі години, які існують в якості опорної конструкції. 97 00:05:36,940 --> 00:05:38,880 >> Розділи почати в найближчу неділю. 98 00:05:38,880 --> 00:05:42,960 Але найголовніше, якщо ви відчуваєте себе просто, що це не світ для вас, 99 00:05:42,960 --> 00:05:44,710 розумієш, що це дійсно просто потрібен час. 100 00:05:44,710 --> 00:05:48,600 І якби не ця можливість років тому для мене взяти клас придатний / не придатний, 101 00:05:48,600 --> 00:05:50,990 Чесно кажучи, я ніколи б навіть ступити в класі. 102 00:05:50,990 --> 00:05:53,690 І ви можете змінити це до, скажімо, п'ятий понеділок звичайно, 103 00:05:53,690 --> 00:05:58,280 так що якщо ви на краю тепер, розумієш, що замість голови в деяких інших вод в цілому, 104 00:05:58,280 --> 00:06:01,260 цього, звичайно, розглядати тільки зміни в залік / незалік. 105 00:06:01,260 --> 00:06:04,570 Знову ж таки, це не зовсім цю культуру тут, в Гарварді приймати речі залік / незалік 106 00:06:04,570 --> 00:06:08,670 так як все насправді хоче досягти або overachieve, 107 00:06:08,670 --> 00:06:11,130 але, чесно кажучи, це прекрасний спосіб спробувати щось з 108 00:06:11,130 --> 00:06:16,720 які не можуть бути вам знайомі, і ви будете в кінцевому підсумку роблять, в більшості випадків, цілком нормально, 109 00:06:16,720 --> 00:06:18,210 можливо, багато чого до вашого подив. 110 00:06:18,210 --> 00:06:20,980 І більш конкретно, то, що я думаю, що придатний / не придатний взагалі робить, 111 00:06:20,980 --> 00:06:22,940 Особливо, як ви, можливо, випробували з pset0, 112 00:06:22,940 --> 00:06:26,560 якщо ви покладете в 10 годин, 15 годин, 25 годин в деяких PSET 113 00:06:26,560 --> 00:06:29,920 і ви просто битися головою об стіну, і вона стає супер пізно вночі 114 00:06:29,920 --> 00:06:33,950 але ви зробили PSET 90% шляху, і ви просто не можу зрозуміти одну річ, 115 00:06:33,950 --> 00:06:36,520 придатний / не придатний дійсно знімає гостроту класу, як це, 116 00:06:36,520 --> 00:06:39,100 де ви можете сортувати радісно кажуть: "Добре, я знаю, що це не ідеальний, 117 00:06:39,100 --> 00:06:42,350 Але я працював від своєї дупи на це, я дуже щаслива з тим, де це закінчилося », 118 00:06:42,350 --> 00:06:44,850 і що буде відповідати очікуванням за залік / незалік. 119 00:06:44,850 --> 00:06:47,540 Так що майте це на увазі. Добре. 120 00:06:47,540 --> 00:06:50,520 >> Так що ті з вас, хто намагався використовувати Гарвардського університету Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 знаю, що є CS50 SSID, Wi-Fi з'єднання, плаваючі навколо 122 00:06:54,780 --> 00:06:56,490 що ви могли б краще удачі. 123 00:06:56,490 --> 00:07:00,130 Це трохи парадоксально, що пароль для цього, якщо ви хотіли б спробувати підключенні до цього 124 00:07:00,130 --> 00:07:08,350 для кращої швидкості - і дайте нам знати, якщо це не краще - 12345, на всьому шляху до 8 125 00:07:08,350 --> 00:07:10,910 тому що 8 є більш безпечною, ніж 5. 126 00:07:10,910 --> 00:07:16,910 Так що якщо вам потрібен Wi-Fi пароль, підключитися до бездротового CS50 тут, 12345678, 127 00:07:16,910 --> 00:07:20,380 і повідомлення про CS50 Обговорити якщо ви досі періодично виникаючих проблем підключення, 128 00:07:20,380 --> 00:07:25,420 і ми дамо повноваження, які будуть знати цей простір. Добре. 129 00:07:25,420 --> 00:07:32,230 Так швидко тизер, особливо для тих з вас, хто вентилятора хлопчиків і дівчаток усіх Яблуко речі. 130 00:07:32,230 --> 00:07:37,460 Те, що я викопав з кілька років тому був цей файл тут, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 тільки вигляд роблять більш конкретні і більш складні 132 00:07:39,930 --> 00:07:42,560 деякі з найбільш основних програм C ми вже писали. 133 00:07:42,560 --> 00:07:46,910 Так я відкрив цей файл, iUnlock.c. Він доступний на сторінці Лекції на сьогоднішній день. 134 00:07:46,910 --> 00:07:49,810 На лівій стороні ви побачите довгий список функцій. 135 00:07:49,810 --> 00:07:53,230 Таким чином, чоловік, який написав це написав багато функцій, більше, ніж просто основний. 136 00:07:53,230 --> 00:07:57,340 Він використовував цілу купу бібліотек тут, і якщо ми почнемо прокрутки, 137 00:07:57,340 --> 00:08:04,890 що це насправді найперший, я вважаю, крек для оригінального iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Коли б Ви хотіли зробити джейлбрейк оригінальний iPhone, а це значить неприв'язаних джейлбрейк від AT & T 139 00:08:09,830 --> 00:08:13,710 і фактично встановити спеціальне програмне забезпечення на ньому і робити те, що Яблуко не хочу, щоб люди роблять, 140 00:08:13,710 --> 00:08:18,480 хтось взяв час, щоб з'ясувати, як саме вони можуть використовувати програмні помилки, 141 00:08:18,480 --> 00:08:22,690 помилки, помилки, в програмному забезпеченні Apple, і таким чином народився iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 що якщо ви зібрали його на свій комп'ютер і встановити його на iPhone 143 00:08:26,760 --> 00:08:29,430 , Який був підключений до комп'ютера за допомогою, скажімо, кабель USB, 144 00:08:29,430 --> 00:08:32,450 це дасть вам адміністративної або привілеї на вашому iPhone 145 00:08:32,450 --> 00:08:34,620 і дозволяють зробити дуже багато, що ви хочете. 146 00:08:34,620 --> 00:08:36,400 І ось там був цей захоплюючий кішки-мишки 147 00:08:36,400 --> 00:08:39,340 між Яблуком і решти світу, зокрема, так як вони, як і багато компаній, 148 00:08:39,340 --> 00:08:43,350 намагаються заблокувати свої речі вниз, так що ви можете зробити тільки з ним, що вони мають намір. 149 00:08:43,350 --> 00:08:47,360 Але завдяки таким людям, як це і розуміння низького рівня деталей - 150 00:08:47,360 --> 00:08:50,830 і в цьому випадку C програмування - і багато знайомих конструкцій 151 00:08:50,830 --> 00:08:55,280 що ми почали грати, ви зможете по-справжньому використовують апаратну 152 00:08:55,280 --> 00:08:59,250 таким чином, ви вважаєте за потрібне, і не обов'язково деяким юридичною особою. 153 00:08:59,250 --> 00:09:01,600 Так, наприклад, я поняття не маю, що все це роблять, 154 00:09:01,600 --> 00:09:03,580 але GetVersion звучить досить просто, 155 00:09:03,580 --> 00:09:05,710 і, схоже, це функція, що ця людина написала. 156 00:09:05,710 --> 00:09:09,250 Це займе деякий ціле число в якості аргументу, нічого не повертає, 157 00:09:09,250 --> 00:09:13,710 але, здається, петлі з циклу тут і, якщо умова, якщо умова перерви, 158 00:09:13,710 --> 00:09:16,770 і так чи інакше пов'язана з номерами версій, якщо прокрутити вниз, 159 00:09:16,770 --> 00:09:19,650 хоча багато з цих ключових слів буде новий. 160 00:09:19,650 --> 00:09:22,590 І є багато функцій тут ми ніколи не бачили і не могли б ніколи не побачить 161 00:09:22,590 --> 00:09:24,350 протягом семестру. 162 00:09:24,350 --> 00:09:29,160 >> Зрештою, це слід тим же правилам і логіці, що ми грали з досі. 163 00:09:29,160 --> 00:09:34,340 Так що це занадто старий, щоб зламати ваш iPhone або 3s 4s 5s або незабаром ці дні, 164 00:09:34,340 --> 00:09:38,830 але знаю, що все це дуже отримані з цього світу, що ми пірнули. 165 00:09:38,830 --> 00:09:42,280 Давайте поглянемо на декілька більш простий приклад: 166 00:09:42,280 --> 00:09:46,260 це, просто зігрітися з деякими синтаксису, а також деякі інші типи даних 167 00:09:46,260 --> 00:09:48,910 що ми говорили, але дійсно не бачив в C. 168 00:09:48,910 --> 00:09:53,670 Цей файл називається positive1.c, і в коментарях на вершині, 169 00:09:53,670 --> 00:09:56,070 це просто вимагає, щоб користувач забезпечити позитивне число. 170 00:09:56,070 --> 00:09:59,910 Так що це приклад зроби той час як цикл, який хороший для користувачів інтерактивних програм 171 00:09:59,910 --> 00:10:02,070 де ви повинні сказати користувачеві, щоб щось зробити, 172 00:10:02,070 --> 00:10:05,530 і якщо вони не співпрацюють ви кричати на них або відхилити їх введення. 173 00:10:05,530 --> 00:10:10,480 Справа в точку: я збираюся робити рядках 19 до 24 174 00:10:10,480 --> 00:10:14,620 тих пір, поки користувач не дав мені позитивне число. 175 00:10:14,620 --> 00:10:21,340 Ця деталь тут, на лінії 18, чому я заявляю, п вище всього цього циклу побудувати 176 00:10:21,340 --> 00:10:26,870 на відміну від прямо поруч з лінією 22, де я насправді піклуються, щоб отримати п? Так. 177 00:10:26,870 --> 00:10:29,330 [Студент] Scope. >> Да, так що це питання з області видимості. 178 00:10:29,330 --> 00:10:31,770 І з точки зору непрофесіонала, що робить область відноситься? 179 00:10:34,880 --> 00:10:41,560 Так. >> [Нерозбірливо відповідь студента] >> Чи можете ви говорити голосніше? 180 00:10:41,560 --> 00:10:45,440 [Студент] Де можна отримати доступ до цієї змінної. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Де Ви можете отримати доступ до конкретної змінної. 182 00:10:47,610 --> 00:10:50,990 І взагалі, правило досі було, що сфера деякі змінні 183 00:10:50,990 --> 00:10:56,140 визначається самою останньою фігурні дужки, що ви бачили. 184 00:10:56,140 --> 00:11:03,070 >> І тому в даному випадку, якщо я зробив помилку, оголосивши п на лінії 22, що лінія буде працювати. 185 00:11:03,070 --> 00:11:10,840 Я хотів би отримати ціле число, і я б поставив його в цій змінній п у рядку 22, 186 00:11:10,840 --> 00:11:17,060 але який рядок коду тепер не знаю, що я говорю? >> [Студент] 25. 187 00:11:17,060 --> 00:11:23,840 [Малан] 25, і виявляється, що 24, а тому, що в цьому випадку він виходить за межі фігурні дужки. 188 00:11:23,840 --> 00:11:28,550 Так що просто трохи неприємність, але дуже легко вирішується просто оголосити змінну 189 00:11:28,550 --> 00:11:30,700 за межами самої функції. 190 00:11:30,700 --> 00:11:32,760 Пізніше ми побачимо, сьогодні ви можете зробити ще один крок 191 00:11:32,760 --> 00:11:34,940 і ви навіть можете отримати трохи лінивий. 192 00:11:34,940 --> 00:11:39,660 І це не рекомендується взагалі, але ви можете навіть отримати ледачого 193 00:11:39,660 --> 00:11:44,150 і покласти змінну в глобальному масштабі, так би мовити, не всередині функції, а не всередині циклу, 194 00:11:44,150 --> 00:11:49,800 але в самому файлі, за межами всіх функцій ви написали, як я зробив тут, на лінії 15. 195 00:11:49,800 --> 00:11:55,220 Це, як правило, з несхваленням, але розумію, що це рішення іноді до інших проблем, 196 00:11:55,220 --> 00:11:56,910 як ми в кінцевому рахунку бачити. 197 00:11:56,910 --> 00:11:59,500 Так що зараз ми залишимо це так, але давайте подивимося, якщо ми можемо переписати це 198 00:11:59,500 --> 00:12:02,360 тільки, щоб почати виразити себе трохи по-іншому. 199 00:12:02,360 --> 00:12:05,550 Ця програма, просто щоб бути ясно, є positive1. 200 00:12:05,550 --> 00:12:11,980 Дозвольте мені йти вперед тут і в моєму вікні терміналу зробити positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Компілює порядку. Я збираюся запустити positive1, натисніть Enter. 202 00:12:15,080 --> 00:12:19,250 Я вимагаю, щоб ви дати мені ціле позитивне число. Я скажу -1. Це не працює. 203 00:12:19,250 --> 00:12:22,340 0, 99. Це схоже на роботу. 204 00:12:22,340 --> 00:12:25,310 Може бути, не найсуворіший тест, але принаймні це гарна перевірка осудності 205 00:12:25,310 --> 00:12:27,100 що ми знаходимося на правильному шляху. 206 00:12:27,100 --> 00:12:29,570 >> Так що тепер дозвольте мені йти вперед і відкрити версію 2 цієї, 207 00:12:29,570 --> 00:12:32,800 і чим відрізняється вже? 208 00:12:32,800 --> 00:12:39,030 Він реалізує ту ж саму річ, але те, що стрибає, як чітко в цей раз? 209 00:12:40,790 --> 00:12:47,090 Це BOOL в зелений колір. Він буде виділено зеленим кольором, це ключове слово відоме як логічний, який є типом даних. 210 00:12:47,090 --> 00:12:50,510 Вона не приходить побудований в для всіх версій C. 211 00:12:50,510 --> 00:12:52,650 Вам необхідно включити конкретну бібліотеку. 212 00:12:52,650 --> 00:12:56,460 У нашому випадку, я включив CS50 бібліотеку, так що у нас є доступ до BOOL. 213 00:12:56,460 --> 00:12:59,860 Але в рядку 18, ми, здається, є логічне значення тут називають вдячні. 214 00:12:59,860 --> 00:13:02,190 Я міг би назвати це що завгодно, але я назвав його вдячна 215 00:13:02,190 --> 00:13:04,750 просто вид передають смислове значення. 216 00:13:04,750 --> 00:13:07,700 Таким чином, спочатку на лінії 18, я, мабуть, не вдячний 217 00:13:07,700 --> 00:13:12,230 тому що логічне значення вдячні ініціалізується помилковим у рядку 18. 218 00:13:12,230 --> 00:13:16,500 І тоді здається, що я зробив тут в рядках з 21 по 23 219 00:13:16,500 --> 00:13:19,200 це я тільки частково переписати мою логіку. 220 00:13:19,200 --> 00:13:26,100 Так що не функціонально різні, але в рядку 22 тепер я можу перевірити, якщо Int користувач надав 221 00:13:26,100 --> 00:13:31,360 більше 0, то я просто змінити значення вдячні правда. 222 00:13:31,360 --> 00:13:35,590 А навіщо мені це робити? Тому що в рядку 25, мабуть, я збираюся перевірити стан. 223 00:13:35,590 --> 00:13:39,760 У цього циклу в той час як вдячний є хибним. 224 00:13:39,760 --> 00:13:42,960 Так що я запропонував це в якості альтернативи версія 1 225 00:13:42,960 --> 00:13:47,050 тому що це принаймні трохи більш інтуїтивним, можливо, це трохи більш обгрунтованою на англійській мові. 226 00:13:47,050 --> 00:13:51,980 Таким чином, виконайте такі дії, поки ви не вдячні або при вдячні є хибним. 227 00:13:51,980 --> 00:13:56,220 І на цей раз я теж, мабуть, не люблю згадувати те, що користувач набрав в 228 00:13:56,220 --> 00:14:00,050 тому що повідомлення немає змінної п, так насправді, маленька біла брехня там. 229 00:14:00,050 --> 00:14:03,290 >> Функціонально програма трохи відрізняється, як тільки ми перейдемо до нижньої його 230 00:14:03,290 --> 00:14:04,960 тому що я не пам'ятав, що п. 231 00:14:04,960 --> 00:14:09,120 Але я хотів показати тут, що, хоча ми бачили GetInt 232 00:14:09,120 --> 00:14:13,780 і GetString використовується на праву сторону знаку рівності досі 233 00:14:13,780 --> 00:14:17,310 так що ми пам'ятаємо значення, технічно, це не строго обов'язково. 234 00:14:17,310 --> 00:14:20,290 Якщо з якихось причин ви просто не піклуються, щоб зберегти значення, 235 00:14:20,290 --> 00:14:25,540 Ви просто хочете перевірити значення, помітили, що ми можемо просто написати це як GetInt, 236 00:14:25,540 --> 00:14:27,320 відкрита дужка, поруч хлопець. 237 00:14:27,320 --> 00:14:30,570 Ця функція буде повертати значення, як ми вже говорили. 238 00:14:30,570 --> 00:14:32,220 Це буде повернути вам Int. 239 00:14:32,220 --> 00:14:34,460 І тому, якщо ви подумки думаю, що це відбудеться, 240 00:14:34,460 --> 00:14:38,190 при введенні в 99, GetInt повертає число 99, 241 00:14:38,190 --> 00:14:41,840 і так концептуально, це як би мій код був насправді цього. 242 00:14:41,840 --> 00:14:45,950 Так, якщо 99 дійсно більше 0, то вдячний стає істинним, 243 00:14:45,950 --> 00:14:50,810 Потім лінія 25 реалізує ох, ми зробили, тому що я зараз вдячний, 244 00:14:50,810 --> 00:14:53,970 і в рядку 26, ми просто говоримо: "Спасибі за натуральне!" 245 00:14:53,970 --> 00:14:55,960 Як би там не трапилося бути. 246 00:14:55,960 --> 00:14:59,140 Тепер давайте зробимо невеликий синтаксичний цукор тут, так би мовити. 247 00:14:59,140 --> 00:15:04,670 Давайте подивимося, якщо ми можемо прибирати цю лінію 25 з цим третій і останній варіант, в positive3. 248 00:15:04,670 --> 00:15:13,600 >> Зверніть увагу, з тією лише різницею, що тепер це рядок коду? >> [Студент] 25. >> [Малан] Так, 25. 249 00:15:13,600 --> 00:15:17,680 І ми дійсно не бачив цей трюк, але його ми бачили знак оклику в понеділок, 250 00:15:17,680 --> 00:15:21,070 , Який позначає, що? >> [Студент] Не. >> Не чи заперечення. 251 00:15:21,070 --> 00:15:23,510 Так що беріть логічне значення і перевернути його значення. 252 00:15:23,510 --> 00:15:25,810 Правда, стає помилковим, помилкове стає істинним. 253 00:15:25,810 --> 00:15:30,420 Так що це, я хотів би запропонувати, навіть трохи більш інтуїтивним способом написання коду 254 00:15:30,420 --> 00:15:33,430 тому що я досі вдячний ініціалізації помилковим, я все ще роблю таке, 255 00:15:33,430 --> 00:15:36,010 Я поставив вдячні вірно, коли прийде час, 256 00:15:36,010 --> 00:15:40,880 але тепер ви дійсно можете просто перевести цей код усно зліва направо, 257 00:15:40,880 --> 00:15:45,630 а (благодарни!), тому що вибуху або знак оклику позначає поняття не 258 00:15:45,630 --> 00:15:47,580 так що поки не вдячні. 259 00:15:47,580 --> 00:15:49,900 Отже, ще раз, ми не введені нові поняття як такого. 260 00:15:49,900 --> 00:15:53,730 Ми говорили про логічних тому, коли ми грали з нуля, 261 00:15:53,730 --> 00:15:56,720 але розумію, тепер ми можемо просто почати писати наш код по-різному. 262 00:15:56,720 --> 00:16:01,060 Таким чином, особливо в pset1 якщо ви начебто намагається з'ясувати спосіб, щоб написати кілька програм, 263 00:16:01,060 --> 00:16:04,340 Шанси Вам пощастило, тому що там може бути будь-яке число рішень 264 00:16:04,340 --> 00:16:06,110 що ви можете випадково зустріти. 265 00:16:06,110 --> 00:16:10,500 Наприклад, це знаходиться всього в 3 навіть для найпростіших програм. Добре. 266 00:16:10,500 --> 00:16:14,200 А тепер згадаємо в понеділок ми вийшли на цю записку з поверненням значення. 267 00:16:14,200 --> 00:16:18,450 Таким чином, в перший раз, коли ми написали програму, яка не просто основний; 268 00:16:18,450 --> 00:16:22,550 вона також має свою власну функцію, яку я написав тут. 269 00:16:22,550 --> 00:16:26,810 Таким чином, у рядку 31 по 34 я реалізував функцію куб. 270 00:16:26,810 --> 00:16:30,240 Це не комплекс. Це просто * а * а в цьому випадку. 271 00:16:30,240 --> 00:16:34,750 Але, що важливо про нього, що я беру вхід у вигляді 272 00:16:34,750 --> 00:16:39,180 і я повертаюся вихід у вигляді * а *. 273 00:16:39,180 --> 00:16:43,560 Так що тепер у мене є можливість, так само, як я раніше з prinf один, 274 00:16:43,560 --> 00:16:47,240 для виклику цієї функції, викликавши функцію куб. 275 00:16:47,240 --> 00:16:51,970 >> І куб функція приймає деякі вхід, і куб функція повертає деякий вихід. 276 00:16:51,970 --> 00:16:56,960 На відміну від Printf просто щось зробив. 277 00:16:56,960 --> 00:17:00,840 Вона не повертає нічого, що ми дбали про, хоча, як в сторону воно повертає значення; 278 00:17:00,840 --> 00:17:03,110 Ви просто взагалі ігнорують його. 279 00:17:03,110 --> 00:17:06,510 Printf просто щось зробив. Це був побічний ефект друку на екрані. 280 00:17:06,510 --> 00:17:11,770 На відміну від тут, у нас є куб функції, які насправді повертає щось. 281 00:17:11,770 --> 00:17:15,520 Так що для тих, хто знайомий з цим, це досить проста ідея. 282 00:17:15,520 --> 00:17:19,640 Але для тих, хто менш знайомий з цією ідеєю проходять в входи і виходи повертаються, 283 00:17:19,640 --> 00:17:21,950 Давайте спробуємо просто щось супер просто. 284 00:17:21,950 --> 00:17:25,490 Хто-небудь зручні підійшовши на етапі коротко? 285 00:17:25,490 --> 00:17:28,040 Ви повинні бути знайомі з камерою на вас. Так? Добре. 286 00:17:28,040 --> 00:17:31,240 Як тебе звуть? >> [Студент] Кен. >> Кен. Добре. Кен, давай вгору. 287 00:17:31,240 --> 00:17:35,050 Кен буде функція виду тут. 288 00:17:35,050 --> 00:17:38,720 Давайте підемо далі і зробити це. Давайте трохи фантазії. 289 00:17:38,720 --> 00:17:42,260 Дуже приємно. Ласкаво просимо в центрі сцени. Добре. 290 00:17:42,260 --> 00:17:46,640 Давайте хіт цієї кнопки тут. Добре. 291 00:17:46,640 --> 00:17:49,820 Так що тут у вас є сучасний дошці, 292 00:17:49,820 --> 00:17:53,470 і що я є основною функцією, наприклад, 293 00:17:53,470 --> 00:17:56,460 і у мене немає IPad в руках. 294 00:17:56,460 --> 00:17:59,710 >> Я дійсно не пам'ятаю, як - Ну, я не можу сказати. 295 00:17:59,710 --> 00:18:02,480 Я дійсно не мають хороший почерк, 296 00:18:02,480 --> 00:18:05,520 і т.д. Тому я хочу, щоб щось надрукувати на екрані для мене. 297 00:18:05,520 --> 00:18:12,040 Я є основною програмою, і я буду у вас кажуть, що це 298 00:18:12,040 --> 00:18:16,720 записавши її в моїй курячої нуля, а потім повз вас вхід. 299 00:18:16,720 --> 00:18:20,400 Так нерозумно, хоча це вправа, поняття функції і виклику функції 300 00:18:20,400 --> 00:18:22,400 і повернення функцією дійсно зводиться до цього. 301 00:18:22,400 --> 00:18:26,260 Я головний, я тільки що написав Printf, цитата-кінець цитати щось на екрані, 302 00:18:26,260 --> 00:18:29,110 Я йду в цю програму, і як тільки Printf викликається, 303 00:18:29,110 --> 00:18:32,880 він приймає один аргумент або один параметр іноді в подвійні лапки. 304 00:18:32,880 --> 00:18:35,880 Ось це аргумент. Я передаю його Кен. 305 00:18:35,880 --> 00:18:39,020 Він являє собою чорний ящик, написав деяку кількість років тому 306 00:18:39,020 --> 00:18:41,510 які, очевидно, знає тільки як друкувати речі на екрані. 307 00:18:41,510 --> 00:18:43,150 Таким чином виконати. 308 00:18:49,280 --> 00:18:51,280 Це не погано. Дуже добре. 309 00:18:51,280 --> 00:18:55,510 Так що тепер Кен робиться виконання. Йому потрібно, щоб передати мені нічого взамін? 310 00:18:55,510 --> 00:18:57,470 Не те, що ми бачили досі. 311 00:18:57,470 --> 00:19:00,460 Знову ж таки, Printf Чи насправді повертає число, але ми збираємося ігнорувати, що на даний момент 312 00:19:00,460 --> 00:19:03,470 тому що ми ніколи не використовували його. Так ось воно що для Кена. 313 00:19:03,470 --> 00:19:08,580 І ось тепер основні бере на себе контроль над програмою ще раз 314 00:19:08,580 --> 00:19:11,060 тому що рядки коду, Printf, здійснюється виконання. 315 00:19:11,060 --> 00:19:14,050 І ми рухаємося до нашої чином, виконання будь-яких інших ліній є. 316 00:19:14,050 --> 00:19:17,320 Отже, тепер давайте спробуємо трохи інший приклад. 317 00:19:17,320 --> 00:19:24,940 На цей раз тут, давайте спочатку очистити екран, і на цей раз ми будемо робити виміри кубатури функції, 318 00:19:24,940 --> 00:19:27,080 але на цей раз, я думаю, вихідне значення. 319 00:19:27,080 --> 00:19:29,180 >> Так що давайте йти вперед і робити це. 320 00:19:29,180 --> 00:19:35,790 Тепер у мене є рядок коду, яка говорить х одержує куб х. 321 00:19:41,370 --> 00:19:46,370 Рядок коду, нагадаємо, виглядає таким чином: х = куба (х); 322 00:19:46,370 --> 00:19:50,930 Так як це буде працювати? Давайте підемо далі і дати вам білий екран. 323 00:19:50,930 --> 00:19:54,070 Я збираюся записати тепер значення х, 324 00:19:54,070 --> 00:20:01,400 які в даний момент часу, трапляється, скажімо, 2, щоб тримати його проста. 325 00:20:01,400 --> 00:20:06,150 Я написав на листку паперу значення 2, який є моїм значення х. 326 00:20:06,150 --> 00:20:10,920 Я передаю його Кен. >> А я просто пишу відповідь? >> Да, давайте просто написати відповідь. 327 00:20:12,760 --> 00:20:18,940 Добре. І тепер він повинен повернути мені що-небудь. Perfect. Приємно перехід. 328 00:20:18,940 --> 00:20:23,120 Так що тепер він простягає мені назад значення 8 в даному випадку, і що мені з ним робити? 329 00:20:23,120 --> 00:20:28,250 Насправді - подивимося, отримати це право. Що я буду з нею робити? 330 00:20:28,250 --> 00:20:33,440 Тепер я збираюся взяти це значення і насправді зберігати його в ті ж біти в пам'яті. 331 00:20:33,440 --> 00:20:35,170 Але зауважте, я трохи борються тут. 332 00:20:35,170 --> 00:20:38,210 Я трохи збентежений, бо де ж я насправді записати значення х, 333 00:20:38,210 --> 00:20:43,150 тому що я тільки що зробив фізично руку Кен листок паперу, який був значення 2, 334 00:20:43,150 --> 00:20:46,590 який був х, і, дійсно, це саме те, що сталося. 335 00:20:46,590 --> 00:20:50,210 Ось і виходить, що при виклику функції, і ви передаєте в якості аргументу 336 00:20:50,210 --> 00:20:53,290 наприклад, привіт, світ, або ви передаєте в якості аргументу як 2, 337 00:20:53,290 --> 00:20:57,110 Як правило, ви передаєте копію цього аргументу. 338 00:20:57,110 --> 00:21:00,730 І так само, як я записав номер 2 тут і передав його Кен, 339 00:21:00,730 --> 00:21:04,720 , Що має означати, що в мене ще є копія значення 2 десь 340 00:21:04,720 --> 00:21:08,890 тому що дійсно, тепер, коли я отримав назад значення 8, мені потрібно повернутися в оперативній пам'яті 341 00:21:08,890 --> 00:21:12,130 і фактично записати 8, де я колись був номер 2. 342 00:21:12,130 --> 00:21:16,950 Таким чином, візуально, пам'ятайте про це поняття проходить в буквальному сенсі, копію значення. 343 00:21:16,950 --> 00:21:20,780 >> Кен робить свою справу, простягає мені у відповідь щось - у цьому випадку значення, наприклад, 8 - 344 00:21:20,780 --> 00:21:24,980 а то в мене щось зробити з цим значенням, якщо я хочу зберегти його околицях. 345 00:21:24,980 --> 00:21:29,650 Так що все це повернеться, щоб бути дуже добре знайомі незабаром. 346 00:21:29,650 --> 00:21:34,920 Спасибі вам велике за це демо тут, Кен. [Оплески] 347 00:21:34,920 --> 00:21:36,920 Дуже добре зроблено. 348 00:21:36,920 --> 00:21:42,690 Давайте подивимося, як це в кінцевому підсумку пов'язане з деякими з виклику функції, що ми робимо тут. 349 00:21:42,690 --> 00:21:47,910 Дозвольте мені йти вперед і повернути нас до вимірювання кубатури приклад. 350 00:21:47,910 --> 00:21:53,300 Зверніть увагу, що якщо ми дійсно хочемо почати приймати це далі, 351 00:21:53,300 --> 00:21:57,570 ми збираємося повинні пам'ятати про те, що число х, що це передається тут 352 00:21:57,570 --> 00:22:01,530 відрізняється від того, що насправді передається в функцію. 353 00:22:01,530 --> 00:22:05,880 Отже, ще раз, це проходить повз копії стане вельми доречні в одну хвилину. 354 00:22:05,880 --> 00:22:09,580 Давайте поглянемо на те, що не зовсім правильно працювати ще. 355 00:22:09,580 --> 00:22:13,250 Я збираюся йти вперед і відкрити третій приклад помилки, яка є збитковою за своєю природою, 356 00:22:13,250 --> 00:22:18,550 і це називається buggy3 і реалізує заміни. 357 00:22:18,550 --> 00:22:25,110 Тут у нас є основні функції, які х і у довільно встановлюється в 1 і 2, відповідно. 358 00:22:25,110 --> 00:22:27,700 Ми могли б використовувати GetInt, але нам просто потрібно проста вправа, 359 00:22:27,700 --> 00:22:30,170 таким чином, це жорстко, як 1 і 2. 360 00:22:30,170 --> 00:22:35,340 У рядках 21 і 22, ми, мабуть, роздрукуйте х і у, 1 на лінію. 361 00:22:35,340 --> 00:22:39,720 Потім у рядку 23, я стверджую, я обмін цими значеннями, крапка, крапка, крапка. 362 00:22:39,720 --> 00:22:44,170 Я мабуть виклику функції в рядку 24 званими своп, який приймає 2 аргументів. 363 00:22:44,170 --> 00:22:48,300 Це повністю законно для функцій взяти 2 аргументи. Ми бачили Printf це зробити вже. 364 00:22:48,300 --> 00:22:51,830 >> Таким чином, своп-видимому, має х і у, і, як припускає його назва, 365 00:22:51,830 --> 00:22:54,670 Я сподіваюся, що він збирається змінити ці 2 значення. 366 00:22:54,670 --> 00:23:00,090 Так от я стверджую, у рядку 25 "перестановки"! і я передрукувати х і у 367 00:23:00,090 --> 00:23:03,070 за умови, що вони дійсно були поміняні місцями. 368 00:23:03,070 --> 00:23:06,080 Але якщо я дійсно запустити цю програму - дозвольте мені відкрити вікно терміналу, 369 00:23:06,080 --> 00:23:09,860 дозвольте мені зробити buggy3 - як випливає з назви, це не закінчиться добре 370 00:23:09,860 --> 00:23:15,770 тому що, коли я вдарив Enter, помітили, що х = 1, у = 2, 371 00:23:15,770 --> 00:23:19,420 і все ж в кінці програми, вони все ще, по суті, те ж саме. 372 00:23:19,420 --> 00:23:22,960 Таким чином, на основі демонстрації тільки зараз з Кеном, те, що відбувається насправді? 373 00:23:22,960 --> 00:23:28,710 Давайте поринемо в цю своп функції. Це супер короткі. Це всього лише кілька рядків коду довго. 374 00:23:28,710 --> 00:23:34,520 Але те, що основна проблема заснована на простій історії, розказаної тут з Кеном? 375 00:23:34,520 --> 00:23:36,670 Чому підкачки не працює? 376 00:23:36,670 --> 00:23:39,660 [Студент] ви зберігаєте на копію, а не змінна. 377 00:23:39,660 --> 00:23:43,980 Саме так. Ми зберіганні на копію, а не саму змінну. 378 00:23:43,980 --> 00:23:47,170 Іншими словами, своп-видимому, має 2 аргументи, INT, 379 00:23:47,170 --> 00:23:49,370 і це умовно називати а і б, 380 00:23:49,370 --> 00:23:54,420 і тут я пройшов по х і у, які є відповідно 1 і 2, 381 00:23:54,420 --> 00:23:58,770 але я не в буквальному сенсі проходить в х, я не в буквальному сенсі проходить в у, 382 00:23:58,770 --> 00:24:01,450 Я передаю копії х і копію у. 383 00:24:01,450 --> 00:24:04,510 Це майже як якби ви скопіювали і вставили в своп 384 00:24:04,510 --> 00:24:07,810 значення, які ви хочете, щоб він насправді маніпулювати. 385 00:24:07,810 --> 00:24:14,480 Так що, якщо це так, коли я почала програми виконання рядки 35, то 36, 386 00:24:14,480 --> 00:24:18,650 коли я добираюся до лінії 37, на даний момент в цій історії, що значення? 387 00:24:21,040 --> 00:24:25,050 У цей момент в історії, рядок 37, що є значення в цій точці? >> [Студент] 1. 388 00:24:25,050 --> 00:24:29,280 [Малан] Вона просто повинна бути 1, праві, тому що х був прийнятий в якості першого аргументу, 389 00:24:29,280 --> 00:24:33,080 і ця функція просто довільно називає свій перший аргумент. 390 00:24:33,080 --> 00:24:38,200 Точно так само є у другого аргументу, і це просто довільно виклик другого б аргумент. 391 00:24:38,200 --> 00:24:40,990 >> Ця дихотомія насправді досить просто пояснити. Подумайте про це. 392 00:24:40,990 --> 00:24:43,320 Ніхто з нас не зустрічав людину, яка написала Printf, 393 00:24:43,320 --> 00:24:50,770 тому, звичайно, він або вона не знає, що наші змінні через 30 років будуть називати. 394 00:24:50,770 --> 00:24:56,650 Так що має бути різниця між, що ви називаєте змінні у функціях ви пишете 395 00:24:56,650 --> 00:25:02,080 і що ви називаєте змінні у функціях ви дзвоните або використання. 396 00:25:02,080 --> 00:25:05,340 Отже, іншими словами, я написав мої змінні х і у, 397 00:25:05,340 --> 00:25:08,890 Але якщо хтось інший написав своп функції, він або вона, звичайно, не знав би, 398 00:25:08,890 --> 00:25:10,690 що мої змінних буде називатися, 399 00:25:10,690 --> 00:25:13,830 так розумію, що це, чому у вас є ця двоїстість імен. 400 00:25:13,830 --> 00:25:16,750 Технічно, я міг би зробити це, збіг, 401 00:25:16,750 --> 00:25:20,080 але вони будуть як і раніше передається в якості копії. 402 00:25:20,080 --> 00:25:23,650 Було б просто чистий збіг естетично, якщо це чоловік, який написав своп 403 00:25:23,650 --> 00:25:26,150 були використані ті ж імена. 404 00:25:26,150 --> 00:25:32,370 Таким чином, на даний момент в цій історії, рядок 37, 1, B 2, а тепер я переходжу до поміняти їх місцями. 405 00:25:32,370 --> 00:25:34,900 Перш за все, дозвольте мені насправді зробити це набагато простіше. 406 00:25:34,900 --> 00:25:36,690 Я не знаю, що ті 3 рядки коду робили. 407 00:25:36,690 --> 00:25:41,210 Дозвольте мені зробити це: B = A, A = B; зроблено. 408 00:25:41,210 --> 00:25:44,690 Чому це зламаний, логічно? 409 00:25:46,490 --> 00:25:48,900 Це свого роду інтуїтивні речі, чи не так? 410 00:25:48,900 --> 00:25:52,560 Так а стає виданню і виданню стає, 411 00:25:52,560 --> 00:25:57,730 але проблема в тому, що як тільки лінія 37 виконує, що значення А і В? 412 00:25:57,730 --> 00:26:03,410 Те ж саме, 1, тому що ви відразу, так би мовити, ви змінили б рівним. 413 00:26:03,410 --> 00:26:08,890 Тому, як тільки лінія 37 була виконана, це здорово, тепер у вас є 2 примірники № 1 414 00:26:08,890 --> 00:26:13,350 Усередині цієї функції, так що потім, коли ви говорите в рядку 38 = B, 415 00:26:13,350 --> 00:26:17,640 Ви видів різьбових тому що ви просто присвоєння 1 до 1. 416 00:26:17,640 --> 00:26:20,580 Ти начебто втратив значення, яке ви дбали про. 417 00:26:20,580 --> 00:26:23,220 Таким чином, в оригінальну версію цієї, зверніть увагу, що я зробив. 418 00:26:23,220 --> 00:26:26,850 Замість цього я була третя рядок коду, яка виглядала наступним чином. 419 00:26:26,850 --> 00:26:28,580 Я заявляю, тимчасових змінних. 420 00:26:28,580 --> 00:26:32,170 >> Tmp це дуже поширене ім'я для тимчасової змінної, і це Int 421 00:26:32,170 --> 00:26:34,580 тому що він повинен відповідати тому, що я хочу зробити копію. 422 00:26:34,580 --> 00:26:39,770 Я зберігаю копії всередині TMP, тому, як тільки лінія 37 була виконана, 423 00:26:39,770 --> 00:26:45,860 Значення це - швидка перевірка осудності - 1, значення Ь 2, 424 00:26:45,860 --> 00:26:48,970 і значення TMP також 1. 425 00:26:48,970 --> 00:26:52,060 Так що тепер я виконаю лінії 38. 426 00:26:52,060 --> 00:27:00,540 Як тільки лінія 38 виконується, приймає значення б. І В 2, так що тепер 2. 427 00:27:00,540 --> 00:27:05,210 Таким чином, на даний момент в цій історії, дорівнює 2, B 2, а TMP 1, 428 00:27:05,210 --> 00:27:11,060 так що тепер логічно, ми можемо значення просто грюкнути TMP в в б і ми зробили. 429 00:27:11,060 --> 00:27:12,800 Отже, ми вирішили цю проблему. 430 00:27:12,800 --> 00:27:17,720 На жаль, коли я запускаю цю програму в такому вигляді, це насправді не поміняти будь-які значення. 431 00:27:17,720 --> 00:27:20,100 Але щоб бути зрозумілим, чому? 432 00:27:23,660 --> 00:27:26,450 Я встановив логічні задачі з усього хвилину тому, 433 00:27:26,450 --> 00:27:31,020 але знову ж таки, якщо я запускаю цю програму, х і у, залишаються незмінними 434 00:27:31,020 --> 00:27:33,310 До кінця виконання програми. 435 00:27:33,310 --> 00:27:37,220 [Нерозбірливо коментар студент] >> Ми не повернулися нічого, так що це правда. 436 00:27:37,220 --> 00:27:39,670 Але, виявляється, є невелика проблема тут, тому що до цих пір, 437 00:27:39,670 --> 00:27:44,170 Єдине, що ми змогли повернути це одне, і це обмеження C. 438 00:27:44,170 --> 00:27:49,070 Ви можете повернути тільки дійсно одне значення, і в цьому випадку я трохи застряг тут 439 00:27:49,070 --> 00:27:53,310 тому що я міг повернути нове значення х, або я міг би повернути нове значення у, 440 00:27:53,310 --> 00:27:55,190 але я хочу і назад. 441 00:27:55,190 --> 00:27:58,650 Таким чином, повернення не просте рішення тут. 442 00:27:58,650 --> 00:28:01,710 Але проблема в корені чому? Що ми насправді помінялися місцями? 443 00:28:01,710 --> 00:28:04,190 [Студент] а і б. >> А і б. 444 00:28:04,190 --> 00:28:08,230 Але і б є копіями х і у, яка означає, що ми тільки що зробили всі ці роботи, 445 00:28:08,230 --> 00:28:11,650 Ми тільки що провели 3 хвилини говоримо про функції підкачки і всі 3 з цих змінних, 446 00:28:11,650 --> 00:28:15,420 і це здорово, абсолютно правильно в ізоляції, 447 00:28:15,420 --> 00:28:20,740 але і сферу б лише в цих рядках. 448 00:28:20,740 --> 00:28:24,790 >> Так як цикл, якщо ви оголосите ціле я всередині циклу, 449 00:28:24,790 --> 00:28:28,760 Аналогічно, якщо ви оголошенням і б всередині функції, які ви написали, 450 00:28:28,760 --> 00:28:33,320 вони дійсні тільки всередині цієї функції, а значить, як тільки своп зробити виконання 451 00:28:33,320 --> 00:28:38,470 і ми переходимо від лінії 24 в лінію 25, х і у не змінилося. 452 00:28:38,470 --> 00:28:42,790 Ви просто даремно багато часу, обмін копіями змінних. 453 00:28:42,790 --> 00:28:47,010 Ось і виходить, що рішення це насправді, не очевидно. 454 00:28:47,010 --> 00:28:50,670 Це не цілком достатньо, щоб повертати значення, тому що ми можемо тільки повернути значення 1, 455 00:28:50,670 --> 00:28:53,470 і я дійсно хочу поміняти х і у в той же час, 456 00:28:53,470 --> 00:28:55,210 так що ми збираємося мати, щоб повернутися до цього. 457 00:28:55,210 --> 00:29:01,020 Але зараз розумію, що питання принципово випливає з того факту, що А і В є копіями 458 00:29:01,020 --> 00:29:03,630 і вони знаходяться у своїй власній області. 459 00:29:03,630 --> 00:29:05,050 Давайте спробуємо вирішити це в деякому роді. 460 00:29:05,050 --> 00:29:11,250 Дозвольте мені насправді прокрутити назад тут і відкрити, скажімо, четвертий варіант цього, buggy4. 461 00:29:11,250 --> 00:29:13,370 Що з цього приводу? 462 00:29:13,370 --> 00:29:17,810 Це схожі, але більш просту задачу, щоб дивитися на, перш ніж прийняти удар на її рішення. 463 00:29:17,810 --> 00:29:24,190 Ця програма називається приростом, і він, очевидно, ініціалізує ціле число х 1 у рядку 18. 464 00:29:24,190 --> 00:29:28,150 Я тоді стверджувати, х = 1, тоді я претендувати "інкремента ..." 465 00:29:28,150 --> 00:29:33,730 Потім я викликаю приріст, але потім в лініях 22 і 23, я стверджую, що це було збільшується, 466 00:29:33,730 --> 00:29:40,220 Я стверджую х зараз би це не було - 2, по-видимому, - але ця програма глючить. 467 00:29:40,220 --> 00:29:42,610 У чому проблема? 468 00:29:43,440 --> 00:29:50,160 Так. >> [Нерозбірливо відповідь студента] >> Саме так. 469 00:29:50,160 --> 00:29:52,490 Таким х було оголошено, очевидно, у рядку 18. 470 00:29:52,490 --> 00:29:54,700 Тобто в фігурних дужках основного автора. 471 00:29:54,700 --> 00:29:58,440 Так що однозначної відповіді тут є те, що в той час як х існує тут, 472 00:29:58,440 --> 00:30:03,930 вона не існує в рядку 32, так що ця програма насправді навіть не буде компілюватися. 473 00:30:03,930 --> 00:30:07,940 Компілятора, коли я намагаюся компіляції даного коду буде кричати на мене 474 00:30:07,940 --> 00:30:14,100 Про деякі неоголошений ідентифікатор або щось в цьому роді. У самому справі, давайте спробуємо. 475 00:30:14,100 --> 00:30:18,470 Це робить buggy4. Там вона є. 476 00:30:18,470 --> 00:30:22,110 Використання 'X' неоголошений ідентифікатор в рядку 32. 477 00:30:22,110 --> 00:30:25,580 А насправді, давайте будемо більш чітко тут сьогодні, так що це корисно 478 00:30:25,580 --> 00:30:27,580 в робочий час і вдома. 479 00:30:27,580 --> 00:30:29,300 >> Зверніть увагу, що це трохи загадково написано. 480 00:30:29,300 --> 00:30:37,270 Але те, що Clang має кричав на нас, сказавши buggy4.c: 32:5, насправді корисно. 481 00:30:37,270 --> 00:30:42,050 Це означає, що помилка в рядку 32 на позицію символу 5. 482 00:30:42,050 --> 00:30:46,700 Таким чином, 1, 2, 3, 4, 5. Це, справді, де проблема. 483 00:30:46,700 --> 00:30:49,790 А також, теж майте на увазі, в робочий час і на дому, мені пощастило тут. 484 00:30:49,790 --> 00:30:52,990 У мене є одна помилка. Це збирається бути відносно легко виправити. 485 00:30:52,990 --> 00:30:55,990 Але якщо ви отримаєте весь екран повний переважна повідомлення про помилки, 486 00:30:55,990 --> 00:31:00,330 ще раз усвідомити, що нижній можна просто бути симптомом самих верхніх один. 487 00:31:00,330 --> 00:31:03,450 Так завжди ганятися за ваші помилки зверху вниз 488 00:31:03,450 --> 00:31:05,820 тому що там може бути просто ефект ланцюжку 489 00:31:05,820 --> 00:31:09,240 , Який пропоную вам мати набагато більше проблем, ніж ви насправді. 490 00:31:09,240 --> 00:31:15,150 Отже, як ми можемо це виправити, якщо моєю метою є, щоб збільшити х? >> [Студент] Зробити х глобальної. 491 00:31:15,150 --> 00:31:17,060 Отже, ми можемо зробити глобальне х. 492 00:31:17,060 --> 00:31:20,480 Давайте ярлик, який я попереджав про більш ранні, але чорт візьми, нам просто потрібно швидко виправити, 493 00:31:20,480 --> 00:31:25,730 так що давайте просто скажемо, Int х тут. Це робить х глобальної. 494 00:31:25,730 --> 00:31:31,800 Так що тепер основним має до них доступ і прирощення має до них доступ, 495 00:31:31,800 --> 00:31:34,110 і тому дозвольте мені йти далі і зібрати це зараз. 496 00:31:34,110 --> 00:31:37,630 Зробити buggy4, Enter. Здається, для компіляції зараз. 497 00:31:37,630 --> 00:31:41,230 Давайте запустимо buggy4. І, здається, насправді працює. 498 00:31:41,230 --> 00:31:45,150 Це одна з цих речей, які робити, як я кажу, а не як я роблю, 499 00:31:45,150 --> 00:31:47,010 як я тільки що зробив тут, тому що в цілому, 500 00:31:47,010 --> 00:31:50,440 наші програми збираються отримати набагато цікавіше і набагато довше, ніж це, 501 00:31:50,440 --> 00:31:56,390 і якщо ваше рішення життєвих проблем просто покласти всі змінні в початок файлу, 502 00:31:56,390 --> 00:31:59,690 Дуже швидко у програми отримують жахливо важко керувати. 503 00:31:59,690 --> 00:32:02,190 Це стає все важче вигадувати нові імена змінних, 504 00:32:02,190 --> 00:32:05,240 стає все важче зрозуміти, що змінна робити те, що, 505 00:32:05,240 --> 00:32:08,460 і т.д. Загалом, це не дуже гарне рішення. 506 00:32:08,460 --> 00:32:10,030 Так давайте зробимо це краще. 507 00:32:10,030 --> 00:32:12,160 Ми не хочемо використовувати глобальну змінну тут. 508 00:32:12,160 --> 00:32:16,240 >> Я хочу, щоб збільшити х, так що я міг би, очевидно - 509 00:32:16,240 --> 00:32:18,670 Зрештою, це начебто дурної історії, тому що ми просто робимо це - 510 00:32:18,670 --> 00:32:24,450 але якщо б я не знав про те, що оператор або я не зміг змінити його в основний собі, 511 00:32:24,450 --> 00:32:30,730 Як ще я міг здійснювати Кен сюди на цей раз не у кубі, але для збільшення? 512 00:32:31,380 --> 00:32:33,190 Як змінити цю річ тут? Так. 513 00:32:33,190 --> 00:32:38,480 [Студент] Pass х, а потім повернутися [нерозбірливо] >> Гаразд, добре. 514 00:32:38,480 --> 00:32:41,900 Так чому б мені не пройти в х, а потім, а не повертати його, 515 00:32:41,900 --> 00:32:44,870 чому я не просто повернути х + 1. 516 00:32:44,870 --> 00:32:47,710 Ще пара речей потрібно міняти тут. Я перебуваю на правильному шляху. 517 00:32:47,710 --> 00:32:49,770 Що ще потрібно налаштувати? Хтось інший. Так. 518 00:32:49,770 --> 00:32:51,740 [Нерозбірливо відповідь студента] 519 00:32:51,740 --> 00:32:54,730 Мені потрібно, щоб змінити тип повернення збільшення бо це не анулювати. 520 00:32:54,730 --> 00:32:57,780 Порожнеча нічого не засіб повертається, але ясно, тепер це, 521 00:32:57,780 --> 00:32:59,830 так що це треба змінити, щоб - >> [студент] Int. 522 00:32:59,830 --> 00:33:02,740 INT у відповідність з тим, що я насправді повернення. 523 00:33:02,740 --> 00:33:05,180 Зараз щось ще, як і раніше баггі тут. Так. 524 00:33:05,180 --> 00:33:08,400 [Нерозбірливо відповідь студента] >> [Малан] Так що мені потрібно збільшувати х? 525 00:33:08,400 --> 00:33:12,080 [Нерозбірливо відповідь студента] >> [Малан] Ах, так мені потрібно передати х. 526 00:33:12,080 --> 00:33:16,660 Так що мені потрібно зробити це тут. >> [Нерозбірливо коментар студент] 527 00:33:16,660 --> 00:33:20,050 [Малан] Таким чином, прототип, я повинен змінити це тут. 528 00:33:20,050 --> 00:33:22,930 Таким чином, це має стати INT, це повинно стати - 529 00:33:22,930 --> 00:33:25,620 хм, я насправді є помилка тут. Давайте виправимо це в першу чергу. 530 00:33:25,620 --> 00:33:29,590 Що це насправді бути? Це має бути щось Int. 531 00:33:29,590 --> 00:33:32,700 Це може бути х, але, чесно кажучи, якщо почати називати всіх ваших змінних х, 532 00:33:32,700 --> 00:33:35,390 це буде все менше і менше ясно, що є що. 533 00:33:35,390 --> 00:33:39,560 >> Так що давайте просто довільно вибрати різні іменування для мого допоміжні функції, 534 00:33:39,560 --> 00:33:41,940 Функції я пишу. Ми будемо називати його, або ми могли б назвати це - 535 00:33:41,940 --> 00:33:45,010 Давайте назвемо це число буде ще більш явним. 536 00:33:45,010 --> 00:33:47,560 І тоді я повинен повернути все, що номер плюс 1, 537 00:33:47,560 --> 00:33:50,740 і тепер я повинен змінити 1 річ, тут і ще одна річ тут. 538 00:33:50,740 --> 00:33:54,350 Що я повинен змінити в рядку 21 в першу чергу? >> [Нерозбірливо відповідь студента] 539 00:33:54,350 --> 00:33:57,610 [Малан] Я повинен призначити його на х. Я не можу просто зателефонувати прирощення (х). 540 00:33:57,610 --> 00:34:01,960 Мені потрібно пам'ятати відповідь на зміну значення х на лівій стороні. 541 00:34:01,960 --> 00:34:04,680 І хоча х зараз знаходиться на лівій і правій, це абсолютно нормально 542 00:34:04,680 --> 00:34:08,860 тому що права частина запускається на виконання першого потім отримує гепнувся в лівій річ - 543 00:34:08,860 --> 00:34:10,600 х в цьому випадку. 544 00:34:10,600 --> 00:34:12,159 І тоді, нарешті, це легко виправити зараз. 545 00:34:12,159 --> 00:34:17,230 Це повинно просто відповідати тому, що ось внизу, внутр номер. 546 00:34:17,230 --> 00:34:20,570 Таким чином, цілий букет змін дійсно нерозумно функції 547 00:34:20,570 --> 00:34:24,420 але представник речей, які ми більше хочемо зробити. 548 00:34:24,420 --> 00:34:27,090 Так що buggy4. Я десь напартачили. 549 00:34:27,090 --> 00:34:30,139 О, мій Бог. П'ять помилок в 6-рядковим програми. 550 00:34:30,139 --> 00:34:35,690 Так що ж трапилося на лінії 18, символ 5? 551 00:34:35,690 --> 00:34:39,610 Так що я повинен заявити про це, внутр. 552 00:34:39,610 --> 00:34:41,920 Давайте подивимося. Є ціла купа інших помилок. 553 00:34:41,920 --> 00:34:47,010 О, Боже мій - 19, 18, 21 - але, знову ж таки, давайте просто очистити екран, управління L тут, 554 00:34:47,010 --> 00:34:49,380 і перезапустити Clang. 555 00:34:49,380 --> 00:34:51,340 Таким чином, 5 завдань на самом деле просто, що 1. 556 00:34:51,340 --> 00:34:57,520 Отже, тепер давайте запустимо buggy4, Enter. Ось так, х був збільшений правильно. 557 00:34:57,520 --> 00:35:02,720 Добре. Будь-які питання про те, як збільшити число? Так. 558 00:35:02,720 --> 00:35:09,870 [Нерозбірливо запитання студента] >> Хороше питання. 559 00:35:09,870 --> 00:35:14,220 Як це, що я можу просто змінити х на номер, і програма буде знати відразу ж? 560 00:35:14,220 --> 00:35:16,200 >> Знову ж таки, думаю про нього, як це абстракція. 561 00:35:16,200 --> 00:35:21,600 Так що, якщо я головний і Кен приріст, чесно кажучи, я не хвилює, що Кен називає свій iPad. 562 00:35:21,600 --> 00:35:26,570 Мене не хвилює, що він називає все, що має відношення до його реалізації цієї функціональності. 563 00:35:26,570 --> 00:35:33,340 Це деталі реалізації, які я, головне, не потрібно піклуватися про. 564 00:35:33,340 --> 00:35:38,250 І так просто змінивши його послідовно всередині функції - тут номер і номер тут - 565 00:35:38,250 --> 00:35:40,960 Все це займає так багато часу, як я перекомпілювати. 566 00:35:40,960 --> 00:35:44,180 Це ніби як якщо ви думаєте про багатьох з нас, тих, у кого водійські права 567 00:35:44,180 --> 00:35:46,770 які в'їхали або якщо ви навіть в'їхав в автомобіль, 568 00:35:46,770 --> 00:35:50,950 Більшість з нас не знають, як машина працює під капотом. 569 00:35:50,950 --> 00:35:54,970 І буквально, якщо ви відкриваєте капот, більшість з нас - я в тому числі - 570 00:35:54,970 --> 00:35:56,940 не збирається знаю, що ми дивимося на, 571 00:35:56,940 --> 00:35:59,220 ніби як ви можете відчувати себе в такі речі, як це прямо зараз. 572 00:35:59,220 --> 00:36:01,480 Але ми дійсно не маємо дбати, як машина працює, 573 00:36:01,480 --> 00:36:05,970 ми не повинні піклуватися, що всі стержні і поршнів і кабелів усередині автомобіля 574 00:36:05,970 --> 00:36:08,160 насправді робить. 575 00:36:08,160 --> 00:36:12,770 Так щось подібне, що ви називаєте поршень тут не має значення в даному випадку. Та ж сама ідея. 576 00:36:12,770 --> 00:36:25,300 Так. >> [Нерозбірливо запитання студента] 577 00:36:25,300 --> 00:36:29,180 Якщо є кілька видів змінна момент ха назад, 578 00:36:29,180 --> 00:36:32,150 Ви, програміст, доведеться міняти їх всюди. 579 00:36:32,150 --> 00:36:36,600 Або ви могли б зробити буквально файлів, меню, а потім Знайти, Замінити - щось в цьому роді - 580 00:36:36,600 --> 00:36:39,170 але ви будете мати, щоб зробити ці зміни самостійно. 581 00:36:39,170 --> 00:36:47,450 Ви повинні бути послідовні. >> [Студент] За наявності декількох змінних [нерозбірливо] 582 00:36:47,450 --> 00:36:53,100 Певному порядку, як тут, якби це було Int інший номер? >> [Студент] Правильно. 583 00:36:53,100 --> 00:36:56,590 [Малан] Так. Замовити має значення, коли ви викликаєте функцію. 584 00:36:56,590 --> 00:37:00,050 >> Так що якщо я дзвонили приріст тут щось в цьому коми, 585 00:37:00,050 --> 00:37:01,680 є пряме відображення. 586 00:37:01,680 --> 00:37:05,690 Перша змінна, як там це називається, зробив копію першого аргументу тут. 587 00:37:05,690 --> 00:37:07,760 Вибачте. Це не повинно бути круглих дужках. 588 00:37:07,760 --> 00:37:11,490 Другий аргумент лінії з другим. Так порядку, так, питань. Добре. 589 00:37:11,490 --> 00:37:17,020 Вибачте. Я взяв довгий шлях, щоб дістатися там. Інші питання? Добре. 590 00:37:17,020 --> 00:37:20,610 Отже, давайте подивимося, якщо ми не можемо намалювати картину того, що відбувається насправді тут 591 00:37:20,610 --> 00:37:23,090 під капотом, так би мовити. 592 00:37:23,090 --> 00:37:26,640 Це прямокутник, який може представляти пам'яті комп'ютера. 593 00:37:26,640 --> 00:37:30,970 Навіть якщо ви не уявляєте, як пам'ять працює або як RAM робіт, 594 00:37:30,970 --> 00:37:33,940 принаймні, припустити, що у вас є пучки вона в ці дні. 595 00:37:33,940 --> 00:37:36,280 У вас є мегабайт це, у вас є гігабайти це, 596 00:37:36,280 --> 00:37:40,870 і ми знаємо, від тижня 0 байт, що саме те, що? >> [Студент] 8 біт. 597 00:37:40,870 --> 00:37:42,950 8 біт, чи не так? Таким чином, 8 нулів і 1. 598 00:37:42,950 --> 00:37:45,880 Отже, якщо ваш комп'ютер має гігабайт оперативної пам'яті, 2 гігабайтами оперативної пам'яті в ці дні, 599 00:37:45,880 --> 00:37:55,030 у вас є мільярд або 2 млрд. байт пам'яті, або приблизно 8000000000 або 16 мільярдів біт 600 00:37:55,030 --> 00:37:56,890 всередині комп'ютера. 601 00:37:56,890 --> 00:38:00,590 На відміну від невеликої приклад Wooly Віллі, це не магнітні частинки звичайно більше. 602 00:38:00,590 --> 00:38:04,450 Все частіше - в ноутбуках, принаймні, - це твердотільні накопичувачі SSD, 603 00:38:04,450 --> 00:38:08,580 що просто не мають рухомих частин. Це всі електронні. Це все електрику основі. 604 00:38:08,580 --> 00:38:14,060 Так що думайте цього прямокутника, як тільки представляє 1 або 2 гігабайтами пам'яті, що у вас є. 605 00:38:14,060 --> 00:38:16,020 >> Так що це шматок пам'яті. 606 00:38:16,020 --> 00:38:19,830 Світ інформатики роду відгороджена 607 00:38:19,830 --> 00:38:22,950 ділянки пам'яті, щоб зробити різні речі. 608 00:38:22,950 --> 00:38:27,190 Наприклад, якщо це оперативної пам'яті комп'ютера, як це було запропоновано прямокутник там, 609 00:38:27,190 --> 00:38:31,130 Виявляється, що за угодою, у верхній частині вашої пам'яті, так би мовити, 610 00:38:31,130 --> 00:38:33,660 , Як правило, те, що називається текстовий сегмент. 611 00:38:33,660 --> 00:38:36,740 Такі 0 і 1, що ви зібрали. 612 00:38:36,740 --> 00:38:39,020 Тому, коли ми дивилися під капотом на те, що a.out є, 613 00:38:39,020 --> 00:38:41,980 Всі ці 0 і 1, коли ви запускаєте програму, 614 00:38:41,980 --> 00:38:46,290 тих, 0 і 1 завантажується з жорсткого диска в те, що називається RAM, 615 00:38:46,290 --> 00:38:49,320 і в оперативній пам'яті, вони містяться у верхній частині. 616 00:38:49,320 --> 00:38:52,770 У той же час, у вас є інші речі: ініціалізація даних, ініціалізацію даних. 617 00:38:52,770 --> 00:38:57,510 Ці 2 валка пам'яті, звертайтеся до глобальні змінні, які ви не часто використовуєте 618 00:38:57,510 --> 00:39:00,760 але іноді, якщо ви це зробите, вони в кінцевому підсумку там також. 619 00:39:00,760 --> 00:39:04,260 Тоді є деякі інші речі: змінні оточення, які ми не будемо витрачати багато часу на, 620 00:39:04,260 --> 00:39:06,860 але потім 2 важливі речі, які будуть повертатися протягом семестру, 621 00:39:06,860 --> 00:39:08,550 стека і купи. 622 00:39:08,550 --> 00:39:12,210 Тому більшість з пам'яті комп'ютера зберігається при запуску програми 623 00:39:12,210 --> 00:39:15,370 за те, що називається стеком і те, що називається купою. 624 00:39:15,370 --> 00:39:18,840 Ми не збираємося говорити про купу сьогодні, але ми будемо говорити про стек. 625 00:39:18,840 --> 00:39:24,600 Стек означало викликати в уяві візуальні від їдальні лотки зал їжі в будинку Mather 626 00:39:24,600 --> 00:39:28,110 або там, де ви будете де персонал їдальні чистити їх кожен день, 627 00:39:28,110 --> 00:39:30,180 вони складають їх від підлоги на вгору, 628 00:39:30,180 --> 00:39:34,550 і, аналогічно, в пам'яті, є така ідея поставити щось на стеку, 629 00:39:34,550 --> 00:39:36,860 покласти щось на стеку, покласти щось у стеці. 630 00:39:36,860 --> 00:39:38,240 І що ж ми маємо на увазі під цим? 631 00:39:38,240 --> 00:39:41,860 >> Давайте збільшити тільки на нижню половину цій картині, оперативної пам'яті комп'ютера, 632 00:39:41,860 --> 00:39:44,330 запропонувати наступне. 633 00:39:44,330 --> 00:39:48,170 Виявляється, що коли ви запускаєте програму, як a.out або привіт - 634 00:39:48,170 --> 00:39:50,100 незалежно від програми є те, що ви написали - 635 00:39:50,100 --> 00:39:54,020 Знову ж таки, ті 0 і 1 завантажується з жорсткого диска, який тривале зберігання, 636 00:39:54,020 --> 00:39:57,230 залишається там, навіть коли ви вилку, завантажується в оперативну пам'ять. 637 00:39:57,230 --> 00:40:00,610 RAM швидше, ніж жорсткі диски - це менше, ніж жорсткі диски - 638 00:40:00,610 --> 00:40:03,300 але це там, де програми жити, поки ви працюєте них. 639 00:40:03,300 --> 00:40:08,230 Таким чином, ви двічі клацніть програму на Mac або PC, вона завантажується з жорсткого диска в оперативну пам'ять. 640 00:40:08,230 --> 00:40:11,520 Як тільки він буде завантажений в оперативну пам'ять, 0 і 1 піти на шлях зверху, 641 00:40:11,520 --> 00:40:16,610 так званих текстових сегментів, але потім, як тільки ваша програма фактично починає працювати, 642 00:40:16,610 --> 00:40:21,360 Основна функція називається, а головне, як ми бачили, часто має локальні змінні, 643 00:40:21,360 --> 00:40:24,870 і вона має цілих і рядків і символів тощо. 644 00:40:24,870 --> 00:40:29,180 Так що якщо ваші програми, які ви написали або програми, які ви подвійному клацанні 645 00:40:29,180 --> 00:40:32,970 використовувати деякі змінні усередині основного, 646 00:40:32,970 --> 00:40:37,240 вони в кінцевому підсумку в нижній частині вашого стека пам'яті, так би мовити. 647 00:40:37,240 --> 00:40:39,410 Більш конкретно, що ж це насправді означає? 648 00:40:39,410 --> 00:40:48,450 Це просто означає, що якщо ми збираємося число байт оперативної пам'яті на вашому комп'ютері, 649 00:40:48,450 --> 00:40:55,750 зауважити, що це може бути номер байта 0, це може бути номер байта 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 все, аж до 2 млрд. буде всю дорогу там на самому верху. 651 00:41:01,480 --> 00:41:05,880 Отже, іншими словами, коли ми говоримо про оперативну пам'ять або пам'яті в байтах, 652 00:41:05,880 --> 00:41:11,500 це просто означає, що хтось вирішив, що нумерувати кожну з цих ділянок пам'яті. 653 00:41:11,500 --> 00:41:16,650 Тому, коли вам потрібно 32 біта для Int або вам потрібно 8 біт на символ, 654 00:41:16,650 --> 00:41:18,840 де вони в кінцевому підсумку в пам'яті? 655 00:41:18,840 --> 00:41:22,350 >> Концептуально, вони просто в кінцевому підсумку в нижній частині цієї речі, званої стеком. 656 00:41:22,350 --> 00:41:25,870 Але що цікаво тепер, коли основні викликає функцію - 657 00:41:25,870 --> 00:41:28,750 припустимо, що функція називається Фу, просто довільне назву - 658 00:41:28,750 --> 00:41:32,330 що відбувається, є основним знаходиться в нижній частині цього стека пам'яті; 659 00:41:32,330 --> 00:41:35,680 Foo тепер поміщається у верхній частині головного в пам'яті. 660 00:41:35,680 --> 00:41:40,990 Таким чином, будь-які локальні змінні, Foo була в кінцевому підсумку роду концептуально вище, ніж в основній. 661 00:41:40,990 --> 00:41:47,070 Якщо Foo викликає іншу функцію під назвою бару, ці змінні в кінцевому підсумку тут. 662 00:41:47,070 --> 00:41:50,120 Якщо барі називає щось ще, тут, тут, тут. 663 00:41:50,120 --> 00:41:53,830 Так що ж цікавого про запуск програми є те, що, як ви викликаєте функції 664 00:41:53,830 --> 00:41:57,750 і як ці функції викликати функції і як ці функції називають функціями, 665 00:41:57,750 --> 00:42:01,470 Ви створюєте цей стек функцій в пам'яті. 666 00:42:01,470 --> 00:42:06,890 І тільки один раз функція повертає ви почнете одержувати цю пам'ять назад. 667 00:42:06,890 --> 00:42:10,860 Таким чином, одним з найпростіших способів запустити з пам'яті в комп'ютерній програмі 668 00:42:10,860 --> 00:42:14,360 , Щоб написати функції, які ніколи не повернуться. 669 00:42:14,360 --> 00:42:18,900 Так, наприклад, давайте продемонструвати, як багато з навмисно баггі програми. 670 00:42:18,900 --> 00:42:22,230 Дозвольте мені йти вперед і робити # включити , 671 00:42:22,230 --> 00:42:25,000 Int основних (недійсними), 672 00:42:25,000 --> 00:42:32,940 і я збираюся робити, а (2> 1), який, імовірно, ніколи не буде змінюватися на нас, 673 00:42:32,940 --> 00:42:37,560 і дозвольте мені тепер іти вперед і робити Printf. 674 00:42:37,560 --> 00:42:40,700 Насправді, це буде менш візуально цікавим. Давайте зробимо це. 675 00:42:40,700 --> 00:42:50,240 Для Int = 0;> 0 - давайте робити цю помилку - я + +. 676 00:42:50,240 --> 00:42:52,720 І давайте не Printf тут. Давайте практикувати те, що я проповідував. 677 00:42:52,720 --> 00:43:00,190 Давайте тут метод, недійсними хор, і ми будемо говорити Int я, 678 00:43:00,190 --> 00:43:06,830 і тоді я буду говорити Printf - ні, давайте зробимо це більш цікаво. 679 00:43:06,830 --> 00:43:15,790 Давайте насправді не друкує взагалі нічого. Давайте просто це зробити: хор (I). 680 00:43:15,790 --> 00:43:20,390 Добре. Так що це баггі, бо навіщо? 681 00:43:20,390 --> 00:43:23,380 Я придумую, як я йду, тому що програма насправді не роблять нічого цікавого. 682 00:43:23,380 --> 00:43:25,320 >> Але це не мета. 683 00:43:25,320 --> 00:43:29,630 Мета полягає в тому, щоб написати програму, основною функцією якого робить те, що, мабуть? 684 00:43:30,720 --> 00:43:32,860 Зателефонуйте себе. А насправді, ми не потребуємо петлю. 685 00:43:32,860 --> 00:43:37,200 Давайте навіть спростити цей раз, щоб не випустити з уваги дійсно фундаментальна помилка. 686 00:43:37,200 --> 00:43:39,640 Головні виклики хором співати хором, 687 00:43:39,640 --> 00:43:41,440 Потім я зробив щось дурне і я повинен був хор хор виклику 688 00:43:41,440 --> 00:43:43,760 тому що я припускав, хтось ще збирається здійснити це, може бути, 689 00:43:43,760 --> 00:43:47,210 і тепер це не буде зібрати ще. Мені потрібно зробити що? 690 00:43:47,210 --> 00:43:49,970 Мені потрібно прототип, пам'ятаю. 691 00:43:49,970 --> 00:43:56,110 Тому мені потрібно, щоб тут порожнеча хору (INT я); 692 00:43:56,110 --> 00:43:59,210 Так що тепер, якщо я йду сюди - насправді, давайте використовувати великі вікна. 693 00:43:59,210 --> 00:44:01,980 Давайте підемо далі і зробити хором. 694 00:44:01,980 --> 00:44:06,490 Давайте підемо далі і зробити хором. 695 00:44:06,490 --> 00:44:08,370 Використання неоголошений ідентифікатор я. 696 00:44:08,370 --> 00:44:12,500 О, це було нерозумно. Нам не потрібні аргументи. Давайте просто це зробити. 697 00:44:12,500 --> 00:44:16,370 Шкода, що ми розпочали цей шлях. Було б набагато простіше написати програму. 698 00:44:16,370 --> 00:44:25,590 Там же. Тепер давайте перейдемо до моїх вікно терміналу, повторно Clang, і тут ми йдемо. 699 00:44:25,590 --> 00:44:28,460 Це було дійсно швидко. 700 00:44:28,460 --> 00:44:31,150 Що насправді тільки що сталося, правда? 701 00:44:31,150 --> 00:44:33,730 Ну, тепер я додам друку лінії, тому ми можемо бачити. 702 00:44:33,730 --> 00:44:43,490 Дозвольте мені сказати, Е ("я тут") - не змінні. Ми залишимо це так. 703 00:44:43,490 --> 00:44:47,480 Дозвольте мені зробити повторно. Дозвольте мені повторно хор. 704 00:44:47,480 --> 00:44:57,380 І ... давай. Продовжуйте. 705 00:44:57,380 --> 00:44:59,930 Як осторонь, чому вона не зазнала краху? 706 00:44:59,930 --> 00:45:02,080 Помилки сегментації відбулося супер швидкий раніше. 707 00:45:02,080 --> 00:45:06,570 [Нерозбірливо відповідь студента] >> Саме так. Так що це займає час, щоб надрукувати, чи не так? 708 00:45:06,570 --> 00:45:08,610 Це займе більше роботи з боку комп'ютера. 709 00:45:08,610 --> 00:45:10,620 І ось це: помилки сегментації. 710 00:45:10,620 --> 00:45:12,340 >> Так помітите, як швидко запускати програми. 711 00:45:12,340 --> 00:45:14,130 Якщо ви не друкує нічого, супер швидко. 712 00:45:14,130 --> 00:45:18,770 Але ми все ж отримали цю помилку сегментації, тому що те, що відбувається? 713 00:45:18,770 --> 00:45:21,210 Якщо ви думаєте про те, як пам'ять комп'ютера викладається, 714 00:45:21,210 --> 00:45:28,740 У цьому випадку, щоб бути основним, але от давайте просто називати цей хор, і давайте називати це хор. 715 00:45:28,740 --> 00:45:34,550 І тепер, якщо я роблю свою естетику права, це просто буде сказати, хор, хор, хор, 716 00:45:34,550 --> 00:45:40,550 хор, хор, хор, хор, до нудоти, і врешті-решт, те, що станеться? 717 00:45:40,550 --> 00:45:45,630 Якщо велика картина, в буквальному сенсі, це те, що просто відбувається концептуально? 718 00:45:46,520 --> 00:45:48,630 Стек перевитрата купи. 719 00:45:48,630 --> 00:45:51,940 Або, що ще гірше, ви просто захоплені всі, включаючи текст сегмента, 720 00:45:51,940 --> 00:45:54,590 яка є 0 і 1, які представляють вашу програму. 721 00:45:54,590 --> 00:45:57,080 Коротше кажучи, це просто супер, супер поганого. 722 00:45:57,080 --> 00:45:58,830 Ваша програма вийшла з-під контролю. 723 00:45:58,830 --> 00:46:01,220 Ви використовуєте спосіб більше пам'яті, ніж передбачалося 724 00:46:01,220 --> 00:46:03,960 все через дурної помилки в даному випадку, 725 00:46:03,960 --> 00:46:08,040 або в даному випадку абсолютно свідомо зробили функцію, що називає себе. 726 00:46:08,040 --> 00:46:09,500 Так от, це не так уже й погано. 727 00:46:09,500 --> 00:46:13,800 Функції, які називають себе дійсно має велику силу, коли ви використовуєте його правильно. 728 00:46:13,800 --> 00:46:15,800 Я не використовував його правильно тут. 729 00:46:15,800 --> 00:46:19,780 Так що не все так погано, але те, що я ніколи не перестануть називати себе 730 00:46:19,780 --> 00:46:23,520 є фундаментальною слабкістю тут цієї програми. 731 00:46:23,520 --> 00:46:26,400 Так куди ми йдемо з усім цим? Що насправді відбувається? 732 00:46:26,400 --> 00:46:30,340 Коли я називаю приріст функції, як ми робили в тих прикладах, 733 00:46:30,340 --> 00:46:33,420 У мене є значення, як 1, що я проходжу дюйма 734 00:46:33,420 --> 00:46:37,570 Я проходжу в копії номер 1, так відбувається наступне. 735 00:46:37,570 --> 00:46:44,240 Підемо в прирощення, наприклад, цей хлопець прямо тут. 736 00:46:44,240 --> 00:46:46,870 Ось що насправді відбувається. 737 00:46:46,870 --> 00:46:53,400 Коли я називаю приріст і я проходжу по х, графічно, що відбувається ось це. 738 00:46:53,400 --> 00:46:59,520 >> Якщо у мене є вартість 1 зберігається тут, і я насправді звуть приріст, 739 00:46:59,520 --> 00:47:04,330 яка тепер називається хор - Ipad кидає мене тут. 740 00:47:04,330 --> 00:47:09,760 Давайте назвемо це прирощення, і ми не знаємо, що це наступна функція буде. 741 00:47:09,760 --> 00:47:14,840 Так що ж насправді відбувається десь тут в основному у мене є шматок пам'яті 742 00:47:14,840 --> 00:47:17,000 , Який зберігається номер 1. 743 00:47:17,000 --> 00:47:19,380 Коли я називаю приріст, я використовую іншу частину пам'яті, 744 00:47:19,380 --> 00:47:21,230 але тепер у мене є копія 1. 745 00:47:21,230 --> 00:47:26,660 Коли я збільшити це значення, це стає 2, 746 00:47:26,660 --> 00:47:30,560 але що відбувається потім, як тільки приріст прибутку? 747 00:47:30,560 --> 00:47:33,630 Ця пам'ять просто отримує повернув до операційної системи, 748 00:47:33,630 --> 00:47:37,450 яке означає, що все, що ви зробили нічого корисного. 749 00:47:37,450 --> 00:47:43,120 1, який був спочатку містилися в основному, як і раніше насправді. 750 00:47:43,120 --> 00:47:44,890 Так куди ми йдемо з цим? 751 00:47:44,890 --> 00:47:49,770 Виявляється, що в пам'яті у вас є ця спина до спини послідовність байтів 752 00:47:49,770 --> 00:47:53,050 що ви можете покласти речі в, і виявляється, що ми вже бачили щось 753 00:47:53,050 --> 00:47:55,390 який включає в себе наведення спиною до спини, щоб спина до спини. 754 00:47:55,390 --> 00:47:59,860 Що являє собою рядок, грунтуючись на тижні 1, і тепер тиждень 2? 755 00:48:00,020 --> 00:48:01,980 Це просто набір символів. 756 00:48:01,980 --> 00:48:04,310 Ось і виходить, як ви можете поставити номери в пам'яті, 757 00:48:04,310 --> 00:48:06,990 Точно так само ви можете покласти символів у пам'яті. 758 00:48:06,990 --> 00:48:10,530 І як тільки ми починаємо покласти символів у пам'яті спиною до спини, щоб спина до спини, 759 00:48:10,530 --> 00:48:13,620 Виявляється, що за допомогою найпростіших речей, як для циклу або час циклу, 760 00:48:13,620 --> 00:48:17,170 ми можемо повторювати зліва направо по символів в рядку 761 00:48:17,170 --> 00:48:20,600 і почати масажуючи їх у різні персонажі в цілому - 762 00:48:20,600 --> 00:48:23,370 може стати B, B міг би стати C - 763 00:48:23,370 --> 00:48:27,780 так що в кінцевому рахунку, ми можемо прийняти англійське пропозицію, що насправді має сенс 764 00:48:27,780 --> 00:48:30,310 і конвертувати кожну з цих листів по одному 765 00:48:30,310 --> 00:48:34,400 пішки через нашу пам'ять комп'ютера зліва направо насправді шифрування. 766 00:48:34,400 --> 00:48:35,810 Отже, давайте зробимо наш п'ятихвилинну перерву тут, 767 00:48:35,810 --> 00:48:40,730 і коли ми повернемося, ми почнемо цей процес скремблювання інформації. 768 00:48:42,020 --> 00:48:43,520 >> Добре. 769 00:48:43,520 --> 00:48:48,070 Перш ніж ми заглибимося в деякі шифрування і ці речі називаються масивами, 770 00:48:48,070 --> 00:48:51,470 Дозвольте мені паузу на будь-які питання, тому що я відчуваю, що я дійсно добрий сп'янів 771 00:48:51,470 --> 00:48:54,080 деякі з цих питань. Так що давайте зафіксуємо тепер, якщо ми можемо. 772 00:48:54,080 --> 00:48:58,700 Ми тільки що говорили про повернення цінностей, про які ми говорили аргументи, 773 00:48:58,700 --> 00:49:03,250 і ми говорили про це поняття, яке ми повернемося в найближчі тижні, 774 00:49:03,250 --> 00:49:08,720 перегляду пам'яті цілу купу цих складених лотках, так би мовити, 775 00:49:08,720 --> 00:49:12,660 знизу на вгору, так, що кожен лоток, який отримує покласти в стек 776 00:49:12,660 --> 00:49:16,530 являє собою функцію, яка в даний час називається. 777 00:49:17,900 --> 00:49:20,260 Є питання? 778 00:49:20,260 --> 00:49:22,640 Дозвольте мені задати питання тут. 779 00:49:22,640 --> 00:49:27,890 Дозвольте мені спростити це до того, що було до деяких з наших ранніх Q & A. 780 00:49:27,890 --> 00:49:35,570 Той факт, що приріст має відкриту дужку, внутр номер, закритий дужках - 781 00:49:35,570 --> 00:49:39,110 Що ж Int числа представляють? 782 00:49:39,110 --> 00:49:42,790 [Студент] аргумент. >> Аргумент. Добре. Але те, що аргумент? 783 00:49:42,790 --> 00:49:46,370 [Нерозбірливо відповідь студента] >> Що це таке? >> [Студент] Те, що ви передаєте дюйма 784 00:49:46,370 --> 00:49:49,940 Отже, те, що ви передаєте дюйма І взагалі, це просто вхід. 785 00:49:49,940 --> 00:49:52,450 Якби ви писали функції та цілі, які функціонують в житті 786 00:49:52,450 --> 00:49:55,770 повинен зробити щось трохи інше кожного разу, коли ви використовуєте його, 787 00:49:55,770 --> 00:50:00,110 , То єдиний спосіб, щоб це відбулося насправді, здавалося б надати йому вхід 788 00:50:00,110 --> 00:50:03,510 так що він може зробити щось інше за допомогою цього вкладу кожного разу. 789 00:50:03,510 --> 00:50:06,650 >> Таким чином, ви повинні визначити дві речі, коли функція приймає вхід. 790 00:50:06,650 --> 00:50:09,590 Ви повинні вказати ім'я, яке ви хочете дати, що вхідний 791 00:50:09,590 --> 00:50:12,700 виключно для вашої зручності, щоб ви могли звернутися до нього 792 00:50:12,700 --> 00:50:16,540 У функції, які ви самі пишете, як я зробив тут, в рядку 32. 793 00:50:16,540 --> 00:50:20,800 Але ви також повинні вказати його тип, тому що C є мовою програмування 794 00:50:20,800 --> 00:50:25,940 що саме потрібно, якщо ви хочете змінної, ви повинні повідомити комп'ютера, який тип даних вона є, 795 00:50:25,940 --> 00:50:30,200 У більшій частині так, щоб він не знає, скільки бітів виділити для цієї змінної 796 00:50:30,200 --> 00:50:33,020 тому що це може бути 6 - вибачте, це не буде 6. 797 00:50:33,020 --> 00:50:37,080 Це може бути 16, може бути 8, це може бути 32, навіть 64, 798 00:50:37,080 --> 00:50:39,130 але комп'ютер повинен знати. 799 00:50:39,130 --> 00:50:43,180 Тепер, внутр на лівій стороні представляє те, що, на відміну від? 800 00:50:46,350 --> 00:50:48,850 [Нерозбірливо відповідь студента] >> Що це таке? >> [Студент] Тип функції. 801 00:50:48,850 --> 00:50:53,610 Тип функції і, більш конкретно, типу своєї продукції. Право. 802 00:50:53,610 --> 00:50:57,380 Таким чином, у той час як річ в дужках представляє свій вхід, якщо такі є, 803 00:50:57,380 --> 00:50:59,660 річ, щоб ліва представляє свою продукцію. 804 00:50:59,660 --> 00:51:03,530 І в цьому випадку, мабуть приріст повертає ціле, 805 00:51:03,530 --> 00:51:07,690 і так Int є типом возвращаемого цією функцією. 806 00:51:07,690 --> 00:51:09,340 Що це значить повернути? 807 00:51:09,340 --> 00:51:15,090 Буквально, ви використовуєте ключове слово повернення і то, якщо те, що ви повертаєте 808 00:51:15,090 --> 00:51:18,600 праворуч від ключового слова є цілим числом, 809 00:51:18,600 --> 00:51:21,660 те, що дійсно відповідає тому, що ми обіцяли. 810 00:51:21,660 --> 00:51:26,410 Ви не могли б зробити щось на зразок цього - Здрастуй, світ - тому що це рядок. 811 00:51:26,410 --> 00:51:28,860 >> Очевидно, це не є цілим числом. 812 00:51:28,860 --> 00:51:33,140 Коротше кажучи, тягар насправді на нас, програмістів, для визначеності 813 00:51:33,140 --> 00:51:37,770 про те, що ми повертаємося, і тоді насправді йти про повернення його. 814 00:51:37,770 --> 00:51:43,440 Контекст тут, зараз, в тому, що пам'ять комп'ютера становить один гігабайт, 2 гігабайти - 815 00:51:43,440 --> 00:51:45,920 що завгодно, - може бути, це більше, може бути, це менше, 816 00:51:45,920 --> 00:51:49,050 але комп'ютер розглядає її як мають різні розділи. 817 00:51:49,050 --> 00:51:51,200 Щось іде туди, щось ще відбувається там, нагорі, 818 00:51:51,200 --> 00:51:54,290 різні речі йде в середині, і сьогодні ми тільки починаємо розповідати історію, 819 00:51:54,290 --> 00:51:56,340 але ми повернемося до цього з часом. 820 00:51:56,340 --> 00:51:59,980 В даний час, тільки шматок пам'яті ми дійсно дбаємо про те, текстовий сегмент 821 00:51:59,980 --> 00:52:03,360 тому що тільки що представляє 0 і 1, що Clang був сигнал. 822 00:52:03,360 --> 00:52:06,050 Отже, коли ви запустите команду на клавіатурі, як a.out 823 00:52:06,050 --> 00:52:09,110 або ви двічі клацніть значок на Mac OS або Windows, 824 00:52:09,110 --> 00:52:11,880 Ваша програма завантажується з жорсткого диска в оперативну пам'ять 825 00:52:11,880 --> 00:52:16,330 і він гепнувся у верхній частині оперативної пам'яті комп'ютера, так би мовити. 826 00:52:16,330 --> 00:52:20,450 Між тим, як ваша програма починає працювати і основні викликається 827 00:52:20,450 --> 00:52:23,640 У програмі ви писали або програми Microsoft або Apple, пише, 828 00:52:23,640 --> 00:52:27,860 будь-якого з її локальні змінні в кінцевому підсумку там на дні пам'яті комп'ютера. 829 00:52:27,860 --> 00:52:33,230 Але якщо основні виклики іншу функцію, яка сама по собі має змінні чи аргументи, вони в кінцевому підсумку над ним. 830 00:52:33,230 --> 00:52:36,680 І якщо ця функція викликає те, що вони в остаточному підсумку над ним, над ним, над ним. 831 00:52:36,680 --> 00:52:41,460 >> І тільки один раз в функції здійснюється виконанням Чи стек лотків, так би мовити, 832 00:52:41,460 --> 00:52:43,240 починають отримувати все нижче і нижче. 833 00:52:43,240 --> 00:52:48,250 І це те, що тоді, в двох словах, пояснює, чому, коли ви дзвоните кубі 834 00:52:48,250 --> 00:52:51,550 або ви дзвоните приріст, ви передаєте копію значення. 835 00:52:51,550 --> 00:52:55,520 А що це означає, що наочно це те, що ви буквально написання номер 1 836 00:52:55,520 --> 00:53:00,460 В іншій частині пам'яті, зміни, що з 1 по 2 у разі збільшення 837 00:53:00,460 --> 00:53:04,820 або 8 у разі куба, а потім кидали, що пам'ять далеко 838 00:53:04,820 --> 00:53:09,140 як тільки збільшення або повернення куб функції. Питання. 839 00:53:09,140 --> 00:53:12,900 [Студент] Де глобальні змінні зберігаються? 840 00:53:12,900 --> 00:53:18,100 Глобальні змінні зберігаються в те, що в даний час називається инициализируются дані або неініціалізованих даних, 841 00:53:18,100 --> 00:53:21,920 різниця в тому, якщо у вас є глобальна змінна і ви призначаєте його відразу ж значення 842 00:53:21,920 --> 00:53:24,640 з знак рівності, вона закінчується на вершині, 843 00:53:24,640 --> 00:53:29,200 і якщо ви просто говорите Int х, без значення, це закінчується трохи нижче, в оперативній пам'яті 844 00:53:29,200 --> 00:53:31,710 Просто за угодою. 845 00:53:31,710 --> 00:53:34,940 Інші питання? Добре. 846 00:53:34,940 --> 00:53:37,340 Таким чином, ця картина буде повертатися, як ми отримаємо більш потужний 847 00:53:37,340 --> 00:53:39,170 з тим, що ми можемо зробити з комп'ютером, 848 00:53:39,170 --> 00:53:42,720 але зараз, давайте короткий вступ в криптографію, 849 00:53:42,720 --> 00:53:46,080 певний тип шифрування, не вирішує всіх проблем у світі 850 00:53:46,080 --> 00:53:47,720 але вирішити деякі з них. 851 00:53:47,720 --> 00:53:51,700 У цьому випадку тут, у нас є те, що називається секретним ключем. 852 00:53:51,700 --> 00:53:56,410 Секретним ключем, як випливає з назви, відбувається її безпеки від таємницею. 853 00:53:56,410 --> 00:54:00,690 >> Наприклад, якщо ви були ще в початковій школі, і ви проходили трохи любовний лист таємного 854 00:54:00,690 --> 00:54:04,850 до хлопчику чи дівчинці ви тиснули на, якщо ви хотіли передати цю записку по аудиторії, 855 00:54:04,850 --> 00:54:08,380 Ви, ймовірно, не буде писати таку записку на англійській мові або що ваша рідна мова. 856 00:54:08,380 --> 00:54:13,340 Замість цього, ви можете зашифрувати або ви можете просто відправити їм текстове повідомлення в ці дні. 857 00:54:13,340 --> 00:54:15,460 Але ви могли б насправді передають їх до відома всьому класі. 858 00:54:15,460 --> 00:54:18,700 І зробити це надійно таким чином, що ваші друзі і вчителі 859 00:54:18,700 --> 00:54:22,650 Не знаю, що ви пишете, ви можете придумати досить простий алгоритм, 860 00:54:22,650 --> 00:54:25,920 Молодий хоча ви могли б бути, просто дертися слова. 861 00:54:25,920 --> 00:54:28,130 Таким чином, замість того, щоб писати ви можете написати б, 862 00:54:28,130 --> 00:54:30,220 замість б ви могли б написати с, 863 00:54:30,220 --> 00:54:32,140 замість того, щоб з вами могли б написати D, і так далі. 864 00:54:32,140 --> 00:54:34,360 Або ви могли б придумати більш складний переклад 865 00:54:34,360 --> 00:54:36,720 листів у різні літери. 866 00:54:36,720 --> 00:54:39,740 Але заковика в тому, хлопчик чи дівчинка, яким ви відправляєте цю замітку 867 00:54:39,740 --> 00:54:45,020 потрібно знати щось, що і, очевидно? >> [Студент] Що ви відправляєте. 868 00:54:45,020 --> 00:54:49,720 Який ваш секрет, як і те, що в тому, що відповідність між а і Ь і с і д и. 869 00:54:49,720 --> 00:54:54,650 Це тільки додавання 1 до кожної з букв, щоб перейти від А до Б, В до С? 870 00:54:54,650 --> 00:54:56,670 Це більш складний, ніж це? 871 00:54:56,670 --> 00:55:01,540 >> Таким чином, ви і ваш розчавити повинні мати цю секретну інформацію, 872 00:55:01,540 --> 00:55:03,190 але є види Catch-22 тут. 873 00:55:03,190 --> 00:55:06,830 Якщо це в перший раз ви відправляєте цю любов листа через клас, 874 00:55:06,830 --> 00:55:10,720 Як це хлопчик чи дівчинка буде знати, в чому секрет навіть є? 875 00:55:10,720 --> 00:55:13,930 Так що секретний ключ шифрування не вирішує всіх проблем у світі, 876 00:55:13,930 --> 00:55:16,320 і є насправді зв'язок тут, що ми повернемося до до кінця семестру. 877 00:55:16,320 --> 00:55:25,110 Точно так само більшість з нас не знає, що хтось працює, наприклад, на Amazon.com, 878 00:55:25,110 --> 00:55:28,190 і все ж багато хто з нас, напевно, купив матеріал в Amazon.com, 879 00:55:28,190 --> 00:55:31,990 і нас вчили вважати, що ці транзакції електронної торгівлі знаходяться в безпеці. 880 00:55:31,990 --> 00:55:36,470 URL, ймовірно, говорить HTTPS, є, може бути, дурний маленький значок замку десь, 881 00:55:36,470 --> 00:55:39,930 є якась криптографії забезпеченні інформації про кредитну карту 882 00:55:39,930 --> 00:55:42,160 між вами і Amazon.com. 883 00:55:42,160 --> 00:55:45,430 І все ж, якщо криптографія містить у собі знання якийсь секрет 884 00:55:45,430 --> 00:55:48,620 І все ж я не знаю нікого, на Амазонці, і я, звичайно, не влаштував будь секрет 885 00:55:48,620 --> 00:55:52,710 з кимось на Amazon, як мій комп'ютер або мій браузер це робить? 886 00:55:52,710 --> 00:55:55,720 Виявляється, є інші види криптографії взагалі, що вирішити цю проблему. 887 00:55:55,720 --> 00:55:57,670 Але на сьогоднішній день, ми зосередимося на простий 888 00:55:57,670 --> 00:56:00,290 , Де можна організувати заздалегідь знати деякі таємні 889 00:56:00,290 --> 00:56:03,760 +1 Або як деяке відображення між а і б о. 890 00:56:03,760 --> 00:56:05,840 І процес криптографії звичайно включає в себе це. 891 00:56:05,840 --> 00:56:08,620 У вас є звичайний текст, зображений тут, на лівому, 892 00:56:08,620 --> 00:56:12,930 ви запускаєте його через якийсь алгоритм або процедура шифрування - 893 00:56:12,930 --> 00:56:15,100 Може бути, це просто стає B, B стає з - 894 00:56:15,100 --> 00:56:17,490 і тоді ви в кінцевому підсумку з зашифрованого тексту. 895 00:56:17,490 --> 00:56:20,380 Тим часом, як тільки ваш розчавити отримує цю таємницю, зверніть увагу, 896 00:56:20,380 --> 00:56:24,200 Він або вона повинен розшифрувати його, як правило заднім ходом, що алгоритм 897 00:56:24,200 --> 00:56:27,190 таким чином, щоб повернути звичайний текст. 898 00:56:27,190 --> 00:56:28,960 Є фізичні втілення цього. 899 00:56:28,960 --> 00:56:31,680 >> Наприклад, це колечко декодер секрет, 900 00:56:31,680 --> 00:56:35,110 і це кільце в тому сенсі, що є два набори тут. 901 00:56:35,110 --> 00:56:38,490 На зовнішній периферії цією річчю, тобто букви від А до Z, 902 00:56:38,490 --> 00:56:40,340 хоча вони у випадковому порядку, 903 00:56:40,340 --> 00:56:42,880 і з внутрішньої сторони, там насправді деякі цифри 904 00:56:42,880 --> 00:56:46,620 такі, що з цим кільцем Ви можете включити вигляд зовні, але не всередині 905 00:56:46,620 --> 00:56:49,140 для того, щоб вибудувати номери з літерами. 906 00:56:49,140 --> 00:56:53,020 З фільму під назвою Різдвяна історія, ви побачите, що мало Ральфі 907 00:56:53,020 --> 00:56:58,000 так не терпілося з'ясувати, що секретне повідомлення Little Orphan Annie була для нього 908 00:56:58,000 --> 00:57:02,570 що було повідомлено, я думаю, у вигляді числових повідомлення на коробки від пластівців 909 00:57:02,570 --> 00:57:07,220 і потрібно було зібрати всі маленькі карти, які прийшли в зернових вікна, 910 00:57:07,220 --> 00:57:09,770 Ви повинні були відправити їм поштою, ви повинні були повернутися таємницю кільця декодер 911 00:57:09,770 --> 00:57:13,910 так що ви можете, нарешті, з'ясувати, що відображення між буквами і цифрами 912 00:57:13,910 --> 00:57:15,550 або букв і букв. 913 00:57:15,550 --> 00:57:19,520 Як в комп'ютері ми можемо йти про реалізацію або представляють такі речі? 914 00:57:19,520 --> 00:57:22,560 Нам потрібно знайти спосіб виразити себе трохи більш гнучко 915 00:57:22,560 --> 00:57:25,080 ніж наші змінні досі дозволив. 916 00:57:25,080 --> 00:57:29,000 У нас були цілими, у нас були символи, які ми мали поплавці й двомісні і деякі інші, 917 00:57:29,000 --> 00:57:34,200 але ці окремі частини пам'яті, яка насправді не дозволяють виразити речі 918 00:57:34,200 --> 00:57:36,440 як слова і пропозиції і фрази. 919 00:57:36,440 --> 00:57:38,630 У самому справі, ми називали такі рядки речі, 920 00:57:38,630 --> 00:57:42,660 але ми обіцяємо, що це дійсно просто спрощення CS50 бібліотеки 921 00:57:42,660 --> 00:57:45,540 що ми маємо намір відігніть. 922 00:57:45,540 --> 00:57:47,500 І так, давайте почнемо робити це тут. 923 00:57:47,500 --> 00:57:49,840 Дозвольте мені йти вперед і відкривати файл - 924 00:57:49,840 --> 00:57:54,100 Всі ці файли доступні, як зазвичай, онлайн - звані array.c 925 00:57:54,100 --> 00:57:58,960 вирішити проблему, не пов'язаних з рядками, але це малює картину тут 926 00:57:58,960 --> 00:58:01,520 про те, як ми могли б використовувати те, що називається масивом. 927 00:58:01,520 --> 00:58:04,050 >> Масив являє собою тип даних. 928 00:58:04,050 --> 00:58:10,730 Це тип змінної роду, який має дещо менші типи даних усередині нього 929 00:58:10,730 --> 00:58:12,680 спиною до спини, щоб спина до спини. 930 00:58:12,680 --> 00:58:16,980 Так, наприклад, якщо ми хочемо написати невелику програму, яка дає вам ваш тест середнього 931 00:58:16,980 --> 00:58:19,780 на курс, як 50, яка має 2 вікторини, 932 00:58:19,780 --> 00:58:23,450 Ви можете дуже легко написати цю програму, засновану навіть на деяких з матеріалу минулого тижня 933 00:58:23,450 --> 00:58:28,830 за допомогою GetInt і кілька змінних: Int quiz1, внутр quiz2. 934 00:58:28,830 --> 00:58:30,550 І це досить просто. 935 00:58:30,550 --> 00:58:33,500 Це може бути 10, 20 рядків коду, максимальна реалізація програми 936 00:58:33,500 --> 00:58:38,940 , Який просить користувача протягом 2 балів вікторини і потім обчислює їх середнє 937 00:58:38,940 --> 00:58:42,020 , Складаючи їх разом, ділячи на 2, а потім друку результатів. 938 00:58:42,020 --> 00:58:46,400 Ми могли б зробити це досить легко зараз, після деякої кількості хвилин. 939 00:58:46,400 --> 00:58:49,450 Але проблема в тому, що припустимо, що 50 було 3 або 4 вікторини. 940 00:58:49,450 --> 00:58:52,830 Припустимо, що ви хотіли використовувати ту ж програму для класу, який був щотижневі вікторини. 941 00:58:52,830 --> 00:58:55,100 Подумайте про клас, який щотижневі вікторини. 942 00:58:55,100 --> 00:58:58,840 Якщо є 16 або так тижнів в семестр, тепер у вас є 16 змінних: 943 00:58:58,840 --> 00:59:03,030 quiz1 Int, Int quiz2, внутр quiz3, внутр quiz4. 944 00:59:03,030 --> 00:59:06,870 Як тільки ви починаєте бачити цю надмірність, це скопіювати і вставити код, 945 00:59:06,870 --> 00:59:09,810 він повинен почати робити ви хочете там було краще. 946 00:59:09,810 --> 00:59:13,610 І на щастя, тому що масиви є. Так давайте зробимо це. 947 00:59:13,610 --> 00:59:16,700 По-перше, дозвольте мені представити дуже просту річ, що ми не використали досі, 948 00:59:16,700 --> 00:59:18,820 але ви побачите, що іноді в коді. 949 00:59:18,820 --> 00:59:21,270 >> Це те, що зазвичай називається постійною. 950 00:59:21,270 --> 00:59:24,410 Так що це постійна в тому сенсі, що це значення ніколи не змінюється. 951 00:59:24,410 --> 00:59:26,450 Людські конвенції при створенні постійної 952 00:59:26,450 --> 00:59:30,420 є використання всіх заголовних букв просто так, що він дійсно виділяється в коді, 953 00:59:30,420 --> 00:59:34,270 і спеціальні ключові слова, які ви використовуєте в С # визначити. 954 00:59:34,270 --> 00:59:39,970 Тому ми говоримо, # визначити, то простір, то слово, яке ви хочете використовувати для назви константи 955 00:59:39,970 --> 00:59:41,730 , А потім значення константи. 956 00:59:41,730 --> 00:59:44,710 Зверніть увагу, що це відрізняється від присвоєння щось змінна. 957 00:59:44,710 --> 00:59:46,430 Там немає знаку рівності, немає коми. 958 00:59:46,430 --> 00:59:49,140 Це те, що відомо як директива препроцесора, 959 00:59:49,140 --> 00:59:50,840 але про це іншим разом. 960 00:59:50,840 --> 00:59:56,350 На даний момент, це створює незмінне значення, зване вікторини 961 00:59:56,350 --> 00:59:58,290 , Фактичне числове значення 2. 962 00:59:58,290 --> 01:00:02,180 Таким чином, скрізь, де є тести, вікторини, тести на протязі всього цього файлу, 963 01:00:02,180 --> 01:00:04,230 от тільки номер 2. 964 01:00:04,230 --> 01:00:06,550 Якщо я дивлюся на основні Тепер, давайте подивимося, як це працює. 965 01:00:06,550 --> 01:00:09,770 Спочатку це виглядає трохи загадково, але це все речі з тижня 1. 966 01:00:09,770 --> 01:00:12,210 Запитайте у користувача класах. Як ми це робимо? 967 01:00:12,210 --> 01:00:17,350 У рядку 22 - це дійсно соковиті частини - я заявляю, поплавок 968 01:00:17,350 --> 01:00:23,240 але не тільки одним поплавком. Я оголосивши, швидше, масив значень з плаваючою точкою. 969 01:00:23,240 --> 01:00:27,700 Це змінна буде називатися класах, як це мається на увазі тут, 970 01:00:27,700 --> 01:00:31,420 але тільки частина нового синтаксису, то ці квадратні дужки. 971 01:00:31,420 --> 01:00:37,280 Той факт, що я сказав поплавок класах, а потім відкрити дужку, а потім номер - 972 01:00:37,280 --> 01:00:40,980 помітить, якщо це постійна це так само, як ми зробили це - 973 01:00:40,980 --> 01:00:46,840 це означає: "Ей, комп'ютер, дайте мені 2 поплавця і давайте колективно називають їх оцінки." 974 01:00:46,840 --> 01:00:51,780 >> Це на відміну від набагато більш трудомісткий процес таким чином: поплавець Grade1; 975 01:00:51,780 --> 01:00:54,580 grade2 плавати, і так далі. 976 01:00:54,580 --> 01:00:58,310 Таким чином, масив дозволяє нам реалізувати цю ідею, але набагато менш неохайно, 977 01:00:58,310 --> 01:01:04,560 таким чином, що ми можемо написати 1 рядок коду, а не, скажімо, 16 на 16-тижневий семестр. 978 01:01:04,560 --> 01:01:09,060 Я не хочу, щоб закодувати 2, тому що, якщо ви думаєте про це тепер логічно, 979 01:01:09,060 --> 01:01:12,560 Припустимо, у наступному році CS50 змін до 3 вікторини замість 980 01:01:12,560 --> 01:01:15,010 і у мене був номер 2 тут, у мене був номер 2 тут, 981 01:01:15,010 --> 01:01:17,210 У мене був номер 2 тут, номер 2 тут. 982 01:01:17,210 --> 01:01:19,890 Вона стає дуже виснажливим і дуже легко зіпсувати 983 01:01:19,890 --> 01:01:26,550 і випадково змінити значення 1 до 3 і пропустити деякі інші значення 2. 984 01:01:26,550 --> 01:01:30,660 Так що я збираюся замість абстрактного це відстань і використати цю константу, яка, 985 01:01:30,660 --> 01:01:32,520 як припускає його назву, ніколи не змінюється. 986 01:01:32,520 --> 01:01:35,870 І тепер незалежно від того, чи є у нас різні вікторини цьому або наступному році, 987 01:01:35,870 --> 01:01:39,380 Я просто змінити його в одному місці, тут на вершині. 988 01:01:39,380 --> 01:01:41,230 Так що всі константи. 989 01:01:41,230 --> 01:01:47,100 Тим часом, нова концептуальна особливість полягає в тому масиву. 990 01:01:47,100 --> 01:01:55,030 Таким чином, у квадратних дужках дати мені це багато плаває і дозволяє мені колективно називають їх класах тут. 991 01:01:55,030 --> 01:01:56,720 Отже, тепер давайте подивимося, що я збираюся робити. 992 01:01:56,720 --> 01:01:59,220 Тут, у рядку 24 є початком циклу. 993 01:01:59,220 --> 01:02:03,380 >> Це дійсно нічого особливого. Це тільки за допомогою вікторин, а не жорстко числа. 994 01:02:03,380 --> 01:02:06,740 Але немає нічого інтелектуально різних там з минулого тижня. 995 01:02:06,740 --> 01:02:11,650 Це просто Printf, тому Е ("Вікторина #% сут% D:") 996 01:02:11,650 --> 01:02:16,670 тому що я просто хочу, щоб роздрукувати дати мені вікторини № 1 з 2, а потім 2 із 2. 997 01:02:16,670 --> 01:02:18,480 Так що це чисто естетична річ. 998 01:02:18,480 --> 01:02:21,000 Але найцікавіше зараз знаходиться в рядку 27. 999 01:02:21,000 --> 01:02:27,840 Для того, щоб заповнити одну з двох заповнювачів з плаваючою точкою, 1000 01:02:27,840 --> 01:02:29,640 Ви знову використовувати квадратні дужки. 1001 01:02:29,640 --> 01:02:35,170 У цьому випадку, я використовую я, тому що це цикл почався з я, яке значення рівне, мабуть? 1002 01:02:35,170 --> 01:02:36,670 [Студент] 0. >> [Малан] 0. 1003 01:02:36,670 --> 01:02:40,990 Таким чином, на першій ітерації цього циклу, це як якби я написав це в коді, 1004 01:02:40,990 --> 01:02:46,310 але на другий ітерації цього циклу, це як якби я написав це в своєму коді. 1005 01:02:46,310 --> 01:02:49,970 Але те, що я використовую змінну чудово, тому що, як випливає з назви, 1006 01:02:49,970 --> 01:02:52,600 це зміна його значення на кожній ітерації, 1007 01:02:52,600 --> 01:02:55,900 так що я заповнення цього масиву одному місці за один раз. 1008 01:02:55,900 --> 01:02:57,380 Що це масив виглядає? 1009 01:02:57,380 --> 01:03:01,570 Тому я звернув супер простий прямокутник на екрані тут раніше була для цього причина. 1010 01:03:01,570 --> 01:03:05,590 Масив це просто шматок пам'яті послідував ще один шматок пам'яті 1011 01:03:05,590 --> 01:03:08,570 пішов ще один шматок пам'яті і так далі. 1012 01:03:08,570 --> 01:03:13,120 Так що, якщо мій масив розміром 2 в цьому випадку тут, все, що я буду робити 1013 01:03:13,120 --> 01:03:20,200 , Ввівши в моєї оцінки вікторини подобається тут, - я отримав 100 на один, а потім я отримав 99 на цьому - 1014 01:03:20,200 --> 01:03:24,970 Потім ця пам'ять не може навіть бути використаний, тому що я тільки запитав комп'ютера 1015 01:03:24,970 --> 01:03:26,840 для масиву розміром 2. 1016 01:03:26,840 --> 01:03:28,600 Ці квадрати все ще там, чи не так? 1017 01:03:28,600 --> 01:03:32,670 У вас ще є 2 гігабайти оперативної пам'яті, навіть якщо ви тільки просять 2 поплавка. 1018 01:03:32,670 --> 01:03:36,840 Таким чином, ідея масивів є те, що комп'ютер просто бере шматок пам'яті 1019 01:03:36,840 --> 01:03:41,340 , А потім розподіляє дрібні шматки спина до спини, щоб спина до спини. 1020 01:03:41,340 --> 01:03:43,310 І це все, що масив. 1021 01:03:43,310 --> 01:03:47,350 >> Це безперервний шматок пам'яті, всередині якої ви можете покласти речі. 1022 01:03:47,350 --> 01:03:50,700 Це відбувається, щоб потім зробити лише кілька нудно арифметика. 1023 01:03:50,700 --> 01:03:54,640 Якщо я прокрутіть вниз тут, це де я тоді ітерації по масиву. 1024 01:03:54,640 --> 01:03:58,020 Я придумав підсумовування всіх значень у масиві, 1025 01:03:58,020 --> 01:04:02,470 а потім використовувати круглий функцію тут насправді робити сума ділиться на вікторини. 1026 01:04:02,470 --> 01:04:06,320 Але дозвольте мені махнути рукою на що як свого роду досить арифметичних зараз. 1027 01:04:06,320 --> 01:04:08,370 Але все, що робить для мене, в кінцевому рахунку, обчислення середнього. 1028 01:04:08,370 --> 01:04:13,580 Отже, спочатку тест, плюс другий тест ділиться на 2, а потім роздрукувати його, як Int. 1029 01:04:13,580 --> 01:04:17,280 Але давайте тепер перехід до іншої приклад називається string1, 1030 01:04:17,280 --> 01:04:20,700 який малює аналогічну картину, але з використанням рядків. 1031 01:04:20,700 --> 01:04:23,940 Дозвольте мені йти вперед і спростити цей на мить. 1032 01:04:23,940 --> 01:04:27,090 Вибачте відступ на даний момент. 1033 01:04:27,090 --> 01:04:30,870 Зверніть увагу на лінію 19 з цього прикладу, я отримую рядок від користувача. 1034 01:04:30,870 --> 01:04:34,640 Але зверніть увагу на те, що я роблю в наступному ліній 22 і далі. 1035 01:04:34,640 --> 01:04:41,250 Насправді я ітерація від Я до - і це новий трюк - StrLen, довжина рядка. 1036 01:04:41,250 --> 01:04:44,880 Це функція, яка поставляється з C, що якщо ви передаєте його рядки, 1037 01:04:44,880 --> 01:04:47,730 він говорить вам, скільки символів в цьому рядку. Ось і все. 1038 01:04:47,730 --> 01:04:51,550 А те, що це StrLen замість того, щоб довжина рядка просто тому, що це більш коротким. 1039 01:04:51,550 --> 01:04:55,100 Тридцять років тому, людям подобалося писати речі, як лаконічно наскільки це можливо, 1040 01:04:55,100 --> 01:04:57,630 тому ми зберегли цю конвенцію тут. 1041 01:04:57,630 --> 01:05:00,660 я + + означає лише те збільшуємо я в кожній ітерації. 1042 01:05:00,660 --> 01:05:02,990 А тепер помічаю це, що дійсно цікаво. 1043 01:05:02,990 --> 01:05:09,180 У рядку 24, я кажу: "Комп'ютер, дай мені характером, 8 біт, і називаємо його з". 1044 01:05:09,180 --> 01:05:12,630 Але що це на правій стороні говорите? 1045 01:05:13,490 --> 01:05:16,530 В англійській мові, що це уявляєте? 1046 01:05:16,530 --> 01:05:18,730 [Студент] Перший символ в масиві. 1047 01:05:18,730 --> 01:05:20,790 Саме так. Дайте мені перший символ в масиві. 1048 01:05:20,790 --> 01:05:24,090 Або, в більш загальному, дай мені-й символ в масиві. 1049 01:05:24,090 --> 01:05:26,100 І розумію, що це важливо зараз, як комп'ютерні науки, 1050 01:05:26,100 --> 01:05:27,890 ми насправді починаючи з 0. 1051 01:05:27,890 --> 01:05:29,720 >> Ви не повинні розсуд зараз, щоб почати це робити. 1052 01:05:29,720 --> 01:05:34,160 Тепер ви повинні вести себе відповідно до очікувань комп'ютер і вважати від 0 1053 01:05:34,160 --> 01:05:38,180 тому що [0] буде перший символ в рядку, 1054 01:05:38,180 --> 01:05:42,150 [1] буде другий, [2] буде третім, і так далі. 1055 01:05:42,150 --> 01:05:49,720 Таким чином, ця програма, якщо я скомпілювати його, це знову string1, так що string1, 1056 01:05:49,720 --> 01:05:54,670 і тепер я зіткнувся string1 в моєму вікні терміналу. 1057 01:05:54,670 --> 01:05:58,330 Він очікує введення, так що я збираюся ввести Давида, Enter 1058 01:05:58,330 --> 01:06:02,540 і тепер вона друкує Девід все на різних лініях, тому що повідомлення, що я роблю. 1059 01:06:02,540 --> 01:06:05,820 Я друк одного символу за один раз. 1060 01:06:05,820 --> 01:06:10,100 Ми не будемо вдаватися в подробиці сьогодні на цьому, але я видалив цю хвилину тому тут галочку. 1061 01:06:10,100 --> 01:06:15,480 Виявляється, що якщо користувач неправильно, змагальності, або просто плутають, 1062 01:06:15,480 --> 01:06:20,210 Ви можете фактично не дають рядки деякої довжини. 1063 01:06:20,210 --> 01:06:22,860 Якщо ви натиснете не ту клавішу на клавіатурі, ви можете не дають рядок на всіх, 1064 01:06:22,860 --> 01:06:26,950 або якщо ви злий, ви можете спробувати, щоб вставити у вартість гігабайта про есе 1065 01:06:26,950 --> 01:06:29,290 щоб заповнити цей рядок, і якщо комп'ютер працює з пам'яті, 1066 01:06:29,290 --> 01:06:32,710 Виявляється, що ми збираємося повернути це спеціальне значення, зване NULL. 1067 01:06:32,710 --> 01:06:35,580 Таким чином, на даний момент, просто знаю, що є це спеціальне значення, зване NULL 1068 01:06:35,580 --> 01:06:39,580 , Що дозволить нам перевірити, коли ми з пам'яті, між іншим. 1069 01:06:39,580 --> 01:06:45,630 Але якщо я відкриваю зараз string2, зверніть увагу на одна відмінність тут. 1070 01:06:45,630 --> 01:06:48,210 Зверніть увагу на одна відмінність тут з string2. 1071 01:06:48,210 --> 01:06:51,340 З string2, цей цикл трохи відрізняється. 1072 01:06:51,340 --> 01:06:55,010 >> Дозвольте мені видалити нулі, так що ми можемо говорити про тих, хто в інший раз. 1073 01:06:55,010 --> 01:06:57,800 Чим відрізняється цикл на цей раз? 1074 01:06:59,620 --> 01:07:01,670 Я можу повернутися до попереднього прикладу. 1075 01:07:01,670 --> 01:07:08,580 Так от версія 2, це версія 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 StrLen виклик де? 1078 01:07:16,660 --> 01:07:18,860 Це в першій частині циклу. 1079 01:07:18,860 --> 01:07:21,830 Будь-які думки про те, чому я це роблю? Так. 1080 01:07:21,830 --> 01:07:24,560 [Студент] Таким чином, ви не викликаєте функцію кожного разу. 1081 01:07:24,560 --> 01:07:26,440 [Малан] Таким чином, ми не викликаємо функцію кожного разу. Саме так. 1082 01:07:26,440 --> 01:07:28,300 Нагадаємо, з петлями на те, що вони супер просто 1083 01:07:28,300 --> 01:07:31,770 Як тільки ви начебто розумію, що це ініціалізація, умова і оновлення. 1084 01:07:31,770 --> 01:07:34,750 Проблема в тому, що умова відбувається на кожній ітерації циклу. 1085 01:07:34,750 --> 01:07:40,010 І тому в даному прикладі, що таке погано про те, що це мій стан? 1086 01:07:40,010 --> 01:07:41,830 [Студент] Ви телефонуєте StrLen. 1087 01:07:41,830 --> 01:07:44,340 [Малан] Ви телефонуєте StrLen знову і знову, і знову. 1088 01:07:44,340 --> 01:07:47,410 Але як тільки я набрав у Девіда, довжина цього рядка дорівнює 5, 1089 01:07:47,410 --> 01:07:49,650 і він не збирається змінювати на кожній ітерації 1090 01:07:49,650 --> 01:07:51,670 тому що рядок як і раніше D - V-я-д. 1091 01:07:51,670 --> 01:07:55,320 Так що це натяк на те, що збирається ставати все більш важливою ідеєю 1092 01:07:55,320 --> 01:08:00,410 відомий як дизайнерське рішення, де тільки не роблять комп'ютер робити непотрібну роботу. 1093 01:08:00,410 --> 01:08:03,920 >> Так само, як попередній перегляд pset2, pset2 в стандартному виданні 1094 01:08:03,920 --> 01:08:07,030 збирається кинути вам виклик насправді реалізації деякого числа шифрів, 1095 01:08:07,030 --> 01:08:10,410 деяка кількість алгоритмів шифрування, так що ви можете не тільки зашифрувати 1096 01:08:10,410 --> 01:08:13,840 і дешифрування секретних повідомлень так само, як однієї Ральфі там декодувати. 1097 01:08:13,840 --> 01:08:16,810 У хакером видання pset2, ми збираємося піти трохи далі. 1098 01:08:16,810 --> 01:08:19,649 Ми збираємося передати вам файл з фактичними комп'ютерної системи 1099 01:08:19,649 --> 01:08:23,479 , Який містить цілу купу імен та фактичної зашифровані паролі, 1100 01:08:23,479 --> 01:08:26,939 і завдання для хакера видання буде зламувати ці паролі 1101 01:08:26,939 --> 01:08:33,200 і з'ясувати, що криптографія і таємні, що був використаний для створення Насправді ці паролі. 1102 01:08:33,200 --> 01:08:36,109 І ми збираємося зробити це за допомогою нової функції тут C 1103 01:08:36,109 --> 01:08:40,630 що я дам вам тільки демо відомий як аргументи командного рядка. 1104 01:08:40,630 --> 01:08:44,229 Виявляється, як деякі з вас, можливо, бачили в розділі або в підручниках, 1105 01:08:44,229 --> 01:08:48,260 Основним не завжди повинна бути порожнеча в дужках. 1106 01:08:48,260 --> 01:08:52,430 Виявляється, що основна можна також записати як це, з двома аргументами, 1107 01:08:52,430 --> 01:08:56,870 ARGC і ARGV, де ARGC число слів 1108 01:08:56,870 --> 01:09:00,020 що ви вводите після назви програми на вашому командного рядка 1109 01:09:00,020 --> 01:09:03,420 і ARGV є фактичним слів. 1110 01:09:03,420 --> 01:09:07,540 І, як квадратні дужки там пропонують, ARGV мабуть масиву. 1111 01:09:07,540 --> 01:09:12,210 Це збирається бути рядком після рядка після рядка в пам'яті. 1112 01:09:12,210 --> 01:09:16,010 >> Так що ми збираємося бути в змозі зробити, починаючи з PSET 2, щось на зразок цього. 1113 01:09:16,010 --> 01:09:21,350 Якщо я роблю argv1, який є прикладом ми повернемося до в понеділок, і запустити його, 1114 01:09:21,350 --> 01:09:23,370 зауважити, що це не схоже, щоб зробити що-небудь ще. 1115 01:09:23,370 --> 01:09:25,490 Він просто виводить своє ім'я. 1116 01:09:25,490 --> 01:09:31,479 Але якщо я прощаюся класу, зверніть увагу, що ця програма мабуть ітерації 1117 01:09:31,479 --> 01:09:35,479 над кожним зі слів, які були надруковані в командному рядку. 1118 01:09:35,479 --> 01:09:41,630 І засоби, за допомогою яких ми зможемо отримати доступ до слів, які користувач ввів у командному рядку 1119 01:09:41,630 --> 01:09:49,160 є зміна основною відправною цей уїк-енд від Int основних (недійсними) на Int основних (агдс, ARGV) 1120 01:09:49,160 --> 01:09:52,050 і, отже, народиться аргументи командного рядка. 1121 01:09:52,050 --> 01:09:57,100 І як тільки ви отримаєте дійсно складна в цьому, ви зможете написати дійсно тріп програм 1122 01:09:57,100 --> 01:09:59,610 таких, як цей ось, який йде вище і поза 1123 01:09:59,610 --> 01:10:03,940 деякі функції, які ми зробили до сих пір, але все досить потужний. 1124 01:10:03,940 --> 01:10:08,950 >> Таким чином, ми залишимо це з цим на екрані, і ми будемо бачити Вас в понеділок. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]