none
Programa que pida al usuario 5 numeros enteros y los devuelva inversos con una pila RRS feed

  • Pregunta

  • Buenos dias tengo este ejemplo de programa y me gustaria saber si lo puedo adaptar a lo que pide el titulo 

    este es, ya lo estaba tratando de adaptar pero no me sale bien: 

    tengo otro ejercicio mas parecido ( Crea un programa que pida al usuario el nombre de un fichero de texto y muestre en orden inverso las líneas que lo forman, empleando una pila.)

    Pero estoy seguro que si se puede resolver este, puedo hacer el segundo.

    public class Ejemplo_11_02a
    {
        public static void Main()
        {
            string palabra;
    
            Stack miPila = new Stack();
            Console.WriteLine("Ingrese una palabra");
            Console.ReadLine(); miPila.Push("Hola,");
    
            //miPila.Push("soy");
            //miPila.Push("yo");
    
          for (byte i = 0; i < 3; i++)
            {
                palabra = (string)miPila.Pop();
                Console.WriteLine(palabra);
            }
         while
            {
                Stack miPila = new Stack();
                Console.WriteLine("Ingrese una palabra");
                Console.ReadLine(); miPila.Push("Hola,");
            }
        }
    }


    Josmer Suero


    martes, 28 de julio de 2020 14:21

Todas las respuestas

  • Los dos problemas son muy parecidos, y ambos se pueden resolver usando los principios del código que has puesto pero haciéndolo bien.

    En la parte que pide los datos, tendrás que poner un bucle para que pida tantos datos como necesitas. Dentro del bucle hacer un ReadLine y el resultado lo metes en la pila. Fíjate que ahora mismo el resultado del ReadLine no lo estás guardando, sino que en la pila metes siempre "Hola".

    Y en la parte donde presentas los datos, puedes usar el for o el while pero no ambas cosas. Si usas el for, mete tantas repeticiones como datos hayas pedido en la primera parte, y en cada repetición haces un pop de la pila y el resultado lo escribes en consola. Si usas un While, el contenido interno es el mismo pero en la condición de terminación del while tienes que comprobar si la pila ha quedado vacía. Recuerda, una cosa o la otra, pero no ambas.

    Perdona que te lo ponga así, en letras, y no te escriba el código, pero se ve que se trata de un ejercicio académico y para los ejercicios no podemos darte la solución terminada ya lista para copiarla, solo pueden ser pistas o indicaciones genérica.

    martes, 28 de julio de 2020 14:51
    Moderador
  • Hola Josmer Suero, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Aqui te dejo un enlace con un ejemplo de como hacer un programa que de los numeros a la inversa 

     Andres Aguilar

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    martes, 28 de julio de 2020 16:40
    Moderador
  • Hola Alberto, he tratado de seguir tu consejo pero ahora solo tiene un solo error (CS0029, no se puede convertir implicitamente el tipo int en int[], que puedo hacer?

    using System;
    using System.Collections;
    
    public class Ejemplo_11_02a
    {
        public static void Main()
        {
            int[] numero = new int [5];
    
            Stack miPila = new Stack();
            for (int i = 0; i < miPila.Count; i++)
            {
                Console.WriteLine("Ingrese un numero", i+1);
                numero[i] = int.Parse(Console.ReadLine());
    
            }
    
            for (int i = 0; i < miPila.Count; i++)
            {
                numero = (int)miPila.Pop();
                 Console.WriteLine(numero);
            }
    
        }
    
    }
    
           



    Josmer Suero

    martes, 28 de julio de 2020 18:02
  • public class Ejemplo_11_02a
    {
        public static void Main()
        {
            int[] numero = new int [5];
    
            //Stack miPila = new Stack();
            for (int i = 0; i < numero.Length; i++)
            {
                Console.WriteLine("Ingrese un numero{0}:", i+1);
                numero[i] = int.Parse(Console.ReadLine());
    
            }
    
            Console.WriteLine();
            Array.Reverse(numero);
            Console.WriteLine("Estos son tus numeros:\n");
            for (int i = 0; i < numero.Length; i++)
            {
                Console.WriteLine(numero[i]);
            }
    
            //for (int i = 0; i < miPila.Count; i++)
            //{
            //    numero = (int)miPila.Pop();
            //     Console.WriteLine(numero);
            //}
           
        }
    
    }
    He logrado hacerlo asi, pero veo que no una la pila

    Josmer Suero

    martes, 28 de julio de 2020 18:18
  • He logrado hacerlo asi, pero veo que no una la pila

    Sí, eso funcionará, salvo el inconveniente de que no usa la pila.

    Pero si es para un ejercicio, tiene un inconveniente todavía más grave, que probablemente resulte en una mala nota: Has usado Array.Reverse, que es una operación muy costosa, en lugar de sencillamente escribir el bucle for del final en sentido inverso, que no tiene coste ninguno en comparación con hacer el for hacia adelante. for (int i = numero.Length-1; i>=0; i--).

    En cualquier caso, si en el ejercicio te pedían una pila, es mejor que uses la pila, aunque también funcione perfectamente con un array. Para ello, dentro del primer for usa un Push sobre la pila, y dentro del segundo for usa un Pop. Salvo por estas dos pequeñas diferencias, todo el resto es prácticamente idéntico a como lo tienes. Ánimo que ya lo tienes casi hecho.

    martes, 28 de julio de 2020 21:10
    Moderador
  • Lo siento que no haya respondido mas temprano, no vi la respuesta... trate de adaptar tu respuesta, pero tiene agunos errores como en el primer push, en el console.readline y el pop en el segundo for.
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections.Generic;
    public class Ejemplo_11_02a
    {
        public static void Main()
        {
            //int[] numero = new int[5];
    
            Stack numero = new Stack();
            for (int i = 0; i < numero.Push; i++)
            {
                Console.WriteLine("Ingrese un numero{0}:", i + 1);
                numero = Console.ReadLine();
    
            }
    
            Console.WriteLine();
           // Array.Reverse(numero);
            Console.WriteLine("Estos son tus numeros:\n");
            for (int i = 0; i < numero.pop; i--)
            {
                Console.WriteLine(numero.Pop());
            }
    
            //for (int i = 0; i < miPila.Count; i++)
            //{
            //    numero = (int)miPila.Pop();
            //     Console.WriteLine(numero);
            //}
    
        }
    
    }
    


    Josmer Suero


    miércoles, 29 de julio de 2020 0:32
  • public class Ejemplo_11_02a
    {
        public static void Main()
        {
            
    
            Stack numero = new Stack(5);
    
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Ingrese un numero {0}:", i + 1);
                numero.Push(i);  Convert.ToInt32(Console.ReadLine());
            }
    
            
            Console.WriteLine("Estos son tus numeros:\n");
            for (int i = 0; i <5; i--)
            {
                
                Console.WriteLine(numero.Pop());
                
            }
    
          
            Console.ReadKey();
        }
    
    }
    
    
    




    Ahora no tiene ningun error pero no me deja ingresar valores para que los muestre.

    Trate de ingresar los push y pop donde me dijiste pero me daban errores ahi.



    Josmer Suero



    miércoles, 29 de julio de 2020 0:55
  • En esta versión tienes algunos errores:

    Has usado un Stack, que invierte el orden de los números, y además también has usado el "for" en sentido inverso, que vuelve a invertir el orden de los números. Hay que usar una cosa o la otra pero no ambas.

    En el primer "for" estás usando como número de iteraciones el valor "Push". No, esto no puede ser, el Push no devuelve un valor. Donde hay que usar el Push es dentro del bucle; el número de iteraciones es fijo e igual a 5 según el enunciado.

    Estás metiendo el valor que devuelve el ReadLine es en propio stack. No, lo que devuelve el ReadLine se pasa al Push.Y en el bucle de salida, lo mismo: El Pop no va en el número de iteraciones, sino que tiene que ir dentro de las instrucciones del bucle, donde ya lo tienes puesto. Esa parte está bien.

    miércoles, 29 de julio de 2020 5:53
    Moderador
  • Esta versión está mejor en cuanto al primer bucle, pero el segundo lo has dejado con i-- cuando tiene que ser i++.

    En el primer bucle, lo que hay que pasarle al Push no es la i (eso siempre metería en el Stack los números del 1 al 5, no los números que introduces en consola). Lo que hay que pasarle al stack es el número introducido:

    int valor = Convert.ToInt32(Console.ReadLine()); numero.Push(valor);

    El segundo bucle está bien, salvo el tema del i--.

    miércoles, 29 de julio de 2020 5:57
    Moderador
  • public class Ejemplo_11_02a
    {
        public static void Main()
        {
    
    
            Stack fichero = new Stack(1);
            
    
            for (int i = 0; i < 1; i++)
            {
                Console.WriteLine("Ingrese un fichero:", i + 1);
                int valor = Convert.ToInt32(Console.ReadLine()); fichero.Push(valor);
    
    
            }
    
    
            Console.WriteLine("Este es tu fichero:");
            for (int i = 0; i < 1; i++)
            {
    
                Console.WriteLine(fichero.Pop());
    
            }
    
    
            Console.ReadKey();
        }
    
    }
    
    Muchas Gracias, ell segundo en reaidad no es con una cola, si no con la misma pila, pero en vez de recibir un numero recibe un fichero de texto que asumo debe ser string, pero no lo puedo convertir


    Josmer Suero

    miércoles, 29 de julio de 2020 13:42
  • Para el tema del fichero, el bucle de entrada es diferente porque tienes que ir leyendo líneas desde el fichero y usando Push para meter cada línea en la pila. Lógicamente, como las líneas son cadenas de texto, no hay que aplicar el "Convert" para convertirlas en número; simplemente se toma el string y se pasa al Push directamente.

    Para sacar las líneas del fichero, puedes usar un StreamReader. Si lo pones en un bucle "while", te devuelve automáticamente una por una las líneas del fichero:

    string linea;
    using (StreamReader sr = new StreamReader(@"c:\ruta\fichero.txt"))
    {
        while (null != linea = sr.ReadLine())
        {
            pila.Push(linea);
        }
    }
    Observa que le he llamado "pila" a la pila, mientras que tú la llamas "fichero", pero llamarla fichero es confuso en caso de que pretendas preguntarle el nombre de fichero al usuario (en mi ejemplo he puesto un nombre fijo).

    Para el bucle de salida no puedes usar un bucle con i<1 porque eso solo haría una iteración y solo se imprimiría la última línea del fichero. Dale una pensada a ver qué se te ocurre para escribir todas las líneas que haya en la pila. Pista: lee la documentación de la clase Stack y observa cuáles son los métodos de los que dispone para saber si todavía queda algo en la pila. Entonces quita el bucle for y en su lugar usa un bucle while que emplee dicho método para decidir cuándo salir del bucle.

    miércoles, 29 de julio de 2020 14:13
    Moderador
  • Como lei el enunciado y solo decir que debia ser un fichero de texto, vi varios ejemplos y llegue hasta este, pero no hace el reverse
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    class GFG
    {
    
        // Driver code 
        public static void Main()
        {
    
            // Creating a Stack of strings 
            Stack<string> myStack = new Stack<string>();
    
            // Inserting the elements into the Stack 
            for (int i = 0; i <1; i++)
            {
              Console.WriteLine("Ingrese un fichero:", i+1);
              myStack.Push(Console.ReadLine());
    
            }
                
    
                
                String[] arr = myStack.ToArray();
        
            foreach (string str in arr)
            {
                Console.WriteLine();
                Array.Reverse(arr);
                Console.WriteLine("Este es tu fichero:\n");
                for (int i = 0; i < str.Length; i++)
                {
                    Console.WriteLine(str[i]);
                }
    
            }
        }
    }
    


    Josmer Suero

    jueves, 30 de julio de 2020 3:49