C ++ Поиск режима с данными из текстового файла, хранящегося в массиве Dynami c - PullRequest
0 голосов
/ 09 февраля 2020

У меня проблемы с завершением этой функции, которая находит режим из списка целых. Я должен использовать указатели в качестве массивов и обозначения указателя "* (arr + 1)", например, вместо arr [1]. Мой инструктор предоставляет псевдокод, объясняющий процесс написания функции, но у меня возникают проблемы с пониманием определенных частей. (извините, если этот пост плохо отформатирован, это мой первый пост)

Полная программа делает пару других вещей, но мне уже удалось завершить sh эти функции без проблем

Псевдокод имеет следующий вид:

int* calculateMode(int* movies, int size, int& numModes)

сортировка фильмов в порядке возрастания

создание динамического c массива целых чисел, называемых режимами размера size

назначить первый int в фильмах на текущий

установить счетчик на 1

установить numModes на 1

установить modePos на 0

установить maxCount на 1

установить первый элемент в режимах на текущий

для i = 1 на размер

, если * (movies + i) == текущий // такой же, как текущий (предыдущий мы смотрели at)

инкрементный счетчик

если counter> maxCount // это означает, что у нас есть новый modePos

сбросить режимы // необходимо очистить все старые режимы в массивах, рассмотрим std :: fill_n (mode, size, -1)

установить modePos на 0 // начать с начала массива для режимов

* 10 37 * установить первый элемент в режимах на текущий // назначить наш новый режим на начало массива

установить maxCounter на счетчик

установить numModes на 1

иначе, если счетчик == maxCount // получил другой режим

increment modePos // получил позицию для следующего режима

назначил ток для следующего modePos в режимах

increment numModes

иначе // у нас есть новый текущий

назначить значение фильмов для текущего и счетчика 1

если counter == maxCount // если все значения представлены один раз, то все они являются режимами

приращение modePos

назначение тока режимам и modePos

увеличение numModes

режим возврата

Окончательный вывод должен быть (со всеми остальные функции):

Общее количество студентов, которые смотрели фильмы, составляет 28 Среднее число фильмов, просмотренных всеми студентами, составляет 27,46. Среднее число фильмов, просмотренных всеми студентами, составляет 28,00. Режим количества фильмов смотрел всем учащимся 47, 16 Нажмите любую клавишу для продолжения

Текстовый файл (где первая цифра «28» - это количество чисел в файле):

28

14

16

19

6

9

47

43

28

35

16

30

6

47

12

14

47

41

16

44

22 * ​​1116 *

20

31

45

34

31

44

4

8

Вот моя попытка

int* calculateMode(int* movies, int size, int& numModes)
{

    sort(movies, movies + size);    //sorted movies array

    int* modes = new int[size]; //dynamic array of modes

    int current = *(movies + 0);    //the current mode (start on first number in array

    int counter = 1;    //how many of the same number there are

    numModes = 1;   //number of modes, the minimum always being 1

    int modePos = 0;    //position of the mode, 0 being the first number in array

    int maxCount = 1;   

    *(modes + 0) = current;

    for (int i = 1; i < size; i++)
    {
        if (*(movies + i) == current)   //same as current
        {
            counter++;
            if (counter > maxCount) //new modePos
            {
                std::fill_n(modes, size, -1);   //clear modes
                modePos = 0;    //start back at beginning of the array for modes
                *(modes + 0) = current;
                maxCount = counter;
                numModes = 1;
            }
            else if (counter == maxCount) //got another mode
            {
                modePos++;  //get position for the next mode
                current = modePos;
                numModes++;
            }
        }
        else   //if we have new current
        {
            current = *(movies + i);
            counter = 1;
            if (counter == maxCount)    //if all values are represented once they are all modes
            {
                modePos++;
                current = modePos;
                numModes++;
            }
        }
    }   //end of for loop

    return modes;
}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Вы можете индексировать массив указателей, поэтому нет необходимости перебирать его, увеличивая первый адрес памяти. Если вы все еще хотите сделать это sh, OP2 для вас.

int calculateMode(int* movies, int size) {
    std::sort(movies, movies + size);
    /* OPT 1 */
    int number = movies[0], mode = movies[0], counter = 1, numModes = 1;
    for (int i = 1; i < size; i++) {
        if (movies[i] == number) {
            counter++;
        } else {
            if (counter > numModes)
            {
                numModes = counter;
                mode = number;
            }
            counter = 1;
            number = movies[i];
        }
    }
    /* OPT 2 */
    number = *movies, mode = *movies, counter = 1, numModes = 1;
    for (int i = 1; i < size; i++) {
        if (*(movies + i) == number) {
            counter++;
        }
        else {
            if (counter > numModes)
            {
                numModes = counter;
                mode = number;
            }
            counter = 1;
            number = *(movies + i);
        }
    }
    return mode;
}
0 голосов
/ 09 февраля 2020

Вот ответ, мне удалось заставить его работать

int* calculateMode(int* movies, int size, int& numModes)
{
    sort(movies, movies + size);    //sorted movies array
    int* modes = new int[size]; //dynamic array of modes
    int current = *(movies + 0);    //the current mode (start on first number in array
    int counter = 1;    //how many of the same number there are
    numModes = 1;   //number of modes, the minimum always being 1
    int modePos = 0;    //position of the mode, 0 being the first number in array
    int maxCount = 1;



*(modes + 0) = current;

for (int i = 1; i < size; i++)
{
    if (*(movies + i) == current)   //same as current
    {
        counter++;
        if (counter > maxCount) //new modePos
        {
            std::fill_n(modes, size, -1);   //clear modes
            modePos = 0;    //start back at beginning of the array for modes
            *(modes + 0) = current;
            maxCount = counter;
            numModes = 1;
        }
        else if (counter == maxCount) //got another mode
        {
            modePos++;  //get position for the next mode
            *(modes + modePos) = current; //here is where i made the change
            numModes++;
        }
    }
    else   //if we have new current
    {
        current = *(movies + i);
        counter = 1;
        if (counter == maxCount)    //if all values are represented once they are all modes
        {
            modePos++;
            *(modes + modePos) = current;    //here is where i made the change
            numModes++;
        }
    }
}   //end of for loop

return modes;
}
...