Перевод из шестнадцатиричной системы в десятичную - C (СИ)

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

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

Доброго времени суток. Изучаю язык Си по учебнику Кернигана и Ричи, столкнулся со следующей задачей: необходимо написать программу, которая бы преобразовывала последовательность цифр, начинающихся с 0x или 0X в соответствующее целое число. Цифры могут быть из диапазона 0..9 a..f A..F . Вот мой код:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAXSIZE 10
  4. int pow(int base,int number);
  5. int main()
  6. {
  7. char charArray[MAXSIZE];
  8. char c;
  9. int intSizeOfArray;
  10. int intDecimalNumber;
  11. int i;
  12. i = 0; intSizeOfArray = 0; intDecimalNumber = 0;
  13. while ((c=getchar())!=EOF)
  14. {
  15. if (i >= MAXSIZE - 1)
  16. break;
  17. else
  18. {
  19. charArray[i] = c;
  20. i++;
  21. }
  22. }
  23. charArray[i] = '\0';
  24. i = 0;
  25. if (charArray[0] == '0' && ((charArray[1] == 'x') || (charArray[1] == 'X')))
  26. {
  27. intSizeOfArray = strlen(charArray) - 3; //не считая первых двух символов и символа переноса каретки
  28. i = 2;
  29. while (intSizeOfArray != 0)
  30. {
  31. if (charArray[i] == 'A' || charArray[i] == 'a')
  32. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 10;
  33. else if (charArray[i] == 'B' || charArray[i] == 'b')
  34. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 11;
  35. else if (charArray[i] == 'C' || charArray[i] == 'c')
  36. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 12;
  37. else if (charArray[i] == 'D' || charArray[i] == 'd')
  38. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 13;
  39. else if (charArray[i] == 'E' || charArray[i] == 'e')
  40. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 14;
  41. else if (charArray[i] == 'F' || charArray[i] == 'f')
  42. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 15;
  43. else if (charArray[i] >= '0' && (charArray[i] <= '9'))
  44. intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * (charArray[i] - '0');
  45. else
  46. {
  47. printf("%s", "Syntax error");
  48. break;
  49. }
  50. intSizeOfArray--; i++;
  51. }
  52. printf("%d",intDecimalNumber);
  53. }
  54. else
  55. printf("%s","That is not hexademical number");
  56. printf("%s","Press any key...");
  57. getchar();
  58. return 0;
  59. }
  60. int pow(int number,int base)
  61. {
  62. int result;
  63. int i;
  64. result = 1; i = 0;
  65. while (i != (number - 1))
  66. {
  67. result = result*base;
  68. i++;
  69. }
  70. return result;
  71. }
У меня несколько вопросов. 1. Подскажите, как улучшить код, дайте конструктивные советы. 2. При нажатии на комбинацию клавиш Ctrl + C выскакивает окно: Первый этап обработки исключения по адресу 0x75C6221B (KernelBase.dll) в 2.3_Program.exe: 0x40010005: Control-C. Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно. Как обработать правильно данную комбинацию? Заранее спасибо!

Решение задачи: «Перевод из шестнадцатиричной системы в десятичную»

textual
Листинг программы
  1. float pow(float x, int n) {
  2.    float y = 1;
  3.    int i = n;
  4.    while(i > 0) {
  5.       if(i % 2 == 1) {
  6.          y *= x; i--;
  7.       } else {
  8.          x *= x; i /= 2;
  9.       }
  10.    }
  11.    return y;
  12. }

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

  1. Входные данные: число x типа float и целое число n.
  2. Переменная y инициализируется единицей.
  3. Переменная i инициализируется значением n.
  4. Начинается цикл while, который выполняется до тех пор, пока i больше нуля.
  5. Внутри цикла проверяется, является ли i нечетным числом.
  6. Если i нечетное, то y умножается на x и выполняется операция вычитания i на единицу.
  7. Если i четное, то x умножается на x и выполняется операция деления i на два.
  8. После окончания цикла, функция возвращает значение переменной y.

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


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

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

11   голосов , оценка 3.636 из 5

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

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

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