Skocz do zawartości

Algorytm przeliczający z systemu czwórkowego na dziesiętny


zielePL

Pomocna odpowiedź

Witam,
pracuję nad pewnym projektem a jako że jestem początkujący napotkałem na problem,
potrzebuję aby program w arduino w pewnym momencie odebrane dane liczbowe przekrztałcał z systemu czwórkowego na dziesiętny.

I teraz pytanie 😃

Pomożecie ?

znalazłem coś takiego:

//
// Konwersja z i na system dziesietny
//
// www.algorytm.org
// (c)2006 by Tomasz Lubinski
//

#include "stdio.h"
#include "stdlib.h"

#define MAX_BASE 36
char pattern[MAX_BASE + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";


//returns converted n or NULL if an error occurs
char *convertTo(char *dst, unsigned int n, int base)
{
int i = 0;
int j;
char tmp[100];

//base is too big or too small
if ((base > MAX_BASE) || (base < 2))
return NULL;

//n is equal to 0, do not process, return "0"
if (n == 0)
{
dst[0] = '0';
dst[1] = 0;
}

//process until n > 0
while (n>0)
{
tmp[i] = pattern[n % base];
n /= base;
i++;
}

//revert tmp to result
for (j=0; j<i; j++)
{
dst[j] = tmp[i-j-1];
}

dst[i] = 0;
return dst;
}

//return value of x or -1 if an error occurs
int valueOf(char x, int base)
{
int i;
for (i=0; i<base; i++)
{
if (x == pattern[i])
{
return i;
}
}
return -1;
}

//returns converted n or 0 if an error occurs
unsigned int convertFrom(char *n, int base)
{
int i, x;
int p = 1;
int result = 0;

//base is too big or too small
if ((base > MAX_BASE) || (base < 2))
return 0;

strupr(n);

for (i=strlen(n)-1; i>=0; i--)
{
x = valueOf(n[i], base);
if (x < 0)
{
return 0;
}
result += (x * p);
p *= base;
}

return result;
}

int main(void)
{
char result[100];

convertTo(result, 3568, 2);
printf("3568 w systemie dwojkowym = %s\n", result);

convertTo(result, 3568, 3);
printf("3568 w systemie trojkowym = %s\n", result);

convertTo(result, 3568, 8);
printf("3568 w systemie osemkowym = %s\n", result);

convertTo(result, 3568, 16);
printf("3568 w systemie szesnastkowym = %s\n", result);

convertTo(result, 3568, 20);
printf("3568 w systemie dwudziestkowym = %s\n", result);

printf("100010010 w systemie dwojkowym to %d w systemie dziesietnym\n", convertFrom("100010010", 2));

printf("7542 w systemie ósemkowym to %d w systemie dziesietnym\n", convertFrom("7542", 8));

printf("E854 w systemie szesnastkowym to %d w systemie dziesietnym\n", convertFrom("E854", 16));

return 0;
}

Źródło

tylko nie mogę sobie tego dostosować do arduino

Link do komentarza
Share on other sites

Trochę rozumiem, trochę nie. Napewno jak go skompiluje na PC toi sposób że po wpisaniu danych wyświetli mi w przeliczeniu na dwójkowy, trójkowy, ósemkowy, szesnastkowy a na 4-kowy nie.

W arduino żeby np zadziałało to na Monitorze portu szeregowego muszę zmienić nieco kod np printf na println. Trochę nie wiem gdzie miałbym dodać np Serial.begin(9600);

printf("1231 w systemie czwórkowym to %d w systemie dziesietnym\n", convertFrom("1231", 4));

rozumiem, że teoretycznie dodanie takiej formuły powinno dodać przeliczenie z 4-kowego na dziesiętny

jeżeli jestem w błedzie proszę mnie z niego wyprowadzić

Link do komentarza
Share on other sites

A może własnie jako początkujący (w pisaniu programów? w robieniu projektów? myśleniu algorytmiczny? mnapisz dokładniej) powinieneś zastanowić się nad samym algorytmem konwersji, zamiast leczyć objawowo kod którego nie rozumiesz?

Jak Twoim zdaniem powinno to przebiegać? Przecież w układzie czwórkowym nie ma nic magicznego. Jeśli rozumiesz jak działa interpretacja ciągu "123" w natywnym dla nas układzie dziesiętnym, to i czwórkowy i siódemkowy masz z głowy. Piątkowy też dla ścisłości.

Czy możesz zacząć od napisania swoimi słowami jak rozumiesz taki proces konwersji łańcuch liczb na wartość? Może być konwersji dziesiętnej, nie wymagam od razu zbudowania Krakowa. Taka droga daje przynajmniej nadzieję, że wyjdziesz z tego ćwiczenia trochę mniej początkujący niż jesteś.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.