- •Введение
- •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. Структура типов данных в языке Паскаль
- •Содержание
6. Метод
Вывод имени, числа и значений элементов массива согласно выходной форме (по схеме образцов 2, 3).
7. Описание процедурысделаем сразу на Паскале.
8. Кодирование на паскале
Определение глобальных типовсделано в задачеA0.1. Других типов в данной задаче не требуется.
Параметр – массив опишем как параметр – переменную с целью экономии памяти.
Описание процедуры
Вариант 1.Файловая переменная открытого файла передается как глобальная
procedure output(n:byte; var mas:massiv; name_mas:char);
var
i:byte;
begin
writeln(res,' Массив ',name_mas,' из ',n:3,' элементов:'); {обр2,4,6}
for i:=1 to n do
write(res,mas[i]:3:1,' '); {обр3,5,7}
writeln(res);
end;
Вариант 2. Файловая переменная открытого файла передается как параметр
procedure output(n:byte; var mas:massiv; name_mas:char; var res1:text);
var
i:byte;
begin
writeln(res1,' Массив ',name_mas,' из ',n:3,' элементов:'); {обр2,4,6}
for i:=1 to n do
write(res1,mas[i]:3:1,' '); {обр3,5,7}
writeln(res1);
end;
•• Вызовы
-
Подзадача
n
mas
Вариант 1
Вариант 3
A0.3.1
na
a
output(na,a,’a’);
output(na,a, ’a’, res);
A0.3.2
nb
b
output(nb,b,’b’);
output(nb,b, ’b’, res);
A0.3.3
nc
c
output(nc,c,’c’);
output(nc,c, ’c’, res);
Задача A0.3
1. Задача A0.3. Подсчитать сумму элементов одномерного массиваmasизnэлементов.
2. Входные данные
цел n– число элементов массива; во внутреннем представлении;
вещ mas[n] – исходный массив; во внутреннем представлении.
3. Выходные данные
вещ s– сумма элементов массива; во внутреннем представлении.
Оформление заголовка и вызова процедуры
Вид– общего вида (можно было бы оформить и функцию)
Имя–summa
Заголовок– процsumma(n,mas,s);
Вызов – осуществляется трижды, для каждого из массивов.
Соответствие формальных и фактических параметров и вызовы:
-
Подзадача
n
mas
s
Вызов
A0.3.1
na
a
sa
summa(10,a,sa);
A0.3.2
nb
b
sb
summa(20,b,sb);
A0.3.3
nc
c
sc
summa(15,c,sc);
Вызов запишем в головной модуль вместо соответствующих подзадач.
4. Аномалиине рассматриваем
5. Функциональные тестыте же, что для задачи в целом
6. Метод
Суммирование элементов одномерного массива.
7. Описание процедуры
Описание ввиду его тривиальности сделаем сразу на Паскале.
8. Кодирование на Паскале
Определение глобальных типовсделано в задачеA0.1. Других типов в данной задаче не требуется.
Параметр – массив опишем как параметр – переменную с целью экономии памяти.
Описание процедуры
procedure summa(n:byte;mas:massiv;var s:real);
var
i:byte;
begin
< операторы подсчета s >
end;
● Программа в целом
Подставим описания глобальных объектов и процедур в соответствующие разделы программы.
Вариант 1
program mas3(dat,res);
{описание глобальных типов и констант}
const
nmax=20;
type
massiv=array[1..nmax] of real;
{описания переменных головного модуля}
var
na,nb,nc:byte;
a,b,c:massiv; {все массивы одного типа!}
sa,sb,sc:real;
name:char;
dat,res:text; {файловые переменные для входного и выходного файлов}
{описание процедур ввода и вывода одномерного массива}
procedureinput(varn:byte;varmas:massiv);
var
i:byte;
begin
readln(dat,n);
for i:=1 to n do
readln(dat,mas[i]);
end;
procedure output(n:byte; var mas:massiv; name_mas:char);
var
i:byte;
begin
writeln(res,' Массив ',name_mas,' из ',n:3,' элементов:'); {обр2,4,6}
for i:=1 to n do
write(res,mas[i]:3:1,' '); {обр3,5,7}
writeln(res);
end;
{описание процедуры суммирования элементов массива}
proceduresumma(n:byte;mas:massiv;vars:real)
var i:byte;
begin
< операторы подсчета s >
end;
begin
assign (dat, paramstr(1)); reset(dat);
assign (res,paramstr(2)); rewrite(res);
writeln (res, ' <Заголовок по обр1>');
{ввод и вывод массивов}
input (na, a); {ввод массива a}
output(na,a,'a'); { вывод массиваaпо обр 2, 3}
input (nb, b); { ввод массива b}
output (nb, b,'b'); { вывод массива b по обр 4, 5}
input (nc, c); { ввод массива c}
output (nc, c,'c'); {вывод массива c по обр 6, 7}
{подсчет сумм элементов }
summa(10,a,sa); {обработка.10 элементов массива a из 20 элементов}
summa(20,b,sb); {обработка.20 элементов массива b из 20 элементов}
summa(15,c,sc); {обработка.15 элементов массива c из 20 элементов}
< вывод sa,sb,sc по обр 8>
< сравнение sa,sb,sc и формирование name >
< вывод name по обр 9>
close(dat); close(res);
end.
Вариант 2. Приведем только фрагменты программы, позволяющие проиллюстрировать отличие от варианта 1.
program mas3(.....);
{описание глобальных типов и констант}
……………..
var
{описания переменных головного модуля}
…………….
dat,res:text; {файловые переменные для входного и выходного файлов} {описание процедур ввода и вывода одномерного массива}
procedure input(var n:byte; var mas:massiv; var dat1:text);
…….
begin
…….
end;
procedure output(n:byte; var mas:massiv; name_mas:char; var res1:text);
…….
begin
…….
end;
{описание процедуры суммирования элементов массива}
procedure summa(n:byte;mas:massiv;var s:real)
…….
begin
…….
end;
begin
……….
{ввод и вывод массивов}
input(na,a,dat); {ввод массива a}
output (na, a,'a', res); { вывод массива a по обр 2, 3}
input(nb,b,dat); { ввод массива b}
output (nb, b,'b', res); { вывод массива b по обр 4, 5}
input(nc,c,dat); { ввод массива c}
output (nc, c,'c',res); {вывод массива c по обр 6, 7}
{подсчет сумм элементов }
……..
< вывод sa,sb,sc по обр 8>
< сравнение sa,sb,sc и формирование name >
< вывод name по обр 9>
close(dat); close(res);
end.
● Резюме. Обратить внимание на следующие моменты.
•• Необходимо соблюдать соответствие типов формальных и фактических параметров. Согласно правилам Паскаля, они должны быть одного типа (буквально!). Поэтому для параметров нестандартных типов следует описывать типы (в разделе type) с тем, чтобы в заголовке процедуры указатьимятипа.
•• По этой же причине любая процедура Паскаля, имеющая параметры – массивы, работает с массивами с постоянными границами, так как в описании типа-массива присутствует граница, которая прямо или опосредованно описывается как константа.
Примечание. В версиях Турбо-Паскаля до шестой включительно с этим недостатком приходится либо мириться, либо использовать приемы, относящиеся к программистским трюкам, что нельзя считать хорошим тоном. Однако начиная с седьмой версии в язык включен аппарат открытых массивов (здесь не рассматриваемый), а в версии языкаObject Pascal, встроенного в системуDelphi, память под массивы выделяется динамически, что является наиболее гибким вариантом использования памяти.