Shift in un array

di il
7 risposte

Shift in un array

Ciao ragazzi, ho un problema con una funzione in c.
Ho un array di dimensione SIZE nel quale inserisco da tastiera gli elementi.
Ho creato la funzione "removed" che elimina un dato elemento e shifta i restanti elementi dell'array, mettendo "zero" nell'ultima posizione lasciata libera:

questo è la funzione:

int removed(int A[], int k){
    int i,j;
    
    printf("inserisci elemento da eliminare:\n\n");
    scanf("%d", &k);
    
    for(j=0; j<=SIZE-1 && A[j]!=k; j++){
             if(j<SIZE-1){
                          for(i=j; i<SIZE-1; i++)
                                   A[i]=A[i+1];
                          for(j=0; j<SIZE-1; j++)
                                   printf("%d", A[j]);
                          }
                          else printf("elemento non trovato\n\n");
                          }
}
non riesco a capire dove sbaglio e come sistemare la funzione.
Grazie per l'aiuto.

7 Risposte

  • Re: Shift in un array

    Nel momento in cui A[j] è uguale a k, il codice all'interno del for non viene eseguito..
  • Re: Shift in un array

    Si ho notato quando viene eseguito, non capisco il motivo
  • Re: Shift in un array

    Non ti è più facile fare un passo per volta?

    Cerchi prima l'elemento da eliminare e ti salvi l'indice, a questo punto tutto è più facile...non credi?
  • Re: Shift in un array

    Ho cambiato il codice in questa maniera:
    
    int removed(int n[], int k){
    	/* Funzione che rimuove dal vettore n[], l'elemento in posizione k.
    	restituisce il vettore n[] senza l'elemento di posizione k, shiftando gli altri elementi
    	e mettendo 0 in ultima posizione vuota */
    	int i,j,pos;
    	int presente = 0;
    	for(i=0; i<SIZE; i++){
    		if(n[i]==k){
    		presente = 1;
    		pos = i;
                   }
        }
        if (presente == 0)
        printf("k = %d non puo' esssere eliminato perche' non presente nel vettore\n",k);
        else {
        	for(j=pos; j<SIZE; j++){
        		n[j]=n[j+1];
        		n[SIZE]=0;
        		printf("%d\n",n);
        	}
        }
        printf("\n");
    }
    
    ho fatto queste modifiche e sembra funzionare, come faccio a stampare il vettore modificato?
  • Re: Shift in un array

    Aleba ha scritto:


    ho cambiato il codice in questa maniera:
    
    int removed(int n[], int k){
    	/* Funzione che rimuove dal vettore n[], l'elemento in posizione k.
    	restituisce il vettore n[] senza l'elemento di posizione k, shiftando gli altri elementi
    	e mettendo 0 in ultima posizione vuota */
    	int i,j,pos;
    	int presente = 0;
    	for(i=0; i<SIZE; i++){
    		if(n[i]==k){
    		presente = 1;
    		pos = i;
                   }
        }
        if (presente == 0)
        printf("k = %d non puo' esssere eliminato perche' non presente nel vettore\n",k);
        else {
        	for(j=pos; j<SIZE; j++){
        		n[j]=n[j+1];
        		n[SIZE]=0;
        		printf("%d\n",n);
        	}
        }
        printf("\n");
    }
    
    ho fatto queste modifiche e sembra funzionare, come faccio a stampare il vettore modificato?
    Non so se lo hai verificato bene perchè quando modifichi l'array il for è impostato bene però la condizione dovrebbe essere j < SIZE - 1 (perchè facendo n[j] = n[j+1] arriveresti a prendere alla fine n[SIZE] che non esiste nel tuo array perchè gli indici arrivano massimo a SIZE-1).
    Proprio per il motivo che ti ho detto a 0 non devi impostare n[SIZE] ma n[SIZE-1] ed inoltre ti conviene farlo fuori e dopo il ciclo for nella condizione dell'else altrimenti fai quest'assegnazione ad ogni ciclo.

    Per quanto riguarda la stampa dell'array non ti basta fare un altro ciclo for o sostituire printf("%d\n",n); (che è del tutto sbagliato) con printf("%d\n",n[j]);
  • Re: Shift in un array

    Certo che con memmove() sarebbe stato più semplice.
  • Re: Shift in un array

    vbextreme ha scritto:


    certo che con memmove() sarebbe stato più semplice.
    Assolutamente ma io credo che intedesse crearlo da 0, non ha chiesto una funzione...
Devi accedere o registrarti per scrivere nel forum
7 risposte