[ Foro de C# ]

Duda con ejercicio C#

14-Oct-2015 18:39
Oscar Hernandez
3 Respuestas

El ejercicio es el siguiente

Crea un programa que lleve el stock de bolígrafos y lapices de una papelería y que por tanto haga los siguientes pasos:

- El programa pedirá inicialmente cuantos bolígrafos y cuantos lapices hay en stock. Éste paso sólo se realizará una vez.

- Entonces el programa debe pedir al usuario una letra mientras exista stock de bolígrafos o lapices.

- Después de pedir la letra, si está es R o C, el programa pedirá al usuario que introduzca una cantidad,

- Se deberá restar la cantidad introducida del stock total de bolígrafos o lapices dependiendo de la letra introducida.

- El programa volverá a pedir la letra y stock hasta que se termine el stock de algunos de los productos. Entonces debe finalizar el programa mostrando la cantidad de rosas y claveles que quedan en la tienda.


Osea cuando le de a ejecutar el programa, me tendría que salir por ejemplo esto.

Stock de bolígrafos?
30

Stock de lapices?
20

Introduce producto?
B

Introduce Cantidad?
15

Introduce producto?
L

Introduce Cantidad?
5

Introduce producto?
B

Introduce Cantidad?
15

Fin del programa
Quedan 0 boligrafos y 15 lapices.

Este es el código que hice, pero no es que me de error, es que simplemente no me da el resultado esperado, osea no me repite el proceso hasta que la que condición se cumpla.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace stocks__boligrafos_lapices
{
    class Program
    {
        static void Main(string[] args)
        {
            int boligrafos, lapices, cantidad1, cantidad2, resultado1 = 0, resultado2 = 0;
 
            char respuesta;
 
 
            Console.WriteLine("Stock de bolígrafos?");
            Console.WriteLine("");
 
            boligrafos = Int16.Parse(Console.ReadLine());
            Console.WriteLine("");
 
            Console.WriteLine("Stock de lapices?");
            Console.WriteLine("");
 
            lapices = Int16.Parse(Console.ReadLine());
            Console.WriteLine("");
 
 
 
            do
            {
                Console.WriteLine("Introduce producto");
                Console.WriteLine("");
 
                respuesta = char.Parse(Console.ReadLine());
                Console.WriteLine("");
 
                if ((respuesta == 'B') || (respuesta == 'L'))
                {
                    Console.WriteLine("Introduce cantidad");
                    Console.WriteLine("");
                    cantidad1 = Int16.Parse(Console.ReadLine());
                    resultado1 = boligrafos - cantidad1;
                    Console.WriteLine("");
                    Console.WriteLine("Introduce producto");
                    Console.WriteLine("");
                    respuesta = char.Parse(Console.ReadLine());
                    Console.WriteLine("");
                    Console.WriteLine("Introduce cantidad");
                    Console.WriteLine("");
                    cantidad2 = Int16.Parse(Console.ReadLine());
                    resultado2 = lapices - cantidad2;
                    Console.WriteLine("");
                }
                else
                {
                    Console.WriteLine("Error");
                }
 
 
 
            }
            while ((resultado1 <= 0) || (resultado2 <= 0));
 
            Console.WriteLine("");
            Console.WriteLine("Fin del programa");
            Console.WriteLine("Quedan " + resultado1 + " boligrafos" + " y " + resultado2 + " lapices.");
 
            Console.ReadKey();
 
 
 
        }
    }
}



Alguien puede ayudarme?

Gracias y un saludo.


15-Oct-2015 10:51
Invitado (Caranim)

En la definición de variables (enteras) te sobran cuatro. Realmente te sobre con definir la cantidad de bolígrafos, lapiceros y una variable que almacene el valor que introduzca el usuario. De echo el exceso de variables te lleva a un error más adelante en el programa.

En el bucle "do" pides dos veces el producto y la cantidad.

Independientemente de la respuesta que teclee el usuario al indicar el producto:

    *   if ((respuesta == 'B') || (respuesta == 'L'))  ->   ' Si es 'B' o si es 'L'

En resultado1 dejas el valor de bolígrafos menos la primera cantidad:
   * resultado1 = boligrafos - cantidad1;

En resultado2 dejas el valor de lapiceros menos la segunda cantidad:
   * resultado2 = lapices - cantidad2;

...y en ningún momento actualizas el stock de ninguno de los dos productos. Por eso siempre guardas el stock inicial menos la última cantidad introducida. Para que funcione correctamente debes de restar la cantidad introducida a la cantidad de bolígrafos/lapiceros inicial:
    * boligrafos -= cantidad;
    * lapices -= cantidad;

En el while dices que el proceso se ejecutará "Mientras una de las dos variables sea menor o igual a cero":
     * while ((resultado1 <= 0) || (resultado2 <= 0));

Cómo en ambas variables tenías guardado el stock inicial menos la cantidad "vendida", la condición solo se cumplirá cuando hayas introducido una cantidad de "venta" igual o superior al stock inicial. Cómo no se va a cumplir en casi ningún caso, el "while" no se llega a repetir en ninguna ocasión.

Adjunto el código con los cambios que le he hecho.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace stocks__boligrafos_lapices
{
    class Program
    {
        static void Main(string[] args)
        {
            int boligrafos, lapices, cantidad;

            char respuesta;
            Console.WriteLine("Stock de bolígrafos?");
            Console.WriteLine("");

            boligrafos = Int16.Parse(Console.ReadLine());
            Console.WriteLine("");

            Console.WriteLine("Stock de lapices?");
            Console.WriteLine("");

            lapices = Int16.Parse(Console.ReadLine());
            Console.WriteLine("");

            do
            {
                Console.WriteLine("Introduce producto");
                Console.WriteLine("");

                respuesta = char.Parse(Console.ReadLine());
                Console.WriteLine("");

                Console.WriteLine("Introduce cantidad");
                Console.WriteLine("");
                cantidad = Int16.Parse(Console.ReadLine());

                switch(respuesta)
                {
                    case 'B' :
                    case 'b':
                        boligrafos -= cantidad;
                        break;
                    case 'L':
                    case 'l':
                        lapices -= cantidad;
                        break;
                    default:
                        Console.WriteLine("Error");
                        break;
                }

                Console.WriteLine("Quedan " + boligrafos + " boligrafos" + " y " + lapices + " lapices.");

            }
            while ((lapices > 0) && (boligrafos > 0));

            Console.WriteLine("");
            Console.WriteLine("Fin del programa");
            Console.WriteLine("Quedan " + boligrafos + " boligrafos" + " y " + lapices + " lapices.");
            Console.ReadKey();

        }
    }
}


Espero que te sirva.

Un saludo.


15-Oct-2015 15:38
Carlos Rodriguez (+1)

Esta linea esta incorrecta:
while (resultado1 >= 0 || resultado2 >= 0);


17-Oct-2015 18:48
Invitado (Caranim)

Las cosillas que he visto:

- No actualizas el stock en ningún sitio del programa. Debes de restar la cantidad "vendida" del stock ( Variables lápices y bolígrafos ).
- Preguntas dentro del "if" otra vez por "Producto" y "Cantidad". Esa segunda vez la puedes evitar. Es más, es conveniente evitarla.
- Como bien te han indicado, la condición de salida del bucle es errónea.

He hecho unos pocos cambios y me ha funcionado correctamente:


           do
           {
               
               Console.WriteLine("Introduce producto");
               Console.WriteLine("");

               respuesta = char.Parse(Console.ReadLine());
               Console.WriteLine("");
               Console.WriteLine("Introduce cantidad");
               Console.WriteLine("");
               cantidad = Int16.Parse(Console.ReadLine());


               switch (respuesta)
               {
                   case  'B':
                   case 'b':
                       boligrafos -= cantidad;
                       break;
                   case 'L':
                   case 'l':
                       lapices -= cantidad;
                       break;
                   default:
                       Console.WriteLine("No hay productos con esa referencia.");
                       break;
               }                
           }
           while ((boligrafos > 0) && (lapices > 0));

Espero que te sirva.

Un saludo.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)