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