[C] Cancellazione di un elemento da una lista

di il
15 risposte

[C] Cancellazione di un elemento da una lista

Salve a tutti! Premetto che sono nuova in questo forum e un po' anche nel campo della programmazione, ma volevo chiedervi un aiuto.
E' da un po' di giorni che sto cercando di capire come effettuare una cancellazione di un elemento da una lista, ma finora non ho ancora trovato spiegazioni che mi convincessero a pieno. Se volessi scrivere una funzione che cancella un elemento da una lista, come dovrei impostarla?

15 Risposte

  • Re: [C] Cancellazione di un elemento da una lista

    Prima di tutto devi mostrare la struttura dati che hai impostato, ovvero mostrarci il codice relativo all'implementazione della tua lista.
    Dopodichè devi spiegarci come vuoi cancellare un elemento: il primo, l'ultimo oppure un elemento che contiene uno specifico dato...
  • Re: [C] Cancellazione di un elemento da una lista

    La traccia dell'esercizio è la seguente:
    Un centro benessere memorizza in una struttura dati in memoria centrale (di dimensione massima 100) l’archivio delle prestazioni effettuate. Per ogni prestazione vengono registrate informazioni su: ?codice prestazione (numerico intero); ?tipo prestazione (stringa: massaggio, smalto, epilazione) ?durata prestazione (numerico intero); ?cognome cliente (stringa); ?cognome operatore (stringa); ?costo (numerico intero). ?data prossimo appuntamento (stringa: ggmmaaaa-hh:mm); Si scriva un programma C che:
    Realizzi la struttura specificata dal testo e completi il main in modo da richiamare opportunamente le funzioni e gestirne i risultati restituiti. Definisca la funzione CaricaDati avente il compito di trasferire il contenuto del file prestazioni.txt nel vettore inizialmente vuoto ElencoPrestazioni passato in ingresso: 1)restituendo, alla fine, il numero di prestazioni caricate 2)stampando a video il cognome del cliente che ha effettuato la prestazione più costosa 3) la funzione deve anche ricevere in ingresso una stringa contenente un tipo di prestazione (richiesto e passata opportunamente dal main) e stampare a video, alla fine del caricamento, quante prestazioni di quel tipo sono presenti nel vettore
    Definisca e richiami la funzione CancellaPrestazione che riceve in ingresso il vettore delle prestazioni ElencoPrestazioni e un numero di prestazione e ne effettua la cancellazione. Per effettuare la cancellazione va sostituito in ElencoPrestazioni il numero della prestazione che si vuole cancellare con il numero 0.
    
     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 100
    #define M 50
    //Structures:
    typedef struct {
        char codice[M];
        char tipo[M];
        int durata;
        char cognome_cliente[M];
        char cognome_operatore[M];
        int costo;
        char data_prox[M];
    }prestazione;
    //Prototypes:
    int caricaDati(prestazione[], char[]);
    void valutacosto(prestazione[], int);
    void stampa(prestazione[], int);
    void cancella(prestazione*, int, int);
    void cancellaPrestazione(prestazione[], int);
    //Main:
    int main (){
        prestazione ElencoPrestazioni[MAX];
        char file1[M]="prestazioni.txt";
        int n_prestazioni=caricaDati(ElencoPrestazioni,file1);
        printf("Totale prestazioni caricate: %d \n", n_prestazioni);
        valutacosto(ElencoPrestazioni,n_prestazioni);
        stampa(ElencoPrestazioni,n_prestazioni);
        cancellaPrestazione(ElencoPrestazioni,n_prestazioni);
        stampa(ElencoPrestazioni,n_prestazioni);
        }
    
    //Functions:
    void valutacosto(prestazione ElencoPrestazioni[], int n){
    int i, max=0;
    for(i=0; i<n; i++){
        if(ElencoPrestazioni[i].costo>ElencoPrestazioni[max].costo){
            max=i;
        }
    }
    printf("Il cliente che ha effettuato la prestazione di maggior costo e' %s. \n", ElencoPrestazioni[max].cognome_cliente);
    }
    int caricaDati(prestazione ElencoPrestazioni[], char file[]){
    FILE *fp;
    int tot=0;
    int costo_max=0;
    fp=fopen(file,"r");
    if(fp==NULL){
        printf("Errore nell'apertura del file. \n");
        system ("PAUSE");
        return 0;
    }else{
    
            while(!feof(fp)){
                fscanf(fp,"%s",ElencoPrestazioni->codice);
                fscanf(fp,"%s",ElencoPrestazioni->tipo);
                fscanf(fp,"%d",&ElencoPrestazioni->durata);
                fscanf(fp,"%s",ElencoPrestazioni->cognome_cliente);
                fscanf(fp,"%s",ElencoPrestazioni->cognome_operatore);
                fscanf(fp,"%d",&ElencoPrestazioni->costo);
                fscanf(fp,"%s",ElencoPrestazioni->data_prox);
                ElencoPrestazioni++;
                tot++;
            }
    
            fclose(fp);
    }
    
            return tot;
    }
    void stampa(prestazione ElencoPrestazioni[], int n){
    int i;
    printf("Elenco prestazioni: \n");
    for(i=0; i<n; i++){
        printf("Prestazione %d: \n", i+1);
        printf("Codice:%s \tTipo:%s \tDurata:%d \tCognome cliente:%s \tCognome operatore:%s \tCosto:%d \tData prossimo appuntamento:%s \n",
               ElencoPrestazioni[i].codice,ElencoPrestazioni[i].tipo,ElencoPrestazioni[i].durata,ElencoPrestazioni[i].cognome_cliente,ElencoPrestazioni[i].cognome_operatore,ElencoPrestazioni[i].costo,ElencoPrestazioni[i].data_prox);
    }
    }
    void cancella(prestazione *ElencoPrestazioni, int indice, int n){
    
    
    
    }
    
    
    void cancellaPrestazione(prestazione ElencoPrestazioni[], int n){
    int n_prestazione;
    prestazione *curr;
    prestazione *next;
    int cancellate=0;
    do{
        printf("Inserire un numero di prestazione: \n");
        scanf("%d", &n_prestazione);
    }while((n_prestazione<=0)||(n_prestazione>n));
    int i;
    for(i=0; i<n; i++){
        if(i==n_prestazione){
            cancella(ElencoPrestazioni,n_prestazione,n);
            cancellate++;
        }
    }
        printf("Sono state cancellate %d prestazioni: \n", cancellate);
        printf("Prestazione n.%d \n", n_prestazione);
    }
    
  • Re: [C] Cancellazione di un elemento da una lista

    Il crossposting qui è vietato ...

    "forum.html.it/forum/showthread.php?threadid=2935025&s=cc29aa0def1029f84f8184e891ad44fa"
  • Re: [C] Cancellazione di un elemento da una lista

    Ah, scusatemi allora!
    Volevo semplicemente una risposta, poi qui ho esposto il problema in maniera più lineare, non pensavo potesse essere vietato.. vorrei soltanto ricevere qualche dritta
  • Re: [C] Cancellazione di un elemento da una lista

    Ho un esame tra pochi giorni, per favore..
  • Re: [C] Cancellazione di un elemento da una lista

    Non si capisce quale sia il tuo dubbio dato che è scritto chiaramente
    Per effettuare la cancellazione va sostituito in ElencoPrestazioni il numero della prestazione che si vuole cancellare con il numero 0.
  • Re: [C] Cancellazione di un elemento da una lista

    candaluar ha scritto:


    Non si capisce quale sia il tuo dubbio dato che è scritto chiaramente
    Per effettuare la cancellazione va sostituito in ElencoPrestazioni il numero della prestazione che si vuole cancellare con il numero 0.
    Il problema è che quando vado ad eseguirlo, mi dà errore se scrivo ElencoPrestazioni = 0 e, se invece scrivo i=0, non mi dà errore ma non effettua nessuna cancellazione
  • Re: [C] Cancellazione di un elemento da una lista

    ElencoPrestazioni[] è un array di strutture e quindi devi scrivere ElencoPrestazioni[ i ].qualcosa = 0
  • Re: [C] Cancellazione di un elemento da una lista

    candaluar ha scritto:


    ElencoPrestazioni[] è un array di strutture e quindi devi scrivere ElencoPrestazioni[ i ].qualcosa = 0
    Il problema si ripresenta anche dopo aver fatto:
    int j; 
    j=atoi(ElencoPrestazioni[i].codice); 
    j=0; 
    
  • Re: [C] Cancellazione di un elemento da una lista

    L'esercizio parla di

    "codice prestazione (numerico intero)"

    Perché tu usi una stringa?

    E perché per la data 50 caratteri se l'esercizio ne prevede una quindicina?
  • Re: [C] Cancellazione di un elemento da una lista

    oregon ha scritto:


    L'esercizio parla di

    "codice prestazione (numerico intero)"

    Perché tu usi una stringa?

    E perché per la data 50 caratteri se l'esercizio ne prevede una quindicina?
    Ho usato una stringa perché in esercizi simili il codice lo faceva inserire sempre tramite stringa, devo averlo fatto automaticamente, hai ragione!
    Per quanto riguarda la data, ho assegnato sempre la dimensione definita, senza differenziare ogni volta, anche se così spreco indubbiamente più memoria inutilmente
  • Re: [C] Cancellazione di un elemento da una lista

    Quindi, dopo che apporti le correzioni, ti basta

    ElencoPrestazioni.codice = 0;
  • Re: [C] Cancellazione di un elemento da una lista

    oregon ha scritto:


    Quindi, dopo che apporti le correzioni, ti basta

    ElencoPrestazioni.codice = 0;


    Perfetto, ho risolto!
    Ora devo svolgere la terza parte dell'esercizio: Definisca e richiami la funzione SchedaOperatore che, a partire dal vettore delle prestazioni ElencoPrestazioni, stampi la scheda di un particolare operatore contenente le seguenti informazioni: ?Il numero di prestazione effettuate ?Il guadagno totale ?L’elenco dei clienti serviti (va bene se il nome compare più volte. BONUS se ciò non accade) ?Le ore totali lavorate NON vanno conteggiate le prestazioni cancellate! (cioè con codice prestazione =0) Inoltre la stampa della scheda deve avvenire su un file il cui nome è scelto dall’utente nel main e passato come stringa in ingresso alla funzione.

    Io avevo pensato di procedere in questo modo, ma c'è qualcosa che non mi torna:
    Nel main ho scritto:
     char file2[M]="scheda.txt";
        char cognome_op[M];
        do{
            printf("Inserire cognome operatore desiderato: \n");
            scanf("%s", cognome_op);
        }while(!(strcmp(ElencoPrestazioni->cognome_operatore,cognome_op)==0));
        schedaOperatore(ElencoPrestazioni,n_prestazioni,cognome_op,file2);
    
    Poi la funzione l'ho implementata così:
    
    void schedaOperatore(prestazione *ElencoPrestazioni, int n, char cognomeop[], char file[]){
        FILE *f;
        f=fopen(file,"w");
        if(f==NULL){
            printf("Errore");
            return;
        }else{
        char cognome_op[M];
        int prestazioni=0, ore=0, guadagno=0;
        int i, j;
        int doppioni=0;
    
        fprintf(f,"Cognome operatore: %s \n", cognome_op);
        printf("Cognome operatore: %s \n", cognome_op);
        printf("Clienti serviti:\n");
        fprintf(f,"Clienti serviti:\n");
        for(i=0; i<n; i++){
                if(strcmp(ElencoPrestazioni[i].cognome_operatore,cognome_op)==0){
                printf("%s", ElencoPrestazioni[i].cognome_cliente);
                fprintf(f,"%s", ElencoPrestazioni[i].cognome_cliente);
                prestazioni++;
                guadagno+=ElencoPrestazioni[i].costo;
                ore+=ElencoPrestazioni[i].durata;
            }
        }
        printf("Totale prestazioni effettuate:%d Totale ore:%d Totale guadagno:%d \n", prestazioni,ore,guadagno);
        fprintf(f,"Totale prestazioni effettuate:%d Totale ore:%d Totale guadagno:%d \n", prestazioni,ore,guadagno);
    fclose(f);
        }
    }
  • Re: [C] Cancellazione di un elemento da una lista

    Questo thread riguardo la cancellazione... non puoi parlare di ogni problema qui..
Devi accedere o registrarti per scrivere nel forum
15 risposte