Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c] funkcja oblicza wartosc zapisu dwojkowego

kkk1234 26 Lut 2012 20:09 914 7
  • #1 26 Lut 2012 20:09
    kkk1234
    Poziom 7  

    Witam,

    Zmagam się z napisaniem funkcji, która oblicza wartosc zapisu dwojkowego o dlugosci n w tablicy, cyrfy sa typu double. funkcja zwraca oczywiscie wynik.

    double pow(double x, double y) - ta funkcja znajduje sie we wskazowkach, tylko nie mam pomyslu do czego ja tak naprawde wykorzystac?

    double Oblicz_dwojkowy (int tab[], int n){

    i tak naprawde sam sie juz pogubilem... funkcja for na sprawdzanie czy liczbami sa 0 i 1, a pozniej jesli powiedzmy tab[3] = 1 to 2 do potegi drugiej tak? i tu sie przyda ta wczesniej podana funkcja na obliczanie potegi.

    nie potrzebuje gotowego kodu, tylko wskazowki, ktore pomaga mi w zrobieniu tego... ;x

    0 7
  • #2 26 Lut 2012 20:22
    pawel-jwe
    Poziom 30  

    Praktycznie sam sobie odpowiedziałeś jak to ma wyglądać :)
    Dodaj tylko na końcu pętli for sumowanie ze sobą kolejnych liczb otrzymywanych z funkcji "pow" (oczywiście jeśli dany bit==1) i gotowe

    0
  • #3 26 Lut 2012 22:36
    kkk1234
    Poziom 7  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ale co z tym neiszczesnym zerem zrobic?

    0
  • Pomocny post
    #4 27 Lut 2012 00:47
    the_fifth_horseman
    Poziom 32  

    W ten sposób i po sprawie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak na serio to twoja funkcja może być o wiele krótsza - i nieco bardziej sensowna - gdybyś skorzystał z typu unsigned long long (lub też _u64 lub unsigned __int64) zamiast double (poczytaj sobie o strukturze liczb zmiennoprzecinkowych - używając double masz tylko 51, maks 52 bity zgodne z wejściem ale większy górny zakres wartości; używając unsigned long long możesz odczytać tylko 64 bity z wejścia zanim zaczniesz tracić najbardziej znaczący bit, ale za to wszystkie będą zgodne z wejściem). Dwie zmienne, w pętli dwie operacje bitowe ( poczytaj o sumie bitowej i przesunięciu bitowym ), całość prosta jak przysłowiowa konstrukcja cepa.

    0
  • #5 27 Lut 2012 06:57
    kkk1234
    Poziom 7  

    w zadaniu mam ze maja byc typy double.

    nie rozumiem tego zapisu (tab[i]-'0') i dlaczego wynik z poczatku mam mnozyc razy dwa?

    0
  • Pomocny post
    #6 27 Lut 2012 08:14
    pawel-jwe
    Poziom 30  

    Tak było by chyba najczytelniej i najprościej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Również trochę nie rozumiem tego zapisu:
    the_fifth_horseman napisał:

    for (i=0, i<n, i++){
    wynik *=2;
    wynik +=pow((double)(tab[i]-'0'), (double)(i));
    }

    W jaki sposób miało by to niby działać prawidłowo? Przecież ten zapis " (double)(tab[i]-'0' " będzie nam zwracać wartości -48 lub -47.

    0
  • #7 27 Lut 2012 09:11
    the_fifth_horseman
    Poziom 32  

    Przeprasza, to ja się tym razem zagmatwałem. Mnożenie faktycznie niepotrzebne. Byłoby potrzebne gdybyśmy wczytywali w kolejności od najbardziej do najmniej znaczącej pozycji.

    Cytat:
    Przecież ten zapis " (double)(tab[i]-'0' " będzie nam zwracać wartości -48 lub -47.
    Zasugerowałem się tym że autor w swoim kodzie wyżej potraktował tablicę jako tablicę wartości typu char:
    kkk1234 napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 27 Lut 2012 11:32
    kkk1234
    Poziom 7  

    Okej, dziękuje bardzo za pomoc. Miłego dnia :-)

    0