- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
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элементов (N10). Вычислить произведение элементов массива, меньших заданного значенияс.
Таблица 7. Состав данных примера 2.
Имя |
Смысл |
Тип |
Структура |
Исходные данные | |||
с |
заданное значение |
веществ. |
простая переменная |
N |
число элементов массива |
целый |
простая переменная |
а |
заданный массив |
веществ. |
одномерный массив из 10 элементов |
Выходные данные | |||
р |
произведение элементов массива, удовлетворяющих условию |
веществ. |
простая переменная |
Промежуточные данные | |||
i |
счетчик элементов массива |
целый |
простая переменная |
k |
количество элементов, удовлетворяющих условию |
целый |
простая переменная |
Обратите внимание, что структура массива апредполагает отведение пода десяти ячеек памяти. В программе описывается массиваиздесятиэлементов, a используются лишь первые N них. Пользователь данной программы должен помнить, что вводимое значение числа элементов массива должно находиться в интервале 1N10. Проверка корректности введенного значения 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элементов (N10). Найти минимальное значение среди элементов массива и номер элемента с таким значением.
Таблица 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столбцов (N5,M5). Для каждой строки матрицы найти сумму элементов и определить число строк, для которых эта сумма положительна.
Таблица 8. Состав данных примера 4.
Имя |
Смысл |
Тип |
Структура |
Исходные данные | |||
N |
число строк матрицы |
целый |
простая переменная |
М |
число столбцов |
целый |
простая переменная |
а |
заданная матрица |
вещественный |
двумерный массив размером 5*5 |
Выходные данные | |||
i |
счетчик строк матрицы |
целый |
простая переменная |
s |
сумма элементов i-ой строки |
вещественный |
простая переменная |
k |
число строк с положительной суммой элементов |
целый |
простая переменная |
Промежуточные данные | |||
j |
счетчик столбцов матрицы |
целый |
простая переменная |
Обратим внимание, что считая s простой переменноймы предполагаем, что значения сумм всех строк должны последовательно записываться в одну ячейку памяти. В этом случаев одном цикле по строкам мы должны вычислить сумму элементов строки s, вывести s и сравнить ее с нулем для вычисления k. Можно было объявить s как одномерный массив (число его элементов равно числу строк матрицы); тогда алгоритм обработки мог бы состоятьиз двух последовательных циклов по строкам:в первом из них вычислялись бы все элементы массива s и накапливалось значение k, а во втором производился бы вывод значений элементов массива s.
Таким образом, этот несложный пример иллюстрирует два очень важных положения:
выбор структуры данных (простая переменная или массив) может быть неоднозначен;
выбор структуры данных влияет на алгоритм.
Блок-схема алгоритма приведена на рис. 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.