Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   [C#] Algunas preguntas sobre el lenguaje (http://www.forosdelweb.com/f29/c-algunas-preguntas-sobre-lenguaje-385977/)

CID@Devs 16/04/2006 02:15

[C#] Algunas preguntas sobre el lenguaje
 
Tomando en cuenta éste ejemplo:

Código:

void Button1Click(object sender, System.EventArgs e)
{
        double a, b, c, x1, x2;
        a = Convert.ToDouble(textBox1.Text);
        b = Convert.ToDouble(textBox2.Text);
        c = Convert.ToDouble(textBox3.Text);
        x1 = (-b + Math.Sqrt(Math.Pow(b,2)-4*a*c))/(2*a);
        x2 = (-b - Math.Sqrt(Math.Pow(b,2)-4*a*c))/(2*a);
        MessageBox.Show("x1 = " + x1.ToString() + "\nx2 = " + x2.ToString(), "Resultados");
}

1) No existe el namespace System.Math? Tengo que usar Math.Sqrt(...), de que manera puedo escribir solo Sqrt(...) ??

2) Si se intenta convertir a = Convert.ToDouble(textBox1.Text); pero textBox1.Text contiene un caracter no numerico, no se dispara una excepcion, simplemente se cierra el programa. Como se suele actuar en tal caso?

3) Además cuando se divide sobre cero, o se calcula la raiz cuadrada de un numero negativo (por poner unos casos), y el resultado de tal expresion se almacena en una variable que posteriormente imprimo en pantalla, se almacena el error en la variable, en lugar de disparar una excepcion. Como se captura la excepción (try la captura?)?

metalkr 16/04/2006 08:59

1.- System.Math no es un cualificador de espacio de nombre, Math es una clase con métodos estatáticos contenida en el espacio de nombre System.
Sólo la puedes utilizar usando toda la ruta(System.Math.Sqrt...) o importando (using System;...Math.Sqrt)

2.- Pues en este caso, no es necesario crear un bloque try-catch, ya que puedo validar en el textbox mediante su evento keypress, que se introduzcan sólo números, incluso números decimales.

3.- a la hora de la operación, encierrala en un bloque try cath y maneja el error: alguna manera de indicar que la operación no puede realizarse.

CID@Devs 16/04/2006 10:09

1) Entendido.
2) Y si fuera en consola?
3) Entonces try la captura. Preguntaba porque no se detenia la ejecución, simplemente se asignaba a la variable el valor NaN o Infinito.

metalkr 17/04/2006 09:12

2.- Se me ocurre dos formas
* Encerrar el cast en un bloque try catch, en caso de error, mandar que no es un numero lo que se introdujo
* Examinar con el método de la clase Char, IsNUmber(), cada uno de las posiciones de lo introducido.
3.-. Ese cierto!!! Te recomiendo validar tu resultado antes de realizar la operacion.Aunque me parecio ver alguna vez que se lanzaba una exepcion de ese tipo

CID@Devs 17/04/2006 15:25

Toda la vida validé con las excepciones (no la validacion de rangos de datos claro), si se producia alguna excepcion se le informaba al usuario el error.
Tu forma es la "purista" (no me lo tomes a mal, por las dudas). Cuando tengo que programar rapido uso el bloque try, asi que la pregunta cambia ahora...
Según tu punto de vista, porque preferis el "metodo purista" (caracter a caracter) al de validar por error?

PD: Voy a probar si puedo capturar la exepcion del NaN y del Infinito.

metalkr 18/04/2006 22:05

La 2da forma no es la más óptima para el performance del programa, pero a veces tienes que decidir si kieres mas performance o mayor precision (refiriendose a lo "purista"). OK. Busca en system.math

Nivel7 26/04/2006 14:22

en el caso de convercion prueba con Double.Parse(textBox1.Text);
en el caso de asignacion de null, puedes usar variables nullables si es que usas, C# 2.0.

double? x1, x2;
o
Nullable<double> x1, x2;

prueba checked() y uncheked(), uno de ellos activa una escepcion encaso de divicion por 0 y desbordamineto.


La zona horaria es GMT -6. Ahora son las 08:42.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.