c ++ Вопрос с отображением текста между двумя переменными массива - PullRequest
0 голосов
/ 27 мая 2019

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

Кодработает, если я меняю ++ i на i + 1, но мне интересно, почему это происходит, и мне интересно, есть ли более умный способ делать то, что я хочу.Ошибка говорит о неупорядоченной модификации и доступе к 'i' [-Wunsequenced]

#include <iostream>
#include <memory>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    int players = 0,rounds=0;
    bool winnerFound=false;
    cout << "Welcome to my tournament match maker\n";
    cout << "Enter the number of participants in the tournament: ";
    cin >> players;
    rounds=players/2;
    string *pNames = new string[players]; //dynamically allocate 
    for (int i = 0;i < players;i++)
    {
        cout << "Enter the name of player " << i + 1<<":";
        cin >> pNames[i];
    }
        random_shuffle(&pNames[0],&pNames[players]);
        for(int i=0;i<rounds;i++)
        {
           cout<<pNames[i]<<" vs "<<pNames[++i]; //
        }
        return 0;
}

Я не уверен, что это лучший способ сделать это, любые советы будут оценены.

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Для подсказок, я думаю, что лучше использовать контейнер STL вместо необработанного массива. std::array или std::vector например. Вы можете изменить объявление pNames следующим образом:

std::vector <std::string> pNames(players);

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

Чтобы ваш код работал, вам нужно написать:

for(size_t i = 0; !pNames.empty() && i < pNames.size()-1; ++i)
{
    std::cout << pNames[i] << " vs " << pNames[++i] << std::endl;
}

Но я думаю, что это плохой способ изменить i из цикла, вам лучше напрямую увеличить i на два в операторе цикла. Это даст:

for(size_t i = 0; !pNames.empty() && i < pNames.size()-1; i+=2)
{
    std::cout << pNames[i] << " vs " << pNames[i+1] << std::endl;
}

Конечно, если у вас есть только один игрок или нечетное количество игроков, вы пропустите последний (потому что вам нужно два противника, чтобы сделать против).

Надеюсь, это поможет.

0 голосов
/ 27 мая 2019
#include <iostream>
#include <memory>
#include <string>
#include <algorithm>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
    int players = 0,count=0;
    cout << "Welcome to my tournament match maker\n";
    cout << "Enter the number of participants in the tournament: ";
    cin >> players;
    string *pArray = new string[players]; //dynamically allocate
    cin.ignore();
    for (int i = 0;i < players;i++)
    {
        cout << "Enter the name of player " << i + 1<<":";
        getline(cin, pArray[i]);
    }
    random_shuffle(&pArray[0], &pArray[players]);
    for (int i = 0;i < players;i++)
    {
        cout << ++count << ": " << pArray[i] << " vs " << pArray[i + 1] << endl;
        i++;
    }

    return 0;
}

Есть критика?

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

Во-первых, i++ и ++i различаются.
i++ приращения после возврата значения и
++i приращения до возврата значения результата.

Было быболее читабельно, если вы увеличили значение i в цикле for на два, а затем не получили побочного эффекта при запросе значения массива.И, конечно же, вам нужно проверить, действителен ли я на данный момент

for(int i=0; i < players-1; i += 2)
{
    // check if valid.
    // with odd numbers of players, the last remaining player will be dropped.
    cout << pNames[i]<<" vs " << pNames[i+1]; // no side effect.
                                                  // In a for loop
                                                  // all increments should happen in
                                                  // the loop header.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...