Создать строку, которая является суммой двух первых. Неправильно работает код - 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
для их суммирования. - Выводится сумма, а затем освобождается память, выделенная для всех трех строк.
- Программа завершается с успехом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д