Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet44/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   40   41   42   43   44   45   46   47   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 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:
1   ...   40   41   42   43   44   45   46   47   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling