0

Estoy haciendo un programa sobre el menú de una tienda el cual tiene 4 opciones; Agregar producto, Borrar producto, Ver tabla de productos creados y Salir.

Ya cree la opción de Agregar producto (nombre, numero de orden, cantidad, precio, etc.) y la de salir, ambas opciones funcionan sin problemas.

Ahora tengo que hacer la opción de Borrar producto, pero no tengo idea de cómo borrar la información, cuando el usuario entra en esta opción se le tiene que mostrar los nombres de los productos que ha agregado junto con su número de orden y los datos deben de ser borrados con el numero de orden (seleccionado por el usuario), algo así…introducir la descripción de la imagen aquí

¿Me podrían decir cómo hacerle o que puedo usar en esta parte para borrar la información?

Esta es la manera en la agrego los productos, las variables i y k son variables globales…

struct productos
{
    int numor{},          //Numero de orden
        cant{};           //Cantidad
    float preuni{},       //Precio Unitario
        subt{},           //Subtotal
        IVA{},            //IVA
        total{};          //Precio total
    string codigo{};   //Codigo del producto
    string descr{};       //Descripcion del producto
}producto[51];

int i=1;    //numero de producto (contador)
int k=1;    //numero consecutivo (contador)
void altaorden()
{
    int can;

    cout << "\n¿Cuantos productos quieres dar de alta?: "; cin >> can;
        
    if (can <= 0 || can > 51)
    {
        system("cls");
        cout << "Advertencia: La cantidad de productos ingresados no es valido, intentalo nuevamente";
        return altaorden();


    }
    
    for (int p = 1; p <= can;)
    {
        if ( i < 51 )  //Numero de producto
        {
            if ( k <= 50 )                                                          //En esta parte se generan numeros consecutivos de manera automatica
            {
                cout << "\nNumero de orden: ";
                cout << k;
                cout << endl;
                producto[i].numor = k;
                k++;        
            }
            cin.ignore();
            cout << "Descripcion del producto: "; 
            getline(cin, producto[i].descr);
            cout << "Codigo de producto: ";
            getline(cin, producto[i].codigo);
            cout << "Cantidad para vender: "; cin >> producto[i].cant;
            cout << "Precio unitario: $"; cin >> producto[i].preuni;
            producto[i].subt = producto[i].preuni * producto[i].cant;
            cout << "Subtotal: $" << producto[i].subt;
            producto[i].IVA = producto[i].subt * 0.16;
            cout << "\nIVA: $" << producto[i].IVA;
            producto[i].total = producto[i].subt + producto[i].IVA;
            cout << "\nPrecio total: $" << producto[i].total;
            cout << "\n-------------------------------------------------------------------------------";
            cout << endl;
            i++;
        }
        p++;
    }
}

¿Me podrían ayudar con otro problema? Ya cree la tabla de productos, la primera vez que entro me la imprime de manera correcta, así.introducir la descripción de la imagen aquí

Pero cuando salgo al menú y vuelvo a entrar a la tabla me la imprime así. introducir la descripción de la imagen aquí

Como dije, solo la imprime de manera correcta la primera vez que la veo, después me la imprime mal y no se porque, esta es la parte del código que utilizo para imprimir la tabla

void lista()
{
    int c = k,m=7;
    system("cls");
    cout << endl;
    cout << "Tabla de ordenes generadas";
    cout << endl;
    cout << endl;
    cout << " Numero de orden ";
    cout << "|    Nombre de producto    |";
    cout << " Codigo de producto |";
    cout << " Cantidad |";
    cout << " Precio unitario |";
    cout << " Subtotal |";
    cout << "    IVA    |";
    cout << " Precio total |";
    cout << endl;
    cout << "-------------------------------------------------------------------------------------------------------------------------------------";
    cout << endl;
    for (int L = 2; L <= c; L++)
    {
        cout << "                 ";
        cout << "|                          |";
        cout << "                    |";
        cout << "          |";
        cout << "                 |";
        cout << "          |";
        cout << "           |";
        cout << "              |";
        cout << endl;
        cout << "-------------------------------------------------------------------------------------------------------------------------------------";
        cout << endl;
        
    }
    
    for (int h = 1; h < c; h++)
    {
        
            gotoxy(8, m);
        cout << producto[h].numor;
        gotoxy(20, m);
        cout << producto[h].descr;
        gotoxy(52, m);
        cout << producto[h].codigo;
        gotoxy(70, m);
        cout << producto[h].cant;
        gotoxy(83, m);
        cout << "$" << producto[h].preuni;
        gotoxy(96, m);
        cout << "$" << producto[h].subt;
        gotoxy(107, m);
        cout << "$" << producto[h].IVA;
        gotoxy(119, m);
        cout << "$" << producto[h].total;
        m = m + 4;
    }
    cout << "\n\n\n";
    system("pause");
    system("cls");
}
void gotoxy(int x, int y) 
{
    HANDLE hcon;
    hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos;
    dwPos.X = x;
    dwPos.Y = y;
    SetConsoleCursorPosition(hcon, dwPos);
}

Disculpen si son muchos problemas, soy principiante en programación con c++ y de vez en cuando suelo confundirme. Muchas gracias de antemano :)

grey
  • 25
  • 4
  • Te invito a hacer el [tour], a leer [ask] y a dejar una pregunta nada más en tu publicación. Puedes publicar una nueva pregunta para el problema de la impresión, es lo que el formato del sitio requiere y permitirá que alguien responda cada una de tus dudas y puedas votar y aceptar las respuestas que te sean útiles. – jachguate Mar 18 '21 at 08:39

2 Answers2

1

Si quieres gestionar una colección de datos dinámica, no deberías crear una colección de datos estática:

struct productos
{
    int numor{},          //Numero de orden
        cant{};           //Cantidad
    float preuni{},       //Precio Unitario
        subt{},           //Subtotal
        IVA{},            //IVA
        total{};          //Precio total
    string codigo{};   //Codigo del producto
    string descr{};       //Descripcion del producto
}producto[51];
//        ^^ <---- Mal!

Tendrás que elegir un contenedor de datos (lee este hilo para decidir cuál se ajusta más a tus necesidades), yo escogeré una lista para ponerte un ejemplo:

#include <list>
#include <algorithm>

int main()
{
    std::list<productos> producto;

    productos p;
    p.numor = 666;

    // Añadimos un producto
    producto.push_back(p);

    // Borramos el producto con numor 666
    std::remove_if(producto.begin(), producto.end(), [](const productos &p) { p.numor = 666; });

    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
0

Como te comentan es ideal utilizar una colección dinámica y puedes ganar muchas ventajas utilizando los contenedores. Uno de los cambios que yo haría es definir una clase en vez de un struct.

Por otro lado a la hora de hacer la tabla la estas escribiendo a "mano" y si quieres en algún momento añadir otra columna o modificar el nombre de alguna tendrás que cambiarlo de nuevo. Para solucionar esto te recomendaría usar la librería iomanip (https://www.cplusplus.com/reference/iomanip/).