Proyecto-Registros

Iniciado por carlosabcs18, 1 Septiembre 2014, 04:06 AM

0 Miembros y 1 Visitante están viendo este tema.

carlosabcs18

EL PROYECTO ES EL SIGUIENTE:
En una tienda se quiere registrar vendedores (dni, nombres, apellidos, dirección(calle, numero, urbanización) ) con sus respectivos productos vendidos (producto, cantidad, precioventa). Implementa el sistema usando registros y funciones. El sistema debe permitir:
Registrar "N" vendedores con sus respectivos productos
Mostrar todos los vendedores con todos sus datos y sus respectivos productos
Mostrar los datos de un vendedor específico (ingresando su número de orden)
Mostrar los productos vendidos de un vendedor específico (ingresando su número de orden): producto, cantidad, precioventa, Subtotal. y finalmente el Total Subtotal=cantidad * precioventa Total = sumatoria de los subtotales
Eliminar un vendedor específico (ingresando su número de orden)
Búsqueda por dni: ingresa el dni de un vendedor y que muestre su dirección


El codigo hasta ahora  es el siguiente:
#include<iostream>
#include<string>
using namespace std;

struct vendedor{
   int dni;
   char nombres[20];
   char apellidos[25];
   struct direccion{
      char calle[20];
      int numero;
      char urbanizacion[14];
   } dir;
   struct producto{
      char producto[10];
      int cantidad;
      float precioventa;
   }prod[20];
   
}vendedores[120];

int registrar(int n){
   int i,j,m;   
   int vector[n];
   for(i=0;i<0;i++){
      cout<<"Ingrese DNI del vendedor "<<i+1<<": ";   fflush(stdin);   cin>>vendedores.dni;
      cout<<"Ingrese nombres del vendedor "<<i+1<<" :";   
      fflush(stdin);   gets(vendedores.nombres);
      cout<<"Ingrese apellidos del vendedor "<<i+1<<": ";   
      fflush(stdin);      gets(vendedores.apellidos);
      cout<<"Ingrese direccion del vendedor"<<i+1<<" :"<<endl;
      cout<<"Calle: ";      fflush(stdin);      gets(vendedores.dir.calle); cout<<endl;   
      cout<<"Numero: ";      cin>>vendedores.dir.numero;      cout<<endl;
      cout<<"Urbanizacion: ";   fflush(stdin);      gets(vendedores.dir.urbanizacion); cout<<endl;
      cout<<"Cuantos productos desea ingresar?: ";   cin>>m;
      for(j=0;j<m;j++){
      cout<<"Ingrese producto "<<j+1<<" del vendedor"<<i+1<<" :"<<endl;
      cout<<"Producto: ";   fflush(stdin);      gets(vendedores.prod[j].producto);
      cout<<"Cantidad: ";   cin>>vendedores.prod[j].cantidad;
      cout<<"Precio de venta: "; cin>>vendedores.prod[j].precioventa;
      }
      cout<<endl<<"*********************************************************************************";
      }
   }

void mostrar(int n){
   
   int i;
   
   for(i=0;i<n;i++){
      cout<<"--------------------------------------------------------------------"<<endl;
      cout<<"Vendedor numero   "<<i+1<<"."<<endl;
      cout<<"DNI      :          "<<vendedores.dni<<endl;;
      cout<<"Nombres      :          "<<vendedores.nombres<<endl;;
      cout<<"Apellidos   :         "<<vendedores.apellidos<<endl;
      cout<<"-Direccion-             "<<endl;
      cout<<"Calle      :          "<<vendedores.dir.calle<<endl;
      cout<<"Numero      :         "<<vendedores.dir.numero<<endl;
      cout<<"Urbanizacion   :         "<<vendedores.dir.urbanizacion<<endl;
      cout<<"Producto   :         "<<vendedores.prod.producto<<endl;      //ACÁ ES DONDE ESTA EL PROBLEMA, COMO HAGO UN FOR QUE MUESTRE TODOS LOS PRODUCTOS, OSEA NECESITO LA VARIABLE EN QUE SE DETENGA PERO NO SE COMO BOTARLA DE LA FUNCION ANTERIOR
      cout<<"--------------------------------------------------------------------"<<endl;   
   }
}
void m_determinado(int v){
   
   cout<<"--------------------------------------------------------------------"<<endl;
   cout<<"Vendedor numero   "<<v+1<<"."<<endl;
   cout<<"DNI      :          "<<vendedores[v].dni<<endl;;
   cout<<"Nombres      :          "<<vendedores[v].nombres<<endl;;
   cout<<"Apellidos   :         "<<vendedores[v].apellidos<<endl;
   cout<<"-Direccion-             "<<endl;
   cout<<"Calle      :          "<<vendedores[v].dir.calle<<endl;
   cout<<"Numero      :         "<<vendedores[v].dir.numero<<endl;
   cout<<"Urbanizacion   :         "<<vendedores[v].dir.urbanizacion<<endl;
   cout<<"--------------------------------------------------------------------"<<endl;
}

void v_producto(int v){
   cout<<"--------------------------------------------------------------------"<<endl;
   cout<<"Producto   :         "<<vendedores[v].prod.producto<<endl;
   cout<<"Cantidad   :         "<<vendedores[v].prod.cantidad<<endl;
   cout<<"Precio de Venta   :   "<<vendedores[v].prod.cantidad<<endl;
}

int main(){
   int n,i,v;
   cout<<"Cuantos vendedores desea registrar?"<<endl;
   cin>>n;
   registrar(n);
   mostrar(n);
   cout<<"Ingrese el numero de vendedor del que desea los datos: ";   cin>>v;
   m_determinado(v-1);
   
   return 0;   
   }


Gracias de antemano.

6666


eferion

dudo mucho que le dejen usar sqlite... la idea será que aprenda a pegarse con el tratamiento de ficheros. Me equivoco?

carlosabcs18

Exacto el tema es ficheros :S

flony

#4
hay varias partes del codigo que no las entiendo, primero las dudas y despues unas ideas mias.
[code]int registrar(int n){
  int i,j,m;                /ponele pilas y trata de usar algo mas clarito para definir variables
  int vector[n];         /que hace este vector?
  for(i=0;i<0;i++){  /supongo que este for es para iteractuar las veces que decidas registrar un vendedor?
 cout<<"Ingrese DNI del vendedor "<<i+1<<": ";   fflush(stdin);   cin>>vendedores.dni;  /que funcion cumple (i+1)? y para que usar fflush(stdin)?
 cout<<"Ingrese nombres del vendedor "<<i+1<<" :";  
 fflush(stdin);   gets(vendedores.nombres);
...
...


mi recomendacion tomala o dejala  ;D
cuando dije usa la cabecera string era asi, mas borrar lo que no entendi  ;D si lo explicas capaz puedo ayudarte mejor
#include<iostream>
#include<string>

using namespace std;

struct vendedor{
  int dni;
  string nombres;
  string  apellidos;
  struct direccion{
     string calle;
     int numero;
     string urbanizacion;
  } dir;
  struct producto{
     string producto;
     int cantidad;
     float precioventa;
  }prod[20];
 
}vendedores[120];

int registrar(int numeroVendedores){
  int cantidadDeProductos;  
  for(int i=0;i<=numeroVendedores;i++){
  cout<<"Ingrese DNI del vendedor :"; cin>>vendedores[i].dni;
     cout<<"Ingrese nombres del vendedor  :";  
     getline (cin, vendedores[i].nombres);
     cout<<"Ingrese apellidos del vendedor ";  
     getline(cin, vendedores[i].apellidos);
     cout<<"Ingrese direccion del vendedor :"<<endl;
     cout<<"Calle: ";      getline(cin, vendedores[i].dir.calle); cout<<endl;  
     cout<<"Numero: ";      cin>>vendedores[i].dir.numero;      cout<<endl;
     cout<<"Urbanizacion: ";   getline(cin, vendedores[i].dir.urbanizacion); cout<<endl;
     cout<<"Cuantos productos desea ingresar?: ";
 cin>>cantidadDeProductos;
 for(int j=0;j<cantidadDeProductos;j++){
     cout<<"Ingrese producto del vendedor :"<<endl;
 cout<<"Producto: ";   getline (cin, vendedores[i].prod[j].producto);
 cout<<"Cantidad: ";   cin>>vendedores[i].prod[j].cantidad;
     cout<<"Precio de venta: "; cin>>vendedores[i].prod[j].precioventa;
     }
     cout<<endl<<"*********************************************************************************";
     }
  }
[/code]
si un problema no tiene solucion entonces no es un problema...es algo inevitable

carlosabcs18

Corregí bastante y ahora solo me faltan las 2 ultimas funciones:


//Mostrar los productos vendidos de un vendedor específico (ingresando su número de orden): producto, cantidad, precioventa, Subtotal. y finalmente el Total Subtotal=cantidad * precioventa Total = sumatoria de los subtotales
//Eliminar un vendedor específico (ingresando su número de orden)
//Búsqueda por dni: ingresa el dni de un vendedor y que muestre su dirección
#include<iostream>
#include<string>
using namespace std;

struct producto
   {
       char producto[20]; 
       int  cantidad;
       float  precioventa;
       float  subtotal;
       
      
   };
   

struct vendedor{
   int dni;
   char nombres[20];
   char apellidos[25];
   struct direccion{
      char calle[20];
      int numero;
      char urbanizacion[14];
   } dir;
   producto prod[20];
   int n_prod;
   
   
}vendedores[120];


void registrar_productos(int nv, int np)
{


    for(int i=0; i<np; i++)
   {
      cout<<"Ingrese producto: "<<endl;
      cout<<"Producto: ";   fflush(stdin);      gets(vendedores[nv].prod.producto);
      cout<<"Cantidad: ";   cin>>vendedores[nv].prod.cantidad;
      cout<<"Precio de venta: "; cin>>vendedores[nv].prod.precioventa;      
   }
}
       

void registrar(int n){
   int i;
   for(i=0;i<n;i++){
      cout<<"Ingrese DNI del vendedor "<<i+1<<": ";   fflush(stdin);   cin>>vendedores.dni;      //El fflush y el gets es para reconocer el espacio entre 2 palabras del string
      cout<<"Ingrese nombres del vendedor "<<i+1<<" :";   
      fflush(stdin);   gets(vendedores.nombres);
      cout<<"Ingrese apellidos del vendedor "<<i+1<<": ";   
      fflush(stdin);      gets(vendedores.apellidos);
      cout<<"Ingrese direccion del vendedor"<<i+1<<" :"<<endl;
      cout<<"Calle: ";      fflush(stdin);      gets(vendedores.dir.calle); cout<<endl;   
      cout<<"Numero: ";      cin>>vendedores.dir.numero;      cout<<endl;
      cout<<"Urbanizacion: ";   fflush(stdin);      gets(vendedores.dir.urbanizacion); cout<<endl;
      cout<<"Cuantos productos desea ingresar?: ";   cin>>vendedores.n_prod;
      registrar_productos(i,vendedores.n_prod);
      }
      cout<<endl<<"*********************************************************************************";
      }

void prodVendedor(int nv)
{
       float acum=0;
       cout << "Productos de " << vendedores[nv].nombres<<" "<<vendedores[nv].apellidos<<endl<<endl;
   
        for(int i=0; i<vendedores[nv].n_prod; i++)
        {
         cout<<"Producto "<<i+1<<endl;
            cout<<"Nombre  : " << vendedores[nv].prod.producto  <<endl;
            cout<<"Cantidad: " << vendedores[nv].prod.cantidad <<endl;
            cout<<"Precio  : " << vendedores[nv].prod.precioventa<<endl;
            vendedores[nv].prod.subtotal=vendedores[nv].prod.cantidad*vendedores[nv].prod.precioventa;
         cout<<"Subtotal: " <<vendedores[nv].prod.subtotal<<endl;
         acum=vendedores[nv].prod.subtotal+acum;             
        }
        cout<<endl<<"Total: " <<acum<<endl;
        cout<<endl;
        cout<<"  ---------------------------"<<endl;
       
}   
   

void mostrar(int n){
   int i, y;
   for(i=0;i<n;i++){
      cout<<"--------------------------------------------------------------------"<<endl;
      cout<<"Vendedor numero   "<<i+1<<"."<<endl;
      cout<<"DNI      :          "<<vendedores.dni<<endl;;
      cout<<"Nombres      :          "<<vendedores.nombres<<endl;;
      cout<<"Apellidos   :         "<<vendedores.apellidos<<endl;
      cout<<"-Direccion-             "<<endl;
      cout<<"Calle      :          "<<vendedores.dir.calle<<endl;
      cout<<"Numero      :         "<<vendedores.dir.numero<<endl;
      cout<<"Urbanizacion   :         "<<vendedores.dir.urbanizacion<<endl;
      cout<<"Productos   :         "<<endl;      
      for(y=0;y<vendedores.n_prod;y++){
      cout<<"\tNombre  : " << vendedores.prod[y].producto<<endl;
      }
      cout<<"--------------------------------------------------------------------"<<endl;   
   }
}
void m_determinado(int v){
   
   cout<<"--------------------------------------------------------------------"<<endl;
   cout<<"Vendedor numero   "<<v+1<<"."<<endl;
   cout<<"DNI      :          "<<vendedores[v].dni<<endl;;
   cout<<"Nombres      :          "<<vendedores[v].nombres<<endl;;
   cout<<"Apellidos   :         "<<vendedores[v].apellidos<<endl;
   cout<<"-Direccion-             "<<endl;
   cout<<"Calle      :          "<<vendedores[v].dir.calle<<endl;
   cout<<"Numero      :         "<<vendedores[v].dir.numero<<endl;
   cout<<"Urbanizacion   :         "<<vendedores[v].dir.urbanizacion<<endl;
   cout<<"--------------------------------------------------------------------"<<endl;
}

void v_producto(int v)
{
   cout<<"--------------------------------------------------------------------"<<endl;
   for(int i=0;i<vendedores[v].n_prod; i++)
   {
      cout<<"Producto   :         "<<vendedores[v].prod[v].producto<<endl;
      cout<<"Cantidad   :         "<<vendedores[v].prod[v].cantidad<<endl;
      cout<<"Precio de Venta   :   "<<vendedores[v].prod[v].precioventa<<endl;
   }
}

void e_vendedor( int x, int num)
{
    for(int i=x; i<(num-1); i++)
      vendedor=vendedor[i+1];
    num--;

}

void buscar( int dni)
{
    int band = 0;

    if(dni>0)
    {
        for(int i=0; i<dni; i++)
        {
            if(vendedor.dni==dni)
            {
                cout<<"\n\n La direccion de "<<vendedor.nombres<<" "
                    <<vendedor.apellidos<<" es : "
                    <<vendedor.dir.calle<<" "<<vendedor.dir.numero<<" "<<vendedor.dir.urbanizacion<<endl ;
                band = 1 ;
                break;
            }
        }
    }
    else
        cout<<"\n\tRegistro vacio..!";

    if(band==0)
        cout<<"\n\n\tEl vendedor no fue encontrado! "<<endl;
}


int main(){
   int n,i,v,w,nv,el_v,dni;
   cout<<"Cuantos vendedores desea registrar?"<<endl;
   cin>>n;
   registrar(n);
   mostrar(n);
   cout<<"Ingrese el numero de vendedor del que desea los datos: ";   cin>>v;
   m_determinado(v-1);
   cout<<"Ingrese numero de vendedor del que desea conocer sus productos: "; cin>>w;
   prodVendedor(w-1);
   cout<<"Ingrese numero de vendedor a eliminar: ";   cin>>el_v;
   e_vendedor(el_v-1,n);
   cout<<"Ingrese dni del vendedor a buscar: ";   cin>>dni;
   buscar(dni);
   return 0;
      
   }
   
   
   


eferion

carlosabcs18, un par de detalles:

* El código decóralo con las etiquetas GeSHi... elige el lenguaje adecuado para que el texto se formatee correctamente.

* En C++ existe la clase string, la cual permite sustituir las cadenas de C (char*). Usar esta clase tiene varias ventajas: Simplifica el código, se evitan varios errores tontos, no tienes que pegarte con punteros...

Código (cpp) [Seleccionar]

// Version C
char producto[20];

strcpy( producto, "Coche" );

// Versión C++
std::string producto = "Coche";


* No es recomendable usar variables globales. Las variables globales pueden ser hasta peligrosas. No merece la pena ahorrarse dos líneas de código. En pocas ocasiones es necesario usar una variable global.

* En C++ existen los denominados contenedores. El contenedor más popular es "vector", el cual te permite gestionar listas no ordenadas de elementos. Con esta clase puedes sustituir tu variable "vendedores". Sustituir un arreglo C por un contenedor tiene la ventaja de que, por ejemplo, te puedes despreocupar del número de elementos en la lista, el contenedor se redimensiona por si solo cuando sea necesario.

Código (cpp) [Seleccionar]

std::vector< vendedor > vendedores;

// Insertar nuevo vendedor
// ----------

vendedor nuevo_vendedor;
// dar valores al nuevo vendedor
// ...

vendedores.push_back( nuevo_vendedor );

// Vaciar la lista de vendedores
vendedores.clear( );

// Saber el numero de vendedores dados de alta
std::cout << vendedores.size( ) << std::endl;


* En C++ suele ser recomendable no anidar clases, eso es más propio de C y normalmente dificulta la legibilidad del código:

Código (cpp) [Seleccionar]

struct direccion
{
  std::string calle;
  int numero;
  std::string urbanizacion;
};

struct vendedor
{
  int dni;
  std::string nombre;
  std::string apellidos;
  direccion dir;
  std::vector< producto > prod;

  // La siguiente variable ahora sobra, el contenedor ya tiene esta informacion
  // int n_prod;
};


* No pongas varias instrucciones en la misma línea. Al compilador le va a dar igual que las instrucciones estén todas seguidas o en diferentes líneas, el programa va a ocupar prácticamente lo mismo... pero la legibilidad del código se resiente. No te proporciona ningún beneficio y perjudica el mantenimiento del codigo:

Código (cpp) [Seleccionar]

// opcion mala
cout<< "Producto: ";   fflush(stdin);      gets(vendedores[nv].prod.producto);

// opcion buena
cout<< "Producto: ";
fflush(stdin);
gets(vendedores[nv].prod.producto);


* No uses fflush sobre stdin. fflush está pensado únicamente para bufferes de salida, no de entrada. El resultado puede ser indeterminado... además, ya puestos a usar C++, usa cin en vez de gets y compañía.

Ampliando el tema de fflush... si ya de por si no es recomendable mezclarlo con stdin... menos aún usarlo junto a cin. cin es una clase y es independiente de stdin... actúan sobre el mismo buffer, pero no tienen por qué trabajar igual, puedes acabar con problemas de sincromismo.

Si quieres limpiar el buffer de cin lo mejor es hacer algo tal que:

Código (cpp) [Seleccionar]

// Limpiar todo el buffer
cin.ignore( std::numeric_limits< std::streamsize >::max( ) );

// Limpiar el buffer hasta el primer salto de línea.
cin.ignore( std::numeric_limits< std::streamsize >::max( ), '\n' );


Y, por supuesto, no es recomendable mezclar accesos a cin con el uso de gets, scanf, ...

* Me he fijado en que la clase "producto" tiene un "subtotal"... este campo es el resultado de la operación cantidad*precioVenta. Este planteamiento presenta el inconveniente de que si en algún momento actualizas uno de estos dos campos y no recalculas "subtotal" entonces tendrás una inconsistencia.

A mi modo de ver sería recomendable calcular este valor sobre la marcha cuando se requiera mediante un método:

Código (cpp) [Seleccionar]

struct producto
{
  std::string producto;
  int cantidad;
  float precioVenta;

  float Subtotal( ) const
  {
    return static_cast< float >( cantidad ) * precioVenta;
  }
};


"static_cast" lo uso para convertir "cantidad" a float... prefiero los cast de C++ a los de C, son más seguros y más sencillos de localizar en el código.

* Procura que las variables signifiquen algo:

Código (cpp) [Seleccionar]
int n,i,v,w,nv,el_v,dni;

Si tu te encuentras esta línea en un programa cualquiera... ¿sabrías decir cual es la finalidad de cada una de esas variables? Costaría un poco, ¿verdad?

Y si en vez de esa línea te encuentras una tal que:

Código (cpp) [Seleccionar]
int num_vendedores, id_vendedor_datos, id_vendedor_productos, id_vendedor_eliminar;

¿Se entendería mejor el código?

Si este ejemplo no es lo suficientemente claro tengo otro:

Código (cpp) [Seleccionar]

// opcion 1
h = x * i * ( 1.0 + d );

// opcion 2
total = precio_unitario * unidades * ( 1.0 + iva );





Bueno, hasta aquí mis consejos prácticos... tengo más, así que si te quedas con ganas luego te comento.

Ahora vamos con tus "errores":

Código (cpp) [Seleccionar]
void e_vendedor( int x, int num)
{
    for(int i=x; i<(num-1); i++)
      vendedor=vendedor[i+1];
    num--;

}

// ...

e_vendedor(el_v-1,n);


"num" se pasa por valor, luego "num--" no tendrá efecto sobre "n". Si pretendes modificar "v" dentro de "e_vendedor" tienes que pasar la variable por referencia:

Código (cpp) [Seleccionar]
void e_vendedor( int x, int& num)

Y el otro error:

Código (cpp) [Seleccionar]

void buscar( int dni)
{
    int band = 0;

    if(dni>0)
    {
        for(int i=0; i<dni; i++) // <<------ AQUI!!!!
        {
            if(vendedor.dni==dni)
            {
                cout<<"\n\n La direccion de "<<vendedor.nombres<<" "
                    <<vendedor.apellidos<<" es : "
                    <<vendedor.dir.calle<<" "<<vendedor.dir.numero<<" "<<vendedor.dir.urbanizacion<<endl ;
                band = 1 ;
                break;
            }
        }
    }
    else
        cout<<"\n\tRegistro vacio..!";

    if(band==0)
        cout<<"\n\n\tEl vendedor no fue encontrado! "<<endl;
}


¿por qué asumes que "dni" lo puedes usar para recorrer la lista de vendedores? Si usas un arreglo de C tienes que pasar a la función la cantidad de vendedores en la lista. Si pasas un DNI que no exista el código va a leer fuera del arreglo y eso te va a dar problemas.