From fadb078b017f476f341b0b658d05ab1ae8225614 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Thu, 27 Aug 2015 21:15:46 +0300 Subject: [PATCH] e --- TestSuite/LinqObj36.pas | 43 ++++++++++++++++++++++++++++++++++ TestSuite/LinqObj40.pas | 42 +++++++++++++++++++++++++++++++++ TestSuite/LinqObj43.pas | 25 ++++++++++++++++++++ TestSuite/LinqObj61.pas | 51 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 TestSuite/LinqObj36.pas create mode 100644 TestSuite/LinqObj40.pas create mode 100644 TestSuite/LinqObj43.pas create mode 100644 TestSuite/LinqObj61.pas diff --git a/TestSuite/LinqObj36.pas b/TestSuite/LinqObj36.pas new file mode 100644 index 000000000..4410847e1 --- /dev/null +++ b/TestSuite/LinqObj36.pas @@ -0,0 +1,43 @@ +uses + PT4, PT4Linq; + +begin + Task('LinqObj36'); + System.Threading.Thread.CurrentThread.CurrentCulture := + new System.Globalization.CultureInfo('en-US'); + var res := ReadAllLines(ReadString) + .Select(s -> + begin + var ss := s.Split(); + result := new class + ( + N := integer.Parse(ss[0]), + D := double.Parse(ss[2]), + F := ss[1] + ); + end) + .GroupBy(s -> (s.N - 1) mod 36 div 4 + 1, (k, ss) -> new class + ( + P := k, + Info := ss.Where(s -> s.D <= ss.Average(s1 -> s1.D)) + )) + // так не компилируется + .SelectMany(s -> s.Info.Select(s1 -> new class + ( + P := s.P, + F := s1.F, + N := s1.N, + D := s1.D + ))) + .OrderBy(s -> s.P).ThenBy(s -> s.D) + .Select(e -> e.P + ' ' + e.D.ToString('F2') + ' ' + e.F + ' ' + e.N); + WriteAllLines(ReadString, res); + +(* // так тоже не компилируется + .SelectMany(e -> e.Info) + .OrderBy(e -> (e.N - 1) mod 36 div 4 + 1).ThenBy(e -> e.D) + .Select(e -> ((e.N - 1) mod 36 div 4 + 1) + ' ' + e.D.ToString('F2') + ' ' + e.F + ' ' + e.N); + WriteAllLines(ReadString, res); +*) + +end. \ No newline at end of file diff --git a/TestSuite/LinqObj40.pas b/TestSuite/LinqObj40.pas new file mode 100644 index 000000000..a26844d4f --- /dev/null +++ b/TestSuite/LinqObj40.pas @@ -0,0 +1,42 @@ +uses PT4, PT4Linq; + +(* + При решении задач группы LinqObj доступны следующие + дополнительные методы, определенные в модуле PT4Linq: + + ReadAllLines(name) - функция, которая возвращает последовательность строк, + содержащихся в текстовом файле с имененм name; + WriteAllLines(name, seq) - процедура, которая записывает в текстовый файл + с именем name последотвальеность строк seq; + Show() и Show(cmt) (методы расширения) - отладочная печать + последовательности, cmt - строковый комментарий; + Show(e -> str) и Show(cmt, e -> str) (методы расширения) - + отладочная печать строковых значений str, полученных + из элементов e последовательности, cmt - строковый комментарий. +*) + +begin + Task('LinqObj40'); + var res := ReadAllLines(ReadString) + .Select(s -> + begin + var ss := s.Split(); + result := new class + ( + C := ss[0], + M := integer.Parse(ss[2]), + P := integer.Parse(ss[3]), + S := ss[1] + ); + end) + .GroupBy(s -> s.S, (k, ss) -> new class + ( + S := k, + C := Range(0,2).Select(i -> ss.Count(s -> s.M = 92+i*3)) + )) + .OrderBy(e -> e.S) + .Select(e -> e.S + e.C.Aggregate('', (seed, s) -> seed + ' ' + s)); + WriteAllLines(ReadString, res); +end. + + diff --git a/TestSuite/LinqObj43.pas b/TestSuite/LinqObj43.pas new file mode 100644 index 000000000..d7837ff20 --- /dev/null +++ b/TestSuite/LinqObj43.pas @@ -0,0 +1,25 @@ +uses PT4, PT4Linq; + +begin + Task('LinqObj43'); + var m := ReadInteger; + var res := ReadAllLines(ReadString) + .Select(s -> + begin + var ss := s.Split(); + result := new class + ( + C := ss[3], + M := integer.Parse(ss[1]), + P := integer.Parse(ss[0]), + S := ss[2] + ) + end) + .GroupBy(s1 -> s1.C, (k, ss) -> new class + ( + Comp := k, + C := ss.Where(s2 -> s2.M = m) + )) +end. + + diff --git a/TestSuite/LinqObj61.pas b/TestSuite/LinqObj61.pas new file mode 100644 index 000000000..17198773a --- /dev/null +++ b/TestSuite/LinqObj61.pas @@ -0,0 +1,51 @@ +uses PT4, PT4Linq; + +(* + При решении задач группы LinqObj доступны следующие + дополнительные методы, определенные в модуле PT4Linq: + + ReadAllLines(name) - функция, которая возвращает последовательность строк, + содержащихся в текстовом файле с имененм name; + WriteAllLines(name, seq) - процедура, которая записывает в текстовый файл + с именем name последотвальеность строк seq; + Show() и Show(cmt) (методы расширения) - отладочная печать + последовательности, cmt - строковый комментарий; + Show(e -> str) и Show(cmt, e -> str) (методы расширения) - + отладочная печать строковых значений str, полученных + из элементов e последовательности, cmt - строковый комментарий. +*) +// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014. +// Глава 6. Примеры решения задач из группы LinqObj +// 6.2. Более сложные задания на обработку отдельных последовательностей +// LinqObj61: правильное решение (с.199-200) +begin +// === ОШИБКА КОМПИЛЯЦИИ === + Task('LinqObj61'); + var subjects : array of string := ( 'Алгебра', 'Геометрия', 'Информатика' ); + var culture := new System.Globalization.CultureInfo('en-US'); + var r := ReadAllLines(ReadString) + .Select(e -> + begin + var s := e.Split(' '); + result := new class + ( + name := s[0] + ' ' + s[1], + subj := s[3], + mark := StrToInt(s[4]) + ); + end) + .GroupBy(e -> e.name, (k, ee) -> new class + ( + name := k, + avrs := subjects + .GroupJoin(ee, s -> s, e -> e.subj, + (s1, ee1) -> ee1.Select(e1 -> e1.mark) + .DefaultIfEmpty().Average()) + )) + .OrderBy(e -> e.name) + .Select(e -> e.name + e.avrs.Aggregate('', + (a, d) -> a + ' ' + d.ToString('f2', culture))); + WriteAllLines(ReadString, r); +end. + +