domingo, 6 de octubre de 2013

Respuesta al reto 3

Reto 3.

Ya me pique, pero me han salido en el trabajo dia a dia estas situaciones que sirven para probar mi ingenio al resolverlos. Espero que a ustedes tambien los motive, sobre todo a los nuevos programadores. Hacer una funcion que dado el numero de columna de una matriz, me regrese el nombre de la columna en Excel. Usar una funcion que se llame ASC que recibe como parametro un numero y regresa una cadena con el caracter del codigo ascii. Esto es para que al llamar a ASC(65) me regrese la letra A como cadena. Como ustedes saben las columnas en excel se referencian con letras, comenzando con la letra A, hasta la Z y de alli sigue la combinacion AA. Yo se que pueden usar funciones o codigos de internet, pero traten de resolverlo solo con el manejo de cadenas, usando la funcion basica ASC. Eso lo hara mas divertido. Aqui esta mi propuesta al reto 3. Esta en C#:

private string RegresaColumna(int Columna)
{
    Stack<string> Pila1 = new Stack<string>();
    string Regresa = "";
    int Residuo;
    int Resultado;
    Resultado = Columna;
    do
    {
        Residuo = Resultado % 26;
        if (Residuo == 0)
            Residuo = 26;
        Resultado = Resultado / 26;
        Pila1.Push(Char.ConvertFromUtf32(Residuo + 64));
    } while (Resultado > 26);
    if (Resultado > 0)
        Pila1.Push(Char.ConvertFromUtf32(Resultado + 64));
    foreach (string cad in Pila1)
    {
        Regresa += cad;
    }
    return Regresa;
}
Como lo menciona el Master Ariel Lopez, la idea es utilizar el operador % (módulo) para obtener el residuo de la división. El ciclo comienza a dividir entre 26 (que es el total de letras a generar) hasta que el resultado sea menor a 26. El problema es que el primer residuo que me regresa es la letra mas significativa (la que debe estar mas a la izquierda), es por ello que utilizo una pila para ir almacenandola, para despues sacarlas e irlas agregando a la cadena resultante. La función Char.ConvertFromUtf32 me sirve para convertir el valor numerico ASCII a una cadena. Al residuo le sumo 64, para que me de la letra deseada (el valor Ascii de A es 65). Finalmente lo que atinadamente comento en su solucion Ariel, si el residuo me da cero, tengo que ponerle el maximo valor, si no, no sale la letra Z. Esto solo se da en la ultima letra. Comenten y si encuentran algun error mejor.

No hay comentarios.:

Publicar un comentario