- •Лабораторная работа № 1
- •Далее создадим файл:
- •Задания1
- •Лабораторная работа № 2
- •Консольный ввод-вывод
- •Чтение и запись символов
- •Чтение и запись строк
- •Форматированный консольный ввод-вывод
- •Форматированный вывод
- •Форматированный ввод
- •7. Варианты задания
- •Лабораторная работа № 3
- •5.2 Оператор if
- •Лабораторная работа № 4
- •Содержание отчета
- •Постановка задачи.
- •Общие сведения
- •Лабораторная работа № 5
- •Оператор for
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Задание 2. Циклический вычислительный процесс конечные суммы и произведения
- •Лабораторная работа № 6
- •Оператор цикла while
- •Оператор do … while
- •Оператор break
- •Оператор continue
- •Лабораторная работа № 7
- •5.1 Одномерный массив
- •Создание указателя на массив
- •5.3 Индексация с помощью указателей
- •Сортировка
- •Методические указания.
- •Лабораторная работа № 8
- •Двухмерные массивы
- •Лабораторная работа № 9
- •Лабораторная работа № 11
- •Задача 2. Параметры функции
- •Лабораторная работа № 12
- •Варианты заданий
- •Лабораторная работа № 13
- •Некоторые операции над матрицами
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 14
- •Решение уравнения методом деления отрезка пополам (бисекций)
- •Методические указания
- •Лабораторная работа № 15
- •Вычисление определенного интеграла
- •6.2.1 Метод средних прямоугольников
- •6.2.1 Метод трапеций
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 10
- •Структуры (struct)
- •Лабораторная работа № 16
- •Директива #include
- •7. Методические указания
- •8. Варианты заданий.
- •Лабораторная работа № 17
- •Указатель на файл
- •Открытие файла
- •Перенаправление потока
- •Чтение из потока и запись в поток
- •Закрытие потока
- •Использование функций feof() и ferror()
- •Варианты заданий
- •Лабораторная работа № 18
- •Функции обработки символов
- •Функции обработки строк
- •Варианты заданий
- •Лабораторная работа № 19
- •Структуры
- •6.1.1 Доступ к элементам структуры
- •6.1.2 Присваивание структур
- •Массивы структур
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Функции fread () и fwrite ()
- •Варианты заданий
- •Лабораторная работа № 20
- •Например, формула
- •Задание на программирование
Лабораторная работа № 13
Тема: «Обработка матриц с использованием указателей»
Цель работы
Получение навыков в написании программ с использованием указателей.
1.2 Получение навыков программирования некоторых операций над матрицами с использованием указателей.
Техническое обеспечение
Персональная ЭВМ IBM PC/286 и более поздних моделей.
Клавиатура.
Дисплей.
Печатающее устройство.
Программное обеспечение
Операционная система Windows
Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.
Постановка задачи
Выполнить операции над матрицами согласно указанного варианта.
5. Содержание отчета
5.1. Тема и цель работы.
5.2. Схема алгоритма решения задачи.
5.3. Текст программы.
5.4. Результаты выполнения программы.
Общие сведения
Многомерный массив в языке С – это массив массивов, т. е. Массив, элементами которого являются массивы. Например, двухмерный массив есть массив, элементы которого одномерные массивы
const int n=5,m=6;
int arr [n][m];
Массив arr состоит из n элементов. Каждый элемент – одномерный массив размерностью m. В памяти массив arr расположен следующим образом:
. . . |
Первый массив из m элем-тов |
Второй массив из m элем-тов |
. . . |
n - й массив из m элем-тов |
. . . |
Рассмотрим, как осуществлять доступ к элементам многомерного массива через указатель. Сделаем это на примере массива arr.
Объявим указатель и свяжем его с массивом arr
int *ptr;
ptr = &arr[0][0];
Необходимо получить доступ к элементу arr[i][j], или к j-му элементу i-й строки массива arr. Последовательно это вычисляется так:
адрес первого массива arr - ptr
адрес j-го элемента i-й строки, ptr + i*m + j
т. е. элемента arr[i][j]
T.е. к элементу с индексами arr[i][j] можно обратиться *( ptr + i*m + j) или ptr[i*m+j].
Пример.
/* Сложение двух матриц */
void add_matr(float *matr1, float *matr2, int n, int m)
{
int i,j;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
*(matr1+i*m+j)=*(matr1+i*m+j) +*(matr2+i*m+j);// или matr1[i*m+j]=matr1[i*m+j] + matr2[i*m+j];
out_matr(matr1, m, n);
}
Некоторые операции над матрицами
Ввод матрицы обычно задается по строкам с помощью двух циклов. При использовании указателей это будет выглядеть следующим образом:
/* Ввод матрицы по строкам */
void input_matr (float *matr, int n, int m)
{
int i, j;
for (i = 0; i < n; i++)
{
cout<<“\nвведите элементы “<<i + 1<<”-й строки: “ ;
for(j = 0; j < m; j++)
cin>>matr[ i*m + j];
}
}
Вывод матрицы организуется построчно, как и ввод, с помощью двух циклов. При использовании указателей это будет выглядеть следующим образом:
/* Вывод матрицы по строкам *.
void out_matr(float *matr, int n, int m)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
cout<<(matr[i*m + j]<<” “;
cout<<endl;
}
cout<<endl;
}
Операции с константами сводятся к сложению или вычитанию элементов матрицы aij с константой, например х, или умножению aij*х или делению aij/х на константу.
Транспонированной матрицей называется матрица, у которой столбцы и строки меняются местами, т. е. из матрицы размера mn получатся матрица размером nm. Например, для матрицы А размером 34 это:
Нетрудно заметить, что транспонирование матрицы реализуется с помощью соотношения .
Произведением двух квадратных матриц А и В является третья матрица С, элементы которой вычисляются по формуле:
.
Таким образом, элемент сij матрицы С = АВ есть сумма произведений элементов i-й строки матрицы А на соответствующие элементы i-го столбца матрицы В.