![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
marwell |
![]() ![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
с помощью процедуры 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, правильно? |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата посмотрите, please, правильно? А ты программу запускал? Она ж вылетает у тебя с переполнением:Exitcode = 215 |
marwell |
![]()
Сообщение
#3
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#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 |
![]()
Сообщение
#5
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? Ratio - это мой тип, я его там описывал...
|
marwell |
![]()
Сообщение
#7
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? 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 |
Lapp |
![]()
Сообщение
#8
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
а так правильно? результат 6229/23780=0,2619428. Но ведь 1+1/2+1/3+1/4+...+1/20=3.59773966(примерно) Исправь тип функций с integer на LongInt. И никогда не отключай range check до окончания отладки. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата а так правильно? результат 6229/23780=0,2619428. ![]() |
marwell |
![]()
Сообщение
#10
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
Исправь тип функций с integer на LongInt. И никогда не отключай range check до окончания отладки. спасибо большое Добавлено через 3 мин. ![]() просто проходим мы паскаль, а мне привычнее на дельфи, на паскале я раньше почти не работал... |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 0:04 |