实验报告
1.实验题目
运用栈进行数制转换。
2.需求分析
用C编写完成:对于输入的任意一个非负十进制整数,输出与其等值的其他进制数。
3.概要设计
由于运行过程是从低位到高位顺序产生进制数的各个数位,而输出应从高位到底位进行,这和计算过程相反,恰好可以运用栈把进制数的各位顺序入栈,而按出栈序列输出,即为对应转换的进制数。
4.详细设计
1)先对栈定义:
Typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}Stack;
2)构造一个栈:
int InitStack(Stack &S)//初始化栈
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) exit (ERROR); //存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
3)分别进行入栈和出栈操作,再进行进制转换。
5.调试分析
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
//栈定义
typedef struct
{
int *base;
int *top;
int stacksize;
}Stack;
int InitStack(Stack &S)//初始化栈
{
S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) exit (ERROR); //存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int push(Stack &S,int e)//入栈
{
if(S.top-S.base>=S.stacksize) //栈满
{
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(int));
if(!S.base) exit (ERROR); //存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int pop(Stack &S,int &e)//出栈
{
if(S.top==S.base) return ERROR;//栈空
e=* --S.top;
return OK;
}
void conversion(int n,int m)//n为十进制数,m为要转换进制
{
Stack S;
InitStack(S);
while(n!=0)
{
push(S,n%m);
n=n/m;
}
while(S.top!=S.base)
{
int x;
pop(S,x);
printf("%x",x);
}
}
int main()
{
int n,m;
printf("请输入一个十进制正整数:");
scanf("%d",&n);
printf("\n输入要转换进制:");
scanf("%d",&m);
if(m<2)
{
printf("输入不合法!请输入大于1的进制!");
printf("\n");
return ERROR;
}
conversion(n,m);
printf("\n");
return OK;
}。