Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные занятия_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
462.85 Кб
Скачать

Задание 7. Двумерный массив–параметр функции

Цель задания

Изучение основных приемов программирования задач обработки динамических двумерных массивов, передачи в качестве параметров функций двумерных статических и динамических массивов.

Основные понятия

Указатели на указатели

Тип ** ИмяУказателя ;

Например: double **p; Объявленный указатель p может содержать адрес указателя на переменную типа double.

int a = 10, *p, **p1;

p = &a;

p1 = &p;

После выполнения этих операторов указатель p1 будет содержать адрес указателя p, содержащего адрес переменной a со значением 10.

Массивы указателей и двумерные статические массивы.

Тип * ИмяМассива [Размер];

Например, int* p[10]; //Объявлен массив указателей p

Имя двумерного статического массива является константным указателем на указатель, и содержит адрес начала массива указателей на одномерные массивы строк. Поэтому обращение к элементу с индексами i, j эквивалентно следующей операции разыменования: *(*(A + i) + j)

Для работы с двумерными статическими массивами можно применять указатели, инициализированные следующим образом:

БазовыйТип** ИмяУказателя = ИмяМассива;

В этом случае доступ к элементам двумерного массива может осуществляться как с помощью индексации его имени, так и с помощью указателей. Например,

float B[4][4];

float** pB = B;

Для обращения к элементу массива с индексами i , j можно использовать:

*(*( pB + i) +j ) B[i][j] *(*(B + i) + j)

Двумерные динамические массивы

Для создания динамического целочисленного массива из n строк и m столбцов, следует выполнить следующие действия:

int ** Matrix; //Выделение памяти под переменную Matrix,

// где будет храниться адрес массива указателей

Matrix = new int *[n]; //Выделение памяти под одномерный

//массив указателей на строки

for(int i = 0; i < n; i++)

Matrix[i] = new int[m]; //Выделение памяти под

//i-ую строку матрицы

Удаление двумерного динамического массива происходит в несколько этапов:

for(int i = 0; i < N; i++) //Удаление одномерных массивов элементов.

delete [] Matrix[i];

delete [] Matrix; //Удаление массива указателей на одномерные

//массивы элементов.

Обращение к элементу динамического массива с индексами i, j:

Matrix[i][i], или *( *( Matrix + i) + j ).

Передача массивов в функции

При объявлении и описании функции для двумерных статических массивов в списке параметров рядом с именем массива записывается две пары скобок [] и во второй паре скобок обязательно задается количество элементов в строке.

При объявлении и описании функции для двумерных динамических массивов в списке параметров записывается указатель на указатель.

Примеры выполнения задания

//Пример 7.1. Выполнить ввод и вывод статического двумерного

//массива, используя функции.

#include<iostream.h>

#include<stdlib.h>

const M=5;

void EnterArray(int Array [][M], int Size);

void DisplayArray(int Array [][M], int Size);

int main() {

const int N = 4;

int A[N][M]; //Объявление статического двумерного массива

cout << "\nВведите элементы массива:" << endl;

EnterArray(A, N); //Вызов функции EnterArray

cout << "\n\tСодержимое массива:" << endl;

DisplayArray(A, N); //Вызов функции DisplayArray

cout << endl;

system("pause");

return 0;

}

void EnterArray(int A[][M], int Size) {

for(int i = 0; i < Size; i++)

for(int j = 0; j < M; j++) {

cout << "A[" << i << "][" <<j << "]=";

cin >> A[i][j];

}

}

void DisplayArray(int A[][M], int Size) {

for(int i = 0; i < Size; i++) {

for(int j = 0; j < M; j++)

cout << A[i][j] << ' ';

cout<<endl;

}

}

//Пример 7.2. Выполнить ввод и вывод динамического двумерного

//массива, используя функции.

#include<iostream.h>

#include<stdlib.h>

void EnterArray(int **Array, int SizeN, int SizeM);

void DisplayArray(int **Array, int SizeN, int SizeM);

int main() {

int N, M;

cout<<"\nЗадай количество строк:";

cin>>N;

cout<<"\nЗадай количество столбцов:";

cin>>M;

// Выделение динамической памяти под матрицу

int **A=new int* [N];

for(int i=0; i<N; i++)

A[i]=new int [M];

cout << "\nВведите элементы массива:" << endl;

EnterArray(A, N, M); //Вызов функции EnterArray

cout << "\n\tСодержимое массива:" << endl;

DisplayArray(A, N, M); //Вызов функции DisplayArray

cout << endl;

//Освобождение динамической памяти, занимаемой матрицей

for(int i=0; i<N; i++)

delete [] A[i];

delete [] A;

system("pause");

return 0;

}

void EnterArray(int **A, int SizeN, int SizeM) {

for(int i = 0; i < SizeN; i++)

for(int j = 0; j < SizeM; j++) {

cout << "A[" << i << "][" <<j << "]=";

cin >> A[i][j];

}

}

void DisplayArray(int **A, int SizeN, int SizeM) {

for(int i = 0; i < SizeN; i++) {

for(int j = 0; j < SizeM; j++)

cout << A[i][j] << ' ';

cout<<endl;

}

}

Постановка задания

Разработать алгоритм решения задачи. Написать программу, которая реализует данный алгоритм. Создать динамический(ие) и(или) статические массив(ы). Ввод, вывод элементов двумерного массива и его обработку оформить в виде функций.

Варианты контрольных заданий

Смотри варианты контрольных заданий задания 4.