用栈实现数制转换

这个小程序现在只实现了十进制转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 : %s\n”, __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 2\n”);//提示语句,如输入12表示十进制转二进制,如果输入18则十进制转八进制,若输入16,表示十进制转16进制
printf(“18 : 10 to 8\n”);
printf(“16 : 10 to 16\n”);

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

switch(choose)
{
case 12:
//            printf(“12\n”);
t2o(num, 2);//用t2o函数把num转换成相应的进制
break;
case 18:
//            printf(“18\n”);
t2o(num, 8);
break;
case 16:
//            printf(“16\n”);
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 = %d\n”, 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 = %d\n”, 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 %d\n”, *st);
}

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

return *st;
}

 

更多文章请见blog.xinspace.name 

文件下载地址:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值