Давайте начнем, а затем вы можете идти оттуда.Приступая к изучению любого языка программирования (или любого другого языка в этом отношении), вы начинаете с большого количества того, что составляет язык, каковы слова и каковы правила их объединения.Для языка программирования это его "синтаксис".У каждого языка есть свой.Вы начинаете изучать синтаксис с минимальными примерами, которые используют базовые типы и прогрессируют оттуда.
Используя скомпилированный язык, вы добавляете к этому, как вы переводите коллекцию правильного синтаксиса в файле в машинучитаемый исполняемый файл.Как вы компилируете исходный код в исполняемый файл.
На данный момент самое важное, что вы можете сделать, это подружиться с вашим компилятором и послушать, что он говорит вам.Вы делаете это наиболее эффективно, включив предупреждения компилятора, чтобы ваш компилятор указывал вам строку (и во многих случаях символ в строке), которая вызывает беспокойство.Правило
«Всегда компилировать с включенными предупреждениями , а не принимать код до тех пор, пока не скомпилируется без предупреждения ».
Чтобы включить предупреждения, добавьте -Wall -Wextra -pedantic
в строку компиляции gcc/clang
.Для VS (cl.exe
в Windows) используйте /W3
.Всегда можно добавить дополнительные предупреждения, но это обеспечит полный набор, который, если вы будете следовать правилу, сэкономит вам часы отладки.
С учетом этого в качестве фона давайте посмотрим, что вы пытаетесь сделать,Во-первых, вы отметили свой вопрос как C ++.Я предоставил вам в комментарии выше место для начала, чтобы определить, какие основные заголовочные файлы были необходимы в предложенном вами коде. Заголовки стандартной библиотеки C ++ .При проверке вы обнаружите, что C ++ обеспечивает реализацию time.h
в качестве заголовка ctime
(все стандартные заголовки C обычно называются c......
).Итак, здесь, основываясь на том, что вы включили в свой код, вам потребуется, как минимум,
#include <iostream>
#include <cstdlib>
#include <ctime>
. Хотя вы можете использовать 5
в своем коде, вы хотите избежать жесткого кодирования чисел (если не требуетсяиспользуемой стандартной библиотечной функцией, такой как модификатор C scanf
field-width , который не допускает именованную константу или переменную в этом случае).Жесткое кодирование чисел вызывается с использованием magic-numbers и его лучше избегать.
Когда вы объявляете и инициализируете массив, вы можете объявить массив с пустым []
(что обычнобыть неполным типом), но благодаря предоставлению инициализатора в скобках компилятор использует количество элементов, предоставленных для определения размера массива во время компиляции.Затем вы можете определить количество элементов в массиве, разделив sizeof array
на sizeof (an_element)
.Вы можете просто разыменовать массив, чтобы получить первый элемент, поэтому вы увидите, что он записан следующим образом:
int main (void) {
int array[] = {1, 2, 3, 4, 5};
int nelem = sizeof array / sizeof *array; /* number of elements */
...
Теперь при передаче массивов базового типа в функцию также необходимо передать число элементов.также.Зачем?Когда массив передается в качестве параметра (фактически при любом доступе, с ограниченными исключениями), массив преобразуется в указатель на первый элемент.Если вы попытаетесь использовать sizeof array / sizeof (an_element)
внутри функции после передачи массива в качестве параметра, вы получите sizeof (a_pointer) / sizeof (an_element)
, что, безусловно, не сработает.
Так, например, в вашем output()
функция, чтобы передать количество элементов вместе с массивом, вам понадобится:
void output (int array[], int nelem)
{
for (int i = 0; i < nelem; i++) {
cout << array[i] << " ";
}
cout << '\n';
}
То же самое относится и к вашей offset()
функции:
void offset (int array[], int nelem)
{
for (int j = 0; j < nelem; j++) {
int myrand = rand();
if (myrand % 2 == 0) {
array[j] = array[j] - 38;
}
else{
array[j] = array[j] + 55;
}
}
}
( примечание: возврат type
для каждой функции был изменен на void
вместо int
. Ни одна из функций не должна указывать на успех / неудачу, и ни одна из них не возвращает значение, которое используется ввызывающая функция, main()
здесь. В каждом случае вы просто печатаете элементы массива или обновляете их значения на месте.)
Остальная часть вашей первой попытки - просто вывести массив передприменяя смещение, а затем снова после.Ваш main()
может быть:
int main (void) {
int array[] = {1, 2, 3, 4, 5};
int nelem = sizeof array / sizeof *array; /* number of elements */
srand (time(NULL)); /* seed random number generator */
cout << "Original: "; /* output original array */
output (array, nelem);
offset (array, nelem); /* apply offset to array */
cout << "Updated : "; /* output original array */
output (array, nelem);
return 0;
}
Если вы соберете все части вместе и скомпилируете с включенными предупреждениями, ваш код скомпилируется без предупреждения и создаст рабочий исполняемый файл.
Пример использования / Вывод
$ ./bin/randaddtoarray
Original: 1 2 3 4 5
Updated : 56 57 58 -34 -33
Если вы запустите его несколько раз, вы, вероятно, увидите, что у вас не всегда есть четное число нечетных или четных случайных чисел. Такова природа случайных чисел.
Как уже упоминалось в комментариях, существует много способов приблизиться к разработке случайной схемы для применения вашего -38
или +55
. Потратьте некоторое время и исследуйте различные методы, попробуйте их реализовать и посмотрите, как изменятся ваши результаты. Вы, вероятно, захотите добавить более 5 значений в ваш массив, чтобы иметь возможность сделать любой вывод о распределении. Пяти значений на самом деле недостаточно для четкого сравнения.
Дайте мне знать, если у вас есть дальнейшие проблемы.