Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Особенности программирования скалярных типов пользователя
В Паскале существует два способа описания типов данных: явный – с использованием раздела TYPE и неявный, когда тип данного описывается непосредственно в разделе VAR. Примеры тождественного описания данных: Явное задание пользовательских типов TYPE_DAY = (SU, МО, TU, WE, ТН, FR, SA); YEAR= 1900.. 2000; NUMERIC = '0'.. '9'; VAR Dl, D2: DAY; G: YEAR; INTG: NUMERIC; Неявное задание тех же типов VAR Dl, D2: (SU, МО, TU, WE, ТН, FR, SA); G: 1900.. 2000; INTG: '0'.. '9'; Паскаль не поддерживает операции ввода-вывода значений пользовательских перечисляемых типов.
3.2. Массивы. Регулярные типы В простых типах данных каждое данное имеет свое название (идентификатор). В этом разделе вводится структурная взаимосвязь между данными, хранимыми в оперативной памяти путем организации массива, состоящего из непрерывно расположенных данных, не снабженных отдельными именами. Эти данные в свою очередь могут быть простыми или сложными и называются элементами массива. Основное преимущество массива состоит в том, что его элементы не имеют отдельных имен, и нет необходимости описывать каждый элемент по отдельности. Достаточно описать весь массив. Объявление массива содержит следующее описание: TYPE <имя типа> = ARRAY [тип индекса] OF <тип элементов массива>; Каждый элемент именуется путем указания имени массива и порядкового номера, определяющего его позицию в массиве, то есть индекса. Если тип данных определен с помощью конструкции ARRAY... OF то он называется регулярным типом. Паскаль предоставляет пользователю широкие возможности по заданию типа индекса, которым может быть любой порядковый или интервальный типы данных, в том числе и определенные пользователем. Тип элемента массива иногда называется базовым. Он может быть как любым скалярным, так и структурированным типом данных. Правомерно существование массивов-массивов, записей, множеств. Однако не существует массивов файлов. Число компонентов массива неявно определяется через тип индекса при его объявлении и в дальнейшем не меняется. Одномерные массивы. Вектора Если в описании массива типом элемента является простой тип данных, то такой массив называется вектором. Поскольку в таком массиве для идентификации величины используется только один индекс, то он называется одномерным. Такие одномерные массивы представляют собой простейшие структурированные данные. Обращение к элементам одномерного массива осуществляется с помощью индексированных переменных, например X[i]. Здесь X – имя массива, a i — константа, переменная или выражение того же типа, что и тип индекса в объявлении массива.
Пример 28. Определить частоту появления латинских прописных букв в тексте, вводимом с клавиатуры. Ввод данных завершить символом '*'. Здесь, в качестве индекса удобно использовать ограниченный литерный тип 'А'.. 'Z', что обеспечивает с одной стороны - мнемонический смысл индекса, соответствующего счетчику частоты появления литеры в тексте, а с другой стороны – легкость перебора значений индекса. В Паскале нет средств ввода, вывода массива целиком, поэтому эти действия приходится выполнять как циклические процессы над отдельными элементами массива, используя (в частности, в нашем примере) оператор FOR. В этом примере при выводе результатов с помощью форматного вывода реализован перевод целочисленного выражения COUNTER [СН] * 100 / N в вещественную форму числа с фиксированной десятичной точкой. PROGRAM PR28; VAR COUNTER: ARRAY ['A'.. 'Z'] OF INTEGER; CH: CHAR; N: INTEGER; BEGIN { Инициализация массива счетчиков букв COUNTER, то есть — присвоение его элементам значения 0 } FOR СН:= 'А' ТО 'Z' DO COUNTER[CH]:= 0; {Обнуление счетчиков литер} N:= 0; { Обнуление счетчика числа символов в тексте} REPEAT { Повторять для каждой новой литеры} READ(СН); { Ввод очередного символа с клавиатуры } N:= N + 1; { Увеличение счетчика символов на единицу } IF (СН >= 'A') AND (СН <= 'Z') THEN COUNTER[CH]:= COUNTER[CH] + 1; {Наращивается элемент массива с индексом, соответствующим коду вводимого символа} UNTIL СН = '*'; { Если True, то прочитана * - признак конца текста} WRITELN('Всегo прочитано символов:', N); WRITELN('буквa:':10, 'частота:':10, 'процент:':10); FOR СН:= 'А' ТО 'Z' { Вывод элементов массива на экран } DO WRITELN(CH:8,COUNTER[CH]:10,COUNTER[CH]*100/N:10:2) END.
Инициализация одномерного массива Отличительной особенностью Паскаля от большинства процедурных языков является то, что все переменные должны быть инициализированы. То есть в разделе VAR переменным отводится место, а начальное значение этих величин специально не устанавливается. Поэтому после объявления массива необходимо его элементам задать необходимые значения. Широко используется три способа инициализации одномерного массива.
• Если значения элементов массива определены до начала работы программы, то есть известны на этапе формулировки задания на программирование, то можно использовать следующий способ: CONST A: ARRAY [1..10] OF REAL = (0.1, -15.3, 7, 0, -11.89, 4, -78,11.2, 1,0.01); При таком объявлении массива в разделе констант вы заносите в одномерный массив А по порядку А[1] = 0.1, А[2] = -15.3,... А[10] = 0.01 вещественные числа, перечисленные в круглых скобках. При этом массив является массивом переменных, то есть в процессе работы программы можно менять содержимое любого разряда одномерного массива. Этот способ, конечно, является нарушением по стандарту Паскаля, однако очень часто используется на практике. • Второй способ применяется в том случае, если исходные данные необходимо ввести с клавиатуры в процессе выполнения программы. Поскольку одномерный массив представляет собой конечный набор однотипных элементов, пронумерованных с помощью индекса (переменной перечисляемого типа), то удобно использовать арифметический цикл (оператор FOR) для ввода значений непосредственно с клавиатуры. При этом можно предложить два равноценных приема. Предположим, в вашей программе сделаны объявления: CONST M=1; N=15; VAR A: ARRAY[M.. N] OF REAL; где M – нижняя, a N верхняя границы индексов. Первый способ ввода будет иметь инструкцию: WRITELN('Введите массив А, из 15 вещественных чисел'); FOR I:= М ТО N DO READ(A[I]); При таком способе оператор может ввести все 15 чисел через пробел в одну строку и только затем нажать на клавишу Enter. Если он считает нужным, то он может вводить группы чисел (например, по 3 числа, чтобы не ошибиться) через пробелы и нажимать Enter. А можно вводить на каждой строке только по одному числу. Второй способ ввода имеет вид: FOR I:= M TO N DO BEGIN WRITE('A[', I:1,'] = '); READLN(A[I]) END; Этот фрагмент программы позволяет вам вводить число непосредственно за подсказкой компьютера, курсор для ввода стоит через пробел за знаком равенства. • Третий способ заполнения используется для массивов малых размерностей и заключается в прямом присвоении в теле программы значений элементам массива. Например, допустимы следующие операторы: FOR I:= М ТО N DO А[I]:= 0; Пример 29. В результате измерения случайного параметра сформирован массив из N вещественных чисел. Вычислить эмпирическую среднюю и среднее квадратическое отклонение Обозначим М = и S = σ, тогда алгоритм программы будет иметь вид. Как мы только что обсуждали, ввод массива — это инструкция, содержащая несколько операторов, в том числе оператор цикла FOR. Но здесь и во всех последующих примерах мы не будем уточнять способ ввода одномерного массива, оставляя выбор за программистом. PROGRAM PR29; CONST N=10; VAR X: ARRAY [1.. N] OF REAL; I: INTEGER; S, M: REAL; BEGIN WRITELN('Введите массив X, из', N:2,' вещественных чисел'); FOR I:= 1 TO N DO READ(X[I]); M:=0; S:= 0; FOR I:= 1 TO N DO M:= M + X[I]; M:=M/N; FOR I:= 1 TO N DO S:= S + (X[I] - M) * (X[I] - M); S:= SQRT(S / (N - 1)); WRITELN('M - ', M:10:6,', S = ', S:9:6); END.
Отображение на экране значений одномерного массива Если в результате работы вашей программы массив изменил свое состояние и необходимо значения каждого из его элементов отобразить на монитор, то можно воспользоваться любым из двух способов, описанных ниже. Предположим, в вашей программе сделаны объявления:
CONST M = 1; N=15; VAR A: ARRAY [M.. N] OF REAL; Тогда первый способ вывода элементов массива в строку будет иметь инструкцию: WRITELN('Элементы массива А имеют значения:'); FOR I:= М ТО N DO WRITE(A[I]: С: D,''); WRITELN; В этой инструкции первый оператор WRITELN сообщает оператору, какую информацию он увидит на экране. Второй оператор сформирует цепочку вещественных чисел, разделенных пробелами в формате: С: D. Третий оператор WRITELN переведет курсор на новую строку. Второй способ обеспечивает вывод значений элементов массива в столбец, причем каждый из элементов будет идентифицирован: FOR I:= М ТО N DO WRITELN('A[', I:2,'] - ', А[I]: С: D);
Работа с индексами одномерного массива Существует класс задач, в которых индекс массива используется для формализации вычислительного процесса путем сведения исходных формул к конечным суммам и произведениям. Преобразованные таким образом формулы программируются с помощью арифметических циклов. При обращении к элементам массива в качестве индексов можно использовать выражения перечисляемого типа. Пример 30. Дана последовательность вещественных чисел X1, Х2, X3,..., Х24. Требуется вычислить U = X1 • Х2 • Х3 • X4 + X4 • Х6 • Х7 • Х8 +... + Х21 • Х22 • X23 • Х24 Для программирования необходимо линейную формулу U преобразовать к следующему виду: Нетрудно заметить, что задача сведена к двойному арифметическому циклу. Для накопления суммы по I используется переменная U, исходное состояние которой равно 0. Для накопления произведения используется рабочая переменная Р, которая рассчитывается шесть раз для значений индекса I =1,2,…,6. Для накопления произведения начальное значение J принимается равным 1. PROGRAM PR30; VAR X: ARRAY [1.. 24] OF REAL; I, J: INTEGER; U, P: REAL; BEGIN WRITELN('Введите массив X, из 24 вещественных чисел'); FOR I:= 1 ТО 24 DO READ(X[I]); U:= 0; FOR I:= 1 TO 6 DO BEGIN P:= 1; FOR J:= 1 TO 4 DO P:=P*X[4*(I-1)+J]; U:= U + P END; WRITELN('U =', U:10:2) END.
|
|||||||
Последнее изменение этой страницы: 2017-02-07; просмотров: 127; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.217.134 (0.023 с.) |