79 / 79 / 84
Регистрация: 26.09.2012
Сообщений: 341
|
11.12.2013, 15:27
|
2
|
Сообщение было отмечено kondak как решение
Решение
kondak,
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
| program Project1;
(*Переводит десятичную запись вещественного числа в двоичную.
Точность перевода дробной части - до aPrecision цифр после запятой.*)
function DecToBin(const aStr : String; const aPrecision : Byte) : String;
const
BaseIn = 10;
BaseOut = 2;
var
i, PosDot : Integer;
StrRes, vStr, StrSign, StrDot : String;
Num, TmpNum, Weight : Extended;
begin
DecToBin := '';
if aStr = '' then Exit;
(*Перевод десятичной записи в число.*)
(*Определяем знак и десятичную запись числа без знака.*)
if aStr[1] = '-' then begin
StrSign := '-';
vStr := Copy(aStr, 2, Length(aStr) - 1);
end else begin
StrSign := '';
vStr := aStr;
end;
(*Ищем дробную точку.*)
PosDot := Length(vStr) + 1;
for i := 1 to Length(vStr) do begin
if vStr[i] in ['.', ','] then begin
PosDot := i;
StrDot := vStr[i];
Break;
end;
end;
Num := 0;
(*Переводим в число запись целой части.*)
(*Движемся от младших разрядов - к старшим.*)
(*Вес младшего разряда в целой части.*)
Weight := 1;
for i := PosDot - 1 downto 1 do begin
case vStr[i] of
'0' : Num := Num + 0 * Weight; (*Эту строку можно закоментовать.*)
'1' : Num := Num + 1 * Weight;
'2' : Num := Num + 2 * Weight;
'3' : Num := Num + 3 * Weight;
'4' : Num := Num + 4 * Weight;
'5' : Num := Num + 5 * Weight;
'6' : Num := Num + 6 * Weight;
'7' : Num := Num + 7 * Weight;
'8' : Num := Num + 8 * Weight;
'9' : Num := Num + 9 * Weight;
else
Writeln('Ошибка! Незарегистрированная цифра.');
end;
(*Вес следующего разряда.*)
Weight := Weight * BaseIn;
end;
(*Переводим в число запись дробной части.*)
(*Движемся от старших разрядов - к младшим.*)
(*Вес старшего разряда в дробной части.*)
Weight := 1 / BaseIn;
for i := PosDot + 1 to Length(vStr) do begin
case vStr[i] of
'0' : Num := Num + 0 * Weight; (*Эту строку можно закоментовать.*)
'1' : Num := Num + 1 * Weight;
'2' : Num := Num + 2 * Weight;
'3' : Num := Num + 3 * Weight;
'4' : Num := Num + 4 * Weight;
'5' : Num := Num + 5 * Weight;
'6' : Num := Num + 6 * Weight;
'7' : Num := Num + 7 * Weight;
'8' : Num := Num + 8 * Weight;
'9' : Num := Num + 9 * Weight;
else
Writeln('Ошибка! Незарегистрированная цифра.');
end;
(*Вес следующего разряда.*)
Weight := Weight / BaseIn;
end;
(*Переводим число в двоичную запись.*)
StrRes := '';
(*Перевод целой части.*)
TmpNum := Int(Num);
repeat
(*Определяем очередную двоичную цифру.*)
(*Аналог (TmpNum mod BaseOut) для случая вещественных операндов.*)
case Round( TmpNum - Int(TmpNum / BaseOut) * BaseOut ) of
0 : StrRes := '0' + StrRes;
1 : StrRes := '1' + StrRes;
end;
(*Удаляем из числа текущий разряд.*)
TmpNum := Int(TmpNum / BaseOut);
until TmpNum = 0;
(*Перевод дробной части с точностью до aPrecision знаков после запятой.*)
i := 0;
TmpNum := Frac(Num);
while (TmpNum <> 0) and (aPrecision > i) do begin
if i = 0 then StrRes := StrRes + StrDot;
(*Определяем очередную двоичную цифру.*)
TmpNum := TmpNum * BaseOut;
case Round(Int(TmpNum)) of
0 : StrRes := StrRes + '0';
1 : StrRes := StrRes + '1';
end;
(*Удаляем из числа текущий старший разряд.*)
TmpNum := Frac(TmpNum);
Inc(i);
end;
DecToBin := StrSign + StrRes;
end;
const
Precision = 10;
var
S : String;
begin
repeat
Writeln('Введите запись вещественного числа в десятичной системе счисления:');
Readln(S);
S := DecToBin(S, Precision);
Writeln('Запись этого же числа в двоичной системе счисления');
Writeln('с точностью до ', Precision, ' цифр после запятой:');
Writeln(S);
Writeln('Повторить - Enter, выход - любой символ + Enter.');
Readln(S);
until S <> '';
end. |
|
0
|