Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
83
Добавлен:
30.03.2015
Размер:
1.38 Mб
Скачать

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

«Омский государственный технический университет»

Шафеева О. П.

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

Учебное пособие

Омск 2007

УДК 004.43 ББК 32.973.26-018.1 Ш 30

Рецензенты: В.Т. Гиль, канд.техн.наук, доцент; С.С. Ефимов, канд.техн.наук, доцент

Шафеева О.П.

Ш 30 Технологии программирования. С++:

Учебное пособие. Омск: Изд-во ОмГТУ, 2007. 80 с.

Пособие включает в теоретической части напоминание об элементах языка программирования С++ (операциях, операторах, типах данных) и правила объект- но-ориентированного программирования. В части курсового проектирования приведены возможные темы и задания для типовых проектов по одноименной дисциплине. Приводятся примеры оформления документов для разработки алгоритмов и программ, а также представления слайд-доклада.

Пособие предназначено для изучения технологии объектноориентированного программирования в дисциплине «Технологии программирования».

Печатается по решению редакционно-издательского совета Омского государственного технического университета.

УДК 004.43 ББК 32.973.26-018.1

© О.П. Шафеева, 2007 © Омский государственный

технический университет, 2007

2

ВВЕДЕНИЕ

Основыми направлениями в программировании являются

процедурное (структурное) программирование,

модульное,

объектно-ориентированное (ООП).

Впроцедурном программировании основное внимание уделяется алгоритму, т.е. некоторой заданной последовательности действий, выполнение которых приводит (к получению результата вычислений) к решению поставленной задачи.

Впроцедурных языках главное внимание уделяется построению процедур (подпрограмм) и, как следствие, решению следующих вопросов: передаче аргументов в процедуры, получению результатов из подпрограмм, внутренняй организация подпрограмм.

Вмодульном программировании основные акценты переносятся на построение модулей. При этом необходимо разделить программу на модули, причем так, чтобы данные были скрыты в этих модулях. Главной становится организация данных (а не алгоритм).

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

Если запретить доступ из-за пределов модуля (скрыть данные), то будет предотвращено их случайное изменение, а значит и нарушение работы программы. Теперь вместо согласования имен глобальных переменных, организации общих данных и способов доступа к ним в процедурном программировании надо только согласовать интерфейс (взаимодействие) сконструированных модулей в разрабатываемой общей программе.

Вдействительности процедурное и модульное программирование дополняют, а не исключают друг друга. Процедурное программирование эффективно используется для решения различных математических задач, имеющих алгоритмический характер.

При использовании больших объемов данных (в базах данных, графических системах) целесообразно использовать направление, связанное с абстракцией данных или абстрактными типами данных. Это новый подход к программирова-

нию – объектно-ориентированное программирование (ООП). ООП, взяв лучшие черты структурного программирования, дополняет его новыми идеями, которые переводят в новое качество подход к созданию программ.

ООП использует природные способности человеческого мышления к классификации и абстрагированию и использует такие понятия, как объекты и свойства, наследование и иерархию, которые человек применяет в повседневной жизни. При этом программист создает программу, в котрой объекты возникают, разрушаются, меняют свое состояние и взаимодействуют друг с другом.

3

1 Этапы разработки программного обеспечения

Программное обеспечение (ПО) состоит из нескольких совместно работающих программ (программных модулей), объединенных в программный комплекс (ПК), и документов, необходимых для разработки, сопровождения и эксплуатации ПК, а также ряда других документов [1]. В простейшем случае ПК включает только одну программу, но второй компонент ПО - документы, должны присутствовать всегда.

Программное обеспечение

ПК

Программный модуль 1

Программный модуль 2

. . .

Программный модуль N

Документы

Для разработки и сопровождения ПО

Для эксплуатации программного комплекса

Другие виды документов

Программа (программный модуль) – это упорядоченная последовательность команд или операторов, которые после ввода в ОЗУ позволяют обработать входные данные и выдать результаты.

Проектирование и последующая поддержка ПО включает ряд этапов, которые

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

1)На первом этапе (10%) создается математическая и логическая модели исследуемого явления. Характеристики и особенности модели отражаются в спецификации (формализованное описание свойств, характеристик и функций объекта). Она включает название задачи, программы, систему программирования, тип ПК, подробную постановку задачи, описание математической модели, метода обработки данных и т.д.

Выполняемые функции предусматривают:

― Управление режимами работы (формулировка требований к способу взаимодействия пользователя с программой: интерфейсу «пользователь – компьютер»). Интерфейс пользователя – комплекс программных средств, обеспечивающий взаимодействие пользователя с системой [2].

― Требования к входным данным (форма, пределы изменения).

― Вид выходных данных (числовой, графический, сообщения).

― Способы диагностики и защиты от ошибок на этапе проектирования.

― Особые ситуации. Краткая документация.

4

2)При проектировании программного средства (10%) формируется общая структура программного комплекса (ПК разбивается на части – программные модули). При этом используются сновные методы проектирования: «снизу вверх» и «сверху вниз». Для каждого модуля формируются требования по функциям и разрабатываются алгоритмы. Определятся схема взаимодействия программных модулей (потоков данных). Доказывается правильность проекта и алгоритмов или методов.

3)Кодирование (10%) заключается в переводе алгоритмов для каждого программного модуля в программы на конкретном языке программирования (с обоснованием выбора языка).

4)Отладка и тестирование (20%) направленны на устранение следующих ошибок:

– ошибок, допущенных при разработке и не обнаруженных при тестировании (к ним относятся неправильная постановка задачи; неверный алгоритм; семантические, синтаксические ошибки; ошибки стадии выполнения; ошибки в данных и

вдокументах);

ошибок при вводе в компьютер неверных данных;

компьютерных вирусов;

сбоев оборудования;

«злой воли человека», когда программист специально может внести ошибку

впрограммный комплекс, включить «логическую бомбу», срабатывающую после определенного числа запусков.

Отладка – поиск и исправление ошибок. Для выявления «скрытых» ошибок производится тестирование. Тестирование различают автономное (тестируются отдельные программные модули) и комплексное (проверка всего программного комплекса).

После того как тестированием обнаружена ошибка, она исправляется, и продолжается процесс отладки. Отладка и тестирование чередуются, пока в ПК не будут найдены и ликвидированы все ошибки.

5) На этапе сопровождения (50%) и эксплуатации производится добавление новых функций в ПК, устранение ошибок, обнаруженных в процессе эксплуатации, тиражирование программного продукта.

6) Документация разрабатывается с момента начала разработки ПО. Она делится на группу документов для разработчиков и специалистов, которые будут сопровождать ПК; и для пользователей ПО. Первая группа документов включает:

техническое задание (задание на разработку) и спецификацию,

схему разбиения ПК на программные модули,

схему потоков данных,

схему взаимодействия программных модулей,

схемы алгоритмов и исходные тесты программ с комментариями,

планы и данные для тестирования ПК,

другие материалы, иллюстрирующие проект (структуру ПК и модулей). Второй вид документов содержит информацию, необходимую для работы с

программным комплексом. Эти документы могут оформляться в печатном виде или встраиваться в ПК (программу) помощь в виде подсказки.

5

2 ОСНОВЫ С++

2.1 Операции

Все операции в языке СИ подразделяются на унарные (с одним операндом), бинарные (с двумя операндами) и тернарную (с тремя операндами). Тернарной является только одна условная операция. Операции и их приоритеты сведены в таблице 1.

 

 

 

 

Таблица 1

 

 

Приоритеты операций

 

 

 

 

 

 

 

 

 

Вес

Знак

Наименование операции

Тип

Порядок

 

 

 

 

операции

 

 

1

( )

вызов функции

Выражение

Слева на-

 

 

[]

выделение элемента массива

 

право

 

 

.

выделение элемента структуры или

 

 

 

 

 

объединения

 

 

 

 

->

выделение элемента структуры или

 

 

 

 

 

объединения (объединения), адресуе-

 

 

 

 

 

мой (го) указателем

 

 

 

2

!

логическое отрицание

унарные

Справа на-

 

 

~

побитовое отрицание

 

лево

 

 

-

изменение знака (унарный минус)

 

 

 

 

++

увеличение на единицу (инкремент)

 

 

 

 

--

уменьшение на единицу (декремент)

 

 

 

 

&

определение адреса

 

 

 

 

*

обращение по адресу

 

 

 

 

(тип)

преобразование типа

 

 

 

 

sizeof

определение размера в байтах

 

 

 

3

*

умножение

бинарные

Слева на-

 

 

/

деление

арифмети-

право

 

 

%

определение остатка от деления по

ческие

 

 

 

 

модулю

 

 

 

4

+

сложение

бинарные

Слева на-

 

 

-

вычитание

арифмет.

право

 

5

<<

сдвиг влево

сдвига

Слева на-

 

 

>>

сдвиг вправо

 

право

 

6

<

меньше чем

отношения

Слева на-

 

 

<=

меньше или равно

 

право

 

 

>

больше чем

 

 

 

 

>=

больше или равно

 

 

 

7

==

равно

отношения

Слева на-

 

 

!=

неравно

 

право

 

8

&

побитовая операция "И"

поразрядная

Слева на-

 

 

 

 

 

право

 

6

Продолжение табл. 1

Вес

Знак

Наименование операции

Тип

Порядок

 

 

 

 

операции

 

9

^

побитовая

«исключающее "ИЛИ"»

поразрядная

Слева на-

 

 

 

 

 

право

10

|

побитовая

"ИЛИ"

поразрядная

Слева на-

 

 

 

 

 

право

11

&&

логическая операция "И"

логическая

Слева на-

 

 

 

 

 

право

12

||

логическая операция "ИЛИ"

логическая

Слева на-

 

 

 

 

 

право

13

? :

условная операция

тернарная

Справа на-

 

 

 

 

 

лево

14

=

простое присваивание

присваи-

Справа на-

 

+=

сложение с присваиванием

вания

лево

 

-=

вычитание с присваиванием

 

 

 

*=

умножение с присваиванием

бинарные

 

 

/=

деление с присваиванием

 

 

 

%=

выделение остатка от деления с при-

(для двоич-

 

 

 

сваиванием

 

ных опе-

 

 

<<=

сдвиг двоичного числа влево с при-

рандов)

 

 

 

сваиванием

 

 

 

 

>>=

сдвиг двоичного числа вправо с при-

 

 

 

 

сваиванием

 

 

 

 

&=

побитовая

операция "И" с при-

 

 

 

 

сваиванием

 

 

 

 

|=

поразрядная операция "ИЛИ" c при-

 

 

 

 

сваиванием

 

 

 

 

^=

исключающее "или" с присваивани-

 

 

 

 

ем

 

 

 

15

,

операция "запятая" (соединения)

Бинарная

Слева на-

 

 

 

 

 

право

2.2.Операторы языка Си

1.Оператор "Выражение" имеет три формы

<идентификатор>=<выражение>; //

выполяет простое присваивание;

<идентификатор><знак>=<выражение>;

// составное присваивание,

<идентификатор>=<идентификатор>=<выражение>;

реализует многоступенчатое присваивание справа налево.

Примеры: z=x;

w+=2; /* w=w+2*/

s=t=1;

 

 

7

2. Условный оператор записывается следующим способом

if (<выражение>) <оператор1;> else (<оператор2>);

Пример: a) if (k != 0) k = k+1;

b) if (k)

k++;

else k = k-1;

else

k--;

3. Оператор цикла со счетчиком:

for (<выражение1>;<условие выполнения>;<выражение2>) <оператор>;

где <выражение1> - выражение инициализации параметра цикла, <выражение2> - изменение параметра цикла,

Пример: for (i=0; i<100; i++)

sum += x[i]; // sum=sum+x[i];

4. Оператор цикла с предусловием:

while ( <выражение> ) <оператор>;

Пример: while (i<100) p++;

5. Оператор цикла с постусловием

do {<операторы>} while ( <условие выполнения> );

Пример: do {

n *= i; i++;

}

while (i <= 100);

6. Оператор безусловного перехода:

goto <идентификатор-метка>;

7. Оператор возврата из функции:

return <выражение>;

8. Оператор-переключатель:

switch ( <выражение> ) {

case <консатнта1> : <группа операторов1>; case <консатнта2> : <группа операторов2>;

...

case <консатнтаN> : <группа операторовN>; default : <операторы>;

};

Метки определяют точки входа в тело оператора. Чтобы выполнить только одно действие, необходимо предусмотреть выход из данного оператора в нужном месте.

Пример:

8

switch (operand) {

 

case 1: x *= y; break;

 

case 2:

x /= y; break;

 

case 3:

x += y; break;

 

case 4: x -= y; break;

 

case 5: x++;

 

case 6: x++; break;

 

case 7:

 

 

case 8:

 

 

case 9:

printf("Not done\n"); break;

 

default:

printf("Bug!\n");

 

exit(1);

 

 

}

 

9. Оператор

break;

 

организует досрочный выход из операторов while, do, for или switch.

10. Оператор continue;

выполняет переход на седующую итерацию и выполняет первый оператор тела цикла while, do или for.

Пример:

for (i = 0; i < 20; i++) {

if (array[i] == 0)

continue;

array[i] = 1/array[i];

}

2.3 Перегрузка функций

Пусть по ходу программы надо часто печатать значения типа int, double, char*. В стандартном Си потребовалось бы дать этим трем функциям различные имена, а вот в С++ можно написать «умную» функцию print, существующую как бы в трех видах.

# include <stdio.h> void print(int i)

{ printf("%d ", i); } void print(double x)

{ printf("%lf ", x); } // Можно и {printf("%f ", x); } void print(char* s)

{ printf("%s ", s); }

void main()

{

int j=5;

float pi=3.14159268;

9

double e=2.7183; print(j); print(pi); print(e); print("Hello!\n");

}

Компилятор сам выбирает, какую из трех (!) различных функций с именем print (по терминологии С++ «перегруженных» - overloaded) вызвать в каждом случае. Критерием выбора служат количество и тип аргументов, с которым функция вызывается, причем, если не удается найти точного совпадения (float), то компилятор выбирает ту функцию, при вызове которой « наиболее легко» выполнить для аргументов преобразование типа.

Перегруженные функции различаться только по типу возвращаемого значения

не могут:

void f (int, int,);

 

int f(int, int);

// ошибка.

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

Чтобы сообщить компилятору С++, что имена тех или иных функций не должна перегружатся, их следует объявить как extern «с»:

extern «с» int func 1(int);

// отдельная функция

extern «с»

// несколько функций

{

 

void func 2 (int);

 

int func3 ( )

 

double func4 (double);

 

;

 

Модификатор extern «с»

можно использовать и при определении функций.

Функции, описанные как extern «с» не могут быть перегруженными.

2.4 Перегрузка операций

В С++ можно заставить привычные операции выполнять те действия над определенными типами данных, которые мы хотим. Пусть @ есть некоторый знак операции языка Си++, кроме следующих

(разрешение области видимости) (условная операция)

Тогда достаточно определить функцию с именем operator@ и требуемым числом и типами аргументов так, чтобы эта функция выполняла необходимые действия.

Пример. Переопределим («перегрузим») операцию сложения для данных типа string (строки).

#include <stdio.h>

#include <string.h>

10