[МУЗЫКА ИГРАЕТ] David J. МАЛАН: Хорошо. Это CS50, и это это начало второй недели. Так давайте начнем сегодня с ошибкой. Ошибка, конечно, является ошибка в программе, и вы получите очень знакомы с этой концепцией если вы никогда не программировали раньше. pset0 и теперь pset1. Но давайте рассмотрим то немного простой на первый. Эта программа здесь, что I бросили вместе в заранее, и я утверждаю, что это должно напечатать 10 звезды на экране, используя Printf, но это, по-видимому глючит в некотором роде. Учитывая, что спецификация, он должен напечатать 10 звезд, но это не так, по-видимому, то, что Вы претендовать является ошибка? Да? Так что это не совсем по одной ошибки, и что вы имеете в виду? Хорошо. Отлично. Так мы определили начать нулевое значение для I, и мы указали н значение 10, но мы использовали меньше или равно. И причиной того, что это два персонажи и не только один символ, как в математике книги, является то, что у вас нет способ выражения один символ эквивалентны. Значит, меньше, но если вы начинаете отсчет с нуля, но вы рассчитывать всю дорогу до конца и равна 10, Вы, конечно, собирается рассчитывать 11 вещей в общей сложности. И так вы собираетесь печатать 11 звезд. Так что может быть исправить это? Да? Так что просто отрегулировать меньше или равна просто быть меньше, и есть, я утверждаю,, возможно, другое решение, слишком. Что может еще вы делаете? Да? Так что начните приравнивания ее к 1, и оставить меньше или равна. И, честно говоря, я бы утверждать, что для типичной человека, это, вероятно, более простым. Начните отсчет с 1 и прикинь через 10. По сути делать то, что вы имеете в виду. Но реальность такова, в программирование, как мы видели, компьютерщики и программисты , как правило, начинают отсчет с нуля. И так это нормально, как только Вы привыкаете к нему. Ваше состояние будет вообще что-то вроде меньше. Так просто логическим Ошибка, что мы могли сейчас исправить и в конечном счете перекомпилировать это и получить только 10. Ну, как об этой ошибке здесь? Здесь, опять же, я утверждаю, что у меня есть Целью печати 10 stars-- по одному в строке на этот раз, но это не так. Прежде, чем мы предлагаем то, что исправление, то, что делает это печатать визуально, если бы я был составить и запустить эту программу вы думаете? Да? Звезда. Так что все звезды на же линия, что я слышал, а затем символ новой строки. Так давайте попробуем это. Так что глючит-1, введите, и я вижу команду лязг что мы говорили в прошлый раз. ./buggy-1, и в самом деле я вижу все 10 звезд на той же строке, хотя я претендовать в моей спецификации просто комментарий на вершине код, который я намеревался сделать один пер линия. Но это выглядит правильно. Теперь строка 15, похоже, я печать звезду, а затем линия 16 это выглядит как я печать Символ новой строки, и они оба с отступом так Я внутри цикла ясно. Так что не я должен делать звезду, новый линия, звезда, новая линия, звезда, новая линия? Да? Да, в отличие от языка как Python, если вы знакомы, отступ не значения к компьютеру. Это имеет значение только к человеку. Так в то время как здесь, я изобрел линий 15 и 16-- что выглядит красиво, но компьютер не заботится. Компьютер заботится о фактически не имея фигурные скобки вокруг этих строк кода. Так что это clear-- как и в Scratch-- что этих двух строк кода должны быть выполнены. Как один из тех желтого царапинам головоломки шт снова и снова и снова. Так что теперь, если я повторно запустить этот program-- ./buggy-2-- Хм. У меня есть ошибка сейчас. Что я забыл сделать? Да, так что я не скомпилировать его. Так что глючит-2. Нет такого файла, потому что я не сделал компилировать вторую версию. Так что теперь интересно необъявленная переменная-- не 2. Мы делаем 1. Сделать багги-1-- ./buggy-1-- и сейчас каждый из них находится на той же линии. Теперь есть исключение это, как предполагалось иск шахте что вам нужны эти фигурные скобки. Когда это на самом деле OK-- если вы имеете заметил в разделе или textbooks-- опустить фигурные скобки? Да? Точно. Когда есть только один строка кода, которая вам хочу быть связан с цикл, как в нашем первом примере. Это совершенно законно опустить фигурные скобки просто как своего рода удобства от компилятора к вам. Да? Хороший вопрос. Будет ли это считаться ошибка стиль? Мы бы promote-- как в CS50 руководство по стилю, URL, для которых находится в pset1-- что всегда использовать фигурные скобки. Конечно, если вы новичок в программировании. Реальность такова, что мы не собирается запретить вам делать эти удобства. Но если вы только знакомитесь в курс дела, абсолютно просто всегда использовать фигурные подтяжки пока вы не получите повесить его. Хороший вопрос. Хорошо. Так что то была ошибка. По крайней мере, в то довольно простой. И все же вы можете думать, довольно зачаточном состоянии, не так ли? Это своего рода первой недели смотреть на языке как, увидеть ваши ошибки в нем. Но реальность это на самом деле представитель некоторые довольно пугающих проблем которые могут возникнуть в реальном мире. Таким образом, некоторые из вас могут вспомнить если вы будете следовать технические новости, или, может быть, даже поймал ветра этого в феврале из этого прошлого года, что Apple, было сделал немного ошибкой в ​​обоих прошивкой, операционная система их телефоны, а также Mac OS, операционная система на их настольных ПК и ноутбуков. И вы видели такие заголовки, как это. И после этого, Apple пообещал исправить эту ошибку, и очень быстро сделал это исправить в прошивкой, но потом в конечном итоге установили его в Mac OS а. Теперь ни один из этих заголовков в одиночку действительно выявить то, что основная проблема была, но ошибка была в конечном счете, сводится к ошибка в SSL, Secure Sockets Layer. И короче говоря, Это программное обеспечение что наши браузеры и другие Программное обеспечение, используемое для чего? Если бы я сказал, что SSL является участие, всякий раз, когда вам посетить URL, который начинается с HTTPS, что тогда может SSL быть связано? Шифрование. Таким образом, мы будем говорить о это в ближайшие дни. Шифрование, искусство карабкаться информацию. Но Короче, Apple некоторое время назад сделал ошибку в их реализации SSL, в программное обеспечение, которое в конечном счете, реализует URL-адреса, как HTTPS или макс соединения и там. Результат, который является то, что ваш соединения может потенциально быть перехвачены. И ваши соединения были не обязательно шифруются если вы были некоторые плохой парень в между Вы и веб-сайт назначения, которые знал, как воспользоваться этим. Теперь Apple, в конечном счете, размещенные Исправление этой наконец, и описание их исправление было это. Безопасного транспорта не удалось проверить Подлинность связи. Вопрос был рассмотрен восстановления пропущенных шагов проверки. Так что это очень рука волнистые объяснение для просто говорю, что мы облажались. Существует буквально один строка кода, который был багги в их реализации SSL, и если вы идете в Интернете и поиск для этого Вы можете на самом деле найти Оригинальный исходный код. Например, это снимок экрана только часть довольно большой файл, но это функция, по-видимому называется SSL проверить знак сервера обмена ключами. И это занимает кучу Аргументы и входы. И мы не собираемся сосредоточиться слишком много на мелочах там, но если вам сосредоточиться на коде внутри этого TOPMOST function-- давайте увеличить на что. Вы, возможно, уже подозреваю, что ошибка может быть, даже если вы понятия не имеете, в конечном счете то, что вы смотрите на. Там вроде аномалии здесь, что, что? Да, я не очень люблю Взгляд из двух Гото не удается. Честно говоря, я действительно не знаю, что перейти сбой средства, но с двумя из них спиной к спине. Это только отчасти трется меня интеллектуально неправильный путь, и в самом деле, если мы увеличить на только тех линий, это C. Так много кода от Apple сама написана на C, и это, по-видимому действительно equivalent-- не до такой симпатичной отступа версия, но если вы признаете тот факт, что нет никаких фигурные скобки, что Apple, действительно написал был код, который выглядит как это. Так что я уменьшили масштаб, и я просто фиксированной отступ в том смысле, что если нет никаких фигурные скобки, что вторая перейти неудачу вот в желтый собирается выполнить ни на что. Это не связано с если состояние над ним. Таким образом, даже снова, если вы не совсем понять, что это могло бы делать, знаю, что каждый из них conditions-- каждой из этих линий является очень важным шагом В процессе проверки если ваши данные на самом деле зашифрованы. Так пропуск одного из них шаги, не самая лучшая идея. Но так как у нас это Второй перейти неудачу в желтый, и потому что как только мы рода эстетически переместить его влево, где его логически находится в данный момент, то, что это значит для линии кода ниже этой второй Гото неудачу бы вы думали? Это всегда будет пропущен. Так GOTOS, как правило, с неодобрением по причинам, мы не будем действительно входят в, да и вообще в CS50 мы не склонны учить это утверждение Гото, но вы можете думать о Гото терпят неудачу, поскольку смысл ходу прыжка в некоторой другой части кода. Другими словами перепрыгивать это последняя строка вообще, и поэтому результат этой глупой просто ошибка, которая была просто результатом Возможно кто скопировать и вставить один тоже много раз было то, что весь безопасность IOS и Mac OS был уязвим для перехвата плохих парней в течение достаточно долгого времени. Пока Apple, наконец, не зафиксировал это. Теперь, если некоторые из вас на самом деле работает старые версии прошивкой или Mac OS, Вы можете пойти в gotofail.com которые это сайт, который кто настроен в значительной степени определяют программно если ваш компьютер по-прежнему уязвимы. И, честно говоря, если это так, это, вероятно, хорошая идея обновить свой телефон или ваш Mac в этой точке. Но там, только свидетельством, насколько оценка этих низком уровне подробнее и довольно простые идеи может действительно перевести в решения и проблемы, которые affected-- в этом case-- миллионы людей. Теперь несколько слов о администрации. Раздел начнется в ближайшее воскресенье. Вы получите письмо по выходные о разделе, в котором пункте процесс резекции начнется, если у Вас есть понял, теперь у вас есть некоторые новые конфликты. Так что это происходит каждый год, и мы разместятся в ближайшие дни. Офис hours-- сделать держать глаз по этому графику здесь. Изменяет немного на этой неделе, в частности, время начала и расположение, так что обратитесь что прежде чем отправиться в рабочее время любой из следующих четырех ночей. А теперь слово по оценке, особенно, как вы погрузиться в проблемы устанавливает один и за его пределами. Так в соответствии со спецификацией, они, как правило, оси, вдоль которых мы оцениваем свою работу. Сфера относится к тому, что мере ваша код инвентарь требуется особенности по нашей спецификации. Другими словами, сколько набор кусок ты откусить. Ты сделал треть из него, половина, 100% от него. Даже если это не правильно, сколько вы пытались? Так что отражает уровень усилий и количества , к которому вы откусили Задачи множества. Correctness-- этом, чтобы Насколько, ваш код В соответствии с нашей технические характеристики и никаких ошибок. Так это правильно работать? Если мы даем ему некоторые материалы, делает это дать нам результат, который мы ожидаем? Design-- сейчас это первый из в частности качественные, или те, которые требуют человеческих суждений. И действительно, именно поэтому у нас есть штат так много учебных товарищей и, конечно помощники. В какой степени ваша код, написанный хорошо? И снова это очень качественная оценка что будем работать с вами на двухнаправленно в ближайшие недели. Так что, когда вы не только числовые показатели, но и Письменное баллы, или ввели обратной связи, или письменные отзывы в английских слов. Это то, что мы будем использовать, чтобы везти вас к фактически писать лучший код. И в лекции и секции, мы постараемся указать out-- так часто, как мы can-- то, что делает программу не только правильно и функционально хорошо, но и хорошо разработана. Наиболее эффективным он может быть или даже самая красивая это может быть. Что приводит нас к стилю. Стиль, в конечном счете является эстетическое суждение. Вы выбрали хорошее имена для ваших переменных? Вы отступом код правильно? Значит ли это выглядеть хорошо, и поэтому, это просто для другого человека читать ваш соответствующая его правильности. Теперь вообще за учебный план, мы забить эти вещи на пятибалльной шкале. И позвольте мне забивать домой точка что в три действительно хорошо. Очень быстро сделать людей начать делать арифметику. Когда они получают три из пять от правильности некоторое PSET и они думают, блин, я собираюсь 60% который по существу является D или E. Это не то, как мы думаю из этих чисел. Три действительно хорошо, и что мы обычно ожидают в начале термина в том, что если вы получаете куча three's--, возможно, пару ярмарок, пару fours-- или пара двоек, пару fours-- что это хорошее место, чтобы начать. И до тех пор, как мы видим, вверх траектория с течением времени, Вы находитесь в особенно хорошем месте. Формула мы используем для вес вещи по существу это за учебной программы, который просто означает, что мы придают большее значение корректности. Потому что это очень часто корректность что занимает больше всего времени. Поверьте мне сейчас. Вы find-- по крайней мере, в одном pset-- что вам провести 90% своего времени работает на 10% от этой проблемы. И все вроде работает для одного или двух ошибок, за исключением, и тех, являются ошибки, которые держать вас до поздней ночи. Это те, что рода избежать вам. Но после сна на нем, или посещать приемные часы или задавать вопросы онлайн, является когда вы получаете на этом 100% гол, и именно поэтому мы вес Правильность наиболее. Дизайн немного меньше, и стиль немного меньше. Но имейте в mind-- стиле пожалуй, самый простой из них откусить в соответствии с руководством по стилю. И теперь, более серьезным обратите внимание на академической честности. CS50 имеет неудачное различение являясь крупнейшим производителем Совета Ad случаи почти каждый год исторически. Это не потому, что студенты обманывают в CS50 больше, чем любой другой класс, а потому, что по характеру работы, тот факт, что это электронный, тот факт, что мы смотрим на это, и тот факт, мы компьютерщики, Я могу сказать, что мы, к сожалению, очень хороша в обнаружении его. Так что же это означает в реальном выражении? Так это, в соответствии с учебной, Философия Курса действительно сводятся к разумным. Существует эта линия между делать свое работу по своему усмотрению и получить немного разумно помощь от друга, и откровенно делать эту работу за свой друг, или отправив ему или ей ваш код так что он или она может просто принять или взять его право. И, что пересекает линию что мы обращается в классе. Смотреть, учебный план в конечном счете, для линий что мы обращаем как разумно и необоснованным поведением, но на самом деле это фурункул до сущности из ваша работа необходимости быть своим собственным в конце. Теперь с этим сказал, есть эвристический. Потому что, как вы, возможно, imagine-- от рабочего дня и визуальные и видео мы в показано таким образом far-- CS50 действительно предназначается, чтобы быть как совместный и как кооператив и как социальный насколько это возможно. , Как групповая, как это строгий. Но с этим сказал, эвристический, как вы увидите в учебной программе, является то, что, когда вы испытываете некоторые проблемы. У вас есть ошибка в коде, что вам не может решить, что это разумно для вас показать код кому-то еще. Друг даже в классе, друг сидит рядом с вами в рабочее время, или член персонала. Но они не могут показать свой код к вам. Другими словами, ответить на ваш question-- Мне нужно help-- не ах, вот мой код. Взгляните на это и вывести из него то, что вы будете. Теперь, конечно, есть способ явно к игре это система, в которой я покажу вам, мой код до того, вопрос. Вы покажите мне мою код до того, вопрос. Но увидеть учебный план снова тонкие детали, где эта линия. Просто сейчас нарисовать картину и поделиться максимально прозрачно где мы находимся в в последние годы, это число случаев Доска объявлений что CS50 была более последние семь лет. С 14 случаях это наиболее недавнее падение. С точки зрения студентов, участвующих, это было 20 некоторые странные студенты это прошлой осенью. Был пик 33 студенты несколько лет назад. Многие из них, к сожалению, больше не здесь, на территории кампуса. Студенты, участвующие в процентах от Класс исторически в диапазоне от 0% до 5,3%, что является только сказать это ежегодно проблемой. И в этом направлении, то, что мы хотим сделать, это передать один что мы dd-- просто FYI-- сравнить на справедливость тем студентам, которые являются следующие линии соответственно. Мы делаем сравнить все ток Доводы против всех последних миссий за последние много лет. Мы тоже знаю, как Google вокруг и найти репозитории кода онлайн, дискуссионные форумы онлайн, работа сайтов в сети. Если студент может найти его, мы можем, конечно, найти его так же, как мы с сожалением сделать. Так что вы увидите в учебной программе хотя это положение сожаление. Я могу, конечно, оценить, и мы все имеет Сотрудники сделав ход, как это, или это само по себе один с течением времени, конечно, знаете, что это такое, когда жизнь становится на пути, когда у вас есть некоторые поздно ночью deadline-- не только в этом классе, но another-- когда вы полностью исчерпаны, подчеркнул, есть чрезмерное количество других вещей, чтобы сделать. Вы будете делать в определенный момент в жизнь, конечно, плохо, возможно, поздно ночь решение. Так в соответствии с учебной, есть этот пункт, такие, что если в течение 72 часов с момента некоторые бедные решение, вы являетесь владельцем до него и выйти на меня и один из руководителей Курса и у нас будет разговор. Мы будем обращаться с вещами внутренне в надежде от это становится все более Момент учение или жизненный урок, и не то, что с особенно радикальные последствия как вы можете увидеть на этих графиках здесь. Так что это очень серьезный сигнал. Остановимся лишь немногие секунд, чтобы снять напряжение. [МУЗЫКА ИГРАЕТ] David J. МАЛАН: Ладно, так как в том, что для Segue? Для сегодняшних первичных темам. Первый из которых является абстракцией. Еще одна из которых будет представление данных, которые откровенно является действительно сухой способ сказать, как мы можем идти о решении проблем и думать о решении проблемы? Таким образом, вы видели в пустом, и у тебя видел, возможно, уже в pset1 с C что вы не только можете использовать функции, как Printf, что другие люди в мимо лет писал для вас. Вы также можете написать свои собственные функции. И хотя вы не могли бы сделал это в C, и, честно говоря, в pset1 Вы действительно не нужно писать свой собственную функцию, потому что в problem-- хотя, возможно, сложной на первый glance-- вы увидите в конечном итоге может быть решена с не все, что многие строки кода. Но с этим сказал, с точки зрения писать свою собственную функцию, понять, что C действительно дает Вы такая возможность. Я собираюсь пойти в современном исходном коде, который доступен уже на сайте, и я собираюсь идти вперед и открытой до программы под названием функция 0.C, и в нулевой функции мы увидим несколько вещей. В первых строках 18 через 23 моя основная функция. И теперь, когда мы начинаем читать Код, который мы не пишем на лету, но вместо этого я написал заранее или что вы в задаче установить может получить имеющие было написано заранее. Хороший способ начать читать код чужое это посмотреть на главной функции. Выяснить, где эту запись Дело в том, чтобы запустить программу, и следуйте его логически оттуда. Так что эта программа по-видимому печатает Ваше имя двоеточие. Затем мы используем GetString из библиотеки CS50 чтобы получить строку, или слово или фразу от пользователя на клавиатуре. А тут еще этот вещь здесь-- PrintName. Теперь PrintName не функция, которая поставляется с C. Это не в стандартном io.h. Это не в CS50.h. Это, скорее, в том же файле. Обратите внимание, если я прокрутите вниз а bit-- линии 25 в 27-- это просто довольно способ комментируя ваш код с помощью звезд и косые черты. Это мульти-линия комментировать, и это только мое описание в синеве что делает эта функция. Потому что в линии 28 до 31, Я написал супер простую функцию чье имя является PrintName. Это занимает, сколько Аргументы бы вы сказали? Так один argument--, потому что есть один Аргумент перечислены внутри скобок. Тип, который является строкой. Который должен сказать PrintName Это выглядит примерно так черный ящик или функция, которая принимает как вход строку. И имя этой строки удобно будет имя. Не S, не N, но имя. Итак, что же PrintName делать? Это хороший простой. Так же, как одной строки кода для Е, но, видимо, его печатает "Hello," так и так. Где так и так происходит от аргумента. Теперь это не огромная инновация здесь. Действительно, я взял программу, которая может были написаны с одной строки кода , поставив это здесь, и изменили его на то который включает в себя некоторые шесть или семь или около того строк кода весь путь сюда. Но это отработка принцип, известный как абстракции. Вид инкапсуляции внутри новый функция, которая имеет имя, и лучше еще, что название буквально говорит, что он делает. Я имею в виду printf-- это не описывает его. Если я хочу создать паззл, или, если I хочу создать функцию который печатает чье-то имя, красота делает это является то, что я могу на самом деле дать, что функции имя , который описывает то, что он делает. Теперь она занимает в входе, что Я условно назвать имя, но это тоже чудесно описательный вместо того, чтобы немного больше общий как С. и недействительными, на данный момент, просто означает, что эта функция не вручить мне ничего. Это не то, GetString что буквально вручает мне строку как мы делали с бумажки со своими одноклассниками на прошлой неделе, а он просто имеет побочный эффект. Он печатает то на экран. Так в конце концов, если я действительно делают функция-0, ./function-0, мы увидим, что он просит моего имени. Я типа Давида, и это типы из моего имени. Если я сделаю это снова с Робом, он собирается сказать "Привет, Боб". Так простая идея, но, возможно, экстраполировать это психически что, как ваши программы получить немного сложнее, и вы хотите написать кусок Код и вызов, который code-- Invoke что code-- некоторыми описательный назвать как PrintName, C делает себе нам эту возможность. Вот еще один простой пример. Например, если я открываю подать с сегодняшнего дня называется return.c, заметить, что я сделал здесь. Большая часть этой главной функции Е. Я сначала произвольно инициализации переменная с именем х к числу 2. Я затем распечатать "х теперь % Я "прохождения в значении х. Так что я просто говорю, что это такое. Теперь я просто смело утверждая с Printf. Ищу кубатуры, что значение х, и я делает это путем вызова функции называется куб прохождение в х в качестве аргумента, а затем сохранить выход В самой переменной, х. Так что я удалив значение х. Я переопределения значение х с любой результатом вызова эта функция куб. А потом я просто распечатать некоторые пушистый материал здесь говорят, что я сделал. Так что же тогда является куб? Обратите внимание, что в корне здесь по-другому. Я дал функцию название, как и раньше. Я указал имя аргумента. На этот раз она называется п вместо имени, но я мог называть его иначе я хочу. Но это не так. Эта вещь слева. Ранее это было то, что ключевое слово? Мальчики. Теперь это очевидно, внутр. Так что, пожалуй, забрать? В то время как недействительными означает своего рода ничто, и это было так. PrintName не вернулся ничего. Это что-то сделал, но это не передать меня то, что я мог бы поставить на Левая часть знака равенства как я сделал здесь, на линии 22. Так что, если я говорю, в на линии 30, что это такое, вероятно, подразумевая о том, что куб делает для меня? Да? Это возвращает целое. Так он передает мне, для Экземпляр, бумажка , на которой он написал ответ. 2 кубе, или 3 в кубе, или 4 cubed-- все, что я прошел в, и как я это реализовать? Ну, просто п раз п раз п как я мог куб значение. Итак, еще раз, супер просто идея, но демонстративное Теперь, как мы можем писать функции что на самом деле было нас ценности, которые могли бы представлять интерес. Давайте посмотрим на последний пример здесь называется функция одна. В этом примере, он начинает чтобы получить более убедительными. Таким образом, в функции одного, это program-- уведомление в конечном счете, вызывает функцию называют GetPositiveInt. GetPositiveInt не функции в библиотеке CS50, но мы решили, что хотели бы, чтобы существовать. Так что, если мы прокрутите вниз позже в файле, обратите внимание, как я пошел о реализации получить положительный Int, и я говорят, что это более убедительным потому что это достойный количество строк кода. Это не просто глупо маленькая игрушка программы. Это на самом деле получил обработку ошибок и делать что-то более полезное. Так что, если вы не видели прохождение игры видео, что мы, встроенные в pset1, знаю, что это является одним из видов петля в C, близкий по духу с видами вещей нуля может сделать. И делать говорит этого. Распечатайте это. Тогда вперед и получить n-- получить Int и сохранить его в п, и продолжать делать это снова и снова, и снова, пока п меньше одного. Так н собирается быть менее одного только если человек не сотрудничает. Если он или она печатает в 0 или -1 или -50, этот цикл будет держать выполнение снова и снова. И в конечном счете заметить, я просто вернуть значение. Так что теперь у нас есть функция что было бы хорошо если CS50 бы реализовать в CS50.h и CS50.c для вас, но здесь мы можем сейчас реализовать это сами. Но два замечания по некоторым ключевым деталей. Одно-- почему я заявляю Int н, вы думаете, на линии 29 а не просто делать это здесь, который больше соответствует то, что мы сделали на прошлой неделе? Да? Хорошая мысль. Так что, если бы мы должны были поставить его здесь, это как будто мы держать объявив его снова и снова. Это само по себе является не проблематично, по сути, потому что нам нужно только Значение один раз и затем мы собираемся получить новый в любом случае. Но хорошая мысль. Да? Закрыть. Так, потому что я заявил н на Линия 29 вне цикла, она была доступна в течение это целая функция. Не другие функции, потому что н-прежнему внутри этих вьющихся подтяжки здесь. Так что-- уверен. Точно. Так что это даже более важно. Если мы вместо заявил н прямо здесь, на линии 32, это проблематично, потому что предположение где еще мне нужно получить к нему доступ? На линии 34, и Простое правило является что вы можете использовать только переменная внутри из самых последних фигурные скобки , в котором вы объявили его. К сожалению, линия 34 одна линия слишком поздно, потому что я уже закрыта фигурная скобка на линии 33 что соответствует фигурная скобка в строке 30. И таким образом, это способ сказать, что эта переменная Int является областью действия, так сказать, чтобы только внутри из тех фигурные скобки. Это просто не существует вне их. Так действительно, если я сделаю это так, позвольте мне сохранить код как это is-- неправильно написано. Позвольте мне идти вперед и делают Функция-1, и notice-- ошибки. Использование необъявленный идентификатор п на линии 35, который находится прямо здесь. И если мы прокрутки вверх Далее, еще один. Использование необъявленная Идентификатор н на линии 34. Так компилятор, Clang, будет заметить, что его просто не существует, даже если ясно, что она есть визуально. Таким образом, простое исправление объявив его там. Теперь позвольте мне перейти к верхней части файла. Что бросается в вас, как будучи немного отличается от того, что мы смотрели на прошлой неделе? Мало того, что у меня есть имя, не только У меня есть некоторые острые включает в себя до лучших, У меня есть то, что я нахожусь называя прототип. Теперь, выглядит ужасно похоже на то, мы только что видели несколько минут назад на линии 27. Так что давайте вывести из другой Сообщение об ошибке, почему я сделал это. Позвольте мне идти вперед и удалить эти строки есть. И поэтому мы ничего не знаем о прототипе. Remake этот файл. Сделайте функцию один. А теперь, блин, четыре ошибки. Давайте прокрутки до первого. Неявное объявление функции получить положительный Int является недействительным в C99. C99 просто означает, что 1999 версия языка C, который является то, что мы действительно с помощью. Так что же это значит? Ну C-- и более конкретно C compilers-- довольно тупые программы. Они только знают, что у Вас есть сказал им, и это фактически тематическая с прошлой недели. Проблема в том, что если я иду о реализации имя здесь, и я вызвать функцию названную GetPositiveInt здесь на линии 20, что функция технически не существовать, пока компилятор не видит линию 27. К сожалению, компилятор делать вещи сверху, вниз, влево, вправо, так, потому что не видел Реализация GetPositiveInt, но он видит вы пытаетесь использовать его здесь, это просто будет bail-- кричать на Вы с ошибкой message-- возможно загадочными, а не на самом деле компиляции файла. Таким образом, так называемый прототип до здесь, по общему признанию излишним. Буквально, я спустился сюда, и я скопировал и вставили это, и я положил его здесь. Пустота бы более правильным, поэтому мы буквально скопировать и вставить его на этот раз. Я буквально скопировал и вставил его. Действительно как как хлебного мякиша. Немного подсказка компилятору. Я не знаю, что это делает пока нет, но я обещал вам , что в конечном итоге будет существовать. И вот почему это line-- в линия 16-- заканчивается точкой с запятой. Это является избыточным по дизайну. Да? Если вы не связать свою библиотеку чтобы the-- о, хороший вопрос. Sharp включает файлов заголовка включений. Нужно be-- должны почти всегда быть на самом верху файла для similar-- для точно так же причина, да. Потому что в стандарт io.h буквально линия как это, но со словом Printf и с опциями и возвращаемого типа. И так, делая резкое включать до здесь, что вы буквально делает будет скопировать и вставить содержимое кого-нибудь еще написал наверху. Таким образом cluing код и Дело в том, что эти функции существуют. Да? Абсолютно. Так очень умный и правильный решением было бы, знаете что? Я не знаю, что Прототип, но я знаю, если я понимаю, что C является просто немой и переосмысливает сверху вниз. Ну давайте дадим его, что он хочет. Давайте вырезать этот код, вставьте его лучших, и теперь нажать главный внизу. Это тоже позволит решить проблему. Но вы могли бы очень легко придумать сценарий, в котором нужно вызвать B, и, возможно, B перезванивает A. Это то, что называется рекурсия, и мы вернемся к этому. И это может или не может быть хорошим вещь, но вы можете определенно сломать это решение. И более того, я бы утверждают, стилистически, особенно когда ваши программы стать так долго и так долго, это просто супер удобно положить главной в верхней потому что это вещь наиболее программисты собираются заботиться о. И так это немного чище, возможно, сделать это так, как Я первоначально сделал это с прототипом даже хотя это выглядит немного излишним, на первый взгляд. Да? К сожалению, вы можете сказать, что это громче? При переключении местоположения внедрение и прототип? Так что это хороший вопрос. Если вы повторно заявить об этом вниз здесь, давайте посмотрим, что произойдет. Так что, если я подавил это здесь, вы говорите. Ой, извините. Громче? Даже громче. О, хороший вопрос. Будет ли это привести к аннулированию функцию? Вы знаете, после всех этих лет, я никогда не поставить прототип впоследствии. Так давайте сделаем сделать функцию-1 после выполнения этого. [Бормоча] David J. МАЛАН: Ой, подождите. Мы все еще должны поставить все верх. Так давайте сделаем это здесь, если я понимая Ваши вопросы правильно. Я ставлю все, в том числе выше главным прототипом, но я ставлю прототип Ниже осуществления. Так что, если я сделать один, я получаю назад error-- неиспользованный переменная н. О, есть. Спасибо. Давайте посмотрим, что мы избавиться от этого. Это другая ошибка, так что давайте игнорировать это. Давайте действительно быстро переделать это. Итак, аргумент не данные используется строка формата n-- о, это потому, что Я изменил к ним здесь. Ладно, мы знаем, что ответ собирается to-- все в порядке, здесь мы идем. Ах, спасибо за позитив. Ладно, я исправлю этот код after-- игнорировать эту конкретную ошибку так как это was-- это работает и есть ответ. Так что не перезаписывает то, что вы только что сделали. Я подозреваю, компилятор написана таким образом что игнорирует свой прототип Потому что тело, так сказать, из функция уже были реализованы выше. Я бы на самом деле проконсультироваться Руководство компилятора понять, есть ли другие Подразумевается, но на первый взгляд просто пытается и экспериментировать, там, кажется, нет никакого влияния. Хороший вопрос. Так что давайте идти вперед сейчас, двигаясь от побочных эффектов, которые являются функциями, которые делают то, что визуально на экране с Printf, но не возвращает значение. И функции, которые имеют возвращение ценности, как мы только что видели некоторые из. Мы уже видели это понятие сферы, и мы увидим это снова и снова. Но сейчас, опять же, использовать эмпирическое правило что переменная может быть использована только внутри самой недавно открыл и закрытые фигурные скобки, как мы видели в этом конкретном примере. И как вы отметили, существует ability-- Вы могли бы решить некоторые из этих проблем поставив переменную глобально в самом начале файла. Но почти во всех случаях мы бы недоволен, что, и в самом деле даже не идут в этом решении для теперь. Так что на данный вынос в том, что переменные имеют это понятие сферы. Но теперь давайте посмотрим на другой сухой способ на самом деле ищет на некоторые довольно интересно Детали реализации. Как мы могли бы представлять информацию. И мы уже смотрели на это в первую неделю классе. Глядя на бинарных файлов, и напоминая себе о десятичной. Но помните из прошлой неделе, что C имеет различные типы данных и гроздья больше, но наиболее полезные из них сейчас может быть это. Символ, или символ, который происходит чтобы быть один байт или восемь битов общей. И это означает, что размер из полукокса только один байт. Байт восемь битов, таким образом, это означает, что мы можем представить, как много символов. Сколько писем или Символы на клавиатуре если у нас есть один байт или восемь бит. Вспомните нулевой неделе. Если у вас есть восемь бит, сколько всего значения может вы представляете с паттерны нулей и единиц? Одно-- больше. Так 256 всего, если вас начать отсчет с нуля. Так что если у вас есть восемь bits-- так что если мы были наши бинарные луковицы здесь снова, мы могли бы превратить эти лампочки на и выключается в любом из 256 уникальных структур. Теперь это немного проблематично. Не так много для английского и романские языки, но, конечно, когда вы представить, для Например, азиатские языки, которые имеют гораздо больше символов, чем как 26 буквы алфавита. Мы на самом деле, возможно, потребуется более чем одним байтом. И к счастью, в В последние годы имеет общество принятые другие стандарты, которые используют более одного байта на одной зарядке. Но на текущий момент в С, по умолчанию только один байт или восемь битов. Целое, тем временем, четыре байт, иначе известный как 32 бит. А это значит, что как можно большее число можно представить с междунар по-видимому,? С миллиард. Так что это четыре миллиарда плюс-минус. 2 в 32-я власти, если мы не принимаем на себя отрицательные числа и просто использовать все положительные цифры, это четыре миллиарда плюс-минус возможности. Поплавок, тем временем, это другой тип типа данных в C. Это еще целый ряд, но это реальное число. Что-то с запятой. И получается, что C также использует четыре байта для представления значений с плавающей точкой. К сожалению, сколько с плавающей значения точки есть в мире? Сколько вещественные числа есть? Там в бесконечное число, и в этом отношении есть бесконечное число целых чисел. Так что мы уже вроде копать себе яму здесь. Причем, видимо, в computers-- на наименее программы, написанные на C на them-- могут рассчитывать только выше, чем четыре миллиарда плюс-минус, и плавающей запятой может только по-видимому, есть конечное количество точностью. Только так много цифр после их запятой. Потому что, конечно, если у вас есть только 32 бита, Я не знаю, как мы собираемся идти о представляющих реальную numbers-- вероятно с различными типами рисунков. Но есть, конечно, конечное число таких шаблонов, так и здесь, это проблематично. Теперь мы можем слегка избежать этой проблемы. Если вы не используете поплавок, вы можете использовать двойной в С, что дает вам восемь байт, что является способ больше возможных структур нулей и те. Но это все еще конечна, которая собирается чтобы быть проблематичным, если вы пишете программное обеспечение для графики или для фантазии математические формулы. Таким образом, вы, возможно, на самом деле хотят подсчитывать больше, чем это. Длинный long-- тупо named-- Также восьми байт, или 64 битов, и это вдвое больше, чем в Int, и это в течение долгого целого значения. Fun fact-- если Int четыре байта, как долго это долго в C обычно? Также четыре байта, но долго долго восемь байт, и это по историческим причинам. Но вынос сейчас просто, что данные есть быть представленным в computer--, это физическое устройство с электричеством, это вообще за рулем эти нули и ones-- с конечными объемами точностью. Так в чем проблема то? Ну есть проблема целочисленного переполнения. Не только в С, но в компьютеры в целом. Например, если в этом это байт стоит bit-- так что если это восемь bit-- все из которых являются номер один. Какой это номер представляющий если предположить, это все положительные значения в двоичном? 255, и это не 256, потому что нулевой самое низкое число. Так 255 является самым высоким Один из них, но проблема , предполагают, что хочу увеличить эту переменную, что использует всего восемь бит если я хочу, чтобы увеличить его. Ну, как только я добавить один для всех этих единиц, Вы, возможно, может себе представить visually-- просто как неся его, используя decimals-- то происходит течь слева. И в самом деле, если бы я добавить номер один с этим, то, что происходит в двоичном является то, что оно переполняет до нуля. Так что если вы только use-- не в Int, но один байт рассчитывать целые в программе, по default--, как только вы получите 250, 251, 252, 253, 254, 255-- 0 приходит после 255, что, вероятно, не то, что пользователь собирается ожидать. Теперь то же время в плавающей запятой мир, у вас также есть аналогичная проблема. Не столько с самой большой number-- хотя это еще вопрос. Но с количеством точностью что вы можете представлять. Итак, давайте взглянем на этот пример здесь также от сегодняшней источника code-- плавать-0.c. И заметьте, это супер простая программа, которая следует, видимо, распечатать, какое значение? Что вы пари, что это собирается печатать хотя есть немного нового синтаксиса здесь? Так, мы надеемся 0.1. Таким образом, эквивалентна одной десятой потому что я делаю 1, деленной на 10. Я уверен, хранить ответ в переменной называется е. Эта переменная имеет тип поплавка, который это ключевое слово, я просто предложил существовало. Мы не видели это раньше, но это вроде изящный способ в Printf чтобы определить, как много цифр вы хотите увидеть после запятой. Так это обозначение просто означает, что вот заполнителем. Это для плавающей точкой Значение, и о, кстати, показать его с десятичной точки с один номер после запятой. Так вот число значащих цифр, так сказать, что вы, возможно, захотите. Итак, позвольте мне идти вперед и делать сделать поплавок-0, ./float-0, и, видимо, 1 делится на 10 0.0. Теперь, почему это? Ну опять же, компьютер принимает мне буквально, и я написал 1 и я написал 10, и сделать предположение, что является предполагается тип данных для этих двух значения? Int, это технически то немного другое. Это, как правило, долго, но это в конечном счете, интегральное значение. Не значение с плавающей точкой. Что означает, что если этот является Int и это Int, Проблема в том, что компьютер не обладают способностью даже хранить эту десятичную точку. Так что, когда вы делаете 1 делится на 10 с использованием целых чисел для числителе и знаменатель, ответ должен быть 0,1. Но computer-- потому те integers-- не знаю, что делать с 0,1. Так что же это явно делаешь? Это просто выбросить, и что я вижу в конечном счете, 0.0 только потому, что я настаивал на том, Е показать мне одну десятичную точку. Но проблема в том, что если вам разделить целое на целое число, Вы get-- по определению из C-- целое. И он не собирается делать что-то хорошее и удобно как вокруг него до ближайший вверх или вниз. Это происходит усечение все после запятой. Так что просто интуитивно, что, вероятно, исправить? Что простым способом исправить здесь? Да? Точно. Почему бы нам просто не рассматривать их как эффективно с плавающей запятой превращая их в поплавками или парном разряде. И теперь, если я действительно делают поплавки-0, или если я компилирую поплавки-1, который идентичен что только что было предложено. И теперь я делаю поплавки-0, сейчас я получу свой 0,1. Теперь это удивительно. Но теперь я собираюсь сделать то немного другое. Мне любопытно посмотреть, что на самом деле происходит под капотом, и я собираюсь напечатать это к 28 знаков после запятой. Я хочу, чтобы действительно увидеть 0.1000-- infinite-- [Неразборчиво] 27 нулей после этого 0,1. Ну посмотрим, если это то, что я действительно получить. Сделать плавает-0 и тот же файл. ./floats-0. Давайте увеличить на драматической ответ. Все это время, вы думали 1 делится на 10 10%, или 0,1. Это не так. По крайней мере, насколько это компьютер беспокоится. Теперь why-- Хорошо, это полное ложь 1 делится на 10 составляет 0,1. Но why--, что это не вынос сегодня. Так почему же компьютер думаю, в отличие от всех нас в комнате, что 1 делится на 10 является на самом деле, что с ума значение? Что компьютер делает, по-видимому? Что это? Это не переполнить, как таковой. Переполнение обычно, когда Вы обернуть вокруг значения. Именно этот вопрос неточности в значение с плавающей запятой где у вас есть только 32 или, может быть, даже 64 бит. Но если есть бесконечное количество реальных numbers-- номера с знаков после запятой и цифры thereafter-- наверняка Вы не можете представить все из них. Таким образом, компьютер дал нам ближе матч к значению он может представлять с помощью, что много битов до значения я на самом деле хотите, который является 0,1. К сожалению, если вы начать делать математику, или вы начать с участием этих видов плавающей значения точки в важном programs-- финансового программного обеспечения, военный software-- ничего где восприятие вероятно, довольно важно. И вы начинаете добавлять номера, как это, и начало работает, что программное обеспечение с действительно большими входами или для большого количества часов или большим дней или большим количеством лет, эти крошечные ошибки безусловно, может сложить с течением времени. Теперь, как в сторону, если вы когда-либо видел Супермен 3 или офисное пространство и вы, возможно, помните как эти парни украли много денег со своего компьютера с помощью значения с плавающей точкой и сложения мало остатки, мы надеемся, что фильм теперь имеет больше смысла. Это то, что они были намекая на в этом фильме. Тот факт, что большинство компании не будет выглядеть после определенного количества десятичных знаков, но те фракции центов. Таким образом, вы начинаете их сложения, вы начинаете делать много денег на ваш банковский счет. Так вот Офисные помещения объяснил. Теперь, к сожалению, за Офисные помещения, есть некоторые законно тревогу и значительные воздействия из этих видов лежащие в основе проектные решения, В самом деле, и одной из причин мы используем C в течение так что у вас действительно есть эту землю до понимания того, как работают компьютеры, как программное обеспечение работает, и не принимать как должное. И в самом деле, к сожалению, даже с что фундаментальное понимание, мы, люди делают ошибки. И то, что я думал, я бы поделиться является это восемь минут видео здесь принято из эпизода Современные Чудеса, которая образовательная шоу о том, как все это работает что рисует две картины о том, когда неправильное использование и понимание с плавающей запятой привело к некоторым существенным Печальные итоги. Давайте взглянем. [ВИДЕОВОСПРОИЗВЕДЕНИЕ] Теперь -Мы вернуться в "Инжиниринг Бедствия "на современных чудес. Компьютеры. Мы все пришли к пониманию часто проблемы разочарование, что получил с them-- багов, вирусов, и Программное обеспечение glitches-- для небольших цен платить за удобства. Но в области высоких технологий и высокой скорости военные и космические программные приложения, малейшая проблема будет быть увеличены в катастрофе. 4 июня 1996 года, ученые готовы запустить беспилотный ракета Ариан 5. На его борту научно Спутники предназначены установить, как именно Взаимодействует магнитного поля Земли с солнечными ветрами. Ракета была построена для Европейское космическое агентство, и стартовал с его объекте на побережье Французской Гвианы. -На Около 37 секунд в полет, они впервые заметил что-то пойдет не так. Это форсунки были поворотным таким образом, они действительно не должны. Вокруг 40 секунд в полете, четко автомобиль попал в беду, и вот, когда они сделали решение его уничтожить. Офицер безопасности диапазон, с огромные кишки, нажал на кнопку и взорвали ракету, прежде чем он мог стать угрозой для общественной безопасности. -Это Был девичья Путешествие из Ariane 5, и ее разрушение взял место из-за недостатка встроен в программное обеспечение ракеты. Исследованы проблемы на Ariane было то, что был номер, который требуется 64 бита, чтобы выразить, и они хотели, чтобы преобразовать это к 16-разрядного числа. Они полагали, что числа никогда не будет очень большой. Что большинство из этих цифр в 64-разрядное число были нули. Они были неправы. Исследованы неспособность одного программа, чтобы принять вид числа, порожденная другой был в корне провала. Разработка программного обеспечения стала очень затратная часть новой технологии. Ariane 4 ракеты были был очень успешным. Так что большая часть программного обеспечения, созданного для он был также использован в Ariane 5. Исследованы основная проблема было то, что Ariane 5. Был faster-- ускоряется быстрее, и программное обеспечение не приходилось, что. Исследованы уничтожение ракеты была огромная финансовая катастрофа. Все за ошибки минут программного обеспечения. Но это был не первый Время проблемы преобразования данных мучило современные технологии ракеты. -В 1991 с самого начала из первой войны в Заливе, ракета Patriot испытал подобный вид проблемы преобразования число. И в результате 28 people-- 28 Американские soldiers-- были убиты, и около ста получили ранения. Когда Patriot, который должен был для защиты от входящих Скадов, не удалось уволить ракету. -Когда Ирак вторгся в Кувейт, и Америку запущен Буря в пустыне в начале 1991 года, Patriot ракетные батареи были развернуты защитить Саудовскую Аравию и Израиль от ракетных атак Ирака Скад. Патриот является средней дальности США земля-воздух системы производства компании Raytheon. -Размер Патриоте перехватчик в том: это длиной около примерно 20 футов, и весит около 2000 фунтов. И это несет боеголовку о, Я думаю, что это примерно 150 фунтов. И сама боевая часть фугасных, которые имеет фрагменты вокруг него. Так кожух боеголовки разработаны, чтобы действовать как картечью. Исследованы ракеты осуществляется четыре за контейнер, и транспортируются полуприцепа. Исследованы Patriot противоракетная система восходит по крайней мере, 20 лет. Первоначально он был разработан как зенитно-ракетного чтобы сбивать вражеские самолеты. В первой войны в Персидском заливе когда, что война на, Армия хотела использовать его для сбивать Скада, а не самолеты. ВВС Ирака был не столько проблемы, но армия волновался о Скадов. И таким образом они пытались обновить Patriot. -Intercepting Врага Ракета путешествия в Маха 5 собирался быть достаточно сложной. Но когда Patriot был доставлен в эксплуатацию, Армия не было известно о Иракский модификация, которая сделал их бокоплавы почти невозможно него. Что случилось является Скада, что приезжали в были нестабильны. Они были шаткими. Причина этого была в Iraqis-- для того, чтобы получить 600 километров из из 300-километровой дальности missile-- взял вес из передней боеголовки, и сделал боеголовка легче. Так что теперь Patriot пытается прийти на Скад, и большую часть time-- подавляющее большинство time-- было бы просто летать на Скад. -После Системных операторов Patriot понял Patriot мимо ворот, они взорвали боеголовку Патриотического чтобы избежать возможных жертв, если он разрешили упасть на землю. -Это Было то, что видел большинство людей как большие огненные шары в небе, и поняли, как перехватывает из Скад боеголовок. -Хотя В ночном небе, патриотов казалось, успешно уничтожив Скад, в Дахране не может быть нет ошибка о его исполнении. Там радиолокационная система Патриотического потеряли след входящего Скад и никогда не запущен в связи к программному изъян. Это было израильтян, которые впервые обнаружен что чем дольше система была на, тем больше время расхождения стали. В связи с часами встроенного в компьютере системы. -Около За ​​две недели до Трагедия в Дахране, израильтяне сообщили Министерство обороны что система теряла время. Через восемь часов бега, они заметили, что система становится заметно менее точным. Министерство обороны ответил, рассказывать все батарейки Patriot чтобы не оставить систем в течение долгого времени. Они никогда не говорили, что долгое время было. 8 часов, 10 часов, в тысячу часов. Никто не знал. -аккумуляторную Батарею Patriot размещены в казармах в Дахране и его недостатки внутреннего Часы были на протяжении более 100 часов в ночь на 25 февраля. -It Отслеживать время с точностью около одной десятой доли секунды. Теперь десятую секунды интересный номер потому что она не может быть выражена в двоичном точно, что означает, что она не может быть выражена точно в любом современном цифровом компьютере. Трудно поверить, но использовать это в качестве примера. Возьмем число треть. Треть не может быть выражается в десятичной точно. Треть является 0,333 происходит для бесконечности. Там нет способа сделать это с абсолютная точность в десятичной. Это именно то, проблемы что случилось в Patriot. Чем дольше система заработала, хуже ошибка времени стал. -После 100 часов работы, Ошибка во времени было только около одной трети секунды. Но с точки зрения адресности Ракета путешествия в 5М, это привело к отслеживанию Ошибка более 600 метров. Было бы фатальной ошибкой для солдат на Дахране. Что случилось в запуск Скад было обнаружены спутниками раннего предупреждения, и они знали, Скад шел в их общем направлении. Они не знали, где он шел. Теперь настало время, чтобы радара компонент системы Patriot защищая Dhahran, чтобы найти и сохранить трек приближающейся ракеты противника. Исследованы радар был очень умен. Было бы на самом деле отслеживания Положение Скад а затем предсказать, где он, вероятно, будет в следующий раз радар послал импульс из. Это называется ворота диапазон. -Тогда Раз Патриоте решает достаточно времени имеет прошел, чтобы вернуться и проверить на следующий Расположение для этого обнаруженного объекта она восходит. Поэтому, когда речь вернулась к неправильным место, тогда не видит объект. И он считает, что не было ни одного объекта. Это было ложное обнаружение и он падает дорожку. Исследованы входящий Скад исчез с экрана радара, и несколько секунд спустя, его врезался в казармы. Скад убит 28. Было последний уволен во время первой войны в Персидском заливе. К сожалению, обновление программного обеспечения прибыли на рассвете следующего дня. Программное обеспечение недостаток был был фиксированный, закрытие одна глава в проблемных История ракеты Patriot. [END ВИДЕОВОСПРОИЗВЕДЕНИЕ] David J. МАЛАН: Вот именно для CS50. Мы будем видеть Вас в среду. [МУЗЫКА ИГРАЕТ]