Salve a tutti. Ho realizzato questo programma, solo che stavo provando a rendere il programma modulare ma nelle parti che ho messo a commento sto avendo dei problemi in quanto non funziona. Potreste aiutarmi a capire cosa non va?
Questo è il codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define DIM 25
#define MAX 200
#define MIN 20
/*struttura per l'elaborazione delle date*/
struct s_data{
int giorno;
int mese;
int anno;
}s_data;
/*struttura per l'elaborazione degli indirizzi*/
typedef struct s_indirizzo{
char citta[DIM];
char via[DIM];
int civico;
}s_indirizzo;
/*struttura per l'elaborazione dei codici dei cantieri*/
typedef struct s_assegnazione{
char codice_dipendente[18];
char codice_cantiere [3];
}s_assegnazione;
/*struttura per l'elaborazione dei dipendenti*/
typedef struct s_dipendente {
char codice_fiscale[18];
char cognome[DIM];
char nome[DIM];
struct s_data data_nascita;
char luogo_nascita[DIM];
char genere;
int anni_esperienza;
char ruolo[DIM];
struct s_dipendente *nextPtr;
char cantiere_assegnato[5];
}s_dipendente;
/*struttura per l'elaborazione dei cantieri*/
typedef struct s_cantiere {
char codice_identificativo[5];
char codice[3];
struct s_indirizzo indirizzo;
int n_piani;
int m_altezza;
int mq_ampiezza;
char orientamento[2];
struct s_data data_inizio;
struct s_data data_fine;
char tipologia[DIM];
char stato[DIM];
}s_cantiere;//variabile di appoggio per le operazioni su file cantieri
/*funzioni da utilizzare*/
void registrazione_dip ();
void modifica_dati_dip ();
//void rimozione_dip ();
void ass_spost_rim_dipdacant ();
void modifica_stato_cant (s_dipendente*a, s_cantiere*b, const int n, const int m);
void visualizza_cantiere_per_citta_mostra_dip ();//manca da visualizzare dipendenti
void vis_dipendenti_cantieri ();
void visualizza_dipendenti_per_ruolo();
void visualizza_cantiere_per_tipologia();
void stampa_dipendenti_richiesti_citta(char *);
void stampa_costruzioni_richieste(char *);
void stampa_dipendenti_richiesti(char *);
int data_valida(int, int, int);
int bisestile(int);
long int distanza(int, int, int);
void stampa_giorno(int, int, int);
void stampa_dipendenti_cantieri_data_inizio();
int main ()
{
/*definizione variabili*/
int scelta;
/*possibili scelte*/
do {
printf ("\n\n");
printf ("\t\t\t\t GESTIONE CANTIERI");
printf ("\n\n 1. Registrazione nuovo dipendente");
printf ("\n 2. Modifica di dati di un dipendente (non e' possibile modificare il codice fiscale)");
printf ("\n 3. Rimozione di un dipendente");
printf ("\n 4. Assegnazione/spostamento/rimozione di un dipendente da un cantiere");
printf ("\n 5. Modifica di stato di un cantiere");
printf ("\n 6. Visualizzazione di dipendenti che lavorano in un cantiere di una specifica citta'");
printf ("\n 7. Ricerca di un dipendente e dei cantieri in cui lavora ordinati per la data di inizio lavori");
printf ("\n 8. Visualizzazione di dipendenti con uno specifico ruolo");
printf ("\n 9. Visualizzazione di cantieri di una specifica tipologia");
printf ("\n 0. Fine");
printf ("\n\n Scegliere una opzione: ");
scanf("%d", &scelta);
printf("\n\n");
switch(scelta) {
case 0:
return 0;
case 1:
registrazione_dip();
break;
case 2:
modifica_dati_dip ();
break;
/*case 3:
rimozione_dip ();
break;*/
case 4:
ass_spost_rim_dipdacant ();
break;
/*case 5:
//modifica_stato_cant ();
break;*/
/*case 6:
visualizza_cantiere_per_citta_mostra_dip();
break;*/
case 7:
vis_dipendenti_cantieri();
break;
case 8:
visualizza_dipendenti_per_ruolo();
break;
case 9:
visualizza_cantiere_per_tipologia();
break;
default:
printf ("\n E' stato inserito un valore non valido!");
break;
}
} while (scelta!=0);
}
//funzione per la registrazione di nuovi dipendenti
void registrazione_dip ()
{
FILE *sorgented;
s_dipendente dipendente;
int valida;
if ((sorgented = fopen("employees.csv", "a")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
printf("\t\t\t REGISTRAZIONE DIPENDENTE\t\t\t\n");
printf("\n Codice fiscale:\t\t\t");
scanf("%s",dipendente.codice_fiscale);
//verifico se è già presente
printf(" Cognome:\t\t\t\t");
scanf("%s",dipendente.cognome);
printf(" Nome:\t\t\t\t");
scanf("%s",dipendente.nome);
printf(" Data di nascita:\t\t\t");
//bool verifica_dat = false;
scanf("%d/%d/%d", &dipendente.data_nascita.giorno, &dipendente.data_nascita.mese, &dipendente.data_nascita.anno);
do{
valida=data_valida(dipendente.data_nascita.giorno, dipendente.data_nascita.mese, dipendente.data_nascita.anno);
switch(valida){
case 0: stampa_giorno(dipendente.data_nascita.giorno, dipendente.data_nascita.mese, dipendente.data_nascita.anno);
break;
case 1: printf(" Hai inserito un giorno non valido. Reinserisci il giorno: ");
scanf("%d", &dipendente.data_nascita.giorno);
break;
case 2: printf(" Hai inserito un mese non valido. Reinserisci il mese: ");
scanf("%d", &dipendente.data_nascita.mese);
break;
case 3: printf(" Hai inserito un anno non valido. Reinserisci l'anno: ");
scanf("%d", &dipendente.data_nascita.anno);
break;
}
}
while(valida!=0);
printf(" Genere (inserire M o F):");
scanf("%c", &dipendente.genere);
while (dipendente.genere!='M' && dipendente.genere!='m' && dipendente.genere!='F' && dipendente.genere!='f'){
printf("\t\t");
scanf("%c", &dipendente.genere);
};
printf(" Anni di esperienza: \t\t\t");
scanf("%d", &dipendente.anni_esperienza);
printf(" Digitare il ruolo : \n\t\t1. CAPOCANTIERE,\n\t\t2. CARPENTIERE,\n\t\t3. MURATORE,\n\t\t4. INTONACATORE,\n\t\t5. IDRAULICO,\n\t\t6. ELETTRICISTA,\n\t\t7. PIASTRELLISTA,\n\t\t8. IMBIANCHINO\n\n ");
int ruolo;
do{
scanf("%d", &ruolo);
switch(ruolo){
case 1:
strcpy(dipendente.ruolo,"CAPOCANTIERE");
break;
case 2:
strcpy(dipendente.ruolo,"CARPENTIERE");
break;
case 3:
strcpy(dipendente.ruolo,"MURATORE");
break;
case 4:
strcpy(dipendente.ruolo,"INTONACATORE");
break;
case 5:
strcpy(dipendente.ruolo,"IDRAULICO");
break;
case 6:
strcpy(dipendente.ruolo,"ELETTRICISTA");
break;
case 7:
strcpy(dipendente.ruolo,"PIASTRELLISTA");
break;
case 8:
strcpy(dipendente.ruolo,"IMBIANCHINO");
break;
default:
printf("\nHai inserito un valore non valido! Digitare nuovamente: ");
}
} while (ruolo<1 || ruolo>8);
printf("\nLuogo di nascita : ");
scanf("%s",dipendente.luogo_nascita);
fprintf(sorgented, "%s,",dipendente.codice_fiscale);
fprintf(sorgented, "%s,",dipendente.cognome);
fprintf(sorgented, "%s,",dipendente.nome);
fprintf(sorgented, "%d/",dipendente.data_nascita.giorno);
fprintf(sorgented, "%d/",dipendente.data_nascita.mese);
fprintf(sorgented, "%d,",dipendente.data_nascita.anno);
fprintf(sorgented, "%s,",dipendente.luogo_nascita);
fprintf(sorgented, "%c,",dipendente.genere);
fprintf(sorgented, "%d,",dipendente.anni_esperienza);
fprintf(sorgented, "%s\n",dipendente.ruolo);
printf("\n\n Salvataggio effettuato con successo!!!\n");
fclose(sorgented);
}
}
void modifica_dati_dip ()
{
FILE *sorgenteed;
s_dipendente dipendente;
char codi_fiscale [18];
if ((sorgenteed = fopen("employees2.csv", "r+")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
printf("\t\t\t MODIFICA DATI DIPENDENTE\t\t\t\n");
printf("\n Inserire il codice fiscale del dipendente interessato:\t\t\t");
scanf("%s",codi_fiscale);
while(!feof(sorgenteed)) {
char aaa[100];
char* datanascita;
fscanf(sorgenteed,"%s",aaa);
strcpy(dipendente.codice_fiscale,strtok(aaa,","));
//printf("\n\n%s", dipendente.codice_fiscale);
strcpy(dipendente.cognome,strtok(NULL,","));
//printf("\n%s", dipendente.cognome);
strcpy(dipendente.nome,strtok(NULL,","));
//printf("\n%s", dipendente.nome);
datanascita = strtok(NULL,",");
//printf("\n%s", datanascita);
strcpy(dipendente.luogo_nascita,strtok(NULL,","));
//printf("\n%s", dipendente.luogo_nascita);
dipendente.genere=strtok(NULL, ",")[0];
//printf("\n%c", dipendente.genere);
dipendente.anni_esperienza = atoi(strtok(NULL,","));
//printf("\n%d", dipendente.anni_esperienza);
strcpy(dipendente.ruolo,strtok(NULL,","));
//printf("\n%s", dipendente.ruolo);
//printf("\n\n\t\"%s", codi_fiscale);
//non funziona perchè ci sono le virgolette in dipendente.codice_fiscale e non riesco a toglierle o a metterle in codi_fiscale
if(strcmp(dipendente.codice_fiscale,codi_fiscale )==0){
printf("Il dipendente che si intende modificare e': \n\n");
printf("\n",dipendente.codice_fiscale);
printf(" CODICE FISCALE: %s ", dipendente.codice_fiscale);
printf("\nCognome:\t%s, ", dipendente.cognome);
printf("\t\tNome:\t%s, ", dipendente.nome);
printf("\n\t\tdata di nascita: %s, ", datanascita);
printf("\tLuogo nascita: %s, ", dipendente.luogo_nascita);
printf("\n\t\tgenere: %c, ", dipendente.genere);
printf("\t\tAnni di esperienza: %d, ", dipendente.anni_esperienza);
printf("ruolo: %s, ", dipendente.ruolo);
int scelta;
//richiesta di cosa si vuole modificare
do{
printf("\n\tDigitare cio' che si intende modificare: \n\t\t1. Anni di esperienza,\n\t\t2. Ruolo,\n\t\t3. Indietro\n\n");
scanf("%d", &scelta);
switch(scelta){
case 1:
printf("\n Inserire anni di esperienza: ");
scanf("%d", dipendente.anni_esperienza);
printf("\n\nblabla");
break;
case 2:
printf("\n Digitare il ruolo : \n\t\t1. CAPOCANTIERE,\n\t\t2. CARPENTIERE,\n\t\t3. MURATORE,\n\t\t4. INTONACATORE,\n\t\t5. IDRAULICO,\n\t\t6. ELETTRICISTA,\n\t\t7. PIASTRELLISTA,\n\t\t8. IMBIANCHINO\n\n ");
int ruolo;
do{
scanf("%d", &ruolo);
switch(ruolo){
case 1:
strcpy(dipendente.ruolo,"CAPOCANTIERE");
break;
case 2:
strcpy(dipendente.ruolo,"CARPENTIERE");
break;
case 3:
strcpy(dipendente.ruolo,"MURATORE");
break;
case 4:
strcpy(dipendente.ruolo,"INTONACATORE");
break;
case 5:
strcpy(dipendente.ruolo,"IDRAULICO");
break;
case 6:
strcpy(dipendente.ruolo,"ELETTRICISTA");
break;
case 7:
strcpy(dipendente.ruolo,"PIASTRELLISTA");
break;
case 8:
strcpy(dipendente.ruolo,"IMBIANCHINO");
break;
default:
printf("\nHai inserito un valore non valido! Digitare nuovamente: ");
}
} while (ruolo<1 || ruolo>8);
//case 3:
//torna indietro
}
}while (scelta!=3);
}
}
fclose(sorgenteed);
}
}
/*void rimozione_dip ()
{
FILE *sorgenteed;
char codi_fiscale [18];
s_dipendente dipendente;
if ((sorgenteed = fopen("employees2.csv", "r+")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
printf("\t\t\t RIMOZIONE DIPENDENTE\t\t\t\n");
printf("\n Codice fiscale:\t\t\t");
scanf("%s",codi_fiscale);
while(!feof(sorgenteed)) {
char aaa[100];
char* datanascita;
fscanf(sorgenteed,"%s",aaa);
strcpy(dipendente.codice_fiscale,strtok(aaa,","));
//printf("\n\n%s", dipendente.codice_fiscale);
strcpy(dipendente.cognome,strtok(NULL,","));
//printf("\n%s", dipendente.cognome);
strcpy(dipendente.nome,strtok(NULL,","));
//printf("\n%s", dipendente.nome);
datanascita = strtok(NULL,",");
//printf("\n%s", datanascita);
strcpy(dipendente.luogo_nascita,strtok(NULL,","));
//printf("\n%s", dipendente.luogo_nascita);
dipendente.genere=strtok(NULL, ",");
//printf("\n%c", dipendente.genere);
dipendente.anni_esperienza = atoi(strtok(NULL,","));
//printf("\n%d", dipendente.anni_esperienza);
strcpy(dipendente.ruolo,strtok(NULL,","));
//printf("\n%s", dipendente.ruolo);
printf("\n\n\t\"%s", codi_fiscale);
//non funziona perchè ci sono le virgolette in dipendente.codice_fiscale e non riesco a toglierle o a metterle in codi_fiscale
if(strcmp(dipendente.codice_fiscale,codi_fiscale )==0){
printf("Il dipendente che si intende rimuovere e': \n\n");
printf("\n",dipendente.codice_fiscale);
printf(" CODICE FISCALE: %s ", dipendente.codice_fiscale);
printf("\nCognome:\t%s, ", dipendente.cognome);
printf("\t\tNome:\t%s, ", dipendente.nome);
printf("\n\t\tdata di nascita: %s, ", datanascita);
printf("\tLuogo nascita: %s, ", dipendente.luogo_nascita);
printf("\n\t\tgenere: %c, ", dipendente.genere);
printf("anni di esperienza: %d, ", dipendente.anni_esperienza);
printf("ruolo: %s, ", dipendente.ruolo);
}
}
}
}*/
void ass_spost_rim_dipdacant (s_dipendente*a, s_cantiere*b, const int n, const int m)
/* assegnare/spostare/rimuovere un dipendente a/da un cantiere:
- I dipendenti possono essere assegnati a più di un cantiere, tranne i CAPOCANTIERI che sono assegnati a un solo cantiere per volta;
- non si possono assegnare dipendenti ai cantieri SOSPESI o CONCLUSI; */
{
char scelta1[5];
char scelta[5];
FILE *dip;
FILE *assegna;
char cod[18];
int i;
int j;
if((dip=fopen("employees.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
if((assegna=fopen("assegnazioni.csv", "w"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
printf("Vuoi assegnare un cantiere a un dipendente?\n");
printf("Si o No: ");
scanf("%s", scelta);
while(strcmp(scelta, "Si")==0) {
printf("Inserisci cognome da ricercare: ");
scanf("%s", cod);
for(i=0; i<n; i++) {
if(strcmp(a.cognome, cod)==0) {
fprintf(assegna, "%s,", a.codice_fiscale);
fprintf(assegna, "%s,", a.cognome);
fprintf(assegna, "%s,", a.nome);
fprintf(assegna, "%s,", a.data_nascita);
fprintf(assegna, "%s,", a.luogo_nascita);
fprintf(assegna, "%s,", a.genere);
fprintf(assegna, "%d,", a.anni_esperienza);
fprintf(assegna, "%s,", a.ruolo);
printf("Inserisci codice cantiere assegnato: ");
scanf("%s", a.cantiere_assegnato);
FILE *cantieri;
if((cantieri=fopen("constructions.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
for(j=0; j<m; j++) {
if(strcmp(a[i].cantiere_assegnato, b[j].codice_identificativo)==0) {
if(strcmp(b[j].stato, "CONCLUSO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
if(strcmp(b[j].stato, "SOSPESO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
fprintf(assegna, "%s,", a[i].cantiere_assegnato);
printf("Cantiere assegnato\n");
}
}
}
}
if(strcmp(a[i].ruolo, "CAPOCANTIERE")!=0) {
printf("Vuoi assegnare un altro cantiere allo stesso dipendente?\n");
printf("Si o No: ");
scanf("%s", scelta1);
while((strcmp(scelta1, "Si")==0)||(strcmp(scelta1, "si")==0)||(strcmp(scelta1, "SI")==0)) {
printf("Inserisci codice cantiere assegnato: ");
scanf("%s", a[i].cantiere_assegnato);
for(j=0; j<m; j++) {
if(strcmp(a[i].cantiere_assegnato, b[j].codice_identificativo)==0) {
if(strcmp(b[j].stato, "CONCLUSO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
if(strcmp(b[j].stato, "SOSPESO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
fprintf(assegna, "%s,", a[i].cantiere_assegnato);
printf("Cantiere assegnato\n");
}
}
}
}
printf("Vuoi assegnare ancora allo stesso dipendente?\n");
printf("Si o No: ");
scanf("%s", scelta1);
}
}
fprintf(assegna, "\n");
printf("Vuoi assegnare un cantiere ad un altro dipendente?\n");
printf("Si o No: ");
scanf("%s", scelta);
fclose(cantieri);
}
}
}
}
fclose(assegna);
}
fclose(dip);
}
char risp[5];
printf("Vuoi modificare il cantiere di appartenenza di un dipendente?\n");
printf("Si o No: ");
scanf("%s", risp);
char code_fisc[18];
FILE *dipendent;
int cont=0;
if((dipendent=fopen("employees.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
while((cont<n)&&((!feof(dip)))) {
char linea1[120];
fscanf(dip, "%s", linea1);
strcpy(a[cont].codice_fiscale, strtok(linea1, ","));
strcpy(a[cont].cognome, strtok(NULL, ","));
strcpy(a[cont].nome, strtok(NULL, ","));
a[cont].data_nascita, strtok(NULL, ",");
strcpy(a[cont].luogo_nascita, strtok(NULL, ","));
a[cont].genere, strtok(NULL, ",");
a[cont].anni_esperienza=atoi(strtok(NULL, ","));
strcpy(a[cont].ruolo, strtok(NULL, ","));
strcpy(a[cont].cantiere_assegnato, strtok(NULL, ","));
cont++;
}
FILE *mod;
if((mod=fopen("employees.csv", "w"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
while((strcmp(risp, "Si")==0)||strcmp(risp, "si")==0||strcmp(risp, "SI")==0) {
printf("Inserisci cognome del dipendente di cui vuoi modificare il cantiere: ");
scanf("%s", code_fisc);
for(i=0; i<n; i++) {
if(strcmp(a[i].cognome, code_fisc)==0) {
fprintf(mod, "%s,", a[i].codice_fiscale);
fprintf(mod, "%s,", a[i].cognome);
fprintf(mod, "%s,", a[i].nome);
fprintf(mod, "%s,", a[i].data_nascita);
fprintf(mod, "%s,", a[i].luogo_nascita);
fprintf(mod, "%s,", a[i].genere);
fprintf(mod, "%d,", a[i].anni_esperienza);
fprintf(mod, "%s,", a[i].ruolo);
printf("Inserisci nuovo cantiere: ");
scanf("%s", a[i].cantiere_assegnato);
FILE *strutt;
if((strutt=fopen("constructions.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
for( j=0; j<m; j++) {
if(strcmp(a[i].cantiere_assegnato, b[j].codice_identificativo)==0) {
if(strcmp(b[j].stato, "CONCLUSO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
if(strcmp(b[j].stato, "SOSPESO")==0) {
printf("Non puoi assegnare questo codice ");
printf("%s\n", b[j].codice_identificativo);
}
else {
fprintf(mod, "%s", a[i].cantiere_assegnato);
printf("Cantiere assegnato\n");
}
}
}
}
printf("Vuoi modificare un altro cantiere di appartenenza di un dipendente?\n");
printf("Si o No: ");
scanf("%s", risp);
fclose(strutt);
}
}
}
}
fclose(mod);
}
fclose(dipendent);
}
char risposta[5];
printf("Vuoi rimuovere un dipendente da un cantiere?\n");
printf("Si o No: ");
scanf("%s", risposta);
char codice[18];
FILE *leggi;
int conteggio=0;
if((leggi=fopen("employees.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
while((conteggio<n)&&((!feof(dip)))) {
char linea1[120];
fscanf(dip, "%s", linea1);
strcpy(a[conteggio].codice_fiscale, strtok(linea1, ","));
strcpy(a[conteggio].cognome, strtok(NULL, ","));
strcpy(a[conteggio].nome, strtok(NULL, ","));
a[conteggio].data_nascita, strtok(NULL, ",");
strcpy(a[conteggio].luogo_nascita, strtok(NULL, ","));
a[conteggio].genere, strtok(NULL, ",");
a[conteggio].anni_esperienza=atoi(strtok(NULL, ","));
strcpy(a[conteggio].ruolo, strtok(NULL, ","));
strcpy(a[conteggio].cantiere_assegnato, strtok(NULL, ","));
conteggio++;
}
FILE *rim;
if((rim=fopen("employees.csv", "w"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
while(strcmp(risposta, "Si")==0) {
printf("Inserisci cognome da ricercare: ");
scanf("%s", codice);
for( i=0; i<n; i++) {
if(strcmp(a[i].codice_fiscale, codice)!=0) {
fprintf(rim, "%s,", a[i].codice_fiscale);
fprintf(rim, "%s,", a[i].cognome);
fprintf(rim, "%s,", a[i].nome);
fprintf(rim, "%s,", a[i].data_nascita);
fprintf(rim, "%s,", a[i].luogo_nascita);
fprintf(rim, "%s,", a[i].genere);
fprintf(rim, "%d,", a[i].anni_esperienza);
fprintf(rim, "%s,", a[i].ruolo);
fprintf(rim, "%s\n", a[i].cantiere_assegnato);
}
}
printf("Cantiere rimosso\n");
printf("Vuoi rimuovere un cantiere da un altro dipendente?\n");
printf("Si o No: ");
scanf("%s", risposta);
}
fclose(rim);
}
fclose(leggi);
}
}
void modifica_stato_cant (s_dipendente*a, s_cantiere*b, const int n, const int m)
{
FILE *sorgenteec;
s_cantiere cantiere;
int scelta;
char cod_cantiere [4];
if ((sorgenteec = fopen("constructions2.csv", "r+")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
printf("\t\t\t MODIFICA STATO CANTIERE\t\t\t\n");
printf("\n Inserire il codice codice del cantiere interessato:\t\t\t");
scanf("%s",cod_cantiere);
while(!feof(sorgenteec)) {
char aaa[100];
char* datainizio;
char* datafine;
fscanf(sorgenteec,"%s",aaa);
strcpy(cantiere.codice,strtok(aaa,","));
strcpy(cantiere.indirizzo.citta,strtok(NULL,","));
strcpy(cantiere.indirizzo.via,strtok(NULL,","));
cantiere.indirizzo.civico = atoi(strtok(NULL,","));
cantiere.n_piani = atoi(strtok(NULL,","));
cantiere.m_altezza = atoi(strtok(NULL,","));
cantiere.mq_ampiezza = atoi(strtok(NULL,","));
strcpy(cantiere.orientamento,strtok(NULL,","));
datainizio = strtok(NULL,",");
datafine = strtok(NULL,",");
strcpy(cantiere.tipologia,strtok(NULL,","));
strcpy(cantiere.stato,strtok(NULL,"\n"));
if(strcmp(cantiere.codice, cod_cantiere)==0) {
printf("\n",cantiere.codice);
printf("\n\n Il cantiere di cui si vuole modificare lo stato e': ");
printf("CODICE: %s ", cantiere.codice);
printf("\t%s, ", cantiere.indirizzo.citta);
printf("%s, ", cantiere.indirizzo.via);
printf("n %d, ", cantiere.indirizzo.civico);
printf("\n\t\tpiani: %d, ", cantiere.n_piani);
printf("altezza: %d, ", cantiere.m_altezza);
printf("mq: %d, ", cantiere.mq_ampiezza);
printf("orientamento: %s, ", cantiere.orientamento);
printf("\n\t\tdata inizio: %s, ", datainizio);
printf("data fine: %s, ", datafine);
printf("STATO: %s\n", cantiere.stato);
printf("\n\tInserire il nuovo stato: 1.PIANIFICATO,\n\t\t2.ATTIVO, \n\t\t3.SOSPESO, \n\t\t4.CONCLUSO");
do{
scanf("%d", &scelta);
switch(scelta){
case 1:
strcpy(cantiere.stato,"PIANIFICATO");
break;
case 2:
strcpy(cantiere.stato,"ATTIVO");
break;
case 3:
strcpy(cantiere.stato,"SOSPESO");
break;
case 4:
strcpy(cantiere.stato,"CONCLUSO");
break;
default:
printf("\nHai inserito un valore non valido! Digitare nuovamente: ");
}
} while (scelta<1 || scelta>4);
}
}
}
}
void visualizza_cantiere_per_citta_mostra_dip()
{
printf("\t\t\t VISUALIZZAZIONE DIPENDENTI CHE LAVORANO IN UNA CITTA'\t\t\t\n");
printf(" Digitare la citta' : ");
char scelta[15];
scanf("%s", scelta);
stampa_dipendenti_richiesti_citta(scelta);//cambiare nome
}
void stampa_dipendenti_richiesti_citta(char *cit)
{
FILE *sorgentec;
FILE *assegna;
FILE *sorgenteed;
s_cantiere cantiere;
s_assegnazione assegnazione;
s_dipendente dipendente;
if ((sorgentec = fopen("constructions.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while(!feof(sorgentec)) {
printf ("ciao");
char aaa[200];
char* datainizio;
char* datafine;
fscanf(sorgentec,"%s",aaa);
strcpy(cantiere.codice,strtok(aaa,","));
strcpy(cantiere.indirizzo.citta,strtok(NULL,","));
strcpy(cantiere.indirizzo.via,strtok(NULL,","));
cantiere.indirizzo.civico = atoi(strtok(NULL,","));
cantiere.n_piani = atoi(strtok(NULL,","));
cantiere.m_altezza = atoi(strtok(NULL,","));
cantiere.mq_ampiezza = atoi(strtok(NULL,","));
strcpy(cantiere.orientamento,strtok(NULL,","));
datainizio = strtok(NULL,",");
datafine = strtok(NULL,",");
strcpy(cantiere.tipologia,strtok(NULL,","));
strcpy(cantiere.stato,strtok(NULL,","));
if(strcmp(cantiere.indirizzo.citta, cit)==0) {
strcpy(cantiere.codice,strtok(aaa,","));
if ((assegna = fopen("assegnazioni.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while(!feof(assegna)) {
char bbb[100];
fscanf(assegna,"%s",bbb);
strcpy(assegnazione.codice_dipendente,strtok(bbb,","));
strcpy(assegnazione.codice_cantiere,strtok(NULL,","));
if(strcmp(cantiere.codice, assegnazione.codice_cantiere )==0){
strcpy(assegnazione.codice_dipendente,strtok(bbb,","));
if ((sorgenteed = fopen("employees2.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while(!feof(sorgenteed)){
char ccc[100];
char* datanascita;
fscanf(sorgenteed,"%s",ccc);
strcpy(dipendente.codice_fiscale,strtok(aaa,","));
strcpy(dipendente.cognome,strtok(NULL,","));
strcpy(dipendente.nome,strtok(NULL,","));
datanascita = strtok(NULL,",");
strcpy(dipendente.luogo_nascita,strtok(NULL,","));
dipendente.genere=strtok(NULL, ",")[0];
dipendente.anni_esperienza = atoi(strtok(NULL,","));
strcpy(dipendente.ruolo,strtok(NULL,","));
if(strcmp(assegnazione.codice_dipendente, dipendente.codice_fiscale )==0){
printf("\n",dipendente.codice_fiscale);
printf(" CODICE FISCALE: %s ", dipendente.codice_fiscale);
printf("\nCognome:\t%s, ", dipendente.cognome);
printf("\t\tNome:\t%s, ", dipendente.nome);
printf("\n\t\tdata di nascita: %s, ", datanascita);
printf("\tLuogo nascita: %s, ", dipendente.luogo_nascita);
printf("\n\t\tgenere: %c, ", dipendente.genere);
printf("\t\tAnni di esperienza: %d, ", dipendente.anni_esperienza);
printf("ruolo: %s, ", dipendente.ruolo);
}//end if confronto codice dipendente e codice fiscale
}//chiusura while fino a quando non termina file dipendente
fclose(sorgenteed);
}//chiusura else se file dipendenti non è aperto
}//end if confronto codice cantiere e codice delle assegnazioni
}//chiusura while fino a quando non termina file assegnazione
fclose(assegna);
}//chiusura else se file assegnazione non è aperto
}//chiusura confronto città cantiere con città inserita
}//chiusura while fino a quando non termina file cantieri
fclose(sorgentec);
}//chiusura else se file cantieri non è aperto
}//chiusura funzione
void visualizza_dipendenti_per_ruolo ()
{
printf("\t\t\t VISUALIZZAZIONE DIPENDENTI PER RUOLO\t\t\t\n");
printf(" Digitare il ruolo : \n\t\t1. CAPOCANTIERE,\n\t\t2. CARPENTIERE,\n\t\t3. MURATORE,\n\t\t4. INTONACATORE,\n\t\t5. IDRAULICO,\n\t\t6. ELETTRICISTA,\n\t\t7. PIASTRELLISTA,\n\t\t8. IMBIANCHINO\n\n ");
int ruolo;
char sruolo[15];
do{
scanf("%d", &ruolo);
switch(ruolo){
case 1:
strcpy(sruolo,"CAPOCANTIERE");
break;
case 2:
strcpy(sruolo,"CARPENTIERE");
break;
case 3:
strcpy(sruolo,"MURATORE");
break;
case 4:
strcpy(sruolo,"INTONACATORE");
break;
case 5:
strcpy(sruolo,"IDRAULICO");
break;
case 6:
strcpy(sruolo,"ELETTRICISTA");
break;
case 7:
strcpy(sruolo,"PIASTRELLISTA");
break;
case 8:
strcpy(sruolo,"IMBIANCHINO");
break;
default:
printf("\nHai inserito un valore non valido! Digitare nuovamente: ");
}
} while (ruolo<1 || ruolo>8);
stampa_dipendenti_richiesti(sruolo);
}
void stampa_dipendenti_richiesti(char *ruolo)
{
FILE *sorgenteed;
s_dipendente dipendente;
if ((sorgenteed = fopen("employees.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while(!feof(sorgenteed)) {
char aaa[100];
char* datanascita;
fscanf(sorgenteed,"%s",aaa);
strcpy(dipendente.codice_fiscale,strtok(aaa,","));
strcpy(dipendente.cognome,strtok(NULL,","));
strcpy(dipendente.nome,strtok(NULL,","));
datanascita = strtok(NULL,",");
strcpy(dipendente.luogo_nascita,strtok(NULL,","));
dipendente.genere=strtok(NULL, ",")[0];
dipendente.anni_esperienza = atoi(strtok(NULL,","));
strcpy(dipendente.ruolo,strtok(NULL,","));
if(strcmp(dipendente.ruolo, ruolo)==0) {
printf("blabla2");
printf("\n\n\n",dipendente.codice_fiscale);
printf(" CODICE FISCALE: %s ", dipendente.codice_fiscale);
printf("\n Cognome:\t%s, ", dipendente.cognome);
printf("\t\tNome:\t%s, ", dipendente.nome);
printf("\n data di nascita: %s, ", datanascita);
//printf("\n\t\tgenere: %c, ", dipendente.genere);
printf("\n anni di esperienza: %d, ", dipendente.anni_esperienza);
printf("\t\tLuogo nascita: %s, ", dipendente.luogo_nascita);
}
}
fclose(sorgenteed);
}
}
void visualizza_cantiere_per_tipologia ()
{
printf("\t\t\t VISUALIZZAZIONE CANTIERI PER TIPOLOGIA\t\t\t\n");
printf(" Digitare la tipologia : \n\t\t1. CONDOMINIO,\n\t\t2. VILLA,\n\t\t3. UFFICIO,\n\t\t4. INDUSTRIALE,\n\t\t5. COMMERCIALE,\n\t\t6. AUTORIMESSA,\n\t\t7. PARCO,\n\t\t8. SCUOLA\n\n ");
int tipo;
char scelta[15];
do{
scanf("%d", &tipo);
switch(tipo){
case 1:
strcpy(scelta,"CONDOMINIO");
break;
case 2:
strcpy(scelta,"VILLA");
break;
case 3:
strcpy(scelta,"UFFICIO");
break;
case 4:
strcpy(scelta,"INDUSTRIALE");
break;
case 5:
strcpy(scelta,"COMMERCIALE");
break;
case 6:
strcpy(scelta,"AUTORIMESSA");
break;
case 7:
strcpy(scelta,"PARCO");
break;
case 8:
strcpy(scelta,"SCUOLA");
break;
default:
printf("\nHai inserito un valore non valido! Digitare nuovamente: ");
}
} while (tipo<1 || tipo>8);
stampa_costruzioni_richieste(scelta);
}
void stampa_costruzioni_richieste(char *tip)
{
FILE *sorgentec;
s_cantiere cantiere;
if ((sorgentec = fopen("constructions.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while(!feof(sorgentec)) {
char aaa[100];
char* datainizio;
char* datafine;
fscanf(sorgentec,"%s",aaa);
strcpy(cantiere.codice,strtok(aaa,","));
strcpy(cantiere.indirizzo.citta,strtok(NULL,","));
strcpy(cantiere.indirizzo.via,strtok(NULL,","));
cantiere.indirizzo.civico = atoi(strtok(NULL,","));
cantiere.n_piani = atoi(strtok(NULL,","));
cantiere.m_altezza = atoi(strtok(NULL,","));
cantiere.mq_ampiezza = atoi(strtok(NULL,","));
strcpy(cantiere.orientamento,strtok(NULL,","));
datainizio = strtok(NULL,",");
datafine = strtok(NULL,",");
strcpy(cantiere.tipologia,strtok(NULL,","));
strcpy(cantiere.stato,strtok(NULL,"\n"));
if(strcmp(cantiere.tipologia, tip)==0) {
printf("\n",cantiere.codice);
printf("CODICE: %s ", cantiere.codice);
printf("\t%s, ", cantiere.indirizzo.citta);
printf("%s, ", cantiere.indirizzo.via);
printf("n %d, ", cantiere.indirizzo.civico);
printf("\n\t\tpiani: %d, ", cantiere.n_piani);
printf("altezza: %d, ", cantiere.m_altezza);
printf("mq: %d, ", cantiere.mq_ampiezza);
printf("orientamento: %s, ", cantiere.orientamento);
printf("\n\t\tdata inizio: %s, ", datainizio);
printf("data fine: %s, ", datafine);
printf("STATO: %s\n", cantiere.stato);
}
}
fclose(sorgentec);
}
}
void vis_dipendenti_cantieri (s_dipendente*a, s_cantiere*b, const int n, const int m)
// Ricercare un dipendente, mostrando i suoi dati e i cantieri in cui lavora ordinati per data inizio lavori
{
FILE *sorgenteed;
s_dipendente dipendente;
char scelta[5];
printf("Vuoi ricercare un dipendente mostrando i dati e i cantieri dove lavora?\n");
printf("Si o No: ");
scanf("%s", scelta);
char ricerca[19];
int min;
s_cantiere temp;
FILE *dip;
int conteggio=0;
int i;
int s;
int t;
if ((dip = fopen("employees.csv", "r")) == NULL){
printf ("\nImpossibile aprire il file!");
}
else{
while((strcmp(scelta, "Si")==0)||(strcmp(scelta, "si")==0)||(strcmp(scelta, "SI")==0)) {
printf("Inserisci ruolo da ricercare: ");
scanf("%s", ricerca);
for (i=0; i<n; i++) {
while((conteggio<n)&& feof(dip)) {
char linea1[100];
fscanf(dip, "%s", linea1);
a[conteggio].codice_fiscale;
a[conteggio].cognome;
a[conteggio].nome;
a[conteggio].data_nascita.giorno;
a[conteggio].luogo_nascita;
a[conteggio].genere;
a[conteggio].anni_esperienza;
a[conteggio].ruolo;
conteggio++;
}
FILE *cant;
if((cant=fopen("constructions.csv", "r"))==NULL) {
printf("Impossibile aprire il file\n");
}
else {
for(s=0; s<m; s++) {
min=s;
for(t=s+1; t<m; t++) {
if(b[t].data_inizio.giorno < b[min].data_inizio.giorno && b[t].data_inizio.mese < b[min].data_inizio.mese && b[t].data_inizio.anno < b[min].data_inizio.anno) {
min=t;
}
}
temp=b[min];
b[min]=b[s];
b[s]=temp;
printf("%d/", b[s].data_inizio.giorno);
printf("%d/", b[s].data_inizio.mese);
printf("%d ", b[s].data_inizio.anno);
}
for(s=0; s<m; s++) {
if(strcmp(a[i].ruolo, ricerca)==0) {
if(strcmp(a[i].cantiere_assegnato, b[s].codice_identificativo)==0) {
printf("%d/", b[s].data_inizio.giorno);
printf("%d/", b[s].data_inizio.mese);
printf("%d, ", b[s].data_inizio.anno);
printf("%s, ", a[i].codice_fiscale);
printf("%s, ", a[i].cognome);
printf("%s, ", a[i].nome);
printf("%s, ", a[i].data_nascita);
printf("%s, ", a[i].luogo_nascita);
printf("%s, ", a[i].genere);
printf("%d, ", a[i].anni_esperienza);
printf("%s, ", a[i].ruolo);
printf("%s\n", a[i].cantiere_assegnato);
}
}
}
fclose(cant);
}
}
printf("Vuoi ricercare ancora?\n");
printf("Si o No: ");
scanf("%s", scelta);
}
fclose(dip);
}
}
int bisestile(int a){
if ( (a%4) == 0) return 1; //se l'anno è bisestile restituisce 1
else return 0; //altrimenti restituisce 0
}
int data_valida(int g, int m, int a){
int max_giorni;
if (m<1 || m>12) return 2; //se il mese inserito non è valido restituisce 2
else {
if (a<1940 || a>2020) return 3; //se l'anno inserito non è valido restituisce 3
else {
switch(m){ //assegna a max_giorni il numero massimo di giorni del mese inserito
case 1: case 3: case 5: case 7: case 8: case 10: case 12: max_giorni=31; break;
case 2: if(bisestile(a)) max_giorni=29;
else max_giorni=28;
break;
default: max_giorni=30;
}
if (g<1 || g>max_giorni) return 1; //se il giorno inserito non è valido restituisce 1
else return 0;
} //altrimenti restituisce 0
}
}
void stampa_giorno(int g, int m, int a){
long int d=distanza(g, m, a);
d%=7;
}
long int distanza(int g, int m, int a){
int anno_start=1901, anno, giorno_start=1, mese_start=1;
long int dis=0;
if (anno>=1940 && anno<=2020 && anno_start!=a){
if(bisestile(anno_start)) dis+=366;
else dis+=365;
anno_start++;
}
while(mese_start!=m){
switch(mese_start){
case 1: case 3: case 5: case 7: case 8: case 10: case 12: dis+=31; break;
case 2: if(bisestile(a)) dis+=29;
else dis+=28;
break;
default: dis+=30;
}
mese_start++;
}
dis+=g-1;
return dis;
}