Форум программистов и сисадминов CyberForum.ru
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум Форум программистов > Форум Pascal (Паскаль)
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Старый 06.02.2011, 22:42   #1
SuPeR XaKer
Форумчанин
 
Аватар для SuPeR XaKer
 
Регистрация: 23.09.2010
Сообщений: 4,853
Репутация: 2812 (1942)
Лучшие ответы: 11
Системы счисления / Pascal (Паскаль)

Довольно частенько спрашивают перевод из одной СС в другую и поэтому я решил выложить исходник по переводу.Думаю кому нибудь да понадобится.Можно усовершенствовать но мне лень :
Код 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)
Старый 21.04.2012, 22:17   #31
kverrian
Новичок
 
Регистрация: 12.03.2012
Сообщений: 5
Репутация: 0 (0)
Системы счисления / Pascal (Паскаль)

а можно ли модернизировать вашу программу , чтобы точность определялась автоматически???
Старый 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 (Паскаль). Помощь студентам и школьникам в решении задач.
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
Google
Объявления
Старый 22.04.2012, 12:28   #35
kverrian
Новичок
 
Регистрация: 12.03.2012
Сообщений: 5
Репутация: 0 (0)
Системы счисления

не могли ли вы посмотреть мою программу и подсказать как написать эту функцию ...
программа перевода из одной системы счисления в другую
Старый 30.05.2012, 22:32   #36
ArtiDelion
Новичок
 
Регистрация: 30.05.2012
Сообщений: 1
Репутация: 0 (0)
Системы счисления

Добрый день уважаемые форумчане. Только начал изучать Паскаль. Помогите плиз новичку. Мне нужно написать 2 небольшие программки, одна чтобы переводила числа из 19-тиричной сс в 10-тичную, а вторая наоборот из десятичной в 19-тиричную. Пытался всячески переделать и подстроить для этого дела шаблон из первого поста, но у меня получилась какая-то ересь. Если нетрудно, покажите как они должны выглядеть, с пояснениям в фигурных скобках, что какие переменные значат и основные процессы, хотелось бы не просто сдать готовые работы, но и самому разобраться. Заранее благодарю.
Старый 31.05.2012, 09:04   #37
Puporev
Модератор
 
Аватар для Puporev
 
Регистрация: 18.05.2008
Сообщений: 62,270
Репутация: 40942 (29489)
Лучшие ответы: 1171
Системы счисления

Код 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
Сообщений: 105
Репутация: 0 (0)
Системы счисления

Добрый день, был бы очень признателен, если бы вы выложили программу, которая переводит целые числа из системы в систему(из любой в любую). Голову сломал уже себе, а то, что в данной теме и на форуме есть не подходит.
Надеюсь, что за некропостинг не покарают.
Старый 25.09.2013, 15:34   #40
Puporev
Модератор
 
Аватар для Puporev
 
Регистрация: 18.05.2008
Сообщений: 62,270
Репутация: 40942 (29489)
Лучшие ответы: 1171
Системы счисления / Pascal (Паскаль)

Для 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
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Автор
С++ для начинающих Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг кто-нибудь откликнется. Я не очень соображаю в с++, да и вообще в информатике, но зачет очень нужен. А времени сидеть и учить язык нет. Ребенок, учеба, работа. Поэтому если у кого-нибудь будет время и...
Lineta
Turbo Pascal Системы счисления. Перевести данное натуральное число в 16-тиричную систему счисления
Составить программу перевода данного натурального числа n в 16теричную систему счисления. ПОЖАЛУЙСТА НУЖНА ПРОГРАММА. ЗАРАНЕЕ СПАСИБО!!!
gayazik
С++ для начинающих Простейший алгоритм перевода числа из 10 системы счисления в 16 ричную систему счисления
Помогите написать самый простой алгоритм перевода из 10 системы счисления в 16 ричную систему счисления! Мне нужен именно самый простенький алгоритм без указателей и.т.д! Зачет на носу и надо показать этот алгоритм,а я просто незнаю как его сделать! Помогите!
Diz87
Дискретная математика Перевести данное число из десятичной системы счисления в двоичную, восьмеричную и шестнадцатеричную системы счисления
1. Перевести данное число из десятичной системы счисления в двоичную, восьмеричную и шестнадцатеричную системы счисления. 2. Перевести данное число в десятичную систему счисления. 3. Сложить числа. 4. Выполнить вычитание. 5. Выполнить умножение. Примечание. В заданиях 3–5 проверять...
MAZUR777
Turbo Pascal Системы счисления. Перевод из одной системы счисления в другую.
Задание: Написать программу на языке С++ или Turbo Pascal для переведа числа, представленного в системе счисления с основанием S, в системы счисления с основаниями P, Q, R. Обеспечить корректность ввода числа в системе счисления с основанием S. Перевод чисел реализовать с применением функций....
ket01
Опции темы

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

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