Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ESERCIZIO 1 Scrivere un sotto-programma in linguaggio C++ che ricevuta una matrice quadrata come parametro restituisca al chiamante un valore booleano indicante se la matrice è simmetrica oppure no. Scrivere quindi un programma principale minimale che acquisisca una matrice quadrata di numeri reali dallo standard input e testi la funzionalità del sottoprogramma precedente. Se la matrice non è simmetrica occorre annullare le sue diagonali principali riportare su standard-output il risultato ottenuto. Pagina 1 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ESERCIZIO 2 (Def. funzioni con parametri di tipo matrice) Si considerino due matrici di interi A e B, di uguali dimensioni (R e C, costanti, che indicano il numero di righe e colonne). Diciamo che A domina B se, confrontando i valori in posizioni corrispondenti, risulta che il numero dei valori in A maggiori dei corrispondenti valori in B è più grande del numero di quelli di B maggiori dei corrispondenti in A e inoltre gli elementi corrispondenti non sono mai uguali (se due elementi corrispondenti sono uguali la dominanza non è definita). a) Si proponga un prototipo per la funzione domina(...) che riceve le matrici come parametri e restituisce 1 se la prima domina la seconda, 1 se la seconda domina la prima, 0 altrimenti. b) Si dia una descrizione breve ma precisa di un algoritmo per implementare la funzione. c) Si codifichi la funzione in C. Pagina 2 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 Riepilogo sulle Stringhe di Caratteri In C non vi è un tipo di variabile predefinito in grado di memorizzare delle stringhe di caratteri. Dobbiamo usare degli array di caratteri. In C sono comunque predefinite alcune funzioni di libreria sugli array di caratteri, che facilitano il loro uso come variabili di tipo stringa di caratteri. ( #include <cstring> ) La libreria standard del C++, invece, contiene una libreria apposita (#include <string> ) in cui è definito esplicitamente il tipo string, con il quale l'elaborazione di stringhe risulta molto agevolata; per poterla utilizzare in maniera fruttuosa è comunque necessario conoscere le nozioni di classe e di oggetto, tipici della programmazione Object Oriented. Noi adotteremo il trattamento standard (stile C) delle stringhe come array di caratteri. Il seguente array: char prova[20]; può memorizzare una stringa di al più 20 caratteri. Naturalmente non è necessario usare tutti e 20 i caratteri dell'array. L'array prova si può usare per memorizzare sia la stringa di 5 caratteri "Hello", sia la stringa di 15 caratteri "Merry Christmas". Siccome l'array può contenere stringhe più corte della sua dimensione occorre prevedere una indicazione del punto in cui termina la stringa. Per convenzione tale punto viene indicato dal carattere nullo che si può scrivere sia 0 sia '\0'. Dopo il contenuto effettivo della stringa viene aggiunto un carattere nullo ('\0') per indicare la fine della stringa. Pertanto l'array prova può contenere (per il programmatore) al più stringhe di 19 caratteri perché il 20-esimo (cioè quello con indice 19) è riservato per il carattere ‘\0’. Inizializzazione delle stringhe Per inizializzare una stringa di caratteri si può usare la stessa notazione usata per gli array: char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; Abbiamo così inizializzato una stringa (array) di 6 valori di tipo char: la parola Hello più il carattere nullo '\0'. Possiamo anche inizializzare un array di caratteri usando una stringa costante. char mystring[] = "Hello"; Esse si rappresentano racchiudendo la sequenza di caratteri tra doppi apici (" ). Alle stringhe costanti viene sempre aggiunto implicitamente un carattere nullo finale '\0'. In entrambi i casi la dimensione dell'array mystring è di 6 elementi di tipo char: i 5 caratteri di Hello e il carattere nullo finale ('\0' ). Pagina 3 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 Attenzione: una stringa costante può essere usata per dare un valore iniziale ad una variabile di tipo array di char soltanto al momento della dichiarazione dell'array, ossia in fase di inizializzazione. Assegnazione di valori alle stringhe A sinistra dell’operatore di assegnamento può esserci soltanto un elemento di un array e non l'intero array, per assegnare una stringa di caratteri ad un array di char dobbiamo scrivere: mystring[0] = 'H'; mystring[1] = 'e'; mystring[2] = 'l'; mystring[3] = 'l'; mystring[4] = 'o'; mystring[5] = '\0'; Siccome questo non è molto pratico la libreria standard cstring contiene la definizione di un certo numero di funzioni quali strcpy ( str ing co py) che si può richiamare nel seguente modo: strcpy (string1, string2); L'effetto è copiare il contenuto di string2 in string1. string2 può essere sia un array sia una stringa costante, il che ci permette di assegnare la stringa costante "Hello World!" al'array di caratteri mystring usando la seguente notazione: strcpy (mystring, "Hello World!"); Esempio: #include <iostream> #include <cstring> int main () { char stMyName[20]; strcpy (stMyName,"Hello World!"); cout << stMyName; return EXIT_SUCCESS; } Un altro modo per assegnare un valore ad un array di caratteri è quello di usare direttamente il flusso di input cin. Nella libreria iostream è definita una funzione getline il cui prototipo è: cin.getline ( char buffer [], int length, char delimiter = ' \n'); dove buffer è l' array di caratteri in cui memorizzare l' input , length è la dimensione dell' array stesso e delim iter è il carattere usato per indicare la fine dell'input e per il quale è previsto il carattere nuova linea ('\n' ) come valore di default . Pagina 4 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 Esempio di uso di cin.getline : #include <iostream> #include <cstdlib> int main ( ) { char buff[100]; cout << "Dammi una stringa: "; cin.getline(buff,100); cout << "Hai inserito: " << buff << "\n"; system("PAUSE"); return EXIT_SUCCESS; } Si può anche usare l'operatore di estrazione (>>) per leggere delle stringhe da cin: cin >> buff; che funziona però con le seguenti limitazioni (che cin.getline non ha!): 1. si possono leggere soltanto parole e non intere frasi, in quanto l'operatore di estrazione >> usa come delimitatore qualsiasi occorrenza di un carattere invisibile (per esempio: spazio, tabulazione, nuova linea, ritorno carrello). 2. non si può specificare la dimensione dell'array , il che rende instabile il programma nel caso in cui l' input sia una parola più lunga della dimensione dell'array . Le seguenti sono alcune altre funzioni che operano su stringhe e che sono definite nella libreria cstring: strcat: strcat (char dest[] , char src[] ); Aggiunge (appende) la stringa src alla fine della stringa dest. Ritorna dest. strcmp: int strcmp (char str1[], char str2[] ); Confronta le stringhe str1 ed str2 . Ritorna 0 se sono uguali. strcpy: strcpy (char dest[], char src[] ); Copia il contenuto di src in dest. Ritorna dest. strlen: int strlen (char str[]); Ritorna la lunghezza di str. Pagina 5 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 ESERCIZIO 3 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 (Uso di Stringhe) Scrivere un programma in linguaggio C++ che verifichi se una parola inserita dallo standard input è palindroma e in caso contrario stampa a video la parola inserita partendo dall’ultimo carattere sino al primo. Le parole palindrome sono quelle che possono essere lette indifferentemente da sinistra a destra e da destra a sinistra. Esempio: "anna", "abba", "onorarono", "radar", "a" (parola di una lettera). Pagina 6 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 ESERCIZIO 3.1 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ( Uso di funzioni per la manipolazione di stringhe) Facendo uso dei comandi messi a disposizione dalla libreria standard del C++ definiti in <cstring>, risolvere il seguente problema. Leggere due stringhe str1, str2 dallo standard input, stampare a video lunghezza di str1 e str2, stampare il risultato della concatenazione delle due stringhe: str1 concatenata str2, confrontare le due stringhe e stamparle in ordine alfabetico. #include <iostream> #include <cstring > using namespace std; #define MAX_LEN 100 int main(int argc, char *argv[]){ char str1[MAX_LEN], str2[MAX_LEN],str3[2*MAX_LEN]; int len1,len2,cmp; cout << "\n Inserire la prima stringa, str1:"; cin >> str1; cout << "\n Inserire la prima stringa, str2:"; cin >> str2; len1 len2 cout cout = strlen(str1); = strlen(str2); << "\n la lunghezza della 1-ma stringa << "\n la lunghezza della 2-da stringa e’: " << len1; e’: " << len2; strcpy(str3,str1); strcat(str3,str2); cout << "\n Il risultato della concatenazione e': " << str3; cmp = strcmp(str1,str2); if (cmp > 0) { cout << "\n str1 > str2!"); cout << "\n 1. " << str2 << " \n 2. " << str1; } else if (cmp < cout << cout << } else cout << 0) { "\n str2 > str1!"; "\n 1. “ << str1 << " \n 2." << str2; "\n str1 == str2 : " << str1; system("PAUSE"); return EXIT_SUCCESS; } Pagina 7 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ESERCIZIO 3.2 (Uso dei vettori e/o Stringhe – Definizione funzioni – passaggio parametri per copia) Scrivere un programma in linguaggio C++ che conti il numero di parole contenute in una frase inserita dall’utente. 1. Considerare qualsiasi carattere non alfanumerico come un possibile separatore di parola. 2. Strutturare il programma prevedendo la definizione e l’utilizzo di un sottoprogramma con il seguente prototipo bool alfanum(char c) che restituisce true nel caso il carattere passato come parametro sia alfanumerico (['A'...'Z', 'a'...'z', '0'...'9']), false in caso contrario. Esempi: "Oggi piove" : 2 parole "Oggi c'e' il sole" : 5 parole Pagina 8 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ESERCIZIO 4 (Definizione funzioni con parametri di tipo vettore + algoritmi) Si progetti e codifichi una funzione C++ che riceve come parametri due stringhe che rappresentano due parole e restituisce un valore intero, da interpretarsi come valore di verità, che indichi se le due parole sono anagrammi, cioè se sono ottenibili l’una dall’altra tramite una permutazione delle lettere che le compongono. Ad esempio le parole POLENTA e PENTOLA sono anagrammi. Si presti attenzione al fatto che parole come TAPPO e PATTO non sono anagrammi, anche se ogni lettera dell’una è contenuta nell’altra. Pagina 9 di 10 Università degli Studi di Bergamo Facoltà di Ingegneria a.a. 2015-2016 Esercitazioni di Informatica (modulo di programmazione - 6 CFU) Codice corso: 21012, 22010 ESERCIZIO 5 Definiamo la "somiglianza" S fra due stringhe come il rapporto tra il doppio del numero di "triplette di caratteri consecutivi" comuni ad entrambe le stringhe e la somma delle "triplette di caratteri consecutivi" in ciascuna stringa. Nel caso in cui almeno una delle due stringhe sia composta da meno di 3 caratteri, la somiglianza è nulla (S = 0.0). Scrivere un programma C++, che acquisisca due stringhe da tastiera (standard input) e riporti sullo schermo (standard output) la loro "somiglianza", secondo la definizione precedente. Esempio: string1: "ALEXANDRE" string2: "ALEKSANDER" triplette in comune: 2; "ALE", "AND" Numero di triplette in string1: 7 (Oss.: num. caratteri di string1 meno 2) Numero di triplette in string2: 8 (Oss.: num. caratteri di string2 meno 2) somiglianza: S = (2•2)/(7+8) = 0.27 Pagina 10 di 10