1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Агляд] [Віктарына 0] 2 00:00:03,000 --> 00:00:05,000 >> [Lexi Рос, Томі MacWilliam, Лукас Фрейтас, Іосіф Ong] [Harvard University] 3 00:00:05,000 --> 00:00:08,000 >> [Гэта CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:10,000 >> Прывітанне, усім. 5 00:00:10,000 --> 00:00:15,000 Сардэчна запрашаем на разгляд сесіі Віктарына 0, якое праходзіць у сераду. 6 00:00:15,000 --> 00:00:19,000 Што мы збіраемся рабіць сёння вечарам, я з 3 іншымі ТФ, 7 00:00:19,000 --> 00:00:24,000 і разам мы збіраемся прайсці праз агляд таго, што мы зрабілі ў ходзе гэтага часу. 8 00:00:24,000 --> 00:00:27,000 Гэта не збіраецца быць на 100% ўсёабдымнай, але яна павінна даць вам больш поўнае ўяўленне 9 00:00:27,000 --> 00:00:31,000 аб тым, што ў вас ужо ёсць ўніз і тое, што вы ўсё яшчэ трэба вывучыць, перш чым у сераду. 10 00:00:31,000 --> 00:00:34,000 І не саромейцеся падымаць руку з пытаннямі, калі мы збіраемся разам, 11 00:00:34,000 --> 00:00:38,000 але майце на ўвазе, што мы будзем мець трохі часу ў канцы- 12 00:00:38,000 --> 00:00:41,000 калі мы пройдзем з некалькіх хвілін, каб запасных, каб зрабіць агульныя пытанні, 13 00:00:41,000 --> 00:00:47,000 так што майце гэта на ўвазе, і таму мы збіраемся пачаць у пачатку тыдня з 0. 14 00:00:47,000 --> 00:00:50,000 >> [Віктарына 0 Агляд] [Частка 0] [Lexi Ross] Але перш чым мы гэта зробім, давайце пагаворым аб 15 00:00:50,000 --> 00:00:53,000 матэрыяльна-тэхнічнае забеспячэнне віктарыны. 16 00:00:53,000 --> 00:00:55,000 >> [Лагістыка] [віктарыны адбудзецца ў сераду 10/10 замест лекцыі] 17 00:00:55,000 --> 00:00:57,000 >> [(Гл. http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf падрабязнасці)] Гэта ў сераду, 10 кастрычніка. 18 00:00:57,000 --> 00:01:00,000 >> Вось у гэтую сераду, і калі вы ідзяце на гэты адрас тут, 19 00:01:00,000 --> 00:01:03,000 які таксама даступны з CS50.net-Там спасылка на яго- 20 00:01:03,000 --> 00:01:06,000 Вы можаце ўбачыць інфармацыю аб тым, куды пайсці на аснове 21 00:01:06,000 --> 00:01:10,000 Вашу прозвішча або школу прыналежнасці, а таксама 22 00:01:10,000 --> 00:01:14,000 ён кажа менавіта пра тое, што тэст будзе ахопліваць і тыпаў пытанняў, што вы збіраецеся атрымаць. 23 00:01:14,000 --> 00:01:19,000 Майце на ўвазе, што вы таксама будзеце мець магчымасць прагледзець на віктарыну ў раздзеле 24 00:01:19,000 --> 00:01:21,000 так што вашыя ТФ павінны ісці на некаторыя практыкі праблемы, 25 00:01:21,000 --> 00:01:29,000 і гэта яшчэ адзін добры шанец, каб убачыць, дзе вы ўсё яшчэ трэба вывучыць для віктарыны. 26 00:01:29,000 --> 00:01:32,000 Давайце пачнем з самага пачатку з Б-н-біт. 27 00:01:32,000 --> 00:01:35,000 Памятаеце, як толькі 0 або 1, 28 00:01:35,000 --> 00:01:38,000 і байт ўяўляе сабой набор з 8 гэтых бітаў. 29 00:01:38,000 --> 00:01:42,000 Давайце паглядзім на гэтую калекцыю бітаў прама тут. 30 00:01:42,000 --> 00:01:44,000 Мы павінны быць у стане высветліць, колькі біт ёсць. 31 00:01:44,000 --> 00:01:48,000 Дзе мы разлічваем ёсць толькі 8 з іх восем 0 або 1 шт. 32 00:01:48,000 --> 00:01:51,000 А так як ёсць 8 біт, гэта 1 байт, 33 00:01:51,000 --> 00:01:53,000 і давайце пераўтварыць яго ў шаснаццатковы. 34 00:01:53,000 --> 00:01:58,000 Шаснаццаткавыя з'яўляецца падставай 16, і гэта даволі лёгка пераўтварыць 35 00:01:58,000 --> 00:02:01,000 Лік у двайковай сістэме, якая з'яўляецца, што гэта такое, і іх лік у шаснаццатковае. 36 00:02:01,000 --> 00:02:04,000 Усё, што мы робім, мы глядзім на групы па 4, 37 00:02:04,000 --> 00:02:07,000 і мы канвертаваць іх у адпаведны шаснаццатковы. 38 00:02:07,000 --> 00:02:11,000 Пачнем з самай правай групе 4, таму 0011. 39 00:02:11,000 --> 00:02:16,000 Гэта будзе адна 1 і 1 2, так разам, што робіць 3. 40 00:02:16,000 --> 00:02:19,000 А потым давайце паглядзім на іншы блок 4. 41 00:02:19,000 --> 00:02:24,000 1101. Гэта будзе адна 1, 1 4, і адзін 8. 42 00:02:24,000 --> 00:02:28,000 Разам што гэта будзе 13, што робіць D. 43 00:02:28,000 --> 00:02:32,000 І мы будзем памятаць, што ў шаснаццатковай мы не проста ісці ад 0 да 9. 44 00:02:32,000 --> 00:02:36,000 Мы ідзём ад 0 да F, так што пасля 9, 10 адпавядае, 45 00:02:36,000 --> 00:02:40,000 Ад 11 да B, і гэтак далей, дзе F 15. 46 00:02:40,000 --> 00:02:44,000 Тут 13 ўяўляе сабой D, 47 00:02:44,000 --> 00:02:49,000 так, каб пераўтварыць яго ў дзесятковы усё што мы робім, мы на самай справе 48 00:02:49,000 --> 00:02:52,000 ставіцца адзін да пазіцыі сілы 2. 49 00:02:52,000 --> 00:02:58,000 Гэта адна 1, адна 2, нулявы 4s, 8s нуля, адной 16, і гэтак далей, 50 00:02:58,000 --> 00:03:03,000 і гэта трохі цяжка вылічыць ў вашай галаве, але калі мы ідзем да наступнага слайд 51 00:03:03,000 --> 00:03:05,000 мы бачым, адказ на гэтае пытанне. 52 00:03:05,000 --> 00:03:09,000 >> Па сутнасці, мы збіраемся насупраць права вярнуцца да левых, 53 00:03:09,000 --> 00:03:14,000 і мы памнажаючы кожную лічбу адпаведнай ступенню 2. 54 00:03:14,000 --> 00:03:19,000 І памятайце, для шаснаццатковых пазначыць гэтыя лічбы з 0x ў пачатку 55 00:03:19,000 --> 00:03:23,000 таму мы не блытайце яго з дзесятковы лік. 56 00:03:23,000 --> 00:03:29,000 Працягваючы, гэта ASCII табліцы, 57 00:03:29,000 --> 00:03:35,000 і тое, што мы выкарыстоўваем для ASCII з'яўляецца пераўтварэнне з знакаў у лікавыя значэння. 58 00:03:35,000 --> 00:03:39,000 Памятаеце, у PSET крыптаграфіі мы шырока выкарыстоўвалі ASCII табліцы 59 00:03:39,000 --> 00:03:43,000 Для выкарыстання розных метадаў крыптаграфіі, 60 00:03:43,000 --> 00:03:47,000 Цэзар і шыфр Виженера, канвертаваць розныя літары 61 00:03:47,000 --> 00:03:52,000 У радок у адпаведнасці з ключавымі задаецца карыстачом. 62 00:03:52,000 --> 00:03:56,000 Давайце паглядзім на трохі ASCII матэматыцы. 63 00:03:56,000 --> 00:04:02,000 Гледзячы на ​​'P' + 1, у знакавай форме, якая была б Q, 64 00:04:02,000 --> 00:04:07,000 і памятайце, што '5 '≠ 5. 65 00:04:07,000 --> 00:04:10,000 І як бы мы дакладна канвертаваць паміж гэтымі 2 формы? 66 00:04:10,000 --> 00:04:13,000 Гэта на самай справе не занадта цяжка. 67 00:04:13,000 --> 00:04:16,000 Для таго, каб атрымаць 5 мы адымаем '0 ' 68 00:04:16,000 --> 00:04:20,000 таму што ёсць 5 месцаў паміж '0 'і '5. 69 00:04:20,000 --> 00:04:23,000 Для таго, каб пайсці па іншым шляху, мы проста дадамо 0, 70 00:04:23,000 --> 00:04:25,000 так што гэта накшталт як рэгулярныя арыфметыка. 71 00:04:25,000 --> 00:04:29,000 Толькі памятайце, што, калі нешта двукоссі, гэта характар 72 00:04:29,000 --> 00:04:37,000 і, такім чынам, адпавядае значэнню ў табліцы ASCII. 73 00:04:37,000 --> 00:04:40,000 Перамяшчэнне ў больш агульныя тэмы па інфарматыцы. 74 00:04:40,000 --> 00:04:43,000 Мы даведаліся, што такое алгарытм і як мы выкарыстоўваем праграмаванні 75 00:04:43,000 --> 00:04:45,000 для рэалізацыі алгарытмаў. 76 00:04:45,000 --> 00:04:48,000 Некаторыя прыклады алгарытмаў нешта простае, як 77 00:04:48,000 --> 00:04:51,000 праверкі, ці з'яўляецца лік цотных або няцотных. 78 00:04:51,000 --> 00:04:54,000 Для гэтага памятаеце, што мы мода лік на 2 і праверыць, калі вынік роўны 0. 79 00:04:54,000 --> 00:04:57,000 Калі гэта так, то гэта яшчэ. Калі няма, то гэта дзіўна. 80 00:04:57,000 --> 00:04:59,000 І гэта прыклад сапраўды асноўны алгарытм. 81 00:04:59,000 --> 00:05:02,000 >> Крыху больш складана 1 бінарны пошук, 82 00:05:02,000 --> 00:05:05,000 якія мы разгледзім пазней у аглядзе сесіі. 83 00:05:05,000 --> 00:05:09,000 І праграмаванні тэрмін, які мы выкарыстоўваем для прыняцця алгарытму 84 00:05:09,000 --> 00:05:15,000 і пераўтварэнне яго ў код, кампутар можа чытаць. 85 00:05:15,000 --> 00:05:20,000 2 прыкладу праграмавання Scratch, 86 00:05:20,000 --> 00:05:22,000 што мы і зрабілі ў тыдзень 0. 87 00:05:22,000 --> 00:05:25,000 Нават калі мы на самай справе не ўдрукуешся код гэта спосаб рэалізацыі 88 00:05:25,000 --> 00:05:29,000 Гэты алгарытм, які друкуе нумары 01/10, 89 00:05:29,000 --> 00:05:32,000 і тут мы зрабіць тое ж самае на мове праграмавання Сі. 90 00:05:32,000 --> 00:05:41,000 Гэтыя функцыянальна эквівалентныя, толькі што напісаныя на розных мовах або сінтаксісу. 91 00:05:41,000 --> 00:05:44,000 Затым мы даведаліся пра лагічных выразаў, 92 00:05:44,000 --> 00:05:48,000 і лагічнае з'яўляецца значэнне, якое альбо праўду, альбо ілжыва, 93 00:05:48,000 --> 00:05:51,000 і тут часта лагічныя выразы 94 00:05:51,000 --> 00:05:55,000 Заходзім унутр умовах, так што калі (х ≤ 5), 95 00:05:55,000 --> 00:06:00,000 Ну, мы ўжо ўсталяваныя х = 5, так што ўмова будзе ацаніць, дакладна. 96 00:06:00,000 --> 00:06:03,000 І калі гэта праўда, што код пад ўмова 97 00:06:03,000 --> 00:06:08,000 будзе ацэньвацца з дапамогай кампутара, так што радок будзе друкавацца 98 00:06:08,000 --> 00:06:12,000 на стандартны вывад, а тэрмін ўмова 99 00:06:12,000 --> 00:06:16,000 ставіцца да таго, што знаходзіцца ўнутры дужкі, калі заяву. 100 00:06:16,000 --> 00:06:20,000 Памятаеце, што ўсе аператары. 101 00:06:20,000 --> 00:06:26,000 Памятаеце, што гэта && і | |, калі мы спрабуем аб'яднаць 2 або больш умоў, 102 00:06:26,000 --> 00:06:30,000 Ня === праверыць 2 рэчы роўныя. 103 00:06:30,000 --> 00:06:36,000 Памятаеце, што = для прызначэння ў той час як == гэта лагічны аператар. 104 00:06:36,000 --> 00:06:41,000 ≤, ≥, а затым канчатковы 2 гавораць самі за сябе. 105 00:06:41,000 --> 00:06:45,000 Агульны агляд булевай логікі тут. 106 00:06:45,000 --> 00:06:48,000 І лагічныя выразы таксама з'яўляюцца важнымі ў завесах, 107 00:06:48,000 --> 00:06:50,000 якія мы разгледзім цяпер. 108 00:06:50,000 --> 00:06:56,000 Мы даведаліся аб 3 выгляду завес да гэтага часу ў CS50, бо, у той час як, і зрабіць у той час. 109 00:06:56,000 --> 00:06:59,000 І гэта важна ведаць, што ў той час як для большасці мэтаў 110 00:06:59,000 --> 00:07:02,000 мы сапраўды можам выкарыстоўваць любы тып цыкла ў цэлым 111 00:07:02,000 --> 00:07:06,000 Ёсць пэўныя тыпы мэтаў або агульных заканамернасцяў 112 00:07:06,000 --> 00:07:09,000 у праграмаванні, што канкрэтны заклік да аднаго з гэтых завес 113 00:07:09,000 --> 00:07:13,000 , Якія робяць яго найбольш эфектыўным і элегантным, каб закадаваць яго такім чынам. 114 00:07:13,000 --> 00:07:18,000 Давайце паглядзім, што кожная з гэтых завес, як правіла, выкарыстоўваецца для найбольш часта. 115 00:07:18,000 --> 00:07:21,000 >> У цыкл мы ў цэлым ужо ведаю, колькі разоў мы хочам перабраць. 116 00:07:21,000 --> 00:07:24,000 Гэта тое, што мы ўкладваем у стане. 117 00:07:24,000 --> 00:07:28,000 Бо, я = 0, <10, напрыклад. 118 00:07:28,000 --> 00:07:31,000 Мы ўжо ведаем, што мы хочам зрабіць нешта ў 10 разоў. 119 00:07:31,000 --> 00:07:34,000 Зараз, у той час як цыкл, як правіла, мы не абавязкова 120 00:07:34,000 --> 00:07:36,000 ведаю, колькі разоў мы хочам, каб пятля для запуску. 121 00:07:36,000 --> 00:07:39,000 Але мы ведаем, свайго роду ўмова, што мы хочам, каб 122 00:07:39,000 --> 00:07:41,000 Заўсёды быць сапраўдным або ілжывых заўсёды. 123 00:07:41,000 --> 00:07:44,000 Напрыклад, у той час ўстаноўлена. 124 00:07:44,000 --> 00:07:46,000 Давайце казаць, што гэта лагічная зменная. 125 00:07:46,000 --> 00:07:48,000 Хоць гэта праўда, мы хочам, каб код, каб ацаніць, 126 00:07:48,000 --> 00:07:52,000 так што трохі больш пашыраецца, трохі больш агульнае, чым цыкл, 127 00:07:52,000 --> 00:07:55,000 але любы цыкл можа быць пераўтворана ў той час як пятля. 128 00:07:55,000 --> 00:08:00,000 І, нарэшце, рабіць, пакуль завесы, якая можа быць самая складаная зразумець адразу, 129 00:08:00,000 --> 00:08:04,000 часта выкарыстоўваецца, калі мы хочам ацаніць Спачатку код 130 00:08:04,000 --> 00:08:06,000 Перад Упершыню мы правяраем стан. 131 00:08:06,000 --> 00:08:09,000 Агульны выпадак выкарыстання рабіць падчас цыклу 132 00:08:09,000 --> 00:08:12,000 калі вы хочаце атрымаць карыстацкі ўвод, і вы ведаеце, вы хочаце спытаць карыстальніка 133 00:08:12,000 --> 00:08:15,000 для ўводу крайняй меры адзін раз, але калі яны не даюць вам добрыя ўваходныя адразу 134 00:08:15,000 --> 00:08:18,000 Вы хочаце працягваць прасіць іх, пакуль яны даюць вам добры ўваход. 135 00:08:18,000 --> 00:08:21,000 Гэта самы распаўсюджаны спосаб выкарыстання гэтага час цыклу, 136 00:08:21,000 --> 00:08:23,000 і давайце паглядзім на рэальную структуру гэтых завес. 137 00:08:23,000 --> 00:08:27,000 Як правіла, яны заўсёды імкнуцца прытрымлівацца гэтым патэрны. 138 00:08:27,000 --> 00:08:30,000 >> На цыкл ўнутры вас ёсць 3 кампанента: 139 00:08:30,000 --> 00:08:35,000 ініцыялізацыі, як правіла, нешта накшталт Int я = 0, дзе я ёсць лічыльнік, 140 00:08:35,000 --> 00:08:40,000 стан, у якім мы хочам сказаць, запусціць гэты цыкл, пакуль гэта ўмова застаецца ў сіле, 141 00:08:40,000 --> 00:08:44,000 як я <10, і, нарэшце, абнаўленне, які з'яўляецца, як мы павялічваем 142 00:08:44,000 --> 00:08:47,000 зменная лічыльніка ў кожнай кропцы цыклу. 143 00:08:47,000 --> 00:08:50,000 Звычайная рэч, каб бачыць, што ёсць толькі я + +, 144 00:08:50,000 --> 00:08:52,000 што азначае павялічваць я на 1 кожны раз. 145 00:08:52,000 --> 00:08:55,000 Вы таксама можаце зрабіць нешта накшталт я + = 2, 146 00:08:55,000 --> 00:08:58,000 што азначае, дадайце 2 да я кожны раз вы ідзяце праз пятлю. 147 00:08:58,000 --> 00:09:03,000 І тады зрабіць гэта толькі ставіцца да любой код, які фактычна працуе як частка цыкла. 148 00:09:03,000 --> 00:09:09,000 І на некаторы час цыклу, на гэты раз у нас сапраўды ёсць ініцыялізацыя па-за цыклу, 149 00:09:09,000 --> 00:09:12,000 Так, напрыклад, выкажам здагадку, што мы спрабуем зрабіць тое ж самае тып цыкла, як я толькі што апісаў. 150 00:09:12,000 --> 00:09:16,000 Мы хацелі б сказаць Int = 0 перад пачаткам цыклу. 151 00:09:16,000 --> 00:09:20,000 Тады мы маглі б сказаць, калі я <10 гэтага 152 00:09:20,000 --> 00:09:22,000 гэтак жа блок кода, як і раней, 153 00:09:22,000 --> 00:09:26,000 і на гэты раз абнаўленне часткі кода, напрыклад, я + +, 154 00:09:26,000 --> 00:09:29,000 на самай справе адбываецца ўнутры цыклу. 155 00:09:29,000 --> 00:09:33,000 І, нарэшце, у той час як рабіць, гэта падобна на час цыклу, 156 00:09:33,000 --> 00:09:36,000 але мы павінны памятаць, што код будзе ацэньваць разы 157 00:09:36,000 --> 00:09:40,000 Перад ўмова правяраецца, таму ён робіць нашмат больш сэнсу 158 00:09:40,000 --> 00:09:44,000 калі вы паглядзіце на яе ў парадку зверху ўніз. 159 00:09:44,000 --> 00:09:49,000 У той час як цыкл зрабіць код ацэньвае перш, чым вы нават глядзець на гэты час умовы, 160 00:09:49,000 --> 00:09:55,000 у той час як час цыклу, яна правярае ў першую чаргу. 161 00:09:55,000 --> 00:09:59,000 Заявы і зменныя. 162 00:09:59,000 --> 00:10:04,000 Калі мы хочам стварыць новую зменную, мы спачатку хочам ініцыялізаваць яго. 163 00:10:04,000 --> 00:10:07,000 >> Напрыклад, унутр бар ініцыялізуе зменную бар, 164 00:10:07,000 --> 00:10:10,000 але гэта не дае ёй значэнне, так што значэнне бары цяпер? 165 00:10:10,000 --> 00:10:12,000 Мы не ведаем. 166 00:10:12,000 --> 00:10:14,000 Гэта можа быць нейкая фігня значэнне, якое захоўваецца ў памяці там, 167 00:10:14,000 --> 00:10:16,000 і мы не хочам выкарыстоўваць гэтую зменную 168 00:10:16,000 --> 00:10:19,000 пакуль мы фактычна не даць яму значэння, 169 00:10:19,000 --> 00:10:21,000 такім чынам, мы аб'явім яго тут. 170 00:10:21,000 --> 00:10:24,000 Затым мы ініцыялізуем, што гэта будзе 42 ніжэй. 171 00:10:24,000 --> 00:10:28,000 Цяпер, вядома, мы ведаем, што гэта можа быць зроблена на адной лініі, унутр бар = 42. 172 00:10:28,000 --> 00:10:30,000 Але Проста каб быць ясна некалькіх крокаў, што адбываецца, 173 00:10:30,000 --> 00:10:34,000 Дэкларацыя і ініцыялізацыя адбываецца паасобна. 174 00:10:34,000 --> 00:10:38,000 Гэта адбываецца на адзін крок, і наступны, унутр Баз = бар + 1, 175 00:10:38,000 --> 00:10:44,000 гэта зацвярджэнне ніжэй, якое павялічвае Баз, так што ў канцы гэтага блока кода 176 00:10:44,000 --> 00:10:48,000 калі б мы былі на друк значэнне Баз было б 44 177 00:10:48,000 --> 00:10:52,000 таму што мы аб'явіць і ініцыялізаваць, што гэта будзе 1> бара, 178 00:10:52,000 --> 00:10:58,000 і тады мы павялічваем яго яшчэ раз з + +. 179 00:10:58,000 --> 00:11:02,000 Мы пайшлі на гэта даволі коратка, але гэта добра, каб мець агульнае 180 00:11:02,000 --> 00:11:04,000 разуменне таго, што тэмы і падзеі. 181 00:11:04,000 --> 00:11:06,000 У асноўным мы зрабілі гэта ў Scratch, 182 00:11:06,000 --> 00:11:09,000 так што вы можаце думаць аб тэмы, як некалькі паслядоўнасцяў кода 183 00:11:09,000 --> 00:11:11,000 працуе ў той жа час. 184 00:11:11,000 --> 00:11:14,000 На самай справе, гэта, верагодна, не працуе, у той жа час, 185 00:11:14,000 --> 00:11:17,000 а як бы абстрактна мы можам думаць пра гэта такім чынам. 186 00:11:17,000 --> 00:11:20,000 >> У Scratch, напрыклад, у нас было некалькі спрайт. 187 00:11:20,000 --> 00:11:22,000 Гэта можа быць выкананне іншага кода, у той жа час. 188 00:11:22,000 --> 00:11:26,000 Можна было хадзіць, а другі кажа нешта 189 00:11:26,000 --> 00:11:29,000 У другой частцы экрана. 190 00:11:29,000 --> 00:11:34,000 Падзеі яшчэ адзін спосаб вылучэння логікі 191 00:11:34,000 --> 00:11:37,000 паміж рознымі элементамі кода, 192 00:11:37,000 --> 00:11:40,000 і драпінам, мы змаглі змадэляваць падзеі з дапамогай трансляцыі, 193 00:11:40,000 --> 00:11:43,000 і што на самой справе, калі я атрымліваю, а не калі я чую, 194 00:11:43,000 --> 00:11:47,000 але па сутнасці гэта спосаб перадачы інфармацыі 195 00:11:47,000 --> 00:11:49,000 ад аднаго спрайт на іншы. 196 00:11:49,000 --> 00:11:52,000 Напрыклад, вы можаце перадаць гульню на сябе, 197 00:11:52,000 --> 00:11:56,000 і калі іншы спрайт атрымлівае за гульню, 198 00:11:56,000 --> 00:11:58,000 ён рэагуе пэўным чынам. 199 00:11:58,000 --> 00:12:03,000 Гэта важная мадэль для разумення праграмавання. 200 00:12:03,000 --> 00:12:07,000 Проста перайсці на асноўную тыдзень 0, то, што мы перайшлі да гэтага часу, 201 00:12:07,000 --> 00:12:10,000 давайце паглядзім на гэты просты праграмы на Сі. 202 00:12:10,000 --> 00:12:14,000 Тэкст можа быць трохі невялікім адсюль, але я пайду на гэта вельмі хутка. 203 00:12:14,000 --> 00:12:20,000 Мы ў тым ліку 2 файлы загалоўкаў у верхняй частцы, cs50.h і stdio.h. 204 00:12:20,000 --> 00:12:23,000 Мы тады вызначэнні пастаяннай завецца мяжой у 100. 205 00:12:23,000 --> 00:12:26,000 Мы тады ажыццяўленні нашай галоўнай функцыі. 206 00:12:26,000 --> 00:12:29,000 Так як мы не будзем выкарыстоўваць аргументы каманднага радка тут мы павінны паставіць несапраўднымі 207 00:12:29,000 --> 00:12:32,000 у якасці аргументаў для асноўнага. 208 00:12:32,000 --> 00:12:38,000 Мы бачым Int вышэй асноўнага. Гэта тып якое вяртаецца значэння, таму вяртаць 0 у ніжняй часткі. 209 00:12:38,000 --> 00:12:41,000 І мы выкарыстоўваем CS50 функцыі бібліятэкі атрымліваюць Int 210 00:12:41,000 --> 00:12:45,000 спытаць карыстальніка для ўваходу, і мы захоўваем яго ў гэтай зменнай х, 211 00:12:45,000 --> 00:12:51,000 такім чынам, мы заяўляем х вышэй, і мы ініцыялізаваць яго з х = GetInt. 212 00:12:51,000 --> 00:12:53,000 >> Затым мы правяраем, калі карыстальнік даў нам добры ўваход. 213 00:12:53,000 --> 00:12:59,000 Калі гэта ≥ LIMIT мы хочам вярнуць код памылкі 1 і друкаваць паведамленне пра памылку. 214 00:12:59,000 --> 00:13:02,000 І, нарэшце, калі карыстальнік даў нам добры ўваход 215 00:13:02,000 --> 00:13:08,000 мы збіраемся ўзвесці ў квадрат ліку і раздрукаваць гэты вынік. 216 00:13:08,000 --> 00:13:11,000 Проста каб пераканацца, што тыя ўсе хіт дадому 217 00:13:11,000 --> 00:13:17,000 Вы можаце бачыць этыкеткі розных частак кода тут. 218 00:13:17,000 --> 00:13:19,000 Я згадваў пастаянна, файлы загалоўкаў. 219 00:13:19,000 --> 00:13:21,000 О, Int х. Пераканайцеся ў тым, памятаеце, што гэта лакальная зменная. 220 00:13:21,000 --> 00:13:24,000 Гэта кантрастуе яго ад глабальных зменных, якія мы будзем казаць пра 221 00:13:24,000 --> 00:13:27,000 Крыху пазней у аглядзе сесіі 222 00:13:27,000 --> 00:13:30,000 і мы заклікаем бібліятэчныя функцыі Printf, 223 00:13:30,000 --> 00:13:34,000 так што, калі б мы не ўключылі загалоўкавых файл stdio.h 224 00:13:34,000 --> 00:13:37,000 мы не былі б у стане назваць Printf. 225 00:13:37,000 --> 00:13:42,000 І я лічу, што стрэлка, якая атрымала адрэзаць тут паказвае на% D, 226 00:13:42,000 --> 00:13:45,000 якая з'яўляецца фарматавання радкі ў Printf. 227 00:13:45,000 --> 00:13:52,000 Ён кажа, раздрукуйце гэтую зменную як лік,% D. 228 00:13:52,000 --> 00:13:58,000 І гэта ўсё за тыдзень 0. 229 00:13:58,000 --> 00:14:06,000 Цяпер Лукас мае намер працягваць. 230 00:14:06,000 --> 00:14:08,000 Гэй, хлопцы. Мяне клічуць Лукас. 231 00:14:08,000 --> 00:14:10,000 Я на другім курсе ў лепшым доме на тэрыторыі кампуса, Mather, 232 00:14:10,000 --> 00:14:14,000 і я хачу пагаварыць трохі аб тыдзень 1 і 2,1. 233 00:14:14,000 --> 00:14:16,000 [Тыдзень 1 і 2,1!] [Лукас Фрейтас] 234 00:14:16,000 --> 00:14:19,000 Як Lexi казаў, калі мы пачалі перакладаць код з нуля C 235 00:14:19,000 --> 00:14:23,000 адна з рэчаў, якія мы заўважылі, што вы не можаце проста 236 00:14:23,000 --> 00:14:26,000 напісаць свой код і запусціць яго з дапамогай зялёнага сцяга больш. 237 00:14:26,000 --> 00:14:30,000 На самай справе, вы павінны выкарыстоўваць некаторыя крокі, каб зрабіць вашу праграму C 238 00:14:30,000 --> 00:14:33,000 сталі выкананы файл. 239 00:14:33,000 --> 00:14:36,000 У асноўным, што вы робіце, калі вы пішаце праграмы з'яўляецца тое, што 240 00:14:36,000 --> 00:14:40,000 Вы перакладаеце вашыя ідэі на мову, кампілятар можа зразумець, 241 00:14:40,000 --> 00:14:44,000 таму, калі вы пішаце праграму ў C 242 00:14:44,000 --> 00:14:47,000 што вы робіце на самай справе нешта пісаў, што кампілятар будзе разумець, 243 00:14:47,000 --> 00:14:50,000 , А затым кампілятар збіраецца перавесці гэты код 244 00:14:50,000 --> 00:14:53,000 у тое, што ваш кампутар будзе разумець. 245 00:14:53,000 --> 00:14:55,000 >> А справа ў тым, кампутар на самай справе вельмі па-дурному. 246 00:14:55,000 --> 00:14:57,000 Ваш кампутар можа зразумець толькі 0 і 1, 247 00:14:57,000 --> 00:15:01,000 так на самай справе ў першыя кампутары звычайна людзі запраграмаваныя 248 00:15:01,000 --> 00:15:04,000 выкарыстанне 0 і 1, але не больш, дзякуй Богу. 249 00:15:04,000 --> 00:15:07,000 Мы не трэба запамінаць паслядоўнасці 0 і 1 250 00:15:07,000 --> 00:15:10,000 за цыкл або цыкл, пакуль і так далей. 251 00:15:10,000 --> 00:15:13,000 Вось чаму ў нас ёсць кампілятар. 252 00:15:13,000 --> 00:15:17,000 Які кампілятар робіць гэта ў асноўным перакладае код C, 253 00:15:17,000 --> 00:15:21,000 У нашым выпадку, да мовы, што ваш кампутар будзе разумець, 254 00:15:21,000 --> 00:15:25,000 якая з'яўляецца аб'ектны код, а кампілятар, які мы выкарыстоўваем 255 00:15:25,000 --> 00:15:30,000 называецца звон, так што гэта на самай справе сімвал ляск. 256 00:15:30,000 --> 00:15:33,000 Калі ў вас ёсць праграма, што вам трэба зрабіць 2 рэчы. 257 00:15:33,000 --> 00:15:37,000 Па-першае, вы павінны кампіляваць вашу праграму, а затым вы збіраецеся запусціць праграму. 258 00:15:37,000 --> 00:15:41,000 Для кампіляцыі праграмы ў вас ёсць шмат варыянтаў, каб зрабіць гэта. 259 00:15:41,000 --> 00:15:44,000 Першы рабіць ляск program.c 260 00:15:44,000 --> 00:15:47,000 У якой праграме гэта назва вашай праграмы. 261 00:15:47,000 --> 00:15:51,000 У гэтым выпадку вы можаце бачыць, што яны проста кажуць: "Гэй, кампіляцыі маёй праграмы". 262 00:15:51,000 --> 00:15:56,000 Вы не кажаце "я хачу гэта назва для маёй праграмы", ці нічога. 263 00:15:56,000 --> 00:15:58,000 >> Другі варыянт дае назву вашай праграмы. 264 00:15:58,000 --> 00:16:02,000 Можна сказаць, ляск-O, а затым імя, якое вы хочаце 265 00:16:02,000 --> 00:16:06,000 выкананы файл будзе называцца, як і program.c. 266 00:16:06,000 --> 00:16:11,000 І вы таксама можаце зрабіць зрабіць праграму, і паглядзець, як у першых 2-х выпадках 267 00:16:11,000 --> 00:16:15,000 Я стаўлю. С, а ў трэцім ў мяне толькі праграмы? 268 00:16:15,000 --> 00:16:18,000 Так, вы на самой справе не варта ставіць. З, калі вы выкарыстоўваеце зрабіць. 269 00:16:18,000 --> 00:16:22,000 У адваротным выпадку кампілятар на самай справе адбываецца, каб крычаць на вас. 270 00:16:22,000 --> 00:16:24,000 А таксама, я не ведаю, калі вы, хлопцы, памятаеце, 271 00:16:24,000 --> 00:16:29,000 але шмат раз мы таксама выкарысталі lcs50-ці-лм. 272 00:16:29,000 --> 00:16:31,000 Гэта называецца сувязяў. 273 00:16:31,000 --> 00:16:35,000 Ён проста паведамляе кампілятару, што вы будзеце выкарыстоўваць гэтыя бібліятэкі тут жа, 274 00:16:35,000 --> 00:16:39,000 так што калі вы хочаце выкарыстоўваць cs50.h вы на самой справе павінны ўвесці 275 00:16:39,000 --> 00:16:43,000 ляск program.c-lcs50. 276 00:16:43,000 --> 00:16:45,000 Калі вы не зробіце гэтага, кампілятар не будзе ведаць, 277 00:16:45,000 --> 00:16:50,000 што вы выкарыстоўваеце гэтыя функцыі ў cs50.h. 278 00:16:50,000 --> 00:16:52,000 І калі вы хочаце запусціць вашу праграму ў вас ёсць 2 варыянты. 279 00:16:52,000 --> 00:16:57,000 Калі вы зрабілі ляск program.c Вы не даць назву вашай праграмы. 280 00:16:57,000 --> 00:17:01,000 Вы павінны запусціць яго з дапамогай. / A.out. 281 00:17:01,000 --> 00:17:06,000 A.out з'яўляецца стандартным імем, ляск дае вашай праграме, калі вы не даеце яму імя. 282 00:17:06,000 --> 00:17:11,000 У адваротным выпадку вы збіраецеся рабіць. / Праграма, калі вы далі назву вашай праграмы, 283 00:17:11,000 --> 00:17:15,000 а таксама, калі вы рабілі праграму імя, якое праграма будзе атрымаць 284 00:17:15,000 --> 00:17:23,000 ўжо будзе запраграмаваны тым жа імем, што і файл з. 285 00:17:23,000 --> 00:17:26,000 Тады мы гаварылі пра тыпы дадзеных і дадзеных. 286 00:17:26,000 --> 00:17:31,000 >> Асноўным тыпаў дадзеных адны і тыя ж рэчы, як маленькія скрыначкі яны выкарыстоўваюць 287 00:17:31,000 --> 00:17:35,000 для захоўвання значэнняў, так што тыпы дадзеных на самай справе так жа, як покемонов. 288 00:17:35,000 --> 00:17:39,000 Яны бываюць розных памераў і тыпаў. 289 00:17:39,000 --> 00:17:43,000 Я не ведаю, што аналогія мае сэнс. 290 00:17:43,000 --> 00:17:46,000 Памер дадзеных на самай справе залежыць ад архітэктуры машыны. 291 00:17:46,000 --> 00:17:49,000 Усе дадзеныя памераў, што я збіраюся паказаць тут 292 00:17:49,000 --> 00:17:53,000 на самай справе для 32-бітных машын, якія ў выпадку нашага прыбора, 293 00:17:53,000 --> 00:17:56,000 Але калі вы на самой справе кадавання вашага Mac або Windows, у таксама 294 00:17:56,000 --> 00:17:59,000 верагодна, вы будзеце мець 64-разрадныя машыны, 295 00:17:59,000 --> 00:18:03,000 так што не забудзьцеся, што дадзеныя памеры, якія я збіраюся паказаць тут 296 00:18:03,000 --> 00:18:06,000 прызначаны для 32-разрадных машын. 297 00:18:06,000 --> 00:18:08,000 Першае, што мы ўбачылі, было INT, 298 00:18:08,000 --> 00:18:10,000 які з'яўляецца даволі простым. 299 00:18:10,000 --> 00:18:13,000 Вы можаце выкарыстоўваць Int для захоўвання цэлага ліку. 300 00:18:13,000 --> 00:18:16,000 Мы таксама бачылі сімвал, знак. 301 00:18:16,000 --> 00:18:20,000 Калі вы жадаеце выкарыстоўваць літары або знака мала вы, верагодна, будзеце выкарыстоўваць знак. 302 00:18:20,000 --> 00:18:26,000 Сімвал мае 1 байт, што азначае 8 біт, як сказала лексем. 303 00:18:26,000 --> 00:18:31,000 У асноўным мы павінны ASCII табліцы, што мае 256 304 00:18:31,000 --> 00:18:34,000 магчымыя камбінацыі 0 і 1, 305 00:18:34,000 --> 00:18:37,000 , А затым, калі вы ўводзіце сімвал ён збіраецца перакладаць 306 00:18:37,000 --> 00:18:44,000 сімвал, які вы уваходаў нумар, які вы маеце на ASCII табліцы, як лексем сказала. 307 00:18:44,000 --> 00:18:48,000 У нас таксама ёсць паплавок, які мы выкарыстоўваем для захоўвання дзесятковых лікаў. 308 00:18:48,000 --> 00:18:53,000 Калі вы жадаеце абраць 3.14, напрыклад, вы збіраецеся выкарыстоўваць паплавок 309 00:18:53,000 --> 00:18:55,000 ці двайны, які мае больш дакладнасці. 310 00:18:55,000 --> 00:18:57,000 Паплавок мае 4 байт. 311 00:18:57,000 --> 00:19:01,000 Падвойнае мае 8 байт, таму розніца толькі ў тым дакладнасцю. 312 00:19:01,000 --> 00:19:04,000 У нас таксама ёсць доўгі, які выкарыстоўваецца для цэлых лікаў, 313 00:19:04,000 --> 00:19:09,000 і вы можаце бачыць на 32-бітнай машыне Int і доўгі маюць аднолькавы памер, 314 00:19:09,000 --> 00:19:13,000 такім чынам, гэта сапраўды не мае сэнсу выкарыстоўваць доўгі ў 32-бітнай машыне. 315 00:19:13,000 --> 00:19:17,000 >> Але калі вы выкарыстоўваеце Mac і 64-разрадных машын, на самай справе даўно мае памер 8, 316 00:19:17,000 --> 00:19:19,000 так што гэта сапраўды залежыць ад архітэктуры. 317 00:19:19,000 --> 00:19:22,000 Для 32-бітнай машыне ён не мае сэнсу выкарыстоўваць доўгі рэчаіснасці. 318 00:19:22,000 --> 00:19:25,000 А потым доўга-доўга, з другога боку, мае 8 байт, 319 00:19:25,000 --> 00:19:30,000 так што гэта вельмі добра, калі вы хочаце мець больш цэлага. 320 00:19:30,000 --> 00:19:34,000 І, нарэшце, у нас ёсць радок, якая з'яўляецца на самай справе сімвал *, 321 00:19:34,000 --> 00:19:37,000 , Які з'яўляецца паказальнікам на знак. 322 00:19:37,000 --> 00:19:40,000 Гэта вельмі лёгка думаць, што памер радка будзе, як 323 00:19:40,000 --> 00:19:42,000 Колькасць знакаў, якія ў вас там, 324 00:19:42,000 --> 00:19:45,000 але на самой справе сімвал * сама 325 00:19:45,000 --> 00:19:49,000 мае памер паказальніка на знак, які складае 4 байта. 326 00:19:49,000 --> 00:19:52,000 Памер сімвал * 4 байта. 327 00:19:52,000 --> 00:19:56,000 Гэта не мае значэння, калі ў вас ёсць невялікі словам ці лістом ці нічога. 328 00:19:56,000 --> 00:19:58,000 Гэта будзе 4 байт. 329 00:19:58,000 --> 00:20:01,000 Мы таксама даведаліся трохі аб ліцця, 330 00:20:01,000 --> 00:20:04,000 так як вы можаце бачыць, калі ў вас, напрыклад, праграму, якая кажа 331 00:20:04,000 --> 00:20:08,000 Int х = 3, а затым Е ("% D", х / 2) 332 00:20:08,000 --> 00:20:12,000 вы, хлопцы, ведаеце, што ён збіраецца друкаваць на экране? 333 00:20:12,000 --> 00:20:14,000 >> Хтосьці? >> [Студэнты] 2. 334 00:20:14,000 --> 00:20:16,000 1. >> 1, так. 335 00:20:16,000 --> 00:20:20,000 Калі вы робіце 3/2 ён збіраецца атрымаць 1,5, 336 00:20:20,000 --> 00:20:24,000 але так як мы выкарыстоўваем цэлае яна збіраецца ігнараваць дробавай часткі, 337 00:20:24,000 --> 00:20:26,000 і вы будзеце мець 1. 338 00:20:26,000 --> 00:20:29,000 Калі вы не хочаце, каб гэта здарылася, што вы можаце зрабіць, напрыклад, 339 00:20:29,000 --> 00:20:33,000 гэта аб'явіць паплавок у = х. 340 00:20:33,000 --> 00:20:40,000 Тады х, што раней было 3, цяпер будзе 3,000 у год. 341 00:20:40,000 --> 00:20:44,000 І тады вы можаце друкаваць у / 2. 342 00:20:44,000 --> 00:20:50,000 На самай справе, я павінен мець 2. там. 343 00:20:50,000 --> 00:20:55,000 Ён збіраецца зрабіць 3.00/2.00, 344 00:20:55,000 --> 00:20:58,000 і вы будзеце атрымліваць 1,5. 345 00:20:58,000 --> 00:21:06,000 А ў нас гэта 0,2 F проста пытацца 2 дзесятковых адзінак у дзесятковай часткі. 346 00:21:06,000 --> 00:21:12,000 Калі ў вас ёсць 0,3 F, што гэта будзе мець на самай справе 1.500. 347 00:21:12,000 --> 00:21:16,000 Калі гэта 2 гэта будзе 1,50. 348 00:21:16,000 --> 00:21:18,000 У нас таксама ёсць гэта ў дадзеным выпадку. 349 00:21:18,000 --> 00:21:22,000 Калі вы паплавок х = 3,14, і тады вы Printf х 350 00:21:22,000 --> 00:21:24,000 Вы збіраецеся атрымаць 3,14. 351 00:21:24,000 --> 00:21:29,000 І калі вы робіце х = Int х, 352 00:21:29,000 --> 00:21:34,000 , Што азначае лячэнне х у выглядзе цэлага ліку і друку х зараз 353 00:21:34,000 --> 00:21:36,000 Вы будзеце мець 3,00. 354 00:21:36,000 --> 00:21:38,000 Ці мае гэта сэнс? 355 00:21:38,000 --> 00:21:41,000 Таму што вы першы лячэнні х як цэлае, так што вы не звяртаючы ўвагі на дробавыя частка, 356 00:21:41,000 --> 00:21:45,000 а затым вы друкуеце х. 357 00:21:45,000 --> 00:21:47,000 І, нарэшце, вы таксама можаце зрабіць гэта, 358 00:21:47,000 --> 00:21:52,000 Int х = 65, а затым аб'явіць сімвал з = х, 359 00:21:52,000 --> 00:21:56,000 а затым, калі вы друкуеце з вы на самой справе збіраецеся атрымаць 360 00:21:56,000 --> 00:21:59,000 , Таму ў асноўным тое, што вы тут робіце 361 00:21:59,000 --> 00:22:02,000 перакладае цэлае лік у знак, 362 00:22:02,000 --> 00:22:05,000 як ASCII табліцы робіць. 363 00:22:05,000 --> 00:22:08,000 Мы таксама казалі пра матэматыцы аператараў. 364 00:22:08,000 --> 00:22:14,000 Большасць з іх даволі простыя, таму +, -, *, /, 365 00:22:14,000 --> 00:22:20,000 а таксама мы гаварылі пра моду, якая з'яўляецца рэшту ад дзялення 2-х нумароў. 366 00:22:20,000 --> 00:22:23,000 Калі ў вас ёсць 10% 3, напрыклад, 367 00:22:23,000 --> 00:22:27,000 гэта азначае, падзеліце 10 на 3, а што астатнія? 368 00:22:27,000 --> 00:22:30,000 Гэта будзе 1, так што гэта на самай справе вельмі карысна для многіх праграм. 369 00:22:30,000 --> 00:22:38,000 Для Виженера і Цэзара я ўпэўнены, што ўсе вы, хлопцы выкарыстоўвалі мод. 370 00:22:38,000 --> 00:22:43,000 Аб матэматычныя аператары, будзьце вельмі асцярожныя пры камбінаванні * і /. 371 00:22:43,000 --> 00:22:48,000 >> Напрыклад, калі вы робіце (3/2) * 2, што вы збіраецеся атрымаць? 372 00:22:48,000 --> 00:22:50,000 [Студэнты] 2. 373 00:22:50,000 --> 00:22:54,000 Так, 2, так як 3/2 будзе 1,5, 374 00:22:54,000 --> 00:22:57,000 але так як вы робіце аперацыі паміж 2 цэлых лікаў 375 00:22:57,000 --> 00:22:59,000 на самай справе вы толькі збіраецеся лічыць 1, 376 00:22:59,000 --> 00:23:03,000 і 1 * 2 будзе 2, так што будзьце вельмі, вельмі асцярожныя 377 00:23:03,000 --> 00:23:07,000 калі рабіць арыфметычныя дзеянні з цэлымі лікамі, таму што 378 00:23:07,000 --> 00:23:12,000 Вы маглі б атрымаць, што 2 = 3, у гэтым выпадку. 379 00:23:12,000 --> 00:23:14,000 А таксама быць вельмі асцярожным прыярытэт. 380 00:23:14,000 --> 00:23:21,000 Вы павінны звычайна выкарыстоўваць дужкі, каб быць упэўненым, што вы ведаеце, што вы робіце. 381 00:23:21,000 --> 00:23:27,000 Некаторыя карысныя цэтлікі, вядома, адзін я + + ці я + = 1 382 00:23:27,000 --> 00:23:30,000 або з дапамогай + =. 383 00:23:30,000 --> 00:23:34,000 Гэта тое ж самае, што рабіў I = I + 1. 384 00:23:34,000 --> 00:23:39,000 Вы таксама можаце зрабіць я - ці я - = 1, 385 00:23:39,000 --> 00:23:42,000 што тое ж самае, што і I = -1, 386 00:23:42,000 --> 00:23:46,000 нешта вы, хлопцы выкарыстоўваюць шмат у цыклы, па меншай меры. 387 00:23:46,000 --> 00:23:52,000 Акрамя таго, для *, калі вы выкарыстоўваеце * = і, калі вы, напрыклад, 388 00:23:52,000 --> 00:23:57,000 я * = 2, тое ж самае, кажучы, што я = I * 2, 389 00:23:57,000 --> 00:23:59,000 і тое ж самае для дзялення. 390 00:23:59,000 --> 00:24:08,000 Калі ў вас у / = 2 гэта тое ж самае, што я = я / 2. 391 00:24:08,000 --> 00:24:10,000 >> Зараз аб функцыях. 392 00:24:10,000 --> 00:24:13,000 Вы, хлопцы даведаліся, што функцыі з'яўляюцца вельмі добрай стратэгіяй для захавання кода 393 00:24:13,000 --> 00:24:16,000 у той час як вы программируете, таму, калі вы хочаце выканаць тую ж задачу 394 00:24:16,000 --> 00:24:20,000 у код зноў і зноў, верагодна, вы хочаце выкарыстоўваць функцыю 395 00:24:20,000 --> 00:24:25,000 проста так вам не прыйдзецца скапіяваць і ўставіць код зноў і зноў. 396 00:24:25,000 --> 00:24:28,000 На самай справе, асноўная функцыя, і калі я пакажу вам фармат функцыі 397 00:24:28,000 --> 00:24:32,000 Вы ўбачыце, што гэта даволі відавочна. 398 00:24:32,000 --> 00:24:35,000 Мы таксама выкарыстоўваем некаторыя функцыі з бібліятэкі, 399 00:24:35,000 --> 00:24:39,000 Напрыклад, Printf, Getin, што з бібліятэкі CS50, 400 00:24:39,000 --> 00:24:43,000 і іншыя функцыі, такія як ToUpper. 401 00:24:43,000 --> 00:24:46,000 Усе гэтыя функцыі рэалізуюцца на практыцы ў іншых бібліятэках, 402 00:24:46,000 --> 00:24:49,000 і калі вы змясціць гэтыя файлы троса ў пачатку вашай праграмы 403 00:24:49,000 --> 00:24:53,000 Вы кажаце, не маглі б вы даць мне код для гэтых функцый 404 00:24:53,000 --> 00:24:57,000 так што я не павінна рэалізоўваць іх самастойна? 405 00:24:57,000 --> 00:25:00,000 Таксама вы можаце напісаць свае ўласныя функцыі, таму, калі вы пачынаеце праграмаванне 406 00:25:00,000 --> 00:25:04,000 Вы разумееце, што бібліятэкі ня маюць усе функцыі, якія вам трэба. 407 00:25:04,000 --> 00:25:10,000 За апошнія PSET, напрыклад, мы пісалі маляваць, барацьба і пошук, 408 00:25:10,000 --> 00:25:13,000 , І гэта вельмі, вельмі важна, каб мець магчымасць пісаць функцыі 409 00:25:13,000 --> 00:25:17,000 таму што яны карысныя, і мы выкарыстоўваем іх увесь час у праграмаванні, 410 00:25:17,000 --> 00:25:19,000 і гэта эканоміць шмат кода. 411 00:25:19,000 --> 00:25:21,000 Фармат функцыі гэтага. 412 00:25:21,000 --> 00:25:24,000 У нас ёсць вяртаецца тыпу ў самым пачатку. Які тып якое вяртаецца значэння? 413 00:25:24,000 --> 00:25:27,000 Гэта проста, калі ваша функцыя будзе вяртаць. 414 00:25:27,000 --> 00:25:29,000 Калі ў вас ёсць функцыя, напрыклад, фактарнага, 415 00:25:29,000 --> 00:25:31,000 , Якая будзе вылічаць факториал цэлага ліку, 416 00:25:31,000 --> 00:25:34,000 верагодна, ён збіраецца вяртаць цэлы лік, таксама. 417 00:25:34,000 --> 00:25:37,000 Тады вяртаецца тыпу будзе Int. 418 00:25:37,000 --> 00:25:41,000 Printf на самай справе мае пустэчу вяртаецца тыпу 419 00:25:41,000 --> 00:25:43,000 таму што вы не вяртаецца нічога. 420 00:25:43,000 --> 00:25:45,000 Ты проста друкаваць рэчы на ​​экране 421 00:25:45,000 --> 00:25:48,000 і выхад з функцыі пасля гэтага. 422 00:25:48,000 --> 00:25:51,000 Тады ў вас ёсць імя функцыі, якія вы можаце абраць. 423 00:25:51,000 --> 00:25:55,000 Вы павінны быць трохі разумныя, як не выбіраюць імя, як XYZ 424 00:25:55,000 --> 00:25:58,000 або як х2. 425 00:25:58,000 --> 00:26:02,000 Паспрабуйце зрабіць сабе імя, якое мае сэнс. 426 00:26:02,000 --> 00:26:04,000 >> Напрыклад, калі гэта факториал, скажам факториал. 427 00:26:04,000 --> 00:26:08,000 Калі гэта функцыя, якая будзе маляваць нешта, назавіце яго маляваць. 428 00:26:08,000 --> 00:26:11,000 І тады ў нас ёсць параметры, якія таксама называюцца аргументамі, 429 00:26:11,000 --> 00:26:14,000 , Якія, як рэсурсы, што ваша функцыя павінна 430 00:26:14,000 --> 00:26:17,000 з вашага кода для выканання сваіх задач. 431 00:26:17,000 --> 00:26:20,000 Калі вы хочаце, каб вылічыць факториал ліку 432 00:26:20,000 --> 00:26:23,000 верагодна, у Вас павінен быць побач, каб вылічыць факториал. 433 00:26:23,000 --> 00:26:27,000 Адзін з аргументаў, якія вы збіраецеся ёсць, сам нумар. 434 00:26:27,000 --> 00:26:31,000 І тады гэта будзе нешта рабіць, і вяртаць значэнне ў канцы 435 00:26:31,000 --> 00:26:35,000 калі гэта не пустэча функцыі. 436 00:26:35,000 --> 00:26:37,000 Давайце паглядзім на прыкладзе. 437 00:26:37,000 --> 00:26:40,000 Калі я хачу напісаць функцыю, якая сумуе ўсе лікі ў масіў цэлых лікаў, 438 00:26:40,000 --> 00:26:43,000 Перш за ўсё, вяртаецца тыпу будзе Int 439 00:26:43,000 --> 00:26:46,000 таму што ў мяне ёсць масіў цэлых лікаў. 440 00:26:46,000 --> 00:26:51,000 І тады я буду мець імя функцыі, як sumArray, 441 00:26:51,000 --> 00:26:54,000 а затым ён збіраецца ўзяць сам масіў, у цэлае НУМС, 442 00:26:54,000 --> 00:26:58,000 , А затым даўжыню масіва, таму я ведаю, як шмат лікаў, у мяне падвесці. 443 00:26:58,000 --> 00:27:02,000 Тады ў мяне ёсць для ініцыялізацыі зменнай называюць суму, напрыклад, 0, 444 00:27:02,000 --> 00:27:08,000 і кожны раз, калі я бачу элемент у масіве я павінен дадаць яго ў суму, таму я зрабіў цыкл. 445 00:27:08,000 --> 00:27:15,000 Гэтак жа, як лексем сказала, вы робіце Int я = 0, <даўжыня і я + +. 446 00:27:15,000 --> 00:27:20,000 І для кожнага элемента ў масіве я зрабіў суму + = НУМС [я], 447 00:27:20,000 --> 00:27:24,000 а потым я вярнуўся суму, так што гэта вельмі проста, і гэта эканоміць шмат кода 448 00:27:24,000 --> 00:27:28,000 калі вы выкарыстоўваеце гэтую функцыю шмат разоў. 449 00:27:28,000 --> 00:27:32,000 Затым мы разгледзелі ўмовы. 450 00:27:32,000 --> 00:27:38,000 У нас, калі, яшчэ, і яшчэ, калі. 451 00:27:38,000 --> 00:27:42,000 Давайце паглядзім, у чым розніца паміж тымі, хто. 452 00:27:42,000 --> 00:27:45,000 Зірніце на гэтыя 2 коды. У чым розніца паміж імі? 453 00:27:45,000 --> 00:27:49,000 Першая была ў асноўным-коды хачу, каб ты 454 00:27:49,000 --> 00:27:51,000 калі лік +, - або 0. 455 00:27:51,000 --> 00:27:55,000 Першы кажа, што калі ён> 0, то гэта станоўча. 456 00:27:55,000 --> 00:28:00,000 Калі гэта = 0, то гэта 0, а калі <0, то гэта адмоўна. 457 00:28:00,000 --> 00:28:04,000 >> А іншы робіць, калі, інакш, калі іншае. 458 00:28:04,000 --> 00:28:07,000 Розніца паміж імі складаецца ў тым, што гэты чалавек на самай справе збіраецца 459 00:28:07,000 --> 00:28:13,000 праверыць, калі> 0, <0 = 0 або тры разы, 460 00:28:13,000 --> 00:28:17,000 так што калі ў вас ёсць нумар 2, напрыклад, ён збіраецца прыехаць сюды і сказаць: 461 00:28:17,000 --> 00:28:21,000 Калі (X> 0), і ён скажа так, так я друкаваць станоўчыя. 462 00:28:21,000 --> 00:28:25,000 Але, хоць я ведаю, што гэта> 0, і ён не збіраецца быць 0 або <0 463 00:28:25,000 --> 00:28:29,000 Я ўсё яшчэ збіраюся рабіць гэта 0, то <0, 464 00:28:29,000 --> 00:28:33,000 так што я на самой справе адбываецца ўнутры IFS, што я не павінна 465 00:28:33,000 --> 00:28:38,000 таму што я ўжо ведаю, што ён не збіраецца, каб задаволіць любое з гэтых умоў. 466 00:28:38,000 --> 00:28:41,000 Я магу выкарыстоўваць, калі, інакш, калі іншае заяву. 467 00:28:41,000 --> 00:28:45,000 Гэта ў асноўным кажа, што калі х = 0 надрукаваць станоўчыя. 468 00:28:45,000 --> 00:28:48,000 Калі гэта не так, я буду таксама праверыць гэта. 469 00:28:48,000 --> 00:28:51,000 Калі гэта 2 не я збіраюся гэта зрабіць. 470 00:28:51,000 --> 00:28:54,000 У прынцыпе, калі ў мяне было х = 2 вы маглі б сказаць 471 00:28:54,000 --> 00:28:57,000 Калі (X> 0), так, так друкаваць. 472 00:28:57,000 --> 00:29:00,000 Цяпер, калі я ведаю, што гэта> 0 і што ён задаволены першым, калі 473 00:29:00,000 --> 00:29:02,000 Я нават не збіраюся запусціць гэты код. 474 00:29:02,000 --> 00:29:09,000 Код працуе хутчэй, на самай справе, у 3 разы хутчэй, калі вы выкарыстоўваеце гэта. 475 00:29:09,000 --> 00:29:11,000 Мы таксама даведаліся пра і і або. 476 00:29:11,000 --> 00:29:15,000 Я не збіраюся прайсці праз гэта, таму што лексем ўжо казалі пра іх. 477 00:29:15,000 --> 00:29:17,000 Гэта проста && і | | аператара. 478 00:29:17,000 --> 00:29:21,000 >> Адзінае, што я скажу, будзьце асцярожныя, калі ў вас ёсць 3 ўмовы. 479 00:29:21,000 --> 00:29:24,000 Выкарыстоўвайце дужкі, таму што гэта вельмі заблытаным, калі ў Вас ёсць умова 480 00:29:24,000 --> 00:29:27,000 і яшчэ адно ці іншае. 481 00:29:27,000 --> 00:29:30,000 Выкарыстоўвайце дужкі проста каб быць упэўненым, што вашы ўмовы сэнсу 482 00:29:30,000 --> 00:29:34,000 таму што ў гэтым выпадку, напрыклад, вы можаце сабе ўявіць, што 483 00:29:34,000 --> 00:29:38,000 гэта можа быць першым умовай і адным ці іншым 484 00:29:38,000 --> 00:29:41,000 або 2 ўмовы аб'яднаных ў і 485 00:29:41,000 --> 00:29:45,000 або трэцяе, так што будзьце асцярожныя. 486 00:29:45,000 --> 00:29:48,000 І, нарэшце, мы гаварылі пра камутатарах. 487 00:29:48,000 --> 00:29:53,000 Выключальнік вельмі карысна, калі ў вас ёсць пераменная. 488 00:29:53,000 --> 00:29:55,000 Давайце выкажам здагадку, што ў вас ёсць зменная, як п 489 00:29:55,000 --> 00:29:59,000 што можа быць 0, 1 або 2, і для кожнага з гэтых выпадкаў 490 00:29:59,000 --> 00:30:01,000 Вы збіраецеся выканаць задачу. 491 00:30:01,000 --> 00:30:04,000 Вы можаце сказаць пераключэння зменнай, а гэта азначае, што 492 00:30:04,000 --> 00:30:08,000 значэнне тое, як value1 я збіраюся зрабіць гэта, 493 00:30:08,000 --> 00:30:12,000 а потым ламаецца, які азначае, што я не буду глядзець на любую з іншых выпадках 494 00:30:12,000 --> 00:30:15,000 таму што мы ўжо задаволены тым, што справа 495 00:30:15,000 --> 00:30:20,000 , А затым value2 і гэтак далей, і я таксама можа мець значэнне па змаўчанні пераключальніка. 496 00:30:20,000 --> 00:30:24,000 Гэта азначае, што, калі ён не задавальняе ні аднаму з спраў, якія ў мяне былі 497 00:30:24,000 --> 00:30:29,000 што я збіраюся зрабіць нешта яшчэ, але гэта неабавязкова. 498 00:30:29,000 --> 00:30:36,000 Гэта ўсё для мяне. Зараз давайце Томі. 499 00:30:36,000 --> 00:30:41,000 Усё правільна, гэта будзе тыдзень 3-иш. 500 00:30:41,000 --> 00:30:45,000 Вось некаторыя з тэм, якія мы будзем пакрыццё, крыпта, сферы ўжывання, масівы, і гэтак далей. 501 00:30:45,000 --> 00:30:49,000 Проста слоў пра крыптаграфіі. Мы не збіраемся забіваць гэтым домам. 502 00:30:49,000 --> 00:30:52,000 >> Мы зрабілі гэта ў PSET 2, але для тэст пераканайцеся, што вы ведаеце розніцу 503 00:30:52,000 --> 00:30:54,000 паміж шыфр Цэзара і шыфр Виженера, 504 00:30:54,000 --> 00:30:57,000 як абедзве гэтыя работы шыфраў і што гэта такое для шыфравання 505 00:30:57,000 --> 00:30:59,000 і расшыфраваць тэкст, выкарыстоўваючы гэтыя 2 шыфры. 506 00:30:59,000 --> 00:31:03,000 Памятаеце, што шыфр Цэзара проста паварочвае кожны знак на тую ж суму, 507 00:31:03,000 --> 00:31:06,000 пераканаўшыся, што вы мода на колькасць літар у алфавіце. 508 00:31:06,000 --> 00:31:09,000 І шыфра Виженера, з другога боку, круціцца кожны знак 509 00:31:09,000 --> 00:31:12,000 па іншую суму, так што замест таго, каб гаварыць 510 00:31:12,000 --> 00:31:15,000 кожны персанаж павернуты на 3 Виженера будзе круціць кожны знак 511 00:31:15,000 --> 00:31:17,000 на розны колькасць у залежнасці ад некаторых ключавых слоў 512 00:31:17,000 --> 00:31:20,000 дзе кожная літара ў ключавое слова ўяўляе сабой некаторую іншую суму 513 00:31:20,000 --> 00:31:26,000 каб павярнуць адкрытым тэкстам па. 514 00:31:26,000 --> 00:31:28,000 Давайце спачатку пагаворым пра зменнай вобласці. 515 00:31:28,000 --> 00:31:30,000 Ёсць 2 розных тыпаў зменных. 516 00:31:30,000 --> 00:31:33,000 У нас ёсць лакальныя зменныя, і гэтыя будуць вызначаны 517 00:31:33,000 --> 00:31:36,000 за межамі асноўнага або па-за якой-небудзь функцыі або блока, 518 00:31:36,000 --> 00:31:39,000 і яны будуць даступныя ў любым месцы праграмы. 519 00:31:39,000 --> 00:31:41,000 Калі ў вас ёсць функцыя, і ў гэтай функцыі з'яўляецца час цыклу 520 00:31:41,000 --> 00:31:44,000 вялікія глабальныя зменныя даступныя ўсюды. 521 00:31:44,000 --> 00:31:48,000 Лакальная зменная, з другога боку, з'яўляецца вобласцю да месца, дзе яна вызначана. 522 00:31:48,000 --> 00:31:53,000 >> Калі ў вас ёсць функцыя Вось, напрыклад, у нас ёсць гэтая функцыя г, 523 00:31:53,000 --> 00:31:56,000 і ўнутры G ёсць пераменная тут называецца у, 524 00:31:56,000 --> 00:31:58,000 і гэта азначае, што гэта лакальная зменная. 525 00:31:58,000 --> 00:32:00,000 Нават калі гэтая пераменная называецца ў 526 00:32:00,000 --> 00:32:03,000 і гэтая пераменная называецца у гэтых 2 функцый 527 00:32:03,000 --> 00:32:06,000 не ведаю, што адзін аднаго лакальных зменных. 528 00:32:06,000 --> 00:32:10,000 З іншага боку, тут мы гаворым Int х = 5, 529 00:32:10,000 --> 00:32:12,000 і гэта выходзіць за рамкі любой функцыі. 530 00:32:12,000 --> 00:32:16,000 Гэта выходзіць за рамкі асноўнага, так гэта глабальная зменная. 531 00:32:16,000 --> 00:32:20,000 Гэта азначае, што ўнутры гэтых 2 функцый, калі я кажу х - ці х + + 532 00:32:20,000 --> 00:32:26,000 Я доступ да той жа х прычым гэта ў і ў гэтага з'яўляюцца рознымі зменнымі. 533 00:32:26,000 --> 00:32:30,000 Вось у чым розніца паміж глабальных зменных і лакальных зменных. 534 00:32:30,000 --> 00:32:33,000 Што тычыцца дызайну, то, часам гэта добрай ідэяй 535 00:32:33,000 --> 00:32:37,000 захаваць лакальныя зменныя, калі вы, магчыма, можа 536 00:32:37,000 --> 00:32:39,000 так як з кучай глабальных зменных можна атрымаць вельмі заблытанай. 537 00:32:39,000 --> 00:32:42,000 Калі ў вас ёсць куча функцый ўсе змены адно і тое ж 538 00:32:42,000 --> 00:32:45,000 Вы можаце забыць, што, калі гэтая функцыя выпадковага змяняе гэты глабальны, 539 00:32:45,000 --> 00:32:47,000 і гэтая іншая функцыя не ведае пра гэта, 540 00:32:47,000 --> 00:32:50,000 і гэта сапраўды становіцца даволі заблытаным, як вы атрымаеце больш кода. 541 00:32:50,000 --> 00:32:53,000 Захаванне лакальных зменных, калі вы, магчыма, можа 542 00:32:53,000 --> 00:32:56,000 проста добры дызайн. 543 00:32:56,000 --> 00:33:00,000 Масівы, памятаеце, што гэта проста спісы з элементаў таго ж тыпу. 544 00:33:00,000 --> 00:33:04,000 Усярэдзіне CI не можа мець спіс, як 1, 2,0, добры дзень. 545 00:33:04,000 --> 00:33:06,000 Мы проста не можам гэтага зрабіць. 546 00:33:06,000 --> 00:33:11,000 >> Калі мы аб'яўляем масіў у C ўсе элементы павінны быць таго ж тыпу. 547 00:33:11,000 --> 00:33:14,000 Тут у мяне ёсць масіў з 3 цэлых лікаў. 548 00:33:14,000 --> 00:33:18,000 Вось у мяне ёсць даўжыня масіва, але калі я проста аб'явіць яго ў гэты сінтаксіс 549 00:33:18,000 --> 00:33:21,000 дзе я паказваю, што ўсе элементы я тэхнічна не патрэбна гэтая 3. 550 00:33:21,000 --> 00:33:25,000 Кампілятар досыць разумны, каб зразумець, наколькі вялікі масіў павінен быць. 551 00:33:25,000 --> 00:33:28,000 Цяпер, калі я хачу, каб атрымаць ці ўсталяваць значэнне масіва 552 00:33:28,000 --> 00:33:30,000 гэта сінтаксіс, каб зрабіць гэта. 553 00:33:30,000 --> 00:33:33,000 Гэта на самай справе змяніць Другі элемент масіва, таму што, памятаеце, 554 00:33:33,000 --> 00:33:36,000 Нумарацыя пачынаецца з 0, а не з 1. 555 00:33:36,000 --> 00:33:42,000 Калі я хачу прачытаць, што значэнне я магу сказаць нешта накшталт Int х = масіў [1]. 556 00:33:42,000 --> 00:33:44,000 Ці, калі я хачу ўсталяваць гэта значэнне, як я тут раблю, 557 00:33:44,000 --> 00:33:47,000 Я магу сказаць, масіў [1] = 4. 558 00:33:47,000 --> 00:33:50,000 У гэты час доступ да элементаў па індэксу 559 00:33:50,000 --> 00:33:52,000 або іх становішча ці дзе яны знаходзяцца ў масіве, 560 00:33:52,000 --> 00:33:57,000 і што ў каталогу пачынаецца з 0. 561 00:33:57,000 --> 00:34:00,000 Мы можам таксама ёсць масівы масіваў, 562 00:34:00,000 --> 00:34:03,000 і гэта завецца шматмерным масівам. 563 00:34:03,000 --> 00:34:05,000 Калі ў нас ёсць мнагамерны масіў 564 00:34:05,000 --> 00:34:07,000 гэта азначае, што мы можам мець нешта накшталт радкоў і слупкоў, 565 00:34:07,000 --> 00:34:11,000 і гэта толькі адзін з спосабаў візуалізацыі гэтага ці думаць пра гэта. 566 00:34:11,000 --> 00:34:14,000 Калі ў мяне ёсць мнагамерны масіў, які азначае, што я збіраюся пачаць маюць патрэбу 567 00:34:14,000 --> 00:34:17,000 больш чым на 1 індэкс, таму што калі ў мяне ёсць сетка 568 00:34:17,000 --> 00:34:19,000 проста кажу, што радок вы знаходзіцеся ў не дае нам нумар. 569 00:34:19,000 --> 00:34:22,000 Гэта сапраўды проста хачу, каб даць нам спіс нумароў. 570 00:34:22,000 --> 00:34:25,000 Скажам, у мяне ёсць гэты масіў тут. 571 00:34:25,000 --> 00:34:30,000 У мяне ёсць масіў завецца сетка, і я кажу, што гэта 2 радкі і 3 слупка, 572 00:34:30,000 --> 00:34:32,000 і такім чынам, гэта з'яўляецца адным з спосабаў візуалізацыі яго. 573 00:34:32,000 --> 00:34:37,000 Калі я кажу, я хачу, каб элемент [1] [2] 574 00:34:37,000 --> 00:34:41,000 гэта азначае, што, паколькі гэтыя радкі, а затым слупкі 575 00:34:41,000 --> 00:34:44,000 Я збіраюся перайсці на радок 1, таму што я сказаў 1. 576 00:34:44,000 --> 00:34:49,000 >> Тады я збіраюся прыехаць сюды ў калонцы 2, і я збіраюся атрымаць значэнне 6. 577 00:34:49,000 --> 00:34:51,000 Сэнс? 578 00:34:51,000 --> 00:34:55,000 Шматмерныя масівы, памятаеце, што тэхнічна проста масіў масіваў. 579 00:34:55,000 --> 00:34:57,000 Мы можам мець масівы масіваў масіваў. 580 00:34:57,000 --> 00:35:00,000 Мы можам працягваць, але сапраўды адзін спосаб думаць аб 581 00:35:00,000 --> 00:35:03,000 як гэта ў цяперашні час закладзены, і тое, што адбываецца, каб візуалізаваць 582 00:35:03,000 --> 00:35:09,000 у сетцы, як гэта. 583 00:35:09,000 --> 00:35:12,000 Калі мы перадаем масіваў у функцыі, яны будуць паводзіць сябе 584 00:35:12,000 --> 00:35:16,000 крыху па-іншаму, чым калі мы пераходзім рэгулярных зменных функцыі 585 00:35:16,000 --> 00:35:18,000 як перадача Int або з якая плавае кропкай. 586 00:35:18,000 --> 00:35:21,000 Калі мы перадаем у Int або знак ці любы з гэтых іншых тыпаў дадзеных 587 00:35:21,000 --> 00:35:24,000 мы толькі што разгледзелі, калі функцыя змяняе 588 00:35:24,000 --> 00:35:28,000 значэнне гэтай зменнай, што змены не збіраюся распаўсюджвацца ўверх 589 00:35:28,000 --> 00:35:32,000 у выклікае функцыю. 590 00:35:32,000 --> 00:35:35,000 З масівам, з другога боку, што будзе адбывацца. 591 00:35:35,000 --> 00:35:39,000 Калі б я перадаць масіў да некаторай функцыі і функцыя змяняе некаторыя элементы, 592 00:35:39,000 --> 00:35:43,000 калі я вярнуся да функцыі, якія назвалі яго 593 00:35:43,000 --> 00:35:47,000 мой масіў цяпер будзе па-іншаму, і слоўнік для гэтага 594 00:35:47,000 --> 00:35:50,000 гэта масівы перадаюцца па спасылцы, як мы ўбачым пазней. 595 00:35:50,000 --> 00:35:53,000 Гэта звязана як паказальнікі працы, дзе гэтыя асноўныя тыпы дадзеных, 596 00:35:53,000 --> 00:35:55,000 З іншага боку, перадаюцца па значэнні. 597 00:35:55,000 --> 00:35:59,000 >> Мы можам думаць аб тым, як зрабіць копію некаторыя зменныя і пераходзячы затым у копіі. 598 00:35:59,000 --> 00:36:01,000 Не мае значэння, што мы робім з гэтай зменнай. 599 00:36:01,000 --> 00:36:06,000 Выклікае функцыя не будзе ведаць, што ён змяніўся. 600 00:36:06,000 --> 00:36:10,000 Масівы з'яўляюцца толькі трохі адрозніваецца ў гэтым стаўленні. 601 00:36:10,000 --> 00:36:13,000 Напрыклад, як мы толькі што бачылі, асноўным з'яўляецца проста функцыяй 602 00:36:13,000 --> 00:36:15,000 што можна ўзяць у 2 аргументаў. 603 00:36:15,000 --> 00:36:20,000 Першы аргумент асноўнай функцыяй з'яўляецца агдс, або колькасць аргументаў, 604 00:36:20,000 --> 00:36:23,000 а другі аргумент называецца ARGV, 605 00:36:23,000 --> 00:36:27,000 і тыя фактычныя значэння гэтых аргументаў. 606 00:36:27,000 --> 00:36:30,000 Скажам, у мяне ёсць праграма пад назвай this.c, 607 00:36:30,000 --> 00:36:34,000 і я кажу гэта зрабіць, і я збіраюся запусціць у камандным радку. 608 00:36:34,000 --> 00:36:38,000 Зараз, каб прайсці ў некаторыя аргументы, каб мая праграма называецца гэта, 609 00:36:38,000 --> 00:36:42,000 Я мог бы сказаць нешта падобнае. / Гэта CS 50. 610 00:36:42,000 --> 00:36:45,000 Гэта тое, што мы сабе ўяўляем, Дэвід рабіць кожны дзень на тэрмінале. 611 00:36:45,000 --> 00:36:48,000 Але цяпер асноўная функцыя ўнутры гэтай праграмы 612 00:36:48,000 --> 00:36:52,000 мае наступныя значэнні, так агдс роўная 4. 613 00:36:52,000 --> 00:36:56,000 Гэта можа быць трохі заблытаным, таму што на самой справе мы толькі якія праходзяць у гэта CS 50. 614 00:36:56,000 --> 00:36:58,000 Вось толькі 3. 615 00:36:58,000 --> 00:37:02,000 Але памятайце, што першы элемент ARGV або першы аргумент 616 00:37:02,000 --> 00:37:05,000 гэтае імя самой функцыі. 617 00:37:05,000 --> 00:37:07,190 Такім чынам, гэта азначае, што ў нас ёсць 4 рэчы тут, 618 00:37:07,190 --> 00:37:10,530 і першы элемент будзе. / гэта. 619 00:37:10,530 --> 00:37:12,970 І гэта будзе прадстаўлена ў выглядзе радка. 620 00:37:12,970 --> 00:37:18,590 Тады астатнія элементы таго, што мы набралі пасля назвы праграмы. 621 00:37:18,590 --> 00:37:22,720 Гэтак жа, як у баку, так як мы, напэўна, бачылі ў PSET 2, 622 00:37:22,720 --> 00:37:28,780 памятаеце, што радок 50, ≠ цэлых 50. 623 00:37:28,780 --> 00:37:32,520 Таму мы не можам сказаць нешта накшталт: "INT X = ARGV 3". 624 00:37:32,520 --> 00:37:36,470 >> Вось толькі не збіраецца сэнсу, таму што гэта радок, і гэта лік. 625 00:37:36,470 --> 00:37:38,510 Так што, калі вы хочаце канвертаваць паміж 2, памятаеце, што мы збіраемся 626 00:37:38,510 --> 00:37:40,810 ёсць гэтая чароўная функцыя называецца atoi. 627 00:37:40,810 --> 00:37:46,270 , Якая прымае радок і вяртае цэлы лік прадстаўлена ў гэтым радку. 628 00:37:46,270 --> 00:37:48,360 Так што гэта лёгка зрабіць памылку ў віктарыне, 629 00:37:48,360 --> 00:37:51,590 проста думаў, што гэта будзе аўтаматычна правільны тып. 630 00:37:51,590 --> 00:37:53,860 Але дакладна ведаю, што гэта заўсёды будзе радкоў 631 00:37:53,860 --> 00:38:00,920 нават калі радок утрымлівае толькі цэлы лік або знак ці з якая плавае кропкай. 632 00:38:00,920 --> 00:38:03,380 Такім чынам, цяпер давайце пагаворым пра час працы. 633 00:38:03,380 --> 00:38:06,700 Калі ў нас ёсць усе гэтыя алгарытмы, якія робяць усё гэтыя вар'яцкія рэчы, 634 00:38:06,700 --> 00:38:11,580 гэта становіцца сапраўды карысна задацца пытаннем: «Як доўга яны прымаюць?" 635 00:38:11,580 --> 00:38:15,500 Мы ўяўляем, што нешта, званае асімптатычнай абазначэнне. 636 00:38:15,500 --> 00:38:18,430 Такім чынам, гэта азначае, што - ну, скажам, мы даем нашым алгарытмам 637 00:38:18,430 --> 00:38:20,840 некаторыя вельмі, вельмі, вельмі вялікі ўклад. 638 00:38:20,840 --> 00:38:23,840 Мы хочам задаць пытанне: "Як доўга гэта зойме? 639 00:38:23,840 --> 00:38:26,370 Колькі крокаў зойме наш алгарытм для запуску 640 00:38:26,370 --> 00:38:29,980 у залежнасці ад памеру ўваходных дадзеных? " 641 00:38:29,980 --> 00:38:33,080 Такім чынам, першы спосаб, якім мы можам апісаць час выканання з вялікай О. 642 00:38:33,080 --> 00:38:35,380 І гэта наш найгоршы ход часу. 643 00:38:35,380 --> 00:38:38,590 Таму калі мы хочам, каб адсартаваць масіў, і мы даем нашым алгарытмам масіва 644 00:38:38,590 --> 00:38:41,000 гэта ў парадку змяншэння, калі яно павінна быць у парадку ўзрастання, 645 00:38:41,000 --> 00:38:43,130 што будзе ў горшым выпадку. 646 00:38:43,130 --> 00:38:49,800 Гэта наша верхняя грань у максімальны час наш алгарытм будзе. 647 00:38:49,800 --> 00:38:54,740 З іншага боку, гэтая Ω будзе апісваць лепшым выпадку час працы. 648 00:38:54,740 --> 00:38:58,210 Так што, калі мы дамо ўжо адсартаваны масіў у алгарытм сартавання, 649 00:38:58,210 --> 00:39:00,940 Як доўга гэта зойме, каб улагодзіць яго? 650 00:39:00,940 --> 00:39:06,610 І гэта, то, апісвае ніжнюю мяжу на час працы. 651 00:39:06,610 --> 00:39:10,980 Такім чынам, вось толькі некаторыя словы, якія апісваюць некаторыя агульныя працуе разы. 652 00:39:10,980 --> 00:39:13,120 Гэта ў парадку ўзрастання. 653 00:39:13,120 --> 00:39:16,060 Самы хуткі бег часу ў нас называецца сталым. 654 00:39:16,060 --> 00:39:19,800 >> Гэта азначае, што незалежна ад таго, колькі элементаў мы даем нашым алгарытмам, 655 00:39:19,800 --> 00:39:22,280 незалежна ад таго, наколькі вялікая наша масіў, сартаванне 656 00:39:22,280 --> 00:39:26,510 ці рабіць тое, што мы робім у масіў заўсёды будзе такое ж колькасць часу. 657 00:39:26,510 --> 00:39:30,270 Такім чынам, мы можам ўявіць, што толькі з 1, які з'яўляецца сталым. 658 00:39:30,270 --> 00:39:32,410 Мы таксама паглядзелі на лагарыфмічнай час перспектыве. 659 00:39:32,410 --> 00:39:34,800 Так нешта накшталт двайковага пошуку з'яўляецца лагарыфмічнай, 660 00:39:34,800 --> 00:39:37,140 дзе мы скарацілі праблема ў два разы кожны раз, калі 661 00:39:37,140 --> 00:39:40,970 а потым усё проста атрымаць вышэйшую адтуль. 662 00:39:40,970 --> 00:39:43,580 І калі вы калі-небудзь пісьмова аб любых факториал алгарытм, 663 00:39:43,580 --> 00:39:47,850 Вы, верагодна, не варта разглядаць гэта як сваю працу дня. 664 00:39:47,850 --> 00:39:53,910 Калі мы параўноўваем часу працы вельмі важна мець на ўвазе гэтыя рэчы. 665 00:39:53,910 --> 00:39:57,760 Так што, калі ў мяне ёсць алгарытм, які O (N), а нехта іншы 666 00:39:57,760 --> 00:40:03,590 была алгарытму O (2n), гэта на самай справе асімптатычна эквівалентныя. 667 00:40:03,590 --> 00:40:06,590 Такім чынам, калі ўявіць сабе, п быць вялікая колькасць, як eleventy млрд: 668 00:40:06,590 --> 00:40:13,090 таму, калі мы параўноўваем eleventy млрд. нешта накшталт eleventy млрд. + 3, 669 00:40:13,090 --> 00:40:17,640 3 раптам, што на самой справе не робяць вялікай розніцы больш. 670 00:40:17,640 --> 00:40:20,980 Вось чаму мы збіраемся пачаць разглядаць гэтыя рэчы, каб быць эквівалентнымі. 671 00:40:20,980 --> 00:40:24,220 Так што такія рэчы, як гэтыя канстанты тут, ёсць 2 х гэта, або даданне 3, 672 00:40:24,220 --> 00:40:27,180 гэта проста канстанты, і яны збіраюцца кінуць ўверх. 673 00:40:27,180 --> 00:40:32,480 Дык вось чаму ўсё гэтыя 3 разы перспектыве такія ж, як кажуць яны O (N). 674 00:40:32,480 --> 00:40:37,490 Аналагічна, калі ў нас ёсць 2 іншыя часы перспектыве, скажам, O (N ³ + 2n ²), мы можам дадаць 675 00:40:37,490 --> 00:40:42,070 + П, + 7, а затым у нас ёсць яшчэ час выканання, што проста O (N ³). 676 00:40:42,070 --> 00:40:46,290 зноў жа, гэта адно і тое ж, таму што гэта - гэта не тое ж самае. 677 00:40:46,290 --> 00:40:49,840 Гэта тыя ж самыя рэчы, прабачце. Такім чынам, гэта тыя ж самыя, таму што 678 00:40:49,840 --> 00:40:53,090 гэтая ³ п будзе дамінаваць у гэтым 2n ². 679 00:40:53,090 --> 00:40:59,130 >> Што не адно і тое ж, калі мы ўжо запусцілі час, як O (N ³) і O (N ²) 680 00:40:59,130 --> 00:41:02,820 таму што гэтая ³ п значна больш, чым гэта ² н. 681 00:41:02,820 --> 00:41:05,470 Так што, калі ў нас ёсць паказчыкі, раптам гэта пачынае значэння, 682 00:41:05,470 --> 00:41:08,280 Але калі мы проста справа з фактарамі, як мы тут, 683 00:41:08,280 --> 00:41:12,810 то ён не збіраецца значэння, таму што яны толькі збіраюцца кідаць. 684 00:41:12,810 --> 00:41:16,760 Давайце зірнем на некаторыя алгарытмы, якія мы бачылі да гэтага часу 685 00:41:16,760 --> 00:41:19,260 і казаць пра іх выканання. 686 00:41:19,260 --> 00:41:23,850 Першы погляд на нумар у спісе, які мы бачылі, быў лінейны пошук. 687 00:41:23,850 --> 00:41:26,950 І рэалізацыя лінейнага пошуку супер проста. 688 00:41:26,950 --> 00:41:30,490 Мы проста ёсць спіс, і мы будзем глядзець на кожны асобны элемент у спісе 689 00:41:30,490 --> 00:41:34,260 пакуль мы не знойдзем лік, якое мы шукаем. 690 00:41:34,260 --> 00:41:38,370 Такім чынам, гэта азначае, што ў горшым выпадку, гэта O (N). 691 00:41:38,370 --> 00:41:40,860 А ў горшым выпадку тут магло б быць, калі элемент 692 00:41:40,860 --> 00:41:45,710 Апошні элемент, то з дапамогай лінейнага пошуку, мы павінны глядзець на кожны асобны элемент 693 00:41:45,710 --> 00:41:50,180 пакуль мы не атрымаем да апошняга, каб ведаць, што гэта было на самай справе ў спісе. 694 00:41:50,180 --> 00:41:52,910 Мы не можам проста кінуць на паўдарогі і сказаць: "Гэта, напэўна, няма». 695 00:41:52,910 --> 00:41:55,980 З лінейны пошук, мы павінны глядзець на ўсё гэта. 696 00:41:55,980 --> 00:41:59,090 Лепшым выпадку час працы, з іншага боку, пастаянна 697 00:41:59,090 --> 00:42:04,200 таму што ў лепшым выпадку элемент мы шукаем гэта толькі першы ў спісе. 698 00:42:04,200 --> 00:42:08,930 Такім чынам, ён збіраецца ўзяць нас роўна на 1 крок, незалежна ад таго, наколькі вялікі спіс 699 00:42:08,930 --> 00:42:12,140 калі мы шукаем першы элемент кожны раз. 700 00:42:12,140 --> 00:42:15,390 >> Таму, калі вы будзеце шукаць, памятаеце, гэта не патрабуе, каб наш спіс будзе адсартаваны. 701 00:42:15,390 --> 00:42:19,430 Таму што мы проста будзем глядзець на кожны асобны элемент, і гэта сапраўды не мае значэння 702 00:42:19,430 --> 00:42:23,560 у якім парадку гэтыя элементы цалі 703 00:42:23,560 --> 00:42:28,110 Больш за інтэлектуальны алгарытм пошуку нешта накшталт бінарнага пошуку. 704 00:42:28,110 --> 00:42:31,500 Памятаеце, што рэалізацыя бінарнага пошуку, калі вы збіраецеся 705 00:42:31,500 --> 00:42:34,320 працягвайце глядзець у сярэдзіну спісу. 706 00:42:34,320 --> 00:42:38,000 І таму, што мы глядзім на сярэдзіне, мы патрабуем, каб спіс сартуецца 707 00:42:38,000 --> 00:42:40,580 інакш мы не ведаем, дзе сярэдзіна, і мы павінны глядзець на 708 00:42:40,580 --> 00:42:44,480 ўвесь спіс, каб знайсці яго, а затым на той момант мы проста губляем час. 709 00:42:44,480 --> 00:42:48,480 Так што, калі ў нас ёсць адсартаваны спіс, і мы знаходзім сярэдзіну, мы збіраемся параўнаць сярэднія 710 00:42:48,480 --> 00:42:51,590 да элемента мы шукаем. 711 00:42:51,590 --> 00:42:54,640 Калі яна занадта высокая, то мы можам забыць правай паловы 712 00:42:54,640 --> 00:42:57,810 таму што мы ведаем, што калі наш элемент ўжо занадта высокія 713 00:42:57,810 --> 00:43:01,080 і ўсё, што правей гэтага элемента яшчэ вышэй, 714 00:43:01,080 --> 00:43:02,760 то мы не павінны глядзець там больш. 715 00:43:02,760 --> 00:43:05,430 Калі, з другога боку, калі наш элемент з'яўляецца занадта нізкай, 716 00:43:05,430 --> 00:43:08,700 Мы ведаем усё, каб злева ад гэтага элемента таксама з'яўляецца занадта нізкай, 717 00:43:08,700 --> 00:43:11,390 такім чынам, гэта сапраўды не мае сэнсу шукаць там, таксама. 718 00:43:11,390 --> 00:43:15,760 Такім чынам, з кожным крокам, і кожны раз, калі мы глядзім на сярэдзіну спісу, 719 00:43:15,760 --> 00:43:19,060 Мы збіраемся скараціць нашы праблемы ў палову, таму што раптам мы ведаем, 720 00:43:19,060 --> 00:43:23,040 цэлую кучу лічбаў, што не можа быць той, які мы шукаем. 721 00:43:23,040 --> 00:43:26,950 >> У псевдокоде гэта будзе выглядаць прыкладна так, 722 00:43:26,950 --> 00:43:30,990 і таму, што мы рэзкі спісу ў два разы кожны раз, 723 00:43:30,990 --> 00:43:34,920 нашы найгоршыя час выканання скачкоў з лінейнай да лагарыфмічнай. 724 00:43:34,920 --> 00:43:39,260 Так нечакана мы маем ўваход у сістэму крокі для таго, каб знайсці элемент у спісе. 725 00:43:39,260 --> 00:43:42,460 Лепшым выпадку ход часу, хоць, па-ранейшаму пастаяннай 726 00:43:42,460 --> 00:43:45,180 таму што цяпер, давайце проста скажам, што элемент мы шукаем з'яўляецца 727 00:43:45,180 --> 00:43:48,380 Заўсёды сапраўды пасярэдзіне першапачатковага спісу. 728 00:43:48,380 --> 00:43:52,080 Так што мы можам развіваць наш спіс як вялікі, як мы хочам, але калі элемент мы шукаем знаходзіцца на сярэдзіне, 729 00:43:52,080 --> 00:43:54,910 Затым яна толькі збіраецца ўзяць нас на 1 крок. 730 00:43:54,910 --> 00:44:00,920 Дык вось чаму мы O (часопіс N) і Ω (1) ці сталымі. 731 00:44:00,920 --> 00:44:04,510 Давайце рэальна працаваць бінарны пошук у гэтым спісе. 732 00:44:04,510 --> 00:44:08,020 Так што давайце казаць, што мы шукаем элемент 164. 733 00:44:08,020 --> 00:44:11,650 Першае, што мы збіраемся зрабіць, гэта знайсці сярэдзіну гэтага спісу. 734 00:44:11,650 --> 00:44:15,060 Проста так атрымалася, што сярэдзіна будзе падаць паміж гэтымі 2 нумары, 735 00:44:15,060 --> 00:44:18,960 так што давайце проста калі заўгодна казаць, кожны раз сярэдзіна знаходзіцца паміж 2 нумары, 736 00:44:18,960 --> 00:44:21,150 Давайце проста акругліць. 737 00:44:21,150 --> 00:44:24,330 Нам проста трэба пераканацца, што мы робім гэта кожны крок шляху. 738 00:44:24,330 --> 00:44:29,040 Так што мы збіраемся зганяць, і мы збіраемся сказаць, што 161 з'яўляецца сярэднім з нашага спісу. 739 00:44:29,040 --> 00:44:34,640 Так што 161 <164, і кожны элемент у левым з 161 740 00:44:34,640 --> 00:44:39,120 Таксама <164, так што мы ведаем, што гэта не дапаможа нам на ўсіх 741 00:44:39,120 --> 00:44:42,690 , Каб пачаць шукаць тут, таму што элемент мы шукаем не можа быць там. 742 00:44:42,690 --> 00:44:47,060 Такім чынам, што мы можам зрабіць, мы можам проста забыць аб тым, што ўся левая палова спісу, 743 00:44:47,060 --> 00:44:51,700 а цяпер разглядаць толькі з правага з 161 і далей. 744 00:44:51,700 --> 00:44:54,050 >> Такім чынам, яшчэ раз, гэта сярэдзіна, давайце проста акругліць. 745 00:44:54,050 --> 00:44:56,260 Цяпер 175 з'яўляецца занадта вялікі. 746 00:44:56,260 --> 00:44:59,180 Такім чынам, мы ведаем, што гэта не дапаможа нам шукаць тут або тут, 747 00:44:59,180 --> 00:45:06,610 таму мы можам проста кінуць, што далёка, і ў выніку мы трапілі ў 164. 748 00:45:06,610 --> 00:45:10,560 Любыя пытанні па двайковага пошуку? 749 00:45:10,560 --> 00:45:14,180 Давайце пяройдзем ад пошуку ва ўжо адсартаваны спіс 750 00:45:14,180 --> 00:45:17,660 на самай справе прымае спіс лікаў у любым парадку 751 00:45:17,660 --> 00:45:20,960 і зрабіць гэты спіс у парадку ўзрастання. 752 00:45:20,960 --> 00:45:24,060 Першы алгарытм мы глядзелі на называлася пузырьковый сартавання. 753 00:45:24,060 --> 00:45:27,300 І гэта будзе значна прасцей алгарытмаў, якія мы бачылі. 754 00:45:27,300 --> 00:45:32,970 Bubble роду кажа, што калі любыя 2 элемента ўнутры спісу не на месцы, 755 00:45:32,970 --> 00:45:36,500 гэта значыць ёсць большая колькасць злева ад меншага ліку, 756 00:45:36,500 --> 00:45:40,190 Затым мы збіраемся памяняць іх месцамі, таму што гэта азначае, што спіс будзе 757 00:45:40,190 --> 00:45:42,860 "Больш за спарадкаваныя", чым гэта было раней. 758 00:45:42,860 --> 00:45:45,180 І мы проста будзем працягваць гэты працэс зноў і зноў, і зноў 759 00:45:45,180 --> 00:45:52,100 пакуль у рэшце рэшт элементаў выгляду бурбалка на іх правільнае размяшчэнне і ў нас ёсць адсартаваны спіс. 760 00:45:52,100 --> 00:45:57,230 >> Час выканання гэтага будзе O (N ²). Чаму? 761 00:45:57,230 --> 00:46:00,370 Ну, таму што ў горшым выпадку, мы збіраемся ўзяць кожны элемент, і 762 00:46:00,370 --> 00:46:04,570 мы збіраемся ў канчатковым выніку, параўноўваючы яе з любой іншай элемент у спісе. 763 00:46:04,570 --> 00:46:08,030 Але ў лепшым выпадку, у нас ёсць ужо адсартаваны спіс, пузырьковый сартавання ў 764 00:46:08,030 --> 00:46:12,230 толькі збіраецца прайсці адзін раз, сказаць: "Не. Я не рабіў ніякіх свопов, так што я зрабіў". 765 00:46:12,230 --> 00:46:17,410 Такім чынам, мы маем лепшым выпадку час працы Ω (N). 766 00:46:17,410 --> 00:46:20,680 Давайце запусцім пузырьковый сартавання ў спісе. 767 00:46:20,680 --> 00:46:23,560 Ці спачатку, давайце проста паглядзім на некаторыя псевдокод вельмі хутка. 768 00:46:23,560 --> 00:46:28,160 Мы хочам сказаць, што мы хочам адсочваць, у кожнай ітэрацыі цыклу, 769 00:46:28,160 --> 00:46:32,190 адсочваць ці мы змянілі якія-небудзь элементы. 770 00:46:32,190 --> 00:46:37,610 Такім чынам, прычына гэтага ў тым, што мы збіраемся спыніцца, калі мы не памяняліся месцамі любыя элементы. 771 00:46:37,610 --> 00:46:41,980 Такім чынам, у пачатку нашага цыклу мы не памяняліся месцамі нічога, таму мы будзем казаць, што гэта хлусня. 772 00:46:41,980 --> 00:46:47,170 Зараз, мы збіраемся прайсціся па спісе і параўнаць элемента да элемента я я + 1 773 00:46:47,170 --> 00:46:50,310 і калі гэта так, што ёсць большая колькасць злева ад меншага ліку, 774 00:46:50,310 --> 00:46:52,310 Затым мы толькі збіраемся, каб памяняць іх месцамі. 775 00:46:52,310 --> 00:46:54,490 >> І тады мы будзем памятаць, што мы памяняліся месцамі элемент. 776 00:46:54,490 --> 00:46:58,900 Гэта азначае, што мы павінны ісці па спісе, па меншай меры, яшчэ 1 раз 777 00:46:58,900 --> 00:47:02,160 таму што стан, у якім мы спыніліся, калі ўвесь спіс ужо адсартаваны, 778 00:47:02,160 --> 00:47:04,890 азначае, што мы не зрабілі ніякіх свопов. 779 00:47:04,890 --> 00:47:09,960 Дык вось чаму нашы ўмовы тут з'яўляецца «у той час як некаторыя элементы былі замененыя. 780 00:47:09,960 --> 00:47:13,720 Такім чынам, цяпер давайце паглядзім на гэта працуе на спіс. 781 00:47:13,720 --> 00:47:16,640 У мяне ёсць спіс 5,0,1,6,4. 782 00:47:16,640 --> 00:47:19,850 Bubble роду збіраецца пачаць ўвесь шлях злева, і гэта будзе для параўнання 783 00:47:19,850 --> 00:47:24,700 я элементаў, так ад 0 да + 1, якое з'яўляецца элементам 1. 784 00:47:24,700 --> 00:47:29,020 Ён скажа, ну 5> 0, але прама зараз 5 знаходзіцца злева, 785 00:47:29,020 --> 00:47:32,500 так што мне трэба памяняць месцамі 5 і 0. 786 00:47:32,500 --> 00:47:35,470 Калі я памяняць іх месцамі, раптам я атрымліваю гэта іншае спіс. 787 00:47:35,470 --> 00:47:38,260 Зараз 5> 1, так што мы збіраемся памяняць іх месцамі. 788 00:47:38,260 --> 00:47:42,160 5 не> 6, таму мы не павінны нічога рабіць тут. 789 00:47:42,160 --> 00:47:46,690 Але 6> 4, так што мы павінны памяняць. 790 00:47:46,690 --> 00:47:49,740 Зноў жа, нам трэба запусціць ўвесь спіс, каб у рэшце рэшт выявіць 791 00:47:49,740 --> 00:47:52,330 што гэтыя выйшлі з ладу, мы памяняць іх месцамі, 792 00:47:52,330 --> 00:47:57,120 і ў гэты момант нам трэба запусціць праз спіс яшчэ 1 раз 793 00:47:57,120 --> 00:48:05,390 каб пераканацца, што ўсё ў яго распараджэнні, і ў гэты момант пузырьковый сартавання скончаны. 794 00:48:05,390 --> 00:48:10,720 Розных алгарытмаў для прыняцця некаторых элементаў і сартаванне іх з'яўляецца выбар роду. 795 00:48:10,720 --> 00:48:15,740 Ідэя выбару роду з'яўляецца тое, што мы збіраемся пабудаваць адсартаваны частку спісу 796 00:48:15,740 --> 00:48:18,150 1 элемент адначасова. 797 00:48:18,150 --> 00:48:23,170 >> І тое, як мы збіраемся зрабіць гэта шляхам стварэння левай частцы спісу. 798 00:48:23,170 --> 00:48:27,510 А ў прынцыпе, кожны - на кожным кроку, мы збіраемся ўзяць найменшы элемент мы пакінулі 799 00:48:27,510 --> 00:48:32,310 , Якія не былі адсартаваныя яшчэ, і мы збіраемся, каб перамясціць яго ў гэты адсартаваны сегменце. 800 00:48:32,310 --> 00:48:35,850 Гэта азначае, што мы павінны пастаянна знаходзіць мінімальны элемент несортированные 801 00:48:35,850 --> 00:48:40,720 , А затым прыняць, што мінімальны элемент і памяняць яго з тым, што 802 00:48:40,720 --> 00:48:45,090 левы элемент, які не сартуецца. 803 00:48:45,090 --> 00:48:50,890 Час выканання гэтага будзе O (N ²), таму што ў горшым выпадку 804 00:48:50,890 --> 00:48:55,070 мы павінны параўнаць кожны элемент любой іншай элемент. 805 00:48:55,070 --> 00:48:59,250 Таму што мы кажам, што калі мы пачнем ў левай палове спісу, мы павінны 806 00:48:59,250 --> 00:49:02,970 прайсці праз увесь правы сегмент, каб знайсці найменшы элемент. 807 00:49:02,970 --> 00:49:05,430 А потым, зноў жа, мы павінны ісці на працягу ўсяго правага сегмента і 808 00:49:05,430 --> 00:49:08,210 працягваць над гэтым зноў і зноў, і зноў. 809 00:49:08,210 --> 00:49:11,350 Гэта будзе п ². Мы збіраемся трэба цыкл ўнутры іншага цыклу 810 00:49:11,350 --> 00:49:13,350 што сведчыць аб п ². 811 00:49:13,350 --> 00:49:16,530 У лепшым выпадку думка, скажам, мы даем яму ўжо адсартаваны спіс; 812 00:49:16,530 --> 00:49:19,270 мы на самай справе не робяць лепш, чым ² н. 813 00:49:19,270 --> 00:49:21,730 Таму што выбар роду не мае магчымасці даведацца, што 814 00:49:21,730 --> 00:49:25,540 мінімальны элемент толькі адзін я, здараецца, глядзіць. 815 00:49:25,540 --> 00:49:28,970 Ён па-ранейшаму павінен пераканацца, што гэта сапраўды мінімум. 816 00:49:28,970 --> 00:49:31,670 >> І адзіны спосаб, каб пераканацца, што гэта мінімум, з дапамогай гэтага алгарытму, 817 00:49:31,670 --> 00:49:34,640 , Каб глядзець на кожны асобны элемент зноў. 818 00:49:34,640 --> 00:49:38,420 Так на самай справе, калі вы даеце яму - калі вы дасце выбар кшталту ўжо адсартаваны спіс, 819 00:49:38,420 --> 00:49:42,720 ён не збіраецца рабіць лепш, чым даць яму сьпіс, што не адсартаваны яшчэ няма. 820 00:49:42,720 --> 00:49:46,320 Дарэчы, калі яно адбудзецца, будзе выпадак, што нешта O (нешта) 821 00:49:46,320 --> 00:49:50,640 і амега-то, мы можам толькі сказаць, больш коратка, што гэта θ чагосьці. 822 00:49:50,640 --> 00:49:52,760 Так што калі вы бачыце, што прыдумаць у любым месцы, гэта тое, што гэта проста азначае. 823 00:49:52,760 --> 00:49:57,580 >> Калі нешта тэта-н ², гэта і вялікая O (N ²) і Ω (N ²). 824 00:49:57,580 --> 00:49:59,790 Так лепшым выпадку, а горшым выпадку, гэта не робіць розніцы, 825 00:49:59,790 --> 00:50:04,400 Алгарытм збіраецца зрабіць тое ж самае кожны раз. 826 00:50:04,400 --> 00:50:06,610 Так гэта тое, што псевдокод для выбару роду магла б выглядаць. 827 00:50:06,610 --> 00:50:10,630 Мы ў асноўным будзем казаць, што я хачу прайсці па спісе 828 00:50:10,630 --> 00:50:15,180 злева направа, і на кожнай ітэрацыі цыклу, я збіраюся пераехаць 829 00:50:15,180 --> 00:50:19,780 мінімальны элемент у гэтай адсартаваныя частка спісу. 830 00:50:19,780 --> 00:50:23,260 І як толькі я пераходжу нешта там, я ніколі не павінны глядзець на гэты элемент зноў. 831 00:50:23,260 --> 00:50:28,600 Таму што як толькі я памяняць элемент у левай частцы спісу, гэта адсартаваны 832 00:50:28,600 --> 00:50:32,600 таму што мы робім усё, што ў парадку павелічэньня з выкарыстаннем мінімуму. 833 00:50:32,600 --> 00:50:38,740 Таму мы сказалі, добра, што мы ў становішчы я, і мы павінны глядзець на ўсе элементы 834 00:50:38,740 --> 00:50:42,260 справа ад мяне, каб знайсці мінімум. 835 00:50:42,260 --> 00:50:46,150 Такім чынам, гэта азначае, што мы хочам глядзець з г + 1 у канец спісу. 836 00:50:46,150 --> 00:50:51,610 І зараз, калі элемент, які мы ў цяперашні час глядзім на гэта менш, чым нашы мінімальныя да гэтага часу, 837 00:50:51,610 --> 00:50:54,190 які, памятаеце, што мы пачынаем з мінімальным проста быць 838 00:50:54,190 --> 00:50:57,020 любога элемента мы ў цяперашні час, я буду лічыць, што гэта мінімум. 839 00:50:57,020 --> 00:51:00,270 Калі я знайду элемент, які менш, чым гэта, то я буду казаць, добра, 840 00:51:00,270 --> 00:51:02,700 Ну, я знайшоў новы мінімум. 841 00:51:02,700 --> 00:51:06,080 Я буду памятаць, дзе што было мінімальным. 842 00:51:06,080 --> 00:51:09,560 >> Так што цяпер, калі я прайшоў праз гэта права несортированные сегменце, 843 00:51:09,560 --> 00:51:16,690 Я магу сказаць, што я збіраюся памяняць месцамі мінімальны элемент з элементам, які знаходзіцца ў становішчы я. 844 00:51:16,690 --> 00:51:21,100 Гэта збіраецца пабудаваць мой спіс, адсартаваны маёй частцы спісу злева направа, 845 00:51:21,100 --> 00:51:25,190 і мы ніколі не павінны глядзець на элемент зноў, як толькі яна ў гэтай частцы. 846 00:51:25,190 --> 00:51:27,930 Як толькі мы змяніў яго. 847 00:51:27,930 --> 00:51:30,260 Так што давайце працаваць выбар роду ў гэтым спісе. 848 00:51:30,260 --> 00:51:38,220 Сінія элементам тут будзе я, а чырвоны элемент будзе мінімальным элементам. 849 00:51:38,220 --> 00:51:41,570 Так што я ўсё пачынаецца шлях у левай частцы спісу, так на 5. 850 00:51:41,570 --> 00:51:44,610 Цяпер нам трэба знайсці мінімум несортированные элемент. 851 00:51:44,610 --> 00:51:49,480 Таму мы кажам, 0 <5, так што 0 з'яўляецца мой новы мінімум. 852 00:51:49,480 --> 00:51:53,820 >> Але я не магу спыніцца, таму што нават калі мы можам прызнаць, што 0 з'яўляецца найменшай, 853 00:51:53,820 --> 00:51:59,390 нам трэба запусціць праз любы іншы элемент спісу, каб пераканацца. 854 00:51:59,390 --> 00:52:01,760 Такім чынам, 1 больш, 6 больш, 4 больш. 855 00:52:01,760 --> 00:52:05,850 Гэта азначае, што пасля таго, гледзячы на ​​ўсе гэтыя элементы, я вызначалі 0 з'яўляецца найменшай. 856 00:52:05,850 --> 00:52:09,800 Так што я збіраюся памяняць 5 і 0. 857 00:52:09,800 --> 00:52:15,480 Аднойчы я памяняць, што я збіраюся атрымаць новы спіс, і я ведаю, што я ніколі не трэба глядзець на што 0 раз 858 00:52:15,480 --> 00:52:19,380 таму што як толькі я змяніў яго, я дамовіўся яго, і мы зрабілі. 859 00:52:19,380 --> 00:52:22,730 Цяпер так ужо здарылася, што сіні элемент зноў 5, 860 00:52:22,730 --> 00:52:26,030 і мы павінны глядзець на 1, 6 і 4, каб вызначыць, што 1 861 00:52:26,030 --> 00:52:31,520 з'яўляецца найменшай мінімальным элементам, таму мы перастаўляць 1 і 5. 862 00:52:31,520 --> 00:52:36,890 Зноў жа, мы павінны глядзець на - параўнаць ад 5 да 6 і 4, 863 00:52:36,890 --> 00:52:39,830 і мы збіраемся памяняць 4 і 5, і, нарэшце, параўнаць 864 00:52:39,830 --> 00:52:45,740 гэтыя 2 нумары і памяняць іх месцамі, пакуль мы не атрымаем нашы адсартаваны спіс. 865 00:52:45,740 --> 00:52:49,730 Любыя пытанні па выбары роду? 866 00:52:49,730 --> 00:52:56,420 Добра. Давайце пяройдзем да апошняй тэме тут, і гэта Рэкурсія. 867 00:52:56,420 --> 00:52:59,810 >> Рэкурсія, памятаеце, што гэта сапраўды мета рэч, дзе функцыя 868 00:52:59,810 --> 00:53:02,740 неаднаразова называе сябе. 869 00:53:02,740 --> 00:53:05,620 Так што ў нейкі момант, у той час як нашы Fuction неаднаразова называе сябе, 870 00:53:05,620 --> 00:53:10,100 там павінна быць некаторы кропцы, у якой мы перастаць называць сябе. 871 00:53:10,100 --> 00:53:13,670 Таму што калі мы не зробім гэтага, то мы проста будзем працягваць рабіць гэта вечна, 872 00:53:13,670 --> 00:53:16,660 і наша праграма проста не будзе спыняцца. 873 00:53:16,660 --> 00:53:19,200 Мы называем гэта стан базавага варыянту. 874 00:53:19,200 --> 00:53:22,570 І базавы варыянт, кажа, замест выкліку функцыі зноў, 875 00:53:22,570 --> 00:53:25,330 Я проста хачу вярнуць некаторы значэнне. 876 00:53:25,330 --> 00:53:28,080 Таму, як толькі мы вярнуліся значэнне, мы перасталі называць сябе, 877 00:53:28,080 --> 00:53:32,550 і астатнія выклікі мы зрабілі да гэтага часу можна вярнуць. 878 00:53:32,550 --> 00:53:36,050 У супрацьлегласць базу выпадку з'яўляецца рэкурсіўнага выпадку. 879 00:53:36,050 --> 00:53:39,050 І гэта, калі мы хочам зрабіць яшчэ адзін выклік функцыі, якія мы ў цяперашні час цалі 880 00:53:39,050 --> 00:53:44,690 І мы, верагодна, хоць і не заўсёды, хочуць выкарыстоўваць розныя аргументы. 881 00:53:44,690 --> 00:53:48,940 >> Так што, калі ў нас ёсць функцыя пад назвай F і F толькі што патэлефанаваў прымаць па 1 аргумент, 882 00:53:48,940 --> 00:53:52,010 і мы проста тэлефануюць F (1), F (1), F (1), і так ужо здарылася, што 883 00:53:52,010 --> 00:53:56,510 аргумент 1 трапляе ў рэкурсіўнага выпадку, мы яшчэ ні разу не збіраецца спыняцца. 884 00:53:56,510 --> 00:54:01,620 Нават калі ў нас ёсць базавы варыянт, мы павінны пераканацца, што ў канчатковым рахунку мы збіраемся ударыць, што базавы варыянт. 885 00:54:01,620 --> 00:54:04,250 Мы не проста захаваць, якія пражываюць у гэтым выпадку рэкурсіўнай. 886 00:54:04,250 --> 00:54:09,870 Наогул, калі мы называем сябе, мы, верагодна, будзем мець іншы аргумент кожны раз. 887 00:54:09,870 --> 00:54:12,700 Вось вельмі просты рэкурсіўнай функцыі. 888 00:54:12,700 --> 00:54:15,090 Так што гэта будзе вылічыць факториал ліку. 889 00:54:15,090 --> 00:54:17,790 Да пачатку тут мы маем нашу базу выпадку. 890 00:54:17,790 --> 00:54:22,330 У выпадку, калі п ≤ 1, мы не будзем называць факториальным зноў. 891 00:54:22,330 --> 00:54:26,490 Мы збіраемся спыняцца, мы проста збіраемся вярнуць некаторы значэнне. 892 00:54:26,490 --> 00:54:30,170 Калі гэта не так, то мы збіраемся ударыць нашым выпадку рэкурсіўнай. 893 00:54:30,170 --> 00:54:33,550 Заўважце, што тут мы не проста выклікам факториал (п), таму што гэта было б вельмі карысна. 894 00:54:33,550 --> 00:54:36,810 Мы будзем называць факториал нешта іншае. 895 00:54:36,810 --> 00:54:40,850 >> І таму вы можаце ўбачыць, у рэшце рэшт, калі мы перадамо факториал (5) або нешта, 896 00:54:40,850 --> 00:54:45,900 мы будзем называць факториал (4) і гэтак далей, і ў рэшце рэшт мы збіраемся ударыць гэтую базу выпадку. 897 00:54:45,900 --> 00:54:51,730 Такім чынам, гэта добра выглядае. Давайце паглядзім, што адбываецца, калі мы рэальна працаваць гэта. 898 00:54:51,730 --> 00:54:57,840 Гэта стэка, і давайце скажам, што асноўным будзе выклікаць гэтую функцыю з аргументам (4). 899 00:54:57,840 --> 00:55:02,200 Таму, як толькі бачыць і факториал = 4, фактарнага будзе называць сябе. 900 00:55:02,200 --> 00:55:05,010 Цяпер, раптам, у нас ёсць факториал (3). 901 00:55:05,010 --> 00:55:10,780 Такім чынам, гэтыя функцыі будзе працягваць расці, пакуль у рэшце рэшт мы патрапілі нашу базу выпадку. 902 00:55:10,780 --> 00:55:17,830 На дадзены момант, вяртае значэнне гэтага з'яўляецца вяртанне (NX вяртаецца значэння гэтага), 903 00:55:17,830 --> 00:55:21,290 Вяртаецца значэнне гэтага NX вяртаецца значэння гэтаму. 904 00:55:21,290 --> 00:55:23,290 У канчатковым рахунку мы павінны ўразіць некаторы лік. 905 00:55:23,290 --> 00:55:26,560 У верхняй тут, мы кажам, вяртае 1. 906 00:55:26,560 --> 00:55:30,650 Гэта азначае, што, калі мы вернемся гэты лік, мы можам поп гэтым з стэка. 907 00:55:30,650 --> 00:55:36,570 Так што гэта факториал (1), то зроблена. 908 00:55:36,570 --> 00:55:41,190 Калі 1 вяртаецца, гэта факториал (1) вяртаецца, гэта вяртанне да 1. 909 00:55:41,190 --> 00:55:46,910 Вяртаецца значэнне гэтага, памятаю, быў NX вяртаецца значэння гэтаму. 910 00:55:46,910 --> 00:55:50,720 Так нечакана, гэты хлопец ведае, што я хачу вярнуць 2. 911 00:55:50,720 --> 00:55:55,910 >> Так што памятаеце, вярнуць значэнне гэта проста NX вяртаецца значэння тут. 912 00:55:55,910 --> 00:56:01,160 Так што цяпер мы можам сказаць, 3 х 2 і, нарэшце, тут мы можам сказаць, 913 00:56:01,160 --> 00:56:04,010 гэта проста будзе 4 х 3 х 2. 914 00:56:04,010 --> 00:56:09,570 І як толькі гэта вяртаецца, мы спускаемся да аднаго ўнутры цэлага асноўны. 915 00:56:09,570 --> 00:56:15,460 Любыя пытанні па рэкурсіі? 916 00:56:15,460 --> 00:56:17,090 Добра. Такім чынам, ёсць больш часу на пытанні ў канцы, 917 00:56:17,090 --> 00:56:23,360 але цяпер Джозэф пакрые тыя, што засталіся пытанні. 918 00:56:23,360 --> 00:56:25,590 >> [Джозэф Ong] Усё ў парадку. Так што цяпер мы казалі аб рэкурсіі, 919 00:56:25,590 --> 00:56:27,840 Давайце трохі пагаворым аб тым, што зліццё сартавання. 920 00:56:27,840 --> 00:56:31,740 Зліццё роду ў асноўным іншы спосаб сартавання спісу лікаў. 921 00:56:31,740 --> 00:56:36,430 І як гэта працуе, з сартавання зліццём у вас ёсць спіс, і тое, што мы робім, 922 00:56:36,430 --> 00:56:39,120 мы кажам, давайце падзяліць гэта на 2 палоўкі. 923 00:56:39,120 --> 00:56:42,750 Мы спачатку запусціць сартавання зліццём зноў на левай палове, 924 00:56:42,750 --> 00:56:45,040 Затым мы запусцім сартавання зліццём на правай палове, 925 00:56:45,040 --> 00:56:50,240 і гэта дае нам цяпер 2 палоўкі, якія сартуюцца, і зараз мы збіраемся аб'яднаць гэтыя палоўкі разам. 926 00:56:50,240 --> 00:56:55,010 Гэта трохі цяжка зразумець без прыкладу, таму мы будзем праходзіць праз руху і паглядзець, што адбываецца. 927 00:56:55,010 --> 00:56:59,590 Такім чынам, вы пачынаеце з гэтага спісу, мы падзялілі яго на 2 палоўкі. 928 00:56:59,590 --> 00:57:02,300 Мы праводзім сартавання зліццём на левай палове першай. 929 00:57:02,300 --> 00:57:06,660 Дык вось левую палову, і цяпер мы прапусціць іх праз гэты спіс яшчэ раз 930 00:57:06,660 --> 00:57:09,800 які перадаецца ў сартавання зліццём, а затым мы паглядзім, зноў жа, 931 00:57:09,800 --> 00:57:13,270 у левай частцы гэтага спісу, і мы пабеглі сартавання зліццём на ім. 932 00:57:13,270 --> 00:57:15,880 Цяпер мы пяройдзем да спісу з 2 лічбаў, 933 00:57:15,880 --> 00:57:19,010 і цяпер левая палова ўсяго 1 элемент доўгі, і мы не можам 934 00:57:19,010 --> 00:57:23,380 падзяліць спіс, у якім толькі 1 элемент у палову, так што мы проста скажам, раз у нас ёсць 50, 935 00:57:23,380 --> 00:57:26,400 які знаходзіцца ўсяго ў 1 элемент, ён ужо адсартаваны. 936 00:57:26,400 --> 00:57:29,860 >> Як толькі мы скончым з гэтым, мы бачым, што мы можам 937 00:57:29,860 --> 00:57:32,230 перайсці на правую палову гэтага спісу, 938 00:57:32,230 --> 00:57:36,480 і 3 таксама сартуюцца, і таму цяпер, што абедзве паловы гэтага спісу сартуюцца 939 00:57:36,480 --> 00:57:39,080 мы можам аб'яднаць гэтыя лічбы разам. 940 00:57:39,080 --> 00:57:45,320 Такім чынам, мы глядзім на 50 і 3, 3 менш, чым 50, таму ён ідзе ў першы і затым 50 прыходзіць цалі 941 00:57:45,320 --> 00:57:49,340 Цяпер гэта будзе зроблена, мы вернемся да гэтага спісу і сартаванне гэта правая палова. 942 00:57:49,340 --> 00:57:52,440 42 з'яўляецца яго уласны нумар, так што гэта ўжо адсартаваныя. 943 00:57:52,440 --> 00:57:57,850 Такім чынам, зараз мы параўнаем гэтыя 2 і 3 менш, чым 42, так што атрымлівае пакласці ў першым, 944 00:57:57,850 --> 00:58:02,340 цяпер 42 атрымлівае пакласці ў, і 50 атрымлівае уставіў 945 00:58:02,340 --> 00:58:07,220 Дык вось, гэта спарадкаваныя, мы прайсці ўвесь шлях наверх, 1337 і 15. 946 00:58:07,220 --> 00:58:14,560 Ну, мы зараз паглядзім на левую палову гэтага спісу; 1337 сама па сабе так што ён сартуецца і тое ж самае з 15. 947 00:58:14,560 --> 00:58:19,020 Так што цяпер мы аб'яднаем гэтыя 2 нумары для сартавання, што першапачатковы спіс, 15 <1337, 948 00:58:19,020 --> 00:58:23,060 таму яна ідзе ў першы, то 1337 ідзе цалі 949 00:58:23,060 --> 00:58:26,640 А цяпер сартуюцца абедзве палоўкі зыходнага спісу наверсе. 950 00:58:26,640 --> 00:58:30,440 І ўсё, што нам трэба зрабіць, гэта аб'яднаць гэтыя. 951 00:58:30,440 --> 00:58:36,890 Мы глядзім на першыя 2 нумары з гэтага спісу, 3 <15, таму яна ідзе ў сартавання масіва ў першую чаргу. 952 00:58:36,890 --> 00:58:44,460 15 <42, таму яна ідзе цалі Цяпер, 42 <1337, які ідзе цалі 953 00:58:44,460 --> 00:58:51,010 50 <1337, таму яна ідзе цалі І заўважыў, што мы проста ўзялі 2 нумары з гэтага спісу. 954 00:58:51,010 --> 00:58:53,640 Такім чынам, мы не толькі чаргуючы 2 спісу. 955 00:58:53,640 --> 00:58:56,050 Мы проста гледзячы на ​​пачатак, і мы бярэм элемент 956 00:58:56,050 --> 00:59:00,270 вось і менш, а затым пакласці яго ў наш масіў. 957 00:59:00,270 --> 00:59:04,080 Цяпер мы аб'ядналіся ўсе палавінкі, і мы зрабілі. 958 00:59:04,080 --> 00:59:07,780 >> Любыя пытанні аб зліцці роду? Да? 959 00:59:07,780 --> 00:59:14,190 [Студэнт] Калі гэта расшчапленне ў розных групах, чаму яны не проста падзяліць яго адзін раз 960 00:59:14,190 --> 00:59:19,970 і ў вас ёсць 3 і 2 у групе? [Астатнія пытанні неразборліва] 961 00:59:19,970 --> 00:59:24,940 Прычына - так што пытанне ў тым, чаму мы не можам проста аб'яднаць іх у той першы крок пасля таго, як яны ў нас ёсць? 962 00:59:24,940 --> 00:59:29,530 Таму мы можам зрабіць гэта, пачніце з самага левага элементы з абодвух бакоў, 963 00:59:29,530 --> 00:59:33,040 , А затым ўзяць паменш і паклаў яго ў тым, што мы ведаем, што гэтыя 964 00:59:33,040 --> 00:59:35,290 асобныя спісы ў адсартаваным заказаў. 965 00:59:35,290 --> 00:59:37,290 Так што, калі я гляджу на самы левы элементы абедзвюх палоў, 966 00:59:37,290 --> 00:59:40,490 Я ведаю, што яны збіраюцца быць драбнюткіх элементаў з гэтых спісаў. 967 00:59:40,490 --> 00:59:43,930 Так што я магу пакласці іх у месцах найменшага элемента гэтага вялікага спісу. 968 00:59:43,930 --> 00:59:47,810 З іншага боку, калі я гляджу на гэтыя 2 спісу другога ўзроўня там, 969 00:59:47,810 --> 00:59:51,640 50, 3, 42, 1337 і 15, тым не сартуюцца. 970 00:59:51,640 --> 00:59:55,770 Так што, калі я гляджу на 50 і 1337, я збіраюся паставіць 50 у маім спісе першым. 971 00:59:55,770 --> 01:00:00,130 Але гэта не мае сэнсу, так як 3 найменшы элемент з усіх з іх. 972 01:00:00,130 --> 01:00:04,390 Такім чынам, адзіная прычына, мы можам зрабіць гэта аб'яднанне крок, таму што нашы спісы ўжо адсартаваныя. 973 01:00:04,390 --> 01:00:07,010 Менавіта таму мы павінны спускацца на ўсім шляху да дна 974 01:00:07,010 --> 01:00:09,800 таму што, калі ў нас ёсць толькі адно лік, вы ведаеце, што адзін нумар 975 01:00:09,800 --> 01:00:14,120 само па сабе ўжо з'яўляецца адсартаваны спіс. 976 01:00:14,120 --> 01:00:19,360 >> Ёсць пытанні? Няма? 977 01:00:19,360 --> 01:00:24,260 Складанасць? Ну, вы бачыце, што на кожным кроку ёсць канец ліку, 978 01:00:24,260 --> 01:00:27,590 і мы можам падзяліць спіс часопіса 1/2 п раз, 979 01:00:27,590 --> 01:00:31,700 дзе мы атрымаем гэты часопіс п х п складанасці. 980 01:00:31,700 --> 01:00:34,940 І вы ўбачыце, у лепшым выпадку для сартавання зліццём п § п, і так ужо здарылася, 981 01:00:34,940 --> 01:00:39,340 , Што ў горшым выпадку, ці Ω там, таксама п п ўвайсці. 982 01:00:39,340 --> 01:00:42,480 Трэба мець на ўвазе. 983 01:00:42,480 --> 01:00:45,750 Рухаемся далей, давайце пяройдзем да некаторых супер асноўны файл I / O. 984 01:00:45,750 --> 01:00:48,830 Калі вы паглядзіце на Scramble, вы заўважыце, у нас была нейкая сістэма 985 01:00:48,830 --> 01:00:51,270 дзе вы маглі б напісаць у лог-файл, калі вы чытаеце па коду. 986 01:00:51,270 --> 01:00:53,730 Давайце паглядзім, як вы маглі б зрабіць гэта. 987 01:00:53,730 --> 01:00:57,450 Ну, у нас Fprintf, якія вы можаце думаць, як толькі Printf, 988 01:00:57,450 --> 01:01:01,720 але толькі друк у файл, а і, такім чынам, F у самым пачатку. 989 01:01:01,720 --> 01:01:07,570 Такі код тут, што ён робіць, як вы, магчыма, бачылі ў Scramble, 990 01:01:07,570 --> 01:01:12,310 яна праходзіць праз вашу 2-мерны масіў з друку шэраг за шэрагам, што ліку. 991 01:01:12,310 --> 01:01:17,850 У гэтым выпадку Выводзіць на ваш тэрмінал ці што мы называем стандартны вывад раздзеле. 992 01:01:17,850 --> 01:01:22,170 >> І цяпер, у гэтым выпадку, усё, што мы павінны зрабіць, гэта замяніць Printf з Fprintf, 993 01:01:22,170 --> 01:01:26,770 сказаць яму, што файл, які вы хочаце друкаваць, і ў гэтым выпадку ён проста выводзіць яе на гэты файл 994 01:01:26,770 --> 01:01:32,230 замест таго, каб друкаваць яго на тэрмінал. 995 01:01:32,230 --> 01:01:36,500 Ну, тое, што напрошваецца пытанне: Дзе ж узяць такога роду файлаў з, так? 996 01:01:36,500 --> 01:01:39,840 Мы прайшлі ўвайсці ў гэтую Fprintf Fuction але мы паняцця не меў, адкуль яно ўзялося. 997 01:01:39,840 --> 01:01:43,980 Ну, у самым пачатку кода, тое, што мы мелі, быў гэты кавалак кода сюды, 998 01:01:43,980 --> 01:01:48,340 , Які ў асноўным кажа, што адкрыць файл выклікае log.txt. 999 01:01:48,340 --> 01:01:53,220 Што мы робім пасля гэтага, што мы павінны пераканацца, што файл на самай справе быў паспяхова адкрыты. 1000 01:01:53,220 --> 01:01:57,070 Так што, магчыма, не па некалькіх прычынах, вам не хапае месца на вашым кампутары, напрыклад. 1001 01:01:57,070 --> 01:01:59,790 Такім чынам, гэта заўсёды важна, перш чым рабіць любыя аперацыі з файламі 1002 01:01:59,790 --> 01:02:03,300 што мы правяраем, што файл быў адкрыты паспяхова. 1003 01:02:03,300 --> 01:02:09,330 Так што гэта, гэта аргумент Еореп, добра, мы можам адкрыць файл па-рознаму. 1004 01:02:09,330 --> 01:02:13,510 Што мы можам зрабіць, мы можам перадаць яго вага, а значыць змяніць файл, калі ён выходзіць ужо, 1005 01:02:13,510 --> 01:02:18,070 Мы можам перадаць, што яны дадаем у канец файла, а не перакрываючы яго, 1006 01:02:18,070 --> 01:02:22,730 ці мы можам паказаць R, што азначае, давайце адкрыць файл толькі для чытання. 1007 01:02:22,730 --> 01:02:24,890 Такім чынам, калі праграма спрабуе ўнесці змены ў файл, 1008 01:02:24,890 --> 01:02:30,140 крычаць на іх і не дазваляюць ім гэта зрабіць. 1009 01:02:30,140 --> 01:02:33,320 Нарэшце, калі мы скончылі з файлам, зрабіў робяць аперацыі на ёй, 1010 01:02:33,320 --> 01:02:35,860 Мы павінны пераканацца, што мы закрываем файл. 1011 01:02:35,860 --> 01:02:38,830 І вось у канцы вашай праграмы, вы збіраецеся перадаць іх зноў 1012 01:02:38,830 --> 01:02:42,120 гэта файл, які вы адкрылі, і проста зачыніць яго. 1013 01:02:42,120 --> 01:02:44,650 Так што гэта нешта важнае, што вы павінны пераканацца, што вы робіце. 1014 01:02:44,650 --> 01:02:47,180 Так што памятаеце, што вы можаце адкрыць файл, то вы можаце запісаць у файл, 1015 01:02:47,180 --> 01:02:51,270 рабіць аперацыі ў файле, але тады вы павінны зачыніць файл у канцы. 1016 01:02:51,270 --> 01:02:53,270 >> Любыя пытанні па асноўных файла I / O? Да? 1017 01:02:53,270 --> 01:02:58,050 [Студэнт пытанне, неразборліва] 1018 01:02:58,050 --> 01:03:02,480 Прама тут. Пытанне ў тым, дзе ж гэты файл log.txt з'яўляюцца? 1019 01:03:02,480 --> 01:03:07,890 Ну, калі вы проста даць яму log.txt, ён стварае яго ў тым жа каталогу, што і выкананы файл. 1020 01:03:07,890 --> 01:03:10,500 Так што, калі вы - >> [Студэнцкі пытанне, неразборліва] 1021 01:03:10,500 --> 01:03:18,830 Так. У той жа тэчцы, ці ў тым жа каталогу, як вы гэта называеце. 1022 01:03:18,830 --> 01:03:21,400 Цяпер памяць, стэк і кучу. 1023 01:03:21,400 --> 01:03:23,400 Так, як гэта памяць, выкладзеных у кампутары? 1024 01:03:23,400 --> 01:03:26,270 Ну, вы можаце сабе памяць як свайго роду гэтым блоку тут. 1025 01:03:26,270 --> 01:03:30,260 І ў памяці ў нас ёсць тое, што называецца кучай затрымаліся там, і стэк, што там унізе. 1026 01:03:30,260 --> 01:03:34,480 І куча расце ўніз, а стэк расце ўверх. 1027 01:03:34,480 --> 01:03:38,620 Так як Томі згадваў, - о, добра, і ў нас ёсць гэтыя іншыя 4 сегментаў, якія я атрымаю у секунду - 1028 01:03:38,620 --> 01:03:42,890 Як сказаў Томі раней, вы ведаеце, як яго называюць сябе функцыі і называюць адзін аднаго? 1029 01:03:42,890 --> 01:03:44,930 Яны ствараюць такога роду кадра стэка. 1030 01:03:44,930 --> 01:03:47,360 Ну, калі асноўныя выклікі Фу, Фу атрымлівае пакласці ў стэк. 1031 01:03:47,360 --> 01:03:52,430 Foo называе, бар атрымаеце паставім у стэк, і што атрымлівае пакласці ў стэк пасля. 1032 01:03:52,430 --> 01:03:57,040 І калі яны вернуцца, кожная з іх атрымліваюць зняць стэк. 1033 01:03:57,040 --> 01:04:00,140 Што кожны з гэтых месцаў і памяць трымаць? 1034 01:04:00,140 --> 01:04:03,110 Ну, верхні, які з'яўляецца сегмент тэксту, утрымлівае саму праграму. 1035 01:04:03,110 --> 01:04:06,390 Такім чынам, машынны код, што там, як толькі вы скампіляваць праграму. 1036 01:04:06,390 --> 01:04:08,520 Далей, любая ініцыялізуецца глабальныя зменныя. 1037 01:04:08,520 --> 01:04:12,660 >> Такім чынам, у Вас ёсць глабальныя зменныя ў вашай праграме, а вы кажаце, як, = 5, 1038 01:04:12,660 --> 01:04:15,260 , Які атрымлівае пакласці ў гэтым сегменце, і прама пад гэтым, 1039 01:04:15,260 --> 01:04:18,990 ў вас ёсць нейкія неинициализированные глабальныя дадзеныя, якія проста INT, 1040 01:04:18,990 --> 01:04:20,990 але вы не кажу, што гэта роўна нічога. 1041 01:04:20,990 --> 01:04:23,870 Зразумейце, гэта глабальныя зменныя, так што яны за межамі асноўнага. 1042 01:04:23,870 --> 01:04:28,560 Такім чынам, гэта азначае, што любыя глабальныя зменныя, якія абвешчаныя, але не ініцыялізуецца. 1043 01:04:28,560 --> 01:04:32,310 Так што ў кучы? Памяць размяркоўваецца з дапамогай таНос, які мы атрымаем у няшмат. 1044 01:04:32,310 --> 01:04:35,990 І, нарэшце, са стэкам ў вас ёсць нейкія лакальныя зменныя 1045 01:04:35,990 --> 01:04:39,950 і любы функцыі можна выклікаць у любы з іх параметраў. 1046 01:04:39,950 --> 01:04:43,720 Апошняя рэч, вы сапраўды не павінны ведаць, што зменныя асяроддзі рабіць, 1047 01:04:43,720 --> 01:04:46,700 але кожны раз, калі вы запускаеце праграму, ёсць нешта звязана, як 1048 01:04:46,700 --> 01:04:49,550 гэтае імя карыстальніка, які запусціў праграму. 1049 01:04:49,550 --> 01:04:51,550 І гэта будзе як бы на дне. 1050 01:04:51,550 --> 01:04:54,540 З пункту гледжання адрасы памяці, якія з'яўляюцца шаснаццаткавыя значэння, 1051 01:04:54,540 --> 01:04:58,170 Значэння ў верхняй пачынаюцца з 0, і прайсці ўвесь шлях да дна. 1052 01:04:58,170 --> 01:05:00,440 У гэтым выпадку, калі вы знаходзіцеся на 32-бітнай сістэме, 1053 01:05:00,440 --> 01:05:05,390 адрасе, паказанаму ўнізе будзе 0x, а затым А.Ф., таму што гэта 32 біт, 1054 01:05:05,390 --> 01:05:10,890 , Што на 8 байт, і ў гэтым выпадку 8 байт адпавядае 8 шаснаццатковых лічбаў. 1055 01:05:10,890 --> 01:05:20,110 Так што тут вы будзеце мець, быццам бы, 0xffffff, і там вы будзеце мець 0. 1056 01:05:20,110 --> 01:05:23,660 Так што паказальнікі? Некаторыя з вас, магчыма, не пакрытыя гэтым у раздзеле раней. 1057 01:05:23,660 --> 01:05:26,660 але мы не ўдавацца ў лекцыі, таму паказальнік проста тып дадзеных 1058 01:05:26,660 --> 01:05:34,030 якія крамах, а не нейкае значэнне, напрыклад 50, яна захоўвае адрас пэўнае месца ў памяці. 1059 01:05:34,030 --> 01:05:36,020 Як і што памяць [неразборліва]. 1060 01:05:36,020 --> 01:05:41,120 Такім чынам, у дадзеным выпадку, тое, што мы ёсць, мы маем паказальнік на цэлае або цэлы лік *, 1061 01:05:41,120 --> 01:05:46,210 і змяшчае гэтым шаснаццатковы адрас 0xDEADBEEF. 1062 01:05:46,210 --> 01:05:50,880 >> Такім чынам, што мы маем цяпер, гэты паказальнік паказвае на пэўнае месца ў памяці, 1063 01:05:50,880 --> 01:05:56,020 і гэта толькі, значэнне 50 у гэта размяшчэнне ў памяці. 1064 01:05:56,020 --> 01:06:01,810 На некаторых 32-бітных сістэмах, на ўсіх 32-бітных сістэм, паказальнікі займаюць 32 біта ці 4 байта. 1065 01:06:01,810 --> 01:06:06,020 Але, напрыклад, на 64-бітнай сістэме, паказальнікі з'яўляюцца 64-бітнымі. 1066 01:06:06,020 --> 01:06:08,040 Так што тое, што вы хочаце, каб трымаць у розуме. 1067 01:06:08,040 --> 01:06:12,310 Такім чынам, на канец-бітнай сістэмы, паказальнік канца біт. 1068 01:06:12,310 --> 01:06:17,320 Паказальнікі з'яўляюцца свайго роду цяжка пераварыць без дадатковых рэчаў, 1069 01:06:17,320 --> 01:06:20,300 так давайце пройдзем прыклад дынамічнага размеркавання памяці. 1070 01:06:20,300 --> 01:06:25,130 Што дынамічнага размеркавання памяці робіць для вас, або тое, што мы называем таНос, 1071 01:06:25,130 --> 01:06:29,280 яна дазваляе вылучыць нейкі дадзеных за межамі здымачнай пляцоўцы. 1072 01:06:29,280 --> 01:06:31,830 Такім чынам, гэтыя дадзеныя з'яўляецца свайго роду больш сталым на працягу ўсяго тэрміну праграмы. 1073 01:06:31,830 --> 01:06:36,430 Таму што, як вы ведаеце, калі вы аб'явіце х ўнутры функцыі, а функцыя вяртае значэнне, 1074 01:06:36,430 --> 01:06:40,910 Вам больш не маюць доступу да дадзеных, якія захоўваюцца ў х. 1075 01:06:40,910 --> 01:06:44,420 Што паказальнікі будзем рабіць, яны дазваляюць нам захоўваць памяць ці захоўваюць значэння 1076 01:06:44,420 --> 01:06:46,840 ў іншы сегмент памяці, а менавіта ў кучу. 1077 01:06:46,840 --> 01:06:49,340 Цяпер, калі мы вернемся з функцый тых часоў, пакуль у нас ёсць паказальнік 1078 01:06:49,340 --> 01:06:54,960 у тое ж месца ў памяці, тое, што мы можам зрабіць, мы можам проста глядзець на значэнні там. 1079 01:06:54,960 --> 01:06:58,020 Давайце паглядзім на прыкладзе: Гэта наша памяць макет зноў. 1080 01:06:58,020 --> 01:07:00,050 І ў нас ёсць гэтая функцыя, асноўны. 1081 01:07:00,050 --> 01:07:06,870 Што яна робіць гэта - добра, так проста, праўда? - Int х = 5, вось толькі на стэку ў галоўным. 1082 01:07:06,870 --> 01:07:12,450 >> З іншага боку, зараз мы аб'яўляем паказальнік, які выклікае функцыю giveMeThreeInts. 1083 01:07:12,450 --> 01:07:16,800 І вось зараз мы ідзем у гэтую функцыю, і мы ствараем новы кадр стэка для яго. 1084 01:07:16,800 --> 01:07:20,440 Аднак, у гэтым кадры стэка, мы заяўляем Int * тэмпература, 1085 01:07:20,440 --> 01:07:23,210 які ў mallocs 3 цэлых для нас. 1086 01:07:23,210 --> 01:07:25,880 Такім чынам, памер Int дасць нам колькі байт гэтым Int ёсць, 1087 01:07:25,880 --> 01:07:29,620 і таНос дае нам, што многія байт прасторы ў кучы. 1088 01:07:29,620 --> 01:07:32,890 Такім чынам, у гэтым выпадку, мы стварылі дастаткова месца для 3 ліку, 1089 01:07:32,890 --> 01:07:36,830 і куча шлях там, таму я намаляваў яе вышэй. 1090 01:07:36,830 --> 01:07:42,900 Як толькі мы скончым, мы вернемся сюды, вам трэба ўсяго толькі 3 цэлымі вярнуліся, 1091 01:07:42,900 --> 01:07:47,000 і яна вяртае адрас, у дадзеным выпадку над тым, дзе гэтая памяць. 1092 01:07:47,000 --> 01:07:51,250 І мы паставілі паказальнік = выключальнік, і там у нас ёсць яшчэ адзін паказальнік. 1093 01:07:51,250 --> 01:07:54,550 Але тое, што гэтая функцыя вяртае ўкладваецца тут і знікае. 1094 01:07:54,550 --> 01:07:59,250 Такім чынам, тэмп знікае, але мы па-ранейшаму падтрымліваюць адрасы, дзе 1095 01:07:59,250 --> 01:08:01,850 гэтыя 3 ліку знаходзяцца ўнутры сеткі. 1096 01:08:01,850 --> 01:08:06,180 Такім чынам, у гэтым наборы, паказальнікі вобласцю на мясцовым узроўні для складзеных кадраў, 1097 01:08:06,180 --> 01:08:09,860 але памяць да якіх яны ставяцца ў кучу. 1098 01:08:09,860 --> 01:08:12,190 >> Ці мае гэта сэнс? 1099 01:08:12,190 --> 01:08:14,960 [Студэнт] Не маглі б вы паўтарыць? >> [Іосіф] Так. 1100 01:08:14,960 --> 01:08:20,270 Так што, калі я вярнуся ледзь-ледзь, вы бачыце, што тэмпература выдзелена 1101 01:08:20,270 --> 01:08:23,500 некаторы аб'ём памяці ў кучы там. 1102 01:08:23,500 --> 01:08:28,680 Таму, калі гэтая функцыя, giveMeThreeInts вяртаецца, гэты стэк тут збіраецца знікаць. 1103 01:08:28,680 --> 01:08:35,819 А разам з ёй любы з зменных, у дадзеным выпадку, гэта паказальнік, які быў вылучаны ў стэк кадра. 1104 01:08:35,819 --> 01:08:39,649 Гэта значыць знікне, але так як мы вярнуліся тэмпература 1105 01:08:39,649 --> 01:08:46,330 і мы паказальніка = тэмпература, паказальнік цяпер будзе ўказваць тую ж самую памяць аб месцы, тэмп быў. 1106 01:08:46,330 --> 01:08:50,370 Так што цяпер, нават калі мы страцім тэмп, што мясцовыя паказальнік, 1107 01:08:50,370 --> 01:08:59,109 Мы па-ранейшаму захоўваюць адрас памяці, што ён быў накіраваны ўнутр гэтай зменнай паказальнік. 1108 01:08:59,109 --> 01:09:03,740 Пытанні? Гэта можа быць нават заблытанай тэмы, калі вы не перайшлі яго ў раздзеле. 1109 01:09:03,740 --> 01:09:09,240 Мы можам, ваш TF вызначана пойдзе на гэта і, вядома, мы можам адказаць на пытанні 1110 01:09:09,240 --> 01:09:11,500 У канцы сесіі па аглядзе для гэтага. 1111 01:09:11,500 --> 01:09:14,220 Але гэта свайго роду складанае пытанне, і ў мяне ёсць іншыя прыклады, якія збіраюцца, каб паказаць 1112 01:09:14,220 --> 01:09:18,790 , Якая дапаможа высветліць, што паказальнікі на самай справе. 1113 01:09:18,790 --> 01:09:22,500 >> У гэтым выпадку, паказальнікаў эквівалентна масіваў, 1114 01:09:22,500 --> 01:09:25,229 так што я магу проста выкарыстоўваць гэты паказальнік, як тое ж самае, Int масіва. 1115 01:09:25,229 --> 01:09:29,840 Так што я індэксацыі ў 0, і змяненне першае чысло 1, 1116 01:09:29,840 --> 01:09:39,689 змена 2. ліку 2, і 3-й цэлы лік 3. 1117 01:09:39,689 --> 01:09:44,210 Так што больш на паказальнікі. Ну, успомніце Бинки. 1118 01:09:44,210 --> 01:09:48,319 У гэтым выпадку мы вылучылі паказальнік, ці мы абвясцілі паказальнік, 1119 01:09:48,319 --> 01:09:52,760 але спачатку, калі я толькі што абвясцілі паказальнік, гэта не паказвае на любой памяці. 1120 01:09:52,760 --> 01:09:54,930 Гэта проста смецце значэння ўнутры яго. 1121 01:09:54,930 --> 01:09:56,470 Так што я паняцця не маю, дзе гэты паказальнік вызначае. 1122 01:09:56,470 --> 01:10:01,630 Ён мае адрас, які проста напоўнены 0 і 1, дзе ён быў з самага пачатку абвешчаны. 1123 01:10:01,630 --> 01:10:04,810 Я нічога не магу зрабіць з гэтым, пакуль я называю таНос на яе 1124 01:10:04,810 --> 01:10:08,390 і гэта дае мне мала месца ў кучы, дзе я магу паставіць значэння ўнутры. 1125 01:10:08,390 --> 01:10:11,980 Зноў жа, я не ведаю, што ўсярэдзіне гэтай памяці. 1126 01:10:11,980 --> 01:10:16,780 Таму першае, што я павінен зрабіць, гэта праверыць, ці з'яўляецца сістэма мела досыць памяці 1127 01:10:16,780 --> 01:10:20,850 , Каб даць мне таму 1 цэлае, у першую чаргу, таму я раблю гэта праверыць. 1128 01:10:20,850 --> 01:10:25,020 Калі паказальнік пусты, гэта азначае, што ў яго не было досыць месцы, ці іншыя памылкі, 1129 01:10:25,020 --> 01:10:26,320 так што я павінен выйсці з маёй праграмы. 1130 01:10:26,320 --> 01:10:29,400  Але калі гэта і не ўдалося, цяпер я магу выкарыстоўваць гэты паказальнік 1131 01:10:29,400 --> 01:10:35,020 і тое, што * паказальнік робіць гэта наступным дзе адрас 1132 01:10:35,020 --> 01:10:38,480 дзе гэта значэнне, і гэта адрознівае яго роўным 1. 1133 01:10:38,480 --> 01:10:41,850 Так што тут, мы правяраем, калі што памяць існуе. 1134 01:10:41,850 --> 01:10:45,380 >> Калі вы ведаеце, яна існуе, вы можаце змясціць у яе 1135 01:10:45,380 --> 01:10:50,460 Якое значэнне вы хочаце ўкласці ў яе, у гэтым выпадку 1. 1136 01:10:50,460 --> 01:10:53,060 Як толькі мы скончым з гэтым, неабходна, каб вызваліць гэты паказальнік 1137 01:10:53,060 --> 01:10:57,160 таму што мы павінны вярнуцца да сістэмы, памяці, якія вы прасілі ў першую чаргу. 1138 01:10:57,160 --> 01:10:59,690 Паколькі кампутар не ведае, калі мы скончым з гэтым. 1139 01:10:59,690 --> 01:11:02,510 У гэтым выпадку мы відавочна кажа ён, добра, мы скончылі з гэтай памяццю. 1140 01:11:02,510 --> 01:11:10,780 Калі некаторыя іншыя працэсы ў ёй мае патрэбу, некаторыя іншыя праграмы ў ёй мае патрэбу, не саромейцеся ісці наперад і прымаць яго. 1141 01:11:10,780 --> 01:11:15,110 Што мы можам зрабіць, гэта мы можам проста атрымаць адрас лакальных зменных на здымачнай пляцоўцы. 1142 01:11:15,110 --> 01:11:19,080 Так Int х знаходзіцца ўсярэдзіне складзеныя рамках асноўнай. 1143 01:11:19,080 --> 01:11:23,060 І калі мы выкарыстоўваем гэты знак, гэта і аператара, што яна робіць гэта 1144 01:11:23,060 --> 01:11:27,310 ён прымае х, і х толькі некаторыя дадзеныя ў памяці, але ў яго ёсць адрас. 1145 01:11:27,310 --> 01:11:33,790 Яна знаходзіцца недзе. Так, патэлефанаваўшы па тэлефоне і х, тое, што гэта робіць ён дае нам па адрасе х. 1146 01:11:33,790 --> 01:11:38,430 Робячы гэта, мы робім паказальнік кропкі, дзе х знаходзіцца ў памяці. 1147 01:11:38,430 --> 01:11:41,710 Цяпер мы проста зрабіць нешта накшталт * х, мы збіраемся, каб атрымаць 5 назад. 1148 01:11:41,710 --> 01:11:43,820 Зорка завецца разнаймення яго. 1149 01:11:43,820 --> 01:11:46,640 Вы вынікаеце адрас, і вы атрымаеце значэнне яна захоўваецца там. 1150 01:11:51,000 --> 01:11:53,310 >> Ёсць пытанні? Да? 1151 01:11:53,310 --> 01:11:56,500 [Студэнт] Калі вы гэтага не зробіце 3-завостраныя рэч, гэта ўсё яшчэ скампіляваць? 1152 01:11:56,500 --> 01:11:59,490 Так. Калі вы гэтага не зробіце 3-паказальнік рэч, яна па-ранейшаму будзе складаць, 1153 01:11:59,490 --> 01:12:02,720 Але я пакажу вам, што адбываецца ў секунду, а без гэтага, 1154 01:12:02,720 --> 01:12:04,860 гэта тое, што мы называем уцечкай памяці. Вы не даяце сістэме 1155 01:12:04,860 --> 01:12:07,850 Рэзервовае яго памяці, так што праз некаторы час праграма будзе назапашвацца 1156 01:12:07,850 --> 01:12:10,940 памяць, што яна не выкарыстоўваецца, і нішто іншае не можа яго выкарыстоўваць. 1157 01:12:10,940 --> 01:12:15,750 Калі вы калі-небудзь бачылі Firefox з 1,5 мільёна кілабайт на вашым кампутары, 1158 01:12:15,750 --> 01:12:17,840 ў дыспетчару задач, вось што адбываецца. 1159 01:12:17,840 --> 01:12:20,760 У вас ёсць уцечкі памяці ў праграме, што яны не апрацоўвае. 1160 01:12:23,080 --> 01:12:26,240 Так як жа арыфметыка паказальнікаў працы? 1161 01:12:26,240 --> 01:12:29,480 Ну, арыфметыка паказальнікаў накшталт як індэксацыя ў масіве. 1162 01:12:29,480 --> 01:12:36,370 У гэтым выпадку, у мяне ёсць паказальнік, і тое, што я раблю, я раблю паказальнік паказвае на першы элемент 1163 01:12:36,370 --> 01:12:42,100 гэтага масіў з 3 цэлых лікаў, якія я вылучыў. 1164 01:12:42,100 --> 01:12:46,670 Так што цяпер мне рабіць, зорка проста мяняе паказальнік на першы элемент у спісе. 1165 01:12:46,670 --> 01:12:49,140 Зорка паказальнік 1 ачкоў тут. 1166 01:12:49,140 --> 01:12:53,140 Такім чынам, паказальнік мышы тут, +1 з'яўляецца паказальнікам тут, паказальнік 2 з'яўляецца тут. 1167 01:12:53,140 --> 01:12:56,610 >> Так што даданне 1, тое ж самае, рухаючыся па гэтым масіве. 1168 01:12:56,610 --> 01:12:59,880 Што мы робім, калі мы робім паказальнік 1 Вы атрымаеце адрас тут, 1169 01:12:59,880 --> 01:13:04,180 і для таго, каб атрымаць значэнне тут, вы паклалі зорку ў ад усяго выказвання 1170 01:13:04,180 --> 01:13:05,990 Звяртацца да іх. 1171 01:13:05,990 --> 01:13:09,940 Такім чынам, у дадзеным выпадку, я ўсталёўваю першае месца ў гэтым масіве ў 1, 1172 01:13:09,940 --> 01:13:13,970 Другое месца 2, а трэцяе месца на 3. 1173 01:13:13,970 --> 01:13:18,180 Затым, што я раблю тут ёсць я друкую наш паказальнік +1, 1174 01:13:18,180 --> 01:13:19,970 які проста дае мне 2. 1175 01:13:19,970 --> 01:13:23,650 Цяпер я павялічваючы паказальнік, таму паказальнік роўна паказальнік +1, 1176 01:13:23,650 --> 01:13:26,780 , Якая рухаецца наперад. 1177 01:13:26,780 --> 01:13:30,810 І вось цяпер, калі я раздрукаваць паказальнік +1, паказальнік 1 цяпер 3, 1178 01:13:30,810 --> 01:13:33,990 які ў дадзеным выпадку выводзіць 3. 1179 01:13:33,990 --> 01:13:36,560 І для таго, каб нешта бясплатна, паказальнік, які я даю яму 1180 01:13:36,560 --> 01:13:40,540 павінны быць накіраваны на пачатак масіва, які я вярнуўся з таНос. 1181 01:13:40,540 --> 01:13:43,430 Такім чынам, у дадзеным выпадку, калі б я быў тэлефанаваць 3 прама тут, гэта было б няправільна, 1182 01:13:43,430 --> 01:13:45,070 таму што гэта ў сярэдзіне масіва. 1183 01:13:45,070 --> 01:13:48,820 Я павінен адняць, каб атрымаць на ранейшым месцы 1184 01:13:48,820 --> 01:13:50,420 пачатковая першым месцы перш чым я змагу вызваліць яго. 1185 01:13:56,300 --> 01:13:58,450 Такім чынам, вось больш складаны прыклад. 1186 01:13:58,450 --> 01:14:03,360 У гэтым выпадку, мы выдзяленні 7 знакаў у масіў знакаў. 1187 01:14:03,360 --> 01:14:06,480 >> І ў гэтым выпадку тое, што мы робім, мы цыклаў на працягу першых 6 з іх, 1188 01:14:06,480 --> 01:14:09,900 і мы ўсталёўваем іх у Z. 1189 01:14:09,900 --> 01:14:13,350 Такім чынам, для Int я = 0, г> 6, я + +, 1190 01:14:13,350 --> 01:14:16,220 Такім чынам, паказальнік + Я проста даць нам, у дадзеным выпадку, 1191 01:14:16,220 --> 01:14:20,860 паказальнік, паказальнік +1, 2 паказальнік, паказальнік +3, і гэтак далей, і гэтак далей у цыкле. 1192 01:14:20,860 --> 01:14:24,040 Што ён збіраецца рабіць гэта атрымлівае, што адрас, разыменовывает яго, каб атрымаць значэнне, 1193 01:14:24,040 --> 01:14:27,440 і змены, значэнне Z. 1194 01:14:27,440 --> 01:14:30,350 Затым, у канцы памятаеце, што гэта радок, ці не так? 1195 01:14:30,350 --> 01:14:33,560 Усе радкі павінны скончыць з нулявой сімвал завяршэння. 1196 01:14:33,560 --> 01:14:38,620 Такім чынам, што я раблю, гэта паказальнік ў 6 я паставіў пусты знак канца цалі 1197 01:14:38,620 --> 01:14:43,980 А зараз тое, што я ў асноўным раблю тут рэалізуецца Printf для радка, ці не так? 1198 01:14:43,980 --> 01:14:46,190 >> Такім чынам, калі ж Printf цяпер, калі яна дасягнула канца радка? 1199 01:14:46,190 --> 01:14:48,230 Калі яна знізіцца да нулявой сімвал завяршэння. 1200 01:14:48,230 --> 01:14:52,030 Такім чынам, у дадзеным выпадку, мае зыходныя кропкі, паказальнік на пачатак гэтага масіва. 1201 01:14:52,030 --> 01:14:56,410 Я надрукаваць першы знак з. Я перамясціць яго на адзін. 1202 01:14:56,410 --> 01:14:58,420 Я друкую гэты знак з. Я рухаюся яго. 1203 01:14:58,420 --> 01:15:02,180 І я працягваю рабіць гэта, пакуль я дайсці да канца. 1204 01:15:02,180 --> 01:15:07,750 А цяпер паказальнік канца * будзе разыменовать і атрымаць нулявы завяршальны сімвал назад. 1205 01:15:07,750 --> 01:15:11,780 І таму мая ў той час як цыкл выконваецца толькі тады, калі гэта значэнне не з'яўляецца нулявой сімвал завяршэння. 1206 01:15:11,780 --> 01:15:13,770 Такім чынам, цяпер я выйсці з гэтай завесы. 1207 01:15:18,780 --> 01:15:21,180 І таму, калі я адняць 6 з гэтага паказальніка, 1208 01:15:21,180 --> 01:15:22,860 Я вяртаюся ўвесь шлях з самага пачатку. 1209 01:15:22,860 --> 01:15:27,880 Памятаеце, я раблю гэта таму, што я павінен пайсці да пачатку, каб вызваліць яго. 1210 01:15:27,880 --> 01:15:30,270 >> Дык вось, я ведаю, што было шмат. Ці ёсць пытанні? 1211 01:15:30,270 --> 01:15:31,870 Калі ласка, так? 1212 01:15:31,870 --> 01:15:36,610 [Студэнт пытанне неразборліва] 1213 01:15:36,610 --> 01:15:38,190 Ці можаце вы сказаць, што гучней? Выбачайце. 1214 01:15:38,190 --> 01:15:44,140 [Студэнт] На апошнім слайдзе права, перш чым вызваліць паказальнік, 1215 01:15:44,140 --> 01:15:47,300 дзе вы былі на самай справе змяніць значэнне паказальніка? 1216 01:15:47,300 --> 01:15:50,370 [Джозэф] Так, прама тут. >> [Студэнт] О, усё ў парадку. 1217 01:15:50,370 --> 01:15:51,890 [Джозэф] Такім чынам, у мяне ёсць паказальнік мінус мінус, права, 1218 01:15:51,890 --> 01:15:54,140 які перамяшчае рэчы назад на адзін, а потым вызваліць яго, 1219 01:15:54,140 --> 01:15:57,000 таму што гэты паказальнік павінен быць паказала на пачатак масіва. 1220 01:15:57,000 --> 01:16:00,420 [Студэнт] Але гэта быў бы не патрэбен, калі б вы спыніліся пасля гэтага радка. 1221 01:16:00,420 --> 01:16:03,130 [Джозэф] Так што, калі я спыніўся пасля гэтага, гэта будзе разглядацца як ўцечка памяці, 1222 01:16:03,130 --> 01:16:04,810 таму што я не запусціць бясплатны. 1223 01:16:04,810 --> 01:16:11,290 [Студэнт] Я [неразборліва] пасля першых трох лініях, дзе вы былі паказальніка 1 [неразборліва]. 1224 01:16:11,290 --> 01:16:13,140 [Джозэф] Угу. Так, што пытанне там? 1225 01:16:13,140 --> 01:16:14,780 Выбачайце. Не, няма. Ідзі, ідзі, калі ласка. 1226 01:16:14,780 --> 01:16:16,870 [Студэнт] Такім чынам, вы не змяніўшы значэнне паказальнікаў. 1227 01:16:16,870 --> 01:16:19,130 Вы не павінны былі б зрабіць паказальнік мінус мінус. 1228 01:16:19,130 --> 01:16:19,730 [Джозэф] Так, менавіта так. 1229 01:16:19,730 --> 01:16:21,890 Так што, калі я раблю паказальнік і паказальнік +1 +2, 1230 01:16:21,890 --> 01:16:24,410 Я не раблю паказальніка роўна паказальнік +1. 1231 01:16:24,410 --> 01:16:27,260 Такім чынам, паказальнік застаецца толькі паказвае на пачатак масіва. 1232 01:16:27,260 --> 01:16:31,460 І толькі калі я раблю плюс плюс, што ён усталёўвае значэнне назад у паказальнік, 1233 01:16:31,460 --> 01:16:33,550 што ён фактычна рухаецца ўздоўж гэтага. 1234 01:16:36,860 --> 01:16:37,780 Добра. 1235 01:16:40,550 --> 01:16:42,030 Яшчэ пытанні? 1236 01:16:44,680 --> 01:16:47,790 >> Зноў жа, калі гэта з'яўляецца свайго роду пераважнай, гэта будуць разгледжаны на сесіі. 1237 01:16:47,790 --> 01:16:50,710 Папытаеце вашага навучання калегаў пра гэта, і мы можам адказаць на пытанні ў канцы. 1238 01:16:53,510 --> 01:16:56,600 І звычайна мы не хацелі рабіць гэта мінус рэч. 1239 01:16:56,600 --> 01:16:59,760 Гэта павінна патрабуюць ад мяне адсочваць, наколькі я Зрушэнне ў масіве. 1240 01:16:59,760 --> 01:17:04,520 Так, у агульным, гэта проста растлумачыць, як працуе арыфметыка паказальнікаў. 1241 01:17:04,520 --> 01:17:07,970 Але тое, што мы звычайна падабаецца рабіць, мы хацелі б стварыць копію паказальніка, 1242 01:17:07,970 --> 01:17:11,640 і тады мы будзем выкарыстоўваць гэтую копію, калі мы рухаемся вакол у радок. 1243 01:17:11,640 --> 01:17:14,660 Такім чынам, у гэтых выпадку, калі вы выкарыстоўваеце копіі надрукаваць усю радок, 1244 01:17:14,660 --> 01:17:19,040 але мы не павінны рабіць, як паказальнік мінус 6 або адсочваць, колькі мы пераехалі ў гэты, 1245 01:17:19,040 --> 01:17:22,700 толькі таму, што мы ведаем, што наша зыходная кропка па-ранейшаму паказвае на пачатак спісу 1246 01:17:22,700 --> 01:17:25,340 і ўсё, што мы змянілі гэтая копія. 1247 01:17:25,340 --> 01:17:28,250 Так, у агульным, змяняць копіі арыгінальных паказальнік. 1248 01:17:28,250 --> 01:17:32,350 Не спрабуйце нешта накшталт - don't змяніць асобніках. 1249 01:17:32,350 --> 01:17:35,290 Спроба змяніць толькі копіі арыгінала. 1250 01:17:41,540 --> 01:17:44,870 Такім чынам, вы заўважыце, калі мы перадаем радок у Printf 1251 01:17:44,870 --> 01:17:48,990 Вы не павінны змясціць зорку перад ім, як мы рабілі з усімі іншымі разыменовывает, дакладна? 1252 01:17:48,990 --> 01:17:54,180 Так што, калі вы друкуеце з усёй радкі з% чакае, што гэта адрас, 1253 01:17:54,180 --> 01:17:57,610 і ў гэтым выпадку паказальнік або ў дадзеным выпадку, як масіў знакаў. 1254 01:17:57,610 --> 01:18:00,330 >> Персанажы, сімвал * з, і масівы адно і тое ж. 1255 01:18:00,330 --> 01:18:03,690 Паказальнік складаецца ў сімвалы і знакавыя масівы адно і тое ж. 1256 01:18:03,690 --> 01:18:05,720 А так, усё, што мы павінны зрабіць, гэта перадаць у паказальнік. 1257 01:18:05,720 --> 01:18:08,150 Мы не павінны праходзіць у як паказальнік * ці што-небудзь падобнае. 1258 01:18:13,110 --> 01:18:14,930 Такім чынам, масівы і паказальнікі адно і тое ж. 1259 01:18:14,930 --> 01:18:19,160 Калі вы робіце нешта накшталт X [Y] тут для масіва, 1260 01:18:19,160 --> 01:18:21,960 што ён робіць пад капотам гэта кажа, добра, што гэта масіў сімвалаў, 1261 01:18:21,960 --> 01:18:23,690 так што гэта паказальнік. 1262 01:18:23,690 --> 01:18:26,510 І таму х адно і тое ж, 1263 01:18:26,510 --> 01:18:28,650 і так, што ён робіць гэта дадае г х, 1264 01:18:28,650 --> 01:18:31,820 што тое ж самае, што рухацца наперад у памяці, што шмат. 1265 01:18:31,820 --> 01:18:34,930 А зараз х + у дае нам нейкі адрас, 1266 01:18:34,930 --> 01:18:37,570 і мы разыменовать адрас або сачыць за стрэлкамі 1267 01:18:37,570 --> 01:18:41,640 дзе гэта месца ў памяці, і мы атрымаем значэнне з гэтага месца ў памяці. 1268 01:18:41,640 --> 01:18:43,720 Такім чынам, так што гэтыя дзве дакладна такія ж рэчы. 1269 01:18:43,720 --> 01:18:45,840 Гэта проста сінтаксічны цукар. 1270 01:18:45,840 --> 01:18:48,090 Яны робяць тое ж самае. Яны проста розныя синтактика адзін для аднаго. 1271 01:18:51,500 --> 01:18:57,590 >> Такім чынам, што можа пайсці не так з паказальнікамі? Маўляў, шмат. Добра. Так, дрэнныя рэчы. 1272 01:18:57,590 --> 01:19:02,410 Некаторыя дрэнныя рэчы, якія вы можаце зрабіць, не правяраючы, калі ваш таНос выклік вяртае нуль, праўда? 1273 01:19:02,410 --> 01:19:06,560 У гэтым выпадку, я прашу сістэмы, каб даць мне - што гэта за нумар? 1274 01:19:06,560 --> 01:19:11,200 Мне падабаецца 2000000000 раз 4, так як памер цэлае 4 байта. 1275 01:19:11,200 --> 01:19:13,810 Я пытаюся ў яго для як 8000000000 байт. 1276 01:19:13,810 --> 01:19:17,270 Вядома, мой кампутар не будзе ў стане даць мне, што столькі ж назад памяці. 1277 01:19:17,270 --> 01:19:20,960 І мы не праверыць, калі гэта нуль, таму, калі мы спрабуем разнаймення яго там - 1278 01:19:20,960 --> 01:19:24,270 сачыць за стрэлкамі, дзе яна збіраецца - у нас няма гэтай памяці. 1279 01:19:24,270 --> 01:19:27,150 Гэта тое, што мы называем разнаймення нулявога паказальніка. 1280 01:19:27,150 --> 01:19:29,710 А гэта істотна прымушае Вас падаць. 1281 01:19:29,710 --> 01:19:31,790 Гэта адзін са спосабаў сегментацыі. 1282 01:19:34,090 --> 01:19:38,090 Іншыя дрэнныя рэчы, якія вы можаце зрабіць - гэта ня вельмі істотна. 1283 01:19:38,090 --> 01:19:40,650 Гэта было разнаймення нулявога паказальніка. Добра. 1284 01:19:40,650 --> 01:19:45,160 Іншыя дрэнных рэчаў - ну, каб выправіць, што вы проста пастаўце галачку там 1285 01:19:45,160 --> 01:19:46,980 , Якая правярае, ці з'яўляецца паказальнік з'яўляецца нулявым 1286 01:19:46,980 --> 01:19:51,000 і выйсці з праграмы, калі яна здараецца, што таНос вяртае нулявы паказальнік. 1287 01:19:55,110 --> 01:19:59,850 Гэта XKCD коміксаў. Людзі разумеюць гэта цяпер. Накшталт таго. 1288 01:20:06,120 --> 01:20:09,350 >> Такім чынам, памяць. І я пайшоў з гэтай нагоды. 1289 01:20:09,350 --> 01:20:12,000 Мы заклікаем таНос у цыкле, але кожны раз, калі мы называем таНос 1290 01:20:12,000 --> 01:20:14,370 мы губляем адсочваць, дзе гэты паказальнік паказвае на, 1291 01:20:14,370 --> 01:20:15,750 таму што мы выдаліўшы яго. 1292 01:20:15,750 --> 01:20:18,410 Такім чынам, першапачатковы выклік таНос дае мне памяці тут. 1293 01:20:18,410 --> 01:20:19,990 Мая паказальнік паказальнікі на гэта. 1294 01:20:19,990 --> 01:20:23,020 Зараз, я не вызваліць яго, так што цяпер я называю таНос зноў. 1295 01:20:23,020 --> 01:20:26,070 Цяпер ён паказвае тут. Зараз у маёй памяці паказвае тут. 1296 01:20:26,070 --> 01:20:27,640 Паказваючы тут. Паказваючы тут. 1297 01:20:27,640 --> 01:20:31,820 Але я страціў усё адрасы памяці тут, што я вылучыў. 1298 01:20:31,820 --> 01:20:35,100 І вось зараз у мяне няма ніякіх спасылак на іх больш. 1299 01:20:35,100 --> 01:20:37,230 Такім чынам, я не магу вызваліць іх за межамі гэтага цыклу. 1300 01:20:37,230 --> 01:20:39,390 І таму для таго, каб выправіць нешта накшталт гэтага, 1301 01:20:39,390 --> 01:20:42,250 калі вы забыліся, каб вызваліць памяць, і вы атрымаеце гэтую уцечку памяці, 1302 01:20:42,250 --> 01:20:45,810 Вы павінны вызваліць памяць, усярэдзіне гэтай завесы, як толькі вы зрабілі з ім. 1303 01:20:45,810 --> 01:20:51,400 Ну, гэта тое, што адбываецца. Я ведаю, многія з вас ненавіджу гэта. 1304 01:20:51,400 --> 01:20:55,270 Але цяпер - ура! Вы атрымліваеце як 44000 кілабайт. 1305 01:20:55,270 --> 01:20:57,110 Такім чынам, вы вызваліце ​​яго ў канцы цыклу, 1306 01:20:57,110 --> 01:20:59,770 і што збіраецца проста вызваліць памяць кожны раз. 1307 01:20:59,770 --> 01:21:03,620 Па сутнасці, ваша праграма не мае ўцечкі памяці больш. 1308 01:21:03,620 --> 01:21:08,150 >> А цяпер нешта яшчэ, што вы можаце зрабіць, гэта вызваліць частку памяці, што вы прасілі ў два разы. 1309 01:21:08,150 --> 01:21:11,060 У гэтым выпадку, вы таНос нешта, вы зменіце яго значэнне. 1310 01:21:11,060 --> 01:21:13,140 Вы вызваліць яго адразу, таму што вы казалі, што зрабілі з ім. 1311 01:21:13,140 --> 01:21:14,940 Але тады мы вызвалілі яго зноў. 1312 01:21:14,940 --> 01:21:16,730 Гэта тое, што вельмі дрэнна. 1313 01:21:16,730 --> 01:21:18,820 Ён не збіраўся першапачаткова сегментацыі, 1314 01:21:18,820 --> 01:21:23,350 але праз некаторы час, што гэта будзе падвойнае вызваленне гэтай псуе вашу кучу структуры, 1315 01:21:23,350 --> 01:21:27,200 і вы даведаецеся крыху больш аб гэтым, калі вы вырашылі ўзяць клас, як CS61. 1316 01:21:27,200 --> 01:21:30,000 Але па сутнасці, праз некаторы час ваш кампутар будзе заблытацца 1317 01:21:30,000 --> 01:21:33,010 пра тое, што вочка памяці, куды і дзе ён захоўваецца - 1318 01:21:33,010 --> 01:21:34,800 дзе дадзеныя захоўваюцца ў памяці. 1319 01:21:34,800 --> 01:21:38,080 І таму вызваленне паказальніка двойчы гэта дрэнна, што вы не хочаце рабіць. 1320 01:21:38,080 --> 01:21:41,600 >> Іншыя рэчы, якія могуць пайсці не так, не выкарыстоўвае SizeOf. 1321 01:21:41,600 --> 01:21:44,460 Такім чынам, у гэтым выпадку вы Malloc 8 байт, 1322 01:21:44,460 --> 01:21:46,700 і гэта тое ж самае, што і два цэлых ліку, правільна? 1323 01:21:46,700 --> 01:21:49,580 Такім чынам, гэта цалкам бяспечна, але гэта такое? 1324 01:21:49,580 --> 01:21:52,160 Ну, як Лукас казаў пра на розных архітэктурах, 1325 01:21:52,160 --> 01:21:54,220 цэлых лікаў рознай даўжыні. 1326 01:21:54,220 --> 01:21:57,970 Так, на прыладу, якое вы выкарыстоўваеце, цэлыя каля 4 байта, 1327 01:21:57,970 --> 01:22:02,370 але на некаторых іншых сістэмах яны могуць быць 8 байтаў або яны могуць быць 16 байт. 1328 01:22:02,370 --> 01:22:05,680 Так што, калі я проста выкарыстоўваць гэты нумар тут, 1329 01:22:05,680 --> 01:22:07,310 гэтая праграма можа працаваць на прыборы, 1330 01:22:07,310 --> 01:22:10,360 але ён не збіраецца вылучыць досыць памяці на некаторыя іншыя сістэмы. 1331 01:22:10,360 --> 01:22:14,020 У гэтым выпадку, гэта тое, што аператар SizeOf выкарыстоўваецца. 1332 01:22:14,020 --> 01:22:16,880 Калі мы называем SizeOf (INT), што гэта робіць 1333 01:22:16,880 --> 01:22:21,910  гэта дае нам памер цэлага ў сістэме, што праграма працуе. 1334 01:22:21,910 --> 01:22:25,490 Такім чынам, у дадзеным выпадку, SizeOf (INT) верне 4 на нешта накшталт прыбора, 1335 01:22:25,490 --> 01:22:29,980 і зараз гэта будзе 4 * 2, што на 8, 1336 01:22:29,980 --> 01:22:32,330 , Які з'яўляецца толькі аб'ём прасторы, неабходнага для двух цэлых лікаў. 1337 01:22:32,330 --> 01:22:36,710 На іншай сістэме, калі Int, як 16 байт ці 8 байтаў, 1338 01:22:36,710 --> 01:22:39,380 гэта проста збіраецца вярнуцца досыць байта для захоўвання гэтай сумы. 1339 01:22:41,830 --> 01:22:45,310 >> І, нарэшце, структуры. 1340 01:22:45,310 --> 01:22:48,340 Так што, калі вы хочаце захаваць судоку дошка ў памяць, як мы маглі б гэта зрабіць? 1341 01:22:48,340 --> 01:22:51,570 Вы можаце ўявіць сабе, як зменнай для першай рэччу, 1342 01:22:51,570 --> 01:22:53,820 зменных для другога рэч, зменная 3. рэч, 1343 01:22:53,820 --> 01:22:56,420 Зменная за чацвёрты рэч - дрэнна, праўда? 1344 01:22:56,420 --> 01:23:00,750 Так, адзін паляпшэнню вы можаце зрабіць на верхняй часткі гэтага зрабіць 9 х 9 масіва. 1345 01:23:00,750 --> 01:23:04,480 Гэта выдатна, але што, калі вы хочаце, каб звязаць іншыя рэчы з дошкі судоку 1346 01:23:04,480 --> 01:23:06,490 падабаецца тое, што цяжкасці платы, 1347 01:23:06,490 --> 01:23:11,740 або, да прыкладу, што ваш рахунак, і колькі часу гэта заняло вам вырашыць гэтую канферэнцыю? 1348 01:23:11,740 --> 01:23:14,970 Ну, што вы можаце зрабіць, вы можаце стварыць структуры. 1349 01:23:14,970 --> 01:23:18,910 Тое, што я ў асноўным кажу я вызначаю гэтую структуру тут, 1350 01:23:18,910 --> 01:23:23,230 і я вызначаю судоку борце якога складаецца з платы, што складае 9 х 9. 1351 01:23:23,230 --> 01:23:26,650 >> І тое, што яна ў яго ёсць паказальнікі на імя узроўні. 1352 01:23:26,650 --> 01:23:30,730 Яна таксама мае х і у, якія з'яўляюцца каардынатамі, дзе я знаходжуся цяпер. 1353 01:23:30,730 --> 01:23:35,980 Ён таксама час, выдаткаванае [неразборліва], і ён мае агульная колькасць хадоў я уведзеныя да гэтага часу. 1354 01:23:35,980 --> 01:23:40,010 І таму ў дадзеным выпадку, я магу згрупаваць цэлую кучу дадзеных у адну структуру 1355 01:23:40,010 --> 01:23:42,790 замест таго, каб, як ён лётае ў як розныя зменныя 1356 01:23:42,790 --> 01:23:44,540 што я не магу адсочваць. 1357 01:23:44,540 --> 01:23:49,720 І гэта дазваляе нам мець проста добры сінтаксіс для роду спасылкі розныя рэчы ўнутры гэтай структуры. 1358 01:23:49,720 --> 01:23:53,430 Я проста магу зрабіць board.board, і я атрымліваю судоку дошка назад. 1359 01:23:53,430 --> 01:23:56,320 Board.level, я зразумеў, як цяжка гэта. 1360 01:23:56,320 --> 01:24:00,540 Board.x і board.y даць мне каардынаты, дзе я мог бы быць у радзе. 1361 01:24:00,540 --> 01:24:04,730 І таму я доступе, што мы называем поля ў структуры. 1362 01:24:04,730 --> 01:24:08,840 Гэта вызначае sudokuBoard, які з'яўляецца тыпам, які ў мяне ёсць. 1363 01:24:08,840 --> 01:24:14,800 І вось цяпер мы тут. У мяне ёсць пераменная называецца "дошка" тыпу sudokuBoard. 1364 01:24:14,800 --> 01:24:18,820 І вось цяпер я магу атрымаць доступ да ўсіх палях, якія складаюць гэтую структуру сюды. 1365 01:24:20,830 --> 01:24:22,450 >> Любыя пытанні аб структурах? Да? 1366 01:24:22,450 --> 01:24:25,890 [Студэнт] Для Int х, у, вы абвясцілі абедзве на адной лініі? >> [Іосіф] Угу. 1367 01:24:25,890 --> 01:24:27,400 [Студэнт] Такім чынам, вы маглі б проста зрабіць гэта з імі з усімі? 1368 01:24:27,400 --> 01:24:31,200 Як і ў х, у коскі раз, што агульная? 1369 01:24:31,200 --> 01:24:34,460 [Джозэф] Так, можна вызначана зрабіць гэта, але прычына, я паклаў х і ў на той жа радку - 1370 01:24:34,460 --> 01:24:36,330 і пытанне ў тым, чаму мы можам проста зрабіць гэта на той жа лініі? 1371 01:24:36,330 --> 01:24:38,600 Чаму мы не проста паставіць усё гэта на адной лініі 1372 01:24:38,600 --> 01:24:42,090 х і ў звязаны адзін з адным, 1373 01:24:42,090 --> 01:24:44,780 і гэта толькі стылістычна больш правільна, у пэўным сэнсе, 1374 01:24:44,780 --> 01:24:46,600 таму што гэта групоўка дзве рэчы, на той жа лініі 1375 01:24:46,600 --> 01:24:49,340 што, як і роду адносяцца да адной рэчы. 1376 01:24:49,340 --> 01:24:51,440 І я проста падзяліць гэтыя часткі. Гэта проста стыль рэч. 1377 01:24:51,440 --> 01:24:53,720 Гэта функцыянальна робіць ніякай розніцы. 1378 01:24:58,150 --> 01:24:59,270 Любыя іншыя пытанні, якія тычацца структуры? 1379 01:25:03,030 --> 01:25:06,620 Вы можаце вызначыць з Pokédex структуры. 1380 01:25:06,620 --> 01:25:11,720 Покемон мае нумар і ён мае лісце, уладальнік, тып. 1381 01:25:11,720 --> 01:25:16,990 І потым, калі ў вас ёсць масіў з покемонов, вы можаце скласці Pokédex, дакладна? 1382 01:25:16,990 --> 01:25:20,810 Добра, халаднавата. Такім чынам, пытанні аб структур. Гэта звязана з структурам. 1383 01:25:20,810 --> 01:25:25,270 >> Нарэшце, GDB. Што GDB дазваляюць вам рабіць? Гэта дазваляе адладжваць вашу праграму. 1384 01:25:25,270 --> 01:25:27,650 І калі вы не выкарыстоўвалі GDB, я б рэкамендаваў глядзець на кароткі 1385 01:25:27,650 --> 01:25:31,250 і як раз збіраўся за тое, што GDB з'яўляецца, як вы з ім працаваць, як вы можаце выкарыстоўваць яго, 1386 01:25:31,250 --> 01:25:32,900 і праверыць яго на праграму. 1387 01:25:32,900 --> 01:25:37,400 І тое, што GDB дазваляе вам рабіць гэта дазваляе прыпыніць [неразборліва] да вашай праграмы 1388 01:25:37,400 --> 01:25:38,920 і практычнай лініі. 1389 01:25:38,920 --> 01:25:42,600 Напрыклад, я хачу, каб прыпыніць выкананне ў радку 3, як з маёй праграмы, 1390 01:25:42,600 --> 01:25:46,010 і пакуль я на лініі 3 я магу надрукаваць ўсе значэння, якія ёсць. 1391 01:25:46,010 --> 01:25:49,710 І так, што мы называем, як паўза ў лінію 1392 01:25:49,710 --> 01:25:52,350 гэта мы называем гэта пакласці супыну на гэтай лініі 1393 01:25:52,350 --> 01:25:55,920 і тады мы зможам раздрукаваць зменных на стан праграмы ў той час. 1394 01:25:55,920 --> 01:25:58,990 >> Мы можам затым адтуль прайсці па праграме лінія за лініяй. 1395 01:25:58,990 --> 01:26:03,200 І тады мы можам паглядзець на стан стэка ў той час. 1396 01:26:03,200 --> 01:26:08,600 І так, каб выкарыстоўваць GDB, што мы робім, мы называем ляск на файл C, 1397 01:26:08,600 --> 01:26:11,290 але мы павінны яго прайсці, ggdb сцяг. 1398 01:26:11,290 --> 01:26:15,850 І як толькі мы скончым з гэтым, мы проста запусціць GDB на выніковы файл высновы. 1399 01:26:15,850 --> 01:26:18,810 І таму вы зможаце атрымаць некаторыя, як маса тэксту, як гэта, 1400 01:26:18,810 --> 01:26:21,990 але на самой справе ўсё, што вам трэба зрабіць, гэта ўвесці каманды ў самым пачатку. 1401 01:26:21,990 --> 01:26:24,250 Перапынак асноўныя ставіць кропку супыну на асноўнай. 1402 01:26:24,250 --> 01:26:28,470 Спіс 400 пералічаныя радкоў кода вакол лініі 400. 1403 01:26:28,470 --> 01:26:31,410 І таму ў гэтым выпадку вы можаце проста паглядзець вакол і сказаць, ой, 1404 01:26:31,410 --> 01:26:34,360 Я хачу, каб усталяваць кропкі супыну ў радку 397, які гэтую лінію, 1405 01:26:34,360 --> 01:26:37,170 і тады ваша праграма працуе на такі крок, і ён збіраецца зламаць. 1406 01:26:37,170 --> 01:26:41,120 Гэта збіраецца зрабіць паўзу там, і Вы можаце раздрукаваць, напрыклад, значэнне нізкая або высокае. 1407 01:26:41,120 --> 01:26:46,410 І так ёсць куча каманд, якія вы павінны ведаць, 1408 01:26:46,410 --> 01:26:48,660 і гэта слайд-шоў будзе ісці на сайт, 1409 01:26:48,660 --> 01:26:54,000 так што калі вы проста хочаце, каб спасылкі на гэтыя або, як пакласці іх на свой шпаргалак, не саромейцеся. 1410 01:26:54,000 --> 01:27:00,650 >> Cool. Гэта была віктарына водгук 0, і мы будзем прытрымлівацца вакол, калі вы маеце любыя пытанні. 1411 01:27:00,650 --> 01:27:03,850 Добра. 1412 01:27:03,850 --> 01:27:09,030 >>  [Апладысменты] 1413 01:27:09,030 --> 01:27:13,000 >> [CS50.TV]