Saggio di Informatica – Classe 3A (B)
Transcript
Saggio di Informatica – Classe 3A (B)
04 Marzo 2015 Saggio di Informatica – Classe 3A (B) CONSEGNE Scegli uno o più quesiti a piacere e svolgili in modo completo. Per ciascun quesito affrontato, produci: 1. Un frammento significativo del DABS risolutivo; 2. Il codice in C completo e documentato; 3. Un campione significativo di dati di prova; 4. Modelli e rappresentazioni grafiche a corredo. PROBLEMI 1. Accettare in input una qualsiasi data( gg:mm:aaaa) con anno non bisestile nell’intervallo di annualità [inf , sup], essendo inf un qualsiasi anno precedente il 1960 ma successivo al 1952. (PUNTI 2) 2. Data una matrice EUR di valori monetari (espressi in euro): a) Definire e valorizzare la matrice; b) generare il vettore SC delle somme di colonna ; c) Produrre in output su righe diverse la matrice EUR ed il vettore SC (PUNTI 2) 3. Il Sudoku usa una matrice 9x9 composta da 9 sottomatrici 3x3. Si chiede di: a) Definire un array a più dimensioni che consenta di identificare ogni sottomatrice con due indici, ed operare in modo diretto su ciascuna di esse come se si trattasse di una matrice a se stante; b) valorizzare in fase di dichiarazione la sottomatrice di indici (1 , 2) in modo da assegnarle le seguenti 3(tre) terne di valori: 5 1 7 3 2 6 9 8 4 c) Produrre in output una qualsiasi delle sottomatrici specificata attraverso una coppia di indici valorizzati mediante input. (PUNTI 4) 4. A partire dall’esercizio 3. precedente si chiede di: a) Determinare se, data una qualsiasi sottomatrice della griglia di un Sudoku, essa è completa (si codifichi ciascuna casella libera secondo una convenzione ragionevole); b) Stabilire se, data una qualsiasi sottomatrice, essa è completa e valida (cioè contiene tutti i numeri da 1(uno) a 9 (nove); c) Determinare se tutte le sottomatrici della griglia di un Sudoku sono complete e valide; d) Determinare se, una data matrice, può rappresentare un Sudoku completamente risolto; e) Produrre in output tutta la griglia del Sudoku e un messaggio relativo alla sua risoluzione. (PUNTI 6) 5. Data la matrice rettangolare Cruciverba di dimensioni MxN, si chiede di: a) Usare la tecnica della generazione pseudocasuale per costruire uno schema di cruciverba tenendo presente che la griglia non deve mai contenere blocchi rettangolari di 4 o più caselle nere); b) Definire e valorizzare il vettore Orizzontali contenente i numeri delle caselle che nella griglia individuano la prima lettera di ciascuna parola orizzontale ; c) Produrre in output lo schema del cruciverba e la colonna dei numeri delle definizioni orizzontali. (PUNTI 5) 6. L’array T, di capacità N, contiene una stringa che rappresenta una qualsiasi frase della lingua italiana (da intendersi come serie di parole ciascuna delle quali separata dalla successiva da uno o più spazi). a) Definire e valorizzare l’array T; b) Definire e poi usare una matrice EP a 2 dimensioni in modo che le sue prime K righe contengano le K parole presenti nella frase in T; c) Produrre in output la stringa in T e la lista numerata delle parole contenute in EP. (PUNTI 5) 7. L’array V, di capacità K, contiene una serie di P parole, ciascuna separata da un solo carattere di spaziatura (“ “) dalla parola che la segue. a) Definire e valorizzare l’array V; b) Definire e poi usare una matrice POS a due dimensioni in modo tale che ciascuna riga di POS contenga le posizioni del primo e dell’ultimo carattere di ciascuna delle P parole presenti nell’array V; c) Consentire che l’utente possa chiedere la visualizzazione di una qualsiasi sequenza di caratteri di V specificando un indice appropriato su POS; d) Produrre in output su righe successive il contenuto di V, la riga di POS di indice specificato, e la sequenza di caratteri individuata in V. (PUNTI 4) 8. Si consideri una assegnata matrice di caratteri ICS di dimensione NxN. Determinare se: a) La cornice di caratteri più grande rappresentabile in ICS è formata dalla alternanza di 2 soli caratteri; b) Le righe di indici j ed k contengono gli stessi caratteri indipendentemente dall’ordine; c) Le colonne di indici u e vcontengono gli stessi caratteri nello stesso ordine; d) La diagonale secondaria è formata solo da caratteri numerici; e) Produrre in output su righe successive: la cornice di caratteri, le righe di indici j e k, le colonne di indici u e v, e la diagonale secondaria. (PUNTI 3) 9. La matrice TI può memorizzare come stringhe nelle sue R righe al più R-1 parole della lingua italiana, dato che l’ultima parola utile è sempre seguita da una stringa di soli caratteri chiocciola (“at”). Si chiede di definire ed usare un array V che permetta di concatenate tutte le parole di TI separando con un solo carattere trattino orizzontale “-“ ogni parola dalla parola che la segue: il programma deve produrre in output il contenuto di V ed il numero delle parole in esso presenti (PUNTI 5) /* SOLUZIONE compito classe 3 04 Marzo 2015 */ #include <stdio.h> #include <conio.h> #include <math.h> #include <string.h> #define N 200 #define ROW N/2 #define #define #define #define #define R 50 MAX_LUN_PAR_ITA 25 DIM R*MAX_LUN_PAR_ITA STR_AT "@@@@@@@@@@@@@@@@" BLANK " " #define M 20 #define N 30 main(){ int i, j, r, c, inizio, fine, primoB, iCar, iPar; int nove[] = {-10,1,2,3,4,5,6,7,8,9}; /* PROBLEMA #6 CAMPIONI DI DATI DI INPUT (per il testing di base del programma) char T[N+1]={"ITALIANO: Maria aveva un piccolo agnellino INGLESE: Mary had a little lamb"}; char T[N+1]={"ITALIANO:"}; char T[N+1]={""}; char T[N+1]={"ITALIANO: INGLESE:"}; char T[N+1]={"Vi-va la pa-ppa pa-ppa col po-popo-popo-popo-modoro viva la pa-ppa pa-ppa che e' un ca-caca-capo-popo-lavoro"}; */ /*-------------------------------------------------------------------*/ char T[N+1]={"a b c d e f g h i l m n o p q r s t u v z A B C D E F G H I L M N O P Q R S T U V Z"}; char EP[ROW][N+1]; /*-------------------------------------------------------------------*/ char TI[R][MAX_LUN_PAR_ITA + 1] = {"Informatica", "Linguaggio", "Istruzione", "Iterazione", "Selezione", "while", "for", "if", "if-else", "switch-case", "void", "NULL", "int", STR_AT }; char V[DIM]; int sizeV; /*--------------------------------------------------------------------*/ /* PROBLEMA # 3 (SUDOKU) */ /* int sudoku[9][3][3]={ {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} , {{5,1,7},{3,2,6},{0,0,0}} , {{0,0,0},{0,0,0},{0,0,0}} }; int suDoku[3][3][9]={ {{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}} , {{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}}, {{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}} }; */ int Sudoku[3][3][3][3] = { { { {8,7,-2} , {60,-1,0} , {0,7,8} }, { {0,0,0} , {0,0,0} , {0,0,0} }, { {0,0,0} , {0,0,0} , {0,0,0} } }, { { {0,0,0} , {0,0,0} , {0,0,0} }, { {2,5,8} , {3,4,7} , {8,2,1} }, { {0,0,0} , {0,0,0} , {0,0,0} } }, { { {0,0,0} , {0,0,0} , {0,0,0} }, { {0,0,0} , {0,0,0} , {0,0,0} },{ {5,1,7} , {3,2,6} , {9,8,4} } } }; /* Il 1-0 ciclo individua - se esiste - l'inizio della prima 'parola' in T[] Esegue lo skipping di tutti i blank in testa */ puts("\t\t\t\tPROBLEMA #6"); i = 0; while(T[i] != '\0') if (T[i] == ' ') i++; else{ inizio = i; break; } if (T[i] == '\0'){ puts("Non ci sono parole da elaborare\n PREMI il tasto INVIO (ENTER) per terminare il programma..."); getch(); return; } /* FINE 1-0 CICLO */ /* CICLO PRINCIPALE Usa la variabile flag 'primoB' (primo blank) come variabile logica per stabilire se è iniziata la fase di skipping dei blank di separazione tra due parole consecutive. La variabile è settata a 1 non appena si rileva il primo blank della sequenza di blank di separazione. La variabile è settata a 0 quando si incontra il primo carattere della parola successiva. Il valore di questa variabile consente di determinare le posizioni del primo e dell'ultimo carttere di ogni parola. */ primoB = 0; iPar = 0; while (T[i] !='\0'){ if (T[i] == ' ' && !primoB){ fine = i - 1; primoB = 1; for(iCar=inizio, j=0; iCar <= fine; iCar++,j++) EP[iPar][j]=T[iCar]; EP[iPar][j]='\0'; iPar++; } if (T[i] != ' ' && primoB){ inizio = i; primoB = 0; } i++; } /* Dell'ultima parola potrebbe non essere stata rilevata la posizione dell'ultimo carattere se l'ultimo carattere è subito seguito dal carattere NULL: in questo caso si dovrà eseguire una copia fuori-ciclo */ if (T[i-1] != ' '){ fine = i-1; for(iCar=inizio, j=0; iCar <= fine; iCar++,j++) EP[iPar][j]=T[iCar]; EP[iPar][j]='\0'; iPar++; } for(i=0; i < iPar; i++) printf("%d) %s\n",i+1,EP[i]); getch(); /*-------------------------------------------------------------------*/ puts("\t\t\t\tPROBLEMA #9"); /*-------------------------------------------------------------------*/ puts("\nEcco le parole da concatenare:\n"); i = 0; while(strcmp(TI[i],STR_AT) != 0){ printf("%d) %s\n",i+1,TI[i]); i++; } i = 0; if (strcmp(TI[i],STR_AT) != 0) strcpy(V,TI[i]); strcat(V,BLANK); i++; while(strcmp(TI[i],STR_AT) != 0){ strcat(V,TI[i]); strcat(V,BLANK); i++; } sizeV = strlen(V); V[sizeV - 1]='\0'; puts("\nEcco le parole concatenate:\n"); puts(V); getch(); /*-------------------------------------------------------------------*/ puts("\n\n\n\t\t\t\tPROBLEMA #3 (SUDOKU I) "); /*-------------------------------------------------------------------*/ puts("\nSOTTOMATRICE del Sudoku di indici (2,2):\n"); for (i=0;i<3;i++){ printf("\t"); for(j=0; j<3; j++) printf("%d ",Sudoku[2][2][i][j]); puts(""); } getch(); do{ printf("Immetti 2 numeri compresi tra 0 e 2 (inclusi):..."); scanf("%d %d",&r,&c); } while (r<0 || r >2 || c<0 || c>2); printf("\nHai scelto di visualizzare la SOTTOMATRICE del Sudoku di indici (%d , %d)\n",r,c); for (i=0;i<3;i++){ printf("\t"); for(j=0; j<3; j++) printf("%d ",Sudoku[r][c][i][j]); puts(""); } getch(); /*-------------------------------------------------------------------*/ puts("\n\n\n\t\t\t\tPROBLEMA #4 (SUDOKU II)"); /*-------------------------------------------------------------------*/ /* La presenza di uno 0 (zero) indica un valore mancante */ /*Una sottomatrice è INCOMPLETA se contiene almeno uno 0 (zero)*/ /* PUNTO 4.a */ /* CODICE COMMENTATO sino a PUNTO 4.b incluso fine = 0; i=0;j=0; r = 0; while (r < 3){ c = 0; while (c < 3){ if (Sudoku[i][j][r][c] == 0){ r = 2; c = 3; fine = 1; } else c++; } r++; } if (fine==1) printf("La SOTTOMATRICE di indici (%d,%d) e' INCOMPLETA ", i,j); else printf("La SOTTOMATRICE di indici (%d,%d) e' COMPLETA ", i,j); getch(); /* PUNTO 4.b */ fine = 0; i=1;j=1; r = 0; while (r < 3){ c = 0; while (c < 3){ if (Sudoku[i][j][r][c] < 1 || Sudoku[i][j][r][c] > 9 || nove[Sudoku[i][j][r][c]] == 0){ r = 2; c = 3; fine = 1; } else { nove[Sudoku[i][j][r][c]] = 0; c++; } } r++; } if (fine == 1) printf("\nLa SOTTOMATRICE di indici (%d,%d) NON E'VALIDA ", i,j); else printf("\nLa SOTTOMATRICE di indici (%d,%d) E' VALIDA ", i,j); getch(); */ /* I punti a. e b. in effetti possono essere risolti insieme Come nel frammento successivo che permette di rilevare tutte le possibili condizioni di errore su tutti gli elementi della matrice (i due codici precedenti interrompono l’iterazione non appena si verifica un errore */ /* Soluzione 4.a + 4.b con iterazione estesa a tutti gli elementi della matrice */ fine = 0; /* variabile flag */ i=0;j=0; r = 0; while (r < 3){ c = 0; while (c < 3){ if (Sudoku[i][j][r][c] == 0){ if ( fine != 1 && fine != 3 && fine != 5 && fine != 7) fine += 1; } else if (Sudoku[i][j][r][c] < 0 || Sudoku[i][j][r][c] > 9){ if (fine != 2 && fine != 3 && fine != 6 && fine !=7) fine += 2; } else if (nove[Sudoku[i][j][r][c]] == 0){ if (fine !=4 && fine !=5 && fine !=6 && fine != 7) fine += 4; } else nove[Sudoku[i][j][r][c]] = 0; c++; } } r++; } switch (fine){ case 1: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' INCOMPLETA (Caselle Vuote)", i,j); break; case 2: printf("\nLa SOTTOMATRICE di indici (%d,%d) NON E'VALIDA (Contiene numeri errati)", i,j); break; case 3: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' INCOMPLETA (Caselle Vuote) e NON E'VALIDA (Contiene numeri errati)", i,j); break; case 4: printf("\nLa SOTTOMATRICE di indici (%d,%d) NON E'VALIDA (Numeri Ripetuti)", i,j); break; case 5: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' INCOMPLETA (Caselle Vuote) e NON E'VALIDA (Numeri Ripetuti)", i,j); break; case 6: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' INCOMPLETA (Caselle Vuote) e NON E'VALIDA (Numeri Errati)", i,j); break; case 7: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' INCOMPLETA (Caselle Vuote) e NON E'VALIDA (Numeri Errati e Ripetuti)", i,j); break; default: printf("\nLa SOTTOMATRICE di indici (%d,%d) E' VALIDA (Caselle Incomplete)", i,j); break; } printf("\nLa variabile 'fine' = getch(); } %d\n",fine);