Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
26.05.2014
Размер:
1.36 Кб
Скачать
#include <stdio.h>

#include "convert.h"

#define MAXBASE 16

static char	chr[] = "0123456789abcdef";
static int	dgt[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

void error(char *reason){
	fprintf(stderr,"error: %s",reason);
	exit(1);
}

static int todigit(char s){
	int i;
	
	for(i = 0; i < MAXBASE; i++)
		if(chr[i] == s) return dgt[i];
	error("Invalid digit");
}

static int todigitbs(char s){
	int l = 0;
	int r = MAXBASE;
	int m;
	
	while(l < r){
		m = (l + r) / 2;
		
		if(chr[m] < s)
			l = m + 1;
		else r = m;
	}
	
	if(chr[l] == s)
		return dgt[l];
	else error("Invalid digit");
}
	

static char tochar(int num){
	int i;
	
	for(i = 0; i < MAXBASE; i++)
		if(dgt[i] == num) return chr[i];
	error("Invalid number");
}

static char tocharbs(int num){
	int l = 0;
	int r = MAXBASE;
	int m;
	
	while(l < r){
		m = (l + r) / 2;
		
		if(dgt[m] < num)
			l = m + 1;
		else r = m;
	}
	
	if(dgt[l] == num)
		return chr[l];
	else error("Invalid number");
}

int xtodec(char *str, int x){
	int num = 0;
	int i = 0;
	
	while(str[i])
		num = num * x + todigitbs(str[i++]);
		
	return num;
}

void dectox(int num, int x, char *str){
	static int i = 0;
	
	if(!((num/x) < x))
		dectox(num/x,x,str);
	else str[i++] = tocharbs(num / x);
	
	str[i++] = tocharbs(num % x);
	str[i] = '\0';
}

void convert(char *str, int from, int to){
	dectox(xtodec(str,from),to,str);
}

Соседние файлы в папке lab1