Compilación C# - Estructuras Dinamicas

Iniciado por Castiel, 11 Febrero 2015, 08:51 AM

0 Miembros y 2 Visitantes están viendo este tema.

Castiel

En base a el siguiente código como realizo las modificaciones para dar solución a el requerimiento de permitir ingresar más datos a la pila incluyendo la funcionalidad de permitir al usuario que indique en que momento terminar de agregar datos a la pila.

Sabiendo de antemano que dicho código en su estructura se encuentra limitado a insertar tres elementos en la pila.

Les presento el avance del código.

Código (Csharp) [Seleccionar]
using System;
using System.Collections;
using System.Text;

namespace Pilas
{
   class Program
   {
       static void Main(string[] args)
       {
           // Variables necesarias
           int opcion = 0;
           string valor = "";
           int numero = 0;
           bool encontrado = false;

           // Creamos el stack
           Stack miPila = new Stack();
           do
           {
               // Mostramos menu
               Console.WriteLine("1- Push");
               Console.WriteLine("2- Pop");
               Console.WriteLine("3- Clear");
               Console.WriteLine("4- Contains");
               Console.WriteLine("5- Salir");
               Console.WriteLine("Dame tu opcion");
               valor = Console.ReadLine();
               opcion = Convert.ToInt32(valor);
               switch (opcion)
               {
                   case 1:
                       // Pedimos el valor a introducir
                       Console.WriteLine("Dame el valor a introducir");
                       valor = Console.ReadLine();
                       numero = Convert.ToInt32(valor);
                       // Adicionamos el valor en el stack
                       miPila.Push(numero);
                       break;
                   case 2:
                       // Obtnemos el elemento
                       numero = (int)miPila.Pop();
                       // Mostramos el elemento
                       Console.WriteLine("El valor obtenido es: {0}", numero);
                       break;
                   case 3:
                       // Limpiamos todos los contenidos del stack
                       miPila.Clear();
                       break;
                   case 4:
                       // Pedimos el valor a encontrar
                       Console.WriteLine("Dame el valor a encontrar");
                       valor = Console.ReadLine();
                       numero = Convert.ToInt32(valor);
                       // Vemos si el elemento esta
                       encontrado = miPila.Contains(numero);
                       // Mostramos el resultado
                       Console.WriteLine("Encontrado - {0}", encontrado);
                       break;
                   default:
                       Console.WriteLine("No existe opción intente de nuevo");
                       break;
               }
               // Mostramos la informacion del stack
               Console.WriteLine("La pila tiene {0} elementos", miPila.Count);
               foreach (int n in miPila)
                   Console.Write(" {0},", n);

               Console.WriteLine("");
               Console.WriteLine("————");
           } while (opcion != 5);
       }
   }
}


Espero y puedan apoyarme, gracias por su tiempo de antemano saludos cordiales.

Eleкtro

#1
Cita de: Castiel en 11 Febrero 2015, 08:51 AM
como realizo las modificaciones para ... permitir ingresar más datos a la pila

Sabiendo de antemano que dicho código en su estructura se encuentra limitado a insertar tres elementos en la pila.

¿Lo que quieres es limitar la inserción de elementos en la pila a un total de 3 elementos?, entonces:

Código (csharp) [Seleccionar]

Stack myStack = new Stack();
int maxStackCount = 3;

...

case 1:
 if (mySatck.Count < maxStackCount) {
   // Pedimos el valor a introducir
 } else {
   Console.WriteLine(string.Format("La pila no puede exceder más de {0} elementos.", maxStackCount));
 }


EDITO: En el código que has mostrado no has acondicionado un 'case 5' para detener la inserción de datos en la pila, ¿a sido un descuido por tu parte, o necesitas ayuda con eso?.
EDITO 2: Además, si introduces una opción "erronea", tal y como tienes el búcle no va a permitir "intentarlo de nuevo" como se supone que especificas en un mensaje de la consola xD.

Traslada todas las instruccones del código que has msotrado para trabajarlo en un bloque distinto al punto de entrada de la aplicación, prueba así:

VB.Net
Código (vbnet) [Seleccionar]
Imports System.Text

Module Module1

   Dim myStack As New Stack
   Dim maxStackCount As Integer = 3

   Sub Main()
       Choose()
   End Sub

   Private Sub Choose()

       Dim userInput As Char
       Dim userValue As Integer = 0

       Dim sb As New StringBuilder
       sb.AppendLine("1- Push")
       sb.AppendLine("2- Pop")
       sb.AppendLine("3- Clear")
       sb.AppendLine("4- Contains")
       sb.AppendLine("5- Salir")
       sb.AppendLine("Dame tu opcion")

       Do Until Not Enumerable.Range(0, 5).Contains(userValue)

           Console.WriteLine(sb.ToString)

           userInput = Console.ReadKey().KeyChar
           Integer.TryParse(userInput, userValue)

           Select Case userValue

               Case 1
                   If myStack.Count < maxStackCount Then
                       ' Pedimos el valor a introducir
                   Else
                       Console.WriteLine(String.Format("La pila no puede exceder más de {0} elementos", maxStackCount))
                   End If

               Case 2
                   ' Obtnemos el elemento.

               Case 3
                   ' Limpiamos todos los contenidos del stack.

               Case 4
                   ' Pedimos el valor a encontrar.

               Case 5
                   ' Salimos del búcle.
                   Exit Do

               Case Else
                   userValue = 0 ' Resetear el valor para no salir del bucle.
                   Console.Clear()
                   Console.WriteLine("No existe la opción, intente de nuevo")

           End Select

       Loop

       sb.Clear()

   End Sub

End Module


Traducción a C#:
Código (csharp) [Seleccionar]

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Text;

static class Module1
{

static Stack myStack = new Stack();

static int maxStackCount = 3;
       static void Main(string[] args)
{
Interaction.Choose();
}

private static void Choose()
{
char userInput = '\0';
int userValue = 0;

StringBuilder sb = new StringBuilder();
sb.AppendLine("1- Push");
sb.AppendLine("2- Pop");
sb.AppendLine("3- Clear");
sb.AppendLine("4- Contains");
sb.AppendLine("5- Salir");
sb.AppendLine("Dame tu opcion");

while (!(!Enumerable.Range(0, 5).Contains(userValue))) {
Console.WriteLine(sb.ToString);

userInput = Console.ReadKey().KeyChar;
int.TryParse(userInput, userValue);

switch (userValue) {

case 1:
if (myStack.Count < maxStackCount) {
// Pedimos el valor a introducir
} else {
Console.WriteLine(string.Format("La pila no puede exceder más de {0} elementos", maxStackCount));
}
break;

case 2: // Obtnemos el elemento.
break;

case 3: // Limpiamos todos los contenidos del stack.
break;

case 4: // Pedimos el valor a encontrar.
break;

case 5: // Salimos del búcle.
userValue = -1;
break;

default:
userValue = 0; // Resetear el valor para no salir del bucle.
Console.Clear();
Console.WriteLine("No existe la opción, intente de nuevo");
break;
}
}
sb.Clear();
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


Saludos!








Castiel

Hola mi estimado Elektro.

Agradezco te hayas tomado un poco de tu time para apoyarme en la solución, pero la solución que me propones no es la indicada (ya que se está limitando el contenido de la pila a solo 3 elementos), eso es lo que  me explicas como limitar la inserción de elementos a solo 3, en mi avance de código lo que se pide es  modificar dicho código para dar solución a el requerimiento de permitir al usuario ingresar más datos a la pila incluyendo la funcionalidad de permitir al usuario que indique en que momento terminar de agregar datos a la pila.

Osea lo que se pide es que el usuario ingrese datos a la pila indefinidamente, hasta que llegue el momento en donde decida que ya no desea ingresar, mas datos.

Espero contar con tu valioso apoyo, saludos cordiales.   :D

P.D. : Perdón si no me supe explicar.

Eleкtro

Cita de: Castiel en 12 Febrero 2015, 07:10 AMOsea lo que se pide es que el usuario ingrese datos a la pila indefinidamente, hasta que llegue el momento en donde decida que ya no desea ingresar, mas datos.

Espero contar con tu valioso apoyo, saludos cordiales.   :D

Entonces simplemente omite la comprobación de la cantidad de elementos en la pila :-/, quitando esa condicional en el código de ejemplo que mostré, el código hará lo que pides.

Saludos!








Castiel

Hola mi buen Elektro, le doy seguimiento al tema de Estructuras dinámicas, apenas respondo, porque el día de ayer estuvo fallando las publicaciones dentro de el foro, el cual no me permitía hacer más publicaciones a mis dudas correspondientes al tema.

Lo que hay que omitir es lo siguiente:
1. Stack myStack = new Stack();
2. int maxStackCount = 3;
3.
4. ...
5.
6. case 1:
7.   if (mySatck.Count < maxStackCount) {
8.     // Pedimos el valor a introducir
9.   } else {
10.     Console.WriteLine(string.Format("La pila no puede exceder más de {0} elementos.", maxStackCount));
11.   }


Podrías exponer la compilación completa ya que para el case 1, entonces como quedaría porque al correrlo justo como lo expones me manda errores de compilación te informo.

Error   6   Argumento 1: no se puede convertir de 'char' a 'string'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   26   ConsoleApplication1

Error   4   Argumento 1: no se puede convertir de 'grupo de métodos' a 'bool'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   35   31   ConsoleApplication1

Error   7   El argumento 2 se debe pasar con la palabra clave 'out'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   37   ConsoleApplication1

Error   2   El nombre 'Enumerable' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   33   19   ConsoleApplication1

Error   1   El nombre 'Interaction' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   17   9   ConsoleApplication1

Error   5   La mejor coincidencia de método sobrecargado para 'int.TryParse(string, out int)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   13   ConsoleApplication1

Error   3   La mejor coincidencia de método sobrecargado para 'System.Console.WriteLine(bool)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   35   13   ConsoleApplication1

En General:
Operación Generar iniciada: proyecto: ConsoleApplication1, configuración: Debug x86 ------
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(17,9): error CS0103: El nombre 'Interaction' no existe en el contexto actual
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(33,19): error CS0103: El nombre 'Enumerable' no existe en el contexto actual
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(35,13): error CS1502: La mejor coincidencia de método sobrecargado para 'System.Console.WriteLine(bool)' tiene algunos argumentos no válidos
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(35,31): error CS1503: Argumento 1: no se puede convertir de 'grupo de métodos' a 'bool'.
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(38,13): error CS1502: La mejor coincidencia de método sobrecargado para 'int.TryParse(string, out int)' tiene algunos argumentos no válidos
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(38,26): error CS1503: Argumento 1: no se puede convertir de 'char' a 'string'.
C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs(38,37): error CS1620: El argumento 2 se debe pasar con la palabra clave 'out'.

Compilación completada -- 7 errores, 0 advertencias
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets(316,9): warning CS1691: '2008' no es un número de advertencia válido
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========

Quedo al pendiente de tus comentarios, saludos y que estés bien, ayuda plis, le hago la lucha pero aún me sigue costando un poco esto de la programación.

Saludos cordiales.

Eleкtro

#5
Cita de: Castiel en 14 Febrero 2015, 04:18 AM
Podrías exponer la compilación completa ya que para el case 1, entonces como quedaría porque al correrlo justo como lo expones me manda errores de compilación te informo.

Error   6   Argumento 1: no se puede convertir de 'char' a 'string'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   26   ConsoleApplication1

Error   4   Argumento 1: no se puede convertir de 'grupo de métodos' a 'bool'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   35   31   ConsoleApplication1

Error   7   El argumento 2 se debe pasar con la palabra clave 'out'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   37   ConsoleApplication1

Error   2   El nombre 'Enumerable' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   33   19   ConsoleApplication1

Error   1   El nombre 'Interaction' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   17   9   ConsoleApplication1

Error   5   La mejor coincidencia de método sobrecargado para 'int.TryParse(string, out int)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   38   13   ConsoleApplication1

Error   3   La mejor coincidencia de método sobrecargado para 'System.Console.WriteLine(bool)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs   35   13   ConsoleApplication1

Te expliqué como solucionar la mayoría de esos errores...

Lee los errores que he citado, cada uno te está indicando la linea exacta del error, además es que solo tienes que hacer doble click en el mensaje de error para que te dirija inmediatamente a la linea en concreto que contiene la instrucción que está ocasionando dicho error de compilación, no es tan dificil localizarlos y resolverlos, ánimo.

Con la información que das no es posible ayudarte más que con palabras, porque estás mostrando, por ejemplo, un error de parámetros no válidos en la linea 38 (iint.TryParse), pero no enseñas el código que tienes escrito en esa linea para poder decirte que está mal ahí...

EDITO: También te expliqué que debes modificar el Framework objetivo en las propiedades del proyecto a .Net framework 3.5 o superior, para referenciar las dependencias de LINQ y así corregir algún que otro de esos errores del compiler, los cuales son por ausencia del namespace System.LINQ.
How to: Target a Version of the .NET Framework

Saludos








Castiel

Que tal mi estimado ya realize el cambio de parametros sobre el framework y agregue el System.Linq a las librerias, pero aun me siguen saliendo errores de ejecucion, a que se debera? , te comento que aun no eh omitido lo de reestringir la cantidad de datos a ingresar que era lo que me explicabas y que necesitaba saber si es esta parte del codigo que hay que modificar, te adjunto el codigo si es esta parte que hay que omitir.

Lo que hay que omitir es lo siguiente:
1. Stack myStack = new Stack();
2. int maxStackCount = 3;
3. 
4. ...
5. 
6. case 1:
7.   if (mySatck.Count < maxStackCount) {
8.     // Pedimos el valor a introducir
9.   } else {
10.     Console.WriteLine(string.Format("La pila no puede exceder más de {0} elementos.", maxStackCount));
11.   }


por otra parte este es el codigo que me proporcionaste pero con la limitacion de ingresar datos a solo 3 y lo que se necesita es modificarlo para que el usuario ingrese datos indefinidamente hasta que ya no decida hacerlo.

using System.Linq;
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Text;

static class Module1
{

    static Stack myStack = new Stack();

    static void Main(string[] args)
    {
        Interaction.Choose();
    }

    private static void Choose()
    {
        char userInput = '\0';
        int userValue = 0;

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("1- Push");
        sb.AppendLine("2- Pop");
        sb.AppendLine("3- Clear");
        sb.AppendLine("4- Contains");
        sb.AppendLine("5- Salir");
        sb.AppendLine("Dame tu opcion");

        while (!(!Enumerable.Range(0, 5).Contains(userValue)))
        {
            Console.WriteLine(sb.ToString);

            userInput = Console.ReadKey().KeyChar;
            int.TryParse(userInput, userValue);

            switch (userValue)
            {

                case 1:
                    if (myStack.Count < maxStackCount)
                    {
                        // Pedimos el valor a introducir
                    }
                    else
                    {
                        Console.WriteLine(string.Format("La pila no puede exceder más de {0} elementos", maxStackCount));
                    }
                    break;

                case 2: // Obtnemos el elemento.
                    break;

                case 3: // Limpiamos todos los contenidos del stack.
                    break;

                case 4: // Pedimos el valor a encontrar.
                    break;

                case 5: // Salimos del búcle.
                    userValue = -1;
                    break;

                default:
                    userValue = 0; // Resetear el valor para no salir del bucle.
                    Console.Clear();
                    Console.WriteLine("No existe la opción, intente de nuevo");
                    break;
            }
        }
        sb.Clear();
    }
}



Al ejecutarlo tal cual me salen estos nuevos errores, ya habiendo seleccionado el nuevo framework y agregando la libreria system.linq.

Error   5   Argumento 1: no se puede convertir de 'char' a 'string'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   38   26   ConsoleApplication1

Error   3   Argumento 1: no se puede convertir de 'grupo de métodos' a 'bool'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   35   31   ConsoleApplication1

Error   6   El argumento 2 se debe pasar con la palabra clave 'out'.   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   38   37   ConsoleApplication1

Error   1   El nombre 'Interaction' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   17   9   ConsoleApplication1

Error   7   El nombre 'maxStackCount' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   44   41   ConsoleApplication1

Error   8   El nombre 'maxStackCount' no existe en el contexto actual   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   50   106   ConsoleApplication1

Error   4   La mejor coincidencia de método sobrecargado para 'int.TryParse(string, out int)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   38   13   ConsoleApplication1

Error   2   La mejor coincidencia de método sobrecargado para 'System.Console.WriteLine(bool)' tiene algunos argumentos no válidos   C:\Users\PedroAnotonio\AppData\Local\Temporary Projects\ConsoleApplication1\Program Corregido Pilas.cs   35   13   ConsoleApplication1


Espero tus comentarios y gracias de antemano por tu valioso tiempo para con este servidor.  ;D