C++ за 21 день седьмое издание



Download 1,38 Mb.
bet106/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   102   103   104   105   106   107   108   109   ...   437
Bog'liq
word1

#include




  1. using namespace std;

2 :

  1. const double Pi = 3.14159;








  1. double Area(double Radius); // для круга




  1. double Area(double Radius, double Height); // перегружено для



7: // цилиндра


8 : int main ()



  1. {




  1. cout « "Enter z for Cylinder, c for Circle: ";



11: char Choice = 'z';



  1. cin » Choice;








  1. cout « "Enter radius: ";




  1. double Radius = 0;




  1. cin » Radius;

    17:

    if (Choice ==

    'z')

    18:

  2. {




  1. cout « "Enter height: ";




  1. double Height = 0;




  1. cin » Height;



23:



  1. // Вызов перегруженной версии Area для цилиндра



25: cout « "Area of cylinder is: " « Area (Radius, Height)



  1. endl;




  1. }




  1. else




  1. cout « "Area of cylinder is: " « Area (Radius) « endl;








  1. return 0;




  1. }



32:



  1. // для круга




  1. double Area(double Radius)




  1. {



36: return Pi *Radius * Radius;



  1. }








  1. // перегружено для цилиндра




  1. double Area(double Radius, double Height)

    41:

    {

    42:

    // повторноеиспользование версии для площади круга

  2. return 2 * Area(Radius) + 2 * Pi * Radius * Height;




  1. }




Использование функций для работы с данными различных форм

157

Результат










Enter

z for Cylinder,

с for Circle: z




Enter

radius:

2







Enter height:

5







Area of cylinder is: 87.9646




Следующий запуск:







Enter

z for Cylinder,

c for Circle: c




Enter

radius:

1

3.14159




Area of cylinder is:






Анализ



  1. строках 5 и 6 объявлены прототипы перегруженных версий функции A rea (), первая принимает один параметр (радиус круга), а вторая — два параметра (радиус и высоту

цилиндра). У обеих функций одинаковые имена (A rea) и типы возвращаемого значения




\ d o u b le), но разные наборы параметров. Следовательно, функция перегружена. Опреде­ ления перегруженных функций находятся в строках 34-44, где реализованы две функции вычисления площади: круга по радиусу и цилиндра по радиусу и высоте соответственно. Интересно то, что, поскольку площадь цилиндра состоит из площади двух кругов (один сверху, второй снизу) и площади боковой стороны, перегруженная версия для цилиндра способна повторно использовать функцию A rea () для круга, как показано в строке 43.


Передача функции массива значений

Функция, которая отображает целое число, может быть представлена так:




void Displaylnteger(int Number);

У функции, способной отобразить массив целых чисел, прототип немного другой:




void Displaylntegers(int[] Numbers, int Length);

Первый параметр указывает, что передаваемые функции данные являются массивом,





  1. второй параметр предоставляет его длину1, чтобы, используя массив, вы не пересекли его границы (листинг 7.8).




  1. ИСТИН Г 7.8. Функция, получающая м ассив как параметр___________________________________




    1. #include




    1. using namespace std;

  1. :

    1. void DisplayArray(int Numbers[], int Length)




    1. {




    1. for (int Index = 0; Index < Length; ++Index)




    1. cout « Numbers[Index] << " ";

He поступайте так никогда. Неправильно указав длину массива или изменив впоследствии его размер и забыв исправить абсолютно все вызовы функции, вы получите в лучшем случае ошибку выхода за границы массива, а в худшем — очень трудно обнаруживаемую ошибку перебора массива не до конца. Для определения размера массива лучше использовать оператор s i z e o f () в функ­ ции. — Примеч. ред.


158 ЗАНЯТИЕ 7. Организация кода при помощи функций





7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28
cout « endl;


}


void DisplayArray(char Characters[], int Length)


{


for (int Index = 0; Index < Length; ++Index)
cout « Characters[Index] « it к ;


cout « endl;


}


int main()


{


int MyNumbers[4] = {24, 58, -1, 245} r


DisplayArray(MyNumbers, 4);



char MyStatement[7] = {'H ', 'e',

11' r

1

11

1 0

1

/




-L /







DisplayArray(MyStatement, 7);


return 0;


}



Результат



  1. 58 -1 245



H e l l o !


Анализ

Здесь есть две перегруженные версии функции D is p la y A rra y (): одна отображает со­ держимое элементов целочисленного массива, а вторая символьного. В строках 22 и 25 вызываются две функции, используя как параметр массива целых чисел и символов соот­ ветственно. Обратите внимание, что при объявлении и инициализации массива символов (строка 24) был преднамеренно включен нулевой символ. Это хорошая привычка, даже при том, что сейчас массив не используется как строка в операторе c o u t или подобном (c o u t « M y S ta te m e n t;), но впоследствии это может произойти.


Передача аргументов по ссылке

Давайте вернемся к функции вычисления площади круга по радиусу в листинге 7.1:





  1. // Определения функции (реализация)




  1. double Area(double InputRadius)




  1. {




  1. return Pi * InputRadius * InputRadius;




  1. }

Здесь параметр I n p u tR a d iu s содержит значение, которое копируется в него при вы ­ зове функции m ain ():





  1. // Вызов функции "Area"




  1. cout « "Area is: " << Area(Radius) « endl;

Использование функций для работы с данными различных форм

159

Это означает, что вызов функции A re a () никак не воздействует на переменную R a­ d iu s в функции m ain (), поскольку работает она с копией значения переменной R a d iu s, содержащейся в переменной In p u tR a d iu s . Иногда нужны функции, способные воздей­ ствовать на исходную переменную или изменять значение, которое доступно вне функции, скажем, в вызывающей функции. Вот когда вы объявляете параметр как получающий ар­ гумент по ссылке (by reference). Версия функции A rea (), вычисляющей и возвращающей площадь как передаваемый по ссылке параметр, выглядит следующим образом:





  1. выходной параметр Result по ссылке void Area(double Radius, doubles Result)

{
Result = Pi * Radius * Radius;

Обратите внимание: функция A re a () в этой версии получает два параметра. Не про­ пустите амперсанд (&) рядом со вторым параметром R e s u lt . Этот знак указывает компи­ лятору, что второй аргумент не должен быть скопирован в функцию, что это ссылка на передаваемую переменную. Тип возвращаемого значения был изменен на v o id , поскольку функция теперь возвращает вычисленную площадь не как возвращаемое значение, а как выходной параметр по ссылке. Возвращение значений по ссылке демонстрирует код ли­ стинга 7.9, вычисляющий площадь круга.


ЛИСТИНГ 7.9. Возврат площади круга по ссылке, а не в качестве возвращаемого значения




#include


using namespace std;


const double Pi = 3.1416;



  1. выходной параметр Result по ссылке void Area(double Radius, doubles Result)

{
Result = Pi * Radius * Radius;

}



13





int main()

{
cout « "Enter radius: ";




double Radius = 0;


cin » Radius;


double AreaFetched = 0;


Area(Radius, AreaFetched);



ID cout « "The area is: " « AreaFetched « endl; return 0;

12 }



Результат


Enter radius: 2


The area is: 12.5664

160 ЗАНЯТИЕ 7. Организация кода при помощи функций


Анализ

Обратите внимание на строки 17 и 18, где функция A rea () вызывается с двумя пара­ метрами; второй параметр тот, который должен содержать результат. Поскольку функция A re a () получает второй параметр по ссылке, переменная R e s u lt, используемая в стро­ ке 8 в пределах функции A re a (), указывает на ту же область памяти, что и переменная d o u b le A re a F e tc h e d , объявленная в строке 17 вызывающей стороны (функции m ain ()).


Таким образом, вычисленный в функции A rea () результат (строка 8) доступен в функции m ain () и отображается на экране в строке 20.






Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   102   103   104   105   106   107   108   109   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish