小白在数值转换过程中遇到的问题,希望有大神看到能够给出一点建议和解答,感激不尽!!!
题目描述
对于输入的任意一个非负十进制整数N,打印输出与其等值的m进制数。
本题特别说明:
1)我们以此题作为栈的入门级验证性实验,如果是实验课,请不要采用其它优化算法,老老实实按照数据结构(C语言版)教材p46-p48页上的类C代码进行改编。
2)关键是要仿照教材p46-p48页上的类C代码,编写初始化栈、入栈、出栈及判断栈空等函数。
3)类C代码99%可以照抄,主要是要注意类C代码各函数形参中的符号“&”--属于C++语言中的引用。在VC中调试时,如果文件扩展名为.c,则要遵循C语法规则,对于“&”不能照抄,“&”只能作为求地址运算符,因此,需要改编,实际上只要保证“传地址”就行了。如果文件扩展名为.cpp,则可按C++语法编写程序,“&”可作为引用运算符,因此“&”可以照抄......
4)扩展名为.CPP的程序的总体框架,提示如下,仅供参考。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
SqStack S;
Status InitStack(SqStack &S)
{
//......
return OK;
}
Status Push(SqStack &S, int e)
{
//......
return OK;
}//Push
Status Pop(SqStack &S, int *e)
{
//......
return OK;
}//Pop
Status StackEmpty(SqStack &S)
{
//......
}
void conversion()
{
int N,m;
int e;
InitStack(S);
while(scanf("%d,%d",&N,&m)!=EOF)
{
//......
}
}
int main()
{
conversion();
return 0;
}
5)扩展名为.C的程序的总体框架,提示如下,仅供参考。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
SqStack S;
Status InitStack(SqStack *S)
{
//......
return OK;
}
Status Push(SqStack *S, int e)
{
//......
return OK;
}//Push
Status Pop(SqStack *S, int *e)
{
//......
return OK;
}//Pop
Status StackEmpty(SqStack *S)
{
//......
}
void conversion()
{
int N,m;
int e;
InitStack(&S);
while(scanf("%d,%d",&N,&m)!=EOF)
{
//......
}
int main()
{
conversion();
return 0;
}
输入
每行输入一个非负十进制整数N(0<=N<=MAXINT),然后输入一个整数m(2<=m<=10)。N与m用逗号隔开。
输出
输出与N等值的m进制数。
样例输入 Copy
1348,8 8,2
样例输出 Copy
2504 1000
此处为参考csdn博主的c++版本的代码(细节与题目有些许出入,但基本一致)
#include<stdlib.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status; //声明Status的类型为int
typedef int SElemType;
typedef struct //定义一个栈
{
SElemType *base; //栈顶
SElemType *top; //栈底
int stacksize; //栈的长度
}Sqstack;
Status Initstack(Sqstack &S) //顺序栈的初始化
{
S.base=new SElemType[MAXSIZE]; //栈的基地址
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
Status emptystack(Sqstack S) //空栈
{
if(S.top==S.base)
return 1;
else return 0;
}
Status push(Sqstack &S,SElemType e) //入栈
{
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++=e;
return OK;
}
Status Pop(Sqstack &S,SElemType &e) //出站
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
SElemType GetTop(Sqstack S,SElemType &e) //取栈顶元素
{
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}
//声明SElemType的类型为int
void creak(int N,int R) // 数值转换过程
{ Sqstack S;
Initstack(S);
int e;
while(N) //不固定循环次数用while
{
push(S,N%R);
N=N/R;
}
while(!emptystack(S)){
Pop(S,e);
printf("%d",e);
}
}
int main()
{
int N,R;
printf("请输入你要转换的数");
scanf("%d",&N);
printf("请输入你要转换的进制");
scanf("%d",&R);
creak(N,R);
return 0;
}
此为我修改的最终版本(已通过OJ)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;//改动1
SElemType *top;
int stacksize;
}SqStack;
//SqStack S;//改动2
Status InitStack(SqStack &S)
{
S.base =new SElemType[STACK_INIT_SIZE];
if(!S.base ){
exit(OVERFLOW);
}
S.top =S.base ;
S.stacksize =STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S, int e)
{
if(S.top -S.base ==S.stacksize ){
return ERROR;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack &S, int &e)
{
if(S.top ==S.base ){
return ERROR;
}
// S.top-=1 ;//改动3
// e=S.top ;
e=*--S.top;
return OK;
}//Pop
Status StackEmpty(SqStack &S)
{
if(S.base ==S.top ){
return OK;
}
else return ERROR;
}
void conversion(int N,int m)
{
int e;
SqStack S;
InitStack(S);
// while(scanf("%d,%d",&N,&m)!=EOF)//while(N)?
//{
while(N!=0){
Push(S,N%m);
N=N/m;
}
// }
while(!StackEmpty(S)){
Pop(S,e);
printf("%d",e);
}
}
int main()
{
int N,m;
while(scanf("%d,%d",&N,&m)!=EOF){
conversion(N,m);
printf("\n");
}
return 0;
}
令我困惑的两点:
关于出栈,起初我采用的是题目所给出的结构,大体如下:
最终没有输出结果
int main()
{
conversion();
return 0;
}
Status Pop(SqStack &S, int *e)
{
if(S.top ==S.base ){
return ERROR;
}
e=--S.top;
return OK;
}
void conversion()
{
int N,m;
int e;
SqStack S;
InitStack(S);
while(scanf("%d,%d",&N,&m)!=EOF)
{
while(N!=0){
Push(S,N%m);
N=N/m;
}
}
while(!StackEmpty(S)){
Pop(S,&e);
printf("%d",e);
}
}
后来我按照博主的代码改了两处(只改一处都是错误的,应该是两部分均出现了错误):
1.将数值的输入(N与m)放在了主函数而不是conversion()函数
2.改变了Pop函数的传值方式
原本为Status Pop(SqStack &S, int *e)
实参部分则为Pop(S,&e)
在赋值时我的写法为:e=--S.top;
后改为Status Pop(Sqstack &S,SElemType &e)
实参部分则为Pop(S,e)
赋值时的写法为:e=*--S.top
我有一点困惑,Pop函数并未返回e的值,那么要改变e的值不是应该传入e的地址吗,仅仅只是传入一个值又怎么能够改变呢?