[Powered by Google Translate] [Тыдзень 2, працяг] [David J. малая, Гарвардскі універсітэт] [Гэта CS50. - CS50.TV] Добра. Гэта CS50, і гэта ў канцы тыдня 2. Калі вы плануеце быць галодным ў гэты час заўтра, ведаць, што мы збіраемся правесці як невялікай групай заўтра, чацвер, 1:15 вечара. Там ёсць URL тут, калі вы хочаце, каб RSVP. Месцы абмежаваныя, так што даруйце, калі форма запоўненая да таго часу вы запоўніце гэта. Іншы URL, аднак, што можа быць цікава гэта. У амаль праз месяц, курс будзе даступная Усё больш шырока праз EDX, праз якія людзі ў Інтэрнэце будзе мець магчымасць сачыць разам, ўдзельнічаць у працэсе дастаткова актыўна, на самай справе. Яны буду выкарыстоўваць CS50 і CS50 Appliance Абмеркаваць і самыя розныя праграмныя сродкі, якія мы ўжо выкарыстоўвалі ў гэтым семестры. І адна з ініцыятыў, якія мы хацелі б ўзяць у якасці эксперыменту ў гэтым годзе , Каб убачыць, як шмат зместу, якое мы можам перавесці у іншых вусных і пісьмовых моў. Так што, калі вы маглі б мець зацікаўленасць ва ўдзеле ў гэтым праекце якім мы будзем прадастаўляць англійскай стэнаграмы і субтытры для лекцый курса і шортах і семінарах і секцыях і да т.п., калі вы свабодна гаварыць і пісаць свабодна нейкую іншую мову, мы хацелі б звярнуцца да вас у гэты праект, у якім вы ўзяць на сябе адну або некалькі відэа, пераводзячы іх на мову, вы ведаеце дастаткова добра. Каб даць вам прадстаўленне аб інтэрфейсе, там гэтым вэб-інтэрфейс , Якія мы будзем выкарыстоўваць, што створыць істотна карыстацкага інтэрфейсу, як гэта. Гэта было мне выкладанні некаторых Дзень усіх Святых назад, і на правай баку ў чорным побач з гэтымі пазнакамі часу, Вы ўбачыце розныя рэчы, якія выйшлі з маіх вуснаў у той дзень, , А затым пад ім вы зможаце перавесці на іншую мову менавіта тое, што адлюстраванне паміж імі, у дадзеным выпадку, ангельскай і, скажам, іспанскай мовы. Так што гэта на самай справе вельмі зручны інструмент. Вы можаце перамоткі назад і наперад вельмі лёгка з дапамогай спалучэнняў клавіш. Так што, калі вы хочаце прыняць удзел у гэтым эксперыменце, і вашы словы бачыў і чытаў на патэнцыйна тысячы людзей там, калі ласка, не саромейцеся ўдзельнічаць. Адно слова пра кацяня з панядзелка. Каб мы адправілі занадта страшна паведамленне, разумеем, што, як працоўны час прапануюць а таксама раздзелы прапануюць, дызайн, вядома, вельмі шмат , Што студэнты супрацоўнічаюць і казаць, каб працаваць праз праблемы наборы і праблемы разам, а на самай справе проста лінія зводзіцца да таго, зноў, работа, якую вы ў канчатковым выніку прадставіць, павінны быць вашай уласнай. І, шчыра кажучы, у працоўны час гэта цалкам нармальна, гэта цалкам можна чакаць нават пабалбатаць з некаторымі адзін побач з вамі. Калі ён або яна змагаецца з некаторымі тэму і вы, як: "Ну, што ж, дазвольце мне даць вам прадстаўленне аб некаторай радкі кода, які я напісаў," гэта нармальна, што адбываецца, і гэта вельмі спрыяе, я думаю, з працэсам навучання. Там, дзе лінія перасекла атрымлівае, калі галава нахіленая роду тут для занадта многіх секунд ці хвілін для таго, каб сапраўды толькі што былі магчымасці для разблакавання вашага сябра, і, вядома, калі усё становіцца абмен па электроннай пошце і Dropbox і да т.п., там таксама ёсць лініі. Такім чынам, усе сродкі адчуваць сябе камфортна і натхняе мець зносіны з сябрамі і аднакласнікам аб psets і больш і проста разумею, што тое, што вы ў канчатковым выніку прадставіць павінна быць сапраўды прадукт вашага творчасці, а не нехта іншы. І вось адна з прадметна-арыентаваных задач для pset2, які выйдзе позна ўвечары заўтра, пагрузіцца ў свет крыптаграфіі, , Якая з'яўляецца мастацтвам шыфравання або скремблирования інфармацыі, і гэта ў канчатковым рахунку ставіцца да свету бяспекі. Цяпер, бяспеку для большасці з нас прыходзіць у выглядзе даволі свецкага механізмаў. Ва ўсіх нас ёсць імёны карыстальнікаў і паролі, і ва ўсіх нас ёсць вельмі дрэнныя імёны карыстальнікаў і паролі, хутчэй за ўсё. Калі ваш пароль гэтак жа на некалькіх вэб-сайтах, што, верагодна, не лепшая ідэя, як мы абмяркуем бліжэй да канца семестра. Калі ваш пароль запісваецца на запіскі - не жарт - на вашым маніторы, гэта таксама не абавязкова лепшы дызайн, але даволі распаўсюджаная з'ява. І калі вы не выкарыстоўваеце крыптаграфію для шыфравання пароляў, яны асабліва ўразлівыя. Так што калі вы думаеце, што быць супер разумны, маючы схаваны дакумент Word дзесьці на вашым цвёрдым дыску, які мае ўсе вашы паролі але гэта ў тэчцы, што ніхто не збіраецца зазірнуць, што таксама не вельмі надзейны механізм. І тое, што pset2 прадставіць гэта мастацтва крыптаграфіі і скремблирования інфармацыі, так што такія рэчы, як паролі ўсё больш бяспечнай. Кантэкст тут з'яўляецца тое, што з небяспечнай дадзеных прыходзіць магчымасць зашыфраваць яго і, каб засакрэціць яго. І вось гэты, напрыклад, з'яўляецца прыкладам зашыфраванае паведамленне. Гэта на самой справе нешта гаворыць на англійскай мове, але гэта відавочна не цалкам відавочная. І мы прайшлі поўны круг сёння, каб дражніць адзін ад аднаго, што гэта сакрэтнае паведамленне тут. Але ў рэальным свеце кампутараў, рэчы, нават не падобна, што яны могуць быць ангельскія фразы. Напрыклад, гэта тое, што вы можаце знайсці на стандартнай Linux ці Mac або UNIX кампутар у файл, які быў калісьці называлі файла пароляў. У цяперашні час гэта былі перамешчаныя ў іншыя месцы. Але калі вы паглядзіце ў патрэбным месцы ў сістэме, вы ўбачыце не толькі ваша імя карыстальніка або іншых людзей у сістэме, але вы ўбачыце, зашыфраваную версію пароля. Сапраўды, слова склеп там мяркуе, што наступныя рэчы ў зашыфраваным выглядзе, і гэты шэраг, здавалася б, выпадковых літар і знакаў і лічбаў і г.д. могуць быць расшыфраваны толькі ў цэлым ведаючы некаторыя таямніцы - сакрэтнае слова, сакрэтны нумар - і так на самай справе, мастацтва крыптаграфіі ў канчатковым рахунку, зводзіцца да таго, давяраць нейкі і ведаючы тое, што хтосьці не робіць. Такім чынам, мы разгледзім гэта ў трохі больш падрабязна сёння і ў PSET ў будучыні. А зараз некалькі слоў пра Pass / Fail. Тым больш, што некаторыя з вас нырнуў у pset1, тэхніка, і цалкам новы свет для сябе, разумееш, што расчараванне і разгубленасць і толькі тэхнічныя цяжкасці, цалкам можна чакаць, Асабліва з першым PSET, дзе ёсць так шмат усяго новага, толькі знаёміцца ​​з Л. і кампакт-дыск, і ўсе гэтыя таемныя каманды і новую сераду, і гэта асобна ад фактычнага матэрыялу і праграмаванне сябе. Так разумею таксама, што ёсць, вядома, працоўныя гадзіны, якія існуюць у якасці апорнай канструкцыі. Раздзелы пачаць у бліжэйшую нядзелю. Але самае галоўнае, калі вы адчуваеце сябе проста, што гэта не свет для вас, разумееш, што гэта сапраўды проста трэба час. І калі б не гэтая магчымасць гадоў таму для мяне ўзяць клас прыдатны / не прыдатны, Шчыра кажучы, я ніколі б нават ступіць у класе. І вы можаце змяніць гэта да, скажам, пяты панядзелак вядома, так што калі вы на краі цяпер, разумееш, што замест галавы ў некаторых іншых вод у цэлым, гэтага, вядома, разглядаць толькі змены ў залік / незалік. Зноў жа, гэта не зусім гэтую культуру тут, у Гарвардзе прымаць рэчы залік / незалік так як усё на самой справе хоча дасягнуць або overachieve, але, шчыра кажучы, гэта выдатны спосаб паспрабаваць нешта з якія не могуць быць вам знаёмыя, і вы будзеце ў канчатковым выніку робяць, у большасці выпадкаў, цалкам нармальна, магчыма, многае да вашага здзіўлення. І больш канкрэтна, тое, што я думаю, што прыдатны / не прыдатны наогул робіць, Асабліва, як вы, магчыма, выпрабавалі з pset0, калі вы пакладзеце ў 10 гадзін, 15 гадзін, 25 гадзін у некаторых PSET і вы проста біцца галавой аб сцяну, і яна становіцца супер позна ўначы але вы зрабілі PSET 90% шляху, і вы проста не магу зразумець адну рэч, прыдатны / не прыдатны сапраўды здымае вастрыню класа, як гэта, дзе вы можаце сартаваць радасна кажуць: "Добра, я ведаю, што гэта не ідэальны, Але я працаваў ад сваёй задніцы на гэта, я вельмі шчаслівая з тым, дзе гэта скончылася ", і што будзе адпавядаць чаканням за залік / незалік. Так што майце гэта на ўвазе. Добра. Так што тыя з вас, хто спрабаваў выкарыстаць Гарвардскага універсітэта Wi-Fi, ведаю, што ёсць CS50 SSID, Wi-Fi злучэнне, якія плаваюць вакол што вы маглі б лепш поспеху. Гэта крыху парадаксальна, што пароль для гэтага, калі вы хацелі б паспрабаваць падключэнні да гэтага для лепшай хуткасці - і дайце нам ведаць, калі гэта не лепш - 12345, на ўсім шляху да 8 таму што 8 з'яўляецца больш бяспечнай, чым 5. Так што калі вам патрэбен Wi-Fi пароль, падлучыцца да бесправаднога CS50 тут, 12345678, і паведамленне пра CS50 Абмеркаваць калі вы да гэтага часу перыядычна ўзнікаюць праблем падлучэння, і мы дамо паўнамоцтвы, якія будуць ведаць гэта прастора. Добра. Так хутка тізер, асабліва для тых з вас, хто вентылятара хлопчыкаў і дзяўчынак ўсіх Яблык рэчы. Тое, што я выкапаў з некалькі гадоў таму быў гэты файл тут, iUnlock.c, толькі выгляд робяць больш канкрэтныя і больш складаныя некаторыя з найбольш асноўных праграм C мы ўжо пісалі. Так я адкрыў гэты файл, iUnlock.c. Ён даступны на старонцы Лекцыі на сённяшні дзень. На левай баку вы ўбачыце доўгі спіс функцый. Такім чынам, чалавек, які напісаў гэта напісаў шмат функцый, больш, чым проста асноўны. Ён выкарыстаў цэлую кучу бібліятэк тут, і калі мы пачнем прагорткі, што гэта на самай справе самы першы, я лічу, крэк для арыгінальнага iPhone. Калі Вы хацелі зрабіць джейлбрейк арыгінальны iPhone, а гэта значыць непрывязаныя джейлбрейк ад AT & T і фактычна ўсталяваць спецыяльнае праграмнае забеспячэнне на ім і рабіць тое, што Яблык не хачу, каб людзі робяць, кто-то ўзяў час, каб высветліць, як менавіта яны могуць выкарыстоўваць праграмныя памылкі, памылкі, памылкі, у праграмным забеспячэнні Apple, і такім чынам нарадзіўся iUnlock.c-- што калі вы сабралі яго на свой кампутар і ўсталяваць яго на iPhone , Які быў падлучаны да кампутара з дапамогай, скажам, кабель USB, гэта дасць вам адміністрацыйнай або прывілеі на вашым iPhone і дазваляюць зрабіць вельмі многае, што вы хочаце. І вось там быў гэты займальны кошкі-мышкі паміж Яблыкам і астатняга свету, у прыватнасці, так як яны, як і шматлікія кампаніі, спрабуюць заблакаваць свае рэчы ўніз, так што вы можаце зрабіць толькі з ім, што яны маюць намер. Але дзякуючы такім людзям, як гэта і разумення нізкага ўзроўню дэталяў - і ў гэтым выпадку C праграмавання - і шмат знаёмых канструкцый што мы пачалі гуляць, вы зможаце па-сапраўднаму выкарыстоўваюць апаратную такім чынам, вы лічыце патрэбным, і не абавязкова некаторых юрыдычнай асобай. Так, напрыклад, я паняцця не маю, што ўсё гэта робяць, але GetVersion гучыць даволі проста, і, падобна, гэта функцыя, што гэты чалавек напісаў. Гэта зойме нейкае цэлае лік у якасці аргументу, нічога не вяртае, але, здаецца, завесы з цыклу тут і, калі ўмова, калі ўмова перапынку, і так ці інакш звязана з нумарамі версій, калі пракруціць ўніз, хоць многія з гэтых ключавых слоў будзе новы. І ёсць шмат функцый тут мы ніколі не бачылі і не маглі б ніколі не ўбачыць на працягу семестра. У рэшце рэшт, гэта варта тым жа правілам і логіцы, што мы гулялі з да гэтага часу. Так што гэта занадта стары, каб зламаць ваш iPhone або 3s 4s 5s або неўзабаве гэтыя дні, але ведаю, што ўсё гэта вельмі атрыманыя з гэтага свету, што мы нырнулі. Давайце зірнем на некалькі больш просты прыклад: гэта, проста сагрэцца з некаторымі сінтаксісу, а таксама некаторыя іншыя тыпы дадзеных што мы казалі, але сапраўды не бачыў у C. Гэты файл называецца positive1.c, і ў каментарах на вяршыні, гэта проста патрабуе, каб карыстальнік забяспечыць станоўчае лік. Так што гэта прыклад зрабі той час як цыкл, які добры для карыстальнікаў інтэрактыўных праграм дзе вы павінны сказаць карыстачу, каб нешта зрабіць, і калі яны не супрацоўнічаюць вы крычаць на іх або адхіліць іх ўводу. Справа ў кропку: я збіраюся рабіць радках 19 да 24 тых часоў, пакуль карыстач не даў мне станоўчае лік. Гэтая дэталь тут, на лініі 18, чаму я заяўляю, п вышэй за ўсё гэтага цыклу пабудаваць у адрозненне ад прама побач з лініяй 22, дзе я на самой справе клапоцяцца, каб атрымаць п? Так. [Студэнт] Scope. >> Так, так што гэтае пытанне з вобласці бачнасці. І з пункту гледжання непрафесіяналы, што робіць вобласць ставіцца? Так. >> [Неразборліва адказ студэнта] >> Ці можаце вы гаварыць гучней? [Студэнт] Дзе можна атрымаць доступ да гэтай зменнай. >> Perfect. Дзе Вы можаце атрымаць доступ да пэўнай зменнай. І наогул, правіла да гэтага часу было, што сфера некаторыя зменныя вызначаецца самай апошняй фігурныя дужкі, што вы бачылі. І таму ў дадзеным выпадку, калі я зрабіў памылку, абвясціўшы п на лініі 22, што лінія будзе працаваць. Я хацеў бы атрымаць цэлы лік, і я б паставіў яго ў гэтай зменнай п у радку 22, але якая радок кода цяпер не ведаю, што я кажу? >> [Студэнт] 25. [Малая] 25, і аказваецца, што 24, а таму, што ў гэтым выпадку ён выходзіць за межы фігурныя дужкі. Так што проста трохі непрыемнасць, але вельмі лёгка вырашаецца проста абвясціць зменную за межамі самой функцыі. Пазней мы ўбачым, сёння вы можаце зрабіць яшчэ адзін крок і вы нават можаце атрымаць крыху гультаяваты. І гэта не рэкамендуецца наогул, але вы можаце нават атрымаць лянівага і пакласці зменную ў глабальным маштабе, так бы мовіць, не ўнутры функцыі, а не ўнутры цыклу, але ў самім файле, за межамі ўсіх функцый вы напісалі, як я зрабіў тут, на лініі 15. Гэта, як правіла, з неадабрэннем, але разумею, што гэтае рашэнне часам да іншых праблемах, як мы ў канчатковым рахунку бачыць. Так што цяпер мы пакінем гэта так, але давайце паглядзім, калі мы можам перапісаць гэта толькі, каб пачаць выказаць сябе крыху па-іншаму. Гэтая праграма, проста каб быць ясна, з'яўляецца positive1. Дазвольце мне ісці наперад тут і ў маім акне тэрмінала зрабіць positive1, Enter. Кампілюе парадку. Я збіраюся запусціць positive1, націсніце Enter. Я патрабую, каб вы даць мне цэлае станоўчае лік. Я скажу -1. Гэта не працуе. 0, 99. Гэта падобна на працу. Можа быць, не самы строгі тэст, але па крайняй меры гэта добрая праверка наяўнасці свядомасці што мы знаходзімся на правільным шляху. Так што цяпер дазвольце мне ісці наперад і адкрыць версію 2 гэтага, і чым адрозніваецца ўжо? Ён рэалізуе тую ж самую рэч, але тое, што скача, як выразна ў гэты раз? Гэта BOOL ў зялёны колер. Ён будзе выдзелены зялёным колерам, гэта ключавое слова вядома як лагічны, які з'яўляецца тыпам дадзеных. Яна не прыходзіць пабудаваны ў для ўсіх версій C. Вам неабходна ўключыць канкрэтную бібліятэку. У нашым выпадку, я ўключыў CS50 бібліятэку, так што ў нас ёсць доступ да BOOL. Але ў радку 18, мы, здаецца, ёсць лагічнае значэнне тут называюць ўдзячныя. Я мог бы назваць гэта што заўгодна, але я назваў яго ўдзячная проста выгляд перадаюць сэнсавае значэнне. Такім чынам, першапачаткова на лініі 18, я, мабыць, не ўдзячны таму што лагічнае значэнне ўдзячныя ініцыялізуецца ілжывым у радку 18. І тады здаецца, што я зрабіў тут у радках з 21 па 23 гэта я толькі часткова перапісаць маю логіку. Так што не функцыянальна розныя, але ў радку 22 цяпер я магу праверыць, калі Int карыстальнік прадаставіў больш 0, то я проста змяніць значэнне ўдзячныя праўда. А навошта мне гэта рабіць? Таму што ў радку 25, па-відаць, я збіраюся праверыць стан. У гэтага цыкла ў той час як ўдзячны з'яўляецца ілжывым. Так што я прапанаваў гэта ў якасці альтэрнатывы версія 1 таму што гэта па меншай меры трохі больш інтуітыўным, магчыма, гэта крыху больш абгрунтаванай на англійскай мове. Такім чынам, выканайце наступныя дзеянні, пакуль вы не ўдзячныя або пры ўдзячныя з'яўляецца ілжывым. І на гэты раз я таксама, мабыць, не люблю ўспамінаць тое, што карыстач набраў у таму што апавяшчэння няма зменнай п, так на самай справе, маленькая белая хлусня там. Функцыянальна праграма трохі адрозніваецца, як толькі мы пяройдзем да ніжняй яго таму што я не памятаў, што п. Але я хацеў паказаць тут, што, хоць мы бачылі GetInt і GetString выкарыстоўваецца на правы бок знака роўнасці да гэтага часу так што мы памятаем значэнне, тэхнічна, гэта не строга абавязкова. Калі па якіх-небудзь прычынах вы проста не клапоцяцца, каб захаваць значэнне, Вы проста хочаце праверыць значэнне, заўважылі, што мы можам проста напісаць гэта як GetInt, адкрытая дужках, побач хлопец. Гэтая функцыя будзе вяртаць значэнне, як мы ўжо казалі. Гэта будзе вярнуць вам Int. І таму, калі вы ў думках думаю, што гэта адбудзецца, пры ўводзе ў 99, GetInt вяртае лік 99, і так канцэптуальна, гэта як бы мой код быў на самай справе гэтага. Так, калі 99 сапраўды больш 0, то ўдзячны становіцца сапраўдным, Затым лінія 25 рэалізуе ох, мы зрабілі, таму што я зараз ўдзячны, і ў радку 26, мы проста кажам: "Дзякуй за натуральнае!" Як бы там ні здарылася быць. Зараз давайце зробім невялікі сінтаксічны цукар тут, так бы мовіць. Давайце паглядзім, калі мы можам прыбіраць гэтую лінію 25 з гэтым трэці і апошні варыянт, у positive3. Звярніце ўвагу, з той толькі розніцай, што зараз гэта радок кода? >> [Студэнт] 25. >> [Малая] Так, 25. І мы сапраўды не бачыў гэты трук, але яго мы бачылі клічнік у панядзелак, , Які пазначае, што? >> [Студэнт] Не. >> Ня або адмаўленне. Так што бярыце лагічнае значэнне і перавярнуць яго значэнне. Праўда, становіцца ілжывым, ілжывае становіцца сапраўдным. Так што гэта, я хацеў бы прапанаваць, нават крыху больш інтуітыўным спосабам напісання кода таму што я да гэтага часу ўдзячны ініцыялізацыі ілжывым, я ўсё яшчэ раблю наступнае, Я паставіў ўдзячныя дакладна, калі прыйдзе час, але цяпер вы сапраўды можаце проста перавесці гэты код вусна злева направа, а (благодарны!), таму што выбуху або клічнік пазначае паняцце не так што пакуль не ўдзячныя. Такім чынам, яшчэ раз, мы не ўведзены новыя паняцці як такога. Мы гаварылі пра лагічных назад, калі мы гулялі з нуля, але разумею, зараз мы можам проста пачаць пісаць наш код па-рознаму. Такім чынам, асабліва ў pset1 калі вы, здаецца, спрабуе высветліць спосаб, каб напісаць некалькі праграм, Шанцы Вам пашанцавала, таму што там можа быць любы лік рашэнняў што вы можаце выпадкова сустрэць. Напрыклад, гэта знаходзіцца ўсяго ў 3 нават для простых праграм. Добра. А зараз успомнім ў панядзелак мы выйшлі на гэтую цыдулку з вяртаннем значэння. Такім чынам, у першы раз, калі мы напісалі праграму, якая не проста асноўны; яна таксама мае сваю ўласную функцыю, якую я напісаў тут. Такім чынам, у радку 31 па 34 я рэалізаваў функцыю куб. Гэта не комплекс. Гэта проста * а * а ў гэтым выпадку. Але, што важна пра яго, што я бяру ўваход у выглядзе і я вяртаюся выхад у выглядзе * а *. Так што цяпер у мяне ёсць магчымасць, гэтак жа, як я раней з prinf адзін, для выкліку гэтай функцыі, выклікаўшы функцыю куб. І куб функцыя прымае некаторыя ўваход, і куб функцыя вяртае некаторы выхад. У адрозненне ад Printf проста нешта зрабіў. Яна не вяртае нічога, што мы клапаціліся аб, хоць, як у бок яно вяртае значэнне; Вы проста ўвогуле ігнаруюць яго. Printf проста нешта зрабіў. Гэта быў пабочны эфект друку на экране. У адрозненне ад тут, у нас ёсць куб функцыі, якія на самай справе вяртае нешта. Так што для тых, хто знаёмы з гэтым, гэта даволі простая ідэя. Але для тых, хто менш знаёмы з гэтай ідэяй якія праходзяць у ўваходы і выхады вяртаюцца, Давайце паспрабуем проста нешта супер проста. Хто-небудзь зручныя падышоўшы на этапе коратка? Вы павінны быць знаёмыя з камерай на вас. Да? Добра. Як цябе клічуць? >> [Студэнт] Кен. >> Кен. Добра. Кен, давай ўверх. Кен будзе функцыя выгляду тут. Давайце пойдзем далей і зрабіць гэта. Давайце трохі фантазіі. Вельмі прыемна. Сардэчна запрашаем у цэнтры сцэны. Добра. Давайце хіт гэтай кнопкі тут. Добра. Так што тут у вас ёсць сучасны дошцы, і што я з'яўляецца асноўнай функцыяй, напрыклад, і ў мяне няма IPad ў руках. Я сапраўды не памятаю, як - Ну, я не магу сказаць. Я сапраўды не маюць добры почырк, і г.д. Таму я хачу, каб нешта надрукаваць на экране для мяне. Я які з'яўляецца асноўнай праграме, і я буду ў вас кажуць, што гэта запісаўшы яе ў маёй курынай нуля, а затым міма вас ўваход. Так па-дурному, хоць гэта практыкаванне, паняцце функцыі і выкліку функцыі і вяртанне функцыяй сапраўды зводзіцца да гэтага. Я галоўны, я толькі што напісаў Printf, цытата-канец цытаты нешта на экране, Я іду ў гэтую праграму, і як толькі Printf выклікаецца, ён прымае адзін аргумент або адзін параметр часам у падвойныя двукоссі. Вось гэта аргумент. Я перадаю яго Кен. Ён уяўляе сабой чорны скрыню, напісаў некалькі гадоў назад якія, відавочна, ведае толькі як друкаваць рэчы на ​​экране. Такім чынам выканаць. Гэта не дрэнна. Вельмі добра. Так што цяпер Кен робіцца выкананне. Яму трэба, каб перадаць мне нічога наўзамен? Не тое, што мы бачылі да гэтага часу. Зноў жа, Printf ці на самай справе вяртае лік, але мы збіраемся ігнараваць, што на дадзены момант таму што мы ніколі не выкарыстоўвалі яго. Дык вось яно што для Кена. І вось цяпер асноўныя бярэ на сябе кантроль над праграмай яшчэ раз таму што радкі кода, Printf, ажыццяўляецца выкананне. І мы рухаемся да нашай чынам, выкананне любых іншых ліній ёсць. Такім чынам, цяпер давайце паспрабуем трохі іншы прыклад. На гэты раз тут, давайце спачатку ачысціць экран, і на гэты раз мы будзем рабіць вымярэння кубатуры функцыі, але на гэты раз, я думаю, выходную значэнне. Так што давайце ісці наперад і рабіць гэта. Цяпер у мяне ёсць радок кода, якая кажа х атрымлівае куб х. Радок кода, нагадаем, выглядае наступным чынам: х = куба (х); Так як гэта будзе працаваць? Давайце пойдзем далей і даць вам белы экран. Я збіраюся запісаць зараз значэнне х, якія ў дадзены момант часу, здараецца, скажам, 2, каб трымаць яго простая. Я напісаў на лістку паперы значэнне 2, які з'яўляецца маім значэння х. Я перадаю яго Кен. >> А я проста пішу адказ? >> Так, давайце проста напісаць адказ. Добра. І цяпер ён павінен вярнуць мне што-небудзь. Perfect. Прыемна пераход. Так што цяпер ён працягвае мне назад значэнне 8 у дадзеным выпадку, і што мне з ім рабіць? На самай справе - паглядзім, атрымаць гэта права. Што я буду з ёй рабіць? Цяпер я збіраюся прыняць гэта значэнне і на самай справе захоўваць яго ў тыя ж біты ў памяці. Але заўважце, я трохі змагаюцца тут. Я крыху зьбянтэжаны, таму што дзе ж я на самой справе запісаць значэнне х, таму што я толькі што зрабіў фізічна руку Кен лісток паперы, які быў значэнне 2, які быў х, і, сапраўды, гэта менавіта тое, што адбылося. Вось і атрымліваецца, што пры выкліку функцыі, і вы перадаеце ў якасці аргументу напрыклад, прывітанне, свет, ці вы перадаеце ў якасці аргументу як 2, Як правіла, вы перадаеце копію гэтага аргументу. І гэтак жа, як я запісаў нумар 2 тут і перадаў яго Кен, , Што павінна азначаць, што ў мяне яшчэ ёсць копія значэння 2 дзесьці таму што сапраўды, цяпер, калі я атрымаў назад значэнне 8, мне трэба вярнуцца ў аператыўнай памяці і фактычна запісаць 8, дзе я калісьці быў нумар 2. Такім чынам, візуальна, памятаеце пра гэта паняцці праходзіць у літаральным сэнсе, копію значэння. Кен робіць сваю справу, працягвае мне ў адказ нешта - у гэтым выпадку значэнне, напрыклад, 8 - а то ў мяне нешта зрабіць з гэтым значэннем, калі я хачу захаваць яго ваколіцах. Так што ўсё гэта вернецца, каб быць занадта добра знаёмыя ў хуткім часе. Дзякуй вам вялікі за гэта дэма тут, Кен. [Апладысменты] Вельмі добра зроблена. Давайце паглядзім, як гэта ў канчатковым выніку звязана з некаторымі з выкліку функцыі, што мы робім тут. Дазвольце мне ісці наперад і вярнуць нас да вымярэння кубатуры прыклад. Звярніце ўвагу, што калі мы сапраўды хочам пачаць прымаць гэта далей, мы збіраемся павінны памятаць пра тое, што колькасць х, што гэта перадаецца тут адрозніваецца ад таго, што на самой справе перадаецца ў функцыю. Такім чынам, яшчэ раз, гэта праходзіць міма копіі стане вельмі дарэчныя ў адну хвіліну. Давайце зірнем на тое, што не зусім правільна працаваць яшчэ. Я збіраюся ісці наперад і адкрыць Трэці прыклад памылкі, якая з'яўляецца недасканалай па сваёй прыродзе, і гэта завецца buggy3 і рэалізуе замены. Тут у нас ёсць асноўныя функцыі, якія х і ў адвольна усталёўваецца ў 1 і 2, адпаведна. Мы маглі б выкарыстоўваць GetInt, але нам проста трэба простае практыкаванне, такім чынам, гэта жорстка, як 1 і 2. У радках 21 і 22, мы, мабыць, раздрукуйце х і у, 1 на лінію. Затым у радку 23, я сцвярджаю, я абмен гэтымі значэннямі, кропка, кропка, кропка. Я мабыць выкліку функцыі ў радку 24 званым своп, які прымае 2 аргументаў. Гэта цалкам законна для функцый ўзяць 2 аргументы. Мы бачылі Printf гэта зрабіць ужо. Такім чынам, своп-відаць, мае х і у, і, як мяркуе яго назва, Я спадзяюся, што ён збіраецца памяняць гэтыя 2 значэння. Дык вось я сцвярджаю, у радку 25 "перастаноўкі"! і я перадрукаваць х і ў пры ўмове, што яны сапраўды былі памянялі месцамі. Але калі я сапраўды запусціць гэтую праграму - дазвольце мне адкрыць акно тэрмінала, дазвольце мне зрабіць buggy3 - як вынікае з назвы, гэта не скончыцца добра таму што, калі я ударыў Enter, заўважылі, што х = 1, у = 2, і ўсё ж у канцы праграмы, яны ўсё яшчэ, па сутнасці, тое ж самае. Такім чынам, на аснове дэманстрацыі толькі цяпер з Кеном, тое, што адбываецца на самай справе? Давайце пагрузіцца ў гэтую своп функцыі. Гэта супер кароткія. Гэта ўсяго толькі некалькі радкоў кода доўга. Але тое, што асноўная праблема заснавана на просты гісторыі, расказанай тут з Кеном? Чаму падпампоўкі не працуе? [Студэнт] вы захоўваеце на копію, а не зменная. Менавіта так. Мы захоўванні на копію, а не саму зменную. Іншымі словамі, своп-відаць, мае 2 аргументу, INT, і гэта ўмоўна называць а і б, і тут я прайшоў па х і у, якія з'яўляюцца адпаведна 1 і 2, але я не ў літаральным сэнсе якая праходзіць у х, я не ў літаральным сэнсе якая праходзіць у у, Я перадаю копіі х і копію у. Гэта амаль як калі б вы скапіявалі і ўставілі ў своп значэння, якія вы хочаце, каб ён на самай справе маніпуляваць. Так што, калі гэта так, калі я пачала праграмы выканання радкі 35, то 36, калі я дабіраюся да лініі 37, на дадзены момант у гэтай гісторыі, што значэнне? У гэты момант у гісторыі, радок 37, што з'яўляецца значэнне ў гэтай кропцы? >> [Студэнт] 1. [Малая] Яна проста павінна быць 1, правы, таму што х быў прыняты ў якасці першага аргументу, і гэтая функцыя проста адвольна называе свой першы аргумент. Сапраўды гэтак жа ёсць у другога аргументу, і гэта проста адвольна выкліку 2. б аргумент. Гэтая дыхатамія на самай справе даволі проста растлумачыць. Падумайце пра гэта. Ніхто з нас не сустракаў чалавека, які напісаў Printf, таму, вядома, ён або яна не ведае, што нашы зменныя праз 30 гадоў будуць называць. Так што павінна быць адрозненне паміж, што вы называеце зменныя ў функцыях вы пішаце і што вы называеце зменныя ў функцыях вы тэлефануеце ці выкарыстанне. Такім чынам, іншымі словамі, я напісаў мае зменныя х і у, Але калі нехта іншы напісаў своп функцыі, ён або яна, вядома, не ведаў бы, што мае зменных будзе называцца, так разумею, што гэта, чаму ў вас ёсць гэтая дваістасць імёнаў. Тэхнічна, я мог бы зрабіць гэта, супадзенне, але яны будуць па-ранейшаму перадаецца ў якасці копіі. Было б проста чыстае супадзенне эстэтычна, калі гэты чалавек, які напісаў своп былі выкарыстаныя тыя ж імёны. Такім чынам, на дадзены момант у гэтай гісторыі, радок 37, 1, B 2, а цяпер я пераходжу да памяняць іх месцамі. Перш за ўсё, дазвольце мне на самай справе зрабіць гэта значна прасцей. Я не ведаю, што тыя 3 радкі кода рабілі. Дазвольце мне зрабіць гэта: B = A, A = B; зроблена. Чаму гэта зламаны, лагічна? Гэта свайго роду інтуітыўныя рэчы, ці не так? Так а становіцца Коммерсанта і Коммерсанта становіцца, але праблема ў тым, што як толькі лінія 37 выконвае, што значэнне А і В? Тое ж самае, 1, таму што вы сходу, так бы мовіць, вы змянілі б роўным. Таму, як толькі лінія 37 была выкананая, гэта выдатна, зараз у вас ёсць 2 асобніка № 1 Унутры гэтай функцыі, так што потым, калі вы кажаце ў радку 38 = B, Вы відаў разьбовых таму што вы проста прысваенні 1 да 1. Ты накшталт страціў значэнне, якое вы клапаціліся аб. Такім чынам, у арыгінальную версію гэтай, звярніце ўвагу, што я зрабіў. Замест гэтага я была трэцяя радок кода, якая выглядала наступным чынам. Я заяўляю, часовых зменных. Tmp гэта вельмі распаўсюджанае імя для часовай зменнай, і гэта Int таму што ён павінен адпавядаць таму, што я хачу зрабіць копію. Я захоўваю копіі ўнутры TMP, таму, як толькі лінія 37 была выкананая, Значэнне гэта - хуткая праверка наяўнасці свядомасці - 1, значэнне Ь 2, і значэнне TMP таксама 1. Так што цяпер я выканаю лініі 38. Як толькі лінія 38 выконваецца, прымае значэнне б. І У 2, так што цяпер 2. Такім чынам, на дадзены момант у гэтай гісторыі, роўна 2, B 2, а TMP 1, так што зараз лагічна, мы можам значэння проста пляснуць TMP ў у б і мы зрабілі. Такім чынам, мы вырашылі гэтую праблему. На жаль, калі я запускаю гэтую праграму ў такім выглядзе, гэта на самай справе не памяняць любыя значэння. Але каб быць зразумелым, чаму? Я усталяваў лагічныя задачы з усяго хвіліну назад, але зноў жа, калі я запускаю гэтую праграму, х і у, застаюцца нязменнымі Да канца выканання праграмы. [Неразборліва каментар студэнт] >> Мы не вярнуліся нічога, так што гэта праўда. Але, аказваецца, ёсць невялікая праблема тут, таму што да гэтага часу, Адзінае, што мы змаглі вярнуць гэта адно, і гэта абмежаванне C. Вы можаце вярнуць толькі сапраўды адно значэнне, і ў гэтым выпадку я трохі затрымаўся тут таму што я мог вярнуць новае значэнне х, ці я мог бы вярнуць новае значэнне ў, але я хачу і назад. Такім чынам, вяртання не простае рашэнне тут. Але праблема ў корані чаму? Што мы на самай справе памяняліся месцамі? [Студэнт] а і б. >> А і б. Але і б з'яўляюцца копіямі х і у, якая азначае, што мы толькі што зрабілі ўсе гэтыя работы, Мы толькі што правялі 3 хвіліны гаворым аб функцыі падпампоўкі і ўсе 3 з гэтых зменных, і гэта выдатна, зусім правільна ў ізаляцыі, але і сферу б толькі ў гэтых радках. Так як цыкл, калі вы аб'явіце цэлае я ўнутры цыклу, Аналагічна, калі вы аб'явай і б ўнутры функцыі, якія вы напісалі, яны сапраўдныя толькі ўнутры гэтай функцыі, а значыць, як толькі своп зрабіць выкананне і мы пераходзім ад лініі 24 у лінію 25, х і ў не змянілася. Вы проста марна шмат часу, абмен копіямі зменных. Вось і атрымліваецца, што рашэнне гэта на самай справе, не відавочна. Гэта не зусім дастаткова, каб вяртаць значэння, таму што мы можам толькі вярнуць значэнне 1, і я сапраўды хачу памяняць х і ў ў той жа час, так што мы збіраемся мець, каб вярнуцца да гэтага. Але цяпер разумею, што пытанне прынцыпова вынікае з таго факту, што А і У з'яўляюцца копіямі і яны знаходзяцца ў сваёй уласнай вобласці. Давайце паспрабуем вырашыць гэта ў некаторым родзе. Дазвольце мне на самай справе пракруціць таму тут і адкрыць, скажам, чацвёрты варыянт гэтага, buggy4. Што з гэтай нагоды? Гэта падобныя, але больш простую задачу, каб глядзець на, перш чым прыняць ўдар на яе рашэнне. Гэтая праграма называецца прырашчэннем, і ён, відавочна, ініцыялізуе цэлы лік х 1 у радку 18. Я тады сцвярджаць, х = 1, тады я прэтэндаваць "інкрэмент ..." Затым я выклікаю прырост, але затым у лініях 22 і 23, я сцвярджаю, што гэта было павялічваецца, Я сцвярджаю х зараз бы гэта ні было - 2, па-відаць, - але гэтая праграма глючыць. У чым праблема? Так. >> [Неразборліва адказ студэнта] >> Менавіта так. Такім х было абвешчана, відавочна, у радку 18. Гэта значыць, у фігурных дужках асноўнага аўтара. Так што адназначнага адказу тут з'яўляецца тое, што ў той час як х існуе тут, яна не існуе ў радку 32, так што гэтая праграма на самай справе нават не будзе кампілявацца. Кампілятара, калі я спрабую кампіляцыі дадзенага кода будзе крычаць на мяне Аб некаторых неаб'яўленай ідэнтыфікатар ці нешта ў гэтым родзе. На самай справе, давайце паспрабуем. Гэта робіць buggy4. Там яна ёсць. Выкарыстанне 'X' неаб'яўленай ідэнтыфікатар ў радку 32. А на самай справе, давайце будзем больш выразна тут сёння, так што гэта карысна ў працоўны час і дома. Звярніце ўвагу, што гэта трохі загадкава напісана. Але тое, што Clang мае крычаў на нас, сказаўшы buggy4.c: 32:5, на самай справе карысна. Гэта азначае, што памылка ў радку 32 на пазіцыю сімвала 5. Такім чынам, 1, 2, 3, 4, 5. Гэта, на самай справе, дзе праблема. А таксама, таксама майце на ўвазе, у працоўны час і на хаце, мне пашанцавала тут. У мяне ёсць адна памылка. Гэта збіраецца быць адносна лёгка выправіць. Але калі вы атрымаеце ўвесь экран поўны пераважная паведамленні пра памылкі, яшчэ раз усвядоміць, што ніжні можна проста быць сімптомам самых верхніх адзін. Так заўсёды ганяцца за вашы памылкі зверху ўніз таму што там можа быць проста эфект ланцужку , Які прапаную вам мець нашмат больш праблем, чым вы на самой справе. Такім чынам, як мы можам гэта выправіць, калі маёй мэтай з'яўляецца, каб павялічыць х? >> [Студэнт] Зрабіць х глабальнай. Такім чынам, мы можам зрабіць глабальнае х. Давайце ярлык, які я папярэджваў аб больш ранніх, але чорт вазьмі, нам проста трэба хутка выправіць, так што давайце проста скажам, Int х тут. Гэта робіць х глабальнай. Так што цяпер асноўным мае да іх доступ і прырашчэнне мае да іх доступ, і таму дазвольце мне ісці далей і сабраць гэта цяпер. Зрабіць buggy4, Enter. Здаецца, для кампіляцыі цяпер. Давайце запусцім buggy4. І, здаецца, на самай справе працуе. Гэта адна з гэтых рэчаў, якія рабіць, як я кажу, а не як я раблю, як я толькі што зрабіў тут, таму што ў цэлым, нашы праграмы збіраюцца атрымаць значна цікавей і нашмат даўжэй, чым гэта, і калі ваша рашэнне жыццёвых праблем проста пакласці ўсе зменныя ў пачатак файла, Вельмі хутка ў праграмы атрымліваюць жудасна цяжка кіраваць. Гэта становіцца ўсё цяжэй прыдумляць новыя імёны зменных, становіцца ўсё цяжэй зразумець, што пераменная рабіць тое, што, і г.д. Увогуле, гэта не вельмі добрае рашэнне. Так давайце зробім гэта лепш. Мы не хочам выкарыстоўваць глабальную зменную тут. Я хачу, каб павялічыць х, так што я мог бы, відавочна - У рэшце рэшт, гэта накшталт дурной гісторыі, таму што мы проста робім гэта - але калі б я не ведаў пра тое, што аператар або я не змог змяніць яго ў асноўны сабе, Як яшчэ я мог ажыццяўляць Кен сюды на гэты раз не ў кубе, але для павелічэння? Як змяніць гэтую рэч тут? Так. [Студэнт] Pass х, а затым вярнуцца [неразборліва] >> Добра, добра. Так чаму б мне не прайсці ў х, а затым, а не вяртаць яго, чаму я не проста вярнуць х + 1. Яшчэ пара рэчаў трэба мяняць тут. Я знаходжуся на правільным шляху. Што яшчэ трэба наладзіць? Нехта іншы. Так. [Неразборліва адказ студэнта] Мне трэба, каб змяніць тып звароту прыросту таму што гэта не ануляваць. Пустэча нічога не сродак вяртаецца, але ясна, цяпер гэта, так што гэта трэба змяніць, каб - >> [студэнт] Int. INT ў адпаведнасць з тым, што я на самой справе вяртання. Цяпер нешта яшчэ па-ранейшаму багі тут. Так. [Неразборліва адказ студэнта] >> [малая] Так што мне трэба павялічваць х? [Неразборліва адказ студэнта] >> [малая] Ах, так мне трэба перадаць х. Так што мне трэба зрабіць гэта тут. >> [Неразборліва каментар студэнт] [Малая] Такім чынам, прататып, я павінен змяніць гэта тут. Такім чынам, гэта павінна стаць INT, гэта павінна стаць - хм, я на самой справе ёсць памылка тут. Давайце выправім гэта ў першую чаргу. Што гэта на самай справе быць? Гэта павінна быць нешта Int. Гэта можа быць х, але, шчыра кажучы, калі пачаць называць ўсіх вашых зменных х, гэта будзе ўсё менш і менш ясна, што ёсць што. Так што давайце проста адвольна выбраць розныя наймення для майго дапаможныя функцыі, Функцыі я пішу. Мы будзем называць яго, ці мы маглі б назваць гэта - Давайце назавем гэта лік будзе яшчэ больш відавочным. І тады я павінен вярнуць усё, што нумар плюс 1, і цяпер я павінен змяніць 1 рэч, тут і яшчэ адна рэч тут. Што я павінен змяніць у радку 21 у першую чаргу? >> [Неразборліва адказ студэнта] [Малая] Я павінен прызначыць яго на х. Я не магу проста патэлефанаваць прырашчэнне (х). Мне трэба памятаць адказ на змяненне значэння х на левай баку. І хоць х зараз знаходзіцца на левай і правай, гэта цалкам нармальна таму што правая частка запускаецца на выкананне першага затым атрымлівае пляснуўся ў левай рэч - х у гэтым выпадку. І тады, нарэшце, гэта лёгка выправіць цяпер. Гэта павінна проста адпавядаць таму, што вось унізе, унутр нумар. Такім чынам, цэлы букет змяненняў сапраўды дурное функцыі але прадстаўнік рэчаў, якія мы больш хочам зрабіць. Так што buggy4. Я дзесьці нашкодзіла. О, мой Бог. Пяць памылак у 6-малыя праграмы. Так што ж здарылася на лініі 18, сімвал 5? Так што я павінен заявіць пра гэта, унутр. Давайце паглядзім. Ёсць цэлая куча іншых памылак. О, Божа мой - 19, 18, 21 - але, зноў жа, давайце проста ачысціць экран, кіраванне L тут, і перазапусціць Clang. Такім чынам, 5 задач на самай справе проста, што 1. Такім чынам, цяпер давайце запусцім buggy4, Enter. Вось так, х быў павялічаны правільна. Добра. Любыя пытанні аб тым, як павялічыць лік? Так. [Неразборліва пытанне студэнта] >> Добры пытанне. Як гэта, што я магу проста змяніць х на нумар, і праграма будзе ведаць адразу ж? Зноў жа, думаю пра яго, як гэта абстракцыя. Так што, калі я галоўны і Кен прырост, шчыра кажучы, я не хвалюе, што Кен называе свой iPad. Мяне не хвалюе, што ён называе ўсё, што мае дачыненне да яго рэалізацыі гэтай функцыянальнасці. Гэта дэталі рэалізацыі, якія я, галоўнае, не трэба клапаціцца пра. І так проста змяніўшы яго паслядоўна ўнутры функцыі - тут нумар і нумар тут - Усё гэта займае так шмат часу, як я перакампіляваць. Гэта накшталт як калі вы думаеце пра многіх з нас, тых, у каго правы кіроўцы якія заехалі або калі вы нават заехаў у аўтамабіль, Большасць з нас не ведаюць, як машына працуе пад капотам. І літаральна, калі вы адкрываеце капот, большасць з нас - я ў тым ліку - не збіраецца ведаю, што мы глядзім на, накшталт як вы можаце адчуваць сябе ў такія рэчы, як гэта прама цяпер. Але мы сапраўды не павінны клапаціцца, як машына працуе, мы не павінны клапаціцца, што ўсе стрыжні і поршняў і кабеляў ўнутры аўтамабіля на самай справе робіць. Так нешта кшталту, што вы называеце поршань тут не мае значэння ў дадзеным выпадку. Тая ж самая ідэя. Так. >> [Неразборліва пытанне студэнта] Калі ёсць некалькі відаў пераменная момант ха назад, Вы, праграміст, давядзецца мяняць іх паўсюль. Ці вы маглі б зрабіць літаральна файлаў, меню, а затым Знайсці, Замяніць - нешта ў гэтым родзе - але вы будзеце мець, каб зрабіць гэтыя змены самастойна. Вы павінны быць паслядоўныя. >> [Студэнт] Пры наяўнасці некалькіх зменных [неразборліва] Вызначаным парадку, як тут, калі б гэта было Int іншы нумар? >> [Студэнт] Правільна. [Малая] Так. Замовіць мае значэнне, калі вы выклікаеце функцыю. Так што калі я тэлефанавалі прырост тут нешта ў гэтым коскі, ёсць прамое адлюстраванне. Першая зменная, як там гэта завецца, зрабіў копію першага аргументу тут. Выбачайце. Гэта не павінна быць круглых дужках. Другі аргумент лініі з другім. Так парадку, ды, пытанняў. Добра. Выбачайце. Я ўзяў доўгі шлях, каб дабрацца там. Іншыя пытанні? Добра. Такім чынам, давайце паглядзім, калі мы не можам намаляваць карціну таго, што адбываецца на самай справе тут пад капотам, так бы мовіць. Гэта прастакутнік, які можа прадстаўляць памяці кампутара. Нават калі вы не ўяўляеце, як памяць працуе ці як RAM работ, па крайняй меры, выказаць здагадку, што ў вас ёсць пучкі яна ў гэтыя дні. У вас ёсць мегабайт гэта, у вас ёсць гігабайты гэта, і мы ведаем, ад тыдня 0 байт, што менавіта тое, што? >> [Студэнт] 8 біт. 8 біт, ці не так? Такім чынам, 8 нулёў і 1. Такім чынам, калі ваш кампутар мае гігабайт аператыўнай памяці, 2 гігабайтамі аператыўнай памяці ў гэтыя дні, ў вас ёсць мільярд або 2 млрд. байт памяці, або прыкладна 8000000000 або 16000000000 біт ўнутры кампутара. У адрозненне ад невялікай прыклад Wooly Вілі, гэта не магнітныя часціцы звычайна больш. Усё часцей - у наўтбуках, па меншай меры, - гэта цвёрдацельныя назапашвальнікі SSD, што проста не маюць якія рухаюцца частак. Гэта ўсё электронныя. Гэта ўсё электрычнасць аснове. Так што думайце гэтага прамавугольніка, як толькі прадстаўляе 1 або 2 гігабайтамі памяці, што ў вас ёсць. Так што гэта кавалак памяці. Свет інфарматыкі роду адгароджана ўчасткі памяці, каб зрабіць розныя рэчы. Напрыклад, калі гэта аператыўнай памяці кампутара, як гэта было прапанавана прастакутнік там, Аказваецца, што па дамове, у верхняй частцы вашай памяці, так бы мовіць, , Як правіла, тое, што называецца тэкставы сегмент. Такія 0 і 1, што вы сабралі. Таму, калі мы глядзелі пад капотам на тое, што a.out ёсць, Усе гэтыя 0 і 1, калі вы запускаеце праграму, тых, 0 і 1 загружаецца з жорсткага дыска ў тое, што называецца RAM, і ў аператыўнай памяці, яны змяшчаюцца ў верхняй частцы. У той жа час, у вас ёсць іншыя рэчы: ініцыялізацыя дадзеных, ініцыялізацыю дадзеных. Гэтыя 2 валка памяці звярніцеся да глабальныя зменныя, якія вы не часта карыстаецеся але часам, калі вы гэта зробіце, яны ў канчатковым выніку там таксама. Тады ёсць некаторыя іншыя рэчы: зменныя асяроддзі, якія мы не будзем марнаваць шмат часу на, але затым 2 важныя рэчы, якія будуць вяртацца на працягу семестра, стэка і кучы. Таму большасць з памяці кампутара захоўваецца пры запуску праграмы за тое, што называецца стэкам і тое, што называецца кучай. Мы не збіраемся казаць пра кучы сёння, але мы будзем казаць пра стэку. Стэк азначала выклікаць ва ўяўленні візуальныя ад сталовай латкі зала ежы ў доме Mather ці там, дзе вы будзеце дзе персанал сталовай чысціць іх кожны дзень, яны складаюць іх ад падлогі на ўверх, і, аналагічна, у памяці, ёсць такая ідэя паставіць нешта на стэку, пакласці нешта на стэку, пакласці нешта ў стэку. І што ж мы маем на ўвазе пад гэтым? Давайце павялічыць толькі на ніжнюю палову гэтай карціне, аператыўнай памяці кампутара, прапанаваць наступнае. Аказваецца, што калі вы запускаеце праграму, як a.out або прывітанне - незалежна ад праграмы з'яўляецца тое, што вы напісалі - Зноў жа, тыя 0 і 1 загружаецца з жорсткага дыска, які доўгі захоўванне, застаецца там, нават калі вы відэлец, загружаецца ў аператыўную памяць. RAM хутчэй, чым жорсткія дыскі - гэта менш, чым жорсткія дыскі - але гэта там, дзе праграмы жыць, пакуль вы працуеце іх. Такім чынам, вы двойчы пстрыкніце праграму на Mac ці PC, яна загружаецца з жорсткага дыска ў аператыўную памяць. Як толькі ён будзе загружаны ў аператыўную памяць, 0 і 1 пайсці на шлях зверху, так званых тэкставых сегментаў, але потым, як толькі ваша праграма фактычна пачынае працаваць, Асноўная функцыя называецца, а галоўнае, як мы бачылі, часта мае лакальныя зменныя, і яна мае цэлых і радкоў і сімвалаў і таму падобнае. Так што калі вашы праграмы, якія вы напісалі або праграмы, якія вы падвойным пстрычцы выкарыстоўваць некаторыя зменныя ўнутры асноўнага, яны ў канчатковым выніку ў ніжняй частцы вашага стэка памяці, так бы мовіць. Больш канкрэтна, што ж гэта на самай справе азначае? Гэта проста азначае, што калі мы збіраемся лік байт аператыўнай памяці на вашым кампутары, заўважыць, што гэта можа быць нумар байта 0, гэта можа быць нумар байта 1, 2, 3, 4, 5, 6, усё, аж да 2 млрд. будзе ўсю дарогу там на самым версе. Такім чынам, іншымі словамі, калі мы гаворым аб аператыўнай памяці або памяці ў байтах, гэта проста азначае, што хтосьці вырашыў, што нумараваць кожны з гэтых участкаў памяці. Таму, калі вам трэба 32 біта для Int ці вам трэба 8 біт на знак, дзе яны ў канчатковым выніку ў памяці? Канцэптуальна, яны проста ў канчатковым выніку ў ніжняй частцы гэтай рэчы, званай стэкам. Але што цікава зараз, калі асноўныя выклікае функцыю - выкажам здагадку, што функцыя завецца Фу, проста адвольнае назва - што адбываецца, з'яўляецца асноўным знаходзіцца ў ніжняй частцы гэтага стэка памяці; Foo зараз змяшчаецца ў верхняй частцы галоўнага ў памяці. Такім чынам, любыя лакальныя зменныя, Foo была ў канчатковым выніку роду канцэптуальна вышэй, чым у асноўнай. Калі Foo выклікае іншую функцыю пад назвай бара, гэтыя зменныя ў канчатковым выніку тут. Калі бары называе нешта яшчэ, тут, тут, тут. Так што ж цікавага аб запуску праграмы з'яўляецца тое, што, як вы выклікаеце функцыі і як гэтыя функцыі выклікаць функцыі і як гэтыя функцыі называюць функцыямі, Вы ствараеце гэты стэк функцый у памяці. І толькі адзін раз функцыя вяртае вы пачнеце атрымліваць гэтую памяць назад. Такім чынам, адным з самых простых спосабаў запусціць з памяці ў кампутарнай праграме , Каб напісаць функцыі, якія ніколі не вернуцца. Так, напрыклад, давайце прадэманстраваць, як шмат з наўмысна багі праграмы. Дазвольце мне ісці наперад і рабіць # ўключыць , Int асноўных (несапраўднымі), і я збіраюся рабіць, а (2> 1), які, верагодна, ніколі не будзе змяняцца на нас, і дазвольце мне цяпер ісці наперад і рабіць Printf. На самай справе, гэта будзе менш візуальна цікавым. Давайце зробім гэта. Для Int = 0;> 0 - давайце рабіць гэтую памылку - я + +. І давайце не Printf тут. Давайце практыкаваць тое, што я прапаведаваў. Давайце тут метад, несапраўднымі хор, і мы будзем казаць Int я, і тады я буду казаць Printf - не, давайце зробім гэта больш цікава. Давайце на самай справе не друкуе наогул нічога. Давайце проста гэта зрабіць: хор (I). Добра. Так што гэта багі, таму што навошта? Я прыдумляю, як я іду, таму што праграма на самай справе не робяць нічога цікавага. Але гэта не мэта. Мэта складаецца ў тым, каб напісаць праграму, асноўнай функцыяй якога робіць тое, што, па-відаць? Патэлефануйце сябе. А на самай справе, мы не маем патрэбу ў пятлю. Давайце нават спрасціць гэты раз, каб не выпускаць з ўвазе сапраўды фундаментальная памылка. Галоўныя выклікі хорам спяваць хорам, Затым я зрабіў нешта неразумнае і я павінен быў хор хор выкліку таму што я меркаваў, хтосьці яшчэ збіраецца ажыццявіць гэта, можа быць, і зараз гэта не будзе сабраць яшчэ. Мне трэба зрабіць што? Мне трэба прататып, памятаю. Таму мне трэба, каб тут пустэча хору (INT я); Так што цяпер, калі я іду сюды - на самай справе, давайце выкарыстоўваць вялікія вокны. Давайце пойдзем далей і зрабіць хорам. Давайце пойдзем далей і зрабіць хорам. Выкарыстанне неаб'яўленай ідэнтыфікатар я. О, гэта было па-дурному. Нам не патрэбныя аргументы. Давайце проста гэта зрабіць. Шкада, што мы пачалі гэты шлях. Было б значна прасцей напісаць праграму. Там жа. Зараз давайце пяройдзем да маіх акно тэрмінала, паўторна Clang, і тут мы ідзем. Гэта было сапраўды хутка. Што на самай справе толькі што адбылося, праўда? Ну, цяпер я дадам друку лініі, таму мы можам бачыць. Дазвольце мне сказаць, Е ("я тут") - не зменныя. Мы пакінем гэта так. Дазвольце мне зрабіць паўторна. Дазвольце мне паўторна хор. І ... давай. Працягвайце. Як у баку, чаму яна не пацярпела крах? Памылкі сегментацыі адбылося супер хуткі раней. [Неразборліва адказ студэнта] >> Менавіта так. Так што гэта займае час, каб надрукаваць, ці не так? Гэта зойме больш працы з боку кампутара. І вось гэта: памылкі сегментацыі. Так заўважыце, як хутка запускаць праграмы. Калі вы не друкуе нічога, супер хутка. Але мы ўсё ж атрымалі гэтую памылку сегментацыі, таму што тое, што адбываецца? Калі вы думаеце пра тое, як памяць кампутара выкладваецца, У гэтым выпадку, каб быць асноўным, але вось давайце проста называць гэты хор, і давайце называць гэта хор. І зараз, калі я раблю сваю эстэтыку права, гэта проста будзе сказаць, хор, хор, хор, хор, хор, хор, хор, да млоснасці, і ў рэшце рэшт, тое, што адбудзецца? Калі вялікая карціна, у літаральным сэнсе, гэта тое, што проста адбываецца канцэптуальна? Стэк перарасход кучы. Або, што яшчэ горш, вы проста захопленыя ўсё, уключаючы тэкст сегмента, якая з'яўляецца 0 і 1, якія прадстаўляюць вашу праграму. Карацей кажучы, гэта проста супер, супер дрэннага. Ваша праграма выйшла з-пад кантролю. Вы выкарыстоўваеце спосаб больш памяці, чым меркавалася ўсё з-за дурной памылкі ў дадзеным выпадку, ці ў дадзеным выпадку цалкам свядома зрабілі функцыю, якая называе сябе. Дык вось, гэта не так ужо дрэнна. Функцыі, якія называюць сябе сапраўды мае вялікую сілу, калі вы выкарыстоўваеце яго правільна. Я не выкарыстоўваў яго правільна тут. Так што не ўсё так дрэнна, але тое, што я ніколі не перастануць называць сябе з'яўляецца фундаментальнай слабасцю тут гэтай праграмы. Дык куды мы ідзём з усім гэтым? Што на самай справе адбываецца? Калі я называю прырашчэнне функцыі, як мы рабілі ў тых прыкладах, У мяне ёсць значэнне, як 1, што я праходжу цалі Я праходжу ў копіі нумар 1, так адбываецца наступнае. Пойдзем у прырашчэння, напрыклад, гэты хлопец прама тут. Вось што на самой справе адбываецца. Калі я называю прырост і я праходжу па х, графічна, што адбываецца вось гэта. Калі ў мяне ёсць кошт 1 захоўваецца тут, і я на самай справе клічуць прырост, якая цяпер называецца хор - Ipad кідае мяне тут. Давайце назавем гэта прырашчэнне, і мы не ведаем, што гэта наступная функцыя будзе. Так што ж на самай справе адбываецца дзесьці тут у асноўным у мяне ёсць кавалак памяці , Які захоўваецца нумар 1. Калі я называю прырост, я выкарыстоўваю іншую частку памяці, але зараз у мяне ёсць копія 1. Калі я павялічыць гэта значэнне, гэта становіцца 2, але што адбываецца потым, як толькі прырост прыбытку? Гэтая памяць проста атрымлівае вярнуў да аперацыйнай сістэме, якое азначае, што ўсё, што вы зрабілі нічога карыснага. 1, які быў першапачаткова ўтрымліваліся ў асноўным па-ранейшаму на самай справе. Дык куды мы ідзём з гэтым? Аказваецца, што ў памяці ў вас ёсць гэтая спіна да спіны паслядоўнасць байтаў што вы можаце пакласці рэчы ў, і аказваецца, што мы ўжо бачылі нешта які ўключае ў сябе навядзенне спіной да спіны, каб спіна да спіны. Што ўяўляе сабой радок, грунтуючыся на тыдні 1, і цяпер тыдзень 2? Гэта проста набор знакаў. Вось і атрымліваецца, як вы можаце паставіць нумары ў памяці, Сапраўды гэтак жа вы можаце пакласці знакаў у памяці. І як толькі мы пачынаем пакласці знакаў у памяці спіной да спіны, каб спіна да спіны, Аказваецца, што з дапамогай найпростых рэчаў, як для цыклу або час цыклу, мы можам паўтараць злева направа па знакаў у радку і пачаць масажуючы іх у розныя персанажы ў цэлым - можа стаць B, B мог бы стаць C - так што ў канчатковым рахунку, мы можам прыняць ангельскае прапанову, што на самой справе мае сэнс і канвертаваць кожную з гэтых лістоў па адным пешшу праз нашу памяць кампутара злева направа на самай справе шыфравання. Такім чынам, давайце зробім наш пяціхвілінны перапынак тут, і калі мы вернемся, мы пачнем гэты працэс скремблирования інфармацыі. Добра. Перш чым мы паглыбімся ў некаторыя шыфравання і гэтыя рэчы называюцца масівамі, Дазвольце мне паўзу на любыя пытанні, таму што я адчуваю, што я сапраўды добры ап'янеў некаторыя з гэтых пытанняў. Так што давайце зафіксуем цяпер, калі мы можам. Мы толькі што казалі аб вяртанні каштоўнасцяў, пра якія мы казалі аргументы, і мы гаварылі пра гэта паняцці, якое мы вернемся ў бліжэйшыя тыдні, прагляду памяці цэлую кучу гэтых складзеных латках, так бы мовіць, знізу на уверх, так, што кожны латок, які атрымлівае пакласці ў стэк ўяўляе сабой функцыю, якая ў цяперашні час называецца. Ёсць пытанні? Дазвольце мне задаць пытанне тут. Дазвольце мне спрасціць гэта да таго, што было да некаторых з нашых ранніх Q & A. Той факт, што прырост мае адкрытую дужку, унутр нумар, закрыты дужках - Што ж Int ліку ўяўляюць? [Студэнт] аргумент. >> Аргумент. Добра. Але тое, што аргумент? [Неразборліва адказ студэнта] >> Што гэта такое? >> [Студэнт] Тое, што вы перадаеце цалі Такім чынам, тое, што вы перадаеце цалі І наогул, гэта проста ўваход. Калі б вы пісалі функцыі і мэты, якія функцыянуюць у жыцці павінен зрабіць нешта крыху іншае кожны раз, калі вы выкарыстоўваеце яго, , То адзіны спосаб, каб гэта адбылося на самай справе, здавалася б даць яму ўваход так што ён можа зрабіць нешта іншае з дапамогай гэтага ўкладу кожны раз. Такім чынам, вы павінны вызначыць дзве рэчы, калі функцыя прымае ўваход. Вы павінны паказаць імя, якое вы хочаце даць, што ўваходны выключна для вашага зручнасці, каб вы маглі звярнуцца да яго У функцыі, якія вы самі пішаце, як я зрабіў тут, у радку 32. Але вы таксама павінны паказаць яго тып, таму што C з'яўляецца мовай праграмавання што менавіта патрабуецца, калі вы хочаце зменнай, вы павінны паведаміць кампутара, які тып дадзеных яна ёсць, У большай часткі так, каб ён не ведае, колькі бітаў вылучыць для гэтай зменнай таму што гэта можа быць 6 - прабачце, гэта не будзе 6. Гэта можа быць 16, можа быць 8, гэта можа быць 32, нават 64, але кампутар павінен ведаць. Цяпер, унутр на левай баку ўяўляе тое, што, у адрозненне ад? [Неразборліва адказ студэнта] >> Што гэта такое? >> [Студэнт] Тып функцыі. Тып функцыі і, больш канкрэтна, тыпу сваёй прадукцыі. Права. Такім чынам, у той час як рэч у дужках прадстаўляе свой ўваход, калі такія маюцца, рэч, каб левая прадстаўляе сваю прадукцыю. І ў гэтым выпадку, па-відаць прырост вяртае цэлае, і так Int з'яўляецца тыпам вяртаецца гэтай функцыяй. Што гэта значыць вярнуць? Літаральна, вы выкарыстоўваеце ключавое слова вяртанне і тое, калі тое, што вы вяртаеце справа ад ключавога слова з'яўляецца цэлым лікам, тое, што сапраўды адпавядае таму, што мы абяцалі. Вы не маглі б зрабіць нешта накшталт гэтага - Добры дзень, свет - таму што гэта радок. Відавочна, гэта не з'яўляецца цэлым лікам. Карацей кажучы, цяжар на самай справе на нас, праграмістаў, для пэўнасці аб тым, што мы вяртаемся, і тады на самай справе ісці аб вяртанні яго. Кантэкст тут, зараз, у тым, што памяць кампутара складае адзін гігабайт, 2 гігабайта - што заўгодна, - можа быць, гэта больш, можа быць, гэта менш, але кампутар разглядае яе як якія маюць розныя часткі. Нешта ідзе туды, нешта яшчэ адбываецца там, наверсе, розныя рэчы ідзе ў сярэдзіне, і сёння мы толькі пачынаем распавядаць гісторыю, але мы вернемся да гэтага з цягам часу. У цяперашні час, толькі кавалак памяці мы сапраўды клапоцімся аб тым, тэкставы сегмент таму што толькі што ўяўляе 0 і 1, што Clang быў сігнал. Такім чынам, калі вы запусціце каманду на клавіятуры, як a.out ці вы двойчы пстрыкніце значок на Mac OS або Windows, Ваша праграма загружаецца з жорсткага дыска ў аператыўную памяць і ён пляснуўся ў верхняй частцы аператыўнай памяці кампутара, так бы мовіць. Між тым, як ваша праграма пачынае працаваць і асноўныя выклікаецца У праграме вы пісалі або праграмы Microsoft ці Apple, піша, любога з яе лакальныя зменныя ў канчатковым выніку там на дне памяці кампутара. Але калі асноўныя выклікі іншую функцыю, якая сама па сабе мае пераменныя або аргументы, яны ў канчатковым выніку над ім. І калі гэтая функцыя выклікае тое, што яны ў канчатковым выніку над ім, над ім, над ім. І толькі адзін раз у функцыі ажыццяўляецца выкананнем ці стэк латкоў, так бы мовіць, пачынаюць атрымліваць усё ніжэй і ніжэй. І гэта тое, што тады, у двух словах, тлумачыць, чаму, калі вы тэлефануеце кубе ці вы тэлефануеце прырост, вы перадаеце копію значэння. А што гэта азначае, што наглядна гэта тое, што вы літаральна напісання нумар 1 У другой частцы памяці, змены, што з 1 па 2 у выпадку прырашчэння ці 8 у выпадку куба, а затым кідалі, што памяць далёка як толькі павелічэння або вяртання куб функцыі. Пытанне. [Студэнт] Дзе глабальныя зменныя захоўваюцца? Глабальныя зменныя захоўваюцца ў тое, што ў цяперашні час называецца ініцыялізуецца дадзеныя або неинициализированных дадзеных, розніца ў тым, калі ў вас ёсць глабальная зменная і вы прызначаеце яго адразу ж значэнне з знак роўнасці, яна заканчваецца на вяршыні, і калі вы проста кажаце Int х, без значэння, гэта сканчаецца крыху ніжэй, у аператыўнай памяці Проста па дамове. Іншыя пытанні? Добра. Такім чынам, гэтая карціна будзе вяртацца, як мы атрымаем больш магутны з тым, што мы можам зрабіць з кампутарам, але цяпер, давайце кароткае ўвядзенне ў крыптаграфію, пэўны тып шыфравання, не вырашае ўсіх праблем у свеце але вырашыць некаторыя з іх. У гэтым выпадку тут, у нас ёсць тое, што называецца сакрэтным ключом. Сакрэтным ключом, як вынікае з назвы, адбываецца яе бяспекі ад таямніцай. Напрыклад, калі вы былі яшчэ ў пачатковай школе, і вы праходзілі крыху любоўны ліст тайнага да хлопчыка або дзяўчынку вы ціснулі на, калі вы хацелі перадаць гэтую запіску па аўдыторыі, Вы, верагодна, не будзе пісаць такую ​​запіску на англійскай мове або што ваш родную мову. Замест гэтага, вы можаце зашыфраваць або вы можаце проста адправіць ім тэкставае паведамленне ў гэтыя дні. Але вы маглі б на самай справе перадаюць іх да ведама ўсім класе. І зрабіць гэта надзейна такім чынам, што вашы сябры і настаўнікі Не ведаю, што вы пішаце, вы можаце прыдумаць досыць просты алгарытм, Малады хоць вы маглі б быць, проста караскацца слова. Такім чынам, замест таго, каб пісаць вы можаце напісаць б, замест б вы маглі б напісаць с, замест таго, каб з вамі маглі б напісаць D, і гэтак далей. Ці вы маглі б прыдумаць больш складаны пераклад лістоў у розныя літары. Але загваздка ў тым, хлопчык ці дзяўчынка, якім вы адпраўляеце гэтую нататку трэба ведаць нешта, што і, відавочна? >> [Студэнт] Што вы адпраўляеце. Які ваш сакрэт, як і тое, што ў тым, што адпаведнасць паміж а і Ь і з і д ы. Гэта толькі даданне 1 да кожнай з літар, каб перайсці ад А да Б, В да С? Гэта больш складаны, чым гэта? Такім чынам, вы і ваш раздушыць павінны мець гэтую сакрэтную інфармацыю, але ёсць віды Catch-22 тут. Калі гэта ў першы раз вы адпраўляеце гэтую любоў ліст праз клас, Як гэта хлопчык ці дзяўчынка будзе ведаць, у чым сакрэт нават ёсць? Так што сакрэтны ключ шыфравання не вырашае ўсіх праблем у свеце, і ёсць на самой справе сувязь тут, што мы вернемся да да канца семестра. Сапраўды гэтак жа большасць з нас не ведае, што хтосьці працуе, напрыклад, на Amazon.com, і ўсё ж многія з нас, напэўна, купіў матэрыял у Amazon.com, і нас вучылі лічыць, што гэтыя транзакцыі электроннай гандлю знаходзяцца ў бяспецы. URL, верагодна, кажа HTTPS, ёсць, можа быць, дурны маленькі значок замка дзесьці, ёсць нейкая крыптаграфіі забеспячэнні інфармацыі аб крэдытнай карце паміж вамі і Amazon.com. І ўсё ж, калі крыптаграфія ўключае ў сябе веданне нейкі сакрэт І ўсё ж я не ведаю нікога, на Амазонцы, і я, вядома, не задаволіў любы сакрэт з кімсьці на Amazon, як мой кампутар або мой браўзэр гэта робіць? Аказваецца, ёсць іншыя віды крыптаграфіі наогул, што вырашыць гэтую праблему. Але на сённяшні дзень, мы засяродзімся на просты , Дзе можна арганізаваць загадзя ведаць некаторыя таемныя +1 Ці як некаторы адлюстраванне паміж а і б а. І працэс крыптаграфіі звычайна ўключае ў сябе гэтае. У вас ёсць звычайны тэкст, намаляваны тут, на левым, вы запускаеце яго праз нейкі алгарытм або працэдура шыфравання - Можа быць, гэта проста становіцца B, B становіцца з - і тады вы ў канчатковым выніку з зашыфраванага тэксту. Між тым, як толькі ваш раздушыць атрымлівае гэтую таямніцу, звярніце ўвагу, Ён або яна павінен расшыфраваць яго, як правіла заднім ходам, што алгарытм такім чынам, каб вярнуць звычайны тэкст. Ёсць фізічныя ўвасаблення гэтага. Напрыклад, гэта колца дэкодэр сакрэт, і гэта кольца ў тым сэнсе, што ёсць два набору тут. На знешняй перыферыі гэтай рэччу, ёсць літары ад А да Z, хоць яны ў выпадковым парадку, і з унутранага боку, там на самай справе некаторыя лічбы такія, што з гэтым кальцом Вы можаце ўключыць выгляд звонку, але не ўнутры для таго, каб выбудаваць нумары з літарамі. З фільма пад назвай Калядная гісторыя, вы ўбачыце, што мала Ральф так не цярпелася высветліць, што сакрэтнае паведамленне Little Orphan Annie была для яго што было паведамлена, я думаю, у выглядзе лікавых паведамленні на скрынкі ад шматкоў і трэба было сабраць усе маленькія карты, якія прыйшлі ў збожжавых вокны, Вы павінны былі адправіць ім па пошце, вы павінны былі вярнуцца таямніцу кольца дэкодэр так што вы можаце, нарэшце, высветліць, што адлюстраванне паміж літарамі і лічбамі або літар і літар. Як у кампутары мы можам ісці аб рэалізацыі або якія прадстаўляюць такія рэчы? Нам трэба знайсці спосаб выказаць сябе крыху больш гнутка чым нашы зменныя да гэтага часу дазволіў. У нас былі цэлымі, у нас былі знакі, якія мы мелі паплаўкі і двухмесныя і некаторыя іншыя, але гэтыя асобныя часткі памяці, якая на самай справе не дазваляюць выказаць рэчы як словы і прапановы і фразы. На самай справе, мы называлі такія радкі рэчы, але мы абяцаем, што гэта сапраўды проста спрашчэнне CS50 бібліятэкі што мы маем намер адхіліце. І так, давайце пачнем рабіць гэта тут. Дазвольце мне ісці наперад і адкрываць файл - Усе гэтыя файлы даступныя, як звычайна, онлайн - званыя array.c вырашыць праблему, не звязаных з радкамі, але гэта малюе карціну тут пра тое, як мы маглі б выкарыстоўваць тое, што называецца масівам. Масіў ўяўляе сабой тып дадзеных. Гэта тып зменнай роду, які мае некалькі меншыя тыпы дадзеных ўнутры яго спіной да спіны, каб спіна да спіны. Так, напрыклад, калі мы хочам напісаць невялікую праграму, якая дае вам ваш тэст сярэдняга на курс, як 50, якая мае 2 віктарыны, Вы можаце вельмі лёгка напісаць гэтую праграму, заснаваную нават на некаторых з матэрыялу на мінулым тыдні з дапамогай GetInt і некалькі зменных: Int quiz1, унутр quiz2. І гэта даволі проста. Гэта можа быць 10, 20 радкоў кода, максімальная рэалізацыя праграмы , Які просіць карыстальніка ў працягу 2 балаў віктарыны і затым вылічае іх сярэдняе , Складаючы іх разам, дзелячы на ​​2, а затым друку вынікаў. Мы маглі б зрабіць гэта даволі лёгка зараз, пасля некаторага колькасці хвілін. Але праблема ў тым, што выкажам здагадку, што 50 было 3 ці 4 віктарыны. Выкажам здагадку, што вы хацелі выкарыстоўваць тую ж праграму для класа, які быў штотыднёвыя віктарыны. Падумайце аб класе, які штотыднёвыя віктарыны. Калі ёсць 16 або так тыдняў у семестр, зараз у вас ёсць 16 зменных: quiz1 Int, Int quiz2, унутр quiz3, унутр quiz4. Як толькі вы пачынаеце бачыць гэтую надмернасць, гэта скапіяваць і ўставіць код, ён павінен пачаць рабіць вы хочаце там было лепш. І на шчасце, таму што масівы ёсць. Так давайце зробім гэта. Па-першае, дазвольце мне прадставіць вельмі простую рэч, што мы не выкарыстоўвалі да гэтага часу, але вы ўбачыце, што часам у кодзе. Гэта тое, што звычайна называецца сталай. Так што гэта пастаянная у тым сэнсе, што гэта значэнне ніколі не мяняецца. Чалавечыя канвенцыі пры стварэнні пастаяннай з'яўляецца выкарыстанне усіх вялікіх літар проста так, што ён сапраўды вылучаецца ў кодзе, і спецыяльныя ключавыя словы, якія вы выкарыстоўваеце ў З # вызначыць. Таму мы кажам, # вызначыць, то прастора, то слова, якое вы хочаце выкарыстоўваць для назвы канстанты , А затым значэнне канстанты. Звярніце ўвагу, што гэта адрозніваецца ад прысваення нешта зменная. Там няма знака роўнасці, няма коскі. Гэта тое, што вядома як дырэктыва препроцессора, але пра гэта ў іншы раз. На дадзены момант, гэта стварае нязменнае значэнне, званае віктарыны , Фактычнае лікавае значэнне 2. Такім чынам, усюды, дзе ёсць тэсты, віктарыны, тэсты на працягу ўсяго гэтага файла, вось толькі нумар 2. Калі я гляджу на асноўныя Цяпер, давайце паглядзім, як гэта працуе. Спачатку гэта выглядае трохі загадкава, але гэта ўсё рэчы з тыдні 1. Спытаеце ў карыстальніка класах. Як мы гэта робім? У радку 22 - гэта сапраўды сакавітыя часткі - я заяўляю, паплавок але не толькі адным паплаўком. Я абвясціўшы, хутчэй, масіў значэнняў з якая плавае кропкай. Гэта пераменная будзе называцца класах, як гэта маецца на ўвазе тут, але толькі частка новага сінтаксісу, то гэтыя квадратныя дужкі. Той факт, што я сказаў паплавок класах, а затым адкрыць дужку, а затым нумар - заўважыць, калі гэта пастаянная гэта так жа, як мы зрабілі гэта - гэта азначае: "Гэй, кампутар, дайце мне 2 паплаўка і давайце калектыўна называюць іх ацэнкі." Гэта ў адрозненне ад значна больш працаёмкі працэс наступным чынам: паплавок Grade1; grade2 плаваць, і гэтак далей. Такім чынам, масіў дазваляе нам рэалізаваць гэтую ідэю, але значна менш неахайна, такім чынам, што мы можам напісаць 1 радок кода, а не, скажам, 16 на 16-тыднёвы семестр. Я не хачу, каб закадаваць 2, таму што, калі вы думаеце пра гэта цяпер лагічна, Выкажам здагадку, у наступным годзе CS50 зменаў да 3 віктарыны замест і ў мяне быў нумар 2 тут, у мяне быў нумар 2 тут, У мяне быў нумар 2 тут, нумар 2 тут. Яна становіцца вельмі стомным і вельмі лёгка сапсаваць і выпадкова змяніць значэнне 1 да 3 і прапусціць некаторыя іншыя значэнні 2. Так што я збіраюся замест абстрактнага гэта адлегласць і выкарыстоўваць гэтую канстанту, якая, як мяркуе яго назва, ніколі не мяняецца. І цяпер незалежна ад таго, ці ёсць у нас розныя віктарыны гэтым ці наступным годзе, Я проста змяніць яго ў адным месцы, тут на вяршыні. Так што ўсё канстанты. Між тым, новая канцэптуальная асаблівасць складаецца ў тым масіва. Такім чынам, у квадратных дужках даць мне гэта шмат плавае і дазваляе мне калектыўна называюць іх класах тут. Такім чынам, цяпер давайце паглядзім, што я збіраюся рабіць. Тут, у радку 24 з'яўляецца пачаткам цыклу. Гэта сапраўды нічога асаблівага. Гэта толькі з дапамогай віктарын, а не жорстка ліку. Але няма нічога інтэлектуальна розных там з мінулага тыдня. Гэта проста Printf, таму Е ("Віктарына #% сут% D:") таму што я проста хачу, каб раздрукаваць даць мне віктарыны № 1 з 2, а затым 2 з 2. Так што гэта чыста эстэтычная рэч. Але самае цікавае зараз знаходзіцца ў радку 27. Для таго, каб запоўніць адну з двух запаўняльнікаў з якая плавае кропкай, Вы зноў выкарыстоўваць квадратныя дужкі. У гэтым выпадку, я выкарыстоўваю я, таму што гэта цыкл пачаўся з я, якое значэнне роўнае, па-відаць? [Студэнт] 0. >> [Малая] 0. Такім чынам, на першай ітэрацыі гэтага цыклу, гэта як калі б я напісаў гэта ў кодзе, але на другі ітэрацыі гэтага цыклу, гэта як калі б я напісаў гэта ў сваім кодзе. Але тое, што я выкарыстоўваю зменную выдатна, таму што, як вынікае з назвы, гэта змена яго значэння на кожнай ітэрацыі, так што я запаўненне гэтага масіва адным месцы за адзін раз. Што гэта масіў выглядае? Таму я звярнуў супер просты прастакутнік на экране тут раней была для гэтага прычына. Масіў гэта проста кавалак памяці быў яшчэ адзін кавалак памяці быў яшчэ адзін кавалак памяці і так далей. Так што, калі мой масіў памерам 2 у гэтым выпадку тут, усё, што я буду рабіць , Увёўшы ў маёй ацэнкі віктарыны падабаецца тут, - я атрымаў 100 на адзін, а затым я атрымаў 99 на гэтым - Затым гэтая памяць не можа нават быць выкарыстаны, таму што я толькі спытаў кампутара для масіва памерам 2. Гэтыя квадраты ўсё яшчэ там, ці не так? У вас яшчэ ёсць 2 гігабайта аператыўнай памяці, нават калі вы толькі просяць 2 паплаўка. Такім чынам, ідэя масіваў з'яўляецца тое, што кампутар проста бярэ кавалак памяці , А затым размяркоўвае дробныя кавалкі спіна да спіны, каб спіна да спіны. І гэта ўсё, што масіў. Гэта бесперапынны кавалак памяці, унутры якой вы можаце пакласці рэчы. Гэта адбываецца, каб потым зрабіць толькі некалькі сумна арыфметыка. Калі я пракруціць ўніз тут, гэта дзе я тады ітэрацыі па масіве. Я прыдумаў сумаванне ўсіх значэнняў у масіве, а потым выкарыстоўваць круглы функцыю тут на самай справе рабіць сума дзеліцца на віктарыны. Але дазвольце мне махнуць рукой на што як свайго роду досыць арыфметычных цяпер. Але ўсё, што робіць для мяне, у канчатковым рахунку, вылічэнне сярэдняга. Такім чынам, спачатку тэст, плюс другі тэст дзеліцца на 2, а затым раздрукаваць яго, як Int. Але давайце цяпер пераход да іншай прыклад называецца string1, які малюе аналагічную карціну, але з выкарыстаннем радкоў. Дазвольце мне ісці наперад і спрасціць гэты на імгненне. Прабачце водступ на дадзены момант. Звярніце ўвагу на лінію 19 з гэтага прыкладу, я атрымліваю радок ад карыстальніка. Але звярніце ўвагу на тое, што я раблю ў наступным ліній 22 і далей. На самай справе я ітэрацыя ад Я да - і гэта новы трук - StrLen, даўжыня радка. Гэта функцыя, якая пастаўляецца з C, што калі вы перадаеце яго радка, ён кажа вам, колькі знакаў у гэтай радку. Вось і ўсё. А тое, што гэта StrLen замест таго, каб даўжыня радка проста таму, што гэта больш кароткім. Трыццаць гадоў таму, людзям падабалася пісаць рэчы, як лаканічна наколькі гэта магчыма, таму мы захавалі гэтую канвенцыю тут. я + + азначае толькі тое павялічваем я ў кожнай ітэрацыі. А цяпер заўважаю гэта, што сапраўды цікава. У радку 24, я кажу: "Кампутар, дай мне характарам, 8 біт, і называем яго з". Але што гэта на правай баку кажаце? У ангельскай мове, што гэта ўяўляеце? [Студэнт] Першы знак у масіве. Менавіта так. Дайце мне першы знак у масіве. Або, у больш агульным, дай мне-й знак у масіве. І разумею, што гэта важна цяпер, як камп'ютэрныя навукі, мы на самай справе пачынаючы з 0. Вы не павінны меркаванні цяпер, каб пачаць гэта рабіць. Цяпер вы павінны паводзіць сябе ў адпаведнасці з чаканнямі кампутар і лічыць ад 0 таму што [0] будзе першы знак у радку, [1] будзе другі, [2] будзе трэцім, і гэтак далей. Такім чынам, гэтая праграма, калі я скампіляваць яго, гэта зноў string1, так што string1, і зараз я сутыкнуўся string1 ў маім акне тэрмінала. Ён чакае ўводу, так што я збіраюся ўвесці Давіда, Enter і зараз яна друкуе Дэвід усё на розных лініях, таму што паведамленне, што я раблю. Я друк аднаго знака за адзін раз. Мы не будзем удавацца ў падрабязнасці сёння на гэтым, але я выдаліў гэтую хвіліну таму тут галачку. Аказваецца, што калі карыстальнік няправільна, спаборнасці, або проста блытаюць, Вы можаце фактычна не даюць радкі некаторай даўжыні. Калі вы націснеце не тую клавішу на клавіятуры, вы можаце не даюць радок на ўсіх, або калі вы злы, вы можаце паспрабаваць, каб ўставіць у кошт гігабайта аб эсэ каб запоўніць гэты радок, і калі кампутар працуе з памяці, Аказваецца, што мы збіраемся вярнуць гэта спецыяльнае значэнне, званае NULL. Такім чынам, на дадзены момант, проста ведаю, што ёсць гэта спецыяльнае значэнне, званае NULL , Што дазволіць нам праверыць, калі мы з памяці, між іншым. Але калі я адкрываю зараз string2, звернеце ўвагу на адно адрозненне тут. Звярніце ўвагу на адно адрозненне тут з string2. З string2, гэты цыкл трохі адрозніваецца. Дазвольце мне выдаліць нулі, так што мы можам казаць пра тых, хто ў іншы раз. Чым адрозніваецца цыкл на гэты раз? Я магу вярнуцца да папярэдняга прыкладу. Дык вось версія 2, гэта версія 1. 1, 2. 1, 2. StrLen выклік дзе? Гэта ў першай частцы цыклу. Любыя думкі аб тым, чаму я гэта раблю? Так. [Студэнт] Такім чынам, вы не выклікаеце функцыю кожны раз. [Малая] Такім чынам, мы не выклікаем функцыю кожны раз. Менавіта так. Нагадаем, з завесамі на тое, што яны супер проста Як толькі вы, здаецца, разумею, што гэта ініцыялізацыя, ўмова і абнаўлення. Праблема ў тым, што ўмова адбываецца на кожнай ітэрацыі цыклу. І таму ў дадзеным прыкладзе, што такое дрэнна пра тое, што гэта маё стан? [Студэнт] Вы тэлефануеце StrLen. [Малая] Вы тэлефануеце StrLen зноў і зноў, і зноў. Але як толькі я набраў у Дэвіда, даўжыня гэтага радка роўны 5, і ён не збіраецца мяняць на кожнай ітэрацыі таму што радок па-ранейшаму D - V-я-д. Так што гэта намёк на тое, што збіраецца станавіцца ўсё больш важнай ідэяй вядомы як дызайнерскае рашэнне, дзе толькі не робяць кампутар рабіць непатрэбную працу. Гэтак жа, як папярэдні прагляд pset2, pset2 ў стандартным выданні збіраецца кінуць вам выклік на самай справе рэалізацыі некаторага ліку шыфраў, некаторы колькасць алгарытмаў шыфравання, так што вы можаце не толькі зашыфраваць і дэшыфраванні сакрэтных паведамленняў гэтак жа, як адной Ральф там дэкадаваць. У хакерам выданне pset2, мы збіраемся пайсці крыху далей. Мы збіраемся перадаць вам файл з фактычнымі кампутарнай сістэмы , Які змяшчае цэлую кучу імёнаў і фактычнай зашыфраваныя паролі, і задачы для хакера выданне будзе узломваць гэтыя паролі і высветліць, што крыптаграфія і таемныя, што быў выкарыстаны для стварэння самай справе гэтыя паролі. І мы збіраемся зрабіць гэта з дапамогай новай функцыі тут C што я дам вам толькі дэма вядомы як аргументы каманднага радка. Аказваецца, як некаторыя з вас, магчыма, бачылі ў раздзеле або ў падручніках, Асноўным не заўсёды павінна быць пустэча ў дужках. Аказваецца, што асноўная можна таксама запісаць як гэта, з двума аргументамі, ARGC і ARGV, дзе ARGC лік слоў што вы ўводзіце пасля назвы праграмы на вашым каманднага радка і ARGV з'яўляецца фактычным слоў. І, як квадратныя дужкі там прапануюць, ARGV мабыць масіва. Гэта збіраецца быць радком пасля радка пасля радка ў памяці. Так што мы збіраемся быць у стане зрабіць, пачынаючы з PSET 2, нешта накшталт гэтага. Калі я раблю argv1, які з'яўляецца прыкладам мы вернемся да ў панядзелак, і запусціць яго, заўважыць, што гэта не падобна, каб зрабіць што-небудзь яшчэ. Ён проста выводзіць сваё імя. Але калі я развітваюся класа, звярніце ўвагу, што гэтая праграма па-відаць ітэрацыі над кожным з слоў, якія былі надрукаваныя ў камандным радку. І сродкі, з дапамогай якіх мы зможам атрымаць доступ да слоў, якія карыстальнік ўвёў у камандным радку з'яўляецца змена асноўнага адпраўной гэты ўік-энд ад Int асноўных (несапраўднымі) на Int асноўных (агдс, ARGV) і, такім чынам, народзіцца аргументы каманднага радка. І як толькі вы атрымаеце сапраўды складаная ў гэтым, вы зможаце напісаць сапраўды трып праграм такіх, як гэты вось, які ідзе вышэй і па-за некаторыя функцыі, якія мы зрабілі да гэтага часу, але ўсё даволі магутны. Такім чынам, мы пакінем гэта з гэтым на экране, і мы будзем бачыць Вас у панядзелак. [CS50.TV]