DAVID малая: Добра, з вяртаннем. Гэта CS50. Гэта пачатак тыдня сем. Так што гэта было некаторы час, так што я думаў, што мы прыняць беглы тур, дзе мы спыніліся і дзе мы цяпер збіраемся. Так што гэтая рэч тут, магчыма, прыйдзецца выклікала некаторую тугу на першы погляд. Але, спадзяюся, вы пачынаеце акліматызавацца да таго, што гэта абазначае тут - зорка прадстаўляе паказальнік, які толькі тое, што, з пункту гледжання больш непрафесіянала? Так што гэта адрас. Так што гэта адрас нешта ў памяці. І мы пачалі адхіліце слаёў Пару тыдняў таму, і таму падобнае GetString і іншых падобных функцый Увесь гэты час вярталіся Адрасы рэчы ў памяці, як і адрас першага знака ў некаторай паслядоўнасці. Такім чынам, мы таксама ўвялі Valgrind, якая Вы пачнеце выкарыстоўваць для гэтай праблемы ўстаноўлена, у прыватнасці, для наступнага Праблема таксама усталяваны. І Valgrind і што робіць для нас? Пры гэтым праверка на ўцечкі памяці, і гэта таксама правярае злоўжыванні памяці. Ён можа, з некаторай верагоднасцю, выявіць, калі код будзе тычыцца памяці што гэта проста не трэба. Так што не абавязкова уцечкі, але калі вы выходзяць за межы некаторага масіве, а як вы выканайце VALGRIND і выклікаюць такія паводзіны ў той час як Valgrind працуе ў вашай праграме працуе ўсярэдзіне яго, вы атрымаеце паведамленні, як гэта - "Няправільная пісаць пра памерам 4 ", які, нагадаем пару тыдняў таму азначала, што я выпадкова як на аднаго дзесятковага занадта далёка за межамі масіва. І такім памерам 4 азначае тут памер гэтага канкрэтнага унутр. Так прыміце запэўніванні ў тым, што valgrind ёсць выйсце, фармат яго, проста зверскім. Гэта сапраўды цяжка зразумець, праз беспарадак за цікавую інфармацыю. Такім чынам, што мы зрабілі тут проста ўрывак некаторыя з пары больш цікавыя радкі. Але разумею, што 80% valgrind ёсць Выхад будзе трохі адцягненне. Проста шукайце мадэлі, як гэтыя - несапраўдным права, несапраўдныя чытаць, 40 байт і некаторы колькасць блокаў вызначана страчаны, ключавыя словы, як, што. І тое, што вы, мы спадзяемся ўбачыць некаторы выгляду слядоў, якія функцыі памылка на самай справе цалі У гэтым выпадку тут, у тым, што лінія мой код памылкі па-відаць? 26 у файле з імем memory.c, які быў Напрыклад, мы гулялі з ў той час. Так што гэта, верагодна, не ў Malloc. Гэта было, верагодна, у сваім кодзе замест гэтага. Такім чынам, мы ўбачым гэта зноў і зноў у бліжэйшы час. Так SCANF, гэта адбылося ў Пару формы да гэтага часу. Мы бачылі Sscanf коратка. Гэта было нешта побач Вы нырнулі ў вашай падрыхтоўка да віктарыны. І SCANF на самой справе тое, што CS50 Бібліятэкі выкарыстоўваюць пад капот на працягу досыць доўгага часу для таго, для атрымання дадзеных ад карыстальніка. Напрыклад, калі я пераеду да CS50 Прыбор тут, дазвольце мне адкрыць Напрыклад сёння, што называецца SCANF-0.c І гэта супер проста. Гэта ўсяго толькі некалькі радкоў кода. Але гэта паказвае, сапраўды, як GetInt працаваў ўвесь гэты час. У гэтай праграме, у радку 16 Звярніце ўвагу, што я заяўляю Int. Так што ніякіх паказальнікаў, нічога магічнага там, проста Int. Затым у радку 17, я прапануе карыстальніка лік, калі ласка. Затым, у канцы 18, я выкарыстоўваю SCANF тут. І я адзначыў, накшталт як Е, што я чакаю цытатай канец цытаты адсоткаў я. Так адсоткаў я, вядома, пазначае Int. Але звярніце ўвагу на тое, што другі Аргумент SCANF ёсць. Як бы вы апісалі другі Аргумент пасля коскі? Што гэта? Гэта адрас х. Так што гэта карысна, таму што, падаючы SCANF з адрасам х, тое, што робіць , Якія дазваляюць гэтай функцыі рабіць? Не проста ідуць туды, але і рабіць тое, што? Унесці змены ў ім. Таму што вы можаце пайсці туды, гэта свайго роду як карта да месцазнаходжання ў памяці. І да таго часу, пакуль вы дае SCANF або любую функцыю з такой карты, якія Функцыя можа пайсці туды, і не толькі паглядзіце значэнне, але ён таксама можа змяніць гэтае значэнне, якое з'яўляецца карысным, калі Мэта ў жыцці з'яўляецца SCANF сканаваць ўваходныя дадзеныя ад карыстальніка, у прыватнасці з клавіятуры. І F пазначае адфарматаваных, гэтак жа, як Е, F пазначае адфарматаваных Радок, якую неабходна раздрукаваць. Карацей кажучы, гэтая лінія 18 проста кажа: паспрабуйце прачытаць цэлалікавай ад карыстальніка клавіятуры, і захоўвае яго ўнутры х, у любы адрас, х, аказваецца, жыве ў. А потым, нарэшце, радок 19 проста кажа, дзякуй за Інтэрнэшнл, у гэтым выпадку. Такім чынам, дазвольце мне пайсці далей і зрабіць гэта. Таму пераканайцеся, SCANF 0. Дазвольце мне ісці наперад і павелічэння маштабу Я пайду і выканаць гэта з кропкамі слэш SCANF 0. Нумар, калі ласка? 50. Дзякуй за 50. Так што гэта даволі проста. Цяпер тое, што ён не робіць? Гэта не робіць цэлы букет праверкі памылак. Напрыклад, калі я не буду супрацоўнічаць, і я не ўводзіць нумар, але замест гэтага я напісаць нешта накшталт "прывітанне", гэта проста дзіўна. І вось адна з рэчаў, CS50 бібліятэка была для нас рабіць для некаторых часу з'яўляецца тое, што reprompting і reprompting. Паўтарыць фразу адкліканні ў cs50.c, і гэта прычына таго, што ў GetInt бібліятэкі CS50 фактычна ўвесь куча радкоў, таму што мы праверка на дурныя рэчы, як гэта. Ж карыстальнік не даюць нам, па сутнасці, цэлалікавых? Ён ці яна даць нам што-то падобнае алфавітным ліст? Калі гэта так, мы хочам, каб выявіць , Што і крычаць на іх. Але ўсё становіцца больш цікавым У наступным прыкладзе. Калі я пайду ў SCANF-1с, тое, што адна рэч, якая карэнным чынам змяніла ў Наступны прыклад? Я выкарыстоўваю сімвал *, вядома, замест Int. Так што гэта цікава, таму што з *, Нагадаем, што на самой справе проста Тое ж самае ў выглядзе радка. Такім чынам, падобна, можа быць, гэта супер Простая рэалізацыя GetString. Але я загнуў пласта CS50 з бібліятэкі, так што я выкліку гэтага сімвал * цяпер. Такім чынам, давайце паглядзім, дзе, калі заўгодна, мы робім няправільна. Радок 17 - Я яшчэ раз кажу, калі ласка, дайце мне што-небудзь, У гэтым выпадку, радок. І тады ў наступнай радку, я называю SCANF, зноў, надаўшы яму фармат кода, але гэтая пара працэнтаў. І то на гэты раз, я надаўшы яму буфера. А цяпер звярніце ўвагу, што я не выкарыстоўваю Ампэрсанд. Але чаму ў тым, што тут, верагодна, добра? Бо што такое буфер ўжо? Гэта ўжо паказальнік. Ужо адрасе. І давайце гэта слова "блытаюць", дазвольце мне назваць яго проста з, напрыклад, для прастата. Але я назваў яго таму, што ў буфер Наогул, у праграмаванні, калі ў вас ёсць частка памяці, якая сапраўды радок проста ёсць, вы маглі б назваць гэта буфер. Гэта месца для захоўвання інфармацыі. Падобныя рэчы, як YouTube, калі яны буфер, таму казаць, што проста азначае, што ён загрузкай бітаў з Інтэрнэт і захоўваючы іх у Лакальны масіў, мясцовы кавалак памяці, так што вы можаце глядзець іх без гэта пропуск або вісіць на Вы падчас прайгравання. Так што праблема тут, хоць, , Таму што я кажу SCANF, чакаюць радкі ад карыстальніка. Вось адрас кавалак памяці. Змесціце гэты радок там. Чаму гэта звязанае даць нам непрыемнасці, праўда? Што гэта? Ці магу я атрымаць доступ да што частка памяці? Вы ведаеце, я не ведаю. Бо валодае буферам ініцыялізаваны да чаго? Не зусім так. І так гэта тое, што мы называем смецця значэнне, якое не зьяўляецца афіцыйным словам. Гэта проста азначае, што мы паняцця не маю, якія біты ўнутры з чатырох байт, якія Я вылучыў у якасці буфера. Я не называецца Malloc. Я вызначана не называецца GetString. Так што хто ведае, што на самой справе ўнутры буфера? І ўсё ж казаць SCANF ўсляпую, туды і пакласці ўсё, што ўвёў карыстальнік. Так што, верагодна, выкліча ў нашым кодзе, калі мы яго запусціць? Напэўна сегментацыі. Можа і няма, але, верагодна, сегментацыі. І я кажу, можа быць, не таму, што часам Вы робіце, часам Вы не атрымліваеце сегментацыі. Часам вам проста шанцуе, але гэта тым не менш будзе памылка ў нашай праграме. Такім чынам, дазвольце мне ісці наперад і скласці гэты. Я збіраюся зрабіць гэта па-старому школе. Так ляскам працяжнік 0, SCANF-1, SCANF-1с, Enter. Упс, занадта старой школы. Давайце паглядзім. Дзе я? О, сімвал * буфера. О, дзякуй - Захаваць, OK - вельмі старая школа. Добра, гэта было ў той час. Так што я толькі што захаваны файл пасля робіць, што часовыя змяніць хвіліну таму. А цяпер я сабраў гэта ўручную з дапамогай Clang. І цяпер я збіраюся ісці наперад і запусціць SCANF-1, Enter. Струнны калі ласка. Я набярыце "прывітанне". А цяпер, вось дзе, шчыра кажучы, Е можа крыху раздражняць. Гэта на самай справе не збіраецца сегментацыі ў гэтым выпадку. Printf стаіць крыху асобна, таму што гэта так супер шырока выкарыстоўваецца, што істотна Е робіць нам ласку і рэалізацыі, гэта не сапраўдны паказальнік. Дазвольце мне ўзяць гэта на сябе, каб проста раздрукаваць у нулявыя дужкі, нават хоць гэта і не абавязкова, што мы самі чакалі. Таму мы не можам сапраўды лёгка выклікаць сегментацыі з гэтым, але відавочна, што гэта не паводзіны я хацеў. Так у чым жа простае рашэнне? Ну, а ў SCANF-2, дазвольце мне прапанаваць, што а на самай справе проста вылучэнне сімвал *, дазвольце мне быць трохі разумнейшыя, пра гэта, і дазвольце мне вылучыць буфер як паслядоўнасць з 16 знакаў. Так што я магу зрабіць гэта ў некалькі спосабаў. Я мог бы выкарыстаць абсалютна Malloc. Але я магу вярнуцца ў тыдзень два, калі Мне проста трэба было цэлы букет знакаў. Вось толькі масіў. Такім чынам, дазвольце мне замест перавызначыць буфер быць масівам з 16 знакаў. І цяпер, калі я праходжу ў буфер - і гэта тое, што мы не зрабілі казаць у тыдзень два - але вы можаце разглядаць масіў як хоць гэта адрасу. Тэхнічна, як мы бачылі, яны крыху па-іншаму. Але SCANF не будзе пярэчыць, калі вы перадаеце яго імя масіва, таму што тое, Clang зробіць для нас па сутнасці лячыць імя гэтага масіва ў якасці адрас блока 16 байт. Так што гэта лепш. Гэта азначае, што цяпер, калі я магу, мы спадзяемся, выканаць наступнае. Дазвольце мне паменшыць маштаб на імгненне і робяць SCANF-2, складзены ў парадку. Зараз зраблю атрымаў слэш SCANF-2. Струнны калі ласка. "Hello". І гэта здавалася, працавалі ў гэты раз. Але хто-то можа прапанаваць сцэнар , У якім ён не можа ўсё яшчэ працуе? Да? Нешта даўжэй 16 знакаў. А на самай справе, мы можам быць трохі больш дакладным. Нешта даўжэй, чым 15 сімвалаў, таму што сапраўды мы павінны мець на ўвазе, што нам трэба, што зваротная касая рыса нуля няяўна ў канцы радка, якая ў баку, як правіла, SCANF клапаціцца пра нас. Такім чынам, дазвольце мне зрабіць нешта падобнае - Часам мы можам толькі пакінуць усё як ёсць, што. Такім чынам, мы цяпер індукаваных нашы памылкі сегментацыі. Чаму? Таму што я набраў у больш чым 15 сімвалаў, і так мы фактычна закрануў памяці, што я на самой справе не павінен быў. Так што на самай справе рашэнне тут? Ну, а што калі нам трэба больш доўгую радок? Ну, мы, магчыма, зрабіць гэта 32 байт. Ну, а калі гэта не дастаткова доўга? Як наконт 64 байт? Што рабіць, калі гэта не дастаткова доўга? Як наконт 128 або 200 байт? Тое, што сапраўды ёсць рашэнне тут, у Увогуле выпадку, калі мы не ведаем, у загадзя, што карыстальнік збіраецца друкаваць? Гэта проста нейкая вялікая боль у срацы, шчыра кажучы, менавіта таму CS50 бібліятэцы маецца некалькі дзясяткаў радкоў кода, якія ў сукупнасці рэалізуюць GetString радок такім чынам, што мы не павінны ведаць загадзя, што карыстач збіраецца ўвесці. У прыватнасці, калі вы паглядзіце на cs50.c ад двух тыдняў таму, вы ўбачыце, , Што на самой справе робіць GetString Не выкарыстоўвайце SCANF такім чынам. Хутчэй, ён чытае адзін знак за адзін раз. Таму што той, добрая рэч аб чытанне аднаго знака, мы можам гарантаваць сабе заўсёды мець па крайняй меры адзін знак. Я магу проста абвясціць знак, а затым прыняць гэтыя сапраўды крокі дзіцяці проста чытаць адзін знак у час ад клавіятуры. І потым, што вы ўбачыце GetString робіць гэта кожны раз, калі сканчаецца, скажам, 16 байт памяці, яна выкарыстоўвае Malloc, або стрыечны брат яго, каб вылучыць больш памяці, капіраванне старых памяці ў новых, а затым паўзком ўздоўж, атрымліваючы адзін знак за адзін раз, і калі яно сканчаецца, што кавалак памяці, выкідвае яго, захопы большы кавалак памяці, капіюе старыя ў новыя і паўтарае. І гэта сапраўды боль на самай справе рэалізаваць нешта жа проста, як атрыманне дадзеных ад карыстальніка. Такім чынам, вы можаце выкарыстоўваць SCANF. Вы можаце выкарыстоўваць іншыя аналагічныя функцыі. І шмат падручнікаў і онлайн прыклады робяць, але яны ўсё ўразлівыя да праблем, як гэтая. І ў канчатковым рахунку, атрымаць сегментацыі выгляд раздражняе. Гэта не добра для карыстальніка. Але ў горшым выпадку, тое, што робіць гэта прынцыпова пакласці вашыя код рызыцы? Свайго роду атакі, патэнцыйна. Мы казалі аб адной з такіх нападаў - перапаўненне стэка. Але ў цэлым, калі вы маеце на гэта права Перапаўненне буфера, як мы зрабілі Пару тыдняў таму, толькі з пісьмовай больш, чым "прывітанне" у стэку, вы сапраўды можа ўзяць на сябе, патэнцыйна, кампутар, або, па меншай меры, атрымаць дадзеныя, якія ў не належыць вам. Карацей кажучы, менавіта таму ў нас ёсць гэтых навучальных колаў. Але цяпер, мы пачынаем здымаць іх, як нашы праграмы больш не патрэбна, абавязкова, увод ад карыстальніка. Але ў выпадку ўзнікнення праблем ўсталяваць шэсць, ваш ўклад будзе паступаць з вялізнага файл слоўніка з некаторымі 150 лішнім тысяч слоў. Так што вам не прыйдзецца турбавацца аб адвольнага карыстальніка ўводу. Мы дамо вам некаторыя здагадкі аб гэтым файле. Любыя пытанні па паказальніках або SCANF ці ўводу дадзеных карыстачом ў цэлым? Добра, хуткі погляд то на аднаго задняя тэмы ад двух тыдняў таму. І гэта было гэта паняцце структуры. Не тое, што - гэта паняцце Пабудуем, якое было што? Што структуры зрабіць для нас? Вызначыць - прабачце? Вызначыць тып зменнай. Так накшталт. Мы на самай справе аб'яднання двух тэмах. Так што з ЬурейеЕ, ўспомнім, што мы можам аб'явіць тыпу нашай, як і сінонім, як і радок для сімвал *. Але выкарыстанне ЬурейеЕ і структуры, мы можам стварыць сапраўды нашы ўласныя структуры дадзеных. Напрыклад, калі я вярнуся ў Gedit тут усяго імгненне, і я іду наперад і зрабіць нешта падобнае, дазвольце мне захаваць гэта як, скажам, structs.c часова, я проста хачу, ісці наперад і ўключаюць standardio.h, тап_п несапраўднымі. А потым тут, выкажам здагадку, што я хачу напісаць праграму, якая захоўвае некалькі студэнтаў з некалькіх дома, напрыклад. Так што гэта як registrarial дадзеных нейкі. Так што, калі мне трэба назва аднаго студэнта, я можа зрабіць нешта накшталт сімвала імя *, і я зраблю нешта накшталт - На самай справе, давайце выкарыстоўваць бібліятэку CS50 на імгненне, каб зрабіць гэта трохі прасцей, так што мы можам пазычаць тых дзясяткаў радкоў кода. І давайце проста трымаць яго простая. Мы будзем трымаць гэта радок, і цяпер GetString. Таму я сцвярджаю, цяпер, калі я захоўваецца назву некаторых студэнтаў, і дом які-небудзь студэнт, проста з дапамогай зменных як мы рабілі і на тыдзень адзін. Але выкажам здагадку, што я цяпер хачу падтрымаць некалькі студэнтаў. Добра, так што мае інстынкты рабіць Радок name2, атрымлівае GetString, радок Дом2 атрымлівае GetString. А потым наш трэці студэнт, давайце зробім name3 GetString. Добра, так што гэта, мы спадзяемся, дзіўна Вы як віду па-дурному, таму што гэты працэс не будзе сапраўды ніколі скончыцца, і ён проста будзе зрабіць мой код выглядае горш і ўсё горш і горш. Але мы вырашылі гэта таксама ў тыдзень два. Што ўяўляла з сябе адносна чыстым рашэннем калі ў нас было некалькі зменных той жа тып дадзеных, якія ўсё звязаныя, але мы не хацелі гэтага жорсткага беспарадак з аднайменных зменных? Што мы зрабілі, а? Так што я думаю, што я пачуў, што некалькі месцаў. У нас было мноства. Калі вы хочаце некалькі асобнікаў нешта, чаму б нам не ачысціць гэта ўсё і проста сказаць, дайце мне Масіў абзывалі? А пакуль, давайце жорсткі 3 кода. А потым даць мне яшчэ адзін масіў званыя дома, і хай мяне Цяпер жорсткі код 3. І я масава ачышчаны беспарадак, што я толькі што стварылі. Зараз, я па-ранейшаму жорстка 3, але нават 3 можа дынамічна зыходзіць ад карыстальніка, або агду ці таму падобнае. Так што гэта ўжо чысцей. Але тое, што раздражняе ў гэтым тое, што Цяпер, нават калі клічуць неяк прынцыпова звязана з студэнцкі дом - гэта студэнт, што я сапраўды хочам прадставіць - Цяпер у мяне ёсць два масіва, якія раўналежныя У тым сэнсе, што яны аднолькавы памер, і імёны кранштэйны 0 Меркавана карт для дома кранштэйны 0, імёны і кранштэйнам 1 карт Кранштэйн ў дома 1. Іншымі словамі, што студэнт жыве ў гэты дом, тое, што іншы студэнт жыццё ў гэтым іншым доме. Але, вядома, гэта можа быць зрабілі яшчэ больш чыста. Ну, можа, на самай справе. І дазвольце мне ісці наперад і адкрыць да structs.h, і Вы будзеце см. гэтую ідэю тут. Звярніце ўвагу, што я выкарыстаў, аб'ява тыпу, як вы спасылаўся на момант назад, каб заявіць пра сваю уласны тып дадзеных. Але я таксама выкарыстоўваю гэтую іншаму ключавым слове называецца структура, якая дае мне новае структуры дадзеных. І гэтая структура дадзеных я сцвярджаю, што адбываецца мець дзве рэчы ўнутры гэта - радок называецца імя і Радок называецца домам. І імя я збіраюся даць гэтая структура дадзеных будзе называцца вучнем. Я мог бы назваць гэта ўсё, што захачу, але гэта робіць семантычна сэнс для мяне ў маёй свядомасці. Так што цяпер, калі я адкрываю лепшую версію праграмы я пачаў пісаць там, дазвольце мне перайсці да вяршыні. І ёсць яшчэ некалькі радкоў кода тут, але дазвольце мне спыніцца на момант на адзін. Я абвясціў пастаянны званых студэнтаў і жорстка 3 на дадзены момант. Але цяпер, звярніце ўвагу, як чысты мой код пачынае атрымліваць. У радку 22 я заяўляю Масіў студэнтаў. І заўважце, што студэнт па-відаць Цяпер тып дадзеных. Таму што ў верхняй часткі гэтага файла, заўважыць Я уключыў гэты загаловак файла што я спыніўся на хвіліну таму. , А гэты загаловак файла проста-проста было гэта вызначэнне студэнта. Так што цяпер, я стварыў мае ўласныя прыстасаваныя дадзеныя Тып што аўтары гадоў C назад не думалі загадзя. Але не праблема. Я магу зрабіць гэта сам. Так што гэта масіў з імем студэнтаў, кожны з членаў якой з'яўляецца студэнтам структуры. І я хачу, тры з іх ў масіве. І цяпер, што зробіць усё астатняе гэтай праграмы рабіць? Мне трэба нешта крыху адвольным. Так што з онлайн 24 гадоў, Я ітэрацыі ад 0 да 3. Я тады пытаюся ў карыстальніка Імя і прозвішча навучэнца. А затым выкарыстоўваю GetString, як раней. Тады я пытаюся для дома студэнта, і я выкарыстоўваю GetString, як раней. Але звярніце ўвагу - некалькі новых частка сінтаксісу - Я да гэтага часу індэкс да I-га студэнта, але як я магу атрымаць на канкрэтных дадзеных поле ўнутры структуры? Ну, што па-відаць новая частка сінтаксісу? Гэта проста кропка аператара. Мы на самой справе не бачыў гэтага раней. Вы бачылі гэта ў PSET пяць, калі ў вас ёсць нырнуў ва ўжо і графічных файлаў. Але проста азначае, што кропка ўнутры гэтага структуры або некалькі палёў, даць кропку імя, або дайце мне кропку дома. Гэта азначае, што ты ўнутры структуры і атрымаць гэтыя канкрэтных галінах. Што робіць астатнюю частку гэтай праграмы рабіць? Гэта яшчэ не ўсё, што сэксуальна. Заўважце, што я ітэрацыі ад 0 да 3 раз, і я проста ствараю англійскай фраза тыпу так і так знаходзіцца ў такім і такі дом, пераходзячы ў кропку назву ад I-га студэнта і іх дома, а таксама. А потым, нарэшце, зараз мы пачнем, каб атрымаць Анальны пра гэта, цяпер, калі мы знаёмыя з тым, што і Malloc іншыя функцыі былі рабіў ўвесь гэты час. Чаму я павінен вызваліць абодва назвы і дома, хоць я не тэлефанаваў Malloc? GetString зрабіў. І гэта быў маленькі брудны сакрэт для некалькі тыдняў, але GetString мае была ўцечка памяці ва ўсім размясціць ўвесь семестр да гэтага часу. І, нарэшце, valgrand паказаць гэта нам. Але гэта не мае вялікага значэння, таму што я ведаю што я магу проста вызваліць імя і дом, хоць тэхнічна, каб быць супер, супер бяспечны, я павінен быць робяць некаторыя тут памылкі. Якія вашы інстынкты кажу? Што я павінен для праверкі перш чым я бясплатна Што з'яўляецца Радок, якую ён жа знак *? Я павінен сапраўды быць праверка, калі студэнты Кранштэйн я кропка імя не роўным нулю. Тады ўсё будзе ў парадку, каб ісці наперад і бясплатна што паказальнік, і тое ж ці іншае , А таксама. Калі студэнты кранштэйны я кропка дом не роўная нулю, гэта цяпер будзе абараняць па адносінах да кута выпадак, у якім GetString вяртае нешта накшталт нулявы. І мы ўбачылі хвіліну назад, Е будзе абараніць нас тут, проста кажучы пустое значэнне, што будзе выглядаць дзіўна. Але па крайняй меры не будуць падаць, як мы ўжо бачылі. Ну, дазвольце мне зрабіць яшчэ адну рэч тут. структур-0 гэта свайго роду дурныя праграмы , Таму што я ўсё гэта ўвесці дадзеныя, а затым ён страціў, калі праграма сканчаецца. Але дазвольце мне ісці наперад і рабіць гэта. Дазвольце мне зрабіць тэрмінал вокны трохі больш. Дазвольце мне зрабіць структур-1, які гэта новая версія гэтага. Я павялічыць няшмат. А цяпер дазвольце мне працаваць кропка слэш структур-1. Імя і прозвішча вучня - Дэвід Mather, давайце зробім Роб Kirkland, давайце зробім Левереттом Ларэн. Што цікава, цяпер апавяшчэння - і я ведаю, што гэта толькі таму, што Я напісаў праграму - ёсць файл цяпер на маім бягучым каталогу з імем students.csv. Некаторыя з вас, магчыма, бачылі гэта ў рэальным свеце. Што такое файл CSV? Значэнняў, падзеленых коскамі. Гэта накшталт як беднага чалавека версія файла Excel. Гэта табліца радкоў і слупкоў, Вы можаце адкрыць у праграму, як Excel, або лічбы на Mac. І калі я адкрываю гэты файл тут на Gedit, апавяшчэнне - а лічбы там няма. Вось толькі гаварыць GEdit мне нумары радкоў. Звярніце ўвагу, на першай лініі гэтага Выява Давіда і Mather. Наступны радок Rob Kirkland коскі. І трэцяя лінія Ларэн Левереттом коскі. Дык што ж я стварыў? Я цяпер напісана-праграму, якая эфектыўна можа генераваць табліцы якія могуць быць адкрыты ў праграмы, як Excel. Не ўсё, што пераканаўчым наборам дадзеных, але калі ў вас ёсць шмат вялікіх кавалкаў дадзеныя, якія вы сапраўды хочаце маніпуляваць і рабіць графікі і падабаецца, гэта, бадай, адзін спосаб стварэння гэтых дадзеных. Акрамя таго, CSV, на самай справе супер агульныя проста для захоўвання простых дадзеных - Yahoo Finance, напрыклад, калі вы атрымліваеце каціроўкі акцый з дапамогай сваіх так званых API, бясплатны сэрвіс, які дазваляе атрымаць ток да-да-дата акцыі каціроўкі кампаній, яны даць дадзеныя назад у супер просты фармат CSV. Так як жа мы гэта зробім? Добра заўважыць, вялікая частка гэтай праграмы амаль тое ж самае. Але звярніце ўвагу, тут, унізе, а не для друку студэнтаў, аперацыі па лініі 35 і далей, я сцвярджаю, што я эканомлю студэнтаў на дыск, так што захаванне файла. Так заўважыць я абвяшчаю файл * - Цяпер, гэта выгляд анамаліі ў C. Па нейкай прычыне, то файл будзе загалоўнымі літарамі, які не падобны на большасць іншых тыпаў дадзеных ў C. Але гэта убудаваны Тып дадзеных, файл *. І я абвяшчаю паказальнік на файл, як вы можаце думаць пра гэта. FOPEN азначае адкрыты файл. Якую файлавую вы хочаце адкрыць? Я хачу адкрыць файл, які я буду Умоўна назавем students.csv. Я магу патэлефанаваць, што ўсё, што захачу. А потым зрабіць здагадку. Што азначае другі аргумент да FOPEN, верагодна, азначае? Права, W для запісу, можа быць R для чытання. Там ёсць для дадання, калі вы хочаце дадаць радкі, а не перапісаць усё гэта. Але я проста хачу стварыць гэты файл адзін раз, таму я буду выкарыстоўваць у двукоссях Вт. І я ведаю, што толькі прачытаўшы дакументацыі, або даведачныя старонкі. Калі файл не з'яўляецца нулявым, - іншымі словамі, калі нічога не пайшло не так там - Дазвольце мне перабору студэнтаў ад 0 да 3. А цяпер звярніце ўвагу, ёсць што-то вельмі няшмат розны пра лінію 41 тут. Гэта не Е. Гэта Fprintf Е для файла. Дык гэта будзе запіс у файл. Які файл? Адзін, паказальнік пазначыць У якасці першага аргументу. Затым мы паказваем радок фармату. Затым мы вызначаем, якія радкі мы хочам убудова для першага з адсоткаў, а затым іншы зменнай ці другі з адсоткаў. Тады мы закрываем файл з FCLOSE. Чым я вызваліць памяць, як і раней, хоць Я павінен вярнуцца і дадаць некаторыя праверкі для нулявых. І гэта ўсё. FOPEN, Fprintf, FCLOSE дае мне магчымасць ствараць тэкставыя файлы. Зараз, вы ўбачыце ў Архіў задач пяць, які ўключае ў сябе выявы, якія вы будзеце выкарыстоўваць двайковыя файлы замест гэтага. Але важна тое, што ідэя тая ж, , Хоць гэтыя функцыі вы будзеце бачыце, крыху па-іншаму. Так ўраганны тур, але вы атрымаеце занадта добра знаёмыя з файла I/O-- ўваходныя і выходныя - з PSET пяць. І ўсе пытанні аб пачатковыя асновы тут? Да? Што, калі вы паспрабуеце вызваліць нулявое значэнне? Я лічу, калі бясплатна не атрымала трохі больш зручным для карыстальнікаў, вы можаце патэнцыйна сегментацыі. Перадача яго несапраўдным дрэнна, таму што я не веру бясплатна перашкаджае праверыць для вас, таму што гэта патэнцыйна можа быць пустым марнаваннем часу для таго, каб зрабіць для сябе кожны чалавек у свеце. Добры пытанне, аднак. Добра, таму гэты выгляд атрымлівае нам цікавую тэму. Тэмай праблемай набору пяць з'яўляецца крыміналістыка. Па крайняй меры, частка праблемы набору. Крыміналістыка ў цэлым ставіцца да аднаўленне інфармацыі, якія могуць або не можа быць выдалены наўмысна. І таму я думаў, што дам вам хуткі густ таго, што адбываецца на самай справе ўсё на гэты раз пад капотам вашага кампутара. Напрыклад, калі ў вас ёсць унутры вашага ноўтбуку ці настольным кампутары жорсткі дыск, гэта альбо механічнымі прылада, якое на самай справе спіны - ёсць, што называецца кругавой пласціны , Якія выглядаюць зусім як тое, што я толькі што быў на экране тут, хоць гэта больш старой школы. Гэта тры з паловай цалі жорсткага дыска. І тры з паловай цалі ставіцца з з гэтай рэчы, калі вы ўсталюеце яго ў кампутары. Многія з вас, хлопцы, у вашых наўтбукаў зараз ёсць цвёрдацельныя назапашвальнікі або цвёрдацельныя назапашвальнікі, якія не маюць якія рухаюцца частак. Яны больш падобныя на АЗП, а не як гэтыя механічныя прылады. Але ідэі ўсё тыя ж, вядома ж, як яны ставяцца на пытанне, пастаўлены пяць. І калі вы думаеце пра цяпер жорсткі дыск ўяўляе будучы круг, які Я намалюю вось так вось. Калі вы ствараеце файл на вашым кампутары, няхай гэта будзе SSD або ў гэтым выпадку старэйшы школьны цвёрдым дыску, гэты файл утрымлівае некалькі бітаў. Давайце выкажам здагадку, што менавіта гэта 0 і 1, цэлы букет з 0 і 1. Так што гэта мой ўвесь жорсткі дыск. Гэта, відавочна, даволі вялікі файл. І ён выкарыстоўвае да 0 і 1, што на частку фізічнага пласціны. Ну, што ж, што фізічная частка? Ну, атрымліваецца, што на цвёрдым дыску, па меншай меры такога тыпу, ёсць гэтыя маленькія магнітныя часціцы. І яны па сутнасці ёсць поўнач і паўднёвы полюса да іх, так што, калі вы сваю чаргу, адзін з тых магнітных часціц Такім чынам, можна сказаць, што гэта прадстаўляюць 1. І калі гэта дагары нагамі на поўдзень да Поўнач, вы маглі б сказаць, што гэта прадстаўляюць 0. Такім чынам, у рэальным фізічным свеце, гэта як вы маглі б прадстаўляць сабой нешта ў двайковы стану 0 і 1. Так што ўсё файл. Там цэлая куча магнітнага часціцы, якія іх так ці Такім чынам, стварэнне мадэлі 0 і 1. Але, аказваецца, калі вы захоўваеце файл, некаторая інфармацыя захоўваецца асобна. Так што гэта столік, каталог, так бы мовіць. І я называю гэта імя слупка, а Я буду называць гэтую калонку месцы. І я збіраюся сказаць, выкажам здагадку, гэта маё рэзюмэ. Мой resume.doc захоўваецца пры месцы, скажам, 123. Я заўсёды іду на гэта лік. Але дастаткова сказаць, што, як і ў аператыўнай памяці, вы можаце ўзяць жорсткі дыск вось гігабайт або 200 гігабайт або адзін тэрабайт, і вы можаце лік усіх байтаў. Вы можаце перанумараваць ўсе кавалкі 8 біт. Таму мы будзем казаць, што гэта 123, з'яўляецца размяшчэнне. Так што гэты каталог ўнутры маёй аперацыйнай сістэма запамінае, што мая Рэзюмэ знаходзіцца ў месцазнаходжанні 123. Але самае цікавае, калі Вы выдаляеце файл. Так, напрыклад - і, на шчасце, большасць краін свету мае злавілі на гэтым - што адбываецца, калі вы перацягнуць файл у ваш смецце Mac OS ці ваш Windows кошыка? Якая мэта рабіць гэта? Гэта, відавочна, каб пазбавіцца ад файлаў, але тое, што робіць акт перамяшчэнні і падзення ў ваш смецце або ваш Кошыка рабіць на кампутары? Абсалютна нічога, на самой справе. Гэта проста, як тэчкі. Гэта адмысловая тэчка, каб быць упэўненым. Але ці так гэта на самай справе выдаліць файл? Ну, не, таму што некаторыя з вас, напэўна быў падобны, ой блін, вы гэтага не зрабілі хацеў гэтага рабіць. Такім чынам, вы двойчы пстрыкніце Trash або кошыка. Вы ткнулі вакол, і вы ачунялі файл, проста перацягнуўшы яго адтуль. Такім чынам, ясна, што гэта не абавязкова выдаленьнем. Добра, што ты разумнейшы. Вы ведаеце, што проста перацягнуць яго ў Trash або кошыка не азначае, Вы ачыстцы кошыка. Дык вы ідзяце да мяне, а вы кажаце Ачысціць кошык або пусты кошыка. Тады што адбываецца? Так, так яно выдаляецца больш. Але ўсё, што адбываецца гэта. Кампутар забывае, дзе resume.doc было. Але тое, што не змянілася па-відаць на малюнку? Біт, 0 і 1, што я сцвярджаю, з'яўляюцца На тэрыторыі некаторых фізічных аспектаў апаратных сродкаў. Яны ўсё яшчэ там. Гэта проста кампутар забыўся, што яны ёсць. Так што гэта па сутнасці вызваліў выяву Біты так што яны могуць быць выкарыстаны паўторна. Але не раней, вы ствараеце некалькі файлаў, і больш файлаў і многае іншае файлы імавернасна, тыя, 0 і 1, гэтыя магнітныя часціцы, выкарыстоўваюцца паўторна, уверх ці правай бокам уверх, для іншыя файлы, 0 і 1. Так што ў вас ёсць гэты прамежак часу. І гэта не прадказальных Даўжыня, на самай справе. Гэта залежыць ад памеру жорсткага дыск і колькі файлаў ў вас ёсць і як хутка вы зрабіць новыя. Але ёсць акно часу, на працягу які, што файл ўсё яшчэ выдатна кампенсавана. Так што калі вы калі-небудзь выкарыстоўваць праграмы, як McAfee або Нортан, каб паспрабаваць аднавіць дадзеных, усе яны робяць спрабуе аднавіць гэтую так званую каталог высветліць, дзе твой файл быў. А часам Нортан і скажа: Выява 93% вымаемых. Ну, што ж гэта значыць? Гэта проста азначае, што некаторы іншы файл выпадкова скончыў з выкарыстаннем, скажам, гэтыя біты з зыходнага файла. Так што ж на самай справе ўдзельнічае ў аднаўленні дадзеных? Ну, калі ў вас няма нешта накшталт Нортан папярэдне ўсталяванай на Вашым кампутары, Лепшае, што можна часам зрабіць, гэта паглядзець на ўвесь жорсткі дыск шукае паслядоўнасці бітаў. І адна з тым праблема набору пяць у тым, што вы будзеце шукаць аналаг жорсткага дыска, судова вобраз кампактнага флэш-карту ад лічбавая камера, пошук 0s і 1, якія звычайна з высокай верагоднасці, уяўляюць пачатак малюнка JPEG. І вы, хлопцы, можаце аднавіць гэтыя вобразы на пры ўмове, калі я бачу гэтую мадэль біты на судова малюнка, з высокая верагоднасць, што азначае пачатку JPEG. І калі я бачу той жа шаблон зноў, што, верагодна, азначае сабой пачатак іншы JPEG, а другі JPEG, а іншы ў фармаце JPEG. І гэта, як правіла, як аднаўленне дадзеных будзе працаваць. Тое, што добра пра фармаце JPEG з'яўляецца хоць фармат файла сам некалькі комплекс, у пачатку кожнага такога файл на самай справе даволі ідэнтыфікуюцца і просты, як вы ўбачыце, калі ў вас не зрабілі. Такім чынам, давайце зірнем пад капот як дакладна, што было адбываецца, і тое, што гэтыя 0 і 1 ёсць, каб даць вам крыху больш кантэкст для гэтага канкрэтнага выклік. [Прайграванне відэа] -Дзе Ваш кампутар захоўвае самыя яго пастаянных дадзеных. Каб зрабіць гэта, дадзеныя перамяшчаюцца з аператыўнай памяці разам з праграмным забеспячэннем сігналы, якія кажуць жорсткага дыска, як захоўваць гэтыя дадзеныя. Жорсткі дыск Перавесці схем гэтых сігналаў у напружанне ваганняў. Гэтыя, у сваю чаргу, кантралююць жорсткага дыска якія рухаюцца частак, некаторыя з некалькіх якія рухаюцца частак, якія засталіся ў сучаснага кампутара. Некаторыя з сігналаў кіравання рухавіком які круціць металічным пакрыццём пласцін. Вашы дадзеныя на самай справе захоўваюцца на гэтых пласцінах. Іншыя сігналы перамяшчэння чытання / запісу галавы, каб чытаць ці запісу дадзеных на пласцінах. Гэты механізм настолькі дакладныя, што чалавека Валасы не мог нават прайсці паміж кіраўнікі і спінінг пласцін. Тым не менш, усё гэта працуе на выдатнай хуткасці. [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID малая: невялікае павелічэнне глыбокае цяпер на тое, што гэта на самай справе на гэтых пласцінах. [Прайграванне відэа] -Давайце паглядзім на тое, што мы проста бачыла ў запаволеным тэмпе. Калі кароткага імпульсу электрычнасці накіроўваецца ў галоўку чытання / запісы, калі перагортваецца на малюсенькім для электрамагнітных долі секунды. Магніт стварае поле, якое змены палярнасці малюсенькі, малюсенькі частка металічных часціц, якія пакрыць кожную паверхню пласцін. Мадэль серыя гэтых маленькіх, спаганяецца тэрыторый на дыску ўяўляе сабой адзін біт Дадзеныя ў двайковы лік Сістэма, якая выкарыстоўваецца на кампутарах. Зараз, калі ток накіроўваецца ў адзін бок праз галоўкі чытання / запісы, плошча палярызаванае ў адным кірунку. Калі ток накіроўваецца ў процілеглым кірунку палярызацыя змяняецца на супрацьлеглую. Як вы атрымліваеце дадзеныя з жорсткага дыска? Проста павярнуць працэс назад. Так што гэта часціцы на дыску якія атрымліваюць ток у галоўка чытання / запісы руху. Усе разам гэтыя мільёны намагнічанага сегментаў, а таксама ў вас ёсць файл. Зараз, часткі аднаго файла можа быць раскіданыя па дысках, каб знайсці стравы, накшталт як беспарадак папер на вашым стале. Так спецыяльная дадатковы файл адсочвае пра тое, дзе што знаходзіцца. Хіба вы не хацелі б мець нешта накшталт гэтага? [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID малая: Добра, напэўна, няма. Так як многія з вас, хлопцы рос з гэтым? ОК, так што гэта ўсё менш і менш рукі з кожным годам. Але я рады, што вы па крайняй меры знаёмыя з імі, таму што гэта і наша ўласная Кніга дэма, на жаль, паміраюць вельмі павольную смерць тут фамільярнасць. Але гэта тое, што я, па меншай меры, яшчэ ў сярэдняй школы, выкарыстаў выкарыстанне для рэзервовага капіявання. І гэта было дзіўна, таму што вы можа захоўваць 1,4 мегабайт на дадзены дыск. І гэта было высокай шчыльнасці Версія, як паказана ў HD, які мае гэта азначае, перш HD сённяшняй відэа. Стандартная шчыльнасць была 800 кілабайт. А да гэтага, былі 400 кілабайт дыскамі. А да гэтага, было 5 і 1/4 цалевыя дыскі, якія былі па-сапраўднаму гнуткіх, і трохі шырэй і вышэй чым гэтыя рэчы тут. Але вы можаце ўбачыць так званую дыскеты аспект гэтых дыскаў. І функцыянальна, яны на самой справе вельмі падобна на жорсткіх дысках ў меры гэтага тыпу. Зноў жа, цвёрдацельныя кружэлкі ў новых кампутарах працуюць некалькі інакш. Але калі вы перасоўвае, што мала ўкладку метал, вы можаце ўбачыць трохі печыва, ці страве. Гэта не метал, як гэты. Гэты на самай справе некаторыя больш танныя пластыкавага матэрыялу. І вы можаце выгляду варушыць яго. І вы Trully проста сцёрты некаторых Колькасць бітаў або магнітныя часціцы з гэтага дыска. Так, на шчасце, няма нічога на ім. Калі гэтая рэч знаходзіцца ў шляху - і ахопліваюць Вашы вочы і тыя з вашых суседзяў - Вы можаце толькі збольшага ажыццявіць гэта цэлым ад абалонкі падобнае. Але ёсць трохі вясны, так што будзьце ўсведамляе, што на свае вочы. Так што зараз у вас ёсць сапраўды дыскету. І тое, што аб гэтай выдатнай у тым, што ў той меры, што гэта дробнага ўяўленне большага жорсткі дыск, гэтыя рэчы супер, супер проста. Калі вы дробку дне яго, цяпер, што металічныя рэчы выключаны, і скурка іх адкрытымі, і ўсё, што складаецца з дзвюх частак лямца і так званы гнуткі дыск з кавалкам металу на ўнутраным боку. І там ідзе палова мой дыск змесціва. Там ідзе іншая палова з іх. Але гэта ўсё, што кружылася ўнутры вашага кампутара ў мінулых. І зноў жа, каб паставіць гэта ў перспектыве, наколькі вялікая большасць вашых Жорсткія дыскі ў гэтыя дні? 500 гігабайт, тэрабайт, можа быць, у настольны кампутар, 2 Тб, 3 тэрабайт, 4 тэрабайта, праўда? Гэта адзін мегабайт, плюс-мінус, , Якія не могуць нават адпавядаць тыповым MP3 больш у гэтыя дні, ці некаторыя Падобныя музычныя файлы. Так невялікі сувенір для вас сёння, і Таксама, каб дапамагчы тое, што кантэкст мы будзем прымаць як належнае Зараз у задачу, пастаўленую пяць. Такім чынам, гэта вашы. Такім чынам, дазвольце мне пераход да якой будзе правесці наступныя PSET таксама. Так што мы цяпер ўстаноўлена для гэтай старонкі - о, пару аб'явы хутка. У гэтую пятніцу, калі вы хочаце далучыцца да CS50 на абед, перайдзіце на звычайным месцы, cs50.net/rsvp. І апошні праект - так у праграме, мы адправілі канчатковай спецыфікацыі праекта ўжо. Зразумейце, што гэта не азначае, гэта з-за асаблівасці ў бліжэйшы час. Ён адказваў, на самай справе, толькі б атрымаць вы, хлопцы, думаў пра гэта. І сапраўды, супер значныя працэнт вы будзеце шукаць шляхі вырашэння дыпломныя праекты на матэрыяле, які мы нават яшчэ не ў класе, але будзе ўжо на наступным тыдні. Заўважце, аднак, што спецыфікацыя патрабуе некалькі розных кампанентаў канчатковы праект. Па-першае, на працягу некалькіх тыдняў, з'яўляецца перадпраектныя прапановы, даволі выпадковы электроннай пошце Вашай TF сказаць яму або тое, што вы думаць аб для вашага праекта, з Няма абавязацельстваў. Прапанова будзе вашым абавязацельства, кажучы, вось, гэта тое, што Я хацеў бы зрабіць для майго праекта. Што вы думаеце? Занадта вялікі? Занадта маленькі? Гэта кіраваным? І вы бачыце, спецыфікацыі для больш падрабязнай інфармацыі. Пару тыдняў пасля гэтага з'яўляецца статус даклад, які аналагічным чынам выпадковы электроннай пошце сваім TF сказаць, наколькі далёка ззаду Вы знаходзіцеся ў сваім канчатковым рэалізацыі праекта, а затым CS50 Hackathon якому кожны прапануецца, які будзе падзея з 8:00 вечара на адным вечара да 7:00 Раніцы наступнага дня. Піца, як я, магчыма, згаданыя ў тыдзень нуля, Віль быць пададзены ў 9:00 вечара, Кітайская ежа ў 1:00 раніцы. І калі вы яшчэ не спаў у 5:00 раніцы, мы адвязем вас да IHOP на сняданак. Такім чынам, Hackathon з'яўляецца адным з найбольш незабыўных уражанняў у класе. Затым ажыццяўлення тлумачыцца тым, а Затым кульмінацыйнай CS50 кірмаш. Больш падрабязную інфармацыю аб усіх гэтых у бліжэйшыя тыдні. Але давайце вернемся да таго, старой школы - зноў, масіў. Так масіў быў добры, таму што вырашае праблемы, як мы бачылі, толькі Хвіліну таму са студэнцкімі структурамі становіцца трохі з-пад кантролю, калі мы хочуць мець аднаго студэнта, студэнт два, тры студэнта, студэнт кропка кропка кропка, некаторыя адвольныя ліку студэнтаў. Так масівы, некалькі тыдняў таму, напала і вырашыў усе нашы праблемы не ведаючы загадзя, колькі рэчаў некаторага тыпу мы маглі б хацець. І мы бачылі, што структуры могуць дапамагчы нам далейшай арганізацыі нашага кода і захаваць канцэптуальна падобна зменных, такіх як імя і дома, разам, так што мы іх можна разглядаць як адзінае цэлае, усярэдзіне якой маюцца дробныя кавалкі. Але масівы маюць некаторыя недахопы. Якія некаторыя з недахопаў мы сутыкнуліся з масівамі да гэтага часу? Што гэта? Фіксаваны памер - так што нават калі вы, магчыма, зможа вылучыць памяць для Масіў, як толькі вы ведаеце, колькі студэнтаў ў вас ёсць, колькі знакаў у вас ёсць ад карыстальніка, як толькі вы вылучылі масіве, вы выгляд афарбаваныя сябе ў кут. Таму што вы не можаце ўставіць новыя элементы у сярэдзіну масіва. Вы не можаце ўставіць больш элементаў ў канцы масіва. Сапраўды, вы змушаныя звяртацца да стварэння зусім новы масіў, як мы ўжо абмяркоўвалі, капіяваннем старога ў новае. І зноў жа, гэта галаўны боль, якая GetString займаецца для вас. Але зноў жа, вы не можаце нават ўставіць нешта ў сярэдзіну масіва Калі стаўка не цалкам запоўненая. Напрыклад, калі гэты масіў тут памераў шэсць толькі пяць рэчаў у ім, Ну, вы маглі проста тактыку то на канцы. Але што, калі вы хочаце ўставіць нешта ў сярэдзіне масівам, хоць ён можа мець пяць з шасці рэчаў у ім? Ну, што ж мы робім, калі мы былі ўсе нашых чалавечых добраахвотнікаў на сцэне ў тыдня мінулага? Калі б мы хацелі паставіць каго-то тут, або гэтыя людзі, як рухацца гэтым Дарэчы, гэтыя людзі ці як рухацца гэтым Дарэчы, і гэта стала дарагім. Перамяшчэнне людзей унутры Масіў скончылася тым, што дадаў і коштам нам час, таму многія нашы N квадрат час працы, як сартаванне устаўкай, для Напрыклад, у горшым выпадку. Так масівы з'яўляюцца вялікімі, але вы павінны загадзя ведаць, як вялікі Вы хочаце іх. Так добра, вось рашэнне. Калі я не ведаю загадзя, колькі Я студэнтам маглі мець, і я ведаю, як толькі Я вырашаю, хоць, я затрымаўся з гэтым многія студэнты, то чаму б мне проста не заўсёды вылучыць два разы больш месца як я мог бы думаю, што трэба? Хіба гэта не разумнае рашэнне? Рэальна, я не думаю, што мы спатрэбіцца больш за 50 слотаў ў масіў для сярэдняга класа, так што давайце проста акругліць. Я зраблю 100 слотаў ў маім масіве, усяго так што мы можам вызначана атрымаць колькасць студэнтаў, якіх я чакаў быць у пэўным сярэдняга класа. Так чаму б не акружыць і вылучыць больш памяці, звычайна, для масіва чым вы думаеце, вы маглі б нават трэба? Што гэта простае буксіроўкі да гэтай ідэі? Вы проста марнуеце памяці. Літаральна кожную праграму вы пішаце то , Можа быць, выкарыстоўваеце ў два разы больш памяці, чым вам сапраўды трэба. І, што проста не хочацца Асабліва элегантнае рашэнне. Акрамя таго, ён проста памяншае Верагоднасць праблема. Калі вам пашчасціла мець папулярны курс адзін семестр і ў вас ёсць 101 студэнтаў, ваша праграма па-ранейшаму прынцыпова сутыкаецца з той жа праблемай. Так на шчасце, ёсць рашэнне гэта аб'ява ўсе нашы праблемы ў выглядзе структур дадзеных, якія больш складаныя, чым тыя мы бачылі да гэтага часу. Гэта, я сцвярджаю, з'яўляецца звязаных спісам. Гэта спіс лікаў - 9, 17, 22, 26 і 34 - , Якія былі звязаны адзін з адным з дапамогай пра тое, што я намаляваў, як стрэлы. Іншымі словамі, калі б я хацеў, каб прадстаўляць масівам, што я мог зрабіць нешта накшталт гэтага. І я пакладу гэта на накладныя праз хвіліну. Я мог бы зрабіць - прывітанне, усё ў парадку. Заставайцеся на сувязі. Новы кампутар тут, ясна - Усё ў парадку. Так што, калі ў мяне ёсць гэтыя колькасці ў масіве - 9, 17, 22, 26, 24 - не абавязкова ў маштабе. Добра, вось мая масіва - Божа мой. Добра, вось мая масіва. О, мой бог. [Смяецца] DAVID малая: прыкідвацца. Гэта занадта шмат намаганняў, каб вярнуцца і выправіць гэта, так што - 26. Так што ў нас ёсць гэты масіў 9, 17, 22, 26 і 34. Для тых з вас можа бачыць прыкрае непаразуменне я толькі што зрабіў, там гэта. Таму я сцвярджаю, што гэта вельмі эфектыўным рашэннем. Я выдзеліў столькі як цэлыя Мне трэба - раз, два, тры, чатыры, пяць, ці шэсць - і я затым захоўваюцца нумары ўнутры гэтага масіва. Але выкажам здагадку, то, я хачу ўставіць значэнне як лік 8? Ну, куды гэта ідзе? Выкажам здагадку, я хачу, каб ўставіць лік, напрыклад 20. Ну, куды гэта ідзе? Недзе там у сярэдзіне, альбо лічбу 35 павінна пайсці дзесьці ў канцы. Але я ўсё з космасу. І такім чынам, гэта з'яўляецца фундаментальнай праблемай масіваў якое з'яўляецца рашэннем. Я сцвярджаў, хвіліну назад, GetString вырашае гэтую праблему. Калі Вы хочаце ўставіць шостым нумарам У гэты масіў, тое, што па меншай меры адзін рашэнне, якое вы можаце абаперціся напэўна, гэтак жа, як мы робім з GetString? Што гэта? Ну, зрабіць яго больш, тым лягчэй сказаць, чым зрабіць. Мы не можам абавязкова рабіць масіва больш, але што мы можам зрабіць? Зрабіць новы масіў, які больш, памерам 6, а можа, памер 10, калі мы хочам апярэдзіць рэчы, а затым скапіяваць старога масіва ў новы, а затым вызваліць старога масіва. Але тое, што час працы Зараз гэтага працэсу? Гэта вялікае Аб ад N, так як капіраванне будзе каштаваць вам некалькі адзінак часу, так што не так ідэальна, калі мы павінны вылучыць новы масіў, які будзе спажываць у два разы больш памяці часова. Скапіюйце старыя на новыя - Я маю на ўвазе, гэта проста галаўны боль, якая , Зноў жа, чаму мы напісалі GetString для вас. Так што мы маглі б зрабіць замест гэтага? Ну, што, калі нашы структуры дадзеных на самай справе мае прабелы ў ім? Выкажам здагадку, што я расслабляюся маёй мэты, якія маюць бесперапынныя блокі памяці, дзе 9 знаходзіцца побач з 17, які побач з 22, і так далей. І выкажам здагадку, што 9 можа быць тут, у Аператыўнай памяці, і 17 можа быць тут, у аператыўнай памяці, і 22 можа быць тут, у аператыўнай памяці. Іншымі словамі, я не маю патрэбу ў іх нават спіна да спіны больш. Мне проста трэба неяк нітку ў іголку у кожным з гэтых лічбаў, або кожны з гэтых вузлоў, як мы будзем называць прастакутнікамі, як я намаляваў іх, памятаю, як дабрацца да апошняга такі вузел ад першага. Так у чым жа канструкцыі праграмавання мы бачылі зусім нядаўна, з якой я можна рэалізаваць, што нітка, або зробленыя тут, з якой я магу ажыццяўляць гэтыя стрэлкі? Таму паказальнікі, ці не так? Калі б я вылучыць не толькі Інтэлект, але вузел - і вузел, я проста азначае кантэйнеры. І візуальна, я маю на ўвазе прастакутнік. Так вузла мабыць патрэбныя ўтрымліваць два значэння - цэлалікавай сябе, а потым, як гэта вынікае з ніжнюю палову прамавугольніка досыць месцы для Int. Так што паклапаціцца пра гэта загадзя тут, наколькі вялікі гэты вузел, гэта Кантэйнер ідзе гаворка? Колькі байт для цэлалікавых? Мяркуецца, 4, калі гэта гэтак жа, як звычайна. А потым, колькі байт для паказальніка? 4. Так што альбо кантэйнер ад гэты вузел, з'яўляецца будзе 8 байт структуры. О, і гэта шчаслівае супадзенне, што мы сапраўды таксама гэта паняцце структура або структура C. Таму я сцвярджаю, што я хачу зрабіць крок да гэтага больш складаныя рэалізацыя спіс нумароў, звязаны спіс нумароў, мне трэба зрабіць трохі больш мысленне фронт і аб'явіць не толькі Інтэлект, але структура , Што я пазваню, умоўна Тут, вузла. Мы маглі б назваць яе як заўгодна,, але вузел будзе тэматычным ў многіх з рэчаў, мы пачнем разглядаць зараз. Унутры гэтага вузла будзе Int N. А потым гэты сінтаксіс, трохі дзіўна на першы погляд - Структура вузла * наступны. Ну графічна, што гэта такое? Гэта значыць ніжняя палова прастакутнік, які мы бачылі проста імгненне таму. Але чаму я кажу структура вузла * а не толькі вузлом *? Таму што, калі гэты паказальнік паказвае на адным вузле, гэта проста адрас вузла. Гэта ўзгадняецца з таго, што мы абмяркоўвалі аб паказальніках да гэтага часу. Але чаму, калі я сцвярджаю, гэтая структура называецца вузлом, я павінен сказаць, што структура вузлом ўнутры тут? Менавіта так. Гэта свайго роду дурныя рэальнасць C. Вызначэнне тыпу, так бы мовіць, не мае адбылося. З супер літаральна. Яна чытае ваш код зверху ўніз, злева направа. І, пакуль не сустрэне, што кропка з коскі на Сутнасць, думаю, што не існаваць як тып дадзеных? Вузла, у двукоссі вузла. Але з-за больш падрабязны Я зрабіў заяву на першай лініі - ЬурейеЕ вузла структуры - таму, што быў на першым месцы, перад фігурныя дужкі, што накшталт як папярэдняга навучання Clang, што, вы Ведаеце што, дайце мне структуры называецца структура вузла. Шчыра кажучы, я не люблю называць рэчы Структура вузла, вузла структуры ўсіх на працягу ўсёй маёй кода. Але я буду выкарыстоўваць яго толькі адзін раз, толькі ўнутры, так што я магу эфектыўна стварыць свайго роду цыклічная спасылка, а ня паказальнік на сябе такой, але паказальнік на іншы ідэнтычнага тыпу. Вось і атрымліваецца, што ў структуры дадзеных як гэта, ёсць некалькі аперацыі, якія могуць быць Пытанні, якія цікавяць нас. Мы, магчыма, захочаце, каб ўставіць у спіс, як гэта. Мы, магчыма, захочаце выдаліць з спісу, як гэта. Мы можам захацець пошук у спісе для значэнне, ці ў больш агульным ходу. І траверс проста мудрагелісты спосаб пачала казаць на левай і перанесьці ўсе да ўпора направа. І заўважце, нават з гэтым крыху больш складаныя структуры дадзеных, не кажучы мне прапануюць, каб мы можам пазычаць некаторыя з ідэі ў апошнія два тыдні і рэалізаваць функцыю называюць пошук, як гэта. Гэта збіраецца вярнуць сапраўдным або ілжывымі, паказваючы, так ці Не, N ў спісе. Другі аргумент з'яўляецца паказальнікам да спісу сабе, так паказальнік на вузел. Усё, што я збіраюся зрабіць, гэта тое заяўляю часовую зменную. Мы назавем гэта PTR па пагадненні, для паказальніка. І я прызначу яго роўным пачатак спісу. А цяпер заўважаю той час цыклу. Да таго часу, пакуль паказальнік ня роўна да нуля, я збіраюся праверыць. Ці з'яўляецца стрэлка паказальніка N роўныя N, які быў перададзены ў? І пачакайце хвіліну - новы частка сінтаксісу. Што такое стрэлка раптам? Да? Менавіта так. Так у той час як некалькі хвілін таму, мы выкарыстоўвалі кропкавую натацыю для доступу нешта Ўнутры структуры, калі зменная Вы не структуры сябе, але паказальнік на структуру, На шчасце, частка сінтаксісу, нарэшце, мае інтуітыўны сэнс. Стрэлка азначае ісці за паказальнікам, як нашы стралкі як правіла, азначае графічна, і сыходзіць у Дадзеныя поля ўнутры. Так стрэлка тое ж самае, кропка, але вы выкарыстоўваеце яго, калі ў вас ёсць паказальнік. Так проста, каб рэзюмаваць тое, калі поле N Ўнутры структуры, званых паказальнік роўная роўная N, вярнуцца праўда. У адваротным выпадку, гэтая лінія тут - паказальнік роўна паказальнік наступнага. Дык што ж гэта робіць, заўважце, калі я я ў цяперашні час паказвае на структуру які змяшчае 9 і 9 ня лік Я шукаю - Дапусцім, я шукаю для N роўная 50 - Я збіраюся абнавіць свой часовы паказальнік не называць у гэтым вузле больш, але паказальніка стрэлкі побач, якая збіраецца паставіць мяне сюды. Цяпер я зразумеў, віхор Ўвядзенне. У сераду, мы на самай справе зрабіць гэта з некаторымі людзьмі і з некаторымі больш кода ў больш павольным тэмпе. Але зразумейце, мы зараз робяць нашы дадзеныя больш складаныя структуры, каб нашы Алгарытмы можаце атрымаць больш эфектыўныя, якія будзе умовай для PSET шэсць, калі мы загружаем у, зноў жа, тыя, 150000 слоў, але трэба зрабіць так эфектыўна, і, у ідэале, ствараюць праграма, якая працуе для нашых карыстальнікаў не ў лінейнай, а не на рускай мове ў квадраце, а ў пастаянны час, у ідэал. Убачымся ў сераду. Слухаюць: На наступным CS50, Дэвід забывае аб сваім базавым варыянце. DAVID малая: І вось як вы пасылаеце тэкставымі паведамленнямі з C. Якія - [Розныя тэкст паведамлення Гукі апавяшчэнняў]