Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PASСAL_a4_2007.doc
Скачиваний:
31
Добавлен:
13.09.2019
Размер:
2.51 Mб
Скачать

Лабораторная работа 28. Массивы и деловая графика

Задание 1. Гистограммы

Для иллюстрации дискретных динамических процессов довольно часто используются столбиковые диаграммы (гистограммы) (рис. 7).

Рис. 7. Пример столбиковой диаграммы (гистограммы)

Составьте программу, которая по введенным данным строила бы такую гистограмму на экране. Сделайте 2 варианта программы: из 2-мерных столбиков и 3-мерных параллелепипедов (см. рис. 8).

Уточнение

Программа будет универсальной только в том случае, если она будет работать для "произвольного" (например, от 1 до 100) набора чисел и для любых значений этих чисел. Чтобы столбики были пропорциональны и помещались на экране, требуется пропорционально увеличивать размеры столбиков, если значение чисел малы, и уменьшать, если они слишком велики (этот процесс назовем масштабированием).

Цвета каждого из столбиков и подписи под ними также следует вводить.

Рис. 8. Пример трехмерной гистограммы

Задание 2. Круговая диаграмма

Наряду с гистограммами широкое распространение получили круговые диаграммы (см. рис. 9). Круговая диаграмма - это, как правило, круг, составленный из разноцветных секторов, угловые размеры которых пропорциональны числовым значениям, которые они интерпретируют.

Для рисования закрашенных секторов применяется процедура PieSlice, имеющая следующие параметры:

PieSlice(X, Y : integer; StAngle, EndAngle, Radius : word);

Эта процедура позволяет рисовать закрашенный текущим цветом сектор круга с центром в точке (X,Y) радиуса Radius и начальным и конечным углом Stangle и EndAngle.

Рис. 9. Пример круговой диаграммы

Для того чтобы решить задачу 2, решите вспомогательные задачи 2.1 - 2.5.

Задание 2.1

Составьте программу рисования закрашенного сектора окружности. Цвет закраски и значения углов вводятся в диалоге в алфавитно-цифровом режиме.

Задание 2.2

Нарисуйте окружность из 8 закрашенных секторов. Сектора должны иметь разные цвета закраски.

Задание 2.3

Пусть есть 3 заданных числа. Нарисуйте окружность из 3 разноцветных секторов. Величины углов секторов должны быть пропорциональны данным трем числам.

Задание 2.4

Решите задачу 2.3 для случая 7 чисел.

Задание 2.5*

Решите задачу 2.3 для N чисел (от 1 до 100).

Теперь наконец реализуйте задачу 2.

Теоретическая работа е. Строковые массивы. Алгоритмы поиска

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

Описание такого массива в программе строится по общим правилам:

<Имя_массива> : array[<n1>..<n2>] of string[<длина>]

Всякая задача обработки информации начинается с того, что эту информацию нужно ввести в память компьютера.

Пусть, например, наша программа обслуживает регистратуру поликлиники. О каждом пациенте нам требуется хранить следующую информацию: фамилия, год рождения и диагноз. Проще всего хранить эти данные в трех различных массивах Fam, God и Diag. Под одинаковыми номерами будут храниться данные об одном пациенте, то есть элементы Fam[i], God[i] и Diag[i] будут содержать соответственно фамилию, год рождения и диагноз пациента с номером i.

Размеры массивов удобно предусмотреть достаточно большими - "с запасом", а сколько будет введено пациентов, каждый раз будет определяться в процессе работы: как только все данные исчерпаны, вместо ввода фамилии мы будем просто нажимать клавишу <Enter>.

Ввод данных можно оформить в виде самостоятельной процедуры без параметров:

Program Hospital;

Const N = 100;

Var Fam : array[1..N] of String[20]; {фамилии}

God : array[1..N] of Integer; {год рождения}

Diag : array[1..N] of String[20]; {диагноз}

Procedure WwodMas;

Var F : String[20];

i,k : Integer;

begin

i := 0; { номер вводимой записи }

writeln('Вводите данные: ' );

write('Фамилия : ');

readln(F); {ввод первой фамилии (для входа в цикл)} while F <> '' do

begin

i := i+1; { номер вводимой записи }

Fam[i] := F; {занесение фамилии в массив}

Write('Год рождения: '); readln(God[i]); { ввод года рождения }

Write('Диагноз : '); readln(Diag[i]); { ввод диагноза }

write('Фамилия : '); readln(F); { ввод следующей фамилии }

end;

end;

begin

{ тело программы}

end.

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

Решение этой задачи можно также оформить в виде отдельной процедуры, которую также следует поместить в описательную часть программы Hospital:

Procedure Poisk;

Var F : String[20];

i : Integer;

begin

write('Введите фамилию: ' );

readln(F);

i:=1;

while (i<N) and (Fam[i]<>F) do i:=i+1; {поиск номера фамилии}

if i<N then

WriteLn('Пациент ',Fam[i],'. Его диагноз: ',Diag[i])

else

WriteLn('Такого пациента в имеющемся списке нет.');

end;

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

Процедура двоичного поиска будет выглядеть таким образом16:

Procedure Poisk2;

Var F : String[20];

i1,i2,k,pr : Integer;

begin

pr := 0;

writeln('Введите фамилию' );

readln(F);

i1 := 1; { начало }

i2 := N; { и конец участка поиска }

while i1 < i2 do

{пока начало и конец участка поиска не слились}

begin

k := trunc((i1+i2)/2); {середина участка поиска}

if Fam[k] = F { пациент найден } then

begin

writeln(Diag[k]); { вывод диагноза }

pr := 1;

{установка признака того, что пациент найден}

end

else

if F < Fam[k]

{если нужная фамилия находится в первой половине списка,}

then i2 := k-1

{то отбрасывается вторая половина,}

else i1 := k+1;

{в противном случае отбрасывается первая.}

end;

if pr = 0 {ни разу не выполнилось условие Fam[i] = F}

then writeln('Такой пациент отсутствует');

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]