[Играет музыка] Дэвид Дж Малан: Это как первокурсник семинар сегодня. ХОРОШО. Итак, очень дождливая из. Это имеет тенденцию происходить по средам, но все больше возможностей по вопросам сегодня. Итак, давайте начнем на самом деле с пленкой в ​​минуту. Но мы начнем величественно, как всегда. Это CS50, и это конец недели 4. Так что, если вы когда-либо наблюдал Телевизор или кино, в котором есть некоторые компьютерные эксперты и полиция, ФБР или, или некоторые агентства пытается поймать некоторых противник, хорошо, вы, наверное, слышали выражение "повышения", в результате чего, что техник-то волшебно увеличивает в бесконечно далеко, чтобы увидеть преступников личность или номерной знак даже в отливом зеркалом или блеск чьей-то глаза. Так на самом деле, давайте взглянем на несколько таких сцен из Голливуда. [ПРОИГРЫВАНИЕ ВИДЕО] -Хорошо, Теперь давайте получить хороший взгляд на вас. -Погоди. Запустите его обратно. -Подожди минуту. Иди направо. -Есть, Заморозить, что. -Полноэкранный. -Хорошо, Что заморозить. -Tighten На что, не так ли? -векторных В том, что на парень с заднего колеса. -zoom В прямо здесь, на этом месте. -С Правом оборудования, изображение может быть увеличена и заточены. -Что это? -Это Программа повышения. -Может Вы ясно, что до любой? -Я не знаю. Давайте повышения его. -Enhance Разделе A6. -Я Усиливается детали, и-- я думаю, что есть достаточно, чтобы повысить, отпустите ее, чтобы мой экран. -Я Усиливается отражение в ее глаза. -Давай Это запустить это через улучшения видео. -Edgar, Вы можете повысить это? -Подожди. -Я Работаю на этом отражении. Отражение -Someone в. -отражении. -Есть Является отражением лица человека. -The Отражение. -Есть Это отражение. -zoom В на зеркале. -Вы Можете видеть отражение. -Может Вам повысить имидж отсюда? -Может Вам повысить его прямо здесь? -Может Вам повысить его? Вы можете увеличить это? -Может Мы увеличиваем это? -Может Вам повысить его? -Постой На секунду, я повышения. -zoom На дверь. -кратного 10. -Zoom. -Входить. -Больше. Подожди, стоп. -Стоп. -Pause Его. -rotate Нам 75 градусов вокруг вертикальной, пожалуйста. -Стоп. Вернитесь к части о дверь, снова. -Got Энхансер изображения, которые могут растрового изображения? Эй, может быть, мы можем использовать Прадипа Метод Сен видеть в окна. -Это Программное обеспечение состояние искусства. -The Собственное выключен. -С Права Сочетание algorithm-- Приняты устранение -Он алгоритмы на следующий уровень, и я могу использовать их для усилить эту фотографию. -Lock, И увеличить Z-оси. -Усилить. -Усилить. -Усилить. -Freeze И повышения. [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: Ладно, все те слова, на самом деле. Они просто нанизанные в так, что на самом деле не разумно. И в самом деле, CS50 и курсы, как это стремится разрушить много телевидения и кино для вас. Потому что, когда те компьютерных специалистов которые сыпать условия и говорил модные вещи, как собственные, и г-ось, и любое количество других на самом деле более технические термины, они на самом деле просто нанизывая слова вместе слишком часто. Это одна из наших надежд в том, что в качестве побочного эффекта, курсы как это, будет больше людей в Мир действительно сможет взвесить и только чуть-чуть влиять на Качество и точность этих фильмов? В самом деле, давайте взглянем на реальность. Так вот сотрудники фото Мария, один из наших товарищей обучения. И пусть она подозревается в чем-то. И все же, есть проблеск некоторые из доказательств в ее глаза, или в отражении ее очков. Ну, если мы делаем именно так, как фильмы предложить, в котором мы масштаба и "повышения", это сколько информации в лице Марии при захвате изображения с этой оригинальном разрешении. И, в самом деле, вы можете увидеть эти точки. И это то, что являются называемые пикселей, Р-И-Х-E-L-S, который находится всего в квадрат, как правило, то есть точка, которая составляет изображение. И еще в тот день, а на самом деле даже сегодня с некоторыми из сегодняшних LED-телевизоров или ЖК-телевизоры, если у вас есть одним в вашем номере или на дому, если вы идете супер близко к нему, и особенно если это несколько старше телевидение, Вы, вероятно, может даже видеть эти точки и это то, что составить изображение. И не больше нет Информация, чем эта. Мы могли бы "повысить", в том смысле, сглаживания вещи снова и рода выведение вид, вроде того, что Цвет должен быть рядом с глазом Марии так что это на самом деле не так неровной. Но если я продолжаю масштабирования, есть плохой парень в ее глаза. Как это все, Информация, которую мы имеем. Вы не можете создать Информация из ничего. Там только конечное количество битов там. Таким образом, в задачи Набор 4, где у вас есть возможность играть с такого рода мире. В задаче Set 4, вы исследовать Мир графики и экспертизы, и на самом деле писать код что восстанавливает потерянные изображения. Вы написать код, который манипулирует существующих изображений и в конечном итоге понять, что происходит под капотом. И, оказывается, это на самом деле не все, что сложнее. Например, если мы хотели представляют собой смайлик где с этих черных пикселей, или эти черные точки, Ну, мы могли бы просто представляют их как действительно растровые. И если вы когда-либо слышали, что Выражение растровые, возможно, теперь начинает сделать немного больше смысла сегодня. Мы уже знаем, что немного есть. Это 0 или 1. И карта просто что-то как кусок бумаги что дает вам направления и имеет может быть, сетка х и у координат. Так вот растровые. Это карта битов в результате чего, по-видимому 1 будет представлять белый пиксель, и 0 будет представлять черный пиксель. Но мы, безусловно, может перевернуть его вокруг. Это на самом деле не так важно Пока мы последовательны. А вот как, в binary-- внутри памяти компьютера, или даже внутри файла на ваш жесткий drive-- можно хранить простейший из смайлик изображений. Но то, что мы, конечно, не хватает в этом образе? Цвет, верно? Это очевидно, следующим шагом или усовершенствование улучшить это с цветом. Поэтому, к сожалению только с одной немного, 0 или 1, можно представить цвет. Это может быть красным или синим, или черный, или белый, или зеленый, или розового, или любые пары цветов. Но для простоты, мы будем просто предположить, черный и белый. Так что логично нам нужно, если мы хотите реализовать цвет в изображении? Что мы должны делать? Подобно этому, если ограничивающим фактором здесь является то, что с одним битом можно только представляют два состояния, 0 или 1, белый или черный, то, что вы хотите сделать? Аудитория: больше данных. Дэвид Дж Малан: Еще бит, ага больше данных, больше бит. И, действительно, это именно то, как представлены цветные изображения. Вместо того, чтобы использовать один бит, А 0 или 1 для каждого пикселя, каждая точка, Вы просто использовать несколько. Может быть, использовать 8, может быть, чаще использовать 24, и действительно, в задаче Набор 4, вы будете играть с файлом Формат, который использует 24 бита, как правило,. Но большинство из вас, вероятно, знакомы с JPEG. Если вы когда-либо фото на телефоне, или загружены или видели что-то на Facebook или Flickr, любое количество фото-основе веб-сайтов, вы имеете наверное, видели изображения JPEG с раньше. И оказывается, это файл Формат мы собираемся использовать в Pset 4, в котором вы собираетесь придется восстанавливать изображения что я случайно удалены из поврежден карты памяти в камере, если вы будете. И получается, что, хотя JPEG довольно sophisticated-- это гораздо более сложный чем черных и белых точек мы видели несколько минут назад, потому что есть на самом деле фантазии алгоритмы, которые используются для сжатия JPEG, так что вы можете иметь действительно хороший, качество изображения, но с использованием сравнительно мало бит. И мы вернемся к сжатия в скором времени. Оказывается, что первый три байта в image-- JPEG независимо от того, что вы сделали фотографию of-- являются значения 255, 216, 255. Другими словами, если вы просто видеть, что набор битов, здесь представлены как три байт, или 24 бита составит, с высокой вероятностью можно предположить, что Вы смотрите на это этот первый три байты JPEG. И это то, что известно в качестве подписи в формате JPEG. Много форматов файлов там, как правило, чтобы начать с некоторыми моделями 0 и 1, так что Windows, и Mac OS, и прошивкой, и Android-знаю, какой тип файла они это, в дополнение к так называемой файла расширение, которое много файлов есть. Если вы .jpg, это еще один ключ к компьютеру. Итак, давайте посмотрим на это немного более технически. Мы знаем десятичной система от 0 до 9. Мы знаем, двоичный 0 и 1. И если вы вспомните Pset 0, у вас бороться с, для немного, что-то называется шестнадцатеричном где у вас есть 16 цифр, вместо 10 или вместо 2. И эти цифры, по соглашению, от 0 до 9, а затем через F, где F представляет то, что десятичное число, как быстро здравомыслие проверить? Так, 15. И должен представлять 10, просто Характер упорядочения, что я дал. Это просто произвольное соглашение, но это вполне стандартный. Так что, если мы посмотрим на этот шаблон из трех bytes-- давайте просто начать смотреть на него в соответствии с тем, как компьютерные ученые вообще смотреть и думать о файлах. Вы, конечно, можете думать о Файлы в 0s, 1с и и десятичной, но в действительности, мы склонны использовать бинарный или более, как правило, hexadecimal-- назад от Pset 0. Итак, позвольте мне предположить, что 255, 216, 255 и просто эти модели 0 и 1. И вы можете проверить это, если вы хочу сделать математику с недели 0. Но сейчас, просто предположить, что это действительно правильно. Я просто переписать три десятичной числа как три двоичных значений. Теперь то, что я собираюсь сделать, это просто добавить белое пространство, только ради читаемости в. И заметьте, я только собираюсь раздвинуть вещи. Поэтому, прежде чем, после, до, после. Я не делаю ничего интересного друга чем просто распространение вещи так, что уведомление каждый набор из восьми Биты теперь два комплекта четырех битов. Это полезно, потому шестнадцатеричной Особенно модно потому что каждый шестнадцатеричная цифра от 0 до F, или, более конкретно от 0 до 15, может быть представлена с ровно четыре бита. Другими словами, в шестнадцатеричном если вы хочу, чтобы представлять 0, это просто 0000, четыре нуля. И если вы хотите, чтобы представлять 15, это 1111, который четыре бита. И если вы делаете математику, если это место те, это место 16s, что собирается дать you-- а что происходит , целью которых извините, в двоичном, что происходит, чтобы дать вам 15, из них место, Двойки место, четверок и восьмерки место. Итак, позвольте мне предложить, что это набор из четырех битов слева это то, что мы собираемся называть п. Это самый большой номер, который вы может представлять с четырьмя битами. И мы уже знаем из шестнадцатеричной е является крупнейшим цифра в шестнадцатеричном виде. У нас есть еще один F есть, более того там два. И теперь, только принять на веру что я сделал математику право и что левая половина из этих битов, 1101, это то же самое, как д в шестнадцатеричном виде. И правая рука, 1000, находится всего в 8. И, что один легко увидеть, правильно? 8-represents-- прав под этой восьмерки месте. Итак, мы имеем один в столбце восьмерки и ничего в четвереньках, двое или те. Так что теперь более традиционно, люди склонны написать шестнадцатеричные цифры, как это, вы просто хлюпать их вместе, и тогда вы префикс их с 0x. Это ничего не значит, кроме визуальный ключ к human-- вот идет шестнадцатеричное value-- потому не могли бы быть очевидным. Какой есть, в конечном счете, что картина из нулей и единиц, или картина шестнадцатеричной цифры же самое, что вы собирается начать искать в задаче Набор 4 this-- и проблема Набор 4 спецификации будут ходить Вы через это более detail-- но понимаю, как своего рода магии, как это может выглядеть на первый взгляд, Вы начнете видеть это много. И в самом деле, даже в GDB, то отладчик мы ввели в понедельник и Дэн внедряет в Pset 3, будет чтобы показать вам часто шестнадцатеричные значения только потому, что они имеют тенденцию быть более обычный, чем десятичная или двоичный в мире компьютеров. Теперь давайте поставить это в контексте. Многие из вас, возможно, помните, что это Здесь картина, которая пришла от чего? Vista,, так что даже раньше, чем что Windows XP сделал это дебют. Так что это красивый пейзаж. И в самом деле, если вы копаться online-- Я думаю, что это статья из Википедии, где кто-то очень удивительно вышел нашли это место в мире создана его или ее камера именно право place-- и это сегодня выглядит like-- но это точно так же, установка. Этот образ, хотя, находится в файле формат, называемый растровый, б-м-р. И мы собираемся взять супер Быстрый взгляд на то, что это значит. Но растровые это просто другой способ представляющие все изображения, используя пиксели в 0 и 1, в конечном счете,. Но в быстрый взгляд, он имеет более интересный подпись в начале файла. Это не только три байт, а есть целая куча шаблонов байтов что предопределило смысл. Например, где-то в Первые несколько байтов растрового изображения будет размер из Изображение, ширина изображения, высота изображения, так полезные метаданные, если вы будете. Полезная информация, что Photoshop или какие-либо графические программы вы используете может на самом деле волнует. Так подробнее об этом в Проблема указан 4, но это только сказать, что в конце дня все форматы файлов вы используете для years-- файлов Microsoft Word, Номера, файлы Excel, любое количество форматов файлов что, возможно, некоторые Известно, расширение файла просто 0 и 1 под капотом. И люди решили то, что конвенции являются, Какие модели 0 и 1 представляют Слово файл в сравнении файл Excel, по сравнению с любым количеством других форматов. Таким образом, в Pset 4, вы будете иметь возможность играть с этим. Но что это значит иметь структуры. Это на самом деле хороший переходить в настоящее время в С, который имеет только пару Из дополнительных функций, которые мы не смотрели на. Это довольно маленький язык и один из симпатичные черты о С является структурой. Например, если вы хотел represent-- давайте что вы хотели, чтобы иметь переменную, которая представляет студента в некотором программы. Может быть, вы пишете курс программа регистрации, или ядро ​​торговый инструмент, или что-то подобное. Какие части данных, связанных студенту, которые приходят на ум? Как студент представлены с тем, что ценит? Да? У вас есть имя в качестве студента. Что еще типичный студент имеет? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Так, извините. АУДИТОРИЯ: Возраст. Дэвид Дж Малан: возраст или день рождения то же самое, да. Что еще? АУДИТОРИЯ: Идентификационный номер? Дэвид Дж Малан: Так идентификационный номер, может быть, номер телефона, может быть, общежитие, или дом, или колледж, или что-то подобное. Любое количество элементов данных, которые Вы могли бы иметь в вашем списке контактов это то, что можно определить студента. Так что, если мы хотели, чтобы это сделать, в коде, мы могли бы сделать что-то простое, как это. Мы могли бы иметь программу так, чтобы имеет, скажем, INT основной (пустоту). И если я хочу, чтобы представлять студент, я мог бы, например, строка называется имя для этого студента, строка называется общежития для этого студента, может быть, INT называется ID для этого студента. И потому, что я использую строку, я нужно вернуться и поставить CS50.h. Может быть, я буду нуждаться в stdio.h. Итак, позвольте мне превентивно делать тем, и я буду называть эту student.c сейчас и сохранить это. И теперь я могу что-то сделать с этими переменными. И мы только собираемся написать что в качестве комментария в псевдокоде, потому что это не интересно что мы делаем сейчас. ОК, так что это программа, которая то хранит студента. Что я хочу делать, если я хотите сохранить двух студентов? Так что мой первый инстинкт будет все будет хорошо, подожди минутку, если у меня есть еще один студент, почему не я просто сделать имя строки 2, строка 2 общежития, INT id2. И мы сделали ушел по этой дороге до и каково же было наше решение, что, кажется, чтобы быть своего рода хаком пасты копирования Работа здесь? АУДИТОРИЯ: массив. Дэвид Дж Малан: Да, мы могли бы использовать массив. Право это очень быстро становится громоздким. Вы должны сортировать произвольно начать называя все эти переменные. А вы, человек, должны иметь отслеживать, что ОК NAME2 соответствует с dorm2 соответствует id2. Это просто становится беспорядок. Так что это намного проще, Напомним, с несколько недель назад, просто того, чтобы называемых имена строк и, возможно, дать нам три из них. И тогда, может быть, у нас есть строка общежития и есть три из них, или с константой, Int идентификаторы и имеют три из них. Но даже сейчас это чувствует немного небрежен, право. Мы говорим о студентах и ​​пока Я действительно останавливаясь на низком уровне Детали реализации. Студент имя и общежития и ID. Почему я не могу просто объявить переменную называется студентом и называют это S. И если я хочу другого студента, почему я не могу просто назвать это т. Или, если я хочу целую кучу студентов, почему я не могу просто у меня есть целый класс студенты, и это три из них. Другими словами, почему я не могу прийти с моей собственной типа данных, называемого Студенты, внутри которых является имя, является идентификатором, является общежитие, любое количество других областях. И получается, вам может сделать именно это. Так С имеет эту функцию под названием структура. Это особенность языка, который позволяет сделать именно это. Я собираюсь идти вперед и открыть structs.h куда мы идем, чтобы увидеть следующее определение студента. Оказывается - и это одна даже проще, чем тот, с участием идентификатор Минуту назад. Если вы хотите, чтобы придумать Ваш домашний тип данных, и в дополнение к INT, CHAR и и плавать и все эти другие, которые существуют, Вы можете сделать это в буквальном смысле писать TYPEDEF-структуру, то некоторые фигурные скобки, внутри которого вы список переменных, которые вы хотите связать с этой новой пользовательской информации введите как имя и общежитии, а затем, после фигурных скобках Вы дать имя для нового типа данных. Так, например, студент. И, что приятно об этом сейчас, что если мы посмотрим на соответствующий код, Конвенция, в первую всего, это поставить это в файле то точка ч, файл заголовка, который мы не начали использовать себя слишком много. Но мы собираемся, чтобы начать используя совсем немного в настоящее время. И то, что мы можем сделать с этим, В конечном счете, в эти несколько строк кода это объявить, что именно Тип данных, студент. А теперь давайте использовать его. Я собираюсь сейчас углубляться в файл называется structs1.c. И давайте посмотрим на несколько характеристик здесь. Таким образом, материал здесь является в основном знакомы, и мы вернуться к тому, что не знакомы в минуту. Это, конечно, в том числе мой собственный Файл заголовка, который является новым, а также, для Pset 3, где кроме, Напомним, у нас есть helpers.h. Таким образом, вы, возможно, помните #include helpers.h. Почему, хотя я использую цитаты а угловые скобки? Когда я выбираю между ними? Почти всегда я, кажется, использовать угловые скобки. А потом, вдруг на Линия шесть я использую двойные кавычки. Почему это может быть? Да? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Это актуально, что? АУДИТОРИЯ: Это в IDE. Дэвид Дж Малан: Да, что в моей фактической IDE. И давайте не будем останавливаться на IDE, так как это просто инструмент, который я использую. Вот в моем тока Каталог, в частности. Так structs.h мой собственный файл не установлен в IDE, в самой операционной системе, скорее это в моем текущем каталоге. Таким образом, Конвенция, если вы хотите чтобы включить свой собственный файл заголовка, Вы просто использовать двойные кавычки. Что мы называем эту вещь в линия 8, вообще говоря? Это то, что? #define то. Это представляет константы, верно? Если вы хотите, чтобы иметь значение в вашей программе использовать целый кучу раз, это Хорошее соглашение фактор его, объявим его с хэш-символа определить, то, в соответствии с соглашением, всего верхний регистр word-- хотя это не строго необходимым, но это соглашение человеком заработать константы так что они выпрыгивают у вас visually-- пространство и то значение, которое вы хотите быть эквивалентно имени, что постоянные в. Нет запятой, но вы просто следует, что рисунок есть. Так что я делаю в этой фактического кода. Итак, давайте взглянем на основная программа здесь. В строке 12, потому что я включили structs.h, Теперь я волшебно на мою утилизация новый тип данных. Я не просто иметь доступ к Int, и символ, и поплавок, и строка, и синий и другие. Теперь у меня есть доступ к тип данных студентом. Таким образом, в строке 12, я объединения двух ideas-- один тип данных и два, с использованием массива. И так в этой программе, если Я хочу, чтобы на самом деле поддерживают три различных студентов в моей программе, я можно просто сказать, дайте мне переменную называемые ученики, каждый из которых это типа студентов, которые мой пользовательский тип данных. И, в частности, дать мне три из них в моем массиве. Так что теперь нам делать в этой программе? Вот только для контура итерации от 0 до 3, потому что это то, что величина студентов. Я просто предлагая пользователю дать мне имя студента. И тогда в строке 17, мы есть в основном знакомые строки. У нас есть старый друг GetString справа. И то, что часть синтаксиса по-видимому, новый, если вы никогда не программировали в C, прежде чем, и никогда не использовал структур? Да? Аудитория: .name. Дэвид Дж Малан: The .name. Но это не слишком много прыжком, потому что теперь студенты скобки I дает I-й студент. И если вы хотите, чтобы нырнуть внутри этой структуры, вы просто используете один период и то имя переменной внутри, или свойство внутри, что Вы хотите, чтобы получить доступ к. Точно то, если я тогда побудить Пользователь, дай мне студента общежитие, Вы можете так же магазин, который строка в переменной общежития внутри этой студенческой структуры. А теперь все становится немного фантазии. И это будет выглядеть на, возможно, много довольно скоро. Но вы увидите, что это гораздо больше Pset 4, так что давайте просто взгляд на него сейчас. Оказывается, что в строке 23 через 38, что вы думаете, что я, возможно, делаете? Я снял комментарии на сегодняшний день, но версия кода для онлайн- справочник имеет все комментарии. Что я, кажется, делают? АУДИТОРИЯ: Сохранение файла со всеми информация, вошел пользователь. Дэвид Дж Малан: Да, точно, это новый способ что мы видим два, Еще одна особенность C, в результате чего я могу создать мои собственные файлы. До сих пор, почти каждая программа Вы написали является лицом без гражданства. Как только это будет сделано работает, вот и все. Там нет памяти или воспоминание о нем. Там нет файла сохраняется. Но если вы хотите, чтобы сохранить ввод, который имеет произошло, как в игре или программе как это, оказывается, мы можем это сделать. И вы увидите, что это более в Pset 4 и в разделе. Но эта линия 23 по существу создает файл с именем students.csv. И вы, возможно, видели это раньше. Даже если вы никогда не изучали CS раньше, CSV является разделенных запятыми переменных. Это как очень бедного человека версия файла Excel, что означает, что она может быть открыта в Excel и в Apple, Numbers, и имеет строк и столбцов. Но это не собственность Формат, как Microsoft или Apple. Это просто запятые, разделяющие ценности, которые мы видим в настоящее время. И только сделать предположение. В строке 23, в самом конец, мой второй аргумент к этой новой функции, называемой е открыт для открытого файла является ш. Что ж, возможно, обозначают? Да? АУДИТОРИЯ: Это позволяет записать в файл? Дэвид Дж Малан: Это позволяет Вы пишете в файл. Таким образом, есть пара вариантов что мы можем подключить здесь. Но если вы просто хотите, чтобы прочитать файл, который смотреть на него и читать его в памяти, вам просто использовать кавычки конец цитаты "г". Если вы хотите написать в Файл, вы используете цитату конец цитаты "ж". Там же добавлять и пару других вещей, если вы хотите изменить существующие файлы. Теперь мы собираемся, чтобы видеть это вещь, то мы вернемся к линии 24. NULL, то оказывается, специальное значение, что могут быть возвращены определенных функций если что-то пошло wrong-- если файл не существует, если вы запустите из памяти, или куча других ошибок. Но сейчас, давайте предположим, что это просто обычный проверка ошибок. Здесь, в линии 26, я итерации от 0 до 3 в течение всех моих студентов. И это своего рода рода новой функции, fprintf, но просто взять догадку. Если Printf просто распечатать отформатированную строку, Что же fprintf, вероятно, означает? АУДИТОРИЯ: Печать в файл. Дэвид Дж Малан: Распечатайте отформатированная строка в файле. Это то, что дополнительные е средства файлов. И новый первый аргумент должен быть переменная, которая представляет файл. Тогда мы просто должны формат строка, как Printf. И даже если это Синтаксис является новым, это только средства подключить имя студента, плагин в студенческих общежитиях, а затем с fclose, закрыть файл. А потом lastly-- это новый и мы вернемся к этому Перед long-- Я освобождая студент по причинам что случилось наверху там. Но мы вернемся чтобы что до long-- это потому, что, как это GetString на самом деле работает под капотом. Итак, давайте взглянем здесь. Если я печатаю Ls в моем каталоге, заметить, что я не есть файл с именем students.csv, просто не существует, не существует. Так что, если сейчас я скомпилировать эту программу, сделать Структуры 1,. / Структуры-1, и я собираюсь идти вперед и ввести в Энди, который живет в Беркли в Йельском университете. Мы собираемся, чтобы иметь Роба, который живет в Тайер в эти дни. И давайте придумать, где это, я думаю, Мария находится в Mather, если я правильно вспомнил. Так что ничего, кажется, не произойдет. Но если я типа Ls сейчас, есть students.csv. Давайте идти вперед и открытый students.csv. Это опять очень легкий формат. Но я просто приняла конвенцию что у меня есть два строк и столбцов здесь. В первой колонке Первые имена людей. Второй столбец учащегося общежития, или колледж, или дом, или еще много чего. И теперь я сохранил это на постоянной основе в виде файла. Так что это не все, что интересно. Но это всего лишь ступенькой в ​​настоящее время чтобы быть в состоянии сохранения информации постоянно. Итак, давайте теперь посмотрим, что еще мы можем делать с этими и другими функциями. Но сначала, какие-либо вопросы? Это было много, и это было быстро. Но вы увидите много более Pset 4, а также. Да? АУДИТОРИЯ: Есть ли способ, чтобы продолжить добавление имен в этот файл? Дэвид Дж Малан: Хороший вопрос. Есть ли способ, чтобы продолжить добавив имена этого файла? Да. И в самом деле, если вы в конечном до повторного открытия файла, Вы бы использовать цитату конец цитаты "а" для Append, который бы просто добавить новую строку, А Новая линия снова и снова, точно. Хороший вопрос. Другие вопросы? Да? АУДИТОРИЯ: Если вы побежал Программа снова прямо сейчас, бы это продолжать добавлять имена в подать или это открыть новый файл? Дэвид Дж Малан: Ах, хороший вопрос. Если вы снова сразу побежал программа Теперь, может быть, ввели в новые имена, это может добавить в файл или перезаписать файл? Последнее, потому что я не используя на добавление режима. И потому, что я просто слепо открытие файла для записи, это просто будет перезаписывать файл. Так что я действительно нужно будет сделать, это добавить, если я хочу на самом деле есть долгий срок база данных. Теперь CSV полезно, честно говоря, даже для, как, если вы writing-- и мы в конечном итоге видим это позже в семестр, когда мы используем томов CSV для других целей. Если вы хотите сохранить всех людей кто зарегистрировался для какого-либо события, или зарегистрировались для студента группа или что-то подобное, хранения данных в этом роде формата супер удобно. Потому что буквально, если бы я были загрузить этот файл. Я мог бы и double-- давайте на самом деле пытаются это если у меня есть Excel или Numbers здесь. Я собираюсь правой кнопкой мыши или контроль кнопкой мыши мой файл. Упс. Щелкните правой кнопкой мыши или контроля кнопкой мой файл. Давай, моя мышь не сотрудничает. Download-- я собираюсь скачать все файлы вот так только так я могу захватить этот. И давайте посмотрим, если это работает students.csv-- первый раз Я активировал. Теперь они хотят, чтобы увидеть мои контакты. Теперь, мне нужно, чтобы зарегистрироваться. Посмотрите, как легко это использовать томов CSV? Да, держать его в курсе. Хорошо, теперь мы готовы к классу. ОК, ну, что нового? ОК, близко. Это было волшебно. Хорошо, теперь у нас есть, чтобы обновить. И сейчас, это забыл, что подать Первоначально я открыл, но то, что A-- мы идем. ОК, так что теперь у нас есть файл Excel. Спасибо. ОК, так что то, что я делал, было легко. Конечно, я мог бы заранее установлены Excel, или чисел, или то, что программа. Но это хорошо, потому что Теперь я могу манипулировать Данные в стандартном формате. Так что теперь давайте контекст перейти к где мы остановились в прошлый раз, который был начать снять учебные колеса. Но сначала, вы не сделали посмотреть ранее обед происходит снова здесь Огня и Лед в Кембридже, Ситар в Нью-Хейвене. Зарегистрироваться на сайте CS50s как можно скорее присоединиться к студентам и сотрудникам CS50. Поэтому мы приняли учебные диски в понедельник, как follows-- Строка был объявлен в Библиотека CS50s в течение некоторого времени. И это хорошо, потому что это позволяет нам говорить о переменных как полных слов и предложений и многое другое. Но, оказывается, строку не существует. Это просто синонимом, или псевдоним, что мы создали за то, что на самом деле немного больше техническая называется символ *. И в самом деле, мы видели пример программы на понедельник что не ведут себя совершенно, как мы ожидали. Это был файл, сравнить и 0. И напомним, что сравнивать-0, если Я перекомпилировать программу понедельник и запустить сравнивать-0 и введите в маму в нижнем регистре, и мама в нижнем регистре снова. Программа настоял, чтобы я введите разные вещи, даже если мама, все в в нижнем регистре, идентичен визуально. Так что же короткий ответ почему компьютер считает эти две строки отличаются? Да? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Верно. Так, мама, впервые Я введите его в, в настоящее время хранятся где-то в моей компьютера памяти, но в другом месте чем во второй раз я печатаю в маме. Теперь, конечно, могли быть оптимизированы. Компьютер может быть умным и реализовать эти две строки, эй, они идентичны. Позвольте мне не избыточно хранить его. Но компьютеры не делают, что оптимизация, если вы не скажете им. Так, по умолчанию, они просто хочу, чтобы в конечном итоге в двух разных местах в памяти. И так более понятно, когда мы сравнили две строки, Первая называлась лет, второй был вызван т, что конкретно я был Сравнение здесь, на линии 13? Да. АУДИТОРИЯ: Это место в памяти что переменная будет указывать на. Дэвид Дж Малан: Точно, я был Сравнивая место в памяти что эти переменные указывают на. Так в частности, если мама была в Номер байта 1, и 2, и 3, и 4--, потому что помню, обратный слеш 0 должна быть полностью в конце. А другой экземпляр мама, м-о-м, был по адресу 10, 11, 12 и 13. Я сравнивал 1, что адрес, что расположение в памяти, против 10, который очевидно, не то же самое. 1 не 10. Так что это хорошо в том, что это довольно просто. Но это проблематично, поскольку мы не можем, кажется, для сравнения строк. Так fundamentally-- и в этом низком уровне, если вы хотите реализовать программа для сравнения два отдельных слова, которые пользователь ввел в качество, они выстраиваются символ для символ, только в общих чертах, то, что нам нужно сделать, по-видимому? Это не достаточно просто посмотрите на эти два адреса. Что нам нужно сделать? Да? АУДИТОРИЯ: перебирать строка [неразборчиво]. Дэвид Дж Малан: Да, давайте перебора строки. Давайте использовать цикл, в то время как петли, или Все, что вы наиболее комфортно. И если у нас есть две строки где-то в памяти, давайте посмотрим на каждый годов Первый символ, то каждая вторым характер, то третий, и четвертый, и пятый, пока мы не попали то, что особое значение сторожевого? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Да, обратный слеш нулю, и в этот момент в любом строки мы можем решить, что это его. Разве мы соответствует каждый символ? Если нет, вернуться ложным. Если это так, возвращает истину. И так, что именно то, что эта версия программы сравнивать-1.c делает. Это идентично тому, что мы посмотрел на понедельник кроме того, что я избавился от слова string-- хотя что не имеет никакого функционального impact-- все Я сейчас делаю это удаление некоторые визуальные учебные диски, но ясно видеть, что с и Т-адреса. И это то, что звезда, звездочка, представляет это адрес, в противном случае известно более технически как указатель. Так что, когда я заявляю, с на строка 9 и говорят символ * с, это не значит, дать мне строку. Это означает, что дать мне переменную, Цель в жизни является хранение адреса. Потому что я собираюсь поставить адрес строки в нем. И в самом деле, GetString, чтобы быть ясно, не возвращает строку. Он не возвращает маме Обратная косая черта нулю, как таковые. Что конкретно GetString и точно вернуться? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: адрес, адрес адрес первого символа в какой-то строки он получил. И вот теперь мы видим специальное ключевое слово снова. И, я упоминал об этом раньше. Это будет хорошо конвенция что мы увидим снова и снова теперь. Я проверяю, чтобы убедиться, что с не нулевой и т не является нулевым. Потому что на основе моего действительно Быстрый упоминание ранее, то, что может означать, если не возвращает GetString адрес, но Н-У-Л-Л, что опять-таки, некоторые особое значение? АУДИТОРИЯ: Ошибка. Дэвид Дж Малан: Это ошибка. Что-то пошло не так. И то, что, как правило, может произойти, особенно с strings-- которая может быть из неизвестной длины в advance-- Возможно компьютеры » из памяти, может быть, Вы ввели в таком длинное слово или предложение или вставить такую ​​огромную эссе там просто не хватает памяти. И так GetString не может вернуться адрес всей вещи, так что просто ничего не возвращает. И это говорит об ошибке произошло вернув особое значение NULL. Это нулевой адрес, так сказать. Теперь выясняется, С поставляется с Функция, которая делает эту итерацию. Мы не должны реализовывать это с для цикла или время цикла сами. Мы можем использовать функцию, называется лаконично, перемешать комп, или строка сравнивать, чья Цель в жизни является именно это и делают. Вы даете ему два указателя, два адреса, и она будет идти по этим адресам а затем сравнить письмо для буква в букву за качество, останавливаясь только когда то, что это правда? Когда интуитивно следует перемешать комп прекратить итерации, просто чтобы быть понятно? Когда она попадает обратный слеш 0 в любом Строка, в этот момент он может решить, имеет все соответствует, или еще не было несоответствие? Таким образом, если мы запустим это сейчас и пытаются наша маленькая капитализация игра, поэтому убедитесь, сравнить-1, ./compare-1, и введите мама в нижнем регистре оба раза. Теперь то же самое. И если я сделаю это снова строчные и прописные то, возможно,. Теперь действительно отличает между заглавными и строчными. Так что не все так сложно, или волшебный, но это сейчас объясним что происходит под капотом. Так что еще мы можем извлечь от этого вида урока? Итак, давайте взглянем на это. Я собираюсь идти вперед и написать Быстрый программы здесь называется копирования 0. А теперь давайте идти вперед и фактически давайте сделаем this-- с копией 0, взглянем на то, что я попал сюда. Я сначала рассказать пользователю, что-то сказать. Тогда я получаю строку и я сохранил его в с. Затем я проверяю, если ей равна равен NULL, просто возвращает 1. Так что это просто стандартная проверка ошибок. Ничего интересного не произошло. И в самом деле, если мы избавимся от ошибки проверки, как это выглядит неделю 1 кода в данный момент. Но я начал, чтобы получить немного лучше об этом. Сейчас в линии 16, неделю назад, может быть, даже пару дней или часов назад, Вы могли бы сказать линии 16 Создание переменной называется т и копирование S в него. И это совершенно разумно вынос. Но точнее сих пор. Что происходит в строке 16? Что становится скопированы справа налево? Да? АУДИТОРИЯ: т получать это адрес с? Дэвид Дж Малан: Ровно, т становится адрес с. Таким образом, чтобы быть ясно, теперь, если я иду вернуться к этому предыдущем примере и я вытянуть вещь я напечатали. И то, что мы набрали in-- вот с, а вот это то, что я набрал в где-то в памяти, мама, а затем обратный слеш 0, который добавляется для меня. То, что я хранятся здесь, напомним, Это в местоположении 1, 2, 3, 4, это то, что в настоящее время в с. Так что, если в строке 16, я говорю дайте мне другой переменной называется т и магазин по меньшей стоимости с, то, что получает хранится здесь не будет мама а просто число 1. Так что, если мы посмотрим вперед в этой программе Теперь, что произойдет? Так заметить, что есть эта функция вы могли использовал это некоторое время назад для Цезаря, или Vigenere, или, может быть, не на всех. Я утверждаю, с моей Printf, я собирается извлечь выгоду копирования т. Первый в линии 19, быстро здравомыслия проверить, STRLEN проверяет длину т. Потому что я не хочу попробуйте воспользоваться что-то если нет строки там. Если пользователь просто нажмите Enter, нет ничего, чтобы извлечь выгоду. Так что я не хочу, чтобы сделать линию 21. Так линия 21 спекулируя какая буква, по-видимому, в т? АУДИТОРИЯ: м? Дэвид Дж Малан: Это выглядит как это копирование какой? АУДИТОРИЯ: м. Дэвид Дж Малан: Э-э, м. Итак, первым т, потому уведомления, что я перейти к TOUPPER, что если вы никогда не видели его, это просто функция выгоду в качестве входных данных. т кронштейн ноль означает дать мне нулевой характер т. И так, как делает это изменение изображения, чтобы было ясно? Что нужно, чтобы переписать или изменить по отношению к S и T и мама Обратная косая черта нулю. АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Да, так что это одно здесь просто необходимо получить изменилось, целью которых исправить this-- необходимо получить изменен на буквы М. Но теперь, посмотрите позже в Программа, если я распечатать с и т, как я чищу здесь, смотреть то, что произойдет распечатки с и т. Так что копирования 0, ./copy-0. Позвольте мне идти вперед и ввести в маме в нижнем регистре. Обратите внимание, как оригинальный и копия были капитализированы. Зачем? Ну, с т и оба указывая на, если хотите, то же самое кусок памяти. И, честно говоря, это становится действительно uninteresting-- тот факт, что мы используем адрес нулю здесь. Я имею в виду, я действительно не волнует, где материал в памяти. К сожалению, я стирания слишком много. Но я действительно не волнует, где вещи находятся в памяти. И так, действительно то, что программисты склонны думать о является то, что когда вы говорите о адрес, или указатель, кто заботится, где она находится в памяти. Я не волнует, если это в байт один или один миллиард. Я просто все равно, что это переменная эффективно указывая на то кусок памяти. И так отныне вместо каламбур над произвольным адресам памяти, давайте просто начать рисовать указатели как указатели, как стрелы. Так что с и т на самом деле, в соответствии с этой программой, потому что, как я создал т, это просто два отдельных переменных указывая в то же куска памяти. И мы не волнует, где они находятся. Таким образом, мы можем абстрагироваться от этой детали. Так как я могу это исправить? Если я хочу, чтобы написать версию копии программа, которая непосредственно копирует строку и капитализирует только копия, просто интуитивно, что получил быть ингредиент для нашего решения? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Нам нужно что? АУДИТОРИЯ: Кусок памяти. Дэвид Дж Малан: Мы должны другой кусок памяти, верно? Мы не знаем, как сделать его еще, обязательно. Но я вроде нужно, чтобы это произошло, так что оригинальный мама в нижнем регистре заканчивается в тот дополнительной кусок памяти. А потом, когда я изменить копию, я не хочу, чтобы изменить эту копию здесь. Я вместо этого хотите, чтобы изменить только этот копия, так что оригинал остается неизменным. Итак, давайте посмотрим, как мы можем это сделать. В копия-1, который уже был лишен комментарий, но прокомментировал онлайн. Вместо этого мы сделать это following-- линии идентичны, дай мне строку и называют это S. Но теперь давайте посмотрим на один из наших самых сложный, но последний из-за сложности на некоторое время, строка 16 делает именно это. Так что, если ваш удобный с Картина, которую мы только что drew-- дать мне новую часть памяти, скопировать все в нее, давайте посмотрим, как мы переводим что код. Так линии 16, на левой стороне, символ * т дает мне эту коробку здесь. Это все, что он делает. На правой стороне, м Alloc, или таНос, является выделение памяти, супер фантазии, загадочные способ просто говорю дать мне кусок памяти. Сколько памяти нужно? Ну, это своего рода большой выражения. Но давайте посмотрим, что он говорит здесь. Так что это, конечно, дать мне длину строки из с. Так, мама это должно быть что? Так что три, не так ли? мама трех символов. Вы не посчитать Обратная косая черта нуля, когда вы говорить о длине строки это На самом деле человека видимые буквы. Так мама, так что это дает мне 3. Но подождите минуту, я сейчас, добавив 1. Почему я на самом деле хочу, чтобы выделить 4 байта, а не только 3? Да? АУДИТОРИЯ: Для значения дозорного? Дэвид Дж Малан: Ровно, для этого значения дозорного. Для обратной косой черты нулевой, Мне нужно всего 4 байта. Поэтому мне нужно длину строки плюс 1. А потом просто для хорошего measure-- даже если на этой системе, это всегда будет 1-- Я говорю умножить это размером с гольца. Оказывается SizeOf это оператор в С, просто говорит вам, в количество байт, что это требуется для определенного типа данных. Это не работает для массивов, Как правило, иногда он делает. Но в общем случае, нет. Но он скажет мне, сколько байтов, символ является, что оказывается всегда 1. Так что это, как умножение на 1. Так супер загадочные глядя строка кода. Но все это делает дает мне кусок памяти. Но это, кажется, копирование ничего в этой памяти? Еще нет. И так что я на линии 22, а 23, 24, 25, ну, я просто это сделать. И это своего рода старая школа материал в настоящее время. Это как Pset 2, где Вы просто перемещение вещи вокруг в памяти, или, скорее, в строках. Так что я итерации от 0 до длина строки с. И я копирования я-й символ в с в я-го символа в т. И потому, что я, программист, сделал Обязательно выделить ровно столько байтов как мне нужно, это прекрасно один-к-одному. И я скопировать маму нижний регистр на новый. А потом, наконец, я эту линию. И так что эффект только заработать эту т здесь. Так много, чтобы поглотить, но если вы просто рассмотреть что на самом деле происходит на под капотом просто движется них Байты вокруг, все, что Необходимо, чтобы решить эту проблему просто чтобы дать нам этот кусок памяти. Теперь на риск Подавляющее, позвольте мне показать один пример, который почти идентичны, за исключением одного этого строка кода. Так что это хакер версия этой программы, если вы будете. Но давайте просто перегонять это в то, что происходит. Линия 24 используется, чтобы быть в этом т Кронштейн я получает ы кронштейн я. Теперь, я меняю это гораздо более загадочными звезда т плюс 1 равняется звезда с плюс 1. Так, что происходит и почему у нас есть звезды характер? Мы видели звезду прежде, и он используется по-разному здесь. Мы ранее видели символ *, теперь я вижу звезда в начале, и это нормально. Потому что оказывается мы может заключить своего рода просто от тех, в первую очередь принципы, что происходит. Так просто быть понятно, что ей? На прошлой неделе, это было строка. Чего не хватает больше. Что ей конкретно? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: Это указатель. Это адрес Первый символ мы набрали в. Хорошо, что это т? АУДИТОРИЯ: [неразборчиво] Дэвид Дж Малан: The адрес первого байта в т, что часть памяти перераспределены. Вот и получается, что, когда мы итерации от 0 до от строки length-- в первую очередь, я начинается с 0, потому что этой старой школы петли вещи. Так что для простоты, давайте Предположим, что первая строка кода на самом деле просто это, право. Если я равна нулю, добавив ноль к чему-то, вероятно, не будет иметь эффекта. Так что это высказывание? Оказывается, звезды Оператор в данном контексте это разыменовать Оператор, который находится всего причудливый способ сказать перейти по следующему адресу. Так что, если ей это адрес первого характер этого куска памяти, * с средством идти туда. И потому, что мы нарисовали картина, таким образом, Вы можете принять следующая модель психического. Если это ей, а вы говорите * S * S, вроде как желобов и лестниц, если вы помните игру с детства, это как следует, что стрелку и перейти по адресу. * т то же самое. Так что начните здесь, перейдите к его кусок. Я не могу просто нарисовать на Этот экран таким образом. * т означает идти сюда. И потом, для цикла это просто говоря переместить этот символ здесь, переместить этот символ здесь, переместить этот символ здесь. Но как я могу сделать это приращение? Мне нужно, чтобы исправить то, что я только что удалили. Это то, что обычно называют арифметика указателей, которые означает математику с адресами. Если в этот цикл, Я продолжаю увеличивая I, и с представляет собой адрес и т является адрес, если я просто буду добавлять 1, это просто означает, продолжать двигаться вперед, и вперед, и вперед в памяти. Это как Оксфорд-стрит, Улица, что здание КС на. В CS здания находится в 33 Оксфорд-стрит. Так что, если вы должны были сделать 33 Оксфорд-стрит плюс 1, что приносит вам 34 Оксфорд Улица, то 35 Оксфорд-стрит, затем 36 Оксфорд-стрит, все те, здания на самом деле - если они существуют. И так, что все, что мы делаем здесь с арифметикой указателя. Так что это супер тайной способ выражения себя. Но все, что происходит под капотом только следующие адреса, как после карты, если хотите, или после стрелки как мы нарисовали на экране. ОК, много, чтобы переварить. Любой вопрос по синтаксису, концепции, указатели, таНос, и тому подобное. Да, здесь в первую очередь. АУДИТОРИЯ: Так где, что говорит * т равна ToUpper * т, является то, что собирается воспользоваться все буквы или просто-- Дэвид Дж Малан: Ах, очень хороший вопрос. Таким образом, в этой линии здесь, 31, это собирается извлечь выгоду первая буква или все письма. Так давайте ответим, что, перейдя вернуться к первым принципам. И первые принципы здесь я имею в виду просто зайдите на основных определений что участвует. Так ToUpper это функция что капитализирует полукокса. Вот и все. * т означает идти к first-- перейти по адресу в т. Так, в картине, если это кусок памяти мы выделили с таНос, и это т, * т означает идти сюда. Между тем, вы передаете что значение, в нижнем регистре м чтобы ToUpper, вы получаете обратно Столица М, где вы положить его? Ты ставишь его в том же месте. И так по этой логике тех, основные определения, что это только заглавной первую букву если вы не итерации с I или а цикл или время цикла, он не собирается делать что-либо большее, чем вы спросите его. Хороший вопрос. Да? АУДИТОРИЯ: Почему вы используете разыменовать метода, а не массив? Дэвид Дж Малан: Ах, хороший вопрос. Почему бы вам использовать разыменования Метод вместо метода массива? Нет особых причин, не быть честным. И в самом деле, для этого вид, например, право, Я просто утверждая, что делает Программа сложнее, больше глаза остекление над, люди проверяя потому что это выглядит супер тайной, но даже если он делает то же самое. И так, честно говоря, это излишне визуально комплексное решение к проблеме. Он по-прежнему хороший дизайн, пять из пяти дизайна, будь то в кронштейне обозначение или обозначение указателя. Но-- особенно, когда мы получаем позже в ходе в Pset 5 когда мы реализуем эту словаря, Я уже упоминал пару times-- мы на самом деле заботятся о адреса низкий уровень памяти что мы действительно понимаем, что происходит. Но сейчас, оказывается, что это строка кода здесь квадратные скобки самом деле не существует. Они, что называется синтаксический сахар, который это просто странно прохладно способ сказать компилятор преобразует квадратные скобки, чтобы быть что математическое выражение. Так что это человек конвенции чтобы иметь возможность просто написать эти очень удобные кронштейны. Но то, что компилятор, лязг, на самом деле делает любое время Вы пишете что выделенный в соответствии 24, под капотом, это действительно превращая его на это. Это просто более приятным, как человек читать и писать код, как линии 24. Но в конце концов тех, учебные колеса слишком оторваться когда свое собственное комфорт крепнет. Ладно, так вспомнить то, что это был своего рода большой проблемой мы побежали в. И это то, что вызвало это целое блин разговор о указателей, и адреса, и копирование вещи. Это потому, что мы споткнулся это глупо, глупо вопрос, в результате чего Я реализовал logically-- с Лорен здесь, на демо и апельсинового сока в milk-- совершенно алгоритмически правильная функция для перекачки две переменные " значения, но черта не имеет какого-либо постоянные или постоянный, эффект на мой код. И почему? В двух словах, почему это Реализация обмена логически правильно, но не имеет никакого влияния от переменных, которые передаются ему, как х и у для основной? В чем же суть вопроса? Да? АУДИТОРИЯ: Потому что переменная сделал копии переменной в проходе через функцию. Дэвид Дж Малан: Ровно, когда вы проходите переменные в функции, или аргументы в функции, они принят экземпляре, который означает, что вы получите идентичный глядя образец битов для обоих х и у, называется здесь и б. И вы можете сделать что-нибудь Вы хотите с этих копий, но они собираются иметь не Влияние на вызывающую функцию. И в самом деле, мы обратили, что изображение на экране, напомним Последний раз, в результате чего, если вам действительно думаю о том, что это происходит под hood-- если это память компьютера, и здесь есть кусок память используется для основной, это кусок память используется для обмена, и поэтому, даже если основная имеет две переменные х и у, своп может иметь идентичные глядя Значения, оба из которых являются 1 и 2, но они полностью различные участки памяти. Таким образом, мы должны решение этого. И, честно говоря, кажется, что мы теперь есть решение этой проблемы, правильно. Если сейчас у нас есть возможность для манипулировать вещами путем адресов и, вроде лотки и лестницы стиль, выполните следующие стрелки и никуда мы хотим в памяти, мы не могли решить эту проблему переходя от основной поменять не ценности, которые мы хотим, чтобы своп, но только интуитивно то, что мы могли бы пройти, чтобы поменять вместо этого? [Реле ГОЛОСА] Дэвид Дж Малан: Почему бы нам просто не передать его адреса, верно? Почему бы нам не дать обменять Карта сокровищ, если хотите, что приводит к его фактические значения х и у. Давайте подкачки, на самом деле изменить эти оригинальные биты, а не просто проходя копии бит. И так, на самом деле, это то, что будет решение. Эта версия здесь ясно плохо и недостатки. И теперь, на первый взгляд, это просто выглядит как мы добавили кучу звезд случайным и пересек пальцы что бы собрать. Но, в настоящее время компиляции будет. Но давайте посмотрим, что означают эти вещи. И, к сожалению, авторы С мог бы выбрать другой символ чтобы сделать это немного яснее, но звезда оператор имеет различное значение в два разных контекстах. И мы видели, как, но давайте различать. Так на вершине там, когда я изменил а и б от того, INT в в плохо Версия для INT звезд, а, б, ранее, были целые. Каковы а и Ь в настоящее время в хороший, зеленый версия? Они адресов. Адреса что, чтобы быть ясно? Адреса чисел. Поэтому тот факт, что я говоря INT звезды средства это адрес целое число, в частности. Так что теперь заметить в строк кода, что-то еще слишком изменилась. TMP остается неизменным, поскольку это просто временное целое, нет волшебной памяти там. Но в настоящее время нуждается в звезду. И, в самом деле, каждый другой упоминание а и Ь, заметить, что все, что изменения от красного до зеленого является то, что я, предваряя эти переменные со звездами. Потому что я не хочу, чтобы скопировать и б. Потому что, если я просто скопировать А и В и обмен а и б, что я на самом деле обмен? Всего адреса, я хочу, чтобы поменять что в этих адресов. Я хочу пойти туда. И так звезда оператор внутри моей функции, не внутри списка параметров, означает, что вы идете по этим адресам а на самом деле изменить эти значения. Итак, что же картину выглядеть так, как вместо. Ну, если вместо этого я прохождения в а и б не 1 и 2-- Я на самом деле нужно, чтобы добавить один определение здесь. Итак, пусть этого блока памяти находится в месте 10. Это в местоположении 11, но это это немного упрощения, Теперь у меня есть два варианта я пройти х и у или мне пройти их адреса? Если я прохожу их адреса как это, я просто Теперь нужно реализовать своп за зеленой код так что, когда он видит, и когда он видит б, не просто скопировать а и Ь и двигаться молоко и апельсиновый сок. Молоко и апельсиновый сок Метафора в настоящее время ломается, потому что те чашки жидких и не карт. Вместо этого мы должны идти для решения 10 и мы нужно идти к решению 11, и затем выполнить, что перестановка логику. Поэтому логика та же, но нам нужен немного другой способ доступа эти переменные. И так, в конце концов, то, что Программа должна выглядеть эта. В swap.c буквально скопированы и вставить зеленый версии. Но мне нужно, чтобы сделать одно изменение. Это не достаточно просто изменить подкачки. Какие другие строки кода мне нужно изменить? Да? АУДИТОРИЯ: Где он принимает аргументы. Дэвид Дж Малан: Где он принимает аргумент. Так что, если я прокрутки вверх на главную, я не может просто передать по х и у, и я обещаю, последний кусок нового синтаксиса сегодня. Мне нужно пройти в не х и у, но также адрес хну. И оказывается, символ что авторы выбрали C , если вы используете амперсанд здесь, не путать с побитового амперсанд, если вы используете амперсанд здесь и амперсанд здесь, это выясняет для вас, что адрес X, может быть, это 10, то это адрес у, может быть, это 11, и передает те, в вместо. Так много, чтобы поглотить все сразу. Но давайте теперь посмотрим быстро наши оставшиеся четыре минуты где все может пойти наперекосяк. И, как в сторону, на самом деле Я взял эту картину, TF взял эту картину в год или два назад. Так что это еще угол Элиота столовой. Указатели являются, пожалуй, самая трудная тема, что мы рассмотрим в CS50. Так что, если вы беспокоитесь вид наклона, как может быть, это более хоккейной клюшки как это, понимаю, мы вроде близится пик Условия концептуальной сложности. И я воспитываю это фото, потому что я клянусь, богу, осенью 1996 года, когда я взял CS50 с моей преподавательской парень, Нишат Мехта, он усадил меня в угол Элиот Д. Холл за обедом, или ужин, или что-то, чтобы попытаться чтобы помочь мне понять указатели. И это, где я был недель после она была введена в лекции когда это Я, наконец, понял указатели. И я надеюсь, что это нажмут гораздо раньше для вас. Но понимаю, что это абсолютно среди более сложные темы мы смотрели на. Но это одним из самых мощных. И когда вы получите его, это действительно все просто хочу, чтобы, наконец, прийти вместе. Так будьте уверены, это не нужно всего раковиной в сегодняшний день. Так вот последняя программа мы будем смотреть на. И мы собираемся, чтобы закончить с быстрые три минуты claymation сделал наш друг, Ник Parlante. Вот программа, что на двух верхних Линии объявляет переменную х и у. Оба из которых являются адреса целых чисел, AKA указатели. Мы тогда выделить достаточно память для хранения Int и сохранять адрес этой памяти в х. Таким образом, это еще проще Например, чем раньше. Дайте мне четыре байта памяти, это размер из Int, и поставить этот адрес в х. Эта линия означает здесь перейти по адресу в х и поставить значение жизнь, число 42 есть. Но эта линия меня беспокоит. Звезда у средства идут на адрес в у, и поставить там несчастливое число 13. Почему это опасно, в этой точке в story-- хотя быстро сказал в наших ослабевает минут here-- почему это плохо для меня, чтобы сказать, перейти по адресу в г.? АУДИТОРИЯ: Вы не [неразборчиво]. Дэвид Дж Малан: Я не положить что-нибудь в у. Так что значение у, на данный момент в этой истории? Мы не имеем ни малейшего понятия. Это некоторое значение мусора и также не Бинки знаю. Если бы мы могли закончить на этой ноте. [ПРОИГРЫВАНИЕ ВИДЕО] Эй, Бинки, проснуться. Это время для указателя удовольствия. -Что это? Узнайте о указателей? О, положительный герой. -Ну, Для начала, я думаю, мы понадобится пару указателей. -ХОРОШО. Этот код выделяет два указателя которые могут указывать на целых чисел. -Хорошо, Хорошо, я вижу два указателя, но они не кажется, указывая на что-нибудь. -Это верно. Первоначально указатели не указывает ни на что. Вещи, которые они указывают на это называется pointees и установка их отдельный шаг. Ох, верно, верно. Я знал это. В pointees отдельно. Итак, как вы выделить pointee? -Хорошо, А этот код выделяет новая число pointee, и эта часть комплекта х, чтобы указать на него. Эй, что выглядит лучше. Так что это что-то делать. -Хорошо, Я буду разыменования указателя х до сохранить номер 42 в его pointee. Для этого трюка, мне нужно мое Волшебная палочка разыменования. -Ваш Волшебная палочка разыменования? Э-э, что это здорово. -Это То, что код выглядит. Я просто установить количество и-- [POP SOUND] Эй, посмотрите там идет. Так, делая разыменования на х следующим стрелка, чтобы получить доступ к его pointee. В этом случае для хранения 42 там. Эй, попробуйте использовать его, чтобы сохранить номер 13 через другой указатель, у. -ХОРОШО. Я просто пойду сюда, чтобы у, и получить номер 13 Настройка. А потом взять палочку разыменования и просто-- [Звуковой сигнал] Ох, эй, что не работает. Скажите, ну, Бинки, я не думаю разыменования у это хорошая идея, потому что установка вверх по pointee отдельный шаг. И я не думаю, что мы когда-либо делали это. -Hmm, Хороший момент. -Да, Мы выделили указатель, у, но мы никогда не ставили его, чтобы указать на pointee. -Hmm, Очень наблюдательны. Эй, вы ищете там хорошо, Бинки. Вы можете это исправить, так что у точки к тому же, как pointee х. -Конечно, Я использую свой волшебную палочку присвоения указателя. -Это Будет Проблема, как и раньше? Нет, это не касается pointees. Это просто меняет один указатель чтобы указать на то же самое thing-- [Хлопком] --as другой. -О, я вижу. Теперь у указывает на то же место, что и х. Так, подождите, сейчас у фиксировано. Он имеет pointee. Таким образом, вы можете попробовать палочку разыменования снова отправить 13 в течение. Ох, хорошо, здесь идет. Эй, посмотри на это. Теперь разыменования работ по у. И потому, что указатели делятся что одной pointee, они оба увидеть 13. -Да, Обмен, э-э, что угодно. Так, мы собираемся, чтобы поменяться местами сейчас? -Ой, Смотрите, мы вне времени. -Но-- -Просто Помните три правила указатель. Количество 1, базовая структура является то, что у вас есть указатель, и указывает на более pointee. Но указатель и pointee отдельно. И общая ошибка является создание указатель но забудьте дать ему pointee. Номер 2, указатель разыменования начинается с указателем и следует его стрелку над чтобы получить доступ к его pointee. Как мы все знаем, это работает только, если есть является pointee, какой вид получает обратно править номер 1. Номер 3, указатель присваивание одного указателя и изменяет его, чтобы указать на же, как pointee другой указатель. Таким образом, после задания, два указатели будет указывать на тот же pointee, иногда, что называется совместное. И это все, что есть в нем, на самом деле. До свидания в настоящее время. [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: Вот это для CS50. Благодаря профессору Ник Parlante. Мы будем видеть Вас на следующей неделе. [Электронный воспроизведения музыки]