Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
66
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Лабораторная работа № 4 Одномерные массивы - вектора

Цель работы: уметь программировать операции над структурным типом данных одномерными массивами – векторами.

Под массивом понимается упорядоченная совокупность конечного числа данных одного типа, объединенных под общим именем. Обращение к массивам осуществляется по идентификатору массива и индексам элементов, заключенным в квадратные скобки [ ]. Например, a[36,20], x[15], delta[5,10,3]. Перед выполнением работы необходимо изучить правила описания и использования переменных типа массив, типизированных констант типа массив.

Алгоритмы нахождения максимума и минимума элементов массива используют условный оператор IF для организации ветвлений сравнения элементов массива с текущими значениями Max и Min внутри цикла с параметром. Начальные значения Max и Min задаются равные первому элементу вектора.

Для заполнения массивов с помощью генератора случайных чисел используют функцию RANDOM(I), которая генерирует случайные целые числа от 0 до I. Если аргумент функции не указан, тогда генерируются вещественные числа от 0 до 1.

Пример 1. Найти максимум (наибольшего элемента) и минимум (наименьшего элемента) элементов вектора, заданные генератором случайных чисел.

Листинг программы нахождения максимума и минимума вектора A, вычисляемых по формуле

program VectorMaxMin;

Var

i,n:word;

a:array[1..100] of real;

{Описание вектора вещественных чисел размерностью 100 элементов}

max,min:real;

begin

RANDOMIZE; {Активизация генератора случайных чисел}

write(' n=');readln(n); {Ввод количества элементов вектора}

For i:=1 to n do begin {Начало цикла с параметром индекса элементов вектора i }

a[i]:=random(10)*sqrt(i)+exp(-i)/i; {Вычисление элементов вектора}

write(a[i]:8:4,' '); {Вывод элементов вектора в строку, через пробел}

end; {Завершение цикла с параметром}

writeln;

max:=a[1]; min:=a[1]; {Ввод начальных параметров максимума и минимума}

For i:=1 to n do begin

IF a[i]>max THEN MAX:=a[i]; {Сравнение максимума с каждым элементом вектора, если элемент больше максимума, тогда его значение присваивается максимуму}

IF a[i]<min THEN MIN:=a[i]; {Сравнение минимума с каждым элементом вектора, если элемент меньше максимума, тогда его значение принимается за минимум}

end;

writeln(' MAX=',max:12:4,' MIN=',min:12:6); {Вывод максимума и минимума}

end.

Пример 2. Подсчитайте количество четных и нечетных элементов вектора случайных целых чисел. Сформируйте из четных и нечетных элементов новые массивы.

Функция ODD(X) возвращает значение: TRUE- если аргумент X нечетное число, а FALSE – если аргумент X четное число.

Листинг программы нахождения нечетных и четных элементов вектора a[i]- случайных чисел в диапазоне 0-100, подсчитывается их количества и помещаются в вектора b-нечентные элементы a[i] и c –четные a[i].

program Vector01;

Var i,n,k,m:word;

a,b,c:array[1..100] of word;

begin

RANDOMIZE; {Активизация генератора случайных чисел}

write(' n=');readln(n); {Ввод количества элементов вектора}

writeln(' Вектор a[i]');

For i:=1 to n do begin

a[i]:=random(100);{Вычисление элементов вектора генератором случайных чисел}

write(a[i]:3,' ');

end; writeln; {Переход на новую строку экрана}

For i:=1 to n do begin {Начало цикла с параметром индексом вектора}

IF ODD(a[i]) THEN begin {Функция ODD определяет нечетность чисел}

k:=k+1; b[k]:=a[i]; {Подсчитывается количество нечетных элементов вектора, которые помещаются в вектор b}

end

ELSE begin

m:=m+1; c[m]:=a[i]; {Подсчитывается количество четных элементов вектора, которые помещаются в вектор c}

end;

end; {Конец цикла с параметром }

writeln(' Вектор b длиной k=',k:3);

For i:=1 to k do write(b[i]:3,' '); {Вывод вектора b в одну строку через пробелы}

writeln;

writeln('Вектор c длиной m=',m:3);

For i:=1 to m do write(c[i]:3,' '); {Вывод вектора c в одну строку через пробелы}

writeln;

end.

Пример 3. Подсчитайте количество элементов вектора a кратных 3 и 5.

Листинг программы нахождения кратных 3 элементов вектора a[i]- случайных чисел в диапазоне 0-100, подсчета их количества, помещает в вектора b, находит кратные 5 элементы вектора a[i], подсчитывает их количество и помещает в вектор C

program Vector02;

Var

i,n,k,m:word;

a,b,c:array[1..100] of word;

begin

RANDOMIZE;

write(' n=');readln(n); {Ввод количества элементов вектора}

writeln(' Вектор a[i]');

For i:=1 to n do begin

a[i]:=random(100)+i; {Вычисление элементов вектора}

write(a[i]:3,' '); {Вывод элементов вектора}

end; writeln;

For i:=1 to n do begin

IF TRUNC(a[i]/3)=a[i]/3 THEN begin

{Проверка условия кратности 3 элементов вектора}

k:=k+1; b[k]:=a[i]; {Подсчет элементов кратных 3 }

end;

IF TRUNC(a[i]/5)=a[i]/5 THEN begin

{Проверка условия кратности 5 элементов вектора}

m:=m+1; c[m]:=a[i]; {Подсчет элементов кратных 5 }

end;

end;

writeln(' Вектор b длиной k=',k:3);

For i:=1 to k do write(b[i]:3,' '); writeln;

writeln('Вектор c длиной m=',m:3);

For i:=1 to m do write(c[i]:3,' '); {Вывод результатов }

writeln;

end.

Пример 4. Вычислите произведение P и сумму S элементов вектора a, любые элементы которых введены с клавиатуры

Листинг программы

program Vector03;

Var i,n,k,m:word;

a:array[1..100] of real;

P,S:real;

begin

RANDOMIZE;

write(' n=');readln(n); {Ввод количества элементов вектора}

writeln('Вектор a[i]');

For i:=1 to n do read(a[i]); {Ввод элементов вектора}

writeln;

For i:=1 to n do write(a[i]:8:3,' '); {Вывод элементов вектора}

writeln;

P:=1; S:=0; {Определение начальных параметров произведения и суммы}

For i:=1 to n do begin

S:=S+a[i]; P:=P*a[i]; {Накопление суммы и произведения элементов вектора }

end;

writeln('Произведение элементов вектора P=',p);

writeln('Сумма элементов вектора S=',s:12:3);

end.

Сортировка и поиск данных являются важнейшими понятиями информатики. Сортировка – процесс упорядочивания совокупности однотипных данных по возрастанию или убыванию значений какого-либо признака. При сортировки элементы массива меняются местами таким образом, чтобы их значения были упорядочены по возрастанию или убыванию.

Существуют различные алгоритмы сортировки массивов с разной скоростью упорядочивания элементов.

Линейная сортировка (сортировка отбором) по невозрастанию заключается в том что, последовательно просматривая весь массив, находят наибольшее число и меняют его местами с первым элементом. Затем просматривается массив, начиная со второго элемента, снова находится наибольший элемент, который меняется местами со вторым и т.д.

Пример 1. Выполните линейную сортировку массива по невозрастанию.

Листинг программы сортировки элементов вектора a по убыванию

program SORT_Line;

const

n=10;

a:array[1..n] of real= (0.111,0.017,0.26,0.35,0.15,0.048,0.50,0.12,0.16,0.24);

var I,J,L:byte;

V:real;

begin

writeln('Несортированный исходный вектор');

for I:=1 to N do write(,a[i]:5:3,' '); writeln;

For I:=1 to N-1 do

FOR J:=I+1 TO N DO begin

IF a[i]<a[J] then begin

V:=a[i];

a[i]:=a[J];

a[J]:=V;

end;

end;

writeln; writeln('Сортированный по невозрастанию вектор');

for I:=1 to N do write(' ',a[i]:6:3); writeln(f);

end.

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

Пример 2. Выполните линейную сортировку массива по невозрастанию.

Листинг программы сортировки элементов вектора a по убыванию

program SORT_PUSYREK;

var

I,J,K, N:byte;

a:array[1..100] of real;

V:real;

Begin

writeln('Введите количество элементов вектора N=');readln(n);

for i:=1 to n do read(a[i]); {Ввод элементов вектора a}

writeln('Несортированный исходный вектор'); {Вывод элементов вектора a}

for I:=1 to N do write(,a[i]:5:3,' '); writeln;

k:=0;

For I:=2 to N do begin

FOR J:=n TO i DO begin

k:=k+1;

IF a[j-1]>a[J] then begin

V:=a[l-1];

a[j-1]:=a[J];

a[J]:=V;

end; end;

end;

writeln; writeln('Сортированный по возрастанию вектор');

for I:=1 to N do write(' ',a[i]:6:3); writeln;

end.

Метод быстрой сортировки «золотого сечения» использует алгоритм К.Хорна, в основу которого положен метод дробления массива на части и обмен элементами между частями. Алгоритм быстрой сортировки реализуется циклическим процессом и рекурсии.

Пример 3. Выполните быструю сортировку массива по невозрастанию.

Листинг программы сортировки элементов вектора a по убыванию

program SORT_HORN;

Type massiv= array[1..100] of real;

var I,J,K, N:byte;

a:massiv;

V:real;

Procedure Quicks(First,Last:real);

var I,J,x,K, N:byte;

V:real;

Begin

i:=First;

j:=Last;

x:=a[(first+Last) div 2];

Repeat

While a[i]>x do i:=i+1;

While a[j]<x do j:=j+1;

K:=k+1;

IF i<=j Then begin

V:=a[i];

A[i]:=a[j];

A[j]:=V;

I:=i+1; j:=j-1;

For i:=1 to n do write(,a[i]:5:3,' ');

writeln;

End;

Until i>j;

IF First<j then Quiks(first,j);

IF i<Last then Quiks(i,Last);

End;

Begin

writeln('Введите количество элементов вектора N=');readln(n);

for i:=1 to n do read(a[i]); {Ввод элементов вектора a}

writeln('Несортированный исходный вектор'); {Вывод элементов вектора a}

for I:=1 to N do write(,a[i]:5:3,' '); writeln;

k:=0;

QUIKS(1,n);

writeln; writeln('Сортированный по возрастанию вектор');

for I:=1 to N do write(' ',a[i]:6:3); writeln;

end.

Среднеарифметическое значение элементов заданного массива А=()

вычисляется по формуле :

Среднеквадратическое значение элементов заданного массива А=()

вычисляется по формуле:

Среднегеометрическое значение ненулевых элементов заданного массива А=(a1, a2, a3, …,an) вычисляется по формуле:

,

где К - количество ненулевых элементов массива.

Среднее гармоническое значение ненулевых элементов заданного массива А=() вычисляется по формуле:

,

где К - количество ненулевых элементов массива.

Размах вариации R вычисляется как разность максимума и минимума элементов массива А=() по формуле: R=aMax-aMin

Если все элементы массива имеют положительные значения, то справедливо условие Ga <= Pa <= Sa Если массив А пустой ( А=0), принять значения Ga , Pa , Sa , Qa равным нулю.

Дисперсия D элементов заданного массива А=() вычисляется по формуле:, где - среднее арифметическое.

Среднее квадратическое отклонение  элементов заданного массива А=() вычисляется по формуле:

Коэффициент вариации является отношением дисперсии к среднему арифметическому значению

Пример 1. Определить статистические показатели данных, хранящихся в векторе.

Листинг программы вычисления среднего арифметического, среднего геометрического, среднего гармонического, среднего квадратического, максимума, минимума, размаха вариации, дисперсии и коэффициента вариации вектора.

program statatisticaVECTOR;

var i,k,n:byte;

a:array[1..255] of real;

Sa,Qa,Pa,Ga,max,min,D,R,W, SRKVOTKL ,sum:real;

begin

writeln('Введите количество элементов вектора N=');readln(n);

for i:=1 to n do read(a[i]); {Ввод элементов вектора}

writeln('Статистические показатели ');

writeln;

for i:=1 to n do write(a[i]:5:3,'|'); {Ввод элементов вектора}

k:=0;sa:=0;qa:=0;ga:=0;pa:=1{Определение начальных значений переменных суммы и произведения}

for i:=1 to n do begin

sa:=sa+a[i]; qa:=qa+sqr(a[i]); {Накопление суммы элементов и суммы квадратов элементов вектора a}

if a[i]<>0 then begin {Определение ненулевых элементов вектора }

k:=k+1; {Подсчет количества ненулевых элементов вектора}

pa:=pa*a[i]; {Накопление произведения элементов вектора}

ga:=ga+1/a[i]; {Накопление суммы обратных значений элементов вектора}

end;

end;

sa:=sa/n; qa:=sqrt(qa/n);{Вычисление среднего арифметического и квадратического}

pa:=exp(1/k*ln(pa)); {Вычисление среднего геометрического элементов вектора}

ga:=k/ga; {Вычисление среднего гармонического элементов вектора}

max:=a[1]; min:=a[1];

for i:=1 to n do begin

if max<a[i] then max:=a[i]; {Нахождение максимума вектора}

if min>a[i] then min:=a[i]; {Нахождение минимума вектора}

end;

sum:=0;

for i:=1 to n do sum:=sum+SQR(a[i]-sa); {Накопление суммы квадратов, разности элементов вектора и среднего арифметического значения}

R:=max-min; {Вычисление размаха вариации вектора}

D:=sum/n; {Вычисление дисперсии вектора}

SRKVOTKL:=SQRT(D); {Вычисление среднего квадратического отклонения }

w:=D/Sa; {Вычисление коэффициента вариации вектора}

writeln; {Вывод статистических показателей вектора}

writeln('Среднее арифметическое Sa = ',sa:5:3);

writeln('Среднее квадратическое Qa = ',qa:5:3);

writeln('Среднее гармоническое Ga = ',ga:5:3);

writeln('Среднее геометрическое Pa = ',pa:5:3);

writeln('MAX = ',max:5:3); writeln('MIN = ',min:5:3);

writeln('Дисперсия D = ',D:5:3);

writeln('Среднее квадратическое отклонение SRKVOTKL = ', SRKVOTKL:5:3);

writeln('Размах вариации R = ',R:5:3);

writeln('Коэффициент вариации W =',W:5:3); writeln;

end.

Двумерный массив (матрица) - это таблица из однотипных элементов, организованная по строкам и столбцам. Местоположение каждого элемента двумерного массива (матрицы) определяется индексом (номером) строки и индексом столбца. Матрица представляет совокупность строк, каждая строка является вектором - совокупностью однотипных элементов.

Квадратной матрицей называется двухмерный массив с одинаковым количеством строк и столбцов. Например, квадратная матрица a размерностью nxm.

Каждая строка, столбец и диагональ матрицы является вектором.

Главная диагональ – это вектор (a11, a22, a33, …, aii, …, ann) элементы которого имеют одинаковые индексы i=j.

Побочная диагональ – это вектор (an1, an-1,2, an-2,3, …, an-i+1,i, …, an1), элементы которого имеют индексы j=n-i+1.

Для каждого индекса строки i и столбца j открывают отдельный цикл с параметром.

Пример 1. Выполните транспонирование матрицы, поменяйте строки и столбцы матрицы местами.

Листинг программы транспонирования матрицы a

program matrix1;

var v:word;

i,j,n,m:byte;

a,at:array[1..50,1..50] of byte; {Описание матрицы целых чисел размерностью 50х50 }

begin writeln;

write('n,m=');read(n,m); {Ввод количества строк и столбцов матрицы }

for i:=1 to n do begin {Открывается цикл по строке }

for j:=1 to m do begin {Открывается цикл по столбцу }

a[i,j]:=(i+j)*j;write(' ',a[i,j]:3); {Вывод элементов матрицы в табличной форме }

end; writeln; end; {Закрываются циклы по столбцу и по строке }

writeln(' Транспонированная матрица a ');

for i:=1 to n do

for j:=1 to m do at[j,i]:=a[i,j]; {Перестановка строк и столбцов матрицы }

for i:=1 to m do begin

for j:=1 to n do begin

write(' ',at[i,j]:3); {Вывод транспонированной матрицы }

end; writeln; end;

end.

Пример 2. Умножить вектор b на матрицу a

Л

истинг программы умножения матрицы a на вектор b по формуле , где массивы

program MatrixVector;

var i,j,k,n:byte;

S,Fi:real;

a:array[1..50,1..50] of real; {Описание матрицы размерностью 50х50 }

b,c:array[1..50] of real; {Описание вектора размерностью 50 }

begin

writeln('n=');read(n); {Ввод количества строк и столбцов квадратной матрицы }

writeln(' Вектор b');

Fi:=1;

for i:=1 to n do begin

Fi:=Fi*i;

b[i]:=Fi*exp(i*ln(2)); {Вычисление элементов вектора b }

write('b',i,'=',b[i]:5:2);

end;

writeln(' Матрица a');

for i:=1 to n do begin

for j:=1 to n do begin

if odd(i) then begin a[i,j]:=(-1)*ln(j);

if odd(j) then a[i,j]:=a[i,j]+(-1)*ln(i)

else a[i,j]:=a[i,j]+ln(i);

end

else begin

a[i,j]:=ln(j);

if odd(j) then a[i,j]:=a[i,j]+(-1)*ln(i) else a[i,j]:=a[i,j]+ln(i);

end; {Вычисление элементов матрицы a }

write('a',i,j,'=',a[i,j]:5:2);

end; writeln; end;

writeln('c=a x b');

for i:=1 to n do begin

s:=0; {Начальное значение суммы задается 0 }

for j:=1 to n do s:=s+a[i,j]*b[j]; {Вычисление суммы произведения a на b }

c[i]:=s; {Определение элементов вектора c присвоением суммы произведения }

write(' c ' , i , '= ', c[i]:5:2); {Вывод элементов вектора c }

end;

end.

Пример 3. Выполните умножение матриц a и b.

Листинг программы умножения матрицы a на матрицу b по формуле

, где матрицы

program MatrixMatrix;

var i,j,k,n:byte;

s:real;

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

begin writeln('n=');read(n);

for i:=1 to n do begin

for j:=1 to n do begin

a[i,j]:=(exp(ln(i)/ln(10))+exp(ln(j)/ln(10)))/(i+j); {Вычисление элементов матрицы a }

write(' a',i,j,'=',a[i,j]:5:3);

end; writeln; end;

for i:=1 to n do begin

for j:=1 to n do begin

b[i,j]:=i/exp(ln(j)/ln(10)); {Вычисление элементов матрицы b }

write(' b',i,j,'=',b[i,j]:5:2);

end; writeln; end;

for i:=1 to n do begin

for k:=1 to n do begin s:=0; {Начальное значение суммы задается 0 }

for j:=1 to n do s:=s+a[i,j]*b[j,k]; {Вычисление суммы произведения матриц a и b }

c[i,k]:=s; {Вычисление элементов матрицы c}

write(' c',i,k,'=',c[i,k]:6:2);

end; writeln; end;

end.