Čau,
ve škole jsme začali s C# a jedním z úkolů je udělat formulářovou aplikaci, která obsahuje mimo další elementy výpočet faktoriálu.
Pro výpočet faktoriálu mám namodelované dvě metody:
public static int Faktorial(int n)
{
var faktorial = n;
if (n < 0)
{
return 0;
}
if (n == 0 || n == 1)
{
return 1;
}
try
{
for (var i = n - 1; i > 0; --i)
{
faktorial *= i;
}
}
catch (OverflowException)
{
throw;
}
return faktorial;
}
public static int Faktorial(int n, out string vystup)
{
var faktorial = n;
var tmpValue = n;
var tmpString = n.ToString();
vystup = "n = " + n + Environment.NewLine;
vystup += "Výpočet faktoriálu čísla " + n + ":" + Environment.NewLine;
if (n < 0)
{
vystup += "(" + n + ")! ... invalid number." + Environment.NewLine;
return 0;
}
if (n == 0 || n == 1)
{
vystup += n + "! = 1" + Environment.NewLine;
vystup += "=1" + Environment.NewLine;
return 1;
}
try
{
for (var i = n - 1; i > 0; --i)
{
faktorial *= i;
}
}
catch (OverflowException)
{
throw;
}
vystup += n + "! = " + faktorial + Environment.NewLine;
for (var i = n - 1; i > 0; i--)
{
tmpValue *= i;
tmpString += " . " + i;
vystup += tmpString + " = " + tmpValue + Environment.NewLine;
}
return faktorial;
}
První metody pouze spočítá faktoriál a vrátí ho, druhá navíc do výstupního stringu vypíše postup výpočtu faktoriálu. Jak si můřete všimnou, v části kódu, kde se faktoriál počítá, mám try catch blok, který chytá OverFlow exception a pak ji znovu hází.
Je toto způsob, jak danou výjimku dostat ven z metody, abych poté ve formulářové aplikaci mohl tuto výjimku odchytnout?
Na výpis a tak mám potom udělanou ve formulářové aplikaci tuto funkci, která se invokuje při kliknutí na tlačítko.
private void btnSpocitatFaktorial_Click(object sender, EventArgs e)
{
int cislo;
var konverzeProbehla = int.TryParse(txtBoxCislo.Text, out cislo);
if (konverzeProbehla)
{
var zobrazitPostup = chkBoxZobrazitPostup.Checked;
if (zobrazitPostup) // chci postup zobrazit
{
var postup = "";
try
{
lblVysledek.Text = Matematika.Faktorial(cislo, out postup).ToString();
}
catch (OverflowException)
{
MessageBox.Show(Resources.neplatnyVstupText, Resources.neplatnyVstupTitulek,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
richTxtBoxPostup.Text = postup;
}
else
{
try
{
lblVysledek.Text = Matematika.Faktorial(cislo).ToString();
}
catch (OverflowException)
{
MessageBox.Show(Resources.neplatnyVstupText, Resources.neplatnyVstupTitulek,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show(Resources.neplatnyVstupText, Resources.neplatnyVstupTitulek, MessageBoxButtons.OK,
MessageBoxIcon.Error);
txtBoxCislo.Focus();
txtBoxCislo.SelectAll();
}
}
Problém je ten, že se mi ta výjimka prostě neháže. Když zadám na vstupu například číslo 2 000 000 000, kterí se sice do integeru pro konverzi vleze, ale faktoriál ze dvou miliard už fakt ne, tak se mi do výsledku hodí nula, výjimka nikde nevyskočí.
Můžete mi poradit, co mám zle? Díky.