Anda di halaman 1dari 18

Politecnico

di Milano

Tipi di dati

Tipi strutturati: array


Tipi strutturati

!  Tipi i cui dati sono ottenuti dall’aggregazione di altri


dati. Esempi di dati aggregati:
!  Una data
!  Le informazioni relative ad uno studente
!  Un archivio di informazioni su studenti
!  Insiemi di valori numerici
!  Sequenze di caratteri
!  In C i tipi strutturati vengono definiti dal
programmatore sfruttando tre costruttori di tipo
!  Array
!  Struct
!  Union
Array

!  Contenitori di informazioni omogenee


!  Archivio di studenti
0
!  Sequenza di caratteri
1
!  Sequenza di misure di temperatura
2
!  ...
3
!  Ogni “cassetto” del contenitore è 4
accessibile indicandone il numero
5
d’ordine
Esempio: acquisizione di una sequenza
di interi e stampa in ordine inverso

#include <stdio.h>
#define MAX_NUM 10
typedef int sequenza[MAX_NUM]; Dichiarazione tipo di array
void main()
{
int i; sequenza seq; Dichiarazione di variabile array
/* acquisizione dei dati */ 0
printf(“Inserisci %d numeri interi\n”, MAX_NUM); 1
i = 0; Accesso all’elemento i-esimo
while(i<MAX_NUM) nell’array 2
{ scanf(“%d”, &seq[i]); i++; } 3

/* stampa in ordine inverso */ 4


printf(“Stampa dei numeri in ordine inverso: ”); 5
i--;
6
while(i>=0)
{printf(“%d, ”, seq[i]); i--; } 7
printf(“\n”);
8
}
MAX_NUM - 1 9
Dichiarazione di un array (1)

!  Due modi possibili:


!  Prima dichiarare un tipo e poi variabili di quel tipo
typedef int misure[100]; /* dichiarazione di tipo */
misure x; /* dichiarazione di variabile */

! Dichiarare direttamente le variabili


int x[100]; /* dichiarazione di variabile */

!  La dimensione di un array è fissata nel momento


dell’esecuzione della sua dichiarazione e non è modificabile
durante l’esecuzione del programma
!  Per noi la dimensione di un array sarà sempre definito come un
valore numerico o una costante
#define MAX_NUM_CAR 30 /* dichiarazione di costante */
typedef char stringa[MAX_NUM_CAR]; /* dichiarazione di tipo */
stringa cognome; /* dichiarazione di variabile */
Dichiarazione di un array (2)

! Gli elementi di un array possono essere di qualsiasi


tipo. Esempi
typedef enum {lunedi, martedi, mercoledi, giovedi,
venerdi, sabato, domenica} giorniSettimana;
giorniSettimana archivioGiorni[10];

typedef int misure [100];


typedef misure archMisure[10];

! Quando è meglio usare la dichiarazione di tipo?


! Quando è necessario dichiarare più varibili di quel tipo
typedef int misure [100];
misure array1, array2;
!  Quando è opportuno distinguere tra array con struttura
simile ma significato diverso
typedef double PioggeMensili[12];
typedef double IndiciBorsa[12];
Accesso agli elementi di un array

!  Si usa una notazione simile a quella usata in matematica:


int a[10];
a[0] = 20;
a[1] = a[0] +1;
if(a[0]<a[1])...
!  In genere per scandire tutti gli elementi di un array si costruiscono delle
iterazioni
int i, x[10];
...
i = 0;
while (i<10)
{
scanf(“%d”, &x[i]);
i = i+1; /* si puo` anche scrivere i++ */
}
...
Il problema del superamento dei limiti
dell’array

! Che cosa succede se


/* stampa in ordine inverso */
while(i>=0)
{ i--; printf(“%d, ”, seq[i]); }

!  Si cerca di accedere alla cella seq[-1], cioè a una zona di


memoria che non appartiene all’array!
!  Durante l’esecuzione non c’è nessun controllo che lo
impedisca. Risultato in questo caso:
! Viene stampato un valore non significativo
! Può anche succedere:
! sovrascrittura di valori di altre variabili
!   se si superano i limiti di memoria associata al programma,
errore di esecuzione e terminazione del programma
Il ciclo for

!  Due modi equivalenti per iterare sugli elementi di un


array
i = 0; for (i=0; i<MAX_NUM;i++)
while(i<MAX_NUM) scanf(“%d”, &seq[i]);
{ scanf(“%d”, &seq[i]); i++; }

! Può essere usato in tutti i casi in cui l’iterazione


dipende dal valore di un indice che viene
incrementato o decrementato durante l’iterazione
Assegnamento dei valori di un array ad
un altro array

!  Attenzione: l’operatore = non è definito per gli array!

int a[10], b[10], i;


/* assegna un valore agli elementi di a */
...
/* b = a non è un’operazione consentita!!!
In questo caso l’assegnamento può avvenire
elemento per elemento: */
for(i = 0; i < 10; i++)
b[i] = a[i];
Esempio: ricerca di un elemento in un
array di interi (1)

!  I passi dell’algoritmo
!  Acquisisci gli elementi dell’array
!  Acquisisci il valore da cercare nell’array
!  Effettua l’operazione di ricerca e stampa il risultato
!  Considera un elemento dell’array e verifica se è uguale
al valore acquisito.
–  Se si, stampa un messaggio positivo e termina il
programma
–  Se no, passa a considerare l’elemento seguente
Esempio: ricerca di un elemento in un
array di interi (2)

#include <stdio.h>
#define MAX_NUM 10
void main()
{
int a[MAX_NUM];
int val, i;
/* acquisizione elementi dell’array */
for(i=0; i<MAX_NUM; i++)
scanf(“%d”, &a[i]);
/* acquisizione valore da cercare */
scanf(“%d”, &val);
/* scandisce l’array per trovare l’elemento */
for(i=0; i<MAX_NUM && a[i]!=val; i++)
; /* istruzione vuota */
if(i<MAX_NUM)
printf(“valore %d trovato in pos %d\n”, val, i);
else printf(“valore %d non trovato\n”, val);
}
Esercizi

!  Arricchire il programma della ricerca inserendo delle stampe che


guidano l’utente nell’inserimento dei dati
!  Trasformare il ciclo for in una sequenza di istruzioni equivalente
che utilizza il while
!  Ragionare sull’opportunità di trasformare l’istruzione
if(i<MAX_NUM)
printf(“valore %d trovato in pos %d\n”, val, i);
else printf(“valore %d non trovato\n”, val);
!  in
if(a[i] == val)
printf(“valore %d trovato in pos %d\n”, val, i);
else printf(“valore %d non trovato\n”, val);
!  le due istruzioni sono equivalenti in tutti i casi possibili?
Stringhe

!  Stringhe: sequenze di caratteri rappresentate mediante array di


caratteri
!  Esempio
#include <stdio.h>
#define MAX_NUM_CHAR 30
typedef char stringa[MAX_NUM_CHAR];
void main()
{
stringa str;
scanf(“%s”, str); /* notare l’assenza della &
commerciale */
printf(“%s”, str);
}
!  La scanf inserisce nell’array un carattere speciale come
terminatore: ‘\0’
Esempio: individuare le sottosequenze
“ab”, “ae”, “ai” (1)

#include <stdio.h>
#define MAX_NUM_CHAR 30
typedef char stringa[MAX_NUM_CHAR];
typedef enum {falso, vero} boolean;

void main()
{
stringa parola;
int pos;
boolean trovato;

printf("inserisci una stringa: ");


scanf("%s", parola);
trovato = falso;
pos=0;
Esempio: individuare le sottosequenze
“ab”, “ae”, “ai” (2)

while(pos < MAX_NUM_CHAR && parola[pos]!='\0' &&


trovato == falso)
if (parola[pos] == 'a' &&
(parola[pos+1] == 'b' ||
parola[pos+1] == 'e' ||
parola[pos+1] == 'i'))
trovato = vero;
else pos = pos +1;
if (trovato == vero)
printf(“Sequenza trovata a partire da %d\n", pos);
else printf(“Nessuna sequenza trovata\n");
}
Esempio: palindromi

‘a’ ‘d’ ‘d’ ‘a’ ‘\0’

i j
i=0; #include <string.h>
j=strlen(stringa)-1;
while(stringa[i]==stringa[j] && i<j)
{
i++;
j--;
}
if(i>=j)
printf("la stringa e` palindrome\n");
else printf("la stringa non e` palindrome\n");
Esercizi

!  Scrivere il programma completo che acquisisce una


stringa e verifica che sia una palindrome
!  Scrivere un programma che acquisisce due vettori e
costruisce un terzo vettore che rappresenta la
somma dei primi due

Anda mungkin juga menyukai