Вариант решения задачки №8 (программа «Перевод из системы в систему») на языке C++. Пока текст программы, а пояснения, возможно, появятся со временем.
// Программа "Перевод числа из одной системы счисления в другую"
#include <iostream>
using namespace std;
// Словари символов для позиционных систем счисления
const char lex_uc[] = "0123456789ABCDEF";
const char lex_lc[] = "0123456789abcdef";
int str_len(char*); // Функция возвращает длину строки
int power(int, int); // Функция возведения в степень
// Функция обращает строку (меняет порядок символов на противоположенный)
void reverse_str(char*);
// Функция возвращает числовое соответствие символа
int sym2num(const char*, const char*, char);
// Функция возвращает символ, соответствующий числу
char num2sym(const char*, int);
int str2num(char*, int); // Функция перевода строки в число
void num2str(char*, int, int); // Функция перевода числа в строку
int main()
{
// Сроки для ввода и вывода представления числа
char input_str[100];
char output_str[100];
// Основания входящей и выходящей систем счисления соответственно
int input_base, output_base;
// Значение переводимого числа
int value;
// Вводим исходные данные
cout << "Введите строковое представление числа и основания с.сч.: ";
cin >> input_str >> input_base >> output_base;
// Преобразуем строку в число
value = str2num(input_str, input_base);
// Преобразуем число в строку
num2str(output_str, value, output_base);
// Выводим результат
cout << "Число в " << output_base << "-ой с.сч.: " << output_str << endl;
return 0;
}
// Функция возвращает длину строки
int str_len(char str[])
{
int i;
for (i=0; str[i]; i++) {}
return i;
}
// Функция возведения в степень
int power(int num, int pow)
{
switch (pow) {
case 0:
return 1;
case 1:
return num;
default:
return num * power(num, pow-1);
}
}
// Функция обращает строку (меняет порядок символов на противоположенный)
void reverse_str(char str[])
{
int len = str_len(str);
char tmp;
for (int i=0; i < len/2; i++) {
tmp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = tmp;
}
}
// Функция возвращает числовое соответствие символа
int sym2num(const char lexu[], const char lexl[], char sym)
{
int i;
for (i=0; lexu[i]; i++) {
if (sym == lexu[i] || sym == lexl[i])
return i;
}
return -1;
}
// Функция возвращает символ, соответствующий числу
char num2sym(const char lexu[], int num)
{
return lexu[num];
}
// Функция перевода строки в число
int str2num(char str[], int base)
{
int len = str_len(str);
int num = 0;
for (int i=0; i<len; i++) {
num = num + power(base, i) * sym2num(lex_uc, lex_lc, str[len-i-1]);
}
return num;
}
// Функция перевода числа в строку
void num2str(char str[], int num, int base)
{
int i = 0;
while (num >= base) {
str[i++] = num2sym(lex_uc, num % base);
num = num / base;
}
str[i] = num2sym(lex_uc, num);
str[i+1] = 0;
reverse_str(str);
}