您的位置:首页 > 其它

用栈实现数制转换

2013-04-02 17:42 190 查看
这个小程序现在只实现了十进制转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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数制转换