[Powered by Google Translate] [Седмица 2 Продължава] [Дейвид Дж. Малан, Харвардски университет] [Това е CS50. - CS50.TV] Добре. Това е CS50, и това е края на седмица 2. Ако очаквате да бъде гладен утре по това време, знаят, че ние ще свика малка група утре, четвъртък, 13:15. Има този адрес тук, ако искате да потвърдят. Пространството е ограничено, така че моля прости, ако се запълни формата от времето, когато попълвате това. Друг URL, обаче, че може да бъде от интерес. Само за един месец, курсът ще бъде на разположение още по-голяма степен чрез EDX хора в интернет, чрез която ще бъде в състояние да следват заедно, участват в курса доста активно, като в действителност. Те ще се използват CS50 техника и CS50 Обсъждане и по-голямата част от различните софтуерни инструменти, които вече са използвали този семестър. И една от инициативите, ние бихме искали да поемат като експеримент тази година е да се види колко много съдържание, можем да преведем в други устни и писмени езици. Така че, ако може да имат интерес да участват в този проект , чрез която ние ще осигурим преписи и субтитри на английски език за лекции на курса и шорти и семинари и секции и други подобни, ако говорите свободно или напишете свободно друг език, ние ще се радваме да те включат в този проект, като ви отведе на едно или повече от клиповете, превода им на език, вие знаете много добре. Да ви даде чувство на интерфейса, има този уеб-базиран потребителски интерфейс , че ще се използва, които ще създадат по същество UI като този. Това ме учеше Хелоуин преди, и на дясната страна в черно до тези времеви печати, ще видите различни неща, които излязоха от устата ми, че ден, и след това под нея ще можете да превеждат на друг език какво точно картографиране е, в този случай, английски и, да речем, испански. Така че всъщност е много лесен за употреба инструмент. Можете да върнете назад и бързо напред много лесно с клавишни комбинации. Така че, ако искате да участват в този експеримент и думите ви види и прочете от потенциално хиляди хора там, моля не се колебайте да участват. Една дума за коте от понеделник. Да не би да сме изпратили прекалено страшно послание, не осъзнават, че като работно време показват, и секции показват, дизайнът на курса е много да са студенти сътрудничество и говори да работят чрез проблемни комплекти и проблеми, и наистина линията просто се свежда до отново, работата, която в крайна сметка се представя трябва да бъде свой собствен. И така, съвсем честно, в работно време, това е напълно нормално, това е напълно да се очаква дори да чатите с някой приятел до теб. Ако той или тя се бори с някаква тема и вие сте като "О, добре, нека ви дам един поглед на някои ред от кода, че съм написал, че" е добре, , което се случва, и това е много благоприятна, мисля, че с процеса на обучение. Когато линията се пресича, когато главата е нещо наклонена тук за твърде много секунди или минути за това наистина да са току-що беше деблокиране възможност за вашия приятел, и разбира се, когато нещата се обменят по електронната поща Dropbox и други подобни, там също е на линия. Така че по всякакъв начин да се чувстват комфортно и се чувстват насърчени да чатите с приятели и съученици за psets и повече и просто осъзнават, че това, което в крайна сметка представя трябва наистина да бъде продукт на вашето творчество, а не някой друг. И така, един на домейн специфични проблеми за pset2, , която ще излезе късно утре вечер, е да се потопите в света на криптографията, който е изкуството на криптиране или кодиране на информация, и това в крайна сметка се отнася до света на сигурността. Сега, сигурност за повечето от нас идва под формата на доста светски механизми. Всички от нас имат потребителски имена и пароли, и всички от нас имат много лоши потребителски имена и пароли, най-вероятно. Ако паролата е една и съща на множество сайтове, това може би не е най-добрата идея, , тъй като ние ще обсъдим към края на семестъра. Ако паролата е написана на лепкава бележка - не е шега - на вашия монитор, , което също не е непременно най-добър дизайн, но доста често срещано явление. И ако не използвате криптография за криптиране на паролите си, те са особено уязвими. Така че, ако си мислиш, че е супер умен, като скрит документ на Word някъде на твърдия ви диск, който има всички ваши пароли но това е в папка, която никой няма да изглежда, че също не е много сигурен механизъм. И така, какво pset2 ще въведе това е изкуството на криптографията и кодиране на информацията, така че неща като пароли са още по-сигурна. Контекстът тук е, че в несигурни данни идва възможност да я криптирате и да се катеря. И така, това, например, е пример за шифровано съобщение. Това всъщност казва нещо на английски, но това явно не е напълно очевидно. И ще дойде пълен кръг днес, за да дразни, освен това тайно послание тук е. Но в реалния свят на компютрите, нещата не дори изглежда като те могат да бъдат на английски фрази. Например, това е, което може да намерите на стандартен Linux и Mac или UNIX компютър във файл, който някога е бил едно време, наречено файла с паролите. Днес тя е била преместена на други места. Но ако погледнете на точното място на системата, ще видите не само потребителското си име или на други хора в системата, но ще видите криптирана версия на своята парола. В действителност, думата криптата предполага, че следните неща е криптирана, и тази поредица от привидно произволни букви и знаци и цифри и т.н. могат да бъдат разшифровани само от обикновено знае някаква тайна - тайна дума, таен номер - и така наистина, изкуството на криптографията в крайна сметка се свежда да се доверят на някакъв вид и да знае нещо, че някой друг не. Така че ние ще разгледаме това в малко по-подробно днес и в pset да дойде. И сега е дума за Pass / Fail. Особено като някои от вас са се гмурна в pset1, техника, и много нов свят за себе си, осъзнавам, че отчаянието и обърканост и само на технически трудности са доста да се очаква, особено с първата pset, където има толкова много нови, запознаване с LS и CD и всички тези тайнствени команди и нова среда, а това е отделно от действителния материал и самото програмиране. Така че осъзнават също, че има определено работно време, които съществуват като поддържаща структура,. Раздели започне идната неделя. Но най-важното е, че ако сте чувството, че това не е светът за теб, осъзнават, че това наистина не само да отнеме време. И не са за тази възможност преди години за мен като клас / не, честно казано, никога не бих дори стъпвал в класната стая. И вие можете да промените това до, да речем, пети понеделник на курса, така че ако сте на ръба, да разбере, че по-скоро от главата в някои други води като цяло, сигурност обмислят смяна на Pass / Fail. Отново, не е наистина тази култура тук в Харвард като нещата Pass / Fail тъй като всички наистина иска да постигне или да преизпълни, но честно казано, това е един чудесен начин се опитва нещо , която не може да бъде запознат с теб, и ще свърши това, в повечето случаи, доста добре, може би много да ви изненада. И по-конкретно, какво мисля Pass / Fail обикновено не, особено след като може да сте изпитали с pset0, ако ще ви постави в 10 часа, 15 часа, 25 часа в някои pset и просто Блъскането на главата в стената и става супер късно през нощта но сте взели pset 90% от пътя и просто не мога да разбера едно нещо, Pass / Fail наистина е на ръба на класа като тази, , където можете да сортирате щастливо кажат: "Добре, знам, че не е перфектен, но съм работил задника ми, аз съм много щастлив, когато в крайна сметка ", и че ще отговори на очакванията на преминаване / отпадане. Така че имайте това предвид. Добре. Така че тези от вас, които са се борили да използвате Харвардския университет Wi-Fi, знам, че има CS50 SSID, Wi-Fi връзка, плаващ наоколо че може да имате по-голям късмет. Това е малко иронично, че паролата за това, ако искате да опитате да се свържете към това за по-добри скорости и да споделите с нас, ако това не е по-добре - е 12345, по целия път до 8 защото 8 е по-сигурен от 5. Така че, ако имате нужда от Wi-Fi парола, се свържете с CS50 безжично тук, 12345678, и мнения на CS50 Обсъждане ако все още имате периодични проблеми със свързаността, и ние ще правомощията, които се знаят за това пространство. Добре. Така бързо закачка, особено за тези от вас, които са фен на момчета или момичета на всички неща Apple. Това, което аз съм изкопал от преди няколко години, беше този файл тук, iUnlock.c, само вид на по-конкретни и по-сложни някои от най-основните програми на C сме написали. Така че аз отвори този файл, iUnlock.c. Тя е на разположение на Лекции страница за днес. От лявата страна ще видите дълъг списък от функции. Така че човек, който е написал това пише много функции, повече от просто основната. Той използва цял куп библиотеки, и ако започнем да превъртате през това всъщност е е първият, аз вярвам, пляскане за оригиналния iPhone. Когато искаш да Jailbreak оригиналния iPhone, което означава, че развързвам от AT & T и действително да инсталирате специален софтуер за него и да направим неща, които Apple не искат хората да правят, някой е взел време, за да разбера как точно те могат да се възползват софтуерни недостатъци, грешки, грешки в софтуера на Apple, и по този начин е роден iUnlock.c - че ако го съставя на вашия компютър и да го инсталира върху един iPhone , който е свързан към вашия компютър, да речем, чрез USB кабел, Това ще ви даде административни или корен привилегии на вашия iPhone и да ви позволи да направите почти каквото искате. И така е имало тази завладяваща игра на котка и мишка между Apple и останалата част на света, по-специално, тъй като те, като много компании, опитайте се да заключите своите неща, така че може да направи само с това, което те възнамеряват. Но благодарение на хора като този и разбиране на ниско ниво детайли - и в този случай C програмиране - и много от познатите конструкции че сме започнах да играя с, вие сте в състояние наистина да впрегнете хардуер по начин, който ти е удобно, а не непременно някакво юридическо лице. Така например, нямам представа какво е всичко това се прави, но GetVersion звучи доста просто, и тя изглежда като това е функция, която този човек е написал. Това отнема някакво число като аргумент, не връща нищо, но се появява на линия за цикъл тук, а ако състоянието, ако състоянието почивка, и по някакъв начин е свързан с номера на версията, ако превъртите надолу, въпреки че много от тези ключови думи ще бъдат нови. И има един куп функции тук никога не съм виждал и никога не може да видите в течение на семестъра. В края на деня, той следва същите правила и логика, че ние сме били играе с този момент. Така че това е твърде стар, за да се справи iPhone 3s или 4s или скоро 5s тези дни, но знам, че всичко е много получени от този свят, че ние сме се гмурна в. Нека да погледнем малко по-прост пример: това, само за да се стопли с някои синтаксис, а също и някакъв друг вид данни че сме говорили, но не бях виждала в C. Това е файл, наречен positive1.c и на коментарите на върха, това просто изисква потребителят да предостави положително число. Така че това е пример за това направи по време на цикъл, което е хубаво за потребителски интерактивни програми където трябва да съобщите на потребителя да направи нещо, и ако те не си сътрудничат крещи по тях или отхвърляне на тяхното въвеждане. Дело в точка: Аз ще направя редове 19 до 24 толкова дълго, тъй като потребителят не ми е дал положително число. Този детайл тук по линия 18, защо съм декларира N над цялата тази примка изграждане за разлика от в непосредствена близост до линията 22, където всъщност се грижат да получите н? Да. [Ученик] Обхват. >> Да, така че този въпрос на обхвата. Други думи, какво поле се отнасят? Да. >> Чува студент отговор] >> Можеш ли да говориш малко по-силно? [Ученик] Къде можете да получите достъп до тази променлива. >> Perfect. Къде можете да получите достъп до дадена променлива. И общо правило този момент е, че обхватът на някои променлива се определя от най-новите фигурни скоби, които сте виждали. И така, в този случай, ако съм направил грешка за обявяване на N по линия 22, че линията ще работи. Че ще получи едно цяло число, и аз бих го сложи в тази променлива N в ред 22, но коя линия на кода би сега имат никаква представа за какво говоря? >> [Ученик] 25. Малан] 25, и се оказва, 24, както и защото в този случай тя попада извън фигурни скоби. Така че просто малко неудобство, но много лесно се решава като просто обявяване на променлива извън самата функция. Ще видим по-късно днес можете да направим още една крачка и вие дори може да се получи малко мързелив. И това не е да се препоръчва по принцип, но бихте могли да получите дори мързелив и променлива в световен мащаб, така да се каже, не вътре на функция вътре, не на една линия, но в самия файл, извън всички функции съм писал, както направих аз тук по линия 15. Това обикновено се гледат накриво, но осъзнават, това е решение, понякога и до други проблеми, , тъй като в крайна сметка ние ще видим. Така че за сега ще го оставя така, но нека да видим дали можем да пренапише тази само за да започне да изразява себе си малко по-различно. Тази програма, само за да бъде ясно, positive1. Нека вървим напред тук и в моя терминален прозорец positive1, Enter. Компилира добре. Отивам да тече positive1, удари Въведете. Настоявам да ми даде положително число. Аз ще кажа -1. Това не работи. 0, 99. Това изглежда да работи. Може би не е най-строг тест, но най-малко, че е хубава проверка здрав разум , че сме на прав път. Така че сега ме пусна напред и отворен версия 2 на този, и какво е различното? Той реализира едно и също нещо, но какво скача като ясно различно този път? Това булев в зелено. Се маркира в зелено, тази ключова дума, известен като булев, което е тип данни. Той не идва построена през всички версии на C. Трябва да включва специален библиотека. В нашия случай, включени CS50 библиотека така, че имаме достъп до булев. Но в ред 18, изглежда, имаме тук нарича булева стойност благодарен. Можех да нарича това нещо, но аз го нарече благодарен просто някак да предадат някои семантично значение. Така първоначално по линия 18, аз очевидно не съм благодарен защото булева стойност благодарен се инициализира с фалшиви в ред 18. И тогава изглежда, какво съм направил тук в линии 21 до 23 съм просто пренаписват моята логика. Така че не функционално различна, но в ред 22 сега се провери дали INT потребителя е предоставил е по-голям от 0, тогава аз просто променете стойността на благодарни да е истина. И защо да го направя? Защото в линия 25, очевидно Отивам да проверите състояние. Направете тази линия, докато благодарен е фалшива. Така че аз предложих като алтернатива на версия 1 защото това е поне малко по-интуитивно, може би, това е малко по-здраво стъпили на английски език. Така че, направете следното, докато не сте благодарни или докато благодарен е фалшива. И този път аз очевидно не ми пука да се помни това, което потребителят въвели в защото известие, че няма променлива N, така че всъщност, малко бяла лъжа. Функционално, програмата е малко по-различно, след като стигнем до дъното на това , защото не съм спомни какво н е. Но аз исках да покажа, че въпреки че сме виждали GetInt и GetString се използва върху дясната страна на знака за равенство до този момент така, че ние помним стойност, технически, това не е строго необходимо. Ако по някаква причина просто не им пука да запишете стойността, просто искате да проверите стойността, забележите, че можем просто да напиша тази GetInt, отворена скоба, близо скоба. Тази функция ще върне стойност, тъй като ние сме били казват. Това ще ви даде обратно вътр. И така, ако сте психически, че това да се случи, когато пиша в 99, GetInt връща 99 броя, и така концептуално, това е като че ли ми код, всъщност това. Така че, ако 99 наистина е по-голяма от 0, тогава благодарен, се превръща в истина, линия 25 осъзнава, о, ние сме направили, защото сега съм благодарен, и ред 26, ние просто да кажем "Благодаря за положително число!" каквото и да се случи да бъде. Сега нека направим леко синтактична захар, така да се каже. Да видим, ако можем да се почисти тази линия 25 с този третия и последен вариант positive3. Забележете Единствената разлика сега е ред на кода? >> [Ученик] 25. >> Малан] Да, 25. И ние не сме наистина виждал този трик просто все още, но ние се видите удивителен знак в понеделник, , която означава какво? >> [Ученик] Не. >> Или не отрицание. Така че да булева стойност и флип стойността си. True става неверни, фалшиви се превръща в истина. Така че това, че ще предложи, е дори малко по-интуитивен начин на писане на кода защото аз все още се инициализира благодарен невярно, аз все още се прави следното, Задам благодарни да е истина, когато му дойде времето, но сега можете да наистина просто преведе този код устно ляво на дясно, време (благодарна!), защото взрив или удивителен знак обозначава понятието не, така че докато не благодарен. Така че, отново не са въвели всички нови концепции сами по себе си. Ние говорихме за Булев, когато играхме с устойчиво на надраскване, но сега осъзнавам, че може просто да започнете да пишете на нашия код по много различни начини. Така че особено в pset1, ако сте се борят да разбера начин да се напише някоя програма, шансовете са, вие сте в късмет, защото не може да има произволен брой решения , че може да се случи. Например, това е само 3 за дори най-простите програми. Добре. И сега припомни в понеделник остави на тази бележка с обратни стойности. Така че за първи път ние написахме програма, която не само има основен; тя също има своя собствена потребителска функция, че съм написал тук. Така че на ред 31 до 34 съм прилагане функция куб. Това не е сложно. Това е просто * A * а в този случай. Но това, което е важно за него е, че аз съм като вход под формата на Връщам изход под формата на * A * а. Така че сега имам възможност, подобно на мен се използва само с prinf да се обадя на тази функция, като се обадите на куб функция. И куб функция отнема известно вход и куба функция връща някои от крайните продукти. От друга страна, ФОРМАТ току-що е направил нещо. Не връща нищо, че се грижи за, макар и като настрана тя не връща стойност; просто обикновено го игнорирате. ФОРМАТ току-що е направил нещо. Това е страничен ефект от печат на екрана. За разлика от тук, ние имаме куб функция, която всъщност връща нещо. Така че за тези, които са запознати с това, че е доста ясна идея. Но за тези, които са по-малко запознати с тази идея за преминаване през входове и изходи, нека се опитаме просто нещо супер проста. Има ли някой комфортно на сцената накратко? Вие трябва да се чувстват удобно с камера за вас, както и. Да? Добре. Как ти е името? >> Студент Кен. >> Кен. Добре. Кен, хайде нагоре. Кен ще бъде функция на видове тук. Да вървим напред и да направите това. Нека се получи малко фантазия. Приятно ми е да се запознаем. Добре дошли в центъра на сцената. Добре. Нека да натиснете този бутон. Добре. Така че тук имате модерна Черна и това, което съм, е основната функция, например, и аз не разполагат с IPAD в ръката ми. Аз наистина не помня как - Е, аз не мога да кажа, че. Аз наистина не са добър ръкопис, и затова аз искам да отпечатате нещо на екрана за мен. Аз съм основната програма, и аз ще ви кажа това като го пише в моя пиле нулата и след това преминаване вход. Така че глупаво, въпреки че това упражнение е, идеята на функциите и извикване на функция и връщане функция наистина се свежда до това. Майн, просто е написал ФОРМАТ, цитирам цитата нещо на екрана, Съм тази програма, и веднага след като ФОРМАТ получава нарича, приема само един аргумент или един параметър понякога и между двойни кавички. Ето този аргумент. Аз съм го преминаване към Кен. Той е една черна кутия, написал някои преди няколко години че очевидно знае само как да отпечатате неща на екрана. Така се изпълни. Това не е лошо. Много добре. Така че сега Кен се извършва изпълнение. Дали той трябва да ми подадеш нещо обратно? Не че сме виждали до този момент. Отново, ФОРМАТ действителност не връща номера, но отиваме да пренебрегнем факта, че за сега , защото никога не съм го използвал. Така че това е за Кен. И така, сега основната отново поема контрол на програмата , защото тази линия на код, ФОРМАТ се извършва изпълнение. И отиваме за нашия начин, извършване на всякакви други линии има. Така че сега, нека се опитаме малко по-различен пример. Този път нека първо да изчистите екрана, и този път ние ще направим cubing функция, но този път, аз очаквам изходната стойност. Така че нека да вървим напред и да направите това. Сега имам линия на кода, който казва, х получава куб на х. Линията на код, изземване, изглежда по този начин: х = куб (х); Е, как това ще работи? Да вървим напред и ще ви даде отново бял екран. Аз ще напиша сега стойността на х, които в този момент се случва да бъде, да кажем, два да го прости. Съм написал върху парче хартия на стойност 2, което е моята ценностна х. Да го предаде на Кен. >> И аз просто напишете отговор? >> Да, нека просто да напишете отговор. Добре. И сега той има да ми връща нещо. Perfect. Ница Segue. Така че сега той ме ръцете обратно стойността на 8 в този случай, и какво да правя с него? Всъщност - нека да видим, да получите това право. Какво щях да правя с него? Сега отивам да се вземе тази стойност и всъщност го съхраняват в същите тези битове в паметта. Но забележете Аз съм един вид се бори тук. Аз съм малко объркан, защото там, където мога да пишат на стойността на х, защото това, което току-що направихте е физически страна Кен парче хартия, която е на стойност 2, което е х, а всъщност, това е точно това, което се е случило. Така се оказва, че когато ти се обадя функцията и давате аргумент като Здравей, свят или преминават в спор като 2, като цяло, вие сте преминаване в копие на това твърдение. И така, точно както съм написал номер 2 тук и я подаде на Кен, , които трябва да означава, че все още имам копие някъде на стойност 2 защото наистина, сега, че съм намерила на стойност 8, трябва да се върнем в RAM и всъщност напише 8, където аз веднъж имах номер 2. Така визуално, не забравяйте, това понятие за преминаване, буквално копие на стойността. Кен прави нещо си, ми подава нещо - в този случай стойност, като 8 - и тогава ще трябва да направим нещо с тази стойност, ако искам да я държи. Така че всичко това ще се върне, за да бъде твърде запознати преди време. Благодаря ви много за това демо тук, Кен. [Аплодисменти] Много добре направено. Нека видим как това в крайна сметка се отнася до някои на функцията разговори, че ние сме били прави тук. Позволете ми да отида напред и да ни върне на cubing пример тук. Забележете, че ако искаме действително да започнете да приемате това допълнително, ние ще трябва да бъдат съпричастни на факта, че броят X, който се предава тук е различно от това, което всъщност се прехвърлят в функцията. Така че отново, този пропуск от копие ще стане доста уместен само за миг. Нека да разгледаме нещо, което съвсем не работят точно, все още. Отивам да вървим напред и да се отвори трети пример бъги, което е опорочено от природата, и тя се нарича buggy3 и осъществява размяна на функция. Тук имаме една основна функция, която е х и у произволно инициализира с 1 и 2, съответно. Можем да използваме GetInt, но ние просто трябва едно просто упражнение, така че е трудно кодирани като 1 и 2. В линии 21 и 22, ние очевидно отпечатате X и Y, 1 на ред. Тогава по линия 23, аз твърдя, че съм смяна на тези стойности, точка, точка, точка. Очевидно наричаме функция нар. суап линия 24, която отнема 2 аргументи. Това е напълно легитимни функции, за да се вземат две аргументи. Виждали сме ФОРМАТ го направя вече. Така че суап очевидно отнема х и у, и както подсказва името му, Надявам се, че ще ходи да сменяте тези две стойности. Значи аз твърдя, он-лайн 25 "разменят!" и аз препечатайте х и у в рамките на предположението, че те наистина са били разменени. Но ако стартирате тази програма - нека се отвори прозорец на терминала, нека да buggy3 - както подсказва и името, това няма да свърши добре , защото когато натиснете Enter, ще забележите, че х е 1, Y е 2, и все пак в края на програмата, те все още са в действителност, един и същ. Така че на базата на демонстрацията точно сега с Кен, какво всъщност се случва? Да се ​​потопите в този суап функция. Това е супер кратко. Това е само на няколко реда код отдавна. Но това, което е основният проблем на базата на проста история, разказана тук с Кен? Защо суап разбити? [Ученик] съхраняване на копие, а не променлива. Точно така. Ние сме съхраняване на копие, а не самата променлива. С други думи, суап очевидно отнема 2 аргументи, INT, и това е произволно А и Б, и тук съм приет през X и Y, които са съответно 1 и 2, но аз не съм буквално преминава в х, аз не съм буквално минава г. Аз преминаване копие на х и копие на у. Това е почти така, сякаш сте копирали и поставили в суап стойностите, които искат действително да манипулира. Така че, ако това е така, при стартиране на програмата изпълняващата линия 35 след 36, когато съм се да линия 37, в този момент в историята, каква е стойността на? В този момент в историята, ред 37, каква е стойността на в този момент? >> [Ученик] 1. [Малан] Той просто трябва да бъде една, нали, защото X е приет като първият аргумент, и тази функция просто произволно се обажда първият аргумент. По същия начин се ÿ втория аргумент, и това е просто произволно се обадите на втората б аргумент. Това раздвоение всъщност е доста просто обяснено. Помислете за това. Никой от нас не съм срещал човек, който е написал ФОРМАТ така че със сигурност, той или тя няма представа какви са нашите променливи 30 години по-късно ще се нарича. Така че трябва да има разграничение между това, което наричаме променливи във функции, които пишете и това, което наричаме променливи във функции, които можете да се обадите или да използвате. С други думи, аз написах моите променливи х и у, но ако някой друг е написал суап функция, той или тя със сигурност няма да знае какво ми променливи ще се нарича, така осъзнават, че това е причината имате тази двойственост на имената. Технически погледнато, бих могъл да направя това по стечение на обстоятелствата, но те все още ще бъде приет като копия. Тя просто ще бъде чиста случайност, естетически, ако това лице, което е написал суап са използвали едни и същи имена. Така че в този момент в историята, линия 37, е 1, б е 2, а сега да продължа да ги разменят. На първо място, позволете ми да всъщност правят това много по-просто. Аз не знам какво правеха тези три реда код. Нека само да направите това: б =; а = б; направено. Защо това е счупено, логично? Това е един вид на интуитивен нещо, нали? Така става б и б става, но проблемът е, че веднага след като изпълнява линия 37, каква е стойността на А и Б? Същото, един, защото сте съсипани, така да се каже, сте се променили, за да са равни на. Така че след като линия 37 е изпълнена, това е страхотно, сега имате две копия на номер 1 в рамките на тази функция, така че тогава, когато вие казвате в съответствие 38 A = B, ти вид прецакани, защото вие сте просто възлагане 1-1. Ти загуби стойността, която се грижи за. Така че в оригиналната версия на това, обърнете внимание на това, което направих. Вместо това е трета линия на кода, който изглеждаше така. Декларирам, временна променлива. ПТУ е много често срещано име за временна променлива, и това е едно цяло число защото трябва да съответства на това, което искам да направя копие на. Съхранява копие от вътрешността на малки, така че след като е изпълнил линия 37, стойността на - бърза проверка на здравия разум - 1, стойността на б е 2, и стойността на ПТУ е също 1. Така че сега изпълнявам линия 38. След линия 38 изпълнява, поема стойността на б. И Б е 2, така че сега е 2. Така че в този момент в историята, е 2, б е два и ПТУ е 1, така че сега логично, можем стойност просто плясване ПТУ в б и сме готови. Така че ние сме решени този проблем. За съжаление, когато стартирате тази програма в тази форма, не всъщност разменят ценности. Но за да бъде ясно, защо? Определя логически проблем само преди миг, но отново, ако стартирате тази програма, х и у остават непроменени до края на изпълнението на програмата. [Чува студент коментар] >> Ние не са се върнали нищо, така че това е вярно. Но се оказва, че е малко проблем, защото до този момент, единственото нещо, което ние сме били в състояние да се върне, е едно нещо, и това е ограничаване на C. Можете да върнете наистина една стойност, в който случай Аз съм един вид остана тук защото мога да се върна на новата стойност на х или мога да се върна на новата стойност на у, но аз искам двете обратно. Така че завръщането не е просто решение тук. Но проблемът фундаментално е защо? Какво всъщност разменят? [Ученик] а и б. >> А и б. Но и б са копия на X и Y, което означава, че ние просто цялата тази работа, ние просто прекарва 3 минути говори за суап функция и три от тези променливи, и това е страхотно, изрядно в изолация, но и обхвата б е само тук в тези редове. Така че просто като за цикъла, ако Вие декларирате цяло число и вътре в контур по същия начин, ако сте обявяване и б вътрешността на функцията, за която съм писал, те са валидни само вътрешността на тази функция, което означава, че веднага след като суап се извършва в изпълнение на и от линия 24 линия 25, Х и Y не са се променили изобщо. Вие просто губи много време за смяна на копия на променливите. Така се оказва, че решение за това е не-очевиден. Не е съвсем достатъчно, за да се връщат стойности, защото ние може да връща само 1 стойност, и аз наистина искам да сменяте х и у в същото време, така че ние ще трябва да се върнем към това. Но за сега, да разбере, че въпросът основно произтича от факта, че А и Б са копия и те са в техния обхват. Нека се опитаме да решим това по някакъв начин. Нека превъртете върна тук и да се отворят, да речем, четвъртият вариант на това, buggy4. Какво ще кажете за това? Това е подобен, но по-прост проблем да погледнете преди да можем да забие нож в неговото решаване. Тази програма се нарича показване, и това очевидно инициализира цяло число х до 1 на ред 18. След това твърдят, х е една, аз тогава твърдят "Инкрементиращи ..." След това се обадете увеличение, но след това по линии 22 и 23, аз твърдя, че е бил увеличен, Твърдят, х е сега каквото и да е то - 2, най-вероятно, но тази програма е бъгав. Какъв е проблемът? Да. >> Чува студент отговор] >> Точно така. Така че Х е било обявено, очевидно, по линия 18. Това е вътре основни фигурни скоби. Така че просто отговор тук е, че докато х съществува тук, не съществува в ред 32, така че тази програма всъщност дори няма да компилирате. Компилаторът, когато се опитате съставянето на този код ще крещи по мен за някои недекларирания идентификатор или нещо в този смисъл. Всъщност, нека опитаме. Това е да buggy4. Това е то. Използване на "х" недекларирания идентификатор на ред 32. И всъщност, нека бъдем по-ясно днес, така че това е полезно в работно време и у дома. Забележете, че това е малко загадъчно писмено. Но фактът, че звъня ни извика, казвайки buggy4.c: 32:5, е действително полезно. Това означава, че грешката е на линия 32 в позиция на символа 5. Така 1, 2, 3, 4, 5. Това е, всъщност, къде е проблема. И също така, имайте предвид, работно време и у дома, аз съм щастлив тук. Имам една грешка. Това ще бъде относително лесно да се определи. Но ако можете да получите на целия екран, на огромното съобщения за грешки, отново да осъзнаят, че на долния може да бъде само симптом на най-горната. Така че винаги преследват определени грешки от горе на долу защото може да бъде само верига маргаритка ефект че се предполага, имате начин повече проблеми, отколкото сте в действителност. И така, как бихме могли да поправя това, ако целта ми е да увеличите х? >> [Ученик] Направете х глобален. Добре, така че можем да направим х глобален. Нека вземем за пряк път, че предупредих по-рано, но дяволите, ние просто трябва бързо решение, така че нека просто кажем, INT х тук. Това прави х глобален. Така че сега основната има достъп до него и нарастване има достъп до него, и така да отида напред и да съставят това сега. Направете buggy4 Enter. Изглежда да съставят сега. Да работи buggy4. И тя изглежда да работи в действителност. Това е едно от тези неща, които прави каквото ти казвам, а не както аз правя, както току-що направи тук, защото по принцип, нашите програми ще получите много по-интересно и много повече от това, и ако решението на житейските проблеми е просто всички променливи в горната част на файла, много бързо програми се ужасяващо трудно да се управлява. Той получава по-трудно да се измислят нови имена на променливи, става по-трудно да се разбере какво променлива какво прави, и така по принцип, това не е добро решение. Така че нека да направим това по-добре. Ние не искаме тук да се използва глобалната променлива. Искам да увеличите X, така че можех очевидно - в края на деня, това е вид на глупава история, защото ние просто правим това - но ако аз не знаех за този оператор или не ми беше позволено да го промените в основната себе си, как иначе бих могъл да приложи Кен тук този път да не куб, но за да увеличите? Как мога да променя това нещо тук? Да. [Ученик] Pass в х и след това да се върнат [недоловим] >> Добре, добре. Така че, защо да не мога да премине в х и след това вместо да го върне, защо не мога да се върна х + 1. Още няколко неща трябва да се промени тук. Аз съм на прав път. Какво друго трябва да ощипвам? Някой друг. Да. [Чува студент отговор] Трябва да се промени типът на връщане на увеличение, защото не е анулира. Нищо Void средства се връщат, но ясно сега е, така че това трябва да се промени - >> [ученик] вътр. INT да бъдат в съответствие с това, което аз съм всъщност връщане. Сега все още е бъгав нещо друго тук. Да. [Чува студент отговор] >> [Малан] Така че аз трябва да увеличите х? [Чува студент отговор] >> [Малан Ах, така че аз трябва да премине х. Така че аз трябва да направя това тук. >> Чува студент коментар] Малан] Така прототип, аз трябва да се промени тук. Така че това трябва да стане едно цяло число, това трябва да стане - Хм, аз всъщност имат бъг тук. Да се ​​определи това първо. Какво трябва действително да бъде? Това трябва да бъде INT нещо. Тя може да бъде Х, но честно казано, ако започнете да призовава всички променливи х, , че ще получават по-малко и по-малко ясно кой е кой. Така че нека просто произволно изберете различна конвенция за именуване за моите помощни функции, функциите, които пиша. Ще го наречем, или можем да го наречем - Нека да го наречем номер, за да бъде още по-категоричен. Значи аз трябва да се върне, независимо от броя е един плюс, и сега трябва да се промени 1 друго нещо тук и нещо друго тук. Какво трябва да се промени по линия 21, първо? >> Чува студент отговор] Малан аз трябва да го зададете към х. Не мога просто да се обадя увеличение (х). Имам нужда да си спомнят за отговор чрез промяна на стойността на х отляво. И макар х сега е на ляво и дясно, че е напълно глоба защото дясната страна ще се изпълни първо, после го цопнала в лявата нещо - х в този случай. И тогава на последно място, това е лесен корекция. Това просто трябва да съответства на това, което е по-долу, вътр номер. Така цял куп промени за наистина глупаво функция но представител на неща, които ние все повече ще искат да направят. Така че се buggy4. Съм прецакани някъде. О, Боже мой. Пет грешки в програмата на 6-лайн. Така че, какво не е наред по линия 18, характер 5? Така че трябва да декларира това, вътр. Да видим. Има цял куп други грешки. О, Боже мой - 19, 18, 21, но отново, нека просто да изчистите екрана, L контрол, и повторение звъня. Така че 5 проблеми всъщност е само, че 1. Така че нека сега тече buggy4 Enter. Whew, х е увеличен правилно. Добре. Всякакви въпроси за това как да увеличите номера? Да. [Чува студент въпрос] >> Добър въпрос. Как става така, че мога да променя х към номер и програмата ще знаете веднага? Отново, мисля за него, тъй като това абстракция. Така че, ако аз съм основен и Кен е увеличение, честно казано, аз не ми пука какво Кен нарича IPAD. Не ме интересува това, което той нарича нещо, което трябва да се направи с изпълнението си на тази функционалност. Това е подробно изпълнението, че аз, основен, не трябва да се грижи за. И така просто да го променя последователно във вътрешността на функцията - номер и номер тук - е всичко необходимо, за толкова дълго, колкото мога компилирате. Това е нещо като, ако мислите, че за много от нас, тези от вас с шофьорски книжки , които са карали или ако сте дори и возене в кола, повечето от нас нямат представа как колата работи под капака. И буквално, ако отворите капака, повечето от нас - включително и аз - не са наистина знаят какво търсим, вид, като може да се чувствате с неща като това право. Но ние наистина не трябва да се интересува как работи колата, ние не трябва да се интересува какво всички пръчки и бутала и кабели вътре в колата всъщност прави. Значи нещо като това, което наричаме буталото няма значение тук, в този случай. Същата идея. Да. >> Чува студент въпрос] Ако има повече употреби на променливата момент XA преди , програмист, ще трябва да ги сменим навсякъде. Или пък може буквално файлове, Меню, и след това намерите, замени - нещо подобно - но ще трябва да направят тези промени себе си. Трябва да бъде последователна. >> [Ученик] Ако има няколко променливи чува] Дадена поръчка, като тук, ако това е INT друг номер? >> [Ученик] Правилно. [Малан Да. Поръчка значение, когато се обаждате на функция. Така че, ако се обаждаха увеличение с нещо, нещо запетая, Има пряка картографиране. Първата променлива, каквото и да се нарича, е направено копие на първия аргумент тук. Извинете. Това не трябва да бъде скоби. Втори ред аргумент с втората. Така че, за, да, има значение. Добре. Извинете. Взех дълъг път, за да стигнем до там. Други въпроси? Добре. Така че нека да видим дали не можем да нарисува картина на това, което всъщност се случва тук под предния капак, така да се каже. Това е правоъгълник, които биха могли да представляват паметта на компютъра ви. Дори ако вие нямате представа как паметта работи или как RAM работи, най-малко приемем, че имате букети от тези дни. Имаш мегабайта, имаш гигабайта от него, и ние знаем от седмица 0, че един байт е точно това? >> [Ученик] 8 бита. 8 бита, нали? Така осем нула и 1. Така че, ако компютърът ви има концерт на RAM, 2 гигабайта RAM тези дни, имате един милиард или 2 милиарда байта памет или около 8 милиарда евро или 16 милиарда бита вътрешността на вашия компютър. За разлика от малък пример Wooly Willy, това не е магнитни частици, обикновено вече. Все по-често - при лаптопите най-малко - твърди дискове, SSD дискове, , които просто нямат движещи се части. Всичко е електронен. Това е цялата електроенергия. Така че мисля, че на този правоъгълник само като представлява 1 или 2 гигабайта памет, които имате. Така че това е парче от паметта. В света на компютърните науки е някак отделено парчета памет, за да правя различни неща. Например, ако това е вашия компютър RAM, както е предложено от правоъгълника, Оказва се, че по силата на споразумение, в горната част на вашия RAM, така да се каже, като цяло е това, което се нарича текстов сегмент. Това са 0s и 1s, че сте компилирали. Така че, когато сме търсили под капака какво a.out всички тези 0s и 1s, когато стартирате програмата, тези 0s и 1s се зареждат от твърдия си диск в нещо, което се нарича RAM и в RAM те са поставени в горната част. В същото време, има и други неща: инициализира данни, деинициализиране данни. Тези две откоси на паметта се отнасят до глобални променливи, които често не се използват но понякога ако го направите, те в крайна сметка там, както добре. След това има някои други неща: Околна среда променливи, които ние няма да прекарват много време на но след това две важни неща, които ще се върнат през семестъра, стак и куп. Така че по-голямата част от паметта на компютъра ви е запазено, когато се изпълнява програмата за нещо, наречено стека и нещо, наречено на куп. Ние няма да говорим за куп днес, но ние ще говорим за стека. Стека има за цел да апелирам към визуалната на трапезариите тави зала за хранене в Mather Къща или където и да се случи да бъде, където персоналът трапезария им се чисти всеки ден, те ги стека от пода нагоре, и по същия начин, в паметта, това е идеята за въвеждането на нещо на комин, оказва нещо на комин, поставяйки нещо на комин. И това, което искаме да кажем с това? Да увеличение само долната половина на тази снимка, на вашия компютър RAM, да предложи следното. Оказва се, че когато стартирате програма като a.out или здравей - независимо от програмата е, че сте написали - отново 0s и 1s, тези, които се зареждат от твърдия ви диск, което е дългосрочно съхранение, остава там, дори когато дръпнете куплунга, заредени в RAM. RAM е по-бързо от твърдите дискове - това е по-малък от твърдите дискове - но това е мястото, където програмите живеят, докато сте ги да работят. Така че два пъти върху програмата на Mac или PC, тя се зарежда от твърдия диск в RAM. Веднага след като е заредена в RAM, 0s и 1s отиде в начина, по който горната т. нар. текст сегмент, но след това веднага след като вашата програма действително започва бягане, чиято основна функция се нарича и основната, както видяхме, често има локални променливи, и има цели числа и струнни инструменти и символа и други подобни. Така че, ако вашата програма, която сте написали или програма, която сте двойно щракване използва някои променливи в тялото на основния, те в крайна сметка в дъното на стека на паметта, така да се каже. По-конкретно, какво означава това всъщност означава? Това просто означава, че ако щяхме да брой байтове на RAM на вашия компютър, забележите, че това може да бъде байт номер 0, това може да байт номер 1, 2, 3, 4, 5, 6, по целия път нагоре до 2 млрд. евро ще бъде по целия път до там горе на върха. С други думи, когато говорим за RAM или памет по отношение на байта, това просто означава, че някой е решил какво да броим всеки от тези блокове памет. Така че, когато имате нужда от 32 бита за едно цяло число или имате нужда от 8 бита за Чар, където те се озовават в памет? Концептуално, те просто се окажете в долната част на това нещо, наречено стека. Но това, което е интересно сега е, когато основната нарича функция - Предполагам, функция, наречена Foo, просто произволно име - това, което се случва, е основният е в дъното на тази стека на паметта; Foo сега е на върха на основната памет. Така че всички локални променливи, които Foo е до края вид концептуално по-високи от тези в основната. Ако Foo призовава друга функция, наречена бар, тези променливи, които в крайна сметка тук. Ако бар нарича нещо друго, тук, тук, тук. Така че това, което е интересно за изпълнение на програмата е, че като ти се обадя функции и тези функции извикване на функции и тези функции извикване на функции, да изградят тази стека на функциите в паметта. И само веднъж функция се връща да започнете, че паметта. Така един от най-лесните начини да се изчерпят на паметта в компютърна програма е да се напише функции, които никога не се връщат. Така например, да докаже, че с умишлено лоша програма. Нека вървим напред и # включват , INT главната (нищожна), и аз ще направя а (2> 1), което вероятно няма да си променя от нас, и нека ми давай сега и ФОРМАТ. Всъщност, това ще бъде по-малко визуално интересно. Нека го направим. За Int I = 0;> 0 - нека направим тази грешка - I + +. И нека не ФОРМАТ тук. Нека практикува това, което проповядва. Нека да има метод, невалидни хор, и ние ще кажем вътр аз, и след това аз ще кажа ФОРМАТ - не, нека да направим това по-интересно. Нека всъщност не печатате каквото и да било. Нека направим това: хор (I). Добре. Така че това е бъгав, защото защо? Правя това като отида, защото програмата не се прави нищо на интереси. Но това не е целта. Целта е да се напише програма, чиято основна функция какво прави, очевидно? Обадете себе си. И всъщност, ние не се нуждаят от цикъла. Нека дори да се опрости тази процедура, така че да не губим от поглед наистина фундаменталната бъг. Основни разговори хор да пее някои хор, след това направих нещо глупаво и имах хор хор повикване защото предположих, че някой друг ще може да го приложи, а сега и това няма да се съставят още. Имам нужда да правя това? Имам нужда от прототип, не забравяйте. Така че аз трябва да има тук хор невалидни (INT); Така че сега ако отида тук - всъщност, нека да използваме по-голям прозорец. Да вървим напред и да хор. Да вървим напред и да хор. Използване на недекларирания идентификатор. О, това беше глупаво. Ние не се нуждаем аргумент. Нека направим това. Иска ми се да започна този начин. Щеше да е много по-лесна програма, за да пиша. Има. Сега нека отидем да ми терминален прозорец, повторение звъня, и тук отиваме. Това беше много по-бързо. Какво всъщност се случи, нали? Е, сега аз ще добавя линията за печат, така че можем да видим. Позволете ми да кажа ФОРМАТ ("Аз съм тук") - няма променливи. Ще го оставя. Нека повторение направи. Нека ми повторение хор. И ... хайде. Продължавай. Като настрана, защо не го разби? Сегментацията е случила аномалията супер бързо преди. [Чува студент отговор] >> Точно така. Така че това отнема време да отпечатате, нали? Той просто отнема повече работа от страна на компютъра. И ето я: Сегментация вина. Така че забележите колко бързо програми се изпълняват. Ако не сте отпечатване на нещо, супер бързо. Но ние все още имам тази сегментация вина, защото това, което се случва? Ако смятате, че за това как паметта на вашия компютър е изложена, това се случи да бъде основният, но тук нека просто се обадете този хор, и нека го наречем този хор. И сега, ако ми естетика, това е просто ще кажа хор, хор, хор, хор, хор, хор, хор, реклама nauseum, и в крайна сметка, какво ще се случи? Ако голямата картина, буквално, е това, какво точно се случва концептуално? Стека превишаване на куп. Или още по-лошо, просто превишили всичко, включително и текста сегмент, което е 0s и 1s, които представляват вашата програма. Накратко, това е просто супер, супер зле. Вашата програма е спирала извън контрол. Вие използвате начин повече памет, отколкото сте възнамерявали всичко това е заради глупава грешка в този случай, или в този случай много внимателно направено функция се обажда. Сега, това не е чак толкова лошо. Функции, които се наричат ​​всъщност има голяма сила, когато го използвате правилно. Не съм го използват правилно. Така че това не е чак толкова лошо, но факта, че всъщност никога не съм спре сам призовава е основна слабост на тази програма. И така, къде отиваме с всичко това? Какво всъщност се случва? Когато аз наричам увеличение функция, като бяхме прави в тези примери, Имам стойност, като 1, че минавам инча Минавам с копие от номер 1, така че ще се случи следното. Да отидем в добавката за пример, този човек точно тук. Ето какво всъщност се случва. Когато аз наричам прираст и минавам с X, картинки, какво става тук. Ако имам стойността на 1 съхраняват тук и аз действително се наричат ​​нарастване, която сега се нарича хор - IPad ме хвърли тук. Нека наречем това увеличение, а ние не знаем какво ще бъде следващия функция. Така че, това, което всъщност се случва, е някъде тук в основната имам парче на паметта че е съхраняване номер 1. Когато аз наричам увеличение, аз съм с помощта друго парче на паметта, но сега имам копие от 1. Когато увеличите тази стойност, това става 2, но след това какво ще се случи веднага след като се връща на прираста? Тази памет получава върна на операционната система, което означава, че всичко, което съм направил нищо полезно. 1, който първоначално е бил, съдържаща се в основната всъщност все още е там. И така, къде отиваме с това? Оказва се, че в паметта имате тези бек-ту-бек поредица от байтове че можете да сложите неща, и се оказва, че вече сме виждали нещо , която включва пускането нещата назад, за да направите резервно копие на гръб до гръб. Какво е низ, въз основа на 1 седмица и сега седмица две? Това е просто колекция от символи. Така се оказва, точно както можете да поставите номера в паметта, По същия начин може да ви постави знаци в паметта. И след като ние започне въвеждането на героите в паметта гръб до гръб до гръб, Оказва се, че използването на най-простите неща, като за линия или цикъл, докато, можем да превъртите от ляво на дясно героите в низ и започнете да ги масажирате напълно различни герои - може да стане б, б може да се превърне в така, че в крайна сметка, ние можем да изречение на английски, че всъщност има смисъл и конвертирате всяка от тези писма една в даден момент като се разхождах из паметта на нашия компютър ляво на дясно действително криптиране. Така че нека да ни пет минути почивка, и когато се върнем, ще започнем този процес на кодиране на информация. Добре. Преди да се потопите в някои крипто и тези неща, наречени масиви, нека пауза за всякакви въпроси, защото имам чувството, че наистина вид на объркана някои от тези теми. Така че нека да се определи сега, ако можем. Току-що говорихме за връщане ценности, ние говорихме за аргументи, и ние говорихме за това понятие, които ще се върнат в следващите седмици да дойдат, за гледане на памет като един куп от тези подредени тави, така да се каже, от дъното нагоре, като че всяка тава, която получава на стека представлява функция, която в момента се нарича. Някакви въпроси? Позволете ми да задам един въпрос тук. Позволете ми да се опрости тази процедура обратно на това, което е било преди някои от по-рано Q & A. Фактът, че увеличение има отворена скоба, вътр номер, затворена скоба - какво INT брой? [Ученик] аргумент. >> Аргумент. Добре. Но това, което е аргумент? [Чува студент отговор] >> Какво е това? >> [Ученик] Нещо, което се преминава. Добре, така че нещо, което се преминава инча и по-общо, това е само на входа. Ако сте написването на функцията и целта на тази функция в живота е да се направи нещо по-различно всеки път, когато го използвате, тогава единственият начин това да се случи наистина изглежда да бъде, за да я предостави с приноса така че той може да направи нещо по-различно с този вход всеки път. Така че трябва да се определят две неща, когато функцията вход. Трябва да укажете името, което искате да се даде на този вход само за ваше собствено удобство, така че можете да се обърнете към него функция, която вие сами се пише, както направих аз тук в ред 32. Но вие също трябва да определите типа, тъй като C е език за програмиране че просто изисква, че ако искате променлива, трябва да кажеш на компютъра какъв тип данни, в голямата си част, така, че не знае колко бита да разпредели за тази променлива , защото тя може да бъде 6 - съжалявам, че не ще бъде 6. Тя може да бъде 16, тя може да бъде 8, тя може да бъде 32, дори 64, но компютърът трябва да знае. Сега, вътр отляво представлява това, което, за разлика от? [Чува студент отговор] >> Какво е това? >> [Ученик] Вид на функция. Видът на функцията и, по-специално, от вида на продукцията си. Точно така. Така че, като има предвид, че нещо в скоби представлява вход, ако има такива, нещо, наляво представлява продукцията си. И в този случай, нарастване очевидно връща Int и така число е типът на връщане на тази функция. Какво означава да се върнеш? Буквално, можете да използвате ключовата дума за връщане и след това, ако това, което се завръщат правото на ключовата дума е цяло число, това наистина е в съответствие с това, което сме обещали. Вие не може да направи нещо подобно - Здравей, свят - защото това е низ. Очевидно е, че не е цяло число. Така че по-кратко, тежестта наистина е върху нас, програмист, да бъдат конкретни на това, което ние сме връщането и след това действително да отида за да го върне. Контекстът тук сега е, че паметта на компютъра е един гигабайт, 2 гигабайта - каквото - може би това е повече, може би е по-малко, но компютърът го вижда като различни раздели. Нещо се там, нещо друго отива там, различни неща, отива в средата, и днес ние просто започват да разказва историята, но ние ще се върнем към това с течение на времето. За сега, само част от паметта ми пука за текста сегмент защото това просто представлява 0s и 1s, че звъня е изведен. Така че, когато стартира команда на клавиатурата като a.out или щракнете два пъти върху иконата на Mac OS или Windows, програмата се зарежда от вашия твърд диск в RAM и се пльосна в горната част на RAM на вашия компютър, така да се каже. Междувременно, тъй като вашата програма започва да работи и получава нарича в програмата, която пише или програма Microsoft или Apple пише, някой от неговите локални променливи в крайна сметка там в дъното на паметта на вашия компютър. Но ако основните разговори друга функция, която се има променливи или аргументи, те в крайна сметка над нея. И ако тази функция изисква нещо, те в крайна сметка над него, над него, над него. И само веднъж функция се извършва в изпълнение на купчина тави, така да се каже, започват да се получи по-ниски и по-ниски. И това е, което, накратко, обяснява защо, когато ти се обадя куб или ти се обадя увеличение, вие преминава в копие на стойността. И какво това означава, че картинката е, че сте буквално писмено номер 1 в друга част от паметта, промяна, че от 1 до 2 в случай на нарастване или 8 в случай на куб и след това хвърляне, че паметта веднага след като печалбата или връща куб функция. Въпрос. [Ученик] Къде са глобални променливи съхранява? Глобалните променливи се съхраняват в това, което в момента се нарича инициализирани данни или неинициализирани данни, Разликата е, ако имате глобална променлива и веднага я присвоите стойност със знак за равенство, тя се озовава на върха има и ако просто кажете INT х; без стойност, завършва малко по-ниска в RAM просто конвенция. Други въпроси? Добре. Така че тази картина ще се върне като вземем по-мощен с това, което можем да правим с компютъра, но за сега, нека да има кратко интро към криптография, определен тип криптография, това не решава всички проблеми на света но не решава някои от тях. В този случай, ние имаме нещо, наречено таен ключ, криптография. Тайният ключ, криптография, както подсказва и името, получава своята сигурност от една тайна. Например, ако сте се върнали в началното училище и преминаване малко писмо тайна любов момче или момиче смачкване, ако искал да предаде тази бележка през публиката, най-вероятно не би могъл да напише такава забележка на английски език или независимо от родния си език. Напротив, може да го криптира или може би просто да ги изпратите текстово съобщение, тези дни. Но всъщност може да ги предаде бележка в рамките на класната стая. И да направите това сигурно по такъв начин, че вашите приятели и учители не знам какво пишеш, може да излезе с доста прост алгоритъм, млад, въпреки че може да бъде, просто да катеря думи. Така че, вместо да пишете, можете да напишете б, вместо б можете да пишете в вместо в може да напише г, и така нататък. Или пък може да излезе с по-сложен превод на писма до различни букви. Но уловът е момче или момиче, на когото сте изпращане на настоящата бележка трябва да знае нещо, което е очевидно? >> [Ученик] Какво сте изпращане. Какво ви тайна е, подобно на това, което е, че съответствието между на и б и в и d'S. Е просто добавяне на 1 за всяка една от буквите, за да се премине от една, б б в? Е по-сложно от това? Така че вие ​​и вашият смаже трябва да има тази секретна информация, но има вид на улова-22 тук. Ако това е първият път сте изпращане на писмо чрез тази любов класа, как е, че момче или момиче трябва да знае каква е тайната дори е? Така таен ключ крипто не решава всички проблеми на света, и всъщност има връзка, че ние ще се върнем към края на семестъра. По същия начин не повечето от нас познава някой, който работи, например, в Amazon.com, И все пак много от нас вероятно купих неща на Amazon.com, и ние сме били научени да се предположи, че тези сделки чрез електронната търговия са сигурни. URL вероятно се казва, HTTPS, може би глупаво малко икона на катинар някъде, има някакъв вид на криптографията осигуряване на информацията за кредитната ви карта между вас и Amazon.com. И все пак, ако криптография включва знае някаква тайна и все пак аз не познавам никого в Amazon и аз със сигурност не сте подредили всякакъв вид тайна с някой в ​​Amazon, как е моя компютър или моят браузър по този начин? Оказва се, че и други видове криптография напълно, че решаването на този проблем. Но днес, ние ще се съсредоточим върху проста , където можете да подредите предварително да се знае някаква тайна като едно или няколко съответствието между а и б. И процеса на криптографията обикновено включва това. Имате някои обикновен текст, изобразен тук, в ляво, можете да го стартирате чрез някакъв алгоритъм или процедура за криптиране - може би това е просто става б, б се превръща в и тогава ще се окажете с ciphertext. Междувременно, след свалката си получава тази тайна бележка, той или тя трябва да го разшифровате от обикновено заден ход, че алгоритъм , така че да се върнем на обикновен текст. Има физически превъплъщения на това. Например, това е малко пръстен тайна декодер, и това е пръстен, в смисъл, че има два циферблата. На извън периферията на това нещо, има букви от А до Я, въпреки че те са в произволен ред, и от вътрешната страна, всъщност има някои номера такава, че с този пръстен може да вид се превръщат отвън, но отвътре не , за да се подредят числата с букви. От един филм, наречен A Story Коледа, ще видите, че малко Ралфи е толкова нетърпелив да разбера какво тайно послание Little Orphan Annie бе да го , които са били съобщени, мисля, че под формата на цифрови съобщения на кутия от зърнени култури и трябваше да се натрупват всички малки карти, които дойдоха в кутия от зърнени култури, трябваше да ги изпратим в, трябваше да се върна на тайна пръстен декодер , така че да може най-накрая да разбера какво картографиране е между букви и цифри или писма и писма. Как в един компютър може да отидем за прилагане или представляващи нещата по този начин? Ние се нуждаят от начин да се изрази малко по-гъвкаво от нашите променливи до този момент са разрешени. Имахме цели числа, имахме символа, имахме поплавъци и двойни и няколко други, но това са отделни части от паметта, които наистина не ни позволяват да изразяват неща като думи и изречения и фрази. Всъщност, ние сме наричат ​​такива струни неща, но обещаваме, че това е наистина само за опростяване в библиотеката CS50 че ние сме възнамерява да кори обратно. И така, нека да започнем да направя това тук. Нека вървим напред и да се отворят файл - всички тези файлове са на разположение, както обикновено, онлайн наречената array.c за решаване на проблема, несвързани с низове но това рисува картината тук на начина, по който може да се използва нещо, наречено масив. Масивът е тип данни. Това е един вид на вид променлива, която има множество по-малки типове данни вътре в него да направите резервно копие на гръб до гръб. Така например, ако искаме да се напише малка програма, която ви дава викторина средно за около 50, която има две викторини, може много лесно да напиша тази програма, основана дори на някои от миналата седмица материал с помощта на GetInt и няколко променливи: Int quiz1, вътр quiz2. И това е доста ясен. Това е може би 10, 20 линии на код максимален да изпълни програма пита потребителя за 2 викторина резултати и след това изчислява средната им да ги събере, се дели на две, а след това отпечатване на резултатите. Вероятно бихме могли да направим това доста лесно сега, след известен брой минути. Но проблемът е, че предполагам, че 50 3 викторини или 4. Да предположим, че искате да използвате една и съща програма за клас, които са имали седмично викторини. Помислете за клас, който е седмично викторини. Ако има 16 или седмици на семестър, сега имате 16 променливи: Int quiz1, вътр quiz2, INT quiz3, вътр quiz4. Веднага след като започнете да виждате този съкращения, това копиране и вмъкване на код, тя трябва да започне да ви накара да искал да има по-добър начин. И слава Богу, защото на масиви. Така че нека да го направим. Първо, позволете ми много просто нещо, което ние не сме използвали до този момент, но от време на време ще го видите в кода. Това е това, което обикновено се нарича константа. Така че това е константа в смисъл, че тази стойност никога не се променя. Човешкото конвенция при създаването на постоянен е да се използват всички главни букви, така че тя наистина се откроява в кода си, и специалната ключовата дума, която използват в C # определят. Затова ние казваме # определят, след това интервал, а след това думата, която искате да използвате за името на константата и след това стойността на константата. Забележете, това е различно от възлагане нещо на променлива. Не е знака за равенство, няма точка и запетая. Това е онова, което обикновено известен като препроцесор директива, но повече за това друг път. За сега, това създава неизменна стойност, наречена викторини , чието действително числова стойност е 2. Така че навсякъде, където видите викторини, тестове, викторини целия този файл, това е само номер 2. Ако гледам в основния сега, нека да видим как работи това. Първо изглежда малко загадъчен, но това е всички неща от седмица 1. Попитайте на потребителя за степени. Как да постигнем това? В ред 22 - това е наистина сочен част - обяви плувка но не само един поплавък. Аз деклариране, а по-скоро набор от плаваща запетая стойности. Тази променлива се ще се нарича степени, като подразбиращи се тук, но само част от нов синтаксис и след това са тези квадратни скоби. Фактът, че аз съм казал флоут степени и след това отворете конзола и после брой - забележите, ако това е постоянна, това е точно като направихме това - това означава: "Хей компютър, ми даде две плувки и нека заедно ги наречем клас". Това е в контраст с много по-досаден процес, като: поплавък grade1; плаваш grade2, и така нататък. Така масив ни дава възможност за прилагане на тази идея, но много по-малко messily по такъв начин, че ние може да напише една линия на код, вместо, да речем, 16 за 16-седмичен семестър. Аз не искам на твърдия код 2, защото ако си мислиш за това сега логично, Предполагам, че следващата година CS50 промени в три викторини вместо и аз имах номер 2 тук, имах номер 2, Имах номер 2, номер 2. Това става много досаден и много лесно да се притеснявам и случайно да променят 1 стойност 3 и пропускат някои друга стойност от 2. Така че аз ще вместо абстрактно това далеч и използват тази константа, Както подсказва името му, никога не се променя. И сега, без значение дали имаме различни викторини тази или следващата година, Аз просто трябва да го промени на едно място тук най-отгоре. Така че всичко е константа. Междувременно, нова концептуална черта е, че на масив. Така че квадратните скоби ми даде толкова много плувки и ми позволява колективно ги наричат ​​степени тук. Така че сега нека видим какво ще правя. Тук, в линия 24 е началото на контур. Това е наистина нищо фантазия. Това е просто използвате викторини, вместо на хард-кодиран номер. Но няма нищо интелектуално различен от миналата седмица. Това е само ФОРМАТ, така ФОРМАТ ("Quiz #% г% г:") защото аз просто искате да разпечатате, за да ми даде викторина номер 1 от 2 и 2 от 2. Така че това е чисто естетически нещо. Но интересната част е в ред 27. За да се попълнят в една от двете контейнери с плаваща запетая стойност, отново използваме квадратни скоби. В този случай, аз използвам, защото това за цикъла започна със равна на каква стойност, очевидно? [Ученик] 0. >> Малан 0. Така на първата итерация на тази линия, това е като че ти пиша това в кода, но на втория повторение на този цикъл, той като че ли съм написал това в моя код. Но факта, че аз съм с променлива е добра, защото, както подсказва и името, е различна стойност на всяка итерация, така че аз съм пълнене този масив едно място в даден момент. Какво означава този масив изглежда? Причината да привлече супер проста правоъгълник на екрана, преди да е поради тази причина. Масивът е просто парче от паметта, последвано от друго парче на паметта последвано от друго парче на паметта и така нататък. Така че, ако ми масив е с размер 2 в този случай тук, всичко, което ще се прави , като напишете в моите викторина резултати харесва тук - имам 100 на този един и след това аз имам 99 на тази - тогава тази памет не може дори да се използва, защото аз съм само зададен компютър за масив с размер 2. Тези квадрати са все още там, нали? Вие все още имате 2 гигабайта RAM, дори ако сте само питам за две плувки. Така че идеята зад масиви е, че компютърът отнема само парче на паметта и след това разпределя на малки парчета, за да направите резервно копие на гръб до гръб. И така, това е масив. Това е свързано парче от вътрешна памет, от които можете да сложите нещата. Това се случва, след това да се направи само някои скучни аритметика. Ако превъртете надолу, това е мястото, където след това обхождане на масива. Идвам с сумиране на всички стойности в масива, и след това използвайте кръгла функция тук, за да се прави сумата, разделена на викторини. Но позволете ми махна с ръка, че като вид достатъчно аритметика за сега. Но всичко, което прави за мен в крайна сметка се изчислява средна стойност. Така че първата викторина плюс втората викторина, разделен на две и след това ги извежда като вътр. Но нека сега преход към различен пример string1 който рисува подобна картина, но с помощта струни. Позволете ми да отида напред и да се опрости тази процедура само за миг. Прости отстъпа за сега. Обявлението в ред 19 на този пример, аз се низ от потребителя. Но забележете какво съм следващия прави линии 22 нататък. Аз съм всъщност итерации от първа до - и това е нов трик - strlen, дължина на низ. Това е функция, която идва с C, че ако го премине низ тя ви казва колко знака са в тази струна. Това е всичко. А фактът, че това е strlen вместо низ дължина е само защото тя е по-кратка. Тридесет години назад, хората обичаха да пишем за неща, колкото е възможно по-накратко, така че спазихме тази конвенция. + + просто означава, че се увеличава в всяка итерация. И сега да забележите това, което е наистина интересно. В съответствие 24, аз казвам, "Computer, ми даде знак, 8 бита, и го наричат ​​в". Но какво е това на дясната страна казва? На английски език, какво значи това? [Ученик] Първият знак в масива. Точно така. Дай ми първия знак в масива. Или, по-общо, дай ми ItH характер в масива. И осъзнават, че е важно, че сега като компютърни специалисти, ние всъщност се брои от 0. Вие нямате право на преценка сега, за да започнем да правим това. Сега трябва да се държат в съответствие с очакванията на компютъра и да се брои от 0 защото [0] ще бъде първият знак в низ, [1] ще бъде втората, [2] ще бъде на трето място, и така нататък. Така че тази програма, ако мога да го компилирате, това е отново string1, така че се string1, и сега съм управлява string1 в моя терминален прозорец. Чака за вход, така че аз ще трябва да въведете в Дейвид, въведете, и сега го отпечатва Дейвид по различни линии, тъй като предизвестие за това, което правя. Аз отпечатване на един символ в даден момент. Ние няма да навлизам в подробности днес за това, но аз изтрит момент преди тази проверка. Оказва се, че ако потребителят се държи добре, състезателно, или просто объркани, всъщност може да не успее да даде поредица от малко по-дълго. Ако натиснете грешен клавиш от клавиатурата, може да не дават низ на всички, или ако сте злонамерени, можете да опитате да поставите в един гигабайт на есе да се запълни тази струна, а ако компютърът работи на паметта, Оказва се, че отива да се върна тази особена стойност NULL. Така че за сега, просто знам, че я има тази особена стойност, наречена NULL която ще ни позволи да се провери, когато сме на паметта, наред с други неща. Но ако отворя сега МНОЖ2 забележите една разлика тук. Забележете една разлика с МНОЖ2. С МНОЖ2, това за цикъла е малко по-различно. Позволете ми да изтриете нулата, така че можем да говорим за друго време. Какво е различно контур за това време? Мога да се върна към предишния пример. Така че това е версия 2, това е версия 1. 1, 2. 1, 2. Strlen покана е къде? Това е първата част от линия за. Някакви идеи защо аз правя това? Да. [Ученик] Значи не извикате функцията всеки един момент. [Малан Така че ние не извикате функцията всеки един момент. Точно така. Спомнете си за електрически вериги, които те са супер просто след като се разбере, че това е инициализация, състоянието и актуализирането. Проблемът е, че състоянието се случва на всяка итерация на цикъла. И така, в този пример тук, това, което е лошо за факта, че това е моето състояние? [Студент се обаждате strlen. Малан] се обаждате strlen отново и отново и отново. Но след като сте въвели в Дейвид, дължината на този низ е 5, и това няма да се промени на всяка итерация на цикъла защото низ е все още D-А-V-I-г. Така че това е намек какво ще стане все по-важна идея известен като дизайнерско решение, където просто не правят компютъра излишна работа. Точно както закрита прожекция на pset2, pset2 в стандартното издание ще ви предизвикателство за реалното изпълнение известен брой шифри, известен брой на криптиращи алгоритми, така че можете да криптирате и дешифриране на секретни съобщения много прилича на Ралфи декодирани. В хакер издание на pset2, ние ще отидем малко по-нататък. Ние ще ви предаде на файл от действително компютърна система , която съдържа един куп на потребителско име и действителните криптирани пароли, и предизвикателство за хакер издание ще бъде да се справи тези пароли и да разбера криптография или каква тайна е бил използван за да генерират тези пароли. И ние ще направим това с помощта на нова функция на C че аз ще ви дам демо известен като аргументи от командния ред. Оказва се, тъй като някои от вас може да види в раздел или в учебниците, Основната не винаги трябва да бъдат анулирани в скоби. Оказва се, че основната могат да бъдат написани по този начин, с два аргумента, argc и argv, където argc е броят на думите , който въвеждате след името на програмата на командния ред и argv е истински думи. И тъй като квадратните скоби там предполагат, argv е очевидно масив. Ще бъде низ след низ след низ в паметта. И така, какво ще да бъде в състояние да направя, като се започне с pset 2 е нещо подобно. Ако успея argv1, което е пример, ние ще се върнем в понеделник, и да го стартирате, забележите, че той не изглежда да се направи нищо все още. Тя просто отпечатва свое име. Но ако кажа сбогом клас, забележете, че тази програма очевидно повтаря над всяка от думи, които са въведени в командния ред. И средствата, чрез които ще получат достъп с думи, които потребителят е въвел в командния ред е чрез промяна на основната отправна този уикенд от INT главната (недействителни) INT главната (argc, argv) и по този начин ще се роди аргументи от командния ред. И след като получи много по-умели в това, вие ще бъдете в състояние да напише наистина trippy програми като този тук, който е над и отвъд част от функционалността сме направили до този момент, но доста мощен. Така че ние ще оставим това с този на екрана, и ние ще се видим в понеделник. [CS50.TV]