Автор Тема: Урок 2 C++: Функции в Си++.  (Прочетена 6519 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

onewg

  • Jr. Member
  • **
  • Благодарности
  • -Казани: 0
  • -Получени: 1
  • Публикации: 62
Урок 2 C++: Функции в Си++.
« -: 25 Февруари 2010, 13:35:14 »
Този урок ще е доста обширен и не мога да го предам наведнъж.
За това ще е направен на етапи които да следват някаква последователност.


Етикети на урока..

Какво е функция.
Как се създава потребителска функция.
функцията приема параметри.
Функциите връщат резултат.
Типа на връщаният резултат
Други неща свързани с функциите..



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


Как се създава потребителска функция.
В езика си++ има много вградени функции но това не означава че не можем да си пишем и наши.
Как трябва да изглежда една функция.
Тя започва с деклариране най отгоре пишем:

void my_furst_functions();

Това само декларира функция, така не можем да я извикаме, защото функцията няма прототип, нека да направим прототип на функцията.

void my_furst_functions()
{
  cout <<  " My furst function " ;
}

Вече имаме тип на функцията, и можем да я извикаме в нашата главна функция чрез името и.

my_furst_functions();

Което ще даведе до изписването на My furst function в конзолният прозорец.

Нека да направим и по съществен код..
#include
using namespace std;

void my_furst_functions();  // Дефинира функцията my_furst_functions

int main ()
{

my_furst_functions();       // Извиква функцията my_furst_functions



  system( " pause " );
  return 0;
}

void my_furst_functions()         // Тук се декларира конструкцията на функцията
{                                 //
  cout <<  " My furst function " ;    // Тук е блока от код принадлежащ на самата функция.
}  


Както виждате първо декларирана най отгоре, дефиницията може да се разположи преди или след main изтрийте реда с декларацията какво ще се получи..
Ще се получи грешка  " Функция my_furst_functions()  не е декларирана "

Както виждате при декларацията на функция пред името и стои ключовата дума void това е така защото всяка функция в езика трябва да върне тип а войд означава без тип, тоест тя не връща нищо..

Ще разгледаме по надолу типовете int, voit, float, doube.

Ludjov

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 312
Отг: Урок 2 C++: Функции в Си++.
« Отговор #1 -: 25 Февруари 2010, 14:20:47 »
Браво приятел ! Добре си се представил но няма ли да е най-добре да го представиш на видео урок ?

deadlikeme

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 1
  • Публикации: 164
Отг: Урок 2 C++: Функции в Си++.
« Отговор #2 -: 25 Февруари 2010, 14:51:55 »
Хайде на бас, че никой няма да разбере за какво точно става дума тук:
...
Дригите функции са тип goto тоест извикай, при прилагането им указателя на инструкцията  " instruction pointer "  бива препратен на адреса от където започва функцията, като по този начин в специална стек памет се записва къде е бил преди да се препрати.
При завършване на функцията и прочитането на командата return в  " instruction pointer "  се записва най горният адрес на стека, като всички записани адреси минават с едно ниво нагоре.
...

Ако уроците ще са на толкова ниско ниво ще е хубаво да обясните на хората какво точно е стек на инструкциите, какво е инструкция, как се обработва и тн... Общо взето това си е тема на няколко отделни урока, за това и препоръчвам да не задълбавате толкова.

onewg

  • Jr. Member
  • **
  • Благодарности
  • -Казани: 0
  • -Получени: 1
  • Публикации: 62
Отг: Урок 2 C++: Функции в Си++.
« Отговор #3 -: 25 Февруари 2010, 17:29:39 »
Ще има и по асемблер но не така задълбочени понеже асемблера е необятна област..

Колкото до видео уроци нямам дикция сигорно няма да се разбира какво приказвам..  :(

функцията приема параметри.
Една функция може да приема параметри, тоест към нея може да се подава някаква стойност това става лесно.

void my_function(int a); // Тук функцията приема един параметър който е цялочислен.

Декларирахме функцията, сега нека я дефинираме..

Декларацията означава за компилатора  " ще ползвам тази функция която ще приема или не параметър, финкцията ще е тип.... "
Тоест декларацията е само заявка.
една функция трябва и да се дефинира..

Дефиницията започва по същият начин както декларацията тоест:
void my_function(int a)
{
  cout << a;
}
нека да разгледаме един готов код.

#include
using namespace std;

void my_function(int a);

int main ()
{
  my_function(3);    //  Функцията приема параметър числото 3
  my_function(30);    // Функцията приема параметър числото 30
  my_function(8);    // Функцията приема параметър числото 8
  my_function(11);    // Функцията приема параметър числото 11
  my_function(55);    // Функцията приема параметър числото 55


  system( " pause " );
  return 0;
}


void my_function(int a)
{
  cout << a;
}



Забележете че и декларацията и дефиницията са едни и същи, и така трябва да е, не можем да ползваме нещо без да сме го декларирали.

Освен че функциите приемат параметър те могат и да връщат такъв.

Функциите връщат резултат.

Нека променим малко кода.


#include
using namespace std;

int my_function(int a);

int main ()
{
int rezultat = 0;
 
 rezultat = my_function(3);  
 
  cout << rezultat;
  cout << my_function(3);
 
  system( " pause " );
  return 0;
}


int my_function(int a)
{
  int c = 0;
  c = a + 10;
  return c;
}


Както забелязвате в декларацията и в дефиницията вече липсва ключовата дума void а е заменена от int
това е така понеже в си++ параметрите трябва да се декларират, тоест да се окаже какъв тип ще връща, това става с декларирането на параметри..

Типа на връщаният резултат
Защо трябва да се декларира (вижте урока общи С++ типове данни)
Как се декларира една функция, чрез кючовите думи (вижте урока общи С++ типове данни) кой са те.

Предефиниране на функции

В С++ функциите МОГАТ! забележете да се предефинират.
при условие че се различават по:
Различен брой на входните параметри.
По различен тип на предаваните параметри.
Нека дадем пример..



my_function(int a);        // Валидна дефиниция
my_function(int a, int b); // Валидна дефиниция
my_function(int a, int c); // Грешка броя и типа на подаваните параметри са еднакви
my_function(int a, int b, int c); // Валидна дефиниция.
my_function(float a); // Валидна дефиниция брая е еднакъв но типа на подаваните параметри е различен.

ето един по пълен код..


#include
using namespace std;

int my_function(int a);        
int my_function(int a, int b) ;
int my_function(int a, int b, int c);
float my_function(float a);

int main ()
{
cout << my_function(33) <<  " Tova e int my_function(int a); \\n " ;
cout << my_function(44, 18) <<  " Tova e int my_function(int a, int c); \\n " ;
cout << my_function(34) <<  " Tova e int my_function(float a); \\n " ;
cout << my_function(12, 12, 12) <<  " Tova e int my_function(int a, int b, int c); \\n " ;
 
 
  system( " pause " );
  return 0;
}

int my_function(int a)
{
  return a;
}
int my_function(int a, int c)
{
  return a, c;
}
float my_function(float a)
{
  return a;
}
int my_function(int a, int b, int c)
{
  return a, b, c;
}


Компилирайте и вижте какво ще се получи. :lol:

Stilgar

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 0
  • -Получени: 42
  • Публикации: 1406
    • The Sietch
Отг: Урок 2 C++: Функции в Си++.
« Отговор #4 -: 25 Февруари 2010, 21:29:00 »
Много ми е смешно като си представя как някой чете историите за стека и inline функциите.

BTW онова на което викаш не е прототип ( http://en.wikipedia.org/wiki/Function_prototype ) и онова на което викаш предефиниране не е предефиниране а overloading което със сигурност е различно от предефинирането. Освен тва има правописни грешки и докато furst вместо first е без значение неща като  " voit "  които се предполага да са ключови думи са притеснителни.

onewg

  • Jr. Member
  • **
  • Благодарности
  • -Казани: 0
  • -Получени: 1
  • Публикации: 62
Отг: Урок 2 C++: Функции в Си++.
« Отговор #5 -: 26 Февруари 2010, 06:59:09 »
Точно декларациите на функциите когато се наложат си е, олверлодинг като се взима предвид броя и типа на подаваните и параметри.

Предефинира: така е в българските учебници.
Ако искаш ще ти преснимам няколко и се обади на инжинерите който са ги писали..

Цитат
You overload a function name f by declaring more than one function with the name f in the same scope. The declarations of f must differ from each other by the types and/or the number of arguments in the argument list. When you call an overloaded function named f, the correct function is selected by comparing the argument list of the function call with the parameter list of each of the overloaded candidate functions with the name f. A candidate function is a function that can be called based on the context of the call of the overloaded function name.

Stilgar

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 0
  • -Получени: 42
  • Публикации: 1406
    • The Sietch
Отг: Урок 2 C++: Функции в Си++.
« Отговор #6 -: 26 Февруари 2010, 08:38:18 »
предефинирам със сигурност е превод на override, а не на overload. Тея дето пишат българските учебници не знаят нито български нито програмирне.

onewg

  • Jr. Member
  • **
  • Благодарности
  • -Казани: 0
  • -Получени: 1
  • Публикации: 62
Отг:Урок 2 C++: Функции в Си++.
« Отговор #7 -: 24 Март 2010, 21:09:01 »
Инлайн функции...

Тук трябва да зядълбаем малко по надълбоко в процесора..

какво е програмата като цяло, това са процесорни инструкции разположени ред по ред в паметта на системата.

За да разберете защо е нужно да има функции инлайн трябва да го обесня по просто..

Когато викаш дадена функция, всъщност препращаш брояча на инструкциите на определен адрес където е разположена тази функция, после реда се обхожда докато стигне команда за връщане от функцията..

Но как знае къде да се върне, на кой ред да се върне...

Много просто, специална стекова памет се грижи при команда отиди на ред  " еди кой си "  да запише стойността на реда където е бил, така че всъщност командите са две запиши реда-отиди на ред еди кой си..

Това е добре спестява много памет и много писане, но има едно но, ние сме маниаци на килобайтове и пестим всеки ненужен такт на процесора, това си е процесорно разхищение, тоест разхищение на процесорните ресурси за абсолютни глупости..  :laugh:

Инлайн разполагането разполага кода така че все едно си я писал, нищо че сорс кода е еднакъв, самият компилатор я нанася..

Сега по ясно, ще вземе кода от блока на функцията и ще я разположи в редовете надолу, все едно не сме писали функция..
Това е така понеже става по бързо обхождането на редовете...

Искам една забележка да вметна, декларирането на инлайн функция НЕ! Е заповед към процесора  " компилатора "  това е просто заявление което компилатора ще се опита да изпълни ако това е възможно, самата заявка става като обикновенна функция..

#include
int exforsys(int);
void main( )
{
int x;
cout << “\\n Enter the Input Value: ”;
cin>>x;
cout<<”\\n The Output is: “ << exforsys(x);
}

inline int exforsys(int x1)
{
return 5*x1;
}


Ключовата дума inline дава заявка че искаме инлайн разполагане..

Та това е цялата дъндания по инлайването, кодете и инлайвайте на воля...  :laugh:

Много хора са против инлайн декларирането, първи стилгар ще писне против него сигурен съм..

Просто го има в езика...

echeveria

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 72
  • -Получени: 93
  • Публикации: 4836
Отг:Урок 2 C++: Функции в Си++.
« Отговор #8 -: 24 Март 2010, 21:12:02 »
Ти що не вземеш да направиш видео щом толкова разбираш?
Днес Печатарите използват парите за да купят мозъците на онези, които ги превъзхождат, за да ги накарат да им служат и така да се превърнат в жертва на посредствеността. Това ли е причината, поради която ги наричате благо?
<iframe src="http://www.corbindavenport.com/ubuntu/widget.html" style="width:

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Урок 2 C++: Функции в Си++.
« Отговор #9 -: 24 Март 2010, 21:18:02 »
Каза вече в преден урок, че няма дикция и хубав глас. Нямало да се разбира, какво говори. За това ги пише, а не говори. И така е добре. Който иска да се учи и това ще му всърши работа, пък и Стилгар често казва, че видео документация няма, цялата е писмена ;)
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar