Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование на паскале2.doc
Скачиваний:
145
Добавлен:
31.03.2015
Размер:
935.94 Кб
Скачать

1.5.2. Примеры программ с массивами

Пример 1. Дан массиваиз 20 элементов. Вычислить сумму положительных и количество неположительных элементов массива. Начиная с этого примера, с целью улучшения наглядности, характеристики данных будем представлять в виде таблицы:

Таблица 6. Состав данных примера 1.

Имя

Смысл

Тип13

Структура

Исходные данные

а

заданный массив

вещественный

одномерный массив из 20 элементов

Выходные данные

s

сумма положительных элементов массива

вещественный

простая переменная

k

количество неположительных элементов

целый

простая переменная

Промежуточные данные

i

счетчик элементов массива

целый

простая переменная

Алгоритм состоит из ввода исходных данных, цикла, в котором накапливаются sиk, и вывода результатов. Цикл управляется переменнойi, которая изменяется от 0 до 19. Перед циклом накапливаемым переменным присваиваются начальные значения (нулевые, так как прибавление нуля не изменяет сумму). Основной частью тела цикла является ветвление. Блок-схема алгоритма приведена на рис. 9. Далее приведена Паскаль-программа.

program primer_1_5_2;

Var a:array[1..20] of real; s:real; k,i:integer;

Begin

writeln('Введите массив из 20 элементов');

{Далее цикл для поэлементного ввода массива}

for i:=1 to 20 do

read(a[i]);

readln; {Далее алгоритм по блок-схеме}

s:=0; k:=0;

for i:=1 to 20 do

if a[i]>0 then

s:=s+a[i]

else

k:=k+1;

writeln(' s=',s,' k=',k);

readln{задержка экрана с результатами до нажатия ENTER}

End.

Пример 2. Дан массиваизNэлементов (N10). Вычислить произведение элементов массива, меньших заданного значенияс.

Таблица 7. Состав данных примера 2.

Имя

Смысл

Тип

Структура

Исходные данные

с

заданное значение

веществ.

простая переменная

N

число элементов массива

целый

простая переменная

а

заданный массив

веществ.

одномерный массив из 10 элементов

Выходные данные

р

произведение элементов массива, удовлетворяющих условию

веществ.

простая переменная

Промежуточные данные

i

счетчик элементов массива

целый

простая переменная

k

количество элементов, удовлетворяющих условию

целый

простая переменная

Обратите внимание, что структура массива апредполагает отведение пода десяти ячеек памяти. В программе описывается массиваиздесятиэлементов, a используются лишь первые N них. Пользователь данной программы должен помнить, что вводимое значение числа элементов массива должно находиться в интервале 1N10. Проверка корректности введенного значения N, несомненно, улучшила бы надежность программы; с целью упрощения программы мы не делаем такой проверки. Для устранения необходимости распределения памяти под массив «по максимуму» в любом алгоритмическом языке , требующем компиляции, следует использовать операторы динамического распределения памяти, но этот материал выходит за границы данного пособия.

Блок-схема алгоритма приведена на рис. 10. Алгоритм не сильно отличается от рассмотренного в примере 1. Остановимся на различиях. Для накапливания произведения необходимо перед циклом переменной р присвоить начальное значение 1 (умножение на 1 не изменяет произведение). Переменнаяkнужна для выявления ситуации отсутствия элементов, меньших заданного значения; развилка после цикла позволяет обнаружить эту ситуацию.

Далее приведена программа.

program primer2_1_5_2;

Type mas=array[1..10] of real;

Var a:mas;{можно обойтись без раздела типов,

используя описание a:array[1..10] of real}

c,p:real; N,k,i:integer;

Begin

writeln ( 'Введите c, N'); readln(c,N);

writeln ( 'Введите массив из ', N, ' элементов');

for i:=1 to N do

read(a[i]); readln;

p:=1; k:=0;

for i:=1 to N do

if a[i]<c then

begin

p:=p*a[i]; k:=k+1

end;{begin-end ограничивают ветвь "да"}

if k=0 then

writeln ('таких элементов нет')

else

writeln(' p=',p);

readln{задержка экрана с результатами до нажатия ENTER}

End.

Пример 3. Дан массиваизNэлементов (N10). Найти минимальное значение среди элементов массива и номер элемента с таким значением.

Таблица 7. Состав данных примера 3.

Имя

Смысл

Тип

Структура

Исходные данные

N

число элементов массива

целый

простая переменная

а

заданный массив

вещественный

одномерный массив из 10 элементов

Выходные данные

min

минимальный элемент массива

вещественный

простая переменная

k

номер минимального элемента

целый

простая переменная

Промежуточные данные

i

счетчик элементов массива

целый

простая переменная

Блок-схема алгоритма приведена на рис. 11. В начале каждого выполнения цикла min– это минимальное значение среди (i-1) первых элементов массива. Это значениеminсравнивается с а[i] и в результате определяется минимум из первыхiэлементов массива; при изменении текущего минимального значения запоминается номер элемента, на котором достигается текущий минимум (операторk:=i).

Если минимальное (одинаковое) значение имеют несколько элементов массива, то предложенный алгоритм выдаст наименьший из их индексов; при нестрогом неравенстве (a[i]min) будет выдаваться наибольший номер. В ситуации, когда надо определить номера всех элементов, имеющих минимальное значение, алгоритм должен иметь два цикла обработки: в первом цикле должен определяться минимум, а во втором по сравнениюmin=a[i] находиться номера элементов.

program primer3_1_5_2;

Var a:array[1..10] of real;

min:real; N,k,i:integer;

Begin

writeln( 'Введите число элементов массива,N<=10 ');

readln(N);

writeln( 'Введите массив из ',N, ' элементов');

for i:=1 to N do

read(a[i]);

readln; {Закончен ввод, далее алгоритм по блок-схеме}

min:=a[1]; k:=1;

for i:=2 to N do

if a[i]<min then

begin

min:=a[i];

k:=i

end;{begin-endограничивают ветвь "да"}

writeln(' min=',min, ' k=', k);

readln{задержка экрана с результатами до нажатияENTER}

End.

Пример 4. Дана матрицааизNстрок иMстолбцов (N5,M5). Для каждой строки матрицы найти сумму элементов и определить число строк, для которых эта сумма положительна.

Таблица 8. Состав данных примера 4.

Имя

Смысл

Тип

Структура

Исходные данные

N

число строк матрицы

целый

простая переменная

М

число столбцов

целый

простая переменная

а

заданная матрица

вещественный

двумерный массив размером 5*5

Выходные данные

i

счетчик строк матрицы

целый

простая переменная

s

сумма элементов i-ой строки

вещественный

простая переменная

k

число строк с положи­тельной суммой эле­ментов

целый

простая переменная

Промежуточные данные

j

счетчик столбцов матрицы

целый

простая переменная

Обратим внимание, что считая s простой переменноймы предполагаем, что значения сумм всех строк должны последовательно записываться в одну ячейку памяти. В этом случаев одном цикле по строкам мы должны вычислить сумму элементов строки s, вывести s и сравнить ее с нулем для вычисления k. Можно было объявить s как одномерный массив (число его элементов равно числу строк матрицы); тогда алгоритм обработки мог бы состоятьиз двух последовательных циклов по строкам:в первом из них вычислялись бы все элементы массива s и накапливалось значение k, а во втором производился бы вывод значений элементов массива s.

Таким образом, этот несложный пример иллюстрирует два очень важных положения:

  1. выбор структуры данных (простая переменная или массив) может быть неоднозначен;

  2. выбор структуры данных влияет на алгоритм.

Блок-схема алгоритма приведена на рис. 12,а. Обратите внимание на нумерацию блоков. Нумерация нужна для сложных блок-схем, которые не умещаются на одной странице или некоторые блоки которых отображают обобщенное действие и подлежат последующей детализации. Нумерация не обязательно производится подряд, некоторые блоки могут не иметь номеров. Для рассматриваемой блок-схемы является обобщенным блок 6, его содержание раскрыто на рис.12,б. Обратите внимание на значки, с помощью которых показывается связь между исходной и подчиненной блок-схемами. Подставив в исходную блок-схему вместо блока 6 его расшифровку, получим детальный алгоритм решения задачи (см. рис.12,в).

Разработанный алгоритм имеет кратный (вложенный) цикл: тело цикла, управляемого параметром i - этот цикл называетсявнешним, - содержит цикл, управляемый параметром j,внутренний цикл.Представленная конструкция также называетсяциклом кратности (вложенности) 2. Заметим, что внешний цикл (с параметром i) обеспечивает переход от строки к строке матрицы, внутренний цикл (с параметром j) обеспечивает движение по строке (т. е. переход от столбца к столбцу при фиксированном значении i).

да

нет

Рис. 12,б. Детализация блока 6.

Программа, написанная по блок-схема рис.12,в приведена ниже.

program primer4_1_5_2;

Var a:array[1..5,1..5] of real;

s:real; N,M,k,i,j:integer;

Begin

writeln ( 'Введите число строк матрицы, N<=5 ');

readln(N);

writeln ( 'Введите число столбцов матрицы, М<=5 ');

readln(M);

writeln ( 'Введите матрицу размером', N, '* ', M);

for i:=1 to N do

for j:=1 to M do

read(a[i,j]);

readln; {Закончен ввод, далее алгоритм по блок-схеме}

k:=0;

writeln(' i',' s');{вывод заголовков столбцов i,s }

for i:=1 to N do

begin

s:=0;

for j:=1 to M do

s:=s+a[i,j];

if s>0 then

k:=k+1;

writeln(i:2, s);

end;{begin-end ограничивают тело внешнего цикла}

writeln(' k=', k);

readln{задержка экрана с результатами до нажатия ENTER}

End.