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