Ancora le struct...

di il
1 risposte

Ancora le struct...

Raga ho fatto un piccolo esercizio ma ho delle difficolta al momento della stampa dei dati inseriti.. potete darmi qualche consiglio?

posto codice...

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <conio.h>
#include <stdio.h>

using namespace std;

typedef struct {
    int anno;
    int mese;
    int giorno;
} dataNascita_t;

typedef struct {
    char* via;
    int nCivico;
    char* citta;
    char* provincia;
    int cap;
} indirizzo_t;

struct dipendente {
    char* nome;
    char* cognome;
    int matricola;
    char* mansione;
    dataNascita_t data;
    indirizzo_t indirizzo;

    dipendente* succ;
};


////allocaStringa
//char *allocaStringa(string s){
//    char *c = (char *) malloc(s.length() * sizeof(char)+1);
//    return strcpy(c, s.c_str());
//}

void controllaData(int aa, int mm, int &gg) {
    int max_gg = 0;
    if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12) {
        max_gg = 31;
        while (gg < 1 || gg > max_gg) {
            cout << "Inserisci il giorno corretto, max " << max_gg << " giorni: ";
            cin >> gg;
        }
    } else if (mm == 2) {
        if ((aa - 1968) % 4 == 0)
            max_gg = 29;
        else
            max_gg = 28;
        while (gg < 1 || gg > max_gg) {
            cout << "Inserisci il giorno corretto, max " << max_gg << " giorni: ";
            cin >> gg;
        }
    } else {
        max_gg == 30;
        cout << "Inserisci il giorno corretto, max " << max_gg << " giorni: ";
        cin >> gg;
    }
}




//inserire in testa

void ins_testa(dipendente* &il, string nome, string cognome,
        int matricola, string mansione, int aa, int mm, int gg, string via,
        int n_civ, string citta, string prov, int cap) {

    dipendente* dp2 = NULL;
    dp2 = (dipendente *) malloc(sizeof (dipendente));
    
    controllaData(aa, mm, gg);

    dp2->nome = (char *) malloc(nome.length() * sizeof (char) + 1);
    strcpy(dp2->nome, nome.c_str());
    dp2->cognome = (char *) malloc(cognome.length() * sizeof (char) + 1);
    strcpy(dp2->cognome, cognome.c_str());
    dp2->matricola = matricola;
    dp2->mansione = (char *) malloc(mansione.length() * sizeof (char) + 1);
    strcpy(dp2->mansione, mansione.c_str());
    dp2->indirizzo.via = (char *) malloc(via.length() * sizeof (char) + 1);
    strcpy(dp2->indirizzo.via, via.c_str());
    dp2->indirizzo.nCivico = n_civ;
    dp2->indirizzo.citta = (char *) malloc(citta.length() * sizeof (char) + 1);
    strcpy(dp2->indirizzo.citta, citta.c_str());
    dp2->indirizzo.provincia = (char *) malloc(prov.length() * sizeof (char) + 1);
    strcpy(dp2->indirizzo.provincia, prov.c_str());
    dp2->indirizzo.cap = cap;
    dp2->data.anno = aa;
    dp2->data.mese = mm;
    dp2->data.giorno = gg;

    dp2->succ = il;
    il = dp2;
}


//stampa la lista

void stampaLista(dipendente* il) {
    while (il != NULL) {
        cout << "NOME: " << il->nome << endl;
        cout << "COGNOME: " << il->cognome << endl;
        cout << "MATRICOLA: " << il->matricola << endl;
        cout << "MANSIONE: " << il->mansione << endl;
        cout << "ANAGRAFICA: \n";
        cout << "NATO IL: " << il->data.giorno << "-" << il->data.mese << " - "
                << il->data.anno << endl;
        cout << "RESIDENTE IN: \n";
        cout << il->indirizzo.via << ", N. " << il->indirizzo.nCivico << endl;
        cout << il->indirizzo.citta << endl;
        cout << il->indirizzo.cap << endl;
        cout << il->indirizzo.provincia << endl;

        il = il->succ;
    }
    cout << "Premi un tasto per continuare...";
    while (!kbhit());
}

int main(int argc, char** argv) {

    dipendente* il = NULL;
    il = (dipendente *) malloc(sizeof (dipendente));

    il->succ = NULL;


    string nome = "", cognome = "", mansione = "", via = "", citta = "",
            prov = "";
    int matricola = 0, scelta = -1, aa = 0, mm = 0, gg = 0, nCiv, cap;
        
                //se nn inizializzo almeno un elemento  in manuale ottengo stampe
                // sballate?? xke nn stampa correttamente in pgni caso?
  //      il->nome = "Mad";
  //      il->cognome = "Ground";
  //      il->matricola = 0001;
  //      il->mansione = "Direttore";
  //      il->data.anno = 2005;
  //      il->data.mese = 5;
  //      il->data.giorno = 26;
  //      il->indirizzo.via = "G. Verdi";
  //      il->indirizzo.nCivico = 65;
   //     il->indirizzo.citta = "Milano";
  //      il->indirizzo.cap = 57100;
  //      il->indirizzo.provincia = "MI";


    do {
        system("cls");
        cout << "PROGRAMMA GESTIONE DIPENDENTI\n";
        cout << "1. - PER INSERIRE UN NUOVO DIPENDENTE\n";
        cout << "2. - PER STAMPARE LA LISTA DIPENDENTI\n\n";
        cout << "0. - PER USCIRE\n\n\n";

        cout << "SCEGLIERE -> ";
        cin >> scelta;

        switch (scelta) {
            case 1:
            {
                cout << "INSERISCI NUOVO DIPENDENTE\n";
                cout << "NOME: ";
                cin >> nome;
                cout << "COGNOME: ";
                cin >> cognome;
                cout << "MATRICOLA: ";
                cin >> matricola;
                cout << "MANSIONE: ";
                cin >> mansione;
                cout << "\nANAGRAFICA DIPENDENTE: \nDATA DI NASCITA:\n";
                cout << "ANNO: ";
                cin >> aa;
                cout << "MESE: ";
                cin >> mm;
                while(mm < 1 || mm > 12){
                    cout << "Errore inserire mese corretto, tra 1 e 12: ";
                    cin >> mm;
                }
                cout << "GIORNO: ";
                cin >> gg;
                cout << "INDIRIZZO: ";
                cin >> via;  //come fargli prendere piu nomi separati?
                cout << "NUMERO CIVICO: ";
                cin >> nCiv;
                cout << "CITTA': ";
                cin >> citta; // come sopra...
                cout << "PROVINCIA (sigla): ";
                cin >> prov;
                cout << "CAP: ";
                cin >> cap;


                ins_testa(il, nome, cognome, matricola, mansione, aa, mm, gg,
                        via, nCiv, citta, prov, cap);
            }
                break;
            case 2:
                stampaLista(il);
                break;
        }
    } while (scelta > 0);


    return 0;
}

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte