Массивы. Двумерные массивы. Запись элементов двумерного массива в текстовый файл

Страницы работы

34 страницы (Word-файл)

Фрагмент текста работы

  • размещении элементов двумерных массивов они располагаются в памяти подряд по строкам, т.е. быстрее всего изменяется последний индекс, а медленнее – первый.
  • Двумерные массивы инициализируются так же, как и одномерные. Как видно из примера, элементы каждой строки заключаются в отдельные фигурные скобки, в случае отсутствия скобок инициализация будет выполнена неправильно. Если задать не все элементы, то остальные заполнятся нулями.

Двумерные массивы

  • Обращение к элементам двумерных массивов :
    • ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];
    • Например:
    • a[0][0] – индекс задается как константа,
    • d[55][5] – индекс задается как константа,
    • s[i][j] – индекс задается как переменная,
    • w[4*p][3+t] – индекс задается как выражение.
  • Определение размера памяти двумерных массивов
  • Байты = sizeof(тип) * размерность_1 * размерность_2
    • Например:
    • int a[5][6]; // sizeof(int)* 5 * 6 = 120 байт

Двумерные массивы

  • Блок – схемы ввода – вывода двумерных массивов

Двумерные массивы

  • Как и для одномерных массивов, матрицы могут быть введены с клавиатуры, из файла, и заполнены с помощью случайных чисел.
  • Ввод – вывод двумерных массивов (матриц), как и одномерных , выполняется поэлементно.
  • Двумерный массив (матрицу) можно представить как массив одномерных массивов равной длины. Для ввода одного одномерного массива требуется цикл, а таких одномерных массивов несколько. Поэтому для работы с матрицами требуется двойной или вложенный цикл, то есть цикл в цикле.
  • Блок-схема ввода элементов матрицы A[N] [M] изображена на рисунке. Внешний цикл –это цикл по строкам матрицы, а внутренний – по элементам строк (столбцам) матрицы.
  • Вывод можно осуществлять по строкам или по столбцам, но лучше, если элементы располагаются построчно.
  • Программа ввода элементов матрицы и вывода их на экран монитора приведена на следующем слайде
  • При вводе матрицы элементы каждой строки можно разделять пробелами или символами табуляции, а в конце строки нажимать Enter.

Двумерные массивы

  • Ввод элементов матрицы с клавиатуры и вывод на экран:
  • #include <iostream>
  • using namespace std;
  • int main()
  • { int i,j,N,M,A[20][20];
  • cout << "N = "; cin >> N; cout << "M = "; cin >> M;
  • // ввод матрицы
  • cout << " Input Matrix A" << endl;
  • for(i = 0; i < N; i++)
  • for(j = 0; j < M; j++)
  • cin >> A[i][j];
  • // вывод матрицы
  • cout << "\n Matrix A\n" << endl;
  • for(i = 0; i < N; i++)
  • { for(j = 0;j < M;j++)
  • cout << A[i][j] << " ";
  • cout << endl;
  • }
  • }

Двумерные массивы

  • Указатели и двумерные массивы:
  • int arr [4][3];
  • Адрес(arr[i][j])=Адрес(arr[0][0]) + (i*3+j)*sizeof(int)
  • Схема распределения памяти для двумерного массива arr
  • arr
  • arr[0] arr[0][0] arr[0][1] arr[0][2]
  • arr[1] arr[1][0] arr[1][1] arr[1][2]
  • arr[2] arr[2][0] arr[2][1] arr[2][2]
  • arr[3] arr[3][0] arr[3][1] arr[3][2]
  • Доступ к элементам одномерного массива указателей
  • arr[i] или *(arr+i)
  • Доступ к элементам двумерного массива
  • arr[i][j] или *(*(arr+i)+j) или
  • (*(arr+i))[j]

Двумерные массивы

  • При размещении элементов двумерных массивов они располагаются в памяти подряд по строкам, т.е. быстрее всего изменяется последний индекс, а медленнее – первый. Такой порядок дает возможность обращаться к любому элементу двумерного массива, используя адрес его начального элемента и только одно индексное выражение.
  • При объявлении двумерного массива: int arr [4][3];
    1. В памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей.
    2. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес одномерного массива из трех элементов типа int.
    3. Следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.
  • Таким образом, объявление arr[4][3] порождает в программе три разных объекта:
    • указатель с идентификатором arr,
    • безымянный массив из четырех указателей: arr[0], arr[1], arr[2], arr[3]
    • безымянный массив из двенадцати чисел типа int.
  • Доступ к элементам одномерного массива указателей осуществляется с указанием одного индексного выражения в форме arr[2] или *(arr+2).
  • Для доступа к элементам двумерного массива могут быть использованы следующие выражения:
  • arr[i][j] или *(*(arr+i)+j) или
  • (*(arr+i))[j]

Двумерные массивы

  • Пример. Использование индексных и адресных выражения при обработке двумерных массивов.
  • #include <iostream>
  • using namespace std;
  • int main()
  • { int i, j; int t[2][3];
  • for(i = 0; i < 2; i++)
  • for(j = 0; j < 3; j++)
  • t[i][j] = i+j;
  • for(i = 0; i < 2; i++)
  • { for(j = 0;j < 3; j++)
  • cout << *(*(t + i) +j) << ' ';
  • cout << endl;
  • }
  • cout << endl;
  • for(i = 0; i < 2; i++)
  • { for(j = 0;j < 3; j++)
  • cout << (*(t + i))[j] << ' ';
  • cout << endl;
  • }
  • }

Двумерные массивы

  • Пример. Демонстрация связи между матрицей и указателем на нее.
  • #include <iostream>
  • using namespace std;
  • int main()
  • { int i,j; int t[2][3], *ptr = &t[0][0];
  • for(i=0; i<2; i++)
  • for(j=0;j<3; j++)
  • t[i][j] = i+j;
  • for(i=0; i<2; i++)
  • { for(j=0; j<3; j++)
  • cout << *(ptr + i*3+j) << ' '; cout << endl;
  • }
  • cout << endl;
  • for(i=0; i<6; i++)
  • cout << ptr[i] << ' ';
  • cout << endl; cout << endl;
  • for(i=0; i<2; i++)
  • { for(j=0; j<3; j++)
  • cout << ptr[i*3 +j] << ' '; cout << endl;
  • }
  • }

Двумерные массивы

  • Создание динамических массивов с использованием обычных указателей:
  • int *A, n, m;
  • A = (int *) calloc (n*m, sizeof(int));
  • A = (int *) malloc (n*m, sizeof(int));
  • A = new int [N*M];
  • обращение к элементу : *(A+i*m+j)

Двумерные массивы

  • В рассмотренных примерах память для хранения матриц выделялась статически, т. е. компилятором исходя из описания матрицы, однако в C++ существует

Похожие материалы

Информация о работе