Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
основы программирования на Паскале.doc
Скачиваний:
255
Добавлен:
25.03.2016
Размер:
4.34 Mб
Скачать

15. Решение типовых задач на массивы

В главе 14 мы подчеркивали, что типовые алгоритмы, изученные в теме "Циклы", в полной мере применимы и к массивам. Занимая определенный объем оперативной памяти, однажды полученные элементы массива остаются доступными весь сеанс работы программы и не требуют повторного вычисления или чтения из файла. Это порождает круг приложений, связанных с типовой обработкой наборов данных – вычисление математических и статистических характеристик векторов, объединение массивов или поиск нужных значений в них и т. д. Другие интересные примеры, такие как подсчет частоты встречаемости элементов в массиве, задачасортировки(упорядочения) данных, будут рассмотрены в главе 16.

Пр. Найти сумму, скалярное произведение и длину двух векторов произвольно заданной размерности. Размерность не может превышать значения 100.

Предельную размерность массивов зададим константой Size=100. Размерность реальных векторовa иb, с которыми работает программа, не обязательно столь велика, обозначим ееn и позаботимся о том, чтоб при вводе значенияnсоблюдалось соотношение2≤n≤Size. Для разнообразия введем векторa с клавиатуры, а векторb сгенерируем из случайных чисел, принадлежащих диапазону от0до10. Для этого достаточно умножить на10значение, возвращаемое стандартной функциейrandom, если она вызвана без параметров:

b[i]:=random*10;

При написании кода мы применим также изученный в главе 8 прием контроля правильности вводимых данных с помощью директивы компилятора и стандартной функции IoResult.

Как известно из математики, сумма векторов a иb ищется поэлементно по правилуci=ai+bi, скалярное произведение может быть вычислено по формуле, а длина вектораa изn элементов ищется по формуле.

const Size=100;

var a,b,c:array [1..Size] of real;

n,i:integer;

la,lb,s:real;

begin

repeat

writeln;

write ('Введите размерность векторов A и B, ',

'значение от 2 до ',Size,':');

{$I-}readln (n);{$I+}

if (IoResult<>0) or (n<2) or (n>Size) then

writeln ('Неверный ввод, пожалуйста, повторите')

else break;

until false;

writeln ('Введите вектор A из ',n,' элем.:');

for i:=1 to n do begin

repeat

write ('A[',i,']=');

{$I-}readln (a[i]);{$I+}

if IoResult=0 then break;

until false;

end;

writeln ('Генерируется вектор B из ',n,' элем.:');

randomize;

for i:=1 to n do begin

b[i]:=random*10;

write (b[i]:8:2);

end;

la:=0;

lb:=0;

s:=0;

writeln;

writeln ('Вектор C=A+B:');

for i:=1 to n do begin

c[i]:=a[i]+b[i];

write (c[i]:8:2);

la:=la+sqr(a[i]);

lb:=lb+sqr(b[i]);

s:=s+a[i]*b[i];

end;

writeln;

writeln ('Длина вектора A: ',sqrt(la):8:2);

writeln ('Длина вектора B: ',sqrt(lb):8:2);

writeln ('Скалярное произведение:',s:8:2);

reset (input); readln;

end.

Думаю, при анализе листинга Вы обратили внимание еще на одну особенность программы — на каждом шаге цикла ввода вектора a дополнительно выполняется циклrepeat...until, предназначенный для контроля правильности ввода элементов массива. Подробнее такие конструкции, называемыекратными циклами, будут изучены в главе 16.

Пр. Задана выборка изnслучайных чисел. Дляn=100 определить математическое ожиданиеmx и дисперсиюDx выборки по формулам: ,

Две подсчитываемые величины – самые распространенные статистические характеристики набора случайных данных. Фактически, математические ожидание характеризует арифметическое среднееданных выборки, а дисперсия —среднеквадратичное отклонениеданных от среднего значения. Для хранения данных используем массивX из 100 элементов, сами данные сгенерируем из случайных чисел, находящихся в диапазоне от -1 до 1 включительно. Поскольку алгоритм накопления суммы предполагает последовательное и однократное использование каждого элемента массива, в цикле генерации элементов массива могут быть подсчитаны значенияи, которые затем позволят найтиmx иDx.

const n=100;

var x:array [1..100] of real;

s,d:real;

i:integer;

begin

writeln;

writeln ('Массив X[100]:');

randomize;

s:=0; d:=0;

for i:=1 to n do begin

x[i]:=random*2-1;

write (x[i]:8:3);

s:=s+x[i];

d:=d+sqr(x[i]);

end;

s:=s/n; {теперь в s - мат. ожидание,}

d:=d/(n-1)-sqr(s)/(n*(n-1)); {а в d - дисперсия}

writeln;

writeln ('S=',s:8:4);

writeln ('D=',d:8:4);

reset (input); readln;

end.

Пр. Объединить 2 упорядоченных по возрастанию массиваA иB в массивC.

Для решения этой задачи тоже достаточно одного прохода по массивам. Действительно, заведя для каждого из массивов a,b иc по собственному счетчику (обозначим ихia, ib иi соответственно), мы можем, в зависимости от истинности или ложности соотношенияaia≤bib переписывать в элементci значениеaia илиbib соответственно. Остается проконтролировать, чтобы ни один из счетчиков не вышел за границу размерности своего массива. Увидеть детали Вам поможет внимательный анализ листинга.

Для простоты не будем заставлять пользователя вводить с клавиатуры две неубывающих последовательности чисел — ввод заменен генерацией случайных элементов, совмещенной с выводом генерируемых значений.

program m_concat;

const Size=10;

Step=5;

var a,b:array [1..Size] of integer;

c:array [1..2*Size] of integer;

i,n1,n2,ia,ib,ic:integer;

begin

writeln;

repeat

write('Введите размерность 1 массива (от 2 до ',Size,'):');

read (n1);

until (n1>1) and (n1<=Size);

Randomize;

a[1]:=Random(Step);

write ('A= ',a[1],' ');

for i:=2 to n1 do begin

a[i]:=a[i-1]+Random(Step);

write (a[i],' ');

end;

writeln;

repeat

write('Введите размерность 2 массива (от 2 до ',Size,'):');

read (n2);

until (n2>1) and (n2<=Size);

b[1]:=Random(Step);

write ('B= ',b[1],' ');

for i:=2 to n2 do begin

b[i]:=b[i-1]+Random(Step);

write (b[i],' ');

end;

writeln;

ia:=1; ib:=1;

write ('C= ');

for i:=1 to n1+n2 do begin

if a[ia]<=b[ib] then begin

c[i]:=a[ia];

if ia<n1 then Inc(ia)

else begin

a[n1]:=b[ib];

if ib<n2 then Inc (ib);

end;

end

else begin

c[i]:=b[ib];

if ib<n2 then Inc(ib)

else begin

b[n2]:=a[ia];

if ia<n1 then Inc(ia);

end;

end;

write (c[i],' ');

end;

writeln;

end.