Главная » Статьи » Программирование » Pascal |
Массивы (примерны можно найти на форуме) Одним из важных инструментов программиста является возможность работы с массивами переменных. Массив - набор однотипных данных, хранящихся вместе и имеющих общее имя. Возможность объединения групп элементов в массив позволяет, с одной стороны, облегчить массовую обработку данных, а с другой - упростить идентификацию элементов массива. Каждому элементу массива может быть присвоено одно числовое или символьное значение, поэтому различаются массивы числовые и символьные. Кроме того, массивы могут быть одномерными и многомерными. Одномерные массивыОсновные понятияМассив обозначается одним именем. Так всю совокупность действительных чисел 1.6, 14.9, -5.0, 8.5, 0.46 можно считать массивом и обозначить одним именем, например, А. Образующие массив переменные называются элементами массива. Каждый элемент массива обозначается именем массива с индексом, заключенным в квадратные скобки. A[1], A[2], A[3], ..., A[n]. Индекс определяет положение элемента массива данных относительно его начала. Для рассмотренного выше примера элементами массива А являются: A[1]=1.6, A[2]=14.9, A[3]=-5.0, A[4]=8.5, A[5]=0.46 Описание массиваФормат Var <идентификатор,…>:array[тип индекса] of <тип компонент>; Например: M: array[1..4] of integer; MAS: array[1..60] of real; Для описания массива можно использовать предварительно определенные константы. Например, Const G1=4; G2=6; Var M1: array[1..G1] of integer; M2: array[1..G2] of real; Заполнение массива1 Способ (заполнение с клавиатуры. Динамический ввод данных) Var M:array[1..10] of integer; I: byte; Begin For I:=1 To 10 Do Begin Write('Введите ',I,' значение '); ReadLn(M[I]); End; End. 2 Способ (с использованием генератора случайных чисел) Var M: array[1..25] of integer; I: byte; Begin For I:=1 To 25 Do Begin M[I]:=Random(50); Write(M[I]:4); End; End. 3 Способ (статический ввод данных) Const M: array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31); Var I: Integer; Begin For I:=1 To 9 Do Write(M[I]:3); End. Примеры решения задач1. Алгоритмы поиска и присвоения значений элементам массива 1. Составить программу обработки массива размерностью n, заполненного целыми числами, введенными с клавиатуры. Вывести индексы и значения положительных элементов массива. USES Crt; CONST N=10; VAR A:ARRAY[0..N] OF INTEGER; I:BYTE; BEGIN ClrScr; { Заполнение массива } FOR I:=1 TO N DO Begin Write('Введите ',I,' элемент массива '); ReadLn(A[I]); End; { Обработка элементов массива } FOR I:=1 TO N DO IF A[I]>0 THEN WriteLn('Положительный элемент = ',A[I],' его индекс = ',I); END. 2. Составить программу вычисления и печати значений функции Y=sin(x-1)/2x. Значения аргументов задать в массиве X, состоящего из 6 элементов. Значения функции записать в массив Y. USES Crt; VAR X,Y:ARRAY[0..6] OF REAL; I: BYTE; BEGIN ClrScr; FOR I:=1 TO 6 DO Begin Write('Введите ',I,' значение аргумента '); ReadLn(X[I]); End; FOR I:=1 TO 6 DO Begin Y[I]:=SIN(X[I]-1)/(2*X[I]); WriteLn(' X= ',X[I]:4:1,' Y=',Y[I]:5:2); End; END. 3. Дан массив M, состоящий из 30 элементов. Элементы массива - произвольные целые числа. Выдать на экран значение каждого пятого и положительного элемента. Указанные элементы выдать в строку. USES Crt; VAR M:ARRAY[0..30] OF INTEGER; I: BYTE; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов массива'); FOR I:=1 TO 30 DO Begin M[I]:=Random(20)-4; Write(M[I]:3); End; WriteLn; I:=5; WriteLn(' Значения каждого пятого и положительного элемента массива'); While I<=30 DO Begin IF M[I] > 0 THEN Write(M[I]:3); I:=I+5; End; END. Примеры для самостоятельного решения: 1. Дан одномерный массив размерностью 10, заполненный целыми числами, введенными с клавиатуры, и величина N. Отрицательные элементы заменить на N. Измененный массив вывести на экран одной строкой. 2. Дан одномерный массив размерностью N, заполненный случайными числами в интервале от -15 до 20. Вывести на экран значения элементов массива, абсолютное значение которых >10. 3. Дан одномерный массив размерностью N, заполненный случайными числами. Каждый третий элемент массива возвести в квадрат, если элемент отрицательный. Измененный массив вывести на экран. 4. Составить программу вычисления и печати значений функции Y=(sinx+1)Öcos4x. Значения аргументов задать в массиве X, состоящего из 10 элементов. Значения функции записать в массив Y. 5. Из элементов массива А, состоящего из 25 элементов, сформировать массив D той же размерности по правилу: первые 10 элементов находятся по формуле Di=Ai+i, остальные - по формуле Di=Ai-i. 2. Алгоритмы нахождения суммы, произведения и количества элементов массива. Работа с индексами элементов массива 1. Определить сумму элементов массива Р(n), значения которых > заданного Т USES Crt; Const N=30; VAR P:ARRAY[0..N] OF INTEGER; I,T:BYTE; S:INTEGER; BEGIN ClrScr; Randomize; { Заполнение массива случайными числами } WriteLn(' Значения элементов массива'); FOR I:=1 TO N DO Begin P[I]:=Random(30); Write(P[I]:3); End; WriteLn; Write(' Введите значение переменной '); ReadLn(T); S:=0; FOR I:=1 TO N DO IF P[I]>T THEN S:=S+P[I]; { сумма элементов массива > T } WriteLn(' Сумма элементов массива > заданного значения = ',S); END. 2. Дан массив целых чисел, состоящий из 25 элементов. Подсчитать сумму элементов массива, произведение положительных и количество нулевых элементов. Результат вычисления вывести на экран. USES Crt; VAR A:ARRAY[0..25] OF INTEGER; I: BYTE; S,K: INTEGER; P: REAL; BEGIN ClrScr; Randomize; { Заполнение массива случайными числами } WriteLn(' Значения элементов массива'); FOR I:=1 TO 25 DO Begin A[I]:=Random(10)-3; Write(A[I]:3); End; WriteLn; S:=0; K:=0; P:=1; FOR I:=1 TO 25 DO Begin S:=S+A[I]; { сумма элементов массива } IF A[I]>0 THEN P:=P*A[I]; { произведение положительных элементов массива } IF A[I]=0 THEN K:=K+1; { количество нулевых элементов массива } End; WriteLn(' Сумма элементов массива = ',S); WriteLn(' Произведение положительных элементов массива = ',P:0:0); WriteLn(' Количество нулевых элементов массива = ',K); END. 3. Дан массив четных чисел, состоящий из 15 элементов. Заполнить его с клавиатуры. Найти:
USES Crt; CONST T=11; VAR A:ARRAY[0..15] OF INTEGER; I,NP,FL: BYTE; S,K: INTEGER; BEGIN ClrScr; Randomize; { Заполнение массива с клавиатуры } FOR I:=1 TO 15 DO Begin Write('Введите ',I,' злемент массива '); ReadLn(A[I]); End; WriteLn; S:=0; K:=0; FL:=0; FOR I:=1 TO 15 DO Begin IF I mod 2 =0 THEN S:=S+A[I]; { сумма элементов, имеющих четные индексы } IF (A[I]>T) AND (A[I] mod 5 =0) THEN K:=K+1; { количество } IF (A[I]<0) AND (A[I] mod 5 =-2) AND (FL=0) THEN Begin NP:=I; FL:=1; End; End; WriteLn(' Сумма элементов,имеющих четные индексы = ',S); WriteLn(' Количество элементов, значения которых > ',T,' и кратны 5 = ',K); WriteLn(' Номер первого отрицательного элемента, делящегося на 5 с остатком 2 = ',NP); END. Примеры для самостоятельного решения: 1. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
2. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
3. Дан массив целых чисел, состоящий из N элементов. Определить среднее арифметическое положительных элементов. 4. Дан массив чисел. Найти, сколько в нем пар одинаковых соседних элементов. 5. Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2», полученных учащимися за урок и средний балл. 6. В очереди за билетами стоят мужчины и женщины. Какое количество мужчин стоит в начале очереди до первой женщины. 3. Алгоритмы нахождения наибольшего или наименьшего элемента массива и его индекса Дан массив K, состоящий из 45 элементов. Элементы массива - произвольные целые числа. Определить минимальный элемент массива и его индекс. USES Crt; VAR K:ARRAY[0..45] OF INTEGER; I,IND: BYTE; MIN:INTEGER; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов массива'); FOR I:=1 TO 45 DO Begin K[I]:=Random(35)+6; Write(K[I]:3); End; WriteLn; MIN:=K[1]; IND:=1; { нахождение минимального значения и его индекса } FOR I:=2 TO 45 DO IF K[I]<MIN THEN Begin MIN:=K[I]; IND:=I; End; WriteLn(' Минимальное значение = ',MIN); WriteLn(' Индекс минимального значения = ',IND); END. Основные понятияИногда решение задачи возможно только при наличии многомерных массивов, или матриц. Наиболее часто применяются двумерные массивы, поскольку описывать информацию по ее позиции в одномерном списке весьма неудобно. Представьте себе, как трудно было бы найти свое место на стадионе, если бы на билете указывался лишь порядковый номер сиденья - один из многих тысяч! Билеты же, на которых проставлены и номер ряда, и номер места, существенно упрощают эту задачу. Составители географических карт тоже пользуются таким приемом. Координаты Парижа, Осло, Рима, обозначаются не как 1, 2 или 300, а в терминах градусов широты и долготы. Эти два числа указывают местоположение города относительно экватора и начального (Гринвичского) меридиана. Каждый элемент двумерного массива описывается двумя индексами: первый обозначает номер строки, а второй - номер столбца. A[4,5], A[2,7], A[6,3], ..., A[m,n]. Описание массиваФормат Var <идентификатор,…>:array[тип индекса] of <тип компонент>; Например: M: array[1..4,1..5] of integer; {двумерный массив, состоящий из 4 строк и 5 столбцов} MAS: array[1..6,1..7] of real; Для описания массива можно использовать предварительно определенные константы. Например, Const G1=4; G2=6; Var M1: array[1..G1,1..G2] of integer; Заполнение и вывод элементов двумерного массива1 Способ (заполнение с клавиатуры) Var M:array[1..7,1..5] of integer; I,J: byte; Begin For I:=1 To 7 Do {цикл по строкам} For J:=1 To 5 Do {цикл по столбцам} ReadLn(M[I,J]); End. 2 Способ (с использованием генератора случайных чисел) Var M: array[1..5,1..4] of integer; I,J: byte; Begin For I:=1 To 5 Do Begin For J:=1 To 4 Begin M[I,J]:=Random(50); Write(M[I,J]:4); End; WriteLn; End; End. Примеры решения задач 1. Алгоритмы действий над элементами двумерного массива 1. В течение недели измерялась температура три раза в день: утром, в обед и вечером. Показания записали в таблицу размерностью 7х3. Определить среднюю температуру за каждый день. USES Crt; VAR T:ARRAY[0..7,0..3] OF INTEGER; I,J:BYTE; S:INTEGER; ST:REAL; A:STRING[12]; BEGIN ClrScr; WriteLn; { Заполнение таблицы } FOR I:=1 TO 7 DO Begin WriteLn(' Введите показания за ',I,' день'); FOR J:=1 TO 3 DO Begin CASE J OF 1: A:=' Утром - '; 2: A:=' В обед - '; 3: A:=' Вечером - '; End; Write(A); ReadLn(T[I,J]); End; End; WriteLn; { Подсчет средней температуры за каждый день } FOR I:=1 TO 7 DO Begin S:=0; FOR J:=1 TO 3 DO S:=S+T[I,J]; ST:=S/3; WriteLn('Средняя температура за ',I,' день = ',ST:4:1); End; END. 2. Группа из 10 учащихся сдавала экзамен по 4 предметам. Результаты экзаменов записали в таблицу размерностью 10х4. Определить средний балл по каждому предмету. USES Crt; VAR E:ARRAY[0..10,0..4] OF INTEGER; I,J:BYTE; S:INTEGER; SB:REAL; A:STRING[16]; BEGIN ClrScr; WriteLn; { Заполнение таблицы } FOR I:=1 TO 10 DO Begin WriteLn(' Введите оценки ',I,' учащегося'); FOR J:=1 TO 4 DO Begin CASE J OF 1: A:=' Математика - '; 2: A:=' Физика - '; 3: A:=' Химия - '; 4: A:=' Информатика - '; End; Write(A); ReadLn(E[I,J]); End; End; WriteLn; { Подсчет среднего балла по каждому предмету. Циклы меняются местами.' } FOR J:=1 TO 4 DO Begin S:=0; FOR I:=1 TO 10 DO S:=S+E[I,J]; SB:=S/10; CASE J OF 1: A:=' математике - '; 2: A:=' физике - '; 3: A:=' химии - '; 4: A:=' информатике - '; End; WriteLn(' Средний балл по ',A,' = ',SB:4:1); End; END. 2 Алгоритмы формирования одномерного массива 1. Дан двумерный массив размерностью 5х6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого соответственно равен сумме элементов строк. Оба массива вывести на экран. USES Crt; VAR H:ARRAY[0..5,0..6] OF INTEGER; K:ARRAY[0..5] OF INTEGER; I,J:BYTE; S:INTEGER; BEGIN ClrScr; Randomize; WriteLn(' Значения двумерного массива'); FOR I:=1 TO 5 DO Begin FOR J:=1 TO 6 DO Begin H[I,J]:=Random(23); Write(H[I,J]:3); End; WriteLn; End; WriteLn; { Нахождение суммы элементов строк и заполнение одномерного массива } WriteLn(' Значения одномерного массива'); FOR I:=1 TO 5 DO Begin S:=0; FOR J:=1 TO 6 DO S:=S+H[I,J]; K[I]:=S; Write(K[I]:4); End; END. 2. Дана квадратная матрица порядка n, заполненная целыми числами. Получить одномерный массив, элементами которого являются первый положительный элемент соответствующей строки матрицы. USES Crt; LABEL M1; CONST N=5; VAR H:ARRAY[0..N,0..N] OF INTEGER; B:ARRAY[0..N] OF INTEGER; I,J:BYTE; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов двумерного массива'); WriteLn; FOR I:=1 TO N DO Begin FOR J:=1 TO N DO Begin H[I,J]:=Random(25)-10; Write(H[I,J]:3); End; WriteLn; End; WriteLn; WriteLn(' Значения первых положительных элементов соответствующих строк'); WriteLn; FOR I:=1 TO N DO Begin FOR J:=1 TO N DO IF H[I,J]>0 THEN Begin B[I]:=H[I,J]; GOTO M1; End; M1: Write(B[I]:3); End; END. 3. Дан двумерный массив размерностью NхM, заполненная целыми числами. Получить одномерный массив, элементами которого являются сумма первого и последнего элементов соответствующих строк двумерного массива. USES Crt; CONST N=5; M=7; VAR A:ARRAY[0..N,0..M] OF INTEGER; B:ARRAY[0..N] OF INTEGER; I,J:BYTE; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); WriteLn; FOR I:=1 TO N DO Begin FOR J:=1 TO M DO Begin A[I,J]:=Random(30); Write(A[I,J]:3); End; WriteLn; End; WriteLn; WriteLn(' Cумма первого и последнего элементов соответствующих строк'); WriteLn; FOR I:=1 TO N DO Begin B[I]:=A[I,1]+A[I,M]; Write(B[I]:3); End; END. 4. Дан двумерный массив размерностью 5х6, заполненный целыми числами. Сформировать одномерный массив каждый элемент которого равен произведению четных положительных элементов соответствующего столбца. USES Crt; VAR M:ARRAY[0..5,0..6] OF INTEGER; F:ARRAY[0..6] OF INTEGER; I,J:BYTE; P:LongInt; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO 5 DO Begin FOR J:=1 TO 6 DO Begin M[I,J]:=Random(20)-5; Write(M[I,J]:3); End; WriteLn; End; WriteLn; { Формирование одномерного массива} WriteLn(' Значения элементов одномерного массива'); FOR J:=1 TO 6 DO Begin P:=1; FOR I:=1 TO 5 DO IF (M[I,J]>0) AND (M[I,J] mod 2 =0) THEN P:=P*M[I,J]; IF P=1 THEN F[J]:=0 ELSE F[J]:=P; Write(F[J]:4); End; END. Примеры для самостоятельного решения: 1. Дан двумерный массив размерностью 6х5, заполненный целыми числами, введенными с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен первому четному элементу соответствующего столбца, если такого нет, то равен нулю. 2. Дан двумерный массив размерностью 5х6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен произведению четных положительных элементов соответствующего столбца. 3. Дана квадратная матрица размерностью NхN, заполненная целыми числами и величина А. Сформировать одномерный массив, каждый элемент которого равен элементу, расположенному на главной диагонали , умноженному на величину А . 4. Дан двумерный массив размерностью 6х8, заполненный целыми числами, введенными с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен количеству элементов соответствующих строк матрицы, значения которых находятся в интервале( -2, 10). 3 Алгоритмы нахождения наибольшего и наименьшего элементов двумерного массива 1. В соревнованиях по плаванию принимали участие 5 спортсменов. Соревнования состояли из 3 заплывов. Результаты заплывов записали в таблицу размерностью 3х5. Получить одномерный массив размером 3, элементами которого будут лучшие результаты в каждом из заплывов. USES Crt; VAR RZ:ARRAY[0..3,0..5] OF INTEGER; LR:ARRAY[0..3] OF INTEGER; I,J:BYTE; BEGIN ClrScr; WriteLn; { Заполнение таблицы } FOR I:=1 TO 3 DO Begin WriteLn(' Введите результаты ',I,' заплыва'); FOR J:=1 TO 5 DO Begin Write(J,' участник - '); ReadLn(RZ[I,J]); End; End; WriteLn; { Определение лучшего результата в каждом из заплывов } FOR I:=1 TO 3 DO Begin LR[I]:=RZ[I,1]; FOR J:=2 TO 5 DO IF RZ[I,J]<LR[I] THEN LR[I]:=RZ[I,J]; WriteLn(' Лучший результат ',I,' заплыва = ',LR[I]); End; END. 2. Дан двумерный массив размерностью 5х6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен наибольшему по модулю элементу соответствующего столбца. USES Crt; VAR M:ARRAY[0..5,0..6] OF INTEGER; MAX:ARRAY[0..6] OF INTEGER; I,J:BYTE; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO 5 DO Begin FOR J:=1 TO 6 DO Begin M[I,J]:=Random(20)-8; Write(M[I,J]:3); End; WriteLn; End; WriteLn; { Формирование одномерного массива} WriteLn(' Значения элементов одномерного массива'); FOR J:=1 TO 6 DO Begin MAX[J]:=ABS(M[1,J]); FOR I:=2 TO 5 DO IF ABS(M[I,J]) > MAX[J] THEN MAX[J]:=ABS(M[I,J]); Write(MAX[J]:3); End; END. 3. Дан двумерный массив размерностью NхM, заполненный случайным образом. Определить, есть ли в данном массиве строка, в которой имеется два элемента массива, имеющие наибольшее значение. USES Crt; CONST N=6; M=8; VAR A:ARRAY[0..N,0..M] OF INTEGER; I,J,K,FL:BYTE; MAX:INTEGER; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO N DO Begin FOR J:=1 TO M DO Begin A[I,J]:=Random(20); Write(A[I,J]:3); End; WriteLn; End; WriteLn; { Нахождение наибольшего значения } MAX:=A[1,1]; FOR I:=1 TO N DO FOR J:=1 TO M DO IF A[I,J]>MAX THEN MAX:=A[I,J]; WriteLn(' Максимальное значение = ',MAX); { Нахождение строки, в которой два элемента имеют наибольшее значение } FL:=0; FOR I:=1 TO N DO Begin K:=0; FOR J:=1 TO M DO IF A[I,J]=MAX THEN Inc(K); IF K=2 THEN Begin WriteLn('В ',I,' строке два элемента имеют наибольшее значение'); FL:=1; End; End; IF FL=0 THEN WriteLn(' Нет строк, в которых два элемента имеют наибольшее значение'); END. Примеры для самостоятельного решения: 1. Дан двумерный массив размерностью 5x7, заполненный случайным образом. Найти наименьший и наибольший элементы двумерного массива, поменять их местами. 2. Дан двумерный массив размерностью NxM, заполненный случайным образом. Получить одномерный массив, элементами которого являются сумма наименьшего и наибольшего элементов соответственной строки двумерного массива. | |
Просмотров: 11522 | Комментарии: 11 | | |