Ввести два действительных двоичных числа, представленных как символьные строки, и найти их сумму - 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; } // ---------
Объяснение кода листинга программы
В этом коде выполняется сложение двух двоичных чисел, представленных в виде символьных строк. Список действий:
- Сначала выполняется проверка правильности ввода. Если входных данных меньше трех, выводится сообщение об ошибке и программа завершается.
- Затем входные данные сохраняются в переменных
x
,y
,r
. Длины строк и дробных частей присваиваются соответствующие значения. - Переменная
lcx
получает результат функцииProvOperand
, которая проверяет корректность ввода для первого операнда. Если операнд некорректен, программа завершается. - Аналогично, переменная
lcy
получает результат функцииProvOperand
для второго операнда. - Переменные
ldx
иldy
получают длины дробных частей. Если дробная часть отрицательна, она считается равной нулю. - Переменная
ldr
получает максимальную длину из дробных частей. - Переменная
lr
вычисляет длину результата, добавляя кldr
длину целых частей и 2 для учета точки. - В динамической памяти выделяется строка
r
длинойlr+1
, и в ней инициализируется строка из пробелов. - Если
ldr
больше нуля, вr[lr-ldr-1]
записывается точка. - Переменная
vume
инициализируется как 0 и используется для хранения суммы цифр. - Два вложенных цикла вычисляют дробную и целую части результата. В каждой итерации суммируются соответствующие цифры, и результат записывается в
r
. - Если в результате сумма цифр равна нулю, то вместо нуля записывается пробел.
- Наконец, результат выводится на экран. Пожалуйста, обратите внимание, что этот код предназначен для использования в учебном процессе и может не работать правильно при вводе очень больших чисел или чисел с большим количеством цифр после запятой.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д