1
+ #define EPS 0.0001
2
+ #define MAX_LEN 100
3
+
4
+ #include <assert.h>
5
+ #include <math.h>
6
+ #include <stdio.h>
7
+ #include <string.h>
8
+
9
+ char getChar (char n ) /* Âðúùà ñèìâîëà, ñúîòâåòñòâàù íà n */
10
+ { return (n < 10 ) ? n + '0' : n + 'A' - 10 ; }
11
+
12
+ char getValue (char c ) /* Âðúùà ñòîéíîñòòà íà ñèìâîëà c */
13
+ { return (c >= '0' && c <= '9' ) ? c - '0' : c - 'A' + 10 ; }
14
+
15
+ void reverse (char * pch )
16
+ { char * pEnd ;
17
+ for (pEnd = pch + strlen (pch ) - 1 ; pch < pEnd ; pch ++ , pEnd -- ) {
18
+ char c = * pch ;
19
+ * pch = * pEnd ;
20
+ * pEnd = c ;
21
+ }
22
+ }
23
+
24
+ void convert (char * rslt , unsigned long n , unsigned char base )
25
+ /* Ïðåîáðàçóâà öÿëîòî äåñåòè÷íî ÷èñëî n (n >= 0) â áðîéíà ñèñòåìà ñ îñíîâà base */
26
+ { char * saveRslt = rslt ;
27
+ while (n > 0 ) {
28
+ * rslt ++ = getChar ((char )(n % base ));
29
+ n /= base ;
30
+ }
31
+ * rslt = '\0' ;
32
+ reverse (saveRslt );
33
+ }
34
+
35
+ void convertLessThan1 (char * rslt , double n , unsigned char base , unsigned char cnt )
36
+ /* Ïðåîáðàçóâà äåñåòè÷íîòî ÷èñëî 0 <= n < 1 â áðîéíà ñèñòåìà ñ îñíîâà base
37
+ ñ íå ïîâå÷å îò cnt íà áðîé öèôðè ñëåä äåñåòè÷íàòà çàïåòàÿ */
38
+ {
39
+ while (cnt -- ) {
40
+ /* Äàëè íå ñìå ïîëó÷èëè 0? */
41
+ if (fabs (n ) < EPS ) break ;
42
+ /* Ïîëó÷àâàíå íà ñëåäâàùàòà öèôðà */
43
+ n *= base ;
44
+ * rslt ++ = getChar ((char )(int )floor (n ));
45
+ n -= floor (n );
46
+ }
47
+ * rslt = '\0' ;
48
+ }
49
+
50
+ void convertReal (char * rslt , double n , unsigned char base , unsigned char cnt )
51
+ /* Ïðåîáðàçóâà äåñåòè÷íîòî ðåàëíî ÷èñëî n â áðîéíà ñèñòåìà ñ îñíîâà base */
52
+ { double integer , fraction ;
53
+
54
+ /* Íàìèðàíå íà çíàêà */
55
+ if (n < 0 ) {
56
+ * rslt ++ = '-' ;
57
+ n = - n ;
58
+ }
59
+
60
+ /* Ðàçáèâàíå íà öÿëà è äðîáíà ÷àñò */
61
+ fraction = modf (n , & integer );
62
+
63
+ /* Êîíâåðòèðàíå íà öÿëàòà ÷àñò */
64
+ convert (rslt , (unsigned long )integer , base );
65
+
66
+ /* Ïîñòàâÿíå íà äåñåòè÷íà òî÷êà */
67
+ if ('\0' == * rslt )
68
+ * rslt ++ = '0' ;
69
+ else
70
+ rslt += strlen (rslt );
71
+ * rslt ++ = '.' ;
72
+
73
+ /* Êîíâåðòèðàíå íà äðîáíàòà ÷àñò */
74
+ convertLessThan1 (rslt , fraction , base , cnt );
75
+ if ('\0' == * rslt ) {
76
+ * rslt ++ = '0' ;
77
+ * rslt = '\0' ;
78
+ }
79
+ }
80
+
81
+ unsigned long calculate (const char * numb , unsigned char base )
82
+ /* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ÷èñëîòî numb, çàäàäåíî â áðîéíà ñèñòåìà
83
+ ñ îñíîâà base, numb >= 0 */
84
+ { unsigned long result ;
85
+ for (result = 0 ; '\0' != * numb ; numb ++ )
86
+ result = result * base + getValue (* numb );
87
+ return result ;
88
+ }
89
+
90
+ double calculateLessThan1 (const char * numb , unsigned char base )
91
+ /* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ÷èñëîòî numb (0 < numb < 1),
92
+ çàäàäåíî â áðîéíà ñèñòåìà ñ îñíîâà base */
93
+ { const char * end ;
94
+ double result ;
95
+ for (end = numb + strlen (numb ) - 1 , result = 0.0 ; end >= numb ; end -- )
96
+ result = (result + getValue (* end )) / base ;
97
+ return result ;
98
+ }
99
+
100
+ double calculateReal (char * numb , unsigned char base )
101
+ /* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ðåàëíîòî ÷èñëî numb, çàäàäåíî
102
+ â áðîéíà ñèñòåìà ñ îñíîâà base */
103
+ { char * pointPos ;
104
+ char minus ;
105
+ double result ;
106
+
107
+ /* Ïðîâåðêà çà ìèíóñ */
108
+ if ('-' == * numb ) {
109
+ minus = -1 ;
110
+ numb ++ ;
111
+ }
112
+ else
113
+ minus = 1 ;
114
+
115
+ if (NULL == (pointPos = strchr (numb , '.' )))
116
+ return calculate (numb , base ); /* Íÿìà äðîáíà ÷àñò */
117
+
118
+ /* Ïðåñìÿòàíå íà öÿëàòà ÷àñò */
119
+ * pointPos = '\0' ;
120
+ result = calculate (numb , base );
121
+ * pointPos = '.' ;
122
+
123
+ /* Ïðèáàâÿíå íà äðîáíàòà ÷àñò */
124
+ result += calculateLessThan1 (pointPos + 1 , base );
125
+
126
+ return minus * result ;
127
+
128
+ }
129
+
130
+ int main (void ) {
131
+ char numb [MAX_LEN ];
132
+ printf ("!!! Äåìîíñòðàöèÿ íà ïðåîáðàçóâàíåòî ìåæäó áðîéíè ñèñòåìè !!!\n" );
133
+ convertReal (numb , 777.777 , 7 , 10 ); printf ("Ñåäìè÷íèÿò çàïèñ íà 777.777 (10) å %s\n" , numb );
134
+ strcpy (numb ,"11.D873" );
135
+ printf ("Äåñåòè÷íèÿò çàïèñ íà 11.D873 (16) å: %0.10lf\n" ,calculateReal (numb ,16 ));
136
+ return 0 ;
137
+ }
0 commit comments