• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pytanie do funkcji if

Object Storage Arubacloud
0 głosów
219 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez T.Żurawski Początkujący (290 p.)
Witam,

 

Chciał bym się dowiedzieć czy jest możliwość automatycznego dodawania warunków do funkcji if za pomocą && lub ||. Według wzoru:

If ( warunek_1 || warunek_2 || ... || warunek_n)

Ilość oraz wartości warunków były by obliczane przez funkcje w programie przez co nie mogę tego zrobić na sztywno.

3 odpowiedzi

+3 głosów
odpowiedź 1 marca 2016 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Witaj!

Na początek nic nie znacząca uwaga: if to jest instrukcja - nie funkcja.

Jeśli ilość warunków do spełnienia będzie określana w trakcie działania programu, to z góry zakłada użycie warunku w pętli. Ciężko określić, z jakim typem problemu masz do czynienia, więc nie potrafię wskazać gotowego rozwiązania. 
Mogę jednak polecić takie działanie funkcji:
1. Obliczenie ilości warunków
2. Stworzenie tablicy zmiennych typu bool
3. Uzupełnienie tej tablicy w pętli odpowiednimi wartościami (true lub false)
4. Sprawdzenie alternatyw ( || ) lub koniunkcji ( && ) dla wszystkich warunków

W 4. punkcie trzeba się po prostu zastanowić. Kiedy
if( warunek_1 || warunek_2 || warunek_3 || ... || warunek_n )
będzie spełniony? Wtedy, kiedy co najmniej jeden warunek jest prawdziwy. Wystarczy więc taka pętla:

bool warunek = false;

for( int i = 0; i < n; i++ )
{
	if( tablica[ i ] == true )
	{
		warunek = true;
		break; // Przerywa pętle
	}
}

Jeśli chcesz zrobić koniunkcję dla wszystkich warunków trzymanych w tablicy, to musisz się upewnić, że żadna z wartości nie jest fałszem. Rozwiązanie analogiczne:

bool warunek = true;

for( int i = 0; i < n; i++ )
{
	if( tablica[ i ] == false )
	{
		warunek = false;
		break; // Przerywa pętle
	}
}

Jeśli chcesz szczegółów, to musisz wysłać troszkę kodu. Myślę jednak, że to powinno pomóc :-)

+2 głosów
odpowiedź 1 marca 2016 przez MetGang Nałogowiec (34,360 p.)

http://en.cppreference.com/w/cpp/algorithm/all_any_none_of

bool Check = std::X(tab,tab+n,funkcja_sprawdzajaca) // dla tablicy
bool Check = std::X(vec.begin(),vec.end(),funkcja_sprawdzajaca) // dla kontenera

Gdzie X to nazwa jednej z funkcji z linku.

all_of - jeśli wszystkie są prawdziwe (czyli &&)
any_of - jeśli jakikolwiek jest prawdziwy (czyli ||)
none_of - jeśli żaden nie jest prawdziwy

Jeśli są jakieś wątpliwości - pytaj.

komentarz 1 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Bardzo interesujący sposób - nie znałem go.
komentarz 1 marca 2016 przez MetGang Nałogowiec (34,360 p.)
Jeszcze w roli funkcji sprawdzającej dać generyczną lambdę i mamy całą, piękną esencję C++11/14 :p
komentarz 1 marca 2016 przez adrian17 Ekspert (344,860 p.)
std::X(std::begin(tab),std::end(tab),funkcja_sprawdzajaca)
// dla obu
komentarz 1 marca 2016 przez T.Żurawski Początkujący (290 p.)

Dzięki wielkie za odpowiedz,

Jeśli dobrze rozumiem ten kod zwróci wartość true jeśli np. wszystkie warunki będą prawdziwe?

tab=[1,2,3]

for (n=0,n<2,n++)
bool Check = std::all_of(tab,tab+n,tab<tab+n);

czyli w takim przypadku dostane wartość true?

A co jeśli będę chciał przesiać jakąś tablice w taki sposób:

#include <iostream>

int tab[1000];
int tab_a[1000];
int a=0;
int i;
main(){
for (i=0;i<1000;i++)
tab[i]=i+1;

for (i=0; i<1000;i++)
 if(Warunek_1 && ...&& Warunek_n)
 tab_a[a]=tab[i];
 }

komentarz 1 marca 2016 przez MetGang Nałogowiec (34,360 p.)

Trochę inaczej rozumiesz, std::all/any/none_of same w sobie są pętlami tak jak i większość algorytmów std::

Załóżmy taki przypadek:

bool Tab[5] = {true,(y!=1),false,(jakas_zmienna>0),true};

bool Check = std::all_of(std::begin(Tab),std::end(Tab),[](bool x){return x;});
// rzeczywiście istnieje możliwość z std::begin() i std::end() dla obu
// lecz przy dynamicznie alokowane tablicy (new[]) trzeba tak jak napisałem wcześniej
// [](bool x){return x;} jest to lambda (C++11), taki trick na wpisanie funkcji
// która zwróci element z tablicy

Check w tym wypadku oczywiście będzie false, gdyż nie wszystkie warunki zwracają prawdę.

Przy drugim przypadku zrobiłbym tak:

int Tab1[1000];
int Tab2[1000];
int Aux = 0;
// kod wypełniania tablic
bool Check = std::all_of(std::begin(Tab1),std::end(Tab1),[=](int x){ return x==Tab2[Aux++]; });

Mam nadzieję, że błędu nie popełniłem ;)

komentarz 1 marca 2016 przez T.Żurawski Początkujący (290 p.)
Spróbuje napisać w ten sposób prosty program do szukania liczb pierwszych. I wtedy wyjdzie czy coś pojąłem z tego c++11/14.

Jeszcze raz dziewki wielkie za pomoc MetGang.
0 głosów
odpowiedź 1 marca 2016 przez CzikaCarry Szeryf (75,340 p.)
Witaj. Ja aby dodawać coraz to nowe warunki robię cos takiego(sry ze bez kodu, ale pisze ze szkoły z telefonu): Jesli chcemy zrobić program który np. sprawdzi, czy liczba jest liczbą pierwszą, to musimy po kolei sprawdzić, czy liczba ma jakiekolwiek dzielniki inne niż 1 i liczba. Czyli dla liczby 25 będziemy musieli ustawić 13 warunków, bo liczba nigdy nie dzieli się przez liczbę wieksza niż 1/2 tej liczby, lecz dla liczby 2501 będziemy musieli ustawić jakies 1300 warunków. Wiec jak to zrobić? Pokazuję i objaśniam: Jezeli modulo z liczby(dzielenie całkowitoliczbowe) przez liczbę x wynosi 0 oznacza to, ze znaleźliśmy dzielnik liczby Czyli robimy petle w której znajdzie się if: x=2 While(x

Podobne pytania

0 głosów
1 odpowiedź 276 wizyt
pytanie zadane 26 maja 2018 w Matematyka, fizyka, logika przez Karol1995 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 336 wizyt
0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 20 stycznia 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...