|
|||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Работа с матрицамиПример 1. Пусть задана матрица Для заданной матрицы рассмотрим несколько задач. Задача 1. Подсчитать в каждом столбце количество элементов, имеющих отрицательное значение. Исходные данные: массив А(4,3) вещественного типа. Искомые данные: вектор К(3) целого типа, элементы которого могут принимать значения от 0 до 4. Используемые обозначения: Aij – элемент матрицы, где i – номер строки, j – номер столбца. Кj – количество отрицательных элементов в j-ом столбце матрицы. При таких обозначениях следует взять i за параметр внутреннего цикла, j – за параметр внешнего цикла. Элементы каждого столбца матрицы следует рассматривать как вектор, к которому можно применить типовой алгоритм: определение количества элементов массива, удовлетворяющих некоторому условию: если A[i,j] < 0, то Kj = Kj + 1, иначе Kj = Kj. На первом этапе решение выглядит как структура следования (рис. 6):
По методу нисходящего проектирования алгоритма выполняем детализацию выделенных этапов. 1.Детализация блока ввода матрицы (рис. 7). { алгоритм ввода элементов матрицы }
For i:=1 to 4 do
For J:=1 to 3 do begin Writeln(' Ввод элемента A[', i,',',j,']='); Readln(A[i,j]); Еnd;
мы.
for i:=1 to 4 do begin for j:=1 to 3 do write(a[i,j]:8:2); writeln; { переход на новую строку} end;
3. Детализация блока 3 (рис. 8).
For J:=1 to 3 do Begin { тело внешнего цикла } K[j]:=0; For i:=1 to 4 do { тело цикла по i} If A[i,j]<0 then K[j]:=k[j]+1;
End; {конец цикла по J}
.
4. Детализация блока 4. Вывод элементов вектора К.
Writeln('Вектор К') For i:=1 to 3 do write(k[i]:3); writeln;
Полный текст программы:
Program Matric1; Type Matr=array[1..4,1..3] of real; Vect=array[1..3] of integer; Var A:matr; K:vect; I,j:integer; Begin For i:=1 to 4 do For J:=1 to 3 do begin Writeln(' Ввод элемента A[', i, ',', j, ']='); Readln(A[i,j]); End; for i:=1 to 4 do begin for j:=1 to 3 do write(a[i,j]:8:2); writeln; { переход на новую строку} end; For J:=1 to 3 do Begin { тело внешнего цикла } K[j]:=0; For i:=1 to 4 do {тело цикла по i} If A[i,j]<0 then K[j]:=k[j]+1; End; {конец цикла по J} Writeln('Вектор К') For i:=1 to 3 do write(k[i]:3); writeln; End.
Задача 2. Поменять местами первую и последнюю строки матрицы А. Здесь понадобится рабочая переменная R.
for j: = 1 to 3 do Begin R: = a[1,j]; A[1,j]: = [4,j]; A[4,j]: = R; End;
Пример 2. Вычислить скалярное произведение матрицы на вектор. Демонстрируемые приемы: наглядный ввод матрицы, описание двумерного массива, представляющего матрицу как массив массивов.
Program SCAL_PROIZ; Const ln=10; lm=10; Type rv = 1..ln; rm = 1..lm; { описание типов - отрезков} tv = array[rv] of real; tm = array[rm] of tv; Var matr: tm; vect: tv; m,n,i,j:integer; s:real; Begin writeln(' ВЫЧИСЛЯЕТСЯ СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ МАТРИЦЫ НА ВЕКТОР'); writeln('порядок матрицы: m*n, длина вектора: n, ограничения: 0<m, n<=10'); write('введите m='); readln(m); write('введите n='); readln(n); writeln('матрица вводится построчно, по одному элементу'); for i:=1 to m do begin writeln('-вводите элементы строки ',i); for j:=1 to n do begin write('MT[',i,',',j,']='); readln(matr[i,j]) end; writeln('исходная матрица:'); for i:=1 to m do begin for j:=1 to n do write(matr[i,j]:8:2); writeln end; writeln('вводите элементы вектора'); for j:=1 to n do readln(vect[j]); writeln('исходный вектор:'); for j:=1 to n do write(vect[j]:8:2); writeln; For i:=1 to m do Begin s:=0; For j:=1 to n do s:=s+matr[i,j]*vect[j]; Rezv[i]:=s End; writeln('результирующий вектор:'); for i:=1 to m do write(rezv[i]:8:2); writeln; readln end.
Пример 3. Транспонирование квадратной матрицы A[n,n]. Приведем фрагмент записи алгоритма.
for i: = 1 to n do for j:=i + 1 to n do { элементы главной диагонали не переставляются J>i} Begin R: = a [ i,j ]; a[ i,j]:=a[j,i ]; a[ j,i ] = R; End
Пример 4. Рекомендуется распечатывать все исходные и промежуточные результаты по формированию и обработке массивов. При отладке и тестировании программ иногда приходится многократно вводить элементы массивов с клавиатуры. Можно создать текстовый файл с исходными данными, а в программе использовать оператор ввода данных из файла. Пусть задан массив А(n) вещественных чисел, n не более 20. Значения этих элементов подготовлены в файле с названием ISX.DAT. Файл расположен в текущем каталоге. Порядок размещения данных: - в первой строке – целое число N, текущая длина массива; - во второй строке значения элементов A1, A2,..., An, разделенные хотя бы одним пробелом. Например, тест А(5)=(-3.7,0, -85, 2, 12.4) в файле isx.dat имеет вид: 1 строка: 5 2 строка: -3.7 0 -85 2 12.4
Файл с данными можно создать в среде Паскаля. Программа ввода массива из файла:
Type VECTOR = array[1..20] of single; Var A: VECTOR; N, I: Byte; F: text {текстовый файл для ввода данных из файла } Begin Assign (F,'ISX. DAT'); { Указали файл данных} RESET(f); { открываем файл} READLn (f,N); { читаем из файла N } for i: = 1 to N Do READ (f,A[I]); { читаем значение A[i] из файла} Close(f); {закрытие файла } …. End.
Варианты заданий к лабораторной работе Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.) |