Перевод из шестнадцатиричной системы в десятичную - 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.