Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- LinqBegin25
- LinqBegin29
Глава 4. Запросы 71 Рис. 9. Окно задачника с отладочным выводом для задачи LinqBegin17 При запуске нового варианта программы в окне задачника появится раздел отладки, в котором будут выведены размер и элементы последова- тельностей, полученных после применения каждого из использованных запросов (см. рис. 9). Легко убедиться, что после первого запроса в после- довательности остаются только нечетные элементы, а после второго из нее удаляются все повторения. В задаче LinqBegin25 требуется найти сумму всех положительных элементов целочисленной последовательности с порядковыми номерами от k1 до k2 включительно (по условию 1 ≤ k1 < k2 ≤ n, где n — размер после- довательности; вначале необходимо ввести числа k1 и k2, затем — исход- ную последовательность): Task('LinqBegin25'); var (k1,k2) := ReadInteger2; Write(ReadSeqInteger.Skip(k1 - 1).Take(k2 - k1 + 1) .Where(e -> e > 0).Sum); Для отбора «внутренней» части элементов последовательности надо последовательно вызвать запросы Skip и Take (учитывая при этом, что, в отличие от индексов, порядковые номера начинаются с 1). Просуммиро- вать в полученной последовательности положительные числа можно двумя способами: либо используя запросы Where и Sum (как в приведенном реше- нии), либо используя единственный запрос Sum с параметром-селектором следующего вида: e -> e > 0 ? e : 0 (этот селектор сохраняет положительные элементы, а отрицательные заменяет на 0, чтобы они не вносили вклад в вычисляемую сумму). В задаче LinqBegin29 даются целые числа d и k (k > 0) и целочислен- ная последовательность; требуется найти теоретико-множественное объ- 72 единение двух фрагментов исходной последовательности: первый содер- жит все элементы до первого элемента, большего d (не включая его), а вто- рой — все элементы, начиная с элемента с порядковым номером k. Полу- ченную последовательность (не содержащую одинаковых элементов) тре- буется дополнительно отсортировать по убыванию: Task('LinqBegin29'); var (d,k) := ReadInteger2; var a := ReadSeqInteger; a.TakeWhile(e -> e <= d) .Union(a.Skip(k - 1)).SortedDescending.WriteAll; В данном случае требуется получить две части исходной последова- тельности, после чего объединить их с помощью запроса Union. Поэтому необходимо связать последовательность с некоторой переменной и затем дважды обратиться к этой переменной, первый раз применив запрос Take- While, а второй раз — запрос Skip. В конце надо выполнить запрос SortedDe- scending, сортирующий полученную последовательность по убыванию. Интересно проанализировать процесс формирования итоговой после- довательности, добавив в последний оператор несколько запросов отла- дочной печати Show: a.Show('Исходная посл. a: ') .TakeWhile(e -> e <= d).Show('b = a.TakeWhile: ') .Union(a.Skip(k - 1).Show('c = a.Skip: ')) .Show('d = b.Union(c): ') .SortedDescending.Show('d.SortedDescending:').WriteAll; Для большей наглядности отладочную печать каждой последователь- ности можно снабдить комментарием. На рис. 10 приводится окно задач- ника после запуска варианта решения с отладочной печатью. Download 1.62 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling