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

Pojedyncze sprawdzenie ifa

Object Storage Arubacloud
0 głosów
274 wizyt
pytanie zadane 13 lipca 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

Witam,

natrafiłem na pewien problem optmalizacyjny.

Stworzyłem sobie tablice struktur:

struct menu_wyg {

		string napis;
		bool czy_wybrano = 0;

	}wyg[6];

W uproszczeniu - program ma modyfikowac dane w pliku tekstowym, powiedzmy, ze na koncu kazdej linijki ma dopisac to co jest w zmiennej napis, jesli czy_wybrano ma true.

Moje pytanie brzmi - jak zrobić pętlę while, która wykona to do konca pliku sprawdzajac ifami tylko raz?

Oczywiscie zdaje sobie sprawe, ze moglbym zrobic duze, rozbudowane ify dla kazdej mozliwosci, ale byloby ich tyle ile szufladek w tablicy, a przeciez moze byc ich znacznie wiecej niz 6.

Taki zapis:

ifstream plik;
ofstream plikz;
menu_wyg cos[6];
string linijka;
while(!plik.eof()){

getline(plik, linijka);

  for(int i=0; i<sizeof(cos)/sizeof(menu_wyg); i++){
    
     if(cos[i].czy_wybrano == true){

     linijka += cos[i].napis;

     }
    



  }
plikz << linijka;
}

Powoduje, ze if wykona sie tam  wielkosc_tablicy * ilosc_linijek wiec jest to mocno nieoptymalne. Jak to obejsc?

2 odpowiedzi

0 głosów
odpowiedź 13 lipca 2016 przez mazabin Początkujący (260 p.)

Co znaczy, że chcesz ifa wykonać raz? Raz w ciągu całej pętli while czy raz w na każdą strukturę z tablicy? 

Poniższe wykona się tylko na ilości linijek:

 if(cos[0].czy_wybrano == true){ 
    for(int i=1; i<=sizeof(cos)/sizeof(menu_wyg); i++){  
       linijka += cos[i-1].napis;
     }
 }

Jeśli ma być raz na całego while'a to warunek powinien być przed nim i wtedy lepiej zrobić dwa while - jeden na pozytywny warunek, drugi na negatywny. 

 

komentarz 13 lipca 2016 przez Sinnley Stary wyjadacz (12,810 p.)
chciałbym, żeby if został sprawdzony tylko raz na każdą szufladkę tablicy, a potem, żeby while dopisywał do każdej pobranej linijki to co znajdzie kolejno w zmiennej napis tych szufladek, w których czy_wybrano ma wartosc true.

Twoj program sprawdza boola jedynie pierwszej szufladki, a wykonuje sie dla wszystkich.
komentarz 13 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Może pętla for, która wykona się taką samą ilość razy ile jest miejsca w pamięci?
komentarz 13 lipca 2016 przez Sinnley Stary wyjadacz (12,810 p.)
W jaki sposób miała by ona działać?
komentarz 13 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Za dobry nie jestem, ale załóżmy, że użytkownik podaje liczbę 8, a więc tworzmy tablice i przypisujemy do niej wartość podaną od użytkownika, a póniej wykorzystujemy tą samą wartoś do pętli, tak myślę, ale nie jestem za dobry w c]], więc poczekaj lepiej, ale spróbować zawsze możesz
0 głosów
odpowiedź 13 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)

Zawsze możesz zrobić jakiś wektor, który będzie zawierał wskaźniki do klas spełniających warunek:

#include <vector>

...

std::vector<menu_wyg*> Aktywne;

...

Aktywne.clear();
for(int i=0; i<sizeof(cos)/sizeof(menu_wyg); i++)
{
   if(cos[i].czy_wybrano) Aktywne.push_back(cos+i);
}

...

//Tutaj twój for
for(int i=0; i<Aktywne.size(); i++)
{
   linijka+=Aktywne[i]->napis;
}

...

Podobne pytania

0 głosów
1 odpowiedź 323 wizyt
pytanie zadane 11 lipca 2018 w PHP przez kubusop Początkujący (420 p.)
–1 głos
1 odpowiedź 763 wizyt
pytanie zadane 14 maja 2016 w PHP przez bartek7910 Obywatel (1,980 p.)
0 głosów
2 odpowiedzi 159 wizyt
pytanie zadane 12 grudnia 2015 w C i C++ przez cytrynowy012 Nowicjusz (220 p.)

92,631 zapytań

141,497 odpowiedzi

319,869 komentarzy

62,011 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!

...