Utknąłem na tym problemie. Wszelka pomoc byłaby doceniona.

Masz dziesięć osób siedzących w pierścieniu, jak pokazano poniżej. Kula jest stale przekazywana wokół sekwencji. Początkowo osoba 0 ma piłkę. Użytkownik wprowadza numer między 0 a 9 włącznie. Piłka jest następnie przekazywana ta liczba osób. Na przykład, jeśli użytkownik wejdzie do 2, piłka jest przekazywana z osoby 0 do osoby 2. Jeśli użytkownik wejdzie w a 3, piłka jest przekazywana z osoby 2 do osoby 5. Uważaj, że od osoby 9, piłka idzie Powrót do osoby 0, więc jeśli osoba 9 ma obecnie piłkę, a 2 zostanie wprowadzone, wtedy piłka zostanie przekazana osoba 1.

Napisz program, aby symulować tę przechodzącą grę kulkową. Musisz użyć dziesięciu zmiennych (osobista do osoby9) typu Boola, aby reprezentować dziesięć osób. Przypisz wartość zgodną z zmienną osoby, która trzyma piłkę. W przeciwnym razie przypisz wartość fałszywie dla osób, które nie trzymają piłki. Po każdym wejściu Program musi rzeczywiście przypisać "piłkę" osobie, że piłka jest przekazywana przez ponowne przypisanie wartości prawdziwych / fałszywych ludzi. Po każdej rundzie komunikat jest również wydrukowany, mówiąc, który kończy się trzymając piłkę. To trwa do momentu wprowadzenia numeru ujemnego.

Mam problemy z kontynuowaniem kręgu po ostatniej osobie dostanie piłkę. Nie jestem pewien, jak zmienić zmienną boolowską za każdym razem, gdy nowa osoba dostaje piłkę.

 int main(){
  bool t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;
  int passes = 0, newLocation = 0;
  do{
  cout << "Enter a number: " << endl;
  cin >> passes;
  newLocation += passes;
  cout << endl;
    if(newLocation == 0)
      cout << "\nPerson zero has the ball\n";
      t0 = true;
    if(newLocation == 1)
      cout << "\nPerson one has the ball\n";
      t1 = true;
    if(newLocation == 2)
      cout << "\nPerson two has the ball\n";
      t2 = true;
    if(newLocation == 3)
      cout << "\nPerson three has the ball\n";
      t3 = true;
    if(newLocation == 4)
      cout << "\nPerson four has the ball\n";
      t4 = true;
    if(newLocation == 5)
      cout << "\nPerson five has the ball\n";
      t5 = true;
    if(newLocation == 6)
      cout << "\nPerson six has the ball\n";
      t6 = true;
    if(newLocation == 7)
      cout << "\nPerson seven has the ball\n";
      t7 = true;
    if(newLocation == 8)
      cout << "\nPerson eight has the ball\n";
      t8 = true;
    if(newLocation == 9)
      cout << "\nPerson nine has the ball\n";
      t9 = true;
    if(passes < 0){
      cout << "Mom says dinner is ready!" << endl;
      t0 = true;
      break;
      }
    if(newLocation >= 10){
      newLocation = 0 + (newLocation % passes);
      cout << newLocation;
          if(newLocation == 0)
      cout << "\nPerson zero has the ball\n";
      t0 = true;
    if(newLocation == 1)
      cout << "\nPerson one has the ball\n";
      t1 = true;
    if(newLocation == 2)
      cout << "\nPerson two has the ball\n";
      t2 = true;
    if(newLocation == 3)
      cout << "\nPerson three has the ball\n";
      t3 = true;
    if(newLocation == 4)
      cout << "\nPerson four has the ball\n";
      t4 = true;
    if(newLocation == 5)
      cout << "\nPerson five has the ball\n";
      t5 = true;
    if(newLocation == 6)
      cout << "\nPerson six has the ball\n";
      t6 = true;
    if(newLocation == 7)
      cout << "\nPerson seven has the ball\n";
      t7 = true;
    if(newLocation == 8)
      cout << "\nPerson eight has the ball\n";
      t8 = true;
    if(newLocation == 9)
      cout << "\nPerson nine has the ball\n";
      t9 = true;
    if(passes < 0)
      cout << "Mom says dinner is ready!" << endl;
      t0 = true;
      break;
      }
    }
  }while(newLocation >= 0);

  return 0;
}
c++
-6
ayechillbro 25 październik 2020, 01:29

1 odpowiedź

Najlepsza odpowiedź

Napisałem to przed edycją, więc zapoznaj się z oryginalnym kodem, aby zobaczyć różnice. Dodałem komentarze do wyjaśnienia tego, co zrobiłem.

Jednym z problemów jest brak {} wokół kodu po instrukcji if. Bez nich tylko pierwsze stwierdzenie po if jest warunkowe.

if(newLocation == 0)
      cout << "\nPerson zero has the ball\n"; // Executes based on the condition
      t0 = true; // executes always

Niektóre języki, takie jak Python, używaj wcięcia, aby pasowały do rzeczy, ale C ++ nie, więc potrzebujesz szelki. Polecam dostanie się do zwyczaju zawsze używając ich nawet wtedy, gdy po warunkach jest tylko jedna linia. IMO sprawia, że kod jest łatwiejszy do czytania, pokazuje wyraźne intencje i nigdy nie zmieni się w błąd, gdy dodasz inną linię, która powinna być warunkowa, ale nie dlatego, że nie miałeś szelki.

Pozostałe zmiany są dość proste. Wyczyściłem wszystkie zmienne boolowskie, aby fałszywie przed przypisaniem prawidłowego do prawdziwego i użyłem % (mod), aby owinąć wartość wokół, gdy jest zwiększona obok końca.

Nie używam using namespace std;, więc dodałem wyraźny prefiks std:: w razie potrzeby. Polecam też w tym zwyczaj. Może wydawać się nieszkodliwe i uratować ci trochę pisania, ale pewnego dnia pożałujesz, zwłaszcza jeśli kiedykolwiek umieścisz go w nagłówku.

Mam nadzieję, że twoje następne zadanie uczy cię, jak to zrobić za pomocą tablicy dla zmiennych, ponieważ byłoby tak dużo czystsze i prostsze.

#include <iostream>

int main()
{
    bool t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;
    int num1 = 0, num2 = 0;

    // loop forever. The loop will exit when a negative number is entered.
    for(;;)
    {
        // Set all of the variables to false
        t0 = t1 = t2 = t3 = t4 = t5 = t6 = t7 = t8 = t9 = false;

        std::cout << "Enter a number:\n";
        std::cin >> num1;

        // negative number ends the game
        if (num1 < 0)
        {
            std::cout << "Mom says dinner is ready!\n";
            break; // exit loop
        }

        // advance the ball
        // add the new value and use % to wrap it around
        num2 += num1;
        num2 %= 10;

        if (num2 == 0)
        {
            std::cout << "\nPerson zero has the ball\n";
            t0 = true;
        }
        if (num2 == 1)
        {
            std::cout << "\nPerson one has the ball\n";
            t1 = true;
        }
        if (num2 == 2)
        {
            std::cout << "\nPerson two has the ball\n";
            t2 = true;
        }
        if (num2 == 3)
        {
            std::cout << "\nPerson three has the ball\n";
            t3 = true;
        }
        if (num2 == 4)
        {
            std::cout << "\nPerson four has the ball\n";
            t4 = true;
        }
        if (num2 == 5)
        {
            std::cout << "\nPerson five has the ball\n";
            t5 = true;
        }
        if (num2 == 6)
        {
            std::cout << "\nPerson six has the ball\n";
            t6 = true;
        }
        if (num2 == 7)
        {
            std::cout << "\nPerson seven has the ball\n";
            t7 = true;
        }
        if (num2 == 8)
        {
            std::cout << "\nPerson eight has the ball\n";
            t8 = true;
        }
        if (num2 == 9)
        {
            std::cout << "\nPerson nine has the ball\n";
            t9 = true;
        }
    }

    return 0;
}

Możliwe jest również zastąpienie oświadczeń if za pomocą switch, jeśli chcesz. Dla czegoś takiego nie ma znaczenia, ale są przypadki, w których może być preferowane. To wyglądało tak:

switch (num2)
{
case 0:
    std::cout << "\nPerson zero has the ball\n";
    t0 = true;
    break;
case 1:
    std::cout << "\nPerson zero has the ball\n";
    t0 = true;
    break;
}
...
0
Retired Ninja 24 październik 2020, 23:47