Министерство образования и науки Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» Ширяева Е. В., Романов М. Н. Материалы к практическим занятиям по курсу «Основы информатики» Часть I (учебное пособие) Ростов–на–Дону 2014 Учебное пособие разработано сотрудниками кафедры вычислительной математики и математической физики института математики, механики и компьютерных наук им. И. И. Воровича ФГАОУВО «Южный федеральный университет», кандидатами физико-математических наук Еленой Владимировной Ширяевой, Максимом Николаевичем Романовым. Ответственный редактор доктор физ.мат-.наук М. Ю. Жуков Компьютерный набор и верстка Е. В. Ширяевой Учебное пособие предназначено для студентов 1 курса ЮФУ. © Е. В. Ширяева, М. Н. Романов Электронное пособие подготовлено в системе XETEX Оглавление 1 Алфавит, словарь, структура программ, реализация линейных алгоритмов 4 1.1 Алфавит и словарь языка Pascal . . . . . . . . . . . . . . . . . . . . . . 4 1.1.1 Алфавит . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.2 Числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.3 Идентификаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.4 Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.5 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Операторы и типы данных языка Pascal . . . . . . . . . . . . . . . . . . 11 1.2.1 Оператор присваивания . . . . . . . . . . . . . . . . . . . . . . . 11 1.2.2 Типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2.3 Операторы процедур . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.2.4 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.3 Структура программы. Реализация линейных алгоритмов . . . . . . . . 23 1.3.1 Пример простой программы . . . . . . . . . . . . . . . . . . . . . 23 1.3.2 Проверка правильности программы . . . . . . . . . . . . . . . . . 27 1.3.3 Форматирование вывода чисел . . . . . . . . . . . . . . . . . . . 31 1.3.4 Решение задач . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.3.5 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.3.6 Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Тесты для самопроверки 50 Вариант 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Вариант 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Ответы на вопросы теста 54 Справочная информация 58 Список литературы 74 Интерфейс пользователя 75 Об авторах 78 ◭x 3 .y ◮ Глава 1 Алфавит, словарь, структура программ, реализация линейных алгоритмов 1.1 Алфавит и словарь языка Pascal Алфавит — набор допустимых символов языка программирования, которые можно использовать для записи программы. Словарь языка программирования состоит из алфавита языка, служебных слов и имен стандартных идентификаторов (см. п. 1.1.3). Служебные (зарезервированные, ключевые) слова — множество имен, зарезервированных в языке для написания операторов и других конструкций. 1.1.1 Алфавит Алфавит языка Pascal состоит из следующего набора символов: а) буквы латинского алфавита (A..Z, a..z), при этом большие и малые буквы не различаются; б) арабские цифры (0..9); в) символ подчеркивания (_); г) символы разделители: пробелы, комментарии и концы строк. Комментарии могут содержать любые символы, заключенные в ограничивающие скобки: (* *) или { }. д) специальные символы: ∗ := <= >= <> ( ) [ = ] + − = < > : ; ; : ′ b # @ $ :: { } С помощью символов алфавита формируются числа (см. п. 1.1.2), идентификаторы (п. 1.1.3), выражения (п. 1.1.4), строки символов, метки. ◭x 4 .y ◮ 5 1.1.2 Числа Числа обычно записываются в десятичной системе счисления. Перед любым числом может стоять знак «+» или «−». В вещественном числе целая часть от дробной отделяется точкой. Например, целые числа: 0 -5 37 числа с фиксированной точкой: 0.13 3.1415 +1.88 -0.37 числа с плавающей точкой: 5E-8 9.422E+08 -1E10 1.2e-3 (записи 1.2e-3 и 1.2E-3 эквивалентны, так как Pascal — регистронезависимый язык). Вещественные числа, содержащие десятичную точку, должны иметь перед ней и после неё, по крайней мере, по одной цифре. Любое вещественное число, например 371;85, может быть записано двумя способами: 1) в виде числа с фиксированной точкой 371.85; 2) в виде числа с плавающей точкой 3.7185e2 (экспоненциальная форма записи). Данная запись означает ; 3 7185 · 102 . Числа с плавающей точкой имеют мантиссу (число с фиксированной точкой) и масштабный множитель (порядок). Так запись числа 3.72E-5 состоит из трех частей: 3.72 E -5 мантисса (exponent), означает порядок «…умножить на 10 в степени…» Экспоненциальную форму записи используют, как правило, при записи слишком малых или слишком больших чисел, т. е. вместо лучше писать 0.000001 0.00013 130000 -0.0000125 1e-6 1.3e-4 1.3e5 -1.25e-5 ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 6 1.1.3 Идентификаторы Последовательность букв, знаков подчеркивания и цифр, начинающаяся с буквы или со знака подчеркивания, называется идентификатором. Правильные идентификаторы: a, x, buffer, Y2, _step, Int_Main_1, _7 Неправильные идентификаторы: 1b, d d, *step, i+, n!, f(1), This_is_ы Индентификаторы бывают стандартные и определенные пользователем. Пользовательские идентификаторы применяются для обозначения различных конструкций языка: констант, переменных, процедур и т. д. К стандартным идентификаторам относятся имена предопределенных операций (WriteLn, Sin) и имена предопределенных типов данных (Real, Boolean). 1.1.4 Выражения Выражения строятся из чисел и переменных с помощью знаков арифметических операций, а также с помощью круглых скобок и функций. В частности, переменные и числа — простейшие выражения. Знак операции умножения «*» опускать или заменять точкой нельзя. Не следует размещать два знака операций рядом. Аргумент любой функции всегда заключается в круглые скобки. Стандартные математические функции языка Turbo Pascal приведены в таблице. Математические функции Имя функции Возвращает Abs(x) |x| Sqr(x) x2 Sqrt(x) √ x, где x > 0;0 Sin(x) sin x (аргумент — радианная мера угла) Cos(x) cos x ArcTan(x) arctg Exp(x) ex , где e ≈ 2;71828 Ln(x) ln Pi значение числа (аргумент — радианная мера угла) x — угол в радианах, удовлетворяющий условию x = tg y , где −=2 < y < =2 x, где x > 0;0 ≈ 3;1415 ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 7 В Pascal нет операции возведения в произвольную степень, поэтому, напри- x3 мер, можно записать в виде x * x * x. Для вычисления в Pascal про- извольной степени n положительного числа логарифмическую запись. Например, en ln x x n x используют экспоненциально- записывается следующим образом или Exp(n * Ln(x)): 1.1.1. Прямое вычисление степеней высоких порядков в языках программирования используется редко. Обычно в этих целях применяют рекуррентные соотношения, т. е. формулы, в которых каждый следующий член выражается через предыдущий (например, xn = xn−1 x). О функции Sqr Функция Sqr(x) используется для сокращения записи квадратов громоздких выражений. Например выражение x− ( √ ; 2 + 2 17) 2 Sqr(x - Sqrt(2) + 2.17) удобнее записать в виде (x - Sqrt(2) + 2.17) * (x - Sqrt(2) + 2.17) вместо Три причины, по которым следует ограничить использование функции Sqr для вычисления простых выражений: 1) наличие функции Sqr делает выражение более громоздким; Число Выражение a2 a2 + b2 ) cos a2 ( Pascal символов скобок a*a 3 0 Sqr(a) 6 2 (a*a+b*b)*cos(a*a) 18 4 (Sqr(a)+Sqr(b))*cos(Sqr(a)) 27 10 2) идентификатор Sqr при написании легко перепутать с Sqrt; 3) при использовании любой функции возрастает вычислительная сложность выражения. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 8 При вычислении значений выражений действуют следующие правила старшинства операций (см. таблицу). Таблица приоритетов операций Очередность выполнения Операции 1 @, not, унарный минус, унарный плюс 2 *, /, div, mod, and, shr, shl 3 +, -, or, xor 4 in, >, <, =, <>, >=, <= Подряд идущие операции одного приоритета вычисляются в последовательности слева направо. Унарные операции (группа 1) требуют одного операнда (аргумента операции): -b; not B1: Бинарные операции (группы 2–4) требуют двух операндов: a + b; B1 or B2: ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 9 1.1.5 Упражнения ♢ 1.1. Записать по правилам языка Pascal числа (в дробной части периодической дроби указывать 4 цифры): 2) −1;(23); 1) LXVII; 3) −0;1(6); 4) −2;8 · 10−7 ; 5) 1 100 000 ; 6) 6 10 . ♢ 1.2. Указать числа, записанные по правилам языка Pascal: 1) 0.7 2) +0.7 7) -17 8) 0.(3) 12) 1.17e3 3) .7 4) ±7 9) 1+1.5 13) E-4 5) 1/7 10) VI 6) 3,14 11) 3.5E-5 14) -1.1 E-4 ♢ 1.3. Указать идентификаторы, отвечающие правилам языка Pascal: 1) a; 2) a1 ; 10) delta; 3) a1; 4) 1a; 5) a∼; 6) x15y2; 11) MaxZ; 12) max Z; 13) бокс; 7) ab; 8) a:b; 9) a-1; 14) _555; 15) IV. ♢ 1.4. Указать количество операций, требующихся для вычисления значений выражений: 1) 0.8 - (x + 1 / 2 / 2) * (- 3 / 10 + y) + 4 / 5 + Cos(Pi/2); 2) 3 / 4 + (-1 / 2 + x) * (y + 7 / 10 / x) - 0.75 + Sin(0). Переписать исходные выражения, уменьшив число операций. ♢ 1.5. Расстановкой скобок в каждом из выражений, стоящих справа, добиться того, чтобы левое и правое выражения стали эквивалентными: Математическое выражение 1) 2) 3) 4) x−y x − 2y y x+ ·z x−3 xy x− ·z x − 2y x y · 2 z sin x Выражение на языке Pascal x-y/x-2*y x+y/x-3*z x-x*y/x-2*y*z x / 2 * y / z * sin x ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 10 ♢ 1.6. Переписать выражения в традиционной математической форме: 1) Sqrt(a + 2) - Sqr(a - 2) * Pi; 2) a + b / (c + 2 * a) - (a + b) / c + 2 * y; 3) a * b / (c + d) - (c - d) / b * (a + b); 4) Pi + Sqr(Cos((a + b) / 2)). ♢ 1.7. Указать выражения, записанные по правилам языка Pascal: 1) 100; 2) -a; 3) ab2; 8) y - * z; 4) 2ab; 9) Abs x + Sin x; 5) 2 * ab; 6) 1 + |x|; 7) 1 / -2 + x; 10) Cos(Pi * 1,5). ♢ 1.8. Записать выражение для получения числа e (основание натурального логарифма). ♢ 1.9. Записать по правилам языка Pascal выражения (x > 0): √ √ 3 −1 −2 3 100 1+x 2 1) x 8) log3 ; 2) x; x 9) x ; 3) log3 ex ; ; 4) x 10) x2 . lg ; 5) 2 ; 6) x ; 7) ♢ 1.10. Записать по правилам языка Pascal выражения: ; 1) 1 5+ 4) cos 8) ch 10) 2 |x| + |1;5 + x|; x2 ; x; 5) 9) arcctg 10 2 sh 2) |x| − 1 + |x − 1|; x−1 tg x; 6) sin −1 x; 7) 3) cos √ 1+ x; |x| + x2 ; x−1 ; x; ; 11) arcctg x2 ; 12) arcsin x; 13) arccos x. ♢ 1.11. Даны операции: not xor and = * / div or mod @ <> Распределите их по группам приоритетов выполнения, заполнив таблицу Очередность выполнения Операции 1 2 3 4 ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 11 1.2 Операторы и типы данных языка Pascal Любая программа на языке Pascal — это последовательность инструкций (команд) предназначенных для выполнения на компьютере. Команды представляют собой операторы языка Pascal. 1.2.1 Оператор присваивания В результате выполнения оператора присваивания (:=) переменной, стоящей слева от этого знака, присваивается значение некоторого выражения, стоящего справа от знака :=. То есть в операторе присваивания вначале вычисляется значение выражения, расположенного справа от знака :=. Переменная — это именованная область памяти, обладающая адресом. Перед своим использованием переменная должна быть объявлена в разделе описаний переменных (раздел var, см. также с. 24). При объявлении переменной требуется указать ее тип, что позволяет компилятору задавать размер ячейки памяти, выделяемой под переменную данного типа. Значение переменной — данные, которые находятся в переменной. При присваивании переменная := выражение переменная должна быть совместима по присваиванию с типом выражения. 1.2.2 Типы данных Тип данных определяет множество значений, которые может принимать та или иная переменная, и множество операций, которые можно к ним применить. Простые типы данных делятся на вещественный и порядковые (целочисленный, символьный, логический, интервальный, перечисляемый). Характеристика порядкового типа: конечное число возможных значений, которые можно каким-либо образом упорядочить (а значит можно каждому из них сопоставить некоторое целое число — порядковый номер значения). Основные простые типы: Integer (целочисленный), Real (вещественный), Char (символьный), Boolean (логический), String (строковый). ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 12 К данным любого порядкового и вещественного типов применимы операции сравнения, дающие результат логического типа: Операция = <> Действие равенство неравенство < меньше > больше <= меньше или равно >= больше или равно К данным любого порядкового типа применимы порядковые операции: Функция Действие Ord порядковый номер элемента Succ следующий элемент Pred предшествующий элемент Low наименьшее значение величин данного типа High наибольшее значение величин данного типа Целочисленные типы Наиболее употребительный целочисленный тип: Integer. Значение предопределенной константы MaxInt соответствует наибольшему значению Integer. Самое маленькое значение Integer будет равно -MaxInt - 1. Тип Integer относится к общей категории типов (Generic types); формат и диапазон значений таких типов зависит от разрядности процессора и используемой операционной системы. Диапазон значений для Integer: −32 768::32 767 (16-разрядные версии) или −2 147 483 648::2 147 483 647 (32-разрядные версии). Беззнаковые типы: Byte (диапазон значений: :: 0 255 , т. е. формат: 1 байт), Word (0::65 535, 2 байта). Знаковые типы: ShortInt (−128::127, 1 байт со знаком), Integer (2 или 4 байта со знаком), LongInt (4 байта со знаком). ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 13 Операции над целыми числами 1) Вывод на экран. 2) Ввод с клавиатуры. 3) Операции сравнения. 4) Арифметические операции: +, -, *, /, inc, dec. Процедура inc(i) увеличивает значение аргумента i на 1, dec(i) — уменьшает значение аргумента на 1. 5) Порядковые операции. 6) Дополнительные операции: div (целочисленное деление) и mod (остаток от деления нацело) 7 div 2 = 3; 8 div 2 = 4; 1 div 5 = 0; 7 mod 2 = 1; 8 mod 2 = 0; 1 mod 5 = 1: Результаты операций a div 0 и a mod 0 считаются неопределенными. 1.2.1. В языке Pascal значения выражений a / b и a div b не равны — значение первого выражения представляет собой вещественное число, а второго — целое. Пример 2.1 (проверка кратности). Число a кратно числу b, если истинно выражение a mod b = 0. В частности, если число a кратно числу 2, то оно четное. Пример 2.2 (отделение цифр числа). Операции mod и div используются для работы с цифрами целого числа. Например, x mod 10 — последняя цифра числа x; a div 10 — первая цифра двузначного числа a; b div 100 — первая цифра трехзначного числа b. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 14 Вещественные типы Основной вещественный тип Real относится к общей категории типов (см. с. 12). Операции над вещественными числами 1) Вывод на экран. 2) Ввод с клавиатуры. 3) Операции сравнения. При этом вещественные числа xиy равны с точностью ", если |x − y | 6 ". 4) Арифметические операции: +, -, *, /. 5) Дополнительные операции: Trunc (отсечение дробной части действительного числа, результат — целое) и Round (округление действительного числа до ближайшего целого): Trunc(3.14) = 3; Trunc(-3.64) = –3; Trunc(5.7) = 5: Round(3.14) = 3; Round(-3.64) = –4; Round(5.7) = 6: Если дробная часть равна ; 0 5 , то в Delphi используется «банковское округле- ние», т. е. округление к ближайшему чётному: Round(3.5) = 4; Round(-3.5) = −4; Round(4.5) = 4; Round(-4.5) = −4: в Borland Pascal 7 результат функции Round — число с самой большой абсолютной величиной. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 15 Символьный тип Значениями символьного типа Char являются элементы конечного и упорядоченного множества символов. В рамках типа Char десятичные цифры упорядочены в соответствии с их численными значениями (’5’<’6’), буквы упорядочены в алфавитном порядке ’A’<’B’; ’F’<’f’: Константа символьного типа — единственный символ, заключенный в апострофы. Операции над переменными типа Char 1) Ввод с клавиатуры (символ вводится без кавычек). 2) Вывод на экран. 3) Операции сравнения. 4) Порядковые операции. 5) Функции преобразования Ord и Chr позволяют получить код символа (результат функции Ord(символ)) и символ (результат функции Chr(код символа)). ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 16 Строковый тип Тип данных string предназначен для хранения последовательности символов (элементов типа Char). Строковая константа заключается в апострофы: ’Mouse’, ’’ (пустая строка). Операции над переменными типа string 1) Ввод с клавиатуры (строка вводится без кавычек). 2) Вывод на экран. 3) Операции сравнения. Строки сравниваются в лексикографическом порядке. Строки считаются равными, если они имеют одинаковую длину и коды всех символов с одинаковыми индексами совпадают: 4) Конкатенация (операция сцепления строк; обозначение: +). ’Кот’ + ’Пёс’ (результат: строка КотПёс). 5) Length — определение длины строки, т. е. числа элементов в строке. Максимальная длина строки — 255 символов. Область памяти, выделяемая под строку символов, всегда на 1 байт больше запрашиваемой при объявлении переменной (1 байт отводится дополнительно на хранение информации о длине строки). байт длины символ символ символ … ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 17 Логический тип Данные логического типа Boolean могут принимать одно из двух значений: True (истина) и False (ложь). Операции над данными логического типа 1) Вывод на экран. 2) Операции сравнения. Считается, что False < True. 3) Порядковые операции. 4) Логические операции (and, or, not, xor). Логические операции дают логические результаты. Функция SizeOf Функция SizeOf позволяет определить объем памяти, выделяемый для данных (в байтах). Пример 2.3 (использование функции SizeOf). Даны операторы печати WriteLn(’SizeOf(Integer) = ’, SizeOf(Integer)); WriteLn(’SizeOf(Real) = ’, SizeOf(Real)); WriteLn(’SizeOf(Char) = ’, SizeOf(Char)); Результат (Borland Pascal 7) SizeOf(Integer) = 2 SizeOf(Real) = 4 SizeOf(Char) = 1 Результат (Delphi) SizeOf(Integer) = 4 SizeOf(Real) = 8 SizeOf(Char) = 1 ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 18 1.2.3 Операторы процедур Оператор процедуры запускает на выполнение некоторую подпрограмму, задающую последовательность действий, составляющих суть процедуры. Процедуры ввода Read(p1,..., pN); ReadLn(p1,..., pN); ReadLn; p1, …, pN — параметры процедуры (имена переменных). При выполнении операторов ввода переменным присваиваются значения исходных данных. Значения вводимых переменных должны соответствовать типам переменных. Процедуры вывода Write(p1,..., pN); WriteLn(p1,..., pN); WriteLn; p1, …, pN — параметры процедуры (выражения). Пример 2.4 (демонстрация работы процедур ввода и вывода). 1 var Name: string; 2 begin 3 Write(’Введите имя [> ’); 4 WriteLn(’Привет, ’, Name); 5 (* 6 end. Readln(Name); Write(’Привет, ’, Name); *) На экране: положение курсора (символ _ ) будет разным при использовании операторов WriteLn и Write. WriteLn(’Привет, ’, Name); Введите имя [> Привет, Ваня Ваня Write(’Привет, ’, Name); Введите имя [> Масяня Привет, Масяня_ _ ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 19 Стиль программирования • Для ввода числовых и строковых данных используйте оператор Readln: Readln(Name); • Для вывода строки-приглашения ввода используйте оператор Write: Write(’Введите имя ’); • Для вывода результатов вычислений на экран используйте оператор Writeln: WriteLn(’Привет, ’, Name); • Для вывода нескольких результатов вычислений на экран используйте последовательность операторов Writeln: WriteLn(’Периметр = ’, p); WriteLn(’Площадь = ’, S); ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 20 1.2.4 Упражнения ♢ 2.1. Задать в виде операторов присваивания следующие действия: 1) значение переменной x увеличить на 100; 2) значение переменной x уменьшить в 3 раза и изменить ее знак на проти- воположный. ♢ 2.2. Переменной z присвоить 1) среднее арифметическое значений переменных a, 2) среднее геометрическое значений переменных a, b и c; b и c. ♢ 2.3. Поменять местами значения переменных x и y . ♢ 2.4. Поменять местами значения переменных x, y и z так, чтобы в x оказалось значение переменной y , в чение переменной y — значение переменной z , а в z — прежнее зна- x с противоположным знаком. ♢ 2.5. Записать операторы присваивания для нахождения площади треугольника по двум сторонам a, b и углу g между ними. Рассмотреть случаи, когда g — 1) радианная мера угла; 2) градусная мера угла. Указание. 1 S = ab sin g ; 2 x◦ = x 180 рад. ♢ 2.6. Дано a. Используя оператор присваивания, неограниченное количество дополнительных переменных и только указанную операцию, получить: a за 3 операции “+”; 3) a6 за 3 операции “∗”; 5) a8 за 3 операции “∗”; 1) 5 a за 4 операции “+”; 4) a7 за 4 операции “∗”; 6) a10 за 4 операции “∗”. 2) 7 Например, для вычисления a5 за три операции умножения можно использовать последовательность операторов присваивания: b := a * a ( a2 ); c := a * b * b a5 ): ( ♢ 2.7. Записать оператор присваивания для вычисления расстояния между двумя точками A1 (x1 ; y1 ) и A2 (x2 ; y2 ) по формуле |A1 A2 | = √ x2 − x1 )2 + (y2 − y1 )2 : ( ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 21 ♢ 2.8. Пусть в программе описаны переменные R, I, C, S, B, принадлежащие типам: R — Real, I — Integer, C — Char, S — String, B — Boolean. Указать верные операторы присваивания. 1) R := 1.5 + 7; 2) I := 2 * 7; 3) C := ’University’; 4) S := Rostov; 5) B := Boolean; 6) R := 2 * I; 7) I := R; 8) S := C; 9) C := S; 10) S := C + ’R’; S := C’R’ 12) B := ’True’ 11) ♢ 2.9. Определить тип переменных, участвующих в следующих операторах присваивания: 1) m0 := ’Pascal’; 2) m1 := ’’; 3) m2 := True; 4) m4 := 3.0; 5) m4 := 3.0; 6) m5 := -30; 7) m6 := -3.5e-2; 8) m7 := ’False’; 9) m8 := ’3’; 10) m9 := ’1’ + ’2’; ♢ 2.10. Указать правильные операторы ввода: 1) Readln(x; y); 2) Readln(x, y); 3) Readln x; 4) Readln(5); 5) x := Readln(x); 6) Readln(x + y). ♢ 2.11. Указать правильные операторы вывода: 1) Write(x, x + 1); 2) Write(7); 3) Write(’Cat’); 4) Write(Exp(x)); 5) Write(x + 3.14); 6) Write(x + 3,14); 7) Write(’Pi =’, Pi); 8) Writeln(x). ♢ 2.12. Определить, что будет выведено на экран в результате выполнения последовательности операторов: K := 5; M := 10; K := K + 5; M := -(-3 + M); WriteLn(’K = ’, K); Write(’M = ’, M); ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 22 ♢ 2.13. Каков будет результат выполнения последовательности операторов: ReadLn(x); x := Abs(x / 2); x := Sqrt(-1 + x) * x + 1.5; Write(x, 2 - Pi * x); если в качестве исходного данного ввести число: 1) 1.2; 2) -1.2; 3) 2; 4) 10 ? Полученные значения округлять до двух знаков после запятой. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 23 1.3 Структура программы. Реализация линейных алгоритмов Линейным называется алгоритм, в котором отдельные предписания выполняются в порядке записи, независимо от значений исходных данных и промежуточных результатов. 1.3.1 Пример простой программы Пример 3.1. Дан треугольник со сторонами a, b, c. Вычислить периметр и площадь треугольника. Решение. Для вычисления площади треугольника по трем сторонам воспользуемся формулой Герона S= √ p(p − a)(p − b)(p − c); где p — полупериметр треугольника. Приведем код программы на языке Pascal. Нумерация строк указана только для удобства ссылок при описании кода. 1 program Triangle; 2 uses Crt; 3 var a, b, c, 4 p, 5 S 6 begin (* стороны треугольника *) (* периметр *) : Real; (* площадь треугольника *) 7 ClrScr; (* процедура очистки экрана *) 8 Write(’Введите длины сторон треугольника: ’); 9 ReadLn(a, b, c); 10 p := a + b + c; 11 WriteLn(’Периметр треугольника = ’, p:5:2); 12 p := p / 2; 13 S := Sqrt(p * (p - a) * (p - b) * (p - c)); 14 WriteLn(’Площадь треугольника = ’, S:5:2); 15 ReadLn; 16 (* периметр треугольника *) (* полупериметр треугольника *) end. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 24 Подробно опишем представленный код. Строка 1. Заголовок программы (program Имя_программы). Эта строка необязательна, однако пропускать ее не рекомендуется — заголовок придает программе завершенный вид. Строка 2. Раздел (необязательный) подключения дополнительных модулей (uses Имя_модуля1). Дополнительные модули содержат описания и подпрограммы, расширяющие возможности программы. В строке 7 вызывается процедура очистки экрана ClrScr, описанная в стандартном модуле Crt. Строки 3–5. Раздел описания переменных (var имя_перем: тип). Каждая переменная должна быть описана до ее использования в программе и отнесена к одному и только одному типу. Хорошим стилем написания программ является наличие комментариев к каждой переменной в разделе описания переменных. Комментарии — текст, поясняющий код программы. Комментарии на компиляцию программы никак не влияют. Комментарии в языке Pascal заключаются в фигурные скобки {...} — как правило, многострочный комментарий, или окружаются символами (*...*) — однострочный комментарий. Строка 6. Служебное слово begin начинает обязательный раздел операторов, предназначенный для описания действий. Каждый оператор принято писать с новой строки. Строка 8. Оператор Write («без перевода каретки») обычно используется для отображения текста-приглашения. Строка 9. Оператор ReadLn («с переводом каретки») обычно используется для ввода значений с клавиатуры. Строка 10. Вычисление периметра треугольника и занесение полученного значения в переменную p. Для выполнения оператора присваивания необходимо, чтобы все входящие в выражение переменные имели некоторое значение. Это значение может быть введено с клавиатуры (как в данном примере, строка 9) или переменная может быть инициализирована с помощью оператора присваивания (например, a := 3). Присваивание переменной какого-либо начального значения называется инициализацией переменной. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 25 Строки 11, 14. Вывод результатов работы программы. Результаты вычислений принято выводить на экран с новой строки, для этого используется оператор WriteLn («с переводом каретки»). При выводе ответов использовался форматный способ вывода (см. п. 1.3.3). Строка 12. Вычисление полупериметра треугольника и занесение его значения в ту же переменную p (имеем право, так как значение периметра нам дальше не понадобится). Стиль программирования. На практике, в простой программе лучше не экономить на переменных. Использование одной и той же переменной для хранения разных данных требует бо́льшей внимательности от программиста и часто лишает программу наглядности. Строка 13. Вычисление площади треугольника по формуле Герона. Строка 15. Оператор ReadLn без параметров играет роль временной остановки в выполнении программы — пока пользователь не нажмет клавишу <Enter> программа задержит выполнение остальных инструкций. В конце программы этот оператор обычно указывается, чтобы пользователь имел возможность видеть окно с результатами работы программы (экран пользователя). Если его не указать, то произойдет возврат в окно редактора среды программирования. Строка 16. Служебное слово end с точкой завершают раздел операторов. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 26 Консольные приложения в Delphi Язык программирования Delphi используется в одноимённой среде разработки и является наследником языка Pascal. Несмотря на то, что Delphi — это среда визуального программирования, с ее помощью можно создавать и консольные программы, которые используют стандартные устройства ввода-вывода (так называемые программы с текстовым интерфейсом). Приведем код программы на языке Delphi (ср. с программой со с. 23): program Triangle; {$APPTYPE CONSOLE} uses SysUtils; var a, b, c, // стороны треугольника p, (* периметр *) S : Real; { площадь треугольника } begin Write(’Введите длины сторон треугольника: ’); ReadLn(a, b, c); p := a + b + c; WriteLn(’Периметр треугольника = ’, p:5:2); p := p / 2; S := Sqrt(p * (p - a) * (p - b) * (p - c)); WriteLn(’Площадь треугольника = ’, S:5:2); ReadLn; end. Отличия от предыдущего кода минимальны: в Delphi-коде обязательно должна присутствовать строка {$APPTYPE CONSOLE}, сообщающая компилятору Delphi, что программа представляет собой консольное приложение; обязательна также строка uses SysUtils. А вот модуля Crt в Delphi нет (а значит и нет процедуры ClrScr, которая была в Pascal-коде). Неудобство для начинающих программистов заключается в том, что из-за использования разных кодировок все сообщения на русском языке в консольном окне выглядят «абракадаброй». Поэтому при создании в Delphi консольных приложений для вывода сообщений рекомендуется использовать латинские буквы. В Delphi однострочный комментарий следует после знаков //; а многострочные комментарии заключаются в {...} или в (*...*). ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 27 1.3.2 Проверка правильности программы Самым трудоемким этапом при решении задачи на компьютере является отладка составленной программы. Под отладкой понимают работу по обнаружению и устранению ошибок, а также доказательство правильности программы. Ошибки бывают синтаксические (могут возникнуть, в частности, из-за плохого знания языка программирования или из-за небрежного ввода кода с клавиатуры) и семантические (смысловые). Правильной будем называть программу, которая успешно прошла этап трансляции (т. е. в ней нет синтаксических ошибок) и для всех возможных входных данных обеспечивает получение правильного результата. Программа (алгоритм) не является правильной, если для некоторых исходных данных она дает неправильные результаты, сбои или не дает никаких результатов вообще. Для проверки правильности программ используют формальную верификацию (доказательство с помощью формальных методов правильности или неправильности алгоритмов и программ в соответствии с формальным описанием их свойств) и тестирование (проверка того, что программа решает именно поставленную задачу — тестирование спецификаций — и выдает правильные результаты для любого набора возможных входных данных. Стиль программирования. В хорошей программе следует реализовывать защиту от ввода неверных данных. Тестирование программы обычно проводят: 1) в нормальных условиях (используют входные данные, типичные для эксплуатации программы в реальных условиях); 2) в экстремальных условиях (используют входные данные, являющиеся «пограничными» для данной программы; 3) в исключительных условиях (используют входные данные, значения которых лежат вне области определения функции и т. п.). В линейном алгоритме нет возможности обходить подводные камни вроде проверок «деление на нуль» или «вычисление корня из отрицательного числа», поэтому будем проводить тестирование кода со с. 23 только в нормальных условиях. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 28 Тестовый пример: данные для тестового примера нужно подбирать таким образом, чтобы можно было легко посчитать ответ. Например, при a = 3; b = 4; периметр треугольника равен 12 (= c=5 3 + 4 + 5 ), соответственно, полупериметр треугольника, используемый в формуле Герона, равен 6. Площадь треугольника равна: S= Подставив эти данные (a √ = 3 6(6 , − 3)(6 − 4)(6 − 5) = 6: b = 4, c = 5) в качестве входных при выполнении программы, должны получить ответ 6. Результат работы программы Введите длины сторон треугольника: 3 4 5 Периметр треугольника = 12.00 Площадь треугольника = 6.00 1.3.1. С точки зрения проверки на наличие ошибок кодирования приведенный тестовый пример не является идеальным. При выбранных значениях сторон треугольника a = 3, b = 4, c = 5 совпали значения полупериметра и площади тре- угольника — они равны шести. Если программист, например, ошибся в операторе вывода (см. программу на с. 23): Ошибка в строке 14 { WriteLn(’Площадь треугольника = ’, S:5:2); // верная строка } WriteLn(’Площадь треугольника = ’, p:5:2); указав вместо S имя переменной p, то этот тестовый пример не позволит обнаружить ошибку. 1.3.2. С точки зрения проверки алгоритма вычисления предложенный для тестирования набор входных данных a = 3 , b = 4 , c = 5 очень удачен, так как поз- воляет проверить правильность вычислений — треугольник с такими сторонами является прямоугольным (32 формуле + 4 2 = 5 2 ) и его площадь можно вычислить еще и по 1 S = ab. 2 ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 29 Стиль оформления программного кода. Обратите внимание на оформление приведенного программного кода (см. с. 23, 26) — на разбиение кода по строкам, на расстановку пробелов. Осмысленное использование пробелов способно улучшить стиль программы. Компилятор игнорирует дополнительные пробелы между словами и символами, однако их нужно использовать для улучшения читаемости программы. Каждый оператор программы рекомендуется писать в отдельной строке; если операторы короткие, то можно писать несколько операторов в одной строке, но между ними желательно вставлять не менее двух пробелов: Write(’x␣=␣’);␣␣ReadLn(x); Здесь и далее символом ␣ будет изображаться пробел. Все строки тела программы нужно вводить с отступами, равными двум (или более) пробелам (см. строки 7–15 в коде на с. 23). Зарезервированные слова begin и end должны быть расположены на отдельных строках и начинаться с одинаковой позиции (естественно, согласованно по смыслу). Все разделы программы (раздел подключения модулей, раздел описания переменных и т. п.) следует начинать с новой строки. Хорошим стилем оформления программ является также расстановка пробелов вокруг знака оператора присваивания, знаков арифметических операций, знаков сравнения; после запятой, отделяющей имена переменных в разделе описания переменных, а также всех констант и переменных в операторах вызова процедур/функций (например, в операторах ввода-вывода): a␣:=␣5; a␣:=␣a␣+␣1; var␣a,␣b␣:␣Real; WriteLn(a,␣b); ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 30 Приведем пример плохого оформления кода со с. 23, способного запутать даже опытного программиста. Просто уберем все комментарии, соединим строки, а пробелы расставим беспорядочно. Число строк кода уменьшилось в два раза, но вот удобнее ли читать такой код?! Так оформлять программы нельзя program Triangle; var a,b, c, p, S:Real; begin Write(’Введите длины сторон треугольника: ’);ReadLn(a,b,c); p:=a+b+c;WriteLn(’Периметр треугольника =’,p:5:2);p:=p/2; S:= Sqrt (p*(p-a)*(p-b)*(p-c)); WriteLn(’Площадь треугольника =’,S:5:2);ReadLn;end. Набор строчек программы без отступов и пробелов — это тоже плохой пример оформления программ. Так оформлять программы нельзя program Triangle; var a,b,c,p,S: Real; begin Write(’Введите длины сторон треугольника: ’); ReadLn(a,b,c); p:=a+b+c; WriteLn(’Периметр треугольника =’,p:5:2); p:=p/2; S:=Sqrt(p*(p-a)*(p-b)*(p-c)); WriteLn(’Площадь треугольника =’,S:5:2); ReadLn; end. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 31 1.3.3 Форматирование вывода чисел Все вещественные числа по умолчанию отображаются в экспоненциальном формате. В случае, если программист хочет управлять видом выводимых чисел процедура вывода может иметь вид: Write(выражение1:n1:m1, выражение2:n2:m2, ...); здесь n1, n2 — минимальное общее количество позиций в числах (ширина поля результата); m1, m2 — количество позиций в дробной части этих чисел. Если общее количество отводимых позиций избыточное, то поле слева дополняется пробелами. Если для вещественного числа не указать количество позиций в дробной части, то число будет выводиться на экран в экспоненциальном формате с заданной шириной поля. Для целых чисел указывается только общее количество позиций в числах. Пример 3.2 (форматный вывод). Напишем программу, позволяющую продемонстрировать форматный вывод вещественного и целого чисел. Демонстрация форматного вывода program Test; var a : Real; n : Integer; begin a := 23.746; n := 145; WriteLn(’1. a =’, a, ’ n=’, n); WriteLn(’2. a =’, a:7:3, ’ n=’, n:4); WriteLn(’3. a =’, a:11, ’ n=’, n:3); WriteLn(’4. a =’, a:10); WriteLn(’5. a =’, a:8); WriteLn(’6. a =’, a:5); end. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 32 В результате выполнения программы (в Borland Pascal 7) на экран будут выведены значения: Результат работы программы в Borland Pascal 7 1. a = 2.3746000000E+01 n=145 2. a = 23.746 n= 145 3. a = 2.3746E+01 n=145 4. a = 2.375E+01 5. a = 2.4E+01 6. a = 2.4E+01 Десятичная точка входит в количество позиций. В случаях 3–6 один символ в вещественных числах резервируется на знак. При выводе вещественного числа в формате с плавающей точкой обязательно один знак фиксируется для числа до точки, один знак для числа после точки и два знака на разряд. Приведем результат выполнения программы в Delphi (сравните вывод вещественных чисел с предыдущим результатом): Результат работы программы в Delphi 1. a = 2.37460000000000E+0001 n=145 2. a = 23.746 n= 145 3. a = 2.37E+0001 n=145 4. a = 2.4E+0001 5. a = 2.4E+0001 6. a = 2.4E+0001 Еще раз приведем программу из примера 3.2 (с. 31), записав ее в Delphi следующим образом: 1 ... 2 var a : Real = 23.746; 3 n : Integer = 145; 4 begin 5 WriteLn(’1. a =’, a, 6 ... 7 ’ n=’, n); end. В строках 2, 3 приведен пример инициализации преременных при описании. Это удобное средство доступно в Delphi, но не во всех версиях языка Pascal. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 33 1.3.4 Решение задач Пример 3.3. Вычислить число по формуле: = 16 arctg k1 − 4 arctg k2 ; где k1 = 1 5 , k2 = 1 239 (3.1) . В ответе выдавать семь знаков после запятой. Решение. Функция arctg x относится к числу стандартных функций языка Pascal (см. с. 6), поэтому кодирование формулы (3.1) фактически сводится к простому ее переписыванию. 1 program NumberPi; 2 var k1, k2, Pi2 : Real; 3 begin 4 k1 := 1/5; 5 k2 := 1/239; 6 Pi2 := 16 * arctan(k1) - 4 * arctan(k2); 7 WriteLn(’Pi2 = ’, Pi2:6:4); 8 Write(’Pi = ’, Pi:6:4); end. 9 Тестирование программы: никакого ввода данных с клавиатуры в данной программе не предусмотрено. Поэтому проверим совпадение полученного числа со значением, которое возвращает встроенная функция языка Pascal Pi (для этого в код добавлена строка 8). Результат работы программы Pi2 = 3.1416 Pi = 3.1416_ 1.3.3. На самом деле четвертая цифра в числе это 5 (подчеркнута): ≈ 3;14159; но в программе произошло округление, так как цифра, следующая за четвертой, — 9. 1.3.4. Для нахождения числа можно воспользоваться и более простой формулой: = 4 arctg 1. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 34 Пример 3.4. Даны x, y . Вычислить u, v , если: √ u = ex+y ; v = − Решение. Обозначим t = ex+y ln( ex+y + e − 1) √ : x+y 2 e (3.2) — выражение, трижды повторяющееся в (3.2). program CalcUV; var x, y, u, v, t: Real; begin x := -2; y := 2; (* значения для теста *) t := Exp(x + y); u := Sqrt(t); v := -Ln(t + Exp(1) - 1) / 2 / u; WriteLn(’u = ’, u:5:2); Write(’v = ’, v:5:2); end. Для тестирования программы выберем значения в выражения для √ ln( = −2, y = 2 , подставим их u и v: √ u = e−2+2 = e0 = v=− x e−2+2 + e − 1) √ −2+2 2 e = − ln( √ 1 = 1 e0 + e − 1) √ 0 2 e = ⇒ u = 1; − ln 2 e = − 1 2 ⇒ v = −0;5: Результат работы программы u = 1.00 v = -0.50_ ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 35 Пример 3.5. Записать двузначное число в обратном порядке (34 → n-значное Решение. Известно, что любое десятичное ). 43 целое число A можно представить в виде суммы: A = an−1 · 10n−1 + an−2 · 10n−2 + : : : + a2 · 102 + a1 · 10 + a0 ; где (3.3) ai (i = 0; : : : ; n − 1) — коэффициенты (целые числа от 0 до 9) при соответству- ющих степенях числа десять. Например, 273 = 2 · 102 + 7 · 10 + 3. Для двузначного числа необходимо определить каждую цифру числа и использовать (3.3) в виде Ae = a0 · 10 + a1 ; a1 — это первая цифра исходного числа (теперь она переносится в конец числа), a0 — последняя цифра исходного числа. где Для отделения цифр числа используются операции mod и div, см. пример 2.2. var x, y : Integer; begin x := 34; (* значение для теста *) y := (x mod 10) * 10 + x div 10; WriteLn(’x = ’, x:5); WriteLn(’y = ’, y:5); end. 1.3.5. Операция div обладает более высоким приоритетом (см. таблицу приоритетов на с. 8), чем операция сложения, поэтому при определении y выра- жение x div 10 не взято в скобки. Операции * и mod обладают одинаковым приоритетом, но для удобства чтения кода выражение x mod 10 взято в скобки. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 36 Пример 3.6. Книга состоит из Npage страниц (Npage кратно четырем). Посчитать объем информации (в битах и килобайтах), содержащейся в книге, если известно, что на каждой странице Kchar символов и мощность используемого алфавита Malph символов. Решение. Общее число символов на Npage × Kchar . Npage страницах рассчитается по формуле Из школьного курса информатики известно соотношение, связыва- ющее количество возможных событий M и количество информации I: M = 2 I . С учетом этого требуется решить уравнение 2 I = Malph (I — число битов, используемое для кодирования каждого символа алфавита мощностью Malph ). Общее число битов (б): Npage × Kchar (символов) × log2 Malph (битов): Для перевода битов в килобайты используем равенство 1.3.6. Как уже говорилось, в Pascal для вычисления выражение 1 xy Кбайт = 2 13 бита. можно использовать xy = ey ln x , x > 0, y ∈ R. В Delphi в модуле Math имеется функция Power(x,y) для вычисления xy . Если x > 0, функция Power применима для любого y ∈ R; если x < 0, функция Power применима только, если y — целое. Однако, выражение (2 13 = 8192 2 13 лучше вычислить заранее и подставить его значение ) в программу. 1.3.7. В языке Pascal есть только функция для вычисления натурального логарифма, поэтому для вычисления log2 log2 x= x надо воспользоваться формулой: ln x ln 2 : В Delphi (в модуле Math) определена специальная функция для вычисления log2 x: log2(x): ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 37 Вычисление объема информации (Pascal) program ExPascal; var NPage, { число страниц } KChar, { число символов в странице } OneChar, { число битов, используемое для кодир. 1 симв. } MAlph : Integer; { мощность алфавита } InfContent : Real; { инф. объем в битах } begin Write(’Число страниц [> ’); ReadLn(NPage); Write(’Символов на странице [> ’); ReadLn(KChar); Write(’Символов в алфавите ReadLn(MAlph); [> ’); OneChar := Round(Ln(MAlph) / Ln(2)); if MAlph > Exp(OneChar * Ln(2)) then {!} OneChar := OneChar + 1; {!} InfContent := NPage * KChar * OneChar; WriteLn(InfContent, ’ bit’); InfContent := InfContent / 8192; Write(InfContent:5:2, ’ KB’); end. 1.3.8. Программа будет корректно работать, если мощность алфавита — число, являющееся степенью двойки. В противном случае требуется добавление условного оператора if MAlph > Exp(OneChar * Ln(2)) then OneChar := OneChar + 1; который выполнит необходимую поправку. Тестовый пример: пусть книга состоит из 16 страниц по 256 символов, мощность алфавита — 32 символа. Общее число символов на 16 страницах: 16 × 256 = 4 096: Используемый алфавит состоит из 32 символов, это значит, что для кодирования каждого символа используется 4 096 5 битов. Объем информации симв. × 5 битов = 20 480 битов = 20 480 2 13 КБ ; = 2 5 КБ: ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 38 Результат работы программы Число страниц [> 16 Символов на странице [> 256 Символов в алфавите [> 32 20480 bit 2.50 KB_ Программа на языке Delphi с использованием функции из модуля Math (напомним, что символы кириллицы будут отображаться некорректно): Использование функции из модуля Math (Delphi) program ExDelphi; {$APPTYPE CONSOLE} uses SysUtils, Math; { подключение модуля Math } var NPage, KChar, OneChar, MAlph : Integer; InfContent : Real; begin Write(’Число страниц [> ’); ReadLn(NPage); Write(’Символов на странице [> ’); ReadLn(KChar); Write(’Символов в алфавите ReadLn(MAlph); [> ’); OneChar := Round(log2(MAlph)); if MAlph > Power(2, OneChar) then OneChar := OneChar + 1; {!} {!} InfContent := NPage * KChar * OneChar; WriteLn(InfContent, ’ bit’); InfContent := InfContent / 8192; Write(InfContent:5:2, ’ KB’); Readln; end. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 39 Пример 3.7 (проблема переполнения). Любой тип данных определяет множество значений, которые может принимать та или иная переменная. Так, наиболее часто используемым целочисленным типом в языке Pascal является тип Integer (целые числа из диапазонов −32 768::32 767 и −2 147 483 648::2 147 483 647, соответственно, для 16- и 32-разрядных систем). Результат арифметических действий с большими целыми числами может выйти за границы диапазона допустимых значений типа, и программа выдаст неверный ответ (без предупреждения об ошибке и без аварийного выхода из программы). Покажем на примере сложения двух целых чисел, как возникает проблема переполнения, а также способ её решения. Решение. Будем складывать два числа, каждое из которых равно максимально возможному для данных типа Integer значению. Как уже говорилось в п. 1.2.2, существует константа MaxInt, значение которой соответствует наибольшему значению Integer. Узнать, какое наибольшее значение могут принимать данные некоторого типа, можно также с использованием функции High(тип). В программе будем использовать и константу MaxInt, и функцию High. Неверный алгоритм program DemoOverfull; var i1, i2 : Integer; S : Real; begin i1 := High(Integer); i2 := MaxInt; S := i1 + i2; WriteLn(’i1 = ’, i1); WriteLn(’i2 = ’, i2); Write(’i1+i2 = ’, S); end. Результат работы программы указывает на ошибочность выбранного алгоритма (складывая два больших числа, получили в ответе −2;0): Результат работы исходной программы (неверный ответ) i1 = 32767 i2 = 32767 i1+i2 = -2.0000000000E+00_ ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 40 Немного модифицируем алгоритм решения, заменив в приведенном выше коде оператор S := i1 + i2 двумя операторами S := i1 и S := S + i2: Результат работы измененной программы (верный ответ) i1 = 32767 i2 = 32767 i1+i2 = 6.5534000000E+04_ Приведем для сравнения результаты работы тех же программ в среде Delphi (слева — исходная, справа — измененная): Результат работы измененной программы (неверный ответ) i1 = 2147483647 i2 = 2147483647 i1+i2 = -2.00000000000000E+0000_ Результат работы измененной программы (верный ответ) i1 = 2147483647 i2 = 2147483647 i1+i2 = 4.29496729400000E+0009_ ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 41 1.3.5 Упражнения ♢ 3.1. Предложите свои значения переменных a, b и c, чтобы протестировать программу из примера 3.1 (см. с. 23). ♢ 3.2. Дана программа, записанная на языке Pascal. program DemoSpace; var a,b:Integer; Arifm,Geo:Real; begin Write(’Введите 2 целых числа: ’);ReadLn(a,b); Arifm:=(a+b)/2;Geo:=sqrt(a*b); WriteLn(’Arifm = ’,Arifm);WriteLn(’Geo = ’,Geo); ReadLn; end. 1) Перепишите программу таким образом, чтобы она соответствовала нашим стилистическим соглашениям (см. с. 29). 2) Запишите постановку задачи, которую решает данная программа. 3) Расставьте комментарии к переменным в разделе описаний и к каждому оператору присваивания. 4) Для вывода результатов работы программы установите формат с фиксированной точкой (после десятичного разделителя выводите 3 знака). 5) Точно изобразите, что будет выведено на экране в результате работы программы (с учетом выполненного предыдущего пункта). ♢ 3.3. Исправьте ошибки в приведенной ниже программе и перепишите ее таким образом, чтобы она соответствовала нашим стилистическим соглашениям. Какие значения будут выведены программой после исправления синтаксических ошибок? program FullEr begin var x,y,x: integer; y=15.0;z:=-y+3.5; writeln(x;Y;z); Y+z=X; end; ♢ 3.4. Что будет выведено на экран в результате выполнения последовательности операторов: WriteLn(-17:5); Write(’Cat’:5); Write(True:6); Используйте обозначения: пробел — ␣, положение курсора — _. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 42 ♢ 3.5. Какие двоичные числа будут выведены на экран в результате выполнения последовательности операторов WriteLn(’1101’); Write(’11’); Write(’10’); В ответе укажите двоичные числа и результат их суммирования. ♢ 3.6. Запишите оператор для вывода на экран значений переменных K (K: Integer, 0 < K < 1000) и R (R: Real, 0 < R < 100) в виде: ␣␣ddd␣␣␣␣␣␣dd.ddd_ Здесь d — некоторая десятичная цифра. Указание. Используйте форматированный вывод чисел. ♢ 3.7. Что будет выведено на экран в результате выполнения последовательности операторов (считать, что на порядок выделяется 2 разряда): WriteLn(’Pi =’, Pi:6:3); WriteLn(’Pi =’, Pi:10); WriteLn(’e =’, Exp(1):9); WriteLn(’e =’, Exp(1):7:4); WriteLn(’5+5 =’, 5 + 5:10); ♢ 3.8. Что будет выведено на экран в результате выполнения последовательности операторов: a := 13 Div (16 Mod 7); b := 32 Mod a * 3 - 19 Mod 3 * 2; WriteLn(’a = ’, a); WriteLn(’b = ’, b); Расстановкой одной пары скобок во втором операторе присваивания добейтесь, чтобы переменная b приняла значение 1) −4; 2) 12 . ♢ 3.9. Что будет выведено на экран в результате выполнения оператора: 1) WriteLn(Trunc(5.25) + Round(6.75)); 2) WriteLn(Round(-17.1) + Trunc(17.1)); ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 43 1.3.6 Программирование ◮ 3.1. Для неотрицательных чисел p, q , введенных с клавиатуры, найти значение выражения p+q 7 − pq: Результат работы программы (для p = 3, q = 2;1) Введите 1-е число: 3 Введите 2-е число: 2.1 Выражение (3.00 + 2.10) / 7 - 3.00 * 2.10 = -5.5714 ◮ 3.2. Даны два числа a и b. Определить, какое из чисел является а) минимальным, т. е. найти min( б) максимальным, т. е. найти a; b); max( a; b). Указание. Воспользуйтесь формулами: min( a; b) = max( a; b) = a + b − | a − b| 2 ; a + b + |a − b| 2 : ◮ 3.3. Определить объем куба со стороной a и шара радиуса r. Вывести на экран полученные значения и величину меньшего объема. Указание. Объем куба Vкуб = a3 ; объем шара 4 Vшар = r3 . 3 ◮ 3.4. Даны два целых двузначных числа. Для меньшего из них определить число единиц, а для большего — число десятков. ◮ 3.5. Вычислить сумму цифр целого трехзначного числа. ◮ 3.6. Поменять местами первую и последнюю цифры трехзначного числа (например, 345 → 543). ◮ 3.7. Дано целое четырехзначное число. Используя только целочисленный тип данных, поменять местами цифры нулевого и первого разрядов, а также второго и третьего разрядов (например, 1234 → 2143). ◮ 3.8. Определить количество цифр целого числа, введенного с клавиатуры. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 44 ◮ 3.9. В одном из вариантов кодировки Unicode можно закодировать 65 536 различных символов. Вычислить информационный объем (в битах и байтах) введенного пользователем сообщения длиной N символов. ◮ 3.10. Анкета имеет объем 20 КБ. Определить количество страниц в анкете, если известно, что на каждой странице анкеты N строк по KChar символов (исполь- зуется система кодировки ASCII). ◮ 3.11. Даны c, d. Вычислить √ где x1 sin 3 |cx31 + dx22 − cd| cx31 + dx22 − x1 )2 + 3:14 ( — бо́льший, а x2 + tg( cx31 + dx22 − x1 ); — меньший корень уравнения x2 − 3x − |cd| = 0. Указание. При решении задачи использовать только оператор присваивания. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 45 Контрольные вопросы 1. Назовите два способа записи вещественных чисел. 2. Назовите составляющие записи числа с плавающей точкой и сформулируйте их определения. 3. Сформулируйте определение идентификатора. 4. Перечислите стандартные математические функции языка Pascal. 5. Опишите, как работает оператор присваивания. 6. Что определяет тип данных? 7. Что такое операции сравнения и результат какого типа они дают? 8. Перечислите простые типы данных. 9. Назовите основную характеристику порядкового типа данных. 10. Перечислите порядковые операции. 11. Перечислите операции над данными вещественного типа. 12. Какие значения может принимать переменная типа Boolean? 13. Сколько символов можно сохранить в переменную типа Char? 14. Опишите порядок сравнения строк в языке Pascal. 15. Что такое конкатенация? 16. Назовите функцию, позволяющую определить наибольшее значение, которое могут принимать данные некоторого типа. 17. Определите тип результата, возвращаемого функцией Sqrt(4). 18. Определите тип результата выражения 50 / 10. 19. Определите тип результата выражения ’True’ = ’False’. 20. Чем отличается действие операторов Read и ReadLn? 21. Сколько аргументов могут иметь процедуры Read и ReadLn? ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 46 22. Можно ли с помощью процедуры Read прочитать выражение вида a + b? 23. Какие обозначения используются в форматах вывода? 24. Можно ли с помощью процедуры Write напечатать значение арифметического выражения? 25. Можно ли с помощью процедуры Write напечатать значение логического выражения? 26. Как называется алгоритм, в котором все предписания выполняются в порядке следования? 27. Приведите пример самой короткой программы. 28. Назовите раздел программы, начинающийся служебным словом var. 29. Назовите раздел программы, начинающийся служебным словом uses. 30. Какова особенность работы операторов программы, находящихся между символами (* и *). 31. Что называют инициализацией переменной? 32. Что понимают под отладкой программы? ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 47 Тест рубежного контроля 1. Какой из перечисленных разделов обязателен в программе: а) var; б) type; в) begin ... end; г) const. 2. Определите набор, в котором операции приведены в порядке невозрастания приоритета: а) and, or, not, xor; б) not, >, and, mod; г) *, and, =, <>; д) in, *, <>, >. в) div, or, mod, and; 3. Чему равна мантисса числа 1.735e10? а) 1.735; б) 0.735; в) 1; г) 10. 4. Выберите верный результат работы оператора: Write(’Pi=’, pi:7:2); а) Pi=␣␣␣3.14; б) Pi=3.14000; в) Pi=3.1415927; г) Pi=3.14. 5. Выберите верный оператор вывода для печати значений переменных K (целого типа, 0 6K6 100 ) и R (вещественного типа, 0 < R < 10), результат работы которого имеет вид: ␣dd␣␣d.dd_ ( d — некоторая десятичная цифра): а) Write(K:4, R:7); б) Write(K:3, R:7:2); в) Write(K:3, R:6:2); г) Write(K:3, R:7); д) Write(K:4, R:7:2); 6. Какой из операторов присваивания служит для вычисления расстояния между двумя точками A1 (x1 ; y1 ) и A2 (x2 ; y2 ) по формуле: |A1 A2 | = √ x2 − x1 )2 + (y2 − y1 )2 ( а) A1A2 := Sqr( Sqrt(x2-x1) + Sqrt(y2-y1) ) б) A1A2 = Sqrt( Sqr(x2-x1) + Sqr(y2-y1) ) в) A1A2 := Sqrt Sqr(x2-x1) + Sqr(y2-y1) г) A1A2 := Sqrt( Sqr(x2-x1) + Sqr(y2-y1) ) ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 48 7. В программе имеется следующий раздел описания переменных var a, b : Integer; c, i : Real; Выполнение последовательности операторов присваивания a := 1; b := 2; c := 3; i := 4; a := 5 * a; b := 6 * b; c := 7 * c; i := 8 * i; i := i / c; a := Sqr(a); b := c div a; c := c * c + 13; приведет к ошибке. Для исправления ошибки требуется переопределить тип переменной а) a: Real; б) b: Real; в) c: Integer; г) i: Integer. 8. В результате выполнения последовательности операторов: a := 13 Div (16 Mod 7); b := 32 Mod a * 3 - 19 Mod 3 * 2; Write(’a = ’, a, ’ || b = ’, b); на экран будет выведено: а) a = 6 || b = 13 б) a = 6 || b = 4 в) a = 1 || b = 94 г) a = 1 || b = 1 9. Выберите набор имен стандартных тригонометрических функций языка Pascal: а) ArcTan ArcCos б) ArcTan Cos Sin в) ArcTan Cos Sin; г) Cos Sin ArcSin Cos Sin Tan; Tan; Tan. 10. Вычеркните имена математических функций, отсутствующие в словаре языка Pascal: Sin, Cos, Tan, Ln, Lg, Sqr, Fabs, Abs, ArcCos, ArcTan, Min, Max. 11. Запишите оператор присваивания для определения количества строк в таблице истинности для логической функции n-переменных (без использования функции Power). ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ 49 12. Запишите операторы присваивания для вычисления значения выражения √ s + e − d; где s, d, e — цифры целого трехзначного числа, соответственно, отвечающие за сотни, десятки и единицы. 13. Отметьте операторы и выражения, возможные для указанных описаний: Тип переменных x, y, z Integer Real string y := Ord(x) Dec(x) Read(x) Read(’x’) Write(x) Write(x:10) Write(x:10:2) Write(Length(x)) z := x + y z := x - y z := x / y z := ’2’ z := x Mod y y := Trunc(x) y := Succ(x) 14. В результате выполнения последовательности операторов Write(’11,01’:6); Writeln(’-’); Writeln; Write(’1,1’:5); WriteLn(’1’); на экран будет выведено некоторое арифметическое выражение. Изобразите его вид и посчитайте результат в двоичной системе счисления. Используйте обозначения: пробел — символ ␣, положение курсора — _. ◭x Е. В. Ширяева, М. Н. Романов. Информатика (подготовка к ЕГЭ) .y ◮ Тесты для самопроверки Вариант 1 Ответы 1. Представьте числа и выражения в виде чисел, записанных по правилам языка Паскаль: 1) 3!; 1 2) 100000 ; − 0;02(6): 3) Указания. 1) Число в задании 2) запишите в экспоненциальной форме, чтобы мантисса числа удовлетворяла неравенству: 0 6 |a| < 1. 2) В периодической дроби после запятой указжите 5 цифр. 2. Перепишите выражения в традиционной математической форме: a * b / (c + d) - (c - d) / b * (a + b): 3. Запишите операторы присваивания для вычисления выражений для заданного x (> 0): √ a=x 2 b = log3 ex : ; 4. Определите тип переменных, участвующих в следующих операторах присваивания: 1) m1 := ’False’; 5) m5 := 3.0; 6) 2) m2 := ’’; m6 := -30; 7) 3) m3 := True; m7 := ’3’; 8) 4) m4 := Pi; m8 := ’1’ + ’2’: Список возможных идентификаторов типов: Char; string; Boolean; Byte; ShortInt; Integer; Word; Real: 5. Дана последовательность операторов: a := 31 mod 16 div 7; b := 32 mod a * 3 - 19 mod 7 * 2; Расстановкой пары скобок во втором операторе присваивания добейтесь, чтобы переменная b приняла значение −5. ◭x 50 .y ◮ 51 6. Запишите операторы присваивания для обмена первой и последней цифр трехзначного числа n (например, 345 → 543). 7. Запишите результат вычисления выражения: SizeOf(Integer) mod SizeOf(Byte) + SizeOf(Char) div Ord(True) 8. Что будет выведено на экран в результате выполнения последовательности операторов: WriteLn(’Exp =’, Exp(1):6:2); WriteLn(’Exp =’, Exp(1):9); WriteLn(’Cat’:5); Указания. 1) Считать, что порядок числа — двухразрядное целое число со знаком; 2) Используйте обозначения: пробел — символ ␣, положение курсора — _. 9. В системе счисления с некоторым основанием число Aq записывается как 1011p . Здесь A и q — числа, полученные в результате выполнения операторов A := 75 - 31 mod 16 div 7 * 19; q := 45 mod A; Определите основание системы счисления p. 10. Дан программный код: var a, b, c : Integer; begin a := Length(’Kotik’); b := High(Byte); c := Round(b / a) + Succ(a + 10); WriteLn(-c); end. Сколько значащих нулей содержит внутреннее представление отрицательного числа, выведенного на экран в результате работы приведенной программы? Считать, что для хранения числа со знаком используется один байт. 11. Запишите оператор присваивания для определения количества цифр целого числа x. ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 52 Вариант 2 Ответы 1. Представьте числа и выражения в виде чисел, записанных по правилам языка Паскаль: 1) 5!; 2) − 1 1000 ; 3) LIII: 2. Запишите по правилам языка Паскаль число в экспоненциальной форме: 17 10 9 : Ответ представьте в виде, при котором мантисса числа удовлетворяет неравенству: 1 6 |a| < 10. 3. Запишите операторы присваивания для вычисления выражений для задан- ного x (> 0): a = 3x ; b = log3 a; c = b − sh a: 4. Пусть в программе описаны переменные R, I, C, S, B, принадлежащие типам: R — Real, I — Integer, C — Char, S — String, B — Boolean. Укажите верные операторы присваивания: 1) C := ’S’; 6) 2) C := S; R := I div 2; 3) 7) S := ’’; 4) B := ’True’; I := Round(R); 8) 5) I := 4 / 2; R := -1.5E+3: 5. В результате выполнения последовательности операторов Write(’111,1’); WriteLn(’’); Write(’0,1’); WriteLn(’1’); WriteLn(’1’); на экран будет выведено два или более чисел (каждое в отдельной строке). Сложите полученные числа в двоичной системе счисления. Результат запишите в 8ричной системе счисления. Используйте обозначения: пробел — символ ␣, положение курсора — _. 6. Запишите операторы присваивания для осуществления циклического сдвига всех цифр трехзначного числа n вправо (например, 345 → 534). ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 53 7. Укажите порядок выполнения операций в выражении True and (SizeOf(Char) mod SizeOf(Byte) = 1) or False 8. Что будет выведено на экран в результате выполнения последовательности операторов: WriteLn(’Pi =’, Pi:6:2); WriteLn(’Pi =’, Pi:9); WriteLn(’F’ = ’f’:7); Указания. 1) Считать, что порядок числа — двухразрядное целое число со знаком; 2) Используйте обозначения: пробел — символ ␣, положение курсора — _. 9. Десятичное число A в системе счисления с некоторым основанием записывается как B. Здесь A и B — числа, полученные в результате выполнения операторов A := 31 mod 16 div 7 * 19; B := 70 mod A * 3 + 100 + 25 mod 7 * 4; Определите основание системы счисления, в которой записано число B. 10. Дан фрагмент программного кода: a := 0.7; s := ’0000’; r := SizeOf(Byte) - SizeOf(Char); Write(’X=’, Ord(2 = 2), Trunc(a), r, Round(a), s); Выполните задания: 1) Опишите переменные a, s и r. 2) Запишите результат действия оператора печати. 3) Пусть выведенное на экран число — это дополнительный код го отрицательного числа Y. По коду X2 восстановите число Y. X2 десятично- Считать, что для хранения числа со знаком используется один байт. 11. Запишите оператор присваивания для определения знака ненулевого вещественного числа x. Определение функции sgn x для x ̸= 0: { sgn x= −1 ; x < 0 ; 1 ; x > 0: ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ Ответы на вопросы теста Ответы на задания I варианта 1. 6 0.1e-4 2. a 3. a := Exp(Sqrt(2) * Ln(x)); 4. 1) string; b c+d − -0.02667 c−d ( a + b) b 2) string; 6) Integer, ShortInt, Real; 5. или ab c+d − ( c − d)(a + b) b b := x / Ln(3). 3) Boolean; 4) Real; 7) Char, string; 5) Real; 8) string. b := 32 mod a * 3 - 19 mod (7 * 2); 6. Обмен первой и последней цифр числа e := n mod 10; // цифра разряда единиц d := n div 10 mod 10; // цифра разряда десятков s := n div 100; // цифра разряда сотен n := e * 100 + d * 10 + s; // сборка нового числа ◭x 54 .y ◮ 55 7. 1 8. Exp␣=␣␣2.72 Exp␣=␣2.72E+00 ␣␣Cat 9. 3 Решение. В результате выполнения операторов присваивания имеем A = 37 , p = 8. Переведем число Ap = 378 в десятичную систему счисления: 378 = 3 Запишем число сумма равна 31: 10. 1011p · 8 + 7 = 31: в развернутой форме 1011p = p3 + p + 1. Известно, что эта p3 + p + 1 = 31, p3 + p = 30, p = 3. 2. Примечание. Результат работы программы: −67. Внутреннее представление отрицательного числа −67: 11. 101111012 . m := Trunc( Ln(Abs(x)) / Ln(10) ) + 1 Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I 56 Ответы на задания II варианта 1. 120 -0.001 2. 1.7E-8, так как 53 17 9 10 ; · 10−8 . = 1 7 3. a := Exp(x * Ln(3)); b := Ln(a) / Ln(3); c := b - (Exp(a) - Exp(-a)) / 2; 4. 1, 3, 6, 7, 8 5. 111,1 0,11 1 _ ; ; ; ; ; 111 12 + 0 112 + 12 = 1001 012 = 1 001 010 = 11 28 . ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 57 6. Сдвиг цифр числа вправо e := n mod 10; // цифра разряда единиц (345 mod 10 = 5) sd := n div 10; // первые две цифры числа (345 div 10 = 34) n := e * 100 + sd; // сборка нового числа (5 * 100 + 34) В комментариях указаны действия операторов на примере числа 345. 7. Порядок выполнения операций 5 1 3 2 4 6 True and (SizeOf(Char) mod SizeOf(Byte) = 1) or False 8. Pi␣=␣␣3.14 Pi␣=␣3.14E+00 ␣␣FALSE 9. 4 Решение. Воспользуемся формулой перевода числа, записанного в p-ичной системе счисления, в десятичную систему счисления: 212p = 2 Известно, что эта сумма равна 38: 2 · p2 + p + 2: p2 + p + 2 = 38; 2 p2 + p = 36; p = 4. 10. 1) a: Real; s: string; r: Byte (или r: Integer). 2) X=10010000_ 3) −112 11. m := Round(Abs(x) / x) Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I Справочная информация Связь между единицами измерения информации 1 Б (байт) = 8 бит 10 (1024) байт 10 (1024) КБ 1 КБ (килобайт) = 2 1 МБ (мегабайт) = 2 10 МБ = 2 10 ГБ = 2 1 ГБ (гигабайт) = 2 1 ТБ (терабайт) = 2 = 2 = 2 20 20 КБ = 2 20 МБ = 2 13 бит байт = 2 30 байт 30 КБ 23 = 2 = 2 40 бит 33 бит байт = 2 43 бит Слова «байт» и «бит» склоняются. В родительном падеже — битов, байтов, килобайтов и т. п. Существующая счетная форма (6 бит, 16 килобайт) является разговорной (см. «Русский орфографический словарь». М., 2005). Приоритеты операций Очередность выполнения Операции 1 @, not, унарный минус, унарный плюс 2 *, /, div, mod, and, shr, shl 3 +, -, or, xor 4 in, >, <, =, <>, >=, <= Операции с одинаковым приоритетом, присутствующие в одном выражении, вычисляются слева направо. ◭x 58 .y ◮ 59 Некоторые дополнительные функции Имя функции Результат Frac(x) дробная часть аргумента (аргумент и результат ∈ R) Frac(x) = x - Int(x) Int(x) целая часть аргумента (аргумент и результат ∈ R) Random случайное вещественное число из интервала Random(n) случайное целое число в пределах из интервала ; ; [0 0; 1 0] [0; n) Для корректной работы функции Random рекомендуется ее инициализировать, вызвав процедуру Randomize. Инициализацию следует проводить до первого вызова функции Random. Словарь языка Turbo Pascal Зарезервированные слова and exports mod shr asm file nil string array for not then begin function object to case goto of type const if or unit constructor implementation packed until destructor in procedure uses div inherited program var do inline record while downto interface repeat with else label set xor end library shl Стандартные директивы absolute external forward near public assembler far interrupt private virtual Директивы private и public при описании объектных типов считаются зарезервированными словами. ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 60 Стандартные идентификаторы Модули: Crt Dos Graph Константы: False True Типы: Boolean Char Overlay MaxInt Printer MaxLongInt Text Integer ShortInt LongInt Real Single Input Output Функции: Abs ArcTan Pi Sqrt Succ Процедуры: Int Copy IOResult Pos Pred Random Trunc Assign Close Insert New Frac EOF EOLN Length Round Sin Erase Exit Ln Sqr Upcase Delete Dispose Randomize Read Rewrite Seek Word Comp Chr Cos Concat Exp FileSize Odd Ord Byte Double Extended Файлы: System Str Val Write ReadLn Halt Reset WriteLn ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 61 Перевод чисел в десятичную систему счисления Развернутая запись числа. В произвольной позиционной системе счисления любое число представляется суммой Np = ±(ai−1 pi−1 + : : : + a1 p1 + a0 p0 + a−1 p−1 + a−2 p−2 + : : : + a−m p−m ); где p — основание системы счисления (p ступных для записи чисел; > 1 ), т. е. количество цифр, до- i — количество целых разрядов числа; ak — цифры данной системы счисления. Правило перевода. Число, представленное в любой системе счисления, необходимо записать в развернутой форме и вычислить его значение. Пример 3.8. Подробный процесс перевода p-ичных чисел: 1425 = 1 · 52 + 4 · 51 + 2 · 50 = 5 1428 = 1 · 82 + 4 · 81 + 2 · 80 = 8 12C16 = 1 2 2 · 162 + 2 · 161 + C · 160 +4 · 5 + 2 = 25 + 20 + 2 = 4710 ; +4 · 8 + 2 = 64 + 32 + 2 = 9810 ; = 16 2 +2 · 16 + C = 256 + 32 + 12 = 30010 . Для сокращения записи сумму, выделенную красным цветом, рекомендуется пропускать. Особенно это касается перевода чисел из двоичной системы счисления 1012 = 1 · 22 + 0 · 21 + 1 · 20 = 2 2 + 1 = 510 : Пример 3.9. Примеры перевода нецелых чисел: ; 54 58 = 5 · 81 + 4 · 80 + 5 · 8−1 = 5 ; = 8+ 1+ 1001 012 = 2 3 +2 0 +2 −2 ·8+4+ 1 4 5 8 ; = 44 62510 ; = 9 2510 ; : ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 62 Перевод чисел из десятичной системы счисления Правило перевода целой части числа. Целая часть числа делится на осно- p новой системы счисления, остаток от деления запоминается. Полученное частное вновь делится на p, остаток запоминается. Процесс продолжается до тех пор, пока частное не станет меньше делителя. Остатки от деления на p вание выписываются в порядке, обратном их получению. Пример 3.10. Переведем десятичное числа 35 в систему счисления с основа- p (p = 2; 8; 16). В таблицах, демонстрирующих процесс перевода, в левом столбце записаны частные, в правом — остатки от деления на p. Стрелки обо- нием значают направление записи остатков. 35 1 17 1 8 0 4 0 2 0 1 1↑ 35 3510 = 1000112 4 . 3 35 4↑ 3510 = 438 . 3 2↑ 2 3510 = 2316 . Компактный способ записи процесса перевода целого десятичного числа X10 → Yp на примере 35 = X2 : 351 171 80 40 20 11 = 1000112 : Здесь индексы — остатки от деления указанного числа на p = 2, которые в от- вете выписываются в обратном порядке (справа налево). Пример 3.11. Перевод числа 72 в системе счисления с основаниями p = 2, 3, , 5: 4 p = 2: p = 3: p = 4: p = 5: 720 360 180 720 240 82 720 182 722 144 91 40 20 11 = 10010002 ; ; 40 11 = 10204 ; 22 = 2425 : 22 = 22003 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 63 Правило перевода дробной части числа. Дробная часть числа последовательно умножается на основание новой системы счисления, после чего целая часть запоминается и отбрасывается. Процесс продолжается до тех пор, пока дробная часть не станет равной нулю. Целые части выписываются после запятой в порядке их получения. Пример 3.12. Перевод числа ; 0 187510 в восьмеричную систему счисления. В левом столбце таблицы записаны целые части, в правом — дробные. Стрелка обозначает направление записи остатков. 0 1875 ↓1 5 4 0 ; ; 0 187510 = 0 148 . Компактный способ записи процесса перевода дробного десятичного числа ;X10 → Yp 0 продемонстрируем на примере перевода числа ; 0 1875 в 8-ричную систему счисления: | 0 1875 | | 1 5 ; 4 0 = 0 14 Здесь индексы — целые части, которые запоминаются и отбрасываются. В ответе целые части выписываются в порядке их получения. Пример 3.13. Перевод числа ; 137 8755 в 8-ричную систему счисления. Целая и дробная части переводятся отдельно, а затем складываются. Результат перевода дробной части получим с четырьмя знаками после запятой. 137 = ; 0 8755 = Y8 : | X8 : 0 8755 1371 | 7 004 171 | 0 032 22 = 2118 | 0 256 | : ; 2 048 = 0 7002 : Ответ: 211,7002. ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 64 Быстрый перевод чисел: X 10 Y ↔ 2 Пример 3.14. Быстрый перевод продемонстрируем на примере перевода числа 53 в двоичную систему счисления. Решение. Представляем заданное число в виде сумм степеней двойки, начиная с самой большой степени: 53 = 32 + 16 + 4 + 1 = 2 5 +2 4 +2 2 +2 0 = Наличие некоторой степени двойки в сумме означает, что при переводе числа в двоичную систему счисления на позициях, совпадающих с показателем степени двойки находится цифра 1, в остальных случаях 0: = 2 5 +2 4 +2 2 +2 0 5 4 3 2 1 0 =1 1 0 1 0 1 2 : Двоичные триады Восьмеричная система счисления (8 = 2 3 ) Каждая 8-ричная цифра может быть представлена тройкой двоичных цифр — триадой. Цифра10 Цифра8 Триада2 0 0 000 1 1 001 2 2 010 3 3 011 4 4 100 5 5 101 6 6 110 7 7 111 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 65 Двоичные тетрады Шестнадцатиричная система счисления (16 = 2 4 ) Каждая 16-ричная цифра может быть представлена четверкой двоичных цифр — тетрадой. Число10 Цифра16 Тетрада2 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 7 7 0111 8 8 1000 9 9 1001 10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 15 F 1111 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 66 Перевод чисел: X 2 → Y k 2 и X 2 k → Y 2 Системы счисления, основания которых являются степенями одного числа, называют родственными. Системы счисления, родственные двоичной: 4, 8, 16. p = 2k означает, что число p представляет собой степень числа 2 с показателем k: Запись • p = 16 = 24 , здесь k = 4. Запись X 2 → Y 2k означает, что число переводится из двоичной системы счис- ления в родственную систему счисления. Правило перевода числа из двоичной системы счисления в родственную систему счисления (X2 → Y2k ) 1) Разбить цифры двоичного числа на группы по k цифр (где k — значение показателя степени двойки у основания новой системы счисления). 2) Каждую группу заменить соответствующей цифрой новой системы. Для целого числа разбиение по группам производится справа налево, при необходимости дополняя нулями крайнюю левую группу. Например, при переводе целого двоичного числа в 8-ричную систему (k = 3 ) число разбиваем на триады справа налево 11110101012 = 001 111 010 101 L99 L99 L99 L99 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 67 Для дробного числа разбиение на группы производится ← справа налево для цифр, стоящих слева от запятой, при необходимости дополняя нулями крайнюю левую группу; → слева направо для цифр, стоящих справа от запятой, при необходимости дополняя нулями крайнюю правую группу При переводе в 8-ричную систему счисления (k = 3 ) число разбиваем на двоичные триады; при переводе в 16-ричную систему счисления (k = 4 )— двоичные тетрады ; 1111010101 112 = 001 111 010 101 ; 110 2 L99 L99 L99 L99 99K = 0011 1101 0101 ; 1100 : ←−− ←−− ←−− −−→ 2 Пример 3.15. Перевести в 8- и 16-ричную системы счисления число Решение. Разбиваем число ; 110 0012 ; 110 0012 . на триады и тетрады, которые затем заме- няем соответствующими 8- и 16-ричными цифрами. Двоичные триады 110 , 001 8-ричные цифры 6 , 1 Двоичные тетрады 0110 , 0010 16-ричные цифры 6 , 2 Ответ: ; ; ; 110 0012 = 6 18 = 6 216 . Правило перевода числа из системы счисления с основанием, равным степени двойки, в двоичную систему счисления (X2k → Y2 ) каждую цифру числа преобразовать в группу двоичных цифр; количество двоичных цифр в группах равно показателю степени двойки в старой системе счисления. Пример 3.16. Выполнить перевод числа Решение. Каждую цифру числа ; 10 478 ; 10 478 в двоичную систему счисления. заменяем двоичной триадой: 8-ричные цифры 1 0 , 4 7 Двоичные триады 001 000 , 100 111 Ответ: ; ; 10 478 = 1000 1001112 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I . .y ◮ 68 Перевод чисел: Xp → Ys Правило перевода числа из произвольной системы счисления в произвольную систему счисления (Xp → Ys ): 1) перевести число из исходной системы счисления в десятичную; 2) перевести десятичное число в требуемую систему счисления. Кратко правило запишется в виде: Xp → Z10 → Ys . Правило перевода X2k → Y2m : 1) перевести число из исходной системы счисления в двоичную; 2) перевести двоичное число в требуемую систему счисления. Кратко правило запишется в виде: X2k → Z2 → Y2m . ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 69 Арифметические операции Арифметические действия в любой позиционной системе выполняются подобно аналогичным операциям с десятичными числами. Выполнение арифметических операций в системе счисления с основанием p удобно проводить по таблицам сло- жения и умножения. + 0 1 × 0 1 0 0 1 0 0 0 1 1 10 1 0 1 + 0 1 2 3 4 5 6 7 × 0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 1 1 2 3 4 5 6 7 10 1 0 1 2 3 4 5 6 7 2 2 3 4 5 6 7 10 11 2 0 2 4 6 10 12 14 16 3 3 4 5 6 7 10 11 12 3 0 3 6 11 14 17 22 25 4 4 5 6 7 10 11 12 13 4 0 4 10 14 20 24 30 34 5 5 6 7 10 11 12 13 14 5 0 5 12 17 24 31 36 43 6 6 7 10 11 12 13 14 15 6 0 6 14 22 30 36 44 52 7 7 10 11 12 13 14 15 16 7 0 7 16 25 34 43 52 61 Пример 3.17. Сложение «больших» чисел: а) 100000100(2) + 111000010(2) = 1011000110(2) + . 100000100 111000010 1011000110 б) + ; ; ; 147 14(8) + 350 34(8) = 517 5(8) 147,14 350,34 517,50 . в) ; ; ; 12C 3(16) + 3B3 5(16) = 4DF 8(16) + . 12C,3 3B3,5 4DF,8 ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 70 Пример 3.18. Вычитание чисел: а) ; 1001 01(2) − 110;1(2) = 10 11(2) ; . ; . 1001,01 110,1 − 10,11 ; б) 411 2(8) − − 231;54(8) = 157 44(8) в) 411,2 231,54 ; 4D2 8(16) − 3B3;5(16) ; = 11F 3(16) . 4D2,8 3B3,5 − 11F,3 157,44 Пример 3.19. Умножение «больших» чисел: а) 1178 · 538 = 65058 . б) 11716 · 5316 × 117 53 × 117 53 + 355 613 + 345 573 6505 = 5A7516 . 5A75 Некоторые факты, которые следует запомнить Умножение числа на величину основания приводит к перемещению запятой, отделяющей целую часть от дробной, на один разряд вправо: ; 777 7710 · 10 = 7777;710 ; ; 101 012 · 2 = 1010;12 ; Деление числа на величину основания приводит к перемещению запятой, отделяющей целую часть от дробной, на один разряд влево: ; ; 777 7710 : 10 = 77 77710 ; ; ; 101 012 : 2 = 10 1012 : ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 71 Представление целых чисел В k-разрядной ячейке может храниться 2 k различных значений целых чисел. Диапазон значений целых неотрицательных чисел: от 0 до 2 k − 1. Алгоритм получения внутреннего представления положительного числа N , хранящегося в k разрядном машинном слове: 1) перевести число N в двоичную систему счисления; 2) результат перевода дополнить слева незначащими нулями до Например, внутреннее представление числа 37 0000 0000 0010 01012 k разрядов. в двухбайтовой ячейке: : Для представления отрицательных чисел используется дополнительный код, который позволяет заменить арифметическую операцию вычитания операцией сложения A−B = A + (−B ). Это существенно упрощает работу процессора и увели- чивает его быстродействие. Классический алгоритм получения внутреннего представления отрицательного числа N , хранящегося в k разрядном машинном слове: 1) получить внутреннее представление положительного числа N; 2) получить обратный код этого числа заменой 0 на 1 и 1 на 0 (инвертировать значения всех бит); 3) к полученному числу прибавить 1. Данная форма называется дополнительным кодом. Пример 3.20 (классика). Получение внутреннего представления числа −17 в однобайтной ячейке. Решение. 1) Получение внутреннего представления числа 17 = 100012 = ( добавляем незначащие нули до 17 8 : разрядов) 2) Получение обратного кода (инвертирование бит): = 0001 00012 1110 11102 3) Получение дополнительного кода (добавление 1): 111011102 +1 Внутреннее представление числа −17: 11101111 : = 111011112 . . ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 72 Альтернативный алгоритм получения внутреннего представления отрицательного числа N , хранящегося в k разрядном машинном слове: 1) вычесть из положительного числа N единицу; 2) полученное число перевести в двоичную систему счисления; 3) результат дополнить слева незначащими нулями до k разрядов; 4) инвертировать значения всех бит. Пример 3.21 (альтернатива). Получение внутреннего представления числа −17 в однобайтной ячейке с использованием альтернативного алгоритма. Решение. − 1 = 16; 1) 17 2) 16 = 2 3) 0001 00002 ; 4) 1110 11112 . 4 = 100002 ; Внутреннее представление числа −17: 11101111 . Достоинство альтернативного способа заключается в том, что не надо в двоичной системе счисления проводить операцию добавления единицы. Классический алгоритм перевода дополнительного кода в десятичное число: 1) инвертировать дополнительный код; 2) к полученному коду прибавить единицу (результат: модуль отрицательного числа); 3) перевести результат в десятичное число; 4) приписать знак отрицательного числа. Пример 3.22 (классика). По дополнительному коду 111011112 восстановить десятичное отрицательное число. Решение. 1) Инвертирование дополнительного кода: 2) Добавление единицы: 0001 00002 1 00002 + 1 = 1 00012 3) Перевод в десятичное число: 100012 = 17 . . . 4) Приписывание знака «минус»: −17. ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ 73 Альтернативный алгоритм перевода дополнительного кода в десятичное число: 1) инвертировать дополнительный код; 2) перевести результат в десятичное число; 3) к полученному коду прибавить единицу (результат: модуль отрицательного числа); 4) приписать знак отрицательного числа. Пример 3.23 (альтернатива). По дополнительному коду 111011112 восстано- вить десятичное отрицательное число. Решение. 1) Инвертирование дополнительного кода: 2) Перевод в десятичное число: 3) Добавление единицы: 0001 00002 . 100002 = 16 16 + 1 = 17 . 4) Приписывание знака «минус»: −17. ◭x Е. В. Ширяева, М. Н. Романов. Курс «Основы информатики». Часть I .y ◮ Список литературы [1] Абрамов С. А., Зима Е. В. Начала информатики. М.: Наука, 1989. [2] Коффман Э. Б. Turbo Pascal. 5-е издание.: Пер. с англ. М.: Издательский дом «Вильямс», 2005. [3] Минакова Н. И., Невская Е. С., Угольницкий Г. А., Чекулаева А. А., Чердынцева М. И. Методы программирования. М.: Вузовская книга, 1999. [4] Могилев А. В., Пак Н. И., Хеннер Е. К. Практикум по информатике. Пособие для студентов. М.: Академия, 2005. [5] Немнюгин С. А. Turbo Pascal: практикум. СПб.: Питер, 2002. [6] Программирование на языке Паскаль: задачник / под ред. Усковой О. Ф. СПб.: Питер, 2003. [7] Ширяева Е. В. Материалы к практическим занятиям по курсу «Основы программирования». Ростов-на-Дону, 2011–2014 [Электронный ресурс]. [8] Ширяева Е. В. Системы счисления. Ростов-на-Дону, 2014 [Электронный ресурс]. ◭x 74 .y ◮ Интерфейс пользователя Цветовая схема Цвет Элемент Зелёный основное понятие Коричневый гиперссылка на некоторый раздел документа (параграф, уравнение и проч.). См. ссылку на раздел ссылка в Internet. Например, Кафедра вычислительной математики и математической физики Светло-зелёный фон Светло-жёлтый фон Голубой фон определение понятия. Например, определение идентификатора текст примера. См. пример 2.1 замечание, альтернативные варианты известных алгоритмов. Например, замечание Пиктограммы Пиктограмма Элемент № замечания замечание № задания начало задания. Например, см. задание 1 № задания возврат к формулировке задания в разделе «Ответы» ◭x 75 .y ◮ Навигация по электронному документу Навигация по электронному документу может осуществляться с помощью клавиш и колесика мыши, клавиатуры — используются стандартные горячие клавиши программы Adobe Acrobat; элементов управления программы Adobe Acrobat (панель навигации и список закладок в окне Bookmarks), а также панели навигации учебного пособия ◭x .y ◮ Пиктограмма (см. правый нижний угол страницы): Действие ◭ предыдущая страница ◮ следующая страница x предыдущий просмотр y следующий просмотр переход на страницу N . поиск слов в документе ◭x .y ◮ Список горячих клавиш для работы с электронным документом в программе Adobe Acrobat Действие Комбинация клавиш Полноэкранный режим Ctrl + L Выход из полноэкранного режима Esc Растянуть по ширине экрана Ctrl + 2 Переход к началу документа Home или Shift + Ctrl + Page Up или Shift + Ctrl + Up Arrow Переход к концу документа End или Shift+Ctrl+Page Down или Shift+Ctrl+Down Arrow Переход на страницу N Shift + Ctrl + N Предыдущий экран Page Up или Return Следующий экран Page Down или Shift + Return Предыдущая страница Left Arrow или Ctrl + Page Up Следующая страница Right Arrow или Ctrl + Page Down Предыдущий просмотр Alt + Left Arrow Следующий просмотр Alt + Right Arrow ◭x .y ◮ Об авторах Ширяева Елена Владимировна — кандидат физико-математических наук, доцент кафедры «Вычислительная математика и математическая физика» института математики, механики и компьютерных наук им. И. И. Воровича ФГАОУВО «Южный федеральный университет». Ширяева Е. В. — автор более 60 научных и методических работ, в том числе четырех монографий. Область научных интересов — массоперенос в многокомпонентных смесях, конечно-разностные методы, метод конечных элементов, течения вязкой жидкости, вычислительная математика, программирование, создание программного обеспечения. Романов Максим Николаевич — кандидат физико-математических наук, старший преподаватель кафедры «Вычислительная математика и математическая физика» института математики, механики и компьютерных наук им. И. И. Воровича ФГАОУВО «Южный федеральный университет». Романов М. Н. — автор более 20 научных работ и учебных пособий. Область научных интересов — изотермические и неизотермические течения жидкости между вращающимися цилиндрами с проницаемыми и непроницаемыми стенками (проблема Куэтта-Тейлора), численный анализ нелинейных задач теории гидродинамической устойчивости, изучение пересечения бифуркаций и возникновения хаотических режимов, программирование, проектирование баз данных. ◭x 78 .y ◮