2.99•1033, -0.21•10-10, 35.6•108, 1200000, 0.000015 (5 баллов)
2. Запишите в языке Pascal в формате с фиксированной точкой следующие числа:
2.71828, 1.25•102, -1.5•10-1 (3 балла)
- 25 -
Вывод вещественных чисел с помощью оператора write/writeln происходит обычным способом. При выводе мы можем применять форматы вывода, отделяя их от переменной двоеточием. Формат вывода может состоять из одного или двух чисел, разделенных двоеточием (см. пример). При указании двух чисел первое определяет число позиций, резервируемых для вывода всего числа, а второе – число позиций для дробной части. Если в качестве формата вывода используется одно число, то оно определяет число позиций, резервируемых для вывода всего числа, а само число выводится в формате с плавающей точкой. В этом случае рекомендуется задавать значение формата не меньше 10, так как под экспоненту отводится пять позиций и еще две позиции выделяется под знак числа и десятичную точку. Если при выводе формат числа не указывать, то Pascal попытается вывести число наиболее компактным способом. Лучше уяснить действие форматов поможет следующий пример:
Program Formats;
Uses CRT;
var x : real;
begin
x:=1234.567;
writeln(x);
writeln(x:8:3);
writeln(x:8:2);
writeln(x:8:1);
writeln(x:12);
writeln(x:14);
end.
Рассмотрим еще одну программу, которая строит таблицу длин окружностей радиусами от 0.1 до 1 см с шагом 0.1 (заметьте, что для числа π используется встроенная константа pi):
Program Table;
Uses CRT;
var r, s : real;
begin
r:=0.1; // Начальное значение
repeat
s:=2*pi*r; // Вычисление длины
writeln (r:3:1,s:6:2); // Вывод
r:=r+0.1; // Увеличение радиуса на 0.1
until r>1.0; // Условие окончания цикла
end.
Задание 8 (часть 2)
3. Проанализируйте пример и постройте аналогичную программу, вычисляющую площади круга (по формуле s = πr2). (2 балла)
4. Напишите программу, которая вводила бы с клавиатуры значения времени и скорости, вычисляла бы пройденный путь. (3 балла)
5. Напишите программу, которая вводила бы с клавиатуры 10 вещественных чисел и вычисляла бы их среднее арифметическое. (5 баллов)
6. * Напишите программу, которая вводила бы градусы, минуты и секунды дуги переводила их в градусы и его десятичные доли.
- 26 -
Тема №9. Подпрограммы-функции
При решении сложных задач разумно разбить алгоритм на несколько более простых составляющих. В языке Pascal существуют специальные средства для этого – подпрограммы. Есть два вида подпрограмм: процедуры и функции. Функция получает информацию от вызывающей программы через свои параметры. Параметры, описанные в заголовке функции, называются формальными параметрами. Параметры, указанные при вызове функции называют фактическими. Типы и число фактических параметров должны соответствовать типу и числу формальных параметров. Следующий пример иллюстрирует работу функций.
Program Table;
Uses CRT; // Подключение модулей
// Описания функций, требующихся в программе
function cube(x:real):real; // возведение в куб
begin
cube:=x*x*x; // имени функции присваивается значение
end;
function sign(x:real):integer; // вычисление знака числа
begin
if x>0 then sign:=1
else if x=0 then sign:=0
else sign:=-1;
end;
// ==== Начало главной программы ==========
var a : real; // блок описания переменных
const a1 = -5.0; // блок описания констант (постоянных)
a2 = +5.0;
st = 0.5;
begin
a:=a1;
while (a<=a2) do
begin
writeln(a:4:1,cube (a):10:3,sign(a):3); // вызов функций
a:=a+st;
end;
end.
Обратите внимание, что внутри тела функции (заключенного в операторные скобки begin … end) вы обязаны хотя бы один раз имени функции присвоить значение. В этой программе также используется новый материал, не связанный с функциями, – это константы. Значение констант задается через знак равенства (а не присваивания). Тип константы определяется из типа присваиваемого значения. Константы, в отличие от переменных, не могут менять свое значение.
- 27 -
Рассмотрим еще один пример, в котором функция имеет два параметра разного типа.
Program Power2;
Uses CRT;
function power(x : real; n : integer) : real; // возведение в степень
var i : integer; // локальные переменные r : real;
begin
r:=1.0;
for i:=1 to n do r:=r*x; // накопление произведения
power:=r; // результат присвоить имени функции
end;
// ==== Начало главной программы ================
var i : integer; // блок описания переменных
begin
for i:=1 to 10 do
writeln(i:2,power (2.0,i):6:0);
end.
В данном примере функция имеет два формальных параметра (типа real и типа integer), а также две локальных переменных. Имена локальных переменных действуют только внутри тела функции. Переменная i в главной программе, и переменная i внутри функции – это две разных переменных. При вызове функции первый фактический параметр соответствует первому формальному параметру. Второй параметр – второму.
Задание 9 1. Модифицируйте последний пример таким образом, чтобы функция power вычисляла правильно не только натуральные степени, но и отрицательные.
Напоминание:
x-n = 1 / xn.
Подсказка: следует использовать оператор if, а также функцию abs(n), которая вычисляет модуль числа.
(5 баллов)
2. Напишите функцию, вычисляющую факториал числа n! =1•2•3• ... •n.
Подсказка: ее несложно сделать, путем модификации функции power.
(5-8 баллов)
- 28 -
Тема №10. Подпрограммы-процедуры
Для выполнения каких-либо действий (а не вычислений значений) существуют подпрограммы-процедуры. Они также могут принимать параметры, как и подпрограммыфункции. Давайте сразу проиллюстрируем работу процедуры на примере графической программы.
В стандартной графической библиотеке нет процедуры, рисующей треугольники. Давайте создадим такую процедуру и проверим ее работу.
Program UseProc;
Uses GraphABC;
Procedure Triangle(x1,y1,x2,y2,x3,y3:integer);
// Процедура рисует треугольник
begin
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
end;
// Главная программа
begin
SetWindowSize(500,500);
Triangle(100,200,400,300,250,150);
Triangle(10,20,30,40,50,10);
end.
Как мы видим, процедура Trianlge имеет шесть целочисленных параметров и вызывает функции трижды функции Line для соединения точек. Создав такую процедуру, мы можем использовать ее столько раз, сколько нам надо в главной программе.
Задание 10
1. Создайте еще несколько новых графических процедур, которые бы расширили возможность стандартной библиотеки (ромб, параллелограмм, и т.п.) (по 3-4 балла за каждую)
- 29 -
Модули (Units)
Вы, наверное, обратили внимание на неудобство, связанное с тем, что все подпрограммы (как процедуры, так и функции) размещаются перед главной программой. Хотелось бы разместить их в отдельную библиотеку. Такая возможность есть, её предоставляют модули.
Поместим описание процедуры Triangle в модуль MyGraph.
Unit MyGraph;
// Заголовок модуля. Имя файла модуля должно совпадать
// с именем модуля! Т.е. в нашем случае оно должно быть
// MyGraph.pas, иначе главая программа его не найдет!
Uses GraphABC; // Модули могут использовать другие модули
Procedure Triangle(x1,y1,x2,y2,x3,y3:integer);
// Эта процедура находится в модуле MyGraph
begin
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
end;
end. // Этот оператор – завершение модуля.
Теперь главная программа будет выглядеть так:
Program UseProc;
Uses GraphABC, MyGraph; // Использование стандартного и собственного модуля
begin
SetWindowSize(500,500); // Эта процедура описана в GraphABC