Описание
На листе бумаги изображен прямоугольник (рис.1), поверхность которого разбита на 15 равных квадратов. Стороны каждого из таких квадратов параллельны соответствующим сторонам прямоугольника

На рисунках ниже: стороны голубого квадрата параллельны соответствующим сторонам прямоугольника, а красного – нет



Выразим размеры данного прямоугольника в квадратах. Подсчитаем количество квадратов в столбце – их 3 и в строке – их 5. Следовательно можно говорить, что задан прямоугольник размерами 3
×5 (квадратов). Действительно, выполнив операцию умножения получаем, что наш прямоугольник содержит ровно 15 квадратов

Сформулируем теперь начальное условие, с учетом вышесказанного, существенно его упростив, и завершим формулировку задачи
 


Задача

На листе бумаги изображен прямоугольник, размерами 3×5 квадратов.
N квадратов ( N  15) оказалась закрашенной голубым цветом (один из возможных примеров приведен на рис.2). Напишите программу RECTANGL определяющую, какая часть прямоугольника (сколько квадратов) осталась неокрашенной, если значение N вводится с клавиатуры. Выведите полученный результат на экран в виде: "Размер незакрашенной части ...", где вместо знака "..." (троеточие) должно находиться искомое число

Замечание
Запись вида
  N  15 в нашем случае означает, что переменная N является целым неотрицательным числом, т.е. 0, 1, 2,..., не превышающая 15


Например:

REGTANGL.IN (входные данные, в нашем случае вводимые с клавиатуры)
5

RECTANGL.OUT
(выходные данные, в нашем случае выводимые на экран)
10






Идеи и комментарии

Вначале поясним значение нового для нас слова – алгоритм. При решении любой математической задачи мы всегда строго соблюдаем порядок выполнения тех или иных действий. Например, если в примере на вычисление есть действия вычитания и умножения, то для получения верного ответа мы всегда сначала выполним операцию умножения, а уж затем вычитания. Так какое значение имеет слово алгоритм?

Алгоритм - это строго заданный порядок действий, необходимый для правильного решения поставленной задачи



Разобьем решение этой задачи на несколько этапов:

Начнем решение с конца. Для ответа на главный вопрос задачи нам достаточно найти разность между количеством всех квадратов прямоугольника и количеством закрашенных, что нетрудно сделать, используя выражение:

<результат>:=<количество всех квадратов> - <количество голубых квадратов>

Знак “:=“ (читается "присвоить") будем использовать при составлении выражений, занесении значения в ячейку памяти и др. вместо столь знакомого в математике знака “=”, за исключением особых случаев (например, специфика языка программирования). Из условия мы знаем размерность прямоугольника, т.е. какое количество квадратов он содержит – 15. Следовательно для получения <результата> нам нужно будет узнать только количество голубых квадратов, число которых может быть в каждом отдельном случае различным, не превышающим количества всех квадратов в прямоугольнике.

Каким же образом можно ввести это число в память компьютера? Из множества различных способов ввода данных
(числа, буквы, слова, предложения и др.) при решении задач мы будем использовать только два из них:

А куда же будем выводить (записывать) полученный результат? Для работы в наших случаях достаточны:

  • экран монитора

  • внешний текстовый файл

Замечание
Следует всегда внимательно читать и разбирать условие задачи. В его тексте всегда указывается способ ввода/вывода данных (если нет никаких указаний, то данные считываются с клавиатуры и выводятся на экран). В нашем случае в условии указывается, что данные нужно вывести на экран. А откуда ввести? Так как нет никаких дополнительных указаний, то подразумевается ввод с клавиатуры




Решение

Запишем решения задачи сначала в алгоритмической форме:

нач нахождение размера неокрашенной части прямоугольника;
      length_rectangle:=5;
      width_rectangle:=3;

      ввод square_painted;
         result:= length_rectangle*width_rectangle - square_painted;
      вывод Размер незакрашенной части, result
кон


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

  • length_rectangle – длина прямоугольника

  • width_rectangle – ширина прямоугольника

  • square_painted – количество закрашенных квадратов

  • result – размер незакрашенной части прямоугольника

Может возникнуть вопрос: "А для чего давать ячейкам памяти такие длинные имена, если можно было использовать короткие, например a, num1 или иные другие, и тем самым затратить меньше времени для набора текста?" Да, безусловно, при решении задач, имеющих короткий исходный код, как например у нас, можно использовать и короткие обозначения (например для хранения информации о длине прямоугольника некоторой ячейке присвоить имя a, а для ширины - b). Однако, большинство задач будут требовать от нас работы с большим количеством переменных, что приведет, в случае использование коротких, не "созвучных" имен, к путанице, а значит и к появлению необоснованных ошибок. Поэтому рекомендую следить за присваиваемыми именами - это даст вам выигрыш в дальнейшем

Относительно имен, использованных при написании решения нашей задачи можно сказать, что глядя на текст программы и через несколько лет будет все достаточно понятно и прозрачно. Конечно, без изменения "читаемости" кода можно использовать вместо слова "
length_rectangle", например, слово "dlina_pr", но это уже дело вкуса и отношения к английскому языку


Используя найденный алгоритм, представим решение задачи на языке программирования Pascal, введя в первые строки страницы директивы компилятора посредством нажатия комбинации клавиш "Ctrl"+"O"+"O" (удерживая клавишу Ctrl дважды нажимаем клавишу с латинской буквой "O"), о значении и целесообразности применения которых пока не будем говорить:


{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}

program reсtangl;
uses Crt;
const length_rectangle=5;
      width_rectangle=3;
var square_painted, result : shortint;

Begin
 ClrScr;
 square_painted:=0; result:=0;
 readln(square_painted);
 result:=length_rectangle*width_rectangle-square_painted;

 writeln('Размер незакрашенной части ',result);
 repeat until keypressed
End.



Пояснения
При написании кода: учитывая, что количество квадратов в строке и столбце известно, создадим раздел постоянных "Const" (синтаксис языка позволяет использовать в записи служебных слов (название разделов и модулей, имена процедур и функций и т.п.) как строчные, так и прописные буквы латинского алфавита), в котором и занесем данные значения в соответствующие ячейки памяти. Для записи в этом разделе на языке Pascal используется знак "="ввод данных осуществляется с клавиатуры (процедура "Readln"), а вывод результата на экран (процедура "Writeln").

Следует заметить, что вместо указанных выше процедур могут использоваться процедуры "Read" (чтение данных) и "Write" (запись данных) соответственно, в зависимости от предъявляемых к программе требований. Отличие между каждой приведенной парой заключается в том, что процедура, имеющая в конце своего имени окончание "ln", после выполнения действия (например, вывода числа на экран), переводит маркер (курсор) на следующую строку в первую позицию. Процедура же, не имеющая в записи такого окончания, оставляет курсор в конце текущей строки, т.е. строки, с которой проводилась работа с помощью подключенного модуля "Crt" (раздел "Uses"), обеспечиваются: заливка экрана (процедура "ClrScr" в случае работы с текстовым экраном) текущим цветом. По умолчанию цвет фона черный - код "0", а символов - светло-серый, код "7". Часто можно слышать, что применяя эту процедуру мы производим очистку экрана.

Также хотелось бы обратить ваше внимание на тот факт, что применять данную процедуру следует только тогда, когда это требует условие. В противном случае настоятельно рекомендую не использовать в своих программах процедуры и функции (в частности "ClrScr") работы с экраном; приостановка выполнения программы в нужном месте (см. ниже)для хранения чисел в памяти ПК использован один из целочисленных типов "shortint" (применим для целых чисел из диапазона -128..+127), достаточный в нашем случае; строка "repeat until keypressed" обеспечивает приостановку дальнейшего выполнения программы до тех пор, пока не будет нажата любая клавиша (применение такой конструкции дает возможность зрительно "зафиксировать" полученный результат), после чего произойдет переход на следующую строку ("end") и программа завершит свою работу


Тестирование
Первоначально, после окончания работы над программой, необходимо выполнить проверку ее общей работоспособности на приводимом (если такой имеется в условии задачи) тесте, обратив при этом внимание на результат (что вывела программа), который должен совпадать с приведенным (если таков будет), и формат вывода в соответствии с описанным в условии. После чего, для более полной оценки качества работы программы (выяснения, всегда ли программа дает при различных значениях
N верный результат), необходимо использовать набор входных и соответствующих им выходных тестовых данных, специально созданный для проверки работоспособности программы. При этом нужно стараться всегда проверять как "средние" (промежуточные), так и "крайние" значения (ими в нашем случае будут значения N = 0 и N = 15 - соответственно ни один квадрат не был закрашен или все квадраты были закрашенными)

 

Один из возможных вариантов тестового набора приведем ниже:

номер теста

Входные данные (N)

Выходные данные (экран)

1

1

14

2

7

8

3

12

3

4

0

15

5

15

0


© Практические занятия. Урок 1