标题:栈的结构体,实现数制转换
只看楼主
zz199200
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2011-11-26
结帖率:75%
 问题点数:0 回复次数:4 
栈的结构体,实现数制转换
//有很多问题,我只想问下栈的函数实现中形参调用怎么总失败,请大家多多帮助,谢谢了


//完成一个非负十进制小数数转换为2、8、16进制
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void conversion(int p,float x);                                //数值转换函数
float Xiao(float x);                                        //取小数

#define OVERFLOW 0                                            //定义栈
#define OK 1
#define ERROR 0

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
    float *base;
    float *top;
    int stacksize;
}SqStack;
int InitStack(SqStack &S)                                     //构造空栈
{
    S.base =(float *)malloc(STACK_INIT_SIZE * sizeof(float));
    if(!S.base)
        exit(OVERFLOW);
    S.top = S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SqStack &S)                                    //判断栈非空
{
    if(S.top==S.base)
        return error;
}
int Push(SqStack &S,flaot e)                                //插入e为栈顶元素
{
    if(S.top-S.base>=S.stacksize){
        S.base=(float *)realloc(S.base,
            (S.stacksize+STACKINCREMENT)*sizeof(float));
        if(!S.base)
            exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=10;
    }
    *S.top++=e;
    return OK;
}
int Pop(SqStack &S,float &e)                                //取出栈顶
{
    if(S.top==S.base)
        return ERROR;
    e=*--S.top;
    return OK;
}

void main()                                                    //主程序
{
    int p;float x;   
    printf("请输入想要转换到的进制:(2、8或16)");            //选择转换到的进制
    scanf("%d",&p);   
    if(p!=2&&p!=8&&p!=16)
        printf("无法进行这种转换!\n");

    printf("请输入想要转换的数据:(大于0的十进制树)");                        //输入要处理的数据
    scanf("%f",&x);
    if(x<0)
        printf("输入数据错误!\n");
    else
        conversion(p,x);
}

float Xiao(float x)                        //取小数
{
    return(x-int(x));
}

void conversion(int p,float x)            //数值转换为p进制,数据为x
{
    int n;float m;
    InitStack(S);InitStack(T);
    n=int(x);m=Xiao(x);
    while(n)                            //整数部分送入栈S
    {
        Push(S,n%p);
        n=n/p;
    }
    while(m)                            //小树部分送入栈T
    {
        Push(T,Zheng(m*p));
        m=Xiao(m*p);
    }
    while(!StackEmpaty(S))                //输出整数部分
    {
        Pop(S,e);
        if(e<10)
            printf("%d",e);
        else
            printf("%c",e+55);            //十六进制输出字母
    }
    printf(".");                        //输出小数点
    for(int i=3;i>0;i--)                //输出小数部分
        {
            Pop(T.e);
            if(e<10)
                printf("%d",e);
            else
                printf("%c",e+55);
        }
    printf("\n");
}
搜索更多相关主题的帖子: conversion 函数 include 结构体 
2013-05-08 12:37
RobinWang
Rank: 3Rank: 3
来 自:北京
等 级:论坛游侠
帖 子:69
专家分:121
注 册:2013-5-31
得分:0 
回复 楼主 zz199200
整数部分用栈实现,小数部分应用队列实现而不是栈。

将压抑的青春能量转化为改造中国的动力!
2013-06-04 23:07
leemiracle
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-19
得分:0 
这能行?
2013-06-25 11:00
kennyshen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-25
得分:0 
//完成一个非负十进制小数数转换为2、8、16进制
 #include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 
void conversion(int p,float x);                                //数值转换函数,
 float Xiao(float x);                                        //取小数
 
#define OVERFLOW 0                                            //定义栈
 #define OK 1
 #define ERROR 0
 
#define STACK_INIT_SIZE 100
 #define STACKINCREMENT 10
 typedef struct{                                //改成整型数据
     int *base;
     int *top;
     int stacksize;
 }SqStack;
 int InitStack(SqStack &S)                                     //构造空栈
 {
    S.base =(int *)malloc(STACK_INIT_SIZE * sizeof(int)); //S.base =(float *)malloc(STACK_INIT_SIZE * sizeof(float));

     if(!S.base)
         exit(OVERFLOW);
     S.top = S.base;
     S.stacksize=STACK_INIT_SIZE;
     return OK;
 }
 int StackEmpty(SqStack &S)                                    //判断栈非空
 {
     if(S.top==S.base)
         return error;
 }
 int Push(SqStack &S,int e)//int Push(SqStack &S,flaot e)                                //插入e为栈顶元素
 {
     if(S.top-S.base>=S.stacksize){
         S.base=(int *)realloc(S.base,
             (S.stacksize+STACKINCREMENT)*sizeof(int));
         if(!S.base)
             exit(OVERFLOW);
         ///S.top=S.base+S.stacksize;没用的句子
         S.stacksize+=10;
     }
     *(S.top++)=e;
     return OK;
 }
 int Pop(SqStack &S,int &e)   //int Pop(SqStack &S,float &e)                                //取出栈顶
 {
     if(S.top==S.base)
         return ERROR;
     e=*--S.top;
     return OK;
 }
int Popdao(SqStack &S,int &e)   //int Pop(SqStack &S,float &e)                                //取出栈顶小数部分
 {
     if(S.top==S.base)
         return ERROR;
     S.base++;
     e=*(S.base)
     return OK;
 }
 
void main()                                                    //主程序
 {
     int p;float x;   
    printf("请输入想要转换到的进制:(2、8或16)");            //选择转换到的进制
     scanf("%d",&p);   
    if(p!=2&&p!=8&&p!=16)
         printf("无法进行这种转换!\n");
 
    printf("请输入想要转换的数据:(大于0的十进制树)");                        //输入要处理的数据
     scanf("%f",&x);
     if(x<0)
         printf("输入数据错误!\n");
     else
         conversion(p,x);
 }
 
float Xiao(float x)                        //取小数
 {
    return(x-floor(x));   // return(x-int(x));
 }
 
void conversion(int p,float x)            //数值转换为p进制,数据为x
 {
     int n;float m;
     SqStack S,T;      /// 增加
     InitStack(S);InitStack(T);
     n=int(x);m=Xiao(x);
     while(n)                            //整数部分送入栈S
     {
         Push(S,n%p);
         n=n/p;
     }
     for(int i = 0; i<4; i++)                           //小树部分送入栈T  可以制定转换小数的精度
     {
         Push(T,int(m*p)); //Push(T,zheng(m*p));
         m=Xiao(m*p);
     }
     while(!StackEmpaty(S))                //输出整数部分
     {
         Pop(S,e);
         if(e<10)
             printf("%d",e);
         else
             printf("%c",e+55);            //十六进制输出字母
     }
     printf(".");                        //输出小数点
     for(int i=3;i>0;i--)                //输出小数部分
         {
             Popdao(T.e);//Pop(T.e);
             if(e<10)
                 printf("%d",e);
             else
                 printf("%c",e+55);
         }
     printf("\n");
 }
2013-06-26 17:00
kennyshen
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-25
得分:0 
改了一下午,可能还有漏洞,多多努力!
2013-06-26 17:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-406498-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.849029 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved