Aiuto esercizio con struct

di il
9 risposte

Aiuto esercizio con struct

Buongiorno, non riesco a svolgere un esercizio con una struct, ovvero devo creare una lista di elemnti e alla fine eliminare gli elementi che non mi servono dalla lista. In questo caso si tratta di gestire i codici di prenotazioni di una compagnia aerea e di eliminare i clienti tramite il codice di prenotazione. Non rieso ad eliminare i clienti giusti poichè elimina sempre l'ultimo cliente della lista.
Posto il codice in attesa di delucidazioni

int main(int argc, char** argv) {
    int n;
    cout<<"Inserire il numero di prenotazioni da verificare: ";
    cin>>n;
    while(n<1){
        cout<<"Numero non valido. Reinserisci il numero di prenotazione da verificare: ";
        cin>>n;
    }
    prenotazione vet[n];
    input(vet, n);
    sort(vet, n);
    print(vet, n);
    elimina(vet, n);
    n=n-1;
    //sort(vet, n);
    print(vet, n);
    return 0;
}

#ifndef NEWFILE_H
#define NEWFILE_H
struct prenotazione{
    char identif_volo[30];
    char cognome[20];
    char nome[20];
    int  cod_pren;
};
void input(prenotazione v[], int);
void sort(prenotazione v[], int);
void print(prenotazione v[], int);
void elimina(prenotazione v[], int);

#endif

void input(prenotazione v[], int dim){
    for(int i=0; i<dim; i++){
        cout<<"Inseirire l'identificazione volo: "<<endl;
        cin>>v[i].identif_volo;
        cin.ignore(100, '\n');
        cout<<"Inserire il cognome del passeggero: "<<endl;
        cin.getline(v[i].cognome, 20);
        cout<<"Inserire il nome del passeggero: "<<endl;
        cin.getline(v[i].nome, 20);
        cout<<"Inserire il codice di prenotazione: "<<endl;
        cin>>v[i].cod_pren;
        cout<<endl;
    }
}
void sort(prenotazione v[], int dim){
   for (int t=0; t<dim; t++)
        for (int i=dim-1; i>t; i--)
            if (v[i].cod_pren < v[i-1].cod_pren)
                swap (v[i], v[i-1]);
}
void print(prenotazione v[], int dim){
    char incogn[2], innome[2];
    for(int i=0; i<dim; i++){
        strncpy(incogn, v[i].cognome, 1);
        strncpy(innome, v[i].nome, 1);
        cout<<"Iniziali del passeggero: "<<incogn<<"."<<innome<<"."<<endl;
        cout<<"Identificazione volo: "<<v[i].identif_volo<<endl;
        cout<<"Codice di prenotazione: "<<v[i].cod_pren<<endl;
        cout<<endl;
    }
}
void elimina(prenotazione v[], int dim){
    int x, pos;
    bool trovato=false;
    cout<<"Inserire il codice di prenotazione da eliminare: "<<endl;
    cin>>x;
    for(int i=0; i<dim; i++){
        if(v[i].cod_pren==x){
            trovato=true;
            pos=i;
            for(i=pos; i<dim-1; i++){
                v[i].cod_pren=v[i+1].cod_pren;
            }
        }
    }
}
HO postato tre codice poiche stavo sviluppando il programma in maniera modulare.

9 Risposte

  • Re: Aiuto esercizio con struct

    Quindi il problema secondo te è nella funzione elimina?

    Cosa fai quando esegui il programma? Cosa succede? Spiega meglio cosa accade ...
  • Re: Aiuto esercizio con struct

    oregon ha scritto:


    Quindi il problema secondo te è nella funzione elimina?

    Cosa fai quando esegui il programma? Cosa succede? Spiega meglio cosa accade ...
    Accade che elimino il codice che desidero, ma elimina l'ultimo cliente della lista, scalando di codice.
    esempio:
    cliente 1)
    identificazione volo: po8
    Nome: franco
    Cognome: rossi
    codice di prenotazione 8
    cliente 2)
    identificazione volo: po1
    nome: francesco
    cognome: neri
    codice prenotazione: 1
    cliente 3)
    identificativo volo: po5
    nome: roberto
    cognome: bianchi
    codice di prenotazione: 5
    Ora il programma li ordina e stampa in ordine di codice di prenotazione crescente quindi:
    identificazione volo: po1
    nome: francesco
    cognome: neri
    codice prenotazione: 1

    identificativo volo: po5
    nome: roberto
    cognome: bianchi
    codice di prenotazione: 5

    identificazione volo: po8
    Nome: franco
    Cognome: rossi
    codice di prenotazione: 8

    elimino il codice 5 ed ottengo:

    identificazione volo: po1
    nome: francesco
    cognome: neri
    codice prenotazione: 1

    identificativo volo: po5
    nome: roberto
    cognome: bianchi
    codice di prenotazione: 8

    e termina il programma.
  • Re: Aiuto esercizio con struct

    (Doppio)
  • Re: Aiuto esercizio con struct

    oregon ha scritto:


    Ti ho chiesto maggiori dettagli, magari un esempio, perché non riesco ad avere il tuo problema.

    Il codice per visualizzare le iniziali è sbagliato ma il problema della cancellazione non mi è capitato.

    Ci fai un ESEMPIO pratico di dati inseriti e di cosa succede?
    fatto, stavo aggiornando il post di prima con maggiore dettagli
  • Re: Aiuto esercizio con struct

    Ovvio che succede ... Quando trovi il codice da eliminare tu sposti solo il codice

    v[ i ].cod_pren = v[i + 1].cod_pren;

    ma non gli altri dati ...
  • Re: Aiuto esercizio con struct

    oregon ha scritto:


    Ovvio che succede ... Quando trovi il codice da eliminare tu sposti solo i codice

    v.cod_pren = v[i + 1].cod_pren;

    ma non gli altri dati ...


    Ah gisuto, bastava fare v=v[i-1], così sposto tutto ed elimino il cliete che non serve. Per curiosità perchè hai detto che il codice per visualizzare le iniziali è sbagliato? come posso migliorarlo? Te lo chiedo perchè funziona come l'ho scritto io..
  • Re: Aiuto esercizio con struct

    No non funziona ovvero non è corretto, controlla bene (studia meglio come funzionano le stringhe in C).

    Puoi scrivere
    
    void print(prenotazione v[], int dim){
        for(int i=0; i<dim; i++){
            cout<<"Iniziali del passeggero: "<<v[i].cognome[0]<<"."<<v[i].nome[0]<<"."<<endl;
            cout<<"Identificazione volo: "<<v[i].identif_volo<<endl;
            cout<<"Codice di prenotazione: "<<v[i].cod_pren<<endl;
            cout<<endl;
        }
    }
    
  • Re: Aiuto esercizio con struct

    oregon ha scritto:


    No non funziona ovvero non è corretto, controlla bene (studia meglio come funzionano le stringhe in C).

    Puoi scrivere
    
    void print(prenotazione v[], int dim){
        for(int i=0; i<dim; i++){
            cout<<"Iniziali del passeggero: "<<v[i].cognome[0]<<"."<<v[i].nome[0]<<"."<<endl;
            cout<<"Identificazione volo: "<<v[i].identif_volo<<endl;
            cout<<"Codice di prenotazione: "<<v[i].cod_pren<<endl;
            cout<<endl;
        }
    }
    
    Non lo so, io conoscevo questo codice, oppure fare v.nome[0]<<"."<<v.cognome[0]...
  • Re: Aiuto esercizio con struct

    V[ i ].cognome[0]

    è corretto, quelle linee con le stringhe no. Rifletti sul perché.
Devi accedere o registrarti per scrivere nel forum
9 risposte