[C con Clase] Ayuda con un programa en C!

Ali Rincon alrincon1963 en hotmail.com
Vie Abr 15 16:40:00 CEST 2016


El pasado 2016-04-14 11:15:43, Salvador Pozo escribió:
 
SP> Hola:
SP> He encontrado algunos errores, algunos no tienen mucha importancia para el funcionamiento del programa, pero habría que corregirlos.
SP> Me refiero a las sentencias que usas para obtener memoria dinámica para los vectores:
SP> vector1=(int *)malloc(nC * sizeof(int *));
SP> Se trata de vectores de enteros, no de punteros a enteros, de modo que en sizeof, el tipo debería ser int, y no int*. El programa funciona porque generalmente, el tamaño de int* es igual o mayor que el de int, pero podría ser al revés, y el resultado no sería tan bueno.
SP> Otro error que veo es que usas valores del vector2 en comparaciones, cuando el contenido de vector2 nunca ha sido iniciado:
SP> --8<----
SP>         vector2[j]=num;
SP>         for(k=0; k<nC; k++)
SP>         {
SP>             if(vector2[k]==num)
SP>             {
SP>                 cont++;
SP>             }
SP>         }
SP> --8<----
SP> El vector2 sólo tiene valores válidos para valores de k menores o iguales que j, de modo que en la mayor parte de las comparaciones el valor es desconocido.
SP> Cuando yo he ejecutado el programa me ha funcionado correctamente, y me ha eliminado los valores repetidos, y no el cero. Pero eso es porque en mi caso, los valores del array vector2 son distintos de cero. En tu caso, sospecho que vector2 contiene ceros, y por eso elimina el cero.
SP> El error está, efectivamente, en el algoritmo que elimina repetidos, pero como desconozco el algoritmo, me resulta difícil saber dónde exactamente.
SP> En cualquier caso, me parece que en el bucle for anterior, el límite final debería ser j, y no nC-1:
SP> --8<----
SP>         vector2[j]=num;
SP>         for(k=0; k<=j; k++)
SP>         {
SP>             if(vector2[k]==num)
SP>             {
SP>                 cont++;
SP>             }
SP>         }
SP> --8<----
SP> Hasta pronto.

Muchisimas gracias Salvador Pozo. Resolviste el problema. Exactamente era lo que tu indicabas. El bucle era k<=j y no como yo lo habia hecho. Por esa razon se comia los ceros el programa. Y tambien tienes razon con relacion a la reserva de memoria dinamica es int solamente y no int*. Esto ultimo no lo sabia. Lo acabo de aprender de Ud. Aqui va nuevamente el codigo para quien le interese:

#include <stdio.h>
#include <stdlib.h>

/**ordenarvector**/

/**Programa que dado un vector de 1fila X N-columnas elimina elementos repetidos y ordena el vector en orden ascendente**/


int main()
{
    int i,j,k,m,nC,num,cont,repetidos;
    int *vector1;
    int *vector2;
    int *vector3;
    char c;

    /**Introduccion del numero de columnas del vector1**/

    printf("Introduzca el numero de columnas del vector1: ");
    scanf("%d", &nC);
    printf("\n");

    while((c=getchar()) != '\n' && c != EOF);

    /**Reserva dinamica de memoria para el vector1[i]**/

    //vector1=(int *)malloc(nC * sizeof(int *));
    vector1 = malloc(nC * sizeof(int));

    if(vector1== NULL)
    {
        printf("Error de memoria\n");
        exit(-1);
    }

   /**Introduccion de los valores del vector**/

    for(i=0; i<nC; i++)
    {
        printf("Introduzca las componentes del vector1[%d]: ",i+1);
        scanf("%d", &vector1[i]);
        printf("\n");
    }

    /**Visualizar el vector**/

    printf("vector1 = ");
    for(i=0; i<nC; i++)
    {
        printf("%d ",vector1[i]);
    }
    printf("\n\n");

    /**Reserva dinamica de memoria para el vector2[i]**/

    //vector2=(int *)malloc(nC * sizeof(int *));
    vector2 = malloc(nC * sizeof(int));

    if(vector2== NULL)
    {
        printf("Error de memoria\n");
        exit(-1);
    }

    /**Reserva dinamica de memoria para el vector3[i]**/

    //vector3=(int *)malloc(nC * sizeof(int *));
    vector3 = malloc(nC * sizeof(int));

    if(vector3== NULL)
    {
        printf("Error de memoria\n");
        exit(-1);
    }

    /**Eliminacion de las componentes repetidas en el vector1**/

    j=0;
    m=0;
    repetidos=0;
    for(i=0; i<nC; i++)
    {
        cont=0;
        num=vector1[i];
        vector2[j]=num;
        for(k=0; k<=j; k++)
        {
            if(vector2[k]==num)
            {
                cont++;
            }
        }
        if(cont==1)
        {
            vector3[m]=num;
            m++;
        }
        else
        {
            repetidos++;
        }
        j++;
    }

    printf("La cantidad de elementos repetidos son: %d",repetidos);
    printf("\n\n");
    printf("El vectorfinal tendra %d elementos",nC-repetidos);
    printf("\n\n");

    /**Visualizar el vector3**/

    printf("vector3 = ");
    for(i=0; i<nC-repetidos; i++)
    {
        printf("%d ",vector3[i]);
    }
    printf("\n\n");

    return 0;
}




SP> _______________________________________________
SP> Lista de correo Cconclase Cconclase en listas.conclase.net
SP> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SP> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase