Sortowanie i wypisywanie nazw

0

OK. Najpierw wytłumaczę o co chodzi w programie. Nie będę tego pisał, bo polecenie jest strasznie długie. Po prostu je wkleję:


W układzie pomiarowym eksperymentu fizycznego dane przychodzą z 4 niezależnych kanałów o umownych nazwach FRS, GER, HEC, DGF. W trakcie pomiaru robiona jest statystyka równoczesności wystąpienia(czyli koincydencji) tych sygnałów. Polega to na tym, że jest tablica jednowymiarowa, w której kolejne elementy odpowiadając odpowiednim kombinacjom tych sygnałów. To znaczy na przykład element 3 odpowiada równoczesności sygnałów kanałach FRS i GER. Element 15 odpowiada równoczesności FRS, GER, HEC, DGF.
Oto odpowiednie kombinacje zebrane ww tabelkę
E0DEwEP.png
Zasada jest prosta – każdy sygnał ma jakby "swój" bit w numerze elementu. Obecność tego sygnału ustawia ten bit na 1, brak sygnału ustawia na 0. Po sprawdzeniu obecności lub nieobecności wszystkich 4 sygnałów powstaje słowo, będące numerem elementu w tablicy statystyki.
Skoro taka kombinacja właśnie wystąpiła to tenże element tablicy poddawany jest inkrementacji. (Czyli będący tam licznik takich sytuacji podwyższany jest o jeden).
To tyle tytułem wstępu.
Załóżmy, że pomiar trwa już jakiś czas i w tablicy są już jakieś liczby określające ile razy poszczególne kombinacje wystąpiły w ciągu tego czasu.
Teraz właściwe zadanie: napisz, która tę statystykę wyświetli na ekranie w taki mniej więcej sposób(wartości liczbowe są przykładowe).
Poszczegolne kombinacje wystąpiły nastepujaca ilosc razy
Kombinacja: FRS -> 346 razy
Kombinacja: GER -> 652 razy
Kombinacja: FRS + GER -> 737 razy
Kombinacja: HEC -> 277 razy
Kombinacja: FRS + HEC -> 444 razy
… itd. aż do kombinacji FRS + GER + HEC + DGF …
Jak widzisz jest to wypisanie kolejnych elementów tablicy, z tym że temu wypisowi towarzyszy opis kombinacji sygnałów. Gdyby jakaś kombinacja nie wystąpiła ani raz,(wartość = 0) wówczas oczywiście takiej linii statystyki nie wypisujemy.
Uwaga: Ten symboliczny opis kombinacji(no. "FRS + HEC + DGF") musi być konstruowany na bieżąco na podstawie analizy numeru elementu tablicy, który właśnie wypisujemy.
Opis ten nie może być więc "zaszyty" na stałe w programie. (Wyobraź sobie, że mamy nie 4 sygnały, ale 10 – musiałbyś wtedy przygotować 1024 takich gotowych tekstów).
Zatem twoje zadanie polega na tym, byś wypisując np. dwunasty element tablicy, potrafił opisać go na ekranie podając nazwy odpowiednich sygnałów. Gdy napiszesz tę funkcję i będzie działała poprawnie – pojawia się jeszcze jedno życzenie eksperymentatora.
Chciałby on mianowicie, aby wypisywane na ekranie kombinacje pojawiały się nie tak, jak są umieszczane w tablicy(po kolei), ale począwszy od najbardziej skomplikowanych kombinacji do najprostszych. Czyli by najpierw została linijka ze statystyką kombinacji 4 sygnałów, następnie linijki z różnymi kombinacjami 3 sygnałów, potem z kombinacjami 2 sygnałów, a na końcu sygnałów pojedynczych.
Czyli na przykład tak:
Poszczegolne kombinacje wystąpiły nastepujaca ilosc razy
Kombinacja: FRS + GER + HEC + DGF -> 346 razy
Kombinacja: FRS + GER + HEC - > 652 razy
Kombinacja: FRS + GER + DGF -> 737 razy
Kombinacja: FRS + HEC + DGF -> 277 razy
Kombinacja: GER + HEC + DGF -> 444 razy
… itd. aż do kombinacji FRS(pojedynczej)…
*******************************************************

Prostszą wersję napisałem i działa bez zarzutu. Problem natomiast z tą trudniejszą. Oto co napisałem:

#include <iostream>
using namespace std;

void Drukuj(int table[]);

const int tableSize = 15;
int kolejnosc[tableSize];
int tablica_pomiarow[tableSize] = {2041, 23, 34321, 2, 34, 43256, 654, 56, 999, 102, 214, 23444, 21322, 111, 124};

int main()
{
    Drukuj(tablica_pomiarow);
}

void Drukuj(int table[])
{
    bool writePlus = false;

    cout << "Poszczegolne kombinacje wystapily nastepujaca ilosc razy:" << endl;

    for(int i = 0; i != tableSize; i++)
    {
        if(i >= 8)
        {
            kolejnosc[i]++;
        }

        if((int) i/4 % 2)
        {
            kolejnosc[i]++;
        }

        if(i/2 % 2 )
        {
            kolejnosc[i]++;
        }

        if(i % 2)
        {
            kolejnosc[i]++;
        }
    }

    for(int i = 0, k = 4; ; i++)
    {
        if(i == tableSize && k == 0) break;
        if(i == 15) {i = 0; k--;}

        cout << "Kombinacja: ";

        if(kolejnosc[i] == k)
        {
            if(i >= 8)                                // DGF
            {
                cout << "DGF";
                writePlus = true;
            }

            if((int) (i/4) % 2)                                 //HEC
            {
                if(writePlus) cout << " + ";

                cout << "HEC";
                writePlus = true;
            }

            if((i/2) % 2)                                 //GER
            {
                if(writePlus) cout << " + ";

                cout << "GER";
                writePlus = true;
            }

            if(i % 2)
            {
                if(writePlus) cout << " + ";

                cout << "FRS";
                writePlus = true;
            }
        }

        cout << " --> ";
        cout << table[i] << " razy." << endl;
        writePlus = false;
    }
}

No ale to nie chce działać. Nie wyświetla nazw kombinacji, chociaż dobrze je grupuje. Pomożecie?

0

Ok, zamykam temat, program działał, miał tylko drobne usterki.

0

Może i działa ale w tym zadaniu z całą pewnością nie o to chodziło.
Ponieważ masz 4 bitowy sygnał więc zakres wartości musi być 0..15 więc nie bardzo rozumiem skąd masz w danych liczby typu: 43256.

1 użytkowników online, w tym zalogowanych: 0, gości: 1