C++ Проблема с if во внутреннем цикле

80
01 ноября 2021, 07:30

Через считалку в строке выбираются люди в одномерном массиве и заносятся в очередь. До этого всё работало через остаток от целочисленного деления,но для вариативности считалки нужно заменить на if. Но оно, естественно,не работает,т.к. по условию переменная определяется как 0 и оно 5 раз выводит 0 позицию одномерного массива,т.е. 1.

Подскажите,как можно адекватно втулить во внутренний цикл if,чтобы оно работало?

#include <iostream>
#include <sstream>
#include <string>
#include <Windows.h>
#include <queue>
using namespace std;
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::string sch("Эни, бени, рики, таки, Турба, урба, синтибряки, Эус, бэус, краснобэус, Бац!");
    std::cout << "Считалочка: " << sch << endl;
    queue <int> q;
    int n, j, i;
    int people[5];
    people[0] = 1;
    people[1] = 2;
    people[2] = 3;
    people[3] = 4;
    people[4] = 5;
    cout << "Нумерация людей: ";
    for (i = 0; i < 5; i++)
    {
        printf("%2d", people[i]);
    }
    cout << endl;
    std::istringstream ss(sch);
    std::string s;

     n = 0, i = -1;
    while (ss >> s) ++n;
    for (j = 0; j < 5; ++j) 
    {
        i += n;
        if (i > 4)
            i = 0; 
        cout << "Выбывший №:" << people[i] << endl; 
        cout << people[i] << endl;
        q.push(people[i]);
    }
    cout << endl;
    cout << "Очередь: ";
    while (!q.empty())
    {
        people[i] = q.front();
        q.pop();
        cout << people[i] << " ";
    }
    cout << endl;
    return 0;
}

Чтобы посмотреть какой должен быть результат: Просто заменить весь if на i %= 5;

Answer 1

У вас вообще ерунда - смотрите: номер i у вас может выбыть, но он при этом у вас не выбывает из списка. Получается ерунда.

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

queue<int> make_queue(unsigned int count, unsigned int n)
{
    queue<int> q;
    deque<int> d(count);
    generate(d.begin(),d.end(),[m = 0] () mutable { return m++; });
    int j = 0;
    while(!d.empty())
    {
        j = (j - 1 + n)%d.size();
        q.push(d[j]);
        d.erase(d.begin()+j);
    }
    return q;
}

В очереди - выбранные индексы (как принято в C++, отсчет индексов начинается с 0 :)).

READ ALSO
Почему выходит мусор?

Почему выходит мусор?

Вводить с клавиатуры целые числаУсловие окончания ввода  число 0

88
Помогите решить олимпиадную задачу по информатике

Помогите решить олимпиадную задачу по информатике

Условие : Дано массив чиселЗа один ход разрешается вычеркнуть любую последовательность одинаковых цифр, идущих подряд

77
Наследование значений С++

Наследование значений С++

Я не совсем понимаю как работает наследование

70
c++ algorithm что то пошло не так

c++ algorithm что то пошло не так

написал вроде все правильно, но не работает

105