IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> С помощью процедуры привести дробь к несократимому виду
marwell
сообщение 4.01.2010 13:50
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


с помощью процедуры Socr привести дробь 1+1/2+1/3+1/4+1/5+...+1/20 к несократимому виду

var a_1,a_2,b_1,b_2,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := (a * b) div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end
else Writeln ('дробь несократима');
end;
begin
a_1:=1;
a_2:=1;
b_1:=1;
for b_2:=2 to 21 do
begin
a_1:=(NOK(b_1, b_2) div b_1)*a_1;
a_1:=a_1+((NOK(b_1, b_2) div b_2)*a_2);
b_1:=NOK(b_1, b_2);
end;
writeln (a_1,'/',b_1);
Socr(a_1,b_1,p,q);
Writeln (p,'/',q);
readln;
end.


посмотрите, please, правильно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
volvo
сообщение 4.01.2010 14:00
Сообщение #2


Гость






Цитата
посмотрите, please, правильно?
А ты программу запускал? Она ж вылетает у тебя с переполнением:
Exitcode = 215
Runtime error 215 at $004013F5
$004013F5 NOK, line 13 of F:/Programs/Pascal/__test.pas
$004014FE main, line 34 of F:/Programs/Pascal/__test.pas
$00407D10

 К началу страницы 
+ Ответить 
marwell
сообщение 4.01.2010 14:05
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 4.01.2010 14:00) *

А ты программу запускал? Она ж вылетает у тебя с переполнением:
Exitcode = 215
Runtime error 215 at $004013F5
$004013F5 NOK, line 13 of F:/Programs/Pascal/__test.pas
$004014FE main, line 34 of F:/Programs/Pascal/__test.pas
$00407D10



я ее на Delphi запускал(((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.01.2010 14:22
Сообщение #4


Гость






Какая разница, там должно было быть то же самое...
Я ж говорил тебе - найди процедуру сложения дробей, и используй. Вот здесь все, что нужно, кроме основной программы: Процедуры и функции

Основная программа выглядит так:
var
curr: ratio;
i: integer;
const
res: ratio = (num:0; denom:1);

begin
for i := 1 to 20 do
begin
curr.num := 1; curr.denom := i;
add_ratio(res, curr);
end;
writeln(res.num, '/', res.denom);
end.
Тем более, если у тебя Дельфи (тогда тему надо было создавать в "32-битных компиляторах", если консольное приложение, или в разделе "Дельфи" - если оконное) - которая может возвращать результат - запись, тогда можно сделать функции сложения/сокращения дробей, и все вообще запишется в одну строку...
 К началу страницы 
+ Ответить 
marwell
сообщение 4.01.2010 14:37
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 4.01.2010 14:22) *
Основная программа выглядит так:
а ratio это что? паскаль выдает ошибку unknown identifier
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.01.2010 14:43
Сообщение #6


Гость






А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? Ratio - это мой тип, я его там описывал...
 К началу страницы 
+ Ответить 
marwell
сообщение 4.01.2010 15:32
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(volvo @ 4.01.2010 14:43) *

А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? Ratio - это мой тип, я его там описывал...

function NOD(A, B: longint): integer;
begin
while (a <> 0) and (b <> 0) do
if a >= b then
a := a mod b
else
b := b mod a;
NOD := a + b;
end;

function NOK(A, B: longint): integer;
begin
NOK := a * b div NOD (a, b)
end;

type
ratio = record
num, denom: longint;
end;

{ Процедура сокращения дробей (заодно корректируем знак) }
procedure Socr(var res: ratio);
var the_nod: longint;
begin
repeat
the_nod := NOD(abs(res.num), abs(res.denom));
if the_nod > 1 then begin
res.num := res.num div the_nod;
res.denom := res.denom div the_nod;
end;
until the_nod = 1;

if res.denom < 0 then begin
res.num := res.num * (-1);
res.denom := abs(res.denom);
end;
end;

{ Сложение дробей }
procedure add_ratio(var res: ratio; curr: ratio);
var new_denom: longint;
begin
Socr(curr);

new_denom := NOK(res.denom, curr.denom);
res.num :=
res.num * (new_denom div res.denom) +
curr.num * (new_denom div curr.denom);
res.denom := new_denom;

Socr(res);
end;

var
curr: ratio;
i: integer;
const
res: ratio = (num:0; denom:1);

begin
for i := 1 to 20 do
begin
curr.num := 1; curr.denom := i;
add_ratio(res, curr);
end;
writeln(res.num, '/', res.denom);
readln;
end.

а так правильно? результат 6229/23780=0,2619428. Но ведь 1+1/2+1/3+1/4+...+1/20=3.59773966(примерно)

Сообщение отредактировано: marwell - 4.01.2010 16:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.01.2010 7:11
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(marwell @ 4.01.2010 15:32) *
а так правильно? результат 6229/23780=0,2619428. Но ведь 1+1/2+1/3+1/4+...+1/20=3.59773966(примерно)
Исправь тип функций с integer на LongInt.
И никогда не отключай range check до окончания отладки.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2010 10:28
Сообщение #9


Гость






Цитата
а так правильно? результат 6229/23780=0,2619428.
blink.gif То у тебя Дельфи, теперь ты переходишь на 16-битный Турбо-Паскаль... Ты уж для себя выбери что-то одно, а то знаешь ли, можно таких дел наворочать, рассчитывая на один компилятор, а используя другой...
 К началу страницы 
+ Ответить 
marwell
сообщение 5.01.2010 18:57
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(Lapp @ 5.01.2010 7:11) *

Исправь тип функций с integer на LongInt.
И никогда не отключай range check до окончания отладки.

спасибо большое

Добавлено через 3 мин.
Цитата(volvo @ 5.01.2010 10:28) *

blink.gif То у тебя Дельфи, теперь ты переходишь на 16-битный Турбо-Паскаль... Ты уж для себя выбери что-то одно, а то знаешь ли, можно таких дел наворочать, рассчитывая на один компилятор, а используя другой...

просто проходим мы паскаль, а мне привычнее на дельфи, на паскале я раньше почти не работал...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 0:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"