这个小程序现在只实现了十进制转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