Skip to content

Commit 9c1dd86

Browse files
author
VGGeorgiev
committedJun 2, 2015
Added original source files from Programming =++ Algorithms book
0 parents  commit 9c1dd86

File tree

216 files changed

+12259
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

216 files changed

+12259
-0
lines changed
 

‎chapter01/base.c

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
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+
}

‎chapter01/bell.c

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <stdio.h>
2+
3+
#define MAXN 100
4+
5+
const unsigned long n = 10;
6+
7+
unsigned long M[MAXN+1];
8+
void stirling(unsigned n)
9+
{ unsigned i, j;
10+
if (n == 0) M[0] = 1;
11+
else M[0] = 0;
12+
for (i = 1; i <= n; i++) {
13+
M[i] = 1;
14+
for (j = i - 1; j >= 1; j--) M[j] = j * M[j] + M[j - 1];
15+
}
16+
}
17+
18+
unsigned long bell(unsigned n)
19+
{ unsigned i;
20+
unsigned long result = 0;
21+
for (i = 0; i <= n; i++) result += M[i];
22+
return result;
23+
}
24+
25+
int main(void) {
26+
stirling(n);
27+
printf("bell(%lu)= %lu\n", n, bell(n));
28+
return 0;
29+
}

0 commit comments

Comments
 (0)