Też miałem kiedyś problem ze zrozumieniem tej różnicy między funkcjami a procedurami, więc spróbuję napisać, jak w końcu to zrozumiałem.
Zarówno procedura jak i funkcja mogą przyjmować różne parametry w nagłówku, więc tym się nie sugeruj. W obu też możemy tworzyć zmienne (lokalne, niedostępne poza klamrami). Różnica jest taka, że jak już napisano, funkcja zwraca wartość (czyli na końcu ma "return cośtam", gdzie "cośtam" musi być typu takiego, jak funkcja, np int). Procedura nie zwraca wartości, a jedynie wykonuje różne rzeczy. Procedury i funkcje różnia się zarówno w budowie, jak i w tym, jak je wywołujesz. W praktyce to wyobraź sobie procedurę i funkcję, które sumują 2 liczby.
Różnica w budowie:
void proceduraSumuj(int a, int b)
{
cout << "Suma wynosi " << a + b;
}
int funkcjaSumuj(int a, int b)
{
return a + b;
}
Różnica w wywołaniu:
procedurę void możesz sobie od tak napisać w kodzie:
int main()
{
proceduraSumuj(2,2); // wyswietli "Suma wynosi 4";
return 0;
}
Natomiast gdybyś tak samo wywołał tę funkcję, to w praktyce tak, jakbyś napisał:
int main()
{
4;
return 0;
}
Czyli bez sensu, nie?
Dlatego funkcje przypisujesz do zmiennej albo wrzucasz do couta:
int main()
{
int mojaSuma;
mojaSuma = funkcjaSumuj(2,2);
// albo, jeśli byś chciał uzyskać efekt jak przy procedurze:
cout << "Suma wynosi: " << funkcjaSumuj(2,2);
return 0;
}