Soluzioni prova di IG dell`11 settembre
Transcript
Soluzioni prova di IG dell`11 settembre
/* Programma B (5 punti) Scrivere un programma che legge da tastiera una sequenza di numeri interi. Non si sa quanti numeri ha la sequenza, ma si sa che la sequenza termina con il decimo numero, se esso e’ uguale al primo, altrimenti la sequenza ha altri numeri e termina quando vengono inseriti due numeri consecutivi uguali. Al termine della sequenza il programma deve stampare la media aritmetica di tutti i numeri inseriti. */ #include<stdio.h> int main() { double media; int primo, x, ultimo, cont, nri,i; scanf("%d",&primo); media=primo; for(i=1;i<=9;i++){ scanf("%d",&x); media=media+x; } if (x == primo){printf("%f", media/10); return 0;} cont=1; nri=10; do{ scanf("%d",&ultimo); nri++; media=media+ultimo; if (x == ultimo) {cont =0;} else { x =ultimo;} }while ( cont ==1); printf("%f", media/nri); return 0; } /* Programma C (6 punti) Scrivere una funzione di nome conta con un parametro formale di nome M di tipo matrice 4x4 di interi ed un parametro formale di nome X di tipo vettore di 4 interi di tipo int. La funzione conta deve restituire attraverso un valore di ritorno il numero di righe di M che coincidono esattamente con X. Svolgere il main non e’ obbligatorio e non verra’ valutato. 1 Esempio: se M fosse 11 50 11 30 21 60 21 40 31 70 31 30 41 80 41 40 e X fosse 11 21 31 41 allora la funzione conta dovrebbe restituire 2 dato che M contiene 2 righe esattamente uguali a X. */ #include<stdio.h> int conta(int M[][4], int X[]){ int r,c,tot,uguale; tot=0; for(r=0;r<4;r++){ uguale=1; for(c=0;c<4;c++){ if (M[r][c] != X[c]) {uguale=0; break;} } if (uguale == 1 ) {tot++;} } return tot; } int main() { int M[][4] = {{11,21,31,41}, {50,60,70,80}, {11,21,31,41}, {30,40,30,40}}; int X[]= {11,21,31,41}; if (conta(M,X) == 2){ printf("risposta esatta\n");} else { printf("risposta errata\n");} return 0; } /* Programma A (5 punti) Scrivere una funzione di nome g con due parametri formali di nome x e y entrambi di tipo int. La funzione g deve restituire attraverso un valore di ritorno il Massimo Comun Divisore tra x e y. Per semplicita’ si supponga che la funzione verra’ chiamata con x e y strettamente maggiori di 0. 2 Svolgere il main non e’ obbligatorio e non verra’ valutato. */ #include<stdio.h> int g(int x, int y){ int i; i=x; while (x%i != 0 || y%i != 0) { i--; } return i; } int main() { if (g(19,12) == 1 && g(9,12) == 3) printf("risposta esatta\n"); else printf("risposta sbagliata"); return 0; } /* Programma B (8 punti) Scrivere un programma che fa quanto segue: -definisce due vettori di nome A e B entrambi di 10 interi; -carica il vettore A con dati provenienti dalla tastiera. I dati devono essere inseriti in A se e solo se valgono 0 oppure 1. Il caricamento di A termina quando tutte le sue celle sono state riempite con un dato proveniente da tastiera; -carica il vettore B seguendo le stesse regole usate per il vettore A; -Il programma interpreta ogni dato nei vettori come le cifre di un numero binario e stampa a video il risultato della somma in base 2. Il programma deve anche gestire correttamente il riporto sulla cifra piu’ significativa. -Esempio: nel caso A e B fossero vettori di 3 interi cosi’ definiti: A: 1 0 1 B: 1 1 1 allora il programma dovrebbe stampare a video 1100 */ #include<stdio.h> int main() { int A[10], B[10], C[11],i, carry; i=0; do{ scanf("%d",&A[i]); 3 if (A[i] == 0 || A[i] == 1) {i++;} } while (i<10); i=0; do{ scanf("%d",&B[i]); if (B[i] == 0 || B[i] == 1) {i++;} } while (i<10); carry = 0; i=9; do{ C[i+1]= (carry+A[i]+B[i])%2; carry= (carry+A[i]+B[i])/2; i--; }while (i>=0); C[0]=carry; for(i=0;i<11;i++){ printf("%d ",C[i]); } return 0; } /* Programma A (6 punti) Scrivere una funzione di nome g con un parametro formale di tipo int di nome n ed un secondo parametro formale di nome k, il cui tipo che deve essere dedotto dallo studente in base al testo che segue. La funzione g si comporta come segue: se n minore o uguale a zero allora la funzione g deve restituire il valore -1 sia attraverso un valore di ritorno sia attraverso il parametro formale k; altrimenti, la funzione g deve restituire sia attraverso un valore di ritorno sia attraverso il parametro formale k la somma dei divisori di n. Il main non e’ obbligatorio e non verra’ valutato. */ #include<stdio.h> int g(int n, int *k){ int i; if (n<=0){ *k=-1; return -1;} *k=0; for (i=1; i<=n; i++){ if (n%i == 0){ *k = *k + i;} } 4 return *k; } int main() { int k; g(15,&k); if (k == 24){printf("risposta esatta\n");} else {printf("risposta sbagliata\n");} return 0; } /* Programma B (5 punti) Scrivere un programma che legge da tastiera una sequenza di numeri interi. Non si sa quanti numeri ha la sequenza, ma si sa che la sequenza termina con il decimo numero, se esso e’ uguale al nono, altrimenti la sequenza ha altri numeri e termina quando vengono inseriti due numeri consecutivi uguali. Al termine della sequenza il programma deve stampare la media aritmetica di tutti i numeri inseriti. */ #include<stdio.h> int main() { double media; int primo, x, ultimo, cont, nri,i; scanf("%d",&ultimo); media=media+ultimo; for(i=1 ; i<=9 ; i++){ x=ultimo; scanf("%d",&ultimo); media=media+ultimo; } if (x == ultimo){printf("%f", media/10); return 0;} cont=1; nri=10; 5 do{ scanf("%d",&ultimo); nri++; media=media+ultimo; if (x == ultimo) {cont =0;} else { x =ultimo;} }while ( cont == 1); printf("%f", media/nri); return 0; } /* Programma C (6 punti) Scrivere una funzione di nome conta con un due parametri formali di nome M ed N entrambi di tipo matrice 4x4 di interi. La funzione conta deve restituire attraverso un valore di ritorno il numero di righe di M ed N che coincidono esattamente. Svolgere il main non e’ obbligatorio e non verra’ valutato. Esempio: se M e’ 50 50 11 30 60 60 21 40 70 70 31 30 80 80 41 40 12 50 11 30 21 41 51 60 70 80 2 3 1 40 30 40 e se N e’ allora la funzione conta deve restituire 2 perche’ la seconda e quarta riga di M e N sono uguali. */ #include<stdio.h> int conta(int M[][4], int N[][4]){ int r,c,uguali,tot; tot=0; for(r=0; r<4; r++){ uguali=1; for(c=0; c<4; c++){ 6 if (M[r][c] != N[r][c]){uguali=0; break;} } if (uguali == 1){tot++;} } return tot; } int main() { int M[][4] = {{11,21,31,41}, {50,60,70,80}, {11,21,31,41}, {30,40,30,40}}; int N[][4]= {{11,21,31,41}, {50,60,70,80}, {12,21,31,41}, {30,40,30,40}}; if (conta(M,N) == 3){ printf("risposta esatta\n");} else { printf("risposta errata\n");} return 0; } /* Programma A (5 punti) Scrivere una funzione di nome g con due parametri formali di nome x e y di tipo int. La funzione g deve restituire attraverso un valore di ritorno il Minimo Comune Multiplo tra x e y. Per semplicita’ si supponga che la funzione verra’ chiamata con x e y strettamente maggiori di 0. Svolgere il main non e’ obbligatorio e non verra’ valutato. */ #include<stdio.h> int g(int x, int y){ int i; i=x; while (i%x != 0 || i%y != 0){ i++; } return i; } int main() 7 { if (g(6, 8) == 24){ printf("risposta esatta\n"); } else {printf("risposta sbagliata\n");} return 0; } /* Programma B (8 punti) Scrivere un programma che fa quanto segue: -definisce un vettore di nome A di 10 interi; -carica il vettore A con dati provenienti dalla tastiera. I dati devono essere inseriti in A se e solo se sono uguali a 0 oppure 1. Il caricamento di A termina quando tutte le sue celle sono state riempite con un dato proveniente da tastiera; -Il programma interpreta ogni dato nel vettore A come le cifre di un numero in complemento a due e si comporta come segue: se il numero e’ negativo allora stampa a video solo la frase "Numero negativo"; altrimenti il programma esegue la conversione in base 10 del numero. -Esempio: nel caso A fosse un vettore di 3 interi contenente 1 0 1 allora il dovrebbe stampare a video "Numero negativo"; se A contenesse 0 1 1 allora il stampare a video 3 dato che la conversione da complemento a due a base 10 di Si ricorda che i numeri positivi della rappresentazione in complemento a due usando lo stesso metodo usato per la conversione da base 2 a base 10. */ #include<stdio.h> int main() { int A[10], i, peso, tot; i=0; do{ scanf("%d", &A[i]); if (A[i] == 0 || A[i] == 1){ i++;} }while (i<10); if (A[0] == 1){printf("numero negativo\n"); return 0;} peso=1; tot=0; for(i=9; i>=0; i--){ tot=tot + A[i]*peso; peso=peso*2; 8 programma programma dovrebbe 011 vale 3. si convertono in base 10 } printf("%d\n", tot); return 0; } /* Programma A (6 punti) Scrivere una funzione di nome g con un parametro formale di tipo int di nome n, un parametro formale di tipo int di nome m ed un terzo parametro formale di nome k, il cui tipo che deve essere dedotto dallo studente in base al testo che segue. La funzione g si comporta come segue: se n strettamente maggiore di m allora la funzione g deve restituire il valore -1 sia attraverso un valore di ritorno sia attraverso il parametro formale k; altrimenti, la funzione g deve restituire sia attraverso un valore di ritorno sia attraverso il parametro formale k la somma di tutti i numeri dispari compresi tra n ed m estremi inclusi. Il main non e’ obbligatorio e non verra’ valutato. */ #include<stdio.h> int g(int n, int m, int *k){ int i; *k=0; if (n>m) {*k=-1; return *k;} for(i=n; i<=m; i++){ if (i%2 == 1){ *k = *k + i;} } return *k; } int main() { int k; g(2, 5, &k); if (k == 8){printf("risposta esatta\n");} else {printf("risposta errata\n");} return 0; } 9 testi.odt 15/09/2012 17.29.18 9CFU 1/16 Esame di Informatica Generale 11 settembre 2012 Professori: Carulli, Fiorino Docente Carulli Fiorino Risultati Scritto Orali Cognome: Nome: Nro di Matricola: Docente: QUESTO COMPITO E’ SOLO ED ESCLUSIVAMENTE PER GLI STUDENTI DEL VECCHIO ORDINAMENTO DA 9 CFU Domanda 1 (1 punto ) Svolgere la seguente sottrazione in base 5: 2335 3335 Scrivere nell’area svolgimento grigia qui sotto la descrizione dello Mettere nel riquadro qui sotto solo il risultato finale Domanda 2 (1 punto ) Svolgere la conversione da base 4 a base 2 del seguente numero: 10220014 Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale dello testi.odt 15/09/2012 17.29.18 Domanda 3 (1 punto ) Svolgere in complemento a 2 su 6 bit indicando se il risultato è corretto: 9CFU 2/16 la seguente operazione, 01101cpl2,5 – 1001cpl2,4 Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale Domanda 4 (2 punti ) Stabilire cosa stampa il seguente programma (mettere in ciascun riquadro la stampa di una riga): 1° riga: #include<stdio.h> int main() { int x, y; x=0; y=9; while (y<13) { if (!(x/2.0 == x/2)) { x++; printf("y: %d\n",y); } y++; printf("y: %d\n",y); } printf("y: %d\n",y); return 0; } 2° riga: 3° riga: 4° riga: 5° riga: dello testi.odt 15/09/2012 17.29.18 9CFU 3/16 Domanda 5 (2 punti ) Dato il seguente programma C indicare i valori visualizzati (mettere in ciascun riquadro la stampa di una riga): #include<stdio.h> #include<stdlib.h> int T(int *z) { printf("*** In T ***\n"); *z=3+*z; printf("z: %d\n",*z); return *z; printf("*** Fine T ***\n"); } int main(void) { int a,b; b=15; b=T(&b); printf("b:%d\n", b); b=T(&b); printf("b:%d\n", b); system("pause"); return 0; } 1° riga 2° riga 3° riga 4° riga 5° riga 6° riga Domanda 6 (3 punti) Il seguente programma stampa 10 righe. Mettere in ciascun riquadro la stampa di una riga. testi.odt 15/09/2012 17.29.18 #include<stdio.h> #include<stdlib.h> int H(int x, int y){ printf("H ritorna: %d\n", x+y+1); return x+y+1; 1° Riga 2° Riga } void K(int &z){ int f; f=z+1; z=H(3*f, 3*f); printf("z: %d, f: %d\n",z,f); } 3° Riga int main(void){ int a,b; a=1; b=2; a=H(H(a,a), H(b,b)); printf("a: %d, b: %d\n",a, b); K(a); printf("a: %d, b: %d\n",a, b); K(b); printf("a: %d, b: %d\n",a, b); system("pause"); return 1; } 5° Riga 4° Riga 6° Riga 7° Riga 8° Riga 9° Riga 10° Riga 9CFU 4/16 testi.odt 15/09/2012 17.29.18 9CFU 5/16 Esame di Informatica Generale 11 settembre 2012 Professori: Carulli, Fiorino Docente Carulli Fiorino Risultati Scritto Orali Cognome: Nome: Nro di Matricola: Docente: QUESTO COMPITO E’ SOLO ED ESCLUSIVAMENTE PER GLI STUDENTI DEL VECCHIO ORDINAMENTO DA 9 CFU Domanda 1 (1 punto ) Svolgere la seguente sottrazione in base 5: 2335 3335 Scrivere nell’area svolgimento grigia qui sotto la descrizione dello Mettere nel riquadro qui sotto solo il risultato finale Domanda 2 (1 punto ) Svolgere la conversione da base 4 a base 2 del seguente numero: 10220014 Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale dello testi.odt 15/09/2012 17.29.18 Domanda 3 (1 punto ) Svolgere in complemento a 2 su 6 bit indicando se il risultato è corretto: 9CFU 6/16 la seguente operazione, 01101cpl2,5 – 1001cpl2,4 Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale Domanda 4 (2 punti ) Stabilire cosa stampa il seguente programma (mettere in ciascun riquadro la stampa di una riga): 1° riga: #include<stdio.h> int main() { int x, y; x=3; y=10; while (y<13) { if (!(x/4.0 == x/4)) { x++; printf("y: %d\n",y); } y++; printf("y: %d\n",y); } printf("y: %d\n",y); return 0; } 2° riga: 3° riga: 4° riga: 5° riga: dello testi.odt 15/09/2012 17.29.18 9CFU 7/16 Domanda 5 (2 punti ) Dato il seguente programma C indicare i valori visualizzati (mettere in ciascun riquadro la stampa di una riga): #include<stdio.h> #include<stdlib.h> int T(int *z) { printf("*** In T ***\n"); *z=3+*z; printf("z: %d\n",*z); return *z; printf("*** Fine T ***\n"); } int main(void) { int a,b; b=15; b=T(&b); printf("b:%d\n", b); b=T(&b); printf("b:%d\n", b); system("pause"); return 0; } 1° riga 2° riga 3° riga 4° riga 5° riga 6° riga Domanda 6 (3 punti) Il seguente programma stampa 10 righe. Mettere in ciascun riquadro la stampa di una riga. testi.odt 15/09/2012 17.29.18 #include<stdio.h> #include<stdlib.h> int H(int x, int y){ printf("H ritorna: %d\n", x+y+1); return x+y+1; 1° Riga 2° Riga } void K(int &z){ int f; f=z+1; z=H(3*f, 3*f); printf("z: %d, f: %d\n",z,f); } 3° Riga int main(void){ int a,b; a=1; b=2; a=H(H(a,a), H(b,b)); printf("a: %d, b: %d\n",a, b); K(a); printf("a: %d, b: %d\n",a, b); K(b); printf("a: %d, b: %d\n",a, b); system("pause"); return 1; } 5° Riga 4° Riga 6° Riga 7° Riga 8° Riga 9° Riga 10° Riga 9CFU 8/16 testi.odt 15/09/2012 17.29.18 9CFU 9/16 Esame di Informatica Generale 11 settembre 2012 Professori: Carulli, Fiorino Docente Carulli Fiorino Risultati Scritto Orali Cognome: Nome: Nro di Matricola: Docente: QUESTO COMPITO E’ SOLO ED ESCLUSIVAMENTE PER GLI STUDENTI DEL NUOVO ORDINAMENTO DA 5 O 6 CFU. Quesito 1 (1 punto) Mostrando i passaggi effettuati, eseguire la seguente operazione su numeri a 5 bit in complemento a due: (00101+11111)-01110 Scrivere nell’area svolgimento grigia qui sotto la descrizione dello Mettere nel riquadro qui sotto solo il risultato finale Quesito 2 (1 punto) Mostrando i passaggi effettuati, se possibile trasformare da base dieci a complemento a 2 con 7 cifre il numero 9, altrimenti spiegare perché non è possibile. Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale dello testi.odt 15/09/2012 17.29.18 9CFU 10/16 Quesito 3 (2 punti) Il seguente programma stampa 4 righe. Mettere in ciascun riquadro la stampa di una riga #include<stdio.h> 1° riga: int main(void){ int a,b; a=4; b=6; 2° riga: while (b==b){ do { 3° riga: b++; printf("%d\n",b); }while ((b%20)%5 != a); printf("%d\n",b); 4° riga: system("pause"); return 0; } printf("%d\n",b); system("pause"); return 1; } Quesito 4 (3 punti) Il seguente programma stampa 4 righe. Mettere in ciascun riquadro la stampa di una riga. #include<stdio.h> int main(void){ int i,j,b; i=2; j=8; b=1; printf("%d %d %d\n",i,j,b); while(i<j) { if(i%4 == 0){ b=b+1; printf("%d %d %d\n",i,j,b); if (i%4 != 0){ b=b*2; printf("%d %d %d\n",i,j,b); } } else { b=b*10; printf("%d %d %d\n",i,j,b); } i=i*3; printf("%d %d %d\n",i,j,b); 1° riga 2° riga 3° riga 4° riga testi.odt 15/09/2012 17.29.18 j=j-2; printf("%d %d %d\n",i,j,b); } return 0; } 9CFU 11/16 testi.odt 15/09/2012 17.29.18 9CFU 12/16 Quesito 5 (3 punti) Il seguente programma stampa 10 righe. Mettere in ciascun riquadro la stampa di una riga. #include<stdio.h> 1° Riga #include<stdlib.h> int H(int x, int y){ printf("H ritorna: %d\n", x+y+1); return x+y+1; 2° Riga } void K(int &z){ int f; f=z+1; z=H(3*f, 3*f); printf("z: %d, f: %d\n",z,f); } 3° Riga int main(void){ int a,b; a=1; b=2; a=H(H(a,a), H(b,b)); printf("a: %d, b: %d\n",a, b); K(b); printf("a: %d, b: %d\n",a, b); K(a); printf("a: %d, b: %d\n",a, b); system("pause"); return 1; } 5° Riga 4° Riga 6° Riga 7° Riga 8° Riga 9° Riga 10° Riga testi.odt 15/09/2012 17.29.18 9CFU 13/16 Esame di Informatica Generale 11 settembre 2012 Professori: Carulli, Fiorino Docente Carulli Fiorino Risultati Scritto Orali Cognome: Nome: Nro di Matricola: Docente: QUESTO COMPITO E’ SOLO ED ESCLUSIVAMENTE PER GLI STUDENTI DEL NUOVO ORDINAMENTO DA 5 O 6 CFU. Quesito 1 (1 punto) Mostrando i passaggi effettuati, eseguire la seguente operazione su numeri a 5 bit in complemento a due: (00101+11111)-01110 Scrivere nell’area svolgimento grigia qui sotto la descrizione dello Mettere nel riquadro qui sotto solo il risultato finale Quesito 2 (1 punto) Mostrando i passaggi effettuati, se possibile trasformare da base dieci a complemento a 2 con 7 cifre il numero 9, altrimenti spiegare perché non è possibile. Scrivere nell’area svolgimento grigia qui sotto la descrizione Mettere nel riquadro qui sotto solo il risultato finale dello testi.odt 15/09/2012 17.29.18 9CFU 14/16 Quesito 3 (2 punti) Il seguente programma stampa 4 righe. Mettere in ciascun riquadro la stampa di una riga #include<stdio.h> 1° riga: #include<stdlib.h> int main(void){ int a,b; a=4; 2° riga: b=8; while (b==b){ do 3° riga: { b++; printf("%d\n",b); }while ((b%20)%7 != a); 4° riga: printf("%d\n",b); system("pause"); return 0; } printf("%d\n",b); system("pause"); return 1; } Quesito 4 (3 punti) Il seguente programma stampa 4 righe. Mettere in ciascun riquadro la stampa di una riga. #include<stdio.h> int main(void){ int i,j,b; i=2; j=15; b=2; printf("%d %d %d\n",i,j,b); while(i<j) { if(i%4 == 0){ b=b+1; printf("%d %d %d\n",i,j,b); if (i%4 != 0){ b=b*2; printf("%d %d %d\n",i,j,b); } } else { b=b*10; printf("%d %d %d\n",i,j,b); } i=i*4; printf("%d %d %d\n",i,j,b); j=j-8; printf("%d %d %d\n",i,j,b); } return 0; 1° riga 2° riga 3° riga 4° riga testi.odt } 15/09/2012 17.29.18 9CFU 15/16 testi.odt 15/09/2012 17.29.18 9CFU 16/16 Quesito 5 (3 punti) Il seguente programma stampa 10 righe. Mettere in ciascun riquadro la stampa di una riga. #include<stdio.h> 1° Riga #include<stdlib.h> int H(int x, int y){ printf("H ritorna: %d\n", x+y+1); return x+y+1; 2° Riga } void K(int &z){ int f; f=z+1; z=H(3*f, 3*f); printf("z: %d, f: %d\n",z,f); } 3° Riga int main(void){ int a,b; a=1; b=2; a=H(H(a,a), H(b,b)); printf("a: %d, b: %d\n",a, b); K(a); printf("a: %d, b: %d\n",a, b); K(b); printf("a: %d, b: %d\n",a, b); system("pause"); return 1; } 5° Riga 4° Riga 6° Riga 7° Riga 8° Riga 9° Riga 10° Riga