[C++] Program układu pomiarowego i 4 kanały

Witam!

Przerabiam ostatnie ćwiczenie z działu o tablicach z Symfonii C++, chyba najdłuższe w całej książce i prosiłbym was, żebyście rzucili okiem na mój kod i powiedzieli co można w nim zmienić. Chciałbym po prostu dowiedzieć się co robię np. w nim nie tak, a co dobrze. Jest to trochę długi program więc lepiej, żeby nie zostały mi złe nawyki na przyszłość. Podkreślam, że to ćwiczenie jest pod koniec działu o tablicach więc - nie można posłużyć się tu wskaźnikami, klasami i innymi bardziej zaawansowanymi rzeczami. Oto jego treść ( niepełna, bo potem jeszcze jest pewien fragment, ale to już sobie z nim raczej sam poradzę :slight_smile: ):

W tekście wyróżniłem ważne fragmenty. A teraz kod programu:

#include 

using namespace std;

void pomiar(int tabl[]);

int main()

{

	int tablica[16] = { 0, 800, 584, 4, 228, 76, 2, 182, 131, 981, 89, 442,

                        661, 902, 19, 567 };


	cout << "Poszczegolne kombinacje wystapili nastapujaca ilosc razy: \n";


    pomiar(tablica);


cout << "\n\n\n\n\n\n---------------------------------------------------------------\n";

system("pause");

}

void pomiar(int tabl[])

{

	char frs[] = { "+ FRS +" }; //nazwy naszych 4 kanałów

	char ger[] = { "+ GER +" };

	char hec[] = { "+ HEC +" };

	char dgf[] = { "+ DGF +" };


	char kombinacja[50]; //Nasza ostateczna kombinacja -

	//to właśnie w niej znajdą się kombinacje KANAŁÓW. 

	//Jest to najważniejsza rzecz w tym programie :-)



	int tab4[2][2][2][2]; //jest to tablica specjalnie dla NAZW kanałów

	void dolaczanie_kanalow(char cel[], char zrodlo[]);


    int i = 0;

			for(int a = 0 ; a < 2 ; a++) //a - 1-sza warstwa tab4

			{

				for(int b = 0 ; b < 2 ; b++) //b - 2-ga warstwa tab4

				{

					for(int c = 0 ; c < 2 ; c++) //c - 3-cia warstwa tab4

					{

						for(int d = 0 ; d < 2 ; d++) //d - 4-ta warstwa tab4

						{

							// ********************************************************

							tab4[a][b][c][d] = i; // nasza tablica - łatwo zapamiętać elementy

							if(tabl[i]) // - są to kolejne litery alfabetu zdefiniowane wcześniej

												  // - przypisujemy do niej wartośc aby można było dalej 

							{ // porównać je jakby - jest to poniżej, te 4 if'y 

								if(tab4[a][b][c][d] == tab4[a][b][c][1])

								{

									dolaczanie_kanalow(kombinacja, frs);

								}

								if(tab4[a][b][c][d] == tab4[a][b][1][d])

								{

									dolaczanie_kanalow(kombinacja, ger);

								}

								if(tab4[a][b][c][d] == tab4[a][1][c][d])

								{

									dolaczanie_kanalow(kombinacja, hec);

								}

								if(tab4[a][b][c][d] == tab4[1][b][c][d])

								{

									dolaczanie_kanalow(kombinacja, dgf);

								}


								cout << "------> " << tabl[i] << "\n";

							}

							else

								cout << "\n";

							i++;

							// ********************************************************

						}

					}

				}

			}

}

void dolaczanie_kanalow(char cel[], char zrodlo[])

{

	for(int i = 0 ; ; i++)

	{

		cel[i] = zrodlo[i];

		if(cel[i] == 0) break;

	}

	cout << cel;

}

Moim zdaniem jest on przejrzysty - nie da się chyba napisać krótszego.

Byłbym bardzo, ale to bardzo wdzięczny jeżeli ktoś powiedział mi co robię źle, ew. a co dobrze :wink:

Czekam na opinie :slight_smile:

PS. 1 uwaga odnośnie programu - tablicę jednowymiarową już uzupełniłem przykładowymi liczbami, mówiącymi ile razy wystąpiła dana kombinacja. To tak wspominam, jakby ktoś nie wiedział o co tam chodziło ^.^

Trudno odpowiedzieć co jest nie tak, wg mnie nie odpowiednio dobrany algorytm.

void pomiar(int tabl[])  {   const char *nazwy[]={"FRS","GER","HEC","DGF"};   for(int i=0;i16;++i)     {      if(tabl[i])        {         bool czyKolejny=false; // nie wystąpiło jeszcze żadnego kanału         for(int k=0;k4;++k)           {            if(i(1k)) // jezeli k-ty bit jest w i              {               if(czyKolejny) cout" + "; // jeżeli przynajmniej jeden z kanałów już wystąpił               coutnazwy[k];               czyKolejny=true; // właśnie wystąpił jeden z kanałów              }           }         cout" -- "tabl[i]endl;        }     }  } [/code]Lub jeżeli chcemy aby najpierw byli pojedyncze potem podwójne potem potrójne i na koniec wszystkie naraz
[code=php]void pomiar(int tabl[])

Ja przerabiam to cwiczenie teraz i mam pytanie do alexa. O co chodzi w if(i&(1<

k - numer bita

przesuwamy jedynkę “k” razy w lewo

k=0; => (1<

k=1; => (1<

k=2; => (1<

k=3; => (1<

itd

(i &K_TY_BIT) - daje nam w wyniku zero jezeli takiego bitu nie ma w “i” lub jeżeli jest taki bit to K_TY_BIT

w jaki sposób u alexa w drugim kodzie linijka

if(dk[i]&(1<

sprawia że kanały wypisywane są od pojedynczych przez podwójne i potrójne aż do wszystkich czterech? Jak zmienić ją by wypisywał na odwrót?