[Powered by Google Translate] [Неделя 2, продолжение] [David J. Малан, Гарвардский университет] [Это CS50. - CS50.TV] Хорошо. Это CS50, и это в конце недели 2. Если вы планируете быть голодным в это время завтра, знать, что мы собираемся провести как небольшой группой завтра, четверг, 1:15 вечера. Там есть URL здесь, если вы хотите, чтобы RSVP. Места ограничены, так что простите, если форма заполнена к тому времени вы заполните это. Другой URL, однако, что может быть интересно это. В почти через месяц, курс будет доступна Все более широко через EDX, через которые люди в Интернете будет иметь возможность следить вместе, участвовать в процессе достаточно активно, на самом деле. Они буду использовать CS50 и CS50 Appliance Обсудить и самые различные программные средства, которые мы уже использовали в этом семестре. И одна из инициатив, которые мы хотели бы взять в качестве эксперимента в этом году , чтобы увидеть, как много содержания, которое мы можем перевести в других устных и письменных языков. Так что, если вы могли бы иметь заинтересованность в участии в этом проекте которым мы будем предоставлять английском стенограммы и субтитры для лекций курса и шортах и ​​семинарах и секциях и т.п., если вы свободно говорить и писать свободно какой-то другой язык, мы хотели бы обратиться к вам в этот проект, в котором вы взять на себя одну или несколько видео, переводя их на язык, вы знаете достаточно хорошо. Чтобы дать вам представление о интерфейсе, там данном веб-интерфейс , которые мы будем использовать, что создаст существенно пользовательского интерфейса, как это. Это было мне преподавании некоторых Хэллоуин назад, и на правой стороне в черном рядом с этими метками времени, Вы увидите различные вещи, которые вышли из моих уст в тот день, , а затем под ним вы сможете перевести на другой язык именно то, что отображение между ними, в данном случае, английского и, скажем, испанского языка. Так что это на самом деле очень удобный инструмент. Вы можете перемотки назад и вперед очень легко с помощью сочетаний клавиш. Так что, если вы хотите принять участие в этом эксперименте, и ваши слова видел и читал на потенциально тысячи людей там, пожалуйста, не стесняйтесь участвовать. Одно слово о котенок с понедельника. Чтобы мы отправили слишком страшно сообщение, понимаем, что, как рабочее время предлагают а также разделы предлагают, дизайн, конечно, очень много , что студенты сотрудничают и говорить, чтобы работать через проблемы наборы и проблемы вместе, и действительно линии просто сводится к тому, снова, работа, которую вы в конечном итоге представить, должны быть вашей собственной. И, честно говоря, в рабочее время это совершенно нормально, это полностью можно ожидать даже поболтать с некоторыми друг рядом с вами. Если он или она борется с некоторыми тему и вы, как: "Ну, что ж, позвольте мне дать вам представление о некоторой строки кода, который я написал," это нормально, что происходит, и это очень способствует, я думаю, с процессом обучения. Там, где линия пересекла получает, когда голова наклонена рода здесь для слишком многих секунд или минут для того, чтобы действительно только что были возможности для разблокирования вашего друга, и, конечно, когда все становится обмен по электронной почте и Dropbox и т.п., там тоже есть линии. Таким образом, все средства чувствовать себя комфортно и вдохновляет общаться с друзьями и одноклассникам о psets и больше и просто понимаю, что то, что вы в конечном итоге представить должно быть действительно продукт вашего творчества, а не кто-то другой. И вот одна из предметно-ориентированных задач для pset2, который выйдет поздно вечером завтра, погрузиться в мир криптографии, , которая является искусством шифрования или скремблирования информации, и это в конечном счете относится к миру безопасности. Теперь, безопасность для большинства из нас приходит в виде довольно мирской механизмов. У всех нас есть имена пользователей и пароли, и у всех нас есть очень плохие имена пользователей и пароли, скорее всего. Если ваш пароль так же на нескольких веб-сайтах, что, вероятно, не лучшая идея, как мы обсудим ближе к концу семестра. Если ваш пароль записывается на записки - не шутка - на вашем мониторе, это тоже не обязательно лучший дизайн, но довольно распространенное явление. И если вы не используете криптографию для шифрования паролей, они особенно уязвимы. Так что если вы думаете, что быть супер умный, имея скрытый документ Word где-то на вашем жестком диске, который имеет все ваши пароли но это в папке, что никто не собирается заглянуть, что тоже не очень надежный механизм. И то, что pset2 представит это искусство криптографии и скремблирования информации, так что такие вещи, как пароли все более безопасной. Контекст здесь является то, что с небезопасной данных приходит возможность зашифровать его и, чтобы засекретить его. И вот этот, например, является примером зашифрованное сообщение. Это на самом деле что-то говорит на английском языке, но это явно не вполне очевидна. И мы прошли полный круг сегодня, чтобы дразнить друг от друга, что это секретное сообщение здесь. Но в реальном мире компьютеров, вещи, даже не похоже, что они могут быть английские фразы. Например, это то, что вы можете найти на стандартной Linux или Mac или UNIX компьютер в файл, который был когда-то называли файла паролей. В настоящее время это были перемещены в другие места. Но если вы посмотрите в нужном месте в системе, вы увидите не только ваше имя пользователя или других людей в системе, но вы увидите, зашифрованную версию пароля. Действительно, слово склеп там предполагает, что следующие вещи в зашифрованном виде, и этот ряд, казалось бы, случайных букв и символов и цифр и т.д. могут быть расшифрованы только в целом зная некоторые тайны - секретное слово, секретный номер - и так на самом деле, искусство криптографии в конечном счете, сводится к тому, доверять какой-то и зная то, что кто-то не делает. Таким образом, мы рассмотрим это в немного более подробно сегодня и в PSET в будущем. А теперь несколько слов о Pass / Fail. Тем более, что некоторые из вас нырнул в pset1, техника, и совершенно новый мир для себя, понимаешь, что разочарование и растерянность и только технические трудности, вполне можно ожидать, Особенно с первым PSET, где есть так много всего нового, только знакомится с Л. и компакт-диск, и все эти тайные команды и новую среду, и это отдельно от фактического материала и программирование себя. Так понимаю также, что есть, конечно, рабочие часы, которые существуют в качестве опорной конструкции. Разделы начать в ближайшее воскресенье. Но самое главное, если вы чувствуете себя просто, что это не мир для вас, понимаешь, что это действительно просто нужно время. И если бы не эта возможность лет назад для меня взять класс годен / не годен, Честно говоря, я никогда бы даже ступить в классе. И вы можете изменить это до, скажем, пятый понедельник конечно, так что если вы на краю теперь, понимаешь, что вместо головы в некоторых других вод в целом, этого, конечно, рассматривать только изменения в зачет / незачет. Опять же, это не совсем эту культуру здесь, в Гарварде принимать вещи зачет / незачет так как все на самом деле хочет достичь или overachieve, но, честно говоря, это прекрасный способ попытаться что-то из которые не могут быть вам знакомы, и вы будете в конечном итоге делают, в большинстве случаев, вполне нормально, возможно, многое к вашему удивлению. И более конкретно, то, что я думаю, что годен / не годен вообще делает, Особенно, как вы, возможно, испытали с pset0, если вы положите в 10 часов, 15 часов, 25 часов в некоторых PSET и вы просто биться головой о стену, и она становится супер поздно ночью но вы сделали PSET 90% пути, и вы просто не могу понять одну вещь, годен / не годен действительно снимает остроту класса, как это, где вы можете сортировать радостно говорят: "Хорошо, я знаю, что это не идеальный, Но я работал от своей задницы на это, я очень счастлива с тем, где это закончилось », и что будет соответствовать ожиданиям за зачет / незачет. Так что имейте это в виду. Хорошо. Так что те из вас, кто пытался использовать Гарвардского университета Wi-Fi, знаю, что есть CS50 SSID, Wi-Fi соединение, плавающие вокруг что вы могли бы лучше удачи. Это немного парадоксально, что пароль для этого, если вы хотели бы попробовать подключении к этому для лучшей скорости - и дайте нам знать, если это не лучше - 12345, на всем пути до 8 потому что 8 является более безопасной, чем 5. Так что если вам нужен Wi-Fi пароль, подключиться к беспроводному CS50 здесь, 12345678, и сообщение о CS50 Обсудить если вы до сих пор периодически возникающих проблем подключения, и мы дадим полномочия, которые будут знать это пространство. Хорошо. Так быстро тизер, особенно для тех из вас, кто вентилятора мальчиков и девочек всех Яблоко вещи. То, что я выкопал из несколько лет назад был этот файл здесь, iUnlock.c, только вид делают более конкретные и более сложные некоторые из наиболее основных программ C мы уже писали. Так я открыл этот файл, iUnlock.c. Он доступен на странице Лекции на сегодняшний день. На левой стороне вы увидите длинный список функций. Таким образом, человек, который написал это написал много функций, больше, чем просто основной. Он использовал целую кучу библиотек здесь, и если мы начнем прокрутки, что это на самом деле самый первый, я считаю, крэк для оригинального iPhone. Когда Вы хотели сделать джейлбрейк оригинальный iPhone, а это значит непривязанный джейлбрейк от AT & T и фактически установить специальное программное обеспечение на нем и делать то, что Яблоко не хочу, чтобы люди делают, кто-то взял время, чтобы выяснить, как именно они могут использовать программные ошибки, ошибки, ошибки, в программном обеспечении Apple, и таким образом родился iUnlock.c-- что если вы собрали его на свой компьютер и установить его на iPhone , который был подключен к компьютеру с помощью, скажем, кабель USB, это даст вам административной или привилегии на вашем iPhone и позволяют сделать очень многое, что вы хотите. И вот там был этот увлекательный кошки-мышки между Яблоком и остального мира, в частности, так как они, как и многие компании, пытаются заблокировать свои вещи вниз, так что вы можете сделать только с ним, что они намерены. Но благодаря таким людям, как это и понимания низкого уровня деталей - и в этом случае C программирования - и много знакомых конструкций что мы начали играть, вы сможете по-настоящему использующие аппаратную таким образом, вы считаете нужным, и не обязательно некоторым юридическим лицом. Так, например, я понятия не имею, что все это делают, но GetVersion звучит довольно просто, и, похоже, это функция, что этот человек написал. Это займет какое-то целое число в качестве аргумента, ничего не возвращает, но, кажется, петли с цикла здесь и, если условие, если условие перерыва, и так или иначе связана с номерами версий, если прокрутить вниз, хотя многие из этих ключевых слов будет новый. И есть много функций здесь мы никогда не видели и не могли бы никогда не увидит в течение семестра. В конце концов, это следует тем же правилам и логике, что мы играли с до сих пор. Так что это слишком стар, чтобы взломать ваш iPhone или 3s 4s 5s или вскоре эти дни, но знаю, что все это очень полученные из этого мира, что мы нырнули. Давайте взглянем на несколько более простой пример: это, просто согреться с некоторыми синтаксиса, а также некоторые другие типы данных что мы говорили, но действительно не видел в C. Этот файл называется positive1.c, и в комментариях на вершине, это просто требует, чтобы пользователь обеспечить положительное число. Так что это пример сделай то время как цикл, который хорош для пользователей интерактивных программ где вы должны сказать пользователю, чтобы что-то сделать, и если они не сотрудничают вы кричать на них или отклонить их ввода. Дело в точку: я собираюсь делать строках 19 до 24 тех пор, пока пользователь не дал мне положительное число. Эта деталь здесь, на линии 18, почему я заявляю, п выше всего этого цикла построить в отличие от прямо рядом с линией 22, где я на самом деле заботятся, чтобы получить п? Да. [Студент] Scope. >> Да, так что этот вопрос из области видимости. И с точки зрения непрофессионала, что делает область относится? Да. >> [Неразборчиво ответ студента] >> Можете ли вы говорить громче? [Студент] Где можно получить доступ к этой переменной. >> Perfect. Где Вы можете получить доступ к конкретной переменной. И вообще, правило до сих пор было, что сфера некоторые переменные определяется самой последней фигурные скобки, что вы видели. И поэтому в данном случае, если я сделал ошибку, объявив п на линии 22, что линия будет работать. Я хотел бы получить целое число, и я бы поставил его в этой переменной п в строке 22, но какая строка кода теперь не знаю, что я говорю? >> [Студент] 25. [Малан] 25, и оказывается, что 24, а потому, что в этом случае он выходит за пределы фигурные скобки. Так что просто немного неприятность, но очень легко решается просто объявить переменную за пределами самой функции. Позже мы увидим, сегодня вы можете сделать еще один шаг и вы даже можете получить немного ленивый. И это не рекомендуется вообще, но вы можете даже получить ленивого и положить переменную в глобальном масштабе, так сказать, не внутри функции, а не внутри цикла, но в самом файле, за пределами всех функций вы написали, как я сделал здесь, на линии 15. Это, как правило, с неодобрением, но понимаю, что это решение иногда к другим проблемам, как мы в конечном счете видеть. Так что сейчас мы оставим это так, но давайте посмотрим, если мы можем переписать это только, чтобы начать выразить себя немного по-другому. Эта программа, просто чтобы быть ясно, является positive1. Позвольте мне идти вперед здесь и в моем окне терминала сделать positive1, Enter. Компилирует порядке. Я собираюсь запустить positive1, нажмите Enter. Я требую, чтобы вы дать мне целое положительное число. Я скажу -1. Это не работает. 0, 99. Это похоже на работу. Может быть, не самый строгий тест, но по крайней мере это хорошая проверка вменяемости что мы находимся на правильном пути. Так что теперь позвольте мне идти вперед и открыть версию 2 настоящей, и чем отличается уже? Он реализует ту же самую вещь, но то, что прыгает, как четко в этот раз? Это BOOL в зеленый цвет. Он будет выделен зеленым цветом, это ключевое слово известно как логический, который является типом данных. Она не приходит построен в для всех версий C. Вам необходимо включить конкретную библиотеку. В нашем случае, я включил CS50 библиотеку, так что у нас есть доступ к BOOL. Но в строке 18, мы, кажется, есть логическое значение здесь называют благодарны. Я мог бы назвать это что угодно, но я назвал его благодарна просто вид передают смысловое значение. Таким образом, первоначально на линии 18, я, видимо, не благодарный потому что логическое значение благодарны инициализируется ложным в строке 18. И тогда кажется, что я сделал здесь в строках с 21 по 23 это я только отчасти переписать мою логику. Так что не функционально разные, но в строке 22 теперь я могу проверить, если Int пользователь предоставил больше 0, то я просто изменить значение благодарны правда. А зачем мне это делать? Потому что в строке 25, по-видимому, я собираюсь проверить состояние. У этого цикла в то время как благодарный является ложным. Так что я предложил это в качестве альтернативы версия 1 потому что это по крайней мере немного более интуитивным, возможно, это немного более обоснованной на английском языке. Таким образом, выполните следующие действия, пока вы не благодарны или при благодарны является ложным. И на этот раз я тоже, видимо, не люблю вспоминать то, что пользователь набрал в потому что уведомления нет переменной п, так на самом деле, маленькая белая ложь там. Функционально программа немного отличается, как только мы перейдем к нижней его потому что я не помнил, что п. Но я хотел показать здесь, что, хотя мы видели GetInt и GetString используется на правую сторону знака равенства до сих пор так что мы помним значение, технически, это не строго обязательно. Если по каким-либо причинам вы просто не заботятся, чтобы сохранить значение, Вы просто хотите проверить значение, заметили, что мы можем просто написать это как GetInt, открытая скобка, рядом парень. Эта функция будет возвращать значение, как мы уже говорили. Это будет вернуть вам Int. И поэтому, если вы мысленно думаю, что это произойдет, при вводе в 99, GetInt возвращает число 99, и так концептуально, это как бы мой код был на самом деле этого. Так, если 99 действительно больше 0, то благодарный становится истинным, Затем линия 25 реализует ох, мы сделали, потому что я сейчас благодарен, и в строке 26, мы просто говорим: "Спасибо за натуральное!" Как бы там ни случилось быть. Теперь давайте сделаем небольшой синтаксический сахар здесь, так сказать. Давайте посмотрим, если мы можем убирать эту линию 25 с этим третий и последний вариант, в positive3. Обратите внимание, с той лишь разницей, что теперь это строка кода? >> [Студент] 25. >> [Малан] Да, 25. И мы действительно не видел этот трюк, но его мы видели восклицательный знак в понедельник, , который обозначает, что? >> [Студент] Не. >> Не или отрицание. Так что берите логическое значение и перевернуть его значение. Правда, становится ложным, ложное становится истинным. Так что это, я хотел бы предложить, даже немного более интуитивным способом написания кода потому что я до сих пор благодарен инициализации ложным, я все еще делаю следующее, Я поставил благодарны верно, когда придет время, но теперь вы действительно можете просто перевести этот код устно слева направо, а (благодарны!), потому что взрыва или восклицательный знак обозначает понятие не так что пока не благодарны. Итак, еще раз, мы не введены новые понятия как такового. Мы говорили о логических назад, когда мы играли с нуля, но понимаю, теперь мы можем просто начать писать наш код по-разному. Таким образом, особенно в pset1 если вы вроде пытается выяснить способ, чтобы написать несколько программ, Шансы Вам повезло, потому что там может быть любое число решений что вы можете случайно встретить. Например, это находится всего в 3 даже для простейших программ. Хорошо. А теперь вспомним в понедельник мы вышли на эту записку с возвращением значения. Таким образом, в первый раз, когда мы написали программу, которая не просто основной; она также имеет свою собственную функцию, которую я написал здесь. Таким образом, в строке 31 по 34 я реализовал функцию куб. Это не комплекс. Это просто * а * а в этом случае. Но, что важно о нем, что я беру вход в виде и я возвращаюсь выход в виде * а *. Так что теперь у меня есть возможность, так же, как я раньше с prinf один, для вызова этой функции, вызвав функцию куб. И куб функция принимает некоторые вход, и куб функция возвращает некоторый выход. В отличие от Printf просто что-то сделал. Она не возвращает ничего, что мы заботились о, хотя, как в сторону оно возвращает значение; Вы просто вообще игнорируют его. Printf просто что-то сделал. Это был побочный эффект печати на экране. В отличие от здесь, у нас есть куб функции, которые на самом деле возвращает что-то. Так что для тех, кто знаком с этим, это довольно простая идея. Но для тех, кто менее знаком с этой идеей проходящих в входы и выходы возвращаются, Давайте попробуем просто что-то супер просто. Кто-нибудь удобные подойдя на этапе кратко? Вы должны быть знакомы с камерой на вас. Да? Хорошо. Как тебя зовут? >> [Студент] Кен. >> Кен. Хорошо. Кен, давай вверх. Кен будет функция вида здесь. Давайте пойдем дальше и сделать это. Давайте немного фантазии. Очень приятно. Добро пожаловать в центре сцены. Хорошо. Давайте хит этой кнопки здесь. Хорошо. Так что здесь у вас есть современный доске, и что я является основной функцией, например, и у меня нет IPad в руках. Я действительно не помню, как - Ну, я не могу сказать. Я действительно не имеют хороший почерк, и т.д. Поэтому я хочу, чтобы что-то напечатать на экране для меня. Я являющийся основной программе, и я буду у вас говорят, что это записав ее в моей куриной нуля, а затем мимо вас вход. Так глупо, хотя это упражнение, понятие функции и вызова функции и возвращение функцией действительно сводится к этому. Я главный, я только что написал Printf, цитата-конец цитаты что-то на экране, Я иду в эту программу, и как только Printf вызывается, он принимает один аргумент или один параметр иногда в двойные кавычки. Вот это аргумент. Я передаю его Кен. Он представляет собой черный ящик, написал некоторое количество лет назад которые, очевидно, знает только как печатать вещи на экране. Таким образом выполнить. Это не плохо. Очень хорошо. Так что теперь Кен делается выполнение. Ему нужно, чтобы передать мне ничего взамен? Не то, что мы видели до сих пор. Опять же, Printf ли на самом деле возвращает число, но мы собираемся игнорировать, что на данный момент потому что мы никогда не использовали его. Так вот оно что для Кена. И вот теперь основные берет на себя контроль над программой еще раз потому что строки кода, Printf, осуществляется выполнение. И мы движемся к нашей образом, выполнение любых других линий есть. Итак, теперь давайте попробуем немного другой пример. На этот раз здесь, давайте сначала очистить экран, и на этот раз мы будем делать измерения кубатуры функции, но на этот раз, я думаю, выходное значение. Так что давайте идти вперед и делать это. Теперь у меня есть строка кода, которая говорит х получает куб х. Строка кода, напомним, выглядит следующим образом: х = куба (х); Так как это будет работать? Давайте пойдем дальше и дать вам белый экран. Я собираюсь записать теперь значение х, которые в данный момент времени, случается, скажем, 2, чтобы держать его проста. Я написал на листке бумаги значение 2, который является моим значения х. Я передаю его Кен. >> А я просто пишу ответ? >> Да, давайте просто написать ответ. Хорошо. И теперь он должен вернуть мне что-нибудь. Perfect. Приятно переход. Так что теперь он протягивает мне обратно значение 8 в данном случае, и что мне с ним делать? На самом деле - посмотрим, получить это право. Что я буду с ней делать? Теперь я собираюсь принять это значение и на самом деле хранить его в те же биты в памяти. Но заметьте, я немного борются здесь. Я немного смущен, потому что где же я на самом деле записать значение х, потому что я только что сделал физически руку Кен листок бумаги, который был значение 2, который был х, и, действительно, это именно то, что произошло. Вот и получается, что при вызове функции, и вы передаете в качестве аргумента например, привет, мир, или вы передаете в качестве аргумента как 2, Как правило, вы передаете копию этого аргумента. И так же, как я записал номер 2 здесь и передал его Кен, , что должно означать, что у меня еще есть копия значения 2 где-то потому что действительно, теперь, когда я получил обратно значение 8, мне нужно вернуться в оперативной памяти и фактически записать 8, где я когда-то был номер 2. Таким образом, визуально, помните об этом понятии проходящей в буквальном смысле, копию значения. Кен делает свое дело, протягивает мне в ответ что-то - в этом случае значение, например, 8 - а то у меня что-то сделать с этим значением, если я хочу сохранить его окрестностях. Так что все это вернется, чтобы быть слишком хорошо знакомы в скором времени. Спасибо вам большое за это демо здесь, Кен. [Аплодисменты] Очень хорошо сделано. Давайте посмотрим, как это в конечном итоге связано с некоторыми из вызова функции, что мы делаем здесь. Позвольте мне идти вперед и вернуть нас к измерения кубатуры пример. Обратите внимание, что если мы действительно хотим начать принимать это дальше, мы собираемся должны помнить о том, что число х, что это передается здесь отличается от того, что на самом деле передается в функцию. Итак, еще раз, это проходит мимо копии станет весьма уместны в одну минуту. Давайте взглянем на то, что не совсем правильно работать еще. Я собираюсь идти вперед и открыть третий пример ошибки, которая является ущербной по своей природе, и это называется buggy3 и реализует замены. Здесь у нас есть основные функции, которые х и у произвольно устанавливается в 1 и 2, соответственно. Мы могли бы использовать GetInt, но нам просто нужно простое упражнение, таким образом, это жестко, как 1 и 2. В строках 21 и 22, мы, видимо, распечатайте х и у, 1 на линию. Затем в строке 23, я утверждаю, я обмен этими значениями, точка, точка, точка. Я видимо вызова функции в строке 24 называемым своп, который принимает 2 аргументов. Это полностью законно для функций взять 2 аргументы. Мы видели Printf это сделать уже. Таким образом, своп-видимому, имеет х и у, и, как предполагает его название, Я надеюсь, что он собирается поменять эти 2 значения. Так вот я утверждаю, в строке 25 "перестановки"! и я перепечатать х и у при условии, что они действительно были поменяны местами. Но если я действительно запустить эту программу - позвольте мне открыть окно терминала, позвольте мне сделать buggy3 - как следует из названия, это не закончится хорошо потому что, когда я ударил Enter, заметили, что х = 1, у = 2, и все же в конце программы, они все еще, по сути, то же самое. Таким образом, на основе демонстрации только сейчас с Кеном, то, что происходит на самом деле? Давайте погрузимся в эту своп функции. Это супер короткие. Это всего лишь несколько строк кода долго. Но то, что основная проблема основана на простой истории, рассказанной здесь с Кеном? Почему подкачки не работает? [Студент] вы храните на копию, а не переменная. Именно так. Мы хранении на копию, а не саму переменную. Иными словами, своп-видимому, имеет 2 аргумента, INT, и это условно называть а и б, и здесь я прошел по х и у, которые являются соответственно 1 и 2, но я не в буквальном смысле проходящей в х, я не в буквальном смысле проходящей в у, Я передаю копии х и копию у. Это почти как если бы вы скопировали и вставили в своп значения, которые вы хотите, чтобы он на самом деле манипулировать. Так что, если это так, когда я начала программы выполнения строки 35, то 36, когда я добираюсь до линии 37, на данный момент в этой истории, что значение? В этот момент в истории, строка 37, что является значение в этой точке? >> [Студент] 1. [Малан] Она просто должна быть 1, правы, потому что х был принят в качестве первого аргумента, и эта функция просто произвольно называет свой первый аргумент. Точно так же есть у второго аргумента, и это просто произвольно вызова второго б аргумент. Эта дихотомия на самом деле довольно просто объяснить. Подумайте об этом. Никто из нас не встречал человека, который написал Printf, поэтому, конечно, он или она не знает, что наши переменные через 30 лет будут называть. Так что должно быть различие между, что вы называете переменные в функциях вы пишете и что вы называете переменные в функциях вы звоните или использование. Итак, другими словами, я написал мои переменные х и у, Но если кто-то другой написал своп функции, он или она, конечно, не знал бы, что мои переменных будет называться, так понимаю, что это, почему у вас есть эта двойственность имен. Технически, я мог бы сделать это, совпадение, но они будут по-прежнему передается в качестве копии. Было бы просто чистое совпадение эстетически, если это человек, который написал своп были использованы те же имена. Таким образом, на данный момент в этой истории, строка 37, 1, B 2, а теперь я перехожу к поменять их местами. Прежде всего, позвольте мне на самом деле сделать это гораздо проще. Я не знаю, что те 3 строки кода делали. Позвольте мне сделать это: B = A, A = B; сделано. Почему это сломанный, логически? Это своего рода интуитивные вещи, не так ли? Так а становится Ъ и Ъ становится, но проблема в том, что как только линия 37 выполняет, что значение А и В? То же самое, 1, потому что вы сходу, так сказать, вы изменили б равным. Поэтому, как только линия 37 была выполнена, это здорово, теперь у вас есть 2 экземпляра № 1 Внутри этой функции, так что потом, когда вы говорите в строке 38 = B, Вы видов резьбовых потому что вы просто присвоении 1 к 1. Ты вроде потерял значение, которое вы заботились о. Таким образом, в оригинальную версию этой, обратите внимание, что я сделал. Вместо этого я была третья строка кода, которая выглядела следующим образом. Я заявляю, временных переменных. Tmp это очень распространенное имя для временной переменной, и это Int потому что он должен соответствовать тому, что я хочу сделать копию. Я храню копии внутри TMP, поэтому, как только линия 37 была выполнена, Значение это - быстрая проверка вменяемости - 1, значение Ь 2, и значение TMP также 1. Так что теперь я исполню линии 38. Как только линия 38 выполняется, принимает значение б. И В 2, так что теперь 2. Таким образом, на данный момент в этой истории, равно 2, B 2, а TMP 1, так что теперь логически, мы можем значения просто хлопнуть TMP в в б и мы сделали. Итак, мы решили эту проблему. К сожалению, когда я запускаю эту программу в таком виде, это на самом деле не поменять любые значения. Но чтобы быть понятным, почему? Я установил логические задачи из всего минуту назад, но опять же, если я запускаю эту программу, х и у, остаются неизменными К концу выполнения программы. [Неразборчиво комментарий студент] >> Мы не вернулись ничего, так что это правда. Но, оказывается, есть небольшая проблема здесь, потому что до сих пор, Единственное, что мы смогли вернуть это одно, и это ограничение C. Вы можете вернуть только действительно одно значение, и в этом случае я немного застрял здесь потому что я мог вернуть новое значение х, или я мог бы вернуть новое значение у, но я хочу и обратно. Таким образом, возвращения не простое решение здесь. Но проблема в корне почему? Что мы на самом деле поменялись местами? [Студент] а и б. >> А и б. Но и б являются копиями х и у, которая означает, что мы только что сделали все эти работы, Мы только что провели 3 минуты говорим о функции подкачки и все 3 из этих переменных, и это здорово, совершенно правильно в изоляции, но и сферу б лишь в этих строках. Так как цикл, если вы объявите целое я внутри цикла, Аналогично, если вы объявлением и б внутри функции, которые вы написали, они действительны только внутри этой функции, а значит, как только своп сделать выполнение и мы переходим от линии 24 в линию 25, х и у не изменилось. Вы просто впустую много времени, обмен копиями переменных. Вот и получается, что решение это на самом деле, не очевидно. Это не вполне достаточно, чтобы возвращать значения, потому что мы можем только вернуть значение 1, и я действительно хочу поменять х и у в то же время, так что мы собираемся иметь, чтобы вернуться к этому. Но сейчас понимаю, что вопрос принципиально вытекает из того факта, что А и В являются копиями и они находятся в своей собственной области. Давайте попробуем решить это в некотором роде. Позвольте мне на самом деле прокрутить назад здесь и открыть, скажем, четвертый вариант этого, buggy4. Что по этому поводу? Это похожие, но более простую задачу, чтобы смотреть на, прежде чем принять удар на ее решение. Эта программа называется приращением, и он, очевидно, инициализирует целое число х 1 в строке 18. Я тогда утверждать, х = 1, тогда я претендовать "инкремента ..." Затем я вызываю прирост, но затем в линиях 22 и 23, я утверждаю, что это было увеличивается, Я утверждаю х сейчас бы это ни было - 2, по-видимому, - но эта программа глючит. В чем проблема? Да. >> [Неразборчиво ответ студента] >> Именно так. Таким х было объявлено, очевидно, в строке 18. То есть в фигурных скобках основного автора. Так что однозначного ответа здесь является то, что в то время как х существует здесь, она не существует в строке 32, так что эта программа на самом деле даже не будет компилироваться. Компилятора, когда я пытаюсь компиляции данного кода будет кричать на меня О некоторых необъявленный идентификатор или что-то в этом роде. В самом деле, давайте попробуем. Это делает buggy4. Там она есть. Использование 'X' необъявленный идентификатор в строке 32. А на самом деле, давайте будем более четко здесь сегодня, так что это полезно в рабочее время и дома. Обратите внимание, что это немного загадочно написано. Но то, что Clang имеет кричал на нас, сказав buggy4.c: 32:5, на самом деле полезно. Это означает, что ошибка в строке 32 на позицию символа 5. Таким образом, 1, 2, 3, 4, 5. Это, в самом деле, где проблема. А также, тоже имейте в виду, в рабочее время и на дому, мне повезло здесь. У меня есть одна ошибка. Это собирается быть относительно легко исправить. Но если вы получите весь экран полный подавляющее сообщения об ошибках, еще раз осознать, что нижний можно просто быть симптомом самых верхних один. Так всегда гоняться за ваши ошибки сверху вниз потому что там может быть просто эффект цепочке , который предлагаю вам иметь намного больше проблем, чем вы на самом деле. Итак, как мы можем это исправить, если моей целью является, чтобы увеличить х? >> [Студент] Сделать х глобальной. Итак, мы можем сделать глобальное х. Давайте ярлык, который я предупреждал о более ранних, но черт возьми, нам просто нужно быстро исправить, так что давайте просто скажем, Int х здесь. Это делает х глобальной. Так что теперь основным имеет к ним доступ и приращение имеет к ним доступ, и поэтому позвольте мне идти дальше и собрать это сейчас. Сделать buggy4, Enter. Кажется, для компиляции сейчас. Давайте запустим buggy4. И, кажется, на самом деле работает. Это одна из этих вещей, которые делать, как я говорю, а не как я делаю, как я только что сделал здесь, потому что в целом, наши программы собираются получить гораздо интереснее и намного дольше, чем это, и если ваше решение жизненных проблем просто положить все переменные в начало файла, Очень быстро у программы получают ужасно трудно управлять. Это становится все труднее придумывать новые имена переменных, становится все труднее понять, что переменная делать то, что, и т.д. В общем, это не очень хорошее решение. Так давайте сделаем это лучше. Мы не хотим использовать глобальную переменную здесь. Я хочу, чтобы увеличить х, так что я мог бы, очевидно - В конце концов, это вроде глупой истории, потому что мы просто делаем это - но если бы я не знал о том, что оператор или я не смог изменить его в основной себе, Как еще я мог осуществлять Кен сюда на этот раз не в кубе, но для увеличения? Как изменить эту вещь здесь? Да. [Студент] Pass х, а затем вернуться [неразборчиво] >> Ладно, хорошо. Так почему бы мне не пройти в х, а затем, а не возвращать его, почему я не просто вернуть х + 1. Еще пара вещей нужно менять здесь. Я нахожусь на правильном пути. Что еще нужно настроить? Кто-то другой. Да. [Неразборчиво ответ студента] Мне нужно, чтобы изменить тип возврата прироста потому что это не аннулировать. Пустота ничего не средство возвращается, но ясно, теперь это, так что это нужно изменить, чтобы - >> [студент] Int. INT в соответствие с тем, что я на самом деле возвращения. Сейчас что-то еще по-прежнему багги здесь. Да. [Неразборчиво ответ студента] >> [Малан] Так что мне нужно увеличивать х? [Неразборчиво ответ студента] >> [Малан] Ах, так мне нужно передать х. Так что мне нужно сделать это здесь. >> [Неразборчиво комментарий студент] [Малан] Таким образом, прототип, я должен изменить это здесь. Таким образом, это должно стать INT, это должно стать - хм, я на самом деле есть ошибка здесь. Давайте исправим это в первую очередь. Что это на самом деле быть? Это должно быть что-то Int. Это может быть х, но, честно говоря, если начать называть всех ваших переменных х, это будет все менее и менее ясно, что есть что. Так что давайте просто произвольно выбрать различные именования для моего вспомогательные функции, Функции я пишу. Мы будем называть его, или мы могли бы назвать это - Давайте назовем это число будет еще более явным. И тогда я должен вернуть все, что номер плюс 1, и теперь я должен изменить 1 вещь, здесь и еще одна вещь здесь. Что я должен изменить в строке 21 в первую очередь? >> [Неразборчиво ответ студента] [Малан] Я должен назначить его на х. Я не могу просто позвонить приращение (х). Мне нужно помнить ответ на изменение значения х на левой стороне. И хотя х сейчас находится на левой и правой, это совершенно нормально потому что правая часть запускается на выполнение первого затем получает шлепнулся в левой вещь - х в этом случае. И тогда, наконец, это легко исправить сейчас. Это должно просто соответствовать тому, что вот внизу, внутр номер. Таким образом, целый букет изменений действительно глупо функции но представитель вещей, которые мы больше хотим сделать. Так что buggy4. Я где-то напортачили. О, мой Бог. Пять ошибок в 6-строчным программы. Так что же случилось на линии 18, символ 5? Так что я должен заявить об этом, внутр. Давайте посмотрим. Есть целая куча других ошибок. О, Боже мой - 19, 18, 21 - но, опять же, давайте просто очистить экран, управление L здесь, и перезапустить Clang. Таким образом, 5 задач на самом деле просто, что 1. Итак, теперь давайте запустим buggy4, Enter. Вот так, х был увеличен правильно. Хорошо. Любые вопросы о том, как увеличить число? Да. [Неразборчиво вопрос студента] >> Хороший вопрос. Как это, что я могу просто изменить х на номер, и программа будет знать сразу же? Опять же, думаю о нем, как это абстракция. Так что, если я главный и Кен прирост, честно говоря, я не волнует, что Кен называет свой iPad. Меня не волнует, что он называет все, что имеет отношение к его реализации этой функциональности. Это детали реализации, которые я, главное, не нужно заботиться о. И так просто изменив его последовательно внутри функции - здесь номер и номер здесь - Все это занимает так много времени, как я перекомпилировать. Это вроде как если вы думаете о многих из нас, тех, у кого водительские права которые въехали или если вы даже въехал в автомобиль, Большинство из нас не знают, как машина работает под капотом. И буквально, если вы открываете капот, большинство из нас - я в том числе - не собирается знаю, что мы смотрим на, вроде как вы можете чувствовать себя в такие вещи, как это прямо сейчас. Но мы действительно не должны заботиться, как машина работает, мы не должны заботиться, что все стержни и поршней и кабелей внутри автомобиля на самом деле делает. Так что-то вроде, что вы называете поршень здесь не имеет значения в данном случае. Та же самая идея. Да. >> [Неразборчиво вопрос студента] Если есть несколько видов переменная момент ха назад, Вы, программист, придется менять их повсюду. Или вы могли бы сделать буквально файлов, меню, а затем Найти, Заменить - что-то в этом роде - но вы будете иметь, чтобы сделать эти изменения самостоятельно. Вы должны быть последовательны. >> [Студент] При наличии нескольких переменных [неразборчиво] Определенном порядке, как здесь, если бы это было Int другой номер? >> [Студент] Правильно. [Малан] Да. Заказать имеет значение, когда вы вызываете функцию. Так что если я звонили прирост здесь что-то в этом запятой, есть прямое отображение. Первая переменная, как там это называется, сделал копию первого аргумента здесь. Извините. Это не должно быть круглых скобках. Второй аргумент линии с вторым. Так порядке, да, вопросов. Хорошо. Извините. Я взял длинный путь, чтобы добраться там. Другие вопросы? Хорошо. Итак, давайте посмотрим, если мы не можем нарисовать картину того, что происходит на самом деле здесь под капотом, так сказать. Это прямоугольник, который может представлять памяти компьютера. Даже если вы не представляете, как память работает или как RAM работ, по крайней мере, предположить, что у вас есть пучки она в эти дни. У вас есть мегабайт это, у вас есть гигабайты это, и мы знаем, от недели 0 байт, что именно то, что? >> [Студент] 8 бит. 8 бит, не так ли? Таким образом, 8 нулей и 1. Итак, если ваш компьютер имеет гигабайт оперативной памяти, 2 гигабайтами оперативной памяти в эти дни, у вас есть миллиард или 2 млрд. байт памяти, или примерно 8 миллиардов или 16 миллиардов бит внутри компьютера. В отличие от небольшой пример Wooly Вилли, это не магнитные частицы обычно больше. Все чаще - в ноутбуках, по крайней мере, - это твердотельные накопители SSD, что просто не имеют движущихся частей. Это все электронные. Это все электричество основе. Так что думайте этого прямоугольника, как только представляет 1 или 2 гигабайтами памяти, что у вас есть. Так что это кусок памяти. Мир информатики рода отгорожена участки памяти, чтобы сделать разные вещи. Например, если это оперативной памяти компьютера, как это было предложено прямоугольник там, Оказывается, что по соглашению, в верхней части вашей памяти, так сказать, , как правило, то, что называется текстовый сегмент. Таковы 0 и 1, что вы собрали. Поэтому, когда мы смотрели под капотом на то, что a.out есть, Все эти 0 и 1, когда вы запускаете программу, тех, 0 и 1 загружается с жесткого диска в то, что называется RAM, и в оперативной памяти, они помещаются в верхней части. В то же время, у вас есть другие вещи: инициализация данных, инициализацию данных. Эти 2 валка памяти обратитесь к глобальные переменные, которые вы не часто используете но иногда, если вы это сделаете, они в конечном итоге там также. Тогда есть некоторые другие вещи: переменные окружения, которые мы не будем тратить много времени на, но затем 2 важные вещи, которые будут возвращаться в течение семестра, стека и кучи. Поэтому большинство из памяти компьютера сохраняется при запуске программы за то, что называется стеком и то, что называется кучей. Мы не собираемся говорить о куче сегодня, но мы будем говорить о стеке. Стек означало вызвать в воображении визуальные от столовой лотки зал еды в доме Mather или там, где вы будете где персонал столовой чистить их каждый день, они складывают их от пола на вверх, и, аналогично, в памяти, есть такая идея поставить что-то на стеке, положить что-то на стеке, положить что-то в стеке. И что же мы подразумеваем под этим? Давайте увеличить только на нижнюю половину этой картине, оперативной памяти компьютера, предложить следующее. Оказывается, что когда вы запускаете программу, как a.out или привет - независимо от программы является то, что вы написали - Опять же, те 0 и 1 загружается с жесткого диска, который длительное хранение, остается там, даже когда вы вилку, загружается в оперативную память. RAM быстрее, чем жесткие диски - это меньше, чем жесткие диски - но это там, где программы жить, пока вы работаете них. Таким образом, вы дважды щелкните программу на Mac или PC, она загружается с жесткого диска в оперативную память. Как только он будет загружен в оперативную память, 0 и 1 пойти на путь сверху, так называемых текстовых сегментов, но потом, как только ваша программа фактически начинает работать, Основная функция называется, а главное, как мы видели, часто имеет локальные переменные, и она имеет целых и строк и символов и тому подобное. Так что если ваши программы, которые вы написали или программы, которые вы двойном щелчке использовать некоторые переменные внутри основного, они в конечном итоге в нижней части вашего стека памяти, так сказать. Более конкретно, что же это на самом деле означает? Это просто означает, что если мы собираемся число байт оперативной памяти на вашем компьютере, заметить, что это может быть номер байта 0, это может быть номер байта 1, 2, 3, 4, 5, 6, все, вплоть до 2 млрд. будет всю дорогу там на самом верху. Итак, другими словами, когда мы говорим об оперативной памяти или памяти в байтах, это просто означает, что кто-то решил, что нумеровать каждый из этих участков памяти. Поэтому, когда вам нужно 32 бита для Int или вам нужно 8 бит на символ, где они в конечном итоге в памяти? Концептуально, они просто в конечном итоге в нижней части этой вещи, называемой стеком. Но что интересно теперь, когда основные вызывает функцию - предположим, что функция называется Фу, просто произвольное название - что происходит, является основным находится в нижней части этого стека памяти; Foo теперь помещается в верхней части главного в памяти. Таким образом, любые локальные переменные, Foo была в конечном итоге рода концептуально выше, чем в основной. Если Foo вызывает другую функцию под названием бара, эти переменные в конечном итоге здесь. Если баре называет что-то еще, здесь, здесь, здесь. Так что же интересного о запуске программы является то, что, как вы вызываете функции и как эти функции вызывать функции и как эти функции называют функциями, Вы создаете этот стек функций в памяти. И только один раз функция возвращает вы начнете получать эту память обратно. Таким образом, одним из самых простых способов запустить из памяти в компьютерной программе , чтобы написать функции, которые никогда не вернутся. Так, например, давайте продемонстрировать, как много с намеренно багги программы. Позвольте мне идти вперед и делать # включить , Int основных (недействительными), и я собираюсь делать, а (2> 1), который, вероятно, никогда не будет изменяться на нас, и позвольте мне теперь идти вперед и делать Printf. На самом деле, это будет менее визуально интересным. Давайте сделаем это. Для Int = 0;> 0 - давайте делать эту ошибку - я + +. И давайте не Printf здесь. Давайте практиковать то, что я проповедовал. Давайте здесь метод, недействительными хор, и мы будем говорить Int я, и тогда я буду говорить Printf - нет, давайте сделаем это более интересно. Давайте на самом деле не печатает вообще ничего. Давайте просто это сделать: хор (I). Хорошо. Так что это багги, потому что зачем? Я придумываю, как я иду, потому что программа на самом деле не делают ничего интересного. Но это не цель. Цель состоит в том, чтобы написать программу, основной функцией которого делает то, что, по-видимому? Позвоните себя. А на самом деле, мы не нуждаемся в петлю. Давайте даже упростить этот раз, чтобы не упускать из виду действительно фундаментальная ошибка. Главные вызовы хором петь хором, Затем я сделал что-то глупое и я должен был хор хор вызова потому что я предполагал, кто-то еще собирается осуществить это, может быть, и теперь это не будет собрать еще. Мне нужно сделать что? Мне нужно прототип, помню. Поэтому мне нужно, чтобы здесь пустота хора (INT я); Так что теперь, если я иду сюда - на самом деле, давайте использовать большие окна. Давайте пойдем дальше и сделать хором. Давайте пойдем дальше и сделать хором. Использование необъявленный идентификатор я. О, это было глупо. Нам не нужны аргументы. Давайте просто это сделать. Жаль, что мы начали этот путь. Было бы гораздо проще написать программу. Там же. Теперь давайте перейдем к моим окно терминала, повторно Clang, и здесь мы идем. Это было действительно быстро. Что на самом деле только что произошло, правда? Ну, теперь я добавлю печати линии, поэтому мы можем видеть. Позвольте мне сказать, Е ("я здесь") - не переменные. Мы оставим это так. Позвольте мне сделать повторно. Позвольте мне повторно хор. И ... давай. Продолжайте. Как в стороне, почему она не потерпела крах? Ошибки сегментации произошло супер быстрый раньше. [Неразборчиво ответ студента] >> Именно так. Так что это занимает время, чтобы напечатать, не так ли? Это займет больше работы со стороны компьютера. И вот это: ошибки сегментации. Так заметите, как быстро запускать программы. Если вы не печатает ничего, супер быстро. Но мы все же получили эту ошибку сегментации, потому что то, что происходит? Если вы думаете о том, как память компьютера выкладывается, В этом случае, чтобы быть основным, но вот давайте просто называть этот хор, и давайте называть это хор. И теперь, если я делаю свою эстетику права, это просто будет сказать, хор, хор, хор, хор, хор, хор, хор, до тошноты, и в конце концов, то, что произойдет? Если большая картина, в буквальном смысле, это то, что просто происходит концептуально? Стек перерасход кучи. Или, что еще хуже, вы просто захвачены все, включая текст сегмента, которая является 0 и 1, которые представляют вашу программу. Короче говоря, это просто супер, супер плохого. Ваша программа вышла из-под контроля. Вы используете способ больше памяти, чем предполагалось все из-за глупой ошибки в данном случае, или в данном случае совершенно сознательно сделали функцию, называющая себя. Так вот, это не так уж плохо. Функции, называющих себя действительно имеет большую силу, когда вы используете его правильно. Я не использовал его правильно здесь. Так что не все так плохо, но то, что я никогда не перестанут называть себя является фундаментальной слабостью здесь этой программы. Так куда мы идем со всем этим? Что на самом деле происходит? Когда я называю приращение функции, как мы делали в тех примерах, У меня есть значение, как 1, что я прохожу дюйма Я прохожу в копии номер 1, так происходит следующее. Пойдем в приращения, например, этот парень прямо здесь. Вот что на самом деле происходит. Когда я называю прирост и я прохожу по х, графически, что происходит вот это. Если у меня есть стоимость 1 хранится здесь, и я на самом деле зовут прирост, которая теперь называется хор - Ipad бросает меня здесь. Давайте назовем это приращение, и мы не знаем, что это следующая функция будет. Так что же на самом деле происходит где-то здесь в основном у меня есть кусок памяти , который хранится номер 1. Когда я называю прирост, я использую другую часть памяти, но теперь у меня есть копия 1. Когда я увеличить это значение, это становится 2, но что происходит потом, как только прирост прибыли? Эта память просто получает вернул к операционной системе, которое означает, что все, что вы сделали ничего полезного. 1, который был первоначально содержались в основном по-прежнему на самом деле. Так куда мы идем с этим? Оказывается, что в памяти у вас есть эта спина к спине последовательность байтов что вы можете положить вещи в, и оказывается, что мы уже видели нечто который включает в себя наведение спиной к спине, чтобы спина к спине. Что представляет собой строку, основываясь на неделе 1, и теперь неделя 2? Это просто набор символов. Вот и получается, как вы можете поставить номера в памяти, Точно так же вы можете положить символов в памяти. И как только мы начинаем положить символов в памяти спиной к спине, чтобы спина к спине, Оказывается, что с помощью простейших вещей, как для цикла или время цикла, мы можем повторять слева направо по символов в строке и начать массируя их в разные персонажи в целом - может стать B, B мог бы стать C - так что в конечном счете, мы можем принять английское предложение, что на самом деле имеет смысл и конвертировать каждую из этих писем по одному пешком через нашу память компьютера слева направо на самом деле шифрования. Итак, давайте сделаем наш пятиминутный перерыв здесь, и когда мы вернемся, мы начнем этот процесс скремблирования информации. Хорошо. Прежде чем мы углубимся в некоторые шифрования и эти вещи называются массивами, Позвольте мне паузу на любые вопросы, потому что я чувствую, что я действительно добрый опьянелых некоторые из этих вопросов. Так что давайте зафиксируем теперь, если мы можем. Мы только что говорили о возвращении ценностей, о которых мы говорили аргументы, и мы говорили об этом понятии, которое мы вернемся в ближайшие недели, просмотра памяти целую кучу этих сложенных лотках, так сказать, снизу на вверх, так, что каждый лоток, который получает положить в стек представляет собой функцию, которая в настоящее время называется. Есть вопросы? Позвольте мне задать вопрос здесь. Позвольте мне упростить это к тому, что было до некоторых из наших ранних Q & A. Тот факт, что прирост имеет открытую скобку, внутр номер, закрытый скобках - Что же Int числа представляют? [Студент] аргумент. >> Аргумент. Хорошо. Но то, что аргумент? [Неразборчиво ответ студента] >> Что это такое? >> [Студент] То, что вы передаете дюйма Итак, то, что вы передаете дюйма И вообще, это просто вход. Если бы вы писали функции и цели, которые функционируют в жизни должен сделать что-то немного другое каждый раз, когда вы используете его, , то единственный способ, чтобы это произошло на самом деле, казалось бы предоставить ему вход так что он может сделать что-то другое с помощью этого вклада каждый раз. Таким образом, вы должны определить две вещи, когда функция принимает вход. Вы должны указать имя, которое вы хотите дать, что входной исключительно для вашего удобства, чтобы вы могли обратиться к нему В функции, которые вы сами пишете, как я сделал здесь, в строке 32. Но вы также должны указать его тип, потому что C является языком программирования что именно требуется, если вы хотите переменной, вы должны сообщить компьютеру, какой тип данных она есть, В большей части так, чтобы он не знает, сколько битов выделить для этой переменной потому что это может быть 6 - извините, это не будет 6. Это может быть 16, может быть 8, это может быть 32, даже 64, но компьютер должен знать. Теперь, внутр на левой стороне представляет то, что, в отличие от? [Неразборчиво ответ студента] >> Что это такое? >> [Студент] Тип функции. Тип функции и, более конкретно, типа своей продукции. Право. Таким образом, в то время как вещь в скобках представляет свой вход, если таковые имеются, вещь, чтобы левая представляет свою продукцию. И в этом случае, по-видимому прирост возвращает целое, и так Int является типом возвращаемого этой функцией. Что это значит вернуть? Буквально, вы используете ключевое слово возвращение и то, если то, что вы возвращаете справа от ключевого слова является целым числом, то, что действительно соответствует тому, что мы обещали. Вы не могли бы сделать что-то вроде этого - Здравствуй, мир - потому что это строка. Очевидно, это не является целым числом. Короче говоря, бремя на самом деле на нас, программистов, для определенности о том, что мы возвращаемся, и тогда на самом деле идти о возвращении его. Контекст здесь, сейчас, в том, что память компьютера составляет один гигабайт, 2 гигабайта - что угодно, - может быть, это больше, может быть, это меньше, но компьютер рассматривает ее как имеющие различные разделы. Что-то идет туда, что-то еще происходит там, наверху, различные вещи идет в середине, и сегодня мы только начинаем рассказывать историю, но мы вернемся к этому с течением времени. В настоящее время, только кусок памяти мы действительно заботимся о том, текстовый сегмент потому что только что представляет 0 и 1, что Clang был сигнал. Итак, когда вы запустите команду на клавиатуре, как a.out или вы дважды щелкните значок на Mac OS или Windows, Ваша программа загружается с жесткого диска в оперативную память и он шлепнулся в верхней части оперативной памяти компьютера, так сказать. Между тем, как ваша программа начинает работать и основные вызывается В программе вы писали или программы Microsoft или Apple, пишет, любого из ее локальные переменные в конечном итоге там на дне памяти компьютера. Но если основные вызовы другую функцию, которая сама по себе имеет переменные или аргументы, они в конечном итоге над ним. И если эта функция вызывает то, что они в конечном итоге над ним, над ним, над ним. И только один раз в функции осуществляется выполнением ли стек лотков, так сказать, начинают получать все ниже и ниже. И это то, что тогда, в двух словах, объясняет, почему, когда вы звоните кубе или вы звоните прирост, вы передаете копию значения. А что это означает, что наглядно это то, что вы буквально написания номер 1 В другой части памяти, изменения, что с 1 по 2 в случае приращения или 8 в случае куба, а затем бросали, что память далеко как только увеличения или возврата куб функции. Вопрос. [Студент] Где глобальные переменные хранятся? Глобальные переменные хранятся в то, что в настоящее время называется инициализируются данные или неинициализированных данных, разница в том, если у вас есть глобальная переменная и вы назначаете его сразу же значение с знак равенства, она заканчивается на вершине, и если вы просто говорите Int х, без значения, это заканчивается немного ниже, в оперативной памяти Просто по соглашению. Другие вопросы? Хорошо. Таким образом, эта картина будет возвращаться, как мы получим более мощный с тем, что мы можем сделать с компьютером, но сейчас, давайте краткое введение в криптографию, определенный тип шифрования, не решает всех проблем в мире но решить некоторые из них. В этом случае здесь, у нас есть то, что называется секретным ключом. Секретным ключом, как следует из названия, происходит ее безопасности от тайной. Например, если вы были еще в начальной школе, и вы проходили немного любовное письмо тайного к мальчику или девочке вы давили на, если вы хотели передать эту записку по аудитории, Вы, вероятно, не будет писать такую ​​записку на английском языке или что ваш родной язык. Вместо этого, вы можете зашифровать или вы можете просто отправить им текстовое сообщение в эти дни. Но вы могли бы на самом деле передают их к сведению всем классе. И сделать это надежно таким образом, что ваши друзья и учителя Не знаю, что вы пишете, вы можете придумать достаточно простой алгоритм, Молодой хотя вы могли бы быть, просто карабкаться слова. Таким образом, вместо того, чтобы писать вы можете написать б, вместо б вы могли бы написать с, вместо того, чтобы с вами могли бы написать D, и так далее. Или вы могли бы придумать более сложный перевод писем в разные буквы. Но загвоздка в том, мальчик или девочка, которым вы отправляете эту заметку нужно знать что-то, что и, очевидно? >> [Студент] Что вы отправляете. Какой ваш секрет, как и то, что в том, что соответствие между а и Ь и с и д ы. Это только добавление 1 к каждой из букв, чтобы перейти от А до Б, В к С? Это более сложный, чем это? Таким образом, вы и ваш раздавить должны иметь эту секретную информацию, но есть виды Catch-22 здесь. Если это в первый раз вы отправляете эту любовь письмо через класс, Как это мальчик или девочка будет знать, в чем секрет даже есть? Так что секретный ключ шифрования не решает всех проблем в мире, и есть на самом деле связь здесь, что мы вернемся к к концу семестра. Точно так же большинство из нас не знает, что кто-то работает, например, на Amazon.com, и все же многие из нас, наверное, купил материал в Amazon.com, и нас учили считать, что эти транзакции электронной торговли находятся в безопасности. URL, вероятно, говорит HTTPS, есть, может быть, глупый маленький значок замка где-то, есть какая-то криптографии обеспечении информации о кредитной карте между вами и Amazon.com. И все же, если криптография включает в себя знание какой-то секрет И все же я не знаю никого, на Амазонке, и я, конечно, не устроил любой секрет с кем-то на Amazon, как мой компьютер или мой браузер это делает? Оказывается, есть другие виды криптографии вообще, что решить эту проблему. Но на сегодняшний день, мы сосредоточимся на простой , где можно организовать заранее знать некоторые тайные +1 или как некоторое отображение между а и б о. И процесс криптографии обычно включает в себя это. У вас есть обычный текст, изображенный здесь, на левом, вы запускаете его через какой-то алгоритм или процедура шифрования - Может быть, это просто становится B, B становится с - и тогда вы в конечном итоге с зашифрованного текста. Между тем, как только ваш раздавить получает эту тайну, обратите внимание, Он или она должен расшифровать его, как правило задним ходом, что алгоритм таким образом, чтобы вернуть обычный текст. Есть физические воплощения этого. Например, это колечко декодер секрет, и это кольцо в том смысле, что есть два набора здесь. На внешней периферии этой вещью, есть буквы от А до Z, хотя они в случайном порядке, и с внутренней стороны, там на самом деле некоторые цифры такие, что с этим кольцом Вы можете включить вид снаружи, но не внутри для того, чтобы выстроить номера с буквами. Из фильма под названием Рождественская история, вы увидите, что мало Ральфи так не терпелось выяснить, что секретное сообщение Little Orphan Annie была для него что было сообщено, я думаю, в виде числовых сообщения на коробки от хлопьев и нужно было собрать все маленькие карты, которые пришли в зерновых окна, Вы должны были отправить им по почте, вы должны были вернуться тайну кольца декодер так что вы можете, наконец, выяснить, что отображение между буквами и цифрами или букв и букв. Как в компьютере мы можем идти о реализации или представляющие такие вещи? Нам нужно найти способ выразить себя немного более гибко чем наши переменные до сих пор позволил. У нас были целыми, у нас были символы, которые мы имели поплавки и двухместные и некоторые другие, но эти отдельные части памяти, которая на самом деле не позволяют выразить вещи как слова и предложения и фразы. В самом деле, мы называли такие строки вещи, но мы обещаем, что это действительно просто упрощение CS50 библиотеки что мы намерены отогните. И так, давайте начнем делать это здесь. Позвольте мне идти вперед и открывать файл - Все эти файлы доступны, как обычно, онлайн - называемые array.c решить проблему, не связанных с строками, но это рисует картину здесь о том, как мы могли бы использовать то, что называется массивом. Массив представляет собой тип данных. Это тип переменной рода, который имеет несколько меньшие типы данных внутри него спиной к спине, чтобы спина к спине. Так, например, если мы хотим написать небольшую программу, которая дает вам ваш тест среднего на курс, как 50, которая имеет 2 викторины, Вы можете очень легко написать эту программу, основанную даже на некоторых из материала на прошлой неделе с помощью GetInt и несколько переменных: Int quiz1, внутр quiz2. И это довольно просто. Это может быть 10, 20 строк кода, максимальная реализация программы , который просит пользователя в течение 2 баллов викторины и затем вычисляет их среднее , складывая их вместе, деля на 2, а затем печати результатов. Мы могли бы сделать это довольно легко сейчас, после некоторого количества минут. Но проблема в том, что предположим, что 50 было 3 или 4 викторины. Предположим, что вы хотели использовать ту же программу для класса, который был еженедельные викторины. Подумайте о классе, который еженедельные викторины. Если есть 16 или так недель в семестр, теперь у вас есть 16 переменных: quiz1 Int, Int quiz2, внутр quiz3, внутр quiz4. Как только вы начинаете видеть эту избыточность, это скопировать и вставить код, он должен начать делать вы хотите там было лучше. И к счастью, потому что массивы есть. Так давайте сделаем это. Во-первых, позвольте мне представить очень простую вещь, что мы не использовали до сих пор, но вы увидите, что иногда в коде. Это то, что обычно называется постоянной. Так что это постоянная в том смысле, что это значение никогда не меняется. Человеческие конвенции при создании постоянной является использование всех заглавных букв просто так, что он действительно выделяется в коде, и специальные ключевые слова, которые вы используете в С # определить. Поэтому мы говорим, # определить, то пространство, то слово, которое вы хотите использовать для названия константы , а затем значение константы. Обратите внимание, что это отличается от присвоения что-то переменная. Там нет знака равенства, нет запятой. Это то, что известно как директива препроцессора, но об этом в другой раз. На данный момент, это создает неизменное значение, называемое викторины , фактическое числовое значение 2. Таким образом, везде, где есть тесты, викторины, тесты на протяжении всего этого файла, вот только номер 2. Если я смотрю на основные Теперь, давайте посмотрим, как это работает. Сначала это выглядит немного загадочно, но это все вещи из неделе 1. Спросите у пользователя классах. Как мы это делаем? В строке 22 - это действительно сочные части - я заявляю, поплавок но не только одним поплавком. Я объявив, скорее, массив значений с плавающей точкой. Это переменная будет называться классах, как это подразумевается здесь, но только часть нового синтаксиса, то эти квадратные скобки. Тот факт, что я сказал поплавок классах, а затем открыть скобку, а затем номер - заметит, если это постоянная это так же, как мы сделали это - это означает: "Эй, компьютер, дайте мне 2 поплавка и давайте коллективно называют их оценки." Это в отличие от гораздо более трудоемкий процесс следующим образом: поплавок Grade1; grade2 плавать, и так далее. Таким образом, массив позволяет нам реализовать эту идею, но гораздо менее неряшливо, таким образом, что мы можем написать 1 строку кода, а не, скажем, 16 на 16-недельный семестр. Я не хочу, чтобы закодировать 2, потому что, если вы думаете об этом теперь логически, Предположим, в следующем году CS50 изменений до 3 викторины вместо и у меня был номер 2 здесь, у меня был номер 2 здесь, У меня был номер 2 здесь, номер 2 здесь. Она становится очень утомительным и очень легко испортить и случайно изменить значение 1 до 3 и пропустить некоторые другие значения 2. Так что я собираюсь вместо абстрактного это расстояние и использовать эту константу, которая, как предполагает его название, никогда не меняется. И теперь независимо от того, есть ли у нас различные викторины этом или следующем году, Я просто изменить его в одном месте, здесь на вершине. Так что все константы. Между тем, новая концептуальная особенность состоит в том массива. Таким образом, в квадратных скобках дать мне это много плавает и позволяет мне коллективно называют их классах здесь. Итак, теперь давайте посмотрим, что я собираюсь делать. Здесь, в строке 24 является началом цикла. Это действительно ничего особенного. Это только с помощью викторин, а не жестко числа. Но нет ничего интеллектуально разных там с прошлой недели. Это просто Printf, поэтому Е ("Викторина #% сут% D:") потому что я просто хочу, чтобы распечатать дать мне викторины № 1 из 2, а затем 2 из 2. Так что это чисто эстетическая вещь. Но самое интересное сейчас находится в строке 27. Для того, чтобы заполнить одну из двух заполнителей с плавающей точкой, Вы снова использовать квадратные скобки. В этом случае, я использую я, потому что это цикл начался с я, какое значение равное, по-видимому? [Студент] 0. >> [Малан] 0. Таким образом, на первой итерации этого цикла, это как если бы я написал это в коде, но на второй итерации этого цикла, это как если бы я написал это в своем коде. Но то, что я использую переменную прекрасно, потому что, как следует из названия, это изменение его значения на каждой итерации, так что я заполнение этого массива одном месте за один раз. Что это массив выглядит? Поэтому я обратил супер простой прямоугольник на экране здесь раньше была для этого причина. Массив это просто кусок памяти последовал еще один кусок памяти последовал еще один кусок памяти и так далее. Так что, если мой массив размером 2 в этом случае здесь, все, что я буду делать , введя в моей оценки викторины нравится здесь, - я получил 100 на один, а затем я получил 99 на этом - Затем эта память не может даже быть использован, потому что я только спросил компьютера для массива размером 2. Эти квадраты все еще там, не так ли? У вас еще есть 2 гигабайта оперативной памяти, даже если вы только просят 2 поплавка. Таким образом, идея массивов является то, что компьютер просто берет кусок памяти , а затем распределяет мелкие куски спина к спине, чтобы спина к спине. И это все, что массив. Это непрерывный кусок памяти, внутри которой вы можете положить вещи. Это происходит, чтобы потом сделать лишь несколько скучно арифметика. Если я прокрутите вниз здесь, это где я тогда итерации по массиву. Я придумал суммирование всех значений в массиве, а потом использовать круглый функцию здесь на самом деле делать сумма делится на викторины. Но позвольте мне махнуть рукой на что как своего рода достаточно арифметических сейчас. Но все, что делает для меня, в конечном счете, вычисление среднего. Итак, сначала тест, плюс второй тест делится на 2, а затем распечатать его, как Int. Но давайте теперь переход к другой пример называется string1, который рисует аналогичную картину, но с использованием строк. Позвольте мне идти вперед и упростить этот на мгновение. Простите отступ на данный момент. Обратите внимание на линию 19 из этого примера, я получаю строку от пользователя. Но обратите внимание на то, что я делаю в следующем линий 22 и далее. На самом деле я итерация от Я до - и это новый трюк - StrLen, длина строки. Это функция, которая поставляется с C, что если вы передаете его строки, он говорит вам, сколько символов в этой строке. Вот и все. А то, что это StrLen вместо того, чтобы длина строки просто потому, что это более кратким. Тридцать лет назад, людям нравилось писать вещи, как лаконично насколько это возможно, поэтому мы сохранили эту конвенцию здесь. я + + означает лишь то увеличиваем я в каждой итерации. А теперь замечаю это, что действительно интересно. В строке 24, я говорю: "Компьютер, дай мне характером, 8 бит, и называем его с". Но что это на правой стороне говорите? В английском языке, что это представляете? [Студент] Первый символ в массиве. Именно так. Дайте мне первый символ в массиве. Или, в более общем, дай мне-й символ в массиве. И понимаю, что это важно сейчас, как компьютерные науки, мы на самом деле начиная с 0. Вы не должны усмотрению сейчас, чтобы начать это делать. Теперь вы должны вести себя в соответствии с ожиданиями компьютер и считать от 0 потому что [0] будет первый символ в строке, [1] будет второй, [2] будет третьим, и так далее. Таким образом, эта программа, если я скомпилировать его, это опять string1, так что string1, и теперь я столкнулся string1 в моем окне терминала. Он ожидает ввода, так что я собираюсь ввести Давида, Enter и теперь она печатает Дэвид все на разных линиях, потому что уведомление, что я делаю. Я печать одного символа за один раз. Мы не будем вдаваться в подробности сегодня на этом, но я удалил эту минуту назад здесь галочку. Оказывается, что если пользователь неправильно, состязательности, или просто путают, Вы можете фактически не дают строки некоторой длины. Если вы нажмете не ту клавишу на клавиатуре, вы можете не дают строку на всех, или если вы злой, вы можете попробовать, чтобы вставить в стоимость гигабайта о эссе чтобы заполнить эту строку, и если компьютер работает из памяти, Оказывается, что мы собираемся вернуть это специальное значение, называемое NULL. Таким образом, на данный момент, просто знаю, что есть это специальное значение, называемое NULL , что позволит нам проверить, когда мы из памяти, между прочим. Но если я открываю сейчас string2, обратите внимание на одно различие здесь. Обратите внимание на одно различие здесь с string2. С string2, этот цикл немного отличается. Позвольте мне удалить нули, так что мы можем говорить о тех, кто в другой раз. Чем отличается цикл на этот раз? Я могу вернуться к предыдущему примеру. Так вот версия 2, это версия 1. 1, 2. 1, 2. StrLen вызов где? Это в первой части цикла. Любые мысли о том, почему я это делаю? Да. [Студент] Таким образом, вы не вызываете функцию каждый раз. [Малан] Таким образом, мы не вызываем функцию каждый раз. Именно так. Напомним, с петлями на то, что они супер просто Как только вы вроде понимаю, что это инициализация, условие и обновления. Проблема в том, что условие происходит на каждой итерации цикла. И поэтому в данном примере, что такое плохо о том, что это мое состояние? [Студент] Вы звоните StrLen. [Малан] Вы звоните StrLen снова и снова, и снова. Но как только я набрал в Дэвида, длина этой строки равен 5, и он не собирается менять на каждой итерации потому что строка по-прежнему D--V-я-д. Так что это намек на то, что собирается становиться все более важной идеей известный как дизайнерское решение, где только не делают компьютер делать ненужную работу. Так же, как предварительный просмотр pset2, pset2 в стандартном издании собирается бросить вам вызов на самом деле реализации некоторого числа шифров, некоторое количество алгоритмов шифрования, так что вы можете не только зашифровать и дешифрования секретных сообщений так же, как одной Ральфи там декодировать. В хакером издание pset2, мы собираемся пойти немного дальше. Мы собираемся передать вам файл с фактическими компьютерной системы , который содержит целую кучу имен и фактической зашифрованные пароли, и задачи для хакера издание будет взламывать эти пароли и выяснить, что криптография и тайные, что был использован для создания самом деле эти пароли. И мы собираемся сделать это с помощью новой функции здесь C что я дам вам только демо известный как аргументы командной строки. Оказывается, как некоторые из вас, возможно, видели в разделе или в учебниках, Основным не всегда должна быть пустота в скобках. Оказывается, что основная можно также записать как это, с двумя аргументами, ARGC и ARGV, где ARGC число слов что вы вводите после названия программы на вашем командной строки и ARGV является фактическим слов. И, как квадратные скобки там предлагают, ARGV видимо массива. Это собирается быть строкой после строки после строки в памяти. Так что мы собираемся быть в состоянии сделать, начиная с PSET 2, что-то вроде этого. Если я делаю argv1, который является примером мы вернемся к в понедельник, и запустить его, заметить, что это не похоже, чтобы сделать что-нибудь еще. Он просто выводит свое имя. Но если я прощаюсь класса, обратите внимание, что эта программа по-видимому итерации над каждым из слов, которые были напечатаны в командной строке. И средства, с помощью которых мы сможем получить доступ к словам, которые пользователь ввел в командной строке является изменение основной отправной этот уик-энд от Int основных (недействительными) на Int основных (агдс, ARGV) и, следовательно, родится аргументы командной строки. И как только вы получите действительно сложная в этом, вы сможете написать действительно трип программ таких, как этот вот, который идет выше и вне некоторые функции, которые мы сделали до сих пор, но все довольно мощный. Таким образом, мы оставим это с этим на экране, и мы будем видеть Вас в понедельник. [CS50.TV]