PDA

Visualizza la versione completa : [C] eliminare doppioni in un array 1d, con array di appoggio HELP!


Alessio86
08-02-2008, 17:50
questa e la versione con array di appoggio che pero nn mi funziona , mi potete dare 1 mano grazie ? l' array e ia ordinato

array = 3 3 5 8 8 9 9
il risultato dovrebbe essere
array 3 5 8 9

mi potete aiutare grazie






void eliminazione_duplicati (int *array1D, int *size, int flag)
{
int i=0,j=0,k=0;
int k_n=0;
int temp[maX];

for(i=0;i<*size;i++)
{
for(j=i+1;j<*size;j++)
{
if (array1D[i]!=array1D[j] && i!=(*size-2))
{
temp[k]=array1D[i];
k_n++;
k++;
}
if(i==(*size-1))
{
array1D[i];

}
}
}

oregon
08-02-2008, 20:42
In questo codice manca una parentesi chiusa finale e non mostri il main ... ci vuole molto piu' tempo per aiutarti se non posti (e non spieghi) cosa fa passo passo il tuo codice ...

Ad esempio, spiega perche' passi size per indirizzo e perche' passi un parametro (flag) che non utilizzi ...

Alessio86
08-02-2008, 22:09
ecco l'algoritmo completo , funziona ma nn mi piace molto lo avrei voluto fare senza array_temp che l'array di appoggio ma nn lo riesco a creare, mica mi puoi aiutare .....
ti passo l' intero algoritmo con il main e commenti

grazie



#include "stdlib.h"
#include "stdio.h"
#define maX 100
void inserimento_array(int *array1D, int size); //Inserisco i valori
void ordinamento (int *array1D, int size); //Ordino l'array
void eliminazione_duplicati (int *array1D, int *size, int flag); //Elimino i duplicati
void stampa(int *array1D,int size); //Stampo l' array

int main()
{
int array1D[maX]; //Array utilizzato
int size=0; //Size dell' array deciso tramite scanf
int flag=0; //Flag per gestire il size durante l' eliminazione dei doppioni
printf("Inserire quanti valori vuoi inserire\t");
scanf("%d",&size);
inserimento_array(array1D,size); //Richiamo funzione inserimento
system("cls");
printf("L'array ordinato con i valori ancora non controllati \n\n");
ordinamento(array1D,size); //Richiamo funzione ordinamento
stampa(array1D,size); //Richiamo funzione stampa
printf("\tSize %d",size);
printf("\n\nL'array ordinato con i valori controllati \n\n");
eliminazione_duplicati( array1D,&size,flag); //Richiamo funzione eliminazione
stampa(array1D,size); //Richiamo funzione stampa
printf("\tSize %d",size);
printf("\n\n");

return 0;
}


void inserimento_array(int *array1D, int size) //Inserisco i valori tramite I\O
{
int i=0;
printf("\n");
for(i=0;i<size;i++)
{
printf("Inserire il valore da tastiera\t");
scanf("%d",&array1D[i]);
printf("\n");
}
}


void ordinamento (int *array1D, int size) //Ordinamento array
{
int i=0;
int j=0;
int temp=0;
for (i=0;i<size;i++)
{
for (j=i;j<size;j++)
{
if(array1D[i] > array1D[j] )
{
temp=array1D[i];
array1D[i]=array1D[j];
array1D[j]=temp;
}
}
}
}



void stampa(int *array1D,int size) //Stampa array
{
int i=0;
printf("Array= {");
for (i=0;i<size;i++)
{
printf("[%d]",array1D[i]);
}
printf("}");
}



void eliminazione_duplicati (int *array1D, int *size, int flag)
{
//Appoggia sull' array temp solo uno dei valori uguali oltre che a tutti quelli che nn vengono ripetuti piu di 1 volta
int i,j,k=0;
int k_n=0,flag_t=0;
int array_temp[maX];

for(i=0;i<*size;i++)
{
flag_t=0;

for(j=i+1;j<*size;j++)
{
if (array1D[i]==array1D[j])
{
flag_t=1;

}

}
if (flag_t!=1)
{
array_temp[k]=array1D[i];
k_n++;
k++;
}
}
k=0;
for (i=0;i<k_n;i++)
{
array1D[i]=array_temp[k];
k++;
}

*size=k_n;
}

Alessio86
08-02-2008, 22:15
allora gli passo il size perche poi nel main oltre a mostrare l'array base col size lo devo rimostrare con senza valore e col size aggiornato , quindi per evitare di creare una seconda variabile
mentre il flag lo uso per indicare se nell' array ci sono valori simili a quelli all' i-esimo passo di I

oregon
08-02-2008, 23:22
La variabile flag non serve a nulla ...

Il codice potrebbe essere



void eliminazione_duplicati(int *array1D, int *size)
{
int i, j;
for(i=0; i<(*size)-1; i++)
if(array1D[i] == array1D[i+1])
{
(*size)--;
for(j=i+1; j<(*size); j++)
array1D[j-1] = array1D[j];
}
}

Alessio86
08-02-2008, 23:33
la funzione va anche bene se l' ultimo numero e uguale a quello precedente


L'array ordinato con i valori ancora non controllati

Array= {[4][4][5][7][7][8][9][9]} Size 8

L'array ordinato con i valori controllati

Array= {[4][5][7][8][9]} Size 5

Premere un tasto per continuare . . .



xche se come qui


L'array ordinato con i valori ancora non controllati

Array= {[4][6][6][7][8][9][9][10]} Size 8

L'array ordinato con i valori controllati

Array= {[4][6][7][8][9][9]} Size 6

Premere un tasto per continuare . . .


come puoi vedere il 10 lo elimina e mi ripete 2 volte il 9

oregon
09-02-2008, 00:03
Correggi questa linea cosi'

for(j=i+1; j<(*size)+1; j++)

Alessio86
09-02-2008, 00:12
nn va ancora xche nel caso peggiore ovvero dove i valori sono tutti uguali ho questo risultato




L'array ordinato con i valori ancora non controllati

Array= {[5][5][5][5][5]} Size 5

L'array ordinato con i valori controllati

Array= {[5][5][5]} Size 3

Premere un tasto per continuare . . .

oregon
09-02-2008, 00:50
Okay ... quindi



void eliminazione_duplicati(int *array1D, int *size)
{
int i, j, f=1;

while(1)
{
for(i=0; i<(*size)-1; i++)
{
if(array1D[i]==array1D[i+1])
{
f=0;

(*size)--;
for(j=i+1;j<(*size)+1;j++)
array1D[j-1]=array1D[j];
}
}

if(f) break; else f=1;
}
}

Alessio86
09-02-2008, 00:59
funziona.... sei un grande

la mia versione dava problemi in caso l' ultimo valore era diverso dal precedente e usavo 4 if per controllare se i era <size altrimenti usavo un ulteriore if ma anche in quel caso mi dava problemi




grazie ancora :)

Loading