初学C语言,十进制int型、float型转化为其他进制数

来源:互联网 发布:佐藤胜利知乎 编辑:程序博客网 时间:2024/05/02 18:20

#include <stdio.h>
#include <stdlib.h>
#define INITSTACKSIZE 100
#define INCREATMENT 10

typedef struct stack
{
 int * top;
 int * base;
 int stacksize;
}Stack;

typedef struct QueNode
{
 int t;
 struct QueNode * next;
}QueNode,*QueNodeptr;

typedef struct LinkQueue
{
 QueNode *front;
 QueNode *rear;
}LinkQueue;

Stack initstack(Stack s)
{
 s.base = (int *)malloc(sizeof(int)*INITSTACKSIZE);
 if(!s.base)
 {
  printf("申请空间失败!/n");
  return s;
 }
 s.top = s.base;
 s.stacksize = INITSTACKSIZE;
 return s;
}

Stack push(Stack s,int in)
{
 if(s.top - s.base >= s.stacksize)
 {
  s.base = (int *)realloc(s.base,sizeof(int)*(s.stacksize + INCREATMENT));
  if(!s.base)
  {
   printf("申请空间失败,无法压栈!/n");
   return s;
  }
  s.top = s.base + s.stacksize;
  s.stacksize += INCREATMENT;
 }
 *s.top = in;
 s.top++;
 s.stacksize++;
 return s;
}

Stack pop(Stack s)
{
 if(s.stacksize == 0)
 {
  printf("栈为空,无法出栈!/n");
  return s;
 }
 s.top--;
 printf("%d",*s.top);
 s.stacksize--;
 return s;
}
LinkQueue * initlinkqueue(LinkQueue *lq)
{
 lq->front = NULL;
 lq->rear =NULL;
 return lq;
}
LinkQueue * insertlinkqueue(LinkQueue * lq,int m)//bug
{
 QueNode * s = NULL;
 
 s = (QueNode *)malloc(sizeof(QueNode));
 if(!s)
 {
  printf("队列结点申请空间失败!/n");
  return lq;
 }
 s->t = m;
 s->next = NULL;
 if(lq->front == NULL && lq->rear == NULL)
 {
  lq->front = s;
  lq->rear = lq->front;
 }
 else
 {
  lq->front->next = s;
  lq->front = lq->front->next;
 }
 
 return lq;
}
LinkQueue * deletelinkqueue(LinkQueue * lq)
{
 QueNode *p = NULL;
 
 if(lq->front ==NULL && lq->rear == NULL)
 {
  printf("队列为空,无法删除!/n");
  return lq;
 }
 else if(lq->front == lq->rear)
 {
  p = lq->rear;
  printf("%d",p->t);
  free(p);
  lq->front = lq->rear = NULL;
 }
 else
 {
  p = lq->rear;
  printf("%d",p->t);
  lq->rear = lq->rear->next;
  free(p);
 }
 return lq;
}
void inttoorder(int n,int d,int k)
{
 int m;
 Stack s;

 s.base = NULL;
 s.top = NULL;  
 s = initstack(s);
 while(n)
 {
  m = n%d;
  n = n/d;
  s = push(s,m);
 }
 while(s.top != s.base)
 {
  s = pop(s);
 }
 if(k ==2)
 {
  printf("%c",'.');
 }
}

void doubletoorder(float f,int d)
{
 int m,len = 0;
 LinkQueue *lq = NULL;
 
 lq = (LinkQueue *)malloc(sizeof(LinkQueue));
 if(!lq)
 {
  printf("队列申请空间失败!/n");
 }
 else
 {
  lq = initlinkqueue(lq);
  while(f && len < 8)
  {
   m = int(f*d);
   lq = insertlinkqueue(lq,m);
   f = f*d - m;
   len++;
  }
  while(lq->front != NULL && lq->rear != NULL)
  {
    lq = deletelinkqueue(lq);
  }

 }
}
void main()
{
 int n,d,k;
 float N1,f,N;

 printf("请选择被转换数的类型:1---int型,2---float型/n");
 scanf("%d",&k);
 while(getchar() != '/n');
 switch(k)
 {
  case 1:
   {
    printf("请输入要转化的十进制浮点型数:/n");
    scanf("%d",&n);
    while(getchar() != '/n');
    printf("请输入要转换为的进制:/n");
    scanf("%d",&d);
    while(getchar() != '/n');
    if(n >= 0)
    {
     printf("转换后的值为:/n");
     inttoorder(n,d,k);
    }
    else
    {
     printf("转换后的值为:/n");
     printf("%c",'-');
     inttoorder(-n,d,k);
    }
    printf("/n");
    break;
   }
  case 2:
   {
    printf("请输入要转化的十进制整形数:/n");
    scanf("%f",&N1);
    while(getchar() != '/n');
    printf("请输入要转换为的进制:/n");
    scanf("%d",&d);
    while(getchar() != '/n');
    printf("转换后的值为:/n");
    N = N1;
    if(N1 < 0)
    {
     printf("%c",'-');
     N = -N1;
    }
    n = int(N);   //溢出怎样处理
    f = N - n;
    if(n == 0)
    {
     printf("%d",0);
    }
    inttoorder(n,d,k); 
    doubletoorder(f,d);
    printf("/n");
    break;
   }
  default : printf("选择方式不正确,请重新选择!/n"); 
 }

  
}
不对的地方,请大家指教。

原创粉丝点击