这是我的第一篇博客,有写的不好的地方,还请多多担待~
因为要转化的原始值位数是不固定的,在输入要转化的值方面可能会有点麻烦。 与其他博主通过 声明数组+strlen函数 的方式不同,这里提供了另一种的思路:利用改进后的getche函数,每输入一个值都会判断/计算一次,比如:原进制为8,要转换的值为12,用户输入1后全局变量sum被赋值为1×1,再输入一个2,全局变量sum被赋值为1×1×8+2×1;再利用sum作媒介转换成目标进制下的值。
这样做的一个好处在于不需要数组。
我是用VS写的,用其他编译器的话需要将scanf_s改为scanf
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int sum = 0;
int recording;
int main()
{
system("color F0");
system("title 进制转换");
int input1, input2, input3;
int inputA(); int inputB();//输入与判断函数
void BasicA(int input1); int BasicB(int sum, int input2);//基础函数A、B
while (1)
{
//第一部分:进制的输入与判断
input1 = inputA();
input2 = inputB();
//第二部分:包括特殊进制的使用,其中设定基础函数A:其它进制转化为十进制;基础函数B:十进制转换为其它进制;
if (input1 == 10)
{
printf("请输入原值:");
scanf_s("%d", &input3);
BasicB(input3, input2);//直接启动基础函数B
}
else if (input2 == 10)
{
BasicA(input1);//直接启动基础函数A
if (sum!=0)
printf("\n十进制值:%d\n", sum);
}
else
//第三部分:非特殊进制的转换/输出结果
{
BasicA(input1);
BasicB(sum, input2);
}
printf("\n");
system("pause");
printf("\n");
}
return 0;
}
//输入与判断函数
int inputA()
{
int input;
printf("原进制 :");
scanf_s("%d", &input);
if ((input >= 2) && (input <= 16))
return input;
else
{
printf("输入的进制不在可计算范围内,请重新输入.\n");
return input = inputA();
}
}
int inputB()
{
int input;
printf("目标进制:");
scanf_s("%d", &input);
if ((input >= 2) && (input <= 16))
return input;
else
{
printf("输入的进制不在可计算范围内,请重新输入.\n");
return input = inputB();
}
}
//基础函数A
void BasicA(int input1)
{
int n=49, x = 0; char l[50]; int L ;
sum = 0;
printf("请输入原值:");
while (n)
{
l[n] = getche();
if (l[n] == 8)//backspace
{
sum = (sum - recording) / input1;
x = x - 1;
}
else if (l[n] == 13)//确认键
{
printf("\n");
n = 0;
}
else
{
if ((l[n] >= 65) && (l[n] <= 70))//输入为A~F
L = l[n] - 55;
else if ((l[n] >= 97) && (l[n] <= 102)) //输入为a~f
L = l[n] - 87;
else if ((l[n] >= 48) && (l[n] <= 57)) //输入为数字
L = l[n]-48;
else
{
printf("\nWrong input\n\n请重新输入:");
sum = 0; x = 0;
}
if (L >= input1)//如果输入值大于该进制值
{
printf("\nWrong input\n\n请重新输入:");
sum = 0; x = 0;
}
if (x != 0)
{
recording = L;
sum = L + sum * input1;
x++;
n--;
}
}
}
printf("输入数值位数:%d\n", x);
}
//基础函数B
int BasicB(int sum0, int input2)//要求传入目标进制与得出后的十进制值
{
int i = 1, c = 0,d;
printf("结果为:");
if (sum0 < 0) sum0 = -sum0;//待修改
if (sum0 == 0) printf("0\n");
else
{
if (input2 <= 10)
{
while (sum0 != 0)
{
c = c + (sum0 - sum0 / input2 * input2) * i;
i = i * 10;
sum0 = sum0 / input2;
}
printf("%d\n", c);
}
else
{
while (sum0 >= input2)
{
d = sum0;
i = 0;
while (d >= input2)
{
d = d / input2;
i++;
}
if (d <= 9)
printf("%d", d);
else
printf("%c", (char)(d + 87));
sum0 = sum0 - (unsigned int)pow(input2, i) * d;
}
if (sum0 <= 9)
printf("%d", sum0);
else if (sum0 <= 35)
printf("%c", (char)(sum0 + 87));
}
}
printf("\n\n");
return 0;
}
理论上它能在任意进制间实现转换,但常用的一般在16以内,所以设定最大为16进制,可以自己定义并修改
如果有可以改进的地方还希望各位大佬提出来~