Обращение к элементам двумерного динамического массива
Адресация элементов динамического массива осуществляется с помощью индексированного имени.
Синтаксис:
ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];
или
ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];
Например:
mas[5][7] – индекс задается как константа,
sl[i][j] – индекс задается как переменная,
array[4*p][p+5] – индекс задается как выражение.
Пример 1. Сформируйте и выведите на экран единичную матрицу с целыми элементами, вводя ее порядок с клавиатуры.
#include <iostream.h>
void main() {
int n,i,j;
int **matr;//указатель для массива указателей
cout << "Input matrix order:";
cin >> n;
matr = new int *[n];
//выделение памяти под массив указателей
for(i=0; i<n; i++){
matr[i] = new int[n];
//выделение памяти для массива значений
for (j=0; j<n; j++) //заполнение матрицы
matr[i][j] = (i==j ? 1 : 0);
}
cout << "Result: ";
for(i=0; i<n; i++){
cout << "\n";
for (j=0; j<n; j++)
cout << " " << matr[i][j];
delete matr[i];
//освобождение памяти из-под массива значений
}
delete [] matr;
//освобождение памяти из-под массива указателей
}
Пример 2. Вычислить сумму элементов, лежащих на диагоналях матрицы N ´ N (обратить внимание на четность-нечетность числа N). Размер массива должен задаваться пользователем с клавиатуры.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void gen (int nn,int a, int b,int ***mas);
//объявление функции генерации массива
int summa(int nn, int **mas);
/*объявление функции вычисления сумму заданных элементов массива*/
void out (int nn,int **mas);
//объявление функции вывода массива
void main (){
int **mass, n;
int s;
printf("Введите n: ");
scanf("%d",&n);
printf("\nГенерация массива \n");
gen(n,0,10,&mass);
s=summa(n,mass);
out(n,mass);
printf("\nСумма элементов = %d",s);
}
void gen(int nn, int a, int b, int ***mas){
//функция генерации массива
int i,j;
srand(time(NULL)*1000);
*mas=(int**)malloc(nn*sizeof(int*));
for (i=0;i<nn;i++){
(*mas)[i]=(int*)malloc(nn*sizeof(int));
for (j=0;j<nn;j++)
(*mas)[i][j]=(rand()*1.0/(RAND_MAX)*(b-a)+a);
}
}
int summa(int nn, int **mas) {
//функция вычисления сумму элементов диагоналей
int i,j, sum=0;
for (i=0;i<nn;i++)
for (j=0;j<nn;j++) {
if ((i==j) || (i==nn-j-1)) {
//нахождение элементов диагоналей
sum+=mas[i][j];
//суммирование элементов диагоналей
}
}
return sum;
}
void out (int nn,int **mas){
//функция вывода массива
int i,j;
for (i=0;i<nn;i++) {
for (j=0;j<nn;j++)
printf("%4d",mas[i][j]);
printf("\n");
free (mas[i]);
}
free (mas);
}
В языке С++ предусмотрено использование указателя вида ***mass. В данном примере в функцию генерации массива передается не адрес указателя, а его значение. Передача фактического параметра при вызове функции осуществляется через определение адреса указателя **mass.
Перед компиляцией кода в среде MSVC++ необходимо в меню Options/Project отключить режим Use Microsoft Foundation Classes.
Задания
1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.
2.В двумерном целочисленном динамическом массиве замените все четные элементы их половинами.
3.Добавьте в двумерный динамический массив строку из одних нулей после каждой строки, сумма элементов которой больше заданного числа S.
Домашние задания
1.Наберите код программы из Примера 2. Выполните компиляцию и запуск программы.
2.В двумерном вещественном динамическом массиве замените все отрицательные элементы их квадратами. Реализуйте данную программу двумя способами: 1) с помощью операций new и delete; 2) с помощью библиотечных функций malloc (calloc) и free.
3.Замените в двумерном целочисленном динамическом массиве размера 3´3 каждый элемент его алгебраическим дополнением.
Дата добавления: 2015-02-16; просмотров: 1579;