Перевод из шестнадцатиричной системы в десятичную - C (СИ)
Формулировка задачи:
Доброго времени суток. Изучаю язык Си по учебнику Кернигана и Ричи, столкнулся со следующей задачей: необходимо написать программу, которая бы преобразовывала последовательность цифр, начинающихся с 0x или 0X в соответствующее целое число. Цифры могут быть из диапазона 0..9 a..f A..F . Вот мой код:
У меня несколько вопросов.
1. Подскажите, как улучшить код, дайте конструктивные советы.
2. При нажатии на комбинацию клавиш Ctrl + C выскакивает окно:
Первый этап обработки исключения по адресу 0x75C6221B (KernelBase.dll) в 2.3_Program.exe: 0x40010005: Control-C.
Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно.
Как обработать правильно данную комбинацию?
Заранее спасибо!
#include <stdio.h> #include <string.h> #define MAXSIZE 10 int pow(int base,int number); int main() { char charArray[MAXSIZE]; char c; int intSizeOfArray; int intDecimalNumber; int i; i = 0; intSizeOfArray = 0; intDecimalNumber = 0; while ((c=getchar())!=EOF) { if (i >= MAXSIZE - 1) break; else { charArray[i] = c; i++; } } charArray[i] = '\0'; i = 0; if (charArray[0] == '0' && ((charArray[1] == 'x') || (charArray[1] == 'X'))) { intSizeOfArray = strlen(charArray) - 3; //не считая первых двух символов и символа переноса каретки i = 2; while (intSizeOfArray != 0) { if (charArray[i] == 'A' || charArray[i] == 'a') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 10; else if (charArray[i] == 'B' || charArray[i] == 'b') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 11; else if (charArray[i] == 'C' || charArray[i] == 'c') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 12; else if (charArray[i] == 'D' || charArray[i] == 'd') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 13; else if (charArray[i] == 'E' || charArray[i] == 'e') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 14; else if (charArray[i] == 'F' || charArray[i] == 'f') intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * 15; else if (charArray[i] >= '0' && (charArray[i] <= '9')) intDecimalNumber = intDecimalNumber + pow(intSizeOfArray,16) * (charArray[i] - '0'); else { printf("%s", "Syntax error"); break; } intSizeOfArray--; i++; } printf("%d",intDecimalNumber); } else printf("%s","That is not hexademical number"); printf("%s","Press any key..."); getchar(); return 0; } int pow(int number,int base) { int result; int i; result = 1; i = 0; while (i != (number - 1)) { result = result*base; i++; } return result; }
Решение задачи: «Перевод из шестнадцатиричной системы в десятичную»
textual
Листинг программы
float pow(float x, int n) { float y = 1; int i = n; while(i > 0) { if(i % 2 == 1) { y *= x; i--; } else { x *= x; i /= 2; } } return y; }
Объяснение кода листинга программы
- Входные данные: число
x
типаfloat
и целое числоn
. - Переменная
y
инициализируется единицей. - Переменная
i
инициализируется значениемn
. - Начинается цикл
while
, который выполняется до тех пор, покаi
больше нуля. - Внутри цикла проверяется, является ли
i
нечетным числом. - Если
i
нечетное, тоy
умножается наx
и выполняется операция вычитанияi
на единицу. - Если
i
четное, тоx
умножается наx
и выполняется операция деленияi
на два. - После окончания цикла, функция возвращает значение переменной
y
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д