Информатика - Новый полный справочник для подготовки к ОГЭ
Программы. Оператор присваивания. Линейный алгоритм - Обработка информации - ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ
Конспект
В этой главе рассматривается самая сложная тема курса информатики — программирование1.
Основная задача процесса программирования — написать такую программу для компьютера, чтобы он выполнил требуемые действия. Проблема в том, что компьютер не умеет выполнять словесные алгоритмы, которыми пользуются люди. Компьютер умеет выполнять только ограниченный набор из нескольких сотен примитивных команд, каждая из которых имеет специальный номер (эти номера называются машинными кодами). Писать инструкции для компьютера при помощи машинных кодов — очень утомительное занятие, подверженное многочисленным ошибкам. Для облегчения этого процесса, люди придумали нечто среднее между формальными номерами — машинными кодами и языком человека. И называли это языками программирования. Язык программирования гораздо ближе к человеческому языку и на нём людям гораздо проще записывать свои алгоритмические мысли. В то же время он весьма формален и можно научить компьютер его понимать. Однако, за это удобство приходится платить двойным переводом. Сначала человек должен перевести свои алгоритмические мысли (на человеческом языке) на язык программирования (программу), а затем компьютер переводит текст программы в последовательность машинных кодов.
Мы рассмотрим программирование на примере языка программирования Паскаль. Его придумал в середине 20-го века швейцарский профессор Николаус Вирт специально для обучения программированию. Это достаточно простой и удобный для начинающих язык. К тому же, он прекрасно поддерживается обоими экзаменами по информатике (ОГЭ и ЕГЭ).
Команды языка записываются при помощи некоторого набора английских слов. Даже если вы не знаете английского языка, слов используется так немного, что их легко запомнить.
Несмотря на теоретическую направленность данного пособия, изучать программирования крайне желательно на практике. То есть, программы, которые будут обсуждаться, желательно писать на компьютере, чтобы сразу запускать их и смотреть на результат. Такой процесс позволит вам использовать компьютер для поиска синтаксических ошибок и для того, чтобы сразу соотносить то, что выводит ваша программа с тем, что она должна выводить. Подобная практика решения задач позволит вам научиться самим находить ошибки в программе.
Мы рекомендуем использовать для обучения среду PascalABC. Это бесплатная среда, разрабатываемая в России специально для обучения программированию. Её можно легко скачать с сайта разработчиков. Например, pascalabc.net.
Программа. Линейный алгоритм
Выше уже говорилось, что язык программирования (и Паскаль, в частности) — это некое формальное описание, не допускающее толкований. Чтобы обеспечить эту формальность, язык программирования состоит из очень небольшого количества команд. Каждая из этих команд имеет название, которое должно быть написано именно так, буква в букву, как это придумано. Знаки препинания, которые используются при написании этих команд, также формализованы. Их нужно записывать именно по тем правилам, которые придуманы в языке.
Команды выполняются последовательно, одна за другой. Чтобы было легче читать программу и чтобы эту особенность — последовательно одна за другой — было легче воспринимать, команды принято записывать друг под другом, по одной команде в строке.
Любая программа на языке Паскаль должна иметь начало и конец. Это обозначается при помощи специальных слов Паскаля: begin (начало) и end (конец). Внимание! После слова end, заканчивающего программу, для указания, что это именно конец, должна стоять точка.
Самая простая программа на Паскале выглядит так:
Данная программа — пустая. Она ничего не делает и не содержит ни одной команды.
Рассмотрим команду языка Паскаль, которая делает что-то полезное и понятное. Это команда write — команда вывода на экран.
Что же выводит на экран команда write? То, что указано после команды write в скобках. Содержимое скобок называется параметрами.
Например, команда write (’ Привет ' ) выводит на экран текст “Привет”. Чтобы показать Паскалю, что “Привет” — это не команда, а просто текст, его нужно заключить в специальные одиночные кавычки, называемые апострофами. Символ апострофа располагается на клавиатуре непосредственно слева от клавиши [Enter] в английской раскладке. Программа, которая выводит на экран слово “Привет” выглядит так:
Вы можете ввести эту программу в среде PascalABC в большом поле, где стоит курсор клавиатуры после запуска приложения и запустить её, нажав клавишу [F9]. В нижнем поле после этого появится результат работы программы — выведенное слово “Привет”.
Рассмотрим программу, выводящую несколько фраз на экран. Например, “Привет! Как дела!?”. Это можно, конечно, сделать, написав весь текст сразу в одной команде write, но мы специально запишем в двух разных командах, чтобы показать, как это делается. Программа будет такой:
Обратите внимание — после первой команды write (...) стоит символ “;” (точка с запятой). Он нужен каждый раз, когда вы перечисляете несколько команд для отделения одной команды от другой. Если забыть поставить точку с запятой, программа не запустится и компьютер скажет, что обнаружил синтаксическую ошибку.
Запустим эту программу и увидим, что обе фразы “Привет!Как дела!?” вывелись на экран слитно, в одной строке, друг за другом. Именно так работает команда write. После её выполнения воображаемый (обычно невидимый) курсор вывода на экран остаётся в конце того текста, который write выводит на экран.
Чтобы написать текст с новой строки, следует дать команду перевести этот курсор вывода на экран на следующую строку. Это делает другая команда языка Паскаль — writein. Её название построено из двух слов — write (писать) и line (строка). Только второе слово сокращено до “1п”. Таким образом, чтобы получить на экране текст в виде:
нужно написать такую программу:
Первый write выводит на экран “Привет!”, вторая команда — writein — переводит курсор вывода в начало следующей строки, третья команда выводит на экран “Как дела!?”.
Приведённая программа является отличным примером линейного алгоритма. Команды записаны друг за другом и выполняются последовательно, одна за другой, от первой до последней.
Заметим, что необходимость вывести что-то на экран и затем перевести курсор вывода на следующую строку, возникает очень часто. Поэтому в языке Паскаль придумана специальная команда, которая и выводит на экран, и сразу после этого переводит курсор вывода на следующую строку. Эта команда — writeln с параметром.
А именно, вместо того, чтобы писать, как в нашем примере:
можно написать в одну команду:
Целочисленный тип данных. Переменные
Программа, которая просто выводит на экран один и тот же тест и ничего не делает — не слишком часто нужная вещь. Обычно люди хотят от компьютера чего-нибудь большего, например, чтобы он что-нибудь вычислил.
Когда требуется вычислить что-то конкретное один раз, можно просто попросить вывести результат в команде write. Например, вычислим и выведем на экран всем известный результат “два плюс три”:
После запуска программы на экране отобразится число 5. Как видите, команда write умеет выводить на экран не только текст, но и числа.
Такая программа тоже не слишком интересна. Она всегда вычисляет одно и то же. А нам хотелось бы, чтобы компьютер работал как калькулятор, и можно было бы дать программе (ввести с клавиатуры) какое-нибудь число (или несколько чисел). В свою очередь, программа пусть выполняет по этим числам некие вычисления и выдаёт на экран результат.
Для того, чтобы вводимое с клавиатуры число можно было обработать, программе это число необходимо, хотя бы временно, сохранить. Хранение осуществляется в памяти компьютера, используя специальную технологию программирования, которая называется переменная (величина).
В данной главе мы рассмотрим целочисленные переменные. Это ячейки памяти компьютера, которые могут хранить в себе целые числа. Чтобы такое возможно было использовать в программе, требуется перед её началом (перед begin) сообщить компьютеру, что мы в программе собираемся использовать переменные, написав специальное служебное слово var. Это не команда, а слово языка Паскаль, которое означает, что с этого места начинается раздел описания переменных программы. После слова var нужно перечислить имена переменных, которые нужны, и указать их тип данных.
Например:
Тип данных — это указание на то, какого рода информацию планируется хранить в переменных. В нашем случае мы собираемся хранить целые числа. Этот тип данных на Паскале называется integer.
Тип integer — основной тип данных языка Паскаль для хранения целочисленных данных. Если программа запускается на современном компьютере и в современной среде программирования, в ячейке типа integer можно хранить числа в диапазоне 2 147 483 648..+ 2 147 483 647 (чуть больше двух миллиардов по модулю). Этого диапазона начинающему вполне должно хватить. Иногда вы можете столкнуться с другими целочисленными типами данных (byte, word, longint). В учебных задачах просто считайте, что это integer.
Имена переменных — это то, как в программе мы хотим называть используемые ячейки памяти. В нашем примере требуется выделить для работы программы три ячейки памяти с названиями “а”, “b” и “vasya”. Имена переменных в Паскале придумывает тот, кто пишет программу (программист). Они должны начинаться с буквы латинского алфавита (или символа подчеркивания). Могут содержать в себе цифры, буквы латинского алфавита и знаки подчеркивания. Пробелы и знаки препинания использовать в именах переменных нельзя. Имена переменных не могут совпадать со служебными словами языка Паскаль.
Таким образом, текст программы “var а, b, vasya : integer; ” сообщает компьютеру, что программа просит для своей работы выделить в памяти три ячейки, каждая из которых должна быть такого размера, чтобы в неё помещалось целое число типа integer, и к этим ячейкам программа планирует далее обращаться по именам “а”, “b”, “vasya”.
Данные ячейки компьютер выделит в памяти в момент запуска программы и освободит, когда программа закончит свою работу.
Благодаря приведённому тексту программы: “var a, b, vasya : integer;”, мы описали переменные “а”, “b”, “vasya”. Теперь их можно использоваться в программе.
Возможно, вы заметили, что само по себе описание переменных ещё не означает, что в программе они будут использоваться. В приведённом примере программа выделяет три ячейки памяти, ничего больше не делает и заканчивает свою работу.
Рассмотрим теперь, что же можно делать с переменными типа integer.
Самое важное, что нужно понимать при работе с переменными — это выполнение инструкции “ :=”, называемой оператор присваивания.
Пример, а := 15;
Смысл этого оператора следующий. Необходимо вычислить выражение, которое записано в правой части оператора (после символов : =) и положить результат вычисления в переменную, имя которой записано в левой части оператора присваивания. В нашем случае выражение равно числу 15. И это число 15 будет помещено в ячейку-переменную “а”.
Важно понимать, что значение, которое перед этим лежало в переменной “а”, исчезнет и заменится на число 15.
Символы оператора присваивания “ : =” должны быть обязательно написаны слитно, без пробела между ними.
Ещё один пример оператора присваивания:
b : = а + 7 ;
В данном случае из ячейки-переменной “а” берётся число, которое в ней хранится в этот момент, прибавить к нему число 7 и результат кладётся в ячейку-переменную “b”.
Возникает разумный вопрос: “Какое число хранится в этот момент в ячейке “а”?”
Если команда “b := а + 7;” выполняется после команды “а : = 15; ”, то в ячейке “а” к этому моменту лежит число 15 и значение переменной “Ь” будет равно 22. Если же перед командой “b : = а + 7; ” не написать никакой команды, которая бы задала начальное значение переменной “а”, то результат операции будет непредсказуем. Потому что, если не задать начальное значение переменной, в ячейке будет лежать неизвестное, произвольное число.
Скорее всего, конечно, там будет лежать число 0 (именно это можно увидеть, проверив значение ячейки, например, в среде PascalABC). Однако, в общем случае этого никто не гарантирует.
Не задать начальное значение переменной — грубая ошибка, за которую обычно снижают баллы на экзамене.
В команде “b := а + 7;” мы использовали одну из арифметических операций, которые можно осуществлять в Паскале с переменными типа integer.
Рассмотрим, какие ещё арифметические операции можно с ними производить.
Результатом работы этой программы будет:
Над целыми числами в Паскале можно осуществлять все четыре арифметические операции (сложение, вычитание, умножение и деление).
Со сложением и вычитанием всё просто — их обозначения совпадают с общепринятыми (+ и -). Операция умножения обозначается при помощи символа “*” (звёздочка). А вот операция целочисленного деления в Паскале не такая простая, как хотелось бы на первый взгляд. Дело в том, что результат привычного нам деления не всегда бывает целый.
В начальной школе учат как раз целочисленному делению, но к 9-му классу учащиеся обычно об этом забывают и считают, что 5 поделить на 2 — это всегда 2,5, а не 2 и 1 в остатке.
Так как мы рассматриваем сейчас только действия целочисленные и с целочисленными переменными, то результат обычного деления, например, “15/6” нельзя положить в целочисленную переменную, потому что он содержит целую и дробную части, а в целочисленную переменную можно положить только целое число.
Чтобы чётко описать, какой именно результат требуется получить в результате деления, в Паскале существует две операции целочисленного деления — div и mod.
Результат операции div — целая часть от деления. Например, 15 div 6 = 2.
Результат операции mod — остаток от деления. Например, 15 mod б = 3. Это легко понять, если поделить “уголком” в целых числах 15 на 6:
Обратите внимание — перед и после слов div и mod стоят пробелы, чтобы Паскаль отделял имена переменных от называний операций.
Ещё хотелось бы обратить ваше внимание на последнее присваивание в программе:
а := а + 2;
Если считать, что операция “:=” — это равенство, то приведённое выражение не имеет никакого смысла. В математике “а” никогда не бывает равно “а + 2”. В нашем случае, это ни в коем случае не равенство! Данную команду следует понимать именно как последовательность действий. Сначала нужно вычислить выражение, стоящее в правой части оператора присваивания, т. е. “а + 2”. Для этого нужно взять текущее значение переменной “а” (в начале программы в переменную “а” было положено число 15) и прибавить к этому значению число 2. После, результат (15 + 2 = = 17) помещаем в ту переменную, имя которой записано в левой части оператора присваивания (переменная “а”), т. е. значение переменной “а” станет равно 17. Нетрудно видеть, что команду “а := а + 2; ” следует понимать как “увеличить на 2 текущее значение переменной “а”.
Кроме арифметических операций приведённый пример программы демонстрирует работу ещё одной технологии — использования нескольких параметров в команде writeln. В команде writeln(как и в команде write), можно перечислить через запятую несколько параметров. Если параметром является переменная, то на экран будет выведено её текущее значение. Так, например, команда write ('а=', а) ; означает “вывести на экран сначала текст а=, а затем текущее значение переменной а”.
При записи арифметических выражений на языке Паскаль используются те же правила, что и в математике, т. е. арифметические операции имеют приоритет (порядок выполнения операций, если в выражении встречается несколько операций). Приоритет у операций умножения и деления одинаковый между собой, но выше, чем у операций сложения и вычитания, у которых между собой приоритет тоже одинаковый. Операции одинакового приоритета выполняются слева направо.
Обратите внимание — операции div и mod — это операции деления! Их приоритет такой же, как у умножения (символ *). Они выполняются раньше сложения и вычитания и слева направо, если встречаются рядом. При необходимости изменить порядок выполнения операций используются скобки, как и в математике.
Рассмотрим ещё два действия, которые можно осуществлять на Паскале с целыми числами. Это функции sqr и abs. Слово функция в данном случае означает, что у каждой из них нужно указать параметр, который пишется в круглых скобках после имени функции. Эти функции возвращают целочисленный результат.
Имя функции |
Возвращаемое значение |
Обозначение в математике |
Пример |
sqr |
Значение параметра в квадрате |
х2 |
sqr (3) = 9 |
abs |
Значение модуля параметра (абсолютное значение параметра) |
│х│ |
abs (-7) = 7 |
Пример программы.
Результатом работы этой программы будет:
Все обсуждаемые нами до настоящего момента программы всегда делали одно и то же над одними и теми же числами. Пришла пора обсудить, как дать возможность пользователю, который будет запускать нашу программу, задать значения переменных, чтобы программа работала в зависимости от того, что указал пользователь. Для этого требуется научиться вводить значения переменных с клавиатуры.
Так же, как команда write/writeln позволяет программе обязаться с внешним миром и выводить значения переменных на экран, в Паскале есть команда read/readln, которая общается с внешним миром и спрашивает у пользователя значения переменных.
Напишем в программе команду “read (а);” и запустим программу. Произойдёт следующее. Когда компьютер дойдёт до выполнения строки “read (а);”, программа приостановится, и компьютер станет ждать ввода пользователем целого числа с клавиатуры и нажатия им клавиши [Enter]. Введённое целое число будет записано в ячейку-переменную “а”, компьютер продолжит выполнение программы со следующей команды.
Например, программа, которая вводит с клавиатуры целое число и выводит на экран число, которое на 7 больше введённого, будет такая:
Мы не стали использовать в этом решении дополнительную переменную и класть в неё результат вычисления “а + 7”, чтобы потом уже вывести его на экран и показать вам приведённую технологию.
Разбор типовых задач
Задача 1. Вычислите значение выражения:
Решение
Расставим порядок вычисления операций в соответствии с их приоритетами.
В середине выражения видим две операции деления и одну — умножения. У них одинаковый приоритет, выполняются слева направо.
Важно! Из-за особенностей записи операций div и mod начинающие часто подсознательно считают, что эти операции нужно выполнять последними, Это приводит к ошибкам.
Итак, все три операции (mod, div, *) выполняются сначала слева направо. Затем выполняются сложение и вычитание и тоже слева направо. Получаем порядок действий:
Вычисляем по действиям. Числами в скобках здесь обозначены результаты соответствующих действий:
Ответ: 10.
Задача 2. В программе знак “:=” обозначает оператор присваивания, знаки “ + ”, “ —”, “*” и “/” — соответственно операции сложения, вычитания, умножения и деления. Правила выполнения операций и порядок действий соответствуют правилам арифметики.
Определите значение переменной а после выполнения алгоритма:
В ответе укажите одно целое число — значение переменной а.
Решение
Несмотря на то, что по условию задачи программа приведена на немного другом языке программирования — алгоритмическом, мы вполне уже можем справиться с её выполнением.
Небольшие отличия в данном случае состоят в том, что команды не разделяются здесь точками с запятой, как в Паскале, и вместо операции div используется операция “/”. Для упрощения задачи разработчик специально подбирает такие числа, чтобы результат деления был всегда целым.
Чтобы свести ошибки при выполнении этой задачи (и подобных) к минимуму, рекомендуется выполнить подробную трассировку программы. Это значит, что мы составим таблицу, в которой будем записывать значения всех используемых в программе переменных и отслеживать их изменения после каждого шага программы. Саму программу будем выполнять по шагам.
Для этого составим таблицу трассировки. В ней будет столбец для записи текущей команды программы и по столбцу для каждой переменной, используемой в программе.
В данном случае в программе используется две переменных — а и b.
В столбцы переменных запишем значение только в тот момент, когда команда кладёт в переменную значение.
Команда |
Переменные |
Пояснения |
|
а |
b |
||
а := 6 |
6 |
В результате этого простого присваивания переменная “а” получает свое начальное значение — 6. В столбец “b” мы ничего не записываем, потому что переменная “b” в этот момент не меняется. Её значение всё ещё не определено. |
|
b := 2 |
2 |
Аналогично, переменная “b” получает начальное значение — 2. Переменная “а” в этот момент не меняется. Её значение продолжает оставаться прежним — 6. |
|
b := а/2*b |
6 |
Вычисляем выражение в правой части оператора присваивания. В выражении используются операции деления и умножения. У них одинаковый приоритет. Вычисляются слева направо, значит, сначала деление (а/2). Затем результат этой операции умножается на значение переменной “b”. Значение переменной “а” в этот момент равно 6. “6/2” равно 3. Значение “b” в данный момент равно 2. Значение “а/2*b” = “3*2” =6. Этот результат записывается в переменную “b”. Переменная “а” не меняется и остаётся равной 6. |
|
а := 2*а + 3*b |
30 |
Вычисляем выражение в правой части оператора присваивания. В выражении используются две операции умножения и одна — сложения. Сначала вычисляем результаты умножений, потом их складываем. Вычисляем “2*а”. Значение переменной “а” в этот момент равно 6. (Если вы не помните значения переменной “а”, можно “подняться взглядом” вверх в столбце переменной “а” от текущей строки до той самой нижней ячейки столбца “а”, в которой написано какое-нибудь число. Это число и будет текущим значением переменной “а”.) Значение “2*а” равно 12. Аналогично вычисляем “3*b”. Значение переменной “b” в этот момент равно 6. (Не перепутайте — текущее значение переменной находится в самой нижней заполненной ячейки её столбца!) Значит, значение “3*b” равно 18. Складываем эти два результата. Получаем ответ 30. Его записываем в переменную “а”. |
По условию нас спрашивают значение переменной “а”. Его мы находим как самое нижнее значение, записанное в столбце переменной “а”. Это число 30.
Ответ: 30.
1 Данное пособие не может ставить своей целью полноценное обучение программированию. Мы стараемся дать только те основы, которые нужны для успешной сдачи ОГЭ по информатике. Поэтому, сознательно опускаются все типы данных, кроме целочисленного (integer) и алгоритмические конструкции, кроме базовых.