C sharp - Duda - Programa que utiliza ciclo para calcular factorial

   
Vista:

Duda - Programa que utiliza ciclo para calcular factorial

Publicado por Juan Camilo jcandrade@iegabo.edu.co (1 intervención) el 04/05/2016 03:14:02
Buenas noches a todos, se me ha puesto como trabajo realizar un programa en C# que calcule el factorial de cualquier número. El código que resulté escribiendo fue este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
	int factorial, numero, valor;
	numero=Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox("Ingrese el número"));
	if(numero==0 || numero==1)
	{MessageBox.Show(" El resultado es: 1");}
	else{
		do{
			valor=numero-1;
			factorial=(numero)*(valor);
 
		}while(valor>1);
 
		MessageBox.Show("El resultado es: " + Convert.ToString(factorial));
	}
}

Lamentablemente, a la hora de digitar un número en la caja de texto de MicrosoftVisualBasic, se cierra la ventana y el programa deja de responder.
Podrían decirme si algo está mal en el código?
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda - Programa que utiliza ciclo para calcular factorial

Publicado por Thanatos (8 intervenciones) el 04/05/2016 10:11:58
El problema está dentro del bucle do - while. Cuando se introduce un número mayor que 2, los valores de las variables valor y factorial no cambian, por eso la condición valor > 1 nunca se cumple y las iteraciones continúan hasta que el programa deja de responder.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic;
 
namespace Factorial
{
    class Program
    {
        static void Main(string[] args)
        {
            byte numero;
 
            bool datoOK = Byte.TryParse(Interaction.InputBox("Ingrese el número", "Factorial"),
                                        out numero);
            if (datoOK)
            {
                ulong factorial = Calcular(numero);
                if (factorial != 0UL) // Si no se ha sobrepasado el rango máximo del tipo 'ulong'.
                {
                    MessageBox.Show(numero.ToString() + "! = " + factorial.ToString(),
                                    "Resultado",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.None);
                }
            }
            else
            {
                MessageBox.Show("Se esperaba un número entero positivo.",
                                "Error de Entrada",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }
 
        private static ulong Calcular(byte numero)
        {
            ulong factorial = 1;
 
            if (numero <= 1)
            {
                return factorial;
            }
 
            for (byte contador = 2; contador <= numero; ++contador)
            {
                try
                {
                    factorial = checked(factorial * contador);
                }
                catch (OverflowException oe)
                {
                    // El factorial ha rebasado el rango máximo del tipo 'ulong'.
                    MessageBox.Show(oe.Message,
                                    "Número Fuera de Rango",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Exclamation);
                    factorial = 0UL; // Se asigna el cero como indicador del error.
                    break;
                }
            }
            return factorial;
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar