Очень часто значения элементов массива вводятся с клавиатуры. Этот способ задания информации слишком трудоемок при работе с массивами больших размеров. Для отладки широкого класса алгоритмов такой ввод информации должен быть заменен на формирование элементов массива случайным образом. Для этого используют встроенные средства Турбо Паскаля, процедуру Randomize и функцию Random. Вы уже сталкивались с этими средствами. Сегодня же наша задача создать программы различного ввода элементов в массив и вывода элементов на экран.
Приведем пример формирования массива случайным образом.
Programm InsertMas1;
const n=5;m=5; { количество строк и столбцов равно 5}
Var
i, j : integer;
x:array[1..n,1..m] of byte; {описание мсива}
Begin
Randomize;
for i := 1 to n do {пробегая последовательно строки массива}
for j := 1 to m do {просмотрим каждую ее ячейку текущего столбца}
X[i, j]:= Random(50); {и запишем туда случайное число, которое сформирует компьютер в диапазоне [0..49]}
End;
.
Рассмотрим вывод элементов массива на экран. Для того, чтобы наш массив при выводе выглядел удобно в виде таблицы, поставим при переходе к новой строке пустой оператор writeln и применим формат вывода элементов на экран (:5).
for i := 1 to n do {пробегая последовательно строки и столбцы массива}
begin
for j := 1 to m do
write(X[i, j]:5); {выведем элемент массива на экран, выделив ему 5 знакомест}
writeln; {переход на новую строку}
end;
Практическое задание. Наберите программу-шаблон для работы с двумерными массивами. Как вы уже знаете из предыдущей темы, она должна содержать ввод и вывод элементов заданного массива. Основной раздел операторов должен содержать диалог с пользователем и защиту программы от ввода недопустимых значений для количества строк и столбцов. Сохраните файл в соответствующем каталоге на своей дискете, а листинг решенной задачи покажите учителю для оценки.
Рассмотрите следующую задачу.
Задача. Дана таблица действительных чисел. Сосчитайте сумму всех чисел в таблице.
Procedure Summa;
Var
i, j : integer;
Summa : integer;
x:array[1..n,1..m] of byte;
Begin
S:= 0;
for i := 1 to n do
for j := 1 to m do
S := S+A[i, j];
End.
Обратите внимание, что внутри цикла со счетчиком i организован цикл со счетчиком j. В результате суммируются в начале числа 1-й строки (i=1, при j=1, 2, ..., m), затем суммируются числа 2-й строки (i=2, при j=1, 2, ..., m) и т. д.
В данной программе в теле одного цикла содержится другой цикл. Такие циклы, как Вы уже знаете, называются вложенными. Причем цикл со счетчиком i является внешним, а цикл со счетчиком j - внутренним. Не забывайте основное правило при написании вложенных циклов: последний оператор внутреннего цикла должен либо предшествовать, либо совпадать с последним оператором внешнего цикла. Вложенные циклы напоминают матрешек, вложенных одна в другую.
Задание. Откройте файл программы-шаблона, сохраните его под другим (соответствующем задаче) именем и дополните текст программы нахождением суммы элементов. Внесите в программу необходимые операторы и комментарии. Покажите учителю файл программы и листинг для оценки.
Задание. Ниже приведен фрагмент решения некоторой задачи. Внимательно рассмотрев решение, сформулируйте решаемую задачу и оформите по всем правилам, применив знания текущего занятия. Файл и листинг решенной задачи покажите учителю для оценки.
. . .
for i := 1 to N do
Begin
M := a[i,1];
S := a[i, 1];
for j := 2 to N do
begin
if M>a[i, j]
Then
M := a[i, j];
S := S+a[i, j];
end;
writeln (i:7, M:6, S:6:3);
End;
. . .
Домашнее задание
1. Что такое двумерный массив?
2. как его описать?
3. Как заполнить двумерный массив?. Приведите примеры заполнения.
4. Как вывести на экран двумерный массив?
Задачи
1. Найти сумму четных элементов и количество положительных элементов двумерного массива размерностью 3х3.
2. Найти номера всех максимальных элементов в двумерном массиве размерностью 5х4..
3. Сформировать таблицу данных о
Читать $9.3 стр.205-210
Задачи стр.216-219 15,11,16,19
Тема урока №11 «.Двумерный массив. Решение задач».
Цель урока. Отработать навыки решения задач с применением двумерного массива.
Ход урока.
Разбор домашнего задания.
Вопросы
1. Что такое двумерный массив?
2. Как его описать?
3. Как заполнить двумерный массив? Приведите примеры заполнения двумерного массива различными способами.
4. Как вывести двумерный массив?
Новый материал
Решение задач с использование двумерных массивов очень похоже на решение задач с одномерными массивами. Разберем несколько из них.
Задача №1.
В следующей таблице приведены итоги шахматного турнира:
0 | 1/2 | 1 | 0 | 1 | 1/2 | 0 | 0 |
1/2 | 0 | 1/2 | 0 | 1 | 0 | 0 | 1 |
0 | 1/2 | 0 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1/2 | 1 | 0 | 1 |
0 | 0 | 1 | 1/2 | 0 | 1/2 | 1/2 | 1/2 |
1/2 | 1 | 0 | 0 | 1/2 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 1/2 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 1/2 | 0 | 0 |
Сколько очков набрал победитель турнира?
Составить программу для решения данной задачи.
Дано таблица квадратная 8 строк и 8 столбцов назовем её А
элементы таблицы вещественные числа real
ввод с клавиатуры
Найти победителя количество очков – одно число – K real
Решения.
Мы разбирали данную задачу на первом уроке, изучения темы. И помним, что победитель тот, кто набрал больше всех очков. Необходимо найти суммы очков по строчкам и среди них максимум.
Запишем программу.
Programm SHACH;
const n=8;m=8; { количество строк и столбцов равно 8}
Var
maxn, i, j : integer;
a:array[1..n,1..m] of real; {описание массива очков}
s: array[1..n] of real; {описание массива сумм по строчкам}
max:real;
Begin
for i := 1 to n do {пробегая последовательно строки массива}
begin
write(‘Введите очки игрока’);
for j := 1 to m do {просмотрим каждую ее ячейку текущего столбца}
readln(A[i, j]); {и запишем туда введенное значение}
End;
. for i := 1 to n do {пробегая последовательно строки и столбцы массива}
begin
for j := 1 to m do
write(a[i, j]:5:2); {выведем элемент массива на экран, выделив ему 5 знакомест }
writeln; {переход на новую строку}
end;
for i := 1 to n do{пробегая последовательно строки массива}
begin
S[i]:= 0;{обнуляем сумму для каждой строки}
for j := 1 to m do{просмотрим каждую ее ячейку текущего столбца}
S[i] := S[i]+A[i, j];{находим сумму элементов строки}
end;
max:=s[1]; {максимум очков приравняем первой сумме}
maxn:=1; {номер победителя приравняем первому номеру}
for i:=1 to n do
if max<s[i] then {сравнение сумм}
begin
max:=s[i];
maxn:=I;
end;
Writeln(‘победитель набрал’, max:5:2,’очков’);{вывод результата}
write(‘его номер в таблице’,maxn);
end.
Задача №2.
Определить, является данная квадратная таблица симметричной относительно своей главной диагонали.
Элементы, которые удовлетворяют условию i=j, т. е. номер строки равен номеру столбца, называют элементами главной диагонали. Если i>j ‑то под диагональю расположены элементы, если j>i – то над диагональю.
Симметричной является таблица тогда, когда для всех i=1…n и j=1……n, i>j выполняется равенство a[I, j]=a[j, i]
Programm SIMM;
const n=4;m=4; { количество строк и столбцов равно 8}
Var
i, j : integer;
a:array[1..n,1..m] of real; {описание массива очков}
t:booleanl; {логическая переменная}
Begin
for i := 1 to n do {пробегая последовательно строки массива}
begin
write(‘Введите очки игрока’);
for j := 1 to m do {просмотрим каждую ее ячейку текущего столбца}
readln(A[i, j]); {и запишем туда введенное значение}
End;
t:=true;{предположим таблица симметрична}
i:=2;
while t and (i<n) do{}
begin
j:=1;
while (j, i) and (a[I, j]) do
j:=j+1;
t:=(j=i);
i:=i+1;
end;
write(‘То что таблица симметрична’,t);
end.
Таким образом, если встретится хоnя бы одна пара, что соответствующие элементы не будут равны, то будет равно «ложь»(FALSE).
При выполнении инженерных и математических расчетов часто используются переменные более чем с двумя индексами. При решении задач на ЭВМ такие переменные представляются как компоненты соответственно трех-, четырехмерных массивов и т. д.
Однако описание массива в виде многомерной структуры делается лишь из соображений удобства программирования как результат стремления наиболее точно воспроизвести в программе объективно существующие связи между элементами данных решаемой задачи. Что же касается образа массива в памяти ЭВМ, то как одномерные, так и многомерные массивы хранятся в виде линейной последовательности своих компонент, и принципиальной разницы между одномерными и многомерными массивами в памяти ЭВМ нет. Однако порядок, в котором запоминаются элементы многомерных массивов, важно себе представлять. В большинстве алгоритмических языков реализуется общее правило, устанавливающее порядок хранения в памяти элементов массивов: элементы многомерных массивов хранятся в памяти в последовательности, соответствующей более частому изменению младших индексов.
Задача 3. Заполнить матрицу порядка n по следующему образцу:
1 | 2 | 3 | ... | n-2 | n-1 | n |
2 | 1 | 2 | ... | n-3 | n-2 | n-1 |
3 | 2 | 1 | ... | n-4 | n-3 | n-2 |
... | ... | ... | ... | ... | ... | ... |
n-1 | n-2 | n-3 | ... | 2 | 1 | 2 |
n | n-1 | n-2 | ... | 3 | 2 | 1 |
Program Massiv12;
Var I, J, K, N : Integer; A : Array [1..10, 1..10] Of Integer;
Begin
Write('Введите порядок матрицы: '); ReadLn(N);
For I := 1 To N Do
For J := I To N Do
Begin
A[I, J] := J - I + 1; A[J, I] := A[I, J];
End;
For I := 1 To N Do
Begin
WriteLn;
For J := 1 To N Do Write(A[I, J]:4);
End;
End.
Задача 4. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали.
Program Obmen;
Var N, I, J, Max, Ind, Vsp : Integer;A : Array [1..15, 1..15] Of Integer;
Begin
WRITE('Введите количество элементов в массиве: '); READLN(N);
FOR I := 1 TO N DO
FOR J := 1 TO N DO
Begin
WRITE('A[', I, ',', J, '] '); READLN(A[I, J])
End;
FOR I := 1 TO N DO
Begin
Max := A[I, 1]; Ind := 1;
FOR J := 2 TO N DO
IF A[I, J] > Max THEN
Begin
Max := A[I, J]; Ind := J
End;
Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp
End;
FOR I := 1 TO N DO
Begin
WriteLn;
FOR J := 1 TO N Do Write(A[I, J] : 3);
End; WriteLn
End.
Контрольные вопросы и задания
1. Что такое массив?
2. Почему массив является структурированным типом данных?
3. Что такое размерность массива? Существуют ли ограничения на размерность массива?
4. Какого типа могут быть элементы массива?
5. Какого типа могут быть индексы элементов массива?
6. Какие простые типы данных относятся к порядковым?
7. Какими способами может быть заполнен массив? Приведите примеры.
8. Как определить минимальный объём памяти, отводимой под массив?
9. Какие действия выполняют обычно над элементами массива?
10. Может ли массив быть элементом массива?
11. В каком случае массивы совместны по присваиванию?
12. Пусть элементами массива A (a[1], a[2], a[3], a[4]) являются соответственно x, -x, x2, -x2. Чему будет равно значение выражения a[-a[a[3]-2]]+a[-a[a[3]]] при x=2?
13. Можно ли выполнять обход двумерного массива, организовав внешний цикл по столбцам, а внутренний — по строкам?
14. Точно и однозначно сформулировать условие задачи, решение которой приведено в данной программе:
Program Kr_N_4;
Const NMax = 50; Type Mass = Array[1..NMax,0..NMax-1] Of Real;
Var A : Mass; I, J, N : 0..NMax; C : Real;
Begin Write('Количество элементов массива N=? '); ReadLn(N);
For I := 1 To N Do
For J := 0 To N-1 Do
Begin Write('A[',I,',',J,']= '); Readln(A[I, J])End;
For I := 1 To N Do
For J := 0 To N-1 Do
Begin C := A[I, J];
A[I, J] := A[N-I+1,J];
A[N-I+1,J] := C
End;
For I := 1 To N Do
Begin For J := 0 To N-1 Do
Write(A[I, J]:5:2,' ');
WriteLn
End;
End.
15. Используются ли вложенные циклы, если совершается обход только главной диагонали квадратной матрицы?
Задачи для самостоятельного решения
2.1. Подсчитайте число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).
2.2. Заданные векторы X(N) и Y(N) преобразуйте по правилу: большее из xi и yi примите в качестве нового значения xi , а меньшее — в качестве нового значения yi .
2.3. Элементы заданного массива B(N) перепишите в новый массив A(N) в обратном порядке.
2.4. Из заданного вектора A(3N) получите вектор B(N), очередная компонента которого равна среднему арифметическому очередной тройки компонент вектора А.
2.5. В заданном массиве Х(N) замените нулями все отрицательные компоненты, непосредственно предшествующие его максимальной компоненте (первой по порядку, если их несколько).
2.6. Вычислите значения
а) sin x + sin2x + ... + sinnx ;
б) sin x + sin x2 + ... + sin xn ;
в) sin x + sin2x2 + ... + sinnxn;
г) sin x + sin sin x + ... + sin sin...sin x (n раз).
2.7Вычислите сумму квадратов всех элементов заданного массива X(N), за исключением элементов, кратных пяти.
2.8. Вычислите значения функции z = (a + b + ci ) / i, если a изменяется от 0 с шагом 1, b изменяется от 5 с шагом 1, ci является элементом массива C(N) . При этом a и b изменяются одновременно с i.
2.9. [ заданном массиве A(N) поменяйте местами наибольший и наименьший элементы.
2.10. В заданном массиве A(N) определите количество элементов, которые меньше заданного значения.
2.11. Осуществите циклический сдвиг компонент заданного вектора A(N) влево на одну позицию, то есть получите вектор А = (a2 , a3 , ..., aN , a1 ).
2.12. Осуществите циклический сдвиг компонент заданного вектора A(N) вправо на две позиции, то есть получите вектор A = (aN-1 , aN , a1 , a2 , ... , aN-2 ).
2.13Дан массив A(N). Получите массив B(N), i-й элемент которого равен среднему арифметическому первых i элементов массива А: bi = (a1 + a2 + ... + ai ) / i.
2.14. [Pascal | C | Basic] Вычислите значения многочленов:
P = an xn + an-1 xn-1 + ... + a1 x + a0 ;
Q = a0 xn + a1 xn-1 + ... + an-1 x + an,
используя формулу Горнера. Коэффициенты многочленов заданы в виде вектора A = (a0 , a1 , ... , an ).
2.15. [Pascal | C | Basic] Запишите подряд в массив A(N) элементы заданного массива В(2N), стоящие на чётных местах, а элементы, стоящие на нечетных местах, запишите в массив С(N).
2.16. [Pascal | C | Basic] Выведите на печать номера элементов заданного массива Y(N), удовлетворяющих условию 0 < yi < 1.
2.17. [Pascal | C | Basic] Выведите на печать номера точек, лежащих в круге радиусом R с центром в начале координат. Координаты точек заданы массивами X(N) и Y(N).
2.18. [Pascal | C | Basic] В заданном массиве A(N) вместо a1 запишите наибольший элемент массива, а вместо aN — наименьший элемент массива.
2.19. [Pascal | C | Basic] В заданном массиве A(N), все элементы которого попарно различны, найдите:
а) наибольший элемент из отрицательных;
б) наименьший элемент из положительных;
в) второй по величине элемент.
2.20. [Pascal | C | Basic] В заданном массиве A(N) определите число соседств:
а) двух положительных чисел;
б) двух чисел разного знака;
в) двух чисел одного знака, причем абсолютная величина первого числа должна быть больше второго числа;
г) чётного числа и нечётного c нечётным индексом.
2.21. [Pascal | C | Basic] В заданном массиве A(N) положительные элементы уменьшите вдвое, а отрицательные замените на значения их индексов.
2.22. [Pascal | C | Basic] В заданном массиве A(N) вычислите среднее геометрическое и среднее арифметическое значения для положительных элементов.
2.23. [Pascal | C | Basic] Вычислите P = 1 . 2 + 2 . 3 . 4 + 3 . 4 . 5 . 6 + ... + N . (N+1) . ... . 2N.
2.24. [Pascal | C | Basic] Образуйте массив B, состоящий из положительных элементов заданного массива A(N), больших пяти. Выведите на печать образованный массив и число его элементов.
2.25. [Pascal | C | Basic] Из заданных векторов X(N) и Y(N) получите вектор Z(2N ) c элементами (x1 , y1 , x2 , y2 , ..., xN , yN) .
2.26. [Pascal | C | Basic] Для заданного вектора X(2N ) вычислите Y = x1 - x2 + x3 - ... - x2N .
2.27. [Pascal | C | Basic] Дан вектор A(N). Найдите порядковый номер того из элементов, который наиболее близок к какому-нибудь целому числу (первому по порядку, если таких несколько).
2.28. [Pascal | C | Basic] Элементы заданного массива X = (x1 , x2, ...,xN ) переупорядочите следующим образом: X = (xN , xN-1 , ..., x1 ).
2.29. [Pascal | C | Basic] Для заданного набора коэффициентов a, b, c, d найдите наименьшее значение функции y = a x3 + b x2 + cx + d и значение аргумента, при котором оно получено. Значение х изменяется от 0 до 2 с шагом 0,2.
2.30.Дано натуральное N. Вычислите сумму тех элементов серии i 3 -3 . i . N + N, i = 1, 2, ..., N, которые являются удвоенными нечётными числами.
2.31* Сожмите заданный массив A(N) отбрасыванием нулевых элементов.
2.32. Дан массив A(2N). Постройте массивы с элементами, соответственно равными:
а) a1 , aN+1 , a2, aN+2 , ... , aN, a2N ;
б) a2N, a1 , a2N-1 , a2 , ... , aN+1 , aN .
2.33.] Дана матрица A(3, N), элементы которой положительны. Определите, какие из троек a1i , a2i , a3i (i = 1, ..., N) могут служить сторонами треугольника. Выведите массив b1 , ... , bN , состоящий из нулей и единиц. Если тройка a1i , a2i , a3i может служить сторонами треугольника, то bi = 1, если нет, то bi = 0.
2.34. У кассы аэрофлота выстроилась очередь из N человек. Время обслуживания кассиром i-го клиента равно Ti (i = 1, ..., N).
а) Определите время пребывания в очереди каждого клиента;
б) Укажите номер клиента, для обслуживания которого кассиру потребовалось больше всего время.
2.35.В соревнованиях по фигурному катанию N судей независимо выставляют оценки спортсмену. Затем из объявленных оценок удаляют самую высокую (одну, если самую высокую оценку выставили несколько судей). Аналогично поступают с самой низкой оценкой. Для оставшихся оценок вычисляется среднее арифметическое, которое и становится зачетной оценкой. По заданным оценкам судей определите зачетную оценку спортсмена.
2.36.Несколько однотипных спасательных катеров, находящихся в акватории в точках с координатами (xi , yi ), i = 1, 2, ..., N, получили сигнал SOS от судна, находящегося в той же акватории в точке с координатами (x0 , y0 ). Определите, какой из катеров быстрей других сможет оказать помощь?
2.37. [Pascal | C | Basic] По данным о расписании движения пригородных поездов определите значение наибольшего интервала времени между отправлениями поездов.
2.38. [Pascal | C | Basic] Учитель объявил результаты контрольной работы. Определите пpоцентное содеpжание выставленных им "пятерок", "четверок", "троек" и "двоек".
2.39. [Pascal | C | Basic] Фунт стерлингов, денежная единица Великобритании, до 1971 г. равнялся 20 шиллингам или 240 пенсам. С проходящего корабля в порту Ливерпуля сошли N путешественников, каждый из которых имел по одной десятифунтовой купюре. Они купили сувениры на сумму p1 , p2 , ..., pn, соответственно. Сколько фунтов, шиллингов и пенсов сдачи получил каждый из путешественников?
2.40. [Pascal | C | Basic] О каждом учащемся класса известны его пол, год рождения, рост и вес. Определите, сколько в классе мальчиков и сколько девочек. Найдите средний возраст мальчиков и средний возраст девочек. Определите, верно ли, что самый высокий мальчик весит больше всех в классе, а самая маленькая девочка является самой юной среди девочек.
Литература
1. Б TURBO PASCAL для школьников. Финансы и статистика,1999г.
2. Угринович и информационные технологии(10-11 кл.) ,2003
3. Д, , Практикум по информатике и информационным технологиям Лаборатория Базовых Знаний. 2002.
4. , , Информатика 7-9 Дрофа,200г.
5. Г. Григас Начала программирования Просвещение,1987г.
6. Табличные величины. Информатика, 1996г. №19
7. , , Практикум по ТурбоПаскалю Информатика 1998г.№10-11
8. А. А. зубрилин Элементы занимательности при изложении темы «Массивы» Информатика и образование,2005г.№6-8
9. Малисова по теме «Массивы» Информатика и образование ,2005г.№7
10. Шауцкова . 10-11 классы. - М.: Просвещение, 2003
11. и др. Основы информатики и вычислительной техники Просвещение,1997г.
12. , Хеннер . Задачник-практикум в 2т. - М.: Лаборатория базовых знаний, 2001
13. Учимся программировать PASCAL7.0 ДиалогМИФИ,1998г.
14. В TUROPASCFL7.0 начальный курс Нолидж,1999г.
15. Основы программирования на языке Паскаль Финансы и статистика,1997г.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


