Domanda Procedura per cancellare in C

Barcellona8

Utente Iron
21 Dicembre 2021
13
2
0
7
Buongiorno a tutti, mi servirebbe un aiuto!!
Ho una struttura di vari soggetti generati casualmente.. dovrei fare una procedura che mi permetta di cancellare uno di questi, come posso fare?..sapreste aiutarmi per favore?..
 
Ultima modifica:
Un array.. Listasoggetti di 4
Se è un array dinamico basta che lo scorri tutto e poi fai retrocedere di una posizione tutti gli elementi successivi a quello da eliminare, poi fai una rialloc, poi decrementi la variambile che hai utilizzato per il numero di celle di 1 e lo rendi tramite la funzione. questo è il metodo più semplice
 
Ultima modifica:
Purtroppo sono un novello in c e non saprei proprio come si farebbe.. forse ho capito la tua spiegazione, ma metterlo in pratica non sembra tanto facile
Messaggio unito automaticamente:

Purtroppo sono un novello in c e non saprei proprio come si farebbe.. forse ho capito la tua spiegazione, ma metterlo in pratica non sembra tanto facile
Messaggio unito automaticamente:

Anche perchè non devo usare nessuna allocazione dinamica, devo solo eliminare un soggetto dato il suo indice.. quale potrebbe essere la funzione?
 
Ultima modifica:
Purtroppo sono un novello in c e non saprei proprio come si farebbe.. forse ho capito la tua spiegazione, ma metterlo in pratica non sembra tanto facile
Messaggio unito automaticamente:

Purtroppo sono un novello in c e non saprei proprio come si farebbe.. forse ho capito la tua spiegazione, ma metterlo in pratica non sembra tanto facile
Messaggio unito automaticamente:

Anche perchè non devo usare nessuna allocazione dinamica, devo solo eliminare un soggetto dato il suo indice.. quale potrebbe essere la funzione?
la funzione è uguale in entrambi i casi.
comunque c'è un utile discussione sul forum di ubuntu: https://forum.ubuntu-it.org/viewtopic.php?t=123617
C:
int elimina(int lista[], int dimensione_array, int valore)
{
   int i;

  for (i = 0; i < dimensione_array; i++)
    if (lista[i] == valore){
        for (; i < dimensione_array - 1;i++)
          lista[i] = lista[i+1];
          i++;
    }
    return dimensione_array-1;
}
 
Ultima modifica:
la funzione è uguale in entrambi i casi

riusciresti a dirmi come funzionerebbe?
intanto provo a implementarla
si, tranquillamente.
C:
int elimina(int lista[], int dimensione_array, int valore){ // dichiaro il corpo della funzione con tre parametri di ingresso
   int i; // dichiaro una variabile indice

  for (i = 0; i < dimensione_array; i++) // avvio un ciclo che arriva fino alla dimensione del vettore che viene passata alla funzione
    if (lista[i] == valore){ // controllo se effettivamente il valore sia presente all'interno dell'array
        for (; i < dimensione_array - 1;i++)// avvio un ciclo per sovrascrivere il valore con quelli successivi spotando tutti i valori successivi di una posizione indietro
          lista[i] = lista[i+1];
          return dimensione_array-1; // rendo la dimensione del vettore-1 per non calcolare la cella non più utilizzata
    }
    return dimensione_array; // rendo la dimensione del vettore perché non era presente quel elemento
}
Dimmi se ti servono ulteriori info
 
Complimenti, e grazie, ora con questa spiegazione super dettagliata provo ad implementarla all'interno di una procedura e non funzione(ma poco cambia).. spero di riuscirci..
 
la funzione è uguale in entrambi i casi.
comunque c'è un utile discussione sul forum di ubuntu: https://forum.ubuntu-it.org/viewtopic.php?t=123617
C:
int elimina(int lista[], int dimensione_array, int valore)
{
   int i;

  for (i = 0; i < dimensione_array; i++)
    if (lista[i] == valore){
        for (; i < dimensione_array - 1;i++)
          lista[i] = lista[i+1];
          i++;
    }
    return dimensione_array-1;
}
L'istruzione i++ alla sesta riga non serve, in compenso se vuoi che la procedura funzioni anche in caso in cui valore non sia contenuto in lista potresti modificare il codice in questo modo:
C:
int elimina(int lista[], int dimensione_array, int valore)
{
    int i;
    for (i = 0; i < dimensione_array; i++)
        if (lista[i] == valore) {
            for (; i < dimensione_array - 1; i++)
                lista[i] = lista[i + 1];
            return dimensione_array - 1; // ho cancellato un elemento
        }
    return dimensione_array; // non ho cancellato niente
}

Nel thread immediatamente sotto a questo c'è un'implementazione simile che cancella tutti i valori invece che solo il primo. Comunque, consiglio a @Barcellona8 di postare un po' di codice. Non perché non siamo capaci di aiutarti altrimenti, ma per una questione di rispetto verso chi è disposto ad aiutarti. Capisco che è un esercizio scolastico e non vuoi farti beccare a copiare da internet, ma proprio perché è un esercizio e non una verifica non dovrebbe esserci niente di male a chiedere aiuto... a patto che sia un aiuto e non un copia&incolla.

Hai trovato gente che non si fa problemi a scriverti le soluzioni complete, puoi approfittarne per fare copia&incolla e vedere finché dura oppure puoi provare ad usare il forum come supporto all'apprendimento, ulteriore alla scuola. Nel thread dove chiedevi aiuto su come criptare e decriptare una stringa ti sei beccato un codice pronto da copia&incollare e non eri comunque autonomo nell'applicarlo sul tuo array bidimensionale o nel costruire la funzione inversa (che poi non serviva nemmeno). In generale su questo forum siamo più propensi a fornire aiuto leggendo un tentativo di soluzione dell'utente e spiegandogli dove ha sbagliato; poi vabbé, se l'utente non riesce ad arrivare alla soluzione, come hai già notato, non ci facciamo troppi scrupoli a postare tutto quanto. Non voglio sembrare arrogante, ma se vuoi imparare troverai gente disposta a spiegare, se vuoi copiare sappi la pacchia dura finché dura.
 
Hai perfettamente ragione, chiedo scusa..
Sinceramente non faccio copia incolla, anche perché i codici non sono tutti uguali.. ma cerco di ragionarci e implementare e modificarle nel modo migliore..
Grazie per il consiglio..
 
L'istruzione i++ alla sesta riga non serve, in compenso se vuoi che la procedura funzioni anche in caso in cui valore non sia contenuto in lista potresti modificare il codice in questo modo:
C:
int elimina(int lista[], int dimensione_array, int valore)
{
    int i;
    for (i = 0; i < dimensione_array; i++)
        if (lista[i] == valore) {
            for (; i < dimensione_array - 1; i++)
                lista[i] = lista[i + 1];
            return dimensione_array - 1; // ho cancellato un elemento
        }
    return dimensione_array; // non ho cancellato niente
}

Nel thread immediatamente sotto a questo c'è un'implementazione simile che cancella tutti i valori invece che solo il primo. Comunque, consiglio a @Barcellona8 di postare un po' di codice. Non perché non siamo capaci di aiutarti altrimenti, ma per una questione di rispetto verso chi è disposto ad aiutarti. Capisco che è un esercizio scolastico e non vuoi farti beccare a copiare da internet, ma proprio perché è un esercizio e non una verifica non dovrebbe esserci niente di male a chiedere aiuto... a patto che sia un aiuto e non un copia&incolla.

Hai trovato gente che non si fa problemi a scriverti le soluzioni complete, puoi approfittarne per fare copia&incolla e vedere finché dura oppure puoi provare ad usare il forum come supporto all'apprendimento, ulteriore alla scuola. Nel thread dove chiedevi aiuto su come criptare e decriptare una stringa ti sei beccato un codice pronto da copia&incollare e non eri comunque autonomo nell'applicarlo sul tuo array bidimensionale o nel costruire la funzione inversa (che poi non serviva nemmeno). In generale su questo forum siamo più propensi a fornire aiuto leggendo un tentativo di soluzione dell'utente e spiegandogli dove ha sbagliato; poi vabbé, se l'utente non riesce ad arrivare alla soluzione, come hai già notato, non ci facciamo troppi scrupoli a postare tutto quanto. Non voglio sembrare arrogante, ma se vuoi imparare troverai gente disposta a spiegare, se vuoi copiare sappi la pacchia dura finché dura.
Giustamente, l'ho scritto in velocità e manco lo realmente riletto, correggo subito, grazie per avermi ricordato gli errori che non ho corretto