Monthly Archives: October 2010

Cómo pasar una matriz o arreglo como parámetro a una función

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
using namespace std;

void pedir(int matriz[3], int len)
{
    for(int i=0; i<=len; i++)
    {
        cout << "Numero " << i+1 <> 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;
}
Advertisements

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
#include
#include
#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
#include
using namespace std;

#define PI 3.14159265 // nuNcA cAmbieZz we!!
int main()
{
    float a, b, c, A, B, C;
    cout <> a;
    cout <> b;
    cout <> 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 < 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 🙂

Saber si un triángulo es rectángulo, acutángulo u obtusángulo en C++

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
using namespace std;

int main()
{
    int a, b, c, A, B, C;
    cout <> a;
    cout <> b;
    cout <> 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 < 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.