"If na cały program c++"

Witam!
Chciałbym w moim programie konsolowym zrobić takie coś jak instrukcja if na cały program, czyli w obojętnie jakim momencie np. jakaś zmienna będzie czemuś równa to coś się wydarzy, nie wiedziałem jak za bardzo to napisać

Napisz po co Ci to, bo sposobów jest dużo, a może nie warto tak kombinować. Ogólnie w zależności od tego po co Ci to czyli co chcesz dokładnie zrobić będzie w dużej mierze zależało rozwiązanie.

1 polubienie

Poucz się instrukcjach warunkowych if else,w necie jest pełno kursów C/C++ od podstaw
if (a==3)
{
//tu instrukcje jeśli warunek spełniony czyli wydarzyło się a=3
printf(‘a=3’);
}
jest jeszcze instrukcja switch (zmienna) i bloki case.

1 polubienie

Weź mi wytłumacz związek z tematem bo go nie widzę.

chodzi mi o to że w trakcie trwania programu użytkownik wpisze help i wyświetli się pomoc, a może się to zdarzyć w obojętnie jakim momencie i nie chce pisać przy każdym wyborze dodatkowego if-a na pomoc

Program konsolowy? Po włączeniu którego wpisujesz komendy które wykonuje?

Możesz zrobić to za pomocą nieskończonej pętli do…while w mainie. Pseudo kod z palca:

string cmd = "";
bool exit = false;

do
{
    cin >> cmd;
    
    switch(cmd)
    {
        case "help":
            help();
            break;
        case "exit":
            exit = true;
            break;
        case "add":
            addSomething();
            break;
        default:
            help();
            break;
    }
} while (exit != true)
1 polubienie

W C++ switch przyjmuje tylko int (i to co może na niego skonwertować) z tego co mi wiadomo.

To mało Tobie wiadomo.

Racja zapomniałem o tym bo na co dzień nie piszę w C/C++. Poza tym jest to pseudokod, pisany z palca więc trzeba liczyć się z tym że nie będzie to copy past i trzeba będzie ewentualne błędy czy problemy rozwiązać.
Jest kilka sposobów, można np wyliczyć sumę stringów co da nam inta i jego porównywać - możliwość kolizji wyników, można dodać metodę która zamieni komendę na odpowiednią wartość - niestety trzeba budować brzydkiego if…else…if…else…if…else… Jest też opcja hardcorowa można wykorzystać funkcje lambda czyli stworzyć dwie tablice jedna przechowująca stringa (komendę) druga z wskaźnikiem do funkcji i w pętli iteracyjne wyszukać pasującego stringa i wywołać przypisaną do niego funkcję, lecz będzie to wymagało zbudowania całego mechanizmu zarządzania komendami, całej warstwy abstrakcyjnej wręcz i jeśli nie mamy w programie ponad 20 komend które mogą być jeszcze z czasem dodawane/usuwane to takie rozwiązanie raczej nie ma sensu.

Rozwiń co miałeś na myśli. switch w nowych standardach obsługuje stringi albo cstringi? Bo szukałem chwilę w internecie i takiej wiadomości nie znalazłem, ale może za słabo szukałem.

Teoretycznie owszem, ale, co chyba nie trudne, można się wspomóc jakąś prostą funkcją hashującą.

while (coś co ma się wydarzyć np. exit == 1)
{
}

Kolego, masz kilka rozwiązań.
-Mozesz tak jak już ktoś napisał dać tą zmienną do warunku pętli ale to ma taką wadę że pętla musi dobiec do końca.
-Możesz sprawdzanie tej zmiennej zaminąć w jakiejś funkcji i ja wywoływać co chwila (mocno nie polecam bo zasmieci kod)

  • No i najlepsze rozwiązanie według mnie. Podziel program na dwa wątki. W jednym pracuj. W drugi tylko sprawdzaj warunek. Ma to jednak dwie wady. Jeżeli będziesz ten warunek sprawdzał z maksymalną szybkością procesora to mocno spowolnisz pracę programu dlatego musisz dać tam jakieś opóźnienie. I drugi problem jeżeli dasz opóźnienie to musisz pamiętać że to stworzy ci pewna częstotliwość odczytu tego warunku. Żeby rozwiązać ten problem, przeanalizuj swój program. Wystarczy że będziesz robił odczyt 2 razy częściej niż wymaga tego twoj program. Wtedy masz pewność, że program działa sprawnie i szybko i masz ciągle sprawdzanie warunku.

Ja bym zrobił to tak :

  1. użytkownik w konsoli pisze sobie coś tam (robisz program tak jak chcesz, bez tego help jak na razie).
    Możesz zastosować ominięcie dla switcha i przyjmować tekst jako input. Z tym inputem przechodzisz do metody, w której definiujesz sobie, że np.
    “Jan” to będzie liczba 10,
    “Andrzej” to będzie liczba 16, itd. itd. Można to oprzeć na if’ach cobyś się poduczył.
    A jeżeli wpisane zostanie “help” to wykonasz swoją operację na ten temat i zwrócisz z metody liczbę np. -1, a dalej nie wykona się nic.

Pamiętaj tylko, żeby wszystko co użytkownik napisze rzutować do LowerCase. “Andrzej” i “andrzej” to nie to samo.
Chciałbym pomóc z kodem ale w c++ pisałem dawno temu i nie prawda :smiley: