Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
SuPeR XaKer
Форумчанин
2824 / 1954 / 13
Регистрация: 23.09.2010
Сообщений: 4,886
06.02.2011, 22:42     Перевод в различные системы счисления
  #1
Довольно частенько спрашивают перевод из одной СС в другую и поэтому я решил выложить исходник по переводу.Думаю кому нибудь да понадобится.Можно усовершенствовать но мне лень :
Код 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.
Лучшие ответы (1)
AdAgent
Объявления
06.02.2011, 22:42
ВДВ
Форумчанин
3 / 3 / 0
Регистрация: 02.04.2010
Сообщений: 52
09.12.2011, 16:34     Перевод в различные системы счисления
  #21
а есть програмка чтоб из 2 сс в 16
romanov95
Новичок
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 16
17.01.2012, 22:02
  #22
SuPeR XaKer, К сожалению ваша программа не переводит из 16 СС в 10 СС если есть буквы, например она выдаст ошибку если пробывать перевести DNF
Puporev
Модератор
42219 / 30733 / 1797
Регистрация: 18.05.2008
Сообщений: 65,426
18.01.2012, 07:15
  #23
Цитата Сообщение от romanov95 Посмотреть сообщение
если пробывать перевести DNF
А N это тоже по твоему цифра из СС 16? Делай проверку ввода цифр, или тебе и сопли вытереть?
romanov95
Новичок
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 16
22.01.2012, 11:07
  #24
Цитата Сообщение от Puporev Посмотреть сообщение
А N это тоже по твоему цифра из СС 16? Делай проверку ввода цифр, или тебе и сопли вытереть?
Я ошибся написал вместо "B" , N;
Ошибка именно вот здесь

136 repeat
137 write('ввод числа в ', cc2, '-й СС: ');
138 readln(n);

n типа real, а если мы вводим число в 16 СС, то будет вылетать ошибка.
что бы программа корректно работала должно быть написано так

Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
repeat
   write('ввод числа в ', cc2, '-й СС: ');
   if cc2<=10 then
   begin
   readln(n);
   str(n,s); {переводим в строку}
   end
   else readln(s); 
 
или так 
repeat
   write('ввод числа в ', cc2, '-й СС: ');
   readln(s);
{str(n,s); писать не нужно}
SuPeR XaKer
Форумчанин
2824 / 1954 / 13
Регистрация: 23.09.2010
Сообщений: 4,886
22.01.2012, 11:13  [ТС]
  #25
romanov95, да видимо когда первый код переписывал ошибся. ну не всё же разжёвывать за вас. Хорошо хоть str вставить догадались.
zig111
Новичок
0 / 0 / 0
Регистрация: 01.02.2012
Сообщений: 9
01.02.2012, 16:43
  #26
Подскажите, а можно ли как нибудь преобразовать сразу из 16ss в 2-3-4-5 и тд ss , без перевода в десятичную?
pashtet1991
Новичок
1 / 1 / 0
Регистрация: 24.02.2010
Сообщений: 8
10.02.2012, 23:32
  #27
абсолютно также, т.е делением для целой части и умножением для дробной, но выполнять это надо в 16СС, что не очень удобно. Алгоритм перевода чисел между СС универсален.
sacreden
Новичок
1 / 1 / 0
Регистрация: 24.02.2012
Сообщений: 26
26.02.2012, 14:38
  #28
Блин никак не получаетсЯ переделать для перевода целого p-ричного числа в десятичное
Помогите плиз
pashtet1991
Новичок
1 / 1 / 0
Регистрация: 24.02.2010
Сообщений: 8
26.02.2012, 14:50
  #29
Используй функцию ToDec. В качестве параметров функции задается число-строка и основание СС. Необходимо также написать функцию для проверки входных данных, т.е если в строке есть . или , то вывести сообщение, что число неверно и повторить ввод строки.
Puporev
Модератор
42219 / 30733 / 1797
Регистрация: 18.05.2008
Сообщений: 65,426
26.02.2012, 14:54
  #30
Код 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
uses crt;
const digit:string[16]='0123456789ABCDEF';
{фунция перевода  сс 2-16 в 10}
function ToDec(n:string;r:byte):longint;
var m,i:longint;
begin
m:=0;
while n[1]='0' do
delete(n,1,1);
for i:=1 to length(n) do
m:=m*r+pos(n[i],digit)-1;
ToDec:=m;
end;
procedure Vvod(var c:string;var osn:byte;s:char);
var i,k:byte;
    m:set of char;
begin
repeat
write('В какой СС число ',s,'? от 2 до 16 osn=');
readln(osn);
until osn in [2..16];
m:=[];
for i:=1 to osn do
m:=m+[digit[i]];
repeat
k:=0;
writeln('Введите число ',s,' в СС ',osn);
readln(c);
for i:=1 to length(c) do
if not (c[i] in m) then k:=1;
if k=1 then writeln('Число введено неверно, повторите ввод.');
until k=0;
end;
var x:string;
    x1:longint;
    osn:byte;
begin
clrscr;
Vvod(x,osn,'X');
x1:=ToDec(x,osn);
writeln('Число ',x,' в СС 10=',x1);
readln
end.
kverrian
Новичок
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 5
21.04.2012, 22:17
  #31
а можно ли модернизировать вашу программу , чтобы точность определялась автоматически???
pashtet1991
Новичок
1 / 1 / 0
Регистрация: 24.02.2010
Сообщений: 8
21.04.2012, 22:41
  #32
можно для определения точности использовать некую функцию, зависящую от исходной и искомой СС, но легче сделать фиксированную (излишнюю) точность, т.к для перевода одного разряда после запятой из 16СС в 2СС нужно 4 знака, для 5СС-2СС=3 знака и для 8СС-2СС тоже 3 знака, а для 2СС-16СС 1/4 знака т.е зависимость нелинейная, лучше взять избыточную константу (например 5 или 6), но возможно переполнение разрядной сетки, надо проверять, писал по теории.

Добавлено через 10 минут
например использовать цикл if ss1>ss2 then i:=5*length(s) else i:=lenght(s) где СС1-исходная СС2-искомая i-точность, s-дробная часть числа
kverrian
Новичок
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 5
21.04.2012, 23:12
  #33
Цитата Сообщение от pashtet1991 Посмотреть сообщение
можно для определения точности использовать некую функцию, зависящую от исходной и искомой СС, но легче сделать фиксированную (излишнюю) точность, т.к для перевода одного разряда после запятой из 16СС в 2СС нужно 4 знака, для 5СС-2СС=3 знака и для 8СС-2СС тоже 3 знака, а для 2СС-16СС 1/4 знака т.е зависимость нелинейная, лучше взять избыточную константу (например 5 или 6), но возможно переполнение разрядной сетки, надо проверять, писал по теории.

Добавлено через 10 минут
например использовать цикл if ss1>ss2 then i:=5*length(s) else i:=lenght(s) где СС1-исходная СС2-искомая i-точность, s-дробная часть числа
Я протестил....почти ничего не изменилось : при вводе AA.37 в 16 выводит 170.21 а обратно AA.35
pashtet1991
Новичок
1 / 1 / 0
Регистрация: 24.02.2010
Сообщений: 8
21.04.2012, 23:43
  #34
ну во-первых, мой листинг программы так и работает, могу выслать в ближайшие пару дней на e-mail, а во-вторых перевод туда-обратно не может так сильно отличаться!
kverrian
Новичок
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 5
22.04.2012, 12:28
  #35
не могли ли вы посмотреть мою программу и подсказать как написать эту функцию ...
программа перевода из одной системы счисления в другую
ArtiDelion
Гость
Сообщений: n/a
30.05.2012, 22:32
  #36
Добрый день уважаемые форумчане. Только начал изучать Паскаль. Помогите плиз новичку. Мне нужно написать 2 небольшие программки, одна чтобы переводила числа из 19-тиричной сс в 10-тичную, а вторая наоборот из десятичной в 19-тиричную. Пытался всячески переделать и подстроить для этого дела шаблон из первого поста, но у меня получилась какая-то ересь. Если нетрудно, покажите как они должны выглядеть, с пояснениям в фигурных скобках, что какие переменные значат и основные процессы, хотелось бы не просто сдать готовые работы, но и самому разобраться. Заранее благодарю.
Puporev
Модератор
42219 / 30733 / 1797
Регистрация: 18.05.2008
Сообщений: 65,426
31.05.2012, 09:04
  #37
Код 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
{перевод из 19->10}
uses crt;
const digit:string[19]='0123456789ABCDEFGHI'; //цифры в СС 19
var s:string;//строка, число в СС 19
    n:integer;//число в СС 10
    i:integer;//счетчик
    c:char;//переменная для ввода символов
begin
writeln('Введите число в СС 19, окончание ввода Enter');
s:='';
repeat
c:=readkey;
if c in ['a'..'i'] then c:=UpCase(c);
if c in ['0'..'9','A'..'I'] then
 begin
  write(c);
  s:=s+c;
 end;
if c=#13 then writeln;
until c=#13;
n:=0;//пока число=0
while s[1]='0' do delete(s,1,1);//удалим ведущие ноли если они есть
for i:=1 to length(s) do//идем по строке
n:=n*19+pos(s[i],digit)-1;//умножаем уже имеющееся число на 19
                          //и прибавляем номер символа в digits-1(поскольку 0 имеет номер 1)
write('Число в СС 10=',n);
end.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{перевод из 10->19}
uses crt;
const digit:string[19]='0123456789ABCDEFGHI'; ////цифры в СС 19
var n:integer;//число в СС 10
    s:string;//строка=число в СС 19
begin
write('Число в СС 10=');
readln(n);
s:='';//пока пустая
repeat
s:=digit[(n mod 19)+1]+s;//берем остаток от деления числа на 19
                         //добавляем 1 и берем цифру с этим номером из digits
                         //дописываем ее в начало строки
n:=n div 19;//сокращаем число в 19 раз
until n=0;//пока число не 0
write('Число в СС 19=',s);
end.
wasex
Новичок
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 3
31.05.2012, 11:05
  #38
Онлан калькулятор для перевода чисел в разные системы счисления Тут можно проверить результаты
Newchap
Форумчанин
3 / 3 / 0
Регистрация: 17.09.2013
Сообщений: 141
25.09.2013, 15:22
  #39
Добрый день, был бы очень признателен, если бы вы выложили программу, которая переводит целые числа из системы в систему(из любой в любую). Голову сломал уже себе, а то, что в данной теме и на форуме есть не подходит.
Надеюсь, что за некропостинг не покарают.
Puporev
Модератор
42219 / 30733 / 1797
Регистрация: 18.05.2008
Сообщений: 65,426
25.09.2013, 15:34     Перевод в различные системы счисления
  #40
Для 2-16, нужно больше, увеличьте размер массива цифр.
Код 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
uses
  crt;
var
  cs1,cs2,res,change:integer;
  TD:string;
{функция перевода Dec числа в любую сс}
function FromDec(n,r:longint):string;
var
  s:String;
const
  digit:string[16]='0123456789ABCDEF';
begin
  s:='';
  repeat
    s:=digit[(n mod r)+1]+s;
    n:=n div r;
  until n=0;
    FromDec:=s;
end;
{фунция перевода любой сс в Dec}
function ToDec(n:string;r:longint):longint;
var
  m,i:longint;
const
  digit:string[16]='0123456789ABCDEF';
begin
  m:=0;
  while n[1]='0' do
    delete(n,1,1);
  for i:=1 to length(n) do
    m:=m*r+pos(n[i],digit)-1;
  ToDec:=m;
end;
{осоновная программы}
begin
  clrscr;
  writeln('Введите из какой сс');
  readln(cs1);
  writeln('Введите число в соответствии с сс');
  readln(TD);
  writeln('Введите в какую сс');
  readln(cs2);
  writeln(FromDec(ToDec(TD,cs1),cs2));
readln
end.
Yandex
Объявления
25.09.2013, 15:34
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Pascal Можно ли перевести этот код с С++ на Pascal (перевод чисел в различные системы счисления)?
Вот задание: программа переводит два заданных числа из десятичной системы счисления в двоичную, поразрядно суммирует их, и переводит обратно в десятичную систему счисления при этом выводя все...
Pascal (Паскаль) lixod96 28.04.2014 16:20
VBA Перевод числа в различные системы счисления
Перевести число 132,728 из десятеричной системы счисления в: двоичную, восьмеричную и шестнадцатеричную системы счисления я не прошу решать , объясните пожалуйста правильно ли я понял число...
VBA ди1234 01.12.2013 10:00
PascalABC.NET перевод числа из любой системы счисления в десятичную систему счисления
дано число типа integer, записанное в любой другой системе счисления. перевести это число в 10сс. Очень нужна помощь!!
PascalABC.NET stella1 05.12.2012 18:25
Lazarus Перевод чисел в различные системы счисления
Написать программу в lazarus: перевод чисел в различные системы счисления. Создать форму на ней разместить Edit и переключатели.
Lazarus Елена Сорокина 20.11.2012 19:07
PascalABC.NET перевод числа в различные системы счисления
Uses crt; const a:array of char= //массив цифр в новой СС от 2 до 16 ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); var uk, n, m, i: integer; rez:string; b:array of...
PascalABC.NET Wilhelm_Art 21.10.2012 12:37
Basic Перевод чисел в различные системы счисления
Помогите решить задачки,пожалуйста!Задания отсканированны во вложении!Зарание спасибо))
Basic Cimakov 06.04.2012 15:32
Turbo Pascal перевод чисел из 16тиричной системы счисления в 10тиричную систему счисления
Господа, всем доброго времени суток! Прошу вашей помощи в составлении программы на Turbo Pascal для перевода чисел из 16тиричной системы счисления в 10тиричную систему счисления! Я сам знаю только...
Turbo Pascal Виталюга 04.04.2010 21:00
Turbo Pascal Системы счисления. Перевод из одной системы счисления в другую.
Задание: Написать программу на языке С++ или Turbo Pascal для переведа числа, представленного в системе счисления с основанием S, в системы счисления с основаниями P, Q, R. Обеспечить корректность...
Turbo Pascal ket01 14.01.2010 09:19
Опции темы

Текущее время: 17:59. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.