Skocz do zawartości

Funkcje c++


Recommended Posts

Witam od niedawna zacząłem uczyć się programowania w c++ i stąd moje pytanie, czy jest jakaś różnica czy ja napiszę funkcje tak:

 

#include <iostream>

#include <conio.h>

 

using namespace std;

 

 

int main ()

{

int nWartosc1;

int nWartosc2;

int wynik;

 

cin >> nWartosc1;

cin >> nWartosc2;

 

wynik = nWartosc1 + nWartosc2;

 

cout << wynik;

 

getch();

}

 

czy tak:

 

#include <iostream>

#include <conio.h>

 

using namespace std;

 

int dodawanie ()

{

int nZmienna1;

int nZmienna2;

 

cin >> nZmienna1;

cin >> nZmienna2;

 

int wynik = nZmienna1 + nZmienna2;

cout << wynik;

}

 

 

 

int main ()

{

 

 

dodawanie ();

 

cout << endl;

 

getch();

}

 

czy może tak:

 

#include <iostream>

#include <conio.h>

 

using namespace std;

 

int dodawanie (int nZmienna1, int nZmienna2)

{

int wynik = nZmienna1 + nZmienna2;

cout << wynik;

}

 

 

int main ()

{

int nWartosc1;

int nWartosc2;

 

cin >> nWartosc1;

cin >> nWartosc2;

 

dodawanie (nWartosc1, nWartosc2);

 

cout << endl;

 

getch();

}

 

Proszę od odpowiedz z góry dzięki :)

Link to post
Share on other sites

Każda wersja jest błędna ;-) Bo funkcja wg Twojej definicji zwraca int, a nie masz nigdzie żadnego returna. Ale wiem, czepiam się. Z punktu widzenia wydajności to wszystko jedno i to samo (kompilatory to sprytne bestie). Z punktu widzenia łatwości utrzymania kodu programu ostatnia wersja najlepsza, bo umożliwia np. podawanie danych wczytanych z pliku, sieci bądź wygenerowanych przez inne funkcje jako argumenty do dodawania, wersja druga jest ograniczona do wczytywania danych ze standardowego wejścia. Wersja pierwsza sprawdza się jedynie w wypadku małych programów, gdzie wszystko można spokojnie zamknąć w main, skompilować i zapomnieć....

Link to post
Share on other sites

@up

Funkcja nic nie zwraca (bo nie musi), zauważ, że przed końcem wykonania funkcji wynik jest wypisywany na ekran i tyle.

Funkcja musiałaby zwrócić wynik returnem jeśli np w przypadku trzecim byłoby tak:

 

int dodawanie (int nZmienna1, int nZmienna2)

{

int wynik = nZmienna1 + nZmienna2;

return wynik;

}

a w main():

cout << dodawanie (nWartosc1, nWartosc2) << endl;

Edytowane przez _MoonLight_
Link to post
Share on other sites

Każda wersja jest błędna ;-) Bo funkcja wg Twojej definicji zwraca int, a nie masz nigdzie żadnego returna. Ale wiem, czepiam się. Z punktu widzenia wydajności to wszystko jedno i to samo (kompilatory to sprytne bestie). Z punktu widzenia łatwości utrzymania kodu programu ostatnia wersja najlepsza, bo umożliwia np. podawanie danych wczytanych z pliku, sieci bądź wygenerowanych przez inne funkcje jako argumenty do dodawania, wersja druga jest ograniczona do wczytywania danych ze standardowego wejścia. Wersja pierwsza sprawdza się jedynie w wypadku małych programów, gdzie wszystko można spokojnie zamknąć w main, skompilować i zapomnieć....

 

Czyli w zasadzie się niczym te funkcje nie różnią. Jak bym chciał robić większy program to wybrał bym opcje 3 bo tak jak mówisz nie trzeba 20 razy pisać tej samej funkcji. Chodziło mi tylko czy one mają jakiś inny sposób działania, tak więc dzięki za odpowiedz :)

 

A co chodzi o te getch() to wpisałem, ponieważ jak wpisze return 0 to program który zapisuje się po kompilacji jako aplikacja, wyłącza się po niektórych czynnościach. Po prostu tak jak by się nie zatrzymywał. A więc mógłbyś mi wytłumaczyć różnicę miedzy getch() a return? może źle czytam książkę, ale nie wiem o co chodzi z tym return, wiem że zatrzymuje on program i zwraca wartość, ale to trochę dziwne :) I jeszcze jedno co za różnica czy ja w programie wpisze np:

 

int Obwod(int nBok1, int nBok2)

{

return 2 * (nBok1 + nBok2);

}

int Pole(int nBok1, int nBok2)

{

return nBok1 * nBok2;

}

 

int main()

 

int nDlugosc1;

std::cout << "Podaj dlugosc pierwszego boku: ";

std::cin >> nDlugosc1;

int nDlugosc2;

std::cout << "Podaj dlugosc drugiego boku: ";

std::cin >> nDlugosc2;

std::cout << "Obwod prostokata: " << Obwod(nDlugosc1, nDlugosc2) <<

std::endl;

std::cout << "Pole prostokata: " << Pole(nDlugosc1, nDlugosc2) <<

std::endl;

getch();

 

Czy taki sam program tyko bez return:

 

int Obwod(int nBok1, int nBok2)

{

int wynik = 2 * (nBok1 + nBok2);

cout << wynik;

}

int Pole(int nBok1, int nBok2)

{

int wynik = nBok1 * nBok2;

cout << wynik;

}

 

int main()

 

int nDlugosc1;

std::cout << "Podaj dlugosc pierwszego boku: ";

std::cin >> nDlugosc1;

int nDlugosc2;

std::cout << "Podaj dlugosc drugiego boku: ";

std::cin >> nDlugosc2;

std::cout << "Obwod prostokata: " << std::endl;

Obwod(nDlugosc1, nDlugosc2);

std::cout << "Pole prostokata: << std::endl;

Pole(nDlugosc1, nDlugosc2);

getch();

 

Tylko nie patrzcie na błędy w tych programach bo to tylko taki przykład.

Link to post
Share on other sites

Prawidłowo to powinno wyglądać tak:

int add(int a, int b)
{
return a + b;
}
0. Kod umieszczaj w odpowiednim znaczniku :P

1. Nazwy funkcji powinny być angielskimi czasownikami

2. Notacja węgierska już dawno upadła. Ortodoksi by powiedzieli, że argumenty powinny się tutaj nazywać dodajna i dodajnik (tyle, że po angielsku). Dla mnie to przegięcie, przyjąłem konwencję, żeby zmienne w funkcjach matematycznych oznaczać powszechnie używanymi symbolami (dlatego tu dałem a i b).

3. W tej funkcji nie powinno być cout, bo jej nazwa mówi tylko o dodawaniu, a nie wypisywaniu wyniku. Alternatywnie mógłbyś nazwać po prostu funkcję printSum.

 

=============================

Drugi post.

Return nie zatrzymuje programu, tylko kończy funkcję i zwraca wynik. Dlatego main zwraca 0, bo jest taką jakby, główną funkcją. Jej wynik natomiast to tzw. kod błędu. Gdyby był różny od zera, system operacyjny zinterpretowałby to, że program źle się wykonał.

 

Getch to taki dirty hack używany, gdy się pisze programy konsolowe, żeby konsola nie uciekła, gdy się nie zna lepszego sposobu. Ta funkcja czeka po prostu, aż użytkownik wstuka pojedyńczy znak.

Spróbuj taki kod:

char a = getch();
cout << a;
Link to post
Share on other sites

@up Funkcja nic nie zwraca (bo nie musi), zauważ, że przed końcem wykonania funkcji wynik jest wypisywany na ekran i tyle.

skoro w definicji funkcji jest napisane int dodawanie(...) to funkcja MUSI zwrócić int :-) Jak ma nic nie zwracać, to powinna być zadeklarowana jako void dodawanie(...).

Link to post
Share on other sites
  • 2 tygodnie później...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...