none
C# Form - Una palabra mayúscula otra minúscula RRS feed

  • Pregunta

  • Buenos días, tengo un pequeño problema...haber si alguien me puede echar una mano.

    Tengo un ejercicio de c# FORM en el que tengo que entrar una frase y cuando doy al botón me tiene que devolver la misma frase pero con una palabra en mayúscula y otra en minúscula hasta acabar la frase. Por ejemplo;

    hola que tal como estas

    HOLA que TAL como ESTAS

    Un dato importante es que se tiene que hacer sin arrays y con bucle for con substrings. Debo conseguirlo de la forma más sencilla posible. Sé que se tiene que recorrer la frase y separarla por espacios, pero a partir de aquí no se como conseguir lo que hay detrás de este.                                              

    Muchísimas gracias de antemano. 

    domingo, 1 de diciembre de 2019 14:20

Respuestas

  • Una solución en dos líneas:

    string s = "Hola, ¿qué tal? ¿Cómo estás?";
    int num = 0;
    string resultado = string.Join(" ", s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => num++ % 2 == 0 ? x.ToUpper() : x.ToLower()));

    resultado = "HOLA, ¿qué TAL? ¿cómo ESTÁS?"

    Requiere "using System.Linq;".

    Ojo, tiene trampa: en realidad por dentro utiliza temporalmente un array, aunque aparentemente el array no se vea por ningún sitio porque se construye y destruye dentro de la misma línea.



    domingo, 1 de diciembre de 2019 18:01
    Moderador
  • ¡¡Perfecto!!

    Muchísimas gracias!!

    Una consulta: ¿Se podria hacer solo con bucles fors? Nada de Split ni Joins. Solo es curiosidad, tu respuesta me ha servido de mucho.

    lunes, 2 de diciembre de 2019 17:35
  • Sí, con un poco de habilidad puedes construir bucles que hagan internamente lo mismo que el Split y el Join. Al fin y al cabo, estos métodos utilizan bucles internamente.

    Pero ambos operan sobre arrays: el Split devuelve un array a partir del string, y el Join vuelve a construir un string a partir del array. Así que si lo escribes con bucles, el array no queda oculto, sino que hay que declararlo expresamente.

    Si lo quieres hacer sin arrays, construye únicamente el bucle que genera palabras a partir del string (equivalente al Split), y según vaya produciendo palabras, las pasas alternativamente a mayúsculas o minúsculas y las vas concatenando en el resultado.

    Y no, no te pongo el código que hace eso. Se ve que es un ejercicio académico, y en el foro no tenemos permitido escribir la solución de los ejercicios académicos, únicamente dar pequeñas explicaciones que sirvan como pistas o ayudas, o resolver dudas concretas tales como por ejemplo por qué ocurre un error determinado en tu código, una vez que muestras el código que has escrito. Pero no te podemos dar el código final ya listo para que solamente lo copies y ya resuelva tu tarea.

    lunes, 2 de diciembre de 2019 18:58
    Moderador
  • Hola sapuba007

    Podes usar Substring() y IndexOf() ?

            private string OneUpperOneLower(string input)
            {
                string result = "";
                string word;
                bool upper = true;
                int index = 0, length;
                while ((length = input.IndexOf(' ', index)) != -1)
                {
                    word = input.Substring(index, length - index);
                    if (upper == true)
                        word = word.ToUpper();
                    else
                        word = word.ToLower();
                    result += word + " ";
                    index = length + 1;
                    upper = !upper;
                }
                word = input.Substring(index);
                if (upper == true)
                    word = word.ToUpper();
                else
                    word = word.ToLower();
                result += word;
                return result;
            }
    

    Saludos

    Pablo


    miércoles, 4 de diciembre de 2019 1:51

Todas las respuestas

  • Una solución en dos líneas:

    string s = "Hola, ¿qué tal? ¿Cómo estás?";
    int num = 0;
    string resultado = string.Join(" ", s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => num++ % 2 == 0 ? x.ToUpper() : x.ToLower()));

    resultado = "HOLA, ¿qué TAL? ¿cómo ESTÁS?"

    Requiere "using System.Linq;".

    Ojo, tiene trampa: en realidad por dentro utiliza temporalmente un array, aunque aparentemente el array no se vea por ningún sitio porque se construye y destruye dentro de la misma línea.



    domingo, 1 de diciembre de 2019 18:01
    Moderador
  • ¡¡Perfecto!!

    Muchísimas gracias!!

    Una consulta: ¿Se podria hacer solo con bucles fors? Nada de Split ni Joins. Solo es curiosidad, tu respuesta me ha servido de mucho.

    lunes, 2 de diciembre de 2019 17:35
  • Sí, con un poco de habilidad puedes construir bucles que hagan internamente lo mismo que el Split y el Join. Al fin y al cabo, estos métodos utilizan bucles internamente.

    Pero ambos operan sobre arrays: el Split devuelve un array a partir del string, y el Join vuelve a construir un string a partir del array. Así que si lo escribes con bucles, el array no queda oculto, sino que hay que declararlo expresamente.

    Si lo quieres hacer sin arrays, construye únicamente el bucle que genera palabras a partir del string (equivalente al Split), y según vaya produciendo palabras, las pasas alternativamente a mayúsculas o minúsculas y las vas concatenando en el resultado.

    Y no, no te pongo el código que hace eso. Se ve que es un ejercicio académico, y en el foro no tenemos permitido escribir la solución de los ejercicios académicos, únicamente dar pequeñas explicaciones que sirvan como pistas o ayudas, o resolver dudas concretas tales como por ejemplo por qué ocurre un error determinado en tu código, una vez que muestras el código que has escrito. Pero no te podemos dar el código final ya listo para que solamente lo copies y ya resuelva tu tarea.

    lunes, 2 de diciembre de 2019 18:58
    Moderador
  • Hola sapuba007

    Podes usar Substring() y IndexOf() ?

            private string OneUpperOneLower(string input)
            {
                string result = "";
                string word;
                bool upper = true;
                int index = 0, length;
                while ((length = input.IndexOf(' ', index)) != -1)
                {
                    word = input.Substring(index, length - index);
                    if (upper == true)
                        word = word.ToUpper();
                    else
                        word = word.ToLower();
                    result += word + " ";
                    index = length + 1;
                    upper = !upper;
                }
                word = input.Substring(index);
                if (upper == true)
                    word = word.ToUpper();
                else
                    word = word.ToLower();
                result += word;
                return result;
            }
    

    Saludos

    Pablo


    miércoles, 4 de diciembre de 2019 1:51