Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    5

    C ordinare ed eliminare doppi

    Ciao a tutti, sono nuovo del forum e ho subito una domanda da farvi, è una modifica al selection sort in modo che mi elimini gli eventuali doppioni che un utente puo' inserire nel vettore, esempio:
    Input:
    10 10 10 10 10 9 9 8 7 6 5 5

    output
    5 6 7 8 9 10

    La funzione che devo modificare è selectionsort() ecco il codice del programma intero la funzione che deve essere modificata è l'ultima ed è commentata riga x riga.
    Selection sort prende il numero minimo è lo sposta nella prima celle dall'array a[0] e man mano espande la parte sx dell'array (contrario del bubble sort) con i valori in ordine crescente.
    Il codice:

    codice:
    #include<stdio.h>
    #define SIZE 10
    
    void insert(int[], int);
    void selectionsort(int[], int);
    void stampa(int[], int);
    
    int a[SIZE];
    
    int main()
    {
    	
    	int i, j;
    	
    	insert(a, SIZE);
    	printf("Array Originale:\n");
    	stampa(a, SIZE);
    
    	selectionsort(a, SIZE);
    	printf("\n\nStampo l'array ordinato:\n");
    	stampa(a, SIZE);
    	printf("\n");
    	return 0;
    }
    
    /**
    @params: a = Vettore
    	 size = dimensione
    */
    void stampa(int *a, int size)
    {
    	int i;
    	for(i = 0; i < size; i++)
    	{
    		printf("%d ", a[i]);
    	}
    
    
    }
    
    /**
    @params: a = Vettore
    	 size = dimensione
    */
    void insert(int *a, int size)
    {
    
    	int i = 0;
    	for(i = 0; i < size; i++)
    	{
    		printf("Inserisci il valore in posisione %d: " ,i);
    		scanf("%d", &a[i]);
    	}
    
    }
    
    void selectionsort(int *a, int size)
    {
    	int i, j, min, p;
    //primo ciclo esterno for da 0 a size-1 
    for(i = 0; i < size - 1; ++i)
    	{
                    //assena a min il valore dell'array
    		min= a[i];
    
                     // memorizza l'indice nella va p
            	p = i;
    
                    ciclo for interno da i+1(x' il min si trova gia' in a[0]) a size
                    for(j = i + 1; j < size; ++j)
                    {
                    //se il valore dopo è < di quello prima inverti
                            if (a[j] < min)
    			{
    				min = a[j];
    				p = j;
    			}
    }
    a[p]=a[i]; 
    a[i]=min;
    }
    Le 2 funzioni insert() e stampa() permettono la prima l'inserimento dei dati nel vettore (l'utenete Deve avere la possibilità di inserire i doppi, quindi non va modificata), la seconda stampa a video i dati contenuti nell'array.
    Vi prego aiutatemi sono alle primissime armi con la programmazione e sono spiazzato!
    Grazie a tutti

  2. #2
    Utente bannato
    Registrato dal
    Jul 2005
    Messaggi
    49
    è semplice...

    prendi il primo elemento, e li confronti con i successivi, se incontri dei valori concordi, cancelli...

    per cancellare puoi: ho prendere gli elementi successivi al doppione e scorrerli di un posto verso sx oppure crei un nuovo array con tutti gli elementi tranne quello (o quelli) e lo reimposti ad un puntatore

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Potresti modificare la funziona di stampa

    codice:
    void stampa(int *a, int size)
    {
    	int i, last=a[0];
    	printf("%d ", last);
    	
    	for(i = 1; i < size; i++)
    	{
    		if(a[i]!=last)
    		{
    			last=a[i];
    			printf("%d ", last);
    		}
    	}
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    5
    Davvero davvero grazie ma non devo modificare la funzione di stampa ma devo proprio eliminarli durante l'ordinamento quindi la funzione selectionsort().
    Cmq grazie davvero per l'idea

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Devi modificare la SelectionSort eliminando gli elementi "mentre" ordina (piu' complesso e praticamente inutile) o alla fine dell'ordinamento (piu' facile e sensato)?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    5
    Originariamente inviato da oregon
    Devi modificare la SelectionSort eliminando gli elementi "mentre" ordina (piu' complesso e praticamente inutile) o alla fine dell'ordinamento (piu' facile e sensato)?
    Credo la prima ma anche la seconda mi sembra efficace e credo possa andare bene purtroppo sono alle primissime armi con il C e non ho praticamente idea di come si possa implementare se mi date una mano magari anche spiedandomelo sareste gentilissimi .
    Anche se sono convinto che debba essere fatto "mentre" ordina ma se mi dite che è complesso mi fate paura sono ancora troppo inesperto...
    grazie mille a tutti!!

  7. #7
    Utente bannato
    Registrato dal
    Jul 2005
    Messaggi
    49
    Originariamente inviato da thebeat
    Davvero davvero grazie ma non devo modificare la funzione di stampa ma devo proprio eliminarli durante l'ordinamento quindi la funzione selectionsort().
    Cmq grazie davvero per l'idea
    codice:
    void selectionsort(int *a, int &size)
    {
      int i, j, min, p,length;
      length=size;
      //primo ciclo esterno for da 0 a size-1
      for(i = 0; i < size - 1; ++i)
      {
        //assena a min il valore dell'array
        min= a[i];
    
        // memorizza l'indice nella va p
        p = i;
        
        //ciclo for interno da i+1(x' il min si trova gia' in a[0]) a size
        for(j = i + 1; j < size; ++j)
        {
          //se il valore dopo è < di quello prima inverti
          if (a[j] < min)
          {
            min = a[j];
            p = j;
          }
        }
        a[p]=a[i];
        a[i]=min;
      }
      
      //cerco e tolgo le doppie
      int patt;
      length=size;
      for (i=0;i<(length-1);i++)
      {
        patt=a[i];
        for(j=i+1;j<length;j++)
        {
          if (patt==a[j])
          {
            //scorro di un posto gli elementi tra j+1 e length
            for(int k=j+1;k<length;k++)
            {
              size[k-1]=size[k];
              length--;
            }
          }
        }
      }
      
      //ridimensiono l'array creandone uno nuovo
      int *b = new int[length];
      
      for(i=0;i<length;i++)b[i]=a[i];
      size=length;
      a=b;
    
    }

  8. #8
    A mio parere ti conviene ordinare il vettore con un qualsiasi algoritmo di ordinamento e poi stamparlo seguendo alcuni criteri per evitare i doppioni. . . . (vedi codice postato da oregon)




    P.S.
    nel codice di TuTToWeB ci sono un pochetto di errori. . .uno su tutti &size nel prototipo della selectionsort . . .
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  9. #9
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    risposta

    Ciao...ma devi per forza eliminare gli elementi uguali durante l'ordinamento?!?...perchè io avevo pensato che si poteva benissimo farlo subito dopo sempre nella funzione del selection sort (sempre che mi sono ricordato come si faccia...io uso sempre il bouble sort!!)...comunque basta fare dei piccoli shift sul vettore...e elimini i doppioni....guarda io metto il codice...poi se nn ti è utile pazienza...tanto è stato un esercizio anche per me...anche io sono alle prime armi...ciao
    (se potete anche darmi un aiuto a come mettere il codice per la prox volta) ciao...

    void selectionsort(int *a, int *size)
    {
    int i, j, min, tmp;

    for(i = 0; i < *size - 1; ++i) {
    min = i;
    for(j = i + 1; j < *size; ++j) {

    if (a[j] < a[min]) {
    tmp = a[min];
    a[min] = a[j];
    a[j] = tmp;
    }
    }
    }
    for ( i=0; i<*size-1; i++ ) {
    if ( a[i] == a[i+1] ) {
    for ( j=i+1; j<*size-1; j++ ) {
    a[j] = a[j+1];
    }
    (*size)--;
    }
    }
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    5
    Grazie davvero a tutti delle risposte siete gentilissimi ma il problema è che DEVO eliminare i doppi DURANTE la funzione selectionsort.
    Avevo pensato pure io di eliminarli o mentre li inseriva l'utente oppure prima/mentre li stampa ma devo proprio apportare una modifica alla funzione selectionsort() in modo che elimini i doppi e ordini DURANTE l'ordinamento.
    Avevo pensato anche:
    - PRima ordino
    - poi elimino
    - poi stampo il vettore
    ma non va bene deve essere fatto durante
    E' davvero così difficile o sono io che sono davvero davvero un principiante

    Grazie ancora a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.