东软数据结构实验报告——通过栈和队列来实现进制转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告(一)
实验过程
一、项目简介
进制转换
通过编写函数实现十进制浮点数到R进制的转换,在十进制浮点数的整数部分利用栈结构实现,小数部分用队列结构实现。
二、项目实施:
1.读取数据并获得小数点位置
2.将字符串转为整数形式
.
3.对整数部分进行入栈
4.获得小数部分并入队
5.整数和小数的联合输出
6.源代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define size 10 //小数部分大小
#define maxsize 20 //整数部分大小
//*********************************
//*********************************
//小数部分——队列
typedef struct
{
char data[10]; //读取转制后的小数部分
int front,rear; //队首尾指针
}Queue; //循环队列
//*********************************
//初始化队列
void init_Queue(Queue* q)
{
q->front=q->rear=0;
}
//*********************************
//入队
int push_Queue(Queue *q,int x)
{
if((q->rear+1)%size==q->front) //判断队满{
printf("队列满!不允许入队\n");
return 0;
}
else
{
q->rear=(q->rear+1) % size;
q->data[q->rear]=x;
return 1;
}
}
//********************************* //出队
int pop_Queue(Queue *q,int *x)
{
if(q->rear==q->front)
{
printf("队空!");
return 0;
}
else
{
q->front=(q->front+1)%size;
*x=q->data[q->front]; //读取队头元素
return 1;
}
}
//*********************************
//*********************************
//整数部分——栈
typedef struct
{
char dataint[100];
int top;
}Stack;
//*********************************
//-制空栈
void init_Stack(Stack *s)
{
s->top=0;
}
//*********************************
//进栈
int push_Stack(Stack *s,int x)
{
if(s->top==maxsize)
{
printf("栈已满!");
return 0;
}
else
{
s->dataint[s->top]=x; //数据进栈
s->top++;
return 1;
}
}
//*********************************
//出栈
int pop_Stack(Stack *s,int *x)
{
if(s->top==0)
{
printf("栈空,无数据可取!");
return 0;
}
else
{
s->top--;
*x=s->dataint[s->top]; //取处数据
return 1;
}
}
//********************************* 主程序int main()
{
//*********************************
//读入数据
char a[20];
int aim;
printf("请输入一个十进制浮点数:"); //以字符串形式输入一个浮点数gets(a);
printf("请输入目标进制:");
scanf("%d",&aim);
if(aim==1) {
printf("ERROR! PLEASE INPUT A NUMBER AND IT IS BIGGER THAN 1");
return 0;
}
//*********************************
//读取小数点位置
int i;
int pos;//小数点位置
for(i=0;i<strlen(a);++i)
{
if(a[i]=='.')
{
pos=i;
break;
}
}
//*********************************
//定义栈对整数部分转化后并入栈
Stack ss;
init_Stack(&ss);//初始化栈
//*********************************
//将整数部分转换为int 型
int begin=1;
int bnum;
if(a[0]=='-') {
int bnum = a[1]-'0'; //判断是否为负数begin=2;
}
else bnum=a[0]-'0';
for(i=begin;i<pos;i++)
{
bnum=bnum*10+a[i]-'0';
}
// printf("整数部分:%d\n",bnum);
//依次求得所转进制的每一位并入栈
while(bnum)
{
// if(bnum/aim!=0)
push_Stack(&ss,bnum%aim);
bnum=bnum/aim;
}
//*********************************
//出栈读取整数部分结果
int flag,z;
flag=pop_Stack(&ss,&z);
if(flag==1)
{
printf("目的进制数为:");
for(i=ss.top;i>=0;i--) //先从顶端出栈
printf("%d ",ss.dataint[i]);
}
else printf("无数据!");
// printf("\n");
//定义队列并将小数部分转化后入队
Queue q,*cq=&q;
init_Queue(cq);
//*********************************
//将小数点后面的部分转为浮点数
int c=1;
int anum=a[pos+1]-'0';
for(i=pos+2;i<strlen(a);i++)
{
anum=anum*10+(a[i]-'0');
c++;
}
double small=((double)anum)/pow(10,c); // printf("小数部分:%lf\n",small);
//*********************************
// 依次求得小数部分的每一位并入队
int zz;
int innum;
for(i=0;i<6;i++)
{
innum=(((int)(small*aim)))%10; //取出小数点前的部分
small=small*aim-innum; //得到减去小数点前段的部分继续与aim相乘
push_Queue(cq,innum);
}
//*********************************
//出队列
printf(".") ;
if(pop_Queue(cq,&zz)){
for(i=(cq->front)%size;i!=(cq->rear+1)%size;i=(i+1)%size)
printf("%d ",cq->data[i]);
}
//*********************************
return 0;
}
实验总结
通过对数据的单个读取并入栈,后续的出栈顺序为从上到下,先进后出,读取数据后为相反的顺序,而队列的顺序出队为先进先出,对小数的存储可直接进行读取。