Динамическое размещенея данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Динамическое размещенея данных



В языке Си есть операция, с помощью которой можно определить размер участка памяти в байтах, который компилятор отводит под массив после его объявления, это операция sizeof. Формат записи:

sizeof (параметр);

параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof позволяет определить размер объекта по имени или типу, результатом является размер памяти в байтах (тип результата int).

Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:

sizeof(int) -> 2 байта,

int b[5]; sizeof(b) -> 10 байт;

int c[3][4]; sizeof(c) -> 24 байта.

Операция sizeof применяется при динамическом распределении памяти:

float *x; // Указатель массива

int n; // Количество элементов массива

x=(float*)calloc(n,sizeof(float)); // Захват и очистка памяти

Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:

void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;

void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;

void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;

void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;

coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).

 

Приведем пример динамического размещения одномерного массива

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<alloc.h>

void main(void)

{ int i,n; float *a;

puts(“\n Input n:”); scanf(“%d”,&n);

printf(“\n Свободная память -%d”,coreleft());

a=(float *)calloc(n,sizeof(float)); // захват памяти

printf(“\n Array a \n”);

for(i=0; i<n; i++) {

*(a+i)=(float)random(10); // диапазон от 0 до 10

printf(“ %d“, a[i]);

}

printf(“\n Память после захвата -%d”,coreleft());

free(a); // освобождение памяти

getch(); }

 

Пример динамического размещения двумерного массива

...

void main(void)

{ int i,j,n,m; float **a;

puts(“\n Input n,m:”); scanf(“%d %d”,&n,%m);

printf(“\n Свободная память -%d”,coreleft());

a=(float **)calloc(n,sizeof(float*)); // захват памяти

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

a[i]=(float *)calloc(m,sizeof(float));

...

printf(“\n Память после захвата -%d”,coreleft());

for(i=0; i<n; i++) free(a[i]); // освобождение памяти

free(a);

getch(); }

 

Варианты индивидуальных заданий

11. Даны натуральное N и квадратная вещественная матрица А. Вычислить K-ю степень этой матрицы: А1=А, А2=А·А, А32·А, А43·А, А54·А и т.д.

 

12. Дана вещественная матрица размером N x M. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.

 

13. Дана вещественная матрица размером N x M. Упорядочить ее строки по неубыванию наибольших элементов в строках матрицы.

 

14. Задан массив размером N x N, состоящий из 0 и 1. Повернуть элементы массива на 900 по часовой стрелке.

 

15. Элемент матрицы назовем седловой точкой, если он наименьший в своей строке и наибольший (одновременно) в своем столбце (или наоборот, наибольший в своей строке и наименьший в своем столбце). Для заданной целой матрицы размером N x M напечатать индексы всех ее седловых точек.

 

16. Дана вещественная матрица размером N, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.

 

17. Определить, является ли заданная целая квадратная матрица размером N ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.

 

18. Определить, является ли заданная матрица N-го порядка магическим квадратом, т.е. такой, в которой сумма элементов во всех строках и столбцах одинакова.

 

19. Дана матрица размером N. Найти сумму наименьших элементов ее нечетных строк и наибольших элементов ее четных строк.

 

20. Дана действительная квадратная матрица порядка N. Рассмотрим те элементы, которые расположены в строках, начинающихся с отрицательного элемента. Найти сумму тех из них, которые расположены соответственно ниже, выше и на главной диагонали матрицы.

 

21. Дана вещественная квадратная матрица порядка N. Получить целочислен­ную квадратную матрицу того же порядка, в которой элемент равен 1, если соответствующий ему элемент исходной матрицы больше элемента, расположенного на главной диагонали, и равен 0 в противном случае.

 

22. Получить целочисленную квадратную матрицу порядка N, элементами которой являются числа 1, 2, 3, …, расположенные в ней по спирали:

 
 

23. Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n x n:

 

 

 

а) б)

 

24. Дана действительная квадратная матрица порядка n. Найти наименьшее из значений элементов, расположенных в заштрихованной части матрицы.

 
 

 


 

 

25. Заданы два массива А(N) и В(M). Подсчитать в них количество элементов, меньших значения t, и первым на печать вывести массив, имеющий наибольшее их количество.

 

26. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые больше 0.

 

27. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые меньше 0.

 

28. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые кратны двум.

 

29. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые больше значения T.

Контрольные вопросы

1. Укажите способы декларирования двумерных массивов.

2. Формы (способы) работы с элементами двумерного массива.

3. Что такое указатель?

 

 

ЛАБОРАТОРНАЯ РАБОТА №5

Функции пользователя

Цель работы:

Познакомиться с механизмом составления и организации взаимодействия пользовательских функций языка С.



Поделиться:


Последнее изменение этой страницы: 2016-04-23; просмотров: 549; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.108.168 (0.016 с.)