[Powered by Google Translate] [Недела 2, продолжение] [Дејвид Џ Malan, Универзитетот Харвард] [Ова е CS50. - CS50.TV] Во ред. Ова е CS50, и ова е крајот на недела 2. Ако очекувате да бидат гладни за околу ова време утре, знаат дека ние ќе свика како мала група утре, четврток 13:15. Има овој URL тука ако сакате да RSVP. Просторот е ограничен, па молам прости ако форма е исполнета од страна на време да го пополните ова. Друга рачно, сепак, тоа може да биде од интерес е ова. Во само за времето еден месец, курсот ќе бидат ставени на располагање сите пошироко преку edx, преку која луѓето на интернет ќе бидат во можност да го следат заедно, се вклучат во текот доста активно, во факт. Тие ќе биде со користење на CS50 апарати и CS50 Дискутирај и повеќето од различни софтверски алатки, кои веќе биле со користење на овој семестар. И една од иницијативите ние би сакале да ја преземат како експеримент оваа година е да се види колку содржина што може да го преведе во други говорен и пишан јазик. Па ако има интерес за учество во овој проект при што ќе обезбеди Македонски записници и преводи за предавања на курсот и шорцеви, семинари и делови и слично, ако зборувате течно или пишувам течно некој друг јазик, ние би сакале да ви се вклучат во овој проект со кој ве однесе на една или повеќе од видеа, преведувајќи ги во јазикот знаеш доста добро. Да ви даде чувство на интерфејс, постои овој веб-базиран кориснички интерфејс дека ние ќе биде со користење дека ќе создаде основа на графичката околина како оваа. Ова ме настава некои Ноќта на вештерките пред и на десната страна има во црно до овие временски поштенски марки, ќе видите разни нешта кои излегоа од устата ми тој ден, а потоа под неа ќе бидат во можност да се преведат на друг јазик токму она што мапирање е меѓу нив, во овој случај, англиски и, да речеме, шпански. Значи тоа е всушност многу лесен алатка. Можете да ја премотам касетата и брзо напред многу лесно со кратенки на тастатурата. Значи, ако би сакале да земат учество во овој експеримент и да имаат вашите зборови се гледа и чита од потенцијално илјадници луѓе таму, ве молиме да се чувствуваат слободни да учествуваат. Еден збор за маче од понеделник. Да не ги испратија премногу страшно порака, сфаќаат дека, како работното време сугерираат и како делови сугерираат, дизајнот на курсот е многу дека студентите соработува и да разговараат со работа преку проблемот поставува и проблеми заедно, и навистина линија само се сведува на, повторно, работата ви конечно поднесе да биде свој. И така сосема искрено, во работното време тоа е сосема нормално, Тоа е целосно да се очекува дури и да биде во разговор со некој пријател до тебе. Ако тој или таа се бори со некоја тема и сте како, "О, добро, дозволете ми да ви даде увид во некои линија на кодот кој напишав," тоа е во ред, што се случува, и тоа е многу погодна, мислам, со процесот на учење. Каде што линијата добива преминал е кога главата е вид на навалена над тука за премногу секунди или минути за тоа навистина да имаат само беше деблокира можност за вашиот пријател, и секако кога работите се разменуваат преку е-мејл и Dropbox и слично, таму е на линија. Па со сите средства се чувствуваат удобно и се чувствуваат охрабрени да разговарате со пријателите и соучениците за psets и повеќе и само сфатат дека она што на крајот ги достават навистина треба да биде производ на вашата креација, а не некој друг. И така еден од домен-специфични проблеми за pset2, кој ќе излезе кон крајот утре вечер, е да се нурне во светот на криптографијата, која е уметност на енкрипција или scrambling информации, и овој на крајот се однесува на светот на безбедноста. Сега, безбедноста за повеќето од нас доаѓа во форма на прилично досаден механизми. Сите од нас имаат кориснички имиња и лозинки, и сите од нас имаат многу лоша кориснички имиња и лозинки, најверојатно. Ако вашата лозинка е иста на повеќе веб-сајтови, тоа не е веројатно најдобрата идеја, како ние ќе разговараме кон крајот семестар. Ако вашата лозинка е напишано на леплива белешка - не е шега - на вашиот монитор, и тоа не е секогаш најдобар дизајн но прилично честа појава. И ако не сте го користите криптографија за да го криптирате вашите лозинки, тие се особено ранливи. Значи, ако мислите дека сте се супер паметни со еден скриени Word документ некаде на вашиот хард диск кој ги има сите на вашите лозинки но тоа е во папката каде што никој нема да се погледне во, и тоа не е многу сигурен механизам. И уште па што pset2 ќе се воведе е оваа уметност на криптографијата и scrambling информации, така што работи како лозинки се сите посигурни. Контекст тука е дека со несигурни податоци доаѓа можност да го криптирате и да го трка. Па така ова, на пример, е пример на шифрирана порака. Ова всушност кажува нешто на англиски, но тоа не е јасно целосно очигледни. И ние ќе доаѓаат полн круг денес да ги разграничат што оваа тајна порака тука е. Но, во реалниот свет на компјутери, работите дури и не изгледа како тие би можеле да бидат Македонски фрази. На пример, тоа е она што може да се најдат на стандарден Linux или Mac или UNIX компјутер во датотека која беше еднаш едно време се нарекува лозинка датотека. Денес тоа е се пресели во други места. Но, ако погледнете во право место на системот, ќе видите не само вашето корисничко име или на други луѓе на системот, но ќе видите шифрирана верзија на нивните лозинка. Всушност, зборот криптата има сугерира дека следните работи е криптирани, и оваа серија на навидум случајни букви и карактери и броеви и така натаму може да се декриптира само со обично знае некои тајни - тајна збор, тајна број - и така навистина, уметноста на криптографија на крајот се сведува на доверба на некој вид и знаејќи нешто што некој друг го прави тоа. Па ние ќе се истражуваат ова во малку повеќе детали денес и во pset да дојде. И сега еден збор на Поминете / не. Особено како што некои од вас имаат нурна во pset1, апаратот, и многу нов свет за себе, сфаќаат дека фрустрации и конфузија и само технички проблеми се доста да се очекува, особено со првиот pset, каде што има толку многу нови, само запознавање со ls и CD и сите овие таинствени команди и нова средина, а тоа е одделен од вистинските материјал и програмирање себе. Така сфаќаат дека премногу секако дека постојат работното време кои постојат како поддршка структура. Делови започне ова доаѓа недела. Но што е најважно, ако сте чувство само дека ова не е светот за вас, сфатат дека тоа навистина само треба време. И не беа за оваа можност години за мене за преземање на една класа Поминете / не, Искрено, јас никогаш не би се ни стапнал во училница. И можете да го промените овој до, да речеме, на петтиот понеделник на курсот, па ако сте на работ сега, сфати дека наместо главата во некои други води целосно, да сигурно се разгледа само промена на Поминете / не. Повторно, не е навистина оваа култура тука на Харвард за преземање на работите Поминете / не бидејќи сите навистина сака да се постигне или overachieve, но искрено, ова е прекрасен начин се обидува нешто кој не може да биде запознаен за вас, и ќе заврши тоа, во повеќето случаи, сосема во ред, можеби многу да ги изненади. И во повеќе конкретни смисла, она што мислам дека Поминете / не генерално не, особено како што можеби сте искусни со pset0, ако се стави во 10 часа, 15 часа, 25 часа во некои pset а ти си само удира главата на ѕидот и станува супер доцна во ноќта но сте донесени во pset 90% од патот и едноставно не можете да дознаам нешто, Поминете / не навистина се на работ надвор од класа вака, каде што може да се најде на среќно рече: "Добро, знам дека тоа не е совршен, но јас работев мојот газ надвор од ова, јас сум прилично задоволен со тоа заврши " и дека ќе одговори на очекувањата за Поминете / не. Значи се задржи дека во умот. Во ред. Значи оние од вас кои се борат да го користите Универзитетот Харвард Wi-Fi, знам дека има CS50 SSID, Wi-Fi конекција, лебдат околу дека можете да имате подобра среќа за. Тоа е малку ироничен дека лозинката за ова, ако би сакал да се обиде поврзување на овој за подобра брзина - и ги споделите со нас, ако тоа не е подобро - е 12345, сè до 8 затоа што 8 е побезбеден од 5. Значи, ако ви треба за Wi-Fi лозинка, поврзете се CS50 безжично тука, 12345678, и пост на CS50 Дискутирај ако сеуште имаш наизменичното поврзување прашања, и ние ќе нека сили, кои се знаат за овој простор. Во ред. Значи брз закачка, особено за оние од вас кои се вентилатор момчиња или девојки на сите нешта на Apple. Она што јас откопани од неколку години назад беше оваа датотека тука, iUnlock.c, само за да вид на направи повеќе конкретни и посложени некои од повеќе основни C програми ние сме пишување. Па јас отвори оваа датотека, iUnlock.c. Тоа е на располагање на Предавања страница за денес. Од левата страна ќе видите долга листа на функции. Значи колеги, кои го е создал овој напиша до голем број на функции, повеќе отколку само главните. Тој се користи целиот куп на библиотеки тука, и ако почнеме лизгање низ, што е ова всушност е е прв, верувам, пукнатината за оригиналниот iPhone. Кога си сакал да jailbreak оригиналниот iPhone, што значи untether тоа од AT & T а всушност инсталирате посебен софтвер на него и го направи она што Apple не сакате луѓето да се направи, некој малку време да дознаам како точно тие би можеле да ги искористат софтвер пропусти, грешки, грешки, во Apple софтвер, и на тој начин се роди iUnlock.c-- дека ако тоа Составувач на вашиот компјутер и инсталиран со излез на iPhone кој беше поврзан со вашиот компјутер преку, на пример, USB кабел, ова ќе ви даде административни или root привилегии на вашиот iPhone и нека ви направи доста што сакаш. И така не беше оваа фасцинантна мачка и глушец игра помеѓу Apple и на остатокот од светот, особено како тие, како и многу компании, обидете се да се заклучи своите работи надолу така што само може да прави со него што тие имаат намера. Но, благодарение на луѓе како овој и разбирање на ниско ниво на детали - и во овој случај C програмскиот - и многу од познатите конструкции дека ние сме почнале да играат со, вие сте во можност да навистина потпора на хардвер на начин што ви одговара и не мора да значи некои правно лице. Така на пример, немам поим што сето ова се прави, но GetVersion звучи прилично јасен, и тоа изгледа како тоа е функција која овој човек напишал. Таа ги зема некој вид на број како аргумент, не враќа ништо, но се чини дека јамка со за јамка тука и ако состојба, ако услов пауза, и некако се однесува на верзијата на броеви ако се движите надолу, иако многу од овие клучни зборови се случува да бидат нови. И има едночудо функции тука ние никогаш не сум видел и може да не некогаш видите во текот на семестарот. На крајот на денот, ја следи истите правила и логика дека ние сме се игра со досега. Значи ова е премногу стари за да попуштат вашиот iPhone 3s или 4S или наскоро 5s овие денови, но знам дека сето тоа е многу произлегуваат од овој свет дека ние сме се нурна во. Ајде да ги погледнеме во малку повеќе едноставен пример: ова, само за да се загрее со некои синтакса и некои други тип на податоци дека ние сме зборуваше за, но навистина не гледа во C. Ова е датотека наречена positive1.c, а според коментарите на врвот, тоа само бара корисникот да обезбеди позитивен број. Така, тоа е пример на не-додека јамка, што е убаво за корисникот интерактивни програми каде што треба да му кажете на корисникот да се направи нешто, и ако тие не соработуваат сте развикам нив или одбие нивниот придонес. Случај во точка: Јас идам да се направи линии 19 преку 24 толку долго како корисникот не ми даде позитивен број. Овој детал тука on-line 18, зошто Изјавувам n над целата оваа looping изградба за разлика веднаш до линијата 22, каде што всушност се грижи да се добие n? Да. [Студент] фреквенции. >> Да, па ова прашање од опсегот. И во однос на Едноставен, што значи обемот однесуваат? Да. >> [Нечујни студент одговор] >> можете да зборувате малку погласно? [Студент] Каде можете да пристапите таа променлива. >> Перфект. Каде можете да пристапите одредена променлива. И генерално правило досега е дека обемот на некои променлива е дефиниран од страна на најновите кадрави загради дека сте виделе. И така во овој случај, ако сум направил грешка на прогласување n on-line 22, таа линија ќе работат. Јас ќе добие int, и јас би го стави во таа променлива n во линија 22, но кој линија од код сега ќе немаат поим што зборувам? >> [Студент] 25. [Malan] 25, и испоставува 24, како и затоа што во овој случај тоа е надвор од тркалезните загради. Па само малку непријатност, но многу лесно да се реши со едноставно декларирање на променлива надвор од самата функција. Ќе видиме подоцна денес може да оди еден чекор понатаму па може дури да се добие малку мрзливи. И ова не е да се препорача во целина, но дури и да се мрзливи и стави променлива глобално ниво, така да се каже, не внатрешноста на функција, не внатрешноста на еден циклус, но во самата датотека, надвор од сите функции што сум напишал, како што го направив тука on-line 15. Ова е генерално се намуртен врз, но сфати дека ова е решение понекогаш до други проблеми, како што ние на крајот ќе видиме. Значи сега за сега ние ќе го оставиме вака, но ајде да видиме дали можеме да ја преработи оваа само да се започне се изразуваат малку поинаку. Оваа програма, само за да биде јасно, е positive1. Дозволете ми да оди напред тука и во мојот терминален прозорец направи positive1, Enter. Компајлира во ред. Одам да се кандидира positive1, хит Enter. Барам да ми даде позитивен цел број. Јас ќе кажам -1. Кои не работат. 0, 99. Тоа изгледа да се работи. Можеби не најригорозните тест, но барем тоа е убаво разумност проверка дека ние сме на вистинскиот пат. Па сега дозволете ми да оди напред и да се отвори верзија 2 на овој, и она што е различно веќе? Ги спроведува истото, но она што е скокање како јасно различни овој пат? Ова bool во зелена боја. Тоа е истакнат во зелена, овој клучен збор познат како bool, кој е тип на податок. Тоа не доаѓа вграден со сите верзии на В Вие треба да вклучите специфични библиотека. Во нашиот случај, јас вклучени CS50 библиотека, така што ќе имаат пристап до bool. Но, во линија 18, ние се чини дека имаат Булова вредност тука наречен благодарен. Би можел да се јави оваа ништо, но јас го нарече благодарен само за да вид на пренесе некои семантичко значење. Значи на почетокот на линијата 18, јас не сум очигледно благодарни бидејќи Булова вредност благодарен е иницијализиран на false, во согласност 18. И тогаш, се чини она што го направив тука во линии 21 преку 23 е јас сум само вид на препишува и повторно мојата логика. Па нема функционално различни, но во линија 22 сега проверите дали int корисникот има обезбедено е поголема од 0, тогаш јас едноставно променете ја вредноста на благодарен на true. И зошто да го направам тоа? Бидејќи во линија 25, очигледно, ќе одам да се провери состојба. Дали овој циклус додека благодарен е лажна. Па јас предложи ова како алтернатива на верзија 1 затоа што тоа е барем малку повеќе интуитивна можеби тоа е малку повеќе втемелени на англиски јазик. Затоа направете го следново додека не сте благодарни или додека благодарен е лажна. И овој пат премногу Јас очигледно не се грижи да се запомни она што корисникот внесе во бидејќи известување нема променлива n, па всушност, малку бела лага тука. Функционално, на програмата е малку поинаква откако ќе се дојде до дното на тоа бидејќи јас не сум сеќавајќи се што n е. Но јас сакав да покажат тука дека иако видовме GetInt и GetString се користи од десната страна на еднаквите знаци досега така што ние се сеќаваме на вредноста, технички, тоа не е строго неопходно. Ако за било која причина едноставно не се грижат за зачувување на вредноста, само сакате да се провери вредноста, забележите дека ние едноставно може да се напише тоа како GetInt, отворен paren, во близина paren. Таа функција ќе се врати на вредност, како ние сме биле изјава. Тоа ќе ти го врати на инт. И така, ако ментално мислам на ова случување, кога ќе напишете 99, GetInt враќа бројот 99, и така концептуално, тоа е како да мојот код, всушност ова. Значи, ако 99 е навистина поголема од 0, тогаш благодарен станува вистина, тогаш линија 25 сфаќа ooh, ние сме направиле бидејќи јас сум сега благодарен, и во согласност 26, ние едноставно се каже, "Ви благодариме за позитивен цел број!" што и да се случи да биде. Сега ајде да направиме мала синтаксички шеќер тука, така да се каже. Ајде да видиме дали можеме да се исчисти оваа линија 25 со овој третата и последна варијанта во positive3. Забележите само разликата сега е она што линија код? >> [Студент] 25. >> [Malan] Да, 25. И ние не сме навистина видел овој трик само уште, но ние го видите фантастичен точка на Понеделник, што значи што? >> [Студент] Не. >> Не или негација. Така да Булова вредност и флип својата вредност. Точно станува лажни, лажни станува вистина. Значи ова, јас би им предложил е дури и малку повеќе интуитивна начин на пишување на кодот бидејќи јас се уште се иницијализира благодарен на false, јас се уште го направите следново, Јас во собата благодарен на точно кога ќе дојде време, но сега може да се навистина само преведе овој код вербално лево кон десно, додека (благодарен!), бидејќи тресне или фантастичен точка означува поимот не, па додека не благодарен. Значи, повторно, ние не имаат воведено нови концепти сама за себе. Зборувавме за Booleans назад кога игравме со нула, но сфати сега ние само може да почнете да пишувате нашиот код во многу различни начини. Значи особено во pset1 ако сте вид на се борат да дознаам начин да се напише некоја програма, шансите се ти си во среќа, бидејќи таму може да биде било кој број на решенија што може да се случи по. На пример, ова е само 3 дури и за наједноставните програми. Во ред. И сега се сети во понеделникот тргнавме на оваа забелешка со враќање вредности. Значи за прв пат ние напиша програма која не само што мора главна; Таа, исто така има свои сопствени функција што напишав тука. Значи во согласност 31 до 34 сум спроведува коцка функција. Тоа не е комплекс. Тоа е само * a * a во овој случај. Но, она што е важно за тоа е дека јас сум земајќи влез во форма на и јас сум се враќаат излез во форма на * a * a. Па сега имам способност, слично како јас се користи да со prinf сам, да се јавите на оваа функција со повикување на коцка функција. И коцка функција зема некои влез, и коцка функцијата враќа некои излез. Спротивно на тоа, printf само направи нешто. Таа не се врати нешто што ние се грижи за, иако Како настрана, тоа не се врати на вредност; можете само генерално ги игнорираат. Printf само направи нешто. Тоа беше пропратен ефект на печатење на екранот. За разлика од тука, имаме коцка функција, која всушност се враќа нешто. Така и за оние кои се запознаени со тоа, тоа е прилично јасна идеја. Но, за оние кои се помалку запознаени со оваа идеја за полагање на влезови и добивање назад излези, ајде да се обидеме само нешто супер едноставен. Дали некој удобно доаѓа на сцената кратко? Треба да се биде удобно со камера за вас, како добро. Да? Во ред. Што е вашето име? >> [Студент] Кен. >> Кен. Во ред. Кен, ајде до. Ken ќе биде во функција на сорти тука. Ајде да одиме напред и да го направите тоа. Да се ​​добие малку фенси. Убаво да ви се исполнат. Добредојдовте во центарот на вниманието. Во ред. Да го погоди ова копче тука. Во ред. Значи тука имате модерна таблата, и она што сум е главната функција, на пример, и јас немаат iPad во мојата рака. Јас навистина не се сеќавам како да - Па, не можам да кажам тоа. Јас навистина не имаат добри ракопис, и поради тоа сакам да печати нешто на екранот за мене. Јас сум се главната програма, и јас одам да си кажам ова со пишување на тоа во мојата пилешки нула и потоа полагање на влез. Значи глупо иако оваа вежба е, идејата на функции и повик на функција и враќање на функцијата навистина се сведува на тоа. Јас сум главен, јас сум само напишан printf, цитат-unquote нешто на екранот, Јас сум водење на оваа програма, и штом printf добива нарекува, тоа трае еден аргумент или еден параметар понекогаш меѓу двојни наводници. Тука е тој аргумент. Јас сум го поминува на Кен. Тој е црна кутија напишани некои број на години дека очигледно знае само како да се печати работи на екранот. Значи изврши. Тоа не е лошо. Многу добар. Па сега Кен е направено извршување. Дали тој треба да ме предаде ништо назад? Не дека ние сме виделе досега. Повторно, printf всушност не се врати на број, но ние ќе го игнорираат тоа, за сега бидејќи ние никогаш не сте го користеле. Значи тоа е тоа за Кен. Па сега главната презема контролата на програмата повторно бидејќи таа линија на кодот, printf, е направено извршување. И ние одиме за нашата начин, извршување она што другите линии се таму. Па сега ајде да се обиде малку поинаков пример. Овој пат тука ајде прво го исчистите екранот, и овој пат ние ќе го стори местење Рубикова коцка функција, но овој пат, очекувам излезна вредност. Значи, да оди напред и да го направите тоа. Сега имам една линија од код кој вели x добива коцка на x. На линија код, се потсетиме, изгледа вака: x = коцка (x); Па, како е ова се случува на работа? Ајде да одиме напред и да ви даде бел екран повторно. Одам да се запишам сега вредноста на x, што во овој момент во времето случува да биде, да речеме, 2 до Нека биде едноставно. Имам напишано долу на парче хартија вредноста на 2, кој е мојот вредност х. Јас го предаде на Кен. >> И јас само пишувам одговорот? >> Да, ајде да напишете одговор. Во ред. И сега тој има да ми се вратат нешто. Совршена. Убаво segue. Па сега тој ми подава назад вредност од 8 во овој случај, и што да правам со неа? Всушност - да видиме, го добивате ова право. Што сум јас случува да се направи со неа? Сега ќе одам да ја искористам оваа вредност, а всушност се чува во истите тие битови во меморијата. Но забележиш јас сум вид на борба тука. Јас сум малку збунет, бидејќи каде можам да всушност пишува вредноста на x, затоа што сум само направено е физички страна Кен парче хартија што го има вредност 2, кој беше x, и навистина, тоа е токму она што се случи. Значи излегува дека кога ќе се јавите на функција и да помине во расправија како здраво, свет или да помине во расправија како 2, генерално, ти си поминува во копија на тој аргумент. И така јас како што запиша број 2 тука и предаден до Кен, кои мора да значи дека сè уште имам копија од вредност 2 некаде бидејќи навистина, сега дека сум добил назад вредност 8, јас треба да се врати во RAM меморија а всушност ги запишувам 8 каде што некогаш имале бројот 2. Така визуелно, се сеќавам на овој поим за полагање во, буквално, копија од вредност. Кен прави неговата работа, ми подава назад нешто - во овој случај вредност како 8 - а потоа морам да направам нешто со таа вредност ако сакам да се задржи околу. Значи сето ова ќе се вратам да биде премногу запознаен пред долго. Ви благодарам многу за оваа демо тука, Кен. [Аплауз] Многу добро направено. Ајде да видиме како што на крајот се однесува на некои од функцијата повик дека ние сме биле прави тука. Дозволете ми да оди напред и да ни донесе назад во местење Рубикова коцка пример тука. Забележете дека ако сакаме да всушност започнете преземањето ова понатаму, ние ќе мора да биде свесен за фактот дека бројот x тоа е се помина во тука е различен од она што всушност се донесе во функција. Значи, повторно, ова помине копија ќе стане доста соодветен за само еден миг. Ајде да ги разгледаме во нешто што сосема не работат и уште. Одам да се оди напред и да се отвори една третина кабриолет пример, кој е невистинит по природа, и се вика buggy3 и спроведува Замена функција. Тука имаме главна функција што x и y произволно иницијализиран на 1 и 2, соодветно. Ние може да се користи GetInt, но ние само треба едноставна вежба, па тоа е хард-кодирани како 1 и 2. Во линии 21 и 22, што очигледно испечатите x и y, 1 на линија. Потоа на линија 23, тврдам јас сум Замена овие вредности, точка, точка, точка. Јас очигледно се јавите на функција во линија 24 т.н. swap што се 2 аргументи. Тоа е целосно legit за функции да се земе 2 аргументи. Видовме printf го направи тоа веќе. Значи swap очигледно зема x и y, и како што сугерира името, Се надевам дека тоа нема да се разменуваат овие 2 вредности. Па тогаш тврдам on-line 25 "заменети!" и јас сепаратите x и y под претпоставка дека тие навистина се сменил. Но, ако јас всушност ја извршите оваа програма - дозволете ми да се отвори прозорецот на терминалот, дозволете ми да buggy3 - како што сугерира името, ова не се случува да се стави крај и бидејќи кога ќе притиснете ентер, забележите дека x е 1, y е 2, а сепак на крајот на програмата, тие се уште се, всушност, иста. Па врз основа на демонстрација токму сега со Ken, она што всушност се случува? Ајде да се нурне во оваа swap функција. Тоа е супер кратко. Тоа е само неколку линии на код долго. Но она што е суштински проблем врз основа на едноставни приказна раскажана се тука со Кен? Зошто е трампа скршени? [Студент] Ти си чување на копија, а не променлива. Точно. Ние сме чување на копија не, променливата себе. Со други зборови, swap очигледно зема 2 аргументи, на int, и тоа е произволно наречен a и b, и до тука сум донесен во x и y, кои се соодветно 1 и 2, но јас не сум буквално поминува во x, не сум буквално поминува во y, Јас сум поминува копија на x и копија од y. Тоа е речиси како да сте копирани и атипичен во трампа вредностите кои сакате да всушност манипулира. Значи, ако тоа е случај, кога на програмата на проектот извршување линија 35 тогаш 36, кога ќе стигнете до линијата 37, во овој момент во приказната, она што е вредноста на? Во овој момент во приказната, линија 37, што е вредноста на во овој момент? >> [Студент] 1. [Malan] Тоа само треба да биде 1, десно, бидејќи х беше донесен како првиот аргумент, и оваа функција само произволно повикува својот прв аргумент на. Слично е Y вториот аргумент, а тоа е само произволно повикувајќи вториот аргумент б. Оваа дихотомија е всушност прилично едноставно се објаснува. Размисли за тоа. Никој од нас не се сретна со лицето кое го напиша printf, па сигурно, тој или таа нема идеја што нашите променливи 30 години подоцна се случува да се нарече. Па има да биде разлика помеѓу она што вие го викате променливи во функциите сте пишување и она што вие го викате променливи во функција да се повикуваат или со користење. Значи со други зборови, имам напишано моите променливи како x и y, но ако некој друг го напишал на swap функција, тој или таа сигурно не би знаеле она што ми променливи се случува да се нарече, така сфаќаат дека ова е зошто ти мораш оваа двојност на имиња. Технички, би можел да го правиме ова преку случајност, но тие се уште ќе биде предадена во примероци. Тоа само ќе биде чиста случајност естетски ако тоа лицето кое го напиша swap ги користи истите имиња. Па во овој момент во приказната, линија 37, а е 1, b е 2, и сега продолжи да ги трампа. Прво на сите, дозволете ми да всушност го направите ова многу едноставно. Јас не знам што тие 3 линии на код се прави. Дозволете ми да го направите ова: b = a; a = b; направено. Зошто е ова скршени, логично? Тоа е вид на интуитивен работа, нели? Значи станува Б и Б станува, но проблемот е дека веднаш штом линија 37 извршува, што е вредноста на a и b? Истата, 1, бидејќи имате clobbered, така да се каже, сте ги промениле б да се изедначи со. Значи еднаш линија 37 е погубен, тоа е одлично, сега го имате 2 копии на бројот 1 внатрешноста на оваа функција, па потоа кога ќе се каже во согласност 38 a = b, ти си вид на зезнав, бидејќи сте само давање 1-1. Сте вид на изгубени ја вредноста што се грижи за. Значи во оригиналната верзија на ова, забележуваат она што го направив. Наместо тоа имаше трета линија на кодот кој изгледа вака. Изјавувам привремена променлива. Tmp е многу заедничко име за привремена променлива, и тоа е int бидејќи мора да одговара на она што сакам да се направи копија на. Јас чување копија од внатрешноста на мали, па така кога линијата 37 е погубен, вредноста на е - брзо разумност проверка - 1, вредноста на b е 2, и вредноста на мали, исто така 1. Па сега јас изврши линија 38. Откако линија 38 извршува, а се нафрла врз вредноста на b. И б е 2, па сега 2. Па во овој момент во приказната, е 2, б е 2, и мали е 1, па сега логично, можеме вредност само одеднаш tmp е во б и ние ќе завршиш. Значи ние сме реши тој проблем. За жал, кога ќе ја извршите оваа програма во оваа форма, тоа всушност не разменуваат никакви вредности. Но, да биде јасно, зошто? Јас фиксна логички проблем од само еден миг пред но повторно, ако јас ја извршите оваа програма, x и y остануваат непроменети до крајот на извршувањето на програмата. [Нечујни студент коментар] >> Ние не се врати ништо, па тоа е вистина. Но излегува дека има малку проблем тука, бидејќи досега, единственото нешто што сум бил во можност да се врати е една работа, а тоа е ограничување на В Вие само може да се врати навистина една вредност, во кој случај јас сум вид на заглавени тука затоа што може да се врати на нова вредност на x или би можел да се врати на нова вредност на y, но сакам и назад. Па враќање не е едноставно решение овде. Но, проблемот фундаментално е зошто? Што ние всушност сменил? [Студент] a и b. >> A и b. Но, a и b се копии на x и y, што значи ние само не сите на ова дело, ние само потрошени 3 минути зборува за swap функција и сите 3 од овие променливи, и тоа е одлично, совршено точно во изолација, но и обемот на b само што е во овие линии. Па само како за телефонска линија, ако пријават целобројна i внатре во за телефонска линија, Слично на тоа, ако сте прогласување a и b внатрешноста на функција што сте го напишале, тие се само валиден внатре на таа функција, што значи штом трампа е направено извршување и одиме од линија 24 до линија 25, x и y не се менуваат на сите. Вие само потроши целина многу време Замена копии на променливи. Значи излегува дека решението на ова е, всушност, не-очигледно. Тоа не е сосема доволно за да се вратите вредности, бидејќи ние само може да се врати 1 вредност, и јас навистина не сакате да се разменуваат и x и y во исто време, па ние ќе мора да се врати на оваа. Но, за сега, да сфатат дека ова прашање во основа произлегува од фактот што a и b се копии и тие се во свој домен. Да се ​​обидеме да се реши овој на некој начин. Дозволете ми, всушност, дојдете назад тука и се отвори, да речеме, на четвртата варијанта на ова, buggy4. Што е ова? Ова е слично, но поедноставно проблем да се погледне во пред да земе прободе во решавање на тоа. Оваа програма се нарекува зголемување, и тоа очигледно иницијализира цел број x до 1 во линија 18. Јас тогаш тврдат дека x е 1, јас тогаш тврдат дека "зголемување, ..." Јас тогаш се јавите прираст, но потоа во линии 22 и 23, тврдам тоа е се зголемува, Тврдам x е сега што и да е - 2, веројатно - но оваа програма е кабриолет. Што е проблемот? Да. >> [Нечујни студент одговор] >> Токму така. Значи x е прогласена, очигледно, on-line 18. Што е внатре кадрави загради main е. Значи едноставен одговор овде е дека додека х постои тука, не постои во линија 32, па оваа програма всушност дури и не ќе ги собере. Компајлерот кога се обидувам составувањето на овој код се случува да се развикам на мене за некои непријавена идентификатор или нешто во таа насока. Всушност, ајде да се обидеме. Ова е да се направи buggy4. Ете го. Употреба на "х" непријавена идентификатор во согласност 32. А всушност, да бидеме поексплицитни тука денес, така што ова е корисно во работното време и дома. Забележете дека тоа е малку cryptically напишано. Но, фактот дека ѕвекот има викна на нас, велејќи buggy4.c: 32:5, е всушност корисно. Тоа значи дека грешката е на линија 32 на карактер позиција 5. Значи 1, 2, 3, 4, 5. Тоа е, всушност, каде е проблемот. И, исто така, исто така, имајте на ум на работното време и дома, јас сум среќен тука. Имам една грешка. Тоа ќе биде релативно лесно да се поправи. Но, ако добиете целиот екран полн со огромна грешка пораки, повторно сфатат дека bottommost еден само може да биде симптоматично на врвниот еден. Значи секогаш бркаат надолу грешки од врвот надолу затоа што само може да биде еден синџир паричка ефект што предлага имате начин повеќе проблеми отколку што навистина го прават. Па, како би можеле да го надминете овој, ако мојата цел е да прираст x? >> [Студент] Направете x глобален. Океј, па можеме да направиме x глобален. Да го земеме на кратенката што предупреди за порано, но подлец, ние само треба брз лек, па да речеме int x се тука. Тоа го прави x глобален. Па сега главната има пристап до него и прираст има пристап до него, и така нека ме оди напред и да ги собере на оваа сега. Направете buggy4, Enter. Чини да ги собере сега. Ајде да се кандидира buggy4. И се чини дека всушност работат. Ова е една од овие работи што се прават, како што велам, а не како што правам јас, како што сум само направено овде, бидејќи во целина, нашите програми се случува да добиете многу повеќе интересни и многу повеќе од тоа, и ако вашиот решение за проблемите на животот е само да ги ставите сите променливи на врвот на вашата датотека, многу брзо се програми се horrifically тешко да се управуваат. Станува сè потешко да смислат нова променлива имиња, станува сè потешко да се разбере она што променлива што прави, и така во целина, ова не е добро решение. Значи, да се направи ова подобро. Ние не сакаме да се користи глобалната променлива тука. Јас сакам да прираст x, па можев очигледно - на крајот на денот, ова е вид на глупо приказна, бидејќи ние само го прават тоа - но ако јас не знам за тоа оператор или јас не му беше дозволено да ја промените во главната себе, како поинаку би можел да се спроведе Кен овде овој пат не коцка, но за зголемување? Како да си ги променам тоа нешто тука? Да. [Студент] помине во х а потоа се врати [недоловим] >> Океј, добро. Па зошто да не можам да помине во х а потоа наместо да се врати, зошто не јас само се враќа x + 1. А уште неколку работи треба да се променат тука. Јас сум на вистинскиот пат. Што друго ми е потребно да tweak? Некој друг. Да. [Нечујни студент одговор] Јас треба да се промени враќање тип на зголемување, бидејќи тоа не е неважечки. Празнина не значи ништо се враќа, но јасно сега тоа е, па тоа треба да се смени во - >> [студент] int. int да бидат во согласност со она што јас сум всушност враќање. Сега нешто друго се уште е кабриолет тука. Да. [Нечујни студент одговор] >> [Malan] Значи ми треба за зголемување х? [Нечујни студент одговор] >> [Malan] Ах, па затоа треба да помине х. Па јас треба да направите тука. >> [Нечујни студент коментар] [Malan] Значи прототип, морам да го промените ова до овде. Значи ова треба да стане int, ова мора да стане - хм, јас всушност имаат бубачки одредување тука. Да го надминете овој прво. Што треба ова всушност ќе биде? Тоа е мора да биде int нешто. Тоа може да биде х, но искрено, ако почне повикувајќи на сите ваши променливи x, тоа се случува да добиете помалку и помалку јасно кој е кој. Па ајде само произволно да изберете различни именување конвенција за мојот помошник функции, функциите јас пишувам. Ние ќе го наречеме, или можеме да го наречеме - Ајде да го наречеме број да биде уште поексплицитна. Па тогаш мора да се врати без разлика на бројот е плус 1, и сега јас треба да го сменат 1 друга работа се тука и една друга работа тука. Што треба да се промени на линија 21 првиот? >> [Нечујни студент одговор] [Malan] морам да го доделите до x. Јас не само да се јавите прираст (x). Ми треба да се потсетиме на одговор со промена на вредноста на x на левата страна. И иако x е сега на лево и десно, и тоа е сосема во ред бидејќи десната страна добива извршува првиот потоа добива plopped во левата рака работа - x во овој случај. А потоа на крај, тоа е лесен фикс сега. Ова само треба да одговара она што е долу, int број. Па еден куп на промени за навистина глупаво функција но претставник на нешта што ние се повеќе ќе сакате да го направите. Така осигурајте се buggy4. Сум зезнав некаде. О, мојот Бог. Пет грешки во 6-линија програма. Значи она што не е во ред на линија 18, карактер 5? Па морам да пријават тоа, int. Ајде да видиме. Постојат еден куп други грешки. О, мојот Бог - 19, 18, 21 - но повторно, ајде да го исчистите екранот, контрола L тука, и повторување ѕвекот. Значи 5 проблемите е всушност токму тоа 1. Па сега ајде да се кандидира buggy4, Enter. Whew, x е зголемено правилно. Во ред. Било какви прашања за тоа како да прираст броеви? Да. [Нечујни студент прашање] >> Добро прашање. Како е тоа што јас само може да го промени на X да ја бројот и на програмата ќе знаеш веднаш? Повторно, мислам на тоа како оваа апстракција. Значи, ако јас сум главен и Кен е прираст, искрено, не ми е грижа што Кен нарекува својот iPad. Не ми е гајле што тој го нарекува нешто што има врска со неговата имплементација на оваа функционалност. Ова е имплементација детали што, главно, не треба да се грижат. И така едноставно менување постојано внатрешноста на функција - број тука и бројот тука - се што е потребно толку долго како што прекомпајлирате. Тоа е вид на како, ако мислите дека за многумина од нас, оние од вас со возачки дозволи кои имаат управувано или ако сте дури и управувано во автомобил, повеќето од нас немаат идеја како автомобил работи под хаубата. И буквално, ако се отвори капакот на моторот, повеќето од нас - мене доручек - не се случува да навистина знае она што го барате, вид како може да се чувствуваат со нешто како ова право сега. Но, ние навистина не треба да се грижи како автомобил работи, ние не треба да се грижи што сите прачки и клипови и кабли внатрешноста на автомобилот се всушност прави. Значи нешто како она што вие го викате на клипот не е важно тука, во овој случај. Истата идеја. Да. >> [Нечујни студент прашање] Ако има повеќе намени на променливата Ха момент пред, вас, програмер, ќе треба да ги промените насекаде. Или вие буквално може да направи датотека, Menu, а потоа Најди, замени - нешто слично - но ви се случува да треба да се направи оние промени себе си. Мора да биде конзистентна. >> [Студент] Ако постојат повеќе варијабли [недоловим] А особено ред како тука, ако ова беше int друг број? >> [Студент] точни. [Malan] Да. Цел е важно кога ќе се јавите на функција. Значи, ако јас се јавуваат прираст тука со нешто запирка нешто, има директна мапирање. Првиот променлива, што се вика, се прави копија на првиот аргумент овде. Жал ми е. Ова не треба да биде заграда. Вториот аргумент линии со втората. Така да, да, прашања. Во ред. Жал ми е. Зедов долг пат да одам таму. Други прашања? Во ред. Значи, да видиме ако не можеме да наслика слика на она што всушност се случува овде под капакот на моторот, така да се каже. Ова е правоаголник кои би можеле да претставуваат меморијата на вашиот компјутер. Дури и ако немаат идеја како меморија работи или како RAM меморија дела, најмалку претпоставиме дека имате гроздовете на тоа овие денови. Имаш мегабајти на тоа, имаш гигабајти на тоа, и знаеме од недела 0 тоа бајт е само она што? >> [Студент] 8 бита. 8 бита, нели? Значи 8 нули и 1. Значи, ако вашиот компјутер има свирка на RAM меморија, 2 свирки на RAM меморија овие денови, имаш милијарди денари или 2 милијарди бајти меморија или околу 8 милијарди евра или 16 милијарди парчиња внатрешноста на вашиот компјутер. За разлика од малку Wooly Вили пример, тоа не е магнетни честички обично повеќе. Повеќе - во лап-топ компјутери во најмала рака - тоа е солидна држава дискови, SSDs, дека само немаат подвижни делови. Тоа е сите електронски. Сето ова е електрична енергија-базирана. Значи мислам на овој правоаголник како само ги претставуваат 1 или 2 гигабајти на меморија што го имате. Па тоа е дел од меморијата. Во светот на компјутерски науки има вид на поделено исклучување делови од меморијата да направите различни нешта. На пример, ако ова е RAM меморија на вашиот компјутер, како што е предложено од страна на правоаголник таму, излегува дека од Конвенцијата, на врвот на вашата RAM меморија, така да се каже, генерално е она што се нарекува текст сегмент. Тоа се 0-ти и 1S дека се составени. Значи, кога ние погледна под хаубата во она што a.out е, сите овие 0-ти и 1S, кога ќе ја стартувате програмата, оние 0-ти и 1S се вчитуваат од вашиот хард диск во нешто што се нарекува RAM меморија, и во RAM меморија тие се стави на врвот. Во меѓувреме, имаш други работи: иницијализира податоците, деиницијализира податоци. Оние 2 делови од меморија се однесува на глобални променливи, кои не често ги користат но понекогаш ако не, тие завршуваат таму, како и. Потоа, тука е некои други работи: животната средина променливи, кои ние не ќе потроши многу време на, но потоа 2 важни работи што ќе се врати во текот на семестарот, магацинот и грамада. Па повеќето од меморијата на вашиот компјутер е резервирана кога водење на програма за нешто што се нарекува магацинот и нешто што се нарекува куп. Ние нема да се зборува за грамада денес, но ние ќе зборуваме за на магацинот. Магацинот е замислена да апелирам до визуелните на јадење салата оброк пепелниците во Mather куќа или каде и да се случи да биде каде јадење салата персонал ги чистат секој ден, тие ги магацинот до од подот на горе, и слично, во знак на сеќавање, не е идејата за ставање нешто на магацинот, стави нешто на магацинот, стави нешто на магацинот. И она што се подразбира под тоа? Ајде да зумирате на само долната половина на оваа слика, RAM на Вашиот компјутер, да предложи следниве. Излегува дека кога ќе ја стартувате програмата како a.out или здраво - она што на програмата е дека сте го напишале - повторно, оние 0-ти и 1S се вчитуваат од вашиот хард диск, кој е долгорочното чување, останува таму дури и кога ќе повлечете го приклучокот, натоварена во RAM меморија. RAM меморија е побрз од хард дискови - тоа е помал од хард дискови - но тоа е каде програми живеат додека си ги извршува. Па ќе кликнете два пати на програмата на Mac или PC, тоа е вчитана од хард диск во RAM меморија. Штом тоа е натоварена во RAM меморија, 0-ти и 1S одат на патот врвот, т.н. текст сегмент, но потоа веднаш штом вашата програма всушност почнува да трча, главната функција се нарекува, а главни, како што видовме, често има локални променливи, и има ints и стрингови и знаци и слично. Значи, ако вашата програма кои сте ги напишале или програма со која ќе се двојно кликнавте користи некои променливи во внатрешноста на главниот, тие завршуваат на дното од вашиот магацинот на меморија, така да се каже. Поконкретно, што значи ова всушност значи? Ова само значи дека ако ние се случува да бројот на бајти на RAM меморија во вашиот компјутер, забележите дека ова може да биде бајт број 0, ова може да биде бајт број 1, 2, 3, 4, 5, 6, сите на патот до 2 милијарди ќе бидат сите на патот до таму на врвот. Значи со други зборови, кога зборуваме за RAM меморија или мемориската во однос на бајти, тоа само значи дека некој се одлучи што да се нумерира секој од овие делови од меморијата. Значи, кога ви треба 32 бита за int или треба 8 бита за знак, каде тие завршуваат во меморијата? Концептуално, тие само се заокружи на дното на оваа работа наречена магацинот. Но, она што е интересно сега е кога главниот повикува функција - Претпоставувам функција наречена foo, само произволно име - она што се случува е главниот е на дното на оваа магацинот на меморијата; foo сега е ставен на врвот на главната меморија. Значи сите локални променливи кои foo е заврши вид на концептуално над оние во главниот. Ако foo повици друга функција наречена бар, овие променливи завршуваат тука. Ако бар повици нешто друго, тука, тука, тука. Значи она што е интересно за водење на програмата е дека ќе се јавите функции и како тие функции повик функции и како тие функции повик функции, ќе се изгради до овој магацинот на функции во меморијата. И само еднаш функција се враќа да започнете добивање дека меморијата назад. Значи еден од најлесните начини да се кандидира на меморија во компјутерот програмата е да се напише функции кои никогаш не се врати. Така на пример, да покажат колку со намерно кабриолет програма. Дозволете ми да оди напред и да # се , int главната (празно), и јас ќе одам да направите додека (2> 1), кој најверојатно никогаш нема да се промени за нас, и дозволете ми да оди напред сега и не printf. Всушност, тоа ќе биде помалку визуелно интересна. Ајде да го направите тоа. За int i = 0; з> 0 - нека ја прават оваа грешка - i + +. И нека не printf тука. Да се ​​практикуваат она што го проповеда. Ајде да се метода, празнина хор, и ние ќе каже int i, а потоа јас ќе одам да се каже printf - Не, ајде да се направи овој поинтересна. Да, всушност, не се печати ништо на сите. Ајде само го направите ова: хор (i). Во ред. Значи ова е грешка, бидејќи зошто? Јас сум измислувам, како и да одам, бидејќи на програмата всушност не направи нешто од интерес. Но тоа не е целта. Целта е да се напише програма чија главна функција го прави она што, очигледно? Повик себе. И всушност, ние не треба јамка. Ајде дури поедностави оваа само за да не се губи пред очите на навистина основните бубачка. Главната повици хорот да пее некои хор, тогаш јас направив нешто глупаво и морав хорот повик хор затоа што претпоставува некој друг ќе беше да се имплементира можеби, и сега тоа не се случува да се собере уште. Јас треба да се направи она што? Ми треба прототип, се сеќавам. Па јас треба да имаат до тука празнина хор (int i); Па сега ако одам долу тука - всушност, да го користат поголем прозорец. Ајде да одиме напред и да направат хор. Ајде да одиме напред и да направат хор. Употреба на непријавена идентификатор i. Ох, тоа е глупаво. Ние не треба на аргумент. Ајде само го направите тоа. Би сакал да го започна овој начин. Тоа би било многу полесно програма за пишување. Таму. Сега ајде да одиме во текот на мојот терминален прозорец, повторување ѕвекот, а тука ќе одиме. Тоа беше навистина брзо. Што, всушност, само се случи, иако? Па, сега јас ќе додадете печати линија, така што можеме да видиме. Дозволете ми да кажам printf ("Јас сум тука") - без променливи. Ќе го оставиме тоа на тој начин. Дозволете ми повторување направи. Дозволете ми повторување хор. И ... ајде. Продолжувам да одам. Како настрана, зошто не го урна уште? Сегментација грешка се случи супер брз порано. [Нечујни студент одговор] >> Токму така. Значи тоа е потребно време да се печати, нели? Тоа само ги зема повеќе работа на дел на компјутерот. И таму што е: Сегментација на вина. Значи забележите колку брзо програми работат. Ако не сте печатење ништо, супер брз. Но ние сепак добив оваа сегментација на вина, бидејќи она што се случува? Ако мислите дека за тоа меморијата на вашиот компјутер е изнесена, ова се случува да бидат главни, но тука ајде да се јавите овој хор, и ајде да ги наречеме овој хор. И сега, ако го направам мојата естетика во право, ова е само случува да се каже хор, хор, хор, хор, хор, хор, хор, реклама nauseum, и на крајот, она што ќе се случи? Ако големата слика, буквално, е тоа, што едноставно се случува концептуално? Магацинот пречекорување на грамада. Или, уште полошо, ти само лизгањето сè, вклучувајќи го и текстот сегмент, кој е 0-ти и 1S кои претставуваат вашата програма. На кратко, ова е само супер, супер лошо. Вашата програма има излезе од контрола. Го користите начин повеќе меморија отколку што се наменети сите поради глупава грешка во овој случај, или во овој случај многу намерно направено функција која себеси се нарекува. Сега, тоа не е сите лоши. Функции се нарекуваат всушност има голема моќ кога ќе го користам правилно. Јас не го користи правилно тука. Значи ова не е сите лоши, но фактот дека никогаш не сум всушност запре мене повик е основен слабост тука на оваа програма. Значи каде одиме со сето ова? Што навистина се случува? Кога ќе се јавите на прираст функција како што се прави во овие примери, Имам вредност како 1 што помине внатре Јас помине во копија од број 1, па следниве се случува. Ајде да одиме во пораст пример, овој човек право овде. Тука е она што всушност се случува. Кога ќе се јавам прираст и јас помине во х, сликовито, што се случува овде е тоа. Ако имам вредноста на 1 чуваат тука и јас всушност се јавите зголемување, која сега се нарекува хор - на iPad ме отфрлаат тука. Ајде да ги наречеме овој пораст, а ние не знаеме што следниот функција е и ќе биде. Значи она што всушност се случува е тука некаде во главниот имам парче меморија кој е чување на број 1. Кога ќе се јавам прираст, јас сум користење на друг дел од меморијата, но сега имам копија од 1. Кога јас зголемување на таа вредност, тоа станува 2, но тогаш што ќе се случи веднаш штом зголемување се враќа? Оваа меморија само добива предаден назад во оперативниот систем, што значи дека сите сте го направиле ништо корисно. На 1 кој првично беше содржани во главната е сеуште всушност таму. Значи каде одиме со оваа? Излегува дека во меморија имате ова назад-до-назад секвенца на бајти што може да се стави нешто во, и излегува дека ние сме веќе видено нешто која вклучува ставање работи да се врати назад да се врати да се врати. Што е стринг врз основа недела 1 и сега недела 2? Тоа е само собирање на карактери. Значи излегува онака како што може да се стави броеви во меморијата, Слично може да се стави карактери во меморијата. И штом ќе започне со ликовите во меморија да се врати назад да се врати да се врати, излегува дека со користење на наједноставните работи како за телефонска линија или додека јамка, можеме да iterate од лево кон десно во текот на карактери во стринг и почнете масажа нив во различни карактери заедно - на може да стане б, б би можел да стане в - така што во крајна линија, ние може да потрае англиски реченица која всушност има смисла и претворање на секој од тие писма едно по едно време одење преку мемориска нашиот компјутер лево кон десно за да всушност криптирате. Па ајде да нашите пет минути пауза тука, и кога ќе се вратиме, ние ќе започнеме овој процес на scrambling информации. Во ред. Пред да се нурне во некои крипто и овие работи вика низи, дозволете ми да пауза за било какви прашања, бидејќи се чувствувам како да сум навистина вид на ѓаволски некои од овие теми. Значи, да го поправи сега ако можеме. Ние само разговаравме за враќање вредности, ние разговаравме за аргументи, и ние разговаравме за овој поим, што ќе се врати во неделите што доаѓаат, на гледање на меморија, како еден куп на овие наредени коцки, така да се каже, од дното на горе, така што секоја лента, која добива стави на магацинот претставува функција која во моментов се нарекува. Било какви прашања? Дозволете ми да поставам едно прашање тука. Дозволете ми да се поедностави оваа вратам на она што беше пред некои од нашите порано П & А Фактот дека прираст има отворени заграда, int број, затворена заграда - она што не int број претставуваат? [Студент] аргумент. >> Аргумент. Во ред. Но, она што е аргумент? [Нечујни студент одговор] >> Што е тоа? >> [Студент] Нешто што ќе помине внатре Океј, па нешто што ќе помине внатре и поопшто, тоа е само на влез. Ако сте биле пишување функција и намена кои функционираат во животот е да се направи нешто малку различни секој пат кога ќе го користите, тогаш единствен начин за да се случи тоа навистина ќе изгледа да биде да се обезбеди влез така што тоа може да се направи нешто различно со тоа влез секој пат. Значи ви треба да се одреди две работи кога функцијата зема влез. Потребно е да наведете името што сакате да им даде на тоа внесување чисто за свој погодност, така што ќе може да се однесуваат кон неа во функција што си се пишува, како што го направив тука во линија 32. Но исто така ќе треба да се одреди нејзината тип, бидејќи C е програмски јазик што само бара дека ако сакате променлива, ќе мора да му кажете на компјутерот што тип на податоци е, во голем дел, така што тоа го знае колку бита за да се распредели за таа променлива бидејќи тоа би можело да биде 6 - Жал ми е, тоа нема да биде 6. Тоа може да биде 16, тоа може да биде 8, тоа може да биде 32, дури и 64, но на компјутерот треба да знаеш. Сега, int на левата страна претставува она што, од друга страна? [Нечујни студент одговор] >> Што е тоа? >> [Студент] Вид на функција. Тип на функција и, поконкретно, од типот на своето производство. Право. Па со оглед на тоа нешто во загради претставува нејзиниот влез, доколку ги има, нешто на левата претставува своето производство. И во овој случај, зголемување очигледно враќа int, и така int е враќање тип на оваа функција. Што значи да се вратат? Буквално, можете да користите клучниот збор враќање, а потоа ако она што се враќаат на правото на клучни зборови е цел број, тогаш тоа е навистина во согласност со она што го вети. Вие не може да направи вакво нешто - Здраво, светот - затоа што тоа е стринг. Очигледно, тоа не е цел број. Значи во кратки, товарот е навистина на нас, програмер, да бидат конкретни за тоа што ние сме се враќаат и да потоа всушност да се обратите за враќање неа. Контекст тука сега е тоа што меморијата на вашиот компјутер е Gigabyte, 2 гигабајти - што - можеби тоа е повеќе, можеби е помалку, но компјутерот го гледа како што имаат различни секции. Нешто тргне таму долу, нешто друго оди таму горе, различни нешта оди во средината, а денес ние само почнат да кажува приказна, но ние ќе се вратам на ова со текот на времето. За сега, само дел од меморијата ние навистина се грижат за е текстот сегмент бидејќи тоа само претставува 0-ти и 1S дека ѕвекот ја outputted. Значи, кога ќе извршите команда на тастатурата како a.out или ќе кликнете два пати на иконата на Mac OS или Windows, вашата програма е вчитана од вашиот хард диск во RAM меморија и тоа е plopped на врвот на RAM меморија на вашиот компјутер, така да се каже. Во меѓувреме, како вашата програма почнува да трча и главните добива се нарекува во програмата ви напишал или програмата Microsoft или Apple напиша, било кој од нејзините локални променливи заврши таму долу на дното на меморијата на вашиот компјутер. Но, ако главната повици друга функција која самата има променливи или аргументи, тие завршуваат над неа. И ако тоа функциски повици нешто, тие завршуваат над неа, над неа, над неа. И само еднаш функција е направено извршување не магацинот на коцки, така да се каже, почне да се пониско и пониско. И тоа е она што тогаш, во мало, објаснува зошто кога ќе се јавите коцка или ти се јавам прираст, ти си поминува во копија од вредност. И што значи тоа сликовито е дека сте буквално пишување број 1 во друг дел на меморијата, се менува 1-2 во случај на зголемување или до 8 во случај на коцка, а потоа фрлање дека меморијата далеку штом зголемување или коцка функцијата се враќа. Прашање. [Студент] Каде се глобални променливи се чуваат? Глобални променливи се чуваат во она што моментално се нарекува иницијализира на податоци или деиницијализира податоци, разликата е ако имате глобалната променлива и го додели веднаш вредност со еднаквите знаци, тој завршува на врвот таму, и ако речеме int x, со никаква вредност, тој завршува малку пониска во RAM меморија едноставно со конвенцијата. Други прашања? Во ред. Значи оваа слика ќе се врати како што ние се повеќе моќни со што можеме да направиме со компјутер, но сега за сега, да имаат кратко интро да криптографијата, посебен вид на криптографијата дека не ги решава сите проблеми на светот но не го реши некои од нив. Во овој случај тука, ние имаме нешто што се нарекува тајна-клуч криптографија. Тајната-клуч криптографија, како што сугерира името, произлегува нејзината безбедност од тајна. На пример, ако сте биле назад во основно училиште и ви се поминува една мала тајна љубовно писмо на момче или девојче сте биле дробење, ако си сакал да го помине тој белешка низ публиката, најверојатно не би пишува таква белешка на англиски или без разлика на вашиот мајчин јазик. Наместо тоа, може да го криптирате или вие само може да ги испратите текстуална порака овие денови. Но, вие всушност може да ги помине белешка во текот на наставата. И да го направите ова безбедно во таков начин што вашите пријатели и наставникот не знам што сте пишување, може да излезе со прилично едноставен алгоритам, млади иако можеби ќе биде, само да се трка на зборови. Така, наместо на пишување може да се пишуваат б, наместо б можете да напишете в, наместо в можете да напишете г, и така натаму. Или можете да излезе со повеќе софистицирани превод на писма до различни букви. Но, за улов е момче или девојче на кое праќаш оваа белешка треба да се знае нешто, што е она што, очигледно? >> [Студент] Што праќаш. Што твојата тајна е, како што е тоа мапирање помеѓу А и Б и В и на d. Тоа е само додавање на 1 за секоја од буквите да одат од А до Б, Б кон Ц? Е посложена од тоа? Па вие и вашиот здроби ќе треба да ја имаат оваа тајни информации, но има вид на фати-22 тука. Ако ова е прв пат праќаш ова љубовно писмо преку класа, како е тоа момче или девојка ќе знаете што тајната дури е? Толку таен клуч за криптирање не ги решава сите проблеми во светот, и таму е всушност врската тука дека ќе се врати за да кон крајот семестар. Слично не повеќето од нас знаат некој што работи, на пример, на Amazon.com, а сепак многу од нас имаат веројатно купил работи на Amazon.com, и ние сме научени да се претпостави дека овие e-commerce трансакции се безбедни. URL-то веројатно вели https, има можеби глупо малку катанец икона некаде, има некој вид на криптографијата обезбедување на вашата кредитна картичка информации помеѓу вас и Amazon.com. И уште ако криптографијата вклучува знаејќи некои тајни и уште не знам никого во Амазон и јас сум сигурно не е договорено било каков вид на тајна со некој на Амазон, како е мојот компјутер или мојот прелистувач го прави ова? Излегува има и други видови на криптографијата целосно го реши тој проблем. Но, за денес, ние ќе се фокусира на едноставна каде што може да се организира во однапред да се знае некои тајни како 1 или некои мапирање помеѓу А и Б е. И процесот на криптографијата обично вклучува ова. Имате некои обичен текст, прикажана овде на лево, ќе го стартувате преку некој вид на алгоритам или постапка за енкрипција на тоа - можеби тоа е само станува б, б станува в - а потоа ќе се заокружи со ciphertext. Во меѓувреме, еднаш вашиот здроби добива оваа тајна белешка, тој или таа има да потоа ја дешифрирате со генерално обратен дека алгоритам па како да се вратам на обичен текст. Постојат физички инкарнации на ова. На пример, ова е малку тајна декодер прстен, и ова е еден прстен во смисла дека има два бирање тука. На надворешната периферија на оваа работа, има писма A до Z, иако тие се во случаен редослед, и во внатрешноста, има всушност некои броеви така што со овој прстен сте вид на може да се претвори од надвор но не и во внатрешноста со цел да се редат броеви со букви. Од филм наречен Приказна Божиќ, ќе видите дека малку Ralphie беше толку желни да дознаам што тајната порака Малку сирачиња Ени беше да го кои биле доставени, мислам, во форма на нумерички пораки на житни кутија и ти мораше да се акумулираат сите мали картички кои дојдоа во житни кутија, ти мораше да ги пошта во, ти мораше да се врати на тајната декодер прстен така што конечно може да дознаам што мапирање е меѓу букви и броеви или писма и писма. Како во компјутер можеме да одиме за спроведување или претставуваат нешто како ова? Ние треба начин на изразување на себеси малку повеќе флексибилно од нашите променливи досега се дозволени. Имавме ints, имавме карактери, имавме плови и двојки и неколку други, но тие се поединечни парчиња меморија која навистина не ни дозволуваат да изразат работи како зборови и реченици и фрази. Всушност, ние го нарече такви нешта жици, но ние ветуваме дека ова е навистина само поедноставување во CS50 библиотека дека ние сме со намера да лупам назад. И така да почнеме да го стори тоа овде. Дозволете ми да оди напред и да се отвори датотеката - сите овие датотеки се достапни, како и обично, онлајн - т.н. array.c да реши еден проблем поврзан со жици, но дека стравува слика тука за тоа како ние може да се користи нешто што се нарекува низа. Низа е податочен тип. Тоа е тип на променлива на сорти која има повеќе помали типови на податоци во него назад кон назад да се врати да се врати. Така на пример, ако сакавме да пишувам малку програма која ви дава вашиот квиз просек за курсот како 50 дека има 2 квизови, можете многу лесно може да ја напишам оваа програма врз основа дури и на некои од материјал минатата недела со користење GetInt и неколку варијабли: int quiz1, int quiz2. И тоа е прилично јасна. Тоа е можеби 10, 20 линии на код макс за спроведување на програма дека го прашува корисникот за 2 квиз резултати и потоа пресметува нивната просечна со додавање на нив заедно, што ги дели со 2, а потоа печатење на резултатите. Ние веројатно може да го направи тоа прилично лесно сега, по одреден број на минути. Но, проблемот е во тоа што претпоставувам дека 50 имаше 3 квизови или 4. Да претпоставиме дека си сакал да ги користат истите програма за класа која има неделна квизови. Размислете за класа која има неделна квизови. Ако има 16 или така недели во еден семестар, сега имате 16 варијабли: int quiz1, int quiz2, int quiz3, int quiz4. Веднаш штом ќе започнете да гледате оваа вишок, овој копирање и вметнување на код, тоа треба да почне да ве натера да сакаат имаше подобар начин. И за среќа, бидејќи на низи постои. Значи, да го направите тоа. Прво, дозволете ми да се воведе еден многу едноставен нешто што ние не сум користел досега, но ќе се види повремено во кодот. Ова е она што обично се нарекува постојан. Па тоа е постојана во смисла дека никогаш оваа вредност се менува. Човековите конвенцијата кога создавање на постојана е да се користи сите големи букви само така што навистина се издвојува во вашиот код, и специјални клучни зборови кои ги користите во Ц # define. Па велиме # define, тогаш простор, тогаш зборот кој сакате да го користите за името постојано е и тогаш вредноста на константата. Забележите ова е различно од давање нешто на променлива. Нема еднаквите знаци, нема запирка. Тоа е она што е општо познато како препроцесори директива, но повеќе за тоа друг пат. За сега, ова создава непроменлива вредност наречена квизови чии вистински нумеричка вредност е 2. Па насекаде гледате квизови, тестови, квизови во текот на оваа датотека, тоа е само број 2. Ако гледам во главниот сега, ајде да видиме како тоа функционира. Прво тоа изгледа малку криптичната, но тоа е сите работи од недела 1. Прашај на корисникот за оценки. Како го правиме тоа? Во линија 22 - ова е навистина сочно дел - Изјавувам плови но не само еден плови. Јас сум прогласување, туку низа на лебдечки-точка вредности. Тоа променлива ќе бидат повикани оценки, како подразбира тука, но само парче од нова синтакса, тогаш се овие квадратни загради. Фактот дека јас сум рекол плови оценки и потоа отворете заградата и тогаш голем број - информации ако ова е константно ова е исто како ние го сторивме тоа - тоа значи, "Еј компјутер, дај ми 2 лебди и нека колективно ги нарекуваме оценки." Ова е во контраст со многу повеќе мачна процес вака: плови grade1; плови grade2, и така натаму. Значи низа ни овозможува да се спроведе оваа идеја, но многу помалку messily, во таков начин што ние може да напише 1 линија код наместо, да речеме, 16 за 16-недела семестар. Не сакав да хард-код 2, бидејќи ако мислите дека за тоа сега логично, Претпоставувам дека следната година CS50 промени до 3 квизови наместо и имав број 2 тука, имав број 2 тука, Имав број 2 тука, бројот 2 тука. Станува многу досадни и многу лесно да ја зафркнам и случајно се промени 1 вредност на 3 и фали некоја друга вредност од 2. Па ќе одам да наместо апстрактни овој далеку и да го користите оваа постојана тоа, како што сугерира името, никогаш не се менува. И сега, без разлика дали имаме различни квизови оваа или следната година, Јас само треба да го измените во едно место до тука во врвот. Значи тоа е една константа е. Во меѓувреме, новиот концептуални карактеристика е тоа што на низа. Значи квадратни загради ми даде оваа многу плови и ми овозможува колективно ги нарекуваме оценки тука. Па сега ајде да видиме што ќе одам да се направи. Тука во линија 24 е почеток на една за телефонска линија. Ова е навистина ништо фенси. Тоа е само со користење квизови, наместо на хард-кодирани број. Но нема ништо интелектуално различни таму од минатата недела. Ова е само printf, па printf ("Квиз #% d од% d") бидејќи јас само сакам да се печати ми даде квиз број 1 од 2 и потоа 2 од 2. Значи ова е чисто естетска работа. Но, интересен дел сега е во линија 27. Со цел да се пополни во една од двете променливи со лебдечки-точка вредност, можете повторно користење квадратни загради. Во овој случај, јас сум јас користење, бидејќи тоа за телефонска линија започна со i изедначување што вредност, очигледно? [Студент] 0. >> [Malan] 0. Така, на првата итерација на овој циклус, тоа е како да сум го напишал ова во кодот, но на втората итерација на овој циклус, тоа е како да сум го напишал ова во мојот код. Но, фактот дека јас сум со користење на променлива е совршен, бидејќи, како што сугерира името, тоа е различна неговата вредност на секоја итерација, па јас сум пополнување на оваа низа едно место во исто време. Што значи оваа низа изгледа? Причина јас привлече супер едноставен правоаголник на екранот тука пред се поради оваа причина. Низа е само дел од меморијата по друг дел на меморијата проследено со уште еден дел од меморијата и така натаму. Значи, ако мојата низа е со големина од 2 во овој случај тука, сите ќе се прави со пишување во мојот квиз резултати се допаѓа тука - Добив 100 на овој еден, а потоа добив 99 за тоа еден - тогаш оваа меморија дури и не може да се користи, бидејќи јас сум само побара од компјутер за низа на големина 2. Оние квадрати се уште се таму, нели? Сеуште имаш 2 гигабајти RAM меморија дури и ако сте само бараат 2 плови. Значи, идејата зад низи е дека компјутерот само зема парче меморија а потоа apportions помали парчиња да се врати назад да се врати да се врати. И така тоа е низа е. Тоа е соседни парче меморија во внатрешноста на кој може да се стави работите. Ова се случува за да потоа направи само некои здодевни аритметика. Ако јас дојдете тука, ова е местото каде што јас тогаш iterate во текот на низата. Јас излезе со збирот на сите вредности во низа, а потоа јас го користам круг функција тука за да всушност направиме сума поделена со квизови. Но, дозволете ми бран мојата рака во тоа што вид на доволно аритметички за сега. Но, сето тоа го прави за мене конечно се компјутери просек. Значи прво квиз плус вториот квиз поделено со 2, а потоа отпечатите како int. Но, ајде сега транзиција кон различни пример наречен string1, која стравува слична слика но со користење на жици. Дозволете ми да оди напред и да се поедностави тоа за само еден миг. Прости вовлекување за сега. Известување во линија 19 на овој пример, јас се добие стринг од корисникот. Но, забележи она што јас сум следниот прави во линии 22 наваму. Јас сум, всушност процесирањето од I до - и ова е нов трик - strlen, стринг должина. Ова е функција која доаѓа со C дека ако го помине низа, тоа ви кажува колку карактери се во таа низа. Тоа е сè. И фактот дека тоа е strlen наместо стринг должина е само затоа што тоа е повеќе содржаен. Пред триесет години, луѓето се допаѓаше да пишувам нешта како посочно, како е можно, па ние го чуваат таа конвенција тука. i + + само значи зголемување јас во секоја итерација. И сега забележите ова, што е навистина интересно. Во линија 24, велам, "Компјутер, дај ми карактер, 8 бита, и го нарекуваат в." Но, она што е оваа на десната страна зборуваш? На англиски јазик, што значи дека претставуваат? [Студент] Првиот карактер во низа. Точно. Дај ми го првиот карактер во низата. Или, поопшто, дај ми ith карактер во низа. И ќе сфати дека е важно сега тоа што се компјутерски научници, ние сме всушност сметано од 0. Вие не имаат дискреционо право сега да почнете да го правите ова. Сега треба да се однесуваат во согласност со очекувањата на компјутерот и бројот од 0 бидејќи [0] ќе биде првиот карактер во низа, [1] ќе биде вториот, [2] ќе биде третиот, и така натаму. Значи оваа програма, ако ја собере, ова е повторно string1, така бидете string1, и сега сум се кандидира string1 во мојот терминален прозорец. Тоа е на чекање за влез, па ќе одам да напишеш во Давид, Enter, и сега тоа отпечатоци Дејвид сите на различни линии, бидејќи известување што правам. Јас сум печатење еден карактер во исто време. Ние не би навлегувал во детали денес на ова, но јас избришани момент пред оваа проверка тука. Излегува дека ако корисникот се немирни, контрадикторна, или само збунети, вие всушност може да успее да даде низа на некои должина. Ако притиснете на погрешно копче на тастатурата, може да даде никакви низа на сите, или ако сте злопамтило, можеби ќе се обиде да го ставете во вредност од гигабајти на есеј да се пополни оваа низа, и ако на компјутерот снема доволно меморија, излегува дека ние ќе се вратам на оваа посебна вредност наречена NULL. Па за сега, само знам дека не е ова посебна вредност наречена NULL што ќе ни овозможи да се провери кога сме надвор од меморија, меѓу другите нешта. Но, ако јас се отвори сега string2, забележите една разлика тука. Забележите една разлика тука со string2. Со string2, ова за телефонска линија е малку поинаква. Дозволете ми да го избришете NULLS, така што можеме да зборуваме за оние некое друго време. Она што е различно за за јамка ова време? Можам да се вратиме на претходниот пример. Значи тоа е верзијата 2, ова е верзија 1. 1, 2. 1, 2. На strlen повик е каде? Тоа е во првиот дел од за телефонска линија. Секој мисли за тоа зошто јас го правам ова? Да. [Студент] Така да не се јавите на функција секој пат. [Malan] Значи ние не се јавите на функција секој пат. Точно. Потсетиме од за петелки дека тие се супер едноставен Откако ќе вид на разбирање дека ова е иницијализација, состојбата и ажурирање. Проблемот е дека состојбата се случува на секој повторување на јамка. И така во овој пример тука, она што е лошо за фактот дека ова е мојата состојба? [Студент] Ти си повикувајќи strlen. [Malan] Ти си повикувајќи strlen повторно и повторно и повторно. Но еднаш сум ја внеле во Давид, должината на стрингот е 5, и тоа не е ќе се смени на секој повторување на јамка бидејќи на стрингот е уште D-а-в-з-г. Значи ова е навестување на она што се случува да стане важна идеја познат како дизајн одлука каде само не се направи компјутерски направи непотребни работи. Само како еден подлец преглед на pset2, pset2 во стандардна верзија ќе ви предизвик да ги спроведе некои број на шифри, одреден број на енкрипција алгоритми, така што ќе и може да криптирате и декриптирање на тајни пораки многу сличен на оној Ralphie има дешифрира. Во хакер издание на pset2, ние ќе одиме малку подалеку. Ние ќе ви рака датотека од вистински компјутерски систем која содржи еден куп на кориснички имиња и вистински криптирани лозинки, и предизвик за хакер издание ќе биде да попуштат оние лозинки и дознаам што криптографијата или какви тајни беше искористена за да всушност генерира оние лозинки. И ние ќе го направите тоа со користење на нова функција тука на C дека јас ќе ти дадам само демонстрација на познати како командната линија аргументи. Излегува, како што некои од вас може да се види во дел или во учебниците, Главните не секогаш мора да биде неважечка во голема заграда. Излегува дека главната исто така може да бидат напишани како оваа, со два аргументи, argc и argv, каде argc е бројот на зборови дека сте тип по име на програмата на вашиот командната линија и argv е вистински зборови. И како квадратни загради има сугерира, argv е очигледно низа. Тоа се случува да биде низа по низа по низа во меморијата. Значи она што се случува да бидат во можност да го стори почнувајќи со pset 2 е нешто како ова. Ако можам да направам argv1, која е пример ние ќе се врати во понеделникот, и да ја стартувате, забележите дека тоа не чини да се направи ништо сеуште. Тоа само отпечатоци од свое име. Но, ако јас се каже збогум класа, напомена дека оваа програма очигледно iterates над секоја од зборовите кои беа напишани во конзолата. И средствата со кои ќе се добие пристап до зборовите дека корисникот има внеле во конзолата е со промена на главниот почнувајќи од овој викенд од int главната (празно) да int main (argc, argv) и на тој начин ќе се роди командната линија аргументи. И штом еднаш ќе добиете навистина софистицирани во ова, ќе бидете во можност да пишувам навистина trippy програми како што е овој овде, кој оди над и надвор некои од функционалноста ние го направивме досега, но сите доста моќни. Па ние ќе ја напушти оваа со овој на екранот, и ние ќе се видиме в понеделник. [CS50.TV]