zoukankan      html  css  js  c++  java
  • 数据结构_数值转换

    一、   目的

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

    二、实习环境

    个人计算机,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("
    ");
    }
  • 相关阅读:
    新浪SAE搭建项目
    PHP ReflectionClass
    自定义时间函数
    mysql 日期函数
    jquery之商城菜单
    jquery之行自加自减
    前端之拖动面板
    商城轮播图
    js之返回网页顶部
    js之搜索框
  • 原文地址:https://www.cnblogs.com/askDing/p/Kevin_Dfg.html
Copyright © 2011-2022 走看看