Código C++

  • Blog
  • Acerca
  • Autor
  • Contacto
  • 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;
    }

    Gráfica de Seno y Coseno en C++

    Juand a través de un comentario me pidió ayuda con un programa que grafique utilizando gotoxy las gráficas de seno y coseno en c++. El programa me pareció interesante y, aunque tuve que desempolvar el Borland C++ que usaba en la prepa, lo hice… feo, pero lo hice.

    A mi parecer, para graficar por ejemplo la función seno, hacen falta 3 pasos:

    1. Hacer un ciclo de 0 a 360º (con aumentos de 5 queda muy bien) con for, algo muy normal.

    2. Calcular, obviamente, el seno de cada valor. Para esto la librería math.h nos regala la función sin(). Su uso es el obvio, pero el asunto es que todas las funciones trigonométricas que usa c++ trabajan en radianes. Es decir que primero tendremos que convertir nuestro ángulo en radianes y luego ya sacar el seno. Si la variable ‘i’ contiene el ángulo y tenemos ya definida la constante PI, la función quedaría así:
    sin(i/180*PI)

    3. Luego viene la parte más rara, convertir ese valor en un entero que pueda meter como coordenada en un gotoxy. Si tenemos una variable int y y la igualamos a nuestra función anterior podría quedar bien si multiplicamos por 10:
    int x, y; y = sin(i/180*PI)*10; gotoxy(x,y);
    Nos quedaría nuestra gráfica en una escala 1:10, pero al correr el programa veremos que hay muchos valores de seno que son 10 (por el redondeo) y por lo tanto la gráfica se ve achatada.

    Para mejorar un poco eso (de todos modos queda un poco fea) podemos usar la función ceil() incluida también en la librería math.h que nos redondea los decimales. Y esta vez multiplicamos por 20, redondeamos, dividimos entre 2 y convertimos a int. Nos vuelve a quedar escala 1:10 (¿o 10:1 …? no se) pero ya no hay tantas cantidades amontonadas en el 10 y -10.

    El programa ya listo para graficar seno está aquí abajo, obviamente para graficar coseno sólo hay que cambiar la función sin por cos, y copiar, pegar y hacer un menú no debe ser difícil.

    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #define PI 3.14159265
     
    int main()
    {
    	int x=2, y;
    	for(float i=0; i<=360; i+=5)
    	{
    		y = ceil(sin(i/180*PI)*20)/2;
    		gotoxy(x, 12-y);printf("o");
    		x++;
    	}
    	getch();
     
    	return 0;
    }

    gráfica seno

    Calcular ángulos de un triángulo en C++

    En el post anterior vimos cómo saber si un triángulo es rectángulo, acutángulo u obtusángulo en C++, y les anticipé que haría una nueva versión del mismo programa pero que nos calculara además los ángulos del triángulo.

    El programa es este.

    #include<math.h>
    #include<iostream>
    using namespace std;
     
    #define PI 3.14159265 // nuNcA cAmbieZz we!!
    int main()
    {
        float a, b, c, A, B, C;
        cout << "Introduce lado a: "; cin >> a;
        cout << "Introduce lado b: "; cin >> b;
        cout << "Introduce lado c: "; cin >> c;
        A = acos((b*b+c*c-a*a)/(2*b*c))*180/PI;
        B = acos((a*a+c*c-b*b)/(2*a*c))*180/PI;
        C = acos((a*a+b*b-c*c)/(2*a*b))*180/PI;
        if(A == 90 || B == 90 || C == 90)
            cout << "El triangulo es rectangulo. ";
        if(A < 90 && B < 90 && C < 90)
            cout << "El triangulo es acutangulo. ";
        if(A > 90 || B > 90 || C > 90)
            cout << "El triangulo es obtusangulo. ";
        cout << "\nY sus angulos son: A:" << A << " , B:" << B << " y C:" << C;
     
        cin.get();cin.get();
    }

    Para calcular los ángulos utilizamos la ley de cosenos, de hecho en el anterior también lo utilizamos pero no completamente (la ley de cosenos es una ‘ampliación’ del teorema de pitágoras). La ley de cosenos la vemos comúnmente como:
    a2 = b2 + c2 -2(b*c)*cos(A)
    Si la despejamos en cos(A), nos queda:
    cos(A) = (b2 + c2 - a2) / 2(b*c)
    Si despejamos A (o sea el ángulo), obtenemos:
    A = arccos(b2 + c2 - a2 / 2(b*c))
    Que es lo que utilizamos calcular los ángulos, lamentablemente la función que nos da C++ en su librería math.h, acos() nos devuelve el resultado en radianes. Para convertirlo a grados solo tenemos que multiplicar el resultado por 180/PI. Ahora que ya tenemos los tres ángulos de nuestro triángulo, es facilísimo saber cuando es cada tipo de triángulo.

    La función acos() está en la librería math.h y sirve para encontrar el arco coseno. En esta librería hay muchas funciones muy útiles: math.h

    Otro detalle sencillo pero que no habíamos visto es el asunto de PI. Al principio del programa nos encontramos con:
    #define PI 3.14159265
    Esto significa que estamos declarando una constante con el nombre PI y con un valor de 3.14159265. Una constante, como su nombre lo indica, nunca cambia a lo largo del programa.

    Bueno, pues fue un programa bastante entretenido, me gustó hacerlo :)

    Emanuel por medio de un comentario me pidió ayuda para hacer un programa en c++ que nos dijera si un triángulo es rectángulo, acutángulo u obtusángulo pidiendo solamente los lados. El programa me pareció interesante de hacer y pues lo hice :)

    El programa resulta bastante sencillo, pero para deducir cómo hacerlo está un poco complicado. Veamos la siguiente imágen:

    Triángulos

    El triángulo 1 es un clásico triángulo rectángulo. Si aumentáramos el lado c de 5 a 6 obviamente el ángulo aumentaría y por lo tanto sería un triángulo obtusángulo (2). Si por el contrario, disminuyéramos el lado de c 5 a 4, el ángulo disminuiría y por lo tanto sería un triángulo acutángulo (3).

    Sabiendo esto veamos cómo se comporta Pitágoras en cada caso (o sea no él, su teorema):

    Si despejamos su famoso teorema obtenemos que a2 + b2 – c2 = 0.

    Veamos como se comporta este teorema en nuestro triángulo 1:
    32 + 42 - 52 = 0
    ¡Listo!, ya sabemos que el triángulo es rectángulo, porque el teorema de Pitágoras sólo sirve para triángulos rectángulos.

    Ahora con el triángulo 2 (obtusángulo):
    32 + 42 - 62 = -11
    ¡Un número negativo! Con los triángulos obtusángulos el teorema de Pitágoras da números negativos.

    Y por último el triángulo 3 (acutángulo):
    32 + 42 - 42 = 9
    ¡Un número positivo! Con los triángulos acutángulos el teorema de Pitágoras da números positivos.

    Ahora que ya sabemos cómo identificar cada triángulo nos surge otro problema: El usuario sólo va a introducir tres lados cualquiera, ¿cómo saber cual es a, cual es b y cual es c? Pues no hay forma de saberlo, hay que hacer cada paso tres veces tomando el teorema como a2 + b2 – c2, luego a2 + c2 – b2 y al final b2 + c2 – a2.

    Ahora si, veamos el programa:

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int a, b, c, A, B, C;
        cout << "Introduce lado 1: "; cin >> a;
        cout << "Introduce lado 2: "; cin >> b;
        cout << "Introduce lado 3: "; cin >> c;
        A = (b*b+c*c-a*a);
        B = (a*a+c*c-b*b);
        C = (a*a+b*b-c*c);
        if(A == 0 || B == 0 || C == 0)
            cout << "El triangulo es rectangulo. ";
        if(A > 0 && B > 0 && C > 0)
            cout << "El triangulo es acutangulo. ";
        if(A < 0 || B < 0 || C < 0)
            cout << "El triangulo es obtusangulo. ";
     
    }

    La única parte no explicada es la de las condiciones. Si en cualquiera de los tres formas de tomar el teorema nos resulta 0 es rectángulo, por lo tanto se usa ||. Para ser acutángulo, las tres formas del teorema deben ser mayores a 0, se usa &&. Con una sola forma del teorema que resulte menor a 0 es obtusángulo, se usa ||. Para mayor información de esos operadores leer esto: Operadores lógicos es C++.

    ¿Cómo ven el programita? Está sencillo ¿no? Tal vez después haga una modificación para que además te calcule los ángulos del triángulo.

    Cómo contar el número de veces que sucede algo

    Bueno, en esta ocasión vamos a ayudarle a un comentarista de este blog con sus problemas, el me ha pedido un programa que cuente la cantidad de números primos que hay en un rango, no se ha conformado con saber si un número es primo o no o con saber cómo mostrar los números primos en un rango, así que le vamos a ayudar con la única parte de su programa que le falta: saber cómo contar el número de veces que sucede algo.

    Para esto vamos a usar una variable tipo int (entero) que va a ir aumentando una unidad cada vez que ocurra ese ‘algo’ que queremos contar. Veamos como funcionaría un contador dentro de un ciclo:

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int contador=0;
        for(int i=0; i<10; i++)
            contador++;
        cout << contador;
    }

    Obviamente esto muestra un 10 en pantalla. Porque la variable ‘contador’ aumenta una unidad cada vez que el ciclo da una vuelta.
    contador++; es lo mismo que contador = contador + 1;
    Ahora veamos como funciona si agregamos una condición:

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int contador=0;
        for(int i=0; i<10; i++)
        {
            if(i==5)
                contador++;   
        }
        cout << contador;
    }

    Esto obviamente muestra en pantalla un 1, porque solo una vez i vale 5. Ahora con una condición más complicada:

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int contador=0;
        for(int i=0; i<10; i++)
        {
            if(i%2==0)
                contador++;
        }
        cout << contador;
    }

    Con el operador % se obtiene el residuo de la división de los dos números entre los que está. Si la condición es que i/2 tenga residuo un de 0, significa que estamos dejando pasar sólo los números pares, por lo que deberá mostrarse en pantalla un 5.

    Qué fácil no?, ahora nuestro amigo ya tiene todo lo necesario para armar su programa.

    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>.

    Páginas: Anterior 1 2 3 4 5 6 7 8 9 Siguiente