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