[C++] n-bitowy Kod Graya

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

[C++] n-bitowy Kod Graya

Post autor: Luminofor » 04 lip 2009, 23:03

Jak zwykle będę wdzięczny za wszelkie uwagi, spostrzeżenia i komentarze.

Kod: Zaznacz cały

#include <iostream>
#include <math.h> // do poteg

using namespace std;

void binary(int liczba);

int main()
{
	int n,biezacy=0,nastepny,grey;
	long int licznik=0;
	cout << "Podaj n: ";  // liczba bitow
	cin >> n;
	cout << n << "-bitowy Kod Graya: " << "\n\n0";
	for(int i=0; i<pow(2.,n); i++)  // wlasciwa petla, od 0 do 2^n
	{
		++licznik;
		biezacy=i;
		nastepny=biezacy>>1;
		grey=biezacy^nastepny; // wyznaczanie i-tego wyrazu kodu Graya
		binary(grey);  // zamiana na postac binarna i wyswietlenie
		cout << "    Przeliczonych kombinacji: " << licznik << "\n";
	}
	return 0;
}

//******************************************
void binary(int liczba)  // zamiana liczby dziesietnej na dwojkowa
{
	int tablica[100]={0},i=0;
	while(liczba)
	{
		tablica[i++]=liczba%2;
		liczba=liczba/2;
	}
	for(int j=i-1; j>=0; j--)
	{
		cout << tablica[j];
	}
}

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 05 lip 2009, 23:53

Witam.
Pozwoliłem sobie skrócić zapis kodu. :razz:
Czy to trzyma się kupy,bo efekt jest taki sam jak u Ciebie ,
czy jak zwykle tylko mi się zdaje. :???:

Kod: Zaznacz cały

#include <iostream> 
#include <cmath>
using namespace std;

void binary(int liczba);

int main()
{
    int n;
    cout << "Podaj n: ";
    cin >> n;
    cout << n << "-bitowy Kod Graya: " << "\n\n";

    int i = 0;
    int biezacy=0;
    long int licznik=0;

    while (i<pow(2.,n))
    { 
        binary((biezacy^(biezacy=i)>>1));
        cout << "    Przeliczonych kombinacji: " << ++licznik << "\n";
        ++i;
    }
    
    return 0;
}

//******************************************
void binary(int liczba)
{
    int tablica[100],i = 0;
    
    do
    {
      tablica[i++]=liczba%2;

    }while(liczba/= 2);

    while(i)
    {
      --i;
      cout << tablica[i];
    }
}

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 06 lip 2009, 0:12

Faktycznie, można tak skrócić, ale wychodzi na to samo. :)
Działa. :)
Btw. swój kod pisałem na szybko "aby działał", oczywiście można to skrócić na 1000 sposobów. :)

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 06 lip 2009, 0:14

Jednak dobry podręcznik kupiłem.
Dzięki. :grin:

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 06 lip 2009, 0:15

zenzee pisze:Jednak dobry podręcznik kupiłem.
Symfonia? Czy coś innego? Ja mam na składzie najnowszą Symfonię i Thinking in C++ którego jeszcze nie ruszyłem.
No i materiał z wykładów i parę pdfów :D :smile:

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 06 lip 2009, 0:17

"Szkoła programowania "by Stephen Prata.

[ Dodano: 2009-07-06, 10:07 ]
W sumie zmienna licznik też jest niepotrzebna:

Kod: Zaznacz cały

while (i<pow(2.,n))
    {
        binary((biezacy^(biezacy=i)>>1));
        cout << "    Przeliczonych kombinacji: " << ++i << "\n";
    }

ODPOWIEDZ