Динамическая память освобождается с помощью операции delete[] имя массива, например, для одномерного массива, delete[] a; Освобождение памяти, выделенной для двумерного массива b, выглядит следующим образом:
fot (i=0; i<n; i++)
delete [ ] b[i];
delete [ ] b;
Время "жизни" динамического массива определяется с момента выделения динамической памяти до момента ее освобождения.
2. Алгоритмы обработки двумерных массивов
Ввод и вывод матрицы
//Ввод матрицы float x[10][10]; puts("Введите m,n"); scanf("%d %d",&m,&n); for(i=0;i<m;i++) for(j=0;j<n;j++) { printf("Введите x[%d][%d]=",i,j); scanf("%f",&x[i][j]); } // Вывод матрицы puts("Матрица x:"); for(i=0;i<m;i++) { for(j=0;j<n;j++) printf("%8.2f",x[i][j]); printf("\n"); } | ![]() |
Примечание.Ввод-вывод динамической матрицы отличается от ввода-вывода статической матрицы лишь описанием матрицы
2.2 Определить количество элементов, больших заданного А и расположенных в строках с нечетными номерами
Графическая схема алгоритма
Таблица соответствия
Переменные в задаче | Имя на языке Си | Тип | Комментарий |
K | K | int | Искомое количество элементов |
B | B | float | Двумерный статический массив |
A | A | float | Заданное число |
- | i | int | Номер строки |
- | j | int | Номер столбца |
/* Определнеие количество элементов, больших заданного А и расположенных в строках с нечетными номерами */
# include <stdio.h>
# include <math.h>
void main ()
{
int i, j, m, n, K;
float B [10][10];
float A; //Описание переменных
printf (“ Введите число строк и столбцов”);
scanf (“%d %d”, &n, &m);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf(“Введите B[%d, %d]=”, i, j);
scanf(“%f”, &B[i] [j]);
}
puts (“ введите число A”);
scanf (“%f”, &A);
K=0;
for (i=1; i<n; i=i+2)
for (j=0; j<m; j++)
if(B[i]>A) K=K+1;
printf(“%f \n”, K);
}
Тесты:
-3; 8; -2; 10; 7; 82; -4
|
1) В= -9; 0; -3; 85; 3; 40; -9 A= 4; K=7.
-1; 8; 7; -95; 4; -5; 67
-4; -7; 8; 9; 2; -8; -5
2) B= -2; 10; 0; 9; -8; 7; -5 A=10; K=0.
-7; 6; -9; 7; 0; -3; 7
2.3 Поиск в матрице строки с максимальной суммой
Графическая схема алгоритма
Текст программы
/* Строка с максимальной суммой*/
#include <stdio.h>
main()
{
int m,n,nmax,i,j;
float max,s, x[10][10];
puts("Введите m,n");
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ printf("Введите x[%d][%d]=",i,j);
scanf("%f",&x[i][j]);
}
puts("Матрица x:");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
printf("%8.2f",x[i][j]);
printf("\n");
}
s=0; for(j=0; j<n; j++) s =s+x[0][j]; //Нач. знач. мax – сумма элем. 0-ой стр.
max=s; nmax=0;
for(i=0;i<m;i++)
{ s=0;
for(j=0;j<n;j++) s+=x[i][j]; // Сумма элем. строк
if(max<s)
{ max=s; nmax=i;}
}
printf("Максимальная сумма %.2f в строке %d\n",max,nmax);
fflush(stdin); getchar();
return(0);
}
2.4 Пример обработки динамического двумерного массива
Задача. Определить количество строк матрицы, в которых суммы всех элементов отрицательные. Массив объявить как динамический.
Решение.
Таблица соответствия.
Переменные в задаче | Имя на языке Си | Тип | Комментарий |
S | S | float | Сумма элементов i-той строки |
A | A | float | Двумерный динамический массив |
K | K | float | Количество искомых строк |
- | n | int | Количество всех строк в матрице |
- | m | int | Количество столбцов |
- | i | int | Номер строки |
- | j | int | Номер столбца |
/*Пример обработки двумерного динамического массива*/
# include <stdio.h>
# include <math.h>
void main ()
{
int i, j, m, n;
float K, S; //Описание переменных
puts (“ введите n, m”); // Вывод сообщения
scanf (“%d %d”, &n, &m); // Ввод исх.числа строк и столбцов
float**A=new float*[n];
for(i=0; i<n; i++)
A[i]=new float[m];
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf(“Введите A[%d; %d]=”, i, j);
scanf(“%f”, &A[i] [j]);
|
}
K=0;
for(i=0; i<n; i++)
{
S=0;
for(j=0; j<m; j++)
S=S+A[i] [j];
if(S<0) K=K+1;
}
printf(“%f \n”, K);
for(i=0; i<n; i++) //Освобождение динамической памяти
delete[]A[i];
delete[]A;
}
Тесты:
-3 -2 2 6 -3
1) A= 6 7 -1 20 -4 K=2.
-4 -2 -3 6 -1
-4 -2 4 6 4
2) A= 3 5 7 2 0 K=0.
5 0 -2 9 0
2.5 Определение, есть ли в матрице столбец, содержащий хотя бы один нулевой элемент
Решение.
Введем две вспомогательные переменные t и w:
![]() |
Текст программы
#include <stdio.h>
main()
{
int m,n,i,j,t,w;
float x[10][10];
puts("Введите m,n");
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ printf("Введите x[%d][%d]=",i,j);
scanf("%f",&x[i][j]);
}
puts("Матрица x:");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%8.2f",x[i][j]);
printf("\n");
}
t=1; j=0; //Столбец еще не найден
while(j<n && t)
{ w=1; i=0; //В столбце не найден элем., равный нулю
while(i<m && w)
if(x[i][j]==0) w=0;
else i++;
if(w) j++; // В столбце нет равного 0 элем.
else t=0; // В столбце есть равный 0 элем.
}
if(t) printf("Нет\n");
else printf("Есть %d %d\n",i,j);
fflush(stdin); getchar();
return(0);
}
2.5 Обработка элементов квадратных матриц относительно главной и побочной диагоналей
/* "Разминка". Фомирование матрицы */
#include <stdio.h>
main()
{
const m=10;
int i,j,N;
int x[m][m];
/* Обнуление матрицы */
for(i=0;i<m;i++)
for(j=0;j<m;j++)
x[i][j]=0;
puts("Номер варианта?");
scanf("%d",&N);
printf("Вариант %d:\n",N);
switch(N)
{ case 1:{ /* Вариант 1 */
for(i=0;i<m;i++)
for(j=0;j<i+1;j++)
x[i][j]=i-j+1;
break;}
case 2:{ /* Вариант 2 */
for(j=0;j<m;j++)
for(i=j;i<m;i++)
x[i][j]=j+1;
break; }
case 3: { /* Вариант 3 */
for(i=0;i<m;i++)
for(j=i;j<m;j++)
x[i][j]=i+1;
break; }
case 4: { /* Вариант 4 */
for(i=0;i<m;i++)
for(j=i;j<m;j++)
x[i][j]=j-i+1;
break; }
case 5:{ /* Вариант 5 */
for(i=0;i<m;i++)
for(j=0;j<m;j++)
x[i][j]=i+1;
break; }
case 6:{ /* Вариант 6 */
|
for(i=0;i<m;i++)
for(j=i;j<m;j++)
if (i==j) x[i][j]=1;
else x[i][j]=2;
break; }
case 7:{ /* Вариант 7 */
for(i=0;i<m;i++)
for(j=0;j<i+1;j++)
x[i][j]=1;
break; }
case 8:{ /* Вариант 8 */
for(i=0;i<m;i++)
for(j=0;j<i+1;j++)
x[i][j]=(i-j+1)*(i-j+1);
break; }
case 9:{ /* Вариант 9 */
for(j=0;j<m;j++)
for(i=j;i<m;i++)
x[i][j]=(j+1)*(j+1);
break; }
case 10:{ /* Вариант 10 */
for(j=0;j<m;j++)
for(i=0;i<m;i++)
if((i+j)%2==0) x[i][j]=1;
else x[i][j]=0;
break; }
case 11:{ /* Вариант 11 */
for(i=0;i<m;i++)
for(j=m-i-1;j<m;j++)
x[i][j]=1;
break; }
case 12:{ /* Вариант 12 */
for(i=0;i<m;i++)
for(j=0;j<m;j++)
x[i][j]=(i+1)*(i+1);
break; }
case 13:{ /* Вариант 13 */
for(i=0;i<m;i++)
for(j=m-i-1;j<m;j++)
if (i+j==m-1) x[i][j]=1;
else x[i][j]=2;
break; }
case 14:{ /* Вариант 14 */
for(i=0;i<m;i++)
for(j=i;j<m;j++)
x[i][j]=(j-i+1)*(j-i+1);
break;}
} // Вывод матрицы
for(i=0;i<m;i++)
{ for(j=0;j<m;j++)
printf("%4d",x[i][j]);
printf("\n");
}
fflush(stdin); getchar();
return(0);
}