一.程序运行截图
1.开始界面
运行后跳出选择菜单
2.运行界面
输入选项后出现提醒正在进行的项目,之后输入想进行转换的数,最后得到转换后的数并继续跳出选择菜单
当选择二、八进制转换时会先跳出输入进行转换的数的位数
3.输入错误的二、八进制数时
4.输入错误的数字编号时
5.结束界面
没有出现输入错误的结束界面
出现了输入错误的结束界面
二.额外拓展功能
计算输入错误的次数
使用了全局变量fault来计算出现输入错误的次数
在每次输入错误时令fault++来达到计算次数的目的
三.函数介绍
1.十进制转换二、八进制函数
void shierba(int m) { //十进制转换成二、八进制 int number, d, i = 0; int a[100]; printf("输入一个正整数:"); scanf("%d", &number); while (number > 0) { d = (number % m); a[i] = d; number = number / m; i++; } printf("进制转化结果是:"); for (i--; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); printf("\n"); }
逐个计算并用数组逐个录入进制位数
最后逆序输出数组中的数字来达到输出转换后的数的目的
2.二、八进制转换十进制函数
void erbashi(int m) { //二、八进制转换成十进制 int i, p = 0, sum = 0, e = 0, q = 0; int b[100]; printf("输入需要转换的进制数位数:"); scanf("%d", &p); printf("按位输入需要转换的进制数(以空格分开):\n"); for (i = 1; i <= p; i++) { scanf("%d", &b[i]); } for (i = p; i > 0; i--) { sum += b[i] * pow(m, e); e++; } for (i = 1; i <= p; i++) { //判断输入的数是否符合二、八进制的要求 if (b[i] >= m) { //若有不合要求的令q++ q++; } } if (q == 0) { printf("进制转化结果是:%d\n", sum); } else { //只要至少有一个不合要求的数就输出"输入错误!" printf("输入错误!"); fault ++; } }
此函数有计算和判断两种功能
既能用数组存放二、八进制数并计算转换,还能判断每个存放进去的数符不符合二、八进制数的范围
输入不在范围时会记录错误次数
3.十进制转换十六进制函数
void shishiliu(int m) { //十进制转换成十六进制 int number, c, i = 0; char a[100]; printf("输入一个正整数:"); scanf("%d", &number); while (number > 0) { c = (number % m); if (c < 10) { a[i] = c + 48; } else { if (c == 10) { c = 'A'; } else if (c == 11) { c = 'B'; } else if (c == 12) { c = 'C'; } else if (c == 13) { c = 'D'; } else if (c == 14) { c = 'E'; } else if (c == 15) { c = 'F'; } a[i] = c; } number = number / m; i++; } printf("进制转换结果是:"); for (i--; i >= 0; i--) //将数组倒序输出 printf("%c", a[i]); printf("\n"); }
依然是利用数组来实现进制数间的转换
4.二、八进制转换十六进制函数
void erbashiliu(int m) { //二、八进制转换成十六进制 int i, p = 0, sum = 0, e = 0, q = 0; int b[100]; printf("输入需要转换的进制数位数:"); scanf("%d", &p); printf("按位输入需要转换的进制数(以空格分开):\n"); for (i = 1; i <= p; i++) {//先将二、八进制转为十进制 scanf("%d", &b[i]); } for (i = p; i > 0; i--) { sum += b[i] * pow(m, e); e++; } for (i = 1; i <= p; i++) { //判断输入的数是否符合二、八进制的要求 if (b[i] >= m) { //若有不合要求的令q++ q++; } } if (q == 0) {//再将十进制转为十六进制 int c, i = 0; char a[100]; while (sum > 0) { c = (sum % 16); if (c < 10) { a[i] = c + 48; } else { if (c == 10) { c = 'A'; } else if (c == 11) { c = 'B'; } else if (c == 12) { c = 'C'; } else if (c == 13) { c = 'D'; } else if (c == 14) { c = 'E'; } else if (c == 15) { c = 'F'; } a[i] = c; } sum = sum / 16; i++; } printf("进制转换结果是:"); for (i--; i >= 0; i--) //将数组倒序输出 printf("%c", a[i]); printf("\n"); } else { //只要至少有一个不合要求的数就输出"输入错误!" printf("输入错误!"); fault ++; } }
此函数先将二、八进制数转换成十进制数再将其转换成十六进制数
输入不在范围时会记录错误次数
5.十六进制转二进制函数
void shiliuer(char b[]) {//十六进制转二进制 int length, j, number;//先将十六进制转为十进制 int m = 0; length = strlen(b); for (j = 0; j < length; j++) { if (b[j] >= '0' && b[j] <= '9') { number = b[j] - '0'; } else if (b[j] >= 'A' && b[j] <= 'F') { number = b[j] - 'A' + 10; } m = m * 16 + number; } int d, i = 0;//再将十进制转为二进制 int a[100]; while (m > 0) { d = (m % 2); a[i] = d; m = m / 2; i++; } printf("进制转化结果是:"); for (i--; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); printf("\n"); }
此函数先将十六进制转为十进制再转为二、八进制
6.全局变量
int fault = 0;
利用全局变量fault来计算输入错误的次数来提醒使用者输入要认真
四.展示main函数
int main() { printf(" 欢迎您使用进制转换器!\n"); for (;;) { //可循环使用直到选择退出的程序 int choose; printf(" *************************\n"); printf(" * 请选择你需要的项目: *\n"); printf(" * 1.十进制转二进制 *\n"); printf(" * 2.十进制转八进制 *\n"); printf(" * 3.十进制转十六进制 *\n"); printf(" * 4.二进制转十进制 *\n"); printf(" * 5.八进制转十进制 *\n"); printf(" * 6.二进制转十六进制 *\n"); printf(" * 7.八进制转十六进制 *\n"); printf(" * 8.十六进制转十进制 *\n"); printf(" * 9.十六进制转二进制 *\n"); printf(" * 10.十六进制转八进制 *\n"); printf(" * 0.退出程序 *\n"); printf(" *************************\n"); //生成较为美观的选择表格 printf("请输入要进行的项目的数字编号:"); scanf("%d", &choose); int m; if (choose == 1) { printf("您正在进行的是十进制转二进制\n"); m = 2; shierba(m); } else if (choose == 2) { printf("您正在进行的是十进制转八进制\n"); m = 8; shierba(m); } else if (choose == 3) { printf("您正在进行的是十进制转十六进制\n"); m = 16; shishiliu(m); } else if (choose == 4) { printf("您正在进行的是二进制转十进制\n"); m = 2; erbashi(m); } else if (choose == 5) { printf("您正在进行的是八进制转十进制\n"); m = 8; erbashi(m); } else if (choose == 6) { printf("您正在进行的是二进制转十六进制\n"); m = 2; erbashiliu(m); } else if (choose == 7) { printf("您正在进行的是八进制转十六进制\n"); m = 8; erbashiliu(m); } else if (choose == 8) { printf("您正在进行的是十六进制转十进制\n"); printf("输入一个十六进制数:"); scanf("%x", &m); printf("进制转换结果:%d", m); } else if (choose == 9) { char b[100]; int h; printf("您正在进行的是十六进制转二进制\n"); printf("输入一个十六进制数:"); scanf("%s", b); for (h = 0; h < 100; h++) { b[h]= toupper(b[h]); } shiliuer(b); } else if (choose == 10) { printf("您正在进行的是十六进制转八进制\n"); printf("输入一个十六进制数:"); scanf("%x", &m); printf("进制转换结果:%o", m); } else if (choose == 0) { break; } else { fault++; printf("请认真阅读表格,输入正确的数字编号!\n"); //输入表格中不存在的数字后弹出提示 } printf("\n"); } printf("\n"); if (fault != 0) { printf("您本次使用该程序输入时出现了%d次错误,希望您以后更加认真,祝您身体健康!\n", fault); } else if (fault == 0) { printf("您本次使用该程序没有出现输入错误的情况,您真是太细心了!祝您身体健康!\n"); } printf(" 感谢您使用该程序!\n"); return 0; }
五.思维导图
六.遇到的问题及解决方法
1.刚开始写这个代码的时候一脸茫然,不懂该怎么写,写出来的代码又丑又长还很多错误,后来几乎把全部要计算的都用函数来写,这样就简洁多了
2.关于十六进制大小写的问题,百度说不区分大小写,而我写的转换的函数只能识别大写字母,这时我原来写的判断是不是大小写的函数就很尴尬了,我想起了上课学的把字母变成大写的函数,所以我就用toupper函数把输入数组的每个字母都变成大写来达到大小写都能被函数识别转换
七.代码互评
//黄晓龙 void TentoTwo() { int num, m, c, i = 0; int a[32]; printf("请输入一个十进制数:"); scanf("%d", &num); m = num; while (num > 0) { c = num % 2; a[i] = c; num = num / 2; i++; } for (i--; i >= 0; i--) printf("十进制数 %d 转化成的二进制数是 %d\n", m, a[i]); } void TentoEight() { int num, m, c, i = 0; int a[32]; printf("请输入一个十进制数:"); scanf("%d", &num); m = num; while (num > 0) { c = num % 8; a[i] = c; num = num / 8; i++; } for (i--; i >= 0; i--) printf("十进制数 %d 转化成的八进制数是 %d\n", m, a[i]); }
我觉得十进制转二进制和八进制的写法都是一样的,所以我干脆只写一个函数,在选择进行转换的时候通过输入的2和8来区别进行二进制还是八进制的转换,这样会使程序简洁许多
八.收获与理解的总结
1.收获:知道了把自己的程序美化的重要性,学会了应用全局变量来统计main函数和其他函数里出错的次数,学会了各进制间的转换并写成代码
2.理解:函数能使程序变得简洁明了,有相同或类似的函数时可以把他们合并来简化程序,应用函数能使程序运行更方便