Перепишите следующую программу без ошибок и определите, какое значение будет иметь переменная p после
Обновлено: 21.11.2024
Компьютерная программа представляет собой набор инструкций (также называемых кодом), данных компьютеру для выполнения какой-либо задачи, которая может быть любой: от суммирования чисел от 1 до 10 до моделирования климата. Когда компьютер следует инструкциям, данным в программе, мы говорим, что компьютер выполняет программу. Есть много разных способов написать эти инструкции для компьютера (мы говорим о программировании на разных языках) — в этой статье мы будем использовать язык C++. По его окончанию вы сможете писать свои собственные программы для выполнения основных математических и научных задач.
Наша первая программа на C++
Наша первая программа на C++ скажет компьютеру распечатать текст "Hello world!". Вот он (не волнуйтесь, он будет объяснен построчно).
Чтобы компьютер мог запустить эту программу, она должна быть сначала скомпилирована компилятором (это означает ее перевод с языка C++ на родной язык машинного кода компьютера). Есть полезный онлайн-ресурс codepad.org, который делает для нас шаги по компиляции и запуску программы. Перейдите на этот веб-сайт, выберите параметр «C++» для языка и скопируйте и вставьте (или, что еще лучше, введите) программу выше в текстовое поле, прежде чем нажать кнопку «Отправить». Если вы ввели текст правильно, вы должны увидеть следующее для вывода:
Если этого не произошло, возможно, вы неправильно вошли в программу — попробуйте еще раз.
Чтобы понять, что происходит, давайте рассмотрим структуру программы.
Эти первые две строки сообщают компилятору о ряде доступных функций. Функция — это блок кода, который в данном случае уже существует в памяти компьютера и готов к использованию. Пока вам не нужно точно понимать, что означают эти строки; только то, что они должны быть помещены в начало большинства программ на C++, которые вы будете писать. В этой программе мы хотим использовать функцию cout, которая выводит текст.
Этот тип структуры обозначает функцию в программе, называемую "основной". Это специальная функция; мы можем (и позже будем) определять функции с другими именами, но компьютер будет искать эту функцию для начала выполнения начальных инструкций, которые мы помещаем в скобки (они показывают, где функция начинается и заканчивается). Позже мы подробнее опишем синтаксис функции.
Это строка комментария. Когда компилятор увидит "//", он будет игнорировать все, что идет после этого, до конца строки. Добавление этого текста не влияет на поведение программы, но может быть полезно, когда человек захочет прочитать и понять код позже.
Например, предположим, что мы объявили целочисленную переменную с именем «возраст». Выражение age >= 18 имеет логическое значение и истинно, если возраст $\ge$ 18, и ложно в противном случае. Аналогично, мы могли бы написать возраст > 17. Мы можем сохранить результат этого выражения в логической переменной. Вот пример программы:
Попробуйте запустить программу. Попробуйте изменить значение age, а также попробуйте другие операторы сравнения (например, попробуйте заменить >= одним из , 17 — допустимый фрагмент кода C++, и всегда имеет значение false). Мы также можем комбинировать выражения сравнения так же, как мы комбинировали логические значения вместе с && и ||. Что делает следующий фрагмент кода?
Этот код также показывает, где еще используются скобки < >. Они похожи на круглые скобки ( ) в математическом выражении, таком как (((2+3)*5)-4)*(3-4). Они должны быть вложены друг в друга и должным образом сопоставляться — например, )2+(3*7)+3( не является допустимым математическим выражением. Каждый раз, когда < появляется в коде C++, за ним нужно следовать где-то позже с помощью соответствующего >. Мы можем объединить операторы if таким образом, например:
Мы также можем расширить операторы if до блока кода if-else. Это имеет общую форму if ( expr1 ) < code1 > else if ( expr2 ) < code2 >. else if ( exprN ) < codeN >else (но возможны многие варианты). Компьютер по очереди проверит каждое выражение expr1, expr2, ., чтобы убедиться, что какое-либо из них истинно. Если это правда, то код внутри скобок будет выполнен, и дальнейшие выражения не будут проверяться. Если ни одно из выражений не является истинным, то выполняется код в последних скобках (lastCode выше). Любая из частей else if или else может быть исключена, чтобы также получить корректный код. В следующем примере программы показано их использование.
При запуске программы отображается текст "x меньше y". Мы могли бы удалить последнюю часть else, чтобы создать корректную программу на C++, которая не будет отображать никаких результатов при запуске (поскольку ни одно из выражений x > y или x == y i> верно), например:
Или мы могли бы удалить среднюю часть "else if", чтобы выполнялся либо первый код, либо второй код.
Упражнение. Напишите программу, определяющую переменную x с некоторым начальным значением и оператор if-else, выводящий, является ли x нечетное или четное.
Циклы
Циклы — это следующая важная концепция в программировании. C++ позволяет многократно выполнять блок кода до тех пор, пока не будет достигнуто какое-либо условие (например, пока значение целочисленного счетчика не достигнет 10).
Первый тип циклов — это цикл while. Чтобы использовать это в программе на C++, мы вставляем код формы
- Если выражение ложно, то пропустите код внутри скобок < >и продолжите работу с программой.
- В противном случае выполните код в квадратных скобках < >и снова перейдите к шагу 1.
Поэтому код в квадратных скобках < >будет выполняться повторно, пока выражение не станет ложным.
Давайте рассмотрим пример. Попробуйте запустить следующую программу:
Упражнение: напишите программу, которая выводит числа от 0 до 9 по порядку, а затем обратно до 0. Вам понадобятся два цикла while.
На самом деле такое использование цикла while (где мы увеличиваем переменную счетчика каждый раз, пока она не достигнет определенного значения) происходит так часто, что в C++ есть специальный способ записи — цикл for. Общая форма:
Давайте рассмотрим пример цикла for, суммирующего числа от 0 до 10 и выводящего значение:
Упражнение: Измените приведенную выше программу:
- Таким образом, он суммирует квадраты от 0 до 10.
- Добавьте целочисленную переменную с именем N с некоторым начальным значением (например, 100) и измените код так, чтобы он суммировал квадраты от 0 до N. ли>
Гипотеза Коллатца утверждает, что следующий процесс всегда останавливается для всех начальных значений n:
- Возьмите целое число n больше 0.
- Если n четное, уменьшите его вдвое. В противном случае установите значение 3n+1.
- Если n теперь имеет значение 1, остановитесь. В противном случае перейдите к шагу 2.
Упражнение: напишите программу на C++ для проверки гипотезы Коллатца, которая выводит n на каждой итерации (мы даем программу решения ниже, но попробуйте сначала написать ее!).
Упражнение. Напишите программу на C++, реализующую алгоритм Евклида.
Функции
В простейшем случае функция — это способ группировки набора инструкций, чтобы их можно было многократно выполнять. У каждой функции есть имя (у них те же правила, что и у имен переменных, поэтому они чувствительны к регистру; разрешены буквы, цифры и _, и они не могут начинаться с цифры). В начале программы на C++ мы «объявляем» функцию, которая сообщает компилятору, что она существует (иначе, когда встречается имя функции, компилятор не знал бы, что оно означает). Затем где-то в программе мы «определяем» функцию, т. е. пишем инструкции для функции. Когда мы хотим выполнить инструкции в функции, мы вызываем ее, записывая ее имя (как будет видно).
Давайте рассмотрим пример. Мы пишем функцию countToTen, которая выводит числа от 1 до 9. Во-первых, нам нужно включить следующую строку кода где-то в верхней части программы, чтобы определить функцию:
Ключевое слово void говорит о том, что функция не возвращает значение. Подробнее об этом чуть позже. Вскоре будет объяснено использование символа () и, конечно же, точки с запятой; требуется в конце инструкции.
И чтобы определить функцию, мы включаем следующий блок кода (обратите внимание, что на этот раз мы не ставим точку с запятой в конце первой строки):
Здесь // код заменяется кодом, который будет выполняться при вызове функции. Как видите, форма очень похожа на out int main() — это потому, что «main» на самом деле является специальной функцией, которую вызывает компьютер. Когда мы хотим вызвать функцию, мы пишем countToTen();. Давайте посмотрим на полную программу, которая дважды вызывает эту функцию. Попробуйте запустить его.
Они называются функциями, потому что могут вести себя как математические функции — они могут иметь входные значения и/или выходные значения.
Чтобы объявить функцию с набором входных переменных (которые могут быть любым из типов переменных, которые мы видели до сих пор), мы перечисляем эти типы в скобках ( ) в объявлении, разделенных запятыми (мы также можем включить имена для этих переменных, которые полезны для описательных целей).
Давайте изменим приведенную выше функцию countToNine, чтобы она имела входное значение (которое мы называем N) и печатала числа от 1 до N. Мы объявляем функцию следующим образом (изменив ее имя):
Мы аналогичным образом определяем функцию, заменив 9 в цикле for на N. Чтобы вызвать функцию со значением, скажем, 5, напишем «countToN(5);». Если у нас есть целочисленная переменная с именем x, мы можем использовать значение x в качестве входных данных, написав «countToN(x);».Давайте соберем это вместе, чтобы сформировать полную программу — попробуйте угадать, что делает следующая программа, прежде чем запускать ее!.
Чтобы объявить функцию с выходным значением (которое называется возвращающим значение), мы заменяем ключевое слово void типом значения. Например, если бы мы хотели вернуть десятичное число, мы бы заменили void на float. Внутри функции, когда мы хотим вернуться из функции туда, откуда функция была вызвана, мы пишем "return value;", где value заменяется возвращаемым значением (например, 5 или x).
Давайте создадим функцию с именем gcd, которая имеет два входных значения (которые мы будем называть a и b) и (грубо) вычисляет их наибольший общий делитель и возвращает значение. Как описано выше, мы объявляем функцию как
И для определения функции мы используем аналогичный формат (на этот раз снова без точки с запятой в конце первой строки):
Упражнение: Как и почему работает алгоритм, приведенный в приведенной выше функции?
Для вызова функции мы пишем, например, gcd( 168, 120 ). Затем это обрабатывается как целое число, значением которого является возвращаемое значение, поэтому мы можем рассматривать его как любое другое целое число. Например, мы можем написать «int x = gcd (168, 120);» чтобы создать целое число с этим значением. Или мы могли бы написать "cout
Упражнение: измените код в функции gcd, чтобы она использовала алгоритм Евклида, который более эффективен в вычислительном отношении.
Упражнение. Напишите функцию, которая принимает два целых числа a и b и возвращает значение $a^b$.
Другие математические функции
Мы рассмотрели основные функциональные возможности C++. C++ также поставляется с целым набором предопределенных функций, например, с такими распространенными математическими функциями, как sin, cos и квадратный корень, а также с функциями для генерации случайных чисел.
Общие математические функции
Это содержит новый код — float(rand()) превращает целое число, возвращаемое rand(), в число с плавающей запятой с тем же значением. Это необходимо, так как если мы делим два целых числа, то часть после запятой отбрасывается. Вот пример программы, генерирующей 10 случайных чисел от 0 до 1.
Упражнение. Как бы вы сгенерировали случайное целое число от 1 до 10?
Упражнение. Используйте случайные числа и стрелку Бюффона, чтобы вычислить число Пи.
Проект NRICH направлен на то, чтобы обогатить математический опыт всех учащихся. Чтобы поддержать эту цель, члены команды NRICH работают в самых разных областях, в том числе обеспечивают профессиональное развитие учителей, желающих внедрить сложные математические задачи в повседневную классную практику.
Условные операторы являются частью каждого языка программирования. С условными операторами у нас может быть код, который иногда запускается, а иногда не запускается, в зависимости от условий программы в это время.
Когда мы полностью выполняем каждый оператор программы, двигаясь сверху вниз, при этом каждая строка выполняется по порядку, мы не просим программу оценивать определенные условия. Используя условные операторы, программы могут определить, выполняются ли определенные условия, а затем получить указание, что делать дальше.
Давайте рассмотрим несколько примеров использования условных операторов:
- Если учащийся набрал более 65 % по тесту, сообщите, что его оценка сдана; если нет, сообщите, что ее оценка неудовлетворительна
- Если у него есть деньги на счету, рассчитайте проценты; если нет, взимать штраф
- Если они покупают 10 или более апельсинов, рассчитайте скидку в размере 5%; если они покупают меньше, то не
Благодаря оценке условий и назначению кода для выполнения в зависимости от того, выполняются эти условия или нет, мы пишем условный код.
Это руководство поможет вам написать условные операторы на языке программирования Python.
Предпосылки
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке локальной среды программирования или среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.)< /p>
Если оператор
Мы начнем с оператора if, который будет оценивать, является ли утверждение истинным или ложным, и запускать код только в том случае, если утверждение верно.
Информация. Чтобы следовать примеру кода из этого руководства, откройте интерактивную оболочку Python в локальной системе, выполнив команду python3. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>.
В текстовом редакторе откройте файл и напишите следующий код:
В этом коде у нас есть переменная оценка, и мы присваиваем ей целочисленное значение 70 .Затем мы используем оператор if, чтобы оценить, больше или равно ( >= ) значение переменной 65 . Если он соответствует этому условию, мы говорим программе распечатать строку «Проходной балл» .
Сохраните программу какgrade.py и запустите ее в локальной среде программирования из окна терминала с помощью команды pythongrade.py .
В этом случае оценка 70 соответствует условию быть больше или равной 65, поэтому после запуска программы вы получите следующий вывод:
Давайте теперь изменим результат этой программы, изменив значение переменной Grade на 60:
Когда мы сохраним и запустим этот код, мы не получим никаких выходных данных, потому что условие не было выполнено, и мы не указали программе выполнение другого оператора. р>
Чтобы привести еще один пример, давайте подсчитаем, меньше ли баланс банковского счета 0. Давайте создадим файл с именем account.py и напишем следующую программу:
Когда мы запустим программу с python account.py, мы получим следующий вывод:
В программе мы инициализировали переменную balance со значением -5, что меньше 0. Поскольку баланс соответствует условию оператора if ( balance ), после сохранения и запуска кода мы получим строковый вывод. Опять же, если мы изменим баланс на 0 или положительное число, мы не получим никакого вывода.
Инструкция Else
Вероятно, мы захотим, чтобы программа что-то делала, даже если оператор if оценивается как ложный. В нашем примере с оценками нам нужно будет вывести, является ли оценка удовлетворительной или неудовлетворительной.
Для этого мы добавим оператор else к приведенному выше условию оценки, построенному следующим образом:
Поскольку приведенная выше переменная оценки имеет значение 60 , оператор if оценивается как ложный, поэтому программа не выводит проходной балл . Следующее за ним выражение else сообщает программе, что она должна что-то сделать в любом случае.
Когда мы сохраним и запустим программу, мы получим следующий вывод:
Если мы затем перепишем программу так, чтобы оценка была равна 65 или выше, вместо этого мы получим на выходе проходную оценку .
Чтобы добавить оператор else в пример с банковским счетом, мы перепишем код следующим образом:
Здесь мы изменили значение переменной balance на положительное число, чтобы оператор else распечатывался. Чтобы получить первый оператор if для печати, мы можем заменить значение отрицательным числом.
Комбинируя оператор if с оператором else, вы создаете условный оператор, состоящий из двух частей, который указывает компьютеру выполнять определенный код независимо от того, выполняется ли условие if.
Инструкция Else if
До сих пор мы представили логическую опцию для условных операторов, при этом каждое выражение if оценивается либо как true, либо как false. Во многих случаях нам понадобится программа, которая оценивает более двух возможных результатов. Для этого мы будем использовать оператор else if, который на Python написан как elif. Оператор elif или else if выглядит как оператор if и оценивает другое условие.
В программе банковского счета мы можем захотеть иметь три дискретных вывода для трех различных ситуаций:
- Баланс меньше 0
- Баланс равен 0
- Баланс больше 0
Инструкция elif будет помещена между оператором if и оператором else следующим образом:
Теперь есть три возможных вывода, которые могут произойти после запуска программы:
- Если переменный баланс равен 0, мы получим вывод оператора elif ( Баланс равен 0, скоро добавьте средства. )
- Если для переменного баланса задано положительное число, мы получим выходные данные инструкции else (Ваш баланс равен 0 или больше).
- Если для переменной balance задано отрицательное число, на выходе будет строка из оператора if ( Баланс ниже 0, добавьте средства сейчас, иначе с вас будет взиматься штраф ).
Что, если мы хотим иметь более трех возможностей? Мы можем сделать это, вписав в наш код более одного оператора elif.
Давайте перепишем код программыgrade.py так, чтобы несколько буквенных оценок соответствовали диапазонам числовых оценок:
- 90 или выше соответствует оценке A
- 80–89 соответствует оценке B.
- 70–79 соответствует оценке C.
- 65–69 соответствует оценке D.
- 64 или ниже соответствует оценке F.
Чтобы запустить этот код, нам потребуется один оператор if, три оператора elif и оператор else, который будет обрабатывать все неудачные случаи.
Давайте перепишем код из приведенного выше примера, чтобы он содержал строки, выводящие каждую буквенную оценку. Мы можем оставить оператор else без изменений.
Поскольку операторы elif оцениваются по порядку, мы можем сделать наши операторы довольно простыми. Эта программа выполняет следующие шаги:
Если оценка больше 90, программа напечатает оценку A, если оценка меньше 90, программа перейдет к следующему оператору…
Если оценка больше или равна 80, программа напечатает оценку B, если оценка 79 или меньше, программа перейдет к следующему оператору…
Если оценка больше или равна 70, программа напечатает оценку C, если оценка 69 или меньше, программа перейдет к следующему оператору…
Если оценка больше или равна 65, программа напечатает оценку D, если оценка 64 или меньше, программа перейдет к следующему оператору…
Программа напечатает неудовлетворительную оценку, поскольку не были соблюдены все вышеуказанные условия.
Вложенные операторы if
Как только вы освоитесь с операторами if , elif и else, вы можете перейти к вложенным условным операторам. Мы можем использовать вложенные операторы if для ситуаций, когда мы хотим проверить вторичное условие, если первое условие выполняется как истинное. Для этого мы можем иметь оператор if-else внутри другого оператора if-else. Давайте посмотрим на синтаксис вложенного оператора if:
Этот код может привести к нескольким возможным результатам:
- Если утверждение 1 оценивается как истинное, программа затем оценивает, является ли вложенное_оператор также истинным. Если оба случая верны, вывод будет таким:
- Если, тем не менее, оператор 1 оценивается как истина, а вложенное_оператор — как ложь, то вывод будет таким:
- И если оператор 1 оценивается как ложный, вложенный оператор if-else не будет выполняться, поэтому оператор else будет выполняться один, и вывод будет таким:
Мы также можем иметь несколько операторов if, вложенных в наш код:
В приведенном выше коде есть вложенный оператор if внутри каждого оператора if в дополнение к оператору elif. Это позволит использовать больше вариантов для каждого условия.
Давайте рассмотрим пример вложенных операторов if в нашей программеgrade.py. Мы можем сначала проверить, проходит ли оценка (больше или равна 65%), а затем оценить, какой буквенной оценке должна быть эквивалентна числовая оценка. Однако, если оценка не проходит, нам не нужно прогонять буквенные оценки, а вместо этого программа может сообщить, что оценка неудовлетворительна. Наш измененный код с вложенным оператором if будет выглядеть следующим образом:
Если мы запустим код с переменной оценкой, установленной на целочисленное значение 92 , первое условие будет выполнено, и программа выведет проходной балл: . Затем он проверит, превышает ли оценка значение 90 или равно ему, и, поскольку это условие также выполняется, он выведет A .
Если мы запустим код с переменной Grade, установленной на 60 , то первое условие не будет выполнено, поэтому программа пропустит вложенные операторы if и перейдет к оператору else, при этом программа распечатает Failinggrade .< /p>
Конечно, мы можем добавить еще больше параметров и использовать второй уровень вложенных операторов if. Возможно, мы захотим оценить оценки A+, A и A- отдельно. Мы можем сделать это, сначала проверив, является ли оценка удовлетворительной, затем проверив, является ли оценка 90 или выше, а затем проверив, превышает ли оценка 96 для A+, например:
В приведенном выше коде для переменной оценки, равной 96 , программа выполнит следующее:
- Проверьте, больше или равно ли значение 65 (истина)
- Распечатайте Проходной балл:
- Проверьте, больше ли оценка или равна 90 (правда)
- Проверьте, не превышает ли оценка 96 (ложь)
- Проверьте, больше ли оценка 93, а также меньше или равна 96 (правда)
- Распечатать А
- Оставьте эти вложенные условные операторы и продолжите работу с оставшимся кодом.
Поэтому результат программы для оценки 96 выглядит следующим образом:
Вложенные операторы if позволяют добавить в код несколько определенных уровней условий.
Заключение
Используя условные операторы, такие как оператор if, вы сможете лучше контролировать выполнение своей программы. Условные операторы говорят программе оценить, выполняется ли определенное условие. Если условие выполнено, будет выполнен определенный код, но если оно не выполнено, программа продолжит переход к другому коду.
Чтобы продолжить практиковать условные операторы, попробуйте использовать другие операторы, комбинируя операторы с операторами и или или , а также используя условные операторы вместе с циклами. Вы также можете ознакомиться с нашим учебным пособием «Как создать простую программу-калькулятор», чтобы лучше познакомиться с условными операторами.
Хотите узнать больше? Присоединяйтесь к сообществу DigitalOcean!
Присоединяйтесь к нашему сообществу DigitalOcean, насчитывающему более миллиона разработчиков, бесплатно!Получайте помощь и делитесь знаниями в нашем разделе "Вопросы и ответы", находите руководства и инструменты, которые помогут вам расти как разработчику и масштабировать свой проект или бизнес, а также подписывайтесь на интересующие вас темы.
Серия руководств: Как программировать на Python
Введение
Python – это гибкий и универсальный язык программирования, который можно использовать во многих случаях, с сильными сторонами в написании сценариев, автоматизации, анализе данных, машинном обучении и серверной разработке. Это отличный инструмент как для новичков, так и для опытных разработчиков.
Предпосылки
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке локальной среды программирования или среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.)< /p>
Операция модуля работает с целыми числами (и целочисленными выражениями) и дает остаток при делении первого операнда на второй. В Python оператор модуля представляет собой знак процента ( % ). Синтаксис такой же, как и для других операторов:
Таким образом, 7 разделить на 3 равно 2 с остатком 1.
Оператор модуля оказывается на удивление полезным. Например, вы можете проверить, делится ли одно число на другое: если x % y равно нулю, то x делится на y .< /p>
Кроме того, вы можете извлечь крайнюю правую цифру или цифры из числа. Например, x % 10 дает крайнюю правую цифру x (по основанию 10). Точно так же x % 100 дает две последние цифры.
4.2. Логические значения и выражения¶
Тип Python для хранения значений true и false называется bool в честь британского математика Джорджа Буля. Джордж Буль создал булеву алгебру, которая является основой всей современной компьютерной арифметики.
Есть только два логических значения: True и False. Использование заглавных букв важно, поскольку true и false не являются логическими значениями.
Логическое выражение – это выражение, результатом которого является логическое значение. Оператор == сравнивает два значения и возвращает логическое значение:
В первом операторе два операнда равны, поэтому выражение оценивается как True ; во втором утверждении 5 не равно 6, поэтому мы получаем False .
Хотя эти операции, вероятно, вам знакомы, символы Python отличаются от математических символов. Распространенной ошибкой является использование одного знака равенства ( = ) вместо двойного знака равенства ( == ). Помните, что = — это оператор присваивания, а == — оператор сравнения. Кроме того, не существует такого понятия, как = или => .
4.3. Логические операторы¶
Существует три логических оператора: и , или и не . Семантика (значение) этих операторов аналогична их значению в английском языке. Например, x > 0 и x 10 верно, только если x больше 0 и меньше 10.
n % 2 == 0 или n % 3 == 0 истинно, если верно любое из условий, то есть если число делится на 2 или 3.
Наконец, оператор not инвертирует логическое выражение, поэтому not(x > y) истинно, если (x > y) равно false, то есть если x меньше или равно y .
4.4. Условное выполнение¶
Чтобы писать полезные программы, нам почти всегда нужна возможность проверять условия и соответствующим образом изменять поведение программы. Условные операторы дают нам эту возможность. Простейшей формой является оператор ** if**:
Логическое выражение после оператора if называется условием. Если это правда, то выполняется оператор с отступом. Если нет, ничего не происходит.
Синтаксис оператора if выглядит следующим образом:
Как и в случае с определением функции из предыдущей главы и другими составными операторами, оператор if состоит из заголовка и тела. Заголовок начинается с ключевого слова if, за которым следует логическое выражение и заканчивается двоеточием (:).
Следующие операторы с отступом называются блоками. Первый оператор без отступа отмечает конец блока. Блок операторов внутри составного оператора называется телом оператора.
Каждый из операторов внутри тела выполняется в том порядке, в котором логическое выражение оценивается как True . Весь блок пропускается, если логическое выражение оценивается как False .
Количество операторов, которые могут появляться в теле оператора if, не ограничено, но должно быть хотя бы одно. Иногда бывает полезно иметь тело без операторов (обычно в качестве места хранения кода, который вы еще не написали).В этом случае вы можете использовать оператор pass, который ничего не делает.
4.5. Альтернативное исполнение¶
Второй формой оператора if является альтернативное выполнение, при котором есть две возможности, и условие определяет, какая из них будет выполнена. Синтаксис выглядит следующим образом:
Если остаток при делении x на 2 равен 0, то мы знаем, что x четно, и программа выводит соответствующее сообщение. Если условие ложно, выполняется второй набор операторов. Поскольку условие должно быть истинным или ложным, будет выполнена ровно одна из альтернатив. Альтернативы называются ветвями, потому что они являются ветвями в потоке выполнения.
Кроме того, если вам нужно часто проверять четность (четность или нечетность) чисел, вы можете обернуть этот код в функцию:
Для любого значения x print_parity отображает соответствующее сообщение. При ее вызове в качестве аргумента можно указать любое целочисленное выражение.
4.6. Связанные условные операторы¶
Иногда существует более двух возможностей, и нам нужно более двух ветвей. Одним из способов выражения подобных вычислений является связанное условие:
elif — это сокращение от else if. Опять же, будет выполнена ровно одна ветвь. Количество операторов elif не ограничено, но разрешен только один (и необязательный) оператор else, и он должен быть последней ветвью в операторе:
Каждое условие проверяется по порядку. Если первое ложно, проверяется следующее и так далее. Если хотя бы одно из них истинно, выполняется соответствующая ветвь, и оператор завершается. Даже если выполняется более одного условия, выполняется только первая истинная ветвь.
4.7. Вложенные условия¶
Одно условное выражение может быть вложено в другое. Мы могли бы написать пример трихотомии следующим образом:
Внешнее условное предложение содержит две ветви. Первая ветвь содержит простой оператор вывода. Вторая ветвь содержит другой оператор if, который имеет две собственные ветви. Обе эти ветки являются операторами вывода, хотя они могли бы быть и условными операторами.
Хотя отступы операторов делают структуру очевидной, вложенные условные операторы очень быстро становятся трудными для чтения. Как правило, рекомендуется избегать их, когда это возможно.
Логические операторы часто позволяют упростить вложенные условные операторы. Например, мы можем переписать следующий код, используя одно условие:
Операция print выполняется только в том случае, если мы проходим оба условия, поэтому мы можем использовать оператор and:
Такого рода условия распространены, поэтому Python предоставляет альтернативный синтаксис, похожий на математическую нотацию:
Это условие семантически такое же, как составное логическое выражение и вложенное условное выражение.
4.8. Оператор return¶
Инструкция return позволяет вам прервать выполнение функции до того, как вы достигнете конца. Одной из причин его использования является обнаружение ошибки:
Функция print_square_root имеет параметр с именем x . Первое, что он делает, это проверяет, меньше или равно ли x 0, и в этом случае он отображает сообщение об ошибке, а затем использует return для выхода из функции. Поток выполнения немедленно возвращается вызывающей стороне, а остальные строки функции не выполняются.
4.9. Ввод с клавиатуры¶
В разделе Ввод мы познакомились со встроенными функциями Python, которые получают ввод с клавиатуры: raw_input и input . Теперь давайте еще раз рассмотрим их более подробно.
При вызове любой из этих функций программа останавливается и ждет, пока пользователь что-нибудь введет. Когда пользователь нажимает клавишу Return или Enter, программа возобновляет работу, и raw_input возвращает то, что пользователь ввел в виде строки :
Перед вызовом raw_input рекомендуется напечатать сообщение, сообщающее пользователю, что вводить. Это сообщение называется подсказкой. Мы можем указать приглашение в качестве аргумента для raw_input :
Обратите внимание, что подсказка представляет собой строку, поэтому она должна быть заключена в кавычки.
Если мы ожидаем, что ответ будет целым числом, мы можем использовать функцию input, которая оценивает ответ как выражение Python:
Если пользователь вводит строку цифр, она преобразуется в целое число и присваивается скорость . К сожалению, если пользователь вводит символы, которые не составляют корректное выражение Python, программа аварийно завершает работу:
В последнем примере, если бы пользователь сделал ответ допустимым выражением Python, заключив его в кавычки, он не выдал бы ошибку:
Чтобы избежать подобных ошибок, рекомендуется использовать raw_input для получения строки, а затем использовать команды преобразования для ее преобразования в другие типы.
4.10. Преобразование типов¶
Каждый тип Python поставляется со встроенной командой, которая пытается преобразовать значения другого типа в этот тип. Команда int(ARGUMENT), например, принимает любое значение и преобразует его в целое число, если это возможно, или выдает ошибку в противном случае:
int также может преобразовывать значения с плавающей запятой в целые числа, но помните, что дробная часть усекается:
Команда float(ARGUMENT) преобразует целые числа и строки в числа с плавающей запятой:
Может показаться странным, что Python различает целочисленное значение 1 от значения с плавающей запятой 1.0 . Они могут представлять одно и то же число, но принадлежат к разным типам. Причина в том, что внутри компьютера они представлены по-разному.
Команда str(ARGUMENT) преобразует любой переданный ей аргумент в тип string :
str(ARGUMENT) будет работать с любым значением и преобразовывать его в строку. Как упоминалось ранее, True — это логическое значение; правда — нет.
Для логических значений ситуация особенно интересна:
Python присваивает логические значения значениям других типов. Для числовых типов, таких как целые числа и числа с плавающей запятой, нулевые значения являются ложными, а ненулевые значения — истинными. Для строк пустые строки считаются ложными, а непустые строки — истинными.
4.11. ГАСП¶
После установки gasp попробуйте следующий скрипт Python:
Предпоследняя команда делает паузу и ждет, пока не будет нажата клавиша. Без него экран мигал бы так быстро, что вы бы его не увидели.
Запустив этот скрипт, вы должны увидеть графическое окно, которое выглядит следующим образом:
С этого момента мы будем использовать вздох, чтобы проиллюстрировать (каламбур) концепции компьютерного программирования и добавить веселья во время обучения. Вы можете узнать больше о модуле GASP, прочитав Приложение B.
4.12. Глоссарий¶
блок Группа последовательных операторов с одинаковым отступом. body Блок инструкций в составной инструкции, следующий за заголовком. логическое выражение Выражение, которое либо истинно, либо ложно. логическое значение Существует ровно два логических значения: True и False . Логические значения получаются, когда логическое выражение оценивается интерпретатором Python. Они имеют тип bool . ветвь Один из возможных путей потока выполнения, определяемый условным выполнением. цепочка условная Условная ветвь с более чем двумя возможными потоками выполнения. В Python связанные условные операторы записываются с помощью if . Элиф. операторы else. оператор сравнения Один из операторов, который сравнивает два значения: == , != , > , , >= , а также . условие Логическое выражение в условном операторе, определяющее, какая ветвь выполняется. условный оператор Оператор, управляющий потоком выполнения в зависимости от некоторого условия. В Python ключевые слова if , elif и else используются для условных операторов. логический оператор Один из операторов, который объединяет логические выражения: и , или и не . модульный оператор Оператор, обозначаемый знаком процента ( % ), который работает с целыми числами и дает остаток при делении одного числа на другое. вложение одной структуры программы в другую, например условный оператор внутри ветви другого условного оператора. приглашение Визуальная подсказка, сообщающая пользователю о необходимости ввода данных. преобразование типов Явный оператор, который принимает значение одного типа и вычисляет соответствующее значение другого типа. Оборачивание кода в функцию Процесс добавления заголовка функции и параметров к последовательности операторов программы часто называют «обертыванием кода в функцию». Этот процесс очень полезен, когда рассматриваемые операторы программы будут использоваться несколько раз.
4.13. Упражнения¶
Попробуйте вычислить в уме следующие числовые выражения, а затем используйте интерпретатор Python, чтобы проверить свои результаты:
Что случилось с последним примером? Почему? Если вы смогли правильно предвидеть реакцию компьютера во всех случаях, кроме последнего, пора двигаться дальше. Если нет, найдите время, чтобы придумать собственные примеры. Изучайте оператор модуля, пока не будете уверены, что понимаете, как он работает.
Оберните этот код в функцию compare(x, y) . Вызовите compare три раза: по одному, если первый аргумент меньше, больше и равен второму аргументу.
Чтобы лучше понять логические выражения, полезно составить таблицы истинности. Два логических выражения логически эквивалентны тогда и только тогда, когда они имеют одну и ту же таблицу истинности.
Следующий скрипт Python выводит таблицу истинности для любого логического выражения в двух переменных: p и q:
Вы узнаете, как работает этот скрипт, в последующих главах. Сейчас вы будете использовать его для изучения логических выражений. Скопируйте эту программу в файл с именем p_and_q.py , затем запустите ее из командной строки и введите: p или q , когда будет предложено ввести логическое выражение. Вы должны получить следующий вывод:
Теперь, когда мы видим, как это работает, давайте поместим его в функцию, чтобы упростить использование:
Мы можем импортировать его в оболочку Python и вызвать truth_table со строкой, содержащей наше логическое выражение в p и q в качестве аргумента:
Используйте функции truth_table со следующими логическими выражениями, каждый раз записывая создаваемую таблицу истинности:
- не(p или q)
- p и q
- не(p и q)
- нет(р) или нет(q)
- не(р) и не(q)
Какие из них логически эквивалентны?
Введите следующие выражения в оболочку Python:
Проанализируйте эти результаты. Какие наблюдения вы можете сделать о значениях разных типов и логических операторах? Можете ли вы записать эти наблюдения в виде простых правил о и и или выражениях?
Поместите этот код в функцию dispatch(choice) . Затем определите function_a , function_b и function_c, чтобы они выводили сообщение о том, что они были вызваны. Например:
Поместите четыре функции ( dispatch , function_a , function_b и function_c в скрипт с именем ch04e05.py . Внизу этого скрипта добавьте вызов dispatch('b') . Вывод должен быть таким:
Наконец, измените сценарий, чтобы пользователь мог вводить «a», «b» или «c». Протестируйте его, импортировав свой скрипт в оболочку Python.
Напишите функцию с именем is_divisible_by_3, которая принимает одно целое число в качестве аргумента и печатает «Это число делится на три». если аргумент делится на 3 без остатка и «Это число не делится на три». иначе.
Теперь напишите аналогичную функцию с именем is_divisible_by_5 .
Обобщите функции, которые вы написали в предыдущем упражнении, в функцию с именем is_divisible_by_n(x, n), которая принимает два целочисленных аргумента и выводит, делится ли первый на второй. Сохраните это в файле с именем ch04e07.py. Импортируйте его в оболочку и попробуйте. Пример сеанса может выглядеть следующим образом:
Каков будет вывод следующего?
Объясните, что произошло и почему это произошло.
Следующий скрипт в файле house.py рисует простой дом на холсте:
Запустите этот скрипт и убедитесь, что у вас появилось окно, похожее на это:
- Поместите код дома в функцию с именем draw_house().
- Запустите скрипт сейчас. Ты видишь дом? Почему бы и нет?
- Добавьте вызов draw_house() в нижней части скрипта, чтобы дом вернулся на экран.
- Параметризируйте функцию с параметрами x и y — тогда заголовок должен стать def draw_house(x, y): , чтобы вы могли передать расположение дом на холсте.
- Используйте draw_house, чтобы разместить на холсте пять домов в разных местах.
Исследование: Прочтите Приложение B и напишите сценарий с именем houses.py, который при запуске выдает следующее:
Подсказка: вам нужно будет использовать Polygon для крыши вместо двух Line, чтобы получить filled=True< /tt> для работы с ним.
COSC 1320 — Программирование на C++ и
ITSE 1307 — Введение в программирование на C++
Боб Комер, профессор компьютерных исследований
Обзор экзамена 3
Ответы на общие вопросы
Сообщите мне, если вы обнаружите какие-либо ошибки в ответах.
Примечание. Все номера глав относятся к учебнику Гэддиса.
Подсказки к главе 10
<р>1. Я ожидаю, что вы сможете манипулировать значением переменной простого типа с помощью указателя. Это не особенно полезно, это просто демонстрирует, что вы знаете, как работают указатели. Например, для данной целочисленной переменной num напишите код для объявления переменной указателя с именем numPtr и сохранения адреса num в numPtr. Затем напишите код, чтобы изменить значение num на 5 и вывести его значение без использования имени переменной (используйте указатель).
2. Следующая функция (показана с примером вызова) использует ссылочные параметры для обмена значениями аргументов в вызове. Перепишите функцию, чтобы использовать указатели вместо ссылочных параметров (также перепишите пример вызова).Примечание: когда вы хотите изменить значения аргументов в вызове функции, вам действительно следует использовать ссылочные параметры, а не указатели. Это просто упражнение, чтобы показать, как работают указатели.
Исправленный код с использованием указателей:
<р>3. Я ожидаю, что вы сможете динамически выделять память для значения простого типа данных. Например, напишите код для динамического выделения памяти для значения с плавающей запятой, сохраните в нем 6,5, а затем распечатайте это значение. <р>4. Я ожидаю, что вы сможете динамически размещать массив данных простого типа. Например, напишите код для динамического выделения массива из 5 целых чисел, инициализируйте массив значениями < 10, 20, 30, 40, 50 >, а затем распечатайте значения из массива.
Обратите внимание, что для доступа к динамически выделенному массиву можно использовать запись массива или указателя (я использую запись массива).
5. Я ожидаю, что вы знаете взаимосвязь между указателями и массивами в C++ (см. раздел 10.3). Вот несколько заметок, которые я написал по этой теме.
Это не вопрос — просто несколько замечаний.
Вопросы 6–10 относятся к этому объявлению структуры:
6. Напишите объявление для переменной с именем itemPtr, которая может содержать адрес структуры Item. Затем динамически создайте структуру Item и задайте для ее номера позиции значение 10, для описания — «Яблоки бабушки Смит», а для цены — 1,89.
7. Напишите функцию, которая принимает в качестве параметров указатель на структуру Item, номер товара, описание и цену. Ваша функция должна присвоить номер позиции, описание и цену элементам данных структуры.
9. Напишите функцию, которая печатает описания всех элементов массива itemPtrs, где цена равна 2,0 или выше. Можно предположить, что массив заполнен (каждый элемент массива указывает на объект Item). <р>10. Напишите функцию, которая возвращает количество элементов Item в массиве itemPtr, цена которых равна 2,0 или выше. Можно предположить, что каждый элемент массива указывает на объект Item. <р>11. Напишите объявление структуры для хранения даты в виде трех целых значений: месяца, дня и года. Затем напишите код для динамического выделения даты, сохранения в ней некоторой информации и ее вывода на печать.
А2. Просмотрите следующий пример программы C++, которая динамически выделяет структуры и сохраняет их адреса в массиве указателей:
Следующие вопросы (12–17) относятся к этому объявлению класса:
<р>12. Объекты класса могут быть динамически размещены аналогично тому, как динамически распределяются структуры. Учитывая класс Item, объявленный выше, напишите клиентский код для создания переменной для хранения адреса объекта Item. Затем динамически выделите объект Item и задайте для его номера элемента значение 10, для описания — «Яблоки бабушки Смит», а для цены — 1,89.
13. Напишите клиентский код для объявления массива itemPtrs из 150 указателей на объекты Item.
А1. Просмотрите следующий пример программы C++, которая динамически выделяет объекты класса и сохраняет их адреса в массиве указателей:
Глава 11 Подробнее о классах
<р>1. Учитывая определение частичного класса:Вы хотите добавить функцию-конструктор, которая устанавливает для каждого члена данных нулевое значение. Что не так с этой реализацией конструктора?
Объект, который инициализируется конструктором, неявно передается функции-конструктору. (На самом деле передается указатель на объект с именем this.) Параметры функции представляют собой всего 2 целых числа, а НЕ переменные-члены объекта. Эта функция просто инициализирует свои параметры нулем и вообще не вносит никаких изменений в объект.Фактически, поскольку параметры имеют те же имена, что и переменные-члены объекта, вы не можете получить доступ к переменным-членам объекта без использования указателя this. Правильная версия этой функции:
<р>2. Учитывая частичный класс Point из предыдущей задачи, вы хотите добавить функцию набора, которая изменяет элементы данных на значения, указанные программистом-клиентом. Что не так с этой реализацией?Ключевое слово const делает это постоянной функцией-членом. Это означает, что компилятор не позволит изменять элементы данных объекта, вызывающего эту функцию. Нам нужно удалить ключевое слово const, чтобы разрешить сохранение новых значений в элементах данных:
Глава 12. Дополнительные сведения о символах, строках и классе строк
<р>1. Напишите объявление для C-строки (массива символов) с именем paperColor (она должна содержать 40-символьное имя цвета плюс завершающий нуль-символ). Затем напишите код для ввода значения paperColor с клавиатуры. (Можно предположить, что ввод не будет содержать пробелов.) <р>2. Используя переменную из вопроса 3, напишите код, чтобы установить для переменной paperPrice значение 3,95, если paperColor имеет значение "синий". <р>3. Используя вашу переменную из вопроса 3, напишите код для сохранения «beige» в paperColor . Затем напишите код для печати значения переменной (включая описательную метку). <р>4. Напишите объявление для C-строки (массива символов), называемой предложением (она должна содержать 80 символов плюс завершающий нуль-символ). Затем напишите код для ввода значения предложения с клавиатуры. (Предположим, что ввод находится на отдельной строке и может содержать пробелы.) <р>5. Для копирования одной строки в другую следует использовать функцию strcpy() (оператор присваивания работать не будет). Чтобы помочь вам понять, как работают строки C, попробуйте написать собственную версию функции strcpy(). Сделайте это пустой функцией. Ваш прототип функции должен выглядеть так:void strcpy( char toString[], char fromString[]);
<р>6. Учитывая сегмент кода:Что печатается, если вводится "Сегодня точно жарко"?
Когда оператор экстрактора используется для ввода строки, он делает следующее:
<ПР>Когда функция-член getline используется для ввода строки, она будет:
<ПР>
7. Напишите объявление для строкового объекта с именем paperColor. Затем напишите код для ввода значения paperColor с клавиатуры. (Можно предположить, что ввод не будет содержать пробелов.)
Что печатается, если вводится "Сегодня точно жарко"?
Глава 13 Файловый ввод/вывод
2.Файл содержит одну строку информации о каждом доме, проданном в Остине в прошлом году. Вам не нужна информация в файле, но вам нужно знать, сколько домов было продано в Остине в прошлом году. Напишите код C++ для выполнения этой работы. Включите объявление для вашего файлового объекта и код, чтобы открыть файл. Файл называется "HomeSales.txt", и длина каждой строки в нем не превышает 65 символов.
Глава 17. Связанные списки
<р>1. В каких случаях лучше использовать связанный список вместо массива структур или объектов? В каких случаях лучше использовать массив структур или объектов вместо связанного списка? Проблемы: максимальный размер, уменьшение/увеличение, редактирование (вставка/удаление), прямой доступ или обход.Масштаб проблемы (объем требуемой информации)
Если вы достаточно хорошо представляете, какой объем данных должна обрабатывать программа, лучшим выбором может стать массив.Просто не забудьте объявить массив таким, чтобы он содержал максимальное количество информации, которое может потребоваться программе для обработки. Например, если у большинства пользователей программы управления запасами будет от 100 до 150 единиц запасов, и ни у одного пользователя не будет более 200 единиц, вы можете объявить массив из 200 единиц запасов.
С другой стороны, размер массива должен быть постоянным. Таким образом, размер массива фиксируется во время компиляции. Когда вы сохраняете данные в массиве, вы устанавливаете верхний предел количества элементов данных, которые могут быть обработаны. Единственным ограничением на размер связанного списка является объем памяти компьютера. В ситуациях, когда количество элементов данных, которые необходимо обработать, неизвестно, лучше использовать связанный список.
В качестве другого примера предположим, что некоторые пользователи программы управления запасами будут иметь до 200 единиц запасов. Но у других пользователей может быть только 50 предметов инвентаря. Выделение массива из 200 элементов инвентаря, когда вам нужно хранить только 50, тратит память. В ситуациях, когда объем данных, которые необходимо обработать разным пользователям, сильно различается, хорошим выбором может быть связанный список. (Примечание: обычно нецелесообразно создавать индивидуальную версию программы для каждого пользователя. Например, захочет ли компания продавать одну версию текстового процессора пользователям, которым нужно создавать только небольшие документы, а другую версию — пользователям. кому нужно создавать большие документы?)
Редактирование отсортированных списков данных
Допустим, вы ведете список элементов инвентаря, где каждый элемент представлен в виде структуры или объекта. Список элементов может меняться - элементы могут быть добавлены в список или удалены из списка. Возможно, вы захотите сохранить список в каком-то заранее определенном порядке, например, отсортировав его по номеру элемента инвентаря.
Если вы храните список в массиве структур или массиве объектов, вставка или удаление элементов инвентаря может потребовать значительного объема работы. Например, если вам нужно вставить новый элемент инвентаря в индекс 95 массива, все элементы от индекса 95 до конца списка необходимо скопировать в следующую более высокую позицию в массиве, чтобы освободить место для нового элемента. Если вам нужно удалить элемент с индексом 80 в массиве, вам нужно заполнить дыру, оставленную удаленным элементом, скопировав элемент с индекса 81 на освободившееся место, а каждый оставшийся элемент в списке необходимо скопировать в следующий нижний индекс в массиве.
Если список хранится в связанном списке, новый элемент инвентаря можно добавить, выделив новую структуру или объект для нового элемента, а затем изменив ссылки (указатели) в списке, чтобы добавить элемент. Удаление элемента в списке просто включает изменение ссылок, чтобы обойти удаленный элемент, а затем освобождение удаленной структуры или объекта. С помощью связанных списков вам никогда не придется перемещать данные из одного места в другое при вставке или удалении. Таким образом, связанные списки могут быть гораздо более эффективными в этой ситуации.
Авторские права: Ó 2005 г., Общественный колледж Остина.
Кафедра компьютерных исследований. Все права защищены.
Комментарии: Бобу Комеру
Последнее обновление: 12 декабря 2009 г.
Читайте также: