1.运行截图
输入正确时结果如下,其他转换运行结果类似,就不多贴图了。
输入不符合规范时:
2.额外扩展
如果输入错误格式,则重新输入,而不是结束程序从头再来。
运行结果如上图。
3.函数
(1)二进制转其他
void tr2(int option2)
{
int input = 0, i;
char in[80];
A:
scanf("%s", in);
for (i=0; i<strlen(in); i++) /*判断是否为二进制数*/
{
if (in[i] != '0' && in[i] != '1')
{
printf("请重新输入二进制数:");
goto A;
}
}
for (i=0; i<strlen(in); i++)
{
input = input*10 + (in[i] - '0');
}
switch (option2) /*根据选择结果分配给不同的转换函数*/
{
case 1:
transform_2_8(input);
break;
case 2:
printf("转换结果:%d
", transform_2_10(input));
break;
case 3:
transform_2_16(input);
break;
}
}
void transform_2_8(int n)
{
int sum = transform_2_10(n);
printf("转换结果:%o
", sum);
}
int transform_2_10(int n)
{
int result = 0, i = 0;
while (n > 0)
{
result += (n%10) * pow(2, i);
n /= 10;
i++;
}
return result;
}
void transform_2_16(int n)
{
int sum = transform_2_10(n);
printf("转换结果:%x
", sum);
}
(2)八进制转其他
void tr8(int option2)
{
int input = 0, i;
char in[80];
A:
scanf("%s", in);
for (i=0; i<strlen(in); i++) /*判断是否为八进制数*/
{
if (in[i] < '0' || in[i] > '7')
{
printf("请重新输入八进制数:");
goto A;
}
}
for (i=0; i<strlen(in); i++)
{
input = input*10 + (in[i] - '0');
}
switch (option2) /*根据选择结果分配给不同的转换函数*/
{
case 1:
transform_8_2(input);
break;
case 2:
printf("转换结果:%d
", transform_8_10(input));
break;
case 3:
transform_8_16(input);
break;
}
}
void transform_8_2(int n)
{
transform_10_2( transform_8_10(n) );
}
int transform_8_10(int n)
{
int result = 0, i = 0;
while (n > 0)
{
result += (n%10) * pow(8, i);
n /= 10;
i++;
}
return result;
}
void transform_8_16(int n)
{
printf("转换结果:%x
", transform_8_10(n));
}
(3)十进制转其他
void tr10(int option2)
{
int input = 0, i;
char in[80];
A:
scanf("%s", in);
for (i=0; i<strlen(in); i++) /*判断是否为十进制数*/
{
if (in[i] < '0' || in[i] > '9')
{
printf("请重新输入十进制数:");
goto A;
}
}
for (i=0; i<strlen(in); i++)
{
input = input*10 + (in[i] - '0');
}
switch (option2) /*根据选择结果分配给不同的转换函数*/
{
case 1:
transform_10_2(input);
break;
case 2:
transform_10_8(input);
break;
case 3:
transform_10_16(input);
break;
}
}
void transform_10_2(int n)
{
int num[80], count = 0;
int i;
for (i=0; n>0; i++)
{
num[i] = n % 2;
n /= 2;
count++;
}
for (i=count-1; i>=0; i--)
{
printf("%d", num[i]);
}
printf("
");
}
void transform_10_8(int n)
{
printf("转换结果:%o
", n);
}
void transform_10_16(int n)
{
printf("转换结果:%x
", n);
}
(4)十六进制转其他
void tr16(int option2)
{
int i;
char in[80];
A:
scanf("%s", in);
for (i=0; i<strlen(in); i++) /*判断是否为十六进制数*/
{
if ( (in[i] < '0') || ( in[i] > '9' && in[i] < 'A')
|| (in[i] > 'F' && in[i] < 'a') || in[i] > 'f' )
{
printf("请重新输入十六进制数:");
goto A;
}
}
switch (option2) /*根据选择结果分配给不同的转换函数*/
{
case 1:
transform_16_2(in);
break;
case 2:
transform_16_8(in);
break;
case 3:
printf("转换结果:%d
", transform_16_10(in));
break;
}
}
void transform_16_2(char *s)
{
transform_10_2( transform_16_10(s) );
}
void transform_16_8(char *s)
{
printf("转换结果:%o
", transform_16_10(s));
}
int transform_16_10(char *s)
{
int i, sum = 0;
for (i=strlen(s)-1; i>=0; i--)
{
if (s[i] >= '0' && s[i] <= '9')
{
sum += (s[i]-'0') * pow(16, strlen(s)-i-1);
}
else if (s[i] >= 'a' && s[i] <= 'f')
{
sum += (s[i]-'a'+10) * pow(16, strlen(s)-i-1);
}
else if (s[i] >= 'A' && s[i] <= 'F')
{
sum += (s[i]-'A'+10) * pow(16, strlen(s)-i-1);
}
}
return sum;
}
4.main函数
代码比较多就干脆写了多个.c文件和一个头文件,这样视觉上比较清楚。
文件名
头文件
#include <stdio.h>
#include <math.h>
#include <string.h>
void transform_2_8(int n);
int transform_2_10(int n);
void transform_2_16(int n);
void transform_8_2(int n);
int transform_8_10(int n);
void transform_8_16(int n);
void transform_10_2(int n);
void transform_10_8(int n);
void transform_10_16(int n);
void transform_16_2(char *s);
void transform_16_8(char *s);
int transform_16_10(char *s);
main函数
#include "Header.h"
#include "tr2.c"
#include "tr8.c"
#include "tr10.c"
#include "tr16.c"
int main()
{
int option1, option2;
printf("输入的进制类型为:
");
A:
printf("[1]二进制 [2]八进制 [3]十进制 [4]十六进制
");
scanf("%d", &option1);
switch (option1)
{
case 1:
printf("想要转换成?
");
A1:
printf("[1]八进制 [2]十进制 [3]十六进制
");
scanf("%d", &option2);
if (option2 != 1 && option2 != 2 && option2 != 3)
{
printf("输入错误!重新输入想转换成什么类型:
");
goto A1;
}
printf("输入:");
tr2(option2);
break;
case 2:
printf("想要转换成?
");
A2:
printf("[1]二进制 [2]十进制 [3]十六进制
");
scanf("%d", &option2);
if (option2 != 1 && option2 != 2 && option2 != 3)
{
printf("输入错误!重新输入想转换成什么类型:
");
goto A2;
}
printf("输入:");
tr8(option2);
break;
case 3:
printf("想要转换成?
");
A3:
printf("[1]二进制 [2]八进制 [3]十六进制
");
scanf("%d", &option2);
if (option2 != 1 && option2 != 2 && option2 != 3)
{
printf("输入错误!重新输入想转换成什么类型:
");
goto A3;
}
printf("输入:");
tr10(option2);
break;
case 4:
printf("想要转换成?
");
A4:
printf("[1]二进制 [2]八进制 [3]十进制
");
scanf("%d", &option2);
if (option2 != 1 && option2 != 2 && option2 != 3)
{
printf("输入错误!重新输入想转换成什么类型:
");
goto A4;
}
printf("输入:");
tr16(option2);
break;
default:
printf("输入错误!重新输入的进制类型为:
");
goto A;
}
return 0;
}
5.函数关系图
6.问题
(1)判断输入的数是否符合规范,本来想取余一位一位判断,发现十六进制有字母不能这样子,想了一下决定全都改用输入字符串然后再进行后续操作。
(2)想往函数中传入字符串,发现不知道怎么传,通过翻书和百度后找到解决方法。例如:void a( char *s)
(3)代码敲了一半,突然想起来有格式控制输入输出,就把可以用这个的都改了,简化一下代码。(总共300行左右)(这个不知道算不算问题...)
7.代码互评
void shier (int n)
{
printf("十进制转换为二进制
");
printf("答案是:");
a(n);
}
int a(int n)
{
if(n==1||n==0){
printf("%d",n);
}else {
a(n/2);
printf("%d",n%2);
}
return 0;
}
这位同学十进制转二进制用了递归函数,代码更简洁清楚,值得学习。因为十进制转二进制是用十进制数除以2取余数,取出来的余数要倒序输出才是正确答案,所以我用了数组,把余数一个个存到数组里,然后从数组末尾输出,这样显得比较麻烦,还是用递归比较好,可以直接从末尾输出。
8.收获
(1)更加了解了不同进制间的转换是如何进行的。
(2)第一次尝试把程序文件分为多个程序文件模块写一个程序,对大程序构成有个初步的了解。
9.理解
(1)函数可以使代码看起来更清晰易懂,增加可读性。
(2)遇到错误时改写程序也相对方便,直接在函数中更改即可,不用担心误改到main函数的其他代码。