const int arraySize = 5;
// does an arraySize have to be const always? is it so it doesnt channge after the array has been created?
C ++ в основном поддерживает два вида массивов: массивы фиксированного размера, которые объявлены как type name[size]
, и динамические массивы, которые выделяются с помощью new[]
.
Для массива фиксированного размера вы должны предоставить их размер компилятору, чтобы он мог выделить достаточно памяти для массива. Поскольку размер должен быть известен компилятору, вы можете указать его только с помощью переменной const
или литерала.
Хотя можно создавать динамически размещаемые массивы самостоятельно, вызывая new[]
, это доставит вам некоторые неудобства при правильном управлении памятью. Лучше использовать существующие классы, которые делают это для вас, например std::vector
.
//double decimals[arraySize];
/*
this array is being created in the function averageN() but why?
cant i just create it up top and reference it in?
*/
Вы можете создать его здесь, но это даст любому доступ к массиву. Для такой маленькой программы, как эта, это не большая проблема, но учтите, что есть еще дюжина других файлов, которые также могут обращаться к массиву и изменять его в неожиданные моменты.
По сути, это тот же вопрос, что и то, почему вы не делаете все классы и члены общедоступными в Java: чтобы ограничить доступ к ним.
// why do you have to write the name of the function up here before you even create it?
double averageN();
Вы должны объявить функцию, прежде чем сможете ее использовать. В C ++ требуется, чтобы все используемые вами имена были объявлены компилятору до их первого использования, и компилятор будет читать файл в последовательном порядке сверху вниз.
Обратите внимание, что это объявление не соответствует определению функции, которое вы дадите ниже. Поскольку C ++ поддерживает перегрузку функций, эти две функции считаются разными функциями, поскольку они принимают разные параметры (без указателя)
int main()
{
averageN();
return 0;
}
// why does the array have to be created here?
double averageN(double decimals[arraySize])
{
Это не создает массив. Вместо этого он указывает, что функция ожидает вызова с аргументом указателя (arraySize
полностью игнорируется, и вы не можете передать массив функции в C ++, поэтому параметр настроен на чтение double *decimals
).
Чтобы получить работающую программу, вам нужно изменить две строки выше на
double averageN()
{
double decimals[arraySize];
double average;
double arrayTotal;
И average
, и arrayTotal
не инициализированы. Это означает, что они начнут с неизвестного значения.
Для average
это не проблема, потому что первое, что вы делаете с ним, это назначаете новое значение. Но для arrayTotal
вы добавляете значения к нему, поэтому вы должны позволить ему начинаться с известного значения.
for (int i = 0; i<5;i++)
{
// fills with random numbers from 0 - 10
decimals[i] = (0+(rand()%10));
}
// find the total of all the elements in the array
for (int i = 0; i < arraySize;i++)
{
double currentElement = decimals[i];
arrayTotal = (currentElement+arrayTotal);
//arrayTotal +=decimals[i]) ;
}
// return the average
average = (arrayTotal/arraySize);
return 0.0;
}