Ocena użytkownikóww: ***** / 12
Nadesłany przez Tomasz Lubiński, 23 listopada 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
systemy.c:
//
// 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;
}