12 Último

borrar datos de un vector

      • 331
      • mensajes
      • miembro desde
      • 22/08/06
    18/10/2006
    #1 borrar datos de un vector

    hola amigos, como siempre estoy apelando a la sabiduria de todos ustedes para que me saquen de un apuro.
    resulta que estoy haciendo un codigo para un proyecto de fin de año que me mandaron, y en una parte tengo que recorrer un vector comparandolo con otro y cuando los elementos que comparo son iguales necesito borrar el elemento del primer array
    el codigo es mas o menos asi

    for (i=0; i<10; i++)
    {
    for (j=0;j<10; j++)
    {
    if (c[i]==h[j])
    {
    p[i]=c[i];
    aca debo borrar el dato que hay en c[i];
    break:
    }
    }
    }

    probe poniendo c[i]="" pero no funciono
    tambien probe poner del c[i] y menos
    no se , si tienen alguna idea me chiflan

    ahhh, olvide decir que recien estoy aprendiendo y que no tengo demasiada idea+
    gracias y saludos

  1. ¿Este tema te pareció interesante? Compártelo!

    ¿No es lo que buscabas? Intenta buscar un tema similar

    13 comentarios / 155324 Visitas

      • 2,110
      • mensajes
      • miembro desde
      • 22/01/05
    18/10/2006
    #2 Re: borrar datos de un vector

    Para empezar, no podés eliminar un elemento porque eso es un arreglo y tiene siempre la misma cantidad de elementos, lo que si podés hacer es que ese elemento sea cero, o nulo o como le quieras decir.
    Suponiendo que tenés dos arreglos de enteros:

    Código:
    int arreglo1 [ 10 ], arreglo2 [ 10 ];
    // ...
    for ( int i = 0; i < 10; i++ )
       if ( arreglo1 [ i ] == arreglo2 [ i ] )
           arreglo1 [ i ] = 0;
    Y lo otro, si tenés que comparar dos arreglos me suena más lógico comparar elemento a elemento, y no un elemento contra todos los elementos del otro arreglo como hiciste, aunque igual no se que tendrás de proyecto, pero como sea, la cosa es que eliminar el elemento no podés, pero podés hacerlo nulo, lo cual no quiere decir que sea cero, simplemente puede ser un valor que vos nunca uses, si por ej. estás contando los días de la semana del 0 al 6 podrías usar el -1 como elemento nulo por darte un ejemplo.
    Suerte.
      • 4,317
      • mensajes
      • miembro desde
      • 28/02/06
    18/10/2006
    #3 Re: borrar datos de un vector
    Cita Escrito por alfrosende Ver mensaje
    hola amigos, como siempre estoy apelando a la sabiduria de todos ustedes para que me saquen de un apuro.
    resulta que estoy haciendo un codigo para un proyecto de fin de año que me mandaron, y en una parte tengo que recorrer un vector comparandolo con otro y cuando los elementos que comparo son iguales necesito borrar el elemento del primer array
    el codigo es mas o menos asi

    for (i=0; i<10; i++)
    {
    for (j=0;j<10; j++)
    {
    if (c[i]==h[j])
    {
    p[i]=c[i];
    aca debo borrar el dato que hay en c[i];
    break:
    }
    }
    }
    Buenas.. Me llamo Nacho, no suelo postear en este foro, pero vi la pregunta en el Board y decicidi entrar (aunque no kiero saber nada con algoritmos, laburo prorgramando xD)

    ANTES QUE NADA Al pedo usas J podes hacer todo CON I estas usando mas memoria al pedo... mira como keda solo con usando I

    Lo que podes hacer es poner una VARIABLE AUIXILIAR que cuente la cantidad de veces que escribis el VECTOR C (asi sabes cuantos valores tiene) y hacer un FOR donde iguales a 0


    Código:
    for (i=0; i<10; i++)
    {
    if (c[i]==h[i])
    {
    p[i]=c[i];
    c[i]=''; /* otra opcion es igualar a 0 y cuando los imprimis haces un IF que compare, si es IGUAL a CERO no lo imprime*/
    }
    }
    Me serviria MUCHO que me digas cual es OBJETIVO del codigo porquie

    Si lo que queres hacer es poner en un vector C las coincidencias del vector A con el vector B lo estas encarando mal.... ya que en C vas a tener posiciones vacias... (las posiciones que A y B no sean iguales)

    Cita Escrito por ezeaguerre Ver mensaje
    Y lo otro, si tenés que comparar dos arreglos me suena más lógico comparar elemento a elemento, y no un elemento contra todos los elementos del otro arreglo como hiciste, aunque igual no se que tendrás de proyecto,
    Parece ser un ejercicio de Programacion para principiante... onda, manejo de arreglos, Kizas el enunciado es Poner un arreglo los coincidentes de otros dos.

    Si es asi, esta BIEN que compare 1 contra todos, porque si va uno con uno, quizas la posicion 1 del arreglo A es = a la de la posicion 4 del arreglo B.

    Por eso es necesario el enunciado.
      • 331
      • mensajes
      • miembro desde
      • 22/08/06
    18/10/2006
    #4 Re: borrar datos de un vector

    la cosa es asi, en esta parte del proyecto la idea es poner dos conjuntos y mostrar su interseccion, el tema es que si el usuario repite numeros en alguno de los conjuntos (o en los dos), yo lo que quiero es que muestre numeros sin repetir, por ejemplo
    conj A=1, 2,1,6,7
    conj B=1,3,6,9,11,1
    mi idea es tomar el 1 del conj Ay empezar a compararlo con cada uno del B, cuando encuentre el uno en B me lo guarda en otro arreglo, y aunque este repetido en el B el uno no me importa porque le pongo el break despues de guardarlo. el tema es que si el numero esta repetido en A cuando llegue a el lo va a volver a comparar, entonces lo que se me ocurrio es antes de compararlo con el B compararlo consigo mismo y borrar el elemento que se repita (o los elementos)
    lo otro que quiero hacer es mostrar el conjunto solucion ordenado, pero eso me esta complicando, aunque me tiraron un dato de una funcion llamada qsort que estoy tratando de entender
    por ultimo y lo que me tiene peor es que cuando cierro el programa se debe generar un archivo que guarde el nombre del usuario y la fecha en que lo uso, eso si me tiene loco
    con respecto a mis conocimientos, les explico que estoy cursando el primer semestre de tecnico en redes, y no solo que programacion no es una materia con gran carga horaria como para aprender suficiente, sino que el profe tiene menos ganas de dar clases que yo de desfilar para giordano
    lo peor de todo que esto de programar me encanto, y si sera pobre la clase que con lo poco que se soy el que la tiene mas alta en nota
    desde ya muchas gracias por la preocupacion, son todos muy atentos
    saludos

    me olvide de decir que intente poner c[0]=' ', pero me da un error de compilacion, y deje un espacio entre los apostrofes y me compila pero guarda algun dato extraño porque no lo toma como vacio

      • 2,110
      • mensajes
      • miembro desde
      • 22/01/05
    18/10/2006
    #5 Re: borrar datos de un vector

    Hola, bueno, siguiendo tu linea de pensamiento te respondo :

    Lo primero, vos querés eliminar los repetidos en A, lo que podés hacer es crear otro arreglo donde copias los elementos únicos que hay en A, por ej haciendo algo así:

    Código:
    // Una variable auxiliar para no dejar espacios
    int aux = 0;
    
    // Recorro todo el arreglo
    for ( int i = 0; i < 10; i++ )
    {
      // Por cada elemento comparo con todo el arreglo
      // donde estoy copiando los datos
      int j;
      for ( j = 0; j < 10; j++ )
      {
        if ( conjA [ i ] == conjAu [ j ] )
          break;
      }
    
      // Si j = 10 quiere decir que el elemento era único porque
      // se llegó al final del for, entonces lo copio
      if ( j == 10 )
        conjAu [ aux++ ] = conjA [ i ];
    }
    La variable auxiliar te sirve para no dejar espacios entre los elementos del arreglo destino, eso te puede servir si por ej. vos sabés que hay al menos un elemento repetido entonces podés declarar el arreglo destino de 9 elementos que no pasa nada

    Ahora que ya eliminamos los elementos repetidos en el conjunto A podés hacer la comparación con los del B y guardarlo por ej. en C haciendo como vos querías:

    Código:
    int aux = 0;
    for ( int i =0; i < 10; i++ )
    {
      for ( int j = 0; j < 10; j++ )
      {
         if ( conjAu [ i ] == conjB [ j ] )
         {
           conjC [ aux++ ] = conjAu [ i ];
           break;
         }
      }
    }
    entonces ahora conjC contiene los elementos en común en A y B sin repetir ninguno. Este pedazo de código no lo comenté porque es muy parecido a lo que habías hecho, y el aux evita que queden espacios vacíos.

    Ahora para ordenar, no se si sabés usar punteros, ya que lo vas a necesitar para el qsort ( aunque igual es una tontería ), pero para que no te tengas que meter con eso te podés hacer tu propio algoritmo, el más sencillo es el método de ordenamiento por burbuja:

    Código:
    void ordenar ( int arreglo [] )
    {
        for ( int j = 0; j < 9; j++ )
        {
            for ( int i = 0; i < 9; i++ )
            {
                if ( arreglo [ i ] > arreglo [ i + 1 ] )
                {
                    int temp = arreglo [ i ];
                    arreglo [ i ] = arreglo [ i + 1 ];
                    arreglo [ i + 1 ] = temp;
                }
            }
        }
    }
    fijate como es, bien sencillo, basicamente lo que hace es realizar n-1 pasadas por el arreglo de n elementos comparando en cada pasada el elemento i con el i+1 y según cual sea mayor o menor los da vuelta, es decir, copia el elemento i en i+1 y viceversa, el resultado es que los elementos más pesados se van moviendo hacia el final del arreglo y queda ordenado, busca en internet que hay mucha info, pero no es dificil de entender.

    Lo del archivo no es dificil, tenés que usar las funciones fopen para abrir el archivo y fprintf para imprimir en el archivo, y después con fclose lo cerrás, basicamente sin todo el código de manejo de errores sería una cosa así:

    Código:
    FILE *archivo = fopen ( "salida.txt", "wt" );
    fprintf ( archivo, "%s %02d/%02d/%02d\n", usuario, dia, mes, año );
    fclose ( archivo );
    la primer línea abre el archivo y lo asocia con la estructura FILE llamada archivo ( hace de cuenta que ese puntero nunca existió :P ), después imprimie mediante fprintf los datos en el archivo, y por último lo cierra.

    Con respecto a hacer c [ i ] = ' ';, lo que pasa es que le estás asignando el caracter espacio al elemento i del arreglo C, si no me equivoco el caracter espacio es el decimal 32, si estás con un arreglo de caracteres y querés poner el nulo en ese elemento lo que tenés que hacer es c[i]='\0', el cáracter de escape '\0' es el nulo, también podés más fácil hacer c[i]=0;
    El código que puse arriba no es el mejor ni nada de eso, simplemente trate de seguir tu razonamiento paso por paso y de una forma sencilla y entendible, pero ahí hay muchas optimizaciones para hacer
    Espero se haya entendido, Suerte.

    P.D: Busca toda la info que en internet hay

    P.D2: El "wt" del fopen le dice que lo abra para escribir y en modo texto, si querés que el archivo de salida no se sobreescriba tenés que abrirlo para agregar datos al final, eso lo hacés con "at" ( si mal no recuerdo ), siendo la a de append y la t de text ( en el caso anterior la w era de write ).
      • 4,317
      • mensajes
      • miembro desde
      • 28/02/06
    19/10/2006
    #6 Re: borrar datos de un vector

    Listo....

    mejor que Eze imposible

      • 331
      • mensajes
      • miembro desde
      • 22/08/06
    19/10/2006
    #7 Re: borrar datos de un vector

    la verdad que sin palabras, mas que entendible la explicacion y sin duda saben un monbton, ya me lo pongo a estudiar bien para armar lo que me falta.
    che !!! alguno de ustedes no se quiere pegar una vueltita por uruguay y laburar como profe en el ITI de montevideo??? la verdad que estaria barbaro
    bueno, mil gracias por la paciencia y por la explicacion y si no jodo mucho en cualquier momento les escribo cuando me tranque de vuelta (cosa que en cualquier momento estoy seguro volvera a suceder)
    saludos
    jose

      • 4,317
      • mensajes
      • miembro desde
      • 28/02/06
    19/10/2006
    #8 Re: borrar datos de un vector

    hehehehe decime cuanto pagan y te digo....

    yo trabajo progrmando para el banco HSBC si me ofrecen mas......

      • 1,304
      • mensajes
      • miembro desde
      • 09/09/03
    20/10/2006
    #9 Re: borrar datos de un vector
    Cita Escrito por 0sama Ver mensaje
    Listo....

    mejor que Eze imposible
    buena eze, ahora quiero la interseccion ordenada pero recorriendo los vectores una sola vez y la cantidad de vectores es variable

    b. con refactoring llevalo a tipo generico de datos.

    btw. al q creo el post: no podes poner c[i]=' ' en un vector de ints. estas guardando el ascii del espacio y no el espacio.
      • 331
      • mensajes
      • miembro desde
      • 22/08/06
    21/10/2006
    #10 Re: borrar datos de un vector

    muchachos, otro problema:
    en realidad y no me pregunten porque, textualmente lo que me pasaron no funciono y sinceram,ente no recuerdo porque, pero con lo que me explicaron se me ocurrio otra cosa similar
    ingreso los dos conjuntos, cada uno de 10 elementos (cosa que despues tambien tengo que arreglar ya que me pidieron que topeara el numero de elementos, pero tengo que ver como hacer si quiero ingresar menos de 10), luego hallo la interseccion, la cual me queda desordenada y con elementos repetidos, pero ahi ordeno la interseccion con el algoritmo que me explicaron, y luego cada elemento lo comparo con su siguiente, si es igual no pasa nada, pero si es distinto lo guardo en otro vector, y al estar ordenado, en el nuevo vector solo me van a quedar los elemnetos sin repetirse.
    teoricamente me parce que esta bien, y para probarlo ingrese un conjunto, pido que me lo muestre en pantalla y lo muestra barbaro, luego lo ordeno y pido que lo muestre en pantalla cosa que tambien hace barbaro, y por ultimo hago lo que les dije para eliminar los repetidos, pero al mostrarlo en pantalla me pone los elementos sin repetirse y ordenados pero luego de estos me pone una serie de numeros sin sentido como para completar los lugares que quedan vacios en el array

    la prueba me quedo asi:

    ingreso conjunto A= 3 4 1 3 4 6 4 4 6 2

    lo ordeno y queda A= 1 2 3 3 4 4 4 4 6 6

    hago la comparacion y guardo en vector B y cuando lo muestra me pone
    B= 1 2 3 4 6 -1 35 0 8 0

    probe inicializar el vector B con espacios pero me muestra B= 1 2 3 4 6 32 32 32 32 32
    y probe inicializarlo con el caracter nulo y muestra B= 1 2 3 4 6 0 0 0 0 0

    si ven que es muy complicado tirenme una punta para pensarlo por otro lado porque la verdad que ya me estoy desesperando y se me viene la fecha de entrega arriba

    nuevamente gracias

12 Último