Перевод чисел из одной системы счисления в другую - C (СИ) (69889)
Формулировка задачи:
Задание: Написать программу на языке С для перевода числа,
представленного в системе счисления с основанием S, в системы счисления с
основаниями P, Q, R. Обеспечить корректность ввода числа в системе счисления с
основанием S. Перевод чисел реализовать с применением функций. (Разработайте
функцию для перевода числа из системы счисления с основанием S в систему счисления с
основанием P, а затем, функции для перевода из P в Q и из P в R.) Не использовать
стандартных возможностей по вводу/выводу чисел представленных в 2-ой, 8-ой, 16-ой
системах счисления. Для представления цифр больших 9 использовать заглавные буквы
латинского алфавита.
S=13
P=10
Q=8
R=14
Помогите составить программу, я в программировании только начинающий.
Есть код на C++, может кому то поможет:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
char model[14] = {'0', '1','2','3','4','5','6','7','8','9','A', 'B', 'C', 'D'};
int conversion_to_int (string s)
{
double result = 0;
int digits = s.length();
double razr;
double osn = 13;
for ( int i = digits; i>0; i--)
{
for (int b = 0; b <= 13; b++)
{
if (s[digits-i] == model [b])
{
razr = b;
break;
}
if (b == 13)
{
cout << "ВВЕДЕНО НЕКОРРЕКТНОЕ ЗНАЧЕНИЕ!!!!" << endl;
cout << "Расчёт ведется для значения 0" << endl;
return 0;
}
}
result = result + razr*pow(osn,i-1);
}
return (int) result;
}
string conversion_to_other (int digit, int num) // digit - основание, num - число
{
string number;
int ostatok;
while (num > digit)
{
ostatok = num%digit;
number = number + model [ostatok];
num = num/digit;
}
number = number + model [num];
reverse(number.begin(),number.end());
return number;
}
int _tmain(int argc, _TCHAR* argv[])
{
string s;
int result;
setlocale(LC_CTYPE, "rus");
cout << "Введите число с основанием системы исчисления 13" << endl;
cout << "Используйте только цифры и заглавные латинские буквы" << endl;
for (int i = 0; i<13; i++)
{
cout << model [i] << " ";
}
cout << endl << endl;
cin >> s;
result = conversion_to_int (s);
cout << endl<< "Ваше число:"<<endl<<endl;
cout << "по основанию 8 " << '\t'<< '\t'<< conversion_to_other (8, result) << endl;
cout << "по основанию 10 " << '\t'<< conversion_to_other (10, result) << endl;
cout << "по основанию 14 " << '\t'<< conversion_to_other (14, result) << endl;
getchar();
getchar();
}Решение задачи: «Перевод чисел из одной системы счисления в другую»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
char *Scale="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int dig2int(char d)
{
int i;
for (i=0; i<36; i++) if (Scale[i]==d) return i;
}
char *convert(char *n, int from, int to)
{
int i,j,l,p,k;
char *buf;
l=strlen(n);
p=0;
for (i=0; i<l; i++) p=p*from+dig2int(n[i]);
buf=(char *) calloc(100,1);
k=99;
l=0;
while (1)
{
j=p%to;
buf[k--]=Scale[j];
l++;
p=p/to;
if (p==0) break;
}
j=0;
k++;
while (1)
{
buf[j++]=buf[k++];
if (k == 100) break;
}
buf=(char *) realloc(buf,(l+1));
return buf;
}
int main(int argc, char *argv[])
{
char *P="20";
char *Q;
char *P1="12A";
char *Q1;
Q=convert(P,10,16);
printf("%s \n",Q);
Q1=convert(P1,13,2);
printf("%s \n",Q1);
free(Q);
free(Q1);
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, malloc.h
- Объявляется строка-масштаб Scale, которая содержит все возможные символы для представления чисел в каждой системе счисления.
- Определяется функция dig2int, которая принимает символ и возвращает его числовое представление в заданной системе счисления.
- Определяется функция convert, которая принимает строку n, исходную систему счисления from и целевую систему счисления to. Функция преобразует строку n из одной системы счисления в другую и возвращает новую строку, представляющую результат.
- В функции main определяются строки P и Q, которые представляют числа в исходной и целевой системах счисления соответственно.
- Вызывается функция convert с аргументами P, 10 (десятичная система счисления) и 16 (шестнадцатеричная система счисления). Результат выводится на экран.
- Аналогично пункту 6, только с другими аргументами для функции convert.
- Вызывается функция free для освобождения памяти, выделенной под Q и Q1.
- Вызывается функция system для приостановки выполнения программы до нажатия клавиши.
- Возвращается 0, что означает успешное завершение программы.