Corso di Informatica 1 (IN110)
Tutorato n. 5
Marco Liverani∗
Esercizio n. 1
Letta in input una stringa s stampare “Sì” se contiene lettere doppie, “No” altrimenti. Ad esempio se
s = “cassa” allora stampa “Sì” perché ci sono le due “s”; se invece s = “casa” allora stampa “No”, anche
se di lettere “a” ce ne sono due, ma non sono adiacenti.
Pseudo-codifica dell’algoritmo
leggi s
per ogni carattere s i (i = 0, 1, 2, . . . , n − 2) verifica se è uguale al successivo (s i +1 )
3: se hai trovato almeno una coppia di caratteri consecutivi uguali, allora scrivi “Sì”, altrimenti scrivi
“No”
4: stop
1:
2:
Diagramma di flusso
Start
Leggi S
i=0
i<lungh. di S e
S[i]!=S[i+1]
No
Sì
i = i+1
Sì
i < lung. di S
Scrivi
"Sì"
No
Scrivi
"No"
Stop
∗ Università degli Studi Roma Tre, Corso di Laurea in Matematica, Corso di Informatica Generale 1 (IN110); e-mail
[email protected] – sito web del corso http://www.mat.uniroma3.it/users/liverani/IN110/
1
Codifica in linguaggio C
1
2
3
4
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 30
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void) {
char s[MAX];
int i;
printf("Inserisci una parola: ");
scanf("%s", s);
for (i=0; i<strlen(s)-1 && s[i]!=s[i+1]; i++)
;
if (i < strlen(s)-1)
printf("Si’\n");
else
printf("No\n");
return(0);
}
2
Esercizio n. 2
Letta in input una sequenza di n numeri interi memorizzarla in un array A. Stampare la più lunga
sottosequenza di numeri crescenti contigui in A.
Diagramma di flusso
Start
Leggi n
i=0
i<n
No
l = 0, j = 0,
lmax = 0,
imax = 0
Sì
Leggi
A[i]
i=0
i = i+1
No
i < n-1
Sì
Sì
i = imax
No
A[i] <
A[i+1]
j = i+1
l=0
l = l+1
Sì
l > lmax
i <=
imax+lmax
Sì
Scrivi
A[i]
No
imax = j
lmax = l
i = i+1
i = i+1
3
No
Stop
Pseudo-codifica dell’algoritmo
1:
2:
3:
4:
5:
6:
7:
leggi l’array A di n elementi
inizializza il contatore l = 0 e poni l max = 0
scorri l’array A dal primo al penultimo elemento (da A 0 fino ad A n−2 ) ed esegui i passi 4-5:
se A i < A i +1 allora incrementa il contatore l
se l > l max allora memorizza la sequenza corrente come la sequenza più lunga
stampa la sequenza più lunga di lunghezza l max
stop
Codifica in linguaggio C
1
2
3
#include <stdlib.h>
#include <stdio.h>
#define MAX 30
4
5
6
int leggi_array(int A[]) {
int i, n;
7
printf("Numero di elementi: ");
scanf("%d", &n);
printf("Inserisci %d elementi: ", n);
for (i=0; i<n; i++)
scanf("%d", &A[i]);
return(n);
8
9
10
11
12
13
14
}
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int main(void) {
int A[MAX], i, j, l, n, lmax, imax;
n = leggi_array(A);
l = 0;
j = 0;
lmax = 0;
imax = 0;
for (i=0; i<n-1; i++) {
if (A[i]<A[i+1]) {
l++;
if (l>lmax) {
imax = j;
lmax = l;
}
} else {
j = i+1;
l = 0;
}
}
for (i=imax; i<=imax+lmax; i++)
printf("%d ", A[i]);
printf("\n");
return(0);
}
4
Esercizio n. 3
Generare una matrice di n righe ed m colonne (n, m > 3) di numeri interi casuali minori di 100. Stampare la sottomatrice quadrata 3 × 3 per cui la somma degli elementi sia massima.
Diagramma di flusso
Start
Leggi
n,m
i=0
i<n
No
s_max = 0
i_max = 0
j_max = 0
Sì
j=0
i=0
j<m
No
No
i < n-2
Sì
A[i][j] = rand %
100
Sì
i = i_max
j=0
i<
i_max+3
j = j+1
No
j < m-2
Sì
Stop
j = j_max
Sì
i = i+1
No
s=0
j<
j_max+3
Sì
h=0
Scrivi
A[i][j]
h<3
No
j = j+1
Sì
k=0
i = i+1
k<3
No
Sì
s = s+
A[i+h][j+k]
k = k+1
h = h+1
Sì
s > s_max
No
s_max = s
i_max = i
j_max = j
j = j+1
i = i+1
5
No
Pseudo-codifica dell’algoritmo
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
costruisci la matrice A di n righe ed m colonne
i max = 0, j max = 0, s max = 0
per i = 0, 1, 2, . . . , n − 3 ripeti
per j = 0, 1, 2, . . . , m − 3 ripeti
costruisci la matrice 3 × 3 che inizia in A i , j e calcola la somma s dei suoi elementi
se s > s max allora
poni i max = i , j max = j , s max = s
fine-condizione
fine-ciclo
fine-ciclo
stampa la matrice 3 × 3 che inizia in A i max , j max
stop
Codifica in linguaggio C
1
2
3
4
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX 50
5
6
7
8
9
10
11
12
13
14
15
void genera_matrice(int A[MAX][MAX], int *n, int *m) {
int i, j;
srand((unsigned)time(NULL));
printf("Inserisci il numero di righe e di colonne: ");
scanf("%d %d", n, m);
for (i=0; i<*n; i++)
for (j=0; j<*m; j++)
A[i][j] = rand() % 100;
return;
}
16
17
18
19
20
21
22
23
24
25
void stampa_matrice(int A[MAX][MAX], int n, int m) {
int i, j;
for (i=0; i<n; i++) {
for (j=0; j<m; j++)
printf("%4d", A[i][j]);
printf("\n");
}
return;
}
26
27
28
29
30
31
32
33
34
int somma_matrice(int A[MAX][MAX], int n, int m, int i, int j) {
int s, h, k;
s = 0;
for (h=0; h<3; h++)
for (k=0; k<3; k++)
s = s+A[i+h][j+k];
return(s);
}
35
36
37
6
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int main(void) {
int A[MAX][MAX], n, m, somma, somma_max, i, j, i_max, j_max;
genera_matrice(A, &n, &m);
stampa_matrice(A, n, m);
somma_max = 0;
i_max = 0;
j_max = 0;
for (i=0; i<n-2; i++) {
for (j=0; j<m-2; j++) {
somma = somma_matrice(A, n, m, i, j);
if (somma > somma_max) {
somma_max = somma;
i_max = i;
j_max = j;
}
}
}
for (i=i_max; i<i_max+3; i++) {
for (j=j_max; j<j_max+3; j++)
printf("%4d", A[i][j]);
printf("\n");
}
return(0);
}
7