任意进制转换十进制 -- c语言

骑猪看日落 2022-12-18 03:56 251阅读 0赞

任意进制转换十进制 – 数据结构c语言队列操作实现

代码也不算是任意进制,最高只能到十六进制。见谅!
代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXSIZE 100 //静态顺序栈存储的最大空间
  5. const char f[]="0123456789ABCDEF";//定义一个全局常量 ,方便导出十进制以上的不为数字形式的数据的显示
  6. void Interrupt(void)//创建一个中断函数
  7. {
  8. while(1)//用于检测换行符,使函数脱离scanf的连续输出
  9. if(getchar()=='\n')
  10. break;
  11. }
  12. typedef struct
  13. {
  14. char data[MAXSIZE];//分配给队列一个数组空间
  15. int front;//队列头
  16. int rear;//队列尾
  17. }SqQueue;
  18. void InitQueue(SqQueue &Q)//初始化队列
  19. {
  20. Q.front = Q.rear = 0;//使队列头和队列尾都为0
  21. }
  22. void EnQueue(SqQueue &Q,char e)//入队 ,由于是循环队列,故少用一个元素空间,该函数在有MAXSIZE-1个元素时便已判断为满
  23. {
  24. if((Q.rear+1)%MAXSIZE == Q.front)//判断队列是否为满 ,这里是循环队列队列满的条件是 (Q.rear+1)%MAXSIZE == Q.front
  25. {
  26. printf("队列已满!\n");
  27. }
  28. else
  29. {
  30. if(Q.rear == MAXSIZE)//如果队尾超出最大值但队列又不满,便使其对最大值求余运算
  31. Q.rear = Q.rear%MAXSIZE;
  32. Q.data[Q.rear] = e;//使变量e的值入队
  33. Q.rear++;//并使队尾加一
  34. }
  35. }
  36. char DeQueue(SqQueue &Q)//出队
  37. {
  38. char a = '0';
  39. if(Q.front == Q.rear)//首先判断队列是否为空,队列为空的条件是 Q.front == Q.rear
  40. printf("队列为空!\n");
  41. else
  42. {
  43. a = Q.data[Q.front];//导出队头元素数据
  44. Q.front++;//使队头加一
  45. if(Q.front == MAXSIZE)//在队列非空的情况下,如果队头等于最大值,也对最大值做求余运算
  46. Q.front = Q.front%MAXSIZE;
  47. }
  48. return a;
  49. }
  50. void InputNumber(SqQueue &Q,int &b)//数的输入
  51. {
  52. char a;
  53. printf("即将输入的数为几进制:");
  54. scanf("%d",&b); //输入的数为几进制
  55. Interrupt();//终止scanf的连续输出
  56. printf("请输入%d进制的数:",b);//数据的输入
  57. while(1)
  58. {
  59. scanf("%c",&a);
  60. if(a == '\n')//当检测到enter键时终止死循环
  61. break;
  62. EnQueue(Q,a);//进队
  63. }
  64. }
  65. void Decimal(SqQueue Q,int b)//十进制转换操作
  66. {
  67. int i,//记录次数
  68. m = 0;//数的总和
  69. bool c;//判断输入的数据是否在输入的进制范围内
  70. char a;//用于接出队列数据
  71. while(Q.front != Q.rear)//循环终止条件为队列为空
  72. {
  73. c = true;
  74. a = DeQueue(Q);//出队
  75. for(i=0;i<b;i++)//类型转换,使char转换成int
  76. {
  77. if(f[i] == a)
  78. {
  79. c = false;
  80. break;
  81. }
  82. }
  83. if(c)//判断输入的数据是否在输入的进制范围内
  84. {
  85. printf("输入的数据错误!\n");
  86. break;
  87. }
  88. m = (m + i) * b;
  89. }
  90. if(!c)
  91. printf("十进制为:%d\n",m/b);
  92. }
  93. int main()
  94. {
  95. int b;
  96. SqQueue Q;
  97. InitQueue(Q);//初始化队列,来装数据
  98. InputNumber(Q,b);//输入操作
  99. Decimal(Q,b);//十进制转换操作
  100. return 0;
  101. }

但是代码不是太严格,也是只能输入指定数据。
结果演示:
在这里插入图片描述
在这里插入图片描述
错误输入结果演示(八进制最大数为7):
在这里插入图片描述
(完)

发表评论

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

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

相关阅读

    相关 十进制转换任意 c语言

    今天搞懂了怎么把十进制转换成任意进制,我试了好几次有时逻辑上没有错误,但是我由于c语言基础不是太好,所以老是出现一些基础错误。以此来记录一下我要写的代码,以后继续铭记。 最