Пример организации массива вещественных чисел

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));

} // здесь вызывается деструктор



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: