технология программирования
.pdfФедеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Омский государственный технический университет»
Шафеева О. П.
Технологии программирования
Учебное пособие
Омск 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