Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Интересное:
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2020-05-08 | 247 |
5.00
из
|
Заказать работу |
|
|
В примере ENGLC0N мы видели, что объекты можно передавать в функцию в качестве аргументов. Теперь мы рассмотрим, каким образом функция может возвратить объект в вызывающую программу. Мы модифицируем пример ENGLC0N и в результате получим программу ENGLRET:
// englret.срр
// возвращение функцией значения типа Distance
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////
class Distance // длина в английской системе
{
private:
int feet;
float inches;
public: // конструктор без аргументов
Distance(): feet(0), inches(0.0)
{ } // конструктор с двумя аргументами
Distance(int ft,float in): feet(ft),inches(in)
{ }
void getdist() // ввод длины
{
cout << "\n Введите число футов: ";
cin >> feet;
cout << "Введите число дюймов: ";
cin >> inches;
}
void showdist() // вывод длины
{ cout << feet << "\'-" << inches << "\'"; }
Distance add_dist(Distance); // сложение
};
//
// сложение данного объекта с d2. возврат суммы
Distance Distance::add_dist(Distance d2) {
Distance temp; // временная переменная
temp.inches = inches + d2.inches; // сложение дюймов
if(temp.inches >= 12.0) // если сумма больше 12.0.
{ // то уменьшаем ее на
temp.inches -= 12.0; // 12.0 и увеличиваем
temp.feet = 1; // число футов на 1
}
temp.feet += feet + d2.feet; // сложение футов
return temp;
}
//////////////////////////////////////////////////////////
int main()
{
Distance dist1, dist3; // две длины
Distance dist2(11, 6.25); // определение и инициализация dist2
dist1.getdist(); // ввод distl пользователем
dist3 = dist1.add_dist(dist2); // dlst3 - distl + dist2
// вывод всех ' длин
cout << "\ndistl - ";
dist1.showdist();
cout << "\ndist2 - ";
dist2.showdist();
cout << "\ndist3 - ";
dist3.showdist();
cout << endl;
return 0;
}
Программа ENGLRET очень похожа на программу ENGLCON, однако различия между ними указывают на важные аспекты работы функций с объектами.
Аргументы и объекты
В примере ENGLCON два объекта были переданы в качестве аргументов в функцию add_dist(), а результат был сохранен в объекте dist3, методом которого и являлась вызванная функция add_dist(). В программе ENGLRET в качестве аргумента в функцию add_dist() передается лишь один аргумент: объект dist2. dist2 складывается с объектом distl, к которому относится вызываемый метод add_dist(), результат возвращается в функцию main()n присваивается объекту dist3:
|
dist3 = distl.add__dist(dist2):
Действия этого оператора аналогичны действиям соответствующего оператора программы ENGLCON, однако форма записи первого более естественна, поскольку использует операцию присваивания самым обычным образом. В главе 8 «Перегрузка операций» мы увидим, как с помощью арифметической операции + можно добиться еще более простой формы записи этих же действий:
// сложение данного объекта с d2. возврат суммы
Distance Distance::add_dist(Distance d2) {
Distance temp; // временная переменная
temp.inches = inches + d2.inches; // сложение дюймов
if(temp.inches >= 12.0) // если сумма больше 12.0.
{ // то уменьшаем ее на
temp.inches -= 12.0; // 12.0 и увеличиваем
temp.feet = 1; // число футов на 1
}
temp.feet += feet + d2.feet; // сложение футов
Сравнив эту функцию с одноименной функцией программы ENGLC0N, вы можете заметить несколько тонкостей, отличающих одну функцию от другой. В функции из программы ENGLRET создается временный объект класса Distance. Этот объект хранит значение вычисленной суммы до тех пор, пока она не будет возвращена вызывающей программе. Сумма вычисляется путем сложения двух объектов класса Distance. Первый из объектов — distl, по отношению к которому функция add_dist() является методом; второй объект — dist2, переданный в функцию в качестве аргумента. Обращение к его полям из функции выглядит как d2.feet и d2.inches. Результат сложения хранится в объекте temp и обращение к его полям выглядит как temp.feet и temp.inch.es. Значение объекта temp возвращается в вызывающую программу с помощью оператора return temp;
Вызывающая программа main() присваивает значение, возвращенное функцией, объекту dist3. Обратите внимание на то, что значение переменной distl не изменяется, а всего лишь используется функцией add_dist().
|
Класс card содержит два конструктора. Первый из них не имеет аргументов и используется функцией main() для создания объектов temp, chosen и prize, которые не инициализируются при создании. Другой конструктор имеет два аргумента, и с его помощью создаются объекты cardl, card2 и card3, инициализируемые определенными значениями. Кроме конструкторов, класс card содержит два метода, оба из которых определены вне класса.
Функция display() не имеет аргументов; ее задача заключается в отображении на экране параметров той карты, к которой она применяется. Так, оператор
chosen.displayО;
отображает карту, которую ввел пользователь.
Функция isEqual() проверяет, совпадает ли карта, введенная пользователем, с той, которая передается функции в качестве аргумента. Для сравнения используется условная операция. Функция могла бы быть реализована с помощью ветвления
if...else:
if(number==c2.number && suit==c2.suit)
return true:
else
return false:
однако условная операция обеспечивает более краткую форму записи.
Название с2 аргумента функции isEqual() указывает на то, что сравниваются две карты: первая из карт представлена объектом, методом которой является функция isEqual(). Выражение
if (chosen.isEqual(prize))
в функции main() сравнивает карту chosen с картой prize.
Если игрок не угадал карту, то результат работы программы будет приблизительно таким:
Карта 1: 7 треф
Карта 2: валет червей
Карта 3: туз пик
Меняем местами карты 1 и 3j
Меняем местами карты 2 и 3j
Меняем местами карты 1 и 2j
На какой позиции (1,2 или 3) теперь туз пик? 1
Неверно. Вы проиграли. Вы выбрали карту 7 треф
Порядок выполнения работы
1. Изучите теоретический материал.
2. Напишите программу, согласно заданному в варианте задания условию.
3. Ответьте на контрольные вопросы.
ВАРИАНТЫ ЗАДАНИЙ
Выполнение заданий осуществите в следующем порядке:
· Прочтите постановку задачи.
· Сформулируйте алгоритм, используя псевдокод и нисходящую пошаговую детализацию.
· Напишите программу на С++.
· Проверьте, отладьте и выполните программу на С++.
Вариант. 1
Из-за высокой цены бензина водители озабочены затратами топлива своих автомобилей. Один водитель взял в рейс несколько емкостей бензина, записывая пройденные мили и бензин, использованный из каждой емкости. Разработайте программу на С++, которая вводила бы пробег в милях и бензин, использованный из каждой емкости. Программа должна рассчитывать и выводить на экран число миль на галлон для каждой емкости. После ввода исходных данных программа должна рассчитать и напечатать значение среднего числа миль на галлон, полученное для всех емкостей. Пример вывода:
|
Введите расход бензина (-1, если ввод закончен) 12.8
Введите пройденный путь: 287
Для этой емкости получено миль / галлон 22.421875 Введите расход бензина (-1, если ввод закончен) 10.3
Введите пройденный путь: 200
Для этой емкости получено миль / галлон 19.417475
Введите расход бензина (-1, если ввод закончен) 5
Введите пройденный путь: 120
Для этой емкости получено миль / галлон 24.000000 Введите расход бензина (-1, если ввод закончен) -1
Средний расход бензина 21.601423
Вариант. 2
Разработайте программу на С++, которая будет определять, не превысили ли расходы клиента, имеющего депозитный счет, предела кредита. Для каждого клиента известны следующие данные:
1. Номер счета (целое).
2. Баланс с начала месяца.
3. Сумма всех расходов данного клиента в течение месяца.
4. Сумма всех приходов на счет данного клиента в течение месяца.
5. Допустимый размер кредита.
Программа должна ввести все эти данные, рассчитать новый баланс (равный начальному балансу + расход — приход) и определить, не превысил ли новый баланс предела кредита клиента. Для того клиента, чей кредит превышен, программа должна вывести на экран номер счета клиента, предел кредита, новый баланс и сообщение «Предел кредита превышен». Например:
Введите номер счета (-1, если ввод закончен) 100
Введите начальный баланс: 5394.78
Введите сумму расходов: 1000.00
Введите сумму прихода: 500.00
Введите предел кредита: 5500.00
Счет: 100
Предел кредита: 5500.00 Баланс: 5894.78 Предел кредита превышен
Введите номер счета (-1, если ввод закончен) 200
Введите начальный баланс: 1000.00
Введите сумму расходов: 123.45
Введите сумму прихода: 321.00
Введите предел кредита: 1500.00
Введите номер счета (-1, если ввод закончен) 300
Введите начальный баланс: 500.00
|
Введите сумму расходов: 274.73
Введите сумму прихода: 100.00
Введите предел кредита: 800.00
Введите номер счета (-1, если ввод закончен) -1
Вариант 3
Одна большая химическая компания платит своим продавцам на основе комиссионных. Продавец получает $200 в неделю плюс 9% от объема продаж за неделю. Например, продавец, который продал за неделю химикалий на $5000 получит $200 плюс 9% от $5000, то есть всего $650. Разработайте программу на С++, которая должна вводить для каждого продавца объем его продаж за последнюю неделю, рассчитывать и выводить на экран его заработок. Данные вводятся поочередно для каждого продавца. Например:
Введите объем продаж в долларах (-1, если ввод закончен): 5000.00
Заработок: $650.00
Введите объем продаж в долларах (-1, если ввод закончен): 1234.56
Заработок: $311.11
Введите объем продаж в долларах (-1, если ввод закончен): 1088.89
Заработок: $298.00
Введите объем продаж в долларах (-1, если ввод закончен): -1
Вариант 4
Разработайте программу на С++, которая должна определять заработную плату для каждого из нескольких служащих. Компания выплачивает каждому служащему повременную зарплату за первые 40 часов работы и выплачивает в полуторном размере за все рабочие часы сверх 40. Вам дан список сотрудников компании, число часов, отработанных каждым за последнюю неделю, и почасовая ставка каждого сотрудника. Программа должна ввести эти данные для каждого сотрудника, рассчитать и вывести на экран его суммарную зарплату. Например:
Введите число рабочих часов (-1, если ввод закончен) 39
Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $390.00
Введите число рабочих часов (-1, если ввод закончен) 40
Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $400.00
Введите число рабочих часов (-1, если ввод закончен) 41
Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $415.00
Введите число рабочих часов (-1, если ввод закончен) -1
Вариант 5
Во многих компьютерных приложениях часто используется поиск максимального числа, (т.е. максимального из заданной группы чисел). Например, программа, которая определяет победителя соревнования продавцов, должна вводить объемы продаж каждого продавца. Тот, у кого объем продаж выше, является победителем. Напишите псевдокод программы, а затем и саму программу на С++, которая вводит последовательно 10 чисел, определяет наибольшее из них и печатает его значение. Подсказка: ваша программа должна использовать следующие три переменные:
counter: счетчик для счета до 10 (для хранения количества введенных чисел и определения момента, когда введены все 10 чисел), number: текущее введенное число, largest: максимальное найденное число.
Форма отчёта: отчет выполняется в текстовом редакторе в электронном виде.
|
Содержание отчета:
4. Тема работы.
5. Цель работы.
6. Выполненные задания.
Система оценки: пятибальная.
Контрольные вопросы
1. Для чего необходимо определение класса?
2. В определении класса члены класса с ключевым словом private доступны:
а) любой функции программы;
б) в случае, если вам известен пароль;
в) методам этого класса;
г) только открытым членам класса.
3. Напишите определение класса leverage, включающего одно закрытое поле типа int с именем crowbar и одним открытым методом с прототипом void
4. Истинио ли следующее утверждение: поля класса должны быть закрытыми?
5. Напишите оператор, создающий объект leverl класса leverage, онисанного в вопросе 4.
6. Операция точки (операция доступа к члену класса) объединяет следующие два элемента (слева направо):
а) член класса и объект класса;
б) объект класса и класс;
в) класс и член этого класса;
г) объект класса и член этого класса.
7. Методы класса, определенные внутри класса, по умолчанию _____.
8. Конструктор вызывается автоматически в момент________объекта.
9. Имя конструктора совпадает с именем _______.
10. Напишите конструктор, который инициализирует нулевым значением поле crowbar класса leverage. Конструктор следует определить внутри определения класса.
11. Верно или неверно следующее утверждение: класс может иметь более одного конструктора с одним и тем же именем?
12. Методу класса всегда доступны данные:
а) объекта, членом которого он является;
б) класса, членом которого он является;
в) любого объекта класса, членом которого он является;
г) класса, объявленного открытым.
13. Классы полезны потому, что:
а) не занимают памяти, если не используются;
б) защищают свои данные от доступа со стороны других классов;
в) собирают вместе все аспекты, касающиеся отдельной вещи;
г) адекватно моделируют объекты реального мира.
14. Истинно ли следующее утверждение: существует простой, но очень точный метод, позволяющий представлять решаемую задачу в виде совокупности объектов классов?
Список использованной литературы
1. Х.Дейтел Как программировать на C; Пер. с англ. под ред. В. Тимофеева. - М.: БИНОМ, 2000. - 1005 с.: ил.; 24
2. Язык программирования С / Брайан Керниган, Деннис Ритчи; [пер. с англ. и ред. В. Л. Бродового]. - 2-е изд., перераб. и доп. - Москва [и др.]: Вильямс, 2007. - 289 с.; 23 см.
3. Бьерн Страуструп Язык программирования C++; Пер. с англ. С. Анисимова и М. Кононова под ред. Ф. Андреева, А. Ушакова. - 3. изд. - М.: Binom Pablishers; СПб.: Нев. диалект, 2004. - 990 с.: ил.; 24 см.
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 10
Тема: «Разработка простейших программ на Си++ с использованием перегрузки»
Цели:
- определить понятие перегрузки;
- определить ситуации, в котопых необходима перегрузка;
- изучить отличия перегрузки функций, перегрузки операторов и перегрузки конструкторов в языке С++;
- приобрести основные навыки использования перегрузки в С++.
Характер занятия: репродуктивный.
Форма организации: индивидуальная.
Обеспечение занятия: тетрадь с лекциями, СИ, компьютер.
Требования к знаниям студентов
Перед выполнением практической работы студент должен
знать:
- понятия класс и объект;
- основные особенности создания и использования классов в языке С++;
после выполнения практической работы студент должен
уметь:
- создавать программы, с использованием перегрузки операторов, функций и конструкторов на языке С++;
- определять случаи, в которых применение перегрузки целесообразно.
Теоретический материал
Перегрузка операций
Перегрузка операций — это одна из самых захватывающих возможностей ООП. Она может превратить сложный и малопонятный листинг программы в интуитивно понятный. Например, строки
d3.addobjects С dl. d2);
похожие, но одинаково непонятные
d3 = dl.addobjects (d2);
можно заменить на более читаемую d3 = dl + d2:
Довольно непривлекательный термин «перегрузка операций» дается обычным операциям С++, таким, как +, *, <= или +=, в случае их применения с определенными пользователем типами данных.
Обычно
а = b + с:
работают только с основными типами данных, такими, как int или float, и попытка использования обычных операторов, когда a, b и с являются объектами определенного пользователем класса, приведет к протестам компилятора. Однако, используя перегрузку, вы можете сделать эту строку правильной даже в том случае, если a, b и с являются объектами определенного пользователем класса.
На самом деле перегрузка операций дает вам возможность переопределить язык С++. Если вы считаете, что ограничены стандартными возможностями операций, то вы можете назначить их выполнять нужные вам действия. Исполь зуя классы для создания новых видов переменных и перегрузку для определения новых операций, вы можете, расширив С++, создать новый, свой собственный язык.
Другой вид действий, преобразование типов, тесно связан с перегрузкой операций. С++ совершает преобразование простых типов, таких, как int или float, автоматически; но преобразование, включающее в себя созданные пользователем типы, требует немного работы со стороны программиста.
Перегрузка унарных операций
Давайте начнем с перегрузки унарных операций. Унарные операции имеют только один операнд (операнд — это переменная, на которую действует операция). Примером унарной операции могут служить операции уменьшения и увеличения ++ и — и унарный минус, например -33.
В примере COUNTER (Практическая работа №9) мы создали класс Counter для хранения значения счетчика. Объект этого класса мы увеличивали вызовом метода:
cl.inc_count ();
Он выполнял свою работу, но листинг программы станет более понятным, если мы применим вместо этой записи операцию увеличения ++.
++cl:
Давайте перепишем программу COUNTER, чтобы сделать это действие возможным. Приведем листинг программы C0UNTPP11.
// countppl.cpp
// увеличение переменной операцией ++
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Counter
{
private:
unsigned int count; // значение счетчика
public:
Counter (): count (0) // конструктор
{ }
unsigned int get_count () // получить значение
{ return count; }
void operator++ () // увеличить значение
{ ++count; }
};
///////////////////////////////////////////////////////////
int main () {
Counter cl, c2; // определяем переменные
cout << "\ncl = " << cl.get_count (); // выводим на экран
cout << "\nc2 = " << c2.get_count ();
++cl; // увеличиваем cl
++c2; // увеличиваем c2
++c2; // увеличиваем c2
cout << "\ncl = " << cl.get_count (); // снова показываем значения
cout << "\nc2 = " << c2.get_count () << endl;
return 0;
}
В этой программе мы создали два объекта класса Counter: cl и с2. Значения счетчиков выведены на дисплей, сначала они равны 0. Затем, используя перегрузку операции ++, мы увеличиваем cl на единицу, а с2 на два и выводим полученные значения. Результат работы программы:
cl = 0 - изначально обе переменные равны нулю
с2 = О
cl = 1 - после однократного увеличения
с2 = 2 - после двукратного увеличения
Выражения, соответствующие этим действиям:
++cl: ++C2; ++С2;
Операция ++ применена к cl и дважды применена к с2. В этом примере мы использовали префиксную версию операции ++, постфиксную мы объясним позднее.
Ключевое слово operator
Как использовать обычные операции с определенными пользователями тинами? В этом объявлении использовано ключевое слово operator для перегрузки операции ++:
void operator++ ()
Сначала пишут возвращаемый тип (в нашем случае void), затем ключевое слово operator, затем саму операцию (++) и наконец список аргументов, заключенный в скобки (здесь он пуст). Такой синтаксис говорит компилятору о том, что если операнд принадлежит классу Counter, то нужно вызывать функцию с таким именем, встретив в тексте программы операцию ++.
Только компилятор может различать перегружаемые функции по типу данных и количеству их аргументов. Перегружаемые операции компилятор отличает по типу данных их операндов. Если операнд имеет базовый тип, такой, как int в
++intvar:
то компилятор будет использовать свою встроенную процедуру для увеличения переменной типа int. Но если операнд является объектом класса Counter, то компилятор будет использовать написанную программистом функцию operator++().
Аргументы операции
В функции main() операция ++ применена к объекту, как в выражении ++cl. До сих пор функция operator++() не имела аргументов. Что же увеличивает эта операция? Она увеличивает переменную count объекта, к которому применяется. Так как методы класса всегда имеют доступ к объектам класса, для которых они были вызваны, то для этой операции не требуются аргументы.
|
|
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!