Даны дроби (знаменатель и числитель натуральные числа). Составить программу, которая приводит к общему знаменателю и упорядочивает их в порядке возрастания — Pascal(Паскаль)

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.

Leave a Comment

62 − 59 =