Книга: Песни о Паскале

Глава 14 Дважды два – четыре

Глава 14

Дважды два – четыре


Первые компьютеры назывались электронными вычислительными машинами (ЭВМ). Хотите – верьте, хотите – нет, но тогда на них не документы печатали и не фильмы смотрели, а вычисляли. С тех пор компьютеры научились многому и даже обыгрывают в шахматы чемпионов мира, однако, их способность к счету по-прежнему в цене.

Поможем братьям нашим меньшим

Пора и нам обратиться к вычислительным талантам компьютера. Не будем тратить попусту время, и по ходу дела соорудим полезную программу. Вы сможете испытать её на живом человеке, если найдёте первоклашку, зубрящего таблицу умножения. Уверен, что он с удовольствием подвергнет себя такому испытанию. Итак, наша очередная программа – экзаменатор. Суть её проста: компьютер предлагает ученику два числа и ждет от него ответа – произведения этих чисел. За правильный ответ ученика поощряют, а иначе его ждет «нахлобучка».

Числа и действия с ними

Скажу честно: знакомых нам типов данных – STRING и BOOLEAN – не хватит для решения поставленной задачи. Для вычислений в Паскале припасены другие типы данных, один из которых называется INTEGER, что переводится как целое. Из названия следует, что переменные такого типа могут хранить целые числа (положительные и отрицательные), например 10, 25, -14. Переменные целого типа объявляют следующим образом:

var N, M : integer;

Таким переменным можно присваивать выражения целого типа, состоящие из чисел, арифметических операций, скобок и других переменных, например:

      N := 19; M :=-25;
      M := 20 + 3*N;

К арифметическим операциям относятся:

• сложение (+) и вычитание (–);

• умножение (*) и деление (DIV);

• нахождение остатка от деления (MOD).

Здесь DIV и MOD – это ключевые слова языка. Примеры деления и нахождения остатка показаны ниже (в комментариях указаны результаты).

      N := 10 div 2; { =5 }       M := 10 mod 2; { =0 }
      N := 10 div 3; { =3 }       M := 10 mod 3; { =1 }
      N := 10 div 4; { =2 }       M := 10 mod 4; { =2 }
      N := 10 div 5; { =2 }       M := 10 mod 5; { =0 }
      N := 10 div 6; { =1 }       M := 10 mod 6; { =4 }

Как видите, операции с целыми числами дают целый результат даже при делении, поскольку дробная часть отбрасывается.

Числовые переменные и выражения можно сравнивать между собой на равенство (=), неравенство (<>), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=). При сравнении получается, как всегда, булев результат, например:

var X, Y: integer;
      B: Boolean;
begin
      X:=5;       Y:=10;
      B:= X=Y; { B = FALSE }
      B:= X<Y; { B = TRUE }
      B:= X=Y-5; { B = TRUE }
end.

А как быть с вводом и выводом числовых данных, нет ли тут сложностей? К счастью, нет. Так же как и строки, числовые данные вводятся процедурой Readln, а печатаются процедурами Write и Writeln, например:

      Readln(X);
      Writeln(X);
      Writeln(’Y=’, X+10);

В последнем операторе на экран выводится строковая константа ’Y=’ и результат сложения X+10.

Теперь вы снабжены всем необходимым для написания экзаменатора.

Алгоритм экзаменатора

Прежде всего, уточним алгоритм создаваемой программы. Живой экзаменатор сам придумывает примеры для умножения. Но нам это пока не под силу – маловато знаний – отложим этот вариант до следующей главы. А пока экзаменуемый будет сам «создавать себе проблемы», то есть будет вводить сомножители по запросу программы вручную. Пример диалога может выглядеть, например, так:

Первый сомножитель A = 7
Второй сомножитель B = 7
Произведение A*B = 47
Ошибка, повтори таблицу умножения!

И так далее. Здесь выделенные курсивом числа 7, 7 и 47 пользователь ввел сам. Разумеется, что задания надо решать многократно, в цикле. Для выхода из цикла нужен какой-то признак, сигнал. Пусть таким сигналом будет ввод нуля в качестве ответа. Тогда блок-схема программы получается такой (рис. 37).


Рис.37 – Блок-схема программы проверки таблицы умножения

Обратите внимание на условие в операторе цикла REPEAT-UNTIL, – оно равно FALSE. Такой цикл будет продолжаться бесконечно, и выйти из него можно лишь процедурой BREAK, как показано на блок-схеме.

Экзаменатор, первый вариант

Вот теперь все готово для написания следующей программы.

{ P_14_1 – экзаменатор таблицы умножения, первый вариант }
var A, B, C : integer; { сомножители и произведение }
      R: Boolean; { результат сравнения }
      S: string;       { сообщение для вывода на экран }
begin
      repeat
      { ввод сомножителей и произведения }
      Write(’Первый сомножитель A = ’); Readln(A);
      Write(’Второй сомножитель B = ’); Readln(B);
      Write(’Произведение A*B = ’); Readln(C);
      if C=0 then break; { завершение цикла, если C=0 }
      { проверяем правильность вычисления }
      R:= A*B=C; { R=true, если верно }
      if R
      then S:= ’Молодец, правильно!’
      else S:= ’Ошибка, повтори таблицу умножения!’;
      Writeln(S);
      until false; { бесконечный цикл }
end.

Запустите программу и проверьте её работу. В следующий раз мы научим её придумывать сомножители, – так будет честнее. А пока подведем итоги.

Итоги

• Для вычислений в Паскале предусмотрены данные числового типа (INTEGER).

• К данным целого типа могут применяться четыре арифметических операции, а также операция нахождения остатка от деления.

• В результате сравнения численных данных получается булев результат, который может быть применен везде, где проверяется условие.

• Числовые данные вводятся оператором Readln и выводятся операторами Write и Writeln;

• Числовым переменным нельзя присваивать строковые значения и наоборот: строковым переменным нельзя присваивать числовые значения.

А слабо?

А) Найдите ошибки в следующей программе и объясните их.

var N, M : integer;
      S : string;
begin
      N:= ’10’;
      S:= N + 5;
      M:= S – 1;
      if S=N then;
end.

Проверьте свои догадки, призвав на помощь компилятор.

Б) Перепишите программу «P_14_1», не прибегая к процедуре Break. В чем, по-вашему, слабость этого второго варианта? Можно ли обойтись в программе «P_14_1» без булевой переменной R и строковой S? Напишите такой вариант программы. Или слабо?

В) Пусть программа запросит три числа: A, B и C, а затем напечатает большее из них. Подсказка: примените булевы выражения вкупе с операциями сравнения, которые в булевых выражениях надо заключать в скобки, например:

      if (A>=B) and (A>=C) then...

Примечание. Скобки ставят по той причине, что булевы операции можно выполнять и с числами, и такие операции приоритетней операций сравнения. О применении логических операций к числам сказано в главе 48.

Г) В стене прорублено прямоугольное сквозное отверстие со сторонами A и B. Пусть ваши программы разберутся, пройдет ли в него кирпич с ребрами X, Y, Z. Сделайте две программы для таких случаев:

• Известно, что A<B и X<Y<Z.

• Соотношение между сторонами неизвестно, и программе самой надо выяснить высоту и ширину, как отверстия, так и кирпича.

Д) Площадь земельного участка вычисляется умножением его сторон A и B. В программу вводятся стороны двух участков (A1, B1 и A2, B2), пусть она напечатает ширину и длину того участка, что больше по площади. Ширина должна быть не больше длины.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.159. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз