Подсказка №1. Для выделения числа десятков используйте хорошо знакомую вам операцию «остаток от деления». Т.е., если в переменной n находится введенное число, то получить число десятков очень просто – d:=n mod 10;
Подсказка №2. Надо рассмотреть по сути три диапазона чисел: от 1 до 9, от 10 до 19, и от 20 до 99. (5 баллов)
Задание № 6.3. Ну, если уж сделали предыдущую задачу, то расширьте диапазон чисел до 999. (еще 3 балла)
Задание № 6.4*. Модифицируйте программу 6.3 (даже в сторону упрощения), так чтобы она выводила число в диапазоне от 1 до 999, записанное римскими цифрами. (еще 4 балла)
Запись чисел римскими цифрами:
1 – I
10 – X
100 – C
2 – II
20 – XX
200 – CC
3 – III
30 – XXX
300 – CCC
4 – IV
40 – XL
400 – CD
5 – V
50 – L
500 – D
6 – VI
60 – LX
600 – DC
7 – VII
70 – LXX
700 – DCC
8 – VIII
80 – LXXX
800 – DCCC
9 – IX
90 – XC
900 – CM
Запись остальных чисел происходит просто «склеиванием» записей приведенных чисел.
Например:
23 – XXIII 357 – CCCLVII 888 – DCCCLXXXVIII 901 – CMI 109 – CIX
- 22 -
Тема №7 Операторы цикла While и Repeat … Until
Мы уже познакомились с оператором цикла for, который используется в тех случаях, когда число повторений тела цикла известно заранее. В языке Pascal существуют еще два оператора цикла, которые используются в тех случаях, когда число повторений цикла заранее не известно, либо сложно вычислимо.
Цикл While используется для повторения оператора (группы операторов) произвольное число раз, которое может быть заранее и не известно, причем проверка условия выполнения тела цикла происходит перед выполнением тела цикла.
Синтаксис оператора:
while условие do оператор;
или
while условие do
begin оператор1; оператор2; ....
end;
Суть выполнения оператора заключается в проверке логического условия, если оно оказывается истинным, выполняются операторы тела цикла до тех пор, пока логическое условие не станет ложным. Если условие было ложным перед выполнением цикла, то операторы цикла никогда не выполняются. Если условие остается истинным всегда, то цикл никогда не закончится. Говорят, что программа зацикливается.
Цикл repeat … until похож на цикл while. Его синтаксис:
repeat оператор1; оператор2; ....
until условие;
Обратите внимание, что, несмотря на несколько операторов в теле цикла, begin и end отсутствуют. Сам оператор представляет собой скобки. Цикл начинается с выполнения операторов, затем проверяется условие, если оно ложно, то цикл повторяется, а если истинно, то завершается. Если условие истинно и перед выполнением цикла, то цикл выполняется один раз. Если условие остается ложным всегда, то программа зацикливается.
Построим таблицу квадратов чисел от 1 до 10 с помощью цикла while и repeat … until.
Program SquareW;
var i : integer;
begin
i:=1
while i<=10 do
begin
writeln(i:4,sqr(i):4);
i:=i+1;
end;
end.
Program SquareR;
var i : integer;
begin
i:=1
repeat
writeln(i:4,sqr(i):4);
i:=i+1;
until i>10;
end.
- 23 -
Рассмотрим следующий пример. Необходимо построить вложенные друг в друга концентрические окружности. Радиус самой большой окружности – 400 пикселей, а радиус каждой вложенной – в два раза меньше предыдущей, т.е. 200, 100, 50, … Радиус последней – 1 пиксель.
Для решения этой задачи разумно использовать цикл while или repeat until, поскольку действительно сразу сложно понять сколько будет окружностей (хотя, конечно, можно сосчитать).
Program Circles;
Uses GraphABC;
var r : integer;
begin
SetWindowSize(800,800);
r:=400;
repeat
circle(400,400,r);
r:=r div 2;
until r<1;
end.
Program Circles;
Uses GraphABC;
var r : integer;
begin
SetWindowSize(800,800);
r:=400;
while (r>=1) do
begin
circle(400,400,r);
r:=r div 2;
end;
end.
Рассмотрим еще один пример. Программа должна рисовать случайные расположенные окружности случайного цвета и случайного размера (но не больше 10 пикселей) до тех пор, пока пользователь не нажмет на какую либо клавишу.
Program Circles;
Uses GraphABC, CRT;
var r : integer;
begin
SetWindowSize(500,500);
repeat
SetBrushColor(random($FFFFFF));
circle(random(500),random(500),random(10));
delay(10);
until keypressed;
end.
Здесь используются несколько новых для нас приемов. Во-первых, функция keypressed, определенная в модуле CRT. Она возвращает значение true, если пользователь нажал любую клавишу. Оператор выбора цвета окружности SetBrushColor в качестве параметра использует значение random($FFFFFF). Аргумент функции random представляет максимально возможное числовое значение цвета, записанное в шестнадцатеричной системе исчисления, таким образом окружности будут заливаться случайным цветом от 0 (соответствует черному цвету) до $FFFFFF (соответствует белому цвету). К таким обозначениям цветов мы вернемся во время изучения языка HTML. Функция delay(n) выполняет задержку выполнения программы на n миллисекунд. Мы ее используем для того, чтобы окружности не выводились слишком быстро.
Задание №7.
1. Напишите программу, которая вводила бы целые числа и суммировала их до тех пор, пока пользователь не ввел число 0. (5 баллов)
2. Модернизируете последний пример так, чтобы выводились случайные линии, либо прямоугольники.
- 24 -
Тема №8. Вещественные вычисления
До сих пор мы оперировали целыми числами. Однако в физических вычислениях в вычислениях, связанными с измерениями, мы сталкиваемся с другим классом чисел. В математике их называют вещественными (или действительными). Подмножеством вещественных чисел являются рациональные числа. В языке Pascal вводится тип данных real, который является моделью вещественных чисел в математике.
Рассмотрим сразу пример:
Program Krug;
Uses CRT;
// Вычисление длины окружности
var r : real; // Радиус окружности
s : real; // Длина окружности
begin
write ('Введите радиус: '); readln (r);
s :=2*3.1415926*r;
writeln ('Длина окружности: ',s:8:2);
end.
Обратите внимание на описание переменных (тип real). Конечно, переменные можно описывать и несколько в одном операторе (r, s : real), но мы захотели добавить комментарии к описанию, поэтому описали переменные в отдельных операторах. Ввод вещественных чисел с клавиатуры ничем не отличается от ввода целых чисел.
Вещественные числа могут, как и целые, участвовать в арифметических выражениях. К ним применимы операции сложения +, вычитания –, умножения *, а также деления /. Деление выполняется обычным способом, как в математике, т.е. 5/2 будет 2.5. Деление на цело (div), остаток от деления (mod) для вещественных чисел не определены! Запись вещественных чисел может быть в двух формах. Первая форма называется «с фиксированной точкой». Пример: 3.5, 2.0, +36.6, –40.123.
Обратите внимание на то, что в качестве разделителя целой и дробной части используется точка, а не запятая. Вторая форма записи называется «с плавающей точкой».
Эта запись похожа на стандартизованное представление чисел в математике (например 6.67 • 1021 ). В языке Pascal такое число можно записать в следующем виде 6.67E21, т.е. вместо •10 в языке Pascal пишется буква E (большая или маленькая, всё равно). Приведем еще примеры записи вещественных чисел с плавающей точкой:
3E1, –2e+10, +1.234E– 10, 65.2e+20.
Часть числа до буквы E называется мантиссой, а после буквы E – порядком или экспонентой.
Задание 8 (часть 1)
1. Запишите в языке Pascal в формате с плавающей точкой следующие числа:
2.99•1033, -0.21•10-10, 35.6•108, 1200000, 0.000015 (5 баллов)