- •Введение
- •1. Общие положения
- •1.1. Понятие алгоритма. Данные в задачах и алгоритмах
- •1.2. Понятие о технологии разработки программ. Принципы и этапы разработки программ
- •1.3. Состав документации по отдельным этапам
- •1. Задача
- •9. Структурные тесты
- •1.4. Нисходящая разработка и нисходящая отладка
- •2. Процесс разработки программы на примере решения типовой задачи
- •2.1. Разработка алгоритма и программы уровня 0 с заглушками
- •2. Входные данные
- •3. Выходные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале. Диалоговый вариант
- •9. Структурные тесты
- •2.2. Отладка программы с заглушкой
- •2.3. Общая схема перехода от метода к алгоритму решения
- •2.4. Разработка алгоритма и программы для примера
- •2. Входные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале
- •9. Структурные тесты
- •2.5. Отладка полной программы
- •2.6. Список заданий
- •3. Организация хранения данных с позиций эффективности отладки и использования программы
- •3.1. Как лучше хранить, вводить и выводить данные
- •3.2. Использование текстовых файлов для хранения входных и выходных данных
- •3.3. Использование параметров в Паскаль-программах
- •3.4. Задание
- •4. Некоторые методы решения типовых задач
- •4.1. Поиск экстремальных значений (максимума, минимума) в одномерном массиве
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.2. Поиск элемента, удовлетворяющего заданному условию
- •2. Входные данные
- •6. Метод
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.3. Задача со сложной логикой
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.4. Упорядочение одномерного массива
- •3. Выходные данные
- •6_А. Метод включения
- •6_Б. Метод пузырька
- •4.5. Список заданий
- •5. Работа с двумерными массивами (матрицами)
- •5.1. Схема обработки матриц
- •5.2. Ввод и вывод матрицы
- •5.3. Пример решения задачи
- •3. Выходные данные
- •6. Метод
- •5.4. Список заданий
- •6. Оформление алгоритмов в виде процедур
- •6.1. Основные положения
- •6.2. Кодирование процедур на языке Паскаль
- •6.3. Специфика оформления процедур ввода – вывода
- •6.4. Рекомендации по оформлению процедур
- •6.5. Примеры разработки процедур
- •3. Выходные данные
- •6. Метод
- •3 Истина, если все элементы строки больше 1, ложь, в противном случае . Выходные данные
- •7. Описание процедуры
- •8. Кодирование на паскале
- •9. Структурные тесты
- •2. Входные данные
- •3. Выходные данные
- •4. Аномалии не рассматриваем
- •6. Метод
- •7. Алгоритм
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •7. Описание процедуры
- •8. Кодирование на Паскале
- •6.6. Список заданий
- •7. Внешние модули (unit) в турбо-Паскале
- •7.1. Суть и описание модуля
- •7.2. Связь модуля с другими модулями и главной программой. Область действия описаний объектов
- •7.3. Специфика оформления процедур ввода – вывода в модулях
- •7.4. Примеры оформления процедур во внешних модулях
- •7.5. Задания
- •7.6. Обработка многомодульных программ в среде турбо-Паскаль
- •8. Контрольные вопросы к главе 1
- •К главе 2
- •К главе 3
- •К главе 6
- •К главе 7
- •Заключение
- •Литература
- •Приложение 1. Базовые структуры алгоритмов
- •Приложение 2. Простые типы в Паскале
- •Приложение 3. Структура типов данных в языке Паскаль
- •Содержание
5. Работа с двумерными массивами (матрицами)
5.1. Схема обработки матриц
● Для цельности дальнейшего изложения воспроизведем необходимые определения из § 1.1.
Массив– совокупность однотипных данных, имеющая общее имя. Для идентификации отдельных элементов используютсяиндексы. В простейшем случае это номера элементов. Количество индексов, необходимых для однозначной идентификации элемента, определяетразмерностьмассива.
Двумерный массив (матрица)– структура из строк и столбцов, например:
Описание: цел с[3,5]; в общем случае –c[m,n].
Элементы массива: в общем виде – сi,j илис[i,j].
Первым всегда указывается индекс строки.
● Порядок обработки элементов задается порядком изменения индексов.
•• Основные схемы обработки всех элементов матрицы: просмотр по строкам (строка за строкой) или по столбцам (столбец за столбцом).
-
Просмотр по строкам
Просмотр по столбцам
для i от 1 до m цикл
для j от 1 до n цикл
<обработка элемента с[i,j]>
кц;
кц;
для jот 1 доnцикл
для iот 1 доmцикл
<обработка элемента с[i,j]>
кц;
кц;
•• Основные схемы обработки элементов квадратной матрицы
Просмотр элементов главной диагонали
Для элементов главной диагонали выполняется условие: i = j. Достаточно однократного цикла, например, поi, с обработкой элементовс[i,i].
Просмотр элементов над главной диагональю
При построчном просмотре для текущей i–й строки анализируется ее часть, начиная с диагонального элемента и до конца строки.
Включая диагональные элементы |
Не включая диагональные элементы |
для i от 1 до m цикл для j от i до n цикл <обработка с[i,j]> кц; кц; |
для i от 1 до m-1 цикл для j от i+1 до n цикл <обработка с[i,j]> кц; кц; |
Просмотр элементов под главной диагональю делается аналогично.
5.2. Ввод и вывод матрицы
1. Задача.Задана матрицаaизmстрок иnстолбцов. Здесь нас интересует только ввод-вывод матрицы, поэтому все остальные элементы задачи и ее решения опускаем.
2. Входные данные. Ограничения на диапазоны данных там, где они не очевидны, взяты произвольно.
цел m- число строк матрицыa; простая переменная;m<=50; формат XX (:2);
цел n- число столбцов матрицы а; простая переменная; 0<n<=50; формат XX (:2);
вещ a- исходная матрица; двумерный массив;a[i,j]<=10; точность 0,1; формат +XX.Х (:5:1).
Входная формасложнее, чем для одномерного массива, и требует более тщательной разработки.
Рассмотрим 2 варианта размещения элементов:
a) общий случай: nтаково, что строка матрицы не помещается на одной строке носителя, и волевым усилием размещаем в строке носителя фиксированное число элементов (например, пять);
б) строка матрицы умещается на одной строке носителя (либо размещаем в строке носителя произвольное число элементов, что нежелательно).
3. Выходные данные. Приведем только фрагменты выходной формы для вывода входных данных.
Пусть:
входные данные и результаты хранятся в файлах на диске;
имена входного и выходного файлов задаются как первый и второй параметры командной строки;
соответствующие файловые переменные программы - dat, res.
Алгоритм
На уровне алгоритма будем описывать только порядок обработки элементов и ссылаться на соответствующий образец ввода-вывода. Поэтому оба варианта здесь будут выглядеть одинаково.
Пусть i,j- текущие номера строки и столбца.
алг vvod_matr (m,n,a);
арг
цел m,n; вещ a[m,n] ;
рез
…………
нач
цел i,j;
{вывод заголовка }
вывод по обр1;
{ввод и вывод m,n согласно выходной форме}
ввод(m,n); вывод (m,n) по обр2;
{ввод по строкам элементов матрицы}
ввод ((a[i,j], j=1,n), i=1,m);
{вывод по строкам элементов матрицы}
вывод ((a[i,j],j=1,n),i=1,m) по обр3;
…………
кон;
кон vvod_matr;
Кодирование на паскале
program vvod_matr (dat,res);
const
mmax=50;
nmax=50;
var
m,n,i,j:byte;
a:array[1..mmax,1..nmax] of real;
dat,res:text;
.....................
begin
assign(dat,paramstr(1)); assign(res,paramstr(2));
reset(dat); rewrite(res);
writeln(res,' ':15,'Обработка матрицы');
{ввод m,n; вывод m,n по обр2}
readln(dat,m,n);
writeln(res,' Исходная матрица из ',m:2,' строк и ',n:2,' столбцов');
<Ввод и вывод элементов матрицы согласно варианту а или б>
end.
{вариант а}
{ввод по строкам элементов матрицы}
for i=1 to m do
for j=1 to n do
begin
read(dat,a[i,j]); {ввод из одной строки носителя}
if(jmod5)=0then{если введено 5 элементов}
readln(dat); {переход на следующую строку носителя }
end;
{вывод по строкам элементов матрицы}
for i=1 to m do
begin
write(res,' ');{вывод пробелов в начале строки}
for j=1 to n do
begin
write(res,a[i,j]:5:1,' '); {вывод в одну строку носителя }
if(jmod5)=0then{если выведено 5 элементов }
writeln(res); {переход на следующую строку носителя } end;
writeln(res); {переход к следующей строке матрицы }
end;
{вариант б}
{ввод по строкам элементов матрицы}
for i=1 to m do
begin
for j=1 to n do
read(dat,a[i,j]); {ввод из одной строки}
readln(dat); {переход на следующую строку }
end;
{вывод по строкам элементов матрицы}
for i=1 to m do
begin
write(res,' ');{вывод пробелов в начале строки}
for j=1 to n do
write(res,a[i,j]:5:1,' '); {вывод в одну строку}
writeln(res); {переход на следующую строку }
end;
Пояснение. Операции ввода и вывода в Паскале при схожих формах ввода и вывода могут быть записаны совершенно по-разному! Дело в том, что при вводе пропускаются пробелы, знаки табуляции и концы строк. Поэтому операции перехода на другую строку можно было бы не писать. Однако вывод должен быть описан полностью – без перехода на другую строку все будет выводиться подряд.
Чтобы не спотыкаться на этих тонкостях и не делать ошибок, следует придерживаться следующих рекомендаций:
тщательно проектировать входную и выходную формы;
ввод – вывод кодировать в точном соответствии с этими формами.