"If na cały program c++"


(inozemec79) #1

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ć


(Fizyda) #2

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.


(Johny) #3

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.


(Fizyda) #4

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


(inozemec79) #5

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


(Fizyda) #6

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)

#7

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


(enedil) #8

To mało Tobie wiadomo.


(Fizyda) #9

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.


(enedil) #10

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


(angry) #11

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


(ziajek444) #12

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.

(xshoon) #13

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: