Università Roma Tre – Facoltà di Scienze M.F.N. – Corso di Laurea in Matematica Corso di Informatica 1 (IN1) – Prof. Marco Liverani – a.a. 2005/2006 Soluzione della prima prova di esonero – 7 novembre 2005 Esercizio n. 1 (max 10 punti) Risolvere il seguente problema proponendo una pseudo-codifica dell’algoritmo, il diagramma di flusso ed infine la codifica in linguaggio C del programma che implementa l’algoritmo stesso. Letti in input due interi maggiori di zero, n e k, generare un vettore A di n numeri interi casuali tali che 0 ≤ ai < k; stampare il vettore A. Costruire un secondo vettore B di n elementi, tale che il generico elemento bi contenga la somma degli elementi di A dall’elemento di indice i a quello di indice n − 1. Stampare B. Esempio Supponiamo che i due interi letti in input siano n = 7 e k = 22. Sia inoltre A = (3, 12, 5, 4, 4, 9, 18) il vettore di numeri interi casuali compresi tra 0 e k = 22. Allora il vettore B sarà il seguente: B = (55, 52, 40, 35, 31, 27, 18). Soluzione Pseudo-codifica dell’algoritmo 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: leggi n, k per i = 0, 1, 2, . . . , n − 1 ripeti ai = rand() mod k fine-ciclo per i = 0, 1, 2, . . . , n − 1 ripeti scrivi ai fine-ciclo per i = 0, 1, 2, . . . , n − 1 ripeti bi = 0 per j = i, i + 1, . . . , n − 1 ripeti bi = bi + aj fine-ciclo fine-ciclo per i = 0, 1, 2, . . . , n ripeti scrivi bi fine-ciclo fermati 1 Per superare la prova di esonero e poter sostenere la successiva è necessario ottenere almeno 18 punti. 1 Diagramma di flusso Start Leggi n ek i=0 i<n No Sì i=0 ai = rand % k i<n i = i+1 No Sì i=0 Scrivi ai i = i+1 i<n No Sì i=0 bi = 0, j = i i<n j<n No Sì Stop Sì bi = b i + a j Scrivi bi i=i+1 i=i+1 j=j+1 Codifica in linguaggio C #include <stdlib.h> #include <stdio.h> #include <time.h> #define MAX 100 int genera_array(int V[]) { int n, i, k; srand((unsigned)time(NULL)); printf("Inserisci n e k: "); scanf("%d %d", &n, &k); for (i=0; i<n; i++) V[i] = rand() % k; return(n); } void stampa_array(int V[], int n) { int i; for (i=0; i<n; i++) printf("%d ", V[i]); printf("\n"); return; } 2 No void costruisci_vettore(int A[], int B[], int n) { int i, j; for (i=0; i<n; i++) { B[i] = 0; for (j=i; j<n; j++) B[i] = B[i] + A[j]; } return; } int main(void) { int A[MAX], B[MAX], n; n = genera_array(A); stampa_array(A, n); costruisci_vettore(A, B, n); stampa_array(B, n); return(1); } Esercizio n. 2 (max 6 punti) Utilizzando le regole della programmazione strutturata, scrivere il diagramma di flusso della seguente funzione codificata in linguaggio C. void funzione(int A[], int n) { int B[100], i, x, y, z; for (i=n-1; i>=0; i--) { x = B[0]; y = B[1]; B[1] = B[B[0]]; B[0]--; i = 1; while (i <= x/2 && (B[2*i] > B[i] || B[2*i+1] > B[i])){ if (B[2*i+1] < B[2*i]) { z = B[2*i]; B[2*i] = B[i]; B[i] = z; i = i*2; } else { z = B[2*i+1]; B[2*i+1] = B[i]; B[i] = z; i = i*2+1; } } A[i] = y; } return; } 3 Soluzione Start i = n-1 No i≥0 Sì Stop x = b0 y = b1 b =b 1 b0 b0 = b0-1 i=1 (b 2i i ≤ x/2 e >b ob >b) i 2i+1 i No Sì Sì Esercizio n. 3 b 2i+1 <b No 2i z = b2i z = b2i+1 b2i = bi b2i+1 = bi b =z i i = 2i b =z i i = 2i+1 ai = y i=i-1 (max 8 punti) Scrivere il diagramma di flusso e la codifica in linguaggio C (un programma completo) del seguente algoritmo: 1: leggi n > 0 2: costruisci un vettore A di numeri casuali interi crescenti con ai compreso tra ai−1 e 2ai−1 , per ogni i = 1, . . . , n − 1 e 0 < a0 < 10 3: stampa A 4: leggi x 5: i = 0, j = n − 1 6: k = 21 (i + j) 7: se ak > x allora j = k − 1 altrimenti se ak < x allora i = k + 1 8: se ak 6= x e i < j allora vai al passo 6 9: se ak 6= x allora scrivi “no”, altrimenti scrivi “sı̀” 10: fermati 4 Soluzione Diagramma di flusso Start Leggi n a0 = 1+ rand % 9 i=1 i<n No Sì i=0 ai = ai-1 + (rand % ai-1) i<n i=i+1 No Sì Leggi x Scrivi ai i = 0, j = n-1 i=i+1 k = (i+j)/2 Sì a >x k No Sì j = k-1 i = k+1 ak ≠ x e Sì i<j No Sì ak ≠ x Scrivi "No" Scrivi "Sì" Stop Codifica in linguaggio C #include <stdlib.h> #include <stdio.h> #include <time.h> #define MAX 100 void stampa_array(int V[], int n) { int i; for (i=0; i<n; i++) printf("%d ", V[i]); return; } 5 No a <x k No int genera_array(int V[]) { int i, n; printf("Numero di elementi: "); scanf("%d", &n); srand((unsigned)time(NULL)); V[0] = rand() % 9 + 1; for (i=1; i<n; i++) V[i] = V[i-1] + (rand() % V[i-1]); return(n); } int main(void) { int A[MAX], i, j, k, n, x; n = genera_array(A); stampa_array(A, n); printf("Inserisci un numero: "); scanf("%d", &x); i = 0; j = n-1; do { k = (i+j)/2; if (A[k] > x) { j = k-1; } else if (A[k] < x) { i = k+1; } } while (A[k] != x && i < j); if (A[k] != x) printf("No\n"); else printf("Si’\n"); return(1); } 6 Esercizio n. 4 (max 6 punti) Codificare in linguaggio C una funzione che implementi l’algoritmo descritto dal seguente diagramma di flusso. Nella codifica porre attenzione anche alla definizione delle variabili. Se a = 2, quanto vale b0 al termine dell’esecuzione dell’algoritmo? Start Leggi a, n i=0 i<n e 2i+1<a No Sì FPA = 46 Sì i*a>FPA Scrivi a No Stop j=i bj = (FPA+i)/(j+a) j = j+1 Sì j<n No Scrivi bi Sì i>0 e bi>bi-1 No Scrivi "Sì" Scrivi "No" i = i+1 Soluzione void funzione(void) { int a, n, b[MAX], FPA, i, j; scanf("%d %d", &a, &n); for (i=0; i < n && 2*i+1 < a; i++) { FPA = 46; if (i*a <= FPA) { j = i; do { b[j] = (FPA+i)/(j+a); j++; } while (j<n); printf("%d", b[i]); } 7 if (i > 0 && b[i] > b[i-1]) { printf("Si’\n"); } else { printf("No\n"); } } printf("%d\n", a); return; } Al termine dell’esecuzione della funzione risulta b0 = 23. 8