Programar en C++ : Como crear funciones II

En el artículo anterior te puse las primeras pautas para que comprendieras el uso de las funciones y la creación de las mismas. Te dí un ejemplo sencillo de como construirlas y como usarlas en tu programa principal. En este post te daré las claves para que pases a la acción y comiences íntegramente con la programación estructurada. Voy a darte de forma guiada los pasos para construir funciones y realizaremos un programa para usarlas. Debes pasar a la acción y seguir los pasos que te propongo.

Vamos a realizar la siguiente práctica. Vamos a crear un programa que emule una calculadora usando funciones. Y vamos a realizar un análisis del problema paso a paso y siguiendo las pautas de la programacion en C++.

Nuestro programa nos va a sacar un menú por pantalla que nos dará 4 opciones, sumar,restar, multiplicar y dividir. También nos dará una quinta opción para salirnos.

La característica que va a tener este programa es que vamos a crear 4 funciones que posteriormente podremos utilizar en otros programas reutilizando código. Estas funciones son: suma, resta, multiplicacion y división. Vamos a hacer estas funciones siempre de dos números. Las cabeceras de las funciones serán las siguientes:

double suma(double a,double b);
double resta(double a,double b);
double multiplica(double a,double b);
double divide(double a,double b);

Vemos que las cabeceras son similares, necesitamos que la función nos devuelva un número real (double) y necesitamos incluir dos parámetros reales (a y b) que son las variables que utilizaremos en cada una de las funciones. Como podéis observar utilizo el mismo nombre de variables para todas las funciones. Esto se puede hacer puesto que dentro de cada función las variables que se declaran son independientes de otro función e independientes del programa principal.

En este punto lo que nos queda es programar las funciones de esta manera:

double suma(double a,double b){
          return a+b;
}
double resta(double a,double b){
          return a-b;
}
double multiplica(double a,double b){
          return a*b;
}
double divide(double a,double b){
      if(b!=0){
                  return a/b;
      }
      else   cout<<"ERROR: El divisor es cero";
}

Como veis las funciones suma,resta y multiplica son muy parecidas, y la función divide cambia puesto que comprueba que el divisor es distinto de cero. Es como si hicieramos un programa para dividir dos números solo que tenemos que tener en cuenta que lo que necesitamos lo aportamos de los parámetros.

Ahora que tenemos las funciones implementadas, las utilizamos en el programa principal. Este programa es trivial a un ejercicio que te mandé en otros artículos. Yo te lo voy a completar aquí y además le voy a añadir las funciones que he creado. El código final queda de esta manera:

 

#include 
#include 
using namespace std;

//FUNCIONES
double suma(double a,double b){
          return a+b;
}
double resta(double a,double b){
          return a-b;
}
double multiplica(double a,double b){
          return a*b;
}
double divide(double a,double b){
      if(b!=0){
                  return a/b;
      }
      else   cout<<"ERROR: El divisor es cero";
}

//PROGRAMA PRINCIPAL

int main(){
double n1,n2; //variables para operar
int opcion; //variable para la opcion elegida
cout<>n1;
cout<>n2;

do{
cout<<"ELIGE UNA OPCIÓN"<<endl;
cout<<"1 .- SUMA"<<endl;
cout<<"2 .- RESTA"<<endl;
cout<<"3 .- MULTIPLICACION"<<endl;
cout<<"4 .- DIVISION"<<endl;
cout<<"0 .- SALIR"<>opcion;
}while(opcion4);

if(opcion==1){
cout<<"\n"<<suma(n1,n2); //utilizamos la funcion suma 
}
if(opcion==2){
    cout<<"\n"<<resta(n1,n2); //utilizamos la funcion resta
}
if(opcion==3){
    cout<<"\n"<<multiplica(n1,n2); //utilizamos la funcion multiplica 
}
if(opcion==4){
    cout<<"\n"<<divide(n1,n2); //utilizamos la funcion divide
}

cout<<"\n MUCHAS GRACIAS POR USAR MI CALCULADORA";
getch();
}

Espero que este programa realizado paso a paso te haya servido para comprender mejor las funciones. Daremos más pautas sobre el uso de las mismas en posteriores artículos. Como os dije aquí utilizamos la implementación de las funciones en el mismo archivo cpp que el programa principal. Esto lo podemos separar y podemos realizar muchas más cosas. Haz este ejercicio paso a paso y ponte en acción para comprender esto 100%. Añade una 6ª opción que incluya en el programa una función que haga n1 elevado a n2. Implementa la función y añádela al programa principal.
Si tienes dudas o quieres aportar tua avances puedes dejarme comentarios, yo mismo los responderé.
Un saludo,
Javi Pizarro

Acerca de Javi Pizarro

Ingeniero informático dedicado a la docencia, con experiencia en creación de programas de gestión y desarrollo de aplicaciones web.
Esta entrada fue publicada en Programacion y etiquetada , , , . Guarda el enlace permanente.

15 respuestas a Programar en C++ : Como crear funciones II

  1. El Titi dijo:

    Comentame para que vale esta sentencia:
    using namespace std;
    Lo demás lo comprendo bastante bien. El programa es claro, está muy bien estructurado y prescinde de adornos.

  2. Jorge dijo:

    hola javi…
    sabes tengo dudas por que no corre este programa..
    gracias

  3. toby dijo:

    El programa tiene errores en el cout ademas de que faltan las librerias no obstante le hace falta un valor centinela para que no provoque un ciclo infinito

  4. cristopher dijo:

    Hola amigo presisamente es lo que tengo como actividad en mi escuela; ya logre comprender la mayoria de los pasos que describiste, pero tengo una duda para que se usa el }while(opcion4);

  5. Reynaldo Galiza dijo:

    Hola , estas muy buena la explicacion paso a paso del uso de las funciones, y ya ejecute el programa y me corre bien, pero , no sin antes haberle corregido algunos errores, lo que quiero es que me postee la ejecucion de un programa por separado(Compilacion por separado) con funciones, osea usando los encabezados o headers,

    Gracias

  6. Emanuel Rojas Vásquez dijo:

    me percate del error en el código que puso de ejemplo el autor, entendí su intención de crear funciones y utilizarlas, aunque este código tiene errores, por ejemplo en el “cout” no existe, y el ciclo do … while no se porque lo utiliza, y en la parte de while (opcion4) no se para que seria, igual me tiraba error, así que me puse a corregir los errores, y acá les dejo el código funcionando

    #include
    using namespace std;

    //FUNCIONES
    double suma(double a,double b){
    return a+b;
    }
    double resta(double a,double b){
    return a-b;
    }
    double multiplica(double a,double b){
    return a*b;
    }
    double divide(double a,double b){
    if(b!=0){
    return a/b;
    }
    else cout<<"ERROR: El divisor es cero";
    }

    //PROGRAMA PRINCIPAL

    int main(){
    double n1,n2; //variables para operar
    int opcion; //variable para la opcion elegida

    cout<<"ingrese los dos valores a operar"<>n1;
    cin>>n2;
    cout<<"\n"<<endl;

    cout<<"ELIGE UNA OPCION"<<endl;
    cout<<"1 .- SUMA"<<endl;
    cout<<"2 .- RESTA"<<endl;
    cout<<"3 .- MULTIPLICACION"<<endl;
    cout<<"4 .- DIVISION"<<endl;
    cout<<"0 .- SALIR"<>opcion;

    if(opcion==1){
    cout<<"\n"<<suma(n1,n2); //utilizamos la funcion suma
    }
    if(opcion==2){
    cout<<"\n"<<resta(n1,n2); //utilizamos la funcion resta
    }
    if(opcion==3){
    cout<<"\n"<<multiplica(n1,n2); //utilizamos la funcion multiplica
    }
    if(opcion==4){
    cout<<"\n"<<divide(n1,n2); //utilizamos la funcion divide
    }
    if(opcion==0){
    cout<<"Hasta luego";
    }
    cout<<"\n MUCHAS GRACIAS POR USAR MI CALCULADORA";
    return 0;
    }

  7. PUTA dijo:

    Me gustaría ayudarlos con su problema pero son demasiado ignorantes. a con respecto al Nombre: PUTA fue un vecino inepto

  8. leonardo plaza dijo:

    Esta es mi solucion!! funciona al pedo!! solo faltaba colocarle la entrada a n1 y n2 con el cin.
    y en “while(opcion4)” habia que declarar a opcion como char y luego en el while hay que colocar que si no se teclea alguna de las 4 opciones se repita el bucle hasta que se apriete la tecla correcta. eso se hace con el codigo asscii y el != como explico el profesor antes.

    #include <iostream>
    #include <conio.h>
    using namespace std;
    double suma(double a,double b){
    return a+b;
    }
    double resta(double a,double b){
    return a-b;
    }
    double multiplica(double a,double b){
    return a*b;
    }
    double divide(double a,double b){
    if(b!=0)
    return a/b;
    else
    cout<<"ERROR: El numero no es divisible entre cero";
    }
    int main(){
    double n1,n2;
    char opcion;
    cout<<"num 1: ";
    cin>>n1;
    cout<<"num 2: ";
    cin>>n2;
    do{
    cout<<"ELIGE UNA OPCION: "<<endl;
    cout<<"1 .- SUMA"<<endl;
    cout<<"2 .- RESTA"<<endl;
    cout<<"3 .- MULTIPLICACION"<<endl;
    cout<<"4 .- DIVISION"<<endl;
    cin>>opcion;
    }while(opcion!=49 && opcion!=50 && opcion!=51 && opcion!=52);

    if(opcion==49){
    cout<<"\nLa suma es igual a: "<<suma(n1,n2)<<endl;
    }
    if(opcion==50){
    cout<<"\nLa resta es igual a: "<<resta(n1,n2)<<endl;
    }
    if(opcion==51){
    cout<<"\nLa multiplicacion es igual a: "<<multiplica(n1,n2)<<endl;
    }
    if(opcion==52){
    cout<<"\nLa division es igual a: "<<divide(n1,n2)<<endl;
    }
    cout<<"\nGRACIAS POR USAR MI CALCULADORA!!!! Presiona una tecla para continuar….";
    getch();
    }

  9. leonardo plaza dijo:

    Y CON LA POTENCIA EL CODIGO SERIA:

    #include <iostream>
    #include <conio.h>
    #include <cmath>
    using namespace std;
    double suma(double a,double b){
           return a+b;
           }
    double resta(double a,double b){
           return a-b;
           }
    double multiplica(double a,double b){
           return a*b;
           }
    double divide(double a,double b){
           if(b!=0)
           return a/b;
           else
           cout<<"ERROR: El numero no es divisible entre cero";
           }
    int main(){
        double n1,n2,pot;
        char opcion;
        cout<<"num 1: ";
        cin>>n1;
        cout<<"num 2: ";
        cin>>n2;
        pot=pow(n1,n2);
        do{
                   cout<<"ELIGE UNA OPCION: "<<endl;
                   cout<<"1 .- SUMA"<<endl;
                   cout<<"2 .- RESTA"<<endl;
                   cout<<"3 .- MULTIPLICACION"<<endl;
                   cout<<"4 .- DIVISION"<<endl;
                   cout<<"5 .- POTENCIA"<<endl;
                   cin>>opcion;
                   }while(opcion!=49 && opcion!=50 && opcion!=51 && opcion!=52 && opcion!=53);
                   
        if(opcion==49){
                       cout<<"\nLa suma es igual a: "<<suma(n1,n2)<<endl;
                       }
        if(opcion==50){
                       cout<<"\nLa resta es igual a: "<<resta(n1,n2)<<endl;
                       }
        if(opcion==51){
                       cout<<"\nLa multiplicacion es igual a: "<<multiplica(n1,n2)<<endl;
                       }
        if(opcion==52){
                       cout<<"\nLa division es igual a: "<<divide(n1,n2)<<endl;
                       }
        if(opcion==53){
                       cout<< endl << n1 << " elevado a la "<< n2 <<" es igual a: "<< pot << endl;
                       }
        cout<<"\nGRACIAS POR USAR MI CALCULADORA!!!! Presiona una tecla para continuar....";
        getch();
    }
    
  10. porque al ejecutar el programa se sierra cuando termina los procesos … ¿como hacer para que se repitan los procesos, cuantas veces quieras?

  11. Antonio dijo:

    hola! lguien me podria ayudar a corregir los errores que me señala el programa para su ejecucion ya que no me muestra lo solicitado? gracias…

    #include
    #include
    #include
    #ifndef __MSDOS__
    #include
    #endif
    #ifdef __linux__
    #include
    #include
    #define CLEAR_SCREEN “clear”
    #define aacute “\xC3\xA1”
    #define oacute “\xC3\xB3”
    #define uacute “\xC3\xBA”
    #define Uacute “\xC3\x9A”
    int _getch ();
    #else
    #include
    #define CLEAR_SCREEN “cls”
    #define aacute “\240”
    #define oacute “\242”
    #define uacute “\243”
    #define Uacute “\351”
    #ifdef __MSDOS__
    #define _getch getch
    #endif
    #endif

    typedef struct TDAAlumno {
    char* cedula;
    char* apellidos;
    char* nombre;
    char* carrera;
    char* turno;
    char* promedio_gral;

    } Alumno;

    void* arreglo_insertar (void *arreglo, size_t *tamano, size_t size, const void *dato);
    void* arreglo_quitar (void *arreglo, size_t *tamano, size_t size, const void *dato);
    void arreglo_recorrer (void *arreglo, size_t tamano, size_t size, void *parametros, void (*funcion)(void*,void*));
    void pausar (const char *mensaje);
    char* leer_linea (const char *mensaje);
    char* leer_cadena (const char *mensaje, char *cadena);
    int leer_entero (const char *mensaje);
    int leer_campo (FILE *archivo, char *campo);
    int comparar_alumno (const Alumno *alumno1, const Alumno *alumno2);
    void imprimir_alumno (Alumno *dato, int *contador);
    void imprimir_en_archivo (Alumno *dato, FILE *archivo);
    const char *ruta = “alumnos.tsv”;
    int main ()
    {
    Alumno *alumnos = NULL;
    size_t tamano=0;
    Alumno *dato, alumno;
    int contador=0, opcion, subopcion;
    char campo[255];
    FILE *archivo = fopen (ruta, “r”);
    if (archivo!=NULL)
    {
    while (leer_campo (archivo, campo))
    {
    alumno.cedula = strdup (campo);
    leer_campo (archivo, campo);
    alumno.nombre = strdup (campo);
    leer_campo (archivo, campo);
    alumno.apellidos = strdup (campo);
    leer_campo (archivo, campo);
    alumno.carrera = strdup (campo);
    leer_campo (archivo, campo);
    alumno.turno = strdup (campo);
    leer_campo (archivo, campo);
    alumno.promedio_gral = strdup (campo);
    leer_campo (archivo, campo);
    alumnos = (Alumno*) arreglo_insertar (alumnos, &tamano, sizeof (Alumno), &alumno);
    }
    fclose (archivo);
    }
    do {
    system (CLEAR_SCREEN);
    printf (“MEN” Uacute “\n”);
    printf (“1.- Altas\n”);
    printf (“2.- Consultas\n”);
    printf (“3.- Actualizaciones\n”);
    printf (“4.- Bajas\n”);
    printf (“5.- Ordenar registros\n”);
    printf (“6.- Listar registros\n”);
    printf (“7.- Salir\n”);
    printf (“Seleccione una opci” oacute “n: “);
    fflush (stdout);
    do
    opcion = _getch ();
    while (opcion’7′);
    printf (“%c\n\n”, opcion);
    if (tamano==0 && opcion!=’1′ && opcion!=’7′)
    {
    pausar (“No hay registros.\n”);
    continue;
    }
    if (opcion=’2′ && opcion<='4' && dato==NULL)
    printf ("\nRegistro no encontrado.\n");
    else switch (opcion)
    {
    case '1':
    alumno.cedula = strdup (campo);
    alumno.apellidos = leer_linea ("Ingrese los apellidos");
    alumno.nombre = leer_linea ("Ingrese el nombre");
    alumno.carrera = leer_linea ("Ingrese la carrera");
    alumno.turno = leer_linea ("Ingrese el turno");
    alumno.promedio_gral = leer_linea ("Ingrese el promedio general");
    alumnos = (Alumno*) arreglo_insertar (alumnos, &tamano, sizeof (Alumno), &alumno);
    printf ("\nRegistro agregado correctamente.\n");
    break;
    case '3':
    printf ("Men" uacute " de modificaci" oacute "n de campos\n");
    printf ("1.- apellidos\n");
    printf ("2.- nombre\n");
    printf ("3.- carrera\n");
    printf ("4.- turno\n");
    printf ("5.- promedio general\n");
    do {
    subopcion = leer_entero ("Seleccione un n" uacute "mero de campo a modificar");
    if (subopcion7)
    printf (“Opci” oacute “n no v” aacute “lida.\n”);
    } while (subopcion7);
    switch (subopcion)
    {
    case 1:
    free (dato->nombre);
    dato->apellidos = leer_linea (“Ingrese el nuevo apellido”);
    break;
    case 2:
    free (dato->nombre);
    dato->apellidos = leer_linea (“Ingrese el nuevo nombre”);
    break;
    case 3:
    free (dato->carrera);
    dato->carrera = leer_linea (“Ingrese la nueva carrera”);
    break;
    case 4:
    free (dato->turno);
    dato->turno = leer_linea (“Ingrese el nuevo turno”);
    break;
    case 5:
    free (dato->promedio_gral);
    dato->promedio_gral = leer_linea (“Ingrese el nuevo promedio general”);
    break;
    }
    printf (“\nRegistro actualizado correctamente.\n”);
    break;
    case ‘4’:
    memcpy (&alumno, dato, sizeof (Alumno));
    alumnos = (Alumno*) arreglo_quitar ((void**)alumnos, &tamano, sizeof (Alumno), dato);
    free (alumno.cedula);
    free (alumno.apellidos);
    free (alumno.nombre);
    free (alumno.carrera);
    free (alumno.turno);
    free (alumno.promedio_gral);
    printf (“Registro borrado correctamente.\n”);
    break;
    case ‘5’:
    qsort (alumnos, tamano, sizeof (Alumno), (int(*)(const void*,const void*))comparar_alumno);
    printf (“Registros ordenados correctamente.\n”);
    break;
    case ‘6’:
    contador = 0;
    arreglo_recorrer (alumnos, tamano, sizeof (Alumno), &contador, (void(*)(void*,void*))imprimir_alumno);
    printf (“Total de registros: %d.\n”, contador);
    break;
    }
    if (opcion!=’7′)
    pausar (“”);
    } while (opcion!=’7′);
    archivo = fopen (ruta, “w”);
    if (archivo!=NULL)
    {
    arreglo_recorrer (alumnos, tamano, sizeof (Alumno), archivo, (void(*)(void*,void*))imprimir_en_archivo);
    fclose (archivo);
    }
    return EXIT_SUCCESS;
    }
    void* arreglo_insertar (void *arreglo, size_t *tamano, size_t size, const void *dato)
    {
    char *registro;
    arreglo = realloc (arreglo, size * (*tamano+1));
    registro = (char*)arreglo + *tamano * size;
    memcpy (registro, dato, size);
    (*tamano)++;
    return arreglo;
    }
    void* arreglo_quitar (void *arreglo, size_t *tamano, size_t size, const void *dato)
    {
    size_t i;
    char *registro = (char*)arreglo;
    for (i=0; i<*tamano && dato!=registro; i++, registro+=size);
    if (i<*tamano)
    {
    for (i++; i0)
    {
    funcion (registro, parametros);
    arreglo_recorrer (registro+size, tamano-1, size, parametros, funcion);
    }
    }

    int comparar_alumno (const Alumno *alumno1, const Alumno *alumno2)
    {
    return alumno1==alumno2 ? 0 : strcmp (alumno1->cedula, alumno2->cedula);
    }
    void imprimir_alumno (Alumno *dato, int *contador)
    {
    printf (“cedula : %s\n”, dato->cedula);
    printf (“apellidos : %s\n”, dato->apellidos);
    printf (“nombre : %s\n”, dato->nombre);
    printf (“carrera : %s\n”, dato->carrera);
    printf (“turno : %s\n”, dato->turno);
    printf (“promedio_gral: %s\n”, dato->promedio_gral);
    putchar (‘\n’);
    (*contador)++;
    }
    void imprimir_en_archivo (Alumno *dato, FILE *archivo)
    {
    fprintf (archivo, “%s\t”, dato->cedula);
    fprintf (archivo, “%s\t”, dato->apellidos);
    fprintf (archivo, “%s\t”, dato->nombre);
    fprintf (archivo, “%s\t”, dato->carrera);
    fprintf (archivo, “%s\t”, dato->turno);
    fprintf (archivo, “%s\t”, dato->promedio_gral);
    }
    char* leer_linea (const char *mensaje)
    {
    char linea[255];
    leer_cadena (mensaje, linea);
    return strdup (linea);
    }
    char* leer_cadena (const char *mensaje, char *cadena)
    {
    printf (“%s: “, mensaje);
    scanf (“%[^\r\n]”, cadena);
    getchar ();
    return cadena;
    }
    int leer_entero (const char *mensaje)
    {
    int entero;
    printf (“%s: “, mensaje);
    scanf (“%d”, &entero);
    getchar();
    return entero;
    }
    int leer_campo (FILE *archivo, char *campo)
    {
    fscanf (archivo, “%[^\t\n\r]”, campo);
    fgetc (archivo);
    return feof (archivo) == 0;
    }
    void pausar (const char *mensaje)
    {
    printf (“%s\nPresione una tecla para continuar . . . “, mensaje);
    fflush (stdout);
    _getch ();
    }
    #ifdef __linux__
    int _getch ()
    {
    int ch;
    struct termios oldt, newt;
    tcgetattr (STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr (STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr (STDIN_FILENO, TCSANOW, &oldt);
    return ch;
    }
    #endif

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s