第二次博客作业: 函数+进制转换器v1.0beta
一、运行截图
(备注:二进制转换为八进制或者十六进制可以通过(4)(2)或者(4)(3)先把二进制转换成十进制在转换成八进制或者十六进制来实现,八进制和十六进制转换成其他进制也是如此。)
二、函数及功能
(1)ten_two函数(将十进制转换成二进制的函数)
void ten_two()
{
printf("请输入一个十进制数:\n");
int n, a[100], item, m;
scanf("%d", &n);
item = 0;
int i = 0;
m = n;
while (n > 0)
{
a[i] = n % 2;
n = n / 2;
i++;
}
int j;
printf("%d的二进制数为:\n", m);
for (j = i - 1; j >= 0; j--)
printf("%d", a[j]);
}
(2)ten_eight函数(将十进制转换成八进制的函数)
void ten_eight()
{
printf("请输入一个十进制数:\n");
int n, a[100], item, m;
scanf("%d", &n);
item = 0;
int i = 0;
m = n;
while (n > 0)
{
a[i] = n % 8;
n = n / 8;
i++;
}
int j;
printf("%d的八进制数为:\n", m);
printf("0");
for (j = i - 1; j >= 0; j--)
printf("%d", a[j]);
}
(3)ten_sixteen函数(将十进制转换成十六进制的函数)
void ten_sixteen()
{
printf("请输入一个十进制数:\n");
int n, item, m;
scanf("%d", &n);
int a[100];
char hex[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
item = 0;
int i = 0;
m = n;
while (n > 0)
{
a[i] = n % 16;
n = n / 16;
i++;
}
int j, x;
printf("%d的十六进制数为:\n", m);
printf("0x");
for (j = i - 1; j >= 0; j--)
{
x = a[j];
printf("%c", hex[x]);
}
}
(4)two_ten函数(将二进制转换成十进制的函数)
void two_ten()
{
printf("请输入一个二进制数:\n");
char str[50];
scanf("%s", str);
int item, i, lenght;
int sum = 0;
lenght = strlen(str);
for (i = 0; i < lenght; i++)
{
item = str[i] - '0';
sum = sum * 2 + item;
}
printf("%s的十进制数为:\n%d", str, sum);
}
(5)eight_ten函数(将八进制转换成十进制的函数)
void eight_ten()
{
printf("请输入一个八进制数:\n");
printf("0");
char str[50];
scanf("%s", str);
int item, i, lenght;
int sum = 0;
lenght = strlen(str);
for (i = 0; i < lenght; i++)
{
item = str[i] - '0';
sum = sum * 8 + item;
}
printf("0%s的十进制数为:\n%d", str, sum);
}
(6)sixteen_ten函数(将十六进制转换成十进制的函数)
void sixteen_ten()
{
printf("请输入一个十六进制数:\n");
printf("0x");
char str[50];
scanf("%s", str);
int item, i, lenght;
int sum = 0;
lenght = strlen(str);
for (i = 0; i < lenght; i++)
{
if (str[i] <= '9')
item = str[i] - '0';
else
item = str[i] - 'A' + 10;
sum = sum * 16 + item;
}
printf("0x%s的十进制数为:\n%d",str, sum);
}
三、main函数
int main()
{
printf("请选择:\n");
printf("(1) 十进制转二进制;\n");
printf("(2) 十进制转八进制;\n");
printf("(3) 十进制转十六进制;\n");
printf("(4) 二进制转十进制;\n");
printf("(5) 八进制转十进制;\n");
printf("(6) 十六进制转十进制;\n");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:ten_two(); break;
case 2:ten_eight(); break;
case 3:ten_sixteen(); break;
case 4:two_ten();break;
case 5:eight_ten();break;
case 6:sixteen_ten();break;
default:printf("ERROR!"); break;
}
return 0;
}
四、函数关系图
五、问题及解决
(1)基础不是很好,开始对进制转换器没有头绪,无从下手。后来稍微参考同学的代吗和网上的资源来整理出思路。
(2)函数定义和使用错误,没有写出正确的函数并且使用时报错。然后就去了解更多函数的用法,看一写例题,解决了该问题。
(3)在编写十进制数转十六进制数的时候,不知道如何表达十六进制中的字母,然后就在网上查了相关问题,得知要先定义一个字符数组来对应十进制转十六进制的数。
(4)在编写各进制转十进制的时候,不知道如何定义和输入各进制数,后面就在网上找一些方法,得知用字符串读入待转换各进制的数比较容易计算。
六、代码互评
1913 杨涛
void Numchange(int m, int b)//将10进制数转化为任意进制数
{
int n = m;
int count = 0;
if (m == 0) printf("0");
while (n != 0)
{
n = n / b;
count++;
}
int number;
for (int i = count; i >= 1; i--)
{
number = m / (int)pow(b, i - 1);
if (number < 10) {
printf("%d", number);
}
else {
printf("%c", number + 55);
}
m = m % (int)pow(b, i - 1);
}
}
int Tennum(char a[],int b)//将输入的数字转换为10进制数
{
int len, i, num;
int sum = 0;
len = strlen(a);//求字符长度
for (i = 0; i < len; i++)
{
if (a[i] >= '0' && a[i] <= '9')
{
num = a[i] - '0';
}
else if (a[i] >= 'A' && a[i] <= 'F')
{
num = a[i] - 'A' + 10;
}
sum = sum * b + num;
}
return sum;
}
杨涛分别只用了一个函数就实现了十进制转换成其他三种进制和三种其他进制转换成十进制,相对于我使用了六个个函数转换来说,整洁了不少。除此之外,杨涛的main函数,一次就能实现除十进制外的三种进制间的转换,而我的要执行执行两次才能实现。
七、总结
1.对函数及其用法有了更深刻的理解,了解了字符串的简单用法,知道了测量字符串长度的函数strlen(),以及包含它的头文件#include<string.h>,还有知道怎么更好实现运行界面的文字表达,等一些其他知识。
2.不同的函数各司其职,灵活的使用函数有利于提高代码的可读性。