First letter in fio is И
Функции:
init — инициализация
add — добавить элемент в конец массива, если выделенной памяти не достаточно, происходит перевыделение памяти с перемещением данных в новое место
getat — получить значение элемента с указанным индексом
setat — установить значение элемента з указанным индексом (индекс должен быть меньше верхней границы)
dispose — уничтожить массив
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
struct doublearray
{
double *data; // указатель на данные
int size, topsize, step;
// size — текущее количество эл-ов, topsize — максимальное кол-во эл-ов
// step — шаг роста
};
int init(doublearray*array, int initsize) //
{
array->topsize = array->step = initsize; //шаг роста совпадает с //верхней границей
array->size=0;
array->data=(double*)malloc(initsize*sizeof(double));
return array->data!=NULL;
}
int add(doublearray *array, double value)
{
array->size++;
if (array->size > array->topsize) //если памяти не достаточно
{
// перевыделяем память
double *data2=(double*)malloc((array->topsize+array->step)*sizeof(double));
if (data2==NULL) return -1; // возвращаем -1 как признак //ошибки
// копируем уже существующие элементы на новое место
|
|
memcpy(data2,array->data,array->topsize*sizeof(double));
array->topsize += array->step;
// освобождаем прошлое место
free(array->data);
// переприсваиваем указатели
array->data=data2;
}
array->data[array->size-1] = value;
return 0;
}
void dispose(doublearray*array)
{
free(array->data);
array->size = array->topsize = 0;
}
double getat(doublearray*array,int id) {return id>0&&id<array->size? array->data[id]:0;}
void setat(doublearray*array, int id, double value)
{
if (id<0 || id>=array->size) return;
array->data[array->id] = value;
}
int main()
{
// пример применения
doublearray array;
init(&array,10);
for(int i=0;i<100;i++)
{add(&array,i);}
for(int i=0;i<100;i++)
printf("%lf", getat(&array,i));
dispose(&array);
}
Этот же пример на С++ с использованием классов
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
class doublearray
{
private:
double *data; // указатель на данные
int size, topsize;
// size — текущее количество эл-ов, topsize — максимальное кол-во эл-ов
public:
int step; //шаг роста
//конструктор
doublearray(int initsize = 128) //аргумент со значением по умолчанию
{
topsize = step = initsize; //шаг роста совпадает с верхней границей
size=0;
data = new double[topsize];
}
bool add(double value)
{
size++;
if (size > topsize) //если памяти не достаточно
{
double *data2 = new double[topsize+step]; // перевыделяем память
if (data2==NULL) return false;
// копируем уже существующие элементы на новое место
memcpy(data2, data, topsize*sizeof(double));
topsize += step;
// освобождаем прошлое место
delete []data;
// переприсваиваем указатели
data=data2;
}
data[size-1] = value;
return true;
}
// деструктор
~doublearray()
{
delete []data;
}
inline double getat(int id) {return id>0&&id<size? data[id]:0;}
inline void setat(int id, double value)
{
if (id<0 || id>=size) return;
array->data[array->id] = value;
}
};
int main()
{
// пример применения
voidarray array;
// конструктор вызывается автоматически со значением по умолчанию
for(int i=0;i<100;i++)
{array.add(i);}
for(int i=0;i<100;i++)
printf("%lf", array->getat(i));
} // здесь вызывается деструктор