Skrócenie zapisu porównywania liczb

Skrócenie zapisu porównywania liczb
T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Dopiero zacząłem swoją przygodę z programowaniem i mam pytanie, bardzo możliwe że odpowiedź jest banalna, ale nie mogę jej znaleźć:

W programie chce użyć formuły

Kopiuj
while(klawisz!='1' && klawisz!='2' && klawisz!='3') 
	{
		klawisz=_getch();
	}

Moje pytanie brzmi, czy da się skrócić zapis

Kopiuj
klawisz!='1' && klawisz!='2' && klawisz!='3'
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5069
1

Chyba, że tak:

Kopiuj
(!(c >= 49 && c <= 51))
MasterBLB
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1454
0

To zależy, jakie wartości może przyjmować klawisz

Delor
  • Rejestracja: dni
  • Ostatnio: dni
1

(c < 49 || c > 51) ?

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

W tym przypadku tylko te trzy wartości, aż się dziwię że nie wpadłem na rozwiązanie które zaproponował lion137.
Czyli rozumiem, że jeżeli liczby będą np 13, 49,50,51 to nie ma możliwości aby przyrównać zmienną do zbioru tych liczb?

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5069
0

Nie dokładnie rozumiem, tak wygląda ASCII: http://www.asciitable.com/

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Chodzi mi o skrócenie zapisu

Kopiuj
while(klawisz!=13 && klawisz != 27)

Do czegoś w postaci (wiem że to jest niepoprawne)

Kopiuj
while(klawisz!=(13 && 27))
albo
while(klawisz!={13 && 27})
albo
while(klawisz!={13 , 27})

W tym poście chodzi mi o to czy jest jakiś rodzaj zapisu na taką sytuację, albo inny sposób na zapisanie dłuższego warunku, np

Kopiuj
if (wybor==72 || wybor==119|| wybor==77|| wybor==100|| wybor==75|| wybor==97|| wybor==80|| wybor==115|| wybor==13)
cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9222
0

Może rzuć okiem, czy to Ci pasuje - https://pl.wikibooks.org/wiki/C%2B%2B/Set

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5069
1

Pierwszy listing jest poprawny, drugi niepoprawny (składniowo). Rozwiązaniem byłoby nie robić takich warunków:) Tylko takie które są przedziałem w Ascii. A jak już Musisz, to Utwórz std::unordered_set ze wszystkimi znakami, których nie chcesz i Sprawdzaj tylko warunek należenia do zbioru (O(1)).
https://en.cppreference.com/w/cpp/container/unordered_set

Delor
  • Rejestracja: dni
  • Ostatnio: dni
0

Dla zakresu unsigned char możesz zrobić odpowiednią tablicę i sprawdzać np:

Kopiuj
while(allowed[c])
GH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

Można umieścić liczby w tablicy i sprawdzić czy wszystkie spełniają warunek:
http://www.cplusplus.com/reference/algorithm/all_of/

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0
lion137 napisał(a):

Chyba, że tak:

Kopiuj
(!(c >= 49 && c <= 51))

Raczej tak:

Kopiuj
(c < '1' || c > '3')

Ew. można użyć bitset: https://owlcation.com/stem/C-bitset-with-example

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.