Hola estoy haciendo un ejercicio y cuando lo ejecuto .Me sale que el calculo que he realizado esta fuera del array por eso necesito vuestra ayuda .Gracias
La aplicación permitirá recoger datos de una cuenta bancaria. Deberás crear los siguientes métodos y comprobar que funcionan correctamente. Prueba la aplicación con más de un número de cuenta y captura las posibles excepciones en el programa principal.
El constructor NumeroCuenta recibirá un string con el número de cuenta completo y si este no se corresponde con un número de cuenta correcto se lanzara una excepción NumeroCuentaIncorrectoException. Esta excepción se puede lanzar por dos motivos:
Porque no cumple el patrón de un número de cuenta (para ello llamará al método formatoCorrecto)
Porque la cuenta no se corresponde con los dígitos de control (en este caso usara dcCorrecto).
El método privado de NumeroDeCuenta, formatoCorrecto. Comprobará el formato del número de cuenta con expresiones regulares y si el formato es correcto rellenará los campos del objeto. En caso contrario lanzará una excepción NumeroCuentaIncorrectoException, indicando que el formato de la cuenta no cumple las condiciones necesarias.
El método privado dcCorrecto, comprobará si el dígito de control corresponde a la cuenta, devolviendo false en caso contrario. Para ver como se hace esto, consulta la Nota y la Pista posterior.
El método Reintegro, lanzará una exception SaldoInsuficienteException, cuando se intente retirar una cantidad y no haya suficiente saldo.
El código cuenta corriente es un número de 20 cifras. Las 4 primeras de la izquierda identifican a la Entidad, las 4 siguientes, la Sucursal, luego vienen 2 dígitos de control y las 10 últimas corresponden al número de la cuenta corriente.
El primero es el dígito de control de Entidad/Sucursal.
El segundo es el dígito de control del número de la cuenta corriente.
El siguiente ejemplo nos enseñará a calcularlos…
Supongamos ahora 2085 el código de una hipotética entidad y 0103 el código de una de sus sucursales.
Para calcular el dígito de control de Entidad/Sucursal:
Realizaremos la operación:
2*4 + 0*8 + 8*5 + 5*10 + 0*9 + 1*7 + 0*3 + 3*6 = 123
Es decir, cada una de las cifras de la entidad, seguidas de la sucursal, se han ido multiplicando por los números del array de ponderaciones 4, 8, 5, 10, 9, 7, 3, 6 y luego se han sumado estos resultados.
Ahora realizaremos la operación 11 – (resultado % 11)
El resultado será un número entre 1 y 11. Si el número es menor que 10 será ya el valor del DC. Pero si es 10 el DC será 1 y si es 11 será 0. En este caso 11 – (123 % 11) = 9 que será el DC de Entidad/sucursal.
Para calcular el dígito de control de número de cuenta corriente:
Si este es, por ejemplo, el 0300731702, para calcular su dígito de control se realiza la operación:
0*1 + 3*2 + 0*4 + 0*8 + 7*5 + 3*10 + 1*9 + 7*7 + 0*3 + 2*6 = 141
Es decir, cada una de las cifras del número de la cuenta, leídas de izquierda a derecha, se han ido multiplicando por 1, 2, 4, 8, 5, 10, 9, 7, 3, 6 y luego se han sumado estos resultados.
Realizaremos la misma operación que antes 11 – (121 % 11) = 2 que será el DC de número de cuenta.
Mi codigo
using System.Text.RegularExpressions;
namespace ejercicio4;
class NumeroCuenta
{
class NumeroCuentaIncorrectoException : Exception
{
public NumeroCuentaIncorrectoException(string message) : base("tu poblema es " + message)
{
}
}
private string entidad;
private string sucursal;
private string dcEntSuc;
private string dcNumero;
private string cuenta;
public NumeroCuenta(string numero)
{
dcCorrecto(dcEntSuc, entidad + sucursal, new int[] { 4, 8, 5, 10, 9, 7, 3, 6 });
dcCorrecto(dcNumero, cuenta, new int[] { 1, 2, 4, 8, 5, 10, 9, 7, 3, 6 });
}
private bool dcCorrecto(string dc, string digitos, int[] ponderaciones)
{
int sumaPonderacion = 0;
int sumaTotal = 0;
int operacion = 0;
for (int i = 0; i < ponderaciones.Length; i++)
{
sumaPonderacion += (digitos[i] - 48) * ponderaciones[i];
}
sumaTotal += sumaPonderacion;
operacion = 11 - (sumaTotal % 11);
int dcCalculado;
if (operacion < 10)
{
dcCalculado = operacion;
}
else if (operacion == 10)
{
dcCalculado = 1;
}
else dcCalculado = 0;
if (dcCalculado.ToString() == dc)
{
return true;
}
return false;
}
public bool FormatoCorrecto(string numero)
{
string patron = @"^((?<entidad>\d{4) ?(?<sucursal>\d{4}) ?(?<dcEntSuc>\d)(?<dcNumero>\d) ?(?<dcNumero>\d{10})$";
bool isMatch = Regex.IsMatch(numero, patron);
Regex r = new Regex(patron);
Match match = r.Match(numero);
if (isMatch == false) //Si es falso
{
throw new NumeroCuentaIncorrectoException("Mensaje");
}
else
{
int[] ponderacion = new int[8] { 4, 8, 5, 10, 9, 7, 3, 6 };
}
if(match.Success)
{
entidad = match.Groups["entidad"].Value;
sucursal = match.Groups["sucursal"].Value;
dcEntSuc = match.Groups["dcEntSuc"].Value;
dcNumero = match.Groups["dcNumero"].Value;
dcNumero = match.Groups["dcNumero"].Value;
}
return match.Success;
}
public override string ToString()
{
return $"{entidad}-{sucursal}-{dcEntSuc}{dcNumero}-{cuenta}";
}
}
Muchas gracias por intentar ayudarme