Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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

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ć

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ś.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...