Esercizio di eliminazione di un elemento in un array

di il
21 risposte

Esercizio di eliminazione di un elemento in un array

Ciao a tutti!
Mi scuso per il disturbo. Ho un esercizio da proporvi.. Io l'ho provato a fare ma mi da un sacco di errori.. Propongo cmq la mia soluzione.
Il testo dell'esercizio è il seguente:

Creare i file array.h e array.c che consentano di utilizzare la seguente funzione :

extern void array_remove (double *arr, size_t *pn, size_t pos);

La funzione accetta come parametri un puntatore a un vettore di double arr, un puntatore a un dato di tipo size_t che punta ad una variabile che ne indica la dimensione pn, una posizione pos.
Se la posizione pos è all'interno dell'array, la funzione deve eliminare dall'array l'elemento alla posizione pos spostando indietro di una posizione tutti gli elementi successivi opportunamente. Se riesce ad eliminare un elemento, la funzione deve modificare la variabile contenente la dimensione decrementandola di uno, altrimenti deve lasciare la dimensione inalterata.
Arr e pn non saranno mai NULL. La dimensione dell'array può essere 0.

Allora la mia soluzione è la seguente :

Per il file array_h :

#if!defined ARRAY_H
#define ARRAY_H
#include <stdio.h>

extern void array_remove (double *arr, size_t *pn, size_t pos);

#endif
Per il file array.c invece

#include "array.h" 
#include <stdio.h>

void array_remove (double *arr, size_t *pn, size_t pos)
{
if(pos<= *pn) {
size_t i;
for(i = pos; i < &pn; i++){
      arr[i] = arr[i + 1]; 
}
pn = pn - 1;
}
}
Poi ho creato un main :

#include "array.h"
#include <stdio.h>

size_t DIMENSIONE (double *vett)
{
int i = 0;
for( i = 0; vett[i] != NULL ; i++);
return i;
}

Int main(void)
{
double vettore[] = {1.2 , 7.9 , 4.6 , 8.0 , 5.7 , 10.3 };
size_t DIM = DIMENSIONE(vettore);
size_t posizione = 4;
array_remove (vettore, &DIM, posizione);
}
Il compilatore mi da un errore nel main, in specifico mi dice che non posso convertire void a double nella funzione DIMENSIONE .. Ma se voglio sapere quanti elementi contiene il mio array come faccio a fermare il ciclo for ?! Si ferma di contare quando il mio array è vuoto.. Cioè NULL.. Non so..

Poi mi da un altro errore nel file array.c
Quando faccio il ciclo for mi dice che size_t differisce di livello da size_t ** ?!

Vi prego di scusarmi ma solo alle prime armi con il C.. Non me ne vogliate..
Nell'attesa di una risposta vi ringrazio anticipatamente .

21 Risposte

  • Re: Esercizio di eliminazione di un elemento in un array

    Un double non può essere double.

    Nel tuo caso puoi scrivere

    size_t dim = sizeof(vettore)/sizeof(double);

    P.S. Per le variabili e le funzioni non usare nomi tutti in maiuscolo ...
  • Re: Esercizio di eliminazione di un elemento in un array

    Ok.. Grazie..
    Ho aggiustato il main come mi hai detto:
    
    int main(void)
    {
    double vettore[] = { 1.2 , 7.9 , 4.6 , 8.0 , 5.7 , 10.3 };
    size_t dim = sizeof(vettore) / sizeof(double);
    size_t posizione = 4;
    array_remove (vettore, &dim, posizione );
    }
    
    Ma nel file array.c quando faccio il debug mi fa un ciclo infinito che non esce mai... Come posso aggiustarlo ??
  • Re: Esercizio di eliminazione di un elemento in un array

    Devi confrontare con *pn (cioè il valore puntato da pn), non con &pn (cioé l'indirizzo della variabile pn).
  • Re: Esercizio di eliminazione di un elemento in un array

    Ah si che stupido che sono.. Grazie mille!!
    Un'ultima cosa poi vi lascio stare.. All fine nell'ultima posizione mi dà un valore strano.. Cioè quando ha trovato l'elemento da cancellare, lo sostituisce con l'elemento successivo.
    Poi l'elemento successivo lo sostituisce con quello dopo .. Eccetera fino ad arrivare alla fine..l'ultimo elemento però mi appare strano..
    Come faccio a dirgli di togliere la cella vettore[5] in questo caso ?
  • Re: Esercizio di eliminazione di un elemento in un array

    Perché arrivato a quel punto, prendo l'elemento n-esimo, che è fuori dell'array! Basta fermarti una posizione prima, effettuando quindi un'iterazione in meno. Piuttosto che imporre i < *pn basta fare i < *pn - 1.
  • Re: Esercizio di eliminazione di un elemento in un array

    Ma a questo punto ho due volte l'ultimo l'ultimo elemento..
  • Re: Esercizio di eliminazione di un elemento in un array

    Ovviamente: avendo n posizioni per n-1 elementi, è naturale che ci sia un "doppione". Per tener conto di questa cosa, devi utilizzare una variabile che ti indichi la dimensione reale dell'array, cioè il numero di elementi distinti che sono in esso, e non la sua capacità massima.
    Ogni volta che elimini un elemento dall'array, decrementi di uno tale variabile. In questo modo, puoi limitarti a considerare l'array dalla posizione 0 alla posizione (dim-1)esima.
  • Re: Esercizio di eliminazione di un elemento in un array

    Ah ho capito..
    Quindi devo inizializzazione una variabile
    
    size_t *dim_array = sizeof(pn) / sizeof(double);
    
    E quando entro dentro all'if vuol dire che c'è un elemento da togliere.. Quindi :
    
    dim_array = dim_array - 1;
    
    Però non funziona lo stesso.. Vuol dire che sono imbranato...
  • Re: Esercizio di eliminazione di un elemento in un array

    Scusami, ho riletto ora i primi post, e ho notato che questa operazione tu la fai già con l'istruzione
    pn = pn-1[code]!
    Il problema è che pn è un puntatore, di conseguenza tu stai modificando l'indirizzo a cui punta. Come ti ho detto prima, devi utilizzare i valori puntati da pn, e dunque [code]*pn = *pn - 1;[code].
    
    Ci sono altri problemi?
  • Re: Esercizio di eliminazione di un elemento in un array

    Ah si hai ragione..
    Quindi il codice definitivo sarebbe questo :
    
    void array_remove (double *arr, size_t *pn, size_t pos)
    {
    if(pos <= *pn){
    size_t i;
    for( i = pos; i < *pn - 1; i++)
    { 
        arr[i] = arr[i + 1];
    }
    *pn = *pn - 1;
    }
    }
    
    Il compilatore mi da come risultato di *pn 5 che è giusto.
    Ma alla fine mi appare ancora il doppione dell'ultimo elemento dell'array.
    Vettore[0] = 1.2;
    Vettore[1] = 7.9;
    Vettore[2] = 4.6;
    Vettore[3] = 8.0;
    Vettore[4] = 10.3;
    Vettore[5] = 10.3;
  • Re: Esercizio di eliminazione di un elemento in un array

    Beh, è normale che l'ultimo sia uguale al penultimo dopo lo scorrimento. Ma tu non lo dovresti visualizzare dato che la dimensione dell'array è diminuita di uno.
  • Re: Esercizio di eliminazione di un elemento in un array

    Vorrei che diventasse NULL .. cioè vorrei cancellare la cella vettore[5] ma non so come fare..
  • Re: Esercizio di eliminazione di un elemento in un array

    Main(void)95 ha scritto:


    Vorrei che diventasse NULL .. cioè vorrei cancellare la cella vettore[5] ma non so come fare..
    NULL non può essere dato che è un numero. Te l'avevo già detto ... non è chiara questa cosa?

    Se la vuoi cancellare allora devi usare l'allocazione e la riallocazione dinamica del vettore, e non mi pare tu sappia usarla.

    Del resto l'esercizio non ne parla. Semplicemente NON dovresti visualizzare l'ultima cella dato che la dimensione dell'array è stata decrementata. Come visualizzi gli elementi? Con quale codice?
  • Re: Esercizio di eliminazione di un elemento in un array

    Ah bisognerebbe quindi usare una malloc per allocare dello spazio.. E poi deallocare di una cella ogni volta che si cancella un elemento...
    Il testo però non ne menzionava di usare l'allocazione dinamica...

    oregon ha scritto:


    Come visualizzi gli elementi? Con quale codice?
    In che senso scusa ? .. Scusa la mia ignoranza..
Devi accedere o registrarti per scrivere nel forum
21 risposte