Освобождение выделенной динамической памяти.




Динамическая память освобождается с помощью операции 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);

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: