数制转换器(c语言编写,应用数据结构的栈和队列)

//数制转换:实现2,8,10,16进制数制间的相互转换


typedef int SElemType; // 定义栈元素类型为整型
#include<stdio.h>
#include<string.h>
#include<malloc.h> // malloc()等
#include<ctype.h>
#include<process.h> // exit()
#include<math.h>
#include<stdlib.h>

#define STACK_INIT_SIZE 10 // 存储空间初始分配量
#define STACKINCREMENT 2 // 存储空间分配增量
#define MAX 20

struct SqStack
{
 SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
 SElemType *top; // 栈顶指针
 int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈

typedef struct QNode
{
 int data;
 struct QNode *next;
}QNode,*QueuePtr;
typedef struct LinkQueue
{
 QueuePtr front; //对头指针
 QueuePtr rear;  //队尾指针
}LinkQueue; //单链队列

int InitStack(SqStack &S)
{
 if(!(S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))
  exit(0); //存储分配失败
 S.top=S.base;
 S.stacksize=STACK_INIT_SIZE;
 return 1;
}

int StackEmpty(SqStack S)
{ // 若栈S为空栈,则返回1,否则返回0
 if(S.base==S.top)
  return 1;
 else
  return 0;
}

int Push(SqStack &S,int e)
{
 if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
 {
  S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
  if(!S.base)
   exit(0); // 存储分配失败
  S.top=S.base+STACKINCREMENT;
 }
 *(S.top)++=e;
 return 1;                               
}

int Pop(SqStack &S,int &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0
 if(S.top==S.base)
  return 0;
 e=*--S.top;
 return 1;
}

int InitQueue(LinkQueue &Q)
{ //构造一个空队列
 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 if(!Q.front)
  exit(0);
 Q.front->next=NULL;
 return 1;
}

int EnQueue(LinkQueue &Q,int e)
{ // 插入元素e为Q的新的队尾元素
 QueuePtr p;
 if(!(p=(QueuePtr)malloc(sizeof(QNode)))) //存储分配失败
  exit(0);
 p->data=e;
 p->next=NULL;
 Q.rear->next=p;
 Q.rear=p;
 return 1;
}

int QueueEmpty(LinkQueue Q)
{ // 若Q为空队列,则返回1,否则返回0
 if(Q.front==Q.rear)
  return 1;
 else
  return 0;
}

int DeQueue(LinkQueue &Q,int &e)
{ // 若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0
 QueuePtr P;
 if(Q.front==Q.rear)
  return 0;
 P=Q.front->next;
 e=P->data;
 Q.front->next=P->next;
 if(Q.rear==P)
  Q.rear=Q.front;
 free(P);
 return 1;
}

void conversionA()
{ // 对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数
 SqStack s;
 unsigned n; // 非负整数
 SElemType e;
 InitStack(s); // 初始化栈
 printf("请输入一个非负十进制整数n:");
 printf("n=");
    scanf("%u",&n); // 输入非负十进制整数n
    while(n) // 当n不等于0
 {
  Push(s,n%2); // 入栈n除以2的余数(2进制的低位)
  n=n/2;
 }
 while(!StackEmpty(s)) // 当栈不空
 {
  Pop(s,e); // 弹出栈顶元素且赋值给e
  printf("%d",e); // 输出e
 }
 printf("/n");
}

void conversionB()
{ // 对于输入的任意一个非负10进制整数,打印输出与其等值的8进制数
 SqStack s;
 unsigned n; // 非负整数
 SElemType e;
    InitStack(s); // 初始化栈
 printf("请输入一个非负十进制整数n:");
 printf("n=");
    scanf("%u",&n); // 输入非负十进制整数n
    while(n) // 当n不等于0
 {
  Push(s,n%8); // 入栈n除以八的余数(八进制的低位)
  n=n/8;
 }
 while(!StackEmpty(s)) // 当栈不空
 {
  Pop(s,e); // 弹出栈顶元素且赋值给e
  printf("%d",e); // 输出e
 }
 printf("/n");
}

void conversionC()
{ // 对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数
 SqStack s;
 unsigned n; // 非负整数
 SElemType e;
 InitStack(s); // 初始化栈
 printf("请输入一个非负十进制整数n:");
 printf("n=");
 scanf("%u",&n); // 输入非负十进制整数n
 while(n) // 当n不等于0
 {
  Push(s,n%16); // 入栈n除以16的余数(16进制的低位)
  n=n/16;
 }
 while (!StackEmpty(s)) // 当栈不空
 {
  Pop(s,e); // 弹出栈顶元素且赋值给e
  if(e<=9)
   printf("%d",e);
  else
   printf("%c",e+55);
 }
 printf("/n");
}

void conversionD()
{ // 对于输入的任意一个2进制整数,打印输出与其等值的10进制数
 LinkQueue s;
 unsigned n; // 非负二进制整数
 int e;
 int i=0;
 int k=0;
 InitQueue(s);// 初始化队列
 printf("请输入一个非负二进制整数n:");
 printf("n=");
 scanf("%u",&n); // 输入非负二进制整数n
 while(n)  // 当n不等于0
 {
  EnQueue(s,n%10); // 入队列n除以10的余数
  n=n/10;
 }
 while (!QueueEmpty(s)) //当队列不空
 {
   DeQueue(s,e);  // 弹出队顶元素且赋值给e*/
   k=k+e*pow(2,i++);
 }
 printf("%d",k);
 printf("/n");
}

void conversionE()
{ // 对于输入的任意一个8进制整数,打印输出与其等值的10进制数
 LinkQueue s;
 unsigned n; // 非负8进制整数
 int e;
 int i=0;
 int k=0;
 InitQueue(s);// 初始化队列
 printf("请输入一个非负八进制整数n:");
 printf("n=");
 scanf("%u",&n); // 输入非负8进制整数n
 while(n)  // 当n不等于0
 {
  EnQueue(s,n%10); // 入队列n除以10的余数
  n=n/10;
 }
 while (!QueueEmpty(s)) //当队列不空
 {
   DeQueue(s,e);  // 弹出队顶元素且赋值给e*/
   k=k+e*pow(8,i++);
 }
 printf("%d",k);
 printf("/n");
}

void conversionF()
{ // 对于输入的任意一个16进制整数,打印输出与其等值的10进制数
 char n[30]; //存取输入的16进制数
 int len,i,j=0,dec=0;
 printf("请输入一个非负十六进制整数n:");
 printf("n=");
 scanf("%s",n);
 len=strlen(n);
 for(i=0;i<len;i++)
 {
  if(n[i]>=48&&n[i]<=57||n[i]>=65&&n[i]<=70||n[i]>=97&&n[i]<=102)
   continue;
  else
  {
   printf("You must input a hex number!/n");
   exit(-1);
  }
   
 }
 for(i=len-1;i>=0;i--,j++)
 {
  if(n[i]<=57)
   dec=dec+(n[i]-'0')*pow(16,j);
  else if(n[i]<=70)
   dec=dec+(n[i]-55)*pow(16,j);
  else
   dec=dec+(n[i]-87)*pow(16,j);
 
 }
 printf("%d/n",dec);
}

void factorA()
{ //数制转换 绝对值小于1的十进制小数 转换为二进制
 int i,j=0,ch[MAX]; /*i为每位上的二进制数,ch为存放二进制数的数组*/
 float num;
 printf("请输入一个绝对值小于1的十进制小数n:");
 printf("n=");
 scanf("%f",&num); /*输入要转换的十进制数小数*/
 do
 {
  i=(int)(num*2);
  num=num*2-i;
  ch[j++]=i;
 }
 while(num);
 printf("0.");
 for(i=0;i<j;i++)
 {
  printf("%d",ch[i]);
 }
}

void factorB()
{ //数制转换 绝对值小于1的十进制小数 转换为八进制
 int i,j=0,ch[MAX]; /*i为每位上的八进制数,ch为存放八进制数的数组*/
 float num;
 printf("请输入一个绝对值小于1的十进制小数n:");
 printf("n=");
 scanf("%f",&num); /*输入要转换的十进制数小数*/
 do
 {
  i=(int)(num*8);
  num=num*8-i;
  ch[j++]=i;
 }
 while(num);
 printf("0.");
 for(i=0;i<j;i++)
 {
  printf("%d",ch[i]);
 }
}

int main()
{
 int menu;
 while(1)
 {
  printf("/n");
        printf("        欢迎使用数制转换软件!       /n");
        printf("/n");
  printf("*****************************************/n");
  printf("*****************************************/n");
  printf("*****************************************/n");
        printf("**    1、10-2进制整数转换              **/n");
  
        printf("**    2、10-8进制整数转换              **/n");

        printf("**    3、10-16进制整数转换             **/n");

        printf("**    4、2-10进制整数转换              **/n");
  
        printf("**    5、8-10进制整数转换              **/n");
  
        printf("**    6、16-10进制整数转换             **/n");
  
  printf("**    7、10-2进制小数转换              **/n");

  printf("**    8、10-8进制小数转换              **/n");

  printf("**    9、退出                          **/n");

        printf("*****************************************/n");
  printf("*****************************************/n");
  printf("*****************************************/n");
        printf("/n请选择相应操作/n");
  //选择菜单
  scanf("%d",&menu);
  switch(menu)
  {
  case 1:
   conversionA(); //10-2进制整数转换
   break;
  case 2:
   conversionB(); //10-8进制整数转换
   break;
  case 3:
   conversionC(); //10-16进制整数转换
   break;
  case 4:
   conversionD(); //2-10进制整数转换
   break;
  case 5:
   conversionE(); //8-10进制整数转换
   break;
  case 6:
   conversionF(); //16-10进制整数转换
   break;
  case 7:
   factorA(); //10-2进制小数转换
   break;
  case 8:
   factorB(); //10-8进制小数转换
   break;
  case 9:
   exit(0);
   break;
  }
 }
 return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值