Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 02, 2008, 01:30:37
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Nuevo foro de Control de versiones.

+  Foros Java y C/Linux
|-+  Programación
| |-+  C/C++ linux
| | |-+  Borrar una celda de un array de estructuras
« anterior próximo »
Páginas: [1] Enviar tema Imprimir
Autor Tema: Borrar una celda de un array de estructuras  (Leído 331 veces)
lem
Full Member
***
Mensajes: 105


Ver Perfil


« en: Junio 16, 2008, 08:33:09 »

Hola aqui estoy de nuevo

Me piden en un ejercicio que haga una función llamada borrar que elimine un elemento de un array de estructuras.Es decir:
Código:
[void borrar(struct Tgestion &producto)
y la llamada a esta función es:
borrar_producto(producto[p]),donde p es la posición del array de estructuras
porducto de una estructura o lista concreta y me piden que borre completamente ese elemento.
El array es:struct Tgestion producto[50]
Huh
¿Podríais echarme una mano?
Gracias por todo
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #1 en: Junio 16, 2008, 08:56:17 »

Hola:

Intenta algo y cuando tengas algún problema por aquí el código y concreta el problema.

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #2 en: Junio 16, 2008, 09:04:52 »

El caso es que es un problema mucho más amplio y va a salir un código fuente enorme.En cualquier caso aqui está:
Código:
/*Problema nº1.Gestión de un almacén.
 
#include<stdio.h>
#include<conio.h>
#define <string.h>
#define TCODIGO 14/*Los códigos de barras de los productos reales tienen 13
                    números*/
#define TNOMBRE 20
#define TALMACEN 50

struct Tgestion{
char codigo[TCODIGO];/*Utilizo una cadena de caracteres y no una variable
                        de tipo unsigned ya que los números de código no
se va a modificar*/
       char nombre[TNOMBRE];
float peso,volumen;
};

void intro_producto(struct Tgestion p[],int&tam)/*Función 1*/
   {
if(tam<TALMACEN)/*Con esta instrucción nos aseguramos que no nos salimos del
                  array de estructuras producto*/
{
  Printf("\nIntroduce el codigo de barras");
  scanf("%s",p[tam].codigo);
  printf("\nIntroduce el nombre del producto");
  getchar();
  gets(p[tam].nombre);
  printf("\nIntroduce el peso (Kg)");
  scanf("%f",&p[tam].peso);
  printf("\nIntroduce el volumen del producto (cm3)");
  scanf("%f",&p[tam].volumen);
  ++tam;/*Aumento en uno el numero de productos.*/
    }
else
   printf("\n\a ATENCIÓN no caben más productos");
   }
   

int buscar_producto(struct Tgestion p[],int tam,char nombreBuscado[])/*Función 2*/
   {
int i=0,pos=-1;
while(i<tam && strcmp(nombrebuscado,p[i].nombre)!=0)
    i++:
  if(i<tam)
  pos=i;
  return pos;
   }

void borrar(struct Tgestion &producto)/*Al pasar la estructura correspondiente
                                       a la posición p por referencia se va a
borrar permanentemente este producto del
array de estructuras de productos*/
{

  int main()
    {
  struct Tgestion producto[TALMACEN];
  char opcion;
  int nuproduc=0;/*En un principio considero que no hay ningún producto en el
                  array de estructuras producto*/
  char nombrebuscado[20];               
 
  do
   {
printf("\n\n\n****GESTION PRODUCTOS DE ALMACEN,MENU DE OPCIONES****");
printf("\n a.Introducir un nuevo producto");
printf("\n b.Borrar un producto")
printf("\n c.Modificar datos de un producto exiztente en el almacen");
printf("\n d.Mostrar todos lo productos en existencia");
printf("\n e.Ordenar la lista de productos segun su nombre");
printf("\n f.Ordenar la lista de productos según sus pesos");
printf("\n s.Salir del programa");
printf("\nElija una opcion");
      scanf("%c",&opcion);
switch(opcion)
  {
  case 's':break;
case 'a':intro_producto(producto,nuproduc);
    break;
case b:printf("\nIntroduce el nombre del producto a borrar: ");
       gets(nombrebuscado);/*Primero busco,por su nombre,el producto a
                             borrar*/
       p=buscar_producto(producto,nuproduc,nombrebuscado);
       if(p!=-1)
          borrar_producto(producto[p])/*Este valor de p es la posición
                                       devuelto la función buscar_producto
Es decir,producto[p] es una estructura*/
       else
   printf("\nProducto no encontrado");
break;    

  /*Faltan las restantes opciones*/
     






}
}while(opcion!='s');
           getch();
              return 0;
« Última modificación: Junio 16, 2008, 09:12:53 por chuidiang » En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #3 en: Junio 16, 2008, 09:10:01 »

Me refería al problema concreto de eliminar la posición del array. ¿Tienes algún problema concreto en ese código o sólo quieres alguna idea de cómo hacerlo?

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #4 en: Junio 16, 2008, 10:31:01 »

Si perdona por haberte puesto todo el código tan horriblemente mal.
Mi problema es que en una de las funciones del código fuente ha de borrar un elemento del array de estructuras que he definido como struct Tgestion productos[50].Primero busco este elemnto por el nombre del producto(que es uno de los campos de la estructura) y una vez encontrado en una determinada posición p borrar esta estructura.

Gracias 
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #5 en: Junio 16, 2008, 10:37:25 »

Hola:

No hay una forma sencilla de borrar un elemento del array. Las opciones son dos:

- En la estructura poner un campo indicando si ese registro es o no válido. Borrar un elemento del array implica marcarlocomo no válido. Realmente no se borra, pero a la hora de buscar, consultar, escribir en pantalla, etc, debe mirarse si ese elemento vale o no vale.
- La otra opción es mover los demás elementos encima de este. Por ejemplo, si tienes 10 elementos y quieres borrar el número 5, lo que hay que hacer es copiar el 6 sobre el 5, el 7 sobre el 6 y así sucesivamente hasta llegar al último, que lo desplazas una posición antes.

Lo primero suele usarse si el array es grande y se guarda en fichero, ya que el borrado en fichero implicaría reescribirlo entero. Lo segundo va bien si trabajas en memoria y no son muchísimos elementos.

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #6 en: Junio 16, 2008, 10:55:43 »

Si la segunda opción es la que más se ajusta a mi caso.Como bien dices no son arrays muy grandes y lo guardo en memoria.
¿Podría servir recorrer el campo nombre(array de caracteres) e ir metiendo el carácter espacio en cada celda.es decir,
                         
Código:
for(i=0;i<20;i++){
                                  nombre[i]=' '
                                  }
?
Y el campo peso y volumen hacerlos 0 directamente.

Gracias por tu ayuda
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #7 en: Junio 17, 2008, 05:39:52 »

Puede valer perfectamente, pero eso se asemeja más a la primera opción, ya que realmente es "marcar" que el elemento no es válido.

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #8 en: Junio 17, 2008, 02:40:27 »

OK
Gracias Chuindiang.
Tiene que ser una cosa sencilla ya que en clase no hemos visto nada de ésto.
Se supone que tienes que pensar en buscarle una solución y la única que veo es la que te he comentado.

Gracias de nuevo
En línea
Páginas: [1] Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!