Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Динамические объекты




End if

Next

End if

redim sled(1 to len1)

for i=1 to len1

sled(i)= false

i=1: fl1= true

do while i<=len1 and fl1

j=1: fl2= true

do while j<=len2 and fl2

if not sled(j) and _

mid(str1, i, 1)= _

mid(str2, j, 1) then

sled(j)= true: fl2= false

j=j+1

loop

if fl2 then fl1= false

i=i+1

loop

anagr=fl1

end function
short anagr(char * str1, char * str2){

short len1,

len2,

i, j,

fl1=1,// 1 - анаграмма, 0 - нет

fl2, // 1 - символ в str2 найден,

// 0 - нет

sled[20]; /* 1 - j-й символ в str2

использован, 0 – нет */

len1=strlen(str1); len2=strlen(str2);

if(len1!= len2) return 0;

for (i=0; i<len2; i++)sled[ i ]=0;

for (i=0; i<len1 && fl1; i++){

fl2=1;

for (j=0; j<len2 && fl2; j++){

if (!sled[ j ] && str1[ i ]==str2[ j ]){

sled[ j ]=1;

fl2=0;

}

}

if(fl2)fl1=0;

}

return fl1;

}


До сих пор для всех объектов, рассматриваемых в пособии, память выделялась по информации программы автоматически. Для объектов класса памяти static и extern во время трансляции в статической области, для объектов класса памяти auto и register динамически (во время выполнения) в области, называемой программным стеком. Однако, в языке C, как и во многих других языках программирования, имеется возможность выделять память под программные объекты прямым указанием программиста. Такие объекты располагаются в отдельной области – куче (heap). Их принято называть динамическими.

Для этих целей в библиотеки языка C включены функции malloc, calloc и free. Их прототипы хранятся в файле alloc.h.

Выделение памяти.

void* malloc (unsigned size); // Размер в байтах

void* calloc (unsigned kol, // Число элементов

unsigned size); // Размер в байтах

Освобождение памяти: void free (void *ptr);

Если памяти не хватает, то функции возвращают значение NULL. Освободить память в куче можно только функцией free.

Как видно из прототипов, объекты в этой области имен не имеют и работа с ними выполняются исключительно с помощью указателей. Часто говорят, что куча - это неименованная область памяти. Для того, чтобы сделать программу независимой от компьютера и операционной системы, при выделении памяти используют оператор sizeof (<тип>).

Пример.

sizeof ( short ) à 2 байта

sizeof (DATA) à размер определяется по инструкции typedef.

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

Пример. Динамическое выделение памяти под массив заданного размера n. p=(char*) malloc (n* sizeof (char)); p=(char *)calloc(n, sizeof (char));

Примеры. Манипуляции с массивом произвольного размера.

float *ptr, buf;

short i, n;

........................................

printf("Длина массива:");

scanf("%d", &n);

/* Выделить память под массив */

ptr=( float *)calloc(n, sizeof (float));

/* Ввести массив */

printf("Исходный массив\n");

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

scanf("%f", &buf); *(ptr + i) = buf; /* ptr[ i ] = buf; */

}

.................................

free(ptr);

2. Функция substr – аналог функции mid языка Basic.

#include <string.h>

#include <alloc.h>

/* Выделить из строки s подстроку длиной length с позиции begin */

/* Если length == 0, выделяется подстрока с begin до конца s */

char* substr(const char * s, short begin, short length){

char* p; / Подстрока */

short i;

if (length == 0) length = strlen(s) – begin + 1; // До конца строки s

/* Обработка ошибки */

if(begin < 1 || length < 1 || begin + length – 1 > strlen(s)) return NULL;

p=(char*)calloc(length + 1, sizeof (char));

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

*(p + i) = *(s + begin + i - 1);

}

*(p + i) = '\0';

return p;

} /* End substr */

Замечание. В функции память выделяется, но не освобождается, поэтому после того, как необходимость в выделенной памяти отпадет, ее следует освободить функцией free(p).




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 248; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.