Перевод чисел из одной системы счисления в другую - 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;
 
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, malloc.h
  2. Объявляется строка-масштаб Scale, которая содержит все возможные символы для представления чисел в каждой системе счисления.
  3. Определяется функция dig2int, которая принимает символ и возвращает его числовое представление в заданной системе счисления.
  4. Определяется функция convert, которая принимает строку n, исходную систему счисления from и целевую систему счисления to. Функция преобразует строку n из одной системы счисления в другую и возвращает новую строку, представляющую результат.
  5. В функции main определяются строки P и Q, которые представляют числа в исходной и целевой системах счисления соответственно.
  6. Вызывается функция convert с аргументами P, 10 (десятичная система счисления) и 16 (шестнадцатеричная система счисления). Результат выводится на экран.
  7. Аналогично пункту 6, только с другими аргументами для функции convert.
  8. Вызывается функция free для освобождения памяти, выделенной под Q и Q1.
  9. Вызывается функция system для приостановки выполнения программы до нажатия клавиши.
  10. Возвращается 0, что означает успешное завершение программы.

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы