欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实例解析精粹学习笔记——18

程序员文章站 2022-07-10 22:26:21
《C语言实例解析精粹》中编译环境采用的是Turbo C 2.0。但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记。 实例18:将一个无符号整数转换为任意d进制(d在2~16之间)。 主要思路:对无符号整数n求d的余数,就能得到n的d进制的最低位数字,重复上述步 ......

《c语言实例解析精粹》中编译环境采用的是turbo c 2.0。但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记。

实例18:将一个无符号整数转换为任意d进制(d在2~16之间)。

主要思路:对无符号整数n求d的余数,就能得到n的d进制的最低位数字,重复上述步骤,直至n为0。依此得到n的d进制表示的最低位至最高位数字,由数字转换成字符,得到结果。

 1 /*函数trans将无符号整数n转换成d进制(2<=d<=16)
 2 表示的字符串s*/
 3 #define m sizeof(unsigned int)*8 //将无符号数转换为字符串,每个字符8位
 4 int trans(unsigned n, int d, char s[])
 5 {
 6     static char digits[] = "012345678abcdef";
 7     char        buf[m+1];
 8     int         j, i = m;
 9     
10     if(d<2 || d>16)
11     {
12         s[0] = '\0'; //字符串的截至位
13         return 0;
14     }
15     
16     buf[i] = '\0';
17     do
18     {
19         buf[--i] = digits[n%d];
20         n /= d;
21     }while(n);
22     /*将工作数组中的字符串复制到s*/
23     for(j=0; (s[j]=buf[i]) != '\0'; j++,i++);
24     return j;
25 }
26 
27 int main()
28 {
29     unsigned int num = 0;
30     int          scale[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1}; //进制2~16
31     char         str[33];
32     int          i;
33     clrscr();   //清屏函数只在turbo中使用 采用的方案是将其改为system("cls")
34                 //但实际测试中此程序是否由这句对结果并没有什么影响。
35     puts("please input a number to translate:");
36     scanf("%d", &num);
37     printf("the number you input is %d.\nthe translation result are:\n",num);
38     //此循环用来测试,显示同一个无符号整数转换成不同进制的结果。
39     for(i=0; i<sizeof(scale)/sizeof(scale[0]); i++)
40     {
41         if(trans(num, scale[i], str))
42             printf("%5d = %s(%d)\n",num,str,scale[i]);
43         else
44             printf("%5d => (%d) error!\n",num,scale[i]);
45     }
46     printf("\npress any key to quit...\n");
47     return 0;
48 }