| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 717 人关注过本帖
标题:求帮忙看下问题。关用c的栈来实现进制转换
只看楼主 加入收藏
cb550255408
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-21
收藏
 问题点数:0 回复次数:10 
求帮忙看下问题。关用c的栈来实现进制转换
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

#define MAXSIZE 100

typedef enum{
    success = 0,
    fail = 1
}Status;

typedef struct entrytype{
    int number;
}EntryType;

typedef struct stack{
    int top;
    int length;
    EntryType *pdat;
}TStack, *TStackPtr;

Status init_stack(TStackPtr    ps, int n){
    EntryType *p;                            //指向栈底的指针
    p = (EntryType*)malloc((sizeof(EntryType))*n);
    if (p){
        ps->pdat = p;
        ps->top = 0;
        ps->length = n;
    }
    return success;
}

Status destroy_stack(TStackPtr ps){
    if (ps->pdat){
        free(ps->pdat);
        ps->pdat = NULL;
        ps->top = 0;
        ps->length = 0;
        return success;
    }
    return fail;
}

Status clear_stack(TStackPtr ps){
    if (ps->pdat){
        ps->top = 0;
        return success;
    }
    return fail;
}

Status isempty_stack(TStackPtr ps){
    if (ps->top <= 0){
        printf("栈空!!");
        return fail;
    }
    return success;
}

Status isfull_stack(TStackPtr ps){
    if (ps->top >= ps->length){
        printf("栈满!!");
        return fail;
    }
    return success;
}

void addelem_stack(TStackPtr ps, EntryType p){            //增加元素
    Status status;
    status = isfull_stack(ps);
    if (status == success)/**/{
        ps->pdat[ps->top] = p;
        ps->top++;
    }
    return;
}

EntryType pop_stack(TStackPtr ps){                            //取出
    Status status;
    EntryType p;
    status = isempty_stack(ps);
    if (status == success){
        ps->top--;
        p = ps->pdat[ps->top];
    }
    return p;
}

void shuzhizhuanhua(TStackPtr ps, int N, int b){    //N表示十进制数的大小,b表示转化后的b进制数
    int i = 0;
    EntryType num, p;
    while (N>0 && i <= MAXSIZE){
        num.number = N%b;
        N = N / b;
        addelem_stack(ps, num);
        i++;
    }

    while ((ps->top)>0){
        p = pop_stack(ps);
        printf("%d\t", p.number);
    }
    return;
}

int main(){
    int N, b;
    int a = 10;
    printf("请输入十进制数N:");
    scanf("%d", &N);
    printf("请输入所需进制数b:");
    scanf("%d", &b);
    TStackPtr ps;
    init_stack(ps, a);
    printf("%d\n", ps->top);
    shuzhizhuanhua(ps, N, b);
    getchar();
    return 0;
}
错误    1    error C4700: 使用了未初始化的局部变量“ps”

感觉是对的啊。
vs上编译的
搜索更多相关主题的帖子: success include number 
2015-04-16 17:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
int main(){
    int N, b;
    int a = 10;
    printf("请输入十进制数N:");
    scanf("%d", &N);
    printf("请输入所需进制数b:");
    scanf("%d", &b);
    TStackPtr ps;
    init_stack(ps, a);

    printf("%d\n", ps->top);
    shuzhizhuanhua(ps, N, b);
    getchar();
    return 0;
}

授人以渔,不授人以鱼。
2015-04-16 17:52
cb550255408
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-21
收藏
得分:0 
就是那两句不知道怎么改
2015-04-16 17:58
cb550255408
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-21
收藏
得分:0 
回复 2楼 TonyDeng
能告诉下怎么改么
2015-04-16 17:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给ps初始化啊

授人以渔,不授人以鱼。
2015-04-16 18:02
cb550255408
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-21
收藏
得分:0 
回复 5楼 TonyDeng
不知道怎么叫初始化。。。。。
像这样么
TStackPtr ps = (TStack*)malloc(sizeof(TStack));

运行后不显示结果啊_(:зゝ∠)_
2015-04-16 18:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
初始化就是给它一个确定的值,即使是NULL也可以。运行没结果,那是你程序逻辑的问题,错误多了,自己一个一个函数写,写一个测试正确之后再写下一个,你这样写程序,无解。

授人以渔,不授人以鱼。
2015-04-16 18:10
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
TStackPtr ps=null;//不知道这样算不算初始化?

能编个毛线衣吗?
2015-04-16 18:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
别的不看,先看看你这个函数干了什么,它原本想达到什么目的?

程序代码:
Status init_stack(TStackPtr    ps, int n){
    EntryType *p;                            //指向栈底的指针
    p = (EntryType*)malloc((sizeof(EntryType))*n);
    if (p){
        ps->pdat = p;
        ps->top = 0;
        ps->length = n;
    }
    return success;
}


写程序,要做什么,自己心中是应该有数的,上面的问题都应该能够清晰表达出来才行。

你这个函数,使用了指针参数,本来的目的就是要修改参数所指向的数据,那么,还使用局部变量p干什么?单看这个函数的做法,就可知到底怎么构思这个程序是不清晰的,亦即实际上没有清晰的思路来解决问题,这样,后面的各个函数,肯定也存在不少类似的问题,若连这个函数有什么问题都看不出,则排查整个程序使之运行正确,就很悬了。


[ 本帖最后由 TonyDeng 于 2015-4-16 19:08 编辑 ]

授人以渔,不授人以鱼。
2015-04-16 18:28
cb550255408
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-21
收藏
得分:0 
回复 9楼 TonyDeng
第一次写栈,照着老师的来的,我试试,谢谢啦
2015-04-16 19:01
快速回复:求帮忙看下问题。关用c的栈来实现进制转换
数据加载中...
 
   



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

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