Un problema grande se resuelve mejor si lo partimos en problemas chicos.
leerNotas()promedio3()mostrar()Cada parte es un subprograma. En C++ se escriben como funciones, y main() es la que las coordina.
La ejecución salta a la función, la recorre, y al terminar vuelve al punto exacto donde se la llamó.
x, y, z, w son locales: nacen con la llamada y mueren al terminar. Por eso el resultado tiene que salir con return.
Los dos reciben datos y hacen un trabajo. La diferencia está en qué pasa con el resultado.
Calcula algo y te lo devuelve con return, para que lo guardes o lo sigas usando.
promedio3Hace una tarea (mostrar, cargar, modificar) pero no devuelve nada. En C++ es una función void.
mostrarPromedio¿Necesitás el resultado para seguir trabajando con él? → función que devuelve.
¿Solo querés que algo pase? → procedimiento (void).
Leyendo solo la primera línea ya sabés qué recibe y qué devuelve.
Qué clase de dato devuelve (int, float, bool…). Si no devuelve nada: void.
Cómo la vas a llamar. Conviene un verbo que diga qué hace: calcular, mostrar, esPar…
Lo que necesita para trabajar: tipo y nombre de cada uno, separados por coma.
Va antes de main() y avisa que la función existe. Termina en ;
Firma + cuerpo entre llaves: el código que se ejecuta.
Parámetros actuales → formales: misma cantidad, orden y tipo.
El tipo que va antes del nombre dice qué clase de valor sale de la función.
int maximo(int a, int b)→7un enterofloat promedio3(int x, int y, int z)→25.0un realbool esPar(int n)→truesí / nochar letraNota(int nota)→'A'un caráctervoid mostrarMenu()→—nadaEl valor que acompaña al return tiene que ser del mismo tipo que la función. Una función void no devuelve valor.
return termina la función en el actoLa función recibe una copia del dato. Haga lo que haga con su copia, el original no se entera.
Imprime 5: la función duplicó su propia copia y después la copia desapareció.
Como prestar una fotocopia de tu apunte: si la rayan, tu original queda limpio.
Con & no hay copia: el parámetro pasa a ser otro nombre para la misma variable.
nImprime 10: lo que la función le hace a x le pasa a n. Sirve para modificar variables de quien llama o para sacar más de un resultado.
Como un apodo: si a Martín le dicen «Tincho» y Tincho se corta el pelo… Martín también.
Mismo código, una sola diferencia: el &. Pensalo antes de avanzar.
Se intercambiaron las copias a y b; x e y nunca se tocaron.
a y b son otros nombres de x e y: el intercambio pasa en los originales.
Tres ideas para que tus funciones sirvan en más lugares y den menos sorpresas.
void volumen1(float r, float h) { … cout << vol; }float volumen2(float r, float h) { … return vol; }Si la función hace cout, queda atada a la consola. Si devuelve el valor, quien la llama decide qué hacer con él.
void mostrar(const int lista[], int n)
La función trabaja sobre el arreglo original. Si no debe modificarlo, marcalo const.
Lo que se declara dentro de una función (y sus parámetros) solo existe ahí: nace con la llamada y muere al terminar. Preferí pasar los datos por parámetro antes que usar variables globales.
No son imprescindibles, pero aparecen seguido en ejercicios y parciales.
promedio3(4, 7)promedio3(4, 7, 1)Si no mandás ese parámetro, toma el valor por defecto. Los que tienen valor por defecto van siempre al final de la lista.
Mismo nombre, distintos parámetros: el compilador elige cuál usar según los tipos de la llamada. Si solo cambia el tipo de retorno, no alcanza: es error.
Una función que se llama a sí misma para resolver una versión más chica del mismo problema: 4! = 4 × 3!
1. Se llama a sí misma con un problema más chico (x - 1).
2. Tiene un caso base que corta las llamadas (x == 0).