Czy da się rozstrzygnąć wynik gry w kroki używając tylko instrukcji warunkowej?

0

Witam. Mam pytanie czy ten program da się napisać przy użyciu instrukcji if, else proszę nie podawać rozwiązania tylko odpowiedzieć na pytanie
Jasiu i Stasiu stoją na przeciw siebie. Zaczyna Jasiu stawiając krok o długości n centymetrów, następnie Stasiu stawiając krok o długości m centymetrów. Wygrywa ten, który pierwszy nadepnie na stopę przeciwnika.
Na wejściu pojawiają się trzy liczby naturalne dodatnie: d, n i m, oznaczająco kolejno odległość między zawodnikami, długość kroku Jasia oraz długość kroku Stasia.
Na wyjściu wypisujemy imię zwycięzcy (Jasiu, Stasiu)

0

Moim zdaniem tak, ale testów nie robiłem

3

Problem z którym się zmagasz nie wymaga żadnego programowania, odpowiedź można osiągnąć czysto algebraicznie, nawet na kartce papieru.

Tak na prawdę, to wszystko czego potrzebujesz do napisania tego programu to:

  • jedna instrukcja warunkowa (np. if, ale może też być ternary ?: lub switch)
  • operacje algebraiczne, a dokładniej mówiąc +, -, %, > lub <
  • wejście/wyjście (jak scanf()/printf() lub std::cin/std::cout
  • punkt startowy main()

i nic więcej.

PS: Jak dobrze myślę, to chyba nawet - nie jest potrzebny.

Dobrze napisany program miałby też testy automatyczne (dokładniej mówiąc 7, + dodatkowe 3 testy jeśli każda z danych wejściowych wymaga walidacji, czy jest mniejsza lub równa 0) - aczkolwiek obsłużenie wszystkich wartości z pewnością wymagałoby więcej niż jednej instrukcji warunkowej.

1

ogólnie albo podchodzisz iteracyjnie - wtedy pętla + ify, albo próbujesz rozwiązać matematycznie - wtedy najlepiej na kartce papieru to rozwiązać, ułożyć równanie i do komputera tylko wrzucić odpowiednie przeliczenia (chociaż dla pewności można też napisać iteracyjne rozwiązanie i porównać wyniki, bo w równaniach łatwo się pomylić).

jedna instrukcja warunkowa (np. if, ale może też być ternary ?: lub switch)

zamiast ifa wystarczyłby pewnie < bądź >.

1
LukeJL napisał(a):

zamiast ifa wystarczyłby pewnie < bądź >, jednak jakby się przyczepić, to gdzieś na poziomie kodu maszynowego pojawiłaby się instrukcja warunkowa.

Wsadzisz wynik < do zmiennej bool - więc albo zostawiamy tak, i wtedy faktycznie nie trzeba if.

Ale jeśli chcemy jakoś pokazać wynik - który z graczy wygrał - np wypisać wynik na interfejs konsolowy, to wtedy instrukcja warunkowa jest konieczna.

1
Riddle napisał(a):

Ale jeśli chcemy jakoś pokazać wynik - który z graczy wygrał - np wypisać wynik na interfejs konsolowy, to wtedy instrukcja warunkowa jest konieczna.

nie jest

3

Żadne ify i pętle nie są potrzebne, również if do wypisania zwycięcy nie jest niezbędny. Wystarczą operacje arytmetyczne + np. tablica.

2

Tak na szybko to zakładając że false to 0, a true to 1, to w pseud-C to będzie

int value = d % (n + m);
char* result = {"jaś", "małgosia" }[(value < n)]

Oczywiście mogę to mieć błąd o jeden, odwrócony warunek czy błąd kompilacji, ale jakoś tak bym to zrobił.

BTW uważam że treść zadania jest nieprecyzyjna bo jak uczy BrainFuck każdego ifa możba zamienić na pętle while

0
#include <iostream>
#include <string_view>

using namespace std::string_view_literals;

int main()
{
    static constexpr std::string_view players[] { "Jasiu"sv, "Stasiu"sv };
    int d, m, n;
    std::cin >> d >> n >> m;
    std::cout << players[d % (n + m) >= n] << '\n';
}

If-ów nie ma
Disalaimer: nie sprawdzałem czy wzór jest poprawny, chodzi o sam pomysł jak ma to wyglądać.
https://godbolt.org/z/Tvx5YT331

0

No okej, można zrobić mapę bool/intów do nazw graczy, więc faktycznie da się bez ifów.

4

Niesamowite. Wydawalo by sie ze zadanie "Jasiu i Stasiu ....." jest nieco trudniejsze od zadania "proszę nie podawać rozwiązania tylko odpowiedzieć na pytanie" a okazuje sie ze jest odwrotnie.

0
LukeJL napisał(a):

ogólnie albo podchodzisz iteracyjnie - wtedy pętla + ify, albo próbujesz rozwiązać matematycznie - wtedy najlepiej na kartce papieru to rozwiązać, ułożyć równanie i do komputera tylko wrzucić odpowiednie przeliczenia (chociaż dla pewności można też napisać iteracyjne rozwiązanie i porównać wyniki, bo w równaniach łatwo się pomylić).

jedna instrukcja warunkowa (np. if, ale może też być ternary ?: lub switch)

zamiast ifa wystarczyłby pewnie < bądź >.

próbowałam zrobić iteracyjnie i nie wychodzi mi mam coś takiego

#include<iostream>

using namespace std;
int main() {

  int pomiedzy, krjasia, krstasia, wynik, Jasio, Stasio;
  Jasio = 0;
  Stasio = 0;
  cout << " podaj odleglosc miedzy zawodnikami\n";
  cin >> pomiedzy;
  cout << pomiedzy;
  cout << "podaj dlugosc kroku Jasia\n";
  cin >> krjasia;
  cout << krjasia;
  cout << "podaj dlugosc kroku Stasia\n";
  cin >> krstasia;
  cout << krstasia;
  while (krjasia + krstasia < 500) {
    krjasia = Jasio + krjasia;
    krstasia = Stasio + krstasia;
    cout << krjasia << krstasia;

  }
  if (krjasia > krstasia)
    cout << "Jasio zwycieza";
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1