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

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

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

> Процедуры и функции, Помогите полажуйста!!!
-Наташа-
сообщение 13.05.2008 20:26
Сообщение #1


Гость






Разработаите функцию, которая находит НОД двух целых чисел. Разработайте процедуру, вычисляющую сумму двух обыкновенных дробей. Напишите программу, которая находит сумму n заданных обыкновенных дробей.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 14.05.2008 11:33
Сообщение #2


Гость






Вот еще вариант, с обработкой элементарных ошибок:
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 div_ratio(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
div_ratio(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;

div_ratio(res);
end;

var
curr: ratio;
const
{ Изначально результат = 0, т.е. 0/1 }
res: ratio = (num:0; denom:1);

begin
writeln('Дроби (0 в числителе для окончания подсчета)');
repeat
write('Числитель: '); readln(curr.num);
if curr.num <> 0 then begin
write('Знаменатель: '); readln(curr.denom);
if curr.denom = 0 then
repeat
writeln('Деление на 0 недопустимо!');
write('Знаменатель: '); readln(curr.denom);
until curr.denom <> 0;

add_ratio(res, curr);
end;
until curr.num = 0;

writeln('Результат = ', res.num, '/', res.denom);
end.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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