一、 目的
将任意一个浮点数转换成二进制数
二、实习环境
个人计算机,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(" "); }