ESERCIZIO 1 Scrivere un sotto-programma in linguaggio C++ che

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