Практикум по программированию Обработка числовых данных
.pdf
4. ПРОГРАММЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ |
81 |
|
|
h = (Xmax - Xmin + 1)/10, где Xmax = 50 и Xmin = 1 — соответственно максимальное и минимальное значения в массиве X. Массив X заполнить случайными числами с равномерным распределением в диапазоне Xmin...Xmax, используя стандартную функцию Random. Использовать также процедуру Randomize, чтобы генерировать новый набор случайных чисел при каждом запу ске программы. Объявить Xmin, Xmax и h в разделе констант. Полу- ченные результаты использовать для вывода в виде гистогр аммы (рис. 4.6).
Ðèñ. 4.6
Вычислить также для помещенных в массив X случайных чи- сел среднее значение MX и дисперсию DX по формулам
|
N |
|
N |
(Xi - MX )2 |
|
|
å Xi |
å |
|
||
MX = |
i =1 |
è DX = |
i =1 |
|
: |
N |
|
N |
|||
|
|
|
|
||
program Project1; {$APPTYPE CONSOLE} uses
SysUtils; const
Nmax=500;
Xmax=50;
Xmin=1;
h=5; NX=Xmax-Xmin+1;
var
X:array[1..Nmax] of Word; M:array[1..10] of Word;
82 ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ
i,j,N:Word; MX, DX:Real;
begin
Write('Введите количество случайных чисел: '); ReadLn(N);
Randomize;
for i:=1 to N do
//Сохранение случайных чисел в массиве X X[i]:=Random(NX)+ Xmin;
//Накопление в ячейках 1..10 массива M количеств //попаданий значений из массива X в интервалы //[1..5], [6..10], …, [46..50]
for i:=1 to N do
//Увеличить на 1 значение элемента массива M //с индексом (X[i]-Xmin) div h +1 Inc(M[(X[i]-Xmin) div h + 1]);
//Вывод результатов в виде гистограммы WriteLn;
for i:=1 to 10 do begin
Write((i-1)*h+1:3,' -',i*h:3,M[i]:3,' '); for j:=1 to M[i] do
Write('X');
WriteLn;
end;
//Вычисление среднего значения MX:=0;
for i:=1 to N do MX:=MX+X[i];
MX:=MX/N; //Вычисление дисперсии DX:=0;
for i:=1 to N do DX:=DX+Sqr(X[i]-MX);
DX:=DX/N; |
|
|
WriteLn('Среднее значение = |
',MX); |
|
WriteLn(' |
Дисперсия = |
',DX); |
ReadLn; |
|
|
end.
4. ПРОГРАММЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ |
83 |
|
|
4.8. Задания для самостоятельной работы
Во всех заданиях использовать только простые циклы.
1. В массиве M(5) хранятся в порядке возрастания значения 1, 5, 10, 50, 100. Требуется найти для положительного целого числа N и сохранить в массиве K(5) коэффициенты разложения
N = K1×M1 + K2×M2 + K3×M3 + K4×M4 + K5×M5, при котором сумма
5
å Ki будет минимальна (использовать операции mod и div).
i =1
2.В целочисленном массиве М(N), N £ 20 содержатся разные числа от 1 до k (k < N ), а в массиве S(k) — не повторяющиеся числа от 1 до k в произвольном порядке. Требуется зашифровать данные массива М следующим образом: новым значением элемента массива М будет значение элемента массива S, индекс которого равен значению этого элемента массива М. Расшифровать i-е значение массива M и присвоить результат переменной P.
3.Выполнить циклический сдвиг элементов массива Х(N) (N £ 10), в результате которого значение последнего элемента дол - жно оказаться на месте первого, а остальные — сдвинуться н а одну позицию в сторону увеличения индекса.
4.На заданном отрезке вычислить с заданным шагом изме-
нения аргумента и поместить в массив F 30 значений функции e−x sin (6x), деленные на ее последнее положительное значение.
5.S является последовательностью нулей и единиц длиной L £ 30. Требуется сохранить в массиве Y информацию, представ-
ленную S, в виде Y0 = S1, а также числа, представляющие длины локальных подпоследовательностей с одинаковыми значени ями. Подсчитать количество записанных в массив Y чисел.
6.Восстановить последовательность S (см. п. 5 задания) по данным из массива Y и количеству записанных в массив Y чисел.
7.Последовательность S из нулей и единиц длиной L < 30 зашифровать и поместить в массив D. Шифровать по следующе-
му правилу: положить D1 = S1, потом Di = 1, åñëè Si = Si–1, ина- че — 0. Затем по данным из D расшифровать последовательность
èпоместить в массив R.
8.В массиве X(4) хранятся в порядке возрастания значений положительные вещественные числа. Требуется найти и сохр а- нить в целочисленном массиве K(4) коэффициенты разложения
переменной R: R = D + K1×X1 + K2×X2 + K3×X3 + K4×X4, ãäå D < X1, â
4
котором сумма å Ki будет минимальна.
i =1
84 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
9.Из массива Х(N), N ≤ 20, упорядоченного по невозрастанию значений элементов, переписать в массив Y без повторов значе- ния элементов с четными индексами, меньшие C, сохранив упорядоченность.
10.Изменяя X от заданного начального значения с заданным шагом H, вычислить и поместить в массив F 20 значений разности функции и ее значения в точке первого локального мини мума.
11.В массиве V(10), заданном начальными значениями, содержатся числа от 0 до 9 в произвольном порядке. Требуется поме с- тить в массив D зашифрованную произвольную последовательность S длиной L ≤ 30 из целых чисел от 0 до 9. Шифрование
выполнить по следующему правилу: Di = i − VSi. По данным из D расшифровать k-ю цифру и поместить в R.
12.Найти и сохранить в массиве N коэффициенты n0, n1, n2, n3, n4, n5 разложения целого числа K (0 < K < 106) по степеням числа 10.
13.Выполнить циклический сдвиг элементов массива Х(N), N ≤ 20, на K позиций, в результате которого последние K элементов займут место в начале массива, а остальные будут сдвин уты на K позиций в сторону увеличения индекса. Использовать дополнительный массив D.
14.На заданном отрезке, с заданным шагом изменения аргу-
мента вычислить и поместить в массив X(20) значения аргумента функции e−x sin (3x) − 0,2, предшествующие изменению ее знака, и подсчитать количество. Вычисления проводить либо до достижения границы интервала, либо до заполнения массива.
15.В массив Х(N), N ≤ 20, упорядоченный по возрастанию значений элементов, добавить новое число так, чтобы не нар у- шить упорядоченность.
16.S является последовательностью из чисел 1, 2, 3 и 4 длиной L ≤ 20. Требуется сохранить в массивах K и N информацию,
представленную S в виде Ki — число из i-й подпоследовательности из одинаковых чисел в S, Ni — длина этой подпоследовательности, а также количество записанных в массивы K и N чисел.
17.Из массива Х, упорядоченного по невозрастанию значе- ний элементов, переписать в массив Y числа, исключив их повторы и обеспечив упорядоченность по возрастанию.
18.Поместить положительные элементы массива X в начало массива Y, а следом — его отрицательные элементы.
4. ПРОГРАММЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ |
85 |
|
|
19.Из целочисленного массива Х(N), N ≤ 20, удалить числа, кратные K, поместив остальные в его начало без пропусков и не изменив их взаимного расположения. Вывести количество ос тавленных в массиве чисел и сами числа.
20.Найти и сохранить в массиве K(N), N ≤ 14, старшие N цифр правильной дроби R при представлении ее в десятичной
системе счисления, а в переменной D — часть числа R, меньшую 10−N. Использовать стандартные функции Frac и Int.
21.На заданном отрезке с заданным шагом изменения аргу-
мента вычислить и поместить в массив X(50) значения аргумента функции e−3x sin2 20x, предшествующие первому локальному экстремуму функции типа максимум, а в массив Y — соответствующие значения функции. Если за 50 шагов экстремум не будет найден, то вывести соответствующее сообщение , иначе вывести помещенные в массивы X и Y значения в виде таблицы.
22.Из массива Х(20), упорядоченного по неубыванию значе- ний элементов, переписать в массив Y числа, исключив их повторы и добавив новое вводимое значение P так, чтобы не нарушить упорядоченность.
23.На заданном отрезке с заданным шагом изменения аргу-
мента вычислить и поместить в массив X(12) значения аргумента функции e−x /3sin2 5x, непосредственно предшествующие локальным максимальным приращениям функции. Если до достижения верхней границы интервала массив окажется заполне нным, то вычисления прекратить и сопроводить вывод результато в соответствующим сообщением.
24.Поместить элементы массива X в начало массива Y в обратном порядке, исключив превосходящие по абсолютной вел и- чине вводимое значение R.
25.В массиве K с индексами от 0 до 9, заданном начальными значениями, содержатся разные числа (от 0 до 9) в произвольном порядке. Требуется поместить в массив Y зашифрованную произвольную последовательность X длиной L ≤ 30 из целых чисел от 0 до 9. Шифрование выполнить по следующему
правилу: Yi = i − KXi. Затем по данным из Y расшифровать последовательность и поместить в массив P. Использовать дополнительный массив T с начальными значениями, заданными сле-
дующим образом: Ti равно номеру ячейки массива K со значе- нием i.
86 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
4.9.Приемы вычисления сумм, произведений
èэкстремальных значений
Вычисление суммы и произведения
Прием накопления суммы часто используется в разных приложениях. Суммируемыми могут быть элементы массива или вы - числяемые значения функции. В любом случае накопление сум - мы производится в цикле по рекуррентной формуле S = S + Y, где S — промежуточная сумма, Y — слагаемое. Перед циклом в большинстве случаев начальное значение S должно быть равно нулю.
Фрагмент программы для вычисления суммы n элементов массива Y будет иметь вид
S:=0;
for i:=1 to n do S:= S+Y[i];
Фрагмент программы для вычисления среднего первых n зна- чений функции Y(x), вычисляемых при значениях x от x0 с шагом dx, будет иметь вид
S:=0;
x:=x0;
for i:=1 to n do begin
S:=S+Y(x)
x:=x+dx
end;
S:=S/n;
Произведение вычисляется аналогичным образом, но перед циклом в большинстве случаев начальное значение P:=1, а в цикле — накапливается по рекуррентной формуле P:=P*Y.
Пример. Вычислить значение суммы элементов массива X(n), n ≤ 30:
const nMax=30;
var S:Real;
X: array [1..nMax] of Real; i:Integer;
begin
Write(' Введите количество элементов: '); ReadLn (n);
4. ПРОГРАММЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ |
87 |
|
|
WriteLn(' Введите элементы массива: '); for i:=1 to n do
Read (X[i]); ReadLn;
S:=0; //Начальное значение суммы for i:=1 to n do
S:= S+X[i]; //Накопление суммы
WriteLn('Сумма элементов массива равна ', S:6:2);
. . . . . .
end.
Нахождение наибольшего или наименьшего значения
Поиск наибольшего или наименьшего значения может выполняться в имеющемся массиве или при вычислении значения функции.
При поиске в массиве начальному значению наибольшего Xmax (начальному значению наименьшего Xmin) присваивается значение первого элемента массива, а затем в цикле для оче редного элемента массива Xi, i = 2, 3, ...…,n, производится проверка: если Xi > Xmax (Xi < Xmin), то переменной Xmax (переменной Xmin) присваивается значение Xi, иначе значение Xmax (Xmin) не изменяется.
Поиск максимального и минимального значений в массиве представляют следующие фрагменты программ:
//Поиск максимального Xmax= X[1];
for i:=2 to n do
if X[i] > Xmax then Xmax:=X[i];
WriteLn('Xmax=', Xmax:6:2);
//Поиск минимального Xmin = X[1];
for i:=2 to n do
if X[i] < Xmin then Xmin:=X[i];
WriteLn('Xmin=', Xmin:6:2);
При поиске наибольшего Ymax (наименьшего Ymin) из вы- числяемых значений функции F(x) переменной Ymax (Ymin), которая после вычислений будет представлять максимальное (минимальное) значение функции, до входа в цикл следует присв о- ить одно из вычисляемых значений F(x), а в цикле для каждого
88 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
очередного значения функции F(x) проверять: если F(x) > Ymax (F(x) < Ymin), то Ymax (Ymin) присвоить это значение функции.
Ниже представлены фрагменты программ поиска максимального и минимального значений функции y = e−x sin 5x, вычисляемых при x, изменяющихся от a до b с шагом dx.
//Поиск максимального значения функции Ymax:=Exp(-A)*Sin(5*A);
X:=A+dx; Xk:=B+dx/2; while X < Xk do begin
Y:= Exp(-X)*Sin(5*X); if Y > Ymax then
Ymax:=Y;
end;
WriteLn('Ymax = ',Ymax);
//Поиск минимального значения функции Ymin:=Exp(-A)*Sin(5*A);
X:=A+dx; Xk:=B+dx/2; while X < Xk do begin
Y:= Exp(-X)*Sin(5*X); if Y < Ymin then
Ymin:=Y;
end;
WriteLn('Ymin = ',Ymin);
Как видно из представленных фрагментов программ, их алгоритмы можно получить один из другого заменой знака отноше - ния, например, больше на меньше.
Если заранее известно, что максимальное (минимальное) зна - чение функции на заданном интервале больше (меньше) некоторой величины, например, −1015 (1015), то эту величину можно использовать в качестве начального значения при поиске м аксимального (минимального) значения функции, например,
Ymax:=-1E15 (Ymin:=1E15).
Наряду с нахождением максимального/минимального значе- ния функции (максимального/минимального значения в масси - ве) может потребоваться определение значения аргумента ( индекса элемента массива), при котором оно достигается. Нахо ждение указанных значений при поиске максимума поясняют следующие фрагменты программ:
4. ПРОГРАММЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ |
89 |
|
|
//Поиск максимального значения функции //и соответствующего значения аргумента Ymax:=Exp(-A)*Sin(5*A);Xmax:=A; X:=A+dx; Xk:=B+dx/2;
while X < Xk do begin
Y:= Exp(-X)*Sin(5*X); if Y > Ymax then
begin Ymax:=Y; Xmax:=X;
end;
end
WriteLn('Ymax = ',Ymax);
WriteLn('Xmax = ',Xmax);
//Поиск максимального элемента //массива и его индекса
Xmin = X[1]; Imin:=1; for i:=2 to n do
if X[i] > Xmax then begin
Xmax:=X[i];
Imax:=i;
end;
WriteLn('Xmax = ', Xmax:6:2); WriteLn('Imax = ', Imax);
Рассмотренный выше прием определения на заданном интервале максимума/минимума функции и точек (значений арг у- мента), на которых они достигаются, не следует путать с пои ском экстремумов функции, так как искомый максимум/минимум может находиться на границе интервала, где производная функ ции не равна нулю.
Поиск приближенных значений точек экстремумов функции F(X) и ее значения в этих точках, а также точек перегибов (экстремумов F ′(X)), точек экстремальной кривизны (экстремума |F ′′(X)|/{1+[F ′(X)]2}3/2) могут рассматриваться как самостоятельные задачи. Их следует решать рассмотренными методами при вычисляемых по известным аналитическим выражениям знач е- ниям производных. Однако поскольку аналитические выраже ния производных не всегда известны, приходится вычислять зна че- ния производных по разностным схемам или использовать бо - лее простые приемы.
90 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
Например, приближенное значение точки экстремума-макси- мума (локального максимума) будет найдено, если на очередн ом значении аргумента, изменяемом с заданным шагом, окажется , что слева и справа от него функция имеет меньшие значения . Проверку можно упростить: если заранее известно, что в нач але исследуемого интервала функция растет, то точкой экстрем ума будет значение аргумента, после которого значение функци и нач- нет уменьшаться.
4.10. Пример выполнения задания A
Составить программу вычисления среднего значения элеме н- тов целочисленного массива Х(N), N ≤ 15, кратных K, и поместить округленное найденное среднее на место максимально го положительного, меньшего M. Прекратить выполнение программы и вывести соответствующее сообщение, если в массиве не найдется элементов, кратных K, или элементов, меньших M. Вывести с пояснениями найденное среднее значение, максимал ь- ное значение и преобразованный массив.
program Project1; program Project1; {$APPTYPE CONSOLE} uses
SysUtils; const
Nmax=15; type
tX=array[1..Nmax] of Integer; var
//Начальные значения переменных можно //использовать при отладке программы. X:tX=(11,21,36, 5,84
,99,51, 3,44,22 ,55,77,12,23,45);
N:Integer=9;
K:Integer=3;
M:Integer=30;
S:Real;
i,Xmax,iMax,L:Integer; begin
//ВВОД ИСХОДНЫХ ДАННЫХ
Write('Введите количество элементов массива: ');
