DAVID МАЛАН: Хорошо, с возвращением. Это CS50. Это начало недели семь. Так что это было некоторое время, так что я думал, что мы принять беглый тур, где мы остановились и где мы теперь собираемся. Так что эта вещь здесь, возможно, придется вызвало некоторую тоску на первый взгляд. Но, надеюсь, вы начинаете акклиматизироваться к тому, что это обозначает здесь - звезда представляющий указатель, который только то, что, с точки зрения более непрофессионала? Так что это адрес. Так что это адрес что-то в памяти. И мы начали отогните слоев Пару недель назад, и тому подобное GetString и других подобных функций Все это время возвращались Адреса вещи в памяти, как и адрес первого символа в некоторой последовательности. Таким образом, мы также ввели Valgrind, которая Вы начнете использовать для этой проблемы установлена, в частности, для следующего Проблема также установлен. И Valgrind и что делает для нас? При этом проверка на утечки памяти, и это также проверяет злоупотребления памяти. Он может, с некоторой вероятностью, обнаружить, если код будет касаться памяти что это просто не нужно. Так что не обязательно утечки, но если вы выходят за пределы некоторого массиве, а как вы выполните VALGRIND и вызывают такое поведение в то время как Valgrind работает в вашей программе работает внутри него, вы получите сообщения, как это - "Неверная писать о размером 4 ", который, напомним пару недель назад означало, что я случайно как на одного десятичного слишком далеко за пределами массива. И таким размером 4 означает здесь размер этого конкретного внутр. Так примите заверения в том, что valgrind есть выход, формат его, просто зверским. Это действительно трудно понять, через беспорядок за интересную информацию. Итак, что мы сделали здесь просто отрывок некоторые из пары более интересные строки. Но понимаю, что 80% valgrind есть Выход будет немного отвлечение. Просто ищите модели, как эти - недействительным права, недействительные читать, 40 байт и некоторое количество блоков определенно потерян, ключевые слова, как, что. И то, что вы, мы надеемся увидеть некоторое вида следов, какие функции ошибка на самом деле дюйма В этом случае здесь, в том, что линия мой код ошибки по-видимому? 26 в файле с именем memory.c, который был Например, мы играли с в то время. Так что это, вероятно, не в Malloc. Это было, вероятно, в своем коде вместо этого. Таким образом, мы увидим это снова и снова в ближайшее время. Так SCANF, это произошло в Пару формы до сих пор. Мы видели Sscanf кратко. Это было что-то рядом Вы нырнули в вашей подготовка к викторине. И SCANF на самом деле то, что CS50 Библиотеки используют под капот в течение достаточно долгого времени для того, для получения данных от пользователя. Например, если я перееду к CS50 Прибор здесь, позвольте мне открыть Например сегодня, что называется SCANF-0.c И это супер просто. Это всего лишь несколько строк кода. Но это показывает, действительно, как GetInt работал все это время. В этой программе, в строке 16 Обратите внимание, что я заявляю Int. Так что никаких указателей, ничего магического там, просто Int. Затем в строке 17, я предложит пользователя число, пожалуйста. Затем, в конце 18, я использую SCANF здесь. И я указал, вроде как Е, что я ожидаю цитатой конец цитаты процентов я. Так процентов я, конечно, обозначает Int. Но обратите внимание на то, что второй Аргумент SCANF есть. Как бы вы описали второй Аргумент после запятой? Что это? Это адрес х. Так что это полезно, потому что, предоставляя SCANF с адресом х, то, что делает , которые позволяют этой функции делать? Не просто идут туда, но и делать то, что? Внести изменения в нем. Потому что вы можете пойти туда, это своего рода как карта к местоположению в памяти. И до тех пор, пока вы предоставляете SCANF или любую функцию с такой карты, которые Функция может пойти туда, и не только посмотрите значение, но он также может изменить это значение, которое является полезным, если Цель в жизни является SCANF сканировать входные данные от пользователя, в частности с клавиатуры. И F обозначает отформатированных, так же, как Е, F обозначает отформатированных Строка, которую необходимо распечатать. Короче говоря, эта линия 18 просто говорит: попробуйте прочитать Целочисленное от пользователя клавиатуры, и сохраняет его внутри х, в любой адрес, х, оказывается, живет в. А потом, наконец, строка 19 просто говорит, спасибо за Интернешнл, в этом случае. Итак, позвольте мне пойти дальше и сделать это. Поэтому убедитесь, SCANF 0. Позвольте мне идти вперед и увеличения масштаба Я пойду и выполнить это с точками слэш SCANF 0. Номер, пожалуйста? 50. Спасибо за 50. Так что это довольно просто. Теперь то, что он не делает? Это не делает целый букет проверки ошибок. Например, если я не буду сотрудничать, и я не вводить номер, но вместо этого я написать что-то вроде "привет", это просто странно. И вот одна из вещей, CS50 библиотека была для нас делать для некоторых времени является то, что reprompting и reprompting. Повторить фразу отзыве в cs50.c, и это причина того, что в GetInt библиотеки CS50 фактически весь куча строк, потому что мы проверка на глупые вещи, как это. Же пользователь не дают нам, по сути, Целочисленное? Он или она дать нам что-то подобное алфавитному письмо? Если это так, мы хотим, чтобы обнаружить , что и кричать на них. Но все становится более интересным В следующем примере. Если я пойду в SCANF-1с, то, что одна вещь, которая коренным образом изменила в Следующий пример? Я использую символ *, конечно, вместо Int. Так что это интересно, потому что символ *, Напомним, что на самом деле просто То же самое в виде строки. Таким образом, похоже, может быть, это супер Простая реализация GetString. Но я отогнул слоя CS50 из библиотеки, так что я вызове этого символ * сейчас. Итак, давайте посмотрим, где, если угодно, мы делаем неправильно. Строка 17 - Я еще раз говорю, пожалуйста, дайте мне что-нибудь, В этом случае, строка. И тогда в следующей строке, я называю SCANF, снова, придав ему формат кода, но эта пора процентов. И то на этот раз, я придав ему буфера. А теперь обратите внимание, что я не использую амперсанд. Но почему в том, что здесь, вероятно, хорошо? Ведь что такое буфер уже? Это уже указатель. Уже адресу. И давайте это слово "путают", позвольте мне назвать его просто с, например, для простота. Но я назвал его потому, что в буфер Вообще, в программировании, если у вас есть часть памяти, которая действительно строку просто есть, вы могли бы назвать это буфер. Это место для хранения информации. Похожие вещи, как YouTube, когда они буфер, поэтому говорить, что просто означает, что он загрузкой битов из Интернет и сохраняя их в Локальный массив, местный кусок памяти, так что вы можете смотреть их без это пропуск или висит на Вы во время воспроизведения. Так что проблема здесь, хотя, , потому что я говорю SCANF, ожидают строки от пользователя. Вот адрес кусок памяти. Поместите эту строку там. Почему это связанное дать нам неприятности, правда? Что это? Могу ли я получить доступ к что часть памяти? Вы знаете, я не знаю. Т.к. обладает буфером инициализирован к чему? Не совсем так. И так это то, что мы называем мусора значение, которое не является официальным словом. Это просто означает, что мы понятия не имею, какие биты внутри из четырех байт, которые Я выделил в качестве буфера. Я не называется Malloc. Я определенно не называется GetString. Так что кто знает, что на самом деле внутри буфера? И все же говорить SCANF вслепую, туда и положить все, что ввел пользователь. Так что, вероятно, вызовет в нашем коде, если мы его запустить? Наверное сегментации. Может и нет, но, вероятно, сегментации. И я говорю, может быть, не потому, что иногда Вы делаете, иногда Вы не получаете сегментации. Иногда вам просто везет, но это тем не менее будет ошибка в нашей программе. Итак, позвольте мне идти вперед и составить этот. Я собираюсь сделать это по-старому школе. Так лязгом тире 0, SCANF-1, SCANF-1с, Enter. Упс, слишком старой школы. Давайте посмотрим. Где я? О, символ * буфера. О, спасибо - Сохранить, OK - очень старая школа. Ладно, это было в то время. Так что я только что сохраненный файл после делает, что временные изменить минуту назад. А теперь я собрал это вручную с помощью Clang. И теперь я собираюсь идти вперед и запустить SCANF-1, Enter. Струнный пожалуйста. Я наберите "привет". А теперь, вот где, честно говоря, Е может немного раздражать. Это на самом деле не собирается сегментации в этом случае. Printf стоит несколько особняком, потому что это так супер широко используется, что существенно Е делает нам одолжение и реализации, это не действительный указатель. Позвольте мне взять это на себя, чтобы просто распечатать в нулевые скобки, даже хотя это и не обязательно, что мы сами ожидали. Поэтому мы не можем действительно легко вызвать сегментации с этим, но очевидно, что это не поведение я хотел. Так в чем же простое решение? Ну, а в SCANF-2, позвольте мне предложить, что а на самом деле просто выделение символ *, позвольте мне быть немного умнее, о это, и позвольте мне выделить буфер как последовательность из 16 символов. Так что я могу сделать это в несколько способов. Я мог бы использовать абсолютно Malloc. Но я могу вернуться в неделю два, когда Мне просто нужно было целый букет символов. Вот только массив. Итак, позвольте мне вместо переопределить буфер быть массивом из 16 символов. И теперь, когда я прохожу в буфер - и это то, что мы не сделали говорить в неделю два - но вы можете рассматривать массив как хотя это адреса. Технически, как мы видели, они немного по-другому. Но SCANF не будет возражать, если вы передаете его имя массива, потому что то, Clang сделает для нас по существу лечить имя этого массива в качестве адрес блока 16 байт. Так что это лучше. Это означает, что теперь, когда я могу, мы надеемся, выполнить следующее. Позвольте мне уменьшить масштаб на мгновение и делают SCANF-2, составленный в порядке. Сейчас сделаю получил слэш SCANF-2. Струнный пожалуйста. "Hello". И это казалось, работали в этот раз. Но кто-то может предложить сценарий , в котором он не может все еще работает? Да? Что-то длиннее 16 символов. А на самом деле, мы можем быть немного более точным. Что-то дольше, чем 15 символов, потому что действительно мы должны иметь в виду, что нам нужно, что обратная косая черта нуля неявно в конце строки, которая в стороне, как правило, SCANF заботиться о нас. Итак, позвольте мне сделать нечто подобное - Иногда мы можем только оставить все как есть, что. Итак, мы теперь индуцированных наши ошибки сегментации. Почему? Потому что я набрал в более чем 15 символов, и так мы фактически коснулся памяти, что я на самом деле не должен был. Так что на самом деле решение здесь? Ну, а что если нам нужно более длинную строку? Ну, мы, возможно, сделать это 32 байт. Ну, а если это не достаточно долго? Как насчет 64 байт? Что делать, если это не достаточно долго? Как насчет 128 или 200 байт? То, что действительно есть решение здесь, в общем случае, если мы не знаем, в продвигать то, что пользователь собирается печатать? Это просто какая-то большая боль в заднице, честно говоря, именно поэтому CS50 библиотеке имеется несколько десятков строк кода, которые в совокупности реализуют GetString строку таким образом, что мы не должны знать заранее, что пользователь собирается ввести. В частности, если вы посмотрите на cs50.c от двух недель назад, вы увидите, , что на самом деле делает GetString Не используйте SCANF таким образом. Скорее, он читает один символ за один раз. Потому что тот, хорошая вещь о чтение одного символа, мы можем гарантировать себе всегда иметь по крайней мере один символ. Я могу просто объявить символ, а затем принять эти поистине шаги ребенка просто читать один символ в время от клавиатуры. И потом, что вы увидите GetString делает это каждый раз, когда заканчивается, скажем, 16 байт памяти, она использует Malloc, или двоюродный брат его, чтоб выделить больше памяти, копирование старых памяти в новых, а затем ползком вдоль, получая один символ за один раз, и когда оно заканчивается, что кусок памяти, выбрасывает его, захваты больший кусок памяти, копирует старые в новые и повторяет. И это действительно боль на самом деле реализовать что-то же просто, как получение данных от пользователя. Таким образом, вы можете использовать SCANF. Вы можете использовать другие аналогичные функции. И много учебников и онлайн примеры делают, но они все уязвимы к проблемам, как эта. И в конечном счете, получить сегментации вид раздражает. Это не хорошо для пользователя. Но в худшем случае, то, что делает это принципиально положить ваши код риску? Своего рода атаки, потенциально. Мы говорили об одной из таких атак - переполнение стека. Но в целом, если вы имеете на это право Переполнение буфера, как мы сделали Пару недель назад, только с письменной больше, чем "привет" в стеке, вы действительно может взять на себя, потенциально, компьютер, или, по крайней мере, получить данные, которые в не принадлежит вам. Короче говоря, именно поэтому у нас есть этих учебных колес. Но теперь, мы начинаем снимать их, как наши программы больше не нужна, обязательно, ввод от пользователя. Но в случае возникновения проблем установить шесть, ваш вклад будет поступать из огромного файл словаря с некоторыми 150 лишним тысяч слов. Так что вам не придется беспокоиться о произвольного пользователя ввода. Мы дадим вам некоторые предположения об этом файле. Любые вопросы по указателям или SCANF или ввода данных пользователем в целом? Ладно, быстрый взгляд то на одного задняя темы от двух недель назад. И это было это понятие структуры. Не то, что - это понятие Построим, которое было что? Что структуры сделать для нас? Определить - извините? Определить тип переменной. Так вроде. Мы на самом деле объединения двух темах. Так что с ЬурейеЕ, вспомним, что мы можем объявить типа нашей, как и синоним, как и строку для символ *. Но использование ЬурейеЕ и структуры, мы можем создать действительно наши собственные структуры данных. Например, если я вернусь в Gedit здесь всего мгновение, и я иду вперед и сделать что-то подобное, позвольте мне сохранить это как, скажем, structs.c временно, я просто хочу, идти вперед и включают standardio.h, тап_п недействительными. А потом здесь, предположим, что я хочу написать программу, которая хранит несколько студентов из нескольких дома, например. Так что это как registrarial данных какой-то. Так что, если мне нужно название одного студента, я может сделать что-то вроде символа имя *, и я сделаю что-то вроде - На самом деле, мы будем использовать CS50 библиотеке на мгновение, чтобы сделать это немного проще, так что мы можем заимствовать тех десятков строк кода. И давайте просто держать его проста. Мы будем держать это строка, и теперь GetString. Поэтому я утверждаю, теперь, когда я хранится название некоторых студентов, и дом какой-нибудь студент, просто с помощью переменных как мы делали и в неделю один. Но предположим, что я теперь хочу поддержать несколько студентов. Ладно, так что мои инстинкты делать Строка name2, получает GetString, строка Дом2 получает GetString. А потом наш третий студент, давайте сделаем name3 GetString. Ладно, так что это, мы надеемся, поразительно Вы как вида глупо, потому что этот процесс не будет действительно никогда кончится, и он просто будет сделать мой код выглядит хуже и все хуже и хуже. Но мы решили это тоже в неделю два. Что представляла из себя относительно чистым решением когда у нас было несколько переменных тот же тип данных, которые все связаны, но мы не хотели этого жестокого беспорядок из одноименных переменных? Что мы сделали, а? Так что я думаю, что я услышал, что несколько мест. У нас было множество. Если вы хотите несколько экземпляров что-то, почему бы нам не очистить это все и просто сказать, дайте мне Массив обзывали? А пока, давайте жесткий 3 кода. А потом дать мне еще один массив называемые дома, и пусть меня Теперь жесткий код 3. И я массово очищены беспорядок, что я только что создали. Теперь, я по-прежнему жестко 3, но даже 3 может динамически исходить от пользователя, или агду или тому подобное. Так что это уже чище. Но то, что раздражает в этом то, что Теперь, даже если зовут как-то принципиально связано с студенческий дом - это студент, что я действительно хотим представить - Теперь у меня есть два массива, которые параллельны В том смысле, что они одинаковый размер, и имена кронштейн 0 Предположительно карт для дома кронштейн 0, имена и кронштейном 1 карт Кронштейн в дома 1. Другими словами, что студент живет в этот дом, то, что другой студент жизнь в этом другом доме. Но, конечно, это может быть сделали еще более чисто. Ну, может, на самом деле. И позвольте мне идти вперед и открыть до structs.h, и Вы будете см. эту идею здесь. Обратите внимание, что я использовал, объявление типа, как вы ссылался на момент назад, чтобы заявить о своей собственный тип данных. Но я также использую эту другому ключевому слову называется структура, которая дает мне новое Структура данных. И эта структура данных я утверждаю, что происходит иметь две вещи внутри это - строка называется имя и Строка называется домом. И имя я собираюсь дать эта структура данных будет называться учеником. Я мог бы назвать это все, что захочу, но это делает семантически смысл для меня в моем сознании. Так что теперь, если я открываю лучшую версию программы я начал писать там, позвольте мне перейти к вершине. И есть еще несколько строк кода здесь, но позвольте мне остановиться на момент на один. Я объявил постоянный называемых студентов и жестко 3 на данный момент. Но теперь, обратите внимание, как чистый мой код начинает получать. В строке 22 я заявляю Массив студентов. И заметьте, что студент по-видимому Теперь тип данных. Потому что в верхней части этого файла, заметит Я включил этот заголовок файла что я остановился на минуту назад. , А этот заголовок файла просто-напросто было это определение студента. Так что теперь, я создал мои собственные пользовательские данные Тип что авторы лет C назад не думали заранее. Но не проблема. Я могу сделать это сам. Так что это массив с именем студентов, каждый из членов которой является студентом структуры. И я хочу, три из них в массиве. И сейчас, что сделает все остальное этой программы делать? Мне нужно что-то немного произвольным. Так что с онлайн 24 годов, Я итерации от 0 до 3. Я тогда спрашиваю у пользователя Имя и фамилия учащегося. А затем использую GetString, как раньше. Тогда я спрашиваю для дома студента, и я использую GetString, как раньше. Но обратите внимание - несколько новых часть синтаксиса - Я до сих пор индекс к I-го студента, но как я могу получить на конкретных данных поле внутри структуры? Ну, что по-видимому новая часть синтаксиса? Это просто точка оператора. Мы на самом деле не видел этого раньше. Вы видели это в PSET пять, если у вас есть нырнул в уже и графических файлов. Но просто означает, что точка внутри этого структуры или несколько полей, дать точку имя, или дайте мне точку дома. Это означает, что ты внутри структуры и получить эти конкретных областях. Что делает остальную часть этой программы делать? Это еще не все, что сексуально. Заметьте, что я итерации от 0 до 3 раз, и я просто создаю английском фраза типа так и так находится в таком и такой дом, переходя в точку название от I-го студента и их дома, а также. А потом, наконец, теперь мы начнем, чтобы получить Анальный об этом, теперь, когда мы знакомы с тем, что и Malloc другие функции были делал все это время. Почему я должен освободить оба названия и дома, хотя я не звонил Malloc? GetString сделал. И это был маленький грязный секрет для несколько недель, но GetString имеет была утечка памяти во всем разместить весь семестр до сих пор. И, наконец, valgrand показать это нам. Но это не имеет большого значения, потому что я знаю что я могу просто освободить имя и дом, хотя технически, чтобы быть супер, супер безопасный, я должен быть делают некоторые здесь ошибки. Каковы ваши инстинкты говорю? Что я должен для проверки прежде чем я бесплатно Что является Строка, которая ака символ *? Я должен действительно быть проверка, если студенты Кронштейн я точка имя не равным нулю. Тогда все будет в порядке, чтобы идти вперед и бесплатно что указатель, и то же или другое , а также. Если студенты кронштейн я точка дом не равна нулю, это теперь будет защищать по отношению к углу случай, в котором GetString возвращает что-то вроде нулевой. И мы увидели минуту назад, Е будет защитить нас здесь, просто говоря пустое значение, что будет выглядеть странно. Но по крайней мере не будут падать, как мы уже видели. Ну, позвольте мне сделать еще одну вещь здесь. структур-0 это своего рода глупые программы , потому что я все это ввести данные, а затем он потерял, когда программа заканчивается. Но позвольте мне идти вперед и делать это. Позвольте мне сделать терминал окна немного больше. Позвольте мне сделать структур-1, который это новая версия этого. Я увеличить немного. А теперь позвольте мне работать точка слэш структур-1. Имя и фамилия учащегося - Дэвид Mather, давайте сделаем Роб Kirkland, давайте сделаем Левереттом Лорен. Что интересно, теперь уведомления - и я знаю, что это только потому, что Я написал программу - есть файл теперь на моем текущем каталог с именем students.csv. Некоторые из вас, возможно, видели это в реальном мире. Что такое файл CSV? Значений, разделенных запятыми. Это вроде как бедного человека версия файла Excel. Это таблица строк и столбцов, Вы можете открыть в программу, как Excel, или цифры на Mac. И если я открываю этот файл здесь на Gedit, уведомление - а цифры там нет. Вот только говорить GEdit мне номера строк. Обратите внимание, на первой линии этого Файл Давида и Mather. Следующая строка Rob Kirkland запятой. И третья линия Лорен Левереттом запятой. Так что же я создал? Я теперь написано-программу, которая эффективно может генерировать таблицы которые могут быть открыты в программы, как Excel. Не все, что убедительным набором данных, но если у вас есть много больших кусков данные, которые вы действительно хотите манипулировать и делать графики и нравится, это, пожалуй, один способ создания этих данных. Кроме того, CSV, на самом деле супер общие просто для хранения простых данных - Yahoo Finance, например, если вы получаете котировки акций с помощью своих так называемых API, бесплатный сервис, который позволяет получить ток до-к-дата акции котировки компаний, они дать данные обратно в супер простой формат CSV. Так как же мы это сделаем? Хорошо заметить, большая часть этой программы почти то же самое. Но обратите внимание, здесь, внизу, а не для печати студентов, операции по линии 35 и далее, я утверждаю, что я экономлю студентов на диск, так что сохранение файла. Так заметить я объявляю файл * - Теперь, это вид аномалии в C. По какой-то причине, то файл будет заглавными буквами, который не похож на большинство других типов данных в C. Но это встроенный Тип данных, файл *. И я объявляю указатель на файл, как вы можете думать об этом. FOPEN означает открытый файл. Какую файловую вы хотите открыть? Я хочу открыть файл, который я буду Условно назовем students.csv. Я могу позвонить, что все, что захочу. А потом сделать предположение. Что означает второй аргумент к FOPEN, вероятно, означает? Право, W для записи, может быть R для чтения. Там есть для добавления, если вы хотите добавить строки, а не переписать все это. Но я просто хочу создать этот файл один раз, поэтому я буду использовать в кавычках Вт. И я знаю, что только прочитав документации, или справочные страницы. Если файл не является нулевым, - другими словами, если ничего не пошло не так там - Позвольте мне перебора студентов от 0 до 3. А теперь обратите внимание, есть что-то очень немного разный о линии 41 здесь. Это не Е. Это Fprintf Е для файла. Так это будет запись в файл. Какой файл? Один, указатель указать В качестве первого аргумента. Затем мы указываем строку формата. Затем мы определяем, какие строки мы хотим плагин для первого с процентов, а затем другой переменной или второй с процентов. Тогда мы закрываем файл с FCLOSE. Чем я освободить память, как и раньше, хотя Я должен вернуться и добавить некоторые проверки для нулевых. И это все. FOPEN, Fprintf, FCLOSE дает мне возможность создавать текстовые файлы. Теперь, вы увидите в Архив задач пять, который включает в себя изображения, которые вы будете использовать двоичные файлы вместо этого. Но важно то, что идея та же, , хотя эти функции вы будете видите, немного по-другому. Так ураганный тур, но вы получите слишком хорошо знакомы с файла I/O-- входные и выходные - с PSET пять. И все вопросы о начальные основы здесь? Да? Что, если вы попытаетесь освободить нулевое значение? Я считаю, если бесплатно не получила немного более удобным для пользователей, вы можете потенциально сегментация. Передача его недействительным плохо, потому что я не верю бесплатно мешает проверить для вас, потому что это потенциально может быть пустой тратой времени для того, чтобы сделать для себя каждый человек в мире. Хороший вопрос, однако. Хорошо, поэтому этот вид получает нам интересную тему. Темой проблемой набора пять является криминалистика. По крайней мере, часть проблемы набора. Криминалистика в целом относится к восстановление информации, которые могут или не может быть удален намеренно. И поэтому я думал, что дам вам быстрый вкус того, что происходит на самом деле все на этот раз под капотом вашего компьютера. Например, если у вас есть внутри вашего ноутбуке или настольном компьютере жесткий диск, это либо механическими устройство, которое на самом деле спины - есть, что называется круговой пластины , которые выглядят совсем как то, что я только что был на экране здесь, хотя это более старой школы. Это три с половиной дюйма жесткого диска. И три с половиной дюйма относится из с этой вещи, когда вы установите его в компьютере. Многие из вас, ребята, в ваших ноутбуков сейчас есть твердотельные накопители или твердотельные накопители, которые не имеют движущихся частей. Они больше похожи на ОЗУ, а не как эти механические устройства. Но идеи все те же, конечно же, как они относятся на вопрос, поставленный пять. И если вы думаете о теперь жесткий диск представляет будучи круг, который Я нарисую вот так вот. Когда вы создаете файл на вашем компьютере, будь то SSD или в этом случае старший школьный жестком диске, этот файл содержит несколько битов. Давайте предположим, что это это 0 и 1, целый букет из 0 и 1. Так что это мой весь жесткий диск. Это, очевидно, довольно большой файл. И он использует до 0 и 1, что на часть физического пластины. Ну, что же, что физическая часть? Ну, получается, что на жестком диске, по крайней мере такого типа, есть эти маленькие магнитные частицы. И они по сути есть север и южный полюса к ним, так что, если вы свою очередь, один из тех магнитных частиц Таким образом, можно сказать, что это представляющих 1. И если это вверх ногами на юг к Север, вы могли бы сказать, что это представляющие 0. Таким образом, в реальном физическом мире, это как вы могли бы представлять собой нечто в двоичный состояния 0 и 1. Так что все файл. Там целая куча магнитного частицы, которые их так или Таким образом, создание модели 0 и 1. Но, оказывается, когда вы сохраняете файл, некоторая информация сохраняется отдельно. Таким образом, это столик, каталог, так сказать. И я называю это имя столбца, а Я назову эту колонку месте. И я собираюсь сказать, предположим, это мое резюме. Мой resume.doc хранится при месте, скажем, 123. Я всегда иду на это число. Но достаточно сказать, что, как и в оперативной памяти, вы можете взять жесткий диск вот гигабайт или 200 гигабайтов и терабайт, и вы можете число все байты. Вы можете пронумеровать все куски 8 бит. Поэтому мы будем говорить, что это 123, является расположение. Так что этот каталог внутри моей операционной Система помнит, что моя Резюме находится в местоположении 123. Но самое интересное, когда Вы удаляете файл. Так, например - и, к счастью, большинство стран мира имеет поймали на этом - что происходит, когда вы перетащите файл в ваш мусор Mac OS или ваш Windows корзины? Какая цель делать это? Это, очевидно, чтобы избавиться от файлов, но то, что делает акт перемещении и падения в ваш мусор или ваш Корзины делать на компьютере? Совершенно ничего, на самом деле. Это просто, как папки. Это особая папка, чтобы быть уверенным. Но так ли это на самом деле удалить файл? Ну, нет, потому что некоторые из вас, наверное был похож, ой блин, вы этого не сделали хотел этого делать. Таким образом, вы дважды щелкните Trash или корзины. Вы ткнули вокруг, и вы выздоровели файл, просто перетащив его оттуда. Итак, ясно, что это не обязательно удалением. Хорошо, что ты умнее. Вы знаете, что просто перетащить его в Корзины или корзины не означает Вы очистке корзины. Так вы идете до меня, а вы говорите Очистить корзину или пустой корзины. Тогда что происходит? Да, так оно удаляется больше. Но все, что происходит это. Компьютер забывает, где resume.doc было. Но то, что не изменилось по-видимому на картинке? Бит, 0 и 1, что я утверждаю, являются На территории некоторых физический аспект аппаратных средств. Они все еще там. Это просто компьютер забыл, что они есть. Так что это по сути освободил файла Биты так что они могут быть использованы повторно. Но не раньше, вы создаете несколько файлов, и более файлов и многое другое файлы вероятностно, те, 0 и 1, эти магнитные частицы, используются повторно, вверх или правой стороной вверх, для другие файлы, 0 и 1. Так что у вас есть этот промежуток времени. И это не предсказуемых Длина, на самом деле. Это зависит от размера жесткого диск и сколько файлов у вас есть и как быстро вы сделать новые. Но есть окно времени, в течение который, что файл все еще прекрасно возмещена. Так что если вы когда-либо использовать программы, как McAfee или Нортон, чтобы попытаться восстановить данным, все они делают пытается восстановить эту так называемую каталог выяснить, где твой файл был. А иногда Нортон и скажет: Файл 93% извлекаемых. Ну, что же это значит? Это просто означает, что некоторый другой файл случайно закончил с использованием, скажем, эти биты из исходного файла. Так что же на самом деле участвует в восстановлении данных? Ну, если у вас нет что-то вроде Нортон предварительно установленной на Вашем компьютере, Лучшее, что можно иногда сделать, это посмотреть на весь жесткий диск ищет последовательности битов. И одна из тем проблема набора пять в том, что вы будете искать аналог жесткого диска, судебно образ компактного флэш-карту от цифровая камера, поиск 0s и 1, которые обычно с высокой вероятности, представляют начало изображения JPEG. И вы, ребята, можете восстановить эти образы на при условии, если я вижу эту модель биты на судебно изображения, с высокая вероятность, что знаменует начала JPEG. И если я вижу, по той же схеме снова, что, вероятно, знаменует собой начало другой JPEG, а другой JPEG, а другой в формате JPEG. И это, как правило, как восстановление данных работает. То, что хорошо о формате JPEG является хотя формат файла сам несколько комплекс, в начале каждого такого файл на самом деле довольно идентифицируемых и простой, как вы увидите, если у вас не сделали. Итак, давайте взглянем под капот как точно, что было происходит, и то, что эти 0 и 1 есть, чтобы дать вам немного больше контекст для этого конкретного вызов. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -Где Ваш компьютер хранит самые его постоянных данных. Чтобы сделать это, данные перемещаются из оперативной памяти вместе с программным обеспечением сигналы, которые говорят жесткого диска, как хранить эти данные. Жесткий диск Перевести схем этих сигналов в напряжение колебаниям. Эти, в свою очередь, контролируют жесткого диска движущихся частей, некоторые из нескольких движущихся частей, оставшихся в современного компьютера. Некоторые из сигналов управления двигателем который вращает металлическим покрытием пластин. Ваши данные на самом деле хранятся на этих пластинах. Другие сигналы перемещения чтения / записи головы, чтобы читать или записи данных на пластинах. Этот механизм настолько точны, что человека Волосы не мог даже пройти между руководители и спиннинг пластин. Тем не менее, все это работает на потрясающей скорости. [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID МАЛАН: небольшое увеличение глубокое теперь на то, что это на самом деле на этих пластинах. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -Давайте посмотрим на то, что мы просто видела в замедленном темпе. Когда короткого импульса электричества направляется в головку чтения / записи, если переворачивается на крошечном для электромагнитных доли секунды. Магнит создает поле, которое изменения полярности крошечный, крошечный часть металлических частиц, которые покрыть каждую поверхность пластин. Модель серия этих крошечных, взимается территорий на диске представляет собой один бит Данные в двоичное число Система, используемая на компьютерах. Теперь, если ток направляется в одну сторону через головки чтения / записи, площадь поляризован в одном направлении. Если текущее отправляется в противоположном направлении поляризация меняется на противоположную. Как вы получаете данные с жесткого диска? Просто повернуть процесс вспять. Так что это частицы на диске которые получают ток в головка чтения / записи движения. Все вместе эти миллионы намагниченных сегментов, а также у вас есть файл. Теперь, части одного файла может быть разбросаны по всему диску блюда, вроде как беспорядок бумаг на вашем столе. Таким образом, специальный дополнительный файл отслеживает о том, где что находится. Разве вы не хотели бы иметь что-то вроде этого? [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID МАЛАН: Хорошо, наверное, нет. Так как многие из вас, ребята рос с этим? ОК, так что это все меньше и меньше руки с каждым годом. Но я рад, что вы по крайней мере знакомы с ними, потому что это и наша собственная Книга демо, к сожалению, умирают очень медленную смерть здесь фамильярность. Но это то, что я, по крайней мере, еще в средней школы, использовал использование для резервного копирования. И это было удивительно, потому что вы может хранить 1,4 мегабайт на данный диск. И это было высокой плотности Версия, как указано в HD, который имеет это означает, прежде HD сегодняшнего видео. Стандартная плотность была 800 килобайт. А до этого, были 400 килобайт дисками. А до этого, было 5 и 1/4 дюймовые диски, которые были по-настоящему гибких, и немного шире и выше чем эти вещи здесь. Но вы можете увидеть так называемую дискеты аспект этих дисков. И функционально, они на самом деле очень похоже на жестких дисках в мере этого типа. Опять же, твердотельные диски в новых компьютерах работают несколько иначе. Но если вы перемещаете, что мало вкладку металл, вы можете увидеть немного печенья, или блюде. Это не металл, как этот. Этот на самом деле некоторые более дешевые пластикового материала. И вы можете вида шевелить его. И вы Trully просто стерт некоторых Число битов или магнитные частицы с этого диска. Так, к счастью, нет ничего на нем. Если эта вещь находится в пути - и охватывают Ваши глаза и те из ваших соседей - Вы можете только отчасти осуществить это целом от оболочки подобное. Но есть немного весны, так что будьте осознает, что своими глазами. Так что теперь у вас есть действительно дискету. И то, что об этой замечательной в том, что в той мере, что это мелкого представление большего жесткий диск, эти вещи супер, супер просто. Если вы щепотку дне его, теперь, что металлические вещи выключен, и кожица их открытыми, и все, что состоит из двух частей войлока и так называемый гибкий диск с куском металла на внутренней стороне. И там идет половина мой диск содержимое. Там идет другая половина из них. Но это все, что кружилась внутри вашего компьютера в прошлых. И опять же, чтобы поставить это в перспективе, насколько велика большинство ваших Жесткие диски в эти дни? 500 гигабайт, терабайт, может быть, в настольный компьютер, 2 Тб, 3 терабайт, 4 терабайта, верно? Это один мегабайт, плюс-минус, , которые не могут даже соответствовать типичным MP3 больше в эти дни, или некоторые Похожие музыкальные файлы. Таким образом, маленький сувенир для вас сегодня, и Также, чтобы помочь то, что контекст мы будем принимать как должное Сейчас в задачу, поставленную пять. Итак, это ваши. Итак, позвольте мне переход к которой будет провести следующие PSET также. Так что мы теперь установлена ​​для этой страницы - о, пару объявления быстро. В эту пятницу, если вы хотите присоединиться к CS50 на обед, перейдите на обычном месте, cs50.net/rsvp. И последний проект - так в программе, мы отправили окончательной спецификации проекта уже. Поймите, что это не значит, это из-за особенности в ближайшее время. Он отвечал, на самом деле, лишь бы получить вы, ребята, думал об этом. И действительно, супер значительные процент вы будете искать пути решения дипломные проекты на материале, который мы даже еще не в классе, но будет уже на следующей неделе. Заметьте, однако, что спецификация требует несколько различных компонентов окончательный проект. Во-первых, в течение нескольких недель, является предпроектные предложения, довольно случайный электронной почте Вашей TF сказать ему или то, что вы думать о для вашего проекта, с Нет обязательств. Предложение будет вашим обязательство, говоря, вот, это то, что Я хотел бы сделать для моего проекта. Что вы думаете? Слишком большой? Слишком маленький? Это управляемым? И вы видите, спецификации для более подробной информации. Пару недель после этого является статус доклад, который аналогичным образом случайный электронной почте своим TF сказать, насколько далеко позади Вы находитесь в своем окончательном реализации проекта, а затем CS50 Hackathon которому каждый предлагается, который будет событие из 8:00 вечера на одном вечера до 7:00 Утра следующего дня. Пицца, как я, возможно, упомянутые в неделю нулю, Виль быть подан в 9:00 вечера, Китайская еда в 1:00 утра. И если вы еще не спал в 5:00 утра, мы отвезем вас к IHOP на завтрак. Таким образом, Hackathon является одним из наиболее незабываемых впечатлений в классе. Затем осуществления объясняется тем, а Затем кульминационной CS50 ярмарка. Более подробную информацию о всех этих в ближайшие недели. Но давайте вернемся к тому, старой школы - снова, массив. Так массив был хорош, потому что решает проблемы, как мы видели, только Минуту назад со студенческими структурами становится немного из-под контроля, если мы хотят иметь одного студента, студент два, три студента, студент точка точка точка, некоторые произвольные числа студентов. Так массивы, несколько недель назад, напала и решил все наши проблемы не зная заранее, сколько вещей некоторого типа мы могли бы хотеть. И мы видели, что структуры могут помочь нам дальнейшей организации нашего кода и сохранить концептуально похоже переменных, таких как имя и дома, вместе, так что мы их можно рассматривать как единое целое, внутри которой имеются мелкие куски. Но массивы имеют некоторые недостатки. Каковы некоторые из недостатков мы столкнулись с массивами до сих пор? Что это? Фиксированный размер - так что даже если вы, возможно, сможет выделить память для Массив, как только вы знаете, сколько студентов у вас есть, сколько символов у вас есть от пользователя, как только вы выделили массиве, вы вид окрашены себя в угол. Потому что вы не можете вставить новые элементы в середину массива. Вы не можете вставить больше элементов в конце массива. Действительно, вы вынуждены прибегать к созданию совершенно новый массив, как мы уже обсуждали, копированием старого в новое. И опять же, это головная боль, которая GetString занимается для вас. Но опять же, вы не можете даже вставить что-то в середину массива Если ставка не полностью заполнена. Например, если этот массив здесь размеров шесть только пять вещей в нем, Ну, вы могли просто тактику то на конце. Но что, если вы хотите вставить что-то в середине массивом, хотя он может иметь пять из шести вещей в нем? Ну, что же мы делаем, когда мы были все наших человеческих добровольцев на сцене в недели прошлого? Если бы мы хотели поставить кого-то здесь, или эти люди, как двигаться этим Кстати, эти люди или как двигаться этим Кстати, и это стало дорогим. Перемещение людей внутри Массив закончилось тем, что добавил и стоимостью нам время, поэтому многие наши N квадрат время работы, как сортировка вставкой, для Например, в худшем случае. Так массивы являются большими, но вы должны заранее знать, как большой Вы хотите их. Так хорошо, вот решение. Если я не знаю заранее, сколько Я студентам могли иметь, и я знаю, как только Я решаю, хотя, я застрял с этим многие студенты, то почему бы мне просто не всегда выделить два раза больше места как я мог бы думаю, что нужно? Разве это не разумное решение? Реально, я не думаю, что мы понадобится более 50 слотов в массив для среднего класса, так что давайте просто округлить. Я сделаю 100 слотов в моем массиве, всего так что мы можем определенно получить количество студентов, которых я ожидал быть в некотором среднего класса. Так почему бы не окружить и выделить больше памяти, обычно, для массива чем вы думаете, вы могли бы даже нужно? Что это простое буксировки к этой идее? Вы просто тратите памяти. Буквально каждую программу вы пишете то , может быть, используете в два раза больше памяти, чем вам действительно нужно. И, что просто не хочется Особенно элегантное решение. Кроме того, он просто уменьшает Вероятность проблема. Если вам посчастливилось иметь популярный курс один семестр и у вас есть 101 студентов, ваша программа по-прежнему принципиально сталкивается с той же проблемой. Так к счастью, есть решение это объявление все наши проблемы в виде структур данных, которые более сложные, чем те мы видели до сих пор. Это, я утверждаю, является связанным списком. Это список чисел - 9, 17, 22, 26 и 34 - , которые были связаны друг с другом посредством о том, что я нарисовал, как стрелы. Другими словами, если бы я хотел, чтобы представлять массивом, что я мог сделать что-то вроде этого. И я положу это на накладные через минуту. Я мог бы сделать - привет, все в порядке. Оставайтесь на связи. Новый компьютер здесь, ясно - Все в порядке. Так что, если у меня есть эти числа в массиве - 9, 17, 22, 26, 24 - не обязательно в масштабе. Ладно, вот моя массива - Боже мой. Ладно, вот моя массива. О, мой бог. [Смеется] DAVID МАЛАН: притворяться. Это слишком много усилий, чтобы вернуться и исправить это, так что - 26. Так что у нас есть этот массив 9, 17, 22, 26 и 34. Для тех из вас может видеть досадное недоразумение я только что сделал, там это. Поэтому я утверждаю, что это очень эффективным решением. Я выделил столько как целые Мне нужно - раз, два, три, четыре, пять, или шесть - и я затем хранятся номера внутри этого массива. Но предположим, то, я хочу вставить значение как число 8? Ну, куда это идет? Предположим, я хочу, чтобы вставить число, например 20. Ну, куда это идет? Где-то там в середине, или число 35 должно пойти где-то в конце. Но я все из космоса. И таким образом, это является фундаментальной проблемой массивов, что делает это решение. Я утверждал, минуту назад, GetString решает эту проблему. Если Вы хотите вставить шестым номером В этот массив, то, что по крайней мере один решение, которое вы можете опереться наверняка, так же, как мы делаем с GetString? Что это? Ну, сделать его больше, тем легче сказать, чем сделать. Мы не можем обязательно делать массива больше, но что мы можем сделать? Сделать новый массив, который больше, размером 6, а может, размер 10, если мы хотим опередить вещи, а затем скопировать старого массива в новый, а затем освободить старого массива. Но то, что время работы Теперь этого процесса? Это большое О от N, так как копирование будет стоить вам несколько единиц времени, так что не так идеально, если мы должны выделить новый массив, который будет потреблять в два раза больше памяти временно. Скопируйте старые на новые - Я имею в виду, это просто головная боль, которая , опять же, почему мы написали GetString для вас. Так что мы могли бы сделать вместо этого? Ну, что, если наши структуры данных на самом деле имеет пробелы в нем? Предположим, что я расслабляюсь моей цели, имеющие непрерывные блоки памяти, где 9 находится рядом с 17, который рядом с 22, и так далее. И предположим, что 9 может быть здесь, в Оперативной памяти, и 17 может быть здесь, в оперативной памяти, и 22 может быть здесь, в оперативной памяти. Другими словами, я не нуждаюсь в них даже спина к спине больше. Мне просто нужно как-то нитку в иголку в каждом из этих цифр, или каждый из этих узлов, как мы будем называть прямоугольниками, как я нарисовал их, помню, как добраться до последнего такой узел от первого. Так в чем же конструкции программирования мы видели совсем недавно, с которой я можно реализовать, что нить, или сделанные здесь, с которой я могу осуществлять эти стрелки? Поэтому указатели, не так ли? Если бы я выделить не только Интеллект, но узел - и узел, я просто означать контейнере. И визуально, я имею в виду прямоугольник. Так узла видимо нужны содержать два значения - целочисленное себя, а потом, как это следует из нижнюю половину прямоугольника достаточно места для Int. Поэтому просто позаботиться об этом заранее здесь, насколько велик этот узел, это Контейнер идет речь? Сколько байт для целочисленное? Предположительно 4, если это так же, как обычно. А потом, сколько байт для указателя? 4. Так что этот контейнер или этот узел, является будет 8 байт структуры. О, и это счастливое совпадение, что мы точно также это понятие структура или структура C. Поэтому я утверждаю, что я хочу сделать шаг к этому более сложные реализация список номеров, связанный список номеров, мне нужно сделать немного больше мышление фронт и объявить не только Интеллект, но структура , что я позвоню, условно Здесь, узла. Мы могли бы назвать ее как угодно,, но узел будет тематическим во многих из вещей, мы начнем рассматривать сейчас. Внутри этого узла будет Int N. А потом этот синтаксис, немного странно на первый взгляд - Структура узла * следующий. Ну графически, что это такое? То есть нижняя половина прямоугольник, который мы видели просто мгновение назад. Но почему я говорю структура узла * а не только узлом *? Потому что, если этот указатель указывает на другом узле, это просто адрес узла. Это согласуется с того, что мы обсуждали об указателях до сих пор. Но почему, если я утверждаю, эта структура называется узлом, я должен сказать, что структура узлом внутри здесь? Именно так. Это своего рода глупые реальность C. Определение типа, так сказать, не имеет произошло. С супер буквально. Она читает ваш код сверху вниз, слева направо. И, пока не встретит, что точка с запятой на Суть, думаю, что не существовать как тип данных? Узла, в кавычках узла. Но из-за более подробный Я сделал заявление на первой линии - ЬурейеЕ узла структуры - потому, что пришел первым, перед фигурные скобки, что вроде как предварительного обучения Clang, что, вы Знаете что, дайте мне структуры структура называется узлом. Честно говоря, я не люблю называть вещи Структура узла, узла структуры всех на протяжении всей моей кода. Но я буду использовать его только один раз, только внутри, так что я могу эффективно создать своего рода циклическую ссылку, а не указатель на себя таковой, но указатель на другой идентичного типа. Вот и получается, что в структуре данных как это, есть несколько операции, которые могут быть Интересующие нас. Мы, возможно, захотите, чтобы вставить в список, как это. Мы, возможно, захотите удалить из списка, как это. Мы можем захотеть поиск в списке для значение, или в более общем хода. И траверс просто причудливый способ начала говорить на левой и переместить все до упора вправо. И заметьте, даже с этим немного более сложные структуры данных, не говоря мне предлагают, чтобы мы можем заимствовать некоторые из идеи в последние две недели и реализовать функцию называют поиск, как это. Это собирается вернуть истинным или ложными, указывая, да или Нет, N в списке. Второй аргумент является указателем к списку себе, так указатель на узел. Все, что я собираюсь сделать, это то заявляю временную переменную. Мы назовем это PTR по соглашению, для указателя. И я назначу его равным начало списка. А теперь замечаю то время цикла. До тех пор пока указатель не равно к нулю, я собираюсь проверить. Является ли стрелка указателя N равны N, который был передан в? И подождите минуту - новый часть синтаксиса. Что такое стрелка вдруг? Да? Именно так. Так в то время как несколько минут назад, мы использовали точечную нотацию для доступа что-то Внутри структуры, если переменная Вы не структуры себя, но указатель на структуру, К счастью, часть синтаксиса, наконец, имеет интуитивный смысл. Стрелка означает следовать за указателем, как наши стрелки как правило, означает графически, и уходить в Данные поля внутри. Так стрелка то же самое, точка, но вы используете его, когда у вас есть указатель. Так просто, чтобы резюмировать то, если поле N Внутри структуры, называемых указатель равна равна N, вернуться правда. В противном случае, эта линия здесь - указатель равно указатель следующего. Так что же это делает, заметьте, если я я в настоящее время указывает на структуру содержащий 9 и 9 не число Я ищу - Предположим, я ищу для N равна 50 - Я собираюсь обновить свой временный указатель не указывать в этом узле больше, но указателя стрелки рядом, которая собирается поставить меня сюда. Теперь я понял, вихрь Введение. В среду, мы на самом деле сделать это с некоторыми людьми и с некоторыми более кода в более медленном темпе. Но поймите, мы сейчас делают наши данные более сложные структуры, чтобы наши Алгоритмы можете получить более эффективные, которые будет условием для PSET шесть, когда мы загружаем в, опять же, те, 150 000 слов, но нужно сделать так эффективно, и, в идеале, создают программа, которая работает для наших пользователей не в линейной, а не на русском языке в квадрате, а в постоянное время, в идеал. Увидимся в среду. СЛУШАЛИ: На следующей CS50, Дэвид забывает о своем базовом варианте. DAVID МАЛАН: И вот как вы посылаете текстовыми сообщениями с C. Какие - [Различные ТЕКСТ СООБЩЕНИЯ Звуки уведомлений]