Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Lab_16_17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.46 Mб
Скачать

Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»

(2016/17 семестр 3)

Овсянник В.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование» 1

1. Интегрированная среда MVS-2010 2

2. Массивушки и подпрограммочки 11

3. Поиск экстремумов с ограничениями или «Брачное агенство» 16

4. Задача «куча камней» 23

5. Разработка простого класса 27

6. Класс вектор 36

7. Наследование классов 42

8. Приложение с окном вида 46

9. Абстрактные классы и виртуальные функции 53

10. Разработка класса контейнера 58

12. Перегрузка векторных и матричных операций 63

13. Программирование односвязного списка 69

14. Приложение, основанное на модальном диалоговом окне 71

15. Приложения 98

Список литературы 102

1.Интегрированная среда mvs-2010

Неопределимые ошибки бесконечны, а определимые ограничены возможностями компилятора

Закон Мерфи

Цель работы – освоить основные возможности интегрированной среды Microsoft Visual Studio 2010 (далее ИС MVS-2010) по разработке и отладке типового консольного приложения на языке С++ (4 час.)

Задание. Проделайте следующее:

  1. Прочитайте это задание и методические указания до конца, прежде чем терзать клавиатуру, соседа, преподавателя и пр. сущности

  2. Запустите на выполнение ИС MVS-2010, ознакомьтесь с командами меню и инструментальными панелями.

  3. Создайте консольное приложение и дайте ему благопристойное имя («Как яхту назовешь – так она и поплывет»).

  4. Напишите программный код, реализующий выпавший вам по жребию вариант задания, и попробуйте его отладить, используя средства отладки.

  5. Освойте использование команд компиляции, запуска и отладки приложения (F7, Ctrl+F7, F5, Ctrl+F5, Shift+F5, F10, F11 и пр.).

  6. Научитесь вызывать контекстное меню Debug, выполнять трассировку программы, просматривать значения переменных во время отладки, устанавливать и снимать контрольные точки (breakpoint).

  7. Научитесь использовать окна «Autos», «Locals» и «Watch» для просмотра значений переменных во время выполнения (трассировки) программы. Воспользуйтесь помощью (Help) и трассировкой для изучения назначения перечисленных окон.

  8. Попробуйте сдать работу, предварительно тщательно протестировав ее на предмет отсутствия хомутов

1.1.Методические указания

Шаг 1. Создание заготовки приложения.

Запустите на выполнение ИС, с помощью команды FileNewProject вызовите мастера ИС, выберите шаблон Win32 Console Application (рис. 1), в свойствах проекта Application Settings выберите, для простоты, поддержку MFC (рис. 2). В этом сценарии я присвоил проекту очень оригинальное имя Lab1. При создании проекта не устанавливайте (или снимите, если он установлен по умолчанию), переключатель Create directory for solutions (см. рис. 1).

Если при выборе каркаса приложения вы ошиблись, то надо выйти из ИС, удалить папку с проектом и начать жизнь с начала.

Совет. В условиях работы в сети рекомендую выбрать локальный диск компьютера, а не сетевой, для ускорения работы, отсутствия проблем согласования времени локального компьютера и сетевого, уменьшения вероятности потери проекта из-за возможных сбоев сети. На локальном компьютере рекомендую выбирать каталог, имя которого и путь к нему не содержат символов кириллицы, например, C:\Temp. Самое плохое место для работы над проектом – флешка. Сохраняйте проект на флешке только тогда, когда вы закончили работу с ним, например, в конце лабораторной работы.

Рис. 1. Выбор каркаса консольного приложения – начало

Рис. 2. Выбор каркаса консольного приложения – продолжение

Шаг 2. Первое редактирование проекта и еще некоторые его настройки.

Если вы присвоили проекту имя Lab1, то ИС создаст файл Lab1.cpp, в котором вы обнаружите, в частности, функцию _tmain. Это так называемая главная функция, с первой строки которой и начинается выполнение программы. Она содержит, в принципе, полезный программный код, но на первых порах он нам не нужен. Поэтому сделайте следующий крамольный шаг: удалите весь программный код от строки

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

до конца функции _tmain, т.е. в данном случае до конца файла. Удалили? Но так как главная функция все же необходима, введем ее в следующем упрощенном виде:

void main()

{

cout<<"Hello, boys&girls! How do you do?"; // вывод строки на монитор

}

Ясное дело, что эта гениальная программа выводит на монитор одну строку текста, причем на английском языке. Если вы попробуете использовать символы кириллицы, то ничего читабельного на мониторе не увидите, пока.

Далее откомпилируем программу, выполнив команду Build Solution F7 меню Build. В нижней части монитора найдите окно Output (рис. 3), в котором отображаются результаты компиляции приложения. Текст Build: 1 succeeded, 0 failed, ... сообщает нам об успешной компиляции проекта.

Рис. 3. Окно вывода Output

Если окно Output от вас прячется, призовите его к ответу с помощью волшебной команды ViewOutput Alt+F2.

В качестве тренажа измените имя функции, вставив в него пробел (ma in), выполните команду BuildBuild Solution F7. В окне вывода вы должны увидеть три сообщения об ошибке и одно предупреждение. Выберите первое (самое верхнее) сообщение об ошибке и сделайте по нему двойной клик ЛКМ. ИС отправит вас в то место программы, где компилятор обнаружил ошибку, и вам останется только исправить ее.

Еще одно очень важное замечание. Чтобы облегчить себе жизнь, выполните команду ToolsOptions... и сделайте в нем установки в соответствии с рис. 4. Если непонятно, зачем это нужно и что это вам дает, спросите у препода – он должен знать.

Шаг 3. Запуск приложения на выполнение.

Выполните команду DebugStart debugging Alt+F5, тем самым запустив приложение на выполнение в режиме отладки, что полезно при разработке программы. Если ошибок компиляции нет и вы обладаете сверх способностями, то успеете разглядеть в появившемся на доли секунды окне текст Hello, boys&girls! How do you do? : символы белого цвета на черном фоне. Чтобы успеть полюбоваться выводом программы, надо попридержать ее завершение. Для этого доведите текст главной функции до такого вида:

void main()

{

cout<<"Hello, boys&girls! How do you do?"; // вывод строки на монитор

_getch(); // ожидает нажатия любой клавиши

}

Запустите компиляцию программы. Узрели сообщение об ошибке error C3861: '_getch': identifier not found? Оно значит, что мы должны указать компилятору заголовочный файл, в котором описана хвункция _getch(). Короче, с помощью машины времени или каким-либо другим способом переместитесь в начало файла и модифицируйте текст программ таким образом:

#include "stdafx.h"

#include "Lab1.h"

#include <conio.h> // добавлено!

Рис. 4. Весьма полезные настройки ИС

Вновь запустите программу на выполнение и убедитесь в том, что окно программы не исчезает. Вы можете его закрыть путем нажатия любой клавиши или путем подачи команды DebugStop Debugging Shift+F5. Если вы хотите быть профессионалом и терять меньше времени на отладку программы, завершайте ее выполнение именно таким способом, а не путем нажатия кнопки «Закрыть» в правом верхнем углу окна. Проверьте!

Шаг 4. Русификация приложения. Добавим в функцию main() пару строчек:

void main()

{

setlocale(LC_ALL,"rus");

cout<<"Как дела?"<<endl;

cout<<"Hello, boys&girls! How do you do?"; // вывод строки на монитор

_getch(); // ожидает нажатия любой клавиши

}

Запустите программу на выполнение и лицезрите результат.

Шаг 5. Ознакомьтесь с перечнем файлов проекта (табл.1).

Таблица 1

Перечень файлов проекта

Файл

Содержимое

Lab1.vcproj

файл проекта формата XML, содержащий сведения о версии ИС, программной платформе приложения, настройках проекта и пр.

Lab1.ncb

база данных интеллектуального средства Class View

ReadMe.txt

содержит текстовое описание проекта и входящих в него файлов

stdafx.h, stdafx.cpp

эти файлы используются для построения предкомпилированных заголовочных файлов (.pch - precompiled header files)

Resource.h

стандартный заголовочный файл, содержащий определения идентификаторов ресурсов приложения

Lab1.rc

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

Lab1.h

заголовочный файл приложения

Lab1.sln

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

Lab1.suo

скрытый двоичный файл, содержащий пользовательские настройки решения (Solution User Options)

Lab1.vcproj.NEW.Виктор.user

файл формата XML, содержащий описания конфигураций (debug, release) решения. NEW – имя компьютера, Виктор – имя пользователя

Lab1.cpp

основной файл проекта, содержащий функцию main() и программный код, добавленный программистом

Из всех перечисленных в табл.1 типов файлов непосредственно редактируются файлы с исходными текстами программы .cpp и заголовочные файлы .h. Остальные файлы, за исключением файла .rc, не редактируются в ИС напрямую и их не стоит модифицировать с помощью внешних редакторов.

При компиляции и сборке приложения создается каталог Debug или Release, в зависимости от выбранной конфигурации (Debug или Release), в которых размещается исполняемый файл приложения (.ехе), объектные файлы (.obj), предкомпилированные заголовочные файлы (.pch) и некоторые другие вспомогательные файлы. Для работы приложения необходим только ехе-файл, а остальные можно удалять (из каталогов Debug и Release только!) при необходимости сокращения объема памяти, занимаемого проектом. Также для сокращения объема памяти, занимаемой проектом, можно удалить файл .sdf. Простым и удобным способом удаления необязательных файлов, в том числе ехе-файла, является использование команды меню BuildClean Solution. Эта команда бывает также полезна при необходимости повторной компиляции и сборки приложения в случае какой-либо непонятной ошибки.

Рекомендую просмотреть не двоичные файлы проекта с помощью какого-либо внешнего редактора, например, с помощью файлового менеджера Far, Total Commander или блокнота.

Шаг 6. Прежде чем двигаться дальше, давайте посмотрим на наиболее часто используемые команды меню Build.

Таблица 2

Основные команды меню Build

Команда

Назначение

Build Solution F7

Компилирует и собирает все проекты решения, обрабатывая все файлы, которые были изменены со времени последней сборки. После сборки программа может быть запущена на выполнение, если во время сборки не было фатальных ошибок

Rebuild Solution Ctrl+Alt+F7

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

Clean Solution

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

Compile Ctrl+F7

Компилирует выбранный (выбранные) файлы проекта

Configuration manager …

Вызов окна для установки текущей активной конфигурации (Debug или Release) и программной платформы приложения

Основные команды меню Debug приведены в табл. 3. Перечень команд этого меню сильно зависит от текущего режима работы ИС: если приложение запущено и находится в режиме отладки, то набор доступных команд этого меню наиболее полный.

Таблица 3

Основные команды меню Debug

Команда

Назначение

Windows

Вызывает вспомогательное меню, с помощью которого, в свою очередь, можно вызывать окна вывода, просмотра значений наблюдаемых переменных (watch) и многое другое. Смотрите и изучайте. Как сказал один неглупый человек «Если Вы бог, то Вам отладчик не нужен. А нам, простым смертным, он необходим»

Break All

Останавливает выполнение всех программ, выполняющихся под управлением отладчика, без их завершения. Полезно использовать для приостановки «вечных» или просто длительных по времени циклов

Continue F5

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

Restart Ctrl+Shift+F5

Завершение текущей отладки и повторный старт программы в режиме отладки

Stop Debugging Shift+F5

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

Step into F11

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

Step over F10

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

Step out Shift+F11

Выполнение программы до выхода из текущей функции

Quick Watch

Вызов окна для просмотра значений переменных и добавления их в окно Watch (понаблюдайте внимательно за работой этой команды)

Toggle breakpoint F9

Установить или удалить контрольную точку

Из других команд отладки часто используют Run to Cursor Ctrl+F10 – выполнить программу до оператора, на который указывает курсор. При запуске программы в режиме отладки на панели инструментов ИС появляется панель кнопок, дублирующих указанные в табл. 3 команды. Эту панель можно вызвать командой ViewToolbarsDebug.

Когда программа запущена на выполнение в режиме отладки (командами F10, F11 или F5 с установленной точкой прерывания breakpoint), то в окне Output появятся вкладки Autos, Locals, Watch и другие.

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

Во вкладке Locals отображаются значения локальных переменных текущей функции.

Во вкладке Watch можно добавить для просмотра значения переменных и/или выражений.

Шаг 7. Тренаж по завершению и возобновлению работы над проектом.

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

Замечание. Вы могли не сохранять файлы проекта и при этом у Вас не появляется окно с предложением сохранить файлы. Почему? Да потому, что по умолчанию в среде MVS-2010 (Tools|Options|Projects and solutions|Build and Run) установлено автоматическое сохранение файлов проекта перед его сборкой (в списке Before building выбрано значение Save all changes – см. рис. 4). Кстати, в том же окне настоятельно рекомендую в выпадающем списке “On Run, when build or deployment errors occur” (что необходимо делать при наличии ошибок построения или развертывания приложения) выбрать значение “Do not launch” (не запускать). Если оставить опцию “Launch old version” (запускать старую версию), то Вы можете не заметить ошибок, заподозрить в них неисправность компьютера, колдовство, нечистую силу или действие потусторонних сил и это будет очень неудобно. Кстати, если после многократных безуспешных попыток исправить ошибки компиляции вы решите купить новый компьютер – оставьте старый кафедре.

Имена последних проектов отображаются в окне Start Page на вкладке Recent Projects, откуда можно загрузить любой проект простым щелчком ЛКМ. Для повторного открытия проекта (или решения) можно также выполнить команду FileRecent Projects и в появившемся списке выбрать имя требуемого проекта. Альтернативная команда – FileOpen Project/Solutions, но она менее удобна.

Замечание. Даже под страхом смерти не открывайте файл проекта (.vcproj) или другие файлы проекта просто как файлы с помощью команды FileOpen, так как при этом могут быть конфликты. Команду FileOpen следует использовать только для открытия каких-либо файлов, не входящих в состав проекта

Шаг 8. Вывод целых чисел в двоичной системе счисления. Это может сделать следующая программа:

/* PrintBinary выводит значение числа х в двоичной

системе счисления. Значение числа д.б. в диапазоне

0..255*/

void РrintBinary(int х)

{

int Bit=128;

for(int i=0;i<8;i++,Bit>>=1)

if((х&Вit)!=0) cоut<<1; else cout<<0;

cout<<endl;

}

void mаin()

{

setlocаle(LC_ALL,"rus");

int a,b,res;

cout<<"Введи два целых числа из диапазона 0..255>";

cin>>а>>b;

PrintВinarу(a);

cout<<" +"<<endl;

PrintBinary(b);

res=a+b;

сout<<" v"<<еndl;

PrintBinаry(rеs);

_gеtсh(); // ожидает нажатия любой клавиши

}

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

Шаг 9. Наконец-то самостоятельная работа!

Доработайте программу таким образом, чтобы она выполняла над данными те операции, которые выпали вам по жребию. Ваш вариант задания приведен в таблице 4: номер варианта – это номер бригады.

Таблица 4

Операции, которые вы должны реализовать в программе

№ вар.

Операции

+ - * / % & ^ |

/ % << >> & ^ |

+ - * / % << >> |

+ - * / << >> & |

+ - * >> & ^ |

* / % << >> & ^ |

+ - * / % & ^ |

/ % << >> & ^ |

+ - * / % << >> |

+ - * / << >> & |

+ - * >> & ^ |

* / % << >> & ^ |

>> & ^ | + - * /

/ % << + - * ^ |

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

Введи два целых числа из диапазона 0..255 для сложения>4 12

00000100

+

00001100

v

00010000

Введи два целых числа из диапазона 0..255 для умножения>3 27

00000011

*

00011011

v

00011110

Шаг 10. Использование отладчика.

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

Рис. 5. Меню ToolsOptions, с помощью которого, в частности, можно включить

нумерацию строк исходных текстов программы

Шаг 11 – последний, точнее, крайний? Примеры контрольных коварных вопросов преподавателя:

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

  2. Продемонстрируйте применение трассировки с «заходом» в функции и без оного и объясните разницу между ними

  3. Поставьте в программе контрольную точку (breakpoint) и выполните программу до нее.

  4. Прервите процесс отладки программы с помощью команды меню или с помощью «горячей» клавиши.

  5. Покажите в справочной системе место, где описано назначение окон Watch, Autos и Locals.

  6. Покажите, как вызываются окна Watch, Autos и Locals.

  7. Покажите, как просматривать значения переменных и выражений с помощью окон Watch, Autos и Locals.

  8. В чем отличия между окнами Watch, Autos и Locals?

  9. Объясните правила выполнения той или иной операции, в частности, битовых операций: << >> & ^ | и др.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]