NOME COGNOME MATRICOLA S A/1 AAA-BARC BARD-BOUH BOUI-CART CARU-CONS CARU-CONS CONT-DEMAR DEMAS-FERRD FERRE-GIAQ GIAR-LAEZ LAFA-MANC MAND-MIQZ MIRA-PAHZ PAIA-PODD PODE-ROSSE ROSSF-SIQZ SIRA-TUCB TUCC-ZZZ Poli@Home 5 Crediti AAA-LIB/English LIC-ZZZ/English Altro:... DOMANDA 1 Dati i numeri interi n1 e n2, espressi in decimale, indicare la loro rappresentazione in binario naturale e specificare quanti bytes sono necessari per rappresentarli: n1= 392 n2= 56 Passaggi Risultato n1 (2) = bytes per n1 = n2 (2) = bytes per n2 = DOMANDA 2 Dire se le seguenti espressioni logiche sono equivalenti: ((A B ) (A+B ))+(B C ) = (A B )+(B C ) e giustificare la risposta Risposta DOMANDA 3 Spiegare in cosa consiste la fase di compilazione che avviene prima del linking di un programma. In particolare, spiegare quale tipo di file prende in input e quale tipo di file viene generato da un compilatore. Risposta
DOMANDA 4 (PROGRAMMAZIONE) Scrivere un programma in C per identificare la parola ripetuta più volte all'interno di un file di testo. A tal proposito si facciano le seguenti assunzioni: - Il nome del file viene specificato come primo argomento sulla linea di comando - Il numero di caratteri e di parole nel file non è noto al momento della compilazione - Il file contiene unicamente lettere maiuscole, spazi e caratteri di new-line. - Il file di testo è composto da più righe - Sono previste al massimo 5000 parole distinte - Ciascuna parola è composta al massimo da 20 lettere - Le parole sono separate da uno o più spazi - In caso le parole ripetute più volte all interno del testo siano più di una, stampare quella che compare prima nel testo - Viene altresì richiesto di stampare il numero di volte che tale parola compare nel testo Ad esempio, se il file fiaba.txt contiene il testo riportato di seguito: IL LUPO PENSA QUANTO QUELLA BAMBINETTA BELLA E MORBIDINA SIA PROPRIO UN BOCCONCINO PRELIBATO SAREBBE CERTO STATA ANCORA MEGLIO DELLA VECCHIA DECIDE DI MANGIARE SIA LA BAMBINETTA CHE LA VECCHIA C:\> esame fiaba.txt La parola contenuta più volte all interno del file fiaba.txt è: BAMBINETTA (2 ripetizioni)
#include <stdio.h> #include <stdlib.h> #include <string.h> /* AS 2015.06.22 - Turno A - Fila 3 */ /* Scrivere un programma in C per identificare la parola ripetuta più volte all'interno di un file di testo. A tal proposito si facciano le seguenti assunzioni: - Il nome del file viene specificato come primo argomento sulla linea di comando - Il numero di caratteri e di parole nel file non è noto al momento della compilazione - Il file contiene unicamente lettere maiuscole, spazi e caratteri di new-line. - Il file di testo è composto da più righe - Sono previste al massimo 5000 parole distinte - Ciascuna parola è composta al massimo da 20 lettere - Le parole sono separate da uno o più spazi - In caso le parole ripetute più volte all interno del testo siano più di una, stampare quella che compare prima nel testo - Viene altresì richiesto di stampare il numero di volte che tale parola compare nel testo Ad esempio, se il file fiaba.txt contiene il testo riportato di seguito: IL LUPO PENSA QUANTO QUELLA BAMBINETTA BELLA E MORBIDINA SIA PROPRIO UN BOCCONCINO PRELIBATO SAREBBE CERTO STATA ANCORA MEGLIO DELLA VECCHIA DECIDE DI MANGIARE SIA LA BAMBINETTA CHE LA VECCHIA C:\> esame fiaba.txt La parola contenuta più volte all interno del file fiaba.txt è: BAMBINETTA (2 ripetizioni) */ #define MAXLEN (20+1) #define N 5000 #define VERO 1 #define FALSO 0 int main(int argc, char *argv[]) { FILE *f; int frequenze[n]; int n; char parola[maxlen]; char dizionario[n][maxlen]; int i; int trovato, pos, max; if(argc!= 2) { printf("utilizzo: <nome_programma> <nome_file>\n"); if( (f = fopen(argv[1], "r")) == NULL) { printf("impossibile aprire il file %s.\n", argv[1]); for(i=0; i<n; i++) { frequenze[i] = 0; n = 0; while( fscanf(f, "%s", parola)!= EOF ) { /* ricerca parola in dizionario */ trovato = FALSO; for(i=0; i<n; i++) { if(strcmp(parola,dizionario[i])==0) { trovato = VERO; pos = i;
if(!trovato) { strcpy(dizionario[n], parola); pos = n; n++; frequenze[pos]++; fclose(f); max = -1; for(i=0;i<n;i++) { if(frequenze[i]>max) { max = frequenze[i]; pos = i; printf("la parola contenuta piu' volte all' interno del file %s e': %s (%d ripetizioni)\n", argv[1], dizionario[pos], frequenze[pos]); return 0;
NOME COGNOME MATRICOLA S A/2 AAA-BARC BARD-BOUH BOUI-CART CARU-CONS CARU-CONS CONT-DEMAR DEMAS-FERRD FERRE-GIAQ GIAR-LAEZ LAFA-MANC MAND-MIQZ MIRA-PAHZ PAIA-PODD PODE-ROSSE ROSSF-SIQZ SIRA-TUCB TUCC-ZZZ Poli@Home 5 Crediti AAA-LIB/English LIC-ZZZ/English Altro:... DOMANDA 1 Dati i numeri interi n1 e n2, espressi in decimale, indicare la loro rappresentazione in binario naturale e specificare quanti bytes sono necessari per rappresentarli: n1= 622 n2= 250 Passaggi Risultato n1 (2) = bytes per n1 = n2 (2) = bytes per n2 = DOMANDA 2 Dire se le seguenti espressioni logiche sono equivalenti: ((A B) + (A C)) + ((A C) + C) = 0 + B + C e giustificare la risposta. Risposta DOMANDA 3 Spiegare in cosa consiste la fase di linking di un programma. In particolare, spiegare quale tipo di file prende in input e quale tipo di file viene generato dal linker. Risposta
DOMANDA 4 (PROGRAMMAZIONE) Dati due file di testo contenenti sequenze di numeri interi, scrivere un programma in C per determinare quante volte la sequenza memorizzata nel primo file è contenuta nella seconda (stessi numeri consecutivi, quindi nello stesso ordine). Si stampino a video i numeri delle righe del secondo file in cui ha inizio la sequenza di interesse (si assuma la prima riga con indice 0) A tal proposito si facciano le seguenti assunzioni: - I nomi del primo e del secondo file vengono specificati in tale ordine come argomenti sulla linea di comando - Si assuma che la sequenza contenuta nel primo file sia sempre più corta di quella del secondo - I file contengono al massimo 00 valori - I valori sono specificati uno per riga Ad esempio, se il file seq1.txt contiene: ed il file seq2.txt contiene: 18 99 C:\> esame seq1.txt seq2.txt Match 1 a partire dalla riga 1 Match 2 a partire dalla riga 3 La sequenza 1 è contenuta 2 volte nella sequenza 2
#include <stdio.h> #include <stdlib.h> /* AS 2015.06.22 - Turno A - Fila 2 */ /* Dati due file di testo contenenti sequenze di numeri interi, scrivere un programma in C per determinare quante volte la sequenza memorizzata nel primo file è contenuta nella seconda (stessi numeri consecutivi, quindi nello stesso ordine). Si stampino a video i numeri delle righe del secondo file in cui ha inizio la sequenza di interesse (si assuma la prima riga con indice 0) A tal proposito si facciano le seguenti assunzioni: - I nomi del primo e del secondo file vengono specificati in tale ordine come argomenti sulla linea di comando - Si assuma che la sequenza contenuta nel primo file sia sempre più corta di quella del secondo - I file contengono al massimo 00 valori - I valori sono specificati uno per riga Ad esempio, se il file seq1.txt contiene: ed il file seq2.txt contiene: 18 99 C:\> esame seq1.txt seq2.txt Match 1 a partire dalla riga 1 Match 2 a partire dalla riga 3 La sequenza 1 è contenuta 2 volte nella sequenza 2 */ #define N 00 #define VERO 1 #define FALSO 0 int main(int argc, char *argv[]) { FILE *f; int seq1[n], seq2[n]; int nseq1, nseq2; int v; int i,j; int trovato; int contatore; if(argc!= 3) { printf("utilizzo: <nome_programma> <nome_file_1> <nome_file_2>\n"); if( (f = fopen(argv[1], "r")) == NULL) { printf("impossibile aprire il file %s.\n", argv[2]); i = 0; while( fscanf(f, "%d", &v)!= EOF ) { seq1[i] = v; i++; nseq1 = i;
fclose(f); if( (f = fopen(argv[2], "r")) == NULL) { printf("impossibile aprire il file %s.\n", argv[2]); i = 0; while( fscanf(f, "%d", &v)!= EOF ) { seq2[i] = v; i++; nseq2 = i; fclose(f); contatore = 0; for(i=0; i<nseq2; i++) { trovato = VERO; for(j=0; j<nseq1; j++) { if(seq2[i+j]!= seq1[j]) { trovato = FALSO; if(trovato) { contatore++; printf("match %d a partire dalla riga %d\n", contatore, i); printf("la sequenza 1 e' contenuta %d volte nella sequenza 2.\n", contatore); return 0;
NOME COGNOME MATRICOLA S A/3 AAA-BARC BARD-BOUH BOUI-CART CARU-CONS CARU-CONS CONT-DEMAR DEMAS-FERRD FERRE-GIAQ GIAR-LAEZ LAFA-MANC MAND-MIQZ MIRA-PAHZ PAIA-PODD PODE-ROSSE ROSSF-SIQZ SIRA-TUCB TUCC-ZZZ Poli@Home 5 Crediti AAA-LIB/English LIC-ZZZ/English Altro:... DOMANDA 1 Dati i numeri interi n1 e n2, espressi in decimale, indicare la loro rappresentazione in binario naturale e specificare quanti bytes sono necessari per rappresentarli: n1= 342 n2= 450 Risultato n1 (2) = bytes per n1 = n2 (2) = bytes per n2 = Passaggi DOMANDA 2 Dire se le seguenti espressioni logiche sono equivalenti: ((A B) + (A C)) + ((A C) + D) = 1 +B + C + D e giustificare la risposta Risposta DOMANDA 3 Spiegare le principali differenze tra file sorgente e file eseguibile. Risposta
DOMANDA 4 (PROGRAMMAZIONE) Dati due file contenenti sequenze di numeri interi, scrivere un programma in C per determinare se tutti i numeri del secondo file compaiono almeno una volta nel primo e stampare il numero di volte che ciascun numero compare nel primo file. A tal fine si facciano le seguenti assunzioni: - I nomi del primo e del secondo file vengono specificati in ordine come argomenti sulla linea di comando - Per entrambi i file, i valori sono specificati uno per riga - Tutti i valori sono compresi tra 0 e 0 - Non si conosce la dimensione del primo file - Il secondo file contiene al massimo 500 valori nessuno dei quali duplicato Ad esempio, se il file seq1.txt contiene: 52 ed il file seq2.txt contiene: 52 C:\> esame seq1.txt seq2.txt Tutti i numeri del secondo file compaiono, almeno una volta, nel primo file. Frequenze: : 2 volte : 2 volte 52: 2 volte
#include <stdio.h> #include <stdlib.h> /* AS 2015.06.22 - Turno A - Fila 3 */ /* Dati due file contenenti sequenze di numeri interi, scrivere un programma in C per determinare se tutti i numeri del secondo file compaiono almeno una volta nel primo e stampare il numero di volte che ciascun numero compare nel primo file. A tal fine si facciano le seguenti assunzioni: - I nomi del primo e del secondo file vengono specificati in ordine come argomenti sulla linea di comando - Per entrambi i file, i valori sono specificati uno per riga - Tutti i valori sono compresi tra 0 e 0 - Non si conosce la dimensione del primo file - Il secondo file contiene al massimo 500 valori nessuno dei quali duplicato Ad esempio, se il file seq1.txt contiene: 52 ed il file seq2.txt contiene: 52 C:\> esame seq1.txt seq2.txt Tutti i numeri del secondo file compaiono, almeno una volta, nel primo file. Frequenze: : 2 volte : 2 volte 52: 2 volte */ #define N 0 #define M 500 #define VERO 1 #define FALSO 0 int main(int argc, char *argv[]) { FILE *f; int frequenze[m], seq2[m]; int nseq2; int v; int i; int tutti; if(argc!= 3) { printf("utilizzo: <nome_programma> <nome_file_1> <nome_file_2>\n"); if( (f = fopen(argv[2], "r")) == NULL) { printf("impossibile aprire il file %s.\n", argv[2]); for(i=0; i<n; i++) { frequenze[i] = -1; /* Segno nel vettore frequenze i valori presenti in seq2 */
i = 0; while( fscanf(f, "%d", &v)!= EOF ) { // seq2[i] = v; frequenze[v] = 0; i++; nseq2 = i; fclose(f); if( (f = fopen(argv[1], "r")) == NULL) { printf("impossibile aprire il file %s.\n", argv[2]); while( fscanf(f, "%d", &v)!= EOF ) { frequenze[v]++; fclose(f); */ /* Il vettore frequenze e' inizializzato a -1 tranne per i valori di seq2 che sono inizializzati a 0. Se e' presente ancora qualche 0 significa che non e' stato mai trovato almeno un valore di seq2 tutti = VERO; for(i=0; i<n; i++) { if(frequenze[i] == 0) { tutti = FALSO; if(tutti) { printf("tutti i numeri del secondo file compaiono, almeno una volta, nel primo file.\n"); printf("frequenze:\n"); for(i=0; i<n; i++) { if(frequenze[i] > 0) { printf("%d: %d volte\n", i, frequenze[i]); else { printf("non tutti i numeri del secondo file compaiono, almeno una volta, nel primo file.\n"); return 0;