Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet32/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   28   29   30   31   32   33   34   35   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 3. Массивы и последовательности 
53 
диться непосредственно перед вводом самих элементов. В подобной ситу-
ации организация ввода становится предельно простой, например: 
var a := ReadArrInteger; 
Ситуации, в которых при решении задач требуется использовать вари-
ант функций ввода с параметром n — размером массива, возникают доста-
точно редко: например, если в задаче надо использовать массив, размер 
которого (скажем, 10) явно указан в формулировке:
var a := ReadArrInteger(10); 
Параметр n необходим и в ситуации, когда в задаче даются два масси-
ва одинакового размера, причем размер указывается один раз — перед пер-
вым массивом. В этом случае можно использовать два варианта ввода. В 
первом варианте вначале вводится размер n, а затем он указывается при 
вводе каждого массива: 
var n := ReadInteger; 
var a := ReadArrInteger(n); 
var b := ReadArrInteger(n); 
Можно, однако, обойтись без использования переменной n, если вве-
сти первый массив с помощью функции без параметров, а затем указать 
размер уже введенного массива в функции для ввода второго массива: 
var a := ReadArrInteger; 
var b := ReadArrInteger(a.Length); 
Обратимся к последовательностям. Можно ли организовать ввод так, 
чтобы введенные данные сразу помещались в последовательность? На 
первый взгляд, ответ должен быть отрицательным, поскольку последова-
тельность является неизменяемой структурой: создав последовательность с 
помощью одного из генераторов, мы уже не сможем изменить ее элементы 
по отдельности. Однако мы можем применить к последовательности за-
прос, формирующий на ее основе другую последовательность. Мы уже 
знаем несколько подобных запросов, в том числе Select. А ведь в запросе 
Select (в указываемом в нем лямбда-выражении) мы вполне можем органи-
зовать ввод данных! При этом для создания исходной последовательности 
мы можем использовать какую-либо простейшую функцию-генератор
например, SeqFill или Range (или Repeat с последующим запросом Take). Ре-
ализуем эту идею для ввода целочисленной последовательности: 
var a := SeqFill(ReadInteger('Введите размер и элементы:'), 0) 
.Select(e -> ReadInteger); 
Следует обратить внимание на пустые круглые скобки, указанные по-
сле функции ReadInteger. В данном случае они необходимы, поскольку при 
их отсутствии компилятор решит, что в новой последовательности надо 


54 
сохранять саму функцию ReadInteger (как значение процедурного типа), 
а не результат ее выполнения.
Замечание. Как правило, при вызове функций без параметров указан-
ных проблем не возникает, так как компилятор по контексту верно опреде-
ляет нужное действие. Однако в некоторых ситуациях (как в приведенной 
выше) по контексту определить требуемое действие нельзя, и поэтому 
приходится явно вводить скобки, однозначно указывающие на то, что тре-
буется выполнить вызов функции. Следует иметь в виду данную особен-
ность вызовов функций без параметров, и если при компиляции или вы-
полнении оператора, содержащего подобный вызов, возникают проблемы, 
первым делом добавлять к коду круглые скобки. Можно также применять 
стиль программирования, при котором после имен подпрограмм при их 
вызове всегда указываются скобки (в том числе пустые). Заметим, что в 
большинстве языков программирования указание скобок при вызове под-
программ является обязательным.
Если добавить к этому оператору оператор отладочной печати вида 
Write(a), то при запуске данного фрагмента и вводе тех же данных, что и 
для предыдущего примера с массивом, мы получим такой текст: 

Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   28   29   30   31   32   33   34   35   ...   71




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