- •Программирование Методические указания по выполнению лабораторных работ (для студентов заочной формы обучения, обучающихся по направлению «Информатика и вт»)
- •Оглавление
- •1. Программа дисциплины
- •Требования к уровню освоения содержания дисциплины
- •Перечень лабораторных работ Таблица 2
- •Рекомендуемая литература
- •Р ис. 1. Блок-схема алгоритма
- •2. Методика выполнения лабораторных работ и задания к ним
- •2.1. Лабораторная работа 1. Разветвляющийся вычислительный процесс
- •2.1.1. Пример выполнения лабораторной работы
- •2.1.2. Варианты заданий к лабораторной работе
- •2.1.3. Контрольные вопросы и задания
- •2.2. Лабораторная работа 2. Циклический вычислительный процесс
- •2.2.1. Теоретические сведения, необходимые для выполнения работы
- •2.2.2 Варианты заданий к лабораторной работе
- •2.2.3. Контрольные вопросы и задания
- •2.3. Лабораторная работа 3. Работа с массивами и матрицами
- •2.3.1. Теоретические сведения, необходимые для выполнения работы
- •Объявление массива в Паскале.
- •Примеры работы с одномерными массивами
- •Работа с матрицами
- •2.3.2. Варианты заданий к лабораторной работе Задания на «Одномерные массивы»
- •Задания на «Матрицы»
- •2.3.3. Контрольные вопросы и задания
- •2.4. Лабораторная работа 4. Обработка текстовой информации
- •2.4.1. Теоретические сведения, необходимые для выполнения работы Тип данных String
- •Сравнение строк
- •Стандартные процедуры и функции для обработки строк
- •2.4.2. Задания к лабораторной работе Общая постановка задачи для всех вариантов
- •Индивидуальные задания на строки
- •2.4.3. Контрольные вопросы и задания
- •2.5. Лабораторная работа 5. Использование процедур и функций
- •2.5.1. Теоретические сведения, необходимые для выполнения работы Модульное программирование
- •Нисходящее проектирование
- •Общая структура подпрограммы
- •Процедуры и функции
- •Локальные и глобальные определения данных
- •Параметры подпрограмм
- •Программирование и отладка модульных программ
- •Пример применения модульного программирования
- •2.5.2. Задания к лабораторной работе
- •Индивидуальные задания на процедуры и функции
- •2.5.3. Контрольные вопросы и задания
- •Библиографический список
- •Приложение 1
- •Отчет о лабораторной работе № ___ (вариант №__)
- •«Программирование»
- •Иркутск 20__
Работа с матрицами
Пример 1. Пусть задана матрица
Для заданной матрицы рассмотрим несколько задач.
Задача 1. Подсчитать в каждом столбце количество элементов, имеющих отрицательное значение.
Исходные данные: массив А(4,3) вещественного типа.
Искомые данные: вектор К(3) целого типа, элементы которого могут принимать значения от 0 до 4.
Используемые обозначения: Aij – элемент матрицы, где i – номер строки, j – номер столбца. Кj – количество отрицательных элементов в j-ом столбце матрицы.
При таких обозначениях следует взять i за параметр внутреннего цикла, j –
за параметр внешнего цикла. Элементы каждого столбца матрицы следует рассматривать как вектор, к которому можно применить типовой алгоритм: определение количества элементов массива, удовлетворяющих некоторому условию: если A[i,j] < 0, то Kj = Kj + 1, иначе Kj = Kj.
На первом этапе решение выглядит как структура следования (рис. 6):
Рис. 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;
2
Рис. 7.
Блок-схема
мы.
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}
I
f
A[i,j]<0 then
K[j]:=k[j]+1;
End; {конец цикла по J}
.
Рис. 8.
Блок-схема блока 3
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.
