Ввести два действительных двоичных числа, представленных как символьные строки, и найти их сумму - C (СИ)

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

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

Ввести два действительных двоичных числа, представленных как символьные строки, и найти их сумму. Помогите, может кто сталкивался с таким, помогите с кодом, или дайте совет, как реализовать задачу.

Решение задачи: «Ввести два действительных двоичных числа, представленных как символьные строки, и найти их сумму»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <alloc.h>
 
int ProvOperand(char *x)
{  int i, lc = -1;
  for(i=0; x[i]; i++) {
    if (x[i]=='.') {
      if (lc >=0) {
        printf("Ошибочен операнд %s\n", x);
        return -2;
      }
      lc = i;
      continue;
    }
    if (strchr("01", x[i])==NULL) {
      printf("Ошибочен операнд %s\n", x);
      return -2;
    }
  }
  return lc;  // Возвращает длину целой части
}
// ---------
int main(int ac, char *av[])
{ char *x, *y, *r; int i, j, lcx, lcy, ldx, ldy, lx, ly, ldr, lr;
  int xx, yy, rr, vume;
 
  if (ac<3) {
    printf("Вызов plusd число1 число2\n");
    return 1;
  }
  x = av[1];
  y = av[2];
  lx = strlen(x);
  ly = strlen(y);
  lcx = ProvOperand(x);
  if (lcx==-2) return 1;
  lcy = ProvOperand(y);
  if (lcy==-2) return 1;
  ldx = (lcx<0) ? 0 : lx - lcx - 1; // Длины дробных частей
  ldy = (lcy<0) ? 0 : ly - lcy - 1;
  if (lcx<0) lcx = lx;
  if (lcy<0) lcy = ly;
  ldr = (ldx < ldy) ? ldy : ldx;  // Вычисление длины результата
  lr = ldr + ((lcx < lcy) ? lcy : lcx) + 2;
  //printf("lr=%d ldr=%d ldx=%d ldy=%d lcx=%d lcy=%d\n",
  // lr, ldr, ldx, ldy, lcx, lcy);
  r = (char *)malloc(lr+1);
  memset(r, ' ', lr);   // На всякий случай
  r[lr] = '\0';
  if (ldr>0) r[lr-ldr-1] = '.'; // Положение точки
  //printf("  12345678\nr=%s!\n", r);
  vume = 0;  // Что в уме
  j = lr - 1;
  for(i=0; i<ldr; i++) {  // Вычисление дробной части
    xx = (ldr-i > ldx) ? '0' : x[lx+ldr-ldx-i-1];
    yy = (ldr-i > ldy) ? '0' : y[ly+ldr-ldy-i-1];
    rr = (xx - '0') + (yy - '0') + vume;
    r[j--] = rr%2 + '0';
    vume = rr / 2;
    //printf("  12345678\nr=%s!i=%d\n", r, i);
  }
  j--;
  for(i=0; i<lr-ldr-1; i++) {  // Вычисление целой части
    xx = (i >= lcx) ? '0' : x[lcx - i - 1];
    yy = (i >= lcy) ? '0' : y[lcy - i - 1];
    rr = (xx - '0') + (yy - '0') + vume;
    r[j--] = rr%2 + '0';
    vume = rr / 2;
    //printf("  12345678\nr=%s!i=%d xx=%d yy=%d vume=%d\n",
    //          r, i, xx, yy, vume);
  }
  if (*r=='0') *r = ' ';
  printf("%s\n", r);
  return 0;
}
// ---------

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

В этом коде выполняется сложение двух двоичных чисел, представленных в виде символьных строк. Список действий:

  1. Сначала выполняется проверка правильности ввода. Если входных данных меньше трех, выводится сообщение об ошибке и программа завершается.
  2. Затем входные данные сохраняются в переменных x, y, r. Длины строк и дробных частей присваиваются соответствующие значения.
  3. Переменная lcx получает результат функции ProvOperand, которая проверяет корректность ввода для первого операнда. Если операнд некорректен, программа завершается.
  4. Аналогично, переменная lcy получает результат функции ProvOperand для второго операнда.
  5. Переменные ldx и ldy получают длины дробных частей. Если дробная часть отрицательна, она считается равной нулю.
  6. Переменная ldr получает максимальную длину из дробных частей.
  7. Переменная lr вычисляет длину результата, добавляя к ldr длину целых частей и 2 для учета точки.
  8. В динамической памяти выделяется строка r длиной lr+1, и в ней инициализируется строка из пробелов.
  9. Если ldr больше нуля, в r[lr-ldr-1] записывается точка.
  10. Переменная vume инициализируется как 0 и используется для хранения суммы цифр.
  11. Два вложенных цикла вычисляют дробную и целую части результата. В каждой итерации суммируются соответствующие цифры, и результат записывается в r.
  12. Если в результате сумма цифр равна нулю, то вместо нуля записывается пробел.
  13. Наконец, результат выводится на экран. Пожалуйста, обратите внимание, что этот код предназначен для использования в учебном процессе и может не работать правильно при вводе очень больших чисел или чисел с большим количеством цифр после запятой.

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


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

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

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