PROGRAM FractionINPUT OUTPUT VAR Numerator Denominator INTEGER BEGIN
Простейшая программа PROGRAM Fraction(INPUT, OUTPUT); VAR Numerator, Denominator: INTEGER; BEGIN READLN(Numerator); READLN(Denominator); WRITELN(Numerator, '/', Denominator) END. 1 2 1/2 10 7 10/7
Приводим к смешанной дроби PROGRAM Fraction(INPUT, OUTPUT); VAR Numerator, Denominator: INTEGER; Integer. Part: INTEGER; 10 7 1 3/7 BEGIN READLN(Numerator); READLN(Denominator); Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; IF Integer. Part = 0 THEN WRITELN(Numerator, '/', Denominator) ELSE WRITELN(Integer. Part, ' ', Numerator, '/', Denominator) END.
Выносим вывод дроби в процедуру {Выводит смешанную дробь на экран} PROCEDURE Print. Fraction; BEGIN IF Integer. Part = 0 THEN WRITELN(Numerator, '/', Denominator) ELSE WRITELN(Integer. Part, ' ', Numerator, '/', Denominator) END; BEGIN READLN(Numerator); READLN(Denominator); Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; Print. Fraction END. 10 7 1 3/7
Избавляемся от глобальных переменных при печати {Выводит смешанную дробь на экран} PROCEDURE Print. Fraction(Integer. Part, Numerator, Denominator: INTEGER); BEGIN IF Integer. Part = 0 THEN WRITELN(Numerator, '/', Denominator) ELSE WRITELN(Integer. Part, ' ', Numerator, '/', Denominator) END; BEGIN READLN(Numerator); READLN(Denominator); Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; Print. Fraction(Integer. Part, Numerator, Denominator) END.
Упрощаем дробь «в лоб» {Упрощает правильную дробь (дробь, где числитель меньше знаменателя)} PROCEDURE Simplify. Fraction(VAR Numerator, Denominator: INTEGER); VAR {Greatest Common Denominator - наибольший общий делитель} GCD: INTEGER; BEGIN GCD : = Numerator; WHILE GCD > 1 DO BEGIN IF (Numerator MOD GCD = 0) AND (Denominator MOD GCD = 0) THEN BEGIN Numerator : = Numerator DIV GCD; Denominator : = Denominator DIV GCD; EXIT END ELSE GCD : = GCD - 1 END;
Программа PROGRAM Fraction(INPUT, OUTPUT); PROCEDURE Print. Fraction(Integer. Part, Numerator, Denominator: INTEGER); … PROCEDURE Simplify. Fraction(VAR Numerator, Denominator: INTEGER); … VAR Numerator, Denominator, Integer. Part: INTEGER; BEGIN READLN(Numerator); READLN(Denominator); Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; Simplify. Fraction(Numerator, Denominator); Print. Fraction(Integer. Part, Numerator, Denominator) END. 20 6 3 1/3
{Возвращает наибольший общий делитель чисел A и B} FUNCTION Greatest. Common. Denominator(A, B: INTEGER): INTEGER; VAR Temp: INTEGER; 21 BEGIN 6 WHILE B <> 0 3 1/2 DO BEGIN Temp : = B; B : = A MOD B; 18 A : = Temp 6 END; 3 0/1 Greatest. Common. Denominator : = A END; {Упрощает произвольную дробь} PROCEDURE Simplify. Fraction(VAR Numerator, Denominator: INTEGER); VAR GCD: INTEGER; BEGIN GCD : = Greatest. Common. Denominator(Numerator, Denominator); Numerator : = Numerator DIV GCD; Denominator : = Denominator DIV GCD; END;
Улучшенный вывод дроби {Выводит смешанную дробь на экран} PROCEDURE Print. Fraction(Integer. Part, Numerator, Denominator: INTEGER); BEGIN IF Numerator = 0 THEN WRITELN(Integer. Part) ELSE BEGIN IF Integer. Part <> 0 THEN WRITE(Integer. Part, ' '); WRITELN(Numerator, '/', Denominator) END; 21 6 3 1/2 18 6 3 3 6 1/2
CONST Upper. Bound = 1000000; FUNCTION Read. Integer(VAR X: INTEGER): BOOLEAN; VAR Input. String: STRING[255]; Error. Code: INTEGER; BEGIN READLN(Input. String); VAL(Input. String, X, Error. Code); Read. Integer : = Error. Code = 0 END; FUNCTION Is. In. Range(X, Min. Value, Max. Value: INTEGER): BOOLEAN; BEGIN Is. In. Range : = (X >= Min. Value) AND (X <= Max. Value); END; FUNCTION Read. Fraction(VAR Numerator, Denominator: INTEGER): BOOLEAN; BEGIN Read. Fraction : = FALSE; IF Read. Integer(Numerator) AND Read. Integer(Denominator) THEN IF Is. In. Range(Numerator, 0, Upper. Bound) AND Is. In. Range(Denominator, 1, Upper. Bound) THEN Read. Fraction : = TRUE END;
BEGIN IF Read. Fraction(Numerator, Denominator) THEN BEGIN Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; Simplify. Fraction(Numerator, Denominator); Print. Fraction(Integer. Part, Numerator, Denominator) END ELSE WRITELN('ERROR') END. 21 6 3 1/2 18 6 3 3 6 1/2 4 Not a number ERROR 4 0 ERROR 1000001 3 ERROR
Исправляем Read. Integer Ctrl+Z FUNCTION Read. Integer(VAR X: INTEGER): BOOLEAN; VAR ^Z Input. String: STRING[255]; ERROR Error. Code: INTEGER; BEGIN IF NOT EOF THEN BEGIN 3 READLN(Input. String); ^Z VAL(Input. String, X, Error. Code); ERROR Read. Integer : = Error. Code = 0 END ELSE Read. Integer : = FALSE Программа прошла END; 100% хороших и 100% плохих тестов
Это еще не все! BEGIN IF Read. Fraction(Numerator, Denominator) THEN BEGIN Integer. Part : = Numerator DIV Denominator; Numerator : = Numerator MOD Denominator; Simplify. Fraction(Numerator, Denominator); Сложный код Print. Fraction(Integer. Part, Numerator, Denominator) END ELSE WRITELN('ERROR') END.
Тип данных «Смешанная дробь» TYPE {Тип данных Смешанная дробь} Compound. Fraction = RECORD Integer. Part, Numerator, Denominator: INTEGER; END; {Выводит смешанную дробь на экран} PROCEDURE Print. Fraction(Fract: Compound. Fraction); BEGIN IF Fract. Numerator = 0 THEN WRITELN(Fract. Integer. Part) ELSE BEGIN IF Fract. Integer. Part <> 0 THEN WRITE(Fract. Integer. Part, ' '); WRITELN(Fract. Numerator, '/', Fract. Denominator) END;
PROGRAM Fraction(INPUT, OUTPUT); … FUNCTION Read. Fraction(VAR Numerator, Denominator: INTEGER): BOOLEAN; PROCEDURE Print. Fraction(Fract: Compound. Fraction); {Преобразует простую дробь в смешанную} FUNCTION To. Compound. Fraction(Numerator, Denominator: INTEGER): Compound. Fraction; VAR GCD: INTEGER; Fract: Compound. Fraction; BEGIN GCD : = Greatest. Common. Denominator(Numerator, Denominator); Fract. Integer. Part : = Numerator DIV Denominator; Fract. Numerator : = (Numerator MOD Denominator) DIV GCD; Fract. Denominator : = Denominator DIV GCD; To. Compound. Fraction : = Fract END; VAR Numerator, Denominator: INTEGER; BEGIN IF Read. Fraction(Numerator, Denominator) THEN Print. Fraction(To. Compound. Fraction(Numerator, Denominator)) ELSE WRITELN('ERROR')
Исходный код решения • https: //github. com/alexey-malov/fraction
{Получает из ввода коэффициенты для X и Y в уравнении} {В случае успеха печатает уравнение} {Иначе печатает 'ERROR'} PROCEDURE Read. And. Print. Equation; VAR Coeff. X, Coeff. Y: INTEGER; BEGIN IF Read. Integer. In. Range(Coeff. X) THEN IF Read. Integer. In. Range(Coeff. Y) THEN BEGIN Print. Equation(Coeff. X, Coeff. Y); WRITELN END ELSE WRITELN('ERROR') END; BEGIN Read. And. Print. Equation END.
CONST Max. Value = 100; Min. Value = -100; {Читает число из входного потока} {Возвращает TRUE, если оно введено корректно и входит в допустимый диапазон} {Иначе возвращает FALSE} FUNCTION Read. Integer. In. Range(VAR Value: INTEGER): BOOLEAN; VAR Buffer: STRING; Error. Code: INTEGER; BEGIN READLN(Buffer); VAL(Buffer, Value, Error. Code); { была ошибка в преобразовании? } IF Error. Code <> 0 THEN Read. Integer. In. Range : = FALSE ELSE Read. Integer. In. Range : = (Value > Min. Value) AND (Value < Max. Value) END;
{Печатает уравнение, в котором и Coeff. X, и Coeff. Y могут быть равны нулю} PROCEDURE Print. Equation(Coeff. X, Coeff. Y: INTEGER); BEGIN IF Coeff. X = 0 THEN IF Coeff. Y = 0 THEN WRITE('0') ELSE Print. Multiple. Of(Coeff. Y, 'y') ELSE IF Coeff. Y = 0 THEN Print. Multiple. Of(Coeff. X, 'x') ELSE Print. Normalized. Equation(Coeff. X, Coeff. Y) END;
{Печатает уравнение, в котором коэффициенты Coeff. X и Coeff. Y не равны нулю} PROCEDURE Print. Normalized. Equation(Coeff. X, Coeff. Y: INTEGER); BEGIN IF Coeff. Y < 0 THEN BEGIN Print. Multiple. Of(Coeff. X, 'x'); WRITE(' - '); Print. Multiple. Of(ABS(Coeff. Y), 'y') END ELSE BEGIN Print. Multiple. Of(Coeff. X, 'x'); WRITE(' + '); Print. Multiple. Of(Coeff. Y, 'y') END;
{Печатает множитель и заданный параметр} {Например, Print. Multiple. Of(29, 'x') печатает '29 x'} {Особый случай: Print. Multiple. Of(1, 'x') печатает 'x'} {Особый случай: Print. Multiple. Of(-1, 'x') печатает '-x'} {Если параметр Value равен 0, корректная работа не гарантирована} PROCEDURE Print. Multiple. Of(Value: INTEGER; Suffix: STRING); BEGIN IF Value <> 1 THEN IF Value <> -1 THEN WRITE(Value, Suffix) ELSE WRITE('-', Suffix) ELSE WRITE(Suffix) END;
PROGRAM Statistics(INPUT, OUTPUT); TYPE Stat. Type = ARRAY ['A'. . 'Z'] OF INTEGER; VAR Stat: Stat. Type; BEGIN Read. Statistics(INPUT, Stat); Write. Sorted. Statistics(Stat) END.
PROCEDURE Read. Statistics(VAR FIn: TEXT; VAR Stat: Stat. Type); VAR Is. End: BOOLEAN; Ch: CHAR; BEGIN FOR Ch : = 'A' TO 'Z' DO BEGIN Stat[Ch] : = 0 END; Is. End : = FALSE; WHILE NOT EOF(FIn) AND NOT Is. End DO BEGIN WHILE NOT EOLN(FIn) AND NOT Is. End DO BEGIN READ(FIn, Ch); Ch : = UPCASE(Ch); IF Ch = '#' THEN Is. End : = TRUE ELSE BEGIN IF (Ch >= 'A') AND (Ch <= 'Z') THEN Stat[Ch] : = Stat[Ch] + 1 END; IF NOT Is. End THEN READLN(FIn) END;
PROCEDURE Write. Sorted. Statistics(VAR Stat: Stat. Type); VAR Maximum: INTEGER; Ch: CHAR; BEGIN Maximum : = Get. Array. Maximum(Stat); IF Maximum = 0 THEN WRITELN(OUTPUT, 'NO LETTERS') ELSE WHILE (Maximum > 0) DO BEGIN FOR Ch : = 'A' TO 'Z' DO BEGIN IF Stat[Ch] = Maximum THEN BEGIN WRITELN(OUTPUT, Ch, ': ', Stat[Ch]); Stat[Ch] : = 0 END; Maximum : = Get. Array. Maximum(Stat) END;
FUNCTION Get. Array. Maximum(VAR Stat: Stat. Type): INTEGER; VAR Ch: CHAR; Maximum: INTEGER; BEGIN Maximum : = 0; FOR Ch : = 'A' TO 'Z' DO BEGIN IF Stat[Ch] > Maximum THEN Maximum : = Stat[Ch] END; Get. Array. Maximum : = Maximum END;
- Slides: 42