- •Система Pascal abc
- •Редактор
- •Горячие клавиши
- •Окно вывода
- •Окно ввода
- •Запуск и остановка программы
- •Программа прервана пользователем
- •Пошаговое выполнение программы
- •Окно отладки
- •Pascal abc Язык Pascal abc Структура программы
- •Идентификаторы и служебные слова
- •Выражения и операции
- •Арифметические операции
- •Операция @
- •Операции с указателями
- •Операции с множествами
- •Приоритет операций
- •Описание переменных и констант
- •Описание типов
- •Обзор типов
- •Все порядковые типы, а также типы boolean, real и complex называются простыми типами. Порядковые типы
- •Типы boolean, real и complex
- •Строковый тип
- •Массивы
- •Множества
- •Указатели
- •Процедурный тип
- •Эквивалентность типов
- •Неявное приведение типов
- •Явное приведение типов
- •Область действия идентификатора
- •Ввод и вывод. Форматы вывода
- •Оператор присваивания
- •Условный оператор
- •Составной и пустой операторы
- •Оператор выбора
- •Оператор цикла for
- •Оператор цикла repeat
- •Оператор вызова процедуры
- •Операторы break, continue и exit
- •Оператор with
- •Оператор безусловного перехода goto
- •Оператор try ... Except
- •Оператор try ... Finally
- •Оператор raise
- •Описание процедур и функций
- •Параметры процедур и функций
- •Локальные и глобальные переменные
- •Общие стандартные процедуры и функции
- •Стандартные процедуры и функции для работы со строками
- •Стандартные процедуры и функции для работы с файлами
- •Стандартные процедуры и функции для работы с памятью
- •Системные процедуры и функции
- •Стандартные константы
- •Обзор классов и объектов
- •Конструкторы и деструкторы
- •Свойства
- •Переменная Self
- •Наследование
- •Видимость членов класса
- •Переопределение методов
- •Приведение типов объектов
- •Операции is и as
- •Виртуальные методы и полиморфизм
- •Модуль crt
- •Модуль Timers
- •Модуль Sounds
- •Модуль Utils
- •Модуль PointRect
- •Модуль GraphAbc
- •Графические примитивы
- •Цветовые константы и функции для работы с цветом
- •Действия с пером
- •Действия с кистью
- •Действия со шрифтом
- •Действия с рисунками
- •Действия с графическим окном
- •Задание режимов вывода
- •Класс Picture
- •Описатели рисунков и класс Picture
- •Исполнитель Робот
- •Алгоритмизация
- •Алгоритм и его свойства
- •Способы описания алгоритмов
- •Линейные алгоритмы
- •Разветвляющиеся алгоритмы
- •Алгоритмы циклической структуры
- •Подчиненные алгоритмы
- •Системы программирования
- •Лабораторная работа № 1 Программирование линейных алгоритмов
- •Лабораторная работа № 2 Программирование разветвляющихся алгоритмов
- •Лабораторная работа № 4 Одномерные массивы - вектора
- •Литература Основная литература:
- •Дополнительная литература:
- •Лабораторная работа № 3 Программирование циклических алгоритмов
Лабораторная работа № 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
Л
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.