Algoritmi e Strutture Dati (IN110)
Esercitazione n. 3
Marco Liverani *
Esercizio n. 1
Letta una parola S, stabilire se S è palindroma (ossia se è simmetrica).
Diagramma di flusso
Start
Leggi S
n = lung. di S
i=0
i<n/2 e No
S[i]=S[n-i-1]
Sì
Sì No
i = n/2
i = i+1
Scrivi Scrivi
"Sì" "No"
Stop
* Università degli Studi Roma Tre, Corso di Laurea in Matematica, Corso di Algoritmi e Strutture Dati (IN110) – sito web del
corso http://www.mat.uniroma3.it/users/liverani/IN110/
1
Pseudo-codifica dell’algoritmo
1: leggi la stringa S
2: sia n la lunghezza di S
3: i =0
4: fintanto che i < n2 e S i = S n−i −1 ripeti
5: i = i +1
6: fine-ciclo
7: se i = n2 allora
8: scrivi “Sì”
9: altrimenti
10: scrivi “No”
11: fine-condizione
12: stop
Codifica in linguaggio C
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 int main(void) {
6 char S[50];
7 int i, n;
8 printf("Inserisci una parola: ");
9 scanf("%s", S);
10 n = strlen(S);
11 for (i=0; i<n/2 && S[i]==S[n-i-1]; i++)
12 ;
13 if (i == n/2)
14 printf("La parola e’ palindroma.\n");
15 else
16 printf("La parola non e’ palindroma.\n");
17 return(0);
18 }
2
Esercizio n. 2
Acquisire in input un array A di n numeri interi minori di 100; per ogni elemento di A stampare il
numero di volte che compare nel vettore.
Diagramma di flusso
Start
Leggi n
i=0
No
i<n
Sì
i=0
Leggi
A[i]
No
i < 100
i = i+1
Sì
i=0
C[i] = 0
No
i<n
i = i+1
Sì
i=0
C[A[i]] =
C[A[i]]+1
No
i < 100
i = i+1
Sì Stop
Sì No
C[i] > 0
Scrivi
i, C[i]
i = i+1
3
Pseudo-codifica dell’algoritmo
1: leggi n
2: per i = 0, 1, 2, . . . , n − 1 ripeti
3: leggi in input un numero minore di 100 e memorizzalo in A i
4: fine-ciclo
5: per i = 0, 1, 2, . . . , 99 ripeti
6: Ci = 0
7: fine-ciclo
8: per i = 0, 1, 2, . . . , n − 1 ripeti
9: C Ai = C Ai + 1
10: fine-ciclo
11: per i = 0, 1, 2, . . . , 99 ripeti
12: se C i > 0 allora
13: scrivi “i compare C i volte nel vettore”
14: fine-condizione
15: fine-ciclo
16: stop
4
Codifica in linguaggio C
1 #include <stdlib.h>
2 #include <stdio.h>
3 #define MAX 100
4
5 int leggi_array(int X[]) {
6 int i, n;
7 printf("Numero di elementi: ");
8 scanf("%d", &n);
9 printf("Inserisci %d numeri minori di 100: ");
10 for (i=0; i<n; i++)
11 scanf("%d", &X[i]);
12 return;
13 }
14
15 void stampa_array(int X[], int n) {
16 int i;
17 for (i=0; i<n; i++)
18 printf("%d ", X[i]);
19 printf("\n");
20 return;
21 }
22
23 int main(void) {
24 int A[MAX], C[MAX], i, n, h, k;
25 n = leggi_array(A);
26 printf("L’array e’ il seguente: ");
27 stampa_array(A, n);
28 for (i=0; i<MAX; i++)
29 C[i] = 0;
30 for (i=0; i<n; i++)
31 C[A[i]]++;
32 for (i=0; i<MAX; i++)
33 if (C[i]>0)
34 printf("%d compare %d volte\n", i, C[i]);
35 return(0);
36 }
5
Esercizio n. 3
Letta in input una matrice A di n × m numeri interi, stampa la colonna con il maggior numero di
elementi dispari.
Diagramma di flusso
Start
Lettura della matrice
Leggi n,
m
i=0
No
i<n
Numero elementi
cmax = 0, dispari sulla
Sì
jmax = 0 colonna 0
j=0
i=0
No
j<m
Sì i<n
Leggi Sì j=0
A[i][j]
Sì A[i][0]%2 No Stmpa la
=1 colonna jmax
j = j+1 No
j<m
cmax = cmax
+1 Sì Numero elementi i=0
dispari sulla
i = i+1 colonna j
c=0
i = i+1
No
i<n
i=0
Sì
Scrivi Stop
No A[i][jmax]
i<n
Sì No Sì
c > cmax i = i+1
Sì A[i][0]%2 No
=1 cmax = c
jmax = j
c = c+1
j = j+1
i = i+1
Pseudo-codifica dell’algoritmo
1: leggi la matrice A di n righe e m colonne
2: sia c max il numero di elementi dispari sulla prima colonna (quella di indice 0)
3: per j = 1, 2, . . . , m − 1 ripeti
4: sia c il numero di elementi dispari sulla colonna di indice j
5: se c > c max allora
6: c max = c e la colonna con il maggior numero di elementi dispari è la colonna j max = j
7: fine-condizione
8: fine-ciclo
9: stampa la colonna j max
10: stop
6
Codifica in linguaggio C
1 #include <stdlib.h>
2 #include <stdio.h>
3 #define MAX 100
4
5 void leggi_matrice(int A[MAX][MAX], int *n, int *m) {
6 int i, j;
7 printf("Numero di righe e di colonne: ");
8 scanf("%d %d", n, m);
9 for (i=0; i<*n; i++) {
10 printf("Elementi della riga n.%d: ", i);
11 for (j=0; j<*m; j++)
12 scanf("%d", &A[i][j]);
13 }
14 return;
15 }
16
17 int conta_dispari(int A[MAX][MAX], int n, int j) {
18 int i, c = 0;
19 for (i=0; i<n; i++)
20 if (A[i][j] % 2 == 1)
21 c++;
22 return(c);
23 }
24
25 int main(void) {
26 int A[MAX][MAX], n, m, j, jmax, c, cmax;
27 leggi_matrice(A, &n, &m);
28 jmax = 0;
29 cmax = conta_dispari(A, n, 0);
30 for (j=1; j<m; j++) {
31 c = conta_dispari(A, n, j);
32 if (c > cmax) {
33 jmax = j;
34 cmax = c;
35 }
36 }
37 printf("La colonna con piu’ elementi dispari e’ la %d^: ", jmax+1);
38 for (j=0; j<n; j++)
39 printf("%d ", A[j][jmax]);
40 printf("\n");
41 return(1);
42 }