uses crt;
type
Natur = 1..maxint;{натуральные числа типа longint}
Frac = record
p:Natur; {Числитель дроби}
q:Natur {Знаменатель дроби}
end;
mass=array[1..100] of Frac;{массив обыкновенных дробей}
{создание масива дробей}
procedure Vvod(var m:mass; var n:integer);
var i:integer;
begin
write('Введите размер массива - ');
readln(n);
writeln('Исходный массив:');
for i:=1 to n do
begin
m[i].p:=random(9)+1;{присваиваем значение числителю}
m[i].q:=random(9)+1;{тоже знаменателю}
write(m[i].p,'/',m[i].q,' ');{}
end;
writeln;
end;
{нахождение НОД - это нужно для нахождения НОК}
function Nod(a,b:integer):integer;
begin
while a<>b do{пока а не равно b }
if a>b then a:=a-b else b:=b-a;{вычитаем или второе из первого, либо наоборот}
Nod:=a{когда они равны, заканчиваем-это значение функции}
End;
{нахождение НОК}
function NOK(x,y:integer):integer;
Begin
NOK:=(x div NOD (x,y))*y;{наменьшее общее кратное=первое / на НОД и умноженное на второе}
end;
procedure ObshZn(var m:mass;n:integer);{}
var i,k,d:integer;
begin
k:=NOK(m[1].q,m[2].q);{НОК первого и второго в массиве}
for i:=3 to n do k:=NOK(k,m[i].q);{НОК всего массива}
for i:=1 to n do
begin
d:=k div m[i].q;{вычисляем на сколько домножить числитель и знаменатель}
m[i].p:=m[i].p*d;{домножаем}
m[i].q:=m[i].q*d;{домножаем}
end;
end;
{сравнение дробей по величине}
function Bolshe(a,b:Frac):boolean;
begin
Bolshe:=a.p>b.p{если числитель первой больше, то она больше(знаменатели равны)}
end;
{сортировка по возрастанию}
procedure Sort(var m:mass;n:integer);
var i,j:integer;
x:Frac;
begin
for i:=1 to n-1 do
for j:=i to n do
if Bolshe(m[i],m[j])then{если первое больше чем второе}
begin
x:=m[i];
m[i]:=m[j];{переставляем их местами}
m[j]:=x;
end;
end;
{вывод отсортированного массива дробей на экран}
procedure Vyvod(var m:mass;n:integer);
var i:integer;
begin
writeln('Отсортированный массив:');
for i:=1 to n do
write(m[i].p,'/',m[i].q,' ');
end;
var a:mass;
n:integer;
begin
clrscr;
randomize;
Vvod(a,n);{создаем массив}
ObshZn(a,n);{приводим к общему знаменателю}
Sort(a,n);{сортируем}
Vyvod(a,n);{выводим}
readln
end.
Вариант 2
uses crt;
var ch,zn,dl:array[1..50] of 1..maxint;
n,i,j:byte;
x,y,nd,nk,d:1..maxint;
begin
clrscr;
write('Количество дробей n=');
readln(n);
writeln('Введите дроби, числитель и знаменатель натуральные числа:');
for i:=1 to n do
begin
writeln('Дробь ',i);
repeat
write(' числитель: ');
readln(ch[i]);
write(' знаменатель: ');
readln(zn[i]);
until(ch[i]>0)and(zn[i]>0);
end;
clrscr;
writeln('Исходный массив дробей:');
for i:=1 to n do
write(ch[i],'/',zn[i],' ');
writeln;
x:=zn[1];y:=zn[2];//найдем НОК первого и второго знаменателей
while x<>y do
if x>y then x:=x-y
else y:=y-x;
nd:=x;//нашли их НОД
nk:=(zn[1] div nd)*zn[2];//НОК
for i:=3 to n do//будем икать НОК уже найденного и следующих знаменателей
begin
x:=zn[i];y:=nk;
while x<>y do
if x>y then x:=x-y
else y:=y-x;
nd:=x;
nk:=(zn[i] div nd)*nk;//новый НОК
end;
for i:=1 to n do//идем по массиву дробей
begin
d:=nk div zn[i];//делим общий знаменатель на знаменатель дроби
ch[i]:=ch[i]*d;//умножаем числитель на это число
zn[i]:=nk;//в знаменатель общий
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if ch[i]>ch[j] then//сортируем дроби по возрастанию числителя, знаменатель у всех одинаковый
begin
x:=ch[i];
ch[i]:=ch[j];
ch[j]:=x;
end;
writeln('Дроби приведены к общему знаменателю и отсортированы по возрастанию:');
for i:=1 to n do
write(ch[i],'/',zn[i],' ');
readln
end.