Lo primero de todo, el ejercicio te dice que utilices funciones. Una función podríamos decir que es un programa que puede funcionar de forma independiente al tuyo. Por ejemplo un programa que suma puede funcionar por si solo y cumplir su función de sumar sin necesidad de hacer nada más.
Debes hacer mínimo una función para cada operación básica. Y opcionalmente puedes utilizar alguna otra función para otra cosa. Por ejemplo una función para el menú. Después haces llamadas a dichas funciones.
Te hice el programa para que te orientes un poco. Ayuda bastante tener algún código de ejemplo de exactamente lo que quieres hacer. Todo lo que no entiendas búscalo en Google. Y si no te queda claro puedes hacer un post con todas tus dudas recopiladas.
#include <iostream>
#include <string>
using namespace std;
/* Prototipos de funciones para avisar al compilador */
int Sumar(int numero1, int numero2);
int Restar(int numero1, int numero2);
int Multiplicar(int numero1, int numero2);
int Dividir(int numero1, int numero2);
int PedirNumero(string operacion);
/* Funcion principal */
int main()
{
cout << "Calculadora básica." << endl;
int opcionDelMenu = 1;
while (opcionDelMenu !=0)
{
cout << endl << "Opciones Disponibles:" << endl << "1. Sumar" << endl << "2. Restar" << endl << "3. Multiplicar" << endl << "4. Dividir" << endl << endl << "0. Salir" << endl << endl;
/* Comentario #1 */
opcionDelMenu = PedirNumero("seleccionar una opción");
/* Comentario #2 */
switch (opcionDelMenu)
{
case 0:
{
cout << "Hasta Luego!" << endl;
cin.ignore();
cin.get();
return 0;
}
case 1:
{
int num1 = PedirNumero("sumar");
int num2 = PedirNumero("sumar");
cout << "El resultado es: " << Sumar(num1, num2) << endl;
} break;
case 2:
{
int num1 = PedirNumero("restar");
int num2 = PedirNumero("restar");
cout << "El resultado es: " << Restar(num1, num2) << endl;
} break;
case 3:
{
int num1 = PedirNumero("multiplicar");
int num2 = PedirNumero("multiplicar");
cout << "El resultado es: " << Multiplicar(num1, num2) << endl;
} break;
case 4:
{
int num1 = PedirNumero("dividir");
int num2 = PedirNumero("dividir");
cout << "El resultado es: " << Dividir(num1, num2) << endl;
} break;
default:
{
cout << "La opción " << opcionDelMenu << " introducida no está contemplada" << endl;
}
}
}
return 0;
}
/* Definición de Funciones */
int Sumar (int numero1, int numero2)
{
return numero1+numero2;
}
int Restar (int numero1, int numero2)
{
return numero1-numero2;
}
int Multiplicar (int numero1, int numero2)
{
return numero1 * numero2;
}
int Dividir (int numero1, int numero2)
{
return numero1/numero2;
}
int PedirNumero(string operacion)
{
int numero = 0;
cout << "Introduzca el numero para " << operacion << endl;
cin >> numero;
return numero;
}
Comentario #1:
Pudes guardar el valor de retorno de una función en una variable. Ejemplos con distintos parámetros:
int resultadoSuma = suma();
int resultadoResta = resta(3 , 2);
int resultadoMulti = multiplicacion(7, numero);
int resultadoDivision = dividir(resultadoMulti, resultadoSuma);
La sentencia: opcionDelMenu = PedirNumero("seleccionar una opción"); se compone de:
-La variable
opcionDelMenu que fue declarada anteriormente.
-El operador de asignación
= que asigna el return o resultado de la expresión a su derecha a la variable o contendor de su izquierda.
- La llamada a la función
PedirNumero(); que está declarada al final del código. Al llamarla, se ejecuta el código que contiene. Esta llamada tiene como parámetro el texto entrecomillado "seleccionar una opción". Esto es un string literal. Es usado en el cout de la función. Esto es lo mismo que hacer lo siguiente:
string miTexto = "seleccionar una opción";
opcionDelMenu = PedirNumero(miTexto);
Comentario #2:
Utilizo un
switch(parámetro) en lugar de varios if, else if, else.
Utilizando los if, else if y else sería:
if (opcionDelMenu == 0)
{
cout << "Hasta Luego!" << endl;
cin.ignore();
cin.get();
return 0;
}
else if (opcionDelMenu == 1)
{
int num1 = PedirNumero("sumar");
int num2 = PedirNumero("sumar");
cout << "El resultado es: " << Sumar(num1, num2) << endl;
}
else if (opcionDelMenu == 2)
{
int num1 = PedirNumero("restar");
int num2 = PedirNumero("restar");
cout << "El resultado es: " << Restar(num1, num2) << endl;
}
else if (opcionDelMenu == 3)
{
int num1 = PedirNumero("multiplicar");
int num2 = PedirNumero("multiplicar");
cout << "El resultado es: " << Multiplicar(num1, num2) << endl;
}
else if (opcionDelMenu == 4)
{
int num1 = PedirNumero("dividir");
int num2 = PedirNumero("dividir");
cout << "El resultado es: " << Dividir(num1, num2) << endl;
}
else
{
cout << "La opción " << opcionDelMenu << " introducida no está contemplada" << endl;
}
cin.ignore(); sirve para ignorar los caracteres que estén en el buffer.
cin.get(); es una forma de pausar el programa hasta que se introduzca un caracter. En algunos IDE como CodeBlocks se pausa automáticamente la consola para ver el resultado del programa hasta que pulses enter. Pero si vas a la carpeta del .exe (en caso de windows) generado y lo ejecutas, esta pausa no se produce. Por lo que utilizo cin.get para que el programa no finalice automáticamente y se pueda ver el mensaje de despedida.
Despues utilizo
return 0; para finalizar la función
int main() y por tanto el programa cuando se seleccione salir. Otra opción es utilizar la propia funcionalidad del while. Vacias el case 0: y le añades el break. De tal forma que salte al final del while, se compruebe que la condición del bucle ya no se cumple, y continue la ejecución hasta el return 0; que se encuentra en el final del cuerpo de la función main. Es más eficiente retornar 0 directamente desde case 0: pero no siempre va a ser el comportamiento que deseas. A veces quieres salir de un bucle, y entrar en otro bucle nuevo por ejemplo, y si hicieses el return 0 dentro del case 0: abandonarias el programa directamente sin continuar la ejecucción hasta el siguiente bucle.
Comentario Final:
Por último están declaradas todas las funciones del programa. Todas retornan un entero. En los cout dentro de los case puedes ver como están las llamadas a las funciones dentro del propio cout.
cout << "El resultado es: " << Sumar(num1, num2) << endl; Como ves en la ejecución, Sumar(num1, num2) es remplazado por su valor de retorno.
Tambien puedes utilizar funciones sin retorno del tipo void. Ej:
#include <iostream>
#include <string>
using namespace std;
int vecesSaludado = 0;
void Saludo(string nomb);
int main()
{
string miNombre = "";
cout << "Hola cómo te llamas?" << endl;
cin >> miNombre;
Saludo(miNombre);
Saludo("Paco");
Saludo(miNombre);
int veces;
cout << "Cuantas veces quieres que te salude?" << endl;
cin >> veces;
for ( int i = 0; i < veces; ++i)
{
Saludo(miNombre);
}
cout << miNombre << " fuiste saludado " << vecesSaludado << " veces." << endl;
cin.get();
return 0;
}
void Saludo(string nomb)
{
cout << "Hola " << nomb << " bienvenido a mi programa." << endl << endl;
++vecesSaludado;
}
En el foro de dudas generales tienes un listado con libros. Si te manejas en inglés en concreto te recomiendo leer el del
Apress Learn C++ for game developers.