Soluzione della prima prova di esonero – 7 novembre 2005

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