数据结构+数制转换实验报告

合集下载

数制转换实验报告

数制转换实验报告

1.实验题目1、数制转换问题[问题描述]将十进制数N 和其它d 进制数的转换是计算机实现计算的基本问题,其解决方案很多,其中最简单方法基于下列原理:即除d 取余法。

例如:(1348)10=(2504)8N N div 8 N mod 81348 168 4168 21 021 2 52 0 2从中我们可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈的特性即后进先出的特性。

所以可以用顺序栈来模拟这个过程。

2.需求分析1. 对于键盘输入的任意一个非负的十进制整数,打印输出与其等值的八进制数。

由于上述的计算过程是从低位到高位顺序产生的八进制数的各个数位,而打印输出,一般来说应从高位到地位进行,恰好和计算过程相反。

因此可以先将计算过程中得到的八进制数的各位进栈,待相对应的八进制数的各位均产生以后,再使其按顺序出栈,并打印输出。

即得到了与输入的十进制数相对应的八进制数。

2. 数据测试。

1)输入十进制数2000,输出相应的八进制数。

2)输入十进制数1234,输出相应的八进制数。

3.概要设计1)为了实现上述程序功能,需要定义栈的抽象数据类型:1、为实现上述程序功能,应以有序链表表示集合。

ADT stack{数据对象:D={,1,2,}i iElemSet i a a ∈=≥…,n,n 0 数据关系:111{,,,2,}i i i i D i a a a a R --=〈〉∈=…,n基本操作:Initstack (&s)操作结果:构造一个空的栈s.push(&s,e )初始条件:栈s 已存在操作结果:插入元素e 作为栈顶元素。

pop (&s,e )初始条件:栈s已存在 ,且非空操作结果:删除s的栈顶元素,并用e返回。

2)本程序包含3个函数调用模块void initstack(sqstack &S)void push(sqstack &S,int e)void pop(sqstack &S,int&e)4.详细设计实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

实验报告数制转换

实验报告数制转换

一、实验目的1. 掌握数制转换的基本概念和原理;2. 熟练运用数制转换的方法,实现不同数制之间的转换;3. 培养学生的逻辑思维能力和动手操作能力。

二、实验原理数制转换是指将一个数从一个数制转换到另一个数制的过程。

常见的数制有十进制、二进制、八进制和十六进制。

以下是几种常见数制之间的转换方法:1. 二进制与十进制之间的转换(1)二进制转十进制:将二进制数按位权展开求和;(2)十进制转二进制:不断除以2,取余数,直到商为0,将余数倒序排列。

2. 八进制与十进制之间的转换(1)八进制转十进制:将八进制数按位权展开求和;(2)十进制转八进制:不断除以8,取余数,直到商为0,将余数倒序排列。

3. 十六进制与十进制之间的转换(1)十六进制转十进制:将十六进制数按位权展开求和;(2)十进制转十六进制:不断除以16,取余数,直到商为0,将余数倒序排列,不足四位的在前面补0。

4. 二进制与八进制之间的转换(1)二进制转八进制:将二进制数每三位分成一组,每组对应一个八进制数;(2)八进制转二进制:将八进制数每位转换成三位二进制数。

5. 二进制与十六进制之间的转换(1)二进制转十六进制:将二进制数每四位分成一组,每组对应一个十六进制数;(2)十六进制转二进制:将十六进制数每位转换成四位二进制数。

三、实验仪器与材料1. 计算机2. 文档编辑软件(如Microsoft Word)四、实验步骤1. 在计算机上打开文档编辑软件,创建一个新的文档。

2. 将以下数制转换题目依次输入文档中:(1)将二进制数1101转换为十进制数;(2)将十进制数21转换为二进制数;(3)将八进制数27转换为十进制数;(4)将十进制数36转换为八进制数;(5)将十六进制数1A转换为十进制数;(6)将十进制数156转换为十六进制数;(7)将二进制数10110111转换为八进制数;(8)将八进制数532转换为二进制数;(9)将二进制数11011011转换为十六进制数;(10)将十六进制数A3C转换为二进制数。

《C数据结构》数制转换实验报告

《C数据结构》数制转换实验报告

数制转换实验目的:使用堆栈的存储结构实现数制转换,如10进制->2进制等实验思路:1、写出堆栈的相关操作函数,如:创建【int InitStack( SqStack *S )】、压入【int Push(SqStack *S,int e)】、弹出【int Pop(SqStack *S,int *e)】、销毁【void DestroyStack(SqStack *S)】、判断是否为空【int StackEmpty(SqStack *S)】等。

2、堆栈的各操作函数完成后编写功能函数——数制转换【voidchangeNumber(int *num,int to)】。

3、数制转换函数之后编写主函数,使用上述函数实现数制转换的功能核心代码:1、数制转换函数:void changeNumber(int *num,int to){int result[100],yu,e,m,i=0,j=0; //result[]是转换后的结果,yu是取余的结果SqStack S;for(m=0;m<100;m++){result[m]='#';}InitStack(&S);while(*num!=0){yu=*num%to;Push(&S,yu);*num=*num/to;}while(!StackEmpty(&S)){Pop(&S,&e);result[i]=e;i++;}while(1){printf("%d",result[j]);j++;if(result[j]=='#'){printf("\n");break;}}DestroyStack(&S);}2、主函数:int main(){int *p,num,to;int ok;while(1){printf("您想转换的数字是:");scanf("%d",&num);printf("转换成多少进制:");scanf("%d",&to);p=&num;changeNumber(p,to);while(1){printf("继续请按1,退出请按0...");scanf("%d",&ok);if(ok!=0 && ok!=1){printf("抱歉,您的输入有误,");}else if(ok==0 || ok==1){break;}}if(ok==0){break;}}system("pause");return 1;}功能演示:1、运行执行文件,进入dos窗口后可见提示:“您想转换的数字是:”2、输入:“1000”,回车后可见提示:“转换成多少进制:”3、输入:“6”,回车,得到结果:“4344”,又见提示:“继续请按1,退出请按0...”4、输入0退出。

数据结构实验报告 栈进制转换

数据结构实验报告 栈进制转换

数据结构实验报告栈进制转换数据结构实验报告栈进制转换一、实验目的栈是一种常见的数据结构,本实验的目的在于通过实现栈的基本操作,设计并实现一个进制转换的程序,并通过实验验证程序的正确性和效率。

二、实验原理1.栈的定义和基本操作栈是一种后进先出(Last In First Out,简称LIFO)的数据结构。

它可以通过一个指针来标识当前栈顶元素,栈顶指针top的起始值为-1,空栈时top=-1.2.栈的进制转换将一个十进制数转换为其他进制(如二进制、八进制、十六进制)的过程中,可以通过栈来实现。

具体步骤如下:- 初始化一个空栈;- 将十进制数依次除以目标进制的基数,将余数依次入栈,直到商为0;- 依次出栈,将出栈的余数组合起来,得到转换后的目标进制数。

三、实验内容1.实现栈的基本操作(1)定义栈结构,包括元素数组和栈顶指针;(2)实现入栈操作push(),将元素插入到栈顶;(3)实现出栈操作pop(),从栈顶删除一个元素并返回其值;(4)实现获取栈顶元素的操作getTop(),返回栈顶元素的值;(5)实现判断栈是否为空的操作isEmpty(),返回布尔值;(6)实现判断栈是否已满的操作isFull(),返回布尔值。

2.设计并实现进制转换的程序(1)初始化一个空栈用于存放转换后的数字;(2)输入十进制数num和目标进制target;(3)通过栈的操作将num转换为target进制数;(4)输出转换后的结果。

四、实验步骤1.实现栈的基本操作(1)定义栈的结构和相关操作;(2)编写相应的测试代码,验证栈的基本操作是否正确。

2.设计并实现进制转换的程序(1)根据原理部分的步骤,设计转换程序的具体逻辑;(2)编写相应的测试代码,验证转换程序的正确性和效率。

五、实验结果与分析1.给定一个十进制数num=12345,目标进制为二进制(target=2),经过进制转换后得到的结果为.111.2.给定一个十进制数num=456,目标进制为八进制(target=8),经过进制转换后得到的结果为.710.本实验的结果表明,转换程序能够正确地将十进制数转换为目标进制数,并且具有较高的效率。

数据结构十进制数转化二进制数实验报告

数据结构十进制数转化二进制数实验报告

四、运行结果(运行界面图及说明): 测试数据:89.125 0.64 105运行结果如下:五、实验体会1.加强对循环结构的掌握。

2.实验错误太多,应加强基础知识的学习。

3. 多练习敲代码,熟练掌握顺序栈。

六、附完整代码#include<stdio.h>#include<iomanip>#include<fstream>#include<string>#include<math.h>#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;#define MAXSIZE 100typedef struct{ElemType *base;ElemType *top;int stacksize;}SqStack;Status InitStack(SqStack &S){S.base= new ElemType[MAXSIZE];if (!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=MAXSIZE;return OK;}Status Push(SqStack &S,ElemType e){ if(S.top-S.base==S.stacksize) return ERROR;*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){ if(S.top==S.base) return ERROR;e=*--S.top;return OK;}Status StackEmpty(SqStack S){if(S.top==S.base) return true;else return false;return OK;}int main(){SqStack S;float a,M;int Z=0,N,i;ElemType e;InitStack(S);printf("请输入一个十进制数:");scanf_s("%f",&a);N=a;printf("该十进制数的整数部分为:%d\n",N);M=a-N;printf("该十进制数的小数部分为:%f\n",M);if(!N){printf("该十进制数对应的二进制数为:"); printf(".");for(i=0;i<=6;i++){M=M*2;Z=M;M=M-Z;printf("%d",Z);};printf("\n");};if(N) {printf("栈中元素为:");while(N){Push(S,N%2);printf("%d",N%2);N=N/2;};printf("\n");printf("该十进制数对应的二进制数为: "); while(!StackEmpty(S)){Pop(S,e);printf("%d",e);}printf(".");for(i=0;i<=6;i++){M=M*2;Z=M;M=M-Z;printf("%d",Z);};printf("\n");};return 0;}。

数据结构实验2数制转换

数据结构实验2数制转换

实验二、数制转换一、实验目的1.掌握堆栈的存储方式和基本操作。

2.掌握堆栈后进先出运算原则在解决实际问题中的应用。

3.掌握使用栈的原理来解决数制转换问题。

二、实验内容利用栈结构,编写程序将十进制数转换成二进制数或八进制数。

提示:十进制数值转换成二进制使用辗转相除法将一个十进制数值转换成二进制数值。

即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。

最后将所有的余数反向输出就是所对应的二进制数值。

十进制数值转换成八进制算法类似。

转换算法要求用一个函数完成。

顺序栈的基本操作的代码可参考如下:typedef struct{DataType stack[MaxStackSize];int top;} SeqStack;void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/{ S->top = 0; /*定义初始栈顶下标值*/}int StackNotEmpty(SeqStack S)/*判顺序堆栈S非空否,非空则返回1,否则返回0*/{ if(S.top <= 0) return 0;else return 1;}int StackPush(SeqStack *S, DataType x)/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */{ if(S->top >= MaxStackSize){ printf("堆栈已满无法插入! \n");return 0;}else{ S->stack[S->top] = x;S->top ++;return 1;}}int StackPop(SeqStack *S, DataType *d)/*弹出顺序堆栈S的栈顶数据元素值到参数d ,出栈成功则返回1,否则返回0*/ { if(S->top <= 0)printf("堆栈已空无数据元素出栈! \n");return 0;}else{S->top --;*d = S->stack[S->top];return 1;}}int StackTop(SeqStack S, DataType *d)/*取顺序堆栈S的当前栈顶数据元素值到参数d ,成功则返回1,否则返回0*/ {if(S.top <= 0){ printf("堆栈已空! \n");return 0;}else{ *d = S.stack[S.top - 1];return 1;}}三、实验源代码#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int DataType;typedef struct node{DataType data[MAXSIZE];int top;}SeqStack,*PSeqStack;typedef structDataType data[MAXSIZE];int front,rear;}SeqQueue,*PSeqQueue;PSeqStack Init1(void){PSeqStack S;S=(PSeqStack)malloc(sizeof(SeqStack));if(S) S->top=-1;return S;}PSeqQueue Inin2(){PSeqQueue Q;Q=(PSeqQueue)malloc(sizeof(SeqQueue));if(Q){Q->front=0;Q->rear=0;}return Q;}int Empty1(PSeqStack S)if(S->top==-1)return(1);elsereturn 0;}int Empty2(PSeqQueue Q){if(Q && Q->front==Q->rear)return 1;elsereturn 0;}int Push(PSeqStack S,DataType x) {if(S->top==MAXSIZE-1)return 0;else{S->top++;S->data[S->top]=x;return 1;}int In(PSeqQueue Q, DataType x){if((Q->rear+1)%MAXSIZE==Q->front ) {printf("队满");return -1;}else{Q->rear=(Q->rear+1)%MAXSIZE;Q->data[Q->rear]=x;return 1;}}int Pop(PSeqStack S,DataType *x){if(Empty1(S))return 0;*x=S->data[S->top];printf("%d",*x);S->top--;return 1;int Out(PSeqQueue Q){if(Empty2(Q)){printf("队空");return -1;}else{Q->front=(Q->front+1)%MAXSIZE;printf("%d",Q->data[Q->front]);}return 0;}void transfrom1(PSeqStack S,int x,int t) {while(x!=0){Push(S,x%t);x=x/t;}while(S->top!=-1)Pop(S,&S->data[S->top]);}void transfrom2(PSeqQueue Q,float x,int t) {while(x!=0){x=x*t;In(Q,(int)x);x=x-(int)x;}while(!Empty2(Q))Out(Q);}int main(){PSeqStack S;PSeqQueue Q;int t;float x;S=Init1();Q=Inin2();printf("请输入要转换的数:");scanf("%f",&x);printf("请输入要转化成几进制:");scanf("%d",&t);printf("%f 转化成%d 进制为:",x,t);transfrom1(S,(int)x,t);if(x==(int)x){printf("\n");return 0;}printf(".");transfrom2(Q,x-(int)x,t);printf("\n");return 0;}四、实验结果。

数据结构实验报告-栈进制转换

数据结构实验报告-栈进制转换

数据结构实验报告-栈进制转换数据结构实验报告栈进制转换一、实验目的本实验旨在通过使用栈这种数据结构,实现不同进制之间的转换,加深对栈的基本概念、操作和应用的理解,提高编程能力和问题解决能力。

二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验原理进制转换是将一个数从一种进制表示形式转换为另一种进制表示形式的过程。

常见的进制有二进制、八进制、十进制和十六进制。

栈是一种特殊的线性表,它遵循“后进先出”(Last In First Out,LIFO)的原则。

在进制转换中,可以利用栈来存储转换过程中的余数,从而实现进制的转换。

以十进制转换为二进制为例,将十进制数除以 2 取余数,然后将商继续除以 2 取余数,直到商为 0。

将依次得到的余数从栈中取出,即可得到对应的二进制数。

四、实验内容与步骤(一)数据结构定义```cppclass Stack {private:int stackArray;int top;int capacity;public:Stack(int size) {capacity = size;stackArray = new intcapacity;top =-1;}~Stack(){delete stackArray;}void push(int element) {if (isFull()){std::cout <<"Stack Overflow" << std::endl; return;}stackArray++top = element;}int pop(){if (isEmpty()){std::cout <<"Stack Underflow" << std::endl; return -1;}return stackArraytop;}int peek(){if (isEmpty()){std::cout <<"Stack is empty" << std::endl; return -1;}return stackArraytop;}bool isEmpty(){return top ==-1;}bool isFull(){return top == capacity 1;}};```(二)十进制转二进制函数```cppvoid decimalToBinary(int decimalNumber) {Stack stack(32);while (decimalNumber > 0) {int remainder = decimalNumber % 2;stackpush(remainder);decimalNumber /= 2;}std::cout <<"十进制"<< decimalNumber <<"转换为二进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(三)十进制转八进制函数```cppvoid decimalToOctal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 8;stackpush(remainder);decimalNumber /= 8;}std::cout <<"十进制"<< decimalNumber <<"转换为八进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(四)十进制转十六进制函数```cppvoid decimalToHexadecimal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 16;if (remainder < 10) {stackpush(remainder +'0');} else {stackpush(remainder 10 +'A');}decimalNumber /= 16;}std::cout <<"十进制"<< decimalNumber <<"转换为十六进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(五)主函数```cppint main(){int decimalNumber;std::cout <<"请输入一个十进制数: ";std::cin >> decimalNumber; decimalToBinary(decimalNumber);decimalToOctal(decimalNumber);decimalToHexadecimal(decimalNumber);return 0;}```五、实验结果与分析(一)实验结果输入十进制数 25,得到以下结果:二进制:11001八进制:31十六进制:19(二)结果分析通过实验,成功实现了将十进制数转换为二进制、八进制和十六进制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告题目:数制转换
班级:***
姓名:***
学号:200707041
指导教师:**
完成日期:2009 年 4 月18 日
一、需求分析
1、程序所实现的功能;
程序通过对栈的应用,实现了将一个十进制整数向R进制数的转换。

2、程序的输入,包含输入的数据格式和说明;
程序运行时,输入任意十进制整数。

对于转换进制R的值则应为:10、2、
8、16。

3、程序的输出,程序输出的形式;
输出为转换成的R进制整数。

二、设计内容
1、说明本程序中所有用到的数据及其数据结构的定义及其基本操作的定义;
1)定义栈的顺序存储结构
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;//栈的顺序存储表示
2)栈的初始化int InitStack(SqStack &S)
3)判断一个栈是否为空int StackEmpty(SqStack &S)
4)入栈操作int Push(SqStack &S,int e)
5)出栈操作int Pop(SqStack &S,int &e)
6)数制转换函数void conversion(SqStack &S,int R,int N,int &e) 7)判断是否输入正确int Ninputlegality() int Rinputlegality() 8)主函数void main()
2、给出注释详细的源程序,及其设计思想的描述;
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 1000
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;//栈的顺序存储表示
int N;//定义全局变量N,表示将要转换为R进制的十进制数int R;//定义全局变量R,表示进制数R
int InitStack(SqStack &S)
{
S.base=(int*)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base)exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//栈的初始化
int StackEmpty(SqStack &S)
{
if(S.top==S.base) return TRUE;
else return FALSE;
}//判断栈是否为空
int Push(SqStack &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(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//进栈操作
int Pop(SqStack &S,int &e)
{
if(S.top==S.base)return ERROR;
e=*--S.top ;
return OK;
}//出栈操作
void conversion(SqStack &S,int R,int N,int &e) {
while(N)
{
Push(S,N%R);
N=N/R;
}
while(!StackEmpty(S))
{
Pop(S,e);
if(e<10)
{
printf("%d",e);
}
else
{ e=e+55;
printf("%c\n",e);
}
}
printf("\n");
}//数制转换函数
int Ninputlegality()
{
char str1[100];//数组str存放输入的字符,以便判断输入是否有误int i;
gets(str1);
for(i=0;str1[i]!='\0';i++)
{
if((str1[i]>57)||(str1[i]<48))
{
return(0);
break;
}
else
{
N=atoi(str1);//输入无误时,字符数组转换为十进制数N
return(1);
}
}
}//判断十进制数N输入是否合法
int Rinputlegality()
{
char str2[100];
int i;
gets(str2);
for(i=0;str2[i]!='\0';i++)
{
if((str2[i]>57)||(str2[i]<48))
{
return(0);
break;
}
else
{
R=atoi(str2);//输入无误时,字符数组转换为进制数R
return(1);
}
}
}//判断进制数r输入是否合法
void main()
{
int e,p,q;
SqStack S;
InitStack(S);
m: printf("请输入十进制整数N:");
p=Ninputlegality();
if(p==0)
{
printf("输入有误\n");
goto m;
}//保证输入数据合法
n:printf("请输入将要转换为的进制数R:");
q=Rinputlegality();
if(q==0)
{
printf("输入有误\n");
goto n;
}//保证输入数据合法
printf("%d由十进制转换为%d进制数为:",N,R);
conversion(S,R,N,e);
}//主函数
3、画出函数之间的调用关系图;
三、测试结果
列出你的测试结果,包括输入和输出。

注意测试数据应该完整和严格,至少给出2组测试结果(含合法数据与非法数据)。

第一组:合法输入,输入十进制45,将45转换为16进制数
第二组:输入错误,比如输入十进制数N时,误输入fh89ts,程序提示重新输入;N输入正确后,下一步输入R时若再输入错误,程序仍提示重新输入,直至输入完全正确。

四、附录
列出源程序的文件名清单。

并将带注释的源程序及可执行文件,形成压缩文件。

相关文档
最新文档