Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_7.doc
Скачиваний:
1
Добавлен:
12.07.2019
Размер:
135.68 Кб
Скачать

Int main(int argc, char* argv[])

{

short i, j; // текущие индексы

int k;

int *DArr;

printf("===================================\n");

DArr = new int[N * N]; // Динамически выделяем память под одномерный массив N*N

printf("---------- Arrays addresses ------------\n");

printf(" DArr = %p (%u)\n", DArr, DArr);

printf("------------------------------------\n");

for (i = 0; i < N; i++) // перебор строк

for (j = 0; j < N; j++) // перебор столбцов

*(DArr + i * N + j) = i * N + j + 1; // или DArr[i * N + j]

printf("\n----- Data by indexes ------\n");

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

{

for (j = 0; j < N; j++)

printf("%3d", DArr[i * N + j]); // Обращение к элементу массива по индексам

printf("\n"); // или *(DArr + i * N + j)

}

printf("\n----- Data by pointers ------\n");

for (k = 0; k < N * N; k++)

printf("%3d", *(DArr + k)); // Обращение к элементу массива по указателю,

printf("\n");

getch();

delete[] DArr; // освобождаем память, выделенную под массив указателей на строки

return 0;

}

Результат работы программы:

Если размер массива заранее не известен, то память под него можно выделить только динамически.

Пример 5. Переделать задачу из лабораторной работы № 6 так, чтобы можно было задавать размер массива в программе, выделять память динамически, повторять ее до тех пор, пока не будет нажата клавиша ESC.

Задача из лаб. раб. 6: Заполнить секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей, линейной последовательностью чисел (1, 2, 3, ...) от левого верхнего угла вправо и вниз. Остаток матрицы заполнить нулями.

Алгоритм программы – в работе 6, необходимо только заменить статический массив на динамический, сделать цикл do-while, выход из которого возможен только по клавише ESC.

#define ESC 0x1B // Код клавиши Esc

Int main(int argc, char* argv[])

{

int **DArr;

short i, j; // текущие индексы

short r1,r2; // граничные номера столбцов

short dd; // модификатор граничных номеров

short k; // текущий член линейной последовательности

int Narr; // размер массива

char key;

do

{

printf(" Size of array = ");

scanf("%d", &Narr);

DArr = new int*[Narr];

for (i = 0; i < Narr; i++)

DArr[i] = new int[Narr];

printf("------ Arrays addresses---------\n");

printf(" DArr = %p (%u)\n", DArr, DArr);

for (i = 0; i < Narr; i++)

printf(" DArr[%d] = %p (%u), address DArr[%d] = %p (%u)\n",

i, DArr[i], DArr[i], i, &DArr[i], &DArr[i]);

printf("------------------------------------\n");

r1=1; // начальные значения переменных

r2 = Narr-2;

dd=1;

k=1;

for (i = 0; i < Narr; i++) // перебор строк

{

for (j = 0; j < Narr; j++) // перебор столбцов

{

if ((j < r1)||(j > r2))

DArr[i][j] = 0;

else

DArr[i][j] = k++;

}

r1 += dd; // модификация границ

r2 -= dd;

if (r1 > r2) // уcловие перехода в нижнюю часть

dd = -dd;

}

printf("\n----- Data by indexes ------\n");

for (i = 0; i < Narr; i++)

{

for (j = 0; j < Narr; j++)

printf("%3d", DArr[i][j]);

printf("\n");

}

printf("\n----- Data by pointers ------\n");

for (j = 0; j < Narr * Narr; j++)

{

if (!(j % Narr) && Narr > 5) // Чтобы при большом массиве выводить

printf("\n"); // в виде матрицы

printf("%3d", *(DArr[0] + j));

printf("\n\nRepeat?\n");

}

key = getch();

for (i = 0; i < Narr; i++) // Для каждой строки

delete[] DArr[i]; // освобождаем память, выделенную под массив int,

delete[] DArr; // освобождаем память, выделенную под массив указателей на строки

} while (key != ESC);

return 0;

}

Результат работы программы:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]