Создать строку, которая является суммой двух первых. Неправильно работает код - C (СИ)

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

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

Суть задачи: с клавиатуры ввести 2 символьные строки - 8-розрядный двоичный код. Создать 3 строку - сумму этих 2х строк и принять во внимание, что строка может получиться на 1 розряд длинее. Подскажите что не так, и почему считает не совсем верно
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int digit_to_int(char d)
  6. {
  7. char str[2];
  8. str[0] = d;
  9. str[1] = '\0';
  10. return (int) strtol(str, NULL, 10);
  11. }
  12. char a[7];
  13. char b[7];
  14. char t;
  15. int an,bn;
  16. int a_bits[7];
  17. int b_bits[7];
  18. int res[8];
  19. int s=0;
  20. int i;
  21. int temp;
  22. printf("Enter the first argument:");
  23. gets(a);
  24. printf("Enter the second argument:");
  25. gets(b);
  26. for (i=0; i<=7; i++)
  27. {
  28. a_bits[i]=digit_to_int(a[i]);
  29. b_bits[i]=digit_to_int(b[i]);
  30. }
  31. an=0;
  32. bn=0;
  33. for (i=0; i<=7; i++)
  34. {
  35. an=an+(a_bits[i]<<(7-i));
  36. bn=bn+(b_bits[i]<<(7-i));
  37. }
  38.  
  39. s=an+bn;
  40. temp=s;
  41. printf("%s"," ");
  42. printf("%s\n",a);
  43. printf("%s"," ");
  44. printf("%s\n",b);
  45. for (i=8; i>=0; i--)
  46. {
  47. res[i]=temp % 2;
  48. temp=temp/2;
  49. }
  50. for (i=0; i<=8; i++)
  51. {
  52. printf("%d",res[i]);
  53. }
  54. return 0;
  55. }
и как обьяснить, а лучше заменить эту часть
Листинг программы
  1. int main()
  2. {
  3. int digit_to_int(char d)
  4. {
  5. char str[2];
  6. str[0] = d;
  7. str[1] = '\0';
  8. return (int) strtol(str, NULL, 10);
  9. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <limits.h>
  5. #include <string.h>
  6. #include <errno.h>
  7.  
  8. static inline uint8_t * byte_input() {
  9.     uint8_t * byte = NULL, i = 0;
  10.    
  11.     if ((byte = malloc(sizeof(char) * CHAR_BIT + 1)) == NULL) {
  12.         fprintf(stderr, "%s\n", strerror(errno));
  13.         exit(EXIT_FAILURE);
  14.     }
  15.     for(fputs("input byte:\n", stdout); i < CHAR_BIT; i++)
  16.         byte[i] = getchar();
  17.     getchar();
  18.     byte[i] = '\0';
  19.    
  20.     return byte;
  21. }
  22.  
  23. static inline uint8_t * sum_bytes(uint8_t * x, uint8_t * y) {
  24.     uint8_t * result = NULL;
  25.     char i, j = CHAR_BIT, carry = 0;
  26.    
  27.     if ((result = malloc(sizeof(char) * CHAR_BIT + 2)) == NULL) {
  28.         fprintf(stderr, "%s\n", strerror(errno));
  29.         exit(EXIT_FAILURE);
  30.     }
  31.    
  32.     for(i = CHAR_BIT - 1; i > -1; i--, j--) {
  33.        
  34.         if (x[i] == '0' && y[i] == '0') {
  35.             if (carry) {
  36.                 result[j] = '1';
  37.                 carry = 0;
  38.             } else
  39.                 result[j] = '0';
  40.         } else if ( (x[i] == '0' && y[i] == '1') ||
  41.                     (x[i] == '1' && y[i] == '0')) {
  42.             if (carry)
  43.                 result[j] = '0';
  44.             else
  45.                 result[j] = '1';
  46.         } else {
  47.             if (carry)
  48.                 result[j] = '1';
  49.             else {
  50.                 result[j] = '0';
  51.                 carry = 1;
  52.             }
  53.         }
  54.     }
  55.    
  56.     if (carry)
  57.         result[j] = '1';
  58.     else
  59.         result[j] = '0';
  60.        
  61.     return result;
  62. }
  63.  
  64. int main (void) {
  65.    
  66.     uint8_t * x, * y, * sum;
  67.    
  68.     x = byte_input();
  69.     y = byte_input();
  70.     sum = sum_bytes(x, y);
  71.    
  72.     fprintf(stdout, "+  %s\n   %s\n----------\n  %s\n", x, y, sum);
  73.    
  74.     free(x);
  75.     free(y);
  76.     free(sum);
  77.  
  78.     exit(EXIT_SUCCESS);
  79. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы