Corso di Programmazione 1
a.a.2006/2007
Prof.ssa Chiara Petrioli
Corso di Laurea in Informatica
Università degli Studi “La Sapienza”
(lezioni 8 e 9)
Matrici e stringhe
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Array n-dimensionali
I vettori possono avere più di un indice
possono ad esempio memorizzare i valori di tabelle
costituite da un certo numero di righe e colonne
Lun
Mar
Mer
Es. temperature dei giorni dell’ultima settimana
1 riga per ogni giorno
Prof.ssa Chiara Petrioli -- corso di
Una colonna per ogni ora
del giorno
in2006/2007
cui si è presa la temperatura
programmazione
1, a.a.
Array n-dimensionali
I vettori possono avere più di un indice
possono ad esempio memorizzare i valori di tabelle
costituite da un certo numero di righe e colonne
Nome della matrice
Es. a[0][1] specifica l’elemento nella riga 0
e nella colonna 1
Per individuare un particolare elemento della tabella bisogna specificare
due indici
Prof.ssa Chiara Petrioli -- corso di
indice di riga
programmazione 1, a.a. 2006/2007
indice di colonna
Array n-dimensionali
I vettori possono avere più di un indice
possono ad esempio memorizzare i valori di tabelle
costituite da un certo numero di righe e colonne
a[2][2]
Nome della matrice
Es. a[2][2] specifica l’elemento nella riga 2
e nella colonna 2
I vettori
che con
per identificare
particolare
elemento
richiedono
due indici sono
Una
matrice
m righe e n un
colonne
è detta
matrice m
xn
detti vettori bidimensionali o
matrici
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Matrici
a[i][j] identifica l’elemento della
matrice a in posizione (i,j)
Dichiarazione di una variabile
a[0][2]
di a[0,0]
tipo matrice a[0][1]
a[0][3]
int b[2][2]; /* b è una matrice
di interi costituita da
due righe e due
colonne */
a[1][3]
a[1][0]
a[1][1]
a[1][2]
Dichiarazione e
inizializzazione
int b[2][2]={{1,2},{3,4}};
a[2][0]
a[2][1]
(in alternativa possiamo ad
esempio prendere da input i
vari valori della matrice)
a[2][2]
Se non vengono forniti tutti
I valori di una riga i rimanenti
Sono
inizializzati a 0
a[2][3]
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Allocazione di memoria per matrici
a[0][0]
…..
Elem 1 riga 1
Elem 2 riga 1
Elem n riga 1
…..
…..
…..
Elem 1 riga 2
Elem 2 riga 2
Elem n riga 2
Elem 1 riga m
Elem 2 riga m
Elem n riga m
Gli elementi della matrice sono memorizzati in celle consecutive di memoria,
Prof.ssa Chiara Petrioli -- corso di
Una riga dopo l’altra
programmazione 1, a.a. 2006/2007
Allocazione di memoria per matrici
a[0][0]
…..
Elem 1 riga 1
Elem 2 riga 1
Elem n riga 1
…..
…..
…..
Elem 1 riga 2
Elem 2 riga 2
Elem n riga 2
Elem 1 riga m
Elem 2 riga m
Elem n riga m
a[0][0]
+ (i*n)+
j
Se
a[0][0]
memorizzato
nella cella 1800 in che cella è memorizzato l’elemento i,j
Prof.ssa
Chiara Petrioli
-- corso
di
(assumendo
una cella,
un intero)?
Serve conoscere
il numero
di
colonne
n
per
sapere
in che cella trovare un
programmazione 1, a.a. 2006/2007
generico elemento di una matrice !!
Un primo esempio..
include <stdio.h>
void printmatrice(int [ ][3]);
main()
Serve indicare il numero di colonne per
{
consentire di saper trovare l’elemento (i,j)
int matrix1[2][3]={{1,2,3},{4,5,6}};
int matrix2[2][3]={1,2,3,4,5};
int matrix3[2][3]={{1,2},{4}};
printmatrice(matrix1);
printmatrice(matrix2);
123
printmatrice(matrix3);
456
return 0;
}
123
IN OUTPUT
450
120
Prof.ssa Chiara Petrioli
4 0-- corso
0 di
programmazione 1, a.a. 2006/2007
Un primo esempio…
void printmatrice (int a[ ][3])
{
int i,j;
for (i=0; i<=1;i++)
{
for (j=0;j<=2;j++)
printf (“%d ”, a[i][j]);
printf(“\n”);
}
print(“\n”);
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizio
Si scriva un programma che
– prenda da input per ciascuno studente di una
classe il voto conseguito in ciascuno degli
esami dell’anno
– calcoli e stampi il voto più basso e più alto tra
quelli dei vari studenti e, per ciascuno
studente,la media dei voti degli esami
dell’anno
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Soluzione
#include <stdio.h>
#define NUM_ESAMI 10
#define ALUNNI 100
int minimum (int [ ][NUM_ESAMI],int,int);
int massimo (int [ ][NUM_ESAMI], int,int);
float media(int [ ][NUM_ESAMI],int,int);
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Soluzione
main()
{
int i,j;
int studentGrades[ALUNNI][NUM_ESAMI];
for (i=0; i<ALUNNI;i++)
for (j=0;j<NUM_ESAMI;j++)
{
printf(“inserisci voto %d esimo esame dell %d esimo alunno
\n”, j,i);
scanf(“%d”, &studentGrades[i][j]);
}
}
printf(“il voto più basso e il voto più alto sono: %d \n %d \n”,
minimum(studentGrades, ALUNNI, NUM_ESAMI),
massimo(studentGrades, ALUNNI, NUM_ESAMI));
for (i=0; i<ALUNNI;i++)
Alunno che stiamo
{
considerando
printf (“la media dei suoi esami è
%f\n”,media(studentGrades, i, NUM_ESAMI));
}
Prof.ssa Chiara Petrioli -- corso di
}
programmazione 1, a.a. 2006/2007
Soluzione
int minimum (int grades[ ][NUM_ESAMI],int alunni,int test)
{
int i,j;
int lowgrade=100; /*upper bound del valore dei voti*/
for (i=0; i<alunni; i++)
{
for (j=0; j<test;j++)
{
if (grades[i][j]<lowgrade)
lowgrade=grades[i][j];
}
}
return lowgrade;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Soluzione
int massimo (int grades[ ][NUM_ESAMI],int alunni,int test)
{
int i,j;
int highgrade=0;
for (i=0; i<alunni; i++)
{
for (j=0; j<test;j++)
{
if (grades[i][j]>highgrade)
highgrade=grades[i][j];
}
}
return highgrade;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Soluzione
float media (int grades[ ][NUM_ESAMI],int
alunno,int test)
{
int j;
int total=0;
for (j=0; j<test;j++)
{
total+=grades[alunno][j];
}
return (float) total / test;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizio
Dato un vettore di interi si scriva una
funzione
int ordinato(int [ ],int);
che verifica se il vettore è ordinato in ordine
crescente
La funzione restituirà 0 se il vettore NON è ordinato;
1 se il vettore è ordinato
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Soluzione
Se il vettore non è ordinato in ordine crescente allora esistono
due posizioni consecutive i e i+1 del vettore tali che l’elemento
in posizione i è maggiore dell’elemento in posizione i+1
1
2
4
3
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
7
8
Codice
int ordinato (int v[ ], int n)
{
int i;
for (i=0;i<n-1;i++)
if (v[i]>v[i+1])
return 0;
return 1;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Numero di elementi del
vettore
Caratteri e stringhe
Un carattere può essere visto come un intero
Ha associato un intero, il codice ASCII
corrispondente
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Caratteri e stringhe
Una stringa è un vettore di caratteri che termina
con il carattere nullo ‘\0’
b
l
u
e
\0
Inizializzazione di una stringa
char color [ ]= “blue”;
char color [ ]={‘b’,’l’,’u’,’e’,’\0’};
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
La dimensione del
vettore è determinata
automaticamente
Caratteri e stringhe
Una stringa è un vettore di caratteri che termina
con il carattere nullo ‘\0’
b
l
u
e
\0
Inizializzazione di una stringa
char word[20];
printf (“inserisci stringa \n”);
scanf(“%s”, word);
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
word indica l’indirizzo
della cella di memoria
in cui è memorizzato il
primo elemento del
vettore
Manipolazione dei caratteri
Libreria standard <ctype.h>
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Manipolazione dei caratteri
Libreria standard <ctype.h>
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Manipolazione dei caratteri
/*verifica se c è una cifra*/
int isdigit (int c)
{
return ((c>=‘0’)&&(c<=‘9’));
}
/*verifica se c è una lettera*/
int isalpha (int c)
{
return (((c>=‘a’)&&(c<=‘z’))|| ((c>=‘A’)&&(c<=‘Z’)));
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Manipolazione dei caratteri
/*restituisce la lettera minuscola corrispondente
se c è una maiuscola, l’argomento inalterato in
caso contrario*/
int tolower (int c)
{
if isupper( c )
c=c-’A’+’a’;
return c;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Utilizzo delle funzioni di libreria per
la manipolazione dei caratteri
#include <stdio.h>
#include <ctype.h>
(espressione 1)?espressione2:espressione 3;
int main ( )
{
printf(“%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n”, “According to
islower:”,
islower(‘p’)?”p is a”: “p is not a ”,
“lowercase letter”,
islower(‘P’)?”P is a”: “P is not a ”,
“lowercase letter”,
islower(‘5’)?”5 is a”: “5 is not a ”,
“lowercase letter”,
According to islower:
islower(‘!’)?”! is a”: “! is not a ”,
p is a lowercase letter
“lowercase letter”);
P is not a lowercase letter
)
5 is not a lowercase letter
}
Prof.ssa Chiara Petrioli -- corso di
! Is not a lowercase letter
programmazione 1, a.a. 2006/2007
Funzioni di libreria sulle stringhe
(funzioni per la conversione delle stringhe, stdlib.h)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esempio di uso
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Funzioni di libreria sulle stringhe
(funzioni per la scrittura e lettura di caratteri e stringhe)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esempio
#include<stdio.h>
main()
{
char c, sentence[80];
int i=0;
puts (“Enter a line of text:”);
while((c=getchar())!= ‘\n’)
sentence[i++]=c;
sentence[i]=‘\0’;
puts(“\n The line entered was:”);
puts(sentence);
return 0;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Enter a line of text:
This is a test.
The line entered was:
This is a test.
Manipolazione di stringhe
(string.h)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esempio
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esempio di uso
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Confronto tra stringhe
(string.h)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Altre funzioni stringh.h
(per un elenco completo vedere il Deitel&Deitel)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Altre funzioni stringh.h
(per un elenco completo vedere il Deitel&Deitel)
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Stampa di una stringa
void stampastringa(char s[])
{
int i;
for (i=0;s[i]!=‘\0’;i++)
printf(“%c”,s[i]);
printf(“\n”);
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizio 1
/*calcola il numero di caratteri in una stringa*/
/*Post: restituisce il numero di caratteri della
stringa (escluso il carattere di fine stringa */
int sizestringa(char s[])
{
int i=0;
while (s[i]!=‘\0’)
i++;
return i;
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizio 2
/*individua la prima occorrenza del carattere c
nella stringa s. Restituisce l’indice di tale prima
occorrenza; -1 se il carattere c non compare*/
int stringchr (char s[ ], int c)
{
int i=0,
while ((s[i]!=c) && (s[i]!=‘\0’))
i++;
return ((s[i]==‘\0’)?-1:i);
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizio 3
Si scriva una funzione che data una stringa
verifichi se tale stringa è palindroma
Se o meno leggendo la stringa da destra a
sinistra o da sinistra a destra si abbia lo
stesso risultato
abba è una stringa palindroma
cwetyo NON è una stringa palindroma
artutra è una stringa palindroma
otto è una stringa palindroma
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Stringhe palindrome
int palindroma (char s[ ])
{
int i,j;
Posiziona l’indice j sull’ultimo
for (j=0;s[j]!=‘\0’,j++)
carattere della stringa
;
j--;
for (i=0;((s[i]==s[j])&&(i<=j));i++,j--)
;
return ((i>j)?1:0);
}
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Puntatori
I puntatori sono delle variabili che come
valore contengono
deglidevono
indirizzi
Variabili di tipo puntatore
essere di
e inizializzate
memoriadichiarate
Es.
int * countPtr; /*dichiarazoine*/
int count;
float * fcountPtr;
Il nome di una variabile intera (es. count) fa
count contiene
un _valore_
intero
direttamente
riferimento ad
un valore intero;
countPtr = &count; /*inizializzazione*/
Una variabile puntatore fa indirettamente riferimento
fcountPtr=NULL;
int *countPtr;
ad un valore intero (deriferimento).
/*NULL è una costante simbolica predefinita
In molti file
di intestazione
incluso stdio.h.
Se
 La variabile
countPtr
contiene
l’indirizzo
una variabile puntatore è inizializzata a NULL non
di una locazione
memoria
che contiene
punta ad alcunadi
locazione
di memoria*/
un valore intero.
5
2340
countPtr
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
2340
Operatore di indirizzo
& (operatore unario di indirizzo) restituisce
l’indirizzo di memoria associato al suo
operando;
int y=5;
int *yPtr;
yPtr=&y;
3200
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
5
y
Operatore di indirizzo
& deve essere
applicato ad una
variabile. Non
& (operatore unario
di indirizzo)
restituisce
Può essere applicato a costanti, espressioni o
l’indirizzo di amemoria
associato
al suo
variabili dichiarate
con la specifica
di classe
di memoria register
operando;
int y=5;
int *yPtr;
yPtr=&y;
5
3200
3200
y
yPtr
Viene allocata memoria per la variabile puntatore
yPtr. Nella locazione di yPtr viene memorizzato
Prof.ssa Chiara
Petrioli -- corsoassociato
di
l’indirizzo
di memoria
alla variabile y
programmazione 1, a.a. 2006/2007
Operatore di deriferimento
L’operatore * (detto operatore di
deriferimento o di risoluzione dell’indirizzo)
consente di accedere al valore contenuto
nella locazione di memoria puntata da una
variabile puntatore
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Operatore di deriferimento
L’operatore * (detto operatore di
deriferimento o di risoluzione dell’indirizzo)
consente di accedere al valore contenuto
nella locazione di memoria puntata da una
variabile puntatore
*yPtr è il valore contenuto nella
locazione di memoria il cui
indirizzo è memorizzato in yPtr
3200
5
5
3200
yPtr
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
y
Esempio
La specifica di conversione %p
di printf consente di stampare
in output indirizzi di locazioni di
memoria
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esempio
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Precedenza degli operatori
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizi di preparazione all’esonero
Molti esercizi fatti tra lezione e esercitazione
MA serve che vi esercitiate a risolvere VOI
gli esercizi per superare l’esonero
 Esercizi alla fine dei capitoli del Deitel
&Deitel possono aiutare
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Esercizi di preparazione all’esonero
Un consiglio: provate a realizzare alcune delle
funzioni di libreria (ad esempio le funzioni di
libreria elencate nel capitolo dei Deitel &Deitel
sulle stringhe).
 Ottimo esercizio
 Per verificare di aver compreso il concetto di
puntatore potete ad esempio realizzare tali
funzioni in due versioni
es.
int strlen (char str2[]);
int strlen (char * str2);
Prof.ssa Chiara Petrioli -- corso di
programmazione 1, a.a. 2006/2007
Scarica

LEZ_9_10 - TWiki