Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
1 / 1 / 1
Регистрация: 28.05.2015
Сообщений: 10
1

Калькулятор в различных системах счисления

28.05.2015, 12:22. Показов 6652. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать программу, которая будет проводить арифметические операции в различных системах счисления.
Алгоритм таков: переводим первое число в 10СС, переводим второе число в 10СС, далее проводим операции в 10СС, и результат представляем в любой СС на усмотрение пользователя. С целыми числами это не сложно реализовать. Но надо что бы с дробными тоже работало. Думаю, что за основу следует взять вот этот замечательный код.
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.
Заранее благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 12:22
Ответы с готовыми решениями:

Реализовать арифметические операции в различных системах счисления
uses CRT; const a: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {задаём строку для...

Написать калькулятор, работающий с числами в двоичной и шестнадцатеричной системах счисления
Помогите пожалуйста написать программу калькулятор, позволяющего складывать, вычитать и умножать ...

Программа-арифмометр, которая складывает, вычитает, умножает, делит в различных системах счисления
Написать программу - арифмометр которая складывает, вычитает, умножает, делит в различных системах...

Калькулятор на паскале с использованием различных систем счисления
1) Выборка: исходная сист. счисл. 2&lt;n&lt;16 , а выходные данные 2&lt;m&lt;16 2) Задаем числа в сист....

10
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.05.2015, 12:56 2
Цитата Сообщение от Wlazly Посмотреть сообщение
Думаю, что за основу следует взять вот этот замечательный код.
Ну так возьми, для того он и написан.
0
1 / 1 / 1
Регистрация: 28.05.2015
Сообщений: 10
28.05.2015, 14:56  [ТС] 3
Я уже ближе к решению, но возникла одна проблема. 2 функции возвращают строковые значения, а две других типа real. Я знаю как можно преобразовать целое число в строку, но не знаю как реализовать преобразование десятичной дроби в строку.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.05.2015, 16:24 4
Цитата Сообщение от Wlazly Посмотреть сообщение
2 функции возвращают строковые значения,
Это когда переводим из 10 в другие.
Цитата Сообщение от Wlazly Посмотреть сообщение
а две других типа real.
А это когда переводим в СС 10.
И чем они мешают друг другу и нафига
Цитата Сообщение от Wlazly Посмотреть сообщение
реобразовать целое число в строку, но не знаю как реализовать преобразование десятичной дроби в строку.
0
1 / 1 / 1
Регистрация: 28.05.2015
Сообщений: 10
10.06.2015, 22:07  [ТС] 5
Калькулятор работает, но только с положительными числами. Нужны идеи с реализацией работы для отрицательных чисел. Вот код.
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
uses
  CRT;
label m;
 
const
  a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 
var
  n, r, final: real;
  p, ch1, ch2, rez, s, s2, s3, res: string;
   t, toch , cc, ind, cc2, k, rezult : 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;
 
 
//==============================================================================
//==============================================================================
//==============================================================================
 
function process(): string;
begin
  repeat
    write('Введите сиситемму счисления числа: ');
    readln(cc2)
  until cc2 in [2..36]; {проверка ввода}
  cc := 10;
  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;
  process := rez;
  
end;
 
 
 
begin
  Writeln('Ввод первого числа');
  ch1 := process;
  Writeln('Ввод второго числа');
  ch2 := process;
  Writeln('Введите операцию над числами');
  readln(p);
  if p = '+' then final := StrToInt(ch1) + StrToInt(ch2)
  else
  if p = '-' then final := StrToInt(ch1) - StrToInt(ch2)
  else
  if p = '*' then final := StrToInt(ch1) * StrToInt(ch2)
  else
  if p = '/' then final := StrToInt(ch1) div StrToInt(ch2);
  clrscr;
  Writeln(ch1);
  Writeln(p);
  Writeln(ch2);
  Writeln('________');
  Writeln('Результат в 10СС');
  Writeln(final);
  Writeln('В какой СС хотите получить результат ?');
  Readln(rezult);
  if rezult=10 then goto m
  else
  Begin
  Write('Введите точность: ');
    Readln(toch);
    if ((final - round(int(final))) = 0) then {если дробная часть числа=0 то юзаем Cel}
      res := Cel(final, rezult)
    else {иначе юзаем обе и добавляем , между дробной и целой}
      res := Cel(final, rezult) + ',' + Drob(final, toch, rezult);
  Writeln(res);
  End;
  m: Readln;
end.
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 99
29.10.2015, 12:49 6
А какие идентификаторы нужно указать в function process(): string; ? программа не работает без этого
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.10.2015, 12:52 7
просто уберите скобки после process
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 99
29.10.2015, 13:03 8
А для вещественных она не работает?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.10.2015, 13:04 9
Так запустите и проверьте раз читать не умеете.
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 99
29.10.2015, 13:08 10
В том то и дело,что по коду она должна работать и с дробными,но на деле нет
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.10.2015, 13:43 11
Это к автору или пишите сами.
0
29.10.2015, 13:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2015, 13:43
Помогаю со студенческими работами здесь

Задача о системах счисления
Дано число Х(1 ≤ X ≤ 10^12) в десятичной системе счисления Вывести систему счисления с...

Калькулятор в различных системах счисления
Хелп! Срочно нужна прога на С++ которая сможет переводить числа с 2 и 16 систем счисления и...

Сгенерировать калькулятор целых и вещественных чисел в различных системах счисления
сгенерировать в C# калькулятор целых и вещественных чисел в различных системах счисления

Операции в различных системах счисления
Программа должна выполнять арифметические операции в различных системах счисления. Основание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru