用栈实现数制转换

这个小程序现在只实现了十进制转N进制,N进制往十进制或者N进制之间相互转换还没有实现,等到以后补充。

十进制转N进制的算法很简单,描述如下:

变量dec表示十进制数,变量des表示转换成的目标N进制数,变量n表示要转换的N进制

如dec=15, n=2, 则得到 des=1111

转换步骤如下:

1.用dec除以n得到商为s,余数为y;

2.把s的值赋给dec,以便进行下一次计算;

2.判断s是否为0,如果为0,则表示转换结束,退出程序,若不为0,则表示还没有转换结束,跳转到第一步继续执行;

 

例如

dec=16, n=2,即想把十进制的16转换成二进制,按照上述步骤,应该有下列演算过程:

1.dec=16,n=2,所以s=16/2=8,y=16%2=0;

2.dec=s,所以dec=8;

3.s不等于0,所以跳转到上述步骤的第一步继续执行;

4.dec=8,n=2, 所以s=8/2=4, y=8%2=0;

5.dec=s,所以dec=4;

6.s不等于0,所以跳转到上述步骤的第一步继续执行;

7.dec=4,n=2, 所以s=4/2=4,y=4%2=0;

8.dec=s,所以dec=2;

9.s不等于0,所以跳转到上述步骤的第一步继续执行;

10.dec=2,n=2,所以s=2/2=1, y=2%2=0;

11.dec=s,所以dec=1;

12s不等于0,所以跳转到上述步骤的第一步继续执行;

13.dec=1,n=2, 所以s=1/2=0, y=1%2=1;

14.dec=s,所以dec=0;

15.s等于零,所以转换结束,退出程序。

16.按照逆序显示y的值,即10000,该值即为二进制的16

同理,十进制转八进制,十进制转16进制时相同的算法。

文件代码如下:

1.头文件 num_change.h

//Headfile
// numberic change
//History
// Xinspace 3 Mar First release

#ifndef num_change_

#define num_change_

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <netinet/ip.h>

#include <pthread.h>

#define MAX 200

#define error_show(function)
do
{
fprintf(stderr, “in file:%s, in function:%s, at line %d, %s : %sn”, FILE, FUNCTION, LINE, function, strerror(errno));
exit(-1);
}while(0)

void t2o(int b, int c); //十进制转其他进制函数,b:被除数 c:除数
void start(int num); //开始转换

int create_stack(); //创建栈,存储y的值,转换结束后依次出栈后的值就为要转换的值
int pop(int
st, int sb); //出栈
void push(int
st, int num); //压栈

#endif

 

2.主函数 main.c

//Program
// numberic change
//History
// Xinspace 3 Mar First release
//

#include “num_change.h”

int main(void)
{
while(1)
{
int num; //输入要转换的十进制数
printf(“input the number you want to change(-100 means quit):t”);//如果输入-100的话表示退出程序
scanf(“%d”, &num);
if(num == -100)
break;
start(num);//开始用输入的十进制数进行转换
}
return 0;
}

void start(int num)
{
putchar(10);//三个换行符,换行符的ascii码为10
putchar(10);
putchar(10);

printf(“12 : 10 to 2n”);//提示语句,如输入12表示十进制转二进制,如果输入18则十进制转八进制,若输入16,表示十进制转16进制
printf(“18 : 10 to 8n”);
printf(“16 : 10 to 16n”);

int choose;//接受你的转换选择:12,18,16的其中一个数
printf(“choose numberic change:n”);
scanf(“%d”, &choose);

switch(choose)
{
case 12:
// printf(“12n”);
t2o(num, 2);//用t2o函数把num转换成相应的进制
break;
case 18:
// printf(“18n”);
t2o(num, 8);
break;
case 16:
// printf(“16n”);
t2o(num, 16);
break;
}
}

 

3.附加文件num_change.c

//Program
// numberic change
//History
// Xinspace 5 Mar First release
//

#include “num_change.h”

void t2o(int b, int c)
{
int b_copy = b;//后面要修改b的值,所以这里创建b_copy变量存放b的初始值
int s; //商
int y; //余数

int sb, st, count = 0;//sb指针表示栈底指针 st表示栈顶指针,count表示元素个数
sb = st = create_stack();

do//这个循环就是上面我们说的那三个步骤的代码实现
{
s = b / c;
y = b % c;
push(st++, y);
count++;
b = s;
}while(s);
// printf(“count = %dn”, count);

printf(“%d(10) is turned to t”, b_copy);
while(count)
{
if(c == 16)
{
int re = pop(–st, sb);
if(re >= 10)
{
printf(“%c”, 65+re-10);//这里是在十六进制中把10-15换成A-F
}
else
printf(“%d”, re);
}
else
printf(“%d”, pop(–st, sb));

count–;
}
// printf(“count = %dn”, count);
printf(“(2)n”);
}

int create_stack()//创建栈
{
int
sp = (int )malloc(sizeof(int) MAX);
if(!sp)
error_show(“malloc”);

return sp;
}

void push(int st, int num)//压栈
{
st = num;
printf(“insert %dn”, *st);
}

int pop(int st, int sb) //出栈
{
if(st < sb)
{
fprintf(stderr, “stack is NULL!n”);
exit(1);
}

return *st;
}

 

 

文件下载地址:

num_change.h:http://l7.yunpan.cn/lk/Q8358JMrJWnaP

main.c http://l7.yunpan.cn/lk/Q8355XZxgRCgq

num_change.c http://l7.yunpan.cn/lk/Q835tCgbhebza