Основы программирования на языке C++
АЛМАТИНСКИЙ ФИЛИАЛ НЕГОСУДАРСТВЕННОГО ОБРАЗОВАТЕЛЬНОГО
УЧРЕЖДЕНИЯ ВЫСШЕГО
«САНКТ-ПЕТЕРБУРГСКИЙ
Факультет: экономический
Кафедра:
информатики и математики
Контрольная работа
По дисциплине:
Объектно-ориентированное программирование
На тему:
«Основы программирования на языке C++»
Выполнил: студент
3-ого курса группы 301 ПИВ
экономического факультета
Балдин Сергей Викторович
Проверила: ст.преп.
Харитонова Лариса Сергеевна
Алматы, 2010
Содержание
Введение
Объектно-ориентированное программирование – это основная методология программирования 1990-х годов и начала XXI века. Она представляет собой продукт более 35 лет практики и опыта, которые восходят к использованию языка Simula 67, затем Smalltalk и не так давно Objective C, Object Pascal, Turbo Pascal, CLOS, а теперь, например, C++ и Java. В основе объектно-ориентированной парадигмы программирования лежат три принципа: инкапсуляция, наследование, полиморфизм.
Объектно-ориентированный анализ и проектирование принципиально отличаются от традиционных подходов структурного проектирования: здесь нужно по-другому представлять себе процесс декомпозиции, а архитектура получающегося программного продукта в значительной степени выходит за рамки представлений, традиционных для структурного программирования. Отличия обусловлены тем, что структурное проектирование основано на структурном программировании, тогда как в основе объектно-ориентированного проектирования лежит методология объектно-ориентированного программирования, К сожалению, для разных людей термин "объектно-ориентированное программирование" означает разное. Ренч правильно предсказал: "В 1980-х годах объектно-ориентированное программирование будет занимать такое же место, какое занимало структурное программирование в 1970-х. но всем будет нравиться. Каждая фирма будет рекламировать свой продукт как сданный по этой технологии. Все программисты будут писать в этом стиле, причем все по-разному. Все менеджеры будут рассуждать о нем. И никто не будет знать, что же это такое". Данные предсказания продолжают сбываться и в 1990-х годах.
1. Часть I (Теоретическая)
Система классов для описания исключительных ситуаций
C++ представляет исключительные ситуации как классы
Ваша цель при использовании исключительных ситуаций C++ состоит в упрощении обнаружения и обработки ошибок в программах. В идеале, если ваши программы обнаруживают неожиданную ошибку (исключительную ситуацию), им следует разумным образом ее обработать вместо того, чтобы просто прекратить выполнение.
В программах вы определяете каждую исключительную ситуацию как класс. Например, следующие ситуации определяют три исключительные ситуации для работы с файлами:
код C++
class file_open_error {};
class file_read_error {};
class file_write_error {};
Как заставить С++ проверять исключительные ситуации
Прежде чем ваши программы могут обнаружить и отреагировать на исключительную ситуацию, вам следует использовать оператор C++ try для разрешения обнаружения исключительной ситуации. Например, следующий оператор try разрешает обнаружение исключительной ситуации для вызова функции file_соpy:
код C++
try
{
file_copy("SOURCE.ТХТ", "TARGET.ТХТ");
};
Сразу же за оператором try ваша программа должна разместить один или несколько операторов catch, чтобы определить, какая исключительная ситуация имела место (если она вообще была):
код C++
try
{
file_copy("SOURCE.ТХТ", "TARGET.ТХТ");
};
catch (file_open_error)
{
cerr << "Ошибка открытия исходного или целевого файла" << endl;
exit(1);
}
catch (file_read_error)
{
cerr << "Ошибка чтения исходного файла" << endl;
exit(1);
}
catch (file_write_error)
{
cerr << "Ошибка записи целевого файла" << endl;
exit(1);
}
Как видите, приведенный код проверяет возникновение исключительных ситуаций работы с файлами, определенных ранее. В данном случае независимо от типа ошибки код просто выводит сообщение и завершает программу. В идеале ваш код мог бы отреагировать и не так — возможно, попытаться исключить причину ошибки и повторить операцию. Если вызов функции прошел успешно и исключительная ситуация не выявлена, C++ просто игнорирует операторы catch.
Использование оператора throw для генерации исключительной ситуации
Сам C++ не генерирует исключительные ситуации. Их генерируют ваши программы, используя оператор C++ throw. Например, внутри функции file_copy программа может проверить условие возникновения ошибки и сгенерировать исключительную ситуацию:
код C++
void file_copy(char *source, char *target)
{
char line[256];
ifstream input_file(source);
ofstream output_file(target);
if (input_file.fail())
throw(file_open_error);
else
if (output_file.fail()) throw(file_open_error);
else
{
while ((! input_file.eof()) && (! input_file.fail()))
{
input_file.getline(line, sizeof(line));
if (! input_file.fail()) output_file << line << endl;
else throw(file_read_error);
if (output_file.fail()) throw (file_write_error);
}
}
}
Как видите, программа использует оператор throw для генерации определенных исключительных ситуаций.
Как работают исключительные ситуации
Когда вы используете
исключительные ситуации, ваша программа
проверяет условие
Определение обработчика исключительной ситуации
Когда ваша программа генерирует исключительную ситуацию, C++ запускает обработчик исключительной ситуации (функцию), чьи операторы вы определили в классе исключительной ситуации. Например, следующий класс исключительной ситуации nuke_meltdown определяет операторы обработчика исключительной ситуации в функции nuke_meltdown:
код C++
class nuke_meltdown
{
public:
nuke_meltdown(void){ cerr << "\а\а\аРаботаю! Работаю! Работаю!" << endl; }
};
В данном случае, когда программа сгенерирует исключительную ситуацию nuke_meltdown, C++ запустит операторы функции nuke_meltdown, прежде чем возвратит управление первому оператору, следующему за оператором try, разрешающему обнаружение исключительной ситуации. Следующая программа MELTDOWN.CPP иллюстрирует использование функции nuke_meltdown. Эта программа использует оператор try для разрешения обнаружения исключительной ситуации. Далее программа вызывает функцию add_u232 c параметром amount. Если значение этого параметра меньше 255, функция выполняется успешно. Если же значение параметра превышает 255, функция генерирует исключительную ситуацию nuke_meltdown:
код C++
#include <iostream.h>
class nuke_meltdown
{
public:
nuke_meltdown(void){ cerr << "\а\а\аРаботаю! Работаю! Работаю!" << endl; }
};
void add_u232(int amount)
{
if (amount < 255) cout << "Параметр add_u232 в порядке" << endl;
else throw nuke_meltdown();
}
void main(void)
{
try
{
add_u232(255);
}
catch (nuke_meltdown)
{
cerr << "Программа устойчива" << endl;
}
}
Если вы откомпилируете и запустите эту программу, на экране дисплея появится следующий вывод:
код C++
С:\> MELTDOWN <ENTER>
Работаю! Работаю! Работаю!
Программа устойчива
Если вы проследите исходный код, который
генерирует каждое из сообщений, то сможете
убедиться, что поток управления
при возникновении
Определение обработчика исключительной ситуации
Когда C++ обнаруживает в программе исключительную ситуацию, он запускает специальную функцию, которая называется обработчиком исключительной ситуации. Для определения обработчика исключительной ситуации вы просто создаете функцию в классе исключительной ситуации, которая имеет такое же имя, как и сама исключительная ситуация (подобно конструктору). Когда ваша программа в дальнейшем сгенерирует исключительную ситуацию, C++ автоматически вызовет соответствующий обработчик. В идеале обработчик исключительной ситуации должен выполнить операции, которые бы исправили ошибку, чтобы ваша программа могла повторить операцию, ставшую причиной ошибки. После завершения обработки исключительной ситуации выполнение вашей программы продолжается с первого оператора, следующего за оператором try, разрешившего обнаружение исключительной ситуации.
Использование элементов данных исключительной ситуации
В предыдущих примерах ваши программы, используя оператор catch, могли определить, какая именно исключительная ситуация имела место, и отреагировать соответствующим образом. В идеале, чем больше информации об исключительной ситуации могут получить ваши программы, тем лучше они смогут отреагировать на ошибку. Например, в случае с исключительной ситуацией file_open_error вашей программе необходимо знать имя файла, который вызвал ошибку. Аналогично, для файловых исключительных ситуаций file_read_error или file_write_error программа, возможно, захочет узнать расположение байта, на котором произошла ошибка. Чтобы сохранить подобную информацию об исключительной ситуации, ваши программы могут просто добавить элементы данных в класс исключительной ситуации. Если в дальнейшем ваша программа сгенерирует исключительную ситуацию, она передаст эту информацию функции обработки исключительной ситуации в качестве параметра, как показано ниже:
код C++
throw file_open_error(source);
throw file_read_error(344);
В обработчике исключительной ситуации эти параметры могут быть присвоены соответствующим переменным класса (очень похоже на конструктор). Например, следующие операторы изменяют исключительную ситуацию file_open_error, чтобы присвоить имя файла, который вызвал ошибку, соответствующей переменной класса:
код C++
class file_open_error
{
public:
file_open_error(char *filename) { strcpy(file_open_error::
char filename[255];
};
Обработка неожиданных исключительных ситуаций
Компиляторы C++ предоставляют функции библиотеки этапа выполнения, которые вы можете использовать в своих программах. Если вы читали документацию по этим функциям, то могли обратить внимание на функции, которые генерируют определенные исключительные ситуации. В таких случаях ваши программы должны проверять соответствующие исключительные ситуации. По умолчанию если ваша программа генерирует исключительную ситуацию, которая не улавливается (программа не имеет соответствующего обработчика исключительной ситуации), то запустится стандартный обработчик, предоставляемый языком C++. В большинстве случаев стандартный обработчик завершит вашу программу. Следующая программа UNCAUGHT.CPP иллюстрирует, как стандартный обработчик исключительной ситуации завершает выполнение вашей программы:
код C++
#include <iostream.h>
class some_exception { };
void main(void)
{
cout << "Перед генерацией исключительной ситуации" << endl;
throw some_exception();
cout << "Исключительная ситуация сгенерирована" << endl;
}
В данном случае, когда программа генерирует исключительную ситуацию (которая не улавливается программой), C++ вызывает стандартный обработчик исключительной ситуации, который завершает программу. Поэтому последний оператор программы, который выводит сообщение о генерации исключительной ситуации, никогда не выполняется. Вместо использования стандартного обработчика исключительной ситуации C++ ваши программы могут определить свой собственный стандартный обработчик (обработчик по умолчанию). Чтобы сообщить компилятору C++ о своем стандартном обработчике, ваши программы должны использовать функцию библиотеки этапа выполнения set_unexpected. Прототип функции set_unexpected определен в заголовочном файле except.h.
Объявление генерируемых функцией исключительных ситуаций
Как вы уже знаете, прототип
функции позволяет вам
код C++
void power_plant(long power_needed) throw (melt_down, radiation_leak);
Включая подобным образом возможные исключительные ситуации в прототип функции, вы можете легко сообщить другому программисту, который будет читать ваш код, какие исключительные ситуации ему необходимо проверять при использовании данной функции.
Исключительные ситуации и классы
При создании класса вы, возможно, захотите определить исключительные ситуации, характерные для данного класса. Чтобы создать исключительную ситуацию, характерную для конкретного класса, просто включите эту исключительную ситуацию в качестве одного из общих (public) элементов класса. Например, следующее описание класса string определяет две исключительные ситуации:
код C++
class string
{
public:
string(char *str);
void fill_string(*str);
void show_string(void);
int string_length(void);
class string_empty { };
class string_overflow {};
private:
int length;
char string[255];
};
Как видите, этот класс определяет исключительные ситуации string_empty и string_overflow. В своей программе вы можете проверить наличие исключительной ситуации, используя оператор глобального разрешения и имя класса, как показано ниже:
код C++
try
{
some_string.fill_string(some_
};
catch (string::string_overflow)
{
cerr << "Превышена длина строки, символы отброшены" << endl;
}
2. Часть II (Практическая)
Задание 1
Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. До Хкон. с шагом dX.
при x<0 и b≠0
при x>0 и b=0
в остальных случаях
Где a,b,c – действительные числа.
Функция F должна принимать действительное значение, если выражение (Ац ИЛИ Вц) И (Ац ИЛИ Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a,b,c, операции И и ИЛИ – поразрядные. Значения a,b,c, Xнач, Xкон, dX ввести с клавиатуры.
При реализации задачи в среде C++ получается результат:
Задание 2
Реализация классов
Реализация прикладной
пpoграммной системы, спpoектиpoванной с
помощью объектно-
class Window
{
public:
// конструктор
Window (Length x0, Length y0, Length width, Length height);
// деструктор
~Window ();
// методы
void add_box (Length x, Length y, Length width, Length height);
void add_circle (Length x, Length y, Length radius);
void clear_selections ();
void cut_selections ();
Group* group_selections ();
void move_selections (Length deltax, Length deltay);
void redraw_all ();
void select_item (Length x, Length y);
void ungroup_selections ();
private:
Length xmin;
Length ymin;
Length xmax;
Length ymax;
void add_to_selections (Shape* shape);
};
В определении класca на языке C++ и атрибуты, и методы называются членами этого класca; их определения могут следовать в тексте определения класca в пpoизвольном порядке. Члены класca могут быть общедоступными (public), или приватными (private); вне класca определен доступ только к его общедоступным членам, а приватные члены доступны только методам своего класca. В рассматриваемом примере вce атрибуты являются приватными, а вce методы (кpoме метода add_to_selections) - общедоступными, так что пpoчитать или изменить значение каждого атрибута можно только с помощью соответствующего метода; это рекомендуемая, хотя и не обязательная дисциплина пpoграммиpoвания на языке C++ (определение вceх атрибутов класca как приватных называется инкапсуляцией данных).
Тип Length должен быть определен пользователем (обычно такие определения делаются в одном из файлов-заголовков, вставляемых в пpoграмму по #include). Для определения типа используется оператор typedef. Например:
typedef float Length;
или
typedef int Length;
Заключение
В данной работе были рассмотрены вопросы:
1. Методы классов. Использование аргументов по умолчанию, неопределенное число аргументов, подстановка тела функции;
2. Циклические вычислительные процессы;
3.Реализация классов.
В ходе выполняемой работы я:
- что такое классы. Как использовать аргументы по умолчанию, неопределенное число аргументов, как подставлять тело функции.
- научился разрабатывать программы с циклическими вычислительными процессами на языке С++.
- Узнал и изучил реализацию класса, нашел работающий пример с реализацией классов.
Список использованной литературы
- В.М.Дёмкин. Основы объектно-ориентированного программирования в примерах на С++: Учебное пособие. – Н.Новгород: НФ ГУ-ВШЭ, 2005. – 148 с.
- C/C++. Программирование на языке высокого уровня / Т. А. Павловская. — СПб.: Питер, 2003. —461 с: ил.
- C++. Объектно-ориентированное программирование: Практикум. — СПб.: Питер, 2006. — 265 с: ил.
- Язык С++ и объектно-ориентированное программирование/ А. Скляров. - справочное пособие. - Минск.: "Вышэйшая школа", 1997. – 481 с.
- http://ru.wikipedia.org/wiki/