Ответ на 1) Как объявить массив, если вы не знаете заранее количество элементов, неразрешимо с примитивными векторами, вам придется создать свой собственный вектор, способный к росту.
typedef struct {
double * v;
unsigned int size;
} Vector;
Эта структура является основой нового типа данных.Вам понадобится API, например:
Vector createVector();
void addToVector(Vector *v, double x);
double getFromVector(Vector *v, unsigned int pos);
void modifyInVector(Vector *v, unsigned int pos, double x);
unsigned int sizeOfVector(Vector * v);
void destroyVector(Vector *v);
Ключевыми элементами API являются createVector, destroyVector и addToVector.Так как это, вероятно, домашнее задание, я не буду решать это для вас.
В createVector вы должны в основном установить все поля в 0. В destroyVector вы должны free () v;В addToVector вам придется изменить размер () зарезервированного пространства, чтобы уместился еще один новый элемент:
size_t newSize = ( v->size +1 ) * sizeof( double );
Теперь вам нужно вызвать realloc () с новым размером.
И этов основном все.Если вам нужна более высокая производительность, вы можете ввести емкость вектора, чтобы вам не приходилось увеличивать его при каждом добавлении нового значения.Например, люди, которые создавали STL в C ++, увеличивают векторный класс до его удвоения при каждом превышении емкости.Но, в любом случае, это другая история.