[Powered by Google Translate] David J. Малан: Все правильно.
Это CS50, и это в конце второй недели.
Если вы планируете быть голодным вокруг этого завтра время, знают, что мы собираемся
провести как небольшой группой завтра, четверг, 1:15 PM.
Там есть URL здесь, если вы хотите, чтобы RSVP.
Места ограничены, так что простите, если форма заполнена к тому времени вы
заполнить эту анкету.
Другой URL, хотя это может быть интересно это.
>> Так что почти в течение месяца, курс будет доступна
Все более широко через EDX, через которые люди в интернете будет
возможность следить вместе, участвовать в процессе достаточно активно, на самом деле.
Они буду использовать CS50 и CS50 Appliance Обсудить и большинство
различные программные средства, которые мы уже использовали в этом семестре.
И одна из инициатив, которые мы хотели бы взять в качестве эксперимента в этом году
, чтобы увидеть, как много содержания, которое мы можем перевести в другие говорят и
письменных языков.
Так что, если вы могли бы иметь заинтересованность в участии в этом проекте, в результате чего
мы предоставим английском стенограммы и субтитры для курса
Лекции и шорты и семинаров, секций и т.п. -
если вы свободно говорить и писать свободно на другом языке, мы бы
любите заниматься вы в этом проекте, в котором вы взять на себя одну или несколько
Видео, переводя их на язык, вы знаете достаточно хорошо.
Чтобы дать вам представление о интерфейсе, там данном веб-интерфейс
, которые мы будем использовать, что создаст существенно пользовательского интерфейса, как это.
Это было мне преподавании некоторых Хэллоуин назад.
А на правой стороне там в черном рядом с этими метками времени,
Вы увидите различные вещи, которые вышли из моих уст в тот день.
И тогда под ним, вы сможете перевести на другой язык.
Именно то, что отображение между ними, в данном случае, английского
и, скажем, испанского языка.
Так что это на самом деле очень удобный инструмент.
Вы можете перемотки назад и вперед очень легко с помощью сочетаний клавиш.
Так что, если вы хотите принять участие в этом эксперименте, и ваши слова
видел и читал, потенциально тысячи людей там, пожалуйста чувствуют
бесплатное участие.
>> Теперь несколько слов об котенок с понедельника, чтобы мы отправили чрезмерно
страшно сообщении.
Понимаю, что как офисные часы предложить и как разделы предположить,
Дизайн, конечно, очень многое сделать, чтобы студенты сотрудничают и
говорят, чтобы работать через проблемы множеств и проблемы вместе.
И действительно линии просто сводится к, опять же, работа, которую вы в конечном итоге
должны представить должно быть вашей собственной.
И так будет, честно говоря - в рабочее время, это совершенно нормально -
это полностью и следовало ожидать, даже - поболтать с некоторыми
друзья рядом с Вами.
Если он или она борется с некоторой теме, и вы, как: ой, ну пусть
мне дать вам взглянуть на некоторые строки кода, который я написал.
Это нормально.
Это бывает.
И это очень благоприятный, я думаю, с процессом обучения.
Там, где линия, опять же, получает перешли, когда голова наклонена рода более
здесь слишком много секунд или минут, которые действительно иметь только
была возможность разблокировки для вашего друга.
И, конечно, когда все становится обмен по электронной почте и Dropbox и
как, там тоже есть линии.
Таким образом, все средства, чувствовать себя комфортно и чувствовать рекомендуется общаться с друзьями
и одноклассникам о psets и многое другое.
И так же, понимаю, что то, что вы в конечном итоге представить, должны быть действительно
продукт вашего творчества, а не кто-то другой.
>> Так, в том же ключе из приятные существа, вы можете
знаю этого парня здесь.
Так что это ужасно дрянной фильм с лет назад.
Кто здесь видел Космические яйца?
Хорошо.
Так что хороший номер здесь.
Таким образом, это наши замечательные академические способ введения Сегодня в конечном счете,
Понятие криптографии.
И поэтому одним из области конкретных задач для PSET 2, который придет
поздно ночью завтра, погрузиться в мир криптографии, которая
это искусство шифрования или скремблирования информации.
И это в конечном итоге связано с миром безопасности.
>> Теперь безопасность для большинства нас приходит в виде довольно мирской механизмов.
У всех нас есть имена пользователей и пароли.
И у всех нас есть очень плохие имена пользователей и пароли, скорее всего.
Если ваш пароль так же на нескольких веб-сайтах, что, вероятно, не
лучшая идея, так как мы обсудим ближе к концу семестра.
Если ваш пароль записывается на записки - не шутка - на
мониторе, то это тоже не обязательно лучший дизайн, но довольно распространенное
явлению.
И если вы не используете криптографию для шифрования паролей, они
Особенно уязвимы.
Так что если вы думаете, что быть супер умный, имея скрытые слова
документ где-то на вашем жестком диске, который имеет все ваши пароли, но
он находится в папке, что никто не собирается заглянуть, что тоже не очень
безопасный механизм.
И то, что PSET 2 будет ввести это искусство криптографии и
скремблирования информации, так что такие вещи, как пароли
Тем более безопасным.
Таким образом, чтобы мотивировать это очень реальные проблемы с очень не в реальном мире
Сценарий, позвольте мне познакомить вас с одним из наших любимых клипов вот с этого
Фильм, Космические яйца.
>> [ВОСПРОИЗВЕДЕНИЕ ВИДЕО]
-Шлем, вы злодей, что происходит?
Что вы делаете с моей дочерью?
-Позвольте мне представить блестящий молодой пластический хирург, д-р Филип
Schlotkin, величайшим человеком носа во всем
Вселенная и Беверли-Хиллз.
-Ваше Высочество.
Нос работу?
Не понимаю.
Она уже была носа.
Это был сладкий 16 настоящего.
-Нет, это не то, что вы думаете.
Это гораздо, гораздо хуже.
Если вы не дадите мне сочетании с щитом воздуха, д-р Schlotkin будет
дать вашей дочери назад ее старый нос.
-Нет!
Где ты это взял?
-Все в порядке.
Я расскажу.
-Нет, папа, нет.
Вы не должны.
-Ты права, моя дорогая.
Я буду скучать по вашим новым носом.
Но я не буду говорить им комбинации ни на что.
-Очень хорошо.
Доктор Schlotkin, дело ваше.
-С удовольствием.
-Нет!
Подождите, подождите.
Я расскажу.
-Я знал, что он будет работать.
Хорошо, дайте его мне.
-Сочетание является одним.
-One.
-Два.
Три
-Три.
Четыре.
Пять
-Пять.
-Таким образом, комбинация один, два, три, четыре, пять.
Это самое глупое сочетание я когда-либо слышал в своей жизни.
Это такая вещь, идиот будет иметь на своем багаже.
-Благодарю вас, ваше высочество.
-Что ты сделал?
-Я выключил стену.
-Нет, ты этого не сделал.
Вы выключили весь фильм.
-Должно быть, я нажал не на ту кнопку.
-Ну, положил его обратно.
Положить фильм обратно.
-Да, сэр.
Да, сэр.
-Пойдем, Эрна.
Ну, Гретхен.
Конечно, вы знаете, я все равно придется выставить вам счет за это.
-Ну, это сработало?
Где ворота?
-Это сработало, сэр.
Мы имеем комбинацию.
-Отлично.
Теперь мы можем взять каждый последний глоток свежего воздуха с планеты Druidia.
Какая комбинация?
-Один, два, три, четыре, пять.
-Один, два, три, четыре, пять?
-Да.
-Это удивительно.
У меня та же комбинация на мой багаж.
Подготовка Spaceball 1 для немедленного отъезда.
-Да, сэр.
-И изменить комбинацию на мой багаж.
-Ой!
[END ВОСПРОИЗВЕДЕНИЕ ВИДЕО]
>> David J. Малан: удивительный фильм, который вы должны теперь все видят.
Таким образом, контекст здесь является то, что с небезопасной данные поступают возможность
зашифровать его и, чтобы засекретить его.
И вот этот, например, является примером зашифрованное сообщение.
Это на самом деле что-то говорит на английском языке.
Но это явно не вполне очевидна.
И мы прошли полный круг сегодня, чтобы дразнить друг от друга, что это секрет
сообщение здесь.
Но в реальном мире компьютеров, вещи, даже не похоже, что они могут
быть английские фразы.
Например, это то, что вы можете найти на стандартной Linux или Mac или
Unix компьютере в файл, который был когда-то называли файла паролей.
В настоящее время, это были перемещены в другие места.
Но если вы посмотрите в нужном месте в системе, вы увидите не только ваши
Имя пользователя или других людей в системе, но вы увидите,
зашифрованную версию пароля.
Действительно, слово склеп там предполагает, что следующие вещи в зашифрованном виде.
И этот ряд, казалось бы, случайных букв и символов и цифр
т.д. могут быть расшифрованы только в целом зная некоторые тайны -
секретное слово, секретный номер.
И действительно, искусство криптографии в конечном счете, сводится к тому, доверяю некоторых
рода и, зная то, что кто-то не делает.
Мы рассмотрим это в немного более подробно сегодня и в PSET в будущем.
>> А теперь несколько слов о Pass / Fail.
Таким образом, в частности, как некоторые из вас нырнул в PSET 1, устройство и
Очень новый мир для себя, понял, что разочарования и
путаницу и просто технических трудностей следует ожидать.
Особенно с первым PSET, где есть так много всего нового, просто получаю
знакомый с Ls и компакт-диск, и все эти тайные команды в новых условиях.
И это отдельно от фактического материала и программирование себя.
Так понимаю и то, что есть, конечно, рабочие часы, которые существуют как
Поддержка структуры.
Разделы начать в ближайшее воскресенье.
Но самое главное, если вы чувствуете себя просто, что это не
мир для тебя, понимаешь, что это действительно просто нужно время.
И если бы не эта возможность лет назад для меня взять класс
годен / не годен, если честно, я никогда бы даже ступить в классе.
И вы можете изменить это до, скажем, пятый понедельник курс.
Так что если вы на краю теперь, понимаешь, что вместо головы в некоторых других
вод в целом, не только, конечно, рассмотреть изменения в зачет / незачет.
Опять же, это не совсем эту культуру здесь, в Гарварде принимать вещи
годен / не годен, так как все на самом деле хочет достичь или overachieve.
Но, откровенно говоря, это прекрасный способ попробовать что-то, что, возможно, не
быть вам знакомы.
И вы будете в конечном итоге делают в большинстве случаев достаточно хорошо, может быть,
много к вашему удивлению.
И более конкретно, то, что я думаю, что годен / не годен вообще делает,
Особенно, как вы, возможно, испытали с PSET 0, если вы разместили
В 10 часов, 15 часов, 25 часов в некоторых PSET - и вы просто стучать
головой о стену,
и она становится супер поздно ночью,
но вы сделали PSET как 90% пути,
Вы знаете, вы просто не можете понять одну вещь -
годен / не годен действительно снимает остроту класса, как это, где вы можете сортировать
из радостно сказал хорошо, я знаю, что это не идеально.
Но я работал свою задницу на этот счет.
Я очень доволен, где все это закончилось.
И это будет соответствовать ожиданиям для годен / не годен.
Так что имейте это в виду.
>> Хорошо.
Так что те из вас, кто пытался использовать Гарвардского университета Wi-Fi знать
что есть CS50 SSID, Wi-Fi соединение плавающие вокруг, что вы
возможно, повезет больше для.
Это немного парадоксально, что пароль для этого - если вы хотели бы попробовать
подключение к этому для лучшей скорости и дайте нам знать, если это не лучше -
один, два, три, четыре, пять, вплоть до восьми, потому что восемь является
более безопасным, чем пять лет.
Так что если вам нужен Wi-Fi пароль, подключиться к беспроводному CS50 здесь.
Один, два, три, четыре, пять, шесть, семь, восемь.
И сообщению CS50 Обсудить если вы до сих пор периодически возникающих проблем подключения,
и мы дадим полномочия, которые будут знать это пространство.
>> Хорошо.
Так быстро тизер, особенно для тех из вас, кто вентилятора мальчиков или девочек
всех Яблоко вещи.
То, что я выкопал из несколько лет назад был этот файл здесь, ilock.c, просто чтобы
вид сделать более конкретными и более сложные некоторых из более фундаментальных C
программы мы писали.
Так я открыл этот файл, ilock.c.
Он доступен на странице лекции на сегодняшний день.
С левой стороны, вы увидите длинный список функций.
Таким образом, человек, который написал это написал много функций,
больше, чем просто основной.
Он использовал целую кучу библиотек здесь.
И если мы начнем прокрутки, что это на самом деле является очень
Во-первых, я считаю, русификатор для оригинального iPhone.
Когда Вы хотели сделать джейлбрейк оригинальный iPhone, а это значит непривязанный джейлбрейк
от AT & T и фактически установить специальное программное обеспечение на нем и делать вещи
, что Яблоко не хочу, чтобы люди делают -
Ну, кто-то нашел время, чтобы выяснить, как именно они могут использовать
программные ошибки, ошибки, ошибки, программного обеспечения Apple.
И таким образом родилась ilock.c.
Вот если бы он был скомпилирован на компьютере и установить его на iPhone, что
был подключен к компьютеру с помощью, скажем, кабель USB, это даст вам
административные или привилегии на вашем iPhone и позволяет сделать очень многое,
что вы хотите.
>> И вот там был этот увлекательный кошки-мышки между Apple, и
остального мира, в частности, так как они, как и многие компании, пытаются заблокировать
свои вещи вниз, так что вы можете делать с ним, что они намерены.
Но благодаря таким людям, как это и своего понимания низкого уровня
детали и, в данном случае, C программирования и много знакомых конструкций
что мы начали играть, вы сможете по-настоящему рычаги
аппаратного таким образом, вы считаете нужным, и не обязательно некоторым юридическим лицом.
Так, например, я понятия не имею, что все это делают.
Но GetVersion звучит довольно просто.
И, похоже, это функция, что этот человек написал.
Возьми своего рода целое в качестве аргумента, ничего не возвращает, но
кажется, петли с цикла здесь и, если условие, если условие,
разорвать, и как-то относится к номеру версии.
Если мы прокрутить вниз -
хотя многие из этих ключевых слов будет новая, и есть
много функций здесь мы никогда не видели и не могли бы когда-нибудь увидеть более
семестра -
В конце концов, это следует тем же правилам и логике, что мы были
играть с до сих пор.
Так что это слишком стар, чтобы взломать ваш iPhone или 3s 4s 5s или вскоре, в наши дни,
но знаю, что все это очень полученные из этого мира, который мы
нырнул.
>> Итак, давайте взглянем на несколько более простой пример.
Это одна, просто чтобы согреться с некоторыми синтаксиса, а также некоторые другие данные
Тип, что мы говорили, но действительно не видел в С. Таким образом, это
Файл называется positive1.c.
И в комментариях на вершине, это просто требует, чтобы пользователь предоставлял
положительное число.
Так что это пример сделай то время как цикл, который хорош для пользователей интерактивного
программ, где вы должны сказать пользователю, чтобы что-то сделать.
И если они не сотрудничают, вы кричать на них или отклонить их ввода.
Дело в точку, я собираюсь сделать линии от 19 до 24 так долго, как пользователь
не дал мне положительное число.
Теперь эта деталь здесь, на линии 18, почему я заявляю, п выше всего этого
цикл конструкция, в отличие от прямо рядом с линией 22, где я
на самом деле заботятся, чтобы получить п?
Да?
[Неразборчиво]
>> David J. Малан: Да, так что этот вопрос из области видимости.
И в срок непрофессионала, что делает область относится?
Да?
[Неразборчиво]
David J. Малан: Можете ли вы говорить громче?
Выступающий 1: Где можно получить доступ к конкретной переменной.
David J. Малан: Perfect.
Где Вы можете получить доступ к конкретной переменной.
И вообще, правило до сих пор было, что сфера применения некоторых
Переменная определяется самой последней фигурные скобки, что вы видели.
И поэтому в данном случае, если я сделал ошибку, объявив п на линии 22,
, что линия будет работать.
Я хотел бы получить целое число, и я бы поставил его в этой переменной п в строке 22.
Но какие строки кода, теперь понятия не имею, о чем я говорю?
Таким образом, 25, и оказывается, что 24, а также, потому что в этом случае он выходит за пределы
в фигурные скобки.
Так что просто немного неприятность, но очень легко решается просто объявив
переменную за пределами самой функции.
>> Сейчас мы увидим позже сегодня, вы можете сделать еще один шаг.
И вы можете даже получить немного ленивый -
и это не рекомендуется, в общем -
но вы можете даже получить ленивого и положить переменную в глобальном масштабе, так сказать, не
внутри функции, а не внутри цикла, но в самом файле, вне
всех функций вы написали, как я сделал здесь, на линии 15.
Но это, как правило, с неодобрением.
Но понимаю, что это решение иногда к другим проблемам, как мы
в конечном счете видеть.
Таким образом, на данный момент, мы оставим это так.
Но давайте посмотрим, если мы можем переписать это только начало выразить себя
немного по-другому.
>> Таким образом, эта программа, просто чтобы быть ясно, является positive1.
Позвольте мне идти вперед здесь и в моем окне терминала сделать positive1, Enter.
Компиляция, хорошо.
Я собираюсь запустить positive1, нажмите Enter.
Я требую, чтобы вы дать мне целое положительное число.
Я скажу -1.
Это не работает.
0, 99, что, кажется, работает.
Может быть, не самый строгий тест.
Но по крайней мере это хорошая проверка вменяемости, что мы находимся на правильном пути.
Так что теперь позвольте мне идти вперед и открыть второй вариант этого.
И чем отличается уже?
Он реализует то же самое.
Но то, что прыгает, как четко в этот раз?
Да, так это BOOL в зеленый цвет.
Gedit был выделен зеленым цветом это ключевое слово известно как логический,
, который является типом данных.
Она не приходит построен в для всех версий C. Необходимо включить
конкретной библиотеки.
В нашем случае, я включил CS50 библиотеки, так что мы
иметь доступ к BOOL.
Но в строке 18, мы, кажется, есть логическое значение здесь называют благодарны.
Так что я мог бы назвать это ничего.
Но я назвал это благодарна просто вид передают смысловое значение.
Таким образом, первоначально на линии 18, я, видимо, не благодарен, потому что
Логическое значение благодарны инициализируется ложным в строке 18.
И тогда кажется, что я сделал здесь в строках с 21 по 23 это я только что
вид переписать мою логику.
Так что не функционально разные.
Но в строке 22 сейчас, я могу проверить, если Int пользователь предоставил больше
0, то я просто изменить значение благодарны правда.
А зачем мне это делать?
Потому что в строке 25, по-видимому, я собираюсь проверить состояние.
У этого цикла в то время как благодарный является ложным.
>> Так что я предлагаю это в качестве альтернативы версию, потому что она, по крайней мере
немного больше интуитивно, может быть.
Это немного более обоснованной на английском языке.
Таким образом, выполните следующие действия, пока вы не благодарны или при благодарны является ложным.
И на этот раз я тоже, видимо, не люблю вспоминать то, что пользователь набрал
В уведомлении, потому что нет переменной п.
Таким образом, на самом деле, я -
маленькая белая ложь там.
Функционально программа немного отличается, как только мы получим на дно
это потому что я не помнил, что п.
Но я хотел показать здесь, что, хотя мы видели и GetInt
GetString используется на правую сторону знака равенства до сих пор, так что
Мы помним значение, технически, это не строго обязательно.
Если по каким-либо причинам вы просто не заботятся, чтобы сохранить значение, вы просто хотите
для проверки значения, заметили, что мы можем просто написать это как GetInt открытым
парень, рядом парень.
Эта функция будет возвращать значение, как мы уже говорили.
Это будет вернуть вам Int.
И поэтому, если вы мысленно думаю, что это произойдет, когда я печатаю в 99, GetInt
возвращает число 99.
И так концептуально, это как бы мой код был на самом деле этого.
Так, если 99 действительно больше 0, то благодарный становится истинным.
Тогда линия 25 реализует ох, мы сделали, потому что я теперь благодарна.
А в строке 26, мы просто говорим, спасибо за натуральное, какой бы она
случилось быть.
>> Теперь давайте сделаем небольшой синтаксический сахар здесь, так сказать.
Давайте посмотрим, если мы можем убирать эту линию 25 с этой третьей и последней дисперсии
В positive3.
Так заметить той лишь разницей, что теперь строки кода?
Да, так 25.
И мы действительно не видел этот трюк только пока.
Но мы видели восклицательный знак в понедельник, который обозначает, что?
Так нет, или отрицание.
Так что берите логическое значение и перевернуть его значение.
Правда, становится ложным.
Ложные становится истинным.
Так что это, я хотел бы предложить, даже немного более интуитивным способом
написание кода, потому что я до сих пор благодарен инициализации ложным.
Я все еще делаю следующее.
Я поставил благодарны верно, когда придет время.
Но теперь вы действительно можете просто перевести этот код устно слева направо,
хотя и не благодарны.
Из-за взрыва, или восклицательный знак, обозначает понятие нет, так что пока
Не благодарны.
>> Итак, еще раз, мы не введены новые понятия как такового.
Мы говорили о логических назад, когда мы играли с нуля.
Но понимаю, теперь мы можем просто начать писать наш код в
по-разному.
Таким образом, особенно в pset1, если вы вроде пытается выяснить способ
написать программу, наверняка вам повезло, потому что это будет любая
ряд решений, которые вы можете случайно встретить.
Например, это всего лишь три даже для простейших программ.
Хорошо.
А теперь вспомним в понедельник, мы вышли на эту записку с возвращением значения.
Так, в первый раз, мы написали программу, которая не просто главной,
она также имеет свою собственную функцию, которую я написал здесь.
Таким образом, в соответствии с 31 по 34, я реализовал функцию куб.
Это не комплекс.
Это всего лишь раза в раз, и в этом случае.
Но, что важно о нем, что я беру входа в форме и
Я возвращаюсь выход в форме раза в раз.
>> Так что теперь у меня есть возможность, так же, как я раньше с Printf один, звонить
эту функцию, вызвав функцию куб.
И куб функция принимает некоторые вход.
И куб функция возвращает несколько выходных.
И наоборот, Printf просто что-то сделал.
Она не возвращает ничего, что мы заботились о - хотя, как
в сторону, она возвращает значение.
Вы просто вообще игнорируют его.
Printf просто что-то сделал.
Это был побочный эффект печати на экране.
В отличие от здесь, у нас есть куб функции, которые
на самом деле возвращает что-то.
>> Так что это вообще -
для тех, кто знаком с этим, это довольно простая идея.
Но для тех, кто менее знаком с этой идеей проходящих в входы и получение
назад выходов, давайте попробуем просто что-то супер просто.
Кто-нибудь удобные подойдя на этапе кратко?
Вы должны быть знакомы с камерой на вас, как хорошо.
Да.
Хорошо, что вас зовут?
KEN: Кен.
David J. Малан: Кен.
Ладно, Кен.
Поднимайся.
Так что Кен будет функция вида здесь.
И давайте идти вперед и делать это.
Давайте немного фантазии.
Очень приятно.
Добро пожаловать в центре сцены.
Хорошо.
Давайте хит этой кнопки здесь.
Хорошо.
Так что здесь у вас есть современный доске.
И то, что я является основной функцией, например.
И я не имею IPad в руках.
Я действительно не помню, как - ну, на самом деле, не могу сказать.
Я действительно не имеют хороший почерк.
И поэтому я хочу, чтобы вы что-то напечатать на экране для меня.
>> Так что я являясь основной программы.
И я хочу, чтобы ты сказал это, написав его в моей куриной нуля и
Затем мимо вас вход.
Так же глупо, хотя это упражнение, понятие функций и вызова
Функция и возвращение функцией действительно сводится к этому.
Я на-Майне.
Я только что написал Е ("нечто") на экране.
Я бегу этой программы.
И как только Printf вызывается, она принимает один аргумент - или один параметр,
иногда -
в двойные кавычки.
Вот это аргумент.
Я передаю его Кен.
Теперь он является черным ящиком написал некоторое количество лет назад, по-видимому
знает только как печатать вещи на экране.
>> Таким образом, выполнение.
Это не плохо.
Так, очень хорошо.
Так что теперь Кен делается выполнение.
Ему нужно, чтобы передать мне ничего взамен?
Таким образом, не то, что мы видели до сих пор.
Опять же, Printf ли на самом деле возвращает число.
Но мы собираемся игнорировать, что на данный момент, потому что мы никогда не использовали его.
Так вот оно что для Кена.
И вот теперь основные возвращается выполнить -
Основными берет на себя управление программой снова, потому что строки кода,
Printf, осуществляется выполнение.
И мы идем о нашем пути выполнения любых других линий есть.
>> Хорошо.
Итак, теперь давайте попробуем немного другой пример.
И на этот раз здесь, давайте сначала очистить экран здесь.
И на этот раз мы будем делать измерения кубатуры функции.
Но на этот раз, я думаю, выходное значение.
Так что давайте идти вперед и делать это.
Так что теперь у меня есть строка кода, которая говорит, х = куба (х).
Так что на самом деле let's -
строка кода, напомним, выглядит следующим образом.
х = куба (х).
Так как это будет работать?
Так что давайте идти вперед и дать вам белый экран.
И я собираюсь писать теперь до значения х, которые в данный момент
Время случается, скажем, 2, сохранить его простым.
Так что я записал на бумажке значение 2,
, который является моим значения х.
Я передаю его Кен.
KEN: А я просто пишу ответ?
David J. Малан: Да, давайте просто написать ответ.
Хорошо.
И теперь он должен вернуть мне что-нибудь.
Так что -
совершенной.
Приятно переход.
>> Так что теперь он протягивает мне обратно значение 8, в данном случае.
И что мне делать с ним?
Ну, на самом деле, давайте посмотрим.
Получить это право.
Что я буду с ней делать?
Теперь я собираюсь принять это значение и на самом деле хранить его в тех
те же биты в памяти.
Но заметьте, я немного борются здесь.
Я немного смущен, потому что где я на самом деле писать значение х?
Потому что я только что сделал физически руку Кен бумаге
, которые имели значение 2, которое было х.
И действительно, это именно то, что происходит.
Вот и получается, что при вызове функции, и вы передаете в качестве аргумента
как "привет мир" или вы передаете в качестве аргумента, как 2, как правило, вы
проходящей в копии этого аргумента.
И так же, как я записал номер 2 здесь и передал его Кена, которые должны
означает, что у меня еще есть копия значения 2 где-то.
Потому что действительно, теперь, когда я получил обратно значение 8, мне нужно, чтобы вернуться в
RAM и фактически записать 8, где я когда-то был номер 2.
>> Таким образом, визуально помню это понятие проходящей в буквальном
копию значения.
Кен делает свое дело, протягивает мне в ответ что-то - в данном случае,
значения, как 8.
А то у меня что-то сделать с этим значением, если я
хотите сохранить его вокруг.
Так что все это будет слишком хорошо знакомы в скором времени.
Спасибо вам большое за это демо здесь, Кен.
Хорошо.
Очень хорошо сделано.
Итак, давайте посмотрим, как это в конечном итоге связано с некоторыми из функций
вызове, что мы делаем здесь.
Итак, позвольте мне идти вперед и вернуть нас к измерения кубатуры пример.
И обратите внимание, что если мы действительно хотим начать принимать это дальше, мы собираемся
иметь, чтобы помнить о том, что число х который передается в
здесь отличается от того, что на самом деле передается в функцию.
Итак, еще раз, это принятый копия станет совсем
уместны в одну минуту.
>> Итак, давайте взглянем на то, что не совсем правильно работать еще.
Я собираюсь идти вперед и открыть третий пример ошибки, которая
несовершенна по своей природе.
И это называется buggy3, и реализует замены.
Таким образом, здесь мы имеем основные функции, которые х и у произвольно инициализируется
1 и 2, соответственно.
Мы могли бы использовать GetInt, но нам просто нужно простое упражнение.
Таким образом, это жестко, как 1 и 2.
В строках 21 и 22, мы, видимо, распечатайте х и у, по одному на строку.
Затем в строке 23, я утверждаю, я обмен этими значениями, точка, точка, точка.
Я видимо вызова функции в строке 24 называется своп
, которая принимает два аргумента.
Это совершенно законно для функции принимают два аргумента.
Мы видели Printf это сделать уже.
Таким образом, своп-видимому, имеет х и у.
И, как предполагает его название, я надеюсь, что это будет
поменять эти два значения.
Тогда я претендовать на линии 25, поменялись местами.
И я перепечатать х и у в предположении, что
они действительно были поменяны местами.
Но если я действительно запустить эту программу -
Позвольте мне открыть окно терминала.
Позвольте мне сделать buggy3.
Как следует из названия, это не кончится хорошо.
Потому что, когда я ударил Enter, заметил, что х 1.
у-2.
И все же в конце программы, они все еще, по сути, то же самое.
>> Таким образом, на основе демонстрации только сейчас с Кеном, то, что происходит на самом деле?
Ну, давайте погрузиться в эту своп функции.
Это супер короткие.
Это всего лишь несколько строк кода долго.
Но то, что фундаментальные проблемы на основе простую историю рассказал
здесь с Кеном?
Почему подкачки не работает?
[Неразборчиво]
Именно так.
Таким образом, мы хранении на копию, а не саму переменную.
Иными словами, своп-видимому, имеет два аргумента, Int.
И это условно назвать и б.
И здесь, я прошла по х и у, которые являются соответственно 1 и 2.
Но я не в буквальном смысле проходящей в х.
Я не буквально проходящий в год.
Я передаю копии х и копию у.
Это все равно, почти как если бы вы скопировали и вставили в поменяйте значения,
Вы хотите, чтобы на самом деле манипулировать.
Так что, если это так, когда я, программу, начать выполнение
строка 35, то 36 -
когда я добираюсь до линии 37, на данный момент в этой истории, что значение?
В этот момент в истории, строка 37, что является значение в этой точке?
Так оно и должно быть просто 1.
Верно?
Поскольку х был принят в качестве первого аргумента.
И эта функция просто произвольно называет свой первый аргумент,.
Точно так же это у, второй аргумент.
И это просто произвольно вызова второго б аргумент.
>> Теперь эта дихотомия на самом деле довольно просто объяснить.
Подумайте об этом.
Никто из нас не встречал человека, который написал Printf.
Так что, конечно, он или она не знает, что наши переменные спустя 30 лет собираются
называется.
Так что должно быть различие между, что вы называете переменные в
Функции вы пишете и что вы называете переменные в функциях вы
позвонив или использования.
Итак, другими словами, я написал мои переменных х и у.
Но если кто-то другой написал своп функции, он или она, конечно,
не знаю, что мое переменных будет называться.
Так понимаю, что это, почему у вас есть эта двойственность имен.
Технически я мог сделать это случайно.
Но они все равно передается в качестве копии.
Было бы просто чистое совпадение эстетически, если это человек, который написал
подкачки использовали те же имена.
>> Хорошо.
Таким образом, на данный момент в этой истории, строка 37, 1.
Ь 2.
А теперь я перехожу к поменять их местами.
Ну, во-первых, позвольте мне на самом деле сделать это гораздо проще.
Я не знаю, что эти три строки кода делали.
Позвольте мне сделать это.
б получает.
получает б.
Готово.
Почему это сломанный, логически?
Это своего рода интуитивные вещи, не так ли?
Таким образом, становится б.
И б становится.
Но проблема в том, что как только строке 37 выполняется, то, что
Значение и б?
То же самое, 1.
Потому что вы сходу, так сказать, вы изменили б равным.
Поэтому, как только линия 37 выполнена, это здорово.
Теперь у вас есть две копии номером 1 внутри этой функции.
Итак, когда вы говорите в строке 38, б получает, ну, ты вроде на болтах.
Потому что вы просто присвоении 1 к 1.
Ты вроде потерял значение, которое вы заботились о.
>> Таким образом, в оригинальную версию этой, обратите внимание, что я сделал.
Вместо этого я была третья строка кода, которая выглядела следующим образом.
Я заявляю, временная переменная - TMP является очень распространенным названием
для временных переменных.
Это Int потому что он должен соответствовать тому, что я хочу сделать копию.
Я храню копии внутри TMP. Поэтому, как только линия 37 была выполнена,
Значение это -
быстрая проверка исправности -
1.
Значение Ь 2.
И ценность TMP также 1.
Так что теперь я исполню линии 38.
Поэтому, как только линия 38 выполняется, принимает значение б.
И В 2.
Таким образом, в настоящее время 2.
Таким образом, на данный момент в этой истории, равно 2, б = 2,
и TMP 1.
Так что теперь логически, мы можем значения просто хлопнуть TMP в в б.
И мы сделали.
>> Итак, мы решили эту проблему.
К сожалению, когда я запускаю эту программу в таком виде, это на самом деле не поменять
любые значения.
Но чтобы быть понятным, почему?
Я установил логические задачи из всего минуту назад.
Но опять же, если я запускаю эту программу, х и у, остаются неизменными до конца
программы исполнения.
[Неразборчиво]
David J. Малан: Таким образом, мы не вернули ничего.
Так что это правда.
Но, оказывается, есть небольшая проблема здесь, потому что до сих пор,
Единственное, что мы смогли вернуть это одно.
И это ограничение C. Вы можете вернуть только действительно одно значение,
В этом случае, я немного застрял здесь
потому что я мог вернуть новое значение х, или я мог бы вернуться
Новое значение у.
Но я хочу, и обратно.
Таким образом, возвращения не простое решение здесь.
Но проблема в корне почему?
Что мы на самом деле поменялись местами?
а и б.
Но и б являются копиями х и у, которая означает, что мы только что сделали все это
работать - мы только что провели, как три минуты говорить о своп
функцию, и все три из этих переменных.
И это замечательно, совершенно правильно в изоляции.
Но и сферы B, только в этих строках здесь.
Так как цикл, если вы объявите целое я внутрь для
петлю - так же, если вы объявлении и б внутри функции, что
Вы написали, что они действительны только внутри этой функции.
Это означает, как только своп сделать выполнение, и мы идем от линии 24 до
строка 25, х и у не изменилось.
Вы просто впустую много времени, обмен копиями переменных.
>> Вот и получается, что решение это на самом деле, не очевидно.
Это не вполне достаточно, чтобы возвращать значения, потому что мы можем
возвращать только одно значение.
И я действительно хочу, чтобы обменять х и у в то же время.
Так что мы собираемся вернуться к этому.
Но сейчас понимаю, что вопрос принципиально связано с тем,
что А и В являются копиями.
А они в свою сферу.
Ну, давайте попробуем решить это в некотором роде.
Позвольте мне на самом деле прокрутить назад здесь и открыть, скажем, четвертый вариант
это, buggy4.
А что по этому поводу?
Это похожие, но более простую задачу, чтобы смотреть на, прежде чем принять удар на
ее решения.
Эта программа называется приращением.
И он, очевидно, инициализирует целое число х 1 в строке 18.
Я тогда утверждать, х 1.
Я тогда претензии приращения, точка, точка, точка.
Затем я вызываю прирост.
Но тогда в строках 22 и 23, я утверждаю, что это было увеличивается.
Я утверждаю х сейчас бы это ни было, 2 предположительно.
>> Но эта программа глючит.
В чем проблема?
Да?
[Неразборчиво]
David J. Малан: Совершенно верно.
Таким х была объявлена ​​явно в строке 18.
То есть в фигурных скобках основного автора.
Таким образом, простой ответ в том, что, ну, х существует здесь.
Она не существует в строке 32.
Таким образом, эта программа на самом деле даже не будет компилироваться.
Компилятора, когда я пытаюсь компиляции этого кода, будет кричать на меня
О некоторых необъявленный идентификатор или что-то в этом роде.
В самом деле, давайте попробуем.
Это делает buggy4.
Там она есть.
Использование необъявленных х идентификатор в строке 32.
А на самом деле, давайте будем более четко здесь сегодня, так что это полезно
рабочее время и дома.
Обратите внимание, что это немного загадочно написано.
Но то, что Clang имеет кричал на нас, сказав:
buggy4.c: 32:5, на самом деле полезно.
Это означает, что ошибка в строке 32 на позицию символа пять.
Таким образом, один, два, три, четыре, пять.
Это, в самом деле, где проблема.
А также иметь в виду, в рабочее время и дома, мне повезло здесь.
У меня есть одна ошибка.
Это собирается быть относительно легко исправить.
Но если вы получите весь экран полный подавляющее сообщения об ошибках, опять же,
понимают, что самый нижний можно просто быть симптомом
самый верхний из них.
Так всегда гоняться за ваши ошибки сверху вниз.
Потому что там может быть просто цепочкой эффект, предлагаю вам
есть намного больше проблем, чем вы на самом деле.
>> Итак, как мы можем это исправить, если моей целью является, чтобы увеличить х?
Что это?
Хорошо.
Таким образом, мы можем сделать глобальное х.
Давайте ярлык, который я предупреждал раньше.
Но черт возьми, нам просто нужно быстро исправить.
Так что давайте просто скажем, Int х здесь.
Это делает х глобальной.
Так что теперь основным имеет к нему доступ.
И прирост имеет к нему доступ.
И поэтому позвольте мне идти дальше и собрать это сейчас.
Сделать buggy4, Enter.
Кажется, для компиляции сейчас.
Давайте запустим buggy4, и кажется, на самом деле работает.
Теперь это одна из этих вещей -
Делай, как я говорю, а не как я делаю, как я только что сделал здесь.
Потому что в целом наши программы собираются получить гораздо более интересным и
гораздо дольше, чем это.
И если ваше решение жизненных проблем является просто ах, положить все
переменных в начало файла, очень быстро сделать программы получают
ужасно трудно управлять.
Это становится все труднее придумывать новые имена переменных.
Это становится все труднее понять, что переменная делает.
>> А так в общем, это не очень хорошее решение.
Так давайте сделаем это лучше.
Мы не хотим использовать глобальную переменную здесь.
Я хочу, чтобы увеличить х.
Так что я мог бы, очевидно -
В конце концов, это своего рода глупые истории, потому что мы просто делаем это.
Но если бы я не знал о том, что оператор, или я не разрешили
изменить его в основной себе, как еще я мог осуществлять Кен здесь, это
Время не куба, но для увеличения?
Как изменить эту вещь здесь?
Да.
[Неразборчиво]
David J. Малан: Ладно, хорошо.
Так почему бы мне не пройти в X?
И тогда, а не возвращать его, почему бы мне не сделать возврат х + 1?
Теперь, несколько вещей должны изменить здесь.
Я нахожусь на правильном пути.
Что еще нужно настроить?
Кто-то другой.
Да?
[Неразборчиво]
David J. Малан: Мне нужно изменить тип возврата прироста
потому что это не аннулировать.
Пустота означает, что ничего не возвращается.
Но, очевидно, теперь он есть.
Так что нужно изменить в целое, чтобы быть последовательным с тем, что
Я на самом деле возвращения.
>> Сейчас что-то еще по-прежнему багги здесь.
Да?
[Неразборчиво]
David J. Малан: Так что мне нужно увеличивать х?
[Неразборчиво]
David J. Малан: Ах, так что мне нужно пройти х.
Так что мне нужно сделать это здесь.
Таким образом, прототип, я должен изменить это здесь.
Таким образом, это должно стать Int.
Это должно стать -
хм.
Я на самом деле есть ошибка здесь.
Давайте исправим это в первую очередь.
Что это на самом деле быть?
Так что это должно быть что-то Int.
Это может быть х.
Но, откровенно говоря, если вы начинаете призывая всех ваших переменных х, он собирается получить
все менее и менее ясно, что есть что.
Так что давайте просто произвольно выбрать различные именования для моего
вспомогательные функции, функции я пишу.
Мы будем называть его.
Или мы могли бы назвать его - давайте назовем это even_number быть еще более явной.
И тогда я должен вернуть все, что номер плюс 1.
А теперь я должен изменить одну вещь здесь и одно
Другая вещь, которую здесь.
Что я должен изменить в строке 21 в первую очередь?
Я должен назначить его на х.
Поэтому я не могу просто позвонить приращение х.
Мне нужно помнить ответ на изменение значения х на
с левой стороны.
И хотя х сейчас находится на левой и правой, это совершенно нормально, потому что
правая часть запускается на выполнение первого затем получает шлепнулся в левую
руки вещь, х в этом случае.
И тогда, наконец, это легко исправить сейчас.
Это должно просто соответствовать тому, что это внизу.
Int номер.
>> Хорошо.
Таким образом, целый букет изменений действительно глупо функции.
Но представитель вещей, которые мы больше хотим сделать.
Так что buggy4.
Я где-то напортачили.
О, мой Бог.
Пять ошибок в, вроде бы, шесть строки.
Так что же случилось на линии 18, символ 5?
Хорошо.
Так что я должен заявить об этом Int.
Хорошо.
Итак, давайте посмотрим, целая куча других ошибок.
О, мой бог.
19, 18, 21.
Но, опять же, давайте просто очистить экран -
Управление L здесь - и повторные Clang.
Таким образом, пять проблем на самом деле только это.
Итак, теперь давайте запустим buggy4, Enter.
Вот так.
х был увеличен правильно.
>> Хорошо.
Любые вопросы о том, как увеличить число?
Да?
SPEAKER 2: Почему это, что вы можете просто изменить X на номер в переменную
имя, и он будет знать, что вы имеете в виду?
David J. Малан: Хороший вопрос.
Как это, что я могу просто изменить х на номер и программа будет знать,
сразу?
Итак, еще раз, думать о нем, как это абстракция.
Так что, если я главный и Кен дополнительных, честно говоря, мне все равно
что Кен называет свою Ipad.
Меня не волнует, что он называет все, что имеет отношение к его осуществлению
из этой функции.
Так что это деталь реализации, что я, главное, не
должны заботиться о.
И так просто изменив его последовательно внутри функции, количество здесь
и номер здесь, это все, что занимает так много времени, как я перекомпилировать.
Это вроде как если вы думаете о - многие из нас, тех, у кого водителя
Лицензии кто ездил, или если вы даже въехал в автомобиль -
Большинство из нас не знают, как машина работает под капотом.
И буквально, если вы открываете капот, большинство из нас - я в том числе -
не собирается знаю, что мы смотрим.
Вроде как вы можете чувствовать себя в такие вещи, как это прямо сейчас.
Но мы действительно не должны заботиться, как машина работает.
Мы не должны заботиться, что все стержни и поршней и кабелей внутри
машина на самом деле делает.
>> Так что-то вроде, что вы называете поршень не имеет значения
Здесь в этом случае.
Та же самая идея.
Да?
[Неразборчиво]
David J. Малан: Если бы было больше использовании переменного момента ха назад,
Вы, программист, придется менять их повсюду.
Или вы могли бы сделать буквально файлов, меню, а затем Найти / Заменить,
что-то вроде этого.
Но вы будете иметь, чтобы сделать эти изменения самостоятельно.
Вы должны быть последовательны.
[Неразборчиво]
David J. Малан: определенном порядке, как здесь?
Если бы это было Int другой номер?
Да.
Таким образом, порядок имеет значение, когда вы вызываете функцию.
Так что если я звонили прирост здесь что-то в этом запятой,
есть прямое отображение.
Первая переменная, как там это называется, сделана копия первой
Аргумент здесь.
К сожалению, этого не должно быть круглых скобках.
Второй аргумент линии с вторым.
>> Так порядке, да, вопросов.
Хорошо.
Извините, что я взял длинный путь, чтобы добраться там.
Другие вопросы?
Хорошо.
Итак, давайте посмотрим, если мы не можем нарисовать картину того, что происходит на самом деле
Здесь под капотом, так сказать.
Так что это прямоугольник, который может представлять памяти компьютера.
Так что даже если вы не знаете, как работает память или как RAM работы, по крайней мере,
Предположим, что у вас есть пучки она в эти дни.
У вас есть мегабайты его.
У вас есть гигабайты его.
И мы знаем, от недели нулю, что байт именно то, что?
8 бит.
Право, таким образом, 8 нулей и единиц.
Итак, если ваш компьютер имеет гигабайт оперативной памяти, два гигабайта оперативной памяти в эти дни, у вас есть
млрд. или 2 млрд. байт памяти, или примерно 8 млрд., или 16 млрд
битов, внутри компьютера.
Теперь, в отличие от маленьких Woolly например Вилли, это не магнитные частицы
Обычно больше.
Все чаще в ноутбуках по крайней мере, это твердотельные накопители SSD, что
просто не имеют движущихся частей.
Это все электронные.
Это все электричество основе.
Так что думаю, хотя, это просто прямоугольник, как представляющие одну или две
гигабайтами памяти, которая у вас есть.
>> Так что это кусок памяти.
Сейчас в мире компьютерных наук имеет вид отгорожена куски
памяти, чтобы сделать разные вещи.
Так, например, если это оперативной памяти компьютера - как это было предложено
Прямоугольник там - Получается, что по соглашению, в верхней части вашей памяти, поэтому
говорить, как правило, то, что называется текстовый сегмент.
Те нулей и единиц, что вы собрали.
Поэтому, когда мы смотрели под капотом на то, что a.out есть все
нулей и единиц -
При запуске программы, эти нули и единицы загружается с жесткого
диск в то, что называется оперативной памяти.
И в памяти, они помещаются в верхней части.
Теперь Тем временем, у вас есть другие вещи.
Инициализированных данных, неинициализированных данных.
Эти два валка памяти обратитесь к глобальные переменные, которые
вы не часто используете.
Но иногда, если вы это сделаете, они в конечном итоге там также.
Тогда есть некоторые другие вещи.
Переменные среды, которые мы не будем тратить много времени на.
Но затем две важные вещи, которые будут возвращаться на протяжении всего этого
семестра, стека и кучи.
>> Поэтому большинство из памяти компьютера сохраняется при запуске программы
то, что называется стеком и то, что называется кучей.
И мы не собираемся говорить о куче сегодня, но мы будем
говорить о стеке.
И стека предназначена вызвать в воображении визуальные подобных столовой
еду в лотках Mather дом, или там, где вы будете, где
Персонал столовой чистить их каждый день.
Они складываются их от пола вверх.
И точно так же в памяти, есть такая идея поставить что-то на
стек, поставив что-то на стеке, положить что-то в стеке.
И что же мы подразумеваем под этим?
Ну, давайте увеличить только на нижнюю половину этой картины, вашего компьютера
RAM, предложить следующее.
Оказывается, что когда вы запускаете программу, как a.out или привет, независимо от
Программа является то, что вы написали,
Опять же, те нулей и единиц загружается с жесткого диска - который является
длительного хранения, остается там, даже когда вы вилку -
загружаются в оперативную память.
RAM быстрее, чем жесткие диски.
Это меньше, чем жесткие диски.
Но это там, где программы жить, пока вы работаете них.
>> Таким образом, вы дважды щелкните программу на Mac или ПК - она ​​загружается из
жесткого диска в оперативную память.
Как только он будет загружен в оперативную память, нулей и единиц пойти на то, как сверху,
так называемый текстовый сегмент.
Но тогда, как только ваша программа фактически начинает работать, основная
Функция называется.
А главное, как мы видели, часто имеет локальные переменные.
И она имеет целых и строк и символов и тому подобное.
Так что если ваши программы, которые вы написали или программы, которые у вас есть
двойном щелчке использовать некоторые переменные внутри основного, они в конечном итоге на
нижней части стека памяти, так сказать.
Теперь более конкретно, что же это на самом деле означает?
Это просто означает, что если мы будем нумеровать вещи -
если мы собираемся число байт оперативной памяти на компьютере, заметили, что
это может быть нулевым байтом числа.
Это может быть байтом номер один, два, три, четыре, пять, шесть, все
вплоть до нравится -
2 млрд будет всю дорогу там на самом верху.
Итак, другими словами, когда мы говорим об оперативной памяти или памяти в байтах, он
просто означает, что кто-то решил, что номер каждого из
эти куски памяти.
>> Поэтому, когда вам нужно 32 бита для Int, или вам нужно 8 бит на символ, где
они в конечном итоге в памяти?
Ну концептуально, они просто в конечном итоге в нижней части этого
то, что называется стек.
Но что интересно теперь, когда основные вызывает функцию.
Пусть функция называется Фу, просто произвольное имя.
Что происходит, является основным находится в нижней части этого стека памяти.
Foo теперь помещается в верхней части главного в памяти.
Таким образом, любые локальные переменные, Foo была в конечном итоге рода концептуально выше
те, в основном.
Если Foo вызывает другую функцию под названием бара, эти переменные в конечном итоге здесь.
Если баре называет что-то еще, здесь, здесь, здесь.
Так что же интересного о запуске программы является то, что вы называете функций,
и как эти функции вызывать функции, а также функции, которые вызывают функции,
Вы создаете этот стек функций в памяти.
И только один раз функция возвращает вы начнете получать эту память обратно.
Таким образом, одним из самых простых способов запустить из памяти в компьютере программы является
написать функции, которые никогда не вернутся.
>> Так, например, давайте продемонстрировать, как много с
умышленно ошибки программы.
Позвольте мне идти вперед и делать # включить , Int основных (недействительными).
И я собираюсь делать, а (2> 1), который, вероятно, никогда не будет
изменится на нас.
И позвольте мне теперь идти вперед и делать Printf.
На самом деле, это будет менее визуально интересным.
Давайте сделаем это.
Для Int (я = 0; I> 0).
Давайте сделаем эту ошибку, я + +.
И давайте не Printf здесь.
Давайте практиковать то, что я проповедовал.
Давайте метод здесь.
Пустота хор, и мы будем говорить Int я.
А потом я собираюсь сказать, Printf -
ой, давайте сделаем это более интересно.
Давайте на самом деле не печатает вообще ничего.
Давайте просто это сделать.
Хор (I).
>> Хорошо.
Так что это багги, потому что зачем?
Я придумываю, как я иду, потому что программа не делает ничего
интерес.
Но это не цель.
Цель состоит в том, чтобы написать программу, основной функцией которого делает то, что, по-видимому?
Позвоните себя.
А на самом деле, мы не нуждаемся в петлю.
Давайте даже упростить этот раз, чтобы не терять из виду на самом деле
фундаментальную ошибку.
Главные вызовы хором петь хором.
Тогда я сделал глупость, и я должен был хор хор вызов, потому что я предполагал,
кто-то еще собирается реализовать это возможно.
И теперь это не будет собрать еще.
Мне нужно сделать что?
Мне нужно прототип, помню.
Поэтому мне нужно, чтобы здесь пустота хора (INT я);.
>> Так что теперь, если я иду сюда -
на самом деле, давайте использовать большие окна.
Давайте пойдем дальше и сделать хором.
Использование неизвестные разыгрывающий я.
О, это было глупо.
Нам не нужны аргументы.
Давайте просто это сделать.
Жаль, что мы начали этот путь.
Было бы гораздо проще написать программу.
Так и тут.
Теперь давайте перейдем к моим окно терминала, повторные Clang.
И здесь мы идем.
Это было действительно быстро.
Что на самом деле только что произошло, правда?
Ну, теперь я добавлю печати линии, так что мы можем видеть.
Итак, позвольте мне сказать Printf, скажем так, я здесь.
Ладно, не переменные, мы оставим это так.
Позвольте мне снова запустить сделать.
Позвольте мне повтор припева.
И давай.
Продолжайте.
Как в стороне, почему она не потерпела крах?
Ошибки сегментации произошло супер быстрый раньше.
[Неразборчиво]
David J. Малан: Совершенно верно.
Так что это занимает время, чтобы напечатать.
Это займет больше работы со стороны компьютера.
И это так.
Сегментация вина.
>> Так заметите, как быстро запускать программы.
Если вы не печатает ничего, супер быстро.
Но мы все же получили эту ошибку сегментации, потому что то, что происходит?
Ну, если вы думаете о том, как память компьютера выложено, это
бывает основным.
Но здесь -
Давайте просто называть этот хор, и назовем этот хор.
И теперь, если я делаю свою эстетику права, это как раз собирался сказать хором,
хор, хор, хор, хор, хор, хор, до тошноты.
И в конце концов, что же будет дальше?
Если картина буквально это то, что просто происходит концептуально?
Стек перерасход кучи.
Или, того хуже, вы просто захвачены все, включая текстовый сегмент, который является
нулей и единиц, которые представляют вашу программу.
Короче говоря, это просто супер, супер плохого.
Верно?
Ваша программа вышла из-под контроля.
Вы используете способ больше памяти, чем вы рассчитывали все из-за глупой
ошибка, в этом случае.
Или в данном случае, совершенно сознательно сделали функцию, называющая себя.
Теперь это не так уж плохо.
Функции, называющих себя действительно имеет большую силу
когда вы используете его правильно.
Я не использовал его правильно здесь.
>> Так что не все так плохо.
Но то, что я никогда не перестанут называть себя является фундаментальным
Слабость здесь этой программы.
Так куда мы идем со всем этим?
Ну, а что происходит на самом деле?
Когда я называю приращение функции, как мы делали в тех примерах,
У меня есть значение, как 1, что я прохожу дюйма
Я прохожу в копию номер один.
Таким образом, происходит следующее.
Так что давайте идти в шаг пример.
И этот парень прямо здесь.
Итак, вот что на самом деле происходит.
Когда я позвонил прирост, и я прохожу по х, наглядно то, что
происходит здесь, это -
если у меня есть стоимость 1 хранится здесь, и я на самом деле зовут прирост, который
теперь называется хор -
Да, бросив меня здесь.
Итак, давайте называть это приращение.
И мы не знаем, что это следующая функция собирается быть.
Так что же на самом деле происходит где-то здесь в основном, у меня есть кусок
памяти, которая хранит номер 1.
Когда я называю прирост, я использую другую часть памяти, но теперь я
есть копия 1.
Когда я увеличить это значение, это становится 2 - ужасно написанных на
Экран здесь.
Но то, что происходит, как только прирост прибыли?
Эта память просто получает вернул к операционной системе, которая означает, что все
Вы сделали ничего полезного.
Тот, который был первоначально содержащейся в основной по-прежнему на самом деле.
>> Так куда мы идем с этим?
Ну, получается, что в памяти у вас есть эта спина к спине последовательность
байтов, которые Вы можете положить вещи дюйма
И получается, что мы уже видели нечто, что включает в себя положив
вещей спина к спине, чтобы спина к спине.
Что представляет собой строку, основанные на неделю одну, то недели две?
Так что это просто набор символов.
Вот и получается, как вы можете положить номеров в памяти, так же вы можете
положить символов в памяти.
И как только мы начинаем положить символов в памяти спиной к спине, чтобы вернуться к
назад, то получается, что с помощью простейших вещах, как цикл или
время цикла, мы можем повторять -
слева направо по символов в строке -
и начать массируя их в разные персонажи в целом.
Может стать B. B может стать C. Так что в конечном итоге, мы можем взять
Английский предложение, которое действительно имеет смысл и преобразует каждый из этих
буквы по одной за раз, идя через нашу память компьютера остается
Право на самом деле шифрования.
>> Итак, давайте сделаем наш пятиминутный перерыв здесь, и когда мы вернемся, мы будем
начать этот процесс скремблирования информации.
>> Хорошо.
Поэтому, прежде чем погрузиться в некоторых крипто и эти вещи называются массивами, позвольте мне
Пауза на любые вопросы, потому что я чувствую, что я действительно отчасти запутанной некоторые из
эти темы.
Так что давайте зафиксируем теперь, если мы можем.
Таким образом, мы только что говорили о возвращении ценностей.
Мы говорили о аргументов.
И мы говорили об этом понятии, которое мы вернемся в ближайшие недели
пришел, просмотра памяти целую кучу этих стеками
Лотки, так сказать.
Снизу на вверх, так, что каждый лоток, который получает положить в стек представляет
функция, которая в настоящее время называется.
Есть вопросы?
Так как о - дайте мне попробовать задать вопрос.
Я все портит, но теперь it's - you've все видели лицо мальчика.
Таким образом, мы вернемся к этому.
>> Итак, позвольте мне задать вопрос здесь.
Позвольте мне упростить это к тому, что было до некоторых из наших ранних Q & A.
И тот факт, что прирост имеет открытую скобку, внутр номер, закрытый
скобках.
Что Int числа представляют?
[Неразборчиво]
David J. Малан: аргумент.
Хорошо, но что это аргумент?
[Неразборчиво]
David J. Малан: Извините, что это такое?
Выступающий 3: Что-то вы передаете дюйма
David J. Малан: Хорошо.
Таким образом, то, что вы передаете дюйма
И вообще, это просто вход.
Если вы пишете функции и цели, функции в жизни, чтобы сделать
что-то немного иначе каждый раз, когда вы используете его, то единственным способом для
Чтобы это произошло на самом деле, казалось бы предоставить ему вход так, чтобы она
может сделать что-то другое с помощью этого вклада каждый раз.
>> Таким образом, вы должны определить две вещи, когда функция принимает входы.
Вы должны указать имя, которое вы хотите дать, что вход только для
вашего удобства, чтобы вы могли ссылаться на него в функцию, которую
сами пишете, как я сделал здесь, в строке 32.
Но вы также должны указать его тип, потому что C является языком программирования
что именно требуется
что если вы хотите переменной, вы должны сообщить компьютеру, что
тип данных, это,
В большей части так, чтобы он не знает, сколько бит
выделить для этой переменной.
Потому что это может быть шесть -
Извините, это не будет шесть.
Это может быть 16.
Это может быть 8.
Это может быть 32, даже 64.
Но компьютер должен знать.
Теперь Int на левую сторону представляет то, что, в отличие от?
[Неразборчиво]
David J. Малан: Что это?
[Неразборчиво]
David J. Малан: тип функции и, более конкретно,
Тип выпускаемой продукции.
Право.
Таким образом, в то время как вещь в скобках представляет свой вход, если таковые имеются,
вещь, чтобы левая представляет свою продукцию.
И в этом случае, по-видимому прирост возвращает целое.
И так Int является тип возвращаемого этой функцией.
>> Что это значит вернуть?
Буквально, вы используете ключевое слово возвращения.
И потом, если то, что вы возвращаетесь в правом ключевое слово
число, то, что действительно соответствует тому, что мы обещали.
Вы не могли бы сделать что-то вроде этого -
Привет, мир -
потому что это строка.
Очевидно, это не является целым числом.
Короче говоря, бремя на самом деле на нас, программистов, чтобы быть конкретным, как
к тому, что мы возвращаемся, и тогда на самом деле идти о возвращении его.
И тогда, чтобы сделать немного более четкие контексте -
Вот он снова.
Контекста -
Большим сюрпризом в ближайшие одну минуту.
Контекст здесь, сейчас, в том, что память компьютера, опять же,
гигабайт, два гигабайта, что угодно.
Может быть, это другое.
Может быть, это меньше.
Но компьютер рассматривает ее как имеющие различные разделы.
Что-то идет туда.
Что-то еще происходит там.
Разные вещи идет в середине.
И сегодня, мы просто начинаем рассказываю эту историю.
>> Но мы вернемся к этому с течением времени.
В настоящее время, только кусок памяти мы действительно заботимся о том, текстовый сегмент
потому что только что представляет нулей и единиц
Clang, что был сигнал.
Итак, когда вы запустите команду на клавиатуре, как a.out, или вы дважды
щелкните по значку на Mac OS или Windows, ваши программы загружается с жесткого
диска в оперативную память.
И она шлепнулась в верхней части оперативной памяти компьютера, так сказать.
Теперь Между тем, как ваша программа начинает работать и основные вызывается в
Вы писали программы или программы Microsoft или Apple, пишет, любого из ее
локальные переменные в конечном итоге там на дне памяти компьютера.
Но если основная вызывает другую функцию, которая сама по себе имеет переменные или
аргументами, они в конечном итоге над ним.
И если эта функция вызывает то, что они в конечном итоге над ним,
над ним, над ним.
И только один раз в функции осуществляется выполнение делает стопки лотков, так
говорить, начинают получать все ниже и ниже.
И это то, что тогда, в двух словах, объясняет, почему, когда вы звоните куба -
или вы звоните прирост -
вы передаете копию значения.
А что это означает, что наглядно это то, что вы буквально написания
номер 1 в другую часть памяти, которая меняется от 1 до 2, в случае
прирост -
или 8, в случае куба -
, а затем бросали, что память далеко, как только увеличение или кубе
Функция возвращает.
>> Вопрос.
[Неразборчиво]
David J. Малан: где - глобальные переменные хранятся в то, что
в настоящее время называется инициализируются данные или неинициализированных данных.
Разница в том, если у вас есть глобальная переменная, и вы назначаете его
сразу же значение с знака равенства, она заканчивается на вершине.
А если просто сказать Int х запятой без значения, это заканчивается немного
ниже в памяти просто конвенции.
Другие вопросы.
Хорошо.
>> Таким образом, эта картина будет возвращаться, как мы получим более мощный с тем, что мы можем сделать
с компьютером.
Но сейчас, давайте краткое введение в криптографию, специфический тип
криптографии, что не решает всех проблем в мире, но никак решить
некоторые из них.
В этом случае здесь, у нас есть то, что называется секретным ключом шифрования.
И секрет криптографии ключ, как следует из названия, происходит ее безопасности
от тайной.
Так, например, если вы еще в начальной школе, и вы передаете
Маленький секрет любовное письмо к мальчику или девочке вы дробления на - если вы
хотел передать, что через аудиторией, вы, вероятно, не будет писать
такая записка на английском языке или что ваш родной язык, а, скорее, вы
может зашифровать его.
Или вы можете просто отправить им текстовое сообщение в эти дни.
Но вы могли бы на самом деле передают их к сведению всем классе.
И сделать это безопасно, так что ваши друзья и учителя
Не знаю, что вы пишете, вы можете придумать достаточно простой
Алгоритм -
Молодой хотя вы могли бы быть -
просто карабкаться слова.
Таким образом, вместо того чтобы писать, вы можете написать B. Вместо B, вы можете написать
C. Вместо C, вы можете написать D, и так далее.
Или вы могли бы придумать более сложный перевод писем
различных букв.
Но загвоздка в том, мальчик или девочка, которым вы отправляете эту записку необходимо
что-то знать.
Какие это то, что, очевидно?
Как и то, что ваш секрет.
Мол, что это такое сопоставление Как и завтрак и Cs и Ds?
Это только добавив к нему один, так сказать, к каждой из букв, чтобы перейти от
А в B, B в C?
Это более сложный, чем это?
Таким образом, вы и ваш раздавить нужно, чтобы у этой секретной информации.
Но есть своего рода уловки-22 здесь.
Если это в первый раз вы отправляете эту любовь через письма
класса, как то, что мальчик или девочка будет знать, в чем секрет даже есть?
Так что секретный ключ шифрования не решает всех проблем в мире.
И там на самом деле отношения, которые мы вернемся к к
семестра конца.
>> Кроме того, есть ни один из нас, вероятно, никогда не послал -
Аналогично, большинство из нас не знает, что кто-то работает, например, на
Amazon.com.
И тем не менее, многие из нас, наверное, купил материал на Amazon.com.
И нас учили считать, что эти электронной коммерции
безопасность транзакций.
Верно?
URL, вероятно, говорит HTTPS.
Там в, может быть, глупый маленький значок замка где-то.
Там какая-то криптографии обеспечения вашей кредитной карты
между вами и Amazon.com.
И еще, если криптография включает в себя зная некоторые тайны, и все же я не
знаю никого, на Амазонке, и я, конечно, не устроил любой
тайну с кем-то на Amazon, как мой компьютер или мой браузер это делает?
Что ж, оказывается, есть другие виды криптографии в целом, которые решают
этой проблеме.
Но на сегодняшний день, мы сосредоточимся на простой, где вы можете устроить в
продвижение знать некоторые тайны, как плюс 1 или некоторое отображение между Как и завтрак.
>> И процесс криптографии обычно включает в себя это.
У вас есть обычный текст, изображенный здесь, на левом.
Вы запускаете его через какой-то алгоритм или процедура
для шифрования.
Может быть, это просто становится B, B становится C. И тогда вы в конечном итоге с
зашифрованный текст.
Между тем, как только ваш раздавить получает тайные записки, он или она должны затем
расшифровать его, как правило задним ходом, что алгоритм так, чтобы получить
Резервное простой текст.
Теперь есть физическое воплощение этого.
Например, это маленький секрет кольца декодер.
И это кольцо в том смысле, что есть два набора здесь.
На внешней периферии этой вещью, есть буквы от А до Z,
хотя они в случайном порядке.
И с внутренней стороны, там на самом деле некоторые числа, такие, что с этой
Кольцо, вы можете включить вид снаружи, но не внутри для того, чтобы выстроиться
Номера с буквами.
И в клипе вы собираетесь посмотреть - некоторые из которых вы, возможно, видели 24/7
вокруг рождественского сезона из фильма под названием Рождественская история.
Вы увидите, что мало Ральфи так не терпелось выяснить, что сиротка
Секретное сообщение Энни была для него, что было сообщено, я думаю, в
виде цифровых сообщений на серийный окно.
И надо было аккумулировать все маленькие карты, которые пришли
в коробки от хлопьев.
Нужно было, чтобы отправить их сюда
Вы должны были получить обратно тайну кольца декодер, так что вы можете, наконец, понять
, что отображение между буквами и цифрами,
или букв и букв.
Таким образом, я даю вам этот короткий клип из Рождественская история мотивировать PSET 2 и
наша дискуссия, в момент, массивов.
Таким образом, здесь мы имеем Ральфи.
>> [ВОСПРОИЗВЕДЕНИЕ ВИДЕО]
-Да будет известно всем и каждому, что Ральф Паркер настоящим назначен
член маленький круг сирот Энни секретно и имеет право на все
почести и преимущества, происходящие с ними.
-Подпись, Little Orphan Annie.
Контрассигнуют, Пьер Андре!
В чернил!
Достижения и преимущества, уже в возрасте девяти лет.
Давай, давай покончим с этим.
Мне не нужны все такое прочее о контрабандистов и пиратов.
-Слушай завтра ночью для заключительных приключений The Black
Пиратский корабль.
Теперь пришло время для тайного сообщения Энни для вас членами
Тайного Круга.
Помните, что дети, только члены тайный кружок Энни может декодировать
Секрет Энни сообщении.
Помните, Энни зависит от вас.
Установить контакты с B2.
Вот сообщение.
12, 11 -
-Я в первом заседании тайным.
-14, 11, 18, 16 -
-Пьер был в отличной сегодня голос.
Я могу сказать, что сегодня сообщение было действительно важно.
-3, 25.
Вот сообщение от Annie себя.
Помните, никому не говорите.
-90 Секунд спустя, я в единственную комнату в доме, где девятилетний мальчик
мог сидеть в уединении и декодирования.
Ага, Б. Я пошел к другому.
E. Первое слово будет.
S. Он шел легче.
U.
-Ой, да ладно, Ральфи.
Я должен идти.
-Я спущусь, штат Массачусетс.
-Вот здорово.
-T, О. Обязательно.
Будьте уверены, к чему?
Что Little Orphan Annie пытаюсь сказать?
Будьте уверены, к чему?
-Ральфи!
Рэнди должен идти.
Не могли бы вы выйти?
-Все в порядке, мама.
Я сейчас выйду.
-Я получаю ближе.
Напряжение было ужасным.
Что это было?
Судьба планеты может повиснуть на волоске.
-Ральфи!
Рэнди должен уйти.
-Я бы сразу, с ума сойти.
-Ну и дела, почти нет.
Мои пальцы летали.
Мой разум был стальной капкан.
Каждый пор вибрации.
Это было почти ясно.
Да, да, да, да.
-Будьте уверены, чтобы пить Ovaltine.
Ovaltine?
Вшивой коммерческой?
Сын сука.
[END ВОСПРОИЗВЕДЕНИЕ ВИДЕО]
>> David J. Малан: То есть у нас есть криптографии.
Так как в компьютере, мы можем идти о реализации или
представляющие такие вещи?
Что ж, нам нужен способ выразить себя немного более гибко, чем
наши переменные до сих пор позволил.
У нас были целые.
У нас были символы.
У нас были поплавки и двухместные и некоторые другие.
Но эти отдельные части памяти, которая на самом деле не позволяют нам
выразить вещи, как слова и предложения и фразы.
В самом деле, мы называли такие строки вещи.
Но мы обещали, что это действительно просто упрощение CS50
библиотеки, которые мы намерены отогните.
>> И так, давайте начнем делать это здесь.
Позвольте мне идти вперед и открывать файл -
Все эти файлы доступны как обычные онлайн -
называется array.c решить проблему не связанных с строки, но что рисует
Картина здесь о том, как мы могли бы использовать то, что называется массивом.
Массив представляет собой тип данных.
Это тип переменной, своего рода, который имеет несколько меньшие типы данных
внутри него спина к спине, чтобы спина к спине.
Так, например, если мы хотим написать небольшую программу, которая дает Вам
Тест среднем на курс, как 50, который имеет два викторины, вы можете очень легко
написать эту программу - на основе даже на некоторых из материала на прошлой неделе -
с помощью GetInt и несколько переменных.
Quiz1 Int, Int quiz2, и это довольно просто.
Это может быть 10, 20 строк кода, не более, реализовать программу, которая запрашивает
Пользователь в течение двух баллов викторины и затем вычисляет их среднее, добавив их
вместе, разделив на два, а затем печати результатов.
Мы могли бы сделать это довольно легко теперь, после
некоторое количество минут.
>> Но проблема в том, что предположим, что 50 было три или четыре викторины.
Предположим, что вы хотели использовать ту же программу для класса, который был
еженедельные викторины.
Подумайте о классе, который еженедельные викторины.
Если есть вроде 16 или около того недель в семестр, теперь у вас есть 16 переменных -
quiz1 Int, Int quiz2, внутр quiz3, внутр quiz4.
Как только вы начинаете видеть эту избыточность, это копирование и вставка
кода, он должен начать делать вы хотите там было лучше.
И к счастью, потому что массивы, есть.
Так давайте сделаем это.
Во-первых, позвольте мне представить очень простую вещь, что мы не использовали до сих пор,
но вы увидите, что иногда в коде.
Это то, что обычно называется постоянной.
Так что это постоянная в том смысле, что это значение никогда не меняется.
Человеческие конвенции при создании постоянной заключается в использовании всех капитальных
буквы, просто так, что он действительно выделяется в коде.
А специальные ключевые слова, которые вы используете в С # определить.
Так что, если вы говорите # определить, то пространство, то слово, которое вы хотите использовать для
постоянное название, а затем значение константы.
Таким образом, уведомление, это отличается от присвоения что-то переменная.
Там нет знака равенства.
Там нет запятой.
Это то, что известно как директива препроцессора, но больше на
в другой раз.
>> На данный момент, это создает неизменное значение, называемое викторины, фактические
числовое значение 2.
Таким образом, везде, где есть тесты, викторины, тесты на протяжении всего этого файла, это
только номер 2.
Теперь, если я смотрю на основные Теперь, давайте посмотрим, как это работает.
Во-первых, это выглядит немного загадочно.
Но это все вещи из неделе один.
Спросите у пользователя классах.
Как мы это делаем?
Ну, а в строке 22 -
это действительно сочные части -
Я заявляю с плавающей точкой, а не просто одним поплавком.
Я объявив, скорее, массив значений с плавающей точкой.
Это переменная будет называться классах, как это подразумевается здесь.
Но только часть нового синтаксиса, то эти квадратные скобки, тот факт,
что я сказал поплавок классах, а затем открыть скобку, а затем число.
Обратите внимание, если это постоянно, это так же, как мы сделали это.
Это означает, эй компьютер, дайте мне два поплавка, и давайте коллективно называют
их оценки.
Это в отличие от гораздо более трудоемкий процесс, как это.
Поплавок Grade1, плавать grade2, и так далее.
Таким образом, массив позволяет нам реализовать эту идею, но гораздо менее неряшливо, в
таким образом, что мы можем написать одну строку кода, а не, скажем, 16 на 16
неделя семестра.
Так что я не хочу жесткий код 2, потому что если вы думаете об этом сейчас
логично - предположим, в следующем году CS50 изменений до 3 викторины вместо этого.
И у меня был номер 2 здесь.
У меня был номер 2 здесь.
Она становится очень утомительным и очень легко испортить и случайно изменить
одно значение на 3 и пропустить некоторые другие значения 2.
Так что я собираюсь вместо абстрактного это расстояние и использовать эту константу, которая, как и ее
название, никогда не меняется.
И теперь, независимо от того, будем ли мы иметь различные викторины этом или следующем году, я
просто изменить его в одном месте, здесь на вершине.
>> Так что все константы.
Между тем, новая концептуальная особенность состоит в том массива.
Таким образом, в квадратных скобках дать мне это много плавает и позволяет мне коллективно
называть их классах здесь.
Итак, теперь давайте посмотрим, что я собираюсь делать.
Здесь, в строке 24 является началом цикла.
Это действительно ничего особенного.
Это только с помощью тестов, а не жестко числа.
Но нет ничего интеллектуально разных там с прошлой недели.
Это просто Printf.
Таким образом, Е ("тест номер% сут% D"), потому что я просто хочу, чтобы распечатать дать мне викторины
номер одного из двух, а затем два из двух.
Так что это чисто эстетическая вещь.
Но самое интересное сейчас находится в строке 27.
Для того, чтобы заполнить одну из двух заполнителей с плавающей точкой
значение, вы снова использовать квадратные скобки.
В этом случае, я использую я, потому что это цикл начался с равной я
Какое значение, по-видимому?
0.
>> Таким образом, на первой итерации этого цикла, это, как будто я
написал это в коде.
Но на второй итерации этого цикла, это, как будто я
написал это в своем коде.
Но то, что я использую переменную прекрасно, потому что, как следует из названия
предполагает, что это изменение его значения на каждой итерации.
Так что я заполнение этого массива одном месте за один раз.
Что это массив выглядит?
Ну, почему я нарисовал это супер простой прямоугольник на экране здесь
Перед именно по этой причине.
Массив это просто кусок памяти последовал еще один кусок памяти,
последовал еще один кусок памяти, и так далее.
Так что, если мой массив размером 2, в данном случае здесь, все, что я сделал бы по
ввод в моей оценки викторины, как здесь.
Я получил 100 на этом.
А потом я получил 99 на этом.
Тогда эта память не может даже быть использован, потому что я только спросил
компьютер массив размером 2.
Эти квадраты все еще там.
Верно?
У вас еще есть два гигабайта оперативной памяти, даже если вы только
просит двумя поплавками.
Таким образом, идея массивов является то, что компьютер просто берет кусок памяти
, а затем распределяет мелкие куски спина к спине, чтобы спина к спине.
И это все, что массив.
Это непрерывный кусок памяти, внутри которой вы можете положить вещи.
>> Теперь это происходит тогда делать лишь некоторые скучно арифметика.
Если я прокрутите вниз здесь, это где я тогда итерации по массиву.
Я придумал суммирование всех значений в массиве.
И тогда я использовать круглые функцию здесь на самом деле делать
сумма делится на викторины.
Но позвольте мне махнуть рукой на что как своего рода достаточно арифметических сейчас.
Но все, что делает для меня, в конечном счете, вычисление среднего.
Итак, сначала тест плюс вторая викторина, разделенная на 2, а затем печати
его, как Int.
>> Но давайте теперь переход к другой пример называется string1,
который рисует аналогичную картину, но с использованием строк.
Позвольте мне идти вперед и упростить этот на мгновение.
И прости отступ на данный момент.
Обратите внимание на линию 19 из этого примера, я получаю строку от пользователя.
Но обратите внимание на то, что я делаю в следующем линий 22 и далее.
На самом деле я итерация от Я до - и это новый трюк -
StrLen, длина строки.
Это функция, которая поставляется с C, что если вы передаете его строки, он говорит
Вам, сколько символов в этой строке.
Вот и все.
Тот факт, что это StrLen, а длина строки просто потому, что это
более кратким.
30 лет назад, людям нравилось писать вещи, как лаконично, насколько возможно.
Таким образом, мы сохранили эту конвенцию здесь.
я + + означает лишь то увеличиваем я в каждой итерации.
А теперь замечаю это, что действительно интересно.
Таким образом, в строке 24, я говорю компьютер, дайте мне характер, восемь
битов, и называют это в.
Но что это на правой стороне говорите?
В английском языке, что это представляете?
[Неразборчиво]
David J. Малан: Совершенно верно.
Дайте мне первый символ в массиве.
Или, в более общем, дай мне I-ый символ в массиве.
И понимаю, что это важно сейчас, как компьютерные науки, мы на самом деле
начиная с 0.
Вы не должны усмотрению сейчас, чтобы начать это делать.
Теперь вы должны вести себя в соответствии с ожиданиями компьютера и
считать с нуля, потому что [0] будет первым
символов в строке.
[1] будет второй.
[2] будет третьим, и так далее.
Таким образом, эта программа, если я скомпилировать его - это, опять же, string1.
>> Так что string1.
А теперь я бегу string1 в моем окне терминала.
Он ожидает ввода, так что я собираюсь ввести, скажем, Давида.
Enter.
И теперь он печатает DAVID все на разных линиях, потому что
заметит, что я делаю.
Я печать одного символа за один раз.
Сейчас мы не будем вдаваться в подробности сегодня на этом.
Но я удалил эту минуту назад здесь галочку.
Оказывается, что если пользователь неправильно, состязательности, или просто
замешательстве, вы можете фактически не дают строки некоторой длины.
Если вы нажмете не ту клавишу на клавиатуре, вы могли бы дать
Строка не на всех.
Или, если вы злой, вы можете попробовать, чтобы вставить в стоимость гигабайта о
эссе для заполнения этой строки.
И если на компьютере не хватает памяти, то получается, что мы собираемся
вернуть это специальное значение, называемое нулевое.
Таким образом, на данный момент, просто знаю, что есть это специальное значение, называемое нулевое, что
позволит нам проверить, когда мы из памяти, между прочим.
>> Но если я открываю сейчас string2, обратите внимание на одно различие здесь.
Обратите внимание на одно различие здесь с string2.
С string2, этот цикл немного отличается.
Позвольте мне удалить нули, так что мы можем говорить о тех, кто в другой раз.
Но чем же отличается цикла на этот раз?
И я могу вернуться к предыдущему примеру.
Так что это второй вариант.
Это версия одного.
Один, два, раз-два.
Так StrLen вызов где?
Это в первой части цикла.
Любые мысли о том, почему я это делаю?
Да.
[Неразборчиво]
David J. Малан: Так что мы не вызываем функцию каждый раз.
Именно так.
Напомним, с петлями на то, что они супер просто, как только вы рода
понимаю, что это инициализации
состоянии, и обновление.
Проблема в том, что условие происходит на каждом
итерации цикла.
И поэтому в данном примере, что такое плохо о том,
что это мое состояние?
Вы звоните StrLen снова и снова, и снова.
Но как только я набрал в DAVID, длина этой строки равно пяти.
И он не собирается менять на каждой итерации цикла, поскольку
Строка по-прежнему D--V-I-D. Так что это намек на то, что собирается стать
более важная идея известна как дизайнерское решение, где - просто не
заставить компьютер делать ненужную работу.
>> Теперь же, как предварительный просмотр PSET 2, PSET 2 в стандартном издании
собираюсь бросить вам вызов на самом деле реализации некоторого числа шифров, некоторые
количество алгоритмов шифрования, так что вы можете как шифрование и дешифрование
секретные сообщения, похожую на ту, Ральфи там декодировать.
В хакером издание PSET 2, мы собираемся пойти немного дальше.
Мы собираемся передать вам файл с фактическими компьютерную систему, которая содержит
целую кучу имен и фактической зашифрованные пароли, и задача
для хакера издание будет взламывать эти пароли и фигуры
, что криптография и тайные, что была использована на самом деле
генерировать эти пароли.
И мы собираемся сделать это с помощью новой функции здесь C, что я дам
Вы только демо-версия, известная как аргументы командной строки.
>> Вот и получается, как некоторые из вас, возможно, видели в разделе или в учебниках,
Основным не всегда должна быть пустота в скобках.
Оказывается, что основная можно также записать как это, с двумя аргументами,
ARGC и ARGV, где ARGC число слов, которые вы вводите после
Программы имя в командной строке.
И ARGV является фактическим слов.
И, как квадратные скобки там предлагают, ARGV видимо массива.
Это собирается быть строкой после строки после строки в памяти.
Так что мы собираемся быть в состоянии сделать, начиная с PSET 2,
что-то вроде этого.
Если я делаю argv1, который является примером мы вернемся к в понедельник, и запустите
это, заметьте, что это не похоже, чтобы сделать что-нибудь еще.
Он просто выводит свое имя.
Но если я прощаюсь класса, обратите внимание, что эта программа по-видимому итерации
над каждым из слов, которые были напечатаны в командной строке.
И средства, с помощью которых мы сможем получить доступ к словам, которые пользователь имеет
печатается в строке является изменение основного, начиная этот уик-энд, от Int
основных (недействительными) в целое основные (агдс, ARGV).
И, таким образом родится аргументы командной строки.
И как только вы получите действительно сложная в этом, вы будете иметь возможность писать
действительно трип программ, таких, как этот вот, который идет выше и вне
некоторые функции, которые мы сделали до сих пор, но все довольно мощный.
>> Таким образом, мы оставим это с этим на экране.
И мы будем видеть Вас в понедельник.