Почему я не могу распечатать содержимое вектора объектов, используя диапазон l oop? - PullRequest
1 голос
/ 08 мая 2020

Я новичок, и я решил упражнение с участием 10 человек ie едоков с количеством съеденных пирогов, установленным пользователем.

  1. 1-е задание: Показать количество участников и съеденные пироги - Решено;
  2. 2-е задание: Найти победителей с наибольшим количеством съеденных пирогов и перечислить все - Решено;
  3. 3-е задание : Найти неудачников с наименьшим количеством съеденных пирогов и составить список всех - Решено;
  4. Заключительная задача: отсортировать участников и перечислить их в порядке от наибольшего количества пирогов до наименьшего количества съеденных - частично решено.

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

Я создал класс Contestant с конструктором Contestant с двумя аргументами и объявил вектор объектов. Вот код в главном, заголовке класса и решении класса:

#include <iostream>
#include <vector>
#include "Contestant.h"
using namespace std;

int main()
{
    cout << "Type the number of pies eaten by each of the 10 contestants:" << endl;
    cout << "#1 #2 #3 #4 #5 #6 #7 #8 #9 #10" << endl;

    vector<Contestant> pie_eaters;
    vector<Contestant*> winners; 
    vector<Contestant*> losers; 


    for (int i=0; i<10; i++)
    {
       int pies_eaten;
       cin >> pies_eaten;
       pie_eaters.emplace_back(i+1, pies_eaten);
       cout << "Contestant number " << i+1 << " ate " << pie_eaters[i].GetPancakes() << endl;
    }
    cout << endl;


    FindWinners(pie_eaters, winners);
    ListWinners(winners);

    FindLosers(pie_eaters, losers);
    ListLosers(losers);


    cout << endl;

    SortPieEaters(pie_eaters);

    ListSortedPieEaters(pie_eaters);


}

Заголовок класса (отредактированный, только для сортировки и печати, которые находятся за пределами класса):

#pragma once
#include <iostream>
#include <vector>

class Contestant
{
private: 
    int pancakes_eaten;
    int number;

public:
    Contestant(int number, int pancakes);

    ~Contestant();
    int GetPancakes() const { return pancakes_eaten; }
    int GetNumber() const { return number; }

};


void SortPieEaters(std::vector<Contestant>& pie_eaters);

void ListSortedPieEaters(std::vector<Contestant> const& pie_eaters);

и решение класса (просто сортировка и распечатка частей, которые не входят в класс):

#include "Contestant.h"

using namespace std;

Contestant::Contestant(int number, int pancakes) : pancakes_eaten(pancakes), number(number)
{
}

Contestant::~Contestant() {};


void SortPieEaters(vector<Contestant>& pie_eaters)
{
    while(bool swapped=true)
        {
        swapped = false;
           for (int i = 0; i < static_cast<int>(pie_eaters.size()-1); i++)
           {
                if (pie_eaters[i].GetPancakes() < pie_eaters[i + 1].GetPancakes())
                {
                    swap(pie_eaters[i], pie_eaters[i + 1]);
                    swapped = true;
                }

           }
        }
}

void ListSortedPieEaters(vector<Contestant> const& pie_eaters)
{
    cout << "From most pies eaten, to fewest pies eaten, the results are as follows:" << endl;
    for (auto const& c : pie_eaters)
    {
        cout << "Contestant #" << c.GetNumber() << ": ate " << c.GetPancakes() << " pies" <<endl;

    }
}

И, наконец, вот и пример вывода: Вывод

Все работает нормально, но не распечатывает вектор и не предупреждает о каких-либо проблемах. Пробовал, все вроде передачи по постоянной или непостоянной ссылке, пытался написать тело функции непосредственно в main (избегая функции), но ничего. И доступ к вектору и распечатка контента были такими же, как и в случае векторов победителя и проигравшего (даже если они являются векторами указателей на элементы объекта вектора p ie eaters)

What am Я делаю не так?

1 Ответ

0 голосов
/ 08 мая 2020

Это потому, что while l oop никогда не заканчивается, поскольку вы инициализировали значение swapped = true в условии while l oop, значение swapped становится истинным, когда внутреннее значение для l oop заканчивается, и пока l oop обрабатывается.

Программа никогда не покидает время l oop. таким образом, строка никогда не выполняется

SortPieEaters(pie_eaters); //Executes

ListSortedPieEaters(pie_eaters); //does not execute

Вы могли бы просто сделать

bool swapped = true;
while(swapped)
{
    swapped = false;
    for (int i = 0; i < static_cast<int>(pie_eaters.size()-1); i++)
    {
        if (pie_eaters[i].GetPancakes() < pie_eaters[i + 1].GetPancakes())
        {
            swap(pie_eaters[i], pie_eaters[i + 1]);
            swapped = true;
        }
    }
}

Кроме того, я бы посоветовал вам изменить лог c сортировки на что-то более простое, перегрузив <в <code>Contestant класс и использование std::sort вместо

...