Лаб.раб. Министерство образования и науки российской федерации пензенский государственный
Скачать 0.8 Mb.
|
Лабораторнаяработа№5Тема:"Обработка двумерных массивов. Указатели" Цель работы: изучение способов описания, ввода-вывода и обработки двумерных массивов, использование указателей при работе с массивами. Краткие теоретические сведения. Двумерный массив — это обычная таблица, со строками и столбцами. Фактически двумерный массив — это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m на nпоказана ниже (см. рисунок 17). Рисунок 17 — Двумерный массивы в С++ где, m— количество строк двумерного массива; n— количество столбцов двумерного массива; m х n— количество элементов массива. Наиболее распространенный синтаксис объявления двумерного массива: /*тип данных*/ /*имя массива*/[/*количество строк*/][/*количество столбцов*/]; Примеры инициализации двумерного массива: способ 1: int arr[5][3]; способ 2: int arr[5][3] = { {4, 7, 8}, {9, 66, -1}, {5, -5, 0}, {3, -3, 30}, {1, 1, 1} }; В последнем случае представление массива и обращение к элементу массива имеет вид, показанный на рисунке 18,19.
Ввод массива с клавиатуры и его вывод на экран выполняется следующим образом: int m,n,i,j; cout <<"Введите размеры матрицы:"< cin>>n; int elem; int ar [m][n]; for (i=0; i {for (j=0; j ar [i][j]=elem; } } for (i=0; i {for (j=0; j } } system("pause"); return 0; } При работе с массивами можно использовать указатели. Указатель – переменная, значением которой является адрес ячейки памяти. То есть указатель ссылается на блок данных из области памяти, причём на самое его начало. Указатель может ссылаться на переменную или функцию. Для этого нужно знать адрес переменной или функции. Так вот, чтобы узнать адрес конкретной переменной в С++ существует унарная операция взятия адреса &. Такая операция извлекает адрес объявленных переменных, для того, чтобы его присвоить указателю. Указатели используются для передачи по ссылке данных, что намного ускоряет процесс обработки этих данных (в том случае, если объём данных большой), так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. В основном указатели используются для организации динамического распределения памяти, например при объявлении массива, не надо будет его ограничивать в размере. Ведь программист заранее не может знать, какого размера нужен массив тому или иному пользователю, в таком случае используется динамическое выделение памяти под массив. Любой указатель необходимо объявить перед использованием, как и любую переменную: /*тип данных*/ * /*имя указателя*/; Работу с указателями можно представить следующим образом: #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) { int var = 123; // инициализация переменной var числом 123 int *ptrvar = &var; // указатель на переменную var (присвоили адрес переменной указателю) cout << "&var = " << &var << endl;// адрес переменной var содержащийся в памяти, извлечённый операцией взятия адреса cout << "ptrvar = " << ptrvar << endl;// адрес переменной var, является значением указателя ptrvar cout << "var = " << var << endl; // значение в переменной var cout << "*ptrvar = " << *ptrvar << endl; // вывод значения содержащегося в переменной var через указатель, операцией разименования указателя system("pause"); return 0; } Результат работы представлен ниже на рисунке 20. Пример выполнения задания. Задание. Найти максимальную сумму элементов строк матрицы 35. Написать программы без использования указателей и с использованием указателей. Схема программы без использования указателей представлена на рисунке 20: Рисунок 20 Продолжение рисунка 20 Текст программы: #include { int a[3][5], i, j, s, max; printf (“Введите 3 строки по 5 чисел”); for (i=0;i<3;i++) for (j=0;j<5;j++) scanf("%d",&a[i][j]); printf (“Матрица а :\n”); for (i=0; i<3; i++) {for (j=0; j<5; j++) printf (“%5d”, a[i][j]); printf (“\n”); } for(i=0;i<3;i++) {s=0; for (j=0;j<5;j++) s+=a[i][j]; if (i==0) max=s; else if (max } printf("Максимальная сумма строки = %d",max); } Схема программы с использованием указателей представлена на рисунке 21: Рисунок 21 Продолжение рисунка 21. Пример программы с использованием указателей: #include { int a[3][5], *Р, i, j, s, max; printf (“Введите 3 строки по 5 чисел”); for (i=0;i<3;i++) for (j=0;j<5;j++) scanf("%d",&a[i][j]); printf (“Матрица а :\n”); for (i=0; i<3; i++) {for (j=0; j<5; j++) printf (“%5d”, a[i][j]); printf (“\n”); } P=&a[0][0]; for(i=0;i<3;i++) {s=0; for (j=0;j<5;j++) {s+=*P; P++; } if (i==0) max=s; else if (max } printf("Максимальная сумма строки = %d",max); } Контрольные вопросы Правила организации вложенных циклов. Особенности организации двумерных массивов: понятие массива в языке С++, описание массива в программе, представление элементов массива в памяти, обращение к элементам массива. Указатели в языке С++: понятие указателя, описание указателя в программе. Операции над указателями. Связь массивов и указателей. Варианты заданий Вычислить сумму положительных элементов каждого столбца матрицы А(mn). Из матрицы X(mn) построить матрицу Y, поменяв местами строки и столбцы. Найти наименьший элемент матрицы X (mn) и записать нули в ту строку и столбец, где он находится. Переписать первые элементы каждой строки матрицы A(mn), большие С, в массив В. Если в строке нет элемента, большего С, то записать ноль в массив В. Дана действительная матрица размера mn. Найти сумму наибольших значений элементов ее строк. В данной действительной матрице размера mn поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что такой элемент единственный. В данной действительной квадратной матрице порядка n найти сумму элементов строки, в которой расположен элемент с наименьшим значением. Предполагается, что такой элемент единственный. Дана действительная матрица размера mn, все элементы которой различны. В каждой строке выбирается элемент с наименьшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением. Дана целочисленная матрица размера mn. Найти матрицу, получающуюся перестановкой столбцов (первого с последним, второго с предпоследним и т.д.). Дана целочисленная матрица размера mn. Найти матрицу, получающуюся перестановкой строк (первой с последней и т.д.). Дана действительная матрица [aij], где i, j = 1..n. Получить действительную матрицу [bij], где i, j = 1..n,элемент bijкоторой равен сумме элементов данной матрицы, расположенных в области, определяемой индексами i, j (область заштрихована на рисунке 22): Рисунок 22 Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбцом с номером n, а столбец с номером n сделать строкой с номером n. Просуммировать элементы матрицы X (4,5), сумма индексов которых равна заданной константе К. Дана матрица М (45). Вычислить вектор D, компоненты которого равны сумме элементов строк матрицы. Дана матрица М (66). Вычислить сумму элементов главной диагонали. Дана матрица N (65). Найти столбец с минимальной суммой элементов. Дана матрица М (45) и константа С. Вычислить матрицу D, равную произведению элементов матрицы М на константу. Дана матрица М (46). Вычислить вектор D, компоненты которого равны сумме элементов столбцов матрицы. Дана действительная квадратная матрица порядка n, все элементы которой различны. Найти наибольший элемент, среди стоящих на главной и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении этих диагоналей. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы (рисунок 23): Рисунок 23 Дана матрица М (25), определить максимальный и минимальный элементы. Поменять местами максимальный и минимальный элементы. В матрице А(nn) вычислить сумму элементов матрицы (n-2n-2) и определить максимальный элемент в ней. Дана матрица М (66). Вычислить произведение элементов главной диагонали с константой С. Дана матрица N (65). Найти строку с минимальной суммой элементов, а элемент с номером nij возвести в квадрат. Дана матрица вещественных чисел А (mn). В сроке m определить максимальный элемент, а в столбце n количество элементом, меньших порога k. |