[Powered by Google Translate] Дейвид Дж. Малан: Добре. Това е CS50, и това е края на седмица две. Ако очаквате да бъде гладен утре по това време, знаят, че ние ще да свика малка група утре, четвъртък, 13:15. Има този адрес тук, ако искате да потвърдят. Пространството е ограничено, така че, моля те прости, ако формулярът се запълни с времето попълването на формуляра. Друг URL, въпреки че може да бъде от интерес. Така че само за един месец, курсът ще бъде на разположение още по-голяма степен чрез EDX хора в интернет, чрез които ще бъде в състояние да следват заедно, да се включат в курса доста активно в действителност. Те ще се използват CS50 техника и CS50 Обсъждане и по-голямата част от различни софтуерни инструменти, които вече са използвали този семестър. И една от инициативите, ние бихме искали да поемат като експеримент тази година е да се види колко много съдържание, което може да се трансформира в други говори и писмени езици. Така че, ако може да имат интерес да участват в този проект, при който ние ще осигурим преписи и субтитри на английски език за курса лекции и шорти и семинари и сектори и други подобни - ако говорите свободно или напишете свободно друг език, ние ще обичат да участват в този проект, при който ви отведе на една или повече от видеоклипове, да ги преведе на език, който познавам доста добре. Да ви даде чувство на интерфейса, има този уеб-базиран потребителски интерфейс , че ще се използва, които ще създадат по същество UI като този. Това ме учеше преди някои Хелоуин. И от дясната страна в черно до тези времеви печати, ще видите различни неща, които излязоха от устата ми, че ден. И тогава под него, ще бъде в състояние да превеждат на друг език. Какво точно картографиране е между тях, в този случай, Английски и, да речем, испански език. Така че всъщност е много лесен за употреба инструмент. Можете да върнете назад и бързо напред много лесно с клавишни комбинации. Така че, ако искате да участват в този експеримент и думите ви видяни и прочетени от потенциално хиляди хора там, моля не се чувстват свободни да участват. Сега една дума за коте от понеделник, да не би да са изпратили прекалено страшно съобщение. Осъзнават, че като офис часа предполагат и секции показват, дизайн на курса е много, че са студенти, сътрудничество и говорим заедно да работят чрез проблемни и комплекти проблеми. И наистина линията слиза, отново, работата, която в крайна сметка трябва да представи своя собствена. И така, съвсем честно - в работно време, това е напълно нормално - това е напълно да се очаква, дори - да чатите с някои приятели до теб. Ако той или тя се бори с дадена тема, и вие сте като, ох, и нека ми да ви дам един поглед на някои ред от кода, че съм написал. Това е добре. Това се случва. И това е много благоприятна, мисля, че с процеса на обучение. Когато линията, отново, получава преминал е, когато главата е нещо наклонена над тук за твърде много секунди или минути за това наистина да има само деблокиране възможност за приятеля си. И разбира се, когато нещата се обменят по електронната поща Dropbox и подобни, също е на линия. Така че по всякакъв начин, да се чувстват комфортно и да се чувстват насърчени да чатите с приятели и съучениците за psets и др. И просто осъзнаваш, че това, което в крайна сметка представя наистина трябва да бъде продукт на вашето творчество, а не някой друг. Така че в същия дух на пухкави същества, може да имате знаете за този човек тук. Така че това е ужасяващо евтин филм от преди години. Всеки тук Spaceballs? Добре. Така добър брой. Така че това е чудесно академичен начин за въвеждане на днес в крайна сметка понятието на криптографията. И така, един на домейн специфични проблеми за pset 2, която ще влезе до късно утре вечер, е да се потопите в света на криптографията, която е изкуството на криптиране или кодиране на информацията. А това в крайна сметка се отнася до света на сигурността. Сега сигурност за най-много ни идва под формата на доста светски механизми. Всички от нас са потребителски имена и пароли. И всички от нас имат много лоши потребителски имена и пароли, най-вероятно. Ако паролата е една и съща на множество сайтове, които вероятно не е най-добрата идея, тъй като ние ще обсъдим към края на семестъра. Ако паролата ви е написано на лепкава бележка - не е шега - на вашия монитор, който също не е непременно най-добър дизайн, но доста често срещан явление. И ако не използвате криптография за криптиране на паролите си, те са особено уязвими. Така че, ако си мислиш, че е супер умен, като скрит Word документира някъде на вашия твърд диск, който разполага с всички ваши пароли, но това е в папка, която никой няма да погледне в, това също не е много защитен механизъм. И така, какво pset 2 ще въведе това е изкуството на криптографията и кодиране на информацията, така че неща като пароли всички по-сигурни. Така че, да се мотивират много реалния свят проблем с много реалния свят сценарий, позволете ми да ви запозная с една от любимите ни клипове от това филм, Spaceballs. [VIDEO PLAYBACK] Каска, демон, какво става? Какво правиш с дъщеря ми? Позволете ми да се въведе брилянтен млад пластичен хирург, д-р Филип Schlotkin, най-великият човек носа в целия Вселената и Бевърли Хилс. -Ваше Височество. Нос работа? Не разбирам. Тя вече е на носа. Това беше сладък 16 настоящето. -Не, не е това, което мисля. Това е много, много по-зле. Ако не ми дадеш комбинацията на щит въздух, д-р Schlotkin ще даде дъщеря си обратно стария си нос. -Не! Откъде взехте това? - Добре. Аз няма да кажа. Аз няма да кажа. - Не, татко, не. Не бива. Прав си, мила моя. Ще ми липсва новия си нос. Но аз няма да ги кажа комбинацията без значение какво. - Много добре. Д-р Schlotkin, направи най-лошия си. Ми удоволствие. -Не! Чакай, чакай. Аз няма да кажа. Аз няма да кажа. Знаех, че ще проработи. Добре, дай ми го. Тази комбинация е едно. -One. -One. -Две. -Две. -Две. -Три И три. И три. -Четири. -Четири. -Четири. -Five -Five. -Five. Така че комбинацията е едно, две, три, четири, пет. Това е най-тъпото комбинация, която някога съм чувал през живота си. Това е едно от нещата, идиот би имало върху багажа му. - Благодаря, Ваше Височество. - Какво си направил? Обърнах се на разстояние от стената. -Не, не си. Сте изключили целия филм. Трябва да съм натиснал грешен бутон. - Ами, той се връща. Поставете филма отново. - Да, сър. Да, сър. - Да вървим, Erna. Хайде, Гретхен. Разбира се, че знам, че все пак ще трябва да ви таксуваме за това. - Е, не работи? Къде е вратата? Той е работил, сър. Ние имаме комбинация. Велик. Сега можем да вземем всеки последен дъх на свеж въздух от планетата Druidia. Каква е комбинацията? Едно, две, три, четири, пет. Едно, две, три, четири, пет? - Да. - Това е невероятно. Имам същата комбинация на багажа ми. Подгответе Spaceball 1 за незабавното му напускане. - Да, сър. И промените комбинацията на моя багаж. - Ох! [END възпроизвеждане на видео] Дейвид Дж. Малан: Една прекрасна филм, който сега трябва да видите. Така че тук е, че в несигурни данни идва възможност да криптиране и да се катеря. И така, това, например, е пример за шифровано съобщение. Това всъщност казва нещо на английски. Но това очевидно не е напълно очевиден. И ще дойде пълен кръг днес, за да дразни, освен това, което тази тайна съобщение тук. Но в реалния свят на компютрите, нещата не дори изглеждат като те може да е английски фрази. Например, това е, което може да намерите на стандартен Linux или Mac или Unix компютъра в файл, който някога е бил едно време, наречен файла с паролите. В днешно време, са преместени на други места. Но ако погледнете на точното място на системата, ще видите не само си потребителско име или това на други хора в системата, но ще видите криптирана версия на своята парола. В действителност, думата криптата предполага, че следните неща е криптирана. И тази серия на пръв поглед случайни букви и знаци и цифри и т.н. могат да бъдат разшифровани само от обикновено знае някаква тайна - тайна дума, таен номер. И така, наистина, изкуството на криптографията в крайна сметка се свежда да се доверите на някои вид и знае нещо, че някой друг не. Ние ще разгледаме това в малко по-подробно днес и в pset да дойде. И сега е дума за Pass / Fail. Така че, особено, тъй като някои от вас са се гмурна в pset 1, уредът и много нов свят за себе си, осъзнах, че отчаянието и обърканост и само технически трудности да се очаква. Особено с първата pset, където има толкова много нови, само за да се познава ли CD и всички тези тайнствени команди в нова среда. И това е отделно от действителния материал и самото програмиране. Така че осъзнават също, че има определено работно време, които съществуват като структурата за подкрепа. Раздели започне идната неделя. Но най-важното е, ако се чувствате просто, че това не е света за вас, разберете, че това наистина не само да отнеме време. И не са за тази възможност преди години за мен като клас Pass / Fail, честно казано, никога не бих дори стъпвал в класната стая. И вие можете да промените това до, да речем, пети понеделник на курса. Така че, ако сте на ръба, да разбере, че по-скоро от главата в някои други води като цяло, разбира се помисли за смяна на Pass / Fail. Отново, не е наистина тази култура тук в Харвард на възприемане на нещата Pass / Fail, тъй като всички наистина иска да постигне или да преизпълни. Но честно казано, това е чудесен начин се опитва нещо, което може и да не да бъде запознат с теб. И вие ще се окажете прави в повечето случаи доста добре, може би много да ви изненада. И по-конкретно, какво мисля Pass / Fail обикновено не, особено след като може да са имали с pset 0, ако сте поставили в 10 часа, 15 часа, 25 часа в някои pset и ти си просто чука главата си в стената, и става супер късно през нощта, но сте взели pset като 90% от пътя, знаеш, че просто не мога да разбера едно нещо - Pass / Fail наистина е на ръба на класа като тази, където можете да сортирате щастливо се каже, добре, знам, че не е перфектен. Но съм работил задника ми по този въпрос. Аз съм доста щастлив, когато в крайна сметка той. И това ще отговори на очакванията на преминаване / отпадане. Така че имайте това предвид. Добре. Така че тези от вас, които се борят да се използва в Харвардския университет Wi-Fi знае че има CS50 SSID, Wi-Fi връзка наоколо, че може да има по-голям късмет. Това е малко иронично, че паролата за това - ако искате да опитате свързване с това за по-добри скорости и да споделите с нас, ако това не е по-добре - е едно, две, три, четири, пет, по целия път до до осем, защото осем е по-сигурно от пет. Така че, ако имате нужда от Wi-Fi парола, се свържете с CS50 безжично тук. Едно, две, три, четири, пет, шест, седем, осем. И мнения на CS50 Обсъждане ако все още имате периодични проблеми със свързаността, и ние ще правомощията, които се знаят за това пространство. Добре. Така бързо закачка, особено за тези от вас, които са вентилатор момчета или момичета на всички неща Apple. Това, което аз съм изкопал от преди няколко години, е този файл тук, ilock.c, само за да вид на по-конкретни и по-сложни някои от по-основна C програми, ние сме били за писане. Така че аз отвори този файл, ilock.c. Тя е на разположение на лекции страница за днес. От лявата страна, ще видите дълъг списък от функции. Така че човек, който е написал това пише много функции, повече от просто Основната. Той използва цял куп библиотеки тук. И ако започнем да превъртате през това всъщност е много първа, аз вярвам, пляскане за оригиналния iPhone. Когато искаш да Jailbreak оригиналния iPhone, което означава, развързвам от AT & T и действително инсталирате специален софтуер за него и да прави неща че Apple не исках хората да правят - добре, някой е взел време, за да разбера как точно могат да се възползват софтуерни недостатъци, грешки, грешки в софтуера на Apple. И така се роди ilock.c. Че ако го съставят на компютър и да го инсталира на iPhone, че е свързан към вашия компютър, да речем, чрез USB кабел, това ще ви даде административни или корен привилегии на вашия iPhone и да правиш почти каквото си искате. И така е имало тази завладяваща игра на котка и мишка между Apple и останалата част на света, по-специално, тъй като те, както и много компании се опитват да заключите нещата си така, че може да направи само с това, което те възнамеряват. Но благодарение на хора като този и тяхното разбиране на ниско ниво детайли и, в този случай, C програмиране и много от познатите конструкции че сме започнах да играя с, вие сте в състояние наистина да впрегнете хардуера по начин, който ти е удобно, а не непременно някакво юридическо лице. Така например, нямам представа какво е всичко това се прави. Но GetVersion звучи доста ясен. И това изглежда като това е функция, която този човек е написал. Някакво число като аргумент, не връща нищо, но се появява линия за цикъл тук, а ако състоянието, ако състояние, счупи, и по някакъв начин е свързан с номера на версията. Ако ние превъртете надолу - въпреки че много от тези ключови думи ще бъдат нови, и има куп функции тук никога не съм виждал и никога не може да видите над хода на семестъра - в края на деня, той следва същите правила и логика, че ние сме били играе с този момент. Така че това е твърде стар, за да се справи iPhone 3s или 4s или скоро 5s, тези дни, но знам, че всичко е много получени от този свят, че ние сме гмурна в. Така че нека да погледнем малко по-прост пример. Това, само за да се затопли с някои синтаксис, а също и някои други данни вид, че сме говорили, но не бях виждала в C. Така че това е файл, наречен positive1.c. И на коментарите на върха, това просто изисква потребителят осигури положително число. Така че това е пример за това направи по време на цикъл, което е хубаво за потребителя интерактивни програми, където трябва да съобщите на потребителя, за да се направи нещо. И ако те не си сътрудничат, викат ги или отхвърляне на тяхното въвеждане. Дело в точка, аз ще направя редове 19 до 24 толкова дълго, тъй като потребителят има не ми е дал положително число. Сега тази подробност тук по линия 18, защо Декларирам, N над цялата тази примка конструкция за разлика в непосредствена близост до ред 22, където всъщност се грижат да получите н? Да? [Недоловим] Дейвид Дж. Малан: Да, така че този въпрос за обхвата. И в срок общодостъпен, какво поле се отнасят? Да? [Недоловим] Дейвид Дж. Малан: Може ли да се говори малко по-силно? SPEAKER 1: Къде можете да получите достъп до дадена променлива. Дейвид Дж. Малан: Перфектно. Къде можете да получите достъп до дадена променлива. И общо правило този момент е, че обхватът на някои променлива се определя от най-новите фигурни скоби, които сте виждали. И така, в този случай, ако съм направил грешка за обявяване на N по линия 22, тази линия ще работи. Че ще получи едно цяло число, и аз бих го сложи в тази променлива N в ред 22. Но коя линия на кода би сега имат никаква представа за какво говоря? Така 25 и се оказва, 24, както и, тъй като в този случай, тя попада извън от фигурни скоби. Така че просто малко неудобство, но много лесно се решава просто чрез обявяване променливата извън самата функция. Сега ще видим по-късно днес, можете да отидете една стъпка по-нататък. И вие дори може да получите малко мързелив - и това не е да се препоръчва, като цяло - но бихте могли да получите дори мързеливи и сложи променлива в световен мащаб, така да се каже не, в рамките на функция, а не в рамките на една линия, но в самия файл, извън на всички функции, което сте написали, както направих аз тук по линия 15. Но това обикновено се гледат накриво. Но осъзнае, това е решение, понякога и до други проблеми, тъй като ние ще в крайна сметка видим. Така че за сега ще го оставя така. Но нека да видим дали можем да пренапише това само за да започне да изразява себе си малко по-различно. Така че тази програма, само за да бъде ясно, positive1. Нека вървим напред тук и в моя терминален прозорец positive1, Enter. Компилира, добре. Отивам да тече positive1, удари Въведете. Настоявам да ми даде положително число. Аз ще кажа -1. Това не работи. 0, 99, изглежда да работи. Може би не е най-строг тест. Но поне е хубаво проверка на здрав разум, че сме на прав път. Така че сега ме пусна напред и отворен версия две от този. И какво е различното? Той реализира едно и също нещо. Но какво скача като ясно различно този път? Да, така че това булев в зелено. Gedit подчерта в зелено тази ключова дума, известен като булев, което е тип данни. Той не идва построена през всички версии на C. Трябва да се включи специфична библиотека. В нашия случай, аз CS50 библиотека, така че ние имат достъп до булев. Но в ред 18, изглежда, имаме тук нарича булева стойност благодарен. Така че бих могъл да нарича това нещо. Но аз го нарече благодарен просто някак да предадат някои семантично значение. Така първоначално по линия 18, аз очевидно не съм благодарен, защото Булева стойност благодарен се инициализира с фалшиви в ред 18. И тогава той изглежда, какво съм направил тук в линии 21 до 23 съм просто вид пренаписана моята логика. Така че не е функционално. Но в ред 22 сега, да проверя дали вътр потребителят е е по-голяма от 0, тогава аз просто променете стойността на благодарни да е истина. И защо да го направя? Защото в линия 25, очевидно, аз отивам да се провери състояние. Направете тази линия, докато благодарен е фалшива. Така че аз предлагам това като алтернатива до версия едно, защото това е най-малко малко по-интуитивен, може би. Това е малко по-здраво стъпили на английски език. Така че, направете следното, докато не сте благодарни или докато благодарен е фалшива. И този път, аз очевидно не ми пука да се помни това, което потребителят въвели , защото известие, че няма променлива N. Така че, всъщност, аз - малко бяла лъжа. Функционално, програмата е малко по-различно, след като стигнем до дъното на , защото аз не съм спомни какво н е. Но аз исках да покажа, че въпреки че сме виждали GetInt и GetString на дясната страна на знака за равенство се използва този момент, така че ние си спомняме стойност, технически, това не е строго необходимо. Ако по някаква причина просто не ми пука да запишете стойността, вие просто искате За да проверите стойността, забележете, че можем просто да напиша тази GetInt отворен скоба, в близост скоба. Тази функция ще върне стойност, тъй като ние сме били казват. Това ще ви даде обратно вътр. И така, ако сте психически, че това да се случи, когато въвеждате в 99, GetInt връща броя 99. И така концептуално, това е като че ли ми код, всъщност това. Така че, ако 99 наистина е по-голяма от 0, тогава благодарен, се превръща в истина. Тогава линия 25 осъзнава, ох, ние сме направили, защото сега съм благодарен. И в ред 26, ние просто казват, благодари за положително число, каквото и да се случи да бъде. Сега нека направим леко синтактична захар, така да се каже. Да видим дали можем да се почисти тази линия 25 с този третия и последен вариацията positive3. Така че, забележете, че единствената разлика сега е ред на кода? Да, така 25. И ние не сме наистина виждал този трик, просто все още. Но ние направихме видите удивителен знак в понеделник, което означава какво? Така че, не или отрицание. Така че да булева стойност и флип стойността си. True става фалшива. False се превръща в истина. Така че това, че ще предложи, е дори малко по-интуитивен начин на писането на код, защото аз все още се инициализира благодарен невярно. Аз все още правя следното. Задам благодарни да е истина, когато му дойде времето. Но сега можете да наистина просто преведе този код устно ляво на дясно, докато не благодарен. , Защото гръм и трясък, или удивителен знак, означава понятието не, така че докато не е благодарен. Така че, отново не са въвели всички нови концепции сами по себе си. Говорили сме за Булев, когато играхме с устойчиво на надраскване. Но сега осъзнавам, че може просто да започнете да пишете код ни в много различни начини. Така че особено в pset1, ако сте се борят да разбера начин да напишете някоя програма, шансовете са, вие сте в късмет, защото там ще да бъде всеки броя на решения, които могат да се случат при. Например, това е само три за дори най-простите програми. Добре. И сега припомни в понеделник, ние напуснахме тази бележка с обратни стойности. Така за първи път, е написал програма, която не само има основен, тя също има своя собствена потребителска функция, че съм написал тук. Така че в линия 31 до 34, аз съм изпълняват функция куб. Това не е сложно. Това е просто пъти пъти, в този случай. Но това, което е важно за него е, че аз съм като вход под формата на Връщам продукция под формата на един пъти пъти на Така че сега имам възможност, подобно на мен с ФОРМАТ сам, за да наберете тази функция, като се обадите на куб функция. И куб функция отнема известно вход. И куб функция връща някакъв изход. И така, за разлика от това, ФОРМАТ току-що е направил нещо. Тя не връща нищо, че се грижи за - макар че, като настрана, тя не връща стойност. Просто обикновено го игнорирате. ФОРМАТ току-що е направил нещо. Това е страничен ефект от печат на екрана. За разлика от тук, ние имаме куб функция, която всъщност връща нещо. Така че това като цяло е за тези, които са запознати с това, че е доста ясна идея. Но за тези, които не са запознати с тази идея за преминаване през входа и да се назад изходи, нека се опитаме просто нещо супер проста. Има ли някой комфортно на сцената накратко? Вие трябва да се чувстват удобно с камера на вас, както и. Да. Добре, какво е вашето име? КЕН: Кен. Дейвид Дж. Малан: Кен. Добре, Кен. Хайде нагоре. Така че Кен ще бъде функция на видове тук. И да вървим напред и да направите това. Нека се получи малко фантазия. Приятно ми е да се запознаем. Добре дошли в центъра на сцената. Добре. Нека да натиснете този бутон. Добре. Така че тук имате модерна дъската. И това, което съм, е основната функция, например. И аз не разполагат с IPAD в ръката ми. Аз наистина не помня как - добре, всъщност, не може да се каже, че. Аз наистина не са добър почерк. И така, искам да отпечатате нещо на екрана за мен. Така че аз съм основната програма. И аз отивам да имате казват, че това го пише в моя пиле нулата и след предаването вход. Така че толкова глупаво, че това упражнение е, идеята на функциите и свикване на функция и връщане функция наистина се свежда до това. Майн. Аз току-що написани ФОРМАТ ("нещо") на екрана. Аз съм тази програма. И веднага след като ФОРМАТ получава нарича, той приема само един аргумент - или един параметър, понякога - между двойни кавички. Ето този аргумент. Аз съм го преминаване към Кен. Сега той е черна кутия, написана преди известен брой години, които очевидно знае само как да отпечатате неща на екрана. Така че, изпълни. Това не е лошо. Така че, много добре. Така че сега Кен се извършва изпълнение. Дали той трябва да ми подадеш нещо обратно? Така че, не, че сме виждали до този момент. Отново, всъщност ФОРМАТ се върне номера. Но ние ще пренебрегнем факта, че за сега, защото никога не съм го използвал. Така че това е за Кен. И така, сега главната се връща за изпълнение - Основната отново поема контрол на програмата, тъй като тази линия на код, ФОРМАТ, се извършва изпълнение. И ние за нашия начин изпълнение, независимо от другите линии има. Добре. Така че сега, нека се опитаме малко по-различен пример. И този път тук, нека първо да изчистите екрана тук. И този път, ние ще направим cubing функция. Но този път, аз очаквам изходната стойност. Така че нека да вървим напред и да направите това. Така че сега имам линия на кода, който казва х = куб (х). Така че всъщност let's - линията на код, изземване, изглежда така. х = куб (х). Е, как това ще работи? Така че нека да вървим напред и ще ви даде отново бял екран. И аз отивам да пиша сега за определяне на стойността на х, който в този момент в време се случва да бъде, нека кажем, два, да го прости. Така съм написал на парче хартия на стойност 2, което е моята ценностна х. Да го предаде на Кен. КЕН: И аз просто напишете отговор? Дейвид Дж. Малан: Да, нека просто да напишете отговор. Добре. И сега той има да ми връща нещо. Така че - съвършен. Ница Segue. Така че сега той ме ръцете обратно стойността на 8, в този случай. И какво да правя с него? Ами, всъщност, да видим. Вземи това право. Какво щях да правя с него? Сега отивам да се вземе тази стойност и всъщност се съхранява в тези същите бита в паметта. Но забележете, аз съм един вид се бори тук. Аз съм малко объркан, защото там, където мога да пишат на стойността на х? Защото това, което току-що направихте е физически страна Кен парче хартия , които са имали стойност 2, което е х. И наистина, това е точно това, което се случва. Така се оказва, че когато ти се обадя функция и преминават в спор като "Hello World" или давате аргумент като две, като цяло, вие сте преминаване в копие на това твърдение. И така, точно както съм написал номер 2 тук и я подаде на Кен, трябва означава, че все още имам копие някъде на стойност 2. Защото наистина, сега, че съм намерила на стойност 8, трябва да се върнем в RAM и действително напиши 8, където аз веднъж имах номер 2. Така визуално помни това идеята за преминаване в буквално копие от стойността. Кен си върши нещо, ми подава нещо - в този случай, стойност, като 8. И тогава аз трябва да направя нещо с тази стойност, ако искам да го пазя. Така че всичко това ще бъде твърде запознати преди време. Благодаря ви много за това демо тук, Кен. Добре. Много добре направено. Така че нека да видим как това в крайна сметка се отнася до някои от функцията призовава, че ние сме били прави тук. Така че нека да вървим напред и да ни върне на cubing пример тук. И забележите, че ако искаме действително да започнете да приемате това допълнително, ние ще трябва да бъдат съпричастни на факта, че броят X, който се предава в тук е различно от това, което всъщност се прехвърлят във функцията. Така че отново, приет от копие ще стане доста уместен само за миг. Така че нека да разгледаме нещо, което съвсем не работят точно, все още. Отивам да вървим напред и да се отвори трети пример бъги, което е опорочено от природата. И тя се нарича buggy3 и изпълнява смяна на функция. Така че тук имаме една основна функция, която е х и у произволно инициализира 1 и 2, съответно. Можем да използваме GetInt, но ние просто трябва едно просто упражнение. Така че е трудно кодирани като 1 и 2. В линии 21 и 22, ние очевидно отпечатате X и Y, по една на ред. След това, на ред 23, аз твърдя, че съм смяна на тези стойности, точка, точка, точка. Очевидно наричаме функция в линия 24, наречена суап че отнема два аргумента. Това е напълно легитимни функции, за да се вземат два аргумента. Виждали сме ФОРМАТ го направя вече. Така че суап очевидно отнема х и у. И както подсказва името му, аз се надявам, че ще Разменени тези две стойности. Значи аз твърдя, по линия 25, разменят. И аз препечатване на х и у, при допускането, че те наистина са били разменени. Но дали наистина стартирате тази програма - нека ми се отвори прозорец на терминала. Позволете ми да направя buggy3. Както подсказва името, това няма да свърши добре. Защото, когато натиснете Enter, ще забележите, че х е 1. г. е 2. И все пак в края на програмата, те са все още в действителност, един и същ. Така че на базата на демонстрацията точно сега с Кен, какво всъщност се случва? Ами, нека да се потопите в този суап функция. Това е супер кратко. Това е само на няколко реда код отдавна. Но това, което е основен проблем на базата на проста история, каза тук с Кен? Защо суап разбити? [Недоловим] Точно така. Така че ние сме съхраняване на копие, а не самата променлива. С други думи, суап очевидно отнема две аргументи, вътр. И това е произволно и б. И тук, аз съм приет през X и Y, които са съответно 1 и 2. Но аз не съм буквално минава в х. Аз не съм буквално минава в г.. Аз преминаване копие на х и копие на у. Това е като почти като че ли копират и поставят в размяна на стойностите, които искате действително да манипулира. Така че, ако това е така, когато аз, програмата, стартирайте изпълнение линия 35, след това 36 - когато съм се да линия 37, в този момент в историята, каква е стойността на? В този момент в историята, ред 37, каква е стойността на в този момент? Така че това трябва да бъде само едно. Нали? Тъй като X е приет като първи аргумент. И тази функция произволно се обажда първия си аргумент, а. По същия начин е г., втория аргумент. И това е просто произволно се обадите на второто б аргумент. Сега тази дихотомия всъщност е доста просто обяснено. Помислете за това. Никой от нас не съм срещал човек, който е написал ФОРМАТ. Така че, разбира се, той или тя няма представа какви са нашите променливи 30 години по-късно ще да се обади. Така че трябва да има разграничение между това, което наричаме променливи в функции пишеш и това, което наричаме променливи във функции, ти си се обадите или да използвате. С други думи, аз написах моите променливи х и у. Но ако някой друг е написал суап функция, той или тя със сигурност не знам какво ми променливи ще се нарича. Така се осъзнае, че това е причината имате тази двойственост на имената. Технически погледнато, бих могъл да направя това по стечение на обстоятелствата. Но те все още ще бъде приет като копия. Тя просто ще бъде чиста случайност, естетически, ако този човек, който пише суап са използвали едни и същи имена. Добре. Така че в този момент в историята, линия 37, е 1. б е 2. А сега да продължа да ги разменят. Ами на първо място, позволете ми да всъщност правят това много по-просто. Аз не знам какво правеха тези три реда код. Нека само да направите това. б получава. А получава б. Готово. Защо това е счупено, логично? Това е един вид на интуитивен нещо, нали? Така че става б. И б става. Но проблемът е, че веднага след като линия 37 изпълнява, какво е стойността на А и Б? Същото, 1. Защото сте съсипани, така да се каже, сте променили, за да са равни на. Така че след като линия 37 се изпълняват, това е страхотно. Сега имате две копия на номер 1 вътрешността на тази функция. Така че тогава, когато вие казвате на ред 38, получава б, добре, ти си вид прецакани. Защото вие сте просто възлагане 1 към 1. Ти загуби стойността, която се грижи за. Така че в оригиналната версия на това, обърнете внимание на това, което направих. Вместо това е трета линия на кода, който изглеждаше така. Декларирам, временна променлива - ПТУ е много често срещано име за временна променлива. Това е едно цяло число, защото трябва да съответства на това, което искам да направя копие на. Съхранява копие от вътрешността на малки. Така че след като линия 37 е изпълнена, стойността на е - бърз здрав разум - 1. Стойността на б е 2. И стойността на ПТУ е също 1. Така че сега изпълнявам линия 38. Така че след като линия 38 изпълнява, поема стойността на б. И Б е 2. Така че сега е 2. Така че в този момент в историята, е 2, б е 2, и ПТУ е 1. Така че сега логично, можем стойност просто плясване ПТУ в б. И сме готови. Така че ние сме решени този проблем. За съжаление, когато стартирате тази програма в тази форма, не всъщност суап произволни стойности. Но за да бъде ясно, защо? Определя логически проблем само преди миг. Но отново, ако стартирате тази програма, х и у остават непроменени до края на изпълнение на програмата. [Недоловим] Дейвид Дж. Малан: Така че ние нищо не са се върнали. Така че това е вярно. Но се оказва, че е малко проблем, защото до този момент, Единственото нещо, което ние сме били в състояние да се върне, е едно нещо. И това е ограничаване на C. наистина може да връща само една стойност, в този случай, аз съм вид остана тук , защото мога да се върна на новата стойност на х или мога да се върна новата стойност на у. Но аз искам двете обратно. Така че завръщането не е просто решение тук. Но проблемът фундаментално е защо? Какво всъщност разменят? "а" и б. Но и б са копия на X и Y, което означава, че ние просто всичко това работи - ние просто похарчени като три минути говорим за суапа функция и три от тези променливи. И това е страхотно, изрядно в изолация. Но и обхвата б е само тук в тези редове. Така че просто като за цикъла, ако Вие декларирате цяло число и вътре за контур - по същия начин, ако сте обявяване и б вътрешността на функция, която , което сте написали, те са валидни само вътрешността на тази функция. Което означава, че веднага след като суап се извършва изпълнение и отиваме от линия 24 до линия 25, х и у не са се променили изобщо. Вие просто губи много време за смяна на копия на променливите. Така се оказва, че решение за това е не-очевиден. Това не е съвсем достатъчно, за да се връщат стойности, защото ние можем да връща само една стойност. И аз наистина искате да сменяте х и у в същото време. Така че ние ще се върне към това. Но за сега, да разбере, че въпросът фундаментално произтича от факта, че А и Б са копия. И те са в техния обхват. Е, нека се опитаме да решим това по някакъв начин. Нека превъртете върна тук и да се отворят, да речем, 1/4 вариант на това, buggy4. А какво ще кажете за това? Това е подобен, но по-прост проблем да погледнете преди да предприемем хладно оръжие в решаването му. Тази програма се нарича стъпка. И това очевидно инициализира цяло число х 1 линия 18. След това твърдят, х е 1. Тогава претенция увеличаване, точка, точка, точка. След това се обадете стъпка. Но след това в линии 22 и 23, аз твърдя, че е бил увеличен. Твърдят, х е сега каквото и да е то, 2 вероятно. Но тази програма е бъгав. Какъв е проблемът? Да? [Недоловим] Дейвид Дж. Малан: Точно така. Така че X е обявена очевидно по линия 18. Това е вътре основни фигурни скоби. Така че просто Отговорът е, че е добре, х съществува тук. Тя не съществува в ред 32. Така че тази програма всъщност дори няма да се компилира. Компилаторът, когато се опитвам съставянето на този код, ще крещи по мен за някои недекларирания идентификатор или нещо в този смисъл. Всъщност, нека опитаме. Това е да buggy4. Това е то. Използване на недекларирания идентификатор х по линия 32. И действително, да бъде по-ясен тук днес, така че това е полезно в работно време и у дома. Забележете, че това е малко загадъчно писмено. Но фактът, че звъня ни извика, казвайки: buggy4.c: 32:5, е действително полезно. Това означава, че грешката е на линия 32 в позиция на символа пет. Така един, два, три, четири, пет. Това е, всъщност, къде е проблема. И също така да се има предвид в работно време и у дома, аз съм щастлив тук. Имам една грешка. Това ще бъде относително лесно да се определи. Но ако можете да получите на целия екран, пълен с огромното съобщения за грешки, отново, осъзнават, че на долния може да бъде само симптом на най-горните. Така че винаги преследват определени грешки от горе на долу. Защото може да бъде само един Дейзи верига ефект, който се предлагаш има начин повече проблеми, отколкото сте в действителност. И така, как бихме могли да поправя това, ако целта ми е да увеличите х? Какво е това? Добре. Така че ние можем да направим х глобален. Нека да контекстното че предупредих по-рано. Но, по дяволите, ние просто се нуждаят от бързо решение. Така че нека просто кажем, INT х тук. Това прави х глобален. Така че сега основната има достъп до него. И нарастване има достъп до него. И така, нека вървим напред и да се съставят сега. Направете buggy4 Enter. Изглежда да съставят сега. Да тичам buggy4, и изглежда, действително работят. Сега това е едно от тези неща - прави каквото ти казвам, а не както аз правя, както току-що направено тук. Защото като цяло, нашите програми ще получите много по-интересно и много по-дълго от това. И ако решението на житейските проблеми е само ах, поставете всичко променливи в началото на файла, много бързо програми се ужасяващо трудно да се управлява. Той получава по-трудно да се измислят нови имена на променливи. Той получава по-трудно да се разбере какво променлива какво прави. И така, по принцип, това не е добро решение. Така че нека да направим това по-добре. Ние не искаме тук да се използва глобалната променлива. Аз искам да увеличите х. Така че бих могъл очевидно - в края на деня, това е вид на глупава история, защото ние просто направи това. Но ако не знаете за този оператор, или не е било позволено да промяна в основната себе си, как иначе бих могъл да приложи Кен тук, това време да не куб, но за да увеличите? Как мога да променя това нещо тук? Да. [Недоловим] Дейвид Дж. Малан: Добре, добре. Така че, защо да не мога да премине в х? И тогава, вместо да го върне, защо не аз просто се връщат х + 1? Сега, още няколко неща трябва да се промени тук. Аз съм на прав път. Какво друго трябва да ощипвам? Някой друг. Да? [Недоловим] Дейвид Дж. Малан: Трябва да се промени типът на връщане на нарастване , защото не е невалидни. Void означава нищо не се връщат. Ясно е обаче, сега. Така че това трябва да се промени INT да бъдат в съответствие с каквото Аз съм в действителност да се върне. Сега все още е бъгав нещо друго тук. Да? [Недоловим] Дейвид Дж. Малан: Така че аз трябва да увеличите х? [Недоловим] Дейвид Дж. Малан: А, така че трябва да премине х. Така че аз трябва да направя това тук. Така че прототип, аз трябва да се промени тук. Така че това трябва да стане вътр. Това трябва да стане - Хмм. Аз всъщност имат бъг тук. Да се ​​определи това първо. Какво трябва действително да бъде? Така че това трябва да бъде INT нещо. Тя може да бъде. Но честно казано, ако започнете да призовава всички променливи х, е ще се получи по-малко и по-малко ясно е кой. Така че нека просто произволно изберете различна конвенция за именуване за моя помощни функции, функциите пиша. Ние ще го наречем. Или можем да го наричаме - нека го наречем even_number да бъде още по-категоричен. Значи аз трябва да се върне, независимо от броя е един плюс. И сега аз трябва да се промени нещо друго тук, и един Другото нещо тук. Какво трябва да се промени по линия 21, първо? Аз трябва да го възложи на х. Така че не може просто да се обадя в растежа х. Трябва да се помни, отговорът от промяна на стойността на х лявата страна. И макар х сега е на ляво и дясно, че е напълно добре, тъй като дясната страна ще се изпълни първият, после го пльосна в ляво ръка нещо, х в този случай. И тогава на последно място, това е лесен корекция. Това просто трябва да съответства на това, което е по-долу. Int номер. Добре. Така цял куп промени за наистина глупаво функция. Но представител на неща, които ние все повече ще искат да направят. Така че се buggy4. Съм прецакани някъде. О, Боже мой. Пет грешки в, като, шест-лайн програма. Така че, какво не е наред по линия 18, характер 5? Добре. Така че аз трябва да декларира това вътр. Добре. Така че нека да видим, цял куп други грешки. О, Боже мой. 19, 18, 21. Но отново, нека просто да изчистите екрана - Контрол L - и изпълнете отново звъня. Така пет проблеми е всъщност само, че един. Така че нека сега тече buggy4 Enter. Whew. X е увеличен правилно. Добре. Всякакви въпроси за това как да увеличите номера? Да? SPEAKER 2: Защо е, че можете просто да промените х към номер в променливата име и то ще знаеш какво да кажеш? Дейвид Дж. Малан: Добър въпрос. Как е, че мога да променя х към номер и програмата ще знаят веднага? Така че, отново, мисля за него, тъй като това абстракция. Така че, ако аз съм основен и Кен е постепенно, честно казано, аз не ми пука Кен призовава IPAD си. Не ме интересува това, което той нарича нещо, което трябва да се направи с неговото прилагане на тази функционалност. Така че това е изпълнение подробно, че аз, основен, не трябва да се грижи за. И така просто да го променя последователно в рамките на функцията, брой тук и броя тук, е всичко необходимо, за толкова дълго, колкото мога компилирате. Това е нещо като, ако мислите за много от нас, тези от вас с водача лицензи, които съм карал, или ако сте дори и возене в кола - повечето от нас нямат представа как колата работи под капака. И буквално, ако отворите капака, повечето от нас - включително и аз - не са наистина знаят какво търсим. Нещо като с неща като това право може да се чувстват сега. Но ние наистина не трябва да се интересува как работи колата. Ние не трябва да се интересува какво всички пръчки и бутала и кабели вътре в колата всъщност прави. Значи нещо като това, което наричаме буталото няма значение тук, в този случай. Същата идея. Да? [Недоловим] Дейвид Дж. Малан: Ако имаше повече употреби на променливата момент XA преди , програмист, ще трябва да ги сменим навсякъде. Или пък може буквално файлове, Меню, и след това търсене / замяна, нещо подобно. Но ти ще трябва да се направят тези промени себе си. Трябва да бъде последователна. [Недоловим] Дейвид Дж. Малан дадена поръчка като тук? Ако това е INT друг номер? Да. Така че за значение, когато се обаждате на функция. Така че, ако се обаждаха увеличение с нещо, нещо запетая, Има пряка картографиране. Първата променлива, каквото и да се нарича, е направено копие на първия аргумент тук. За съжаление, това не трябва да бъде скоби. Втори ред аргумент с втората. Така че, за, да, има значение. Добре. Съжалявам, че дълъг път, за да стигнем до там. Други въпроси? Добре. Така че нека да видим дали не можем да нарисува картина на това, което всъщност се случва тук под капака, така да се каже. Така че това е правоъгълник, които биха могли да представляват паметта на компютъра ви. Така че, дори ако вие нямате представа как паметта работи или как RAM работи, най-малко приемем, че имате букети от тези дни. Имаш мегабайта. Имаш гигабайта. И ние знаем от седмици нула, че един байт е точно това? 8 бита. Надясно, така че осем нули и единици. Така че, ако компютърът ви има концерт на RAM, два гигабайта RAM тези дни, може да има млрд. или 2 млрд. байта памет, или около 8 млрд. евро или 16 милиарда бита, вътрешността на вашия компютър. Сега, за разлика от малко мериносова пример Уили, това не е магнитни частици обикновено вече. Все по-често при лаптопите, най-малко, твърди дискове, SSD, че просто нямат движещи се части. Всичко е електронен. Всичко е на базата на електроенергия. Така че мисля, че на този правоъгълник само като представляващи едно или две гигабайта памет, която имате. Така че това е парче от паметта. Сега в света на компютърната наука има вид разделени парчета памет, за да правя различни неща. Така например, ако това е - както бе предложено от вашия компютър RAM правоъгълник - Оказва се, че по силата на споразумение, в горната част на вашия RAM, така че да се каже, по принцип е това, което се нарича текстов сегмент. Това са нули и единици, които са събрани. Така че, когато сме погледна под капака какво е a.out, всички нули и единици - когато стартирате програмата, тези нули и единици се зареждат от твърдия ви устройството в нещо, което се нарича RAM. И в RAM, те са поставени в горната част. Сега, междувременно имате други неща. Инициализирани данни, неинициализирани данни. Тези две откоси на паметта се отнасят до глобалните променливи, които не често използвате. Но понякога, ако го направите, те в крайна сметка там, както добре. След това има някои други неща. Околна среда променливи, които ние няма да прекарват много време на Но след две важни неща, които ще се върнат през този семестър, стек и стек. Така че по-голямата част от паметта на компютъра ви е запазено, когато се изпълнява програма за нещо, наречено стека и нещо, наречено на куп. И ние не отиваме да се говори за куп днес, но ще говорим за стека. И стека има за цел да апелирам към визуалната като трапезарията брашно тави в Mather House, или където и да се случи да бъде, където столова персонал, който ги чисти всеки ден. Те ги стека от пода нагоре. И по същия начин в паметта, това е идеята за въвеждането на нещо на стека, поставяйки нещо на комин, поставяйки нещо на комин. И това, което искаме да кажем с това? Ами, нека да я увеличите само долната половина на тази снимка, на вашия компютър RAM, да предложи следното. Оказва се, че когато стартирате програма като a.out или здравей, независимо програмата е, че сте написали, отново, тези нули и единици са заредени от вашия твърд диск, което е дългосрочно съхранение, остава там, дори когато дръпнете куплунга - заредена в RAM. RAM е по-бързо от твърдите дискове. Това е по-малък от твърди дискове. Но това е мястото, където програмите живеят, докато сте ги да работят. Така че два пъти върху програма за Mac или PC - тя се зарежда от твърдия диск в RAM. Веднага след като е заредена в RAM, нули и единици в начина, по който горната, т. нар. сегмент на текст. Но след това, веднага след като вашата програма действително започва работи, главния функция се нарича. И основни, както видяхме, често има локални променливи. И тя има цели числа и струнни инструменти и символа и други подобни. Така че, ако вашата програма, която сте написали или програма, която имате двойно щракване, използва някои променливи вътре в основната, те до края на дъното на стека на паметта, така да се каже. Сега по-конкретно, какво означава това всъщност означава? Това просто означава, че ако щяхме да броим нещата - ако щяхме да брой байтове на RAM в компютъра ви, забележете, че това може да бъде байт нула номер. Това може да бъде байт номер едно, две, три, четири, пет, шест, всички начина, по който да се харесва - 2 млрд. ще бъде по целия път до там горе на върха. С други думи, когато говорим за RAM или памет по отношение на байта, просто означава, че някой е решил какво да броим всяка от тези блокове памет. Така че, когато имате нужда от 32 бита за едно цяло число, или имате нужда от 8 бита за Чар, където те се озовават в памет? Е концептуално, те просто се окажете в долната част на тази нещо, наречено стека. Но това, което е интересно сега е, когато основната нарича функция. Да предположим, функция, наречена Foo, просто произволно име. Какво се случва, е основният е в дъното на тази стека на паметта. Foo сега е на върха на основната памет. Така всички локални променливи, които Foo до края вид концептуално-горе тези в основната. Ако Foo призовава друга функция, наречена бар, тези променливи, които в крайна сметка тук. Ако бар нарича нещо друго, тук, тук, тук. Така че това, което е интересно за изпълнение на програмата е, че като ти се обадя функции, и тези функции извикване на функции, и тези функции извикване на функции, да изградят тази стека на функциите в паметта. И само веднъж функция се връща да започнете, че паметта. Така един от най-лесните начини да се изчерпят на паметта в компютърна програма е да се Напишете функции, които никога не се връщат. Така например, нека да докаже, че с умишлено лоша програма. Позволете ми да отида напред и # включват , INT главната (нищожна). И аз ще направя, докато (2> 1), които вероятно никога няма да промяна на нас. И нека ми давай сега и ФОРМАТ. Всъщност, това ще бъде по-малко визуално интересно. Нека го направим. За INT (I = 0;> 0). Нека да направим тази грешка, аз + +. И нека не ФОРМАТ тук. Нека практикува това, което проповядва. Нека имаме метод тук. Void хор, и ние ще кажем вътр аз. И тогава аз ще кажа, ФОРМАТ О, нека да направи това по-интересно. Нека всъщност не печатате каквото и да било. Нека направим това. Припев: (I). Добре. Така че това е бъгав, защото защо? Правя това като отида, защото програмата не се прави нищо на интереси. Но това не е целта. Целта е да се напише програма, чиято основна функция какво прави, очевидно? Обадете себе си. И всъщност, ние не се нуждаят от цикъла. Нека дори да се опрости тази процедура просто така, че да не губим от поглед наистина основен бъг. Основни разговори хор да пее някои хор. След това направих нещо глупаво, и аз трябваше хор хор разговор, защото предположих, някой друг ще може да го изпълни. А сега и това няма да се съставят още. Имам нужда да правя това? Имам нужда от прототип, не забравяйте. Така че аз трябва да има тук невалидни хор (INT); Така че сега, ако отида тук всъщност, нека да използваме по-голям прозорец. Да вървим напред и да хор. Да вървим напред и да хор. Използване на неидентифицирани и декларатора. О, това беше глупаво. Ние не се нуждаем аргумент. Нека направим това. Иска ми се да бяхме започнали по този начин. Щеше да е много по-лесна програма, за да пиша. Така че има. Сега нека преминем към терминален прозорец, повторно звъня. И тук отиваме. Това беше много по-бързо. Какво всъщност се случи, нали? Е, сега ще добавя линията за печат, така че можем да видим. Така че позволете ми да кажа ФОРМАТ, да речем, аз съм тук. Добре, няма променливи, ние ще го оставя така. Нека ме пуснете отново направи. Нека повторно хор. И хайде. Продължавай. Като настрана, защо не го разби? Сегментацията е случила аномалията супер бързо преди. [Недоловим] Дейвид Дж. Малан: Точно така. Така че това отнема време, за да отпечатате. Той просто отнема повече работа от страна на компютъра. И то е там. Сегментация вина. Така че забележите колко бързо програми се изпълняват. Ако не сте отпечатване на нещо, супер бързо. Но ние все още имам тази сегментация вина, защото това, което се случва? Е, ако мислите за как е изложена на паметта на вашия компютър, се случва да бъде основната. Но тук - нека просто да наричаме този хор, и нека го наречем този хор. И сега, ако ми естетика, това е просто ще кажа хор, хор, хор, хор, хор, хор, хор, реклама nauseum. И в крайна сметка, какво ще се случи? Ако голямата картина буквално е това, какво точно се случва концептуално? Стека превишаване на куп. Или по-лошо, просто превишили всичко, включително и текста сегмент, който е нули и единици, които представляват вашата програма. Накратко, това е просто супер, супер зле. Нали? Вашата програма е спирала извън контрол. Вие използвате начин повече памет, отколкото сте възнамерявали всичко това заради един глупав грешка, в този случай. Или в този случай, много съзнателно направено функция се обажда. Сега това не е чак толкова лошо. Функции, които се наричат ​​всъщност има голяма сила , когато го използвате правилно. Не съм го използват правилно. Така че това не е никак зле. Но фактът, че всъщност никога не съм себе си призовава е основен слабост на тази програма. И така, къде отиваме с всичко това? Е, какво наистина се случва? Когато аз наричам увеличение функция, както се прави в тези примери, Имам стойност, като 1, че минавам инча Минавам с копие на номер едно. Така се случва следното. Така че нека да отидем в добавката за пример. И този човек точно тук. Ето какво всъщност се случва. Когато се обадих на показване, и минавам с X, картинки какво е става тук е това - ако имам стойността на 1 съхраняват тук, и аз действително се наричат ​​увеличение, което сега се нарича хор - Да, това ме хвърли тук. Така че нека наречем това увеличение. И ние не знаем какво ще бъде следващия функция. Така че, това, което всъщност се случва, е някъде тук в основната, имам парче паметта, която е съхраняване на номер 1. Когато аз наричам увеличение, аз съм с помощта друго парче на паметта, но сега имат копие от 1. Когато увеличите тази стойност, това става 2 - ужасно написано на екрана. Но след това, какво ще се случи веднага след като се връща на прираста? Тази памет получава върна на операционната система, което означава, сте направили нищо полезно. Този, който първоначално е бил, съдържаща се в основната всъщност все още е там. И така, къде отиваме с това? Е, оказва се, че в паметта имате успоредно поредица от байтове, които можете да сложите нещата инча И се оказва, че вече сме виждали нещо, което се извършва чрез вмъкване нещата назад, за да гръб до гръб. Какво е низ, въз основа на една седмица и сега две седмици? Така че това е просто сбор от знаци. Така се оказва, точно както можете да поставите номера в паметта, по същия начин можете да символи в паметта. И след като ние започне въвеждането на героите в памет обратно към гръб до гръб назад, се оказва, че използването на най-простите неща, като за линия или цикъл, докато можем да превъртите - от ляво на дясно през знаците в стринга - и започнете да ги масажирате напълно различни герои. А може да се превърне Б. може да се превърне C. Така че в крайна сметка, ние можем да се Английски изречение, което всъщност има смисъл и конвертирате всяка една от тези буквите една по една, като се разхождах из паметта на нашия компютър, наляво, за да право да криптирате. Така че нека да ни пет минути почивка тук, и когато се върнем, ние ще започне този процес на кодиране на информация. Добре. Така че, преди да се потопите в някои крипто и тези неща, наречени масиви, позволете ми да пауза за всякакви въпроси, защото имам чувството, че наистина вид на объркана някои от тези теми. Така че нека да се определи сега, ако можем. Така че ние просто говорихме за връщане стойности. Ние говорихме за аргументи. И ние говорихме за това понятие, които ще се върнат в следващите седмици да дойде, за гледане на памет като един куп от тези чипове тави, така да се каже. От дъното нагоре, така че всяка тава, която получава на стека, представлява функция, която в момента се нарича. Някакви въпроси? Така че, какво ще кажеш - нека се опитам да питам един въпрос. Държа да развалят това, но сега it's - you've виждал лицето на момчето. Така че ние ще се върнем към това. Така че нека да зададете въпрос тук. Позволете ми да се опрости тази процедура обратно на това, което е било преди някои от по-рано Q & A. А фактът, че увеличение има отворени скоби, вътр номер, затворен скоба. Какво INT брой? [Недоловим] Дейвид Дж. Малан: аргумент. Добре, но това, което е аргумент? [Недоловим] Дейвид Дж. Малан: Съжалявам, какво е това? SPEAKER 3: Нещо, което преминават инча Дейвид Дж. Малан: Добре. Така че нещо, което се преминава. И по-общо, това е само на входа. Ако сте написването на функция и тази функция цел в живота е да се направи нещо малко по-различно всеки път, когато го използвате, то единственият начин за това да се случи наистина ще изглежда да е да му предостави вход, така че да може да направи нещо различно с този вход всеки път. Така че трябва да се определят две неща, когато функцията входа. Трябва да укажете името, което искате да се даде на този вход, само за собствения си удобство, така че можете да се обърнете към него във функцията, която себе си пишете, както направих аз тук в ред 32. Но вие също трябва да определите типа, тъй като C е език за програмиране че просто изисква че ако искате променлива, трябва да се каже на компютъра какво тип данни е в голямата си част, така че тя знае колко бита да разпредели за тази променлива. Защото тя може да бъде шест Съжалявам, че няма да бъде шест. Тя може да бъде 16. Тя може да бъде 8. Тя може да бъде 32, дори 64. Но компютърът трябва да знае. Сега вътр от лявата страна представлява това, което, за разлика от? [Недоловим] Дейвид Дж. Малан: Какво е това? [Недоловим] Дейвид Дж. Малан: тип на функцията и, по-специално, вид на продукцията си. Точно така. Така че, като има предвид, че нещо в скоби представлява вход, ако има такива, нещо наляво представлява продукцията си. И в този случай, нарастване очевидно връща Int. И така число е типът на връщане на тази функция. Какво означава да се върнеш? Буквално, можете да използвате дума за връщане. И тогава, ако това, което се връщат към правото на ключовата дума е цяло число, това наистина е в съответствие с това, което сме обещали. Вие не може да направи нещо подобно - Здравей, свят - защото това е низ. Очевидно не е цяло число. Така че по-кратко, тежестта наистина е върху нас, програмист, специфични, тъй като на това, което ние сме връщане и след това да отида за да го върне. И след това да се направи по-ясно Тад контекста ето го отново. Контекстът - голяма изненада идва само за миг. Контекстът тук сега е, че паметта на компютъра ви е, отново, гигабайт, два гигабайта, независимо. Може би това е повече. Може би това е по-малко. Но компютърът го вижда като различни раздели. Нещо се там. Нещо друго, което отива нагоре. Различни неща, отива в средата. И днес, ние просто започне да разказва тази история. Но ние ще се върнем на това с течение на времето. За сега, само част от паметта ми пука за текста сегмент защото това просто представлява нули и единици че звъня изход. Така че, когато стартирате команда на клавиатурата като a.out, или два пъти щракнете върху иконата на Mac OS или Windows, програмата ви е зареден от вашия твърд шофиране в RAM. И това е цопнала в горната част на RAM на вашия компютър, така да се каже. Сега междувременно, тъй като вашата програма започва да тече и основната получава нарича в програма, която пише или програма Microsoft или Apple пише, никоя от нейните локални променливи в крайна сметка там в дъното на паметта на вашия компютър. Но ако основната нарича друга функция, която се има променливи или аргументи, те в крайна сметка над нея. И ако тази функция изисква нещо, те в крайна сметка над нея, над него, над него. И само веднъж функция се извършва изпълнение прави стека на плочки, така че да се каже, започват да се получи по-ниски и по-ниски. И това е, което, накратко, обяснява защо, когато ти се обадя куб - или ти се обадя увеличение - ти преминава в копие на стойността. И какво това означава, че картинката е, че сте буквално писмено номер 1 в друга част от паметта, промяна, че 1 или 2, в случай на нарастване - или 8, в случай на куб и след това хвърляне, че паметта веднага след като печалбата или куба функцията връща. Въпрос. [Недоловим] Дейвид Дж. Малан: Къде - глобални променливи се съхраняват в това, което е в момента инициализирани данни или неинициализирани данни. Разликата е, ако имате глобална променлива, и ти го зададете незабавно стойност със знака за равенство, то завършва на върха там. А ако просто казват INT х точка и запетая без стойност, то завършва леко по-ниска в RAM просто конвенция. Други въпроси. Добре. Така че тази картина ще се върне като вземем по-мощен с какво можем да направим с компютъра. Но за сега, нека да има кратко интро към криптография, специфичен вид на криптография, това не решава всички проблеми на света, но не решава някои от тях. В този случай, ние имаме нещо, наречено таен ключ, криптография. И таен ключ, криптография, както подсказва и името, получава своята сигурност от една тайна. Така например, ако сте в началното училище и сте преминаване на малка тайна любовно писмо на момче или момиче, което смачкване - ако сте искаше да премине през публиката, най-вероятно не би могъл да напише такава забележка на английски или каквато и да е на родния си език, а по-скоро, може да го криптиране. Или пък може просто да ги изпратите текстово съобщение тези дни. Но всъщност може да ги предаде бележка в рамките на класната стая. И да направите това по безопасен начин, по такъв начин, че вашите приятели и учители не знам какво пишеш, може да излезе с доста проста алгоритъм - млад, въпреки че може да бъде - просто да катеря думи. Така че вместо да пишете A, може да напишете Б. Вместо B, можете да напишете C. Вместо C, може да напишете D, и така нататък. Или пък може да излезе с по-сложен превод на писма за различни букви. Но уловът е момче или момиче, на когото сте изпращане на тази бележка трябва да знаеш нещо. Кое е това, което, разбира се? Например, каква е вашата тайна. Подобно на това, което е че съответствието между и БДС и Cs и DS? Е просто добавяне на една, така да се каже, на всяка една от буквите, да се премине от А до точка Б, B C? Е по-сложно от това? Така че вие ​​и вашият смаже трябва да имат тази тайна информация. Но има вид на улова-22 тук. Ако това е първият път сте изпращане на писмо чрез тази любов клас, как е, че момче или момиче трябва да знае каква е тайната дори е? Така таен ключ крипто не решава всички проблеми на света. И всъщност има една връзка, която ще се върне към семестър в края. По същия начин, никой от нас вероятно някога изпрати по същия начин, не повечето от нас знаят някой, който работи, например, в Amazon.com. И все пак, много от нас вероятно купих неща в Amazon.com. И ние сме били научени да се предположи, че те електронна търговия сделки са сигурни. Нали? URL вероятно се казва HTTPS. Има може би глупав малка икона на катинар някъде. Има някакъв вид криптография осигуряване на информацията за кредитната ви карта между вас и Amazon.com. И все пак, ако криптография включва знае някаква тайна, и все пак аз не познавам никого в Amazon, и аз със сигурност не сте подредили всякакъв вид тайна с някой в ​​Amazon, как е компютърът ми или браузъра си правиш това? Е, оказва, че има и други видове криптография общо, които решават този проблем. Но днес, ние ще се съсредоточим върху проста, където можете да подредите в предварително да се знае някаква тайна, като плюс 1 или някои съответствието между Както и БДС. И процеса на криптографията обикновено включва това. Вие имате някакъв обикновен текст, изобразен тук в ляво. Можете да го стартирате чрез някакъв алгоритъм или процедура за криптиране. Може би това е просто става B, B става C. И тогава ще се окажете с шифър текст. Междувременно, след свалката си получи тайната бележка, той или тя трябва да след това го дешифрирате като цяло заден алгоритъм, така че да се получи подкрепи обикновен текст. Сега има физически превъплъщения на това. Например, това е една малка тайна пръстен декодер. И това е пръстен, в смисъл, че има два циферблата. На извън периферията на това нещо, има букви от А до Я, въпреки че те са в произволен ред. И от вътрешната страна, всъщност има някои числа, например, че с този пръстен, можете да вид се превръщат отвън, но не и вътре, за да се подредят номера с букви. И в клипа, който сте на път да се види - някои от които може да сте видели 24/7 около коледните празници от един филм, наречен A Story Коледа. Ще видите, че малко Ралфи е толкова нетърпелив да разбера какво малко сираче Тайно послание Ани беше с него, които са били съобщени, мисля, че в под формата на числови съобщения на сериен кутия. И трябваше да се натрупват всички малки карти, които дойдоха в кутия от зърнени култури. Трябваше да ги изпратим. Трябваше да се върна тайната пръстен декодер, така че да може най-накрая да разбера какво картографиране е между букви и цифри, или писма и писма. Така че аз ви даде този кратък клип от Коледна Приказка да мотивира pset 2 и нашата дискусия, в един момент, на масиви. Така че тук имаме Ралфи. [VIDEO PLAYBACK] Бъде известно на всички и разни, че Ралф Паркър се назначава член на Little Orphan Annie Secret Circle и има право на всички почести и ползите, възникнали в него. Подписано, Little Orphan Annie. Приподписан, Пиер Андре! Мастило! Почести и ползите, които вече са на възраст от девет. Хайде, нека да се заемем с това. Нямам нужда от всичко, което джаз за контрабандисти и пирати. Слушайте утре вечер за сключване приключение на The Black Пиратски кораб. Сега е време за тайното послание на Ани за вас членове на Secret Circle. Не забравяйте, че децата, само членовете на Secret Circle Ани може да декодира Тайна Ани съобщение. Не забравяйте, че Ани се разчита на вас. Задайте вашите изводи към B2. Това е посланието. 12, 11 - -Аз съм в първи моята тайна среща. -14, 11, 18, 16 - -Пиер беше по-силен глас тази вечер. Съобщение тази вечер мога да кажа, че е наистина важно. -3, 25. Това е съобщение от Ани себе си. Не забравяйте, че не казвай на никого. -90 Секунди по-късно, аз съм в единствената стая в къщата, където деветгодишно момче може да седне в личния живот и декодиране. Аха, Б. отидох до следващата. Д. първата дума. S. Той идваше по-лесно. U. -О, хайде, Ралфи. Трябва да вървя. - Ще бъде, ma. Gee факир. -T, О. Бъдете сигурни. Бъдете сигурни към какво? Какво е Little Orphan Annie се опитвам да кажа? Бъдете сигурни към какво? - Ралфи! Ранди Трябва да тръгвам. Ще ви моля да излезе? -Добре, мамо. Аз ще идвам. -I е все по-близо. Напрежението беше ужасно. Какво беше това? Съдбата на планетата може да се мотае в баланса. - Ралфи! Ранди Трябва да тръгвам. Ще бъде десен, за плача на глас. Боже, почти там. Пръстите ми лети. Умът ми беше стоманен капан. Всяка пора вибрира. Това е почти ясен. Да, да, да, да. -Be забравяйте да пиете Овалтин. Овалтин? Кофти търговски? Кучи син. [END възпроизвеждане на видео] Дейвид Дж. Малан: Значи имаме криптографията. Е, как в един компютър може да отидем за прилагане или представляващи неща като това? Е, ние се нуждаем от начин да се изрази малко по-гъвкаво, отколкото нашите променливи до този момент са разрешени. Имахме цели числа. Имахме символа. Имахме поплавъци и двойни и няколко други. Но това са отделни части от паметта, които наистина не ни позволяват да изразят неща като думи и изречения и фрази. Всъщност, ние сме наричат ​​такива струни неща. Но обеща, че това е наистина само за опростяване в CS50 библиотека, която възнамерява да кори обратно. И така, нека да започнем да направя това тук. Нека вървим напред и да се отворят файл - всички тези файлове са на разположение както обикновено онлайн нарича array.c за решаване на проблема, несвързани с низове, но че рисува снимка тук как може да използваме нещо, наречено масив. Масивът е тип данни. Това е един вид променлива, на видове, което има множество по-малки типове данни вътре в него да направите резервно копие на гръб до гръб. Така например, ако искаме да се напише малка програма, която ви дава викторина средно за около 50, че има две викторини, бихте могли много лесно напишете тази програма - дори на някои от миналата седмица материал с помощта на GetInt и няколко променливи. Int quiz1, вътр quiz2, и това е доста ясен. Това е може би 10, 20 линии на код, макс, за изпълнение на програма, която иска потребителя за две викторини резултати и след това изчислява средната им, като ги добавите заедно, се разделят на две, и след това отпечатване на резултатите. Вероятно бихме могли да направим това доста лесно сега, след известен брой минути. Но проблемът е, че предполагам, че 50 имаше три викторини или четири. Да предположим, че искате да използвате една и съща програма за клас, който седмично тестове. Помислете за клас, който е седмично викторини. Ако е като 16 седмици в един семестър, сега имате 16 променливи - Int quiz1, вътр quiz2, INT quiz3, вътр quiz4. Веднага след като започнете да виждате този съкращения, това копиране и поставяне код, той трябва да започне да ви накара да искал да има по-добър начин. И слава Богу, защото на масиви, има. Така че нека да го направим. Първо, позволете ми много просто нещо, което ние не сме използвали до този момент, но от време на време ще го видите в кода. Това е това, което обикновено се нарича константа. Така че това е константа в смисъл, че тази стойност никога не се променя. Човешкото конвенция при създаването на постоянно е да се използват всички капитали писма, просто така, че тя наистина се откроява в кода си. И специалните ключовата дума, която използват в C # определят. Така че, ако ти кажа # определят, след това интервал, а след това думата, която искате да използвате за името на константата, а след това стойността на константата. Така предизвестие, това е различно от възлагане нещо на променлива. Не е знак за равенство. Няма по точка и запетая. Това е, което е общоизвестно като препроцесор директива, но повече на , че друг път. За сега, това създава неизменен стойност викторини, чието действително числова стойност е 2. Така че навсякъде, където видите викторини, тестове, викторини целия този файл, това е само номер 2. Сега, ако погледнете в основния сега, нека да видим как работи това. На първо място, тя изглежда малко загадъчен. Но всичко това е неща от една седмица. Попитайте на потребителя за степени. Как да постигнем това? Е, в ред 22 - това наистина е сочен част - Декларирам поплавък, но не само един поплавък. Аз деклариране, а по-скоро масив от числа с плаваща запетая. Тази променлива се ще се нарича степени, като подразбиращи се тук. Но само част от нов синтаксис и след това са тези квадратни скоби, фактът, че съм казвал флоут степени и след това отворете конзолата и след това номер. Забележете, ако това е константа, това е точно както направихме това. Това означава, хей компютър, ми даде две плувки, и нека заедно се обадя им класове. Това е в контраст с много по-досаден процес като този. Флоат grade1, флоат grade2, и така нататък. Така масив ни дава възможност за прилагане на тази идея, но много по-малко messily, в такъв начин, че ние може да напише един ред код, вместо, да речем, 16 за 16 седмица семестър. Така че аз не искам на твърдия код 2, защото ако си мислиш за това сега логично - Предполагам, че следващата година CS50 промени в три викторини вместо. И аз трябваше номер 2. Имах номер 2. Имах номер 2. Имах номер 2. Това става много досаден и много лесно да се притеснявам и да сменяте една стойност 3 и пропускат някои друга стойност от 2. Така че аз ще вместо абстрактно това далеч и използват тази константа, че, тъй като неговата подсказва името му, никога не се променя. И сега, без значение дали имаме различни викторини тази или следващата година, просто трябва да го промените на едно място, тук най-отгоре. Така че това е константа е. Междувременно, нова концептуална черта е, че на масив. Така че квадратните скоби ми даде толкова много поплавъците и ще ми позволи да колективно ги наричаме степени. Така че сега нека видим какво ще правя. Тук, в линия 24 е началото на контур. Това е наистина нищо фантазия. Това е просто използвате викторини, вместо на хард-кодиран номер. Но няма нищо интелектуално различен от миналата седмица. Това е само ФОРМАТ. Така ФОРМАТ ("викторина% от броя г% г"), защото аз просто искате да разпечатате, за да ми даде викторина номер едно на две и след това две от две. Така че това е чисто естетически нещо. Но интересната част е в ред 27. За да се попълнят в една от двете контейнери с плаваща запетая стойност, отново използваме квадратни скоби. В този случай, аз използвам, защото това за цикъла започна със равна каква стойност, очевидно? 0. Така на първата итерация на тази линия, то е, като че ли е написал това в код. Но на втората итерация на тази линия, е, като че ли е написал това в моя код. Но факта, че аз съм с променлива е добра, защото, както името предлага, е различна стойност на всяка итерация. Така че аз съм пълнене този масив едно място в даден момент. Какво означава този масив изглежда? Е, причината Нарисувах този супер прост правоъгълник на екрана преди да е поради тази причина. Масивът е просто парче от паметта, последвано от друго парче от паметта, последвано от друго парче от паметта, и така нататък. Така че, ако ми масив е с размер 2, в този случай, всичко, което ще се прави от пишете ми викторина резултати, тук ми харесва. Имам 100 за това. И тогава аз имам 99 по този въпрос. Тогава тази памет не може дори да се използва, защото аз съм само попита компютър за масив с размер 2. Тези квадрати са все още там. Нали? Вие все още имате два гигабайта оперативна памет, дори ако сте само питам за две плувки. Така че идеята зад масиви е, че компютърът отнема само парче на паметта и след това разпределя на малки парчета, за да направите резервно копие на гръб до гръб. И така, това е масив. Това е свързано парче от паметта, вътре в който можете да поставите нещата. Сега това се случва след това да се направи само някои скучни аритметика. Ако превъртете надолу, това е мястото, където след това обхождане на масива. Идвам с сумиране на всички стойности в масива. И тогава аз използвам кръглата функция тук, за да направят обобщим, разделени от викторината. Но позволете ми махна с ръка, че като вид достатъчно аритметика за сега. Но всичко, което прави за мен в крайна сметка се изчислява средна стойност. Така че първата викторина плюс втората викторина, разделен на две, и след това печат като Int. Но нека сега преход към различен пример string1 който рисува подобна картина, но с помощта струни. Позволете ми да отида напред и да се опрости тази процедура само за миг. И прости отстъпа за сега. Обявлението в ред 19 на този пример, аз се низ от потребителя. Но забележете какво съм следващия прави линии 22 нататък. Аз съм всъщност итерации от първа до - и това е нов трик - strlen, низ дължина. Това е функция, която идва с C, че ако го премине низ, той казва колко знака са в тази струна. Това е всичко. Факта, че е strlen вместо дължината на низ, е само защото тя е по-ясен. Преди 30 години, хората обичаше да пишем за неща, колкото е възможно по-накратко. Така че ние сме съхраняват тази конвенция. + + просто означава, че се увеличава в всяка итерация. И сега да забележите това, което е наистина интересно. Така че на ред 24, аз казвам компютър, ми даде знак, осем бита, а го наричат ​​в. Но какво е това на дясната страна казва? На английски език, какво значи това? [Недоловим] Дейвид Дж. Малан: Точно така. Дай ми първия знак в масива. Или по-общо, дай ми I-тата характер в масива. И осъзнават, че е важно, че сега като компютърни специалисти, ние сме всъщност брои от 0. Вие нямате преценка сега, за да започнем да правим това. Сега трябва да се държат в съответствие с очакванията на компютъра и брои от нула, тъй като [0] ще бъде първият знак в низ. [1] ще бъде втората. [2] ще бъде на трето място, и така нататък. Така тази програма, ако мога да го компилирате - това е, отново, string1. Така че се string1. И сега аз тичам string1 в моя терминален прозорец. Чака за вход, така че аз ще трябва да въведете в, да речем, Дейвид. Enter. И сега го отпечатва DAVID по различни линии, защото забележите това, което правя. Аз отпечатване на един символ в даден момент. Сега ние няма да навлизам в подробности днес по този въпрос. Но аз изтрит момент преди тази проверка. Оказва се, че ако потребителят се държи добре, състезателно, или просто объркан, всъщност може да не успее да даде поредица от малко по-дълго. Ако натиснете грешен клавиш от клавиатурата, може да даде не низ изобщо. Или, ако сте злонамерени, можете да опитате да поставите в един гигабайт на есе да запълни тази струна. И ако компютърът работи на паметта, се оказва, че ние ще да се върна тази особена стойност нула. Така че за сега, просто знам, че има този специален нарича нулева стойност ще ни позволи да се провери, когато сме на паметта, наред с други неща. Но ако отворя сега МНОЖ2 забележите една разлика тук. Забележете една разлика с МНОЖ2. С МНОЖ2, това за цикъла е малко по-различно. Позволете ми да изтриете нулата, така че можем да говорим за друго време. Но това, което е различно за контур за това време? И аз мога да се върна към предишния пример. Така че това е версия две. Това е версия едно. Едно, две, едно две. Така че strlen разговор е къде? Това е първата част от линия за. Някакви идеи защо аз правя това? Да. [Недоловим] Дейвид Дж. Малан: Така че ние не извикате функцията всеки един момент. Точно така. Спомнете си за електрически вериги, които те са супер прости, след като вид да разберат, че това е инициализация, състояние, както и актуализацията. Проблемът е, че състоянието се случва на всеки итерация на цикъла. И така, в този пример тук, това, което е лошо за факта, , че това е моето състояние? Вие се обаждате strlen отново и отново и отново. Но след като сте въвели в ДАВИД, дължината на този низ е пет. И това няма да се промени на всяка итерация на цикъла, защото низ е все още D-A-V-I-D. Така че това е намек какво ще стане все по-важна идея, известна като дизайнерско решение, където просто не компютъра излишна работа. Сега само като закрита прожекция на pset 2, pset 2 в стандартното издание е ще ви предизвикателство за реалното изпълнение известен брой шифри, някои брой на криптиращи алгоритми, така че можете да криптиране и декриптиране тайни послания, много прилича на Ралфи декодирани. В хакер издание на pset 2, ние ще отидем малко по-нататък. Ние ще ви предаде на файл от действително компютърна система, която съдържа куп на потребителско име и действителните криптирани пароли и предизвикателството за хакер издание ще бъде да се справи тези пароли и фигурата какво криптография или каква тайна е бил използван за действително генерират тези пароли. И ние ще направим това с помощта на нова функция на C, че аз ще дам просто демо, известен като аргументи от командния ред. Така се оказва, както някои от вас може да са видели в раздел или в учебниците, Основната не винаги трябва да бъдат анулирани в скоби. Оказва се, че основната могат да бъдат написани по този начин, с два аргумента, argc и argv, където argc е броят на думите, които въвеждате след името на програмата на командния ред. Argv е истински думи. И тъй като квадратните скоби там предполагат, argv е очевидно масив. Ще бъде низ след низ след низ в паметта. Така че това, което ние отиваме, за да може да се направи, като се започне с pset 2, нещо подобно. Ако успея argv1, което е пример, ние ще се върнем към понеделник, и тичам , забележите, че той не изглежда да се направи нищо все още. Тя просто отпечатва свое име. Но ако кажа сбогом клас, забележете, че тази програма очевидно повтаря над всяка от думи, които са въведени в командния ред. И средствата, чрез които ще получат достъп до думите, че потребителят е въвели в командния ред е чрез промяна на Майн, в началото на този уикенд, от вътр главната (нищожна) да INT главната (argc, argv). И по този начин ще се роди аргументи от командния ред. И след като получи много по-умели в това, вие ще бъдете в състояние да пиша наистина trippy програми, като този тук, който е над и отвъд част от функционалността сме направили до този момент, но доста мощен. Така че ние ще оставим това с този на екрана. И ние ще се видим в понеделник.