[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