/* Programmazione 1 - Appello del 18.IX.17 */ #include #include /* Prototipi */ void visCart(int c[][9]); //Visualizza una cartelle da 3 righe e 9 colonne void visEstr(int e[]); //Visualizza estrazione /* Restituisce l'indice della prima estrazione alla quale la cartella a realizza un ambo, secondo il vettore di numeri estratti e, o -1 se alla fine dell'estrazione non si e' verificata l'ambo (errore) */ int ambo(int a[][9], int e[]); /* Restituisce l'indice della prima estrazione alla quale la cartella a realizza un ambo, secondo il vettore di numeri estratti e, o -1 se alla fine dell'estrazione non si e' verificata il terno (errore) */ int terno(int a[][9], int e[]); /* Restituisce l'indice della prima estrazione alla quale la cartella realizza la tombola, secondo il vettore di numeri estratti e, o -1 se alla fine dell'estrazione non si e' verificata la tombola (errore) */ int tombola(int a[][9], int e[]); /* Restituisce 1 se la cartella c contiene il numero n, e 0 altrimenti. */ int contiene(int c[][9], int n); int main(int argc, char **argv) { FILE *f; int cont=1,sc; //cont==0 -> esci; sc = scelta dell'utente char nome_f[BUFSIZ]; int c[3][9]; // cartella int e[90]; //estrazione /*==1 -> estrazione o cartella letta; ==1 -> estrazione o cartella non ancora definita */ int estr=0, cart=0; /* Indice dell'estrazione per ambo, terno, ecc. */ int ind=-1; char menu[] = "1.\tLeggi cartella.\n2.\tLeggi estrazione.\n3.\tVisualizza cartella.\n4.\tVisualizza estrazione.\n5.\tAmbo?\n6.\tTerno?\n7.\tTombola?\n8.\tEsci.\n> "; do { printf("%s",menu); scanf("%d",&sc); getchar(); switch (sc) { case 1: printf("Inserisci nome del file: "); scanf("%s",nome_f); if ( (f=fopen(nome_f,"r")) == NULL) { printf("Errore nell'apertura del file: %s.\n",nome_f); cart=0; } else { //Lettura della cartella da file for (int i=0;i<3;i++) for (int j=0;j<9;j++) fscanf(f,"%d",&c[i][j]); //Chiusura file fclose(f); printf("Cartella letta da %s.\n",nome_f); cart=1; } break; case 2: printf("Inserisci nome del file: "); scanf("%s",nome_f); if ( (f=fopen(nome_f,"r")) == NULL) { printf("Errore nell'apertura del file: %s.\n",nome_f); estr=0; } else { //Lettura dei numeri estratti da file for (int i=0;i<90;i++) fscanf(f,"%d",&e[i]); //Chiusura file fclose(f); printf("Estrazione letta da %s.\n",nome_f); estr=1; } //Chiusura secondo file fclose(f); break; case 3: if (cart) visCart(c); else printf("Nessuna cartella in memoria.\n"); break; case 4: if (estr) visEstr(e); else printf("Nessuna estrazione in memoria.\n"); break; case 8: printf("Terminazione.\n"); cont=0; break; case 5: if (!estr || !cart) { printf("Cartella o estrazione idefinita.\n"); break; } ind=ambo(c,e); if (ind<0) { printf("Errore: nessun ambo riscontrato.\n"); break; } printf("Ambo all'estrazione %d-esima.\n",ind); break; case 6: if (!estr || !cart) { printf("Cartella o estrazione idefinita.\n"); break; } ind=terno(c,e); if (ind<0) { printf("Errore: nessun terno riscontrato.\n"); break; } printf("Terno all'estrazione %d-esima.\n",ind); break; case 7: if (!estr || !cart) { printf("Cartella o estrazione idefinita.\n"); break; } ind=tombola(c,e); if (ind<0) { printf("Errore: nessuna tombola riscontrata.\n"); break; } printf("Tombola all'estrazione %d-esima.\n",ind); break; default: printf("Scelta inesistente.\n"); break; } } while (cont); return 0; } void visCart(int c[][9]) //Visualizza una cartelle 3x9 { printf("\n*** Cartella ***\n"); for (int i=0;i<3;i++) { for (int j=0;j<9;j++) if (c[i][j]==-1) printf("| "); else printf("|%-2d",c[i][j]); printf("|\n"); } printf("\n"); } void visEstr(int e[]) //Visualizza estrazione { printf("\n*** Estrazione ***\n"); for (int i=0;i<90;i++) { printf("|%-2d",e[i]); if ( ((i+1)%10)==0) printf("|\n"); } printf("\n"); } /* Restituisce l'indice della prima estrazione alla quale la cartelle a realizza un ambo, secondo il vettore di numeri estratti e */ int ambo(int c[][9], int e[]) { int count[3]; int i; //Inizializza count for (i=0; i<3;i++) count[i]=0; for(i=0;i<90;i++) //fissa estrazione for (int j=0;j<3;j++) //fissa riga for (int k=0;k<9;k++) //fissa elemento if (c[j][k]==e[i]) { (count[j])++; if (count[j]>=2) //ambo return i+1; //all'estrazione i-esima } return -1; } int terno(int c[][9], int e[]) { int count[3]; int i; //Inizializza count for (i=0; i<3;i++) count[i]=0; for(i=0;i<90;i++) //fissa estrazione for (int j=0;j<3;j++) //fissa riga for (int k=0;k<9;k++) //fissa elemento if (c[j][k]==e[i]) { (count[j])++; if (count[j]>=3) //terno return i+1; //all'estrazione i-esima } return -1; } int tombola(int c[][9], int e[]) { int count=0; for(int i=0;i<90;i++) //fissa estrazione { if (contiene(c,e[i])) count++; if (count>=15) //tombola return i+1; //all'estrazione i-esima } return -1; } /* Restituisce 1 se la cartella c contiene il numero n, e 0 altrimenti. */ int contiene(int c[][9], int n) { for (int i=0;i<3;i++) //fissa riga for (int j=0;j<9;j++) //fissa elemento if (c[i][j]==n) return 1; return 0; }