ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Пример метода пошаговой детализации.Пошаговая разработка программы Цель работы: - Освоить метод пошаговой разработки программ. Порядок выполнения работы и отчетность. Во время выполнения лабораторной работы необходимо осуществить пошаговую разработку конкретной программы. Работа должна быть оформлена в виде спецификации, содержащей описание пошаговой разработки конкретной программы. Теоретические сведения. Пошаговая разработка (пошаговая детализация) программы представляет собой простой процесс, предполагающий первоначальное выражение логики модуля в терминах гипотетического (условного) языка очень высокого уровня с последующей детализацией каждого предложения в терминах языка более низкого уровня, до тех пор, пока, наконец, не будет, достигнут уровень используемого языка программирования. Достоинство пошаговой детализации состоит в том, что этот метод позволяет проектировщику упорядочить свои рассуждения - на каждом шаге детализации решается элементарная задача. Пример метода пошаговой детализации. ЗАДАЧА. Дана матрица размером 10*10 элементов. Для каждого столбца среди элементов, лежащих выше первого нулевого, и значения которых лежат в интервале [c,d], найти наименьший и наибольший элементы и их номера в строке. Если нулевого элемента в столбце нет, то обрабатывается весь столбец. План решения задачи. 1. Входные / выходные переменные. 2. Основной алгоритм – перебор столбцов исходной матрицы (цикл по столбцам) 3. Перебор элементов столбца матрицы (внутренний цикл по строкам) 4. Обработка элементов матрицы 5. Поиск наибольшего и наименьшего элементов в столбце. 6. Обработка начальных и конечных операторов циклов 7. Оптимизация и шлифовка программы Входные / выходные переменные. А(10,10) - исходная матрица С и D - границы интервала max(10) - массивы, содержащие наибольшие и наименьшие значения min(10) каждого столбца исходной матрицы. Imax(10) - массивы, содержащие номера, строк в которых встречаются Imin(10) найденные наибольшие и наименьшие значения в столбце. а) Первый шаг. Детализация ввода-вывода. PROGRAMM PRIMER; VAR A: ARRAY[1..10,1..10] OF REAL; (* Исходная матрица *) C,D: REAL; (* Границы интервала *) I,J: INTEGER; (* Номера строк и столбцов *) MAX,MIN: ARRAY[1..10] OF REAL; (* Значения наибольших *) (* и наименьших элементов *) IMAX,IMIN: ARRAY[1..10] OF INTEGER; (* и их номера строк *)
BEGIN WRITELN ('Введите элементы матрицы'); FOR I:=1 TO 10 DO BEGIN FOR J:=1 TO 10 DO READ (A[I,J]); WRITELN; END; WRITE('Введите границы интервала'); READ (C,D);
FOR I:=1 TO 10 DO WRITELN ('MIN =', MIN[I], ', его номер', IMIN[I], '; MAX=', MAX[I], ', его номер', IMAX[I]); END. б) Второй шаг. Детализация основного алгоритма. Необходимо выполнить одно и тоже для каждого столбца.
FOR J:=1 TO 10 DO BEGIN
END;
в) Третий шаг. Обработка столбца исходной матрицы. В этом столбце необходимо обработать элементы, лежащие выше первого нулевого элемента матрицы А.
FOR I:=1 TO 10 DO WHILE A[I,J]#0 DO BEGIN
END;
г) Четвертый шаг. Определение принадлежности элемента матрицы А заданному отрезку СD. IF (C<A[I,J]) AND (A[I,J]<D) THEN BEGIN
END; д) Пятый шаг. Вычисление наибольшего и наименьшего элемента в столбце матрицы А и их номера в строке. IF A[I,J]>=MAXT THEN BEGIN MAXT:=A[I,J]; IMAXT:=I; END; IF A[I,J]<=MINT THEN BEGIN MINT:= A[I,J]; IMINT:= I; END; Появились новые переменные: MAXT и MINT, IMAXT и IMINT, которые необходимо включить в описания переменных с присвоением типа REAL и INTEGER соответственно. е) Шестой шаг. Детализация начальных и конечных операторов циклов. Движемся по программе изнутри циклов наружу и смотрим, что необходимо для работы циклов. Чтобы сработал внутренний цикл, надо чтобы на первом шаге MAXT и MINT имели какие-то значения и что делать в случае отсутствия в столбце элементов из интервала (c,d)? Примем, что индексы в этом случае равны нулю, а значения наибольших и наименьших элементов, попадающие в выходные массивы, несущественны. Итак, вначале MAXT=С, MINТ=D, IMAXT=0, IMINТ=0. Результаты этого цикла надо заслать в J-е элементы результирующих массивов, поэтому конечные операторы будут такими: MAX[J]:=MAXT, MIN[J]:=MINT IMAX[J]:=IMAXT, IMIN[J]:=IMINT Для цикла по столбцам никаких начальных и конечных операторов не требуется. ж) Последний шаг. Шлифование и оптимизация программы. Получив программу, можно заняться ее улучшением, чтобы она стала короче или выполнялась быстрее. Например, если использовать MAX(J), MIN(J), IMAX(J), IMIN(J) вместо MAXТ, MINT, IMAXТ, IMINT, то строка конечных операторов не потребуется, но программа будет дольше выполняться (хотя ее текст сократится), т.к. участится выполнение операции "Обращение к элементу массива" (довольно длинная, с точки зрения ЭВМ, операция). Можно выполнить другие оптимизационные действия. Результирующая программа PROGRAMM PRIMER; VAR A: ARRAY[1..10, 1..10] OF REAL; (* Исходная матрица *) I, J: INTEGER (* Их номера строк и столбцов *) C,D: REAL; (* Границы интервала *) MAX,MIN: ARRAY[1..10] OF REAL; (* Значения наибольших и *) (* наименьших элементов *) IMAX,IMIN: ARRAY[1..10] OF INTEGER; (* и их номера строк *) MAXT,MINT: REAL; (* Временные переменные, наибольший и *) (* наименьший значения элементов *) IMAXT,IMINT: INTEGER; (* и их номера в столбце *) BEGIN WRITELN ('Введите элементы матрицы:'); FOR I:=1 TO 10 DO BEGIN FOR J:=1 TO 10 DO READ (A[I,J]); WRITELN; END; WRITE('Введите границы интервала'); READLN (C,D); FOR J:=1 TO 10 DO (* обработка столбцов матрицы А *) BEGIN IMAXT:=0; IMINT:=0; MINT:=C; MINT:=D; (* обработка элементов столбца матрицы А *) FOR I:=1 TO 10 DO WHILE A[I,J]#0 DO BEGIN IF (C<=A[I,J]) AND (A[I,J]<=D) THEN (* элемент матрицы *) BEGIN (* принадлежит отрезку CD? *) IF A[I,J]>=MAXT (* элемент матрицы наибольший? *) THEN BEGIN MAXT:=A[I,J]; IMAXT:=I; END; IF [I,J]<=MINT (* элемент матрицы наименьший? *) THEN BEGIN MINT:=A[I,J]; IMINT:=I; END; END; END; MAX[J]:= MAXT; MIN[J]:= MINT; IMAX[J]:=IMAXT; IMIN[J]:=IMINT; END; FOR I:=1 TO 10 DO WRITELN ('MIN=',MIN[I],',его номер', IMIN[I], '; MAX=',MAX[I],',его номер',IMAX[I]); END.
Задание
Не нашли, что искали? Воспользуйтесь поиском:
|