您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页进制转换

进制转换

来源:华佗小知识


计算机与信息科学系

姓名:

学号:

班级:

指导老师:

1

一. 问题描述

数制转换问题

将一个十进制数转换为二、八、十六进制数

二. 算法分析

用堆栈实现该问题

利用堆栈来存储每个余数(Num % n),再利用堆栈逆序输出这些余数。最终得到转换后的数制

三. 堆栈数据结构

⑴ SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;

⑵ int InitStack(SqStack &S)到int PrintStack(SqStack S)六大模块分别表

示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空.

⑶ 部分源代码分析:

int InitStack(SqStack &S)//初始化堆栈 { }

int StackEmpty(SqStack S)//是否为空栈 {

S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base)return 0; S.top=S.base;

S.stacksize=STACK_INIT_SIZE; return 1;

if(S.top==S.base)return 1;

2

}

return 0;

int GetTop(SqStack S,SElemType &e)//返回栈顶的元素 { }

int Push(SqStack &S,SElemType e)// 元素进栈 {

if(S.top-S.base>=S.stacksize) {

S.base=(SElemType if(S.top==S.base)return 0; e=*(S.top-1); return 1;

*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

}

int Pop(SqStack &S,SElemType &e)// 元素出栈 { }

3

}

if(!S.base)return 0; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT;

*S.top++=e; return 1;

if(S.top==S.base)return 0; e=*--S.top; return 1;

void PrintStack(SqStack S)//输出栈 {

SElemType e;

while (!StackEmpty(S)) {

Pop(S,e);

printf (\"%d \ }

printf(\"\\n\"); }

四. 数制转换

⑴ int conversion (int Num,int n)函数是实现十进制数向其它进制转换的函数。

⑵ 数制转换分为三种:

转换成的二进制整数、转换成的八进制整数、转换成的十六进制整数。

⑶ 部分源代码分析:

int conversion (int Num,int n) //进制转化函数 {

SElemType e; SqStack S;

InitStack(S); // 构造空栈 if(Num<0)return 0; while (Num) { Num = Num/n; } switch(n) {

case 2:printf(\"转换成的二进制整数为:\\n\");break; case 8:printf(\"转换成的八进制整数为:\\n\");break; case 16:printf(\"转换成的十六进制整数为:\\n\");break; default:return 0; }

//向堆栈中逐个存入余数

Push(S, Num % n);

4

}

if(n==16){

{ Pop(S,e); switch(e) }

{ case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:

//当转换成十六进制时,需要把10-15换成对应的A-F输出

while (!StackEmpty(S))

case 9:printf (\"%d\case 10:printf (\"A\");break; case 11:printf (\"B\");break; case 12:printf (\"C\");break; case 13:printf (\"D\");break; case 14:printf (\"E\");break; case 15:printf (\"F\");break; }

else while (!StackEmpty(S)) {//逆序输出余数,得到转换后的数制 Pop(S,e); printf (\"%d\ }

printf(\"\\n\"); return 1; }

五. 程序框图

5

开始 声明数据类型 定义变量并初始化 初始化堆栈 输入的序号执行相应程序 [1]:转换为二进制 [2]:转换为八进制 [3]:转换为十六进制 [4]:退出程序 输入要转换的自然数 输出转换后的结果 退出

6

六. 详细代码

#include #include

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int SElemType; typedef struct {

int InitStack(SqStack &S)//初始化 { }

int StackEmpty(SqStack S)//是否为空栈 { }

int GetTop(SqStack S,SElemType &e)//返回栈顶的元素 { }

int Push(SqStack &S,SElemType e)//进栈 {

if(S.top-S.base>=S.stacksize) {

if(S.top==S.base)return 0; e=*(S.top-1); return 1;

if(S.top==S.base)return 1; return 0;

S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base)return 0; S.top=S.base;

S.stacksize=STACK_INIT_SIZE; return 1; SElemType *base; SElemType *top; int stacksize;

}SqStack;

S.base=(SElemType

*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

7

}

}

if(!S.base)return 0; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT;

*S.top++=e; return 1;

int Pop(SqStack &S,SElemType &e)//出栈 { }

void PrintStack(SqStack S)//输出栈 {

SElemType e;

while (!StackEmpty(S)) {

if(S.top==S.base)return 0; e=*--S.top; return 1;

Pop(S,e);

printf (\"%d \ }

printf(\"\\n\"); }

int conversion (int Num,int n) //进制转化 {

SElemType e; SqStack S;

InitStack(S); // 构造空栈 if(Num<0)return 0; while (Num) { Num = Num/n; } switch(n) {

case 2:printf(\"转换成的二进制整数为:\\n\");break; case 8:printf(\"转换成的八进制整数为:\\n\");break;

//向堆栈中逐个存入余数

Push(S, Num % n);

8

case 16:printf(\"转换成的十六进制整数为:\\n\");break; default:return 0; } }

else while (!StackEmpty(S)) {//逆序输出余数,得到转换后的数制 Pop(S,e); printf (\"%d\ }

printf(\"\\n\"); return 1; } main(){

int i,n; SqStack S; InitStack(S);

if(n==16){//当转换成十六进制时,需要把10-15换成对应的A-F输出

while (!StackEmpty(S)) { Pop(S,e); switch(e) }

{ case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:

case 9:printf (\"%d\case 10:printf (\"A\");break; case 11:printf (\"B\");break; case 12:printf (\"C\");break; case 13:printf (\"D\");break; case 14:printf (\"E\");break; case 15:printf (\"F\");break; }

9

SElemType e=1;

printf(\"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\");

printf(\"\");

printf(\"* 请输入以下数字执行相应程序: *\\n\");

printf(\"* [1]:十进制数转换为二进制 *\\n\");

printf(\"* [2]:十进制数转换为八进制 *\\n\");

printf(\"* [3]:十进制数转换为十六进制 *\\n\");

printf(\"* [4]:退出程序 *\\n\");

printf(\"\");

printf(\"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\n\");

10

int keyL=1;

while(keyL<4&&keyL>0){

printf(\"\\n请输入数字执行相应程序[ ]\\b\\b\"); scanf(\"%d\fflush(stdin); if(keyL==1){ }

else if(keyL==2){ }

printf(\"\\n请输入一个非负十进制整数:\"); scanf(\"%d\

while(!conversion(e,8)){ }

printf(\"\\n输入错误!请重新输入一个非负十进制整数:\"); scanf(\"%d\

printf(\"\\n请输入一个非负十进制整数:\"); scanf(\"%d\

while(!conversion(e,2)){ }

printf(\"\\n输入错误!请重新输入一个非负十进制整数:\"); scanf(\"%d\

}

}

else if(keyL==3){ }

fflush(stdin);

printf(\"\\n请输入一个非负十进制整数:\"); scanf(\"%d\

while(!conversion(e,16)){ }

printf(\"\\n输入错误!请重新输入一个非负十进制整数:\"); scanf(\"%d\

七. 程序调试

测试输入数据:20

程序运行正确了,运行如下: 显示输出如图:

11

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务