Перевод числа из любой системы счисления в десятичную - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вроде бы и написал прогу, а все равно косяки выдает. Программа переводит число из любой СС в десятичную.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
 
long to10 (int b, char* str[])
{
  int  *a, n=0, t;
  long r=0;
  char c;
  a=(int*) malloc (0);
  while (n<=strlen(str)-1)
  {
    c=str[n];
    if (c>='0' && c<='9') t=c-'0';
    else if (c>='A' && c<='F') t=c-'A'+10;
    else if (c>='a' && c<='f') t=c-'a'+10;
    else break;
    if (t>=b) break;
    n++;
    a=(int*)realloc(a, n*sizeof(int));
    a[n-1]=t;
  }
  int i=0;
  for (i=0; i<n; i++)
  {
    r+=a[n-1-i]*pow(b, i);
  }
  return r;
}
 
int main ()
{
  int i=0, b;
  char c; 
  char str[255];
  printf ("Enter the basis: ");
  scanf ("%d", &b);
  while (!(b>1 && b<=16))
  {
    printf ("The basis is wrong. Enter it again: ");
    scanf ("%d", &b);
  }
  printf ("Enter the number: ");
  scanf (str);
  printf ("Number with the basis 10: %ld", to10(b, &str));
 
  return 0;
}

Решение задачи: «Перевод числа из любой системы счисления в десятичную»

textual
Листинг программы
// Преобразует десятичное число в другую
//  систему счисления (от 2-х до 10-ти)
#include <stdio.h>
#include <conio.h>
void main()
{
    int osn,     // основание системы счисления
        n,       // исходное число
        cn,      // копия исходного числа
        r;       // остаток от деления числа
                 // на основание сист счисл.
    char st[17]; // представление числа в заданной сист. счисл.
    int i;
 
    printf("\Введите целое число ->");
    scanf("%d", &n);
    printf("Введите основание системы счисления ->");
    scanf("%d", &osn);
 
    cn = n;
    //  делим исходное число на основание системы
    //  счисления до тех пор, пока остаток от деления
    //  больше основания системы счисления.
    //  Остаток от деления на каждом щаге - очередная цифра
    st[16] ='\0';
    i = 15;
    do {
      r = n  % osn;  // очередная цифра
      n = n / osn; // целая часть деления
      // printf("цифра:%d остаток:%d\n", r,n);
      st[i--] = r + 48; // преобразование цифры в символ
    } while ( n > 0);
 
    // "сдвинем" сформированную строку в начало
    i++;
    int j = 0;
    while(st[i])
      st[j++] = st[i++];
    st[j] = '\0';
 
    st[i--] = ' ';
    printf("Десятичному числу %d соответствует ", cn);
    printf("число %s по основанию %d\n", st, osn);
 
    printf("\nДля завершения нажмите <Enter>");
    getch();
}

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

  1. Ввод исходных данных:
    • Ввод исходного числа с клавиатуры, сохранен в переменной n.
    • Ввод основания системы счисления с клавиатуры, сохранено в переменной osn.
  2. Создание копии исходного числа, сохранено в переменной cn.
  3. Деление исходного числа на основание системы счисления, сохранено в переменной n.
  4. Получение остатка от деления, сохранено в переменной r.
  5. Добавление очередной цифры к представлению числа в виде строки, сохранено в переменной st.
  6. Уменьшение значения переменной i на 1.
  7. Проверка, что n больше нуля, чтобы продолжить выполнение цикла.
  8. Сдвиг сформированной строки в начало, сохранено в переменной j.
  9. Вывод результата:
    • Вывод представления числа в заданной системе счисления, сохранено в переменной st.
    • Вывод основания системы счисления, сохранено в переменной osn.
  10. Завершение работы программы:
    • Ожидание нажатия клавиши Enter для завершения работы программы. Код преобразует десятичное число в другую систему счисления, вводящуюся с клавиатуры. Он сначала получает основание системы счисления и исходное число, затем преобразует число в систему счисления, используя цикл деления на основание системы счисления. После этого он выводит результат в виде строки в заданной системе счисления.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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