Сортировка и сокращение дробей - Free Pascal

Узнай цену своей работы

Формулировка задачи:

На вводе имеем последовательность дробей заданных в формате <целое число>[<слеш><неорицательное целое число>]. Каждый член последовательности на отдельной строке. Эта последовательность(пердположим, что она не дольше 20 членов) закончена 0, как символ конца данных (ноль не являестя частью последовательности). Дроби нужно сократить и отсортировать. В итоговой последовательности нужно выписать каждый член но отдельной строчке. Если в знаменатели 1, то нужно выписать только числитель, в другом случае - дробь в формате <целое число>[<слеш><неорицательное целое число>].

Решение задачи: «Сортировка и сокращение дробей»

textual
Листинг программы
uses crt;
type frac=record {тип дробь}
          p,q:1..maxint;{числитель и знаменатель целое положительное число}
          end;
const max=20;
var s:string;
    n,i,j,k:integer;
    a:array[1..max] of frac;
    x:frac;
begin
clrscr;
writeln('Вводите дроби в виде 2/7 или просто 1 число по 1 на строке, конец ввода 0');
{проверку ввода не делаем, считаем что он верный}
n:=0;
repeat
readln(s);
if (s<>'0')and(n<=20) then
 begin
  n:=n+1;
  if pos('/',s)>0 then{если есть слеш}
   begin
    val(copy(s,1,pos('/',s)-1),a[n].p,k);{выделяем числитель}
    delete(s,1,pos('/',s));
    val(s,a[n].q,k);{и знаменатель}
   end
  else
   begin
    val(s,a[n].p,k);
    a[n].q:=1;
   end;
  {сокращаем дробь}
  i:=2;
  while(i<=a[n].p)and(i<=a[n].q)do
   begin
    if(a[n].p mod i=0)and(a[n].q mod i=0) then
     begin
      a[n].p:=a[n].p div i;
      a[n].q:=a[n].q div i;
     end
    else i:=i+1;
   end;
 end;
until (s='0')or(n=20); {0 или 20 дробей конец ввода}
{сортируем дроби}
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i].p/a[i].q>a[j].p/a[j].q then
 begin
  x:=a[i];
  a[i]:=a[j];
  a[j]:=x
 end;
{выводим}
writeln('Сокращенные и отсортированные дроби');
for i:=1 to n do
if a[i].q=1 then writeln(a[i].p)
else writeln(a[i].p,'/',a[i].q);
readln
end.

Объяснение кода листинга программы

  1. Объявление переменных:
    • s: строка для ввода дробей
    • n: счетчик количества введенных дробей
    • i, j, k: целочисленные переменные для использования в циклах
    • a: массив для хранения дробей (максимум 20 дробей)
    • x: временная дробь
  2. Цикл, который продолжается до тех пор, пока не введено 20 дробей или не введено значение 0 для завершения ввода.
    • Если введено значение 0, цикл завершается.
    • Если введено значение, которое не является числом, цикл продолжает ожидать ввода правильной дроби.
    • Если введено значение, которое является числом, оно преобразуется в дробь и сохраняется в массиве a.
  3. Если введено значение, содержащее слеш (/), то числитель и знаменатель дроби извлекаются и сохраняются в соответствующих переменных.
    • Если введено значение без слеша, то оно преобразуется в дробь со знаменателем 1.
  4. Цикл, который сокращает дробь путем поиска общего кратного для числителя и знаменателя.
    • Если найдено общее кратное, числитель и знаменатель делятся на это общее кратное.
  5. Цикл, который сортирует дроби в порядке возрастания отношения числителя к знаменателю.
    • Если дроби равны, они меняются местами.
  6. Цикл, который выводит сокращенные и отсортированные дроби.
    • Если знаменатель равен 1, то выводится числитель.
    • Если знаменатель больше 1, то выводится числитель и знаменатель в формате дроби.
  7. Программа ожидает ввода с клавиатуры для подтверждения, что вывод был корректным.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы