Показать сообщение отдельно

  #465  
Старый 30.04.2008, 13:49
krypt3r
Познавший АНТИЧАТ
Регистрация: 27.04.2007
Сообщений: 1,044
С нами: 10021597

Репутация: 905


По умолчанию

Код на языке C, преобразующий число из одной системы счисления в другую (а не только 2, 8, 10, 16). Принимает в качестве аргументов число (целое положительное), его систему счисления и систему счисления, в которую надо преобразовать. Сорри, лень оптимизить =)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MAXSIZE 255

char *ReverseStr (char *s)
{
  int i = 0, j, len;
  char s2 [MAXSIZE];

  len = strlen (s);
  j = len - 1;
  bzero (s2, len + 1);
  while (j >= 0)
  {
    s2 [i++] = s [j--];
    //i++;
    //j--;
  }
  return s2;
}

int convertToDec (char *in, int in_ss)
{
  int len = strlen (in), i, j = 0;
  int N = 0;

  i = len - 1;
  printf ("i = %d\n", i);
  while (i >= 0)
  {
    if ((in [i] >= '0') && (in [i] <= '9'))
      in [i] -= 0x30;
    if ((in [i] >= 'a') && (in [i] <= 'f'))
      in [i] -= 0x57;
    N += in [i] * (int) (pow (in_ss, j));
    i--;
    j++;
  }
  //printf ("%d\n", N);
  return N;
}

char *convert (int number, int out_ss)
{
  int ost = 1, i = 0;
  char out_num [MAXSIZE];

  memset (out_num, '\0', MAXSIZE);
  while (number >= out_ss)
  {
    ost = number % out_ss;
    number = (int) (number / out_ss);
    if ((ost >= 0) && (ost <= 9))
      out_num [i] = ost + 0x30;
    else if ((ost >= 10) && (ost <= 15))
      out_num [i] = ost + 0x57;
    if (number < out_ss)
    {
      i++;
      if ((number >= 0) && (number <= 9))
        out_num [i] = number + 0x30;
      if ((number >= 10) && (number <= 15))
        out_num [i] = number + 0x57;
      //out_num [i] = number + 0x30;
    }
    //printf ("Number: %d\tOst: %d\n", number, ost);
    i++;
  }

  //printf ("Out: %s\n", ReverseStr (out_num));
  return ReverseStr (out_num);
}

int main (int argc, char** argv)
{
  char *in_number, *out_number;
  int in_system, out_system, dec_number;

  if (argc != 4)
  {
    printf ("Usage: %s [number input_system output_system]\n", argv [0]);
    return 0;
  }
  in_number = argv [1];
  in_system = atoi (argv [2]);
  out_system = atoi (argv [3]);
  if (in_system == 10)
    dec_number = atoi (in_number);
  else
    dec_number = convertToDec (in_number, in_system);

  //printf ("DEC: %d\n", dec_number);
  printf ("Input number: %s\n", in_number);
  printf ("Input system: %d\n", in_system);
  printf ("Output system: %d\n", out_system);
  printf ("Output number: ");
  if (out_system != 10)
  {
    out_number = convert (dec_number, out_system);
    printf ("%s\n", out_number);
  }
  else
    printf ("%d\n", dec_number);

  return 0;
}
ЗЫ. Давно хотел этот код написать, да руки все не доходили.
 
Ответить с цитированием