# Funzioni II :warning: ==I testi degli esercizi vanno intesi come abbiamo visto a lezione. Se il testo dice che una funzione deve restituire un array $\to$ bisogna passare come ulteriore argomento un array destinazione da modificare (etc...)== :warning: # Conta Occorrenze Scrivere un programma che legge un array di interi e un numero e stampa il numero di volte che il numero appare all’interno dell’array. Scrivere le funzioni: - leggiInt(): che legge e restituisce un intero - leggiIntN(): che legge e restituisce un intero minore di N e positivo - leggiArrayInt(): che legge e restituisce un array di interi di una certa dimensione - contaOccorrenze(): che prende in input un array e un numero e restituisce il numero di volte che il numero appare all’interno dell’array ```c // Librerie #include <stdio.h> // Costanti #define N 100 // Prototipi int leggiInt(); int leggiIntN(); void leggiArrayInt(int [], int); int contaOccorrenze(int [], int, int); // Main int main(){ int n, v[N], x, count; n = leggiIntN(); leggiArrayInt(v, n); x = leggiInt(); count = contaOccorrenze(v, n, x); printf("Ci sono %d ripetizioni di %d.\n", count, x); return 0; } // Funzioni int leggiInt(){ int a; printf("Inserisci un numero: "); scanf("%d", &a); return a; } int leggiIntN(){ int a; do { printf("Inserisci un numero: "); scanf("%d", &a); } while(a > N || a <= 0); return a; } void leggiArrayInt(int v[], int dim){ int i; for(i=0; i<dim; i++){ printf("Posizione %d\n", i); v[i] = leggiInt(); } return; } int contaOccorrenze(int v[], int dim, int x){ int i, count = 0; for(i=0; i<dim; i++){ if(v[i] == x) count++; } return count; } ``` --- # Rimuovi Carattere da Stringa Scrivere un programma che legge una stringa senza spazi e un carattere e stampa la stringa inserita senza il carattere inserito. Scrivere le funzioni (da mappare con quanto possibile fare in C): - leggiCarattere(): che legge e restituisce un carattere - leggiStringa(): che legge e restituisce una stringa - rimuoviCarattere(): che prende in input una stringa e un carattere e restituisce la stringa senza il carattere inserito ```c // Librerie #include <stdio.h> #include <string.h> // Costanti #define LEN 100 // Prototipi char leggiCarattere(); void leggiStringa(char []); void rimuoviCarattere(char [], char [], char); // Main int main(){ // Variabili char src[LEN], dest[LEN], da_rimuovere; // Leggi stringa leggiStringa(src); // Leggi Carattere da_rimuovere = leggiCarattere(); // Rimuovi il carattere dalla stringa rimuoviCarattere(src, dest, da_rimuovere); // Stampa la stringa dst printf("%s senza %c = %s\n", src, da_rimuovere, dest); return 0; } // Funzioni char leggiCarattere(){ char c; printf("Inserisci carattere: "); scanf("%c", &c); scanf("%*c"); return c; } void leggiStringa(char stringa[]){ printf("Inserisci stringa: "); scanf("%s", stringa); fflush(stdin); return; } void rimuoviCarattere(char src[], char dest[], char da_rimuovere){ // Variabili int len_src, i, len_dest; // Inizializzo Lunghezze len_src = strlen(src); len_dest = 0; // Scorro src per copiare senza buchi in dest for(i=0; i<len_src; i++){ if(src[i] != da_rimuovere){ dest[len_dest] = src[i]; len_dest++; } } // Aggiungo carattere di terminazione dest[len_dest] = '\0'; return; } ``` --- # Lunghezza della Massima Sottosequenza Ascendente Scrivere un programma che prende in input nella funzione main una stringa. Il programma stampa la lunghezza della più lunga sottosequenza di caratteri ordinati in ordine ascendente nella stringa. Scrivere la funzione: - `lunghezzaMassimaSottosequenzaAscendente()`: che prende in input un puntatore che punta alla stessa area di memoria della stringa e la lunghezza della stringa. La funzione restituisce un intero pari alla più lunga sottosequenza di caratteri ordinati in ordine ascendente nella stringa. ```c // Librerie #include <stdio.h> #include <string.h> // Costanti #define LEN 100 // Prototipi void leggiStringa(char []); int lunghezzaMassimaSottosequenzaAscendente(char []); // Main int main(){ char s[LEN]; int max_len; leggiStringa(s); max_len = lunghezzaMassimaSottosequenzaAscendente(s); printf("Lunghezza massima sottosequenza ascendente: %d\n", max_len); return 0; } // Funzioni void leggiStringa(char stringa[]){ printf("Inserisci Stringa: "); scanf("%s", stringa); return; } int lunghezzaMassimaSottosequenzaAscendente(char s[]){ int len = 1, max_len = 1, i, str_len; str_len = strlen(s); for(i = 1; i < str_len; i++){ if(s[i] >= s[i-1]) { len++; if(max_len < len) max_len = len; } else { len = 1; } } return max_len; } ``` --- # Elevare al Quadrato un porzione dell’Array Scrivere un programma che legge un array di lunghezza definita dall’utente (al massimo una dimensione predeterminata) e che modifica l’array elevando al quadrato una porzione di esso a partire da una posizione decisa dall’utente fino a quando l’array non termina o fino a quando non si incontra uno 0. Scrivere le funzioni: - leggiInt(): che legge e restituisce un intero - leggiIntN(): che legge e restituisce un intero in [1,N] - leggiArrayInt(): che legge e restituisce un array di interi di una certa dimensione - foo(): che eleva al quadrato gli elementi dell’array da una certa posizione in poi fino ad arrivare alla fine dell’array o fino a quando l’array non termina. Tale funzione fa uso della funzione ausiliaria subpow() - subpow(): che prende l’inizio di una porzione dell’array e la dimensione di tale sotto-array e lo eleva al quadrato - stampaArray(): che stampa un array passato in input ```c // Librerie #include <stdio.h> // Costanti #define N 100 // Prototipi int leggiInt(); int leggiIntN(); void leggiArrayInt(int [], int); void stampaArray(int [], int); void foo(int [], int, int); void subpow(int [], int); // Main int main(){ int n, v[N], x; // leggi dimensione array in [1, N] n = leggiIntN(); // leggi array leggiArrayInt(v, n); // leggi posizione x = leggiInt(); // eoleva al quadrato sottoporzione foo(v, n, x); // stampa array stampaArray(v, n); return 0; } // Funzioni int leggiInt(){ int a; printf("Inserisci un numero: "); scanf("%d", &a); return a; } int leggiIntN(){ int a; do { printf("Inserisci un numero: "); scanf("%d", &a); } while(a > N || a <= 0); return a; } void leggiArrayInt(int v[], int dim){ int i; for(i=0; i<dim; i++){ printf("Posizione %d\n", i); v[i] = leggiInt(); } return; } void stampaArray(int v[], int dim){ int i; printf("["); for(i=0; i<dim; i++){ printf("%d, ", v[i]); } printf("]\n"); return; } void foo(int v[], int len, int pos){ int i, sublen = 0; // verifico che la posizione sia ok if(pos < 0 || pos >= len) return; // calcolo la dimensione della sotto-porzione dell'array for(i=pos; i<len; i++){ if(v[i] != 0) sublen++; } // elevo al quadrato la sotto-porzione dell'array subpow(&v[pos], sublen); return; } void subpow(int v[], int len){ int i; for(i=0; i<len; i++) v[i] *= v[i]; return; } ``` --- # Elimina sottostringa da stringa Scrivere un programma che prende in input una stringa e una seconda stringa. Il programma rimuove dalla prima stringa tutte le sequenze di caratteri uguali alla seconda stringa. Scrivere le funzioni: - leggiStringa() - rimuoviStringa() ```c // Librerie #include <stdio.h> #include <string.h> // Costanti #define LEN 100 // Prototipi void leggiStringa(char []); void rimuoviStringa(char [], char [], char []); // Main int main(){ char s[LEN], rm[LEN], dest[LEN]; printf("Stringa originale\n"); leggiStringa(s); printf("Stringa da rimuovere\n"); leggiStringa(rm); rimuoviStringa(s, rm, dest); printf("\n%s senza %s = %s\n", s, rm , dest); return 0; } // Funzioni void leggiStringa(char s[]){ printf("Inserisci stringa: "); scanf("%s", s); fflush(stdin); printf("\n"); return; } void rimuoviStringa(char s[], char rm[], char dest[]){ int len_s, len_rm, len_dest=0, i, j, k; len_s = strlen(s); len_rm = strlen(rm); i = 0; while(i < len_s){ k = 0; for(j=0; j<len_rm && i + j < len_s; j++){ if(s[i+j] == rm[j]) k++; else break; } if(k == len_rm) i += len_rm; else{ dest[len_dest] = s[i]; len_dest++; i++; } } dest[len_dest] = '\0'; return; } ``` --- # Shift Matrice per Righe Scrivere un programma che legge una matrice 3x4 ed effettua uno shift per righe verso il basso e stampa il risultato. L’ultima riga prende la posizione della prima riga. Scrivere le funzioni: - leggiArray() - leggiMatrice() - stampaArray() - stampaMatrice() - copiaArray() - shiftMatrice() ```c // Librerie #include <stdio.h> // Costanti #define R 3 #define C 4 // Prototipi void leggiArray(int []); void leggiMatrice(int [][C]); void stampaArray(int []); void stampaMatrice(int [][C]); void copiaArray(int [], int []); void shiftMatrice(int [][C], int [][C]); // Main int main(){ int src[R][C], dest[R][C]; leggiMatrice(src); shiftMatrice(dest, src); printf("\nMatrice originale\n"); stampaMatrice(src); printf("\nMatrice con shift\n"); stampaMatrice(dest); return 0; } // Funzioni void leggiArray(int v[]){ int i; for(i=0; i<C; i++){ printf("Inserisci elemento in posizione %d: ", i); scanf("%d", &v[i]); } return; } void leggiMatrice(int m[][C]){ int i; for(i=0; i<R; i++){ printf("Inserisci riga %d\n", i); leggiArray(m[i]); printf("\n"); } return; } void stampaArray(int v[]){ int i; printf("["); for(i=0; i<C; i++){ printf("%d, ", v[i]); } printf("]\n"); return; } void stampaMatrice(int m[][C]){ int i; for(i=0; i<R; i++){ stampaArray(m[i]); } return; } void copiaArray(int dest[], int src[]){ int i; for(i=0; i<C; i++){ dest[i] = src[i]; } return; } void shiftMatrice(int dest[][C], int src[][C]){ int i, tmp[C]; for(i=1; i<R; i++){ copiaArray(dest[i], src[i-1]); } copiaArray(dest[0], src[R-1]); return; } ```