1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID малая: Добра, з вяртаннем. 3 00:00:12,580 --> 00:00:13,290 Гэта CS50. 4 00:00:13,290 --> 00:00:15,130 Гэта пачатак тыдня сем. 5 00:00:15,130 --> 00:00:18,890 Так што гэта было некаторы час, так што я думаў, што мы прыняць беглы тур, дзе мы 6 00:00:18,890 --> 00:00:20,760 спыніліся і дзе мы цяпер збіраемся. 7 00:00:20,760 --> 00:00:23,310 >> Так што гэтая рэч тут, магчыма, прыйдзецца выклікала некаторую тугу на першы погляд. 8 00:00:23,310 --> 00:00:27,680 Але, спадзяюся, вы пачынаеце акліматызавацца да таго, што гэта абазначае тут - 9 00:00:27,680 --> 00:00:32,670 зорка прадстаўляе паказальнік, які толькі тое, што, з пункту гледжання больш непрафесіянала? 10 00:00:32,670 --> 00:00:33,400 Так што гэта адрас. 11 00:00:33,400 --> 00:00:35,490 >> Так што гэта адрас нешта ў памяці. 12 00:00:35,490 --> 00:00:38,260 І мы пачалі адхіліце слаёў Пару тыдняў таму, і таму падобнае 13 00:00:38,260 --> 00:00:41,800 GetString і іншых падобных функцый Увесь гэты час вярталіся 14 00:00:41,800 --> 00:00:46,010 Адрасы рэчы ў памяці, як і адрас першага знака ў 15 00:00:46,010 --> 00:00:46,990 некаторай паслядоўнасці. 16 00:00:46,990 --> 00:00:50,360 >> Такім чынам, мы таксама ўвялі Valgrind, якая Вы пачнеце выкарыстоўваць для гэтай праблемы 17 00:00:50,360 --> 00:00:53,380 ўстаноўлена, у прыватнасці, для наступнага Праблема таксама усталяваны. 18 00:00:53,380 --> 00:00:54,980 І Valgrind і што робіць для нас? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Пры гэтым праверка на ўцечкі памяці, і гэта таксама правярае злоўжыванні памяці. 21 00:01:01,020 --> 00:01:05,890 >> Ён можа, з некаторай верагоднасцю, выявіць, калі код будзе тычыцца памяці 22 00:01:05,890 --> 00:01:07,100 што гэта проста не трэба. 23 00:01:07,100 --> 00:01:10,410 Так што не абавязкова уцечкі, але калі вы выходзяць за межы некаторага 24 00:01:10,410 --> 00:01:14,730 масіве, а як вы выканайце VALGRIND і выклікаюць такія паводзіны ў той час як 25 00:01:14,730 --> 00:01:17,870 Valgrind працуе ў вашай праграме працуе ўсярэдзіне яго, вы атрымаеце 26 00:01:17,870 --> 00:01:21,460 паведамленні, як гэта - "Няправільная пісаць пра памерам 4 ", які, нагадаем пару 27 00:01:21,460 --> 00:01:25,880 тыдняў таму азначала, што я выпадкова як на аднаго дзесятковага занадта далёка 28 00:01:25,880 --> 00:01:27,250 за межамі масіва. 29 00:01:27,250 --> 00:01:30,790 І такім памерам 4 азначае тут памер гэтага канкрэтнага унутр. 30 00:01:30,790 --> 00:01:35,260 >> Так прыміце запэўніванні ў тым, што valgrind ёсць выйсце, фармат яго, 31 00:01:35,260 --> 00:01:36,170 проста зверскім. 32 00:01:36,170 --> 00:01:40,180 Гэта сапраўды цяжка зразумець, праз беспарадак за цікавую інфармацыю. 33 00:01:40,180 --> 00:01:42,910 Такім чынам, што мы зрабілі тут проста ўрывак некаторыя з пары больш 34 00:01:42,910 --> 00:01:43,850 цікавыя радкі. 35 00:01:43,850 --> 00:01:46,760 Але разумею, што 80% valgrind ёсць Выхад будзе трохі 36 00:01:46,760 --> 00:01:47,650 адцягненне. 37 00:01:47,650 --> 00:01:52,820 >> Проста шукайце мадэлі, як гэтыя - несапраўдным права, несапраўдныя чытаць, 40 байт 38 00:01:52,820 --> 00:01:56,690 і некаторы колькасць блокаў вызначана страчаны, ключавыя словы, як, што. 39 00:01:56,690 --> 00:02:01,920 І тое, што вы, мы спадзяемся ўбачыць некаторы выгляду слядоў, якія функцыі 40 00:02:01,920 --> 00:02:03,340 памылка на самай справе цалі 41 00:02:03,340 --> 00:02:07,195 У гэтым выпадку тут, у тым, што лінія мой код памылкі па-відаць? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 у файле з імем memory.c, які быў Напрыклад, мы гулялі з 44 00:02:14,130 --> 00:02:14,890 ў той час. 45 00:02:14,890 --> 00:02:16,460 Так што гэта, верагодна, не ў Malloc. 46 00:02:16,460 --> 00:02:18,630 Гэта было, верагодна, у сваім кодзе замест гэтага. 47 00:02:18,630 --> 00:02:20,910 Такім чынам, мы ўбачым гэта зноў і зноў у бліжэйшы час. 48 00:02:20,910 --> 00:02:24,080 >> Так SCANF, гэта адбылося ў Пару формы да гэтага часу. 49 00:02:24,080 --> 00:02:26,410 Мы бачылі Sscanf коратка. 50 00:02:26,410 --> 00:02:28,330 Гэта было нешта побач Вы нырнулі ў вашай 51 00:02:28,330 --> 00:02:29,535 падрыхтоўка да віктарыны. 52 00:02:29,535 --> 00:02:33,130 І SCANF на самой справе тое, што CS50 Бібліятэкі выкарыстоўваюць пад 53 00:02:33,130 --> 00:02:36,560 капот на працягу досыць доўгага часу для таго, для атрымання дадзеных ад карыстальніка. 54 00:02:36,560 --> 00:02:40,420 >> Напрыклад, калі я пераеду да CS50 Прыбор тут, дазвольце мне адкрыць 55 00:02:40,420 --> 00:02:45,315 Напрыклад сёння, што называецца SCANF-0.c І гэта супер проста. 56 00:02:45,315 --> 00:02:46,590 Гэта ўсяго толькі некалькі радкоў кода. 57 00:02:46,590 --> 00:02:50,880 Але гэта паказвае, сапраўды, як GetInt працаваў ўвесь гэты час. 58 00:02:50,880 --> 00:02:54,710 >> У гэтай праграме, у радку 16 Звярніце ўвагу, што я заяўляю Int. 59 00:02:54,710 --> 00:02:57,270 Так што ніякіх паказальнікаў, нічога магічнага там, проста Int. 60 00:02:57,270 --> 00:03:00,330 Затым у радку 17, я прапануе карыстальніка лік, калі ласка. 61 00:03:00,330 --> 00:03:02,930 Затым, у канцы 18, я выкарыстоўваю SCANF тут. 62 00:03:02,930 --> 00:03:06,910 І я адзначыў, накшталт як Е, што я чакаю цытатай 63 00:03:06,910 --> 00:03:08,110 канец цытаты адсоткаў я. 64 00:03:08,110 --> 00:03:10,920 >> Так адсоткаў я, вядома, пазначае Int. 65 00:03:10,920 --> 00:03:14,580 Але звярніце ўвагу на тое, што другі Аргумент SCANF ёсць. 66 00:03:14,580 --> 00:03:17,350 Як бы вы апісалі другі Аргумент пасля коскі? 67 00:03:17,350 --> 00:03:19,450 Што гэта? 68 00:03:19,450 --> 00:03:20,670 >> Гэта адрас х. 69 00:03:20,670 --> 00:03:25,490 Так што гэта карысна, таму што, падаючы SCANF з адрасам х, тое, што робіць 70 00:03:25,490 --> 00:03:29,560 , Якія дазваляюць гэтай функцыі рабіць? 71 00:03:29,560 --> 00:03:33,010 Не проста ідуць туды, але і рабіць тое, што? 72 00:03:33,010 --> 00:03:34,060 >> Унесці змены ў ім. 73 00:03:34,060 --> 00:03:38,080 Таму што вы можаце пайсці туды, гэта свайго роду як карта да месцазнаходжання ў памяці. 74 00:03:38,080 --> 00:03:41,900 І да таго часу, пакуль вы дае SCANF або любую функцыю з такой карты, якія 75 00:03:41,900 --> 00:03:45,840 Функцыя можа пайсці туды, і не толькі паглядзіце значэнне, але ён таксама можа 76 00:03:45,840 --> 00:03:49,670 змяніць гэтае значэнне, якое з'яўляецца карысным, калі Мэта ў жыцці з'яўляецца SCANF 77 00:03:49,670 --> 00:03:53,060 сканаваць ўваходныя дадзеныя ад карыстальніка, у прыватнасці з клавіятуры. 78 00:03:53,060 --> 00:03:57,830 І F пазначае адфарматаваных, гэтак жа, як Е, F пазначае адфарматаваных 79 00:03:57,830 --> 00:03:58,930 Радок, якую неабходна раздрукаваць. 80 00:03:58,930 --> 00:04:04,430 >> Карацей кажучы, гэтая лінія 18 проста кажа: паспрабуйце прачытаць цэлалікавай ад карыстальніка 81 00:04:04,430 --> 00:04:10,420 клавіятуры, і захоўвае яго ўнутры х, у любы адрас, х, аказваецца, жыве ў. 82 00:04:10,420 --> 00:04:14,860 А потым, нарэшце, радок 19 проста кажа, дзякуй за Інтэрнэшнл, у гэтым выпадку. 83 00:04:14,860 --> 00:04:15,940 >> Такім чынам, дазвольце мне пайсці далей і зрабіць гэта. 84 00:04:15,940 --> 00:04:18,570 Таму пераканайцеся, SCANF 0. 85 00:04:18,570 --> 00:04:20,130 Дазвольце мне ісці наперад і павелічэння маштабу 86 00:04:20,130 --> 00:04:22,960 Я пайду і выканаць гэта з кропкамі слэш SCANF 0. 87 00:04:22,960 --> 00:04:24,020 Нумар, калі ласка? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Дзякуй за 50. 90 00:04:25,730 --> 00:04:27,270 Так што гэта даволі проста. 91 00:04:27,270 --> 00:04:28,160 >> Цяпер тое, што ён не робіць? 92 00:04:28,160 --> 00:04:29,940 Гэта не робіць цэлы букет праверкі памылак. 93 00:04:29,940 --> 00:04:33,000 Напрыклад, калі я не буду супрацоўнічаць, і я не ўводзіць нумар, але 94 00:04:33,000 --> 00:04:37,860 замест гэтага я напісаць нешта накшталт "прывітанне", гэта проста дзіўна. 95 00:04:37,860 --> 00:04:41,130 І вось адна з рэчаў, CS50 бібліятэка была для нас рабіць для некаторых 96 00:04:41,130 --> 00:04:43,440 часу з'яўляецца тое, што reprompting і reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Паўтарыць фразу адкліканні ў cs50.c, і гэта прычына таго, што ў GetInt 98 00:04:49,320 --> 00:04:51,670 бібліятэкі CS50 фактычна ўвесь куча радкоў, таму што мы 99 00:04:51,670 --> 00:04:53,190 праверка на дурныя рэчы, як гэта. 100 00:04:53,190 --> 00:04:55,730 Ж карыстальнік не даюць нам, па сутнасці, цэлалікавых? 101 00:04:55,730 --> 00:04:57,910 Ён ці яна даць нам што-то падобнае алфавітным ліст? 102 00:04:57,910 --> 00:05:01,410 Калі гэта так, мы хочам, каб выявіць , Што і крычаць на іх. 103 00:05:01,410 --> 00:05:03,915 >> Але ўсё становіцца больш цікавым У наступным прыкладзе. 104 00:05:03,915 --> 00:05:09,840 Калі я пайду ў SCANF-1с, тое, што адна рэч, якая карэнным чынам змяніла ў 105 00:05:09,840 --> 00:05:11,135 Наступны прыклад? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Я выкарыстоўваю сімвал *, вядома, замест Int. 108 00:05:16,010 --> 00:05:19,210 >> Так што гэта цікава, таму што з *, Нагадаем, што на самой справе проста 109 00:05:19,210 --> 00:05:20,190 Тое ж самае ў выглядзе радка. 110 00:05:20,190 --> 00:05:23,840 Такім чынам, падобна, можа быць, гэта супер Простая рэалізацыя GetString. 111 00:05:23,840 --> 00:05:26,010 Але я загнуў пласта CS50 з бібліятэкі, так што я 112 00:05:26,010 --> 00:05:27,550 выкліку гэтага сімвал * цяпер. 113 00:05:27,550 --> 00:05:30,070 Такім чынам, давайце паглядзім, дзе, калі заўгодна, мы робім няправільна. 114 00:05:30,070 --> 00:05:30,840 >> Радок 17 - 115 00:05:30,840 --> 00:05:33,950 Я яшчэ раз кажу, калі ласка, дайце мне што-небудзь, У гэтым выпадку, радок. 116 00:05:33,950 --> 00:05:37,940 І тады ў наступнай радку, я называю SCANF, зноў, надаўшы яму фармат кода, 117 00:05:37,940 --> 00:05:39,310 але гэтая пара працэнтаў. 118 00:05:39,310 --> 00:05:41,900 І то на гэты раз, я надаўшы яму буфера. 119 00:05:41,900 --> 00:05:43,550 >> А цяпер звярніце ўвагу, што я не выкарыстоўваю Ампэрсанд. 120 00:05:43,550 --> 00:05:47,120 Але чаму ў тым, што тут, верагодна, добра? 121 00:05:47,120 --> 00:05:49,760 Бо што такое буфер ўжо? 122 00:05:49,760 --> 00:05:50,770 Гэта ўжо паказальнік. 123 00:05:50,770 --> 00:05:51,650 Ужо адрасе. 124 00:05:51,650 --> 00:05:54,510 >> І давайце гэта слова "блытаюць", дазвольце мне назваць яго проста з, напрыклад, для 125 00:05:54,510 --> 00:05:55,050 прастата. 126 00:05:55,050 --> 00:05:58,250 Але я назваў яго таму, што ў буфер Наогул, у праграмаванні, калі ў вас ёсць 127 00:05:58,250 --> 00:06:02,130 частка памяці, якая сапраўды радок проста ёсць, вы маглі б назваць гэта буфер. 128 00:06:02,130 --> 00:06:04,460 Гэта месца для захоўвання інфармацыі. 129 00:06:04,460 --> 00:06:07,400 >> Падобныя рэчы, як YouTube, калі яны буфер, таму казаць, што 130 00:06:07,400 --> 00:06:10,270 проста азначае, што ён загрузкай бітаў з Інтэрнэт і захоўваючы іх у 131 00:06:10,270 --> 00:06:14,160 Лакальны масіў, мясцовы кавалак памяці, так што вы можаце глядзець іх без 132 00:06:14,160 --> 00:06:16,830 гэта пропуск або вісіць на Вы падчас прайгравання. 133 00:06:16,830 --> 00:06:20,930 >> Так што праблема тут, хоць, , Таму што я кажу SCANF, чакаюць 134 00:06:20,930 --> 00:06:22,320 радкі ад карыстальніка. 135 00:06:22,320 --> 00:06:24,410 Вось адрас кавалак памяці. 136 00:06:24,410 --> 00:06:26,180 Змесціце гэты радок там. 137 00:06:26,180 --> 00:06:31,230 Чаму гэта звязанае даць нам непрыемнасці, праўда? 138 00:06:31,230 --> 00:06:33,490 >> Што гэта? 139 00:06:33,490 --> 00:06:35,510 Ці магу я атрымаць доступ да што частка памяці? 140 00:06:35,510 --> 00:06:36,250 Вы ведаеце, я не ведаю. 141 00:06:36,250 --> 00:06:39,210 Бо валодае буферам ініцыялізаваны да чаго? 142 00:06:39,210 --> 00:06:39,820 Не зусім так. 143 00:06:39,820 --> 00:06:43,090 І так гэта тое, што мы называем смецця значэнне, якое 144 00:06:43,090 --> 00:06:44,040 не зьяўляецца афіцыйным словам. 145 00:06:44,040 --> 00:06:49,200 Гэта проста азначае, што мы паняцця не маю, якія біты ўнутры з чатырох байт, якія 146 00:06:49,200 --> 00:06:51,240 Я вылучыў у якасці буфера. 147 00:06:51,240 --> 00:06:52,450 >> Я не называецца Malloc. 148 00:06:52,450 --> 00:06:53,940 Я вызначана не называецца GetString. 149 00:06:53,940 --> 00:06:56,380 Так што хто ведае, што на самой справе ўнутры буфера? 150 00:06:56,380 --> 00:07:00,550 І ўсё ж казаць SCANF ўсляпую, туды і пакласці ўсё, што ўвёў карыстальнік. 151 00:07:00,550 --> 00:07:04,460 >> Так што, верагодна, выкліча ў нашым кодзе, калі мы яго запусціць? 152 00:07:04,460 --> 00:07:05,700 Напэўна сегментацыі. 153 00:07:05,700 --> 00:07:07,970 Можа і няма, але, верагодна, сегментацыі. 154 00:07:07,970 --> 00:07:10,620 І я кажу, можа быць, не таму, што часам Вы робіце, часам 155 00:07:10,620 --> 00:07:11,380 Вы не атрымліваеце сегментацыі. 156 00:07:11,380 --> 00:07:14,280 Часам вам проста шанцуе, але гэта тым не менш будзе 157 00:07:14,280 --> 00:07:15,340 памылка ў нашай праграме. 158 00:07:15,340 --> 00:07:17,060 >> Такім чынам, дазвольце мне ісці наперад і скласці гэты. 159 00:07:17,060 --> 00:07:18,280 Я збіраюся зрабіць гэта па-старому школе. 160 00:07:18,280 --> 00:07:23,825 Так ляскам працяжнік 0, SCANF-1, SCANF-1с, Enter. 161 00:07:23,825 --> 00:07:24,720 Упс, занадта старой школы. 162 00:07:24,720 --> 00:07:26,550 Давайце паглядзім. 163 00:07:26,550 --> 00:07:28,440 Дзе я? 164 00:07:28,440 --> 00:07:29,700 О, сімвал * буфера. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 О, дзякуй - 167 00:07:35,130 --> 00:07:36,930 Захаваць, OK - 168 00:07:36,930 --> 00:07:37,690 вельмі старая школа. 169 00:07:37,690 --> 00:07:38,900 Добра, гэта было ў той час. 170 00:07:38,900 --> 00:07:41,720 >> Так што я толькі што захаваны файл пасля робіць, што часовыя 171 00:07:41,720 --> 00:07:42,700 змяніць хвіліну таму. 172 00:07:42,700 --> 00:07:46,090 А цяпер я сабраў гэта ўручную з дапамогай Clang. 173 00:07:46,090 --> 00:07:49,500 І цяпер я збіраюся ісці наперад і запусціць SCANF-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Струнны калі ласка. 175 00:07:50,290 --> 00:07:51,600 Я набярыце "прывітанне". 176 00:07:51,600 --> 00:07:54,070 >> А цяпер, вось дзе, шчыра кажучы, Е можа крыху раздражняць. 177 00:07:54,070 --> 00:07:56,020 Гэта на самай справе не збіраецца сегментацыі ў гэтым выпадку. 178 00:07:56,020 --> 00:07:59,860 Printf стаіць крыху асобна, таму што гэта так супер шырока выкарыстоўваецца, што 179 00:07:59,860 --> 00:08:03,570 істотна Е робіць нам ласку і рэалізацыі, 180 00:08:03,570 --> 00:08:04,830 гэта не сапраўдны паказальнік. 181 00:08:04,830 --> 00:08:09,080 Дазвольце мне ўзяць гэта на сябе, каб проста раздрукаваць у нулявыя дужкі, нават 182 00:08:09,080 --> 00:08:13,340 хоць гэта і не абавязкова, што мы самі чакалі. 183 00:08:13,340 --> 00:08:16,940 >> Таму мы не можам сапраўды лёгка выклікаць сегментацыі з гэтым, але відавочна, што гэта 184 00:08:16,940 --> 00:08:18,600 не паводзіны я хацеў. 185 00:08:18,600 --> 00:08:19,800 Так у чым жа простае рашэнне? 186 00:08:19,800 --> 00:08:25,650 Ну, а ў SCANF-2, дазвольце мне прапанаваць, што а на самай справе проста вылучэнне 187 00:08:25,650 --> 00:08:30,100 сімвал *, дазвольце мне быць трохі разумнейшыя, пра гэта, і дазвольце мне вылучыць буфер 188 00:08:30,100 --> 00:08:32,940 як паслядоўнасць з 16 знакаў. 189 00:08:32,940 --> 00:08:34,200 >> Так што я магу зрабіць гэта ў некалькі спосабаў. 190 00:08:34,200 --> 00:08:35,610 Я мог бы выкарыстаць абсалютна Malloc. 191 00:08:35,610 --> 00:08:38,980 Але я магу вярнуцца ў тыдзень два, калі Мне проста трэба было цэлы букет 192 00:08:38,980 --> 00:08:39,620 знакаў. 193 00:08:39,620 --> 00:08:40,860 Вось толькі масіў. 194 00:08:40,860 --> 00:08:44,870 Такім чынам, дазвольце мне замест перавызначыць буфер быць масівам з 16 знакаў. 195 00:08:44,870 --> 00:08:47,340 >> І цяпер, калі я праходжу ў буфер - 196 00:08:47,340 --> 00:08:49,940 і гэта тое, што мы не зрабілі казаць у тыдзень два - 197 00:08:49,940 --> 00:08:53,730 але вы можаце разглядаць масіў як хоць гэта адрасу. 198 00:08:53,730 --> 00:08:56,390 Тэхнічна, як мы бачылі, яны крыху па-іншаму. 199 00:08:56,390 --> 00:09:01,290 Але SCANF не будзе пярэчыць, калі вы перадаеце яго імя масіва, таму што тое, 200 00:09:01,290 --> 00:09:05,030 Clang зробіць для нас па сутнасці лячыць імя гэтага масіва ў якасці 201 00:09:05,030 --> 00:09:08,280 адрас блока 16 байт. 202 00:09:08,280 --> 00:09:09,550 >> Так што гэта лепш. 203 00:09:09,550 --> 00:09:12,110 Гэта азначае, што цяпер, калі я магу, мы спадзяемся, выканаць наступнае. 204 00:09:12,110 --> 00:09:16,800 Дазвольце мне паменшыць маштаб на імгненне і робяць SCANF-2, складзены ў парадку. 205 00:09:16,800 --> 00:09:19,390 Зараз зраблю атрымаў слэш SCANF-2. 206 00:09:19,390 --> 00:09:22,430 Струнны калі ласка. "Hello". І гэта здавалася, працавалі ў гэты раз. 207 00:09:22,430 --> 00:09:26,020 >> Але хто-то можа прапанаваць сцэнар , У якім ён не можа ўсё яшчэ працуе? 208 00:09:26,020 --> 00:09:28,550 Да? 209 00:09:28,550 --> 00:09:30,640 Нешта даўжэй 16 знакаў. 210 00:09:30,640 --> 00:09:32,020 А на самай справе, мы можам быць трохі больш дакладным. 211 00:09:32,020 --> 00:09:36,540 Нешта даўжэй, чым 15 сімвалаў, таму што сапраўды мы павінны мець на ўвазе, 212 00:09:36,540 --> 00:09:39,920 што нам трэба, што зваротная касая рыса нуля няяўна ў канцы радка, 213 00:09:39,920 --> 00:09:42,950 якая ў баку, як правіла, SCANF клапаціцца пра нас. 214 00:09:42,950 --> 00:09:46,210 >> Такім чынам, дазвольце мне зрабіць нешта падобнае - 215 00:09:46,210 --> 00:09:48,040 Часам мы можам толькі пакінуць усё як ёсць, што. 216 00:09:48,040 --> 00:09:50,630 Такім чынам, мы цяпер індукаваных нашы памылкі сегментацыі. 217 00:09:50,630 --> 00:09:51,000 Чаму? 218 00:09:51,000 --> 00:09:54,940 Таму што я набраў у больш чым 15 сімвалаў, і так мы фактычна 219 00:09:54,940 --> 00:09:58,280 закрануў памяці, што я на самой справе не павінен быў. 220 00:09:58,280 --> 00:10:00,180 >> Так што на самай справе рашэнне тут? 221 00:10:00,180 --> 00:10:02,210 Ну, а што калі нам трэба больш доўгую радок? 222 00:10:02,210 --> 00:10:03,960 Ну, мы, магчыма, зрабіць гэта 32 байт. 223 00:10:03,960 --> 00:10:05,160 Ну, а калі гэта не дастаткова доўга? 224 00:10:05,160 --> 00:10:06,040 Як наконт 64 байт? 225 00:10:06,040 --> 00:10:07,080 Што рабіць, калі гэта не дастаткова доўга? 226 00:10:07,080 --> 00:10:09,640 Як наконт 128 або 200 байт? 227 00:10:09,640 --> 00:10:12,660 Тое, што сапраўды ёсць рашэнне тут, у Увогуле выпадку, калі мы не ведаем, у 228 00:10:12,660 --> 00:10:14,460 загадзя, што карыстальнік збіраецца друкаваць? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Гэта проста нейкая вялікая боль у срацы, шчыра кажучы, менавіта таму 231 00:10:23,050 --> 00:10:29,050 CS50 бібліятэцы маецца некалькі дзясяткаў радкоў кода, якія ў сукупнасці рэалізуюць 232 00:10:29,050 --> 00:10:32,390 GetString радок такім чынам, што мы не павінны ведаць загадзя, што 233 00:10:32,390 --> 00:10:33,430 карыстач збіраецца ўвесці. 234 00:10:33,430 --> 00:10:37,370 У прыватнасці, калі вы паглядзіце на cs50.c ад двух тыдняў таму, вы ўбачыце, 235 00:10:37,370 --> 00:10:40,480 , Што на самой справе робіць GetString Не выкарыстоўвайце SCANF такім чынам. 236 00:10:40,480 --> 00:10:43,720 Хутчэй, ён чытае адзін знак за адзін раз. 237 00:10:43,720 --> 00:10:46,010 >> Таму што той, добрая рэч аб чытанне аднаго знака, мы можам 238 00:10:46,010 --> 00:10:48,490 гарантаваць сабе заўсёды мець па крайняй меры адзін знак. 239 00:10:48,490 --> 00:10:51,740 Я магу проста абвясціць знак, а затым прыняць гэтыя сапраўды крокі дзіцяці проста 240 00:10:51,740 --> 00:10:54,380 чытаць адзін знак у час ад клавіятуры. 241 00:10:54,380 --> 00:10:58,240 І потым, што вы ўбачыце GetString робіць гэта кожны раз, калі сканчаецца, 242 00:10:58,240 --> 00:11:02,280 скажам, 16 байт памяці, яна выкарыстоўвае Malloc, або стрыечны брат яго, каб 243 00:11:02,280 --> 00:11:06,810 вылучыць больш памяці, капіраванне старых памяці ў новых, а затым паўзком 244 00:11:06,810 --> 00:11:09,900 ўздоўж, атрымліваючы адзін знак за адзін раз, і калі яно сканчаецца, што 245 00:11:09,900 --> 00:11:13,370 кавалак памяці, выкідвае яго, захопы большы кавалак памяці, капіюе старыя 246 00:11:13,370 --> 00:11:14,750 ў новыя і паўтарае. 247 00:11:14,750 --> 00:11:18,480 І гэта сапраўды боль на самай справе рэалізаваць нешта жа проста, як 248 00:11:18,480 --> 00:11:19,710 атрыманне дадзеных ад карыстальніка. 249 00:11:19,710 --> 00:11:21,090 >> Такім чынам, вы можаце выкарыстоўваць SCANF. 250 00:11:21,090 --> 00:11:22,430 Вы можаце выкарыстоўваць іншыя аналагічныя функцыі. 251 00:11:22,430 --> 00:11:25,420 І шмат падручнікаў і онлайн прыклады робяць, але яны ўсё 252 00:11:25,420 --> 00:11:27,210 ўразлівыя да праблем, як гэтая. 253 00:11:27,210 --> 00:11:29,550 І ў канчатковым рахунку, атрымаць сегментацыі выгляд раздражняе. 254 00:11:29,550 --> 00:11:30,680 Гэта не добра для карыстальніка. 255 00:11:30,680 --> 00:11:33,560 >> Але ў горшым выпадку, тое, што робіць гэта прынцыпова пакласці вашыя 256 00:11:33,560 --> 00:11:37,160 код рызыцы? 257 00:11:37,160 --> 00:11:39,250 Свайго роду атакі, патэнцыйна. 258 00:11:39,250 --> 00:11:41,680 Мы казалі аб адной з такіх нападаў - перапаўненне стэка. 259 00:11:41,680 --> 00:11:44,660 Але ў цэлым, калі вы маеце на гэта права Перапаўненне буфера, як мы зрабілі 260 00:11:44,660 --> 00:11:48,070 Пару тыдняў таму, толькі з пісьмовай больш, чым "прывітанне" у стэку, вы 261 00:11:48,070 --> 00:11:52,330 сапраўды можа ўзяць на сябе, патэнцыйна, кампутар, або, па меншай меры, атрымаць дадзеныя, якія ў 262 00:11:52,330 --> 00:11:53,510 не належыць вам. 263 00:11:53,510 --> 00:11:55,970 >> Карацей кажучы, менавіта таму ў нас ёсць гэтых навучальных колаў. 264 00:11:55,970 --> 00:11:59,090 Але цяпер, мы пачынаем здымаць іх, як нашы праграмы больш не патрэбна, 265 00:11:59,090 --> 00:12:00,610 абавязкова, увод ад карыстальніка. 266 00:12:00,610 --> 00:12:03,960 Але ў выпадку ўзнікнення праблем ўсталяваць шэсць, ваш ўклад будзе паступаць з вялізнага 267 00:12:03,960 --> 00:12:07,520 файл слоўніка з некаторымі 150 лішнім тысяч слоў. 268 00:12:07,520 --> 00:12:10,330 >> Так што вам не прыйдзецца турбавацца аб адвольнага карыстальніка ўводу. 269 00:12:10,330 --> 00:12:13,720 Мы дамо вам некаторыя здагадкі аб гэтым файле. 270 00:12:13,720 --> 00:12:20,340 Любыя пытанні па паказальніках або SCANF ці ўводу дадзеных карыстачом ў цэлым? 271 00:12:20,340 --> 00:12:24,450 >> Добра, хуткі погляд то на аднаго задняя тэмы ад двух тыдняў таму. 272 00:12:24,450 --> 00:12:28,590 І гэта было гэта паняцце структуры. 273 00:12:28,590 --> 00:12:34,180 Не тое, што - гэта паняцце Пабудуем, якое было што? 274 00:12:34,180 --> 00:12:35,430 Што структуры зрабіць для нас? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Вызначыць - 277 00:12:39,860 --> 00:12:41,710 прабачце? 278 00:12:41,710 --> 00:12:42,820 Вызначыць тып зменнай. 279 00:12:42,820 --> 00:12:44,410 Так накшталт. 280 00:12:44,410 --> 00:12:46,180 Мы на самай справе аб'яднання двух тэмах. 281 00:12:46,180 --> 00:12:49,510 Так што з ЬурейеЕ, ўспомнім, што мы можам аб'явіць тыпу нашай, як і 282 00:12:49,510 --> 00:12:51,500 сінонім, як і радок для сімвал *. 283 00:12:51,500 --> 00:12:56,200 Але выкарыстанне ЬурейеЕ і структуры, мы можам стварыць сапраўды нашы ўласныя структуры дадзеных. 284 00:12:56,200 --> 00:12:59,600 >> Напрыклад, калі я вярнуся ў Gedit тут усяго імгненне, і я іду наперад 285 00:12:59,600 --> 00:13:08,230 і зрабіць нешта падобнае, дазвольце мне захаваць гэта як, скажам, structs.c 286 00:13:08,230 --> 00:13:10,840 часова, я проста хачу, ісці наперад і ўключаюць 287 00:13:10,840 --> 00:13:14,360 standardio.h, тап_п несапраўднымі. 288 00:13:14,360 --> 00:13:18,960 А потым тут, выкажам здагадку, што я хачу напісаць праграму, якая захоўвае 289 00:13:18,960 --> 00:13:21,840 некалькі студэнтаў з некалькіх дома, напрыклад. 290 00:13:21,840 --> 00:13:24,430 Так што гэта як registrarial дадзеных нейкі. 291 00:13:24,430 --> 00:13:29,550 >> Так што, калі мне трэба назва аднаго студэнта, я можа зрабіць нешта накшталт сімвала імя *, 292 00:13:29,550 --> 00:13:31,570 і я зраблю нешта накшталт - 293 00:13:31,570 --> 00:13:34,410 На самай справе, давайце выкарыстоўваць бібліятэку CS50 на імгненне, каб зрабіць гэта 294 00:13:34,410 --> 00:13:38,380 трохі прасцей, так што мы можам пазычаць тых дзясяткаў радкоў кода. 295 00:13:38,380 --> 00:13:39,340 І давайце проста трымаць яго простая. 296 00:13:39,340 --> 00:13:42,610 Мы будзем трымаць гэта радок, і цяпер GetString. 297 00:13:42,610 --> 00:13:47,420 >> Таму я сцвярджаю, цяпер, калі я захоўваецца назву некаторых студэнтаў, і дом 298 00:13:47,420 --> 00:13:50,240 які-небудзь студэнт, проста з дапамогай зменных як мы рабілі і на тыдзень адзін. 299 00:13:50,240 --> 00:13:52,370 Але выкажам здагадку, што я цяпер хачу падтрымаць некалькі студэнтаў. 300 00:13:52,370 --> 00:13:58,460 Добра, так што мае інстынкты рабіць Радок name2, атрымлівае GetString, радок 301 00:13:58,460 --> 00:14:01,370 Дом2 атрымлівае GetString. 302 00:14:01,370 --> 00:14:05,850 А потым наш трэці студэнт, давайце зробім name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Добра, так што гэта, мы спадзяемся, дзіўна Вы як віду па-дурному, 304 00:14:09,170 --> 00:14:11,580 таму што гэты працэс не будзе сапраўды ніколі скончыцца, і ён проста будзе 305 00:14:11,580 --> 00:14:13,130 зрабіць мой код выглядае горш і ўсё горш і горш. 306 00:14:13,130 --> 00:14:14,810 Але мы вырашылі гэта таксама ў тыдзень два. 307 00:14:14,810 --> 00:14:19,450 Што ўяўляла з сябе адносна чыстым рашэннем калі ў нас было некалькі зменных 308 00:14:19,450 --> 00:14:23,580 той жа тып дадзеных, якія ўсё звязаныя, але мы не хацелі гэтага жорсткага беспарадак 309 00:14:23,580 --> 00:14:26,870 з аднайменных зменных? 310 00:14:26,870 --> 00:14:30,060 Што мы зрабілі, а? 311 00:14:30,060 --> 00:14:31,260 >> Так што я думаю, што я пачуў, што некалькі месцаў. 312 00:14:31,260 --> 00:14:32,590 У нас было мноства. 313 00:14:32,590 --> 00:14:37,110 Калі вы хочаце некалькі асобнікаў нешта, чаму б нам не ачысціць гэта ўсё 314 00:14:37,110 --> 00:14:39,540 і проста сказаць, дайце мне Масіў абзывалі? 315 00:14:39,540 --> 00:14:41,640 >> А пакуль, давайце жорсткі 3 кода. 316 00:14:41,640 --> 00:14:44,450 А потым даць мне яшчэ адзін масіў званыя дома, і хай мяне 317 00:14:44,450 --> 00:14:45,800 Цяпер жорсткі код 3. 318 00:14:45,800 --> 00:14:49,220 І я масава ачышчаны беспарадак, што я толькі што стварылі. 319 00:14:49,220 --> 00:14:52,400 Зараз, я па-ранейшаму жорстка 3, але нават 3 можа дынамічна зыходзіць ад 320 00:14:52,400 --> 00:14:54,350 карыстальніка, або агду ці таму падобнае. 321 00:14:54,350 --> 00:14:55,720 Так што гэта ўжо чысцей. 322 00:14:55,720 --> 00:15:00,100 >> Але тое, што раздражняе ў гэтым тое, што Цяпер, нават калі клічуць неяк 323 00:15:00,100 --> 00:15:02,280 прынцыпова звязана з студэнцкі дом - 324 00:15:02,280 --> 00:15:04,720 гэта студэнт, што я сапраўды хочам прадставіць - 325 00:15:04,720 --> 00:15:08,080 Цяпер у мяне ёсць два масіва, якія раўналежныя У тым сэнсе, што яны 326 00:15:08,080 --> 00:15:13,930 аднолькавы памер, і імёны кранштэйны 0 Меркавана карт для дома кранштэйны 0, 327 00:15:13,930 --> 00:15:16,600 імёны і кранштэйнам 1 карт Кранштэйн ў дома 1. 328 00:15:16,600 --> 00:15:19,280 Іншымі словамі, што студэнт жыве ў гэты дом, тое, што іншы студэнт 329 00:15:19,280 --> 00:15:20,530 жыццё ў гэтым іншым доме. 330 00:15:20,530 --> 00:15:23,720 Але, вядома, гэта можа быць зрабілі яшчэ больш чыста. 331 00:15:23,720 --> 00:15:24,990 >> Ну, можа, на самай справе. 332 00:15:24,990 --> 00:15:28,730 І дазвольце мне ісці наперад і адкрыць да structs.h, і Вы будзеце 333 00:15:28,730 --> 00:15:31,130 см. гэтую ідэю тут. 334 00:15:31,130 --> 00:15:34,905 Звярніце ўвагу, што я выкарыстаў, аб'ява тыпу, як вы спасылаўся на момант назад, каб заявіць пра сваю 335 00:15:34,905 --> 00:15:35,570 уласны тып дадзеных. 336 00:15:35,570 --> 00:15:39,660 Але я таксама выкарыстоўваю гэтую іншаму ключавым слове называецца структура, якая дае мне новае 337 00:15:39,660 --> 00:15:40,790 структуры дадзеных. 338 00:15:40,790 --> 00:15:43,980 >> І гэтая структура дадзеных я сцвярджаю, што адбываецца мець дзве рэчы ўнутры 339 00:15:43,980 --> 00:15:47,060 гэта - радок называецца імя і Радок называецца домам. 340 00:15:47,060 --> 00:15:49,820 І імя я збіраюся даць гэтая структура дадзеных будзе 341 00:15:49,820 --> 00:15:51,005 называцца вучнем. 342 00:15:51,005 --> 00:15:54,030 Я мог бы назваць гэта ўсё, што захачу, але гэта робіць семантычна 343 00:15:54,030 --> 00:15:55,810 сэнс для мяне ў маёй свядомасці. 344 00:15:55,810 --> 00:15:59,160 >> Так што цяпер, калі я адкрываю лепшую версію праграмы я пачаў пісаць 345 00:15:59,160 --> 00:16:00,390 там, дазвольце мне перайсці да вяршыні. 346 00:16:00,390 --> 00:16:03,190 І ёсць яшчэ некалькі радкоў кода тут, але дазвольце мне спыніцца на 347 00:16:03,190 --> 00:16:04,160 момант на адзін. 348 00:16:04,160 --> 00:16:07,790 Я абвясціў пастаянны званых студэнтаў і жорстка 3 на дадзены момант. 349 00:16:07,790 --> 00:16:11,110 Але цяпер, звярніце ўвагу, як чысты мой код пачынае атрымліваць. 350 00:16:11,110 --> 00:16:15,030 >> У радку 22 я заяўляю Масіў студэнтаў. 351 00:16:15,030 --> 00:16:18,760 І заўважце, што студэнт па-відаць Цяпер тып дадзеных. 352 00:16:18,760 --> 00:16:23,360 Таму што ў верхняй часткі гэтага файла, заўважыць Я уключыў гэты загаловак файла 353 00:16:23,360 --> 00:16:24,820 што я спыніўся на хвіліну таму. 354 00:16:24,820 --> 00:16:28,820 , А гэты загаловак файла проста-проста было гэта вызначэнне студэнта. 355 00:16:28,820 --> 00:16:32,470 >> Так што цяпер, я стварыў мае ўласныя прыстасаваныя дадзеныя Тып што аўтары гадоў C 356 00:16:32,470 --> 00:16:33,890 назад не думалі загадзя. 357 00:16:33,890 --> 00:16:34,570 Але не праблема. 358 00:16:34,570 --> 00:16:35,870 Я магу зрабіць гэта сам. 359 00:16:35,870 --> 00:16:39,050 Так што гэта масіў з імем студэнтаў, кожны з членаў якой 360 00:16:39,050 --> 00:16:41,100 з'яўляецца студэнтам структуры. 361 00:16:41,100 --> 00:16:44,270 І я хачу, тры з іх ў масіве. 362 00:16:44,270 --> 00:16:46,030 >> І цяпер, што зробіць усё астатняе гэтай праграмы рабіць? 363 00:16:46,030 --> 00:16:47,550 Мне трэба нешта крыху адвольным. 364 00:16:47,550 --> 00:16:51,450 Так што з онлайн 24 гадоў, Я ітэрацыі ад 0 да 3. 365 00:16:51,450 --> 00:16:54,000 Я тады пытаюся ў карыстальніка Імя і прозвішча навучэнца. 366 00:16:54,000 --> 00:16:56,110 А затым выкарыстоўваю GetString, як раней. 367 00:16:56,110 --> 00:16:59,410 Тады я пытаюся для дома студэнта, і я выкарыстоўваю GetString, як раней. 368 00:16:59,410 --> 00:17:01,780 >> Але звярніце ўвагу - некалькі новых частка сінтаксісу - 369 00:17:01,780 --> 00:17:07,010 Я да гэтага часу індэкс да I-га студэнта, але як я магу атрымаць на канкрэтных дадзеных 370 00:17:07,010 --> 00:17:08,354 поле ўнутры структуры? 371 00:17:08,354 --> 00:17:11,770 Ну, што па-відаць новая частка сінтаксісу? 372 00:17:11,770 --> 00:17:13,339 Гэта проста кропка аператара. 373 00:17:13,339 --> 00:17:14,510 >> Мы на самой справе не бачыў гэтага раней. 374 00:17:14,510 --> 00:17:17,819 Вы бачылі гэта ў PSET пяць, калі ў вас ёсць нырнуў ва ўжо і графічных файлаў. 375 00:17:17,819 --> 00:17:22,372 Але проста азначае, што кропка ўнутры гэтага структуры або некалькі палёў, даць кропку 376 00:17:22,372 --> 00:17:24,510 імя, або дайце мне кропку дома. 377 00:17:24,510 --> 00:17:28,690 Гэта азначае, што ты ўнутры структуры і атрымаць гэтыя канкрэтных галінах. 378 00:17:28,690 --> 00:17:30,200 >> Што робіць астатнюю частку гэтай праграмы рабіць? 379 00:17:30,200 --> 00:17:31,190 Гэта яшчэ не ўсё, што сэксуальна. 380 00:17:31,190 --> 00:17:34,640 Заўважце, што я ітэрацыі ад 0 да 3 раз, і я проста ствараю англійскай 381 00:17:34,640 --> 00:17:40,500 фраза тыпу так і так знаходзіцца ў такім і такі дом, пераходзячы ў кропку назву ад 382 00:17:40,500 --> 00:17:43,320 I-га студэнта і іх дома, а таксама. 383 00:17:43,320 --> 00:17:47,560 >> А потым, нарэшце, зараз мы пачнем, каб атрымаць Анальны пра гэта, цяпер, калі мы 384 00:17:47,560 --> 00:17:49,580 знаёмыя з тым, што і Malloc іншыя функцыі былі 385 00:17:49,580 --> 00:17:50,570 рабіў ўвесь гэты час. 386 00:17:50,570 --> 00:17:54,220 Чаму я павінен вызваліць абодва назвы і дома, хоць я 387 00:17:54,220 --> 00:17:56,960 не тэлефанаваў Malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString зрабіў. 389 00:17:58,020 --> 00:18:00,930 І гэта быў маленькі брудны сакрэт для некалькі тыдняў, але GetString мае 390 00:18:00,930 --> 00:18:03,530 была ўцечка памяці ва ўсім размясціць ўвесь семестр да гэтага часу. 391 00:18:03,530 --> 00:18:05,990 І, нарэшце, valgrand паказаць гэта нам. 392 00:18:05,990 --> 00:18:10,730 >> Але гэта не мае вялікага значэння, таму што я ведаю што я магу проста вызваліць імя 393 00:18:10,730 --> 00:18:15,750 і дом, хоць тэхнічна, каб быць супер, супер бяспечны, я павінен быць 394 00:18:15,750 --> 00:18:17,890 робяць некаторыя тут памылкі. 395 00:18:17,890 --> 00:18:19,040 Якія вашы інстынкты кажу? 396 00:18:19,040 --> 00:18:22,480 Што я павінен для праверкі перш чым я бясплатна Што з'яўляецца 397 00:18:22,480 --> 00:18:25,470 Радок, якую ён жа знак *? 398 00:18:25,470 --> 00:18:33,460 >> Я павінен сапраўды быць праверка, калі студэнты Кранштэйн я кропка імя не 399 00:18:33,460 --> 00:18:34,840 роўным нулю. 400 00:18:34,840 --> 00:18:40,400 Тады ўсё будзе ў парадку, каб ісці наперад і бясплатна што паказальнік, і тое ж ці іншае 401 00:18:40,400 --> 00:18:41,160 , А таксама. 402 00:18:41,160 --> 00:18:46,860 Калі студэнты кранштэйны я кропка дом не роўная нулю, гэта цяпер будзе абараняць 403 00:18:46,860 --> 00:18:52,520 па адносінах да кута выпадак, у якім GetString вяртае нешта накшталт нулявы. 404 00:18:52,520 --> 00:18:57,310 І мы ўбачылі хвіліну назад, Е будзе абараніць нас тут, проста кажучы 405 00:18:57,310 --> 00:18:58,990 пустое значэнне, што будзе выглядаць дзіўна. 406 00:18:58,990 --> 00:19:02,340 Але па крайняй меры не будуць падаць, як мы ўжо бачылі. 407 00:19:02,340 --> 00:19:05,990 >> Ну, дазвольце мне зрабіць яшчэ адну рэч тут. структур-0 гэта свайго роду дурныя праграмы 408 00:19:05,990 --> 00:19:09,700 , Таму што я ўсё гэта ўвесці дадзеныя, а затым ён страціў, калі праграма сканчаецца. 409 00:19:09,700 --> 00:19:10,940 Але дазвольце мне ісці наперад і рабіць гэта. 410 00:19:10,940 --> 00:19:12,830 Дазвольце мне зрабіць тэрмінал вокны трохі больш. 411 00:19:12,830 --> 00:19:17,000 Дазвольце мне зрабіць структур-1, які гэта новая версія гэтага. 412 00:19:17,000 --> 00:19:18,520 >> Я павялічыць няшмат. 413 00:19:18,520 --> 00:19:21,620 А цяпер дазвольце мне працаваць кропка слэш структур-1. 414 00:19:21,620 --> 00:19:22,590 Імя і прозвішча вучня - 415 00:19:22,590 --> 00:19:31,500 Дэвід Mather, давайце зробім Роб Kirkland, давайце зробім Левереттом Ларэн. 416 00:19:31,500 --> 00:19:33,650 Што цікава, цяпер апавяшчэння - 417 00:19:33,650 --> 00:19:35,540 і я ведаю, што гэта толькі таму, што Я напісаў праграму - 418 00:19:35,540 --> 00:19:38,930 ёсць файл цяпер на маім бягучым каталогу з імем students.csv. 419 00:19:38,930 --> 00:19:40,420 Некаторыя з вас, магчыма, бачылі гэта ў рэальным свеце. 420 00:19:40,420 --> 00:19:42,980 >> Што такое файл CSV? 421 00:19:42,980 --> 00:19:44,170 Значэнняў, падзеленых коскамі. 422 00:19:44,170 --> 00:19:46,670 Гэта накшталт як беднага чалавека версія файла Excel. 423 00:19:46,670 --> 00:19:50,580 Гэта табліца радкоў і слупкоў, Вы можаце адкрыць у праграму, як Excel, 424 00:19:50,580 --> 00:19:51,800 або лічбы на Mac. 425 00:19:51,800 --> 00:19:55,180 >> І калі я адкрываю гэты файл тут на Gedit, апавяшчэнне - а лічбы там няма. 426 00:19:55,180 --> 00:19:57,360 Вось толькі гаварыць GEdit мне нумары радкоў. 427 00:19:57,360 --> 00:19:59,740 Звярніце ўвагу, на першай лініі гэтага Выява Давіда і Mather. 428 00:19:59,740 --> 00:20:01,450 Наступны радок Rob Kirkland коскі. 429 00:20:01,450 --> 00:20:04,170 І трэцяя лінія Ларэн Левереттом коскі. 430 00:20:04,170 --> 00:20:05,480 >> Дык што ж я стварыў? 431 00:20:05,480 --> 00:20:09,580 Я цяпер напісана-праграму, якая эфектыўна можа генераваць табліцы 432 00:20:09,580 --> 00:20:11,840 якія могуць быць адкрыты ў праграмы, як Excel. 433 00:20:11,840 --> 00:20:15,520 Не ўсё, што пераканаўчым наборам дадзеных, але калі ў вас ёсць шмат вялікіх кавалкаў 434 00:20:15,520 --> 00:20:18,440 дадзеныя, якія вы сапраўды хочаце маніпуляваць і рабіць графікі і 435 00:20:18,440 --> 00:20:21,260 падабаецца, гэта, бадай, адзін спосаб стварэння гэтых дадзеных. 436 00:20:21,260 --> 00:20:25,370 Акрамя таго, CSV, на самай справе супер агульныя проста для захоўвання простых дадзеных - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, напрыклад, калі вы атрымліваеце каціроўкі акцый з дапамогай сваіх так званых 438 00:20:28,940 --> 00:20:33,180 API, бясплатны сэрвіс, які дазваляе атрымаць ток да-да-дата акцыі 439 00:20:33,180 --> 00:20:35,650 каціроўкі кампаній, яны даць дадзеныя назад у 440 00:20:35,650 --> 00:20:37,800 супер просты фармат CSV. 441 00:20:37,800 --> 00:20:39,380 >> Так як жа мы гэта зробім? 442 00:20:39,380 --> 00:20:42,530 Добра заўважыць, вялікая частка гэтай праграмы амаль тое ж самае. 443 00:20:42,530 --> 00:20:46,870 Але звярніце ўвагу, тут, унізе, а не для друку студэнтаў, аперацыі па лініі 35 444 00:20:46,870 --> 00:20:51,040 і далей, я сцвярджаю, што я эканомлю студэнтаў на дыск, так што захаванне файла. 445 00:20:51,040 --> 00:20:53,630 >> Так заўважыць я абвяшчаю файл * - 446 00:20:53,630 --> 00:20:57,260 Цяпер, гэта выгляд анамаліі ў C. Па нейкай прычыне, то файл будзе загалоўнымі літарамі, 447 00:20:57,260 --> 00:21:00,690 які не падобны на большасць іншых тыпаў дадзеных ў C. Але гэта убудаваны 448 00:21:00,690 --> 00:21:02,320 Тып дадзеных, файл *. 449 00:21:02,320 --> 00:21:05,900 І я абвяшчаю паказальнік на файл, як вы можаце думаць пра гэта. 450 00:21:05,900 --> 00:21:08,070 >> FOPEN азначае адкрыты файл. 451 00:21:08,070 --> 00:21:09,470 Якую файлавую вы хочаце адкрыць? 452 00:21:09,470 --> 00:21:12,620 Я хачу адкрыць файл, які я буду Умоўна назавем students.csv. 453 00:21:12,620 --> 00:21:14,480 Я магу патэлефанаваць, што ўсё, што захачу. 454 00:21:14,480 --> 00:21:15,200 >> А потым зрабіць здагадку. 455 00:21:15,200 --> 00:21:18,960 Што азначае другі аргумент да FOPEN, верагодна, азначае? 456 00:21:18,960 --> 00:21:21,480 Права, W для запісу, можа быць R для чытання. 457 00:21:21,480 --> 00:21:24,120 Там ёсць для дадання, калі вы хочаце дадаць радкі, а не 458 00:21:24,120 --> 00:21:25,200 перапісаць усё гэта. 459 00:21:25,200 --> 00:21:28,005 >> Але я проста хачу стварыць гэты файл адзін раз, таму я буду выкарыстоўваць у двукоссях Вт. 460 00:21:28,005 --> 00:21:31,880 І я ведаю, што толькі прачытаўшы дакументацыі, або даведачныя старонкі. 461 00:21:31,880 --> 00:21:35,100 Калі файл не з'яўляецца нулявым, - іншымі словамі, калі нічога не пайшло не так там - 462 00:21:35,100 --> 00:21:37,820 Дазвольце мне перабору студэнтаў ад 0 да 3. 463 00:21:37,820 --> 00:21:40,410 >> А цяпер звярніце ўвагу, ёсць што-то вельмі няшмат розны 464 00:21:40,410 --> 00:21:42,110 пра лінію 41 тут. 465 00:21:42,110 --> 00:21:42,960 Гэта не Е. 466 00:21:42,960 --> 00:21:46,530 Гэта Fprintf Е для файла. 467 00:21:46,530 --> 00:21:47,790 Дык гэта будзе запіс у файл. 468 00:21:47,790 --> 00:21:48,860 Які файл? 469 00:21:48,860 --> 00:21:53,630 Адзін, паказальнік пазначыць У якасці першага аргументу. 470 00:21:53,630 --> 00:21:55,940 >> Затым мы паказваем радок фармату. 471 00:21:55,940 --> 00:21:59,660 Затым мы вызначаем, якія радкі мы хочам убудова для першага з адсоткаў, а 472 00:21:59,660 --> 00:22:04,320 затым іншы зменнай ці другі з адсоткаў. 473 00:22:04,320 --> 00:22:06,760 Тады мы закрываем файл з FCLOSE. 474 00:22:06,760 --> 00:22:09,380 Чым я вызваліць памяць, як і раней, хоць Я павінен вярнуцца і дадаць 475 00:22:09,380 --> 00:22:10,540 некаторыя праверкі для нулявых. 476 00:22:10,540 --> 00:22:12,090 >> І гэта ўсё. 477 00:22:12,090 --> 00:22:16,960 FOPEN, Fprintf, FCLOSE дае мне магчымасць ствараць тэкставыя файлы. 478 00:22:16,960 --> 00:22:19,640 Зараз, вы ўбачыце ў Архіў задач пяць, які ўключае ў сябе выявы, якія вы будзеце выкарыстоўваць 479 00:22:19,640 --> 00:22:20,990 двайковыя файлы замест гэтага. 480 00:22:20,990 --> 00:22:24,200 Але важна тое, што ідэя тая ж, , Хоць гэтыя функцыі вы будзеце 481 00:22:24,200 --> 00:22:28,710 бачыце, крыху па-іншаму. 482 00:22:28,710 --> 00:22:32,580 >> Так ўраганны тур, але вы атрымаеце занадта добра знаёмыя з файла I/O-- 483 00:22:32,580 --> 00:22:34,960 ўваходныя і выходныя - з PSET пяць. 484 00:22:34,960 --> 00:22:38,607 І ўсе пытанні аб пачатковыя асновы тут? 485 00:22:38,607 --> 00:22:39,857 Да? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Што, калі вы паспрабуеце вызваліць нулявое значэнне? 488 00:22:43,710 --> 00:22:48,880 Я лічу, калі бясплатна не атрымала трохі больш зручным для карыстальнікаў, вы можаце 489 00:22:48,880 --> 00:22:49,890 патэнцыйна сегментацыі. 490 00:22:49,890 --> 00:22:54,160 Перадача яго несапраўдным дрэнна, таму што я не веру бясплатна перашкаджае праверыць для вас, 491 00:22:54,160 --> 00:22:57,330 таму што гэта патэнцыйна можа быць пустым марнаваннем часу для таго, каб зрабіць для сябе 492 00:22:57,330 --> 00:22:59,022 кожны чалавек у свеце. 493 00:22:59,022 --> 00:23:00,590 Добры пытанне, аднак. 494 00:23:00,590 --> 00:23:04,300 >> Добра, таму гэты выгляд атрымлівае нам цікавую тэму. 495 00:23:04,300 --> 00:23:07,010 Тэмай праблемай набору пяць з'яўляецца крыміналістыка. 496 00:23:07,010 --> 00:23:08,420 Па крайняй меры, частка праблемы набору. 497 00:23:08,420 --> 00:23:12,030 Крыміналістыка ў цэлым ставіцца да аднаўленне інфармацыі, якія могуць або 498 00:23:12,030 --> 00:23:14,110 не можа быць выдалены наўмысна. 499 00:23:14,110 --> 00:23:18,680 І таму я думаў, што дам вам хуткі густ таго, што адбываецца на самай справе ўсё 500 00:23:18,680 --> 00:23:21,230 на гэты раз пад капотам вашага кампутара. 501 00:23:21,230 --> 00:23:23,960 >> Напрыклад, калі ў вас ёсць унутры вашага ноўтбуку ці настольным кампутары 502 00:23:23,960 --> 00:23:28,040 жорсткі дыск, гэта альбо механічнымі прылада, якое на самай справе спіны - 503 00:23:28,040 --> 00:23:31,650 ёсць, што называецца кругавой пласціны , Якія выглядаюць зусім як тое, што я 504 00:23:31,650 --> 00:23:34,540 толькі што быў на экране тут, хоць гэта больш старой школы. 505 00:23:34,540 --> 00:23:37,370 Гэта тры з паловай цалі жорсткага дыска. 506 00:23:37,370 --> 00:23:40,070 І тры з паловай цалі ставіцца з з гэтай рэчы, калі вы ўсталюеце яго 507 00:23:40,070 --> 00:23:40,890 ў кампутары. 508 00:23:40,890 --> 00:23:44,890 >> Многія з вас, хлопцы, у вашых наўтбукаў зараз ёсць цвёрдацельныя назапашвальнікі або цвёрдацельныя назапашвальнікі, 509 00:23:44,890 --> 00:23:46,260 якія не маюць якія рухаюцца частак. 510 00:23:46,260 --> 00:23:49,170 Яны больш падобныя на АЗП, а не як гэтыя механічныя прылады. 511 00:23:49,170 --> 00:23:51,450 Але ідэі ўсё тыя ж, вядома ж, як яны ставяцца 512 00:23:51,450 --> 00:23:52,790 на пытанне, пастаўлены пяць. 513 00:23:52,790 --> 00:23:57,400 >> І калі вы думаеце пра цяпер жорсткі дыск ўяўляе будучы круг, які 514 00:23:57,400 --> 00:23:58,930 Я намалюю вось так вось. 515 00:23:58,930 --> 00:24:02,290 Калі вы ствараеце файл на вашым кампутары, няхай гэта будзе SSD або ў 516 00:24:02,290 --> 00:24:06,610 гэтым выпадку старэйшы школьны цвёрдым дыску, гэты файл утрымлівае некалькі бітаў. 517 00:24:06,610 --> 00:24:10,510 Давайце выкажам здагадку, што менавіта гэта 0 і 1, цэлы букет з 0 і 1. 518 00:24:10,510 --> 00:24:11,660 Так што гэта мой ўвесь жорсткі дыск. 519 00:24:11,660 --> 00:24:13,225 Гэта, відавочна, даволі вялікі файл. 520 00:24:13,225 --> 00:24:18,080 І ён выкарыстоўвае да 0 і 1, што на частку фізічнага пласціны. 521 00:24:18,080 --> 00:24:19,750 >> Ну, што ж, што фізічная частка? 522 00:24:19,750 --> 00:24:25,310 Ну, атрымліваецца, што на цвёрдым дыску, па меншай меры такога тыпу, ёсць 523 00:24:25,310 --> 00:24:27,340 гэтыя маленькія магнітныя часціцы. 524 00:24:27,340 --> 00:24:32,630 І яны па сутнасці ёсць поўнач і паўднёвы полюса да іх, так што, калі вы 525 00:24:32,630 --> 00:24:35,710 сваю чаргу, адзін з тых магнітных часціц Такім чынам, можна сказаць, што гэта 526 00:24:35,710 --> 00:24:36,720 прадстаўляюць 1. 527 00:24:36,720 --> 00:24:39,340 І калі гэта дагары нагамі на поўдзень да Поўнач, вы маглі б сказаць, што гэта 528 00:24:39,340 --> 00:24:40,390 прадстаўляюць 0. 529 00:24:40,390 --> 00:24:43,660 >> Такім чынам, у рэальным фізічным свеце, гэта як вы маглі б прадстаўляць сабой нешта ў 530 00:24:43,660 --> 00:24:45,670 двайковы стану 0 і 1. 531 00:24:45,670 --> 00:24:46,720 Так што ўсё файл. 532 00:24:46,720 --> 00:24:49,300 Там цэлая куча магнітнага часціцы, якія іх так ці 533 00:24:49,300 --> 00:24:51,920 Такім чынам, стварэнне мадэлі 0 і 1. 534 00:24:51,920 --> 00:24:56,760 >> Але, аказваецца, калі вы захоўваеце файл, некаторая інфармацыя захоўваецца асобна. 535 00:24:56,760 --> 00:25:00,000 Так што гэта столік, каталог, так бы мовіць. 536 00:25:00,000 --> 00:25:05,810 І я называю гэта імя слупка, а Я буду называць гэтую калонку месцы. 537 00:25:05,810 --> 00:25:08,850 >> І я збіраюся сказаць, выкажам здагадку, гэта маё рэзюмэ. 538 00:25:08,850 --> 00:25:14,050 Мой resume.doc захоўваецца пры месцы, скажам, 123. 539 00:25:14,050 --> 00:25:15,390 Я заўсёды іду на гэта лік. 540 00:25:15,390 --> 00:25:18,810 Але дастаткова сказаць, што, як і ў аператыўнай памяці, вы можаце ўзяць жорсткі дыск 541 00:25:18,810 --> 00:25:22,350 вось гігабайт або 200 гігабайт або адзін тэрабайт, і вы можаце 542 00:25:22,350 --> 00:25:23,750 лік усіх байтаў. 543 00:25:23,750 --> 00:25:26,480 Вы можаце перанумараваць ўсе кавалкі 8 біт. 544 00:25:26,480 --> 00:25:29,030 >> Таму мы будзем казаць, што гэта 123, з'яўляецца размяшчэнне. 545 00:25:29,030 --> 00:25:32,070 Так што гэты каталог ўнутры маёй аперацыйнай сістэма запамінае, што мая 546 00:25:32,070 --> 00:25:34,250 Рэзюмэ знаходзіцца ў месцазнаходжанні 123. 547 00:25:34,250 --> 00:25:36,850 Але самае цікавае, калі Вы выдаляеце файл. 548 00:25:36,850 --> 00:25:37,820 >> Так, напрыклад - 549 00:25:37,820 --> 00:25:40,790 і, на шчасце, большасць краін свету мае злавілі на гэтым - што адбываецца, калі 550 00:25:40,790 --> 00:25:45,040 вы перацягнуць файл у ваш смецце Mac OS ці ваш Windows кошыка? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Якая мэта рабіць гэта? 553 00:25:50,510 --> 00:25:53,860 Гэта, відавочна, каб пазбавіцца ад файлаў, але тое, што робіць акт перамяшчэнні і 554 00:25:53,860 --> 00:25:57,550 падзення ў ваш смецце або ваш Кошыка рабіць на кампутары? 555 00:25:57,550 --> 00:25:59,230 >> Абсалютна нічога, на самой справе. 556 00:25:59,230 --> 00:26:00,320 Гэта проста, як тэчкі. 557 00:26:00,320 --> 00:26:01,800 Гэта адмысловая тэчка, каб быць упэўненым. 558 00:26:01,800 --> 00:26:04,460 Але ці так гэта на самай справе выдаліць файл? 559 00:26:04,460 --> 00:26:06,780 >> Ну, не, таму што некаторыя з вас, напэўна быў падобны, ой блін, вы гэтага не зрабілі 560 00:26:06,780 --> 00:26:07,420 хацеў гэтага рабіць. 561 00:26:07,420 --> 00:26:09,130 Такім чынам, вы двойчы пстрыкніце Trash або кошыка. 562 00:26:09,130 --> 00:26:11,630 Вы ткнулі вакол, і вы ачунялі файл, проста перацягнуўшы яго 563 00:26:11,630 --> 00:26:12,110 адтуль. 564 00:26:12,110 --> 00:26:14,420 Такім чынам, ясна, што гэта не абавязкова выдаленьнем. 565 00:26:14,420 --> 00:26:15,990 >> Добра, што ты разумнейшы. 566 00:26:15,990 --> 00:26:18,860 Вы ведаеце, што проста перацягнуць яго ў Trash або кошыка не азначае, 567 00:26:18,860 --> 00:26:19,930 Вы ачыстцы кошыка. 568 00:26:19,930 --> 00:26:24,110 Дык вы ідзяце да мяне, а вы кажаце Ачысціць кошык або пусты кошыка. 569 00:26:24,110 --> 00:26:25,360 Тады што адбываецца? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Так, так яно выдаляецца больш. 572 00:26:32,530 --> 00:26:37,660 Але ўсё, што адбываецца гэта. 573 00:26:37,660 --> 00:26:45,350 Кампутар забывае, дзе resume.doc было. 574 00:26:45,350 --> 00:26:47,400 >> Але тое, што не змянілася па-відаць на малюнку? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Біт, 0 і 1, што я сцвярджаю, з'яўляюцца На тэрыторыі некаторых фізічных аспектаў 577 00:26:55,570 --> 00:26:56,280 апаратных сродкаў. 578 00:26:56,280 --> 00:26:57,110 Яны ўсё яшчэ там. 579 00:26:57,110 --> 00:26:58,930 Гэта проста кампутар забыўся, што яны ёсць. 580 00:26:58,930 --> 00:27:03,160 >> Так што гэта па сутнасці вызваліў выяву Біты так што яны могуць быць выкарыстаны паўторна. 581 00:27:03,160 --> 00:27:06,940 Але не раней, вы ствараеце некалькі файлаў, і больш файлаў і многае іншае файлы 582 00:27:06,940 --> 00:27:12,150 імавернасна, тыя, 0 і 1, гэтыя магнітныя часціцы, выкарыстоўваюцца паўторна, 583 00:27:12,150 --> 00:27:16,220 уверх ці правай бокам уверх, для іншыя файлы, 0 і 1. 584 00:27:16,220 --> 00:27:17,980 >> Так што ў вас ёсць гэты прамежак часу. 585 00:27:17,980 --> 00:27:19,860 І гэта не прадказальных Даўжыня, на самай справе. 586 00:27:19,860 --> 00:27:22,240 Гэта залежыць ад памеру жорсткага дыск і колькі файлаў ў вас ёсць і 587 00:27:22,240 --> 00:27:23,490 як хутка вы зрабіць новыя. 588 00:27:23,490 --> 00:27:27,050 Але ёсць акно часу, на працягу які, што файл ўсё яшчэ выдатна 589 00:27:27,050 --> 00:27:27,770 кампенсавана. 590 00:27:27,770 --> 00:27:31,050 >> Так што калі вы калі-небудзь выкарыстоўваць праграмы, як McAfee або Нортан, каб паспрабаваць аднавіць 591 00:27:31,050 --> 00:27:35,680 дадзеных, усе яны робяць спрабуе аднавіць гэтую так званую каталог 592 00:27:35,680 --> 00:27:37,340 высветліць, дзе твой файл быў. 593 00:27:37,340 --> 00:27:40,605 А часам Нортан і скажа: Выява 93% вымаемых. 594 00:27:40,605 --> 00:27:42,020 Ну, што ж гэта значыць? 595 00:27:42,020 --> 00:27:45,690 Гэта проста азначае, што некаторы іншы файл выпадкова скончыў з выкарыстаннем, скажам, 596 00:27:45,690 --> 00:27:48,920 гэтыя біты з зыходнага файла. 597 00:27:48,920 --> 00:27:51,950 >> Так што ж на самай справе ўдзельнічае ў аднаўленні дадзеных? 598 00:27:51,950 --> 00:27:55,720 Ну, калі ў вас няма нешта накшталт Нортан папярэдне ўсталяванай на Вашым кампутары, 599 00:27:55,720 --> 00:27:59,510 Лепшае, што можна часам зрабіць, гэта паглядзець на ўвесь жорсткі дыск шукае 600 00:27:59,510 --> 00:28:00,510 паслядоўнасці бітаў. 601 00:28:00,510 --> 00:28:05,350 І адна з тым праблема набору пяць у тым, што вы будзеце шукаць 602 00:28:05,350 --> 00:28:09,570 аналаг жорсткага дыска, судова вобраз кампактнага флэш-карту ад 603 00:28:09,570 --> 00:28:13,660 лічбавая камера, пошук 0s і 1, якія звычайна з высокай 604 00:28:13,660 --> 00:28:16,720 верагоднасці, уяўляюць пачатак малюнка JPEG. 605 00:28:16,720 --> 00:28:21,120 >> І вы, хлопцы, можаце аднавіць гэтыя вобразы на пры ўмове, калі я бачу гэтую мадэль 606 00:28:21,120 --> 00:28:24,380 біты на судова малюнка, з высокая верагоднасць, што азначае 607 00:28:24,380 --> 00:28:25,650 пачатку JPEG. 608 00:28:25,650 --> 00:28:29,520 І калі я бачу той жа шаблон зноў, што, верагодна, азначае сабой пачатак 609 00:28:29,520 --> 00:28:32,440 іншы JPEG, а другі JPEG, а іншы ў фармаце JPEG. 610 00:28:32,440 --> 00:28:34,970 І гэта, як правіла, як аднаўленне дадзеных будзе працаваць. 611 00:28:34,970 --> 00:28:37,870 Тое, што добра пра фармаце JPEG з'яўляецца хоць фармат файла сам некалькі 612 00:28:37,870 --> 00:28:44,400 комплекс, у пачатку кожнага такога файл на самай справе даволі ідэнтыфікуюцца 613 00:28:44,400 --> 00:28:47,370 і просты, як вы ўбачыце, калі ў вас не зрабілі. 614 00:28:47,370 --> 00:28:50,270 >> Такім чынам, давайце зірнем пад капот як дакладна, што было 615 00:28:50,270 --> 00:28:53,360 адбываецца, і тое, што гэтыя 0 і 1 ёсць, каб даць вам крыху больш 616 00:28:53,360 --> 00:28:55,330 кантэкст для гэтага канкрэтнага выклік. 617 00:28:55,330 --> 00:28:55,510 >> [Прайграванне відэа] 618 00:28:55,510 --> 00:28:58,700 >> -Дзе Ваш кампутар захоўвае самыя яго пастаянных дадзеных. 619 00:28:58,700 --> 00:29:03,390 Каб зрабіць гэта, дадзеныя перамяшчаюцца з аператыўнай памяці разам з праграмным забеспячэннем сігналы, якія кажуць 620 00:29:03,390 --> 00:29:06,110 жорсткага дыска, як захоўваць гэтыя дадзеныя. 621 00:29:06,110 --> 00:29:09,410 Жорсткі дыск Перавесці схем гэтых сігналаў у напружанне 622 00:29:09,410 --> 00:29:10,870 ваганняў. 623 00:29:10,870 --> 00:29:14,970 Гэтыя, у сваю чаргу, кантралююць жорсткага дыска якія рухаюцца частак, некаторыя з некалькіх 624 00:29:14,970 --> 00:29:17,910 якія рухаюцца частак, якія засталіся ў сучаснага кампутара. 625 00:29:17,910 --> 00:29:22,130 >> Некаторыя з сігналаў кіравання рухавіком які круціць металічным пакрыццём пласцін. 626 00:29:22,130 --> 00:29:25,470 Вашы дадзеныя на самай справе захоўваюцца на гэтых пласцінах. 627 00:29:25,470 --> 00:29:28,610 Іншыя сігналы перамяшчэння чытання / запісу галавы, каб чытаць ці 628 00:29:28,610 --> 00:29:30,710 запісу дадзеных на пласцінах. 629 00:29:30,710 --> 00:29:35,450 Гэты механізм настолькі дакладныя, што чалавека Валасы не мог нават прайсці паміж 630 00:29:35,450 --> 00:29:37,280 кіраўнікі і спінінг пласцін. 631 00:29:37,280 --> 00:29:40,316 Тым не менш, усё гэта працуе на выдатнай хуткасці. 632 00:29:40,316 --> 00:29:40,660 >> [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 633 00:29:40,660 --> 00:29:42,190 >> DAVID малая: невялікае павелічэнне глыбокае цяпер на тое, што гэта 634 00:29:42,190 --> 00:29:44,360 на самай справе на гэтых пласцінах. 635 00:29:44,360 --> 00:29:44,720 >> [Прайграванне відэа] 636 00:29:44,720 --> 00:29:47,660 >> -Давайце паглядзім на тое, што мы проста бачыла ў запаволеным тэмпе. 637 00:29:47,660 --> 00:29:51,710 Калі кароткага імпульсу электрычнасці накіроўваецца ў галоўку чытання / запісы, калі перагортваецца 638 00:29:51,710 --> 00:29:54,650 на малюсенькім для электрамагнітных долі секунды. 639 00:29:54,650 --> 00:29:58,970 Магніт стварае поле, якое змены палярнасці малюсенькі, малюсенькі 640 00:29:58,970 --> 00:30:02,850 частка металічных часціц, якія пакрыць кожную паверхню пласцін. 641 00:30:02,850 --> 00:30:05,940 >> Мадэль серыя гэтых маленькіх, спаганяецца тэрыторый на дыску 642 00:30:05,940 --> 00:30:08,470 ўяўляе сабой адзін біт Дадзеныя ў двайковы лік 643 00:30:08,470 --> 00:30:10,530 Сістэма, якая выкарыстоўваецца на кампутарах. 644 00:30:10,530 --> 00:30:13,775 Зараз, калі ток накіроўваецца ў адзін бок праз галоўкі чытання / запісы, плошча 645 00:30:13,775 --> 00:30:15,970 палярызаванае ў адным кірунку. 646 00:30:15,970 --> 00:30:17,950 Калі ток накіроўваецца ў процілеглым кірунку 647 00:30:17,950 --> 00:30:19,930 палярызацыя змяняецца на супрацьлеглую. 648 00:30:19,930 --> 00:30:22,370 >> Як вы атрымліваеце дадзеныя з жорсткага дыска? 649 00:30:22,370 --> 00:30:24,090 Проста павярнуць працэс назад. 650 00:30:24,090 --> 00:30:26,550 Так што гэта часціцы на дыску якія атрымліваюць ток у 651 00:30:26,550 --> 00:30:27,960 галоўка чытання / запісы руху. 652 00:30:27,960 --> 00:30:30,700 Усе разам гэтыя мільёны намагнічанага сегментаў, а таксама 653 00:30:30,700 --> 00:30:32,160 ў вас ёсць файл. 654 00:30:32,160 --> 00:30:36,060 >> Зараз, часткі аднаго файла можа быць раскіданыя па дысках, каб знайсці 655 00:30:36,060 --> 00:30:39,970 стравы, накшталт як беспарадак папер на вашым стале. 656 00:30:39,970 --> 00:30:43,500 Так спецыяльная дадатковы файл адсочвае пра тое, дзе што знаходзіцца. 657 00:30:43,500 --> 00:30:45,985 Хіба вы не хацелі б мець нешта накшталт гэтага? 658 00:30:45,985 --> 00:30:46,470 >> [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 659 00:30:46,470 --> 00:30:47,820 >> DAVID малая: Добра, напэўна, няма. 660 00:30:47,820 --> 00:30:52,070 Так як многія з вас, хлопцы рос з гэтым? 661 00:30:52,070 --> 00:30:53,970 ОК, так што гэта ўсё менш і менш рукі з кожным годам. 662 00:30:53,970 --> 00:30:56,550 Але я рады, што вы па крайняй меры знаёмыя з імі, таму што гэта і наша ўласная 663 00:30:56,550 --> 00:31:00,520 Кніга дэма, на жаль, паміраюць вельмі павольную смерць тут фамільярнасць. 664 00:31:00,520 --> 00:31:04,010 >> Але гэта тое, што я, па меншай меры, яшчэ ў сярэдняй школы, выкарыстаў выкарыстанне для рэзервовага капіявання. 665 00:31:04,010 --> 00:31:08,110 І гэта было дзіўна, таму што вы можа захоўваць 1,4 мегабайт на 666 00:31:08,110 --> 00:31:08,930 дадзены дыск. 667 00:31:08,930 --> 00:31:12,260 І гэта было высокай шчыльнасці Версія, як паказана ў HD, які мае 668 00:31:12,260 --> 00:31:14,240 гэта азначае, перш HD сённяшняй відэа. 669 00:31:14,240 --> 00:31:16,400 >> Стандартная шчыльнасць была 800 кілабайт. 670 00:31:16,400 --> 00:31:18,640 А да гэтага, былі 400 кілабайт дыскамі. 671 00:31:18,640 --> 00:31:23,120 А да гэтага, было 5 і 1/4 цалевыя дыскі, якія былі па-сапраўднаму гнуткіх, 672 00:31:23,120 --> 00:31:25,680 і трохі шырэй і вышэй чым гэтыя рэчы тут. 673 00:31:25,680 --> 00:31:29,150 Але вы можаце ўбачыць так званую дыскеты аспект гэтых дыскаў. 674 00:31:29,150 --> 00:31:32,630 >> І функцыянальна, яны на самой справе вельмі падобна на жорсткіх дысках ў 675 00:31:32,630 --> 00:31:33,570 меры гэтага тыпу. 676 00:31:33,570 --> 00:31:37,270 Зноў жа, цвёрдацельныя кружэлкі ў новых кампутарах працуюць некалькі інакш. 677 00:31:37,270 --> 00:31:41,530 Але калі вы перасоўвае, што мала ўкладку метал, вы можаце ўбачыць трохі печыва, 678 00:31:41,530 --> 00:31:42,560 ці страве. 679 00:31:42,560 --> 00:31:43,830 >> Гэта не метал, як гэты. 680 00:31:43,830 --> 00:31:46,000 Гэты на самай справе некаторыя больш танныя пластыкавага матэрыялу. 681 00:31:46,000 --> 00:31:46,750 І вы можаце выгляду варушыць яго. 682 00:31:46,750 --> 00:31:50,310 І вы Trully проста сцёрты некаторых Колькасць бітаў або магнітныя часціцы 683 00:31:50,310 --> 00:31:51,220 з гэтага дыска. 684 00:31:51,220 --> 00:31:52,710 >> Так, на шчасце, няма нічога на ім. 685 00:31:52,710 --> 00:31:55,790 Калі гэтая рэч знаходзіцца ў шляху - і ахопліваюць Вашы вочы і тыя з вашых суседзяў - 686 00:31:55,790 --> 00:31:58,865 Вы можаце толькі збольшага ажыццявіць гэта цэлым ад абалонкі падобнае. 687 00:31:58,865 --> 00:32:01,900 Але ёсць трохі вясны, так што будзьце ўсведамляе, што на свае вочы. 688 00:32:01,900 --> 00:32:03,620 Так што зараз у вас ёсць сапраўды дыскету. 689 00:32:03,620 --> 00:32:07,090 >> І тое, што аб гэтай выдатнай у тым, што ў той меры, што гэта 690 00:32:07,090 --> 00:32:10,830 дробнага ўяўленне большага жорсткі дыск, гэтыя рэчы супер, 691 00:32:10,830 --> 00:32:11,590 супер проста. 692 00:32:11,590 --> 00:32:15,170 Калі вы дробку дне яго, цяпер, што металічныя рэчы выключаны, і скурка 693 00:32:15,170 --> 00:32:20,990 іх адкрытымі, і ўсё, што складаецца з дзвюх частак лямца і так званы гнуткі дыск 694 00:32:20,990 --> 00:32:22,930 з кавалкам металу на ўнутраным боку. 695 00:32:22,930 --> 00:32:25,990 >> І там ідзе палова мой дыск змесціва. 696 00:32:25,990 --> 00:32:27,540 Там ідзе іншая палова з іх. 697 00:32:27,540 --> 00:32:31,375 Але гэта ўсё, што кружылася ўнутры вашага кампутара ў мінулых. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> І зноў жа, каб паставіць гэта ў перспектыве, наколькі вялікая большасць вашых 700 00:32:38,310 --> 00:32:39,560 Жорсткія дыскі ў гэтыя дні? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 гігабайт, тэрабайт, можа быць, у настольны кампутар, 2 Тб, 3 703 00:32:46,230 --> 00:32:47,630 тэрабайт, 4 тэрабайта, праўда? 704 00:32:47,630 --> 00:32:52,480 Гэта адзін мегабайт, плюс-мінус, , Якія не могуць нават адпавядаць тыповым MP3 705 00:32:52,480 --> 00:32:55,310 больш у гэтыя дні, ці некаторыя Падобныя музычныя файлы. 706 00:32:55,310 --> 00:32:59,500 >> Так невялікі сувенір для вас сёння, і Таксама, каб дапамагчы тое, што кантэкст 707 00:32:59,500 --> 00:33:03,570 мы будзем прымаць як належнае Зараз у задачу, пастаўленую пяць. 708 00:33:03,570 --> 00:33:04,820 Такім чынам, гэта вашы. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Такім чынам, дазвольце мне пераход да якой будзе правесці наступныя PSET таксама. 711 00:33:13,370 --> 00:33:18,470 Так што мы цяпер ўстаноўлена для гэтай старонкі - о, пару аб'явы хутка. 712 00:33:18,470 --> 00:33:21,730 >> У гэтую пятніцу, калі вы хочаце далучыцца да CS50 на абед, перайдзіце на звычайным месцы, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 І апошні праект - 715 00:33:25,100 --> 00:33:28,520 так у праграме, мы адправілі канчатковай спецыфікацыі праекта ўжо. 716 00:33:28,520 --> 00:33:31,410 Зразумейце, што гэта не азначае, гэта з-за асаблівасці ў бліжэйшы час. 717 00:33:31,410 --> 00:33:33,990 Ён адказваў, на самай справе, толькі б атрымаць вы, хлопцы, думаў пра гэта. 718 00:33:33,990 --> 00:33:37,620 І сапраўды, супер значныя працэнт вы будзеце шукаць шляхі вырашэння 719 00:33:37,620 --> 00:33:40,780 дыпломныя праекты на матэрыяле, які мы нават яшчэ не ў класе, 720 00:33:40,780 --> 00:33:42,730 але будзе ўжо на наступным тыдні. 721 00:33:42,730 --> 00:33:45,530 >> Заўважце, аднак, што спецыфікацыя патрабуе некалькі розных кампанентаў 722 00:33:45,530 --> 00:33:46,190 канчатковы праект. 723 00:33:46,190 --> 00:33:49,590 Па-першае, на працягу некалькіх тыдняў, з'яўляецца перадпраектныя прапановы, даволі выпадковы электроннай пошце 724 00:33:49,590 --> 00:33:52,760 Вашай TF сказаць яму або тое, што вы думаць аб для вашага праекта, з 725 00:33:52,760 --> 00:33:53,650 Няма абавязацельстваў. 726 00:33:53,650 --> 00:33:56,710 Прапанова будзе вашым абавязацельства, кажучы, вось, гэта тое, што 727 00:33:56,710 --> 00:33:57,770 Я хацеў бы зрабіць для майго праекта. 728 00:33:57,770 --> 00:33:58,250 Што вы думаеце? 729 00:33:58,250 --> 00:33:58,650 Занадта вялікі? 730 00:33:58,650 --> 00:33:59,145 Занадта маленькі? 731 00:33:59,145 --> 00:34:00,330 Гэта кіраваным? 732 00:34:00,330 --> 00:34:02,230 І вы бачыце, спецыфікацыі для больш падрабязнай інфармацыі. 733 00:34:02,230 --> 00:34:05,060 >> Пару тыдняў пасля гэтага з'яўляецца статус даклад, які аналагічным чынам 734 00:34:05,060 --> 00:34:08,260 выпадковы электроннай пошце сваім TF сказаць, наколькі далёка ззаду Вы знаходзіцеся ў сваім канчатковым 735 00:34:08,260 --> 00:34:12,360 рэалізацыі праекта, а затым CS50 Hackathon якому кожны 736 00:34:12,360 --> 00:34:17,520 прапануецца, які будзе падзея з 8:00 вечара на адным вечара да 7:00 737 00:34:17,520 --> 00:34:19,150 Раніцы наступнага дня. 738 00:34:19,150 --> 00:34:22,560 Піца, як я, магчыма, згаданыя ў тыдзень нуля, Віль быць пададзены ў 9:00 вечара, 739 00:34:22,560 --> 00:34:24,120 Кітайская ежа ў 1:00 раніцы. 740 00:34:24,120 --> 00:34:27,929 І калі вы яшчэ не спаў у 5:00 раніцы, мы адвязем вас да IHOP на сняданак. 741 00:34:27,929 --> 00:34:31,310 >> Такім чынам, Hackathon з'яўляецца адным з найбольш незабыўных уражанняў у класе. 742 00:34:31,310 --> 00:34:35,290 Затым ажыццяўлення тлумачыцца тым, а Затым кульмінацыйнай CS50 кірмаш. 743 00:34:35,290 --> 00:34:38,070 Больш падрабязную інфармацыю аб усіх гэтых у бліжэйшыя тыдні. 744 00:34:38,070 --> 00:34:40,739 >> Але давайце вернемся да таго, старой школы - 745 00:34:40,739 --> 00:34:41,920 зноў, масіў. 746 00:34:41,920 --> 00:34:45,040 Так масіў быў добры, таму што вырашае праблемы, як мы бачылі, толькі 747 00:34:45,040 --> 00:34:49,290 Хвіліну таму са студэнцкімі структурамі становіцца трохі з-пад кантролю, калі мы 748 00:34:49,290 --> 00:34:52,405 хочуць мець аднаго студэнта, студэнт два, тры студэнта, студэнт кропка кропка кропка, 749 00:34:52,405 --> 00:34:54,400 некаторыя адвольныя ліку студэнтаў. 750 00:34:54,400 --> 00:34:58,850 >> Так масівы, некалькі тыдняў таму, напала і вырашыў усе нашы праблемы не 751 00:34:58,850 --> 00:35:03,340 ведаючы загадзя, колькі рэчаў некаторага тыпу мы маглі б хацець. 752 00:35:03,340 --> 00:35:07,390 І мы бачылі, што структуры могуць дапамагчы нам далейшай арганізацыі нашага кода і захаваць 753 00:35:07,390 --> 00:35:11,660 канцэптуальна падобна зменных, такіх як імя і дома, разам, так што мы 754 00:35:11,660 --> 00:35:15,570 іх можна разглядаць як адзінае цэлае, усярэдзіне якой маюцца дробныя кавалкі. 755 00:35:15,570 --> 00:35:17,810 >> Але масівы маюць некаторыя недахопы. 756 00:35:17,810 --> 00:35:19,780 Якія некаторыя з недахопаў мы сутыкнуліся 757 00:35:19,780 --> 00:35:22,320 з масівамі да гэтага часу? 758 00:35:22,320 --> 00:35:23,450 Што гэта? 759 00:35:23,450 --> 00:35:28,130 Фіксаваны памер - так што нават калі вы, магчыма, зможа вылучыць памяць для 760 00:35:28,130 --> 00:35:32,310 Масіў, як толькі вы ведаеце, колькі студэнтаў ў вас ёсць, колькі знакаў у вас ёсць 761 00:35:32,310 --> 00:35:35,460 ад карыстальніка, як толькі вы вылучылі масіве, вы выгляд афарбаваныя 762 00:35:35,460 --> 00:35:36,740 сябе ў кут. 763 00:35:36,740 --> 00:35:40,600 >> Таму што вы не можаце ўставіць новыя элементы у сярэдзіну масіва. 764 00:35:40,600 --> 00:35:43,660 Вы не можаце ўставіць больш элементаў ў канцы масіва. 765 00:35:43,660 --> 00:35:47,750 Сапраўды, вы змушаныя звяртацца да стварэння зусім новы масіў, як мы ўжо абмяркоўвалі, 766 00:35:47,750 --> 00:35:49,320 капіяваннем старога ў новае. 767 00:35:49,320 --> 00:35:52,610 І зноў жа, гэта галаўны боль, якая GetString займаецца для вас. 768 00:35:52,610 --> 00:35:56,170 >> Але зноў жа, вы не можаце нават ўставіць нешта ў сярэдзіну масіва 769 00:35:56,170 --> 00:35:58,200 Калі стаўка не цалкам запоўненая. 770 00:35:58,200 --> 00:36:03,010 Напрыклад, калі гэты масіў тут памераў шэсць толькі пяць рэчаў у ім, 771 00:36:03,010 --> 00:36:06,080 Ну, вы маглі проста тактыку то на канцы. 772 00:36:06,080 --> 00:36:08,200 Але што, калі вы хочаце ўставіць нешта ў сярэдзіне 773 00:36:08,200 --> 00:36:11,280 масівам, хоць ён можа мець пяць з шасці рэчаў у ім? 774 00:36:11,280 --> 00:36:14,250 >> Ну, што ж мы робім, калі мы былі ўсе нашых чалавечых добраахвотнікаў на сцэне ў 775 00:36:14,250 --> 00:36:15,110 тыдня мінулага? 776 00:36:15,110 --> 00:36:18,710 Калі б мы хацелі паставіць каго-то тут, або гэтыя людзі, як рухацца гэтым 777 00:36:18,710 --> 00:36:22,540 Дарэчы, гэтыя людзі ці як рухацца гэтым Дарэчы, і гэта стала дарагім. 778 00:36:22,540 --> 00:36:26,950 Перамяшчэнне людзей унутры Масіў скончылася тым, што дадаў і коштам 779 00:36:26,950 --> 00:36:31,240 нам час, таму многія нашы N квадрат час працы, як сартаванне устаўкай, для 780 00:36:31,240 --> 00:36:32,550 Напрыклад, у горшым выпадку. 781 00:36:32,550 --> 00:36:36,520 Так масівы з'яўляюцца вялікімі, але вы павінны загадзя ведаць, як вялікі Вы хочаце іх. 782 00:36:36,520 --> 00:36:38,030 >> Так добра, вось рашэнне. 783 00:36:38,030 --> 00:36:43,860 Калі я не ведаю загадзя, колькі Я студэнтам маглі мець, і я ведаю, як толькі 784 00:36:43,860 --> 00:36:47,870 Я вырашаю, хоць, я затрымаўся з гэтым многія студэнты, то чаму б мне проста не заўсёды 785 00:36:47,870 --> 00:36:51,740 вылучыць два разы больш месца як я мог бы думаю, што трэба? 786 00:36:51,740 --> 00:36:54,450 Хіба гэта не разумнае рашэнне? 787 00:36:54,450 --> 00:36:58,240 >> Рэальна, я не думаю, што мы спатрэбіцца больш за 50 слотаў 788 00:36:58,240 --> 00:37:02,190 ў масіў для сярэдняга класа, так што давайце проста акругліць. 789 00:37:02,190 --> 00:37:07,040 Я зраблю 100 слотаў ў маім масіве, усяго так што мы можам вызначана атрымаць 790 00:37:07,040 --> 00:37:10,330 колькасць студэнтаў, якіх я чакаў быць у пэўным сярэдняга класа. 791 00:37:10,330 --> 00:37:14,320 Так чаму б не акружыць і вылучыць больш памяці, звычайна, для масіва 792 00:37:14,320 --> 00:37:16,290 чым вы думаеце, вы маглі б нават трэба? 793 00:37:16,290 --> 00:37:20,190 Што гэта простае буксіроўкі да гэтай ідэі? 794 00:37:20,190 --> 00:37:21,440 >> Вы проста марнуеце памяці. 795 00:37:21,440 --> 00:37:25,350 Літаральна кожную праграму вы пішаце то , Можа быць, выкарыстоўваеце ў два разы больш памяці, чым 796 00:37:25,350 --> 00:37:26,680 вам сапраўды трэба. 797 00:37:26,680 --> 00:37:28,990 І, што проста не хочацца Асабліва элегантнае рашэнне. 798 00:37:28,990 --> 00:37:31,990 Акрамя таго, ён проста памяншае Верагоднасць праблема. 799 00:37:31,990 --> 00:37:35,300 Калі вам пашчасціла мець папулярны курс адзін семестр і ў вас ёсць 101 800 00:37:35,300 --> 00:37:39,610 студэнтаў, ваша праграма па-ранейшаму прынцыпова сутыкаецца з той жа праблемай. 801 00:37:39,610 --> 00:37:44,280 >> Так на шчасце, ёсць рашэнне гэта аб'ява ўсе нашы праблемы ў выглядзе 802 00:37:44,280 --> 00:37:46,790 структур дадзеных, якія больш складаныя, чым тыя 803 00:37:46,790 --> 00:37:47,970 мы бачылі да гэтага часу. 804 00:37:47,970 --> 00:37:50,530 Гэта, я сцвярджаю, з'яўляецца звязаных спісам. 805 00:37:50,530 --> 00:37:51,920 Гэта спіс лікаў - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 і 34 - 807 00:37:54,970 --> 00:38:00,120 , Якія былі звязаны адзін з адным з дапамогай пра тое, што я намаляваў, як стрэлы. 808 00:38:00,120 --> 00:38:03,580 >> Іншымі словамі, калі б я хацеў, каб прадстаўляць масівам, што я мог зрабіць 809 00:38:03,580 --> 00:38:04,910 нешта накшталт гэтага. 810 00:38:04,910 --> 00:38:07,310 І я пакладу гэта на накладныя праз хвіліну. 811 00:38:07,310 --> 00:38:09,970 Я мог бы зрабіць - 812 00:38:09,970 --> 00:38:12,520 прывітанне, усё ў парадку. 813 00:38:12,520 --> 00:38:14,470 Заставайцеся на сувязі. 814 00:38:14,470 --> 00:38:17,360 Новы кампутар тут, ясна - 815 00:38:17,360 --> 00:38:18,090 Усё ў парадку. 816 00:38:18,090 --> 00:38:21,730 >> Так што, калі ў мяне ёсць гэтыя колькасці ў масіве - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 не абавязкова ў маштабе. 819 00:38:30,530 --> 00:38:33,730 Добра, вось мая масіва - 820 00:38:33,730 --> 00:38:34,980 Божа мой. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Добра, вось мая масіва. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 О, мой бог. 825 00:38:45,050 --> 00:38:48,820 >> [Смяецца] 826 00:38:48,820 --> 00:38:49,440 >> DAVID малая: прыкідвацца. 827 00:38:49,440 --> 00:38:52,330 Гэта занадта шмат намаганняў, каб вярнуцца і выправіць гэта, так што - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Так што ў нас ёсць гэты масіў 9, 17, 22, 26 і 34. 830 00:38:57,650 --> 00:39:00,260 Для тых з вас можа бачыць прыкрае непаразуменне я толькі што зрабіў, 831 00:39:00,260 --> 00:39:00,830 там гэта. 832 00:39:00,830 --> 00:39:04,490 >> Таму я сцвярджаю, што гэта вельмі эфектыўным рашэннем. 833 00:39:04,490 --> 00:39:07,310 Я выдзеліў столькі як цэлыя Мне трэба - раз, два, тры, 834 00:39:07,310 --> 00:39:09,100 чатыры, пяць, ці шэсць - 835 00:39:09,100 --> 00:39:11,660 і я затым захоўваюцца нумары ўнутры гэтага масіва. 836 00:39:11,660 --> 00:39:15,220 Але выкажам здагадку, то, я хачу ўставіць значэнне як лік 8? 837 00:39:15,220 --> 00:39:16,100 Ну, куды гэта ідзе? 838 00:39:16,100 --> 00:39:18,530 Выкажам здагадку, я хачу, каб ўставіць лік, напрыклад 20. 839 00:39:18,530 --> 00:39:19,790 Ну, куды гэта ідзе? 840 00:39:19,790 --> 00:39:23,160 Недзе там у сярэдзіне, альбо лічбу 35 павінна пайсці 841 00:39:23,160 --> 00:39:24,010 дзесьці ў канцы. 842 00:39:24,010 --> 00:39:25,320 Але я ўсё з космасу. 843 00:39:25,320 --> 00:39:29,120 >> І такім чынам, гэта з'яўляецца фундаментальнай праблемай масіваў якое з'яўляецца рашэннем. 844 00:39:29,120 --> 00:39:32,280 Я сцвярджаў, хвіліну назад, GetString вырашае гэтую праблему. 845 00:39:32,280 --> 00:39:37,380 Калі Вы хочаце ўставіць шостым нумарам У гэты масіў, тое, што па меншай меры адзін 846 00:39:37,380 --> 00:39:40,090 рашэнне, якое вы можаце абаперціся напэўна, гэтак жа, як мы робім з GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Што гэта? 849 00:39:46,030 --> 00:39:48,190 >> Ну, зрабіць яго больш, тым лягчэй сказаць, чым зрабіць. 850 00:39:48,190 --> 00:39:52,810 Мы не можам абавязкова рабіць масіва больш, але што мы можам зрабіць? 851 00:39:52,810 --> 00:39:56,570 Зрабіць новы масіў, які больш, памерам 6, а можа, памер 10, калі мы хочам 852 00:39:56,570 --> 00:40:00,490 апярэдзіць рэчы, а затым скапіяваць старога масіва ў новы, а затым 853 00:40:00,490 --> 00:40:01,680 вызваліць старога масіва. 854 00:40:01,680 --> 00:40:05,770 >> Але тое, што час працы Зараз гэтага працэсу? 855 00:40:05,770 --> 00:40:09,870 Гэта вялікае Аб ад N, так як капіраванне будзе каштаваць вам некалькі адзінак 856 00:40:09,870 --> 00:40:13,480 часу, так што не так ідэальна, калі мы павінны вылучыць новы масіў, які будзе 857 00:40:13,480 --> 00:40:15,610 спажываць у два разы больш памяці часова. 858 00:40:15,610 --> 00:40:16,660 Скапіюйце старыя на новыя - 859 00:40:16,660 --> 00:40:18,800 Я маю на ўвазе, гэта проста галаўны боль, якая , Зноў жа, чаму мы напісалі 860 00:40:18,800 --> 00:40:19,920 GetString для вас. 861 00:40:19,920 --> 00:40:21,380 >> Так што мы маглі б зрабіць замест гэтага? 862 00:40:21,380 --> 00:40:25,000 Ну, што, калі нашы структуры дадзеных на самай справе мае прабелы ў ім? 863 00:40:25,000 --> 00:40:30,790 Выкажам здагадку, што я расслабляюся маёй мэты, якія маюць бесперапынныя блокі памяці, дзе 9 864 00:40:30,790 --> 00:40:34,500 знаходзіцца побач з 17, які побач з 22, і так далей. 865 00:40:34,500 --> 00:40:39,570 >> І выкажам здагадку, што 9 можа быць тут, у Аператыўнай памяці, і 17 можа быць тут, у аператыўнай памяці, 866 00:40:39,570 --> 00:40:40,990 і 22 можа быць тут, у аператыўнай памяці. 867 00:40:40,990 --> 00:40:43,610 Іншымі словамі, я не маю патрэбу ў іх нават спіна да спіны больш. 868 00:40:43,610 --> 00:40:47,850 Мне проста трэба неяк нітку ў іголку у кожным з гэтых лічбаў, або кожны 869 00:40:47,850 --> 00:40:51,010 з гэтых вузлоў, як мы будзем называць прастакутнікамі, як я намаляваў іх, 870 00:40:51,010 --> 00:40:55,670 памятаю, як дабрацца да апошняга такі вузел ад першага. 871 00:40:55,670 --> 00:40:59,940 >> Так у чым жа канструкцыі праграмавання мы бачылі зусім нядаўна, з якой я 872 00:40:59,940 --> 00:41:03,030 можна рэалізаваць, што нітка, або зробленыя тут, з якой я магу 873 00:41:03,030 --> 00:41:05,430 ажыццяўляць гэтыя стрэлкі? 874 00:41:05,430 --> 00:41:06,500 Таму паказальнікі, ці не так? 875 00:41:06,500 --> 00:41:09,560 Калі б я вылучыць не толькі Інтэлект, але вузел - і 876 00:41:09,560 --> 00:41:10,810 вузел, я проста азначае кантэйнеры. 877 00:41:10,810 --> 00:41:12,900 І візуальна, я маю на ўвазе прастакутнік. 878 00:41:12,900 --> 00:41:16,420 Так вузла мабыць патрэбныя ўтрымліваць два значэння - 879 00:41:16,420 --> 00:41:21,490 цэлалікавай сябе, а потым, як гэта вынікае з ніжнюю палову прамавугольніка 880 00:41:21,490 --> 00:41:23,010 досыць месцы для Int. 881 00:41:23,010 --> 00:41:26,130 >> Так што паклапаціцца пра гэта загадзя тут, наколькі вялікі гэты вузел, гэта 882 00:41:26,130 --> 00:41:27,170 Кантэйнер ідзе гаворка? 883 00:41:27,170 --> 00:41:29,250 Колькі байт для цэлалікавых? 884 00:41:29,250 --> 00:41:31,310 Мяркуецца, 4, калі гэта гэтак жа, як звычайна. 885 00:41:31,310 --> 00:41:33,270 А потым, колькі байт для паказальніка? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Так што альбо кантэйнер ад гэты вузел, з'яўляецца будзе 8 байт структуры. 888 00:41:37,940 --> 00:41:41,760 О, і гэта шчаслівае супадзенне, што мы сапраўды таксама гэта паняцце 889 00:41:41,760 --> 00:41:44,400 структура або структура C. 890 00:41:44,400 --> 00:41:48,890 >> Таму я сцвярджаю, што я хачу зрабіць крок да гэтага больш складаныя 891 00:41:48,890 --> 00:41:52,560 рэалізацыя спіс нумароў, звязаны спіс нумароў, мне трэба зрабіць 892 00:41:52,560 --> 00:41:56,920 трохі больш мысленне фронт і аб'явіць не толькі Інтэлект, але структура 893 00:41:56,920 --> 00:41:58,620 , Што я пазваню, умоўна Тут, вузла. 894 00:41:58,620 --> 00:42:01,630 Мы маглі б назваць яе як заўгодна,, але вузел будзе тэматычным ў многіх 895 00:42:01,630 --> 00:42:03,560 з рэчаў, мы пачнем разглядаць зараз. 896 00:42:03,560 --> 00:42:06,480 >> Унутры гэтага вузла будзе Int N. 897 00:42:06,480 --> 00:42:09,350 А потым гэты сінтаксіс, трохі дзіўна на першы погляд - 898 00:42:09,350 --> 00:42:12,960 Структура вузла * наступны. 899 00:42:12,960 --> 00:42:16,900 Ну графічна, што гэта такое? 900 00:42:16,900 --> 00:42:21,000 Гэта значыць ніжняя палова прастакутнік, які мы бачылі 901 00:42:21,000 --> 00:42:22,730 проста імгненне таму. 902 00:42:22,730 --> 00:42:27,600 >> Але чаму я кажу структура вузла * а не толькі вузлом *? 903 00:42:27,600 --> 00:42:31,370 Таму што, калі гэты паказальнік паказвае на адным вузле, гэта проста 904 00:42:31,370 --> 00:42:32,760 адрас вузла. 905 00:42:32,760 --> 00:42:35,630 Гэта ўзгадняецца з таго, што мы абмяркоўвалі аб паказальніках да гэтага часу. 906 00:42:35,630 --> 00:42:39,690 Але чаму, калі я сцвярджаю, гэтая структура называецца вузлом, я павінен сказаць, што структура 907 00:42:39,690 --> 00:42:42,660 вузлом ўнутры тут? 908 00:42:42,660 --> 00:42:43,190 >> Менавіта так. 909 00:42:43,190 --> 00:42:46,490 Гэта свайго роду дурныя рэальнасць C. Вызначэнне тыпу, так бы мовіць, не мае 910 00:42:46,490 --> 00:42:47,220 адбылося. 911 00:42:47,220 --> 00:42:48,510 З супер літаральна. 912 00:42:48,510 --> 00:42:51,050 Яна чытае ваш код зверху ўніз, злева направа. 913 00:42:51,050 --> 00:42:54,930 І, пакуль не сустрэне, што кропка з коскі на Сутнасць, думаю, што не 914 00:42:54,930 --> 00:42:57,590 існаваць як тып дадзеных? 915 00:42:57,590 --> 00:42:59,060 Вузла, у двукоссі вузла. 916 00:42:59,060 --> 00:43:03,050 >> Але з-за больш падрабязны Я зрабіў заяву на першай лініі - 917 00:43:03,050 --> 00:43:05,340 ЬурейеЕ вузла структуры - 918 00:43:05,340 --> 00:43:08,790 таму, што быў на першым месцы, перад фігурныя дужкі, што накшталт як 919 00:43:08,790 --> 00:43:11,800 папярэдняга навучання Clang, што, вы Ведаеце што, дайце мне структуры 920 00:43:11,800 --> 00:43:13,570 называецца структура вузла. 921 00:43:13,570 --> 00:43:16,270 Шчыра кажучы, я не люблю называць рэчы Структура вузла, вузла структуры ўсіх 922 00:43:16,270 --> 00:43:17,090 на працягу ўсёй маёй кода. 923 00:43:17,090 --> 00:43:20,660 Але я буду выкарыстоўваць яго толькі адзін раз, толькі ўнутры, так што я магу эфектыўна 924 00:43:20,660 --> 00:43:25,010 стварыць свайго роду цыклічная спасылка, а ня паказальнік на сябе такой, але 925 00:43:25,010 --> 00:43:29,400 паказальнік на іншы ідэнтычнага тыпу. 926 00:43:29,400 --> 00:43:32,330 >> Вось і атрымліваецца, што ў структуры дадзеных як гэта, ёсць некалькі 927 00:43:32,330 --> 00:43:34,470 аперацыі, якія могуць быць Пытанні, якія цікавяць нас. 928 00:43:34,470 --> 00:43:37,460 Мы, магчыма, захочаце, каб ўставіць у спіс, як гэта. 929 00:43:37,460 --> 00:43:39,850 Мы, магчыма, захочаце выдаліць з спісу, як гэта. 930 00:43:39,850 --> 00:43:43,490 Мы можам захацець пошук у спісе для значэнне, ці ў больш агульным ходу. 931 00:43:43,490 --> 00:43:46,410 І траверс проста мудрагелісты спосаб пачала казаць на левай і перанесьці ўсе 932 00:43:46,410 --> 00:43:47,650 да ўпора направа. 933 00:43:47,650 --> 00:43:52,640 >> І заўважце, нават з гэтым крыху больш складаныя структуры дадзеных, не кажучы 934 00:43:52,640 --> 00:43:56,510 мне прапануюць, каб мы можам пазычаць некаторыя з ідэі ў апошнія два тыдні і 935 00:43:56,510 --> 00:43:58,410 рэалізаваць функцыю называюць пошук, як гэта. 936 00:43:58,410 --> 00:44:01,360 Гэта збіраецца вярнуць сапраўдным або ілжывымі, паказваючы, так ці 937 00:44:01,360 --> 00:44:03,390 Не, N ў спісе. 938 00:44:03,390 --> 00:44:05,960 Другі аргумент з'яўляецца паказальнікам да спісу сабе, так 939 00:44:05,960 --> 00:44:07,920 паказальнік на вузел. 940 00:44:07,920 --> 00:44:10,350 >> Усё, што я збіраюся зрабіць, гэта тое заяўляю часовую зменную. 941 00:44:10,350 --> 00:44:12,730 Мы назавем гэта PTR па пагадненні, для паказальніка. 942 00:44:12,730 --> 00:44:15,220 І я прызначу яго роўным пачатак спісу. 943 00:44:15,220 --> 00:44:16,680 >> А цяпер заўважаю той час цыклу. 944 00:44:16,680 --> 00:44:20,640 Да таго часу, пакуль паказальнік ня роўна да нуля, я збіраюся праверыць. 945 00:44:20,640 --> 00:44:24,520 Ці з'яўляецца стрэлка паказальніка N роўныя N, які быў перададзены ў? 946 00:44:24,520 --> 00:44:26,410 І пачакайце хвіліну - новы частка сінтаксісу. 947 00:44:26,410 --> 00:44:29,324 Што такое стрэлка раптам? 948 00:44:29,324 --> 00:44:30,574 Да? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Менавіта так. 951 00:44:34,810 --> 00:44:38,860 Так у той час як некалькі хвілін таму, мы выкарыстоўвалі кропкавую натацыю для доступу нешта 952 00:44:38,860 --> 00:44:43,080 Ўнутры структуры, калі зменная Вы не структуры 953 00:44:43,080 --> 00:44:47,420 сябе, але паказальнік на структуру, На шчасце, частка сінтаксісу, 954 00:44:47,420 --> 00:44:48,620 нарэшце, мае інтуітыўны сэнс. 955 00:44:48,620 --> 00:44:52,360 Стрэлка азначае ісці за паказальнікам, як нашы стралкі як правіла, азначае 956 00:44:52,360 --> 00:44:56,570 графічна, і сыходзіць у Дадзеныя поля ўнутры. 957 00:44:56,570 --> 00:44:59,700 Так стрэлка тое ж самае, кропка, але вы выкарыстоўваеце яго, калі ў вас ёсць паказальнік. 958 00:44:59,700 --> 00:45:05,270 >> Так проста, каб рэзюмаваць тое, калі поле N Ўнутры структуры, званых паказальнік 959 00:45:05,270 --> 00:45:07,760 роўная роўная N, вярнуцца праўда. 960 00:45:07,760 --> 00:45:11,970 У адваротным выпадку, гэтая лінія тут - паказальнік роўна паказальнік наступнага. 961 00:45:11,970 --> 00:45:17,540 Дык што ж гэта робіць, заўважце, калі я я ў цяперашні час паказвае на структуру 962 00:45:17,540 --> 00:45:21,430 які змяшчае 9 і 9 ня лік Я шукаю - Дапусцім, я шукаю 963 00:45:21,430 --> 00:45:22,830 для N роўная 50 - 964 00:45:22,830 --> 00:45:25,930 Я збіраюся абнавіць свой часовы паказальнік не называць у гэтым вузле 965 00:45:25,930 --> 00:45:31,190 больш, але паказальніка стрэлкі побач, якая збіраецца паставіць мяне сюды. 966 00:45:31,190 --> 00:45:34,270 >> Цяпер я зразумеў, віхор Ўвядзенне. 967 00:45:34,270 --> 00:45:37,380 У сераду, мы на самай справе зрабіць гэта з некаторымі людзьмі і з некаторымі больш 968 00:45:37,380 --> 00:45:38,900 кода ў больш павольным тэмпе. 969 00:45:38,900 --> 00:45:42,990 Але зразумейце, мы зараз робяць нашы дадзеныя больш складаныя структуры, каб нашы 970 00:45:42,990 --> 00:45:45,780 Алгарытмы можаце атрымаць больш эфектыўныя, якія будзе умовай для 971 00:45:45,780 --> 00:45:50,500 PSET шэсць, калі мы загружаем у, зноў жа, тыя, 150000 слоў, але трэба зрабіць так 972 00:45:50,500 --> 00:45:55,650 эфектыўна, і, у ідэале, ствараюць праграма, якая працуе для нашых карыстальнікаў не ў 973 00:45:55,650 --> 00:46:00,460 лінейнай, а не на рускай мове ў квадраце, а ў пастаянны час, у ідэал. 974 00:46:00,460 --> 00:46:02,300 >> Убачымся ў сераду. 975 00:46:02,300 --> 00:46:07,240 >> Слухаюць: На наступным CS50, Дэвід забывае аб сваім базавым варыянце. 976 00:46:07,240 --> 00:46:12,770 >> DAVID малая: І вось як вы пасылаеце тэкставымі паведамленнямі з C. Якія - 977 00:46:12,770 --> 00:46:14,020 >> [Розныя тэкст паведамлення Гукі апавяшчэнняў] 978 00:46:14,020 --> 00:46:19,734