Создать строку, которая является суммой двух первых. Неправильно работает код - 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);
}

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

  1. Предполагается, что задача заключается в создании функции, которая принимает два строковых представления двух чисел в двоичной системе счисления, суммирует их и возвращает строковое представление суммы в двоичной системе счисления.
  2. В начале кода определяются функции вставки и вывода, а также функции для чтения и записи байтов.
  3. Функция byte_input сначала выделяет память для строки символов, а затем считывает в нее символы из стандартного ввода.
  4. Функция sum_bytes сначала выделяет память для строки символов, которая будет содержать сумму, а затем проходит по всем битам двух чисел, начиная с самого старшего бита.
  5. Для каждого бита проверяется, является ли он единицей или нулем в обоих числах.
  6. Если оба числа имеют единицу на текущем бите, то в сумму записывается ноль.
  7. Если оба числа имеют ноль на текущем бите, то в сумму записывается ноль.
  8. Если числа имеют разные значения на текущем бите, то в сумму записывается единица.
  9. Если числа имеют одинаковые значения на текущем бите, но предыдущий бит был четным, то в сумму записывается единица.
  10. Если числа имеют одинаковые значения на текущем бите, и предыдущий бит был нечетным, то в сумму записывается ноль.
  11. Если в процессе вычисления возникает перенос, то он записывается в самый старший бит суммы.
  12. В конце функции sum_bytes выводится сумма.
  13. В функции main считываются два строковых представления чисел, затем вызывается функция sum_bytes для их суммирования.
  14. Выводится сумма, а затем освобождается память, выделенная для всех трех строк.
  15. Программа завершается с успехом.

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


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

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

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