Witam.
Piszę program: http://ideone.com/oMvuPs -treść zadania
i mam zagwozdkę bo nie wiem jak zrobić to zliczanie wystąpień liczb w zbiorach reprezentujących dany pomysł.
Przechowuję je (tzn. te zbiory liczb) jako tablice, które należą do poszczególnych elementów/pomysłów wrzucanych na stos/listę.
Nie wiem czy to dobry pomysł. Może ktoś z was zna lepszy i wie jak ten problem rozwiązać?
Jeśli wiecie co tu zrobić to będę wdzięczny za pomoc.
Pozdrawiam i wszystkiego dobrego w nowym roku.
unsigned CNT[10]={};
unsigned N,V=0;
for(cin>>N;N--;++CNT[V]) cin>>V;
Ok dzięki, ale przydałoby się małe wytłumaczenie :) Bo jeśli chodzi ci o wczytywanie to wiem jak zrobić.
Tu masz od razu wczytywanie i zliczanie wystąpień.
Czyli co? Zliczać wystąpienia każdej liczby, zapisywać je do pomysłu i potem przy wywołaniu funkcji która te pomysły wyszukuje i porównuje używać tych zliczonych wartości?
@_13th_Dragon dał niezłą siekierę dla początkujących więc może rozpiszę co i jak:
W C i C++ zmienne na stercie, które nie są inicjalizowane mają wartość losową.
W C i C++ tablice można inicjalizować przy pomocy {}
(ale tylko inicjalizować, potem to już nie działa).
Jeśli w {}
jest mniej elementów niż rozmiar tablicy, to nadmiarowe elementy są uzupełniane 0
.
To tłumaczy nam 1 linijkę:
<code=c++>unsigned CNT[10]={};
2 linijka nie wymaga chyba tłumaczenia.
Pętla `for` może być również zapisana przy pomocy pętli `while` w taki sposób:
```cpp
for (a; b; c) { d; }
// to to samo co
a;
while (b) {
d;
c;
}
Przy czym zarówno while
jak i for
wykonują się tak długo jak warunek jest prawdziwy.
Operator postfiksowy --
oznacza, że chcemy zmniejszyć wartość danej zmiennej o 1 i uzyskać wartość zmiennej PRZED zmniejszeniem.
Teraz składając wszystko do kupy nasza pętla wygląda tak:
cin >> N;
while (N--) {
cin >> V;
++CNT[V];
}
Czyli:
- Wczytujemy liczbę testów
-
N
razy wykonujemy pętlę - Wczytujemy liczbę
- Zwiększamy wartość komórki w tablicy
CNT
odpowiadającej wczytanej liczbie
unsigned stan[10],idea[10];
unsigned more=0;
for(unsigned i=0;i<10;++i) more+=(stan[i]<idea[i]);
if(more>=3) // pasuje
Czyli rozumiem, że mam mieć 2 tablice. Jedną do przechowywania liczb opisujących pomysł, a druga do ilości wystąpień danej liczby?
Jak na razie to mam tak kod napisany, że każdy pomysł ma tablicę z tymi liczbami które go opisują i jakoś zamierzałem je porównywać, ale rzeczywiście można by 2 tablice robić.
Nie, zawsze trzymasz tylko ilości wystąpień. Jedna tablica jako stan oraz po jednej tablice przy każdym pomyśle.
Ok dzięki Dragon. Teraz już chyba zrozumiałem. Dałeś mi praktycznie gotowy kod. Mam nadzieję, że po zaimplementowaniu w moim programie (jeśli niczego nie sknocę) zadziała.
http://ideone.com/8dKts7 - to jest kod tego zadania.
Możecie mi sprawdzić dlaczego nie działa poprawnie?
Zalicza tylko jeden test na 8 i tyle. Visual studio kompiluję ale jak wprowadzam dane to czasem przerywa działanie programu i pieje coś z przepinaniem last->next na NULL.
Błagam was pomóżcie.