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)
Moim zdaniem tak, ale testów nie robiłem
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?:
lubswitch
) - operacje algebraiczne, a dokładniej mówiąc
+
,-
,%
,>
lub<
- wejście/wyjście (jak
scanf()
/printf()
lubstd::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.
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 if
a wystarczyłby pewnie <
bądź >
.
LukeJL napisał(a):
zamiast
if
a 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.
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
Żadne ify i pętle nie są potrzebne, również if do wypisania zwycięcy nie jest niezbędny. Wystarczą operacje arytmetyczne + np. tablica.
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
#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
No okej, można zrobić mapę bool/intów do nazw graczy, więc faktycznie da się bez if
ów.
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.
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
if
a 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";
}