Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплексное пособие Си.pdf
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
1.57 Mб
Скачать

Технологии программирования

В проектировании и программировании активно применяются следующие технологии:

Структурное программирование.

Модульное программирование.

Объектно-ориентированное программирование.

Компонентное программирование.

Структурное программирование

Э. Дэйкстра (60-е годы):

Для любой простой программы можно построить функционально эквивалентную ей структурную программу, т.е. программу, сформированную на основе фиксированного базисного множества, включающего:

структуру последовательного действия,

структуру выбора одного из двух действий

структуру цикла, то есть многократного повторения некоторого действия с проверкой условия остановки повторения.

Простая программа – ровно один вход и один выход.

Базисные конструкции:

Стандартизация и линейность программы – снижение сложности.

126

Некоторые соображения:

Алгоритм должен иметь 1 вход и 1 выход.

Никаких goto.

Нет зависимости от языка программирования.

Ясен набор операторов, который необходим в языках программирования.

Модульное программирование

Основная идея: разбиваем сложную задачу на подзадачи, каждую из них при необходимости разбиваем снова и т.д.

Получаем простые задачи, их решаем, объединяем.

Структурное программирование – универсальный базис алгоритмических конструкций.

Модульное программирование – специфичный для задачи базис из модулей.

Более высокий уровень абстракции.

Настройка на конкретную задачу.

Возможности повторного использования.

Возможности коллективной разработки – разделение труда.

Объектно-ориентированное программирование

Дальнейшая борьба со сложностью. Технология работает с этапа анализа: Анализ – Проектирование – Программирование. В основе – объектная модель и объектная декомпозиция.

Основные принципы объектной модели:

абстракция;

инкапсуляция;

иерархия (наследование, агрегация);

полиморфизм;

модульность.

127

Объектная декомпозиция (в отличие от алгоритмической): элементы проекта – классы и объекты (а не алгоритмы). И только потом данные и алгоритмы.

Компонентное программирование

Компонентное программирование – развитие объектно-

ориентированной идеологии.

Введен следующий уровень абстракции – классы объединяются в

компоненты.

Основной принцип компонентного программирования: сборка приложения из готовых компонент, в общем случае написанных на разных языках.

Компонент:

программный код в виде самостоятельного модуля

может быть использован в неизменном виде

может допускать настройку

обладает поведением (функциональностью).

Компонент изолирован от внешнего мира своим интерфейсом – набором методов (их сигнатурами).

Компонентная программа – набор независимых компонент, связанных друг с другом посредством интерфейсов.

Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх

Любая сложная система состоит из более мелких частей, таким же образом можно представить любой алгоритм или программу. На первом этапе проектируемый алгоритм представляется в виде одного блока. Затем определяется структура этого блока, исходный алгоритм разбивается на части и т.д. На рисунке представлены нисходящая (сверху вниз) и восходящая (снизу вверх) технологии алгоритмизации.

128

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В

 

 

 

 

 

 

 

 

С

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Е

 

 

F

 

 

G

 

 

H

 

I

 

J

 

K

 

L

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сверху вниз

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Снизу вверх

Рис. Нисходящая и восходящая технологии алгоритмизации

Часто отдельные

 

части

 

сложной

программы

оформляют в виде

отдельных подпрограмм. При разработке программы по принципу «сверху вниз» вначале проектируется алгоритм главной программы (функции main), на втором этапе – блоков или подпрограмм, вызываемых из главной программы, затем – блоков или подпрограмм следующего уровня и т.д.

Задача. Сортировка числовой последовательности.

Дано целое n и вещественные x1, x2, ..., xn. Составить программу печати заданных вещественных чисел в порядке возрастания (не убывания).

Тест.

 

 

 

 

 

Вход:

 

 

 

 

 

Введите количество чисел

5

 

 

 

 

Введите числа

12.5

6

14 -3

10

 

Выход:

 

 

 

 

 

Упорядоченные числа:

-3.0

6.0

10.0

12.5

14.0

Разработаем алгоритм программы нисходящим методом.

Для хранения данных нужен массив. Исходные данные вводятся в

массив, там сортируются по возрастанию, а затем выводятся. Оформим в виде отдельных подпрограмм ввод данных и сортировку массива.

Функциональную структуру программы можно представить в виде дерева, как показано на рисунке ниже.

129

main

 

 

Vvod

 

 

Sort

 

 

 

 

 

 

 

 

Рис. Функциональная структура программы

 

1 этап. Разработка алгоритма функции main().

 

Алгоритм (на псевдокоде):

1.

n = Vvod(x);

// Ввод n и массива x

2.

Sort (x,n);

// Сортировка массива x по возрастанию;

3.

Вывод сортированного по возрастанию массива x;

2 этап. Детализируем шаги алгоритма. Это можно делать в любом порядке. Начнем, например, с вывода упорядоченного массива x.

// 3. Вывод массива x

Вывод заголовка "Упорядоченные числа:";

for (i=0; i<n; i++)

Вывод x[i];

Теперь рассмотрим алгоритм функции ввода данных. int Vvod (float x[])

{

Ввод n;

for (i=0; i<n; i++)

Ввод x[i];

Возврат n;

}

Осталось рассмотреть функцию сортировки массива x. Существует много различных методов сортировки массивов. Рассмотрим метод

последовательного нахождения максимума.

Вначале наибольший элемент ищется среди всех n элементов, после чего происходит перестановка его с последним элементом. Далее максимальный

130

элемент ищется уже среди n-1 элементов и меняется местами с предпоследним элементом. Затем эта процедура повторяется для n-2 элементов и т.д. Последний раз наибольший элемент находится из первых двух элементов и переставляется местами со вторым элементом.

2.5

6

14

-3

10

//рассматривается n элементов

2.5

6

10

-3

14

 

2.5

6

10

-3

//рассматривается n-1 элементов

2.5

6

-3

10

 

 

2.56 -3 // рассматривается n-2 элементов

2.5 -3 6

2.5 -3

// рассматривается n-3 элементов

-3 2.5

 

Алгоритм функции сортировки массива x по возрастанию:

 

void Sort(float x[], int n)

 

{ for (k=n-1; k>0; k--)

 

 

{ Определение максимума среди элементов

 

 

x[0], ... , x[k]

и

 

 

его индекса imax.

 

 

 

Обмен: x[imax] <--> x[k];

 

}

 

 

 

 

3 этап. Рассмотрим определение максимума среди элементов x[0], ... ,

x[k]

и

его индекса imax.

 

 

imax =0;

 

 

for (i

=1; i <= k; i++)

 

 

 

if

(x[i] > x[imax])

imax = i;

 

Программа:

 

#include <stdio.h>

 

#define

NMAX 100 /* Макс-е количество входных чисел */

/* Функция ввода данных * /

 

int

Vvod (float x[])

 

{

 

 

 

 

131