Programowanie w języku C/C++ » FAQ

Konwersja systemów liczbowych

Z racji ciągłych powtarzających sie pytań. Przykład algorytmu. Jeżeli kompilator odrzuca strlwr(), to trzeba zmienić małe literki w digit na wielkie (ja po prostu lubie małe) i zamienić strlwr() na strupr(), albo napisać swoje.

// kompilowane na borlandzie
#include <stdio.h>
#include <math.h>
#include <string.h>
 
 
char const * const digit="0123456789abcdefghijklmnopqrstuvwxyz";
 
char* strn(unsigned long liczba,char podstawa){
  static char wynik[33]; // 32 bity + 0
  char i=1+log(liczba)/log(podstawa);
  wynik[i]=0;                      
  while(i--){
    wynik[i]=digit[liczba%podstawa];
    liczba/=podstawa;
  }
  return wynik;
}
 
unsigned long val(char* znaki,unsigned char podstawa,unsigned char& error){
  // val - znasz to z tp
 
  unsigned long  w=0;   // w jak wynik
 
  char* zn=new char[strlen(znaki)+1];
 
  strcpy(zn,znaki);     // zeby nie zmieniac ciagu wejsciowego
  strlwr(zn);           // lower case, bo digit to male cyferki
 
  for(unsigned char i=0;zn[i];i++){
    w*=podstawa;
    error=(strchr(digit,zn[i])-digit);
    if(error>=podstawa){
      error=1+i;
      break;
    }
    w+=error;
    error=0;
  }
  delete zn;
  return w;
}
 
int main(){
  unsigned char  i,err;
  unsigned long  wynik;
 
  for(i=2;i<20;i++){
    wynik=val("345",i,err);
    printf("podstawa: %d   error: %d   ",i,err); // err-1 znak jest bledny
    if(!err)printf("string: %s   value: %d   \n",strn(wynik,10),wynik);
      else printf("\n");
  }
  return 0;
}

3 komentarze

ŁF 2004-01-28 17:25

mam wrażenie, że to już było...

flabra 2004-01-28 17:42

Jasne, ale jeszcze nie w faq, a nie chce mi się ciągle szukać tego linku