Laboratorio di Informaticaswap/labinf1617/4_Linguaggio_C_Parte_3.pdf · •A cosa servono i tipi di...

130
Laboratorio di Informatica Linguaggio C (Parte 3 – Strutture (struct) e Stringhe) Corso di Laurea in Informatica e Tecnologie per la Produzione del Sofware (Track B) - A.A. 2016/2017 docente: Cataldo Musto [email protected]

Transcript of Laboratorio di Informaticaswap/labinf1617/4_Linguaggio_C_Parte_3.pdf · •A cosa servono i tipi di...

Laboratorio di InformaticaLinguaggio C

(Parte 3 – Strutture (struct) e Stringhe)

Corso di Laurea in Informatica e Tecnologie per la Produzione del Sofware (Track B) - A.A. 2016/2017

docente: Cataldo Musto

[email protected]

Recap: Array

22/03/2017 2

• Cosa è un array?• Gruppo di locazioni di memoria consecutive

• Stesso nome e tipo

• Modella elementi di tipo omogeneo

• Per riferirsi a un elemento, specificare• Nome dell’array + Posizione

• Formatonome[ position number ]

• array di N elementi di nome c:• c[0], c[1]...c[N – 1]

• L’elemento tra parentesi quadre si dice indice dell’array

Nome dell’array (Tutti gli elementi di questo array hanno lo stesso nome, c)

Numero di posizionedell’elementonell’array c

c[6]

c[0]c[1]c[2]c[3]

c[11]c[10]c[9]c[8]c[7]

c[5]c[4]

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

14

31

9

64

7832146635

55

0234

Recap: array multidimensionali (Matrici)

22/03/2017 3

• Cosa è un array multidimensionale?• Tabelle con righe e colonne (m x n array)

• Come le matrici: specificare le righe, poi le colonne

• Per riferirsi a un elemento, specificare• Nome dell’array + Riga + Colonna

• Formatonome[riga][colonna]

• array di MxN elementi di nome c:• c[0][0], c[0][1]...C[M-1][0], c[M-1][1]...c[M-1][N – 1]

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Importante

22/03/2017 4

• Tutti i problemi che coinvolgono l’utilizzo degli array hanno unastruttura simile• Ciclo di inizializzazione Acquisite i dati da memorizzare nelle variabili del

problema

• Ciclo di elaborazione Elaborate I dati acquisiti, al fine di produrre gli outpuldel problema

• Ciclo di visualizzazione Visualizzazione sulla console dei risultati

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Importante

22/03/2017 5

• Tutti i problemi che coinvolgono l’utilizzo degli array hanno unastruttura simile• Ciclo di inizializzazione Acquisite i dati da memorizzare nelle variabili del

problema

• Ciclo di elaborazione Elaborate I dati acquisiti, al fine di produrre gli outpuldel problema

• Ciclo di visualizzazione Visualizzazione sulla console dei risultati

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Ciascuno di questi passi deve essere gestito con un ciclo separato. Ciascuno dei cicli deve utilizzare una variabile

contatore che scorre tra gli elementi dell’array.

Strutture (struct)

22/03/2017 6Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

(un passo indietro)

22/03/2017

• A cosa servono i tipi di dato?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 7

(un passo indietro)

22/03/2017

• A cosa servono i tipi di dato?• A modellare le variabili che caratterizzano il problema che vogliamo risolvere

• Alcune variabili sono descrivibili attraverso numeri “interi” (es. età)

• Alcune variabili sono descrivibili attraverso numeri con la virgola (es. peso, stipendio, BMI, etc.)

• Alcune variabili sono descrivibili in forma “testuale” (es. nome, cognome)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 8

(un passo indietro)

22/03/2017

• A cosa servono i tipi di dato?• A modellare le variabili che caratterizzano il problema che vogliamo risolvere

• Alcune variabili sono descrivibili attraverso numeri “interi” (es. età)• Alcune variabili sono descrivibili attraverso numeri con la virgola (es. peso,

stipendio, BMI, etc.)• Alcune variabili sono descrivibili in forma “testuale” (es. nome, cognome)

• Come facciamo a rappresentare delle variabili di tipo più complesso?• Esempi: una data ha due elementi numerici (giorno e anno) e un elemento

testuale (il mese)• Esempi: un libro ha svariati elementi che lo descrivono, alcuni testuali (autore,

titolo, editore, genere, etc.) altri di tipo numerico (costo, numero di pagine, etc.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 9

(un passo indietro)

22/03/2017

• A cosa servono i tipi di dato?• A modellare le variabili che caratterizzano il problema che vogliamo risolvere

• Alcune variabili sono descrivibili attraverso numeri “interi” (es. età)• Alcune variabili sono descrivibili attraverso numeri con la virgola (es. peso,

stipendio, BMI, etc.)• Alcune variabili sono descrivibili in forma “testuale” (es. nome, cognome)

• Come facciamo a rappresentare delle variabili di tipo più complesso?• Esempi: una data ha due elementi numerici (giorno e anno) e un elemento

testuale (il mese)• Esempi: un libro ha svariati elementi che lo descrivono, alcuni testuali (autore,

titolo, editore, genere, etc.) altri di tipo numerico (costo, numero di pagine, etc.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 10

Struct

22/03/2017

• Cosa è una struct?

• Aggregazione di dati che può contenere elementi di tipo eterogeneo

• Conoscete altre aggregazioni di dati?• Gli array! Qual è la differenza?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 11

Struct

22/03/2017

• Cosa è una struct?

• Aggregazione di dati che può contenere elementi di tipo eterogeneo• Eterogeneo = diversi tra loro

• Una struct può gestire elementi diversi tra loro, quindi è utile a rappresentare tipologie di entità (oggetti, persone, etc.) più complesse

• Si parla di “aggregati” di dati

• Esempi• Persona (nome, cognome, sesso, data di nascita, codice fiscale, indirizzo, gruppo sanguigno)

• Esame (nome, votazione, data)

• Carta da gioco (seme, numero)

• Libro (titolo, autore, genere, numero di pagine, anno di pubblicazione, editore)

… etc.

Ogni element di una struct si dice membro. Ogni membro ha un tipo.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 12

Struct

22/03/2017

• Cosa è una struct?

• Aggregazione di dati che può contenere elementi di tipo eterogeneo• Eterogeneo = diversi tra loro

• Una struct può gestire elementi diversi tra loro, quindi è utile a rappresentare tipologie di entità (oggetti, persone, etc.) più complesse

• Si parla di “aggregati” di dati

• Esempi• Persona (nome, cognome, sesso, data di nascita, codice fiscale, indirizzo, gruppo sanguigno)

• Esame (nome, votazione, data)

• Carta da gioco (seme, numero)

• Libro (titolo, autore, genere, numero di pagine, anno di pubblicazione, editore)

… etc.

Ogni elemento di una struct si dice membro. Ogni membro ha un tipo.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017 13

Struct

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/201735

Parola chiave

struct

14

Struct

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/201735

Parola chiave

struct

Nomedella struct

15

Struct

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/201735

Membri della struttura

Parola chiave

struct

Nomedella struct

16

Struct

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Membri della struttura

Parola chiave

struct

Nomedella struct

Char *nome = puntatore a un char = array di caratteri =Char nome[10] (es.)

17

Struct

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Dichiaro una variabile di quel tipo(non dimenticate il punto e virgola)

18

Attraverso le structpossiamo «creare» nuovi di tipi di dato,

Più complessi dei tipi di dato primitivi del C (come int, float, char, etc.)

22/03/2017 19Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 20Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

typedef

22/03/2017 21Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

typedef

L’istruzione typedefavvisa il compilatore che stiamo definendo un nuovo «tipo» di dato

22/03/2017 22Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

typedef

L’istruzione typedefavvisa il compilatore che stiamo definendo un nuovo «tipo» di dato

Parola chiave

struct

Nomedella struct

22/03/2017 23Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

typedef

Una volta definito il nuovo tipo di dato posso creare nuovi elementi di quel tipo, come se fosse una qualsiasi variabile.

Per accedere agli elementi di una struct(stampare o acquisire il valore) si utilizza il

cosiddetto «operatore punto»

Sintassi: nomeVariabile.nomeCampoes. d1.giorno

22/03/2017 24Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 25Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Una struct si inizializza come i vettori, mettendo tra parentesi graffe i valori dei singoli membri

Accesso a una struct

22/03/2017 26Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Utilizzo l’operatore «punto» per stampare i valori dei singoli campiAccesso a una struct

22/03/2017 27Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Accesso a una structUtilizzo l’operatore «punto» per acquisire i valori dei singoli campi

Una volta definito un nuovo tipo di dato attraverso le struct, posso usarlo anche per creare degli array di quel tipo di dato

es) definisco struct datadata d1 variabile di tipo data

data calendario[365] array di date

22/03/2017 28Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Una volta definito un nuovo tipo di dato attraverso le struct, posso usarlo anche per creare degli array di quel tipo di dato

es) definisco struct datadata d1 variabile di tipo data

data calendario[365] array di date

22/03/2017 29Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

es) definisco struct datadata d1 variabile di tipo datadata cal[365] array di date

Ciascun cal[i] è una struct di tipo «data» quindi posso usare l’operatore punto per accedere ai suoi elementi.

22/03/2017 30Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

…cal[0] cal[1] cal[2] cal[3] cal[4] cal[365]

es) definisco struct datadata d1 variabile di tipo datadata cal[365] array di date

Ciascun cal[i] è una struct di tipo «data» quindi posso usare l’operatore punto per accedere ai suoi elementi.

22/03/2017 31Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

…cal[0] cal[1] cal[2] cal[3] cal[4] cal[365]

Es.) cal[0].giorno = 1 , cal[0].mese = «Gennaio», cal[0].anno = 2017cal[365].giorno = 31 , cal[365].mese = «Dicembre» , cal[365].anno = 2017

Utilizzo delle struct

22/03/2017

• IMPORTANTE• I membri delle struct possono essere di due tipi

• Tipi di dato primitivi (int, float, char, etc.)

• Tipi di dato complessi (array e altre struct!)

• Partendo da questo principio possiamo usare le struct per creare aggregati di dati molto più complessi, ad esempio.• Posso definire un tipo di dato LIBRETTO come

• Nome

• Cognome

• Data di Nascita

• Esami

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

3532

Utilizzo delle struct

22/03/2017

• IMPORTANTE• I membri delle struct possono essere di due tipi

• Tipi di dato primitivi (int, float, char, etc.)

• Tipi di dato complessi (array e altre struct!)

• Partendo da questo principio possiamo usare le struct per creare aggregati di dati molto più complessi, ad esempio.• Posso definire un tipo di dato STUDENTE come aggregato di:

• Nome

• Cognome

• Data di Nascita

• Esami

• Di che tipo sono I membri?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

3533

Utilizzo delle struct

22/03/2017

• IMPORTANTE• I membri delle struct possono essere di due tipi

• Tipi di dato primitivi (int, float, char, etc.)

• Tipi di dato complessi (array e altre struct!)

• Partendo da questo principio possiamo usare le struct per creare aggregati di dati molto più complessi, ad esempio.• Posso definire un tipo di dato STUDENTE come aggregato di:

• Nome char[10]

• Cognome char[10]

• Data di Nascita

• Esami

• Di che tipo sono i membri?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

3534

Utilizzo delle struct

22/03/2017

• IMPORTANTE• I membri delle struct possono essere di due tipi

• Tipi di dato primitivi (int, float, char, etc.)

• Tipi di dato complessi (array e altre struct!)

• Partendo da questo principio possiamo usare le struct per creare aggregati di dati molto più complessi, ad esempio.• Posso definire un tipo di dato STUDENTE come aggregato di:

• Nome char[10]

• Cognome char[10]

• Data di Nascita data (definite in precedenza!)

• Esami

• Di che tipo sono i membri?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

35

Una struct può essere membro di

un’altra struct!

35

Utilizzo delle struct

22/03/2017

• IMPORTANTE• I membri delle struct possono essere di due tipi

• Tipi di dato primitivi (int, float, char, etc.)

• Tipi di dato complessi (array e altre struct!)

• Partendo da questo principio possiamo usare le struct per creare aggregati di dati molto più complessi, ad esempio.• Posso definire un tipo di dato STUDENTE come aggregato di:

• Nome char[10]

• Cognome char[10]

• Data di Nascita data (definite in precedenza!)

• Esami vettore di interi

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

35

Una struct può essere membro di

un’altra struct!

Anche Un array può essere membro di

una struct!

36

Recap - struct

22/03/2017

• Le struct servono a “creare” nuovi tipi di dato , aggregando tipi di datipiù semplici

• Dentro una struct possono essere uniti tipologie di dato diverse (es. char, int, float ma anche array e persino altre struct)

• Una struct diventa una variabile a tutti gli effetti, quindi si puòistanziare come variabile singola, ma è possibile anche creare degliarray di struct

• L’accesso ai membri di una struct avviene con l’operatore “.” , indicandoil nome della variabile e poi il nome del campo (es. persona.nome)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

3537

22/03/2017 38

Problema 3.1Definire una variabile “corso” come un array di cinque studenti.

Ciascuno studente deve essere rappresentato come una struct composta daiseguenti campi: nome, cognome, data di nascita, esami. Nome e cognome sono

array di caratteri, mentre gli esami sono un array di tre interi. La data deveessere a sua volta una struct

Scrivere un programma che acquisisca i dati in input per ciascuno dei cinque studenti e li mostri sullo schermo. Aggiungere dei controlli per il giorno, l’anno e

il voto d’esame, assicurandosi che vengano inseriti valori corretti.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 39

Soluzione 3.1

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 6-7Definizione delle costanti simboliche

Riga 13-18Dichiarazione della struct di tipo «data»

22/03/2017 40

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 20-25Dichiarazione della struct di tipo «studente»

Riga 27Array di struct

22/03/2017 41

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 33Utilizzo della notazione punto nella scanf

22/03/2017 42Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

corso[0] corso[1] corso[2]

Simulazione

corso[3] corso[4]

22/03/2017 43Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

corso[0] corso[1] corso[2]

Simulazione

corso[3] corso[4]

Se i==0 , mi riferisco a corso[0], che è una variabile di tipo studente

22/03/2017 44Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

corso[0] corso[1] corso[2]

Simulazione

corso[3] corso[4]

Se i==0 , mi riferisco a corso[0], che è una variabile di tipo studente

22/03/2017 45Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

corso[0] corso[1] corso[2]

Simulazione

corso[3] corso[4]

Quindi utilizzo la notazione punto per accedere ai singoli campi

Corso[0].nomeCorso[0].cognomeetc.

22/03/2017 46

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 37Utilizzo della notazione punto innestata nella scanf

22/03/2017 47

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 37corso[i].nascita è a sua volta unastruct, quindi si utilizza la notazione punto per accedere a un ulteriori campi di quella struct

22/03/2017 48

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 41-43Acquisisco i voti degli esami. I valori sono in un vettore, quindi mi serve un altro ciclo.

22/03/2017 49

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 46corso[i].voti è un vettore, quindi mi serve l’indice per accedere alle singoli posizioni del vettore.

22/03/2017 50

Soluzione 3.1 (cont.)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Ciclo di visualizzazione

dati.

struct - memorizzazione

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

51

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Qual è la dimensione di questa struttura?

Risposta corretta:

20 byte

struct - memorizzazione

52

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Qual è la dimensione di questa struttura?

Risposta corretta:

20 byte

Verificate su Repl.it aprendo una nuova sessione.

Istruzione: sizeof(d1)

struct - memorizzazione

53

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Nelle moderne architetture la memoria è ottimizzata per

accedere a blocchi da 4 byte

Ogni blocco = 1 byte (un rigo 4 byte)

struct - memorizzazione

54

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Nelle moderne architetture la memoria è ottimizzata per

accedere a blocchi da 4 byte

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

struct - memorizzazione

55

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Nelle moderne architetture la memoria è ottimizzata per

accedere a blocchi da 4 byte

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

float n2;

struct - memorizzazione

56

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Nelle moderne architetture la memoria è ottimizzata per

accedere a blocchi da 4 byte

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

float n2;

char st[10];

struct - memorizzazione

57

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Nelle moderne architetture la memoria è ottimizzata per

accedere a blocchi da 4 byte

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

float n2;

char st[10];

(padding)

struct - memorizzazione

58

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Per ottimizzare l’accesso alla memoria si aggiungono 2-byte extra (il totale deve

essere sempre un multiplo di 4)

Questo fenomeno si chiama padding.

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

float n2;

char st[10];

(padding)

struct - memorizzazione

59

22/03/2017Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

I campi di una struttura vengono memorizzati in locazioni di

memoria consecutive

Per ottimizzare l’accesso alla memoria si aggiungono 2-byte extra (il totale deve

essere sempre un multiplo di 4)

Questo fenomeno si chiama padding.

Ogni blocco = 1 byte (un rigo 4 byte)

int n1;

float n2;

char st[10];

(padding)

Verifica: dichiarate char st[9] o char st[11]La struttura occuperà sempre 20 byte.

struct - memorizzazione

60

22/03/2017 61

Nota finale

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le variabili di tipo

structpossono essere assegnate una all’altra

22/03/2017 62

Nota finale

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le variabili di tipo

structpossono essere assegnate una all’altra

22/03/2017 63

Nota finale

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le variabili di tipo

structNon possono essere confrontate

22/03/2017 64

Nota finale

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le variabili di tipo

structNon possono essere confrontate

22/03/2017 65

Nota finale

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Versione corretta: bisogna confrontare i singoli campi della

struct.

22/03/2017 66

Problema 3.2Partire dal codice sorgente del problema 3.1 e aggiungere le seguenti funzionalità.

1) Aggiungere dei controlli sulla correttezza dell’input2) Calcolare la media d’esame per ciascuno studente, e stamparla sullo schermo.3) Trovare lo studente più grande e stampare sullo schermo il suo nome, cognome

e i suoi anni.4) Stampare nome e cognome dello studente con la media d’esame più alta.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 67

Problema 3.2Partire dal codice sorgente del problema 3.1 e aggiungere le seguenti funzionalità.

1) Aggiungere dei controlli sulla correttezza dell’input2) Calcolare la media d’esame per ciascuno studente, e stamparla sullo schermo.3) Trovare lo studente più grande e stampare sullo schermo il suo nome, cognome

e i suoi anni.4) Stampare nome e cognome dello studente con la media d’esame più alta.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Note: per il punto (1) sono sufficienti dei controlli su giorno di nascita, anno di nascita e voto d’esame. Non necessari i controlli sul nome del mese e sulla correttezza complessiva della data (es. 30 Febbraio)

Per il punto (2) si può scegliere se aggiungere un ulteriore campo (float) alla struct oppure se calcolare la media successivamente e stamparla al momento senza memorizzarla. Per il punto (3) non è necessario verificare che gli anni siano stati compiuti o meno.

22/03/2017 68

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 9: definizione di una nuova costante simbolica per il conteggio degli anni.

22/03/2017 69

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 9: definizione di una nuova costante simbolica per il conteggio degli anni.

Riga 26: aggiunta di una nuova variabile nella struct «studente»

22/03/2017 70

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 42: conteggio della media nel ciclo di acquisizione voti. E’ corretto inserirla in quel punto perché stiamo acquisendo in input informazioni sui singoli campi della struttura.

Riga 52-55: classico conteggio della media

22/03/2017 71

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 59-62: dichiaro delle variabili per memorizzare i massimi

Riga 65 e seg. Il conteggio dei massimi viene messo nel ciclo di visualizzazione, perché riguarda in qualche modo l’output. Sarebbe stato anche corretto inserire un ciclo intermedio (di elaborazione dei dati) per suddividere meglio il programma

22/03/2017 72

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 59-62: dichiaro delle variabili per memorizzare i massimi

Riga 72-74: cerco il massimo dell’età

22/03/2017 73

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 85-88: cerco il massimo nelle medie (ed aggiorno eventualmente gli indici)

22/03/2017 74

(La mia) Soluzione 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Riga 85-88: cerco il massimo nelle medie (ed aggiorno eventualmente gli indici)

Riga 92-94: stampo i massimi

Stringhe

22/03/2017 75Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe

• «Stringa» è il nome che identifica un insieme di caratteri chiusi tra virgolette• char string1[] = "first";

• Equivalente a un array di caratteri!

• char string1[] = {'f','i','r','s','t','\0' };• Ha sei elementi (Stringhe di N caratteri hanno N+1 elementi), memorizzati in locazioni contigue

• Il carattere '\0' termina le stringhe, ed è detto terminatore.

• Nell’inizializzione delle stringhe è inserito in automatico, altrimenti deve essere inserito esplicitamente

• Trattandosi di array, è possibile accedere ai caratteri individualistring1[3] è il carattere ‘s’

• Nel caso degli array di stringhe, & non è richiesto nella scanf• scanf( "%s", string2 );

• Perchè? Il nome dell’array è un puntatore all’indirizzo del primo elemento

22/03/2017 76Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe

• «Stringa» è il nome che identifica un insieme di caratteri chiusi tra virgolette• char string1[] = "first";

• Equivalente a un array di caratteri!

• char string1[] = {'f','i','r','s','t','\0' };• Ha sei elementi (Stringhe di N caratteri hanno N+1 elementi), memorizzati in locazioni contigue

• Il carattere '\0' termina le stringhe, ed è detto terminatore.

• Nell’inizializzione delle stringhe è inserito in automatico, altrimenti deve essere inserito esplicitamente

• Trattandosi di array, è possibile accedere ai caratteri individualistring1[3] è il carattere ‘s’

• Nel caso degli array di stringhe, & non è richiesto nella scanf• scanf( "%s", string2 );

• Perchè? Il nome dell’array è un puntatore all’indirizzo del primo elemento

22/03/2017 77Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe

22/03/2017 78

• Importante: gli array non effettuano controlli sulla lunghezza del vettore

• Se dichiaro un array di lunghezza pari ad N, devo assicurarmi di leggere esattamente N-1 caratteri(più il terminatore)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe

22/03/2017 79

• Importante: gli array non effettuano controlli sulla lunghezza del vettore

• Se dichiaro un array di lunghezza pari ad N, devo assicurarmi di leggere esattamente N-1 caratteri(più il terminatore)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe

22/03/2017 80

• Importante: gli array non effettuano controlli sulla lunghezza del vettore

• Se dichiaro un array di lunghezza pari ad N, devo assicurarmi di leggere esattamente N-1 caratteri(più il terminatore)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

La dichiarazione della variabile alloca in memoria uno spazio pari a 10 char. Stringhe più lunghe verrebbero

comunque memorizzate, ma non avremmo la certezza che quella locazione di memoria resti libera.

Stringhe

22/03/2017 81

• Importante: gli array non effettuano controlli sulla lunghezza del vettore

• Se dichiaro un array di lunghezza pari ad N, devo assicurarmi di leggere esattamente N-1 caratteri(più il terminatore)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

La dichiarazione della variabile alloca in memoria uno spazio pari a 10 char. Stringhe più lunghe verrebbero

comunque memorizzate, ma non avremmo la certezza che quella locazione di memoria resti libera.IMPORTANTE: La scanf di una stringa termina

quando trova uno spazio o una tabulazione o un newline

Stringhe – Funzioni di Elaborazione

22/03/2017 82Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• C include numerose funzioni per l’elaborazione di stringhe e caratteri• Disponibili nella libreria <ctype.h>

• Funzioni per l’elaborazione dei caratteri• Controllo che un dato carattere sia un numero o una lettera

• Controllo che un dato carattere sia maiuscolo o minuscolo

• Controllo che un dato carattere sia un simbolo di punteggiatura, uno spazio, etc.

• Funzioni per l’elaborazione delle stringhe• Confronto tra due stringhe (verifica se sono uguali o meno)

• Conversione stringhe valori numerici (e viceversa)

• Copia (parziale o totale) di una stringa in un’altra stringa o concatenazione tra stringhe

• Suddivisione di una frase in singoli termini (tokenizzazione)

Stringhe – Funzioni di Elaborazione

22/03/2017 83Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• C include numerose funzioni per l’elaborazione di stringhe e caratteri• Disponibili nella libreria <ctype.h>

• Funzioni per l’elaborazione dei caratteri• Controllo che un dato carattere sia un numero o una lettera

• Controllo che un dato carattere sia maiuscolo o minuscolo

• Controllo che un dato carattere sia un simbolo di punteggiatura, uno spazio, etc.

• Funzioni per l’elaborazione delle stringhe• Confronto tra due stringhe (verifica se sono uguali o meno)

• Conversione stringhe valori numerici (e viceversa)

• Copia (parziale o totale) di una stringa in un’altra stringa o concatenazione tra stringhe

• Suddivisione di una frase in singoli termini (tokenizzazione)

Funzioni per l’elaborazione dei caratteri

22/03/2017 84Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Prototype Description

int isdigit( int c ); Returns true if c is a digit and false otherwise.

int isalpha( int c ); Returns true if c is a letter and false otherwise.

int isalnum( int c ); Returns true if c is a digit or a letter and false otherwise.

int isxdigit( int c ); Returns true if c is a hexadecimal digit character and false otherwise.

int islower( int c ); Returns true if c is a lowercase letter and false otherwise.

int isupper( int c ); Returns true if c is an uppercase letter; false otherwise.

int tolower( int c ); If c is an uppercase letter, tolower returns c as a lowercase letter. Otherwise, tolower

returns the argument unchanged. int toupper( int c );

If c is a lowercase letter, toupper returns c as an uppercase letter. Otherwise, toupper

returns the argument unchanged. int isspace( int c );

Returns true if c is a white-space character—newline ('\n'), space (' '), form feed

('\f'), carriage return ('\r'), horizontal tab ('\t'), or vertical tab ('\v')—and false

otherwise int iscntrl( int c );

Returns true if c is a control character and false otherwise. int ispunct( int c );

Returns true if c is a printing character other than a space, a digit, or a letter and false

otherwise. int isprint( int c );

Returns true value if c is a printing character including space (' ') and false otherwise.

int isgraph( int c ); Returns true if c is a printing character other than space (' ') and false otherwise.

In C i valori booleani sono codificati come interi:True = 1False = 0

Funzioni per l’elaborazione dei caratteri

22/03/2017 85Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isdigit(char) restituisce a 1 se il carattere è un numero, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 86Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isdigit(char) restituisce a 1 se il carattere è un numero, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 87Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isalpha(char) restituisce a 1 se il carattere è alfabetico, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 88Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isalpha(char) restituisce a 1 se il carattere è alfabetico, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 89Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isalnum(char) restituisce a 1 se il carattere è alfanumerico, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 90Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

isalnum(char) restituisce a 1 se il carattere è alfanumerico, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 91Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

islower(char) restituisce a 1 se il carattere è minuscolo, altrimenti sarà uguale a 0.

isupper(char) restituisce a 1 se il carattere è maiuscolo, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 92Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

islower(char) restituisce a 1 se il carattere è minuscolo, altrimenti sarà uguale a 0.

isupper(char) restituisce a 1 se il carattere è maiuscolo, altrimenti sarà uguale a 0.

Funzioni per l’elaborazione dei caratteri

22/03/2017 93Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

toupper(char) converte un carattere in maiuscolo.

(Recap)

22/03/2017 94Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Prototype Description

int isdigit( int c ); Returns true if c is a digit and false otherwise.

int isalpha( int c ); Returns true if c is a letter and false otherwise.

int isalnum( int c ); Returns true if c is a digit or a letter and false otherwise.

int isxdigit( int c ); Returns true if c is a hexadecimal digit character and false otherwise.

int islower( int c ); Returns true if c is a lowercase letter and false otherwise.

int isupper( int c ); Returns true if c is an uppercase letter; false otherwise.

int tolower( int c ); If c is an uppercase letter, tolower returns c as a lowercase letter. Otherwise, tolower

returns the argument unchanged. int toupper( int c );

If c is a lowercase letter, toupper returns c as an uppercase letter. Otherwise, toupper

returns the argument unchanged. int isspace( int c );

Returns true if c is a white-space character—newline ('\n'), space (' '), form feed

('\f'), carriage return ('\r'), horizontal tab ('\t'), or vertical tab ('\v')—and false

otherwise int iscntrl( int c );

Returns true if c is a control character and false otherwise. int ispunct( int c );

Returns true if c is a printing character other than a space, a digit, or a letter and false

otherwise. int isprint( int c );

Returns true value if c is a printing character including space (' ') and false otherwise.

int isgraph( int c ); Returns true if c is a printing character other than space (' ') and false otherwise.

22/03/2017 95

Problema 3.3Scrivere un programma che acquisisca in input la password inserita da un utente.

Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Input?

Output?

Quale tipologia di istruzioni ci serve?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 96

Problema 3.3

Input?

Output?

Quale tipologia di istruzioni ci serve?

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 97

Problema 3.3

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Input? Stringa, inserita dall’utente.Output?Messaggio di conferma o messaggio di errore.Quale tipologia di istruzioni ci serve?- Istruzioni per la manipolazione dei caratteri- (che altro?)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 98

Problema 3.3

Input? Stringa, inserita dall’utente.Output?Messaggio di conferma o messaggio di errore.Quale tipologia di istruzioni ci serve?- Istruzioni per la manipolazione dei caratteri- Istruzioni di iterazione

- Suggerimento: una stringa è un array di caratteri.

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Codificare la soluzione su Repl.it

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 99

Soluzione 3.3

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 100

Soluzione 3.1

Notate che il programma si divide sempre in tre blocchi principali.• Inserimento input• Elaborazione dati

input• Visualizzazione

output

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 101

Soluzione 3.3

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Dichiaro la variabile in cui sarà memorizzata la password e due variabili in cui conteggiare

le lettere maiuscole e le cifre inserite.

22/03/2017 102

Soluzione 3.3

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Scorro tutti i caratteri, e conteggio quante sono le lettere maiuscole e le cifre.

22/03/2017 103

Soluzione 3.3

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stampa dell’output

22/03/2017 104

Soluzione 3.3

Esercizio 3.4

Estendere l’esercizio 3.11. Introducendo un ciclo

che continua finché la password inserita non è corretta

2. Riscrivendo le istruzioni nel blocco 17-20 in formato più efficiente. Come?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 105

Soluzione 3.3

Esercizio 3.4

Estendere l’esercizio 3.11. Introducendo un ciclo

che continua finché la password inserita non è corretta

2. Riscrivendo le istruzioni nel blocco 17-20 in formato più efficiente. Come?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 106

Soluzione 3.4 (parte 1) ModificheRigo 6 – dichiaro una variabile per uscire dal ciclo

Rigo 9-10 – perché inizializzo nuovamente queste variabili?

Rigo 12 – il programma viene eseguito finché la variabile sentinella è uguale a zero

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 107

Soluzione 3.4 (parte 2)Modifiche

Blocco 26-30 – Non ho bisogno di incrementale ogni volta la variabile!

E’ sufficiente farlo finché viene incrementato la prima volta (il vincolo è che ce ne deve essere almeno una!)

In questo modo si riducono gli accessi in memoria e il programma è più efficiente.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 108

Soluzione 3.4 (parte 2)Modifiche

Blocco 26-30 – Non ho bisogno di incrementale ogni volta la variabile!

E’ sufficiente farlo finché viene incrementato la prima volta (il vincolo è che ce ne deve essere almeno una!)

In questo modo si riducono gli accessi in memoria e il programma è più efficiente.Torniamo alla domanda

precedente.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 109

Soluzione 3.4 (parte 1)Rigo 9-10 – perché inizializzo nuovamente queste variabili?

Torniamo alla domanda precedente.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 110

Soluzione 3.4 (parte 1)Rigo 9-10 – perché inizializzo nuovamente queste variabili?

Commentare le righe 9 e 10 ed eseguire il programma inserendo queste password:• password• passw0rd• Password

La terza password viene accettata, nonostante non sia corretta.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

22/03/2017 111

Soluzione 3.4 (parte 1)Rigo 9-10 – perché inizializzo nuovamente queste variabili?

Commentare le righe 9 e 10 ed eseguire il programma inserendo queste password:• password• passw0rd• Password

La terza password viene accettata, nonostante non sia corretta.

Se non inizializzassimo le variabili ad ogni ciclo, rimarrebbero memorizzati i valori dei cicli precedenti, e password non corrette potrebbero essere accettate!

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe – Funzioni di Elaborazione

22/03/2017 112Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Confrontare le stringhe• Il computer confronta i codici numerici ASCII dei caratteri delle stringhe

int strcmp( const char *s1, const char *s2 );

• Confronta la stringa s1 con s2• Restituisce zero se sono uguali, un numero negativo se s1 < s2, o un numero positivo

se s1 > s2 (es. Roma > Bari, Albero < Bari)

int strncmp( const char *s1, const char *s2, size_t n );

• Confronta N caratteri della stringa s1 con s2• Restituisce gli stessi valori come sopra

• Restituisce zero se I primi N caratteri sono uguali.

Stringhe – Funzioni di Elaborazione

22/03/2017 113Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Confrontare le stringhe• Il computer confronta i codici numerici ASCII dei caratteri delle stringhe

int strcmp( const char *s1, const char *s2 );

• Confronta la stringa s1 con s2• Restituisce zero se sono uguali, un numero negativo se s1 < s2, o un numero positivo

se s1 > s2 (es. Roma > Bari, Albero < Bari)

int strncmp( const char *s1, const char *s2, size_t n );

• Confronta N caratteri della stringa s1 con s2• Restituisce gli stessi valori come sopra

• Restituisce zero se I primi N caratteri sono uguali.

Stringhe – Confronto tra Stringhe

22/03/2017 114Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Stringhe – Confronto tra Stringhe

22/03/2017 115Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Perché si usa il «!» (not) ?

Stringhe – Confronto tra Stringhe

22/03/2017 116Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Perché si usa il «!» (not) ?Perché strcmp restituisce 0 se le due stringhe sono uguali, e lo 0 viene identificato in C come «negazione», quindi bisogna utilizzare l’operatore di negazione «!»

Stringhe – Confronto tra Stringhe

22/03/2017 117Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Function prototype Function description

char *strchr( const char *s,int c );

Locates the first occurrence of character c in string s. If c is found, apointer to c in s is returned. Otherwise, a NULL pointer is returned.

size_t strcspn( const char*s1, const char *s2 );

Determines and returns the length of the initial segment of string s1

consisting of characters not contained in string s2.

size_t strspn( const char*s1, const char *s2 );

Determines and returns the length of the initial segment of string s1

consisting only of characters contained in string s2.

char *strpbrk( const char*s1, const char *s2 );

Locates the first occurrence in string s1 of any character in string s2. Ifa character from string s2 is found, a pointer to the character in strings1 is returned. Other wise, a NULL pointer is returned.

char *strrchr( const char *s,int c );

Locates the last occurrence of c in string s. If c is found, a pointer to cin string s is returned. Otherwise, a NULL pointer is returned.

char *strstr( const char *s1,const char *s2 );

Locates the first occurrence in string s1 of string s2. If the string isfound, a pointer to the string in s1 is returned. Otherwise, a NULL

pointer is returned.

char *strtok( char *s1, constchar *s2 );

A sequence of calls to strtok breaks string s1 into “tokens”—logicalpieces such as words in a line of text—separated by characterscontained in string s2. The first call contains s1 as the first argument,and subsequent calls to continue tokenizing the same string containNULL as the first argument. A pointer to the current token is returnedby each call. If there are no more tokens when the function is called,NULL is returned.

Funzioni per la ricerca nelle stringhe

22/03/2017 118Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Funzioni per la ricerca nelle stringhe - Esempi

22/03/2017 119Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Funzioni per la conversione delle stringhe

22/03/2017 120Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Function prototype Function descriptiondouble atof( const char *nPtr ); Converts the string nPtr to double.

int atoi( const char *nPtr ); Converts the string nPtr to int.

long atol( const char *nPtr ); Converts the string nPtr to long int.

double strtod( const char *nPtr, char**endPtr );

Converts the string nPtr to double.

long strtol( const char *nPtr, char**endPtr, int base );

Converts the string nPtr to long.

unsigned long strtoul( const char*nPtr, char **endPtr, int base );

Converts the string nPtr to unsigned long.

Prendono in input una stringa e restituiscono in output la la string convertita in un numero.

Funzioni per la conversione delle stringhe - Esempi

22/03/2017 121Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

The string "99.0" converted to double is 99.000The converted value divided by 2 is 49.500

1 /* Fig. 8.6: fig08_06.c

2 Using atof */

3 #include <stdio.h>

4 #include <stdlib.h>

5

6 int main()

7 {

8 double d; /* variable to hold converted string */

9

10 d = atof( "99.0" );

11

12 printf( "%s%.3f\n%s%.3f\n",

13 "The string \"99.0\" converted to double is ", d,

14 "The converted value divided by 2 is ",

15 d / 2.0 );

16

17 return 0; /* indicates successful termination */

18

19 } /* end main */

La funzione prende in input un valore in formato stringa e lo converte in un float (o in un altro formato, a seconda della funzione)

Funzioni per la conversione delle stringhe - Esempi

22/03/2017 122Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

La funzione prende in input un valore in formato stringa e lo converte in un float (o in un altro formato, a seconda della funzione). La parte rimanente viene memorizzata in una ulteriore stringa.

1 /* Fig. 8.9: fig08_09.c

2 Using strtod */

3 #include <stdio.h>

4 #include <stdlib.h>

5

6 int main()

7 {

8 /* initialize string pointer */

9 const char *string = "51.2% are admitted";

10

11 double d; /* variable to hold converted sequence */

12 char *stringPtr; /* create char pointer */

13

14 d = strtod( string, &stringPtr );

15

16 printf( "The string \"%s\" is converted to the\n", string );

17 printf( "double value %.2f and the string \"%s\"\n", d, stringPtr );

18

19 return 0; /* indicates successful termination */

20

21 } /* end main */

The string "51.2% are admitted" is converted to the double value 51.20 and the string "% are admitted"

Funzioni per la manipolazione delle stringhe

22/03/2017 123Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Function prototype Function descriptionchar *strcpy( char*s1, const char *s2 )

Copies string s2 into array s1. The value of s1 is returned.

char *strncpy( char*s1, const char *s2,size_t n )

Copies at most n characters of string s2 into array s1. The value of s1is returned.

char *strcat( char*s1, const char *s2 )

Appends string s2 to array s1. The first character of s2 overwrites theterminating null character of s1. The value of s1 is returned.

char *strncat( char*s1, const char *s2,size_t n )

Appends at most n characters of string s2 to array s1. The firstcharacter of s2 overwrites the terminating null character of s1. The

value of s1 is returned.

Permettono di copiare una parte dei caratteri di una stringa in un’altra stringa oppure di concatenare due stringa in una più grande.

Funzioni per la manipolazione delle stringhe

22/03/2017 124Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Funzioni per la manipolazione delle stringhe

22/03/2017 125Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Elaborazione di Stringhe

22/03/2017 126

• Approfondimenti:• Capitolo 8 del libro Deitel & Deitel

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Domande?

22/03/2017 127Cataldo Musto - Linguaggio C (parte 3) Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Esercitazione 3

• Obiettivo: • Dimostrare di aver compreso i concetti relativi all’utilizzo delle stringhe e

alle funzioni incluse nella libreria <ctype.h> e <string.h>

• Utilizzare i concetti relativi agli array per memorizzare le informazioni relativi a insiemi di dati omogenei.

• Combinare questa competenza con i concetti base di programmazione strutturata, combinando istruzioni di iterazione e selezione per risolvere problemi complessi.

• Assignment su Repl.it

22/03/2017 128Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Esercitazione 3

• Codificare una soluzione per il seguente problema

1) Il programma deve raccogliere le informazioni relative a cinque utenti del sistema. Ogni individuo dovrà inserire nome, cognome, indirizzo e una password di accesso. Ciascun individuo deve essere rappresentato con una struct di tipo «account»

2) I dati inseriti dovranno verificare i seguenti vincoli:• Il nome dovrà cominciare con una lettera maiuscola e non potrà essere più lungo di 20

caratteri• Il cognome dovrà cominciare con una lettera maiuscola e non potrà essere più lungo di 20

caratteri• L’indirizzo dovrà necessariamente iniziare con «Via» e non potrà essere lungo più di 50

caratteri• La password dovrà essere lunga esattamente 8 caratteri, cominciare con una lettera

maiuscola, contenere almeno un numero e almeno un carattere speciale• Chiaramente, il programma deve ciclare finchè nome, cognome e password non sono

corretti.

22/03/2017 129Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Esercitazione 3 (cont.)

3) Una volta inseriti (e memorizzati) i dati, il programma deve calcolare il livello di sicurezza della password e stampare un messaggio in output che avvisa del livello di sicurezza. Il livello di sicurezza è così calcolato

• Password poco sicura: se il numero di caratteri numerici e caratteri speciali è <= 2• Password mediamente sicura: se il numero di caratteri numerici e speciali è > 2 e <=

4• Password sicura se il numero è > 4

4) Il sistema dovrà stampare in output nome, cognome, indirizzo e password di ogni utente. Nella password, tutte le lettere (escluse la prima e l'ultima) dovranno essere sostituite da asterischi (es. passw0rD --> p******D). Infine Il sistema dovrà stampare il nome dell'utente che ha inserito la password più sicura e i nomi degli utenti che hanno inserito una password non sicura.

22/03/2017 130Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017