Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
НастяYY
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 3
1

Задача на Бесконечную Р-ичную периодическую дробь

13.01.2013, 13:38. Просмотров 909. Ответов 0
Метки нет (Все метки)

Задание: Бесконечную Р-ичную периодическую дробь (1<Р<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
144
145
146
147
148
149
150
151
152
153
154
uses
  CRT;
 
const
  a: string[36] = '012345678'; {задаём строку для поиска в ней символов}
var
  n,rezylt: real;
  znamen, rezchislit,rezchislit2,s, s1, s2, s3, s4, s5, s6, s7, ocnovsistemst, promegrez: string;
  t, ind, cc2, k, neperiod, period, chislitel, Rchislitel, ohib, kolsimvolperiod, ocnovsistem, i, kolsimvolperiod2,znamen2, hisl2,hisl3,hisl: 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;
 
 
{функция для проверки может ли быть это число в заданной системе счисления}
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;
 
 
begin
  ClrScr; {очистка экрана после каждого запуска}
     repeat
    write('Введите основание системы счисления из которой будем переводить правильную бесконечную периодическую дробь:');
    readln(s7);   {выводим основание системы в символьном виде}
    val(s7,cc2,ohib); {основание системы из символьного вида переводим в числовой}
    while ((cc2<=1) or (cc2>=10)) do    {Цикл повторяется до тех пор, пока пользователь не введет основание СС от 2 до 9}
  begin
    write('Основание системы задано неверно, введите основание системы счисления из которой будем переводить правильную бесконечную периодическую дробь:');
   readln(s7);   {выводим основание системы в символьном виде}
   val(s7,cc2,ohib); {основание системы из символьного вида переводим в числовой}
  end;
 
  until (cc2 in [2..8]); {проверка ввода}
  repeat
  write('Введите Непериодическую часть дроби:');
  readln(s); {выводим непериодическую часть дроби в символьном виде}
  write('Введите Периодическую часть дроби:');
  readln(s1); {выводим периодическую часть дроби в символьном виде}
 
  s4:=s+s1;   {складываем периодическую и непериодическую части}
 
  Del(s4); {разбиваем на дробную и целую части строку}
  if not prov(cc2,s2) or not prov(cc2,s3) then {если дробная или целая части заданы не верно (т.е. true) то выводим сообщение}
    write('Некорректное число.Повторите ввод.')
  until prov(cc2,s2) and prov(cc2,s3); {проверка на соответствие числа заданной СС}
  ClrScr;    {Очищаем экран}
  writeln('Вы ввели правильную бесконечную периодическую дробь 0.',s,'(',s1,') в c/c=',cc2); { THE END }
 
 
rezchislit:= Cel(ToDec(s4, cc2), 10); {Перевод в 10 СС Непериодической части+Периодическая часть}
rezchislit2:= Cel(ToDec(s, cc2), 10); {Перевод в 10 СС Непериодической части}
 
val(rezchislit,hisl,ohib);   {Непериодическая части+Периодическая часть в 10 СС-переводим в число}
val(rezchislit2,hisl2,ohib);   {Непериодическая часть в 10 СС-переводим в число}
hisl3:=hisl-hisl2;     {(Непериодическая части+Периодическая часть d 10 CC)-(Непериодическая часть d 10 CC)=числитель}
  writeln('числитель:',hisl3);
 
 
 
  kolsimvolperiod:=Length(s1);  {Считаем количество символов в периодической части}
  ocnovsistem:=cc2-1;  {задаем значение=(основание СС)-1}
  str(ocnovsistem,ocnovsistemst); {переводим значение в строку}
  for i:=1 to kolsimvolperiod do  {от 1 до количество символов в периодической части}
  begin
  promegrez:=promegrez+ocnovsistemst;   {повторяем значение ((основание СС)-1) столько раз, сколько символов в периодической части}
   end;
 
   kolsimvolperiod2:=Length(s); {Считаем количество символов в непериодической части}
 
  for i:=1 to kolsimvolperiod2 do
  begin
  promegrez:=promegrez+'0';  {записываем столько нулей, сколько символов в непериодической части}
        end;
 
  znamen:= Cel(ToDec(promegrez, cc2), 10); {переводим знаменатель в 10 СС}
 
  val(znamen,znamen2,ohib);        {знаменатель из строки переводим в число}
   writeln('знаменатель:',znamen2);
 
    rezylt:=hisl3/znamen2;         {числитель делим на знаменатель}
 
   writeln('Бесконечная периодическая дробь в 10 системе счисления:=',rezylt); { THE END }
 
 
  readkey
end.

Проблема в строке:

rezchislit:= Cel(ToDec(s4, cc2), 10); {Перевод в 10 СС Непериодической части+Периодическая часть}

подскажите, почему не переводит s4 в 10 сс? (не работает с 2 сс)

Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 13:38
Ответы с готовыми решениями:

Умножить дробь на дробь и получить ответ в виде несократимой дроби
Даны две дроби A/B и C/D (где А, В, С, D — натуральные числа). Умножить дробь на дробь и получить...

Перевод из десятичной системы счисления в 2-ичную
Реализовать в виде модуля набор подпрограмм для выполне¬ния сле-дующих операций над натуральными...

Вывести на консоль бесконечную периодическую дробь с указанием периода
Дана дробь. Например a - числитель, b - знаменатель. Как можно реализовать метод, возвращающий...

Как определить бесконечную дробь?
Доброго всем времени суток) Есть цикл for он выводит числа например: 4.50000000000000E-0001...

Задача на бесконечную сумму
Доброго времени суток. Ув. форумчане, помогите :) Вычислить и вывести на экран значение функции...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 13:38

Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)?
Я только начанаю знакомство с C++. В классе реализовать следующие методы: конструкторы (по...

Рациональную дробь перевести в цепную дробь
procedure Express; var a,b,t: integer; q: char; begin repeat writeln ('введите числитель=');...

Описать периодическую функциию
помогите, пожалуйста, описать функцию сама программа есть, нужно только описание функции....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru