Паскаль. Сборник задач по программированию на языке Паскаль Автор Селезнева Наталья Николаевна, учитель информатики и икт моу
Скачать 350.82 Kb.
|
4.1.5 Алгоритмы сортировки числового массива Задача 1. Отсортировать числовой массив. Первый способ. USES Crt; CONST N=30; VAR A:ARRAY[0..N] OF INTEGER; I,J: BYTE; PP:INTEGER; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов массива '); FOR I:=1 TO N DO Begin A[I]:=Random(50); Write(A[I]:4); End; WriteLn; { Сортировка массива } FOR I:=2 TO N DO FOR J:=N DOWNTO I DO IF A[J-1]>A[J] THEN Begin PP:=A[J]; A[J]:=A[J-1]; A[J-1]:=PP; End; Write Ln(' Отсортированный массив '); FOR I:=1 TO N DO 23 Write(A[I]:4); END. Задача 2. Отсортировать числовой массив. Второй способ. USES Crt; CONST N=30; VAR A:ARRAY[0..N] OF INTEGER; I,J: BYTE; PP:INTEGER; BEGIN ClrScr; Randomize; WriteLn(' Значения элементов массива '); FOR I:=1 TO N DO Begin A[I]:=Random(50); Write(A[I]:4); End; WriteLn; { Сортировка массива } FOR I:=1 TO N-1 DO FOR J:=I+1 TO N DO IF A[I]>A[J] THEN Begin PP:=A[I]; A[I]:=A[J]; A[J]:=PP; End; WriteLn(' Отсортированный массив '); FOR I:=1 TO N DO Write(A[I]:4); END. Практические задания Даны два упорядоченных массива целых чисел М1 и М2. Слить их в упорядоченный массив. Рассмотреть случаи, когда массивы М1 и М2 упорядочены одинаково и когда по-разному. 4.2 Двумерные массивы 4.2.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 Wri teLn(' Введите показания за ',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 24 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. Задача 3. Поменять местами значения К-ого и Р-ого столбцов матрицы В, размерностью M хM, заполненную случайным образом. USES Crt; LABEL M1; CONST M=8; VAR A:ARRAY[0..M,0..M] OF INTEGER; I,J,K,P:BYTE; PP:INTEGER; BEGIN ClrScr; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } 25 WriteLn(' Значения двумерного массива'); FOR I:=1 TO M DO Begin FOR J:=1 TO M DO Begin A[I,J]:=Random(23); Write(A[I,J]:3); End; WriteLn; End; WriteLn; WriteLn(' Введите номера столбцов, которые необходимо поменять'); WriteLn(' Их значения не должны превышать ',M); M1:ReadLn(K,P); IF (K>M) OR (P>M) THEN GOTO M1; { Перестановка значений введенных столбцов } FOR I:=1 TO M DO Begin PP:=A[I,K]; A[I,K]:=A[I,P]; A[I,P]:=PP; End; WriteLn(' Измененный двумерный массив'); FOR I:=1 TO M DO Begin FOR J:=1 TO M DO Begin Write(A[I,J]:3); End; WriteLn; End; END. Задача 4. Дан двумерный массив размерностью 6х3, заполненный целыми числами. Подсчитать количество строк, в которых первый элемент строки меньше нуля. USES Crt; VAR M:ARRAY[0..6,0..3] OF INTEGER; I,J,K:BYTE; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения двумерного массива'); FOR I:=1 TO 6 DO Begin FOR J:=1 TO 3 DO Begin M[I,J]:=Random(23)-10; Write(M[I,J]:3); End; WriteLn; End; WriteLn; K:=0; { Подсчет количества строк, в которых первый элемент строки меньше 0 } FOR I:=1 TO 6 DO IF M[I,1]<0 THEN Inc(K); Write(' Количество строк, в которых первый элемент строки меньше 0 = ',K); END. Задача 5. Дан двумерный массив размерностью Nх2N, заполненный целыми числами. Найти среднее арифметическое элементов, имеющие четные номера строк. USES Crt; CONST N=5; VAR H:ARRAY[0..N,0..2*N] OF INTEGER; I,J,K:BYTE; S:LongInt; SA:REAL; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); WriteLn; FOR I:=1 TO N DO Begin 26 FOR J:=1 TO 2*N DO Begin H[I,J]:=Random(23); Write(H[I,J]:3); End; WriteLn; End; WriteLn; { Нахождение суммы значений элементов, имеющих четные номера строк } I:=2; K:=0; WHILE I<=N DO Begin FOR J:=1 TO 2*N DO Begin S:=S+H[I,J]; Inc(K); End; I:=I+2; End; SA:=S/K; Wr ite(' Среднее арифметическое элементов, имеющих четные номера строк =',SA:4:1); END. Задача 6. Дан двумерный массив размерностью NхM, заполненный случайным образом. Определить, есть ли в данном массиве столбец, в котором равное количество положительных и отрицательных элементов. USES Crt; CONST N=6; M=8; VAR A:ARRAY[0..N,0..M] OF INTEGER; I,J,KO,KP,FL:BYTE; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO N DO Begin FOR J:=1 TO M DO Begin A[I,J]:=Random(20)-10; Write(A[I,J]:3); End; WriteLn; End; WriteLn; FOR J:=1 TO M DO Begin KP:=0; KO:=0; FOR I:=1 TO N DO Begin IF A[I,J]>0 THEN Inc(KP); IF A[I,J]<0 THEN Inc(KO); End; IF KP=KO THEN Begin WriteLn(' В ',J,' столбце равное количество положительных и отрицательных элементов'); FL:=1; End; End; IF FL=0 T HEN WriteLn(' Нет столбцов, в которых равное количество положительных и отрицательных элементов'); END. Задача 7. Дан двумерный массив размерностью NхM, заполненный случайным образом. Определить, есть ли в данном массиве строка, в которой ровно два отрицательных элемента. USES Crt; CONST N=6; M=8; VAR A:ARRAY[0..N,0..M] OF INTEGER; I,J,K,FL:BYTE; BEGIN ClrScr; Randomize; 27 { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO N DO Begin FOR J:=1 TO M DO Begin A[I,J]:=Random(40)-15; Write(A[I,J]:3); End; WriteLn; End; WriteLn; FL:=0; { Определение строк, в которых ровно два отрицательных элемента } FOR I:=1 TO N DO Begin K:=0; FOR J:=1 TO M DO IF A[I,J]<0 THEN Inc(K); IF K=2 THEN Begin WriteLn(' В ',I,' строке ровно два отрицательных элемента');FL:=1; End; End; IF FL=0 THEN Writeln(' Нет строк, в которых ровно два отрицательных элемента'); END. Задача 8. Дан двумерный массив размерностью 4х6 и величина N. Подсчитать количество строк, в которых есть элемент равный N. USES Crt; LABEL M1; VAR M:ARRAY[0..4,0..6] OF INTEGER; I,J,K:BYTE; N:INTEGER; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO 4 DO Begin FOR J:=1 TO 6 DO Begin M[I,J]:=Random(50); Write(M[I,J]:3); End; WriteLn; End; WriteLn; Write(' Введите значение величины N '); ReadLn(N); K:=0; { Нахождение строк, в которых имеется величина N } FOR I:=1 TO 4 DO Begin FOR J:=1 TO 6 DO IF M[I,J]=N THEN Begin K:=K+1; GOTO M1; End; M1: End; WriteLn(' Количество строк, в которых есть элемент равный ',N,' = ',K); END. Практические задания 1. Найти произведение элементов К-го и Р-го столбцов квадратной матрицы, размерностью 6х6. 2. Дан двумерный массив размерностью 5х3, заполненный целыми числами. Найти произведение элементов нечетных строк матрицы. 3. Дан двумерный массив размерностью 5х6, заполненный целыми числами и величина К. Найти количество элементов, равных К и их сумму. 4. Дан двумерный массив размерностью NхM, заполненный целыми числами. Определить, есть ли в данном массиве столбец, в котором имеются одинаковые элементы. 28 4.2.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. 29 Задача 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. Задача 5. Дан двумерный массив размерностью 4х6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен количеству элементов соответствующей строки, больших данного числа N. 30 USES Crt; VAR A:ARRAY[0..4,0..6] OF INTEGER; G:ARRAY[0..6] OF INTEGER; I,J,K:BYTE; N:INTEGER; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO 4 DO Begin FOR J:=1 TO 6 DO Begin A[I,J]:=Random(45); Write(A[I,J]:3); End; WriteLn; End; WriteLn; Write(' Введите значение числа '); ReadLn(N); { Формирование одномерного массива} WriteLn(' Значения элементов одномерного массива'); FOR I:=1 TO 4 DO Begin K:=0; FOR J:=1 TO 6 DO IF A[I,J] > N THEN K:=K+1; G[I]:=K; Write(G[I]:2); End; END. Задача 6. Дан двумерный массив размерностью 4х5, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен количеству отрицательных элементов, кратных 3 или 5, соответствующей строки. USES Crt; VAR A:ARRAY[0..4,0..5] OF INTEGER; G:ARRAY[0..6] OF INTEGER; I,J,K:BYTE; BEGIN ClrScr; Randomize; { Заполнение двумерного массива случайным образом и вывод в виде прямоугольной матрицы } WriteLn(' Значения элементов двумерного массива'); FOR I:=1 TO 4 DO Begin FOR J:=1 TO 5 DO Begin A[I,J]:=Random(45)-20; Write(A[I,J]:3); End; WriteLn; End; WriteLn; { Формирование одномерного массива} WriteLn(' Значения элементов одномерного массива'); FOR I:=1 TO 4 DO Begin K:=0; FOR J:=1 TO 5 DO IF (A[I,J] < 0) AND ((A[I,J] mod 3=0) OR (A[I,J] mod 5 =0)) THEN K:=K+1; G[I]:=K; Write(G[I]:2); End; END. Практические задания 31 1. Дан двумерный массив размерностью 6х5, заполненный целыми числами, введенными с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен первому четному элементу соответствующего столбца, если такого нет, то равен нулю. 2. Дан двумерный массив размерностью 5х6, заполненный целыми числами. Сформировать одномерный массив, каждый элемент которого равен произведению четных положительных элементов соответствующего столбца. 3. Дана квадратная матрица размерностью NхN, заполненная целыми числами и величина А. Сформировать одномерный массив, каждый элемент которого равен элементу, расположенному на главной диагонали , умноженному на величину А . 4. Дан двумерный массив размерностью 6х8, заполненный целыми числами, введенными с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен количеству элементов соответствующих строк матрицы, значения которых находятся в интервале( -2, 10). 4.2.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] 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 32 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 Writ eLn(' Нет строк, в которых два элемента имеют наибольшее значение'); END. Практические задания 1. Дан двумерный массив размерностью 5x7, заполненный случайным образом. Найти наименьший и наибольший элементы двумерного массива, поменять их местами. |