Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Массивы. Задачи комбинированной обработки массивовСодержание книги Поиск на нашем сайте
Массив — это структурированный тип данных, состоящий из фиксированного числа элементов одного типа. Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Доступ к элементу массива реализуется указателем имени массива и в квадратных скобках индекса. Индексы элементов массива это выражения любого скалярного типа кроме вещественного. Определить массивы можно двумя способами: 1. Var имя_массива: array [тип_индексов] of тип_элементов; 2. Type имя_типа = array [тип_индекса] of тип_элементов; Var имя_массива: имя_типа; Тип индекса (это тип-диапазон) определяет границы изменения значений индекса. Если задан один индекс, то массив называется одномерным, если два – двумерным, если n – n-мерным. Одномерные массивы используются для представления векторов, двумерные – для представления матриц. Пример. 1-ый способ: Var A,B: array [1..10] of Real; {одномерные массивы} С: array [1..5,1..10] of Integer; {двумерный массив} 2-ой способ: Type Mas1= array [1..10] of Real; Mas2= array [1..5,1..10] of Integer; Var A,B:Mas1; C:Mas2; Диапазоны индексов можно задать константами, которые описаны в разделе описания констант: Const N=5; M=10; Var C: array [1..N,1..M] of Integer; Массив можно описать с помощью типизированных констант: Const Vect: array [1..5] of Byte=(1,6,3,8,5); Matr: array [1..4,1..6] of Integer= ((1,6,3,5,2,4), (7,2,5,4,3,2), (3,1,6,3,8,5), (5,2,8,5,5,4)); Элементы массива располагаются в памяти последовательно. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым. Например, массив A[3,3] будем располагаться следующим образом: A[1,1], A[1,2], A[1,3], A[2,1], A[2,2], A[2,3], A[3,1], A[3,2], A[3,3]. Действия над массивами Для работы с массивом как единым целым, используется идентификатор массива без указания индекса в квадратных скобках. Массивы, участвующие в этих действиях должны иметь одинаковые типы индексов и одинаковые типы компонент. Над массивом как единым целым можно произвести следующие действия: 1. A=B (проверить массивы на равенство); 2. А<>В (проверить массивы на неравенство); 3. А:=В. Действия над элементами массива 1. Инициализация массива (заключается в присвоении каждому элементу массива одного и того же значения) · одномерного For i:=1 to N do A[i]:=0; · двумерного For i:=1 to N do For j:=1 to M do B[i,j]:=0; 2. Ввод элементов массива · одномерного Write ('Введите размерность массива N='); ReadLn (N); WriteLn ('Введите элементы массива'); For i:=1 to N do Begin Write ('A[',i,']='); ReadLn (A[i]); end; · двумерного Write ('Введите размерность массива N, M'); ReadLn (N, M); WriteLn ('Введите элементы массива'); For i:=1 to N do For j:=1 to M do Begin Write ('B[',i,',',j,']='); ReadLn (B[i,j]); end; 3. Вывод элементов массива · одномерного WriteLn ('Вектор А:'); For i:=1 to N do Write (A[i]:5); WriteLn; · двумерного WriteLn ('Матрица В:'); For i:=1 to N do Begin For j:=1 to M do Write (B[i,j]:5); WriteLn; end;
4. Поиск нулевых элементов в массиве · одномерном k:=0; For i:=1 to N do If A[i]=0 then k:=k+1; · двумерном k:=0; For i:=1 to N do For j:=1 to M do If B[i,j]=0 then k:=k+1; 5. Нахождение минимального элемента массива и его места · одномерного min:=A[1]; i_min:=1; For i:=1 to N do If A[i]<min then Begin min:=A[i]; i_min:=i; end; · двумерного min:=B[1,1]; i_min:=1; j_min:=1; For i:=1 to N do For j:=1 to M do If B[i,j]<min then Begin min:=B[i,j]; i_min:=i; j_min:=j; end;
6. Перестановка минимального и первого элементов в массиве · одномерном r:=A[1]; A[1]:=A[i_min]; A[i_min]:=r; · двумерном r:=B[1,1]; B[1,1]:=B[i_min,j_min]; B[i_min,j_min]:=r; 7. Нахождение суммы положительных элементов массива · одномерного sum:=0; For i:=1 to N do If A[i]>0 then sum:=sum+A[i]; · двумерного sum:=0; For i:=1 to N do For j:=1 to M do If B[i,j]>0 then sum:=sum+B[i,j]; 8. Нахождение произведения нечетных элементов · одномерного prod:=1; For i:=1 to N do If (A[i] mod 2) <> 0 then prod:=prod*A[i]; · двумерного (нахождение произведения нечетных элементов) prod:=1; For i:=1 to N do {Функция Odd(X) возвращает значение} For j:=1 to M do {истина, если X нечетно } If Odd(B[i,j]) then prod:=prod*B[i,j]; 9. Нахождение суммы положительных элементов выше главной диагонали (включая элементы диагоналей). Элементы на главной диагонали характеризуются тем, что индексы этих элементов равны, т.е. i=j. Для элементов побочной диагонали для любого i индекс столбца j=n-i+1. Элементы областей выше, ниже главной или побочной диагоналей можно задать или порядком изменения индексов или условиями, накладываемыми на индексы:
i=1,2,…,n; j=1,2,…,i i=1,2,…,n; j=i,i+1,…,n или i>=j или i<=j
i=1,2,…,n; j=1,2,… n-i+1; i=1,2,…,n;j=n-i+1,…,n или n-i-j+1>=0 или n-i-j+1<=0 sum:=0; For i:=1 to n do For j:=i to n do If B[i,j]>=0 then sum:=sum+B[i,j];
10. Поменять местами максимальный элемент на главной диагонали и минимальный элемент ниже побочной. Max:=B[1,1]; I_max:=1; For i:=1 to n do If B[i,i]> max then Begin Max:=B[i,i]; I_max:=i; end; Min:=B[1,n]; I_min:=1; J_min:=n; For i:=1 to n do For j:=n-i+1 to n do If B[i,j]< Min then Begin Min:=B[i,j]; I_min:=i; J_min:=j; end; R:=B[I_max,I_max]; B[I_max,I_max]:=B[I_min,J_min]; B[I_min,J_min]:=R;
11. Дана квадратная матрица В размерности nxn. Построить вектор А, где аi – сумма положительных элементов i-ой строки матрицы. For i:=1 to n do Begin S:=0; For j:=1 to n do If B[i,j]>0 then S:=S+B[i,j]; A[i]:=S; End;
12. Дана квадратная матрица В размерности nxn. В каждом столбце оставить без изменения максимальный элемент столбца, остальные элементы заменить нулями. For j:=1 to n do Begin Max:=B[1,j]; I_max:=1; For i:=1 to n do If B[i,j]> Max then Begin Max:=B[i,j] I_max:=i; end; For i:=1 to n do If i_max<>i then B[i,j]:=0; end;
Пример: Дан целочисленный вектор A (n), поменять местами максимальный и минимальный элементы вектора. На печать выдавать исходный вектор, максимальный, минимальный элементы, полученный вектор. Program Example_Vect; Uses Crt; Const N_max=10; Var N,i,max,i_max,min,i_min,r:Integer; A: array [1..N_max] of Integer; Begin Clrscr; Write('Введите размерность массива N (<',N_max,')='); ReadLn (N); WriteLn ('Введите элементы массива'); For i:=1 to N do {ввод элементов вектора} Begin Write ('A[',i,']='); ReadLn (A[i]); end; WriteLn ('Исходный вектор А:'); For i:=1 to N do { вывод вектора} Write (A[i]:5); WriteLn; min:=A[1]; {нахождение минимального элемента} i_min:=1; {и его индекса} For i:=1 to N do If A[i]<min then Begin min:=A[i]; i_min:=i; end; max:=A[1]; i_max:=1; {нахождение максимального элемента} For i:=1 to N do {и его индекса} If A[i]>max then Begin max:=A[i]; i_max:=i; end; WriteLn('Минимальный элемент A[',i_min,']=',min); WriteLn('Максимальный элемент A[',i_max,']=',max); r:=A[i_min]; {перестановка} {другой способ:} A[i_min]:=A[i_max]; { A[i_min]:=A[i_max];} A[i_max]:=r; { A[i_max]:=min;} WriteLn ('Полученный вектор А:'); For i:=1 to N do {вывод полученного вектора} Write (A[i]:5); WriteLn; End.
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ Подпрограммой называется именованная логически законченная группа операторов языка, которую можно вызвать для выполнения по имени любое количество раз из различных мест программы. В языке Pascal для организации подпрограмм используются процедуры и функции. Все процедуры и функции языка Pascal подразделяются на две группы: встроенные и определенные пользователем. Процедуры и функции пользователя организовываются самим программистом в соответствии с синтаксисом языка. Предварительное (перед использованием) описание процедур и функций пользователя обязательно. В соответствии с областями применения различают 9 основных групп встроенных процедур и функций: арифметические, скалярные, преобразования типов, управления строками на экране, специальные, обработки строк, обработки файлов, управления памятью для динамических переменных, управления графикой. Специальные процедуры Delay (Time) – организует задержку выполнения программы на Time мс. Exit – обеспечивает выход из выполняемого блока в окружающую среду. Если текущий блок является процедурой или функцией, выход производится во внешний блок. Если Exit указана в операторной части основной программы, программа прекращает работу и управление передается системе программирования. Halt – прекращает выполнение программы и передает управление системе программирования. Специальные функции KeyPressed – возвращает результат True, если на клавиатуре была нажата какая-либо клавиша, и False в противном случае. SizeOf (IT) – вычисляет объем основной памяти в байтах, которую занимает указанная переменная или тип. Результат имеет целочисленный тип. IT – идентификатор переменной или типа данных.
Процедура пользователя представляет собой именованную группу операторов, реализующую определенную часть общей задачи и вызываемую при необходимости для выполнения по имени из любой позиции раздела операторов. Описание процедуры включает заголовок и тело процедуры. Заголовок состоит из зарезервированного слова Procedure, идентификатора (имени) процедуры и необязательного заключенного в скобки списка формальных параметров с указанием типа каждого параметра. Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе: Формат описания процедуры: Procedure имя_процедуры (формальные_параметры); {заголовок} раздел описаний Begin {тело процедуры} раздел операторов End; Для обращения к процедуре используется оператор вызова процедуры. Он состоит из идентификатора (имени) процедуры и списка фактических параметров, отделенных друг от друга запятыми и заключенных в круглые скобки. Список параметров может отсутствовать, если процедуре не передается никаких значений. Формат обращения к процедуре: имя_процедуры (фактические_параметры); Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимно-однозначное соответствие по типу, количеству и порядку следования. Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово Function, идентификатор (имя) функции, заключенный в круглые скобки необязательный список формальных параметров и тип возвращаемого функцией значения. Формат описания функции пользователя: Function имя (формальные_параметры): тип_результата; разделы описаний Begin {тело функции} раздел операторов End; В разделе операторов должен находиться по крайней мере один оператор, присваивающий идентификатору функции значение. Если таких присваиваний несколько, то результатом выполнения функции будет значение последнего оператора присваивания. Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.
Директивы компилятора Сразу за заголовками подпрограммы может следовать одна из стандартных директив компилятора, которые уточняют его действия и распространяются на всю подпрограмму и только на нее: Assembler – тело подпрограммы написано на ассемблере; External – с помощью этой директивы объявляется внешняя подпрограмма; Far – компилятор должен создать код подпрограммы, рассчитанный на дальнюю модель вызова; Near – компилятор создает код подпрограммы, рассчитанный на ближнюю модель памяти (используется по умолчанию); Forward – используется при опережающем описании подпрограмм для сообщения компилятору, что описание подпрограммы следует дальше по тексту программы (но в пределах текущего программного модуля); Inline – тело подпрограммы реализуется с помощью встроенных машинных инструкций; Interrupt – используется при создании процедур обработки прерываний. В соответствии с архитектурой микропроцессора, в программе могут использоваться две модели памяти: ближняя и дальняя. Модель памяти определяет возможность вызова процедуры из различных частей программы: если используется ближняя модель, вызов возможен только в пределах 64 Кбайт (в пределах одного сегмента кода, который выделяется основной программе и каждому используемому в ней модулю); при дальней модели вызов возможен из любого сегмента.
|
||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 299; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.146.37.242 (0.007 с.) |