|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Примеры работы с одномерными массивами
Пример 1. Демонстрация приемов ввода и вывода одномерного массива.
program nomer_1; USES CRT; TYPE vector = array [1..100] of real; VAR X: vector; N,i: integer; { N текущая длина массива от 1 до 100 } BEGIN { 1. ВВОД МАССИВА } Repeat Write (' введите число элементов N от 1 до 100 '); Readln (N); until (N> =1) and (N < = 100); Writeln('в массиве ', N', элементов'); for i = 1 to N do begin write('X[', i,'] ='); ReadLn(X[i]); end; WriteLn ('конец ввода'); Readln; { 2. ВЫВОД МАССИВА на ЭКРАН } clrscr; writeln(' Массив X[N] '); for i:=1 to n do write(x[i]:12:3); writeln; END. Пример 2. Последовательный поиск компоненты вектора. Заданы вектор A(n) целого типа и X. Если в векторе А есть элемент, равный Х, то переменной Х присвоить значение True, а переменной K присвоить индекс найденного элемента. В противном случае присвоить переменной P значение False. В задачах поиска последовательный перебор элементов массива сочетается с проверкой некоторого условия, поэтому в программах использован оператор цикла итерационного типа Repeat. Программа решения этой задачи методом простейшего линейного поиска приведена ниже. Поиск закончится при выполнении одного из двух условий: a[i]=x (искомый элемент найден) или i>n (все элементы отличаются от Х).
program lin_poisk; const n=10; TYPE vector=array[1..n] of integer; VAR a:vector; { массив } x:integer; { искомое значение } p:boolean; { признак поиска } i:integer; { параметр цикла и индекс найденного элемента } BEGIN I:=0; Repeat I:=i+1; Until (i>n) or (a[i]=x); If i>n then p:=false { не нашли } Else p:=true; {нашли a[i] = x } If p then writeln('индекс найденного элемента ', i) END. Чтобы избежать многократной проверки условия и тем самым ускорить поиск (за счет дополнительной памяти), применяют следующий прием: в конец вектора А добавляется вспомогательный элемент, которому присваивается значение Х, что гарантирует выполнение условия a[i] = x.
program Uskor_poisk; const n=10; TYPE vector=array[1..n+1] of integer;{ на один элемент больше } VAR a:vector; { массив } x:integer;{искомое значение} p:boolean; { признак поиска } i:integer; { параметр цикла и индекс найденного элемента } BEGIN Writeln('ввод массива из ',N, ' чисел '); For i:=1 to n do Readln(a[i]); Write('Введите искомое значение:');readln(x); A[n+1]:=x; { n+1 -й элемент равен X } { поиск } I:=0; Repeat I:=i+1; Until (a[i]=x); If i>n then p:=false { не нашли } Else p:=true; {нашли a[i]=x } If p then writeln('индекс найденного элемента ',i) END.
Пример 3. Часто встречаются задачи, решение которых требует форми-рования новых массивов из элементов исходных массивов. Пусть дан массив А[N] вещественных чисел, где N не больше 20. Положительные элементы массива нужно занести в массив В, а отрицательные возвести в квадрат и занести в массив С. Составим списки входных и выходных данных для данной задачи. Дано: N – число элементов [1..20], массив А[1..N] of single. Найти: массивы B и С, KB и KC – количество элементов в массивах В и C. (0 £ KC и KB £ N). Ниже дается словесное описание алгоритма решения. 1. Ввод массива А из N элементов. 2. Положить количество элементов в новых массивах КВ = 0; KC = 0/ 3. Цикл по i = 1, N, 1 3.1 Если а[i] < 0, то КС:= КС + 1 и C[КС]:= A[i] * A[i], иначе КВ:= KB + 1, B[KB]:= A[i] 4. Вывод на экран элементов массива В. 5. Вывод на экран элементов массива С. Текст программы:
program form_mas; uses crt; Type Vector=array[1..20] of single; Var N:byte; A,b,c:vector; { массивы предельно допустимого размера } Kb,kc:byte; Begin Repeat Write (' введите число элементов N от 1 до 20 '); Readln (N); Until (N> =1) and (N < = 20); for i = 1 to N do begin write('A[', i,'] ='); ReadLn(A[i]); end; WriteLn ('Массив А введен'); { Формирование массивов B и C } kc:=0; kb:=0; For i:=1 to n do If a[i]<0 then begin Kc:=kc+1; c[kc]:=a[i]*a[i] end Else begin Kb:=kb+1; b[kb]:=a[i] end; { Вывод массивов B и C } if kb=0 then writeln('В исходном массиве нет положительных элементов') else begin writeln('Массив В'); for i:=1 to kb do write(b[i]:8:3); writeln; end; if kс=0 then writeln('В массиве A нет отрицательных элементов') else begin writeln('Массив С'); for i:=1 to kс do write(с[i]:8:3); writeln; end; readln; end.
Пример 4. Алгоритм поиска максимального элемента. Текст соответствующей программы на Паскале:
program MAXM; Uses CRT; Const n=10; TYPE vector=array[1..n] of longint; VAR a:vector; { массив } MAXD:longint; { наибольший элемент } k:integer; { параметр цикла } BEGIN ClrScr; { опустим операторы ввода массива } { поиск максимума, вариант с оператором For } X:=A[1]; { k:=2;x:=A[1]; } For k:=2 to n do { repeat } if X< A[k] then X=A[k];{ if x < A[k] then x:=A[k]; } Writeln('max=',X); { k:=k+1; } Readln { until k>n; } end.
Рассмотрим задачу, решение которой является продолжением примера 4: Максимальный элемент массива А[n] поменять местами с последним элементом. Пусть n=5 и массив a[1..5]={0, 7, - 2, 4, 6} Обозначим max – наибольший элемент, k – его позиция в массиве. Решение задачи состоит из двух этапов: - найти max и его номер k; - поменять местами A[n] и A[k]. Программа имеет вид:
Program Obmen; Const n=5; Var a: array [1..n] of real; i,k: byte max: real; Begin { пропустим операторы ввода массива } max: = a[1]; K=1: for i=2 to n do if a [i] > max then begin max: = a[i]; K: = i; { индекс заносится в К} end; { выполним перестановку элементов } A[K]: = A[n]; A[n]: = max; { вывод массива А } end.
Пример 5. Операция сдвига элементов массива и примеры применения. Пусть в массиве А[20] заполнены первые К мест, где 1 <= K < 20. а) Требуется ввести новое значение в поле переменной B и вставить его в начало массива. Решение задачи будет состоять из двух этапов: сдвиг и вставка. Вначале сдвигаем массив А на 1 позицию вправо. «Формула» сдвига вправо запишется следующим оператором присвоения: A[i + 1]:= A[i], где i меняется от k до 1 с шагом -1. После сдвига массива элемент A1 будет равен элементу A2, необходимо выполнить вставку значения B в первую позицию массива. На Паскале алгоритм запишется в виде: for i:= K downto 1 do a[i + 1]:= a[i]; A[1]:= B; { после сдвига массива элемент a[1] получит значение в } Если необходимо вставить новый элемент в позицию с некоторым номером J, где 0 < j < k + 1, то запись на Паскале будет следующей: for i:= K downto j do a[i + 1]:= a[i]; a[j]:= b; б) Пусть первые K элементов массива А[N] упорядочены по возрастанию (1 <= K < N). Вставить новый элемент в массив А, не нарушая его упоря-доченности. Решение задачи состоит из трех этапов: 1. Поиск позиции J <= K в массиве, чтобы выполнилось условие A[J] > B. Просмотр элементов с начала массива. 2. Cдвиг вправо на 1 позицию части массива, начиная с элемента A[k] по элемент A[J]. 3. Вставка нового элемента в позицию с номером J и увеличение K – длины отсортированной части массива на 1.
program Vstavka; const n=15; var a:array[1..n] of real; i,j,k:integer; b:real;begin {….. в массиве заполнены первые К позиций} {Ввод значения В} write('B=');readln(b); { Поиск J- места для вставки нового элемента } { Сдвиг вправо на 1 позицию } j:=0; repeat j:=j+1; until (j>k) or (a[j]> b); for i:=k downto j do a[i+1]:=a[i]; { Вставка } a[j]:=b; { увеличение K } k:=k+1; end.
Правильность работы программы вставки можно проверить на следующих тестах: N = 5, k = 3, A = (2,7,10) a)B = 1 Промежуточные результаты: J = 1, после сдвига A = (2,2,7,10) Результаты: k=4, A=(1,2,7,10). 2) B = 12 Промежуточные результаты: J = 4, k = 3, A = (2,7,10). Цикл по сдвигу не выполнится. Результаты: k = 4, A = (1,2,7,12). 3)B = 6 Промежуточные результаты: J = 3, после сдвига A = (2,7,7,10) Результаты: k = 4, A = (2,6,7,10).
Пример 6. Сортировка массива. Дана последовательность чисел a1, a2, a3,..., an и значение n. Переставить элементы этого вектора таким образом, чтобы они следовали в порядке возрастания, то есть удовлетворялось условие a1 £ a2 £ a3 £... £ an. Простейший обменный метод сортировки (или метод пузырька) заключается в том, что просматриваются пары соседних элементов. Если элементы расположены не по возрастанию, то они обмениваются местами. В результате просмотра максимальный элемент окажется на своем последнем месте, даже если он находился на первой позиции. Работа внешнего цикла управляется параметром Р. Параметр Р – признак упорядоченности: если элементы вектора упорядочены, параметр Р = 1, в противном случае Р = 0, то есть необходима перестановка соседних элементов. Количество повторений внешнего цикла заранее не определено и зависит от того, насколько упорядочен исходный вектор. Во внутреннем цикле происходит сравнение смежных пар элементов: если ai больше ai+1., то элементы меняются местами. Внутренний цикл выполняется N-1 раз, то есть это цикл арифметического типа. Параметром цикла является i – индекс элемента массива. Вектор считается упорядоченным в том случае, если за один последовательный просмотр всех его элементов не нарушилось условие ai <= ai+1 ни для одной пары элементов.
Текст программы: Program Sort_pusirek; { Дано целое число N и массив A[1..N] чисел вещественного типа Переставить элементы A[i] таким образом, чтобы они следовали в порядке возрастания их значений. } USES CRT; CONST n = 10; TYPE vector= array [1..N] of real; VAR A:vector; p:integer; { признак перестановки элементов } i:integer; { параметр цикла (индекс) } s:real; { вспомогательная переменная } BEGIN ClrScr; writeln('ввод данных '); For i:=1 to N do begin write('A[',i,']='); readln(A[i]) end; { сортировка --- методом обмена } p:=0; {массив Не упорядочен } While p=0 do begin p:=1; { Предположим, массив уже упорядочен } For i:=1 to n-1 do if A[i]>A[i+1} then begin {перестановка} s:=A[i]; A[i]:=A[i+1]; A[i+1]:= s; p:=0{ массив не был упорядочен } end; end; сортировка завершена ------------} { вывод массива } clrscr; writeln(' Массив A '); for i:=1 to n do write(A[i]:8:3); writeln; readln; END.
Можно рекомендовать следующие контрольные примеры для тестирования: Массив A: а) упорядочен по возрастанию элементов; б) упорядочен по убыванию элементов. в) не упорядочен; г) состоит из равных элементов.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.024 сек.) |