Объекты, возвращаемые функцией — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Объекты, возвращаемые функцией

2020-05-08 247
Объекты, возвращаемые функцией 0.00 из 5.00 0 оценок
Заказать работу

В примере 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.112 с.