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

Pytanie do funkcji if

42 Warsaw Coding Academy
0 głosów
394 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,040 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 Mentor (353,220 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ź 359 wizyt
pytanie zadane 26 maja 2018 w Matematyka, fizyka, logika przez Karol1995 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 465 wizyt
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 20 stycznia 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...