数据结构_数值转换

一、   目的

       将任意一个浮点数转换成二进制数

二、实习环境

个人计算机,Windows操作系统,Visual C++6.0编译开发环境

三、实习内容、步骤与要求

将一个浮点数转换成二进制数,需要用到两个结构,一个是队列,一个是栈。对于整数部分,采用栈的形式;对于小数部分,采用队列的形式。具体步骤如下:

整数部分:用2去除十进制整数,可以得到一个商和余数;

            再用2去除商,又会得到一个商和余数,

           如此进行,直到商为零时为止,

           然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

小数部分:用2乘十进制小数,可以得到积,将积的整数部分取出,

             再用2乘余下的小数部分,又得到一个积,

             再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

            然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位

四:源程序:

#include <stdio.h>

#include <stdlib.h>

#define maxsize 50

typedef int datatype;

//定义顺序栈,

typedef struct {

    datatype data[maxsize];

    int top;

}SeqStack;

//定义顺序队列

typedef struct{

       datatype data[maxsize];

        int rear,front;

}SeqQueue;

//判断队列是否为空

int Empty_Que(SeqQueue Q){

    return(Q.front==Q.rear);

}

//入队

void EnQue(SeqQueue *Q,datatype x){

    /*加个判断是否为最大*/

    if((Q->rear+1)%maxsize==Q->front){

       printf("overflow!");

    //  return 0;

    }

    Q->rear=(Q->rear+1)%maxsize;

    Q->data[Q ->rear]=x;

}

//出队

void DelQue(SeqQueue *Q,datatype *x){

    Q->front=(Q->front+1)%maxsize;

    *x=Q->data[Q->front];

}

//判断栈是否为空

int Empty_Stack(SeqStack *S){

   return(S->top==-1);

}

//入栈

int Push_Stack(SeqStack *S,datatype x){

    if(S->top>=maxsize){

       printf("overflow!");

       return 0;

    }

    S->top=S->top+1;

    S->data[S->top]=x;

    return 1;

}

//出栈

void Pop_Stack(SeqStack *S,datatype *x){

       /*出栈*/

     if(S->top!=-1)

     *x=S->data[S->top];

     S->top--;

}

//二进制转换

/*

整数部分二进制转换,采用递归调用,采用"除2取余,逆序排列"法,具体如下:

        用2去除十进制整数,可以得到一个商和余数;

       再用2去除商,又会得到一个商和余数,

       如此进行,直到商为零时为止,

       然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,

       依次排列起来。

小数部分二进制转换,采用递归调用,采用"乘2取整,顺序排列"法,具体如下:

       用2乘十进制小数,可以得到积,将积的整数部分取出,

       再用2乘余下的小数部分,又得到一个积,

       再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

       然后把取出的整数部分按顺序排列起来,

       先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

*/

void Bin_Convert(float x,int r){

    SeqStack S;float z;

    SeqQueue Q;

    int y=(int)x;

    S.top=-1;

    while(y){

       Push_Stack(&S,y%r);

       y=y/r;

    }

    while(!Empty_Stack(&S)){

       Pop_Stack(&S,&y);

       printf("%d",y);

    }

    z=x-(int)x;

    Q.rear=Q.front;

    while(z>0.0001){

        EnQue(&Q,(int)(z*r));

        z=z*r-(int)(z*r);

    }

    printf(".");

    while(!Empty_Que(Q)){

       DelQue(&Q,&y);

        printf("%d",y);

    }

}

void main(){

    float x;int r;

    printf("请输入一个浮点数:");

    scanf("%f",&x);

    printf("请输入转换成几进制数(2-8-16):");

    scanf("%d",&r);

    Bin_Convert(x,r);

    printf(" ");

}

#include <stdio.h>
#include <stdlib.h> 
#define maxsize 50
typedef int datatype;
//定义顺序栈, 
typedef struct {
    datatype data[maxsize];
    int top;
}SeqStack;
//定义顺序队列
typedef struct{
        datatype data[maxsize];
        int rear,front;
}SeqQueue;
//判断队列是否为空
int Empty_Que(SeqQueue Q)
{
    return(Q.front==Q.rear);
}
//入队
void EnQue(SeqQueue *Q,datatype x){
    /*加个判断是否为最大*/
    if((Q->rear+1)%maxsize==Q->front){
        printf("overflow!");
    //    return 0; 
    }
    Q->rear=(Q->rear+1)%maxsize;
    Q->data[Q ->rear]=x;
}
//出队
void DelQue(SeqQueue *Q,datatype *x){
    Q->front=(Q->front+1)%maxsize;
    *x=Q->data[Q->front];
}
//判断栈是否为空
int Empty_Stack(SeqStack *S){
    /*判断栈是否为空*/
   return(S->top==-1);
}
//入栈
int Push_Stack(SeqStack *S,datatype x){
    /*入栈*/
    if(S->top>=maxsize){
        printf("overflow!");
        return 0;
    }
    S->top=S->top+1;
    S->data[S->top]=x;
    return 1;
}
//出栈
void Pop_Stack(SeqStack *S,datatype *x){
        /*出栈*/
     if(S->top!=-1)
     *x=S->data[S->top];
     S->top--;
}
//二进制转换
/*
整数部分二进制转换,采用递归调用,采用"除2取余,逆序排列"法,具体如下:
        用2去除十进制整数,可以得到一个商和余数;
        再用2去除商,又会得到一个商和余数,
        如此进行,直到商为零时为止,
        然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,
        依次排列起来。
小数部分二进制转换,采用递归调用,采用"乘2取整,顺序排列"法,具体如下:
       用2乘十进制小数,可以得到积,将积的整数部分取出,
       再用2乘余下的小数部分,又得到一个积,
       再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。 
       然后把取出的整数部分按顺序排列起来,
       先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

*/
void Bin_Convert(float x,int r){
    SeqStack S;float z;
    SeqQueue Q;
    int y=(int)x;
    S.top=-1;
    while(y){
        Push_Stack(&S,y%r);
        y=y/r;
    }
    while(!Empty_Stack(&S)){
        Pop_Stack(&S,&y);
        printf("%d",y);
    }
    z=x-(int)x;
    Q.rear=Q.front;
    while(z>0.0001){
        EnQue(&Q,(int)(z*r));
        z=z*r-(int)(z*r);
    }
    printf(".");
    while(!Empty_Que(Q)){
        DelQue(&Q,&y);
         printf("%d",y);
    }
}

    
void main(){
    float x;int r;
    printf("请输入一个浮点数:");
    scanf("%f",&x);
    printf("请输入转换成几进制数(2-8-16):");
    scanf("%d",&r);
    Bin_Convert(x,r);
    printf("
");
}
原文地址:https://www.cnblogs.com/askDing/p/Kevin_Dfg.html