一.程序运行截图
1.
2.
3.
4.
5.
6.
二.子函数代码展示及功能介绍
1.(除了十六进制)将其他进制转为十进制:
int One(int choice, int number) { int sum = 0, count = 0; int value, j; int b; value = number; do { value /= 10; count++; } while (value > 0); value = number; for (j = 0;j < count; j++) { b = value % 10; sum = sum + b * pow(choice, j); value /= 10; } return sum; }
通过do-while计算其他进制的位数,再通过for循环的相加得到十进制的数值。
2.将十进制转为任意进制:
void Two(int choice,int number) { int j, value; int a[1000], count = 0; value = number; while(value != 0) { a[count] = value % choice; value /= choice; count++; } for (j = count - 1;j >= 0; j--) { if (a[j] < 10) printf("%d", a[j]); else printf("%c", a[j] + 55); } printf("\n"); }
利用数组,对转换为其他进制后的每一位数字进行保存,最后在for循环中对数字进行大小的判断来输出。
3.将十六进制转为十进制:
int Three(char arr[]) { int k, length; int sum = 0; int m; length = strlen(arr); for (k = 0; k < length; k++) { if (arr[k] >= '0' && arr[k] <= '9') m = arr[k] - '0'; else if (arr[k] >= 'A' && arr[k] <= 'F') m = arr[k] - 'A' + 10; sum = sum * 16 + m; } return sum; }
因为十六进制与其他进制相比多了字母,所以将十六进制转为十进制单独拉出来写为一个函数。以字符串的形式来输入十六进制的数值,并且利用字符来加减得到十进制的数值。
4.判断输入数值是否合法(除十六进制):
int judge(int choice, int number) { int value, b; int ret = 0; value = number; while (value > 0) { b = value % 10; if (b >= choice) return 0; value /= 10; } return 1; }
直接利用while循环对数值进行%的判断。
5.判断输入的十六进制是否合法
int judge1(char a[]) { int length; int k; length = strlen(a); for (k = 0; k < length; k++) { if((a[k] > 'F'||a[k] < 'A')&&(a[k] < '0'||a[k] > '9')) return 0; } return 1; }
(注:<stdlib.h>头文件下的strlen(变量名称)作用:得到字符串长度。)将十六进制中的全部字母和数字看作数字,利用数组在for循环中判断每一个字符是否在范围以内。
三.main函数的代码展示
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { int i; char arr[1000]; int choice1, choice2;//选择的进制 int x;//数字 printf("---------------------------------------------------------------------------\n"); printf("2表示二进制;8表示八进制;10表示十进制;16表示十六进制;十六进制的字母须大写\n\n"); printf("请选择您输入的进制:\n"); scanf("%d", &choice1); printf("请输入您的数字:\n"); if (choice1 == 2 || choice1 == 8 || choice1 == 10) { scanf("%d", &x); while (judge(choice1, x) == 0) { printf("错误,请重新输入一个数值:\n"); scanf("%d", &x); } } else { gets_s(arr); while (judge1(arr) == 0) { printf("错误,请重新输入一个数值:\n"); scanf("%s", &arr); } } printf("请选择你转换的进制:\n"); scanf("%d", &choice2); switch (choice2) { case 10: if (choice1 == 2) printf("%d\n", One(2, x)); else if (choice1 == 8) printf("%d\n", One(8, x)); else printf("%d\n", Three(arr)); break; case 2: if (choice1 == 8) Two(2,One(8, x)); else if (choice1 == 10) Two(2,x); else Two(2,Three(arr)); break; case 8: if (choice1 == 2) Two(8, One(2, x)); else if (choice1 == 10) Two(8, x); else Two(8, Three(arr)); break; case 16: if (choice1 == 2) Two(2, Three(arr)); else if (choice1 == 8) Two(8, Three(arr)); else Two(16, x); break; } printf("谢谢使用\n"); printf("---------------------------------------------------------------------------\n"); return 0; }
使用switch-case制作菜单,使用者可以对几进制转为几进制进行自主选择
四.思维导图
五.碰到的问题及解决方案
·问题1
刚开始不知道怎么输入十六进制。
·解决方案
前面定义一个数组,后面利用"%s"输入字符串。
·问题2
写完代码后发现判断数值是否正确的函数中没有判断十进制是否正确。
·解决方案
在刚开始写代码的时候就应该直接使用字符串来表示所有进制,这样就不需要字符和数字之间的转换,可惜由于时间不足,无法进行进一步更改。
·问题3
在main函数中有一个x被vs警告使用未初始化的x,前面和后面都没有这样的情况(如下图)。
·解决方案
母鸡啊,求指教>︿<
·问题4
运行过程中,可以由十进制转到十六进制,十六进制转到其他进制,却不能由其他进制转到十六进制。
·解决方案
除了我使用字符串来解决的想法还未实施,其他方法依然不知道,请求指教2||o(°▽°*)o
六.代码互评
网络1913 杨涛
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; }
他把所有进制都用字符串表示,这样就可以把十六进制和其他进制转换为十进制数的函数结合在一起,进一步减少代码的长度,也很方便。
七.总结
1.本次大作业的收获:
·在输出八进制或十六进制时可以直接利用%o和%X输出;
·提高了使用函数的熟练度,特别是函数中的变量为数组时;
·学会使用了strlen(变量名称)来表示字符串长度和使用字符串;
·对调试代码的时候有进一步的感观,敲代码的过程中一定要注意逻辑关系并且注意函数的形参和实参,局部变量和全局变量,局部变量优先,否则一步错则步步错,调试代码的过程就很容易变成重新写代码的过程。
2.个人对函数概念的理解
·函数是用来减少代码的冗杂性,提高代码的可读性和简洁性的;
·代码的函数类似于数学中的函数中x与y的关系;
·void函数不需要返回,一般是拿来使用于输出;
·函数之间可以互相调用。