二,八,十,十六进制之间的转换-C语言

╰半橙微兮° 2022-08-19 11:24 232阅读 0赞

二,八,十,十六进制之间的相互转换-C语言

今天有个同学叫我帮写这个,马马虎虎写了一下,不是很完善
我的思路是先把要转换的数据统一转换成十进制,再转换成其它进制的数输出,用递归就简单多了。

先写好关键代码,其实代码都差不多的:

  1. /*十进制转二进制输出 */
  2. void fun1(int n)
  3. {
  4. if(n/2)// 非0为真
  5. fun1(n/2);
  6. putchar('0'+n%2);
  7. }
  8. /*十进制转八进制输出 */
  9. void fun2(int n)
  10. {
  11. if(n/8)
  12. fun2(n/8);
  13. putchar('0'+n%8);
  14. }
  15. /*十进制转十六进制输出 */
  16. void fun3(int n)
  17. {
  18. if(n/16)
  19. fun3(n/16);
  20. int i = n%16;
  21. if(i<10)
  22. putchar('0'+i);
  23. else
  24. putchar('a'+i-10);
  25. }
  26. /*二进制转十进制 */
  27. int fun4(char *str)
  28. {
  29. int num = 0;
  30. while(*str != '\0')
  31. {
  32. int i = *str-'0';
  33. if(i>=0 && i<=1)// 跳过其它字符
  34. num = num*2+i;
  35. str++;
  36. }
  37. return num;
  38. }
  39. /*八进制转十进制 */
  40. int fun5(char *str)
  41. {
  42. int num = 0;
  43. while(*str != '\0')
  44. {
  45. int i = *str-'0';
  46. if(i>=0 && i<8)// 跳过其它字符
  47. num = num*8+i;
  48. str++;
  49. }
  50. return num;
  51. }
  52. /*十六进制转十进制 */
  53. int fun6(char *str)
  54. {
  55. int num = 0;
  56. while(*str != '\0')
  57. {
  58. char ch = *str;
  59. if(ch>='0' && ch<='9')
  60. num = num*16+ch-'0';
  61. if(ch>='a' && ch<='f')
  62. num = num*16+10+ch-'a';
  63. str++;
  64. }
  65. return num;
  66. }

写两个菜单:

  1. /*菜单1*/
  2. void showmenu1()
  3. {
  4. printf("\n请选择需要被转换的进制:\n");
  5. printf("1、二进制\n");
  6. printf("2、八进制\n");
  7. printf("3、十进制\n");
  8. printf("4、十六进制\n");
  9. printf("0、退出\n");
  10. printf("请输入菜单:");
  11. }
  12. /*菜单2*/
  13. void showmenu2()
  14. {
  15. printf("请选择需要输出的进制:\n");
  16. printf("1、二进制\n");
  17. printf("2、八进制\n");
  18. printf("3、十进制\n");
  19. printf("4、十六进制\n");
  20. printf("请输入菜单:");
  21. }

写个函数用来输入整数:

  1. /** * 从键盘输入一个数字,并判断范围 * min最小值,max最大值 */
  2. int inputNum(int min, int max)
  3. {
  4. int num;
  5. while(1)
  6. {
  7. fflush(stdin); // 清空输入缓冲区
  8. int s = scanf("%d", &num);
  9. if(1!=s) // 判断字符是否匹配
  10. {
  11. printf("输入错误, 请重新输入:");
  12. continue;
  13. }
  14. if(num<min || num>max)
  15. {
  16. printf("输入范围有误,请重新输入:");
  17. continue;
  18. }
  19. break; // 输入无误后跳出死循环
  20. }
  21. return num;
  22. }

最后只差main函数了:

  1. int main(void)
  2. {
  3. char str[1024];
  4. int menu, output;// 菜单选项,转换后的十进制数
  5. while(1){
  6. showmenu1();
  7. menu = inputNum(0, 4);
  8. if(menu == 0)
  9. break; // 退出死循环
  10. fflush(stdin);
  11. printf("请输入数据:");
  12. switch(menu)
  13. {
  14. case 1:
  15. gets(str);
  16. output = fun4(str);
  17. break;
  18. case 2:
  19. gets(str);
  20. output = fun5(str);
  21. break;
  22. case 3:
  23. output = inputNum(0, INT_MAX);
  24. break;
  25. case 4:
  26. gets(str);
  27. output = fun6(str);
  28. break;
  29. }
  30. showmenu2();
  31. menu = inputNum(0, 4);
  32. switch(menu)
  33. {
  34. case 1:
  35. fun1(output);
  36. putchar('B');
  37. break;
  38. case 2:
  39. fun2(output);
  40. putchar('Q');
  41. break;
  42. case 3:
  43. printf("%d", output);
  44. putchar('D');
  45. break;
  46. case 4:
  47. fun3(output);
  48. putchar('H');
  49. break;
  50. }
  51. putchar('\n');
  52. system("pause");// 暂停
  53. }
  54. return EXIT_SUCCESS;
  55. }

使用的头文件:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>

运行如下:
这里写图片描述

运行环境:Dev-C++ 5.11

发表评论

表情:
评论列表 (有 0 条评论,232人围观)

还没有评论,来说两句吧...

相关阅读