• Publicidad

Diario de aprendizaje de un perlero desde cero

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Notapor explorer » 2007-07-26 19:55 @871

La superficie de cualquier triángulo es base*altura/2.

NO es exclusiva de los triángulos rectángulos.

Otra cosa es que el problema plantee la resolución del área a partir de las longitudes de los lados.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor Zeokat » 2007-07-27 06:17 @303

Eso mismo decía yo, explorer, un triángulo es un triángulo mire como se mire.

Lo que pasa es que como se puede tomar como base cualquiera de sus lados, tendrá tres alturas diferentes en función del lado que se tome como base.

Y aclarar que TODOS los triángulos tienen altura y en concreto todos tres alturas. ;)

Ahora, en cuanto al ejercicio planteado, voy a suponer que las variables con las que hay que trabajar son los lados y como bien decía se pueden dar muchos casos, pero para el ejercicio voy centrarme en dos posibilidades:

-que sea un triangulo rectángulo entonces pedirá al usuario el valor de los catetos (el área saldrá directamente con la fórmula base*altura/2).

-que sea cualquier otro triangulo, entonces pedirá el valor de sus tres lados (***con la formula de heron calculamos la superficie).

Me pongo al lío. ;)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-07-27 10:50 @493

Aqui traigo la solución al problemilla de los triangulos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
!/usr/bin/perl -w

use strict;
use Term::InKey;

print "Para calcular el area de un triangulo rectangulo pulsar 1\n";
print "Para calcular el area de un triangulo a partir de sus tres lados pulsar 2\n";

my $eleccion = &ReadKey;

if ($eleccion == 1) {

    #Cálculo del area de triangulo rectangulo.
    print "Introduce el valor del primer cateto: ";

    my $cateto_a = <STDIN>;
    chomp($cateto_a);

    print "Introduce el valor del segundo cateto: ";

    my $cateto_b = <STDIN>;
    chomp($cateto_b);

    my $superficie_triangulo_rectangulo = ($cateto_a * $cateto_b) / 2;

    my $hipotenusa = (($cateto_a ** 2) + ($cateto_b ** 2)) ** (1/2);

    print "La superficie del triangulo es: " , $superficie_triangulo_rectangulo , "\n";

    print "Pitagoras dice que la hipotenusa de tu triangulo es: " , $hipotenusa;

}
elsif ($eleccion == 2) {
   
    #Cálculo del area de triangulo a partir de sus lados.Formula de Heron.
    print "Introduce el valor del lado a: ";
    my $lado_a = <STDIN>;
    chomp($lado_a);
   
    print "Introduce el valor del lado b: ";
    my $lado_b = <STDIN>;
    chomp($lado_b);
   
    print "Introduce el valor del lado c: ";
    my $lado_c = <STDIN>;
    chomp($lado_c);
   
    my $semiperimetro = ($lado_a + $lado_b + $lado_c) / 2;
   
    my $superficie = (($semiperimetro) * ($semiperimetro - $lado_a) * ($semiperimetro - $lado_b) * ($semiperimetro - $lado_c)) ** (1/2);
    print "La superficie del triangulo es: ", $superficie;
}
else {
   
    print "Has introducido un valor no valido";
   
}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4



La he probado y parece todo correcto.

Voy con el siguiente ejercicio.

6) Encontrar la distancia entre coordenadas.

Jejeje este ejercicio ya me da un poco de miedo. Estamo hablando de coordenadas en dos dimensiones supongo (x,y) y supongo que habra que pedir al usuario que introduzca la coordenadas de dos puntos para que el programa calcule su distancia.

Bueno a ver como planteo esto :roll: , voy a empezar por echar un ojo a los apuntes de algebra para ver como calculaba distancias.

Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-07-27 15:46 @698

Aquí traigo el código que calcula distancias entre coordenadas en el espacio bidimensional, espero que esté bien.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;

print "Introduce la coordenada x del punto A: ";

my $x1 = <STDIN>;
chomp($x1);

print "Introduce la coordenada y del punto A: ";

my $y1 = <STDIN>;
chomp($y1);

print "Introduce la coordenada x del punto B: ";

my $x2 = <STDIN>;
chomp($x2);

print "Introduce la coordenada y del punto B: ";

my $y2 = <STDIN>;
chomp($y2);

#Calculo de las distancias.

my $distancia_AB = ((($x2 - $x1) ** 2) + (($y2 - $y1) ** 2)) ** (1/2);


print "La distancia del punto A al punto B es: ", $distancia_AB;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Bueno, y con ello me pongo al siguiente ejercicio.

7) Calcular volúmenes (cónicas, cubos et cetera).

Saludos. :wink:
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor creating021 » 2007-07-27 15:57 @706

explorer escribiste:La superficie de cualquier triángulo es base*altura/2.

NO es exclusiva de los triángulos rectángulos.

Otra cosa es que el problema plantee la resolución del área a partir de las longitudes de los lados.

Cuando usas esa fórmula estás encontrando el área de un cuadrilátero regular y dividiéndolo por dos... si el triángulo no es de 90º no puedes usar la fórmula (sin partir el triángulo)... es más ni siquiera la fórmula de Herón es válida para todos los triángulos (ver geometría hiperbólica y curvatura del espacio-tiempo) aunque con ingenio y mucho tiempo de trabajo se puede lograr.

Es más sutil usar la fórmula de Herón para no tener que pedir la altura o evitar el teorema de pitágoras... creo yo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $area = sqrt(($a+$b+$c)*($a+$b-$c)*($b+$c-$a)($c+$a-$b))/4;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor Zeokat » 2007-07-27 19:21 @848

Problema... ¿cómo puedo poner el número "PI" en Perl? ¿o debo poner 3,1416?

Traté de poner:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $v_esfera = (4/3) * pi * ($radio_esfera ** 3);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero parece que no se llama pi el número, ¿hay algún carácter especial para hacer referencia al número pi?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-07-27 20:40 @903

creating021 escribiste:Cuando usas esa formula estás encontrando el área de un cuadrilátero regular y dividiéndolo por dos... si el triángulo no es de 90º no puedes usar la fórmula (sin partir el triángulo)... es más, ni siquiera la fórmula de Herón es válida para todos los triángulos (ver geometría hiperbólica y curvatura del espacio-tiempo) aunque con ingenio y mucho tiempo de trabajo se puede lograr.
Por favor, creating021, entra en el enlace que he puesto a la página de Wikipedia. Y presta especial atención al gráfico animado de la derecha.

He revisado media docena de páginas más, de matemáticas, y todas ponen lo mismo. Se puede aplicar la formula independientemente de si es o no un triángulo rectángulo. Nada de partir el triángulo. Si se dispone de una base y de una altura, es fácil calcular su área.

¿Tienes un contraejemplo?

http://descartes.cnice.mecd.es/3_eso/Fi ... ugeo_2.htm
http://www.dmae.upct.es/~pepemar/triangulo/area.htm (el primer applet es particularmente divertido)
http://mimosa.cnice.mecd.es/clobo/geoweb/area5.htm (último applet, todas las combinaciones de base y altura)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-07-27 20:52 @911

Zeokat escribiste:Problema... ¿cómo puedo poner el número "PI" en Perl?
Perl no dispone de esa constante. Más bien, no tiene ninguna constante (que recuerde ahora).

Si quieres usar pi, tienes el módulo Math::Trig. En Math::NumberCruncher también lo tienes, hasta 2000 decimales :D
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2007-07-28 05:45 @281

Jejeje, ¡¡¡2000 decimales!!!, tampoco tanto jejeje

Ahí va el código para calcular algunos volúmenes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;

print "Las figuras disponibles para calcular su volumen son: \n";
print "-Esfera \n";
print "-Cubo \n";
print "-Cilindro \n";
print "-Cono \n";
print "-Piramide \n";

print "Introduce el nombr

e de la figura de la que quieres calcular su volumen: "
;

my $pi = 3.141592654;
my $eleccion = <STDIN>;
chomp($eleccion);


if ($eleccion =~ /^Esfera/i)  {
    #Volumen de la esfera.

    print "Introduce el radio de la esfera: ";

    my $radio_esfera = <STDIN>;
    chomp($radio_esfera);

    my $v_esfera = (4/3) * $pi * ($radio_esfera ** 3);

    print "El volumen de la esfera es: " ,$v_esfera;
}

elsif ($eleccion =~ /^Cubo/i)  {
    #Volumen cubo.

    print "Introduce el lado del cubo: ";

    my $lado_cubo = <STDIN>;
    chomp($lado_cubo);

    my $v_cubo = $lado_cubo ** 3;

    print "El volumen del cubo es: " ,$v_cubo;
   
}

elsif ($eleccion =~ /^Cilindro/i)  {
    #Volumen Cilindro.

    print "Introduce el radio del cilindro: ";

    my $radio_cilindro = <STDIN>;
    chomp($radio_cilindro);
   
    print "Introduce la altura del cilindro: ";

    my $altura_cilindro = <STDIN>;
    chomp($altura_cilindro);

    my $v_cilindro = $pi * ($radio_cilindro ** 2) * $altura_cilindro;

    print "El volumen del cilindro es: ", $v_cilindro;
}

elsif ($eleccion =~ /^Cono/i)  {
    #Volumen del cono.

    print "Introduce el radio del cono: ";

    my $radio_cono = <STDIN>;
    chomp($radio_cono);

    print "Introduce la altura del cono: ";

    my $altura_cono = <STDIN>;
    chomp($altura_cono);

    my $v_cono = ($pi * ($radio_cono ** 2) * $altura_cono) * (1/3);

    print "El volumen del cono es :" ,  $v_cono;
}

elsif ($eleccion =~ /^Cono/i)  {
   
    #Volumen de la piramide.

    print "Introduce el area de la base de la piramide: ";

    my $area_base_piramide = <STDIN>;
    chomp($area_base_piramide);

    print "Introduce la altura de la piramide: ";

    my $altura_piamide = <STDIN>;
    chomp($altura_piamide);

    my $v_piramide = 1/3 * $area_base_piramide * $altura_piamide;

    print "El volumen de la piramide es: " , $v_piramide;

}

else  {
   
    print $eleccion , " no es una figura valida";
   
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Aclararé que en los if y en los elsif uso una expresión regular, en concreto "=~ /^Esfera/i" porque si usaba "eq Esfera" pues tiene que ser esfera con mayúscula y con la expresión regular sirve tanto "esfera" como "Esfera" a la hora de introducir el nombre, y así en las demás figuras.

Explico un poco que hace esa expresión regular =~ /^Esfera/i

=~ eso se pone para que la cadena de texto contenga lo que queremos buscar (en este caso es Esfera). Le pongo el modificador ^ para que busque "SÓLO" al principio de la cadena y le añado el "i" al final para que encuentre tanto "Esfera" como "esfera" (otros valores como "EsFeRa" también servirían) , es decir para que no haga distinción entre mayúsculas y minúsculas.

El siguiente ejercicio es:

8) Buscar ángulos con ley de seno/coseno ( con radianes y grados )

Bueno.... que ángulos buscar....mmm... supongo que te referirás a buscar ángulos por ejemplo en un triángulo y dar sus valores tanto en grados como en radianes.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-07-28 08:28 @394

Pienso que logré resolver el ejercicio.

Para hacerlo usé un módulo puesto que Perl parece que no deja hacer arcocoseno directamente, el módulo en cuestión es Math::Trig::Units.

El propio módulo deja pasar de grados a radianes y viceversa, pero en el código lo hice de forma manual sabiendo que 360º son 2pi radianes.

Aclarar también, que los triángulos se designan por lo general:
-Lados con letras minúsculas.
-Vértices con letras minúsculas y de nombre el mismo que su lado opuesto.
-Ángulos con letras griegas.

Como no sabía como poner letras griegas para designar los ángulos, yo les llamé a los ángulos igual que a los vértices donde están situados estos ángulos. Se ve mejor en el dibujo:

Imagen

Tuve que echar mano de los siguientes links:

http://es.wikipedia.org/wiki/Teorema_del_coseno
http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80
http://es.wikipedia.org/wiki/Radi%C3%A1n

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use Math::Trig::Units qw(acos);

my $pi = 3.1415926535897932;

print "Introduce el valor del lado a del triangulo: ";
my $lado_a = <STDIN>;
chomp($lado_a);

print "Introduce el valor del lado b del triangulo: ";
my $lado_b = <STDIN>;
chomp($lado_b);

print "Introduce el valor del lado c del triangulo: ";
my $lado_c = <STDIN>;
chomp($lado_c);


my $angulo_A_radianes = acos((($lado_b ** 2) + ($lado_c ** 2) - ($lado_a ** 2) ) * ( 1/(2 * $lado_b * $lado_c) ));

my $angulo_A_grados = (360 * $angulo_A_radianes) / (2 * $pi);

print "Valor del angulo A en radianes: " , $angulo_A_radianes , "\n";

print "Valor del angulo A en grados: " , $angulo_A_grados , "\n";



my $angulo_B_radianes = acos((($lado_c ** 2) + ($lado_a ** 2) - ($lado_b ** 2) ) * ( 1/(2 * $lado_c * $lado_a) ));

my $angulo_B_grados = (360 * $angulo_B_radianes) / (2 * $pi);

print "Valor del angulo B en radianes: " , $angulo_B_radianes , "\n";

print "Valor del angulo B en grados: " , $angulo_B_grados , "\n";



my $angulo_C_radianes = acos((($lado_a ** 2) + ($lado_b ** 2) - ($lado_c ** 2) ) * ( 1/(2 * $lado_a * $lado_b) ));

my $angulo_C_grados = (360 * $angulo_C_radianes) / (2 * $pi);

print "Valor del angulo C en radianes: " , $angulo_C_radianes , "\n";

print "Valor del angulo C en grados: " , $angulo_C_grados , "\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados

cron