实验 进制转换.docx
- 文档编号:23073395
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:72.81KB
实验 进制转换.docx
《实验 进制转换.docx》由会员分享,可在线阅读,更多相关《实验 进制转换.docx(16页珍藏版)》请在冰豆网上搜索。
实验进制转换
青岛理工大学
课程实验报告
课程名称
数据结构
班级
软件112
实验日期
2013年4月15号
姓名
何金荣
学号
201107225
实验成绩
实验名称
栈的应用------进制转换
实
验
目
的
及
要
求
(1)通过进制转换的表示和计算,熟练掌握栈的基本操作,以及用顺序栈表示栈的存储结构操作的实现。
(2)使学生掌握栈的最基本和最主要的操作:
插入和删除,出栈和进栈等操作。
(3)熟悉C++的基本编程方法,掌握集成编译环境的调试方法。
(4)学习各个进制数之间的转换,掌握其方法。
(5)学习使用栈来解决实际问题的能力。
实
验
环
境
硬件平台:
普通个人PC机
软件平台:
Windows732位操作系统
编程环境:
VisualC++6.0编程软件
实
验
内
容
利用栈来实现任意输入一个十进制数,将其转换成十六进制,八进制数,二进制数,或转换成相应的N进制数。
实现进制转换的内容如下:
(1)建立一个栈的结构体,实现栈的出栈,入栈等九个基本操作。
(2)通过conversion()函数,任意输入一个十进制数,将其转换成十六进制数。
(3)通过conversion1()函数,任意输入一个十进制数,将其转换成八进制数。
(4)通过conversion2()函数,任意输入一个十进制数,将其转换成二进制数。
(5)通过conversion3()函数,任意输入要转换的进制数N,将任意数转换成相应的进制数。
(6)通过output()函数打印输出相应的结果。
算
法
描
述
及
实
验
步
骤
测试主函数流程:
算法描述:
/************************************************************/
/*定义数据结构*/
/************************************************************/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
/************************************************************/
/*十进制转换十六进制*/
/************************************************************/
voidconversion()
{/*对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数*/
SqStacks;
unsignedn;/*非负整数*/
SElemTypee;
InitStack(&s);/*初始化栈*/
printf("将10进制整数n转换为16进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%16);/*入栈n除以16的余数(16进制的低位)*/
n=n/16;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
/************************************************************/
/*十进制转换八进制*/
/************************************************************/
voidconversion1()
{
SqStacks;
unsignedn;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为8进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%8);/*入栈n除以8的余数(8进制的低位)*/
n=n/8;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
/************************************************************/
/*十进制转换二进制*/
/************************************************************/
voidconversion2()
{
SqStacks;
unsignedn;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为2进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%2);/*入栈n除以2的余数(2进制的低位)*/
n=n/2;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
/************************************************************/
/*十进制转换N进制*/
/************************************************************/
voidconversion3()
{
SqStacks;
unsignedn;
intN;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为N进制数,请输入:
N=");
scanf("%d",&N);
printf("将10进制整数n转换为N进制数,请输入:
n=");
scanf("%u",&n);
while(n)
{
Push(&s,n%N);
n=n/N;
}
while(!
StackEmpty(s))/*判断栈是否空*/
{
Pop(&s,&e);
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
调
试
过
程
及
实
验
结
果
1经过这次试验设计,发现了自己的很多缺陷,这些算法太深奥,或者可以说成是算法太严密了,抽象概念太强了,觉得自己做这两个实验,相当吃力。
2调试中遇到的问题与解决办法:
(1)、语法错误及修改编译中出现的语法问题主要在于子函数和变量的定义,括号的配对,关键字和函数名的书写,以及库函数的规范使用,这些问题都可以通过提示对应的将其解决.
3我通过调试运行后发现:
计算完成打印结果后马上就会退出。
程序在运行起来以后没有一个可以让程序暂时停止的地方,比如要求用户输入,或者什么的,程序顺序执行之后就退出了。
4.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好的可重用性.
5经过几番的调试后,运行结果如下:
任意输入一个数,分别转换成十六进制数,八进制数,二进制数。
6
7时间复杂度为:
f(n/N),空间复杂度:
O(n)
总
结
4. 总结
(1)我在写程序的时候要多角度考虑问题,比如题目中要求栈法与数组方法同时去实现进制转换问题。
在编译过程中我们可以将特殊的问题逐渐的化为一般问题,比如10进制转换到16进制,我举的例子是200转换为C8。
(2)通过此次课程设计的考验,让我回顾了算法与数据结构这门课的主要内容。
掌握了如何分别用栈来实现数据存储与转换,加深了对栈的掌握和操作,以及栈先进后出的特点。
(3)在程序的调试初期,我遇到了许多问题,暴露了对编译软件不熟悉的弊端,如设置断点和单步调试,让我意识到要想学好编程,就得多上机调试。
几天的时间自己用vc++实现了进制转换问题,收获很大同时在编写代码过程中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错,许多错误不知从哪修改。
课程设计中,回顾了很多以前的东西,收获很大。
(4)课程设计使自己发现考试并不是最重要,最重要的是能运用所学的知识。
在整个课程设计的学习过程中,不再是用学到的知识解题,而是在实际运用时遇到什么学什么,重在把知识应用于实际。
附
录
#include
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/
#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/
#defineSTACK_INCREMENT2/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
/*顺序栈的基本操作(9个)*/
voidInitStack(SqStack*S)
{/*构造一个空栈S*/
(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S).base)
exit(OVERFLOW);/*存储分配失败*/
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
voidDestroyStack(SqStack*S)
{/*销毁栈S,S不再存在*/
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stacksize=0;
}
voidClearStack(SqStack*S)
{/*把S置为空栈*/
(*S).top=(*S).base;
}
StatusStackEmpty(SqStackS)
{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
intStackLength(SqStackS)
{/*返回S的元素个数,即栈的长度*/
returnS.top-S.base;
}
StatusGetTop(SqStackS,SElemType*e)
{/*若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
if(S.top>S.base)
{
*e=*(S.top-1);
returnOK;
}
else
returnERROR;
}
voidPush(SqStack*S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if((*S).top-(*S).base>=(*S).stacksize)/*栈满,追加存储空间*/
{
(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!
(*S).base)
exit(OVERFLOW);/*存储分配失败*/
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACK_INCREMENT;
}
*((*S).top)++=e;
}
StatusPop(SqStack*S,SElemType*e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
if((*S).top==(*S).base)
returnERROR;
*e=*--(*S).top;
returnOK;
}
voidStackTraverse(SqStackS,void(*visit)(SElemType))
{/*从栈底到栈顶依次对栈中每个元素调用函数visit()*/
while(S.top>S.base)
visit(*S.base++);
printf("\n");
}
typedefintSElemType;/*定义栈元素类型为整型*/
#include"c1.h"
#include"c3-1.h"/*采用顺序栈*/
#include"bo3-1.h"/*利用顺序栈的基本操作*/
voidconversion()
{/*对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数*/
SqStacks;
unsignedn;/*非负整数*/
SElemTypee;
InitStack(&s);/*初始化栈*/
printf("将10进制整数n转换为16进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%16);/*入栈n除以16的余数(16进制的低位)*/
n=n/16;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
voidconversion1()
{
SqStacks;
unsignedn;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为8进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%8);/*入栈n除以16的余数(16进制的低位)*/
n=n/8;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
voidconversion2()
{
SqStacks;
unsignedn;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为2进制数,请输入:
n(>=0)=");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
Push(&s,n%2);/*入栈n除以16的余数(16进制的低位)*/
n=n/2;
}
while(!
StackEmpty(s))/*当栈不空*/
{
Pop(&s,&e);/*弹出栈顶元素且赋值给e*/
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
voidconversion3()
{
SqStacks;
unsignedn;
intN;
SElemTypee;
InitStack(&s);
printf("将10进制整数n转换为N进制数,请输入:
N=");
scanf("%d",&N);
printf("将10进制整数n转换为N进制数,请输入:
n=");
scanf("%u",&n);
while(n)
{
Push(&s,n%N);
n=n/N;
}
while(!
StackEmpty(s))
{
Pop(&s,&e);
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);/*大于9的余数,输出相应的字符*/
}
printf("\n");
}
voidmain()
{
conversion();
conversion1();
conversion2();
conversion3();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进制转换 转换