Создать строку, которая является суммой двух первых. Неправильно работает код - C (СИ)
Формулировка задачи:
Суть задачи:
с клавиатуры ввести 2 символьные строки - 8-розрядный двоичный код.
Создать 3 строку - сумму этих 2х строк и принять во внимание, что строка может получиться на 1 розряд длинее.
Подскажите что не так, и почему считает не совсем верно
и как обьяснить, а лучше заменить эту часть
#include <stdio.h> #include <math.h> int main() { int digit_to_int(char d) { char str[2]; str[0] = d; str[1] = '\0'; return (int) strtol(str, NULL, 10); } char a[7]; char b[7]; char t; int an,bn; int a_bits[7]; int b_bits[7]; int res[8]; int s=0; int i; int temp; printf("Enter the first argument:"); gets(a); printf("Enter the second argument:"); gets(b); for (i=0; i<=7; i++) { a_bits[i]=digit_to_int(a[i]); b_bits[i]=digit_to_int(b[i]); } an=0; bn=0; for (i=0; i<=7; i++) { an=an+(a_bits[i]<<(7-i)); bn=bn+(b_bits[i]<<(7-i)); } s=an+bn; temp=s; printf("%s"," "); printf("%s\n",a); printf("%s"," "); printf("%s\n",b); for (i=8; i>=0; i--) { res[i]=temp % 2; temp=temp/2; } for (i=0; i<=8; i++) { printf("%d",res[i]); } return 0; }
int main() { int digit_to_int(char d) { char str[2]; str[0] = d; str[1] = '\0'; return (int) strtol(str, NULL, 10); }
Решение задачи: «Создать строку, которая является суммой двух первых. Неправильно работает код»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <limits.h> #include <string.h> #include <errno.h> static inline uint8_t * byte_input() { uint8_t * byte = NULL, i = 0; if ((byte = malloc(sizeof(char) * CHAR_BIT + 1)) == NULL) { fprintf(stderr, "%s\n", strerror(errno)); exit(EXIT_FAILURE); } for(fputs("input byte:\n", stdout); i < CHAR_BIT; i++) byte[i] = getchar(); getchar(); byte[i] = '\0'; return byte; } static inline uint8_t * sum_bytes(uint8_t * x, uint8_t * y) { uint8_t * result = NULL; char i, j = CHAR_BIT, carry = 0; if ((result = malloc(sizeof(char) * CHAR_BIT + 2)) == NULL) { fprintf(stderr, "%s\n", strerror(errno)); exit(EXIT_FAILURE); } for(i = CHAR_BIT - 1; i > -1; i--, j--) { if (x[i] == '0' && y[i] == '0') { if (carry) { result[j] = '1'; carry = 0; } else result[j] = '0'; } else if ( (x[i] == '0' && y[i] == '1') || (x[i] == '1' && y[i] == '0')) { if (carry) result[j] = '0'; else result[j] = '1'; } else { if (carry) result[j] = '1'; else { result[j] = '0'; carry = 1; } } } if (carry) result[j] = '1'; else result[j] = '0'; return result; } int main (void) { uint8_t * x, * y, * sum; x = byte_input(); y = byte_input(); sum = sum_bytes(x, y); fprintf(stdout, "+ %s\n %s\n----------\n %s\n", x, y, sum); free(x); free(y); free(sum); exit(EXIT_SUCCESS); }
Объяснение кода листинга программы
- Предполагается, что задача заключается в создании функции, которая принимает два строковых представления двух чисел в двоичной системе счисления, суммирует их и возвращает строковое представление суммы в двоичной системе счисления.
- В начале кода определяются функции вставки и вывода, а также функции для чтения и записи байтов.
- Функция
byte_input
сначала выделяет память для строки символов, а затем считывает в нее символы из стандартного ввода. - Функция
sum_bytes
сначала выделяет память для строки символов, которая будет содержать сумму, а затем проходит по всем битам двух чисел, начиная с самого старшего бита. - Для каждого бита проверяется, является ли он единицей или нулем в обоих числах.
- Если оба числа имеют единицу на текущем бите, то в сумму записывается ноль.
- Если оба числа имеют ноль на текущем бите, то в сумму записывается ноль.
- Если числа имеют разные значения на текущем бите, то в сумму записывается единица.
- Если числа имеют одинаковые значения на текущем бите, но предыдущий бит был четным, то в сумму записывается единица.
- Если числа имеют одинаковые значения на текущем бите, и предыдущий бит был нечетным, то в сумму записывается ноль.
- Если в процессе вычисления возникает перенос, то он записывается в самый старший бит суммы.
- В конце функции
sum_bytes
выводится сумма. - В функции
main
считываются два строковых представления чисел, затем вызывается функцияsum_bytes
для их суммирования. - Выводится сумма, а затем освобождается память, выделенная для всех трех строк.
- Программа завершается с успехом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д