presentazione di powerpoint - uniroma1.itbloisi/didattica/...corso di fondamenti di informatica...

44
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico Daniele Bloisi Si ringrazia Raffaele Nicolussi

Upload: others

Post on 01-Apr-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Corso di Fondamenti di Informatica

Ingegneria delle Comunicazioni BCOR

Ingegneria Elettronica BELR

Parte 8

Stringhe

Domenico Daniele Bloisi

Si ringrazia Raffaele Nicolussi

Page 2: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

2010/2011Stringhe

Parte 8

Pagina 2

Docenti

Parte I – prof. Silvio Salza

[email protected]

http://www.dis.uniroma1.it/~salza/fondamenti.htm

Parte II – ing. Domenico Daniele Bloisi

[email protected]

http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html

Nota: %7E corrisponde alla tilde ~

Page 3: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 3

Informazioni Generali

ing. Domenico Daniele Bloisi, PhD

Dipartimento di Informatica e Sistemistica

Via Ariosto 25

(adiacente Piazza Dante,

A fermate Manzoni, Vittorio Emanuele,

Tram 3 fermata via Labicana)

mailto:[email protected]

http://www.dis.uniroma1.it/~bloisi

2010/2011Stringhe

Parte 8

Page 4: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Ricevimento

Pagina 4

Martedì 15.00 – 17.00

DIS, via Ariosto 25

Aula docenti adiacente aula A4

Si consiglia di inviare una email per conferma e

di controllare la bacheca degli avvisi

http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html#Avvisi

2010/2011Stringhe

Parte 8

Page 5: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 52010/2011

Sommario – Parte 8

• Array di caratteri: stringhe

• Inizializzazione di stringhe

• Lettura e scrittura di stringhe

• Operazioni sulle stringhe

• Funzioni per la manipolazione delle

stringhe: strcpy, strncpy, strcat, strncat,

strcmp, strstr

• Input/Output in C

• Stream

• File

Stringhe

Parte 8

Page 6: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 62010/2011

Array di caratteri

Stringhe

Parte 8

Un caso particolare di array è quello

costituito da caratteri.

Infatti, le sequenze di caratteri servono per

gestire testi.

In C si usa il termine stringa per indicare gli

array di caratteri.

La libreria <string.h> offre alcune funzioni

speciali per gli array di caratteri.

Page 7: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 72010/2011

Rappresentazione di stringhe in C

Stringhe

Parte 8

Nel linguaggio C una stringa è rappresentata

mediante un array di caratteri terminante

con il carattere speciale '\0' (codice ASCII = 0),

che quindi funge da terminatore di stringa.

In questo modo è possibile conoscere la

lunghezza di una stringa contando il numero

di caratteri che precedono il carattere '\0'.

Page 8: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 82010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

s[5]='\0'; // terminatore stringa

printf("%s\n", s);

return 0;

} Nota: utilizzo del formato

%s nella printf per le

stringhe

Questo programma stampaHello

Page 9: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 92010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

int i;

for(i = 0; i < N; i++)

s[i] = 'a';

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

// mancato inserimento

// del terminatore stringa

printf("%s\n", s);

return 0;

}

Questo programma stampaHelloaaaaaaaaaaaaaaaaaaaa

Page 10: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 102010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

int i;

for(i = 0; i < N; i++)

s[i] = 'a';

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

s[5]='\0'; // terminatore stringa

printf("%s\n", s);

return 0;

}

Questo programma stampaHello

Page 11: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 112010/2011

Stringhe costanti

Stringhe

Parte 8

Page 12: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 122010/2011

Stringhe e caratteri

Stringhe

Parte 8

Page 13: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 132010/2011

Inizializzazione tramite stringa

costante

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

return 0;

}

Page 14: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 142010/2011Stringhe

Parte 8

Inizializzazione tramite stringa

costante

Page 15: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 152010/2011Stringhe

Parte 8

Inizializzazione tramite stringa

costante

warning: excess elements in

array initializer

Page 16: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 162010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

printf("dimensione di str = %d\n“,

sizeof(str));

char s[] = {'g', 'u', 'a', 'r', 'd', 'a'};

printf("%s\n", s);

printf("dimensione di s = %d\n", sizeof(s));

return 0;

}

Page 17: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 172010/2011

Possibile output

Stringhe

Parte 8

some text

dimensione di str = 20

guardasome text

dimensione di s = 6

Manca il carattere di

terminazione '\0'

dopo l’ultima 'a' di

“guarda”

Page 18: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 182010/2011

Modifica esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

printf("dimensione di str = %d\n“,

sizeof(str));

char s[] = {'g','u','a','r','d','a','\0'};

printf("%s\n", s);

printf("dimensione di s = %d\n", sizeof(s));

return 0;

}

carattere

speciale

'\0'

Page 19: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 192010/2011

Output

Stringhe

Parte 8

some text

dimensione di str = 20

guarda

dimensione di s = 7

Page 20: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 202010/2011

Stringhe e array

Stringhe

Parte 8

Page 21: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 212010/2011

Lettura e scrittura di stringhe

Stringhe

Parte 8

Page 22: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 222010/2011

Lettura e scrittura di stringhe

Stringhe

Parte 8

Page 23: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 232010/2011Stringhe

Parte 8

Lettura e scrittura di stringhe

Page 24: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 242010/2011

Stringhe e puntatori

Stringhe

Parte 8

Page 25: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 252010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

Per le stringhe rappresentate come array di

caratteri, bisogna distinguere tra

la dimensione dell’array (staticamente

determinato alla sua creazione)

la lunghezza della stringa, che può invece

variare a tempo di esecuzione.

Page 26: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 262010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

const int N = 256;

char s[N];

s[0]=’H’; s[1]=’e’; s[2]=’l’;

s[3]=’l’; s[4]=’o’;

s[5]=’\0’; // terminatore stringa

La dimensione dell’array è 256

La dimensione della stringa è 5

Page 27: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 272010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

La lunghezza (dimensione) della stringa deve

essere sempre minore o uguale della

dimensione dell’array meno uno (perché

bisogna considerare sempre il carattere

terminatore della stringa).

In caso contrario, si ha un accesso fuori dalla

zona di memoria allocata alla stringa con

conseguente possibilità di errori.

Page 28: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 282010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

Il calcolo della lunghezza di una stringa, cioè il

conteggio dei caratteri che precedono il

terminatore di stringa, si effettua tramite la funzione strlen (vedi dopo).

Tale funzione è però inefficiente (perché

richiede un ciclo di scansione di tutta la

stringa); quindi, a volte, si preferisce usare un

argomento esplicito che contiene la lunghezza

della stringa.

Page 29: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 292010/2011

Funzione strlen

Stringhe

Parte 8

size_t strlen( const char *str );

restituisce la lunghezza del parametro str.

E’ una funzione definita in <string.h>

Page 30: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 302010/2011Stringhe

Parte 8

Esempio strlen

#include <stdio.h>

#include <string.h>

int main() {

char str[100] = "test string";

printf("%d\n", sizeof(str));

printf("%d\n", strlen(str));

return 0;

}

Questo programma stampa

100

11

Page 31: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 312010/2011Stringhe

Parte 8

Una implementazione di strlen

size_t strlen(const char *str) {

const char* s = str;

for( ; *s; ++s);

return(s – str);

}

Verificare per esercizio

la correttezza di questa

implementazione

Page 32: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 322010/2011

Esempio: contare le occorrenze di una

lettera in una stringa

Stringhe

Parte 8

Scrivere una funzione che, presi come

parametri una stringa (sotto forma di array di caratteri) ed un carattere c, restituisca il

numero di occorrenze di c nella stringa.

Page 33: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 332010/2011

Esempio: contare le occorrenze di una

lettera in una stringa

Stringhe

Parte 8

int contaLettera (const char s[], int N, char c) {

int numlettera = 0;

int pos = 0;

while (pos < N) {

if (s[pos] == c)

numlettera++;

pos++;

}

return numlettera;

}

Page 34: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 342010/2011

Versione con strlen

Stringhe

Parte 8

int contaLettera (const char *s, char c) {

int numlettera = 0;

int pos = 0;

int N = strlen(s);

while (pos < N) {

if (s[pos] == c)

numlettera++;

pos++;

}

return numlettera;

}

Page 35: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 352010/2011

Main

Stringhe

Parte 8

int main() {

char s[256];

char c;

printf("digitare una parola, poi premere INVIO\n");

scanf("%s", s);

//pulisco il buffer in ingresso

while(c != '\n' && c!= EOF) {

c = getchar();

}

printf("digitare un carattere da cercare, poi premere

INVIO\n");

scanf("%c", &c);

int i = contaLettera(s, c);

printf("il carattere %c si trova %d volte in %s\n",

c, i, s);

return 0;

}

Page 36: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 362010/2011

Esempio: codifica di una stringa

Stringhe

Parte 8

Scrivere una funzione che, presi come parametri una stringa (sotto forma di array di caratteri) ed un intero d,

restituisca la stringa opportunamente codificata.

La codifica è ottenuta sostituendo ciascun carattere con

il carattere che ha codice pari al codice del carattere da sostituire incrementato di d.

Esempio"ciao" con d=3 diventerà "fldr"

Page 37: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 372010/2011

Esempio: codifica di una stringa

Stringhe

Parte 8

void codifica(const char *str, char *strRis, int d) {

char c;

int ci;

int N = strlen(str);

int i;

for (i = 0; i < N; i++)

strRis[i] = d + str[i];

strRis[N]=’\0’; // terminatore di stringa

return;

}

Page 38: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 382010/2011

Note

Stringhe

Parte 8

Nota 1: il primo dei due parametri di tipo array di caratteri ha il ruolo di input, ed è quindi dichiarato const, mentre il secondo ha il ruolo di

output e non può essere dichiarato const in quanto verrà modificato.

Nota 2: nell’istruzione strRis[i] = d + str[i]; c’è una

conversione implicita ad intero per poter effettuare la somma e poi una

conversione di nuovo a carattere per memorizzare il risultato.

Nota 3: in questa funzione si assume che sia stata già allocata memoria per la stringa di output strRis di dimensione almeno pari a

quella di str. Inoltre, è necessario aggiungere il carattere '\0' per

terminare la stringa di output.

Page 39: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 392010/2011

Esempio: lunghezza della più lunga

sottosequenza

Stringhe

Parte 8

Realizzare una funzione che prenda in ingresso una stringa s (sotto forma di array

di caratteri), che si può supporre essere

costituita dai soli caratteri '0' e '1', e

restituisca la lunghezza della più lunga sottosequenza di s costituita da soli '0' tutti

consecutivi.

Page 40: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 402010/2011

Esempio: lunghezza della più lunga

sottosequenza

Stringhe

Parte 8

Se la stringa passata come parametro è

"001000111100", allora la più lunga

sottosequenza di soli '0' è quella sottolineata,

che ha lunghezza 3.

Page 41: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 412010/2011

Sottosequenza

Stringhe

Parte 8

int sottosequenza(const char * s) {

char bit; // l’elemento corrente della sequenza

int cont = 0; // lunghezza attuale della sequenza di zeri

int maxlung = 0; // valore temporaneo della massima lunghezza

int N = strlen(s); // lunghezza della stringa

for (int i = 0; i < N; i++) {

bit = s[i];

if (bit == '0') { // e’ stato letto un altro '0'

cont++; // aggiorna la lunghezza della sequenza

// corrente

if (cont > maxlung) // se necessario, aggiorna

// il massimo temporaneo

maxlung = cont;

} else // e’ stato letto un '1'

cont = 0; // azzera la lunghezza della sequenza

//corrente

}

return maxlung;

}

Page 42: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 422010/2011

Esercizio

Stringhe

Parte 8

Esercizio 8.1

Scrivere un programma che utilizzi la funzione sottosequenza con input

01000100001110

stampando a video il risultato ottenuto

Page 43: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 432010/2011

Esercizi

Stringhe

Parte 8

Esercizio 8.2

Scrivere una funzione che, data una stringa, ne

restituisca l’ultimo carattere.

Page 44: Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Pagina 442010/2011

Esercizi

Stringhe

Parte 8

Esercizio 8.3

Scrivere un programma che legga da input una linea contenente una

domanda a risposta SI/NO senza simboli di punteggiatura, e stampi

una risposta alla domanda in base alle seguenti regole:

1. se la frase inizia e finisce con una vocale la risposta è "FORSE"

2. se l’ultima lettera della frase è "a", "i", oppure "u", la risposta è "SI“

3. se l’ultima lettera della frase è "e" oppure "o", la risposta è "NO“

4. se l’ultima lettera della frase è un carattere diverso da "a", "e", "i",

"o", "u" , la risposta è "NON SO"

Nota: quando si applicano due regole, la risposta si ottiene facendo la

concatenazione delle risposte.