数制转换问题(设计性实验)
1.需求分析
需求:
从键盘输入任意一个非负的十进制整数,打印输出与其等值的八进制数。由于上述的计算过程是从低位到高位顺序产生的八进制数的各个数位,而打印输出一般来说应从高位到低位进行,恰好与计 算过程相反。因此,可以先将计算过程中得到的八进制数的各位进栈,待相对应的八进制数的各位均 产生以后,再使其按顺序出栈,并打印输出。这样就得到了与输入的十进制数相对应的八进制数分析:
- 输入的形式和输入值的范:输入一个非负int型数字
- 输出的形式:一个八进制int型数字
- 程序所能达到的功能:将一个非负十进制整数转化为一个八进制数。
- 测试数据:
- 输入1888;
- 输出3540;
- 输入1000;
- 输出1750;
- 输入0;
- 输出0,退出;
2.概要设计
- 为了实现程序功能,需要定义栈和队列的抽象数据类型。
ADT Stack {
数据对象:
D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }
数据关系:
R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }
约定an 端为栈顶,a1 端为栈底。
typedef struct{
selemtype *base; //尾指针
selemtype *top; //头指针
int stacksize; //栈长
}sqstack; //栈结构
基本操作:
InitStack(&S)
操作结果:构造一个空栈S
DestroyStack (&S)
初始条件:栈S已存在
操作结果:销毁栈S
ClearStack (&S)
初始条件:栈S已存在
操作结果:将栈置为空栈
StackEmpty(&S)
初始条件:栈S已存在
操作结果:若S为空栈则返回TRUE,否则返回FALSE
StackLength(&S)
初始条件:栈S已存在
操作结果:返回S中数据元素的个数,即栈的长度
GetTop(&S, &e)
初始条件:栈S已存在
操作结果:用e返回S的栈顶元素
Push(&S, e)
初始条件:栈S已存在
操作结果:插入元素e为新的栈顶元素
Pop(&S, &e)
初始条件:栈S已存在且非空
操作结果:删除S的栈顶元素,并用e返回其值
StackTraverse(&S, visit())
初始条件:栈S已存在且非空
操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
}ADT Stack
3.具体代码
- 栈操作的实现.h:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 20 //栈长度
#define STACKINCREMENT 10 //栈扩展长度
#define selemtype int
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
/* 函数列表
void initstack(sqstack *s); //创建栈
void destroystack(sqstack *s); //销毁栈
void clearstack(sqstack *s); //清空栈
int stackempty(sqstack s); //判断栈是否为空栈
int stacklength(sqstack s); //求栈长度
int gettop(sqstack s,selemtype *e); //取栈顶
void push(sqstack *s,selemtype e); //入栈
int pop(sqstack *s,selemtype *e); //出栈
int stacktraverse(sqstack s,int (*visit)(selemtype *e)); //遍历栈 */
typedef struct{
selemtype *base; //尾指针
selemtype *top; //头指针
int stacksize; //栈长
}sqstack; //栈结构
int visit(selemtype *e) //打印节点
{
if(e == NULL)
{
return ERROR;
}
else
{
printf("%d ",*e);
return OK;
}
}
void initstack(sqstack *s) //创建栈
{
s->base = (selemtype*)malloc(STACK_INIT_SIZE*sizeof(int));
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
void destroystack(sqstack *s) //销毁栈
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize = 0;
}
void clearstack(sqstack *s) //清空栈
{
s->base = (selemtype*)malloc(s->stacksize*sizeof(int));
s->top = s->base;
}
int stackempty(sqstack s) //判断栈是否为空栈
{
if(s.base == s.top&&s.top != NULL)
{
return TRUE;
}
else
{
return FLASE;
}
}
int stacklength(sqstack s) //求栈长度
{
selemtype *p=s.base;
int n=0;
for(;p != s.top||n >= s.stacksize;p++)
{
n++;
}
return n;
}
int gettop(sqstack s,selemtype *e) //取栈顶
{
if(s.top == s.base)
{
return ERROR;
}
else
{
*e = *(s.top-1);
return OK;
}
}
void push(sqstack *s,selemtype e) //入栈
{
if((stacklength(*s)+1) >= s->stacksize)
{
s->base = (selemtype*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(selemtype));
s->stacksize += STACKINCREMENT;
s->top =s->base+s->stacksize-STACKINCREMENT-1;
}
*s->top = e;
s->top++;
}
int pop(sqstack *s,selemtype *e) //出栈
{
if(stackempty(*s) != TRUE)
{
*e = *(--s->top);
return OK;
}
else
{
return ERROR;
}
}
int stacktraverse(sqstack s,int (*visit)(selemtype *e)) //遍历栈
{
selemtype *p = s.base;
for(;p != s.top;p++)
{
if(!visit(p))
{
return ERROR;
}
}
return OK;
}
- 数值转换问题.c:
#include<stdio.h>
#include"栈操作的实现.h"
void system_transformation(int i,sqstack *s) //数制转换
{
int j = i;
if(j == 0) //如果输入为零,输出也为零
{
push(s,0);
}
for(;j != 0;j /= 8)
{
push(s,j % 8); //将余数放入栈中
}
}
int main()
{
sqstack stack;//先定义栈
initstack(&stack);//再初始化栈
int i,j;
do
{
printf("\n请输入一个非负十进制整数(输入零可退出程序):");
scanf("%d",&i);
system_transformation(i,&stack);//进行数制转换
printf("对应八进制数:");
for(;pop(&stack,&j);)//一个一个将栈中元素弹出
{
printf("%d",j);
}
}while(i != 0);
return 0;
}