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

Ответ Создать новую тему
 
06.02.2011, 22:42   #1
SuPeR XaKer
Форумчанин
Регистрация: 23.09.2010
Сообщений: 4,886
Репутация: 2823 (1953)
Лучшие ответы: 13
Довольно частенько спрашивают перевод из одной СС в другую и поэтому я решил выложить исходник по переводу.Думаю кому нибудь да понадобится.Можно усовершенствовать но мне лень :
Код 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)
06.02.2011, 22:42
AdAgent
Объявления
21.04.2012, 22:17   #31
kverrian
Новичок
Регистрация: 12.03.2012
Сообщений: 5
Репутация: 0 (0)
а можно ли модернизировать вашу программу , чтобы точность определялась автоматически???
21.04.2012, 22:41   #32
pashtet1991
Новичок
Регистрация: 24.02.2010
Сообщений: 8
Репутация: 1 (1)
можно для определения точности использовать некую функцию, зависящую от исходной и искомой СС, но легче сделать фиксированную (излишнюю) точность, т.к для перевода одного разряда после запятой из 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-дробная часть числа
Другие темы раздела
Pascal Книга для Сложно соображающих
Подскажите Книгу для Сложно соображающих по Паскалю..Так чтобы было написанно максимально просто!Помогите!
Pascal Корабли пустыни, ну никак не врублюсь.
Всем привет. Дали задачки, все остальные решил, а в эту ну ни как не врублюсь! Причем даже есть решение, но никак не могу понять смысл ее работы. В общем, вот само условие: Во время одного из своих путешествий Вася был в Египте. Ему надо было пересечь пустыню. Сделать это не трудно, так как...
21.04.2012, 23:12   #33
kverrian
Новичок
Регистрация: 12.03.2012
Сообщений: 5
Репутация: 0 (0)
Цитата Сообщение от 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
21.04.2012, 23:43   #34
pashtet1991
Новичок
Регистрация: 24.02.2010
Сообщений: 8
Репутация: 1 (1)
ну во-первых, мой листинг программы так и работает, могу выслать в ближайшие пару дней на e-mail, а во-вторых перевод туда-обратно не может так сильно отличаться!
21.04.2012, 23:43
AdAgent
Объявления
22.04.2012, 12:28   #35
kverrian
Новичок
Регистрация: 12.03.2012
Сообщений: 5
Репутация: 0 (0)
не могли ли вы посмотреть мою программу и подсказать как написать эту функцию ...
программа перевода из одной системы счисления в другую
30.05.2012, 22:32   #36
ArtiDelion
Гость
Сообщений: n/a
Добрый день уважаемые форумчане. Только начал изучать Паскаль. Помогите плиз новичку. Мне нужно написать 2 небольшие программки, одна чтобы переводила числа из 19-тиричной сс в 10-тичную, а вторая наоборот из десятичной в 19-тиричную. Пытался всячески переделать и подстроить для этого дела шаблон из первого поста, но у меня получилась какая-то ересь. Если нетрудно, покажите как они должны выглядеть, с пояснениям в фигурных скобках, что какие переменные значат и основные процессы, хотелось бы не просто сдать готовые работы, но и самому разобраться. Заранее благодарю.
31.05.2012, 09:04   #37
Puporev
Модератор
Регистрация: 18.05.2008
Сообщений: 64,934
Репутация: 42014 (30534)
Лучшие ответы: 1,722
Код 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.
31.05.2012, 11:05   #38
wasex
Новичок
Регистрация: 31.05.2012
Сообщений: 3
Репутация: 0 (0)
Онлан калькулятор для перевода чисел в разные системы счисления Тут можно проверить результаты
http://векторное-управление.рф/perevod-chisel.html
25.09.2013, 15:22   #39
Newchap
Форумчанин
Регистрация: 17.09.2013
Сообщений: 139
Репутация: 2 (2)
Добрый день, был бы очень признателен, если бы вы выложили программу, которая переводит целые числа из системы в систему(из любой в любую). Голову сломал уже себе, а то, что в данной теме и на форуме есть не подходит.
Надеюсь, что за некропостинг не покарают.
25.09.2013, 15:34   #40
Puporev
Модератор
Регистрация: 18.05.2008
Сообщений: 64,934
Репутация: 42014 (30534)
Лучшие ответы: 1,722
Для 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.
25.09.2013, 15:34
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
VBA Перевод числа в различные системы счисления
Перевести число 132,728 из десятеричной системы счисления в: двоичную, восьмеричную и шестнадцатеричную системы счисления я не прошу решать , объясните пожалуйста правильно ли я понял число 132,728 из 10 перевел я в двоичную , затем мне из двоичной системы надо в восьмеричную переводить??...
VBA ди1234 01.12.2013 10:00
C# WinForms Перевод величин в различные системы счисления
Надо написать данную про грамма в видноус форма.Прошу помочь чтобы дать начало.текст бокс в него вписываем несколько троичных чисел ,кнопка,при нажатии переводит данное число в десятичную систему ост сам надеюсь сделаю....просто пока недолго яю как начать.... Добавлено через 37 секунд Да и...
C# Windows Forms red0168 29.11.2012 15:29
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 byte; Begin clrscr; write('Vvedite chislo v SS 10= '); readln(n);
PascalABC.NET Wilhelm_Art 21.10.2012 12:37
Delphi Перевод чисел в различные системы счисления
Написать программу, позволяющую переводить числа в двоичный, восьмеричный, десятиричный и шестнадцатиричный код(систему счисления) и обратно.
Delphi для начинающих Dilara 11.10.2012 00:28
Basic Перевод чисел в различные системы счисления
Помогите решить задачки,пожалуйста!Задания отсканированны во вложении!Зарание спасибо))
Basic Cimakov 06.04.2012 15:32
Опции темы

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

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