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\n", 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\n", 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\n", 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\n", 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\n", 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("\n"); } void transform_10_8(int n) { printf("转换结果:%o\n", n); } void transform_10_16(int n) { printf("转换结果:%x\n", 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\n", 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\n", 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("输入的进制类型为:\n"); A: printf("[1]二进制 [2]八进制 [3]十进制 [4]十六进制\n"); scanf("%d", &option1); switch (option1) { case 1: printf("想要转换成?\n"); A1: printf("[1]八进制 [2]十进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A1; } printf("输入:"); tr2(option2); break; case 2: printf("想要转换成?\n"); A2: printf("[1]二进制 [2]十进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A2; } printf("输入:"); tr8(option2); break; case 3: printf("想要转换成?\n"); A3: printf("[1]二进制 [2]八进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A3; } printf("输入:"); tr10(option2); break; case 4: printf("想要转换成?\n"); A4: printf("[1]二进制 [2]八进制 [3]十进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A4; } printf("输入:"); tr16(option2); break; default: printf("输入错误!重新输入的进制类型为:\n"); goto A; } return 0; }
5.函数关系图
6.问题
(1)判断输入的数是否符合规范,本来想取余一位一位判断,发现十六进制有字母不能这样子,想了一下决定全都改用输入字符串然后再进行后续操作。
(2)想往函数中传入字符串,发现不知道怎么传,通过翻书和百度后找到解决方法。例如:void a( char *s)
(3)代码敲了一半,突然想起来有格式控制输入输出,就把可以用这个的都改了,简化一下代码。(总共300行左右)(这个不知道算不算问题...)
7.代码互评
void shier (int n) { printf("十进制转换为二进制\n"); 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函数的其他代码。