Упражнение 3.4 K&R - C (СИ)

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

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

Дана функция:
/* itoa: преобразование n в строку s */
void itoa (int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* сохраняем знак */
n = -n; /* делаем n положительным */
i = 0;
do { /* генерируем цифры в обратном порядке */
s[i++] = n % 10 + '0'; /* следующая цифра */
} while ((n /= 10) > 0); /* исключить ее */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
При условии, что для представления чисел используется дополнительный код, наша версия
itoa не справляется с самым большим по модулю отрицательным числом, значение 
которого равняется -(2^n-1), где n — размер слова. Объясните, чем это вызвано. Модифицируйте
программу таким образом, чтобы она давала правильное значение 
указанного числа независимо от машины, на которой выполняется.
поглядел видосы про доп код, понял что проблема в смещении бита знакового за пределы битовой сетки. ну, и, правильно ли я понимаю что достаточно использовать тип double для принимаемого значения n, и там оно само приведется все по типам и заработает?

Решение задачи: «Упражнение 3.4 K&R»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#define MAX 100
void itoa (int n, char s[]);
void reverse (char s[]);
int main (){
  char s[MAX] = "";
  int n;
  printf("Введите число: ");
  scanf("%d", &n);
  itoa (n,s);
  printf("%s \n", s);
  return 0;
}
 
/* itoa: преобразование n в строку s */
void itoa (int n, char s[])
{
  int i=0;
  int sign;
  if ((sign = n) > 0) /* если положительное */
    n -= (n+n); /* делаем отрицательным */
  do { /* генерируем цифры в обратном порядке */
      s[i++] = abs(n%10)+'0'; /* следующая цифра */
    } while (n /= 10); /* исключить ее */
  if (sign < 0)
    s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
void reverse (char s[])
{
  int i, j;
  int temp;
  for (j = 0; s[j] != '\0'; ++j) /* Получаем размер массива */
    ;
  for (i = 0, j--; i < j; i++, j--){
      temp = s[i];
      s[i] = s[j];
      s[j] = temp;
    }
}

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

  1. Объединение двух строк с помощью оператора + происходит в функции itoa при генерации цифр в обратном порядке.
  2. В функции main используется функция scanf для ввода целого числа в переменную n.
  3. Функция itoa вызывается в функции main для преобразования числа n в строку s.
  4. В функции itoa используется цикл do-while для генерации цифр в обратном порядке.
  5. В функции itoa используется оператор /= 10 для деления числа n на 10 и получения следующей цифры.
  6. В функции itoa используется функция abs для получения абсолютного значения числа n.
  7. В функции itoa используется функция reverse для переворота строки s.
  8. В функции reverse используется цикл for для получения размера строки s.
  9. В функции reverse используется временная переменная temp для обмена символами в строке s.
  10. В функции main выводится строка s с помощью функции printf.
  11. В функции main используется функция scanf для ввода числа.
  12. В функции main вызывается функция itoa для преобразования числа в строку.
  13. В функции main выводится строка s с помощью функции printf.
  14. В функции main возвращается значение 0, что означает успешный конец работы программы.
  15. В функции itoa используется переменная sign для хранения знака числа n.
  16. В функции itoa используется оператор % для получения остатка от деления числа n на 10.
  17. В функции itoa используется функция abs для получения абсолютного значения числа n.
  18. В функции itoa используется переменная i для хранения индекса текущей цифры в строке s.
  19. В функции itoa используется переменная j для хранения индекса последней цифры в строке s.
  20. В функции reverse используется переменная temp для обмена символами в строке s.

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


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

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

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