Дана последовательность чисел, заканчивающаяся нулем. Определить количество чисел не оканчивающихся на 2 и кратных 3 8 класс. Pascal Abc Net. Написать максииально понятно.
Where(p -> (Abs(p) mod 10 <> 2) and (p mod 3 = 0)).
Count.Println
end.
Объяснение
На самом деле такая программа намного понятнее, чем те, которые еще дают во многих (но не всех) школах. А при зачаточных знаниях английского языка программирование подобных задач превращается в забаву.
Итак, по порядку.
Функция ReadSeqIntegerWhile(p -> p <> 0). - сокращение английской фразы ReadSeqiunce of Integer While - "читать последовательность целых до тех пор пока"... А это "пока" стоит в скобках после имени функции и понимается так. p - это параметр функции (такой, как х в функции y = f(x). Т.е. p обозначает каждый по очереди элемент последовательности, которую функция принимает с клавиатуры. И для этого p указано условие p <> 0. Т.е. пока очередной считанный элемент последовательности не станет равным нулю, их следует продолжать читать. В целом вся эта конструкция обеспечивает получение с клавиатуры последовательности целых чисел с условием окончания по вводу нуля. Сам ноль в последовательность не входит. Почему последовательность, а не какой-то массив? Во-первых, в условии ясно сказано: последовательность. В прежних версиях паскаля не было последовательностей. В этой они есть. Во-вторых, нам сами элементы последовательности хранить не надо, мы просто проверяем значение очередного элемента и можем о нем забыть. А раз не надо хранить, нечего память занимать массивом. А последовательность память не занимает.
В конце строки стоит точка. Точку можно понимать, как данные. Т.е. точка тут символизирует полученную последовательность. Это как место сцепки двух вагонов, когда из одного вагона мы идем в другой. Первым вагончиком была функция, организовавшая нам получение последовательности. Второй вагончик - это следующая строка (моэно на одной писать, но будет длинно).
Where(p -> (Abs(p) mod 10 <> 2) and (p mod 3 = 0)).
Это тоже функция и тоже с точкой-сцепкой в конце. Значит, есть и следующий вагончик. Where - на аглийском означает "где". Это фильтр, ситечко, который пропускает в следующий вагон только тех, кто удовлетворяет условиям. Такой вот программный "фейс-контроль".
И условие прохода (отбора) также в скобочках. И опять этот р, обозначающий каждый по очереди элемент последовательности. А дальше обычное логическое выражение. Abs(p) mod 10 <> 2 - это проверка того, что число не оканчивается двойкой. Abs можно не писать, если гарантировано, что не будет отрицательных чисел. Второе условие p mod 3 = 0 требует, чтобы число было кратно 3. Оба условия связаны and, т.е. должны выполняться одновременно. Итак, в нашем втором "вагончике" сидят контролеры, которые следят, чтобы нежелательные элементы дальше не прошли.
Count.Println - это наша последняя сцепка пары "вагончиков".
Count. - это "считать" по-английски. В этом вагончике просто сидит Счетчик и отмечает, сколько элементов-пассажиров входят в вагон. А вот дальше он их не пускает. Он поступает несколько жестоко - просто выкидывает элемента - пассажира из состава. Такая уж у него работа. И только когда поток пассажиров закончится, Счетчик отправится в последний вагон со своими результатами.
Println - это и есть последний вагочик. Print and Line feed - печать и переход к новой строке. Счетчик отдаст свои результаты на вывод, а сам покинет вагон.
Ну и главное. Это все один-единственный оператор. В нем "закопаны" и циклы и много другое. В этом мощь нынешнего программирования - не заниматься мелочами, котороые компьютер в состоянии выполнить сам.
Как такое оператор работает? Первый элемент пассажир заходит (с клавиатуры) в вагончик ReadSeqIntegerWhile. И что, он там ждет остальных? Да нет, конечно! Он идет во второй вагончик - фильтр Where. Проходит контроль - идет в третий вагончик, к Счетчику. Ну и там... в общем, проходит Счетчика и дальше уже не при деле. А прямо за этим элементов в первый вагончик зашел второй элемент, за ним - третий... Часть проходит фильтр, а часть - нет. Те, что проходят, добираются до Счетчика. С прочими прощаемся еще раньше. Собственно это и означает, что поледовательость не хранится. Если бы хранилась - эти "пассажиры" так бы сидели где-то, занимая места. Ну а так - так мы можем хоть миллиарды элементов пропустить через вагончики.
Написано много. Но стоит раз понять - и такие (а также подобные) вагончики будет очень легко и очень быстро строить. А это позволяет писать программы коротко, быстро и безошибочно.
Answers & Comments
begin
ReadSeqIntegerWhile(p -> p <> 0).
Where(p -> (Abs(p) mod 10 <> 2) and (p mod 3 = 0)).
Count.Println
end.
Объяснение
На самом деле такая программа намного понятнее, чем те, которые еще дают во многих (но не всех) школах. А при зачаточных знаниях английского языка программирование подобных задач превращается в забаву.
Итак, по порядку.
Функция ReadSeqIntegerWhile(p -> p <> 0). - сокращение английской фразы Read Seqiunce of Integer While - "читать последовательность целых до тех пор пока"... А это "пока" стоит в скобках после имени функции и понимается так. p - это параметр функции (такой, как х в функции y = f(x). Т.е. p обозначает каждый по очереди элемент последовательности, которую функция принимает с клавиатуры. И для этого p указано условие p <> 0. Т.е. пока очередной считанный элемент последовательности не станет равным нулю, их следует продолжать читать. В целом вся эта конструкция обеспечивает получение с клавиатуры последовательности целых чисел с условием окончания по вводу нуля. Сам ноль в последовательность не входит. Почему последовательность, а не какой-то массив? Во-первых, в условии ясно сказано: последовательность. В прежних версиях паскаля не было последовательностей. В этой они есть. Во-вторых, нам сами элементы последовательности хранить не надо, мы просто проверяем значение очередного элемента и можем о нем забыть. А раз не надо хранить, нечего память занимать массивом. А последовательность память не занимает.
В конце строки стоит точка. Точку можно понимать, как данные. Т.е. точка тут символизирует полученную последовательность. Это как место сцепки двух вагонов, когда из одного вагона мы идем в другой. Первым вагончиком была функция, организовавшая нам получение последовательности. Второй вагончик - это следующая строка (моэно на одной писать, но будет длинно).
Where(p -> (Abs(p) mod 10 <> 2) and (p mod 3 = 0)).
Это тоже функция и тоже с точкой-сцепкой в конце. Значит, есть и следующий вагончик. Where - на аглийском означает "где". Это фильтр, ситечко, который пропускает в следующий вагон только тех, кто удовлетворяет условиям. Такой вот программный "фейс-контроль".
И условие прохода (отбора) также в скобочках. И опять этот р, обозначающий каждый по очереди элемент последовательности. А дальше обычное логическое выражение. Abs(p) mod 10 <> 2 - это проверка того, что число не оканчивается двойкой. Abs можно не писать, если гарантировано, что не будет отрицательных чисел. Второе условие p mod 3 = 0 требует, чтобы число было кратно 3. Оба условия связаны and, т.е. должны выполняться одновременно. Итак, в нашем втором "вагончике" сидят контролеры, которые следят, чтобы нежелательные элементы дальше не прошли.
Count.Println - это наша последняя сцепка пары "вагончиков".
Count. - это "считать" по-английски. В этом вагончике просто сидит Счетчик и отмечает, сколько элементов-пассажиров входят в вагон. А вот дальше он их не пускает. Он поступает несколько жестоко - просто выкидывает элемента - пассажира из состава. Такая уж у него работа. И только когда поток пассажиров закончится, Счетчик отправится в последний вагон со своими результатами.
Println - это и есть последний вагочик. Print and Line feed - печать и переход к новой строке. Счетчик отдаст свои результаты на вывод, а сам покинет вагон.
Ну и главное. Это все один-единственный оператор. В нем "закопаны" и циклы и много другое. В этом мощь нынешнего программирования - не заниматься мелочами, котороые компьютер в состоянии выполнить сам.
Как такое оператор работает? Первый элемент пассажир заходит (с клавиатуры) в вагончик ReadSeqIntegerWhile. И что, он там ждет остальных? Да нет, конечно! Он идет во второй вагончик - фильтр Where. Проходит контроль - идет в третий вагончик, к Счетчику. Ну и там... в общем, проходит Счетчика и дальше уже не при деле. А прямо за этим элементов в первый вагончик зашел второй элемент, за ним - третий... Часть проходит фильтр, а часть - нет. Те, что проходят, добираются до Счетчика. С прочими прощаемся еще раньше. Собственно это и означает, что поледовательость не хранится. Если бы хранилась - эти "пассажиры" так бы сидели где-то, занимая места. Ну а так - так мы можем хоть миллиарды элементов пропустить через вагончики.
Написано много. Но стоит раз понять - и такие (а также подобные) вагончики будет очень легко и очень быстро строить. А это позволяет писать программы коротко, быстро и безошибочно.