presentazione di powerpoint - uniroma1.itbloisi/didattica/...corso di fondamenti di informatica...
TRANSCRIPT
Corso di Fondamenti di Informatica
Ingegneria delle Comunicazioni BCOR
Ingegneria Elettronica BELR
Parte 8
Stringhe
Domenico Daniele Bloisi
Si ringrazia Raffaele Nicolussi
2010/2011Stringhe
Parte 8
Pagina 2
Docenti
Parte I – prof. Silvio Salza
http://www.dis.uniroma1.it/~salza/fondamenti.htm
Parte II – ing. Domenico Daniele Bloisi
http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html
Nota: %7E corrisponde alla tilde ~
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
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
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
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.
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'.
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
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
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
Pagina 112010/2011
Stringhe costanti
Stringhe
Parte 8
Pagina 122010/2011
Stringhe e caratteri
Stringhe
Parte 8
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;
}
Pagina 142010/2011Stringhe
Parte 8
Inizializzazione tramite stringa
costante
Pagina 152010/2011Stringhe
Parte 8
Inizializzazione tramite stringa
costante
warning: excess elements in
array initializer
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;
}
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”
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'
Pagina 192010/2011
Output
Stringhe
Parte 8
some text
dimensione di str = 20
guarda
dimensione di s = 7
Pagina 202010/2011
Stringhe e array
Stringhe
Parte 8
Pagina 212010/2011
Lettura e scrittura di stringhe
Stringhe
Parte 8
Pagina 222010/2011
Lettura e scrittura di stringhe
Stringhe
Parte 8
Pagina 232010/2011Stringhe
Parte 8
Lettura e scrittura di stringhe
Pagina 242010/2011
Stringhe e puntatori
Stringhe
Parte 8
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.
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
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.
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.
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>
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
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
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.
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;
}
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;
}
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;
}
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"
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;
}
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.
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.
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.
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;
}
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
Pagina 432010/2011
Esercizi
Stringhe
Parte 8
Esercizio 8.2
Scrivere una funzione che, data una stringa, ne
restituisca l’ultimo carattere.
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.