Перевод в различные системы счисления - Pascal - Ответ 1345916
06.02.2011, 22:42. Показов 144420. Ответов 43
Довольно частенько спрашивают перевод из одной СС в другую и поэтому я решил выложить исходник по переводу.Думаю кому нибудь да понадобится.Можно усовершенствовать но мне лень :
Pascal | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
| uses
CRT;
const
a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {задаём строку для поиска
в ней символов}
var
n, r: real;
rez, s, s2, s3: string;
t, cc, ind, cc2, k: integer;
{процедура для разделения дробной и целой части числа}
procedure Del(var ss: string);
var
i: integer;
begin
ind := 0;
s2 := '';
for i := 1 to length(ss) do {идём по строке}
if ss[i] in [',', '.'] then {если символ входит в множество то}
begin
ind := i; {запомнили его индекс}
break{прервали цикл}
end
else {иначе}
s2 := s2 + ss[i]; {пишим в строку по символам целую часть}
s3 := ''; {инициализируем переменную}
if ind <> 0 then {если символ из множества [',','.'] есть в строке то}
begin
delete(s, 1, ind); {удаляем с первой позиции по ind элементы из строки
(т.е. целую часть + [',','.'])}
s3 := ss; {остаток исходной строки заносим в s3 (т.е. дробную часть)}
end;
end;
{функция для перевода (целой части числа) из любой СС в 10-ю}
function ToDec(var ss: string; cc: byte): integer;
var
i, n, sum: integer;
begin
sum := 0;
n := length(ss); {присваиваем n - длину строки ss}
for i := 1 to n do {идём по строке}
begin
dec(n); {уменьшаем счётчик на 1}
sum := sum + round((pos(ss[i], a) - 1) * exp(ln(cc) * n)); {суммируем число (найденное в
строке по позиции символа-1 (pos(ss[i],a)-1)) в степени dec(n)}
end;
ToDec := sum;
end;
{функция для перевода целой части числа из 10-й в любую сс}
function Cel(d: real; c: integer): string;
var
s: string;
n2: integer;
begin
n2 := round(int(d)); {берём целую часть от числа}
s := '';
repeat
s := ((a[n2 mod c + 1]) + s); {повторяем пока число не будет равно нулю берём целую часть при
делении числа на основание и берём остаток + 1 от деления целой части на 16, записываем
результат посимвольно в строку s}
n2 := n2 div c;
until (n2 = 0);
Cel := s;
end;
{функция для перевода дробной части числа из 10-й в любую сс}
function Drob(var d: real; t, c: integer): string;
var
s: string;
l2, k, n3: real;
i, l: integer;
begin
k := d - int(d);
s := '';
i := 0;
if t <> 0 then {если точность не равна 0 то переводим}
begin
repeat
l2 := k * c;
k := frac(l2); {умножаем число на c (основание СС) берём целую часть и
снова умножаем дробную}
s := s + a[round(int(l2)) + 1]; {ищим в строке элемент на позиции round(int(l2))+1
(целая часть от умножения числа на c +1)}
inc(i); {увеличиваем счётчик}
until i = t;
end
else {иначе}
s := '0'; {присваиваем s '0'}
Drob := s;
end;
{перевод (дробной части) из произвольной сс в 10-ю}
function drob2(ss: string; c: integer): real;
var
i: integer;
sum: real;
begin
for i := 1 to length(ss) do {идём по строке (по дробной части)}
sum := sum + (pos(ss[i], a) - 1) * exp(ln(c) * -i); {умножаем позицию символа строки -1
на онование системы счисления в степени -i}
drob2 := sum;
end;
begin
ClrScr;
repeat
write('Из какой будем переводить сс: ');
readln(cc2)
until cc2 in [2..36]; {проверка ввода}
write('Введите СС в которую хотите перевести: ');
readln(cc);
if cc2 = 10 then {если перевод из 10 то юзаем функции Cel и Drob}
begin
write('Введите число в ', cc2, '-й СС: ');
readln(n);
write('Введите точность: ');
readln(t);
if ((n - round(int(n))) = 0) then {если дробная часть числа=0 то юзаем Cel}
rez := Cel(n, cc)
else {иначе юзаем обе и добавляем , между дробной и целой}
rez := Cel(n, cc) + ',' + Drob(n, t, cc);
end
else {иначе если перевод не из 10-й СС}
begin
write('Введите число в ', cc2, '-й СС: ');
readln(s);
Del(s); {разбиваем на дробную и целую части строку}
if ind = 0 then
rez := Cel(ToDec(s2, cc2), cc) {переводим сначала из любой в 10-ю сс, а затем из
10-й в любую}
else
begin
r := drob2(s3, cc2); {переводим дробную часть числа}
rez := Cel(ToDec(s2, cc2), cc) + ',' + drob(r, length(s3), cc); {переводим из любой сс
в другую }
end;
end;
write(rez); { THE END }
readkey
end. |
|
Добавил функцию для проверки принадлежности числа заданной СС и кое что по мелочам:
Pascal | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
| uses
CRT;
const
a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {задаём строку для поиска
в ней символов}
var
n: real;
rez, s, s2, s3: string;
t, cc, ind, cc2, k: integer;
{процедура для разделения дробной и целой части числа}
procedure Del(var ss: string);
var
i: integer;
begin
ind := 0; {инициализируем переменные}
s2 := '';
for i := 1 to length(ss) do {идём по строке}
if ss[i] in [',', '.'] then {если символ входит в множество то}
begin
ind := i; {запомнили его индекс}
break{прервали цикл}
end
else {иначе}
s2 := s2 + ss[i]; {пишим в строку по символам целую часть}
s3 := '';
if ind <> 0 then {если символ из множества [',','.'] есть в строке то}
begin
delete(s, 1, ind); {удаляем с первой позиции по ind элементы из строки
(т.е. целую часть + [',','.'])}
s3 := ss; {остаток исходной строки заносим в s3 (т.е. дробную часть)}
end;
end;
{функция для перевода (целой части числа) из любой СС в 10-ю}
function ToDec(var ss: string; cc: byte): integer;
var
i, n, sum: integer;
begin
sum := 0;
n := length(ss); {присваиваем n - длину строки ss}
for i := 1 to n do {идём по строке}
begin
dec(n); {уменьшаем счётчик на 1}
sum := sum + round((pos(ss[i], a) - 1) * exp(ln(cc) * n)); {суммируем число (найденное в
строке по позиции символа-1 (pos(ss[i],a)-1)) в степени dec(n)}
end;
ToDec := sum;
end;
{функция для перевода целой части числа из 10-й в любую сс}
function Cel(d: real; c: integer): string;
var
s: string;
n2: integer;
begin
n2 := round(int(d)); {берём целую часть от числа}
s := ''; {инициализируем переменную}
repeat
s := ((a[n2 mod c + 1]) + s); {пока число не будет равно нулю берём целую часть при
делении числа на основание и берём остаток + 1 от деления целой части на 16, записываем
результат посимвольно в строку s}
n2 := n2 div c;
until (n2 = 0);
Cel := s;
end;
{функция для перевода дробной части числа из 10-й в любую сс}
function Drob(d: real; t, c: integer): string;
var
s: string;
l2, k, n3: real;
i, l: integer;
begin
k := d - int(d);
s := '';
i := 0;
if t <> 0 then {если точность не равна 0 то переводим}
begin
repeat
l2 := k * c;
k := frac(l2); {умножаем число на c (основание СС) берём целую часть и
снова умножаем дробную}
s := s + a[round(int(l2)) + 1]; {ищим в строке элемент на позиции round(int(l2))+1
(целая часть от умножения числа на c +1)}
inc(i); {увеличиваем счётчик}
until i = t;
end
else {иначе}
s := '0'; {присваиваем s '0'}
Drob := s;
end;
{функция для проверки может ли быть это число в заданной системе счисления}
Function prov(c:integer;s:string):boolean;
Var
i,kol,j:integer;
begin
kol:=0;
for i:=1 to c do {идём по строке а (где с-заданная система счисления)}
begin
for j:=1 to length(s) do {идём по строке s (заданному числу)}
if s[j]=a[i] then {если символ нашего числа равен символу из строки а то}
inc(kol); {увеличиваем счётчик на 1}
end;
if kol=length(s) then {если кол-во символов=длине строки (т.е. все символы в этой СС то) }
prov:=true {истина}
else {иначе}
prov:=false; {ложь}
end;
{перевод (дробной части) из произвольной сс в 10-ю}
function drob2(ss: string; c: integer): real;
var
i: integer;
sum: real;
begin
for i := 1 to length(ss) do {идём по строке (по дробной части)}
sum := sum + (pos(ss[i], a) - 1) * exp(ln(c) * -i); {умножаем позицию символа строки -1
на онование системы счисления в степени -i}
drob2 := sum;
end;
begin
ClrScr;
repeat
write('Из какой будем переводить сс: ');
readln(cc2);
write('Введите СС в которую хотите перевести: ');
readln(cc);
until (cc2 in [2..36]) and (cc in [2..36]); {проверка ввода}
repeat
write('ввод числа в ', cc2, '-й СС: ');
readln(n);
str(n,s); {переводим в строку}
Del(s); {разбиваем на дробную и целую части строку}
if not prov(cc2,s2) or not prov(cc2,s3) then {если дробная или целая части заданы не верно (т.е. true) то выводим сообщение}
write('Некорректное число.Повторите ')
until prov(cc2,s2) and prov(cc2,s3); {проверка на соответствие числа заданной СС}
if cc2 = 10 then {если перевод из 10 то юзаем функции Cel и Drob}
begin
write('Введите точность: ');
readln(t);
if ((n - round(int(n))) = 0) then {если дробная часть числа=0 то юзаем Cel}
rez := Cel(n, cc)
else {иначе юзаем обе и добавляем , между дробной и целой}
rez := Cel(n, cc) + ',' + Drob(n, t, cc);
end
else {иначе если перевод не из 10-й СС}
begin
if ind = 0 then
rez := Cel(ToDec(s2, cc2), cc) {переводим сначала из любой в 10-ю сс, а затем из
10-й в любую}
else
rez := Cel(ToDec(s2, cc2), cc) + ',' + drob(drob2(s3, cc2), length(s3), cc); {переводим из любой сс
в другую }
end;
write('Число ',n,'_',cc2,' в ',cc,'-й системе счисления:=',rez); { THE END }
readkey
end. |
|
Забыл добавить писалось в паскаль ABC
Для ТP:
Pascal | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
| Uses
CRT;
const
a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {задаём строку для поиска
в ней символов}
var
rez, s, s2, s3: string;
t, cc, ind, cc2, k: integer;
{процедура для разделения дробной и целой части числа}
procedure Del(var ss: string);
var
i: integer;
begin
ind := 0; {инициализируем переменные}
s2 := '';
for i := 1 to length(ss) do {идём по строке}
if ss[i] in [',', '.'] then {если символ входит в множество то}
begin
ind := i; {запомнили его индекс}
break{прервали цикл}
end
else {иначе}
s2 := s2 + ss[i]; {пишим в строку по символам целую часть}
s3 := ''; {инициализируем переменную}
if ind <> 0 then {если символ из множества [',','.'] есть в строке то}
begin
delete(s, 1, ind); {удаляем с первой позиции по ind элементы из строки
(т.е. целую часть + [',','.'])}
s3 := ss; {остаток исходной строки заносим в s3 (т.е. дробную часть)}
end;
end;
{функция для перевода (целой части числа) из любой СС в 10-ю}
function ToDec(var ss: string; cc: byte): string;
var
i, n, sum: longint;
s:string;
begin
sum := 0; {инициализируем переменную}
n := length(ss); {присваиваем n - длину строки ss}
for i := 1 to n do {идём по строке}
begin
dec(n); {уменьшаем счётчик на 1}
sum := sum + round((pos(ss[i], a) - 1) * exp(ln(cc) * n)); {суммируем число (найденное в
строке по позиции символа-1 (pos(ss[i],a)-1)) в степени dec(n)}
end;
str(sum,s); {переводим число в строку}
ToDec := s;
end;
{функция для перевода целой части числа из 10-й в любую сс}
function Cel(d: string; c: integer): string;
var
s: string;
k: integer;
n2:real;
begin
val(d,n2,k); {переводим строку в число}
s := ''; {инициализируем переменную}
repeat
s := ((a[round(n2) mod c + 1]) + s); {пока число не будет равно нулю берём целую часть при
делении числа на основание и берём остаток + 1 от деления целой части на 16, записываем
результат посимвольно в строку s}
n2 := round(n2) div c;
until (n2 = 0);
Cel := s;
end;
{функция для перевода дробной части числа из 10-й в любую сс}
function Drob(d: string; t, c: integer): string;
var
s, l: string;
l2, m: real;
i, k: integer;
begin
if pos('E',d)=0 then {если в строке нет E то)
то добавляем к строке "0."}
val(('0.'+d),m,k)
else {иначе}
val(d,m,k); {переводим строку (без добавления "0.") в число}
s := ''; {инициализируем переменные}
i := 0;
if t <> 0 then {если точность не равна 0 то переводим}
begin
repeat
l2 := m * c;
m := frac(l2); {умножаем число на c (основание СС) берём целую часть и
снова умножаем дробную}
s := s + a[round(int(l2)) + 1]; {ищим в строке элемент на позиции round(int(l2))+1
(целая часть от умножения числа на c +1)}
inc(i); {увеличиваем счётчик}
until i = t;
end
else {иначе}
s := '0'; {присваиваем s '0'}
Drob := s;
end;
{функция для проверки может ли быть это число в заданной системе счисления}
Function prov(c:integer;s:string):boolean;
Var
i,kol,j:integer;
begin
kol:=0; {инициализируем переменную}
for i:=1 to c do {идём по строке а (где с-заданная система счисления)}
begin
for j:=1 to length(s) do {идём по строке s (заданному числу)}
if s[j]=a[i] then {если символ нашего числа равен символу из строки а то}
inc(kol); {увеличиваем счётчик на 1}
end;
if kol=length(s) then {если кол-во символов=длине строки (т.е. все символы в этой СС то) }
prov:=true {истина}
else {иначе}
prov:=false; {ложь}
end;
{перевод (дробной части) из произвольной сс в 10-ю}
function drob2(ss: string; c: integer): string;
var
i: integer;
sum: real;
s:string;
begin
for i := 1 to length(ss) do {идём по строке (по дробной части)}
sum := sum + (pos(ss[i], a) - 1) * exp(ln(c) * -i); {умножаем позицию символа строки -1
на онование системы счисления в степени -i}
str(sum,s); {переводим из числа в строку}
drob2 := s;
end;
begin
ClrScr;
repeat
write('Из какой будем переводить сс: ');
readln(cc2);
write('Введите СС в которую хотите перевести: ');
readln(cc);
until (cc2 in [2..36]) and (cc in [2..36]); {проверка ввода}
repeat
write('ввод числа в ', cc2, '-й СС: ');
readln(s);
Del(s); {разбиваем на дробную и целую части строку}
if not prov(cc2,s2) and not prov(cc2,s3) then
write('Некорректное число.Повторите ')
until prov(cc2,s2) and prov(cc2,s3);
if cc2 = 10 then {если перевод из 10 то юзаем функции Cel и Drob}
begin
write('Введите точность: ');
readln(t);
if (s3='') then {если дробная часть числа=0 то юзаем Cel}
rez := Cel(s2, cc)
else {иначе юзаем обе и добавляем , между дробной и целой}
rez := Cel(s2, cc) + ',' + Drob(s3, t, cc);
end
else {иначе если перевод не из 10-й СС }
begin
if ind = 0 then
rez := Cel(ToDec(s2, cc2), cc) {переводим сначала из любой в 10-ю сс, а затем из
10-й в любую}
else
rez := Cel(ToDec(s2, cc2), cc) + ',' + drob(drob2(s3, cc2), length(s3), cc); {переводим из любой сс
в другую }
end;
write('Число ',s,'_',cc2,' в ',cc,'-й системе счисления:=',rez); { THE END }
readkey
end. |
|
Вернуться к обсуждению: Перевод в различные системы счисления Pascal
36
|