Не работает заполнение массива ГСЧ

221
26 ноября 2021, 19:20

Есть очень интересная задача. Нужно заполнить двумерный массив MxN случайными числами в диапазоне [-5; 10] с помощью ГСЧ, а потом посчитать среднее арифметическое чисел, которые входят в диапазон [5; 15]. Не могу понять, почему не работает заполнение чисел. Также не могу понять, как проверять диапазон чисел, которые будут сгенерированы. Очень нужна помощь.

    #include <iostream>
    #include <math.h>
    #include <time.h>
    using namespace std;
    int main() {
    const int m1 = 5;
    const int n1 = 5;
    int f[m1][n1];
    srand(time(NULL));
    for(int i3 = 0; i3 < 5; i3++){
        f[m1][n1] = -8 + rand() % 8;
        cout << f[i3] << " " << endl;
    }
    system("pause");
}
Answer 1

Куда вы пишете случайные числа?

 f[m1][n1] = -8 + rand() % 8;

Все время в одно и то же место, причем за пределами выделенного массива.

    cout << f[i3] << " " << endl;

А выводить пытаетесь просто адреса строк вашего массива...

Входит ли n в диапазон [a,b] проверяется просто -

if (n >= a && n <= b) ...
Answer 2

Сама программа:

#include <iostream>
#include <ctime>
using namespace std;
int main(){
    srand(time(NULL));
    const int m1 = 5;
    const int n1 = 5;
    int f[m1][n1], count_of_numbers = 0;
    float sum = 0;
    for(int i = 0; i < m1; ++i) {
        for (int j = 0; j < n1; ++j){
           f[i][j] =  -5 + rand() % 16;
           cout << f[i][j] << " ";
           if (f[i][j] >= 5 && f[i][j] <= 15){
               sum += f[i][j];
               ++count_of_numbers;
           }
        }
        cout << '\n';
    }
    cout << "\nFinal result = " << sum/count_of_numbers;
    system("pause");
}

1) Убираем библиотеку math.h - она не понадобиться.

2) В 9 строке вместе с объявлением массива f, объявляем переменную _count_of_numbers_ типа int для подсчёта количества элементов среднеарифметического чисел.

int f[m1][n1], count_of_numbers = 0;

3) В 10 строке объявляем переменную sum типа float для подсчёта суммы элементов среднеарифметического чисел.

float sum = 0;

4) Начиная с 11 строки начинается вложенный цикл, необходимый для инициализации элементов массива f. Переменная i необходима для перехода по строкам двумерного массива, а переменная j для перехода по столбцам этого же массива.

5) Немного про rand(). Изначально функция rand() генерирует случайное число в диапазоне от 0 до 32767. После записи rand() % n минимальное возможное число это 0, максимальное n-1 (% это взятие остатка от деления, поэтому максимальное число это n-1). Финальный вариант для генерирования случайных строк выглядит так:

f[i][j] =  -5 + rand() % 16;

Минимальное число после rand() % 16 это 0, поэтому минимальное число после -5 + rand() % 16 это -5. Максимальное число после rand() % 16 это 15, поэтому максимальное число после -5 + rand() % 16 это 10.

6) В 15 строке в поле if после присваивания элементу матрицы случайной величины происходит проверка на вхождение в заданный диапазон:

if (f[i][j] >= 5 && f[i][j] <= 15)

Если элемент массива f[i][j] не меньше 5 f[i][j] >= 5 и (&& - логическое и) элемент массива не больше 15 f[i][j] <= 15, то увеличивается сумма чисел подходящих под данное условие:

sum += f[i][j];

данное выражение можно переписать:

sum = sum + f[i][j];

и увеличивается кол-во таких чисел:

++count_of_numbers;

данное выражение также можно переписать:

count_of_numbers = count_of_numbers + 1;

7) в 22 строке происходит вывод среднеарифметического чисел. Среднеарифметическое чисел это сумма чисел делённое на их количество, поэтому на вывод подаётся выражение:

cout << "\nFinal result = " << sum/count_of_numbers;
Answer 3

Вы таки на C++ пишите или на C? Если на C++, то распределение ваших чисел задаётся одной строчкой std::uniform_int_distribution(5,15). Для заполнения тоже ровно 1 строчка std::generate(matrix.begin(),matrix.end(),generator). Далее стандартный filter+fold, в рамках C++ - std::copy_if + std::accumulate

READ ALSO
Как создать QGridLayout в ячейках QTableView?

Как создать QGridLayout в ячейках QTableView?

Как программно создать в ячейках таблицы QTableView сетку QGridLayout, в которой размещены лейблы QLable?

93
Как обойти баг в MS Visual Studio 2017?

Как обойти баг в MS Visual Studio 2017?

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

161
drag and drop библиотека formstone upload

drag and drop библиотека formstone upload

Делаю на сайте загрузку путем перетаскивания, но столкнулся с проблемойСкрипт отрабатывает нормально, файлы загружаются как надо

100