Пример выполнения задания d (1012883), страница 2
Текст из файла (страница 2)
соцС « " -" « епб); соцС « паше « "."; соцС.ргес!в!оп(4); соцп « " а- " « весы(5) « а: СОцС « ", Ь- " « ВЕСЫ(5) Ь; соцС « ", с- " « веСы(5) « с: соыС ";1Св- " в « епб1; ///////////////!///////!/!////////////!/!/////////!/!/!/!!/ /! Иа1п.срр Ф1пс)цбе <1озСгеаш й!пс1цбе "Тг1ащ1е.п" !/(Мис1цбе "Суг(05.Ь" // Гог Чтвца1 С++ 6.0 цз1пд пащеврасе вСб: // Главный цикл Ьоо) боле - Га1ве: ыи!1е ((боле) ( вы!Ссп (Мепц()) ( саве 1т 5поы(ртг!а, и); саве 2: Моче(ртг!а. и): сазе 3: Е!пбМах(РТгта. и); сазе 4: !в(пс1цбеб(ртгта, и); саве 5: соцС ГКанец работы." боле = Сгце: Ьгеай: Ьгеапз Ьгеап; Ьгеап; Ьгеап; « епб1; геСцги О; ) // тпС Мепц() ( вывод пеню соцС « "!и= — — ==-=-==- Г л а в н о е епб1; и е н ю — — — — — — -" « геецгп Весйцщоег([, 5); // — ввод целого числа в заданнон диапазоне 1пС ВеСМцщбег(тпС ппп, 1пС щах) ( 1пС пцщЬег = пп'и - 1; и!М1е (Сгце) ( стп » пцюоег; 1Г ((пцпбег >- ппп) 88 (пцщбег <- щах) 58 (с!п.реей() == '1п')) Ьгеак; е1ве ( соцС « "Повторите ввод (ошидается число от " « щзп « " до " « щах « "):" « епб); с1п.с1еаг(): ып11е (с1п.деС() 1= '1п') ('): соцС « "1 - вывести все объекты!С 3 - найти наксинальный" епб1; соцС « "2 - переместить(С!С 4,- определить отношение включения" « егкП; соцС « "!С!С 5 — выход" « епб1; гетцгп пцшЬег; // - возврат в функцию с асновныи пеню ча1б Ех!ЬВаск() ( соц1 « тдащните ЕпТег." « епб1; с1п.деТО .
с(п.деТ(): /( вывод всех треугольников ча(б 5пои(Тг1апд)е» р тг(а[). 1пь к) [ соц1 « "= — ===- Перечень треугольников -=======" епб): Тог (1пт т - 0: т < 'к; ++т) р Ьг(а[13- 5паш(); 1аг (1 = 0; т < 'к; ++1) р Ьг(а[1)- 5пои51бедгбдгеаО; Ех)1Васк(): // - леренещение ча1б Моче(Тгтапд1е* р (гза[), 1п( 'к) ( соцт « "===- - — Перемещение — --====-=" «епб); 1/ здесь будет код функции... Ех110вск(): /1 поиск наксинального треугольника чотб Е1пбМах(Тг1апд!е* р 1г1а[), 1пс к) ( сает « "=- Поиск ивксинвльного треугольнина =-" « епб1: // здесь будет код функции... Ех(ТВасх(): // — определение отношения включения чатб 1з(пс1цбеб(Тг1впд1е* р 1г1а[3, 1пс Х) ( сац( « " — — Отношение внлючения = ††" « епб): // здесь будет код функции...
Ех(1Васк(); (1 конец проекта Тазк1 2 /11111(11/1(11/1(11/1(11111(1111(1(/11(//(1(1111((/1111111 Рекомендуем вам обратить внимание на следующие моменты'в проекте Тазк1 2. Ед Класс Ро1пс (файлы Ро1 С.П, Ро1п1.срр). О Реализация класса РЬ1ос цока что содержит единственный метод 5пои(), назначение которого очевидно: показать объект типа Ро1п( на экране. Здесь следует заметить, что при решении реальных задач в какой-либо графической оболочке метод 5памО действительно нарисовал бы нашу точку, да еще в цвете.
Но мы-то изучаем «чистый» С++, так что придется удовольствоваться текстовым выводом на экран основных атрибутов точки— ее координат. (Л Класс Тг(апд1е (файлы Тг1впд1е.п, Тг(апд1е,срр). О Назначение большинства полей и методов очевидно из их имен и комментариев. О Поле зьа11с тпт соцпс играет роль глобального' счетчика создаваемых объектов; мы сочли удобным в конструкторах генерировать имена треугольников автоматически: «Треугольник 1», «Треугольник 2» и т.
д., используя текущее значение сацпс (возможны н другие способы именования треугольников). О Поле спаг* оЬ010 избыточно для решения нашей задачи — оно введено исключительно для целей отладки и обучения; вскоре вы увидите, что благодаря отладочным операторам печати в конструкторах и деструкторе удобно наблюдать за созданием и уничтожением объектов. О Метод 5пам5тбеЯпбЯгев() введен также только для целей отладки, — убедившись, что стороны треугольника и его площадь вычисляются правильно (с помощью калькулятора), в дальнейшем этот метод можно удалить. О Конструктор пустого (нулевого) треугольника предусмотрен для создания временных объектов, которые могут модифицироваться с помощью присваивания.
О Метод 5пом() — см. комментарий выше по поводу метода 5паи() в классе Ро1 ос. К сожалению, здесь нам тоже не удастся нарисовать треугольник на экране; вместо этого печатаются координаты его вершин. Основной модуль (файл Мат и. срр). О Инициализация глобальных переменных: обратите внимание на оператор тпь Тгзапд1е::соопс = 0: — если вы забудете это написать, компилятор очень сильно обидится.
О Функция ша(пО: определения восьми точек р1, ..., р8 выбраны произвольно, но так, чтобы из них можно было составить треугольники; определения четырех треугольников сделаны тоже произвольно, впоследствии на них будут демонстрироваться основные методы класса; однако не забывайте, что вершины в каждом треугольнике должны перечисляться ио часовой ситрелке; далее определяются массив указателей Тг( апд1 е' рТгт а [) с адресами объявленных выше треугольников и его размер и; в таком виде удобно передавать адрес рТг1а и величину и в вызываемые серверные функции; главный цикл функции довольно прозрачен и даполнительных пояснений не требует.
О Функция Мепц() — после вывода на экран списка пунктов меню вызывается функция 6езйапЬегО, возвращающая номер пункта, введенный пользователем с клавиатуры. Для чего написана такая сложная функция — бе1ицюЬег()? Ведь можно было просто написать: с(п» пцшбег; ? Но тогда мы не обеспечили бы защиту программы от непреднамеренных ошибок при вводе. Вообще-то ' Свойство глобальности обеспечивается благодаря модификатору зтатзс. == Г л а внае неню — ==--= —---- == — -- — == — -=- Перемеаенне Нзкннте ЕПСег.
в н о е ' н е н ю ---=--=--==-- = — — -= Г л а СалзСгисСаг 1 Гог: СгтаА (Треугольннк 1) СалзтгисСог 1 Тог: СгтаВ (Треугольннк 2) СопзСгисСог 1 Тог: Сг1аС (Треугольннк 3) СолзСгистог 1 Гог: Сг!а0 (Тречгальннк 4) 1 - вывести ясе 2 — переместить 5- Этап 2 чо10 орегаСог +=(Ро1лС6) вопрос надежного ввода чисел с клавиатуры подробно разбирается на семинаре 4 при решении задачи 4.2. Там же вы можете найти описание работы аналогичной функции 6еС1лС() '. О Функция 5лон()просто выводит на экран перечень всех треугольников. В завершение вызывается функция Ех(СВасх(), которая обеспечивает заключительный диалог с пользователем после обработки очереднога пункта меню.
О Остальные функции по обработке оставшихся пунктов меню выполнены в виде заглушек, выводящих только наименование соответствующего пункта. Тестирование и отладка первой версии программы После компиляции и запуска программы вы должны увидеть на экране следую- щий текст: Г л а я н о е н е н ю ==-=-======-== объекты 3 - найтн максннальный 4 - определять отноюенне включення выход Введите с клавиатуры цифру 1'.
Программа выведет: 1 == Перечень треугольников Треутольннк 1: (О. О) (0.5. 1) (1, О) Треугольник 2; (О, О) (О, 4.5) (3. О) Треугольник 3: (О, 0) (2. 1) (2. О) Треугольник 4: (О, 0) (2. 2) (3, О) Треугольник 1: а- 1 118. Ь= 1. 118, с= , 1; з- О. 5 Треугольник 2 а= 4.5. Ь- 5.408. с- 3: з- 6.75 Треуяольннк 3: а= 2.236. Ь= 1. с- 2: з= 1 Треугольник 4: а= 2.828, Ь- 2.236. с= 3; я= 3 Нажнкте Елтег.
' В задаче 9.2 нз первой книги практикума было дано другое решение проблемы ввода номера пункта меню (с защитой от ошибок), но оно рассчитано на использование функций библиотеки ьто!о, унаследованных нз языка С. ' После ввода числовой информации всегда подразумевается нажатие клавиши Елтег. Выбор первого пункта меню проверен. Нажмите Ептег. Программа выведет: Теперь проверим выбор второго пункта меню.
Введите с клавиатуры цифру 2. На экране должно появиться: Выбор второго пункта проверен. Нажмите Еп1ег. Программа выведет: Теперь проверим ввод ошибочного символа, Введите с клавиатуры любой бук- венный символ, например чт, и нажмите Ептег. Программа должна выругаться: Повторите ввод (оиндается чнсло от 1 до 5) Проверяем завершение работы. Введите цифру 5. Программа выведет: 5 Камеи работы.
ОезСгисСог Тог; Сг1аО ОезСгисСог Тат: СпаС ОезСгисСог Тог: Сг1аВ ОезСгисСог Гог: Сг14А Тестирование закончено. Обратите внимание иа то, что деструкторы объектов вызываются в порядке, обратном вызову конструкторов. Продолжим разработку программы. На втором этапе мы добавим в классы Ро! лС и Тг1элд)е методы, обеспечивающие перемещение треуголъников„а в основной модуль — реализацию функции Моче(). Кроме этого, в классе Тг1 алд)е мы уда- лим метод 5лаы51((едпбдгеа(), поскольку он был введен только для целей отладки и свою роль уже выполнил.
Внесите следующие изменения в тексты модулей проекта. 1. Модуль Ра1пС,Ь: добавьте сразу после объявления метода 5лан() объявление операции-функции «+-», которая позволит нам впоследствии реализовать метод перемещения Моче() в классе Тг!ал9)е: 2. Модуль Ро1 лС. срр. Добавьте код реализации данной функции: чо10 Ро1лС::орегаСог +=(Ро1пС6 р) ( х «- р.х; у += р.у: 3. Модуль Тг!ап91едъ О Удалите объявление метода 5пои51бедпбдгеаО. О Добавьте объявление метода: чо(б Моче(Ро1пт); 4.
Модуль Тг1ап91е.срр. О Удалите метод 5поьБ1беАпбАгеа О. О Добавьте код метода МочеО: // Перенестить абьект на величину (бр.х, бр у) чо1б Тгтап91е::Моче(ро1пь бр) ( ч1 += бр: ч2 + бр; чЗ + бр: 5. Модуль Ма(п.срр. О В список прототипов функций в начале файла добавьте сигнатуру: боиЫе ВеСОоиЬ]еО: О Добавьте в файл текст новой функции ЯеьбооЫ е() либо сразу после функции 5ланО, либо в конец файла. Эта функция предназначена для ввода вещественного числа и вызывается из функции Моче(). В ней предусмотрена зашита от ввода недопустимых (например, буквенных) символов аналогично тому, как это решено в функции ЯеткывЬегО: // ввод вещественного числа боиЫе ВетОоиЫеО ( боиЫе ча1ие; нл1)е (1гое) ( с1п » ча1ие: 1Т (стп.рееХО '!и') Ьгеак: е1ве ( санс « "Повторите ввод (ожидаетсл вещественное число):" « епб1; с1п,с1еагО; ил11е (с1п.9есО != 'сп') (); гебогп ча]ие: О Замените заглушку функции МочеО следующим кодом: // перенещение чотс( Моче(Тгтап91е' р Сг1а[], 1пт к) ( саит "- — — = — Перенещение — = — -= — ===" «епсП: санс « "Введите нокер треугольника (от 1 до " к « "): 1пт 1 - Ветнищаег(1, к) - 1; р Сг1а[1]->5паиО: Ро1пс бр; саит « "Введите снещение по х: бр.х - ВетОоиЫеО; соис « "Введите снещение по у; бр.у - ВетбооЫеО; р сгта[1]->Моче(бр); соис "Новое положение треугольника:" « епб1; р ьг1а[1]- 5поиО; Ех1СВасЕО: Выполнив компиляцию проекта, проведите его тестирование аналогично тестированию на первом этапе.
После выбора второго пункта меню и ввода данных, задающих номер треугольника, величину сдвига по х и величину сдвига по у„вы должны увидеть на экране примерно следующее 2 ===-====- Переиещение ==---=-=- Введите нокер треугольника (ат 1 до 4): 1 Треугольник 1: (О, 0) (0.5. 1) ( 1, 0) Введите снещение по х; 2.5 Введите смещение по у: -7 Новое полажение треугольника: Треугольник 1: (2.5. -7) (3. -6) (3.5, -7) Нажните Ептег, Продолжим разработку программы.