- •Предисловие
- •Задание 1. Задачи целочисленной арифметики
- •If (Условие) Оператор1;
- •Варианты контрольных заданий
- •Задание 2. Использование функций
- •Задание 3. Обработка одномерных массивов
- •Задание 4. Обработка двумерных массивов
- •Задание 5.Обработка символов и строк
- •Задание 6. Одномерный массив–параметр функции
- •Задание 7. Двумерный массив–параметр функции
- •Задание 8. Структуры
Задание 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.