一.程序的运行截图


十六进制对二进制八进制的转换可以通过6选项后进行1.2选项实现。
二.函数以及其对应的功能
#include<stdio.h>
#include<math.h>
void mune()
{
printf("----------------------------\n");
printf("进制转换\n");
printf("1、十进制转换二进制\n");
printf("2、十进制转换八进制\n");
printf("3、十进制转换十六进制\n");
printf("4、二进制转换十进制\n");
printf("5、八进制转换十进制\n");
printf("6、十六进制转换十进制\n");
printf("0、 退 出\n");
printf("----------------------------\n");
}
void TenToTwo()
{
int num, c, i = 0, g;
int n = 2;
int a[32];
printf("输入一个整数:");
scanf_s("%d", &num);
g = num;
if (num < 0)
num = -num;
while (num > 0)
{
c = (num % n);
a[i] = c;
num = num / n;
i++;
}
printf("十进制数转换成二进制数是:");
if (g == 0)
printf("0");
if (g < 0)
printf("-");
for (i--; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
printf("\n");
}
void TenToEight()
{
int num, c, i = 0,g;
int n = 8;
int a[32];
printf("输入一个整数:");
scanf_s("%d", &num);
g = num;
if (num < 0)
num = -num;
while (num > 0)
{
c = (num % n);
a[i] = c;
num = num / n;
i++;
}
printf("十进制数转换成八进制数是:");
if (g ==0)
printf("0");
if (g < 0)
printf("-");
for (i--; i >= 0; i--) //将数组倒序输出
printf("%d", a[i]);
printf("\n");
}
void TenToSixteen()
{
char ai[] = "0123456789ABCDEF";
char h[16];
int i = 0;
int j = 0;
int num = 0, g;
printf("输入一个整数:");
scanf_s("%d", &num);
g = num;
if (num < 0)
num = -num;
while (num)
{
h[i++] = ai[num % 16]; //对十进制数求余并最终与h数组中的字符匹配
num = num / 16;
}
printf("十进制数转换成十六进制数是:");
if (g < 0)
printf("-");
for (j = i - 1; j >= 0; --j)
printf("%c", h[j]);
printf("\n");
}
void TwoToTen()
{
long long n;
int sum = 0, i = 0, m,count=0;
printf("输入一个二进制数: ");
scanf_s("%lld", &n);
while (n != 0)
{ m = n % 10;
if (m > 1||m<-1)
count++;
n /= 10;
sum += m * pow(2, i);
++i;
}
if (count != 0)
{
printf("输入错误!\n");
return TwoToTen();
}
else
printf("二进制数转换为十进制为 %d\n",sum);
}
void EightToTen()
{
int n,;
int sum = 0, i = 0, m,count=0;
printf("输入一个八进制数: ");
scanf_s("%d", &n);
while (n != 0)
{
m = n % 10;
if (m > 7||m<-7)
count++;
n /= 10;
sum += m * pow(8, i);
++i;
}
if (count != 0)
{
printf("输入错误!\n");
return EightToTen();
}
else
printf("八进制数转换为十进制为 %d\n", sum);
}
void SixteenToTen()
{
char s[50], a[50];
printf("输入一个十六进制数:");
scanf_s("%s", s);
int t, i, count = 0, j = 0;
long sum = 0;
if (s[0] == '-')
{
for (i = 0;s[i];i++)
{
a[i] = s[i + 1];
}
for (i = 0;s[i];i++)
{
s[i] = a[i];
}
j = 1;
}
for (i = 0;s[i];i++)
{
if (s[i] > 'F')
count++;
}
if (count == 0)
{
for (i = 0;s[i];i++)
{
if (s[i] <= '9')
t = s[i] - '0';
else
t = s[i] - 'A' + 10;
sum = sum * 16 + t;
}
printf("十六进制数转换为十进制为:");
if (j == 1)
{
printf("-");
}
printf("%d\n",sum);
}
else
{
printf("输入错误!");
return SixteenToTen();
}
printf("\n");
}
int main()
{
int n = 0;
int l = 1;
while (l)
{
mune();
printf("请选择:");
scanf_s("%d", &n);
switch (n)
{
case 1:TenToTwo();
break;
case 2:TenToEight();
break;
case 3:TenToSixteen();
break;
case 4:TwoToTen();
break;
case 5:EightToTen();
break;
case 6:SixteenToTen();
break;
case 0:
l = 0;
break;
default:
printf("您的选择错误!!!\n");
break;
}
}
}
通过主函数先输出菜单,通过选择进入switch函数的选项,进而调动相对应的函数。因为比较菜,每个进制转换都写了一个函数。
三.思维导图
四.主要问题
十六进制转换十进制
四.主要问题
十六进制转换十进制
scanf("%x",&num);
print("%d",&num);
本来这样写没什么毛病,然后看见要求要检查输入的数是不是十六进制的数就给我整懵了。
解决方法:
char s[50], a[50];
printf("输入一个十六进制数:");
scanf_s("%s", s);
int t, i, count = 0, j = 0;
long sum = 0;
if (s[0] == '-') //判断输入的是不是负数
{
for (i = 0;s[i];i++)
{
a[i] = s[i + 1];
}
for (i = 0;s[i];i++)
{
s[i] = a[i]; //将字符串前移一位,去掉'-'号
}
j = 1; //判断条件判断决定后面是否输出'-'号
}
for (i = 0;s[i];i++)
{
if (s[i] > 'F') //判断是否为十六进制数
count++;
}
if (count == 0) //是十六进制数进入循环
{
for (i = 0;s[i];i++)
{
if (s[i] <= '9')
t = s[i] - '0';
else
t = s[i] - 'A' + 10;
sum = sum * 16 + t;
}
printf("十六进制数转换为十进制为:");
if (j == 1) //是负数,输出'-'号
{
printf("-");
}
printf("%d\n",sum);
}
else //不是十六进制数提醒错误并重新调动该函数
{
printf("输入错误!");
return SixteenToTen();
}
printf("\n");
解决方法如上。
五.互评
没人给我互评啊
六.总结
收获:加深了对数组应用的了解,善用if语句来解决检查判断问题。
对函数的理解:将一个大程序分成一个个小程序,降低编写代码的难度,让代码更容易让人看懂。