C骴igo C++

  • Blog
  • Acerca
  • Autor
  • Contacto
  • Posts guardados en "funciones":

    Tipos de funciones en C++

    Los tipos de funciones en c++ son 4, aunque en realidad son las combinaciones de las 2 cosas que una funci贸n puede hacer. Si andan perdidos en cuanto a funciones les recomiendo leer mi post anterior: Funciones en C++.

    Una funci贸n, como les dec铆a, puede hacer (o no) dos cosas: 1 – Recibir datos y 2 – Retornar datos. De esto surgen los cuatro tipos de funciones:

    1. No reciben ni retornan
    2. Reciben y no retornan
    3. No reciben y retornan
    4. Reciben y retornan

    Vamos a hacer un programa que sume dos n煤meros, usando los cuatro tipos de funciones:

    No reciben ni retornan

    Las m谩s sencillas. Para usarlas s贸lo tenemos que saber c贸mo crearlas y c贸mo llamarlas. Una funci贸n se crea de esta forma general:
    tipo nombre(){}
    El ‘tipo’ se refiere al tipo de dato (int, float, void, char) y en las funciones que no retornan siempre es void.

    El ‘nombre’ es el nombre de la funci贸n: cualquiera que empiece con una letra, que sea significativo y que no sea una palabra reservada.

    Para llamarlas s贸lo hay que escribir el nombre de la funci贸n seguido de sus par茅ntesis y un punto y coma (;).
    nombre();

    As铆 nuestro programa ser铆a:

    #include<iostream>
    using namespace std;
     
    void sumar()
    {
        int num1, num2, r;
        cout << "Numero 1: "; cin >> num1;
        cout << "Numero 2: "; cin >> num2;
        r = num1 + num2;
        cout << "La suma es " << r;
    }
     
    int main()
    {
        sumar();
    }

    Como ven, todo lo que habr铆amos puesto en nuestro main mejor los pusimos en una funci贸n y desde el main la llamamos. Una funci贸n siempre, siempre, siempre tiene que ir antes del main.

    Una funci贸n de este tipo que hemos usado muchas veces es getch();

    Reciben y No Retornan

    驴C贸mo har铆amos para pedir los dos n煤meros en el main y que la funci贸n haga la suma? Para eso tenemos que hacer una funci贸n capaz de recibir datos, entonces la聽sintaxis聽cambia un poco:
    tipo nombre(tipo_var1 nombre_var1, tipo_var2 nombre_var2){}
    ‘tipo’ y ‘nombre’ se refieren a lo mismo y como no retorna el tipo siempre es void.

    Dentro del par茅ntesis tenemos otros aspectos:

    ‘tipo_var1′ se refiere al tipo de la variable que nuestra funci贸n va a recibir.

    ‘nombre_var1′ se refiere al nombre de esa variable.

    Si queremos recibir una variable hasta ah铆 es suficiente, si queremos otra variable ponemos una coma (,) y declaramos la siguiente variable.

    Para llamar la funci贸n hay que poner la variables que vamos a enviar dentro del par茅ntesis en el mismo orden en que las declaramos en la funci贸n:
    nombre(var1, var2);

    Nuestro programa quedar铆a as铆:

    #include<iostream>
    using namespace std;
     
    void sumar(int num1, int num2)
    {
        int r;
        r = num1 + num2;
        cout << "La suma es " << r;
    }
     
    int main()
    {
        int num1, num2;
        cout << "Numero 1: "; cin >> num1;
        cout << "Numero 2: "; cin >> num2;
        sumar(num1, num2);
    }

    Pedimos los dos n煤meros en el main, los enviamos a la funci贸n, 茅sta los suma y los muestra.

    Una funci贸n de este tipo que hemos usado muchas veces es el odiado por muchos, amados por otros, gotoxy(x,y);

    Retornan y No Reciben

    驴Y si ahora queremos lo contrario? Pedir los n煤meros en la funci贸n, pero mostrar el resultado en el main. Para eso necesitamos una funci贸n que retorne.

    Recibir es enviar datos del main a la funci贸n. Retornar es enviar datos de la funci贸n al main. Para retornar datos hay que hacer dos cosas: no usar void como tipo y usar return.

    De forma general:
    tipo nombre() { return var; }
    El ‘tipo’ tiene que ser del tipo de variable que queremos retornar, si nuestra variable retorna una variable int, pues el tipo de la funci贸n es int.

    Para indicar qu茅 variable estamos retornando usaremos la palabra return seguido de la variable. Usualmente esto va al final de la funci贸n.

    Para llamar a la funci贸n hay que preparar un colch贸n en donde caiga la variable que est谩 retornando.
    var = nombre();
    La variable que est谩 retornando nuestra funci贸n se va a almacenar en la variable ‘var’. Este es un buen momento para recordarles que las variables declaradas entre dos llaves {} 煤nicamente existen entre esas dos llaves. O sea que la variable ‘var’ de la funci贸n no es la misma que la variable ‘var’ de la funci贸n; sin embargo la var del main est谩 adquiriendo el valor de la var del main. Un poco confuso lo se, no se preocupen.

    Nuestro programa quedar铆a as铆:

    #include<iostream>
    using namespace std;
     
    int sumar()
    {
        int num1, num2, r;
        cout << "Numero 1: "; cin >> num1;
        cout << "Numero 2: "; cin >> num2;
        r = num1 + num2;
        return r;
    }
     
    int main()
    {
        int r;
        r = sumar();
        cout << "La suma es " << r;
    }

    驴A alguien se le ocurre una funci贸n conocida de este tipo?

    Reciben y Retornan

    Ahora queremos que nuestra funci贸n 煤nicamente sume, el main se va a encargar de pedir los n煤meros y sumar los resultados. Para eso necesitamos que nuestra funci贸n reciba las variables y adem谩s retorne el resultado. 隆Wow! 驴Es acaso eso posible? Claro que s铆.

    Es s贸lo cuesti贸n de combinar las funciones que reciben y no retornan con las que retornan y no reciben.

    Nuestro programa quedar铆a as铆:

    #include<iostream>
    using namespace std;
     
    int sumar(int num1, int num2)
    {
        int r;
        r = num1 + num2;
        return r;
    }
     
    int main()
    {
        int num1, num2, r;
        cout << "Numero 1: "; cin >> num1;
        cout << "Numero 2: "; cin >> num2;
        r = sumar(num1, num2);
        cout << "La suma es " << r;
    }

    Las funciones de la librer铆a math.h son en su mayor铆a de este tipo. sqrt(); pow(); sin();

    En principio puede parecer que las funciones sirven 煤nicamente para organizar el c贸digo, lo cual es cierto, pero no s贸lo eso. 驴Se imaginan si聽tuvi茅ramos聽que escribir todo el c贸digo detr谩s de un simple gotoxy();? Ah verdad…

    Bueno, no me iba a quedar tranquilo si no les mostraba la versi贸n optimizada de la 煤ltima funci贸n:

    #include<iostream>
    using namespace std;
     
    int sumar(int num1, int num2)
    {
        return num1 + num2;
    }
     
    int main()
    {
        int num1, num2;
        cout << "Numero 1: "; cin >> num1;
        cout << "Numero 2: "; cin >> num2;
        cout << "La suma es " << sumar(num1, num2);
    }

    :D

    Funciones en C++

    Supongo que ya es hora de retomar el blog y ponerme a hablar de funciones en c++. Una funci贸n es un pedazo de c贸digo fuera del main, con un nombre y que puede ser ‘llamado’ desde otra parte de nuestro programa.

    Imag铆nense que est谩n entrenando a su perro a hacerse el muertito. Cada vez que ustedes dicen ‘muertito‘, el perro se tira de espaldas en el suelo, cierra los ojos y saca la lengua. En programaci贸n, el contenido de la funci贸n ser铆a tirarse de espaldas, cerrar los ojos y sacar la lengua; el nombre de la funci贸n ser铆a muertito; y cada vez que nosotros decimos muertito estamos llamando a la funci贸n.

    Nuestra funci贸n ser铆a algo as铆:

    void muertito()
    {
       Perro.Tirarse(posicion='espalda');
       Perro[OjoDer].Cerrar(); 
       Perro[OjoIzq].Cerrar();
       Perro[Lengua].Sacar();
    }

    Jajaja, bueno, bueno. Ya en serio vamos a hacer un cl谩sico Hola Mundo pero usando una funci贸n:

    #include<iostream>
    using namespace std;
    void hola()
    {
        cout << "Hola Mundo!";
    }
    int main()
    {
        hola();
    }

    Como ven, esta funci贸n es muy est煤pida. No nos beneficia en nada y nos hace escribir m谩s c贸digo del necesario, pero nos sirve para ver c贸mo act煤a una funci贸n: al momento de llamar a la funci贸n, el compilador se brinca a la funci贸n, la ejecuta y cuando termina, vuelve al punto desde donde brinc贸.

    Si pudieran leerle la mente a un compilador, este dir铆a:

    Linea 1. Incluir la librer铆a iostream. OK
    Linea 2. Usar el namespace est谩ndar. OK
    Linea 3. Oh! una funci贸n llamada hola, la recordar茅.
    Linea 4. Llave. Parte de la funci贸n. Ignorar
    Linea 5. Imprimir “Hola Mundo!”. Parte de la funci贸n. Ignorar
    Linea 6. Llave. Parte de la funci贸n. Ignorar
    Linea 7. 隆Por fin el main!
    Linea 8. Llave. Entrar
    Linea 9. Esta funci贸n se me hace conocida… oh s铆 ya recuerdo. Ejecutar lineas 4, 5 y 6
    Linea 10. Llave. Salir

    Ahora veamos una funci贸n que s铆 nos es 煤til:

    #include<iostream>
    using namespace std;
     
    void hola(char nombre[50])
    {
        cout << "Hola " << nombre << "!";
    }
     
    int main()
    {
        char nombre[50];
        cout << "Cual es tu nombre?: "; cin.getline(nombre, 50, '\n');
        hola(nombre);
    }

    Primero pedimos un nombre, lo guardamos en una variable y se le mandamos a la funci贸n para que lo muestre.

    No se preocupen, si nunca hab铆an visto una funci贸n tal vez no entiendan la sintaxis, pero el objetivo de este post es que sepan qu茅 es una funci贸n y para qu茅 se puede usar. En el siguiente post voy a explicar la sintaxis de los cuatro tipos de funciones en c++.

    Bueno, casi creo que nunca he hablado de matrices, par谩metros o funciones en este blog, pero este post es una petici贸n de Rodrigo que me dijo por email que ten铆a problemas con su tarea porque no sabe c贸mo pasar una matriz como par谩metro a una funci贸n en c++. Es algo sencillo, pero dif铆cil de deducir. Veamos.

    Si tu arreglo es de una dimensi贸n…
    int matriz[4];
    … la forma de declarar la funci贸n es la siguiente:
    void fx(int m[4]) { ...c贸digo... }
    Y la forma de llamar la funci贸n ser铆a:
    fx(matriz);

    Si el arreglo es de dos dimensiones…
    int matriz[4][3];
    … pues es lo mismo:
    void fx(int m[4][3]) { ...c贸digo... }
    Y la forma de llamar la funci贸n ser铆a:
    fx(matriz);

    Si la funci贸n retorna una matriz…
    int matriz[4];
    … se declara normal:
    void fx(int m[4]) { return matriz[4]; }
    Y la forma de llamar la funci贸n ser铆a:
    matriz[4] = fx(matriz);

    Este programa pide tres n煤meros, los almacena en una matriz, le suma 1 a cada elemento y los muestra, usando para cada acci贸n una funci贸n. As铆 que tenemos funciones que reciben matrices y que retornan matrices. Ch茅quenlo.

    #include<iostream>
    using namespace std;
     
    void pedir(int matriz[3], int len)
    {
        for(int i=0; i<=len; i++)
        {
            cout << "Numero " << i+1 << ":? ";
            cin >> matriz[i];
        }
    }
     
    int sumar(int matriz[3], int len)
    {
        for(int i=0; i<=len; i++)
            matriz[i]++;
        return matriz[3];
    }
     
    void mostrar(int matriz[3], int len)
    {
        for(int i=0; i<=len; i++)
            cout << matriz[i] << " ";
    }
     
    int main()
    {
        int matriz[3]={0}, len = sizeof(matriz)/sizeof(int);
        pedir(matriz, len-1);
        matriz[3] = sumar(matriz, len-1);
        mostrar(matriz, len-1);
        return 0;
    }

    Funci贸n delay() en C++

    Una funci贸n a veces 煤til a veces no mucho es el delay(), sirve para hacer una pausa de ‘n’ segundos. En algunos compiladores Borland esta funci贸n se incluye en la librer铆a conio.h pero como aqu铆 estamos del lado del software libre vamos a hacer nosotros mismos esta funci贸n. Primero veamos c贸mo se usa:
    delay(variable_tipo_int);
    es decir:
    int secs=10;
    delay(secs);

    o
    delay(numero_entero);
    es decir:
    delay(12);
    Y claro, la funci贸n es esta:
    void delay(int secs) {
    for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));
    }

    1. La funci贸n time(NULL) nos devuelve el segundo exacto en que estamos.
    2. Si le sumamos cierta cantidad de segundos obtenemos una fecha en el futuro.
    3. En cada vuelta del ciclo se checa si esa fecha en el futuro es diferente a la fecha actual.
    4. En cuanto las dos fechas son iguales el ciclo acaba y el programa contin煤a.

    Veamos como se usa en un programa en c++:

    #include<time.h>
    #include<iostream>
    using namespace std;
     
    void delay(int secs) {
      for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));
    }
     
    int main()
    {
        int sec;
        cout << "Segundos a pausar?: "; cin >> sec;
        delay(sec);
    }

    Para poder usar la funci贸n delay de esta forma es necesario ponerla en todos los programas en donde necesitemos usarla (ahora me doy cuenta que no he escrito mucho sobre funciones) e incluir siempre la librer铆a #include<time.h> o #include<ctime>.

    Programa que lee un arreglo de 10 n煤meros y los ordena con el m茅todo de la burbuja de manera ascendente o descendente seg煤n se elija. Para esto utiliza una funci贸n que recibe el arreglo y la varible ‘ord’ (1=asc, 2=desc), luego utiliza otra funci贸n para imprimirlo.

    #include<iostream>
    using namespace std;
     
    int ordenar(int[],int);
    int imprimir(int[]);
     
    int main()
    {
      int c,lista[9],ord;
      for(c=0;c<=9;c++)
      {
        cout<<"Numero "<<c+1<<": "; cin>>lista[c];
      }
      cout<<"\nAscendente 1\nDescendente 2\n--> Opci贸n: "; cin>>ord;
      if(ord==1 || ord==2)
      {
        ordenar(lista,ord);
        imprimir(lista);
      }
    }
     
    int ordenar(int lista[],int ord)
    {
      int c1,c2,aux;
      for(c1=0;c1<=9;c1++)
      {
        for(c2=0;c2<9;c2++)
        {
          if(ord==1)
          {
            if(lista[c2]>lista[c2+1])
            {
              aux=lista[c2];
              lista[c2]=lista[c2+1];
              lista[c2+1]=aux;
            }
          }
          else
          {
            if(lista[c2]<lista[c2+1])
            {
              aux=lista[c2];
              lista[c2]=lista[c2+1];
              lista[c2+1]=aux;
            }
          }
        }
      }
      return 0;
    }
     
    int imprimir(int lista[])
    {
    int c;
      for(c=0;c<=9;c++)
        cout<<lista[c]<<" ";
      cin.get();cin.get();
    }
    /*Creado por THEbatzuk*/