Есть ли способ случайным образом добавить или вычесть два или более конкретных чисел в массив значений? - PullRequest
0 голосов
/ 06 мая 2019

Я должен создать функцию, которая принимает целочисленный массив в качестве входных данных, а затем случайным образом изменить каждое значение в массиве либо на -38, либо на 55, в частности. Однако я не уверен, как выбрать случайным образом, будет ли число вычитаться на -38 или добавлено на 55, и как это сделать.

Я попытался сделать оператор if внутри своей функции, заявив, что если функция четная (array [i]% 2), то вычесть на -38, а если число нечетное (оператор else), добавить на 55. Хотя это может сработать, это неправильный способ ответить на этот вопрос, потому что, если бы я хотел добавить четное число на 55? Или наоборот с нечетным числом с вычитанием 38?

#include <iostream>
using namespace std;
#include <time.h>
#include <cstdlib>

int output(int array[]){

    for(int i = 0; i<5; i++){
      cout << array[i] << " ";
    }

}

int offset(int array[]){

  for (int j = 0; j < 5; j++) {
  int myrand = rand();
  if (myrand % 2 == 0){
  array[j] = array[j] - 38;
  }
  else{
  array[j] = array[j] + 55;
  }
  }


}

int main()
{
  srand(time(NULL));
   int array[5] = {1, 2, 3, 4, 5};
   cout << "Original: ";
   output(array);
   offset(array);

    return 0;
}


Если значение в массиве равно 5, оно может иметь значение 10 или 0 и т. Д. С любыми числами.

1 Ответ

0 голосов
/ 06 мая 2019

Давайте начнем, а затем вы можете идти оттуда.Приступая к изучению любого языка программирования (или любого другого языка в этом отношении), вы начинаете с большого количества того, что составляет язык, каковы слова и каковы правила их объединения.Для языка программирования это его "синтаксис".У каждого языка есть свой.Вы начинаете изучать синтаксис с минимальными примерами, которые используют базовые типы и прогрессируют оттуда.

Используя скомпилированный язык, вы добавляете к этому, как вы переводите коллекцию правильного синтаксиса в файле в машинучитаемый исполняемый файл.Как вы компилируете исходный код в исполняемый файл.

На данный момент самое важное, что вы можете сделать, это подружиться с вашим компилятором и послушать, что он говорит вам.Вы делаете это наиболее эффективно, включив предупреждения компилятора, чтобы ваш компилятор указывал вам строку (и во многих случаях символ в строке), которая вызывает беспокойство.Правило

«Всегда компилировать с включенными предупреждениями , а не принимать код до тех пор, пока не скомпилируется без предупреждения ».

Чтобы включить предупреждения, добавьте -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 значений в ваш массив, чтобы иметь возможность сделать любой вывод о распределении. Пяти значений на самом деле недостаточно для четкого сравнения.

Дайте мне знать, если у вас есть дальнейшие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...