Сортировка и сокращение дробей - 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.
Объяснение кода листинга программы
- Объявление переменных:
- s: строка для ввода дробей
- n: счетчик количества введенных дробей
- i, j, k: целочисленные переменные для использования в циклах
- a: массив для хранения дробей (максимум 20 дробей)
- x: временная дробь
- Цикл, который продолжается до тех пор, пока не введено 20 дробей или не введено значение 0 для завершения ввода.
- Если введено значение 0, цикл завершается.
- Если введено значение, которое не является числом, цикл продолжает ожидать ввода правильной дроби.
- Если введено значение, которое является числом, оно преобразуется в дробь и сохраняется в массиве a.
- Если введено значение, содержащее слеш (/), то числитель и знаменатель дроби извлекаются и сохраняются в соответствующих переменных.
- Если введено значение без слеша, то оно преобразуется в дробь со знаменателем 1.
- Цикл, который сокращает дробь путем поиска общего кратного для числителя и знаменателя.
- Если найдено общее кратное, числитель и знаменатель делятся на это общее кратное.
- Цикл, который сортирует дроби в порядке возрастания отношения числителя к знаменателю.
- Если дроби равны, они меняются местами.
- Цикл, который выводит сокращенные и отсортированные дроби.
- Если знаменатель равен 1, то выводится числитель.
- Если знаменатель больше 1, то выводится числитель и знаменатель в формате дроби.
- Программа ожидает ввода с клавиатуры для подтверждения, что вывод был корректным.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д