Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Array monodimensionali in C In C la dichiarazione di una variabile di tipo array è
composta da:
• indicazione del tipo componente
• nome dello array
• una coppia di parentesi quadre [ ], che racchiude la
• cardinalità (dimensione, un valore costante) dell’array
<tipo_componente> <nome_array> [<dimensione>];
Esempi: int VETT[300];
double vettore[120];
Elementi di Informatica
2
Dato un array con dimensione (cardinalità) N,
nel linguaggio C i suoi elementi sono indicizzati da 0 a N-1
Array monodimensionali in C
[0]
[1]
[2]
[3]
[4]
[5]
A Esempio:
double A [6];
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 3
Array monodimensionali in C
funzione di accesso
Individuazione degli elementi dell’array:
<nome_array>[<indice>]
[0]
[1]
[2]
[3]
[4]
[5]
Vettore
42 18
x = 18 * 2 = 36
Vettore[3] = 42;
Esempi:
int Vettore[6];
…
x = Vettore[0] * 2;
Esempio
Analisi e Specifica
Definizione del problema: Inserire i valori di tutti gli elementi di un array monodimensionale di interi, composto da 50 elementi, e
visualizzare il contenuto dell’array così ottenuto Definizione dei dati del problema:
I: il valore di ciascun elemento dell’array di numeri interi Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array
U: l’array ‘riempito’ con i valori di tutti gli elementi Pu: nessuna
un programma per riempire, con input da tastiera, un array
monodimensionale di interi e stampare poi i valori dei suoi elementi
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 5
Esempio
Nome variabile Descrizione Tipo VET(I) i-esimo elemento dell’array INT
Nome variabile Descrizione Tipo
VET array di interi con i valori immessi INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
I Indice array INT
Tabella delle variabili di algoritmo
Elementi di Informatica
6
Esempio
Progettazione
Descrizione del metodo di elaborazione:
Con un ciclo ripetitivo, con il numero delle ripetizioni pari alla cardinalità dello array, si effettua la lettura del valore di ciascun elemento dell’array.
Si visualizza, sempre usando un ciclo ripetitivo, il contenuto dell’array, stampando ad ogni passo del ciclo il valore di ciascun elemento immesso
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 7
#include< stdio. h>
main()
{ int Vett[50], i;
// Legge in input tutti gli elementi del vettore
for (i=0; i<50; i++)
{ printf(“Valore di Vett(%d): \ n", i);
scanf("%d", &Vett[i]);
}
// Stampa tutti gli elementi del vettore
for (i=0; i<50; i++)
printf("Vett(%d)=%d\ n", i, Vett[i]);
}
Esempio - il programma C
#include< stdio. h>
main() { int Vett[50], i;
// Legge in input tutti gli elementi del vettore for (i= 0; i< 50; i++)
{ printf("Valore di Vett(%d)\ n", i);
scanf("%d", &Vett[ i]);
}
Esempio - il programma C
i=0 => Valore di Vett[0]=5 =>
Supponendo che l’utente, ad ogni passo del ciclo, digiti in input i valori:
5; 9; 23; 47; …….; 38
5 9 23
47
38 i=1 => Valore di Vett[1]=9 =>
i=2 => Valore di Vett[2]=23 =>
i=3 => Valore di Vett[3]=47 =>
i=49 => Valore di Vett[49]=38 =>
Vett
[0]
[1]
[2]
[3]
[4]
[5]
…...
[49]
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 9
#include< stdio. h>
main() { int Vett[50], i;
………...
// Stampa tutti gli elementi del vettore for (i= 0; i< 50; i++)
printf("Vett(%d)=% d\ n", Vett[ i]);
}
Esempio - il programma C
i=0 => Vett(0)=5
i=1 => Vett(1)=9
i=2 => Vett(2)=23
i=3 => Vett(3)= 47
i=49 => Vett(49)= 38 [0] 5
[1]
[2]
[3]
[4]
[5]
Vett
…...
9 23 47
38 [49]
… con la situazione in figura sanno stampati, ad ogni passo del ciclo, i valori
Elementi di Informatica
10
altri modi di inizializzare/riempire un array monodimensionale
{ …
int Vett[5] = {15, 23, 44, 2, 86};
for (i= 0; i<5; i++)
printf("Vett(%d)=%d - ", i, Vett[i]);
…
} Vett
[0] 15
[1]
[2]
[3]
[4]
23 44 2 86
Vett(0)=15 - Vett(1)=23 - Vett(2)=44 - Vett(3)=2 - Vett(4)=86 –
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 11
{ …
int Vett[5], i;
// azzera tutti gli elementi del vettore
for (i= 0; i< 5; i++) Vett[i] = 0;
… }
altri modi di inizializzare/riempire un array monodimensionale
Vett
[0] 0
[1]
[2]
[3]
[4]
0 0 0 0
Esempio
… e se non si vuole riempire tutto lo array, ma utilizzare solo alcuni elementi (tutti consecutivi, a partire dalla prima posizione)? ….
Analisi e Specifica
Definizione del problema: Inserire, in un array monodimensionale di interi composto da 50 elementi, un prefissato numero di valori e visualizzare il contenuto dell’array così ottenuto
Definizione dei dati del problema:
I: la quantità (riempimento) dei valori che si vogliono inserire;
il valore di ciascun elemento dell’array di numeri interi Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array
U: l’array ‘riempito’ con i valori degli elementi Pu: nessuna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 13
Esempio
Nome variabile Descrizione Tipo
RIEMP riempimento dell’array INT VET(I) elemento dell’array INT
Nome variabile Descrizione Tipo
VET array di interi con i valori immessi INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
I indice array INT Tabella delle variabili di algoritmo
Elementi di Informatica
14
Esempio
Progettazione
Descrizione del metodo di elaborazione:
Si legge il numero di quanti elementi si vogliono inserire (riempimento): tale numero deve essere minore della cardinalità dell’array
.Si legge, con un ciclo, il valore di ciascun elemento dell’array.
Si visualizza il contenuto dell’array, visualizzando il valore di ciascun elemento immesso
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 15
#include< stdio.h>
main() {
int vett [ 50], riemp, i;
/* legge il numero indicante quanti elementi si vogliono inserire (deve essere minore della cardinalità) */
do
{ printf(" Numero elementi che vuoi inserire\ n");
scanf("% d", &riemp);
}
while ((riemp>50)||(riemp<=0)); //Verifica che il riempimento sia minore della cardinalità
// Legge in input tutti gli elementi del vettore for (i= 0; i< riemp; i++)
{ printf(" dammi elemento di posto %d\ n", i);
scanf("% d", &vett[ i]);
}
// Stampa tutti gli elementi del vettore
for (i= 0; i< riemp; i++) printf("% d\ n", vett[ i]);
}
Esempio - il programma C
#include< stdio.h>
main() {
int vett [ 50], riemp, i;
/* legge il numero indicante quanti elementi si vogliono inserire (deve essere minore della cardinalità) */
do
{ printf(" Numero elementi che vuoi inserire\ n");
scanf("% d", &riemp);
}
while ((riemp>50)||(riemp<=0);
Esempio - il programma C
Supponendo che sia immesso 4 quale valore di riempimento si avrà
Vett
0 1 2 3 4 5
…...
49
… ovvero solo le prime 4 posizioni saranno utilizzate
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 17
// Legge in input tutti gli elementi del vettore for (i= 0; i< riemp; i++)
{ printf(" dammi elemento di posto %d\ n", i);
scanf("% d", &vett[ i]);
}
// Stampa tutti gli elementi del vettore
for (i= 0; i< riemp; i++) printf("% d\ n", vett[ i]);
}
Esempio - il programma C
Vett
0 1 2 3 4 5
…...
49
Supponendo che l’utente, ad ogni passo del ciclo, digiti in inputi valori:
5; 36; 28; 447;
i=0 => Vett[0]=5 => 5 36
28 447 i=1 => Vett[1]=36
=>
i=2 => Vett[2]=28 =>
i=3 => Vett[3]=447 =>
Elementi di Informatica
18
Esempio
… e se non si vuole riempire tutto lo array, senza però sapere prima quanti sono gli elementi da immettere , ovvero senza conoscere a priori il riempimento?
Analisi e Specifica
Definizione del problema: Inserire, in un array monodimensionale di interi composto da 50 elementi, un certo numero di valori (non noto a priori) e visualizzare il contenuto dell’array così ottenuto
Definizione dei dati del problema:
I: il valore di ciascun elemento dell’array di numeri interi Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array
U: l’array ‘riempito’ con i valori degli elementi, il riempimento Pu: il riempimento non può essere maggiore della cardinalità
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 19
Esempio
Nome variabile Descrizione Tipo
VET(I) elemento dell’array INT
Nome variabile Descrizione Tipo
VET array di interi con i valori immessi INT RIEMP riempimento dell’array INT
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
I indice array INT Tabella delle variabili di algoritmo
Esempio
Progettazione
Descrizione del metodo di elaborazione:
Si inizializza a zero il riempimento dello array
Si chiede all’utente se deve essere immesso un valore nello array (Si = 1)
Se la risposta è affermativa, ed il riempimento è minore della cardinalità, si inizia un ciclo iterativo in cui:
Si legge il valore di un elemento dell’array.
Si incrementa di 1 il valore del riempimento
Si chiede all’utente se c’è un altro valore da immettere e si torna all’inizio del ciclo
Alla fine del ciclo, si visualizza il contenuto dell’array, visualizzando il valore di ciascun elemento immesso fino al valore del riempimento
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 21
#include<stdio.h>
main()
{const int CARD=50;
int vett[CARD], riemp=0, i, risp;
printf("Ci sono valori da inserire nello array? (1=SI)\n");
scanf("%d", &risp);
while ((risp==1) && (riemp<CARD))
{ printf("dammi elemento di posto %d\n", riemp);
scanf("%d",&vett[riemp]);
riemp++;
printf("Puoi inserire altri %d elementi \n",CARD-riemp);
printf("Vuoi immettere un altro valore? (1=SI)\n");
scanf("%d", &risp);
}
if (riemp>0)
{for (i=0; i<riemp; i++)
printf("vett[%d]=%d \n", i, vett[i]);
}
else printf ("Array VUOTO \n");
system("Pause");
}
Esempio - il programma C
Elementi di Informatica
22
Il tipo stringa di caratteri
• Una stringa di caratteri è una sequenza di caratteri ASCII, atti a rappresentare una parola, una frase, un testo
• E’ un tipo strutturato costruito con l’operatore sequenza
• Una delle operazioni tipiche sulle stringhe di caratteri è la concatenazione di due o più stringhe, tipicamente indicata con il simbolo // (in LDP).
Es.
A=“calcolatore “ B=“elettronico”
C=A//B=“calcolatore elettronico”
Altre tipiche operazioni sono la comparazione, la copia, calcolo lunghezza, ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 23
Il tipo stringa di caratteri in C
• In C una stringa di caratteri è un array monodimensionale di caratteri ASCII terminante con il carattere null => ‘\0’
La dichiarazione di una variabile di tipo stringa è uguale a quella di un array monodimensionale :
char <nome variabile>[<lunghezza stringa>];
• Esempio: “Questa è una stringa”
è un array di 21 caratteri.
L’array di caratteri è quindi il seguente:
elemento posizione zero [0] ‘Q’
elemento posizione [1] ‘u’
elemento posizione [2] ‘e’
...
elemento posizione [19] ‘a’
elemento posizione [20] ‘\0’
Q u e s t a è u n a s t r i n g a \0
… l’istruzione per l’input formattato scanf(….) non consente di immettere spazi, ovvero legge tutti i caratteri consecutivi immessi fino al primo carattere spazio
se all’esecuzione dell’istruzione scanf("%s",&b);
viene immessa la stringa:
CORSO DI ELEMENTI DI INFORMATICA la variabile b conterrebbe solo la stringa “CORSO”
tutti gli altri caratteri dopo lo spazio non sono considerati
… uso della funzione di input getchar()
… una considerazione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 25
/* Legge e stampa una stringa di max 100 caratteri*/
#include <stdio.h>
main()
{const int cardinalita=101; //deve contenere 100 caratteri + ‘\0’
char c, linea[cardinalita];
int i ; i=0;
printf("Immetti stringa \n");
c=getchar(); /* funzione getchar() per input da tastiera, */
/* legge un solo carattere */
while ( i< (cardinalita - 1) && (c != ‘\n’)) /* ciclo per lo input dei */
{ linea[i] = c; /* caratteri della stringa */
c=getchar(); /* nello array linea[] */
i++; /* l’input termina quando */
} /* si batte ‘return’ */
Elementi di Informatica
26
// aggiunge carattere di fine stringa linea[i++] = ‘\0’;
i = 0;
// Stampa stringa immessa printf(" Stringa Immessa \n");
while ( linea[i] != ‘\0’) { printf(“%c” , linea[i]);
i++;
}
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
/* Stampa i caratteri e la codifica ASCII */
main()
{ char stringa[] = “Questa è una stringa”; // cardinalità pari a 21 (20 + ‘\0’)
int X, i = 0;
while ( stringa[i] != ‘\0’ ) {
printf ( “%c = %d\n”,stringa[i], stringa[i] );
++i;
}
X = 10 + ‘a’; // nell’espressione ‘a’ è uguale a 97 (suo codice ASCII )
printf(“X = %d\n”, X); // stamperà X = 107 }
Esempio
In C i caratteri sono rappresentati secondo il loro codice ASCII, ovvero sono considerati come degli interi, ed è possibile trattarli come tali ...
... ad esempio sommarli a numeri interi o conoscere il loro codice ASCII ...
Q = 81 u = 117 e = 101 s = 115 t = 116 a = 97 = 32 . . .
g = 103 a = 97
Output del programma
Codice ASCII (in decimale)
X = 107
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 29
Definizione del problema: Calcolare l’occorrenza di ciascun carattere alfabetico minuscolo in una frase
Definizione dei dati del problema:
I: la frase, ovvero l’array che la contiene
Pi: i caratteri della frase devono essere tutti minuscoli U: per ciascun carattere minuscolo componente la frase il numero di volte che esso compare nella frase
Pu: il numero di volte che ciascun carattere minuscolo compare nella frase non negativo
Esempio
Elementi di Informatica
30
Esempio
Nome variabile Descrizione Tipo frase array monomensionale di char CHAR
Nome variabile Descrizione Tipo count array con le occorrenze di ogni carattere INT
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo i, j indici INT
ch singolo carattere della frase CHAR
Tabella delle variabili di algoritmo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 31
Descrizione del metodo di elaborazione:
Si dichiara lo array frase[], per la stringa di caratteri, e lo si inizializza con una frase nella dichiarazione stessa
Si considera un altro array monodimensionale di nome count[] di cardinalità 26, pari al numero delle lettere minuscole. Si inizializzano a zero gli elementi di count[].
Ciascun elemento dell’array count[] corrisponde ad una lettera secondo l’ordine alfabetico (primo elemento lettera ‘a’, ultimo elemento lettera ‘z’).
La corrispondenza tra i caratteri minuscoli e le posizioni dell’array è fatta sulla base del codice ASCII dei caratteri: basterà sottrarre al codice ASCII di ciascun carattere il valore 97 (codice ASCII di ‘a’).
Si scandisce completamente la stringa in frase [] e ad ogni occorrenza di ciascun carattere minuscolo si incrementa di 1 il corrispondente elemento dell’array count[].
Si stampa il contenuto di count[].
/* Calcola la frequenza dei caratteri in una frase*/
#include <stdio.h>
main()
{char ch, frase[]=“questa frase contiene molti caratteri”;
int count[26] , j,i ; for (j=0; j<26;j++)
count[j]=0; // azzera elementi di count[]
i=0;
while (frase[i]!=‘\0’)
{ if ((frase[i]>=‘a’) && (frase[i]<=‘z’) {ch=frase[i];
count[ch – ‘a’]+ +; /* incrementa di 1 il valore dell’elemento di count corrispondente al carattere ch in frase */
} i++;
}
for (j=0; j<26;j++)
printf(“%c %4i \n”, ‘a’+j, count[j]);
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Funzioni per la manipolazione di stringhe
• Il linguaggio C dispone di funzioni, predefinite, per la manipolazione di stringhe, quali :
– strcat(strg1,strg2) concatenazione di stringhe – strcmp(strg1,strg2) confronto fra due stringhe – strcpy(strg1,strg2) copia la stringa strg2 in strg1 – strlen(strg1) lunghezza di una stringa
• Dette funzioni fanno parte della libreria standard string.h
• Esistono altre funzioni di manipolazione di stringhe, quelle indicate sono le più usate in ambiente C.
Elementi di Informatica
34
Funzioni per la manipolazione di stringhe: Esempi
#include <stdio.h>
#include <string.h> // libreria standard funzioni sul // tipo stringa
main ()
{const char a[]=", Evviva";
char c[200],b[20],f;
printf("Immetti stringa b \n");
scanf("%s",&b);
printf("Immetti stringa c \n");
scanf("\n%s",&c);
printf("B = %s -- C = %s\n",b,c);
if (strcmp(b,c)==0) // confronta le strighe b e c
printf ("B e C sono uguali \n");
else printf("B e C NON sono uguali\n");
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
strcat(b,c); //concatena stringhe b e c e mette //stringa risultante in b
printf("\n CONCATENAZIONE B e C in B: \n B = %s \n",b);
printf("\n C= %s \n",c);
strcat(c,a); //concatena stringhe c e a e mette //stringa risultante in c
printf("\n CONCATENA C e A in C:\nC = %s \n",c);
printf("\n A=%s \n",a);
// stampa lunghezza stringa b
printf("\n lunghezza stringa B= %d \n",strlen(b));
strcpy(b,a); //copia stringa a in stringa b
printf("\n Copia A in B\nA =%s -- B = %s\n",a,b);
system("Pause");
}
Funzioni per la manipolazione di stringhe: Esempi
Il valore di B è cambiato
Il valore di C è immutato
Il valore di C è cambiato Il valore di A è immutato
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 37
Esempio
Un programma per contare quanti caratteri ‘cifra’ sono contenuti in una stringa
… strutturando in moduli ...
main
LeggiLinea ContaDigit
Elementi di Informatica
38
Esempio
/* Conta i caratteri numerici in una stringa */
void LeggiLinea(char ln[] , int max);
void ContaDigit(char ln2[], int *times);
#include <stdio.h>
main()
{ char linea[80];
int numero;
printf(“Inserisci una linea di testo\n”);
LeggiLinea(linea,80);
ContaDigit(linea, &numero);
printf(“La linea %s contiene %d numerici”, linea, numero);
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 39
Esempio
/*Legge una linea in input */
void LeggiLinea(char ln[] , int max) {
int c, i = 0;
while ( (c=getchar())!='\n' && i < max) {ln[i] = c;
i++;
} ln[i] = '\0';
}
Esempio
/*Conta il numero di cifre numeriche */
void ContaDigit(char ln2[], int *times) {int i;
*times = 0;
i=0;
while (ln2[i] != '\0‘)
{ if ((ln2[i] >= '0') && (ln2[i] <= '9'))
(*times)++;
i++;
} }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 41
Array Bidimensionali in C
In C la dichiarazione di una variabile di tipo array è composta da:
• indicazione del tipo componente
• nome dello array
• due coppie di parentesi quadre [ ], che racchiudono le
• cardinalità di riga
• cardinalità di colonna
<tipo_componente> <nome_array> [<card_riga>] [<card_colonna>];
Esempio: double matrice [10] [15];
Elementi di Informatica
42
Array Bidimensionali in C
Attenzione: gli indici di riga e di colonna iniziano da 0 (zero)
0 1 2 3 4 5
0 1 2 3 4
[0,0] [0,1] [0,2] [0,3] [0,4]
[1,0] [1,1] [1,2] [1,3] [1,4]
[5,0] [5,1] [5,2] [5,3] [5,4]
A[3][1]
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
Array Bidimensionali in C
… la posizione di ciascun elemento è individuata da 2 indici …
0 1 2 3 4 5
0 1 2 3 4
23 47 63 96 8
27 66 23 44 567
42 28 34 125 47
A[3][1] = 57
57
A[5][2] = 34
… il primo indice, indica la riga …
… il secondo indice, indica la colonna ...
… ciascuna posizione conterrà un solo valore …
Esempio - Array Bidimensionale Definizione del problema: Inserire i valori degli elementi di un array bidimensionale di interi, composto da 6 righe e 5 colonne, e visualizzare il contenuto dell’array così ottenuto, ordinato per righe
Definizione dei dati del problema:
I: il valore di ciascun elemento dello array bidimensionale
Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array
U: l’array bidimensionale ‘riempito’ con i valori degli elementi
Pu: array bidimensionale non ‘vuoto’
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 45
Esempio
Nome variabile Descrizione Tipo
MAT(I,J) elemento dell’array INT
Nome variabile Descrizione Tipo
MAT array di interi con i valori immessi INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Elementi di Informatica
Esempio - Array Bidimensionale
Descrizione del metodo di elaborazione:
Con due cicli ripetitivi innestati, si legge il valore di ciascun elemento da immettere, immettendo i valori per riga.
Quindi, il ciclo più esterno controlla l’indice di riga, quello più interno l’indice di colonna.
Con due cicli ripetitivi innestati, si visualizza il contenuto
dell’array, visualizzando i valori immessi per righe. Anche
in qiesto caso il ciclo più esterno controlla l’indice di riga,
quello più interno l’indice di colonna.
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 47
Esempio - il programma C
#include<stdio.h>
main()
{ const cardR=6, cardC=5;
int MAT[cardR] [cardC], i,j;
// Legge in input tutti gli elementi della matrice
for (i= 0; i< cardR; i++) //scandisce le righe for (j= 0; j< cardC; j++) //scandisce le colonne { printf(" dammi el. (%d , %d) di MAT\n", i,j);
scanf("% d", &MAT[i][j]);
}
// Visualizza tutti gli elementi della matrice
for (i= 0; i< cardR; i++) //scandisce le righe for (j= 0; j< cardC; j++) //scandisce le colonne printf(”(%d, %d) = % d\n",i,j, MAT[i][j]);
}
0 1 2 3 4 5
0 1 2 3 4
23 47 63 96 8
27 66 23 44 567
42 28 34 125 47
for (i= 0; i< cardR; i++) for (j= 0; j< cardC; j++) {
printf(" dammi el. (%d , %d) di MAT\n", i,j);
scanf("% d", &MAT[i][j]);
}
i = 0
j = 0 => MAT[0,0]= 23
...
...
84 ... ...
... ...
...
j = 1 => MAT[0,1]= 47 j = 2 => MAT[0,2]= 63 j = 3 => MAT[0,3]= 96 j = 4 => MAT[0,4]= 8
i = 1
j = 0 => MAT[1,0]= 27 j = 1 => MAT[1,1]= 66 j = 2 => MAT[1,2]= 23 j = 3 => MAT[1,3]= 44 j = 4 => MAT[1,4]= 567 i = 2
j = 0 => MAT[2,0]= 84
… … i = 5
j = 0 => MAT[5,0]= 42
j = 4 => MAT[5,4]= 47 j = 1 => MAT[5,1]= 28 j = 2 => MAT[5,2]= 34 j = 3 => MAT[5,3]= 125
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 49
Array e sottoprogrammi in C
• In C, nell’attivazione di un sottoprogramma lo scambio di
parametri (effettivi – formali) di tipo array è sempre effettuato per riferimento
• Nel caso di array monodimensionali non va indicata per il paramentro formale la cardinalità dello array
• Nel caso di array bidimensionali va indicata per il paramentro formale la cardinalità della seconda dimensione dello array
• Nel caso di array multi-dimensionali vanno indicate per il
paramentro formale tutte le cardinalità eccetto quella della prima dimensione dello array
Elementi di Informatica
50
Array e sottoprogrammi in C
Es.
void leggivet(int Vet1[],int card1);
main ()
{ const card=10;
int Vet[card],I;
leggivet(Vet,card); }
Es.
void leggimat(int Mat1[][4],int cardr, int cardc) main ()
{ const cardr=2; const cardc=4;
int Mat[cardr][cardc],I,J;
leggimat(Mat,cardr,cardc);}
Array monodimensionale: non è necessario indicare la cardinalità nel parametro formale
Array bi-dimensionale:
deve essere indicata la cardinalità della
seconda dimensione nel relativo parametro formale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 51
Array e sottoprogrammi in C
Es.
void leggimat(int Mat1[][4],int cardr, int cardc) main ()
{ const cardr=2; const cardc=4;
int Mat[cardr][cardc],I,J;
leggimat(Mat,cardr,cardc);}
… quando il numero di colonne è diverso da quello indicato (nell’esempio è 4), il sottoprogramma deve essere modificato e ricompilato … !!
… qualche considerazione …
Array e sottoprogrammi in C
#include <stdio.h>
#define COL 5 // crea un nome (un simbolo) associato al valore costante indicato.
// Nel programma tutte le occorrenze del simbolo sono automaticamente // sostituite, in fase di compilazione, dal valore ad esso associato void leggimat(int Mat1[][COL],int cardr, int cardc);
void stampamat(int Mat1[][COL],int cardr, int cardc);
main ()
{ const cardc=COL;
const cardr=7;
int Mat[cardr][cardc];
leggimat(Mat,cardr,cardc);
stampamat(Mat,cardr,cardc);
printf("\n");
}
… una possibile soluzione
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 53
Array e sottoprogrammi in C
void leggimat(int Mat1[][COL],int cardr, int cardc) {int I, J;
for (I=0;(I< cardr); I++) for (J=0;J<cardc;J++)
{printf("immetti Mat[ %d ] [%d]= \n", I, J) ; scanf("%d", &Mat1[I][J]);
} }
void stampamat(int Mat1[][COL],int cardr, int cardc) { int I,J;
for (I=0;I<cardr; I++) { printf("\n");
for (J=0;J<cardc;J++)
printf("Mat1[%d][%d]= %d - ", I,J, Mat1[I][J]);
} }
… una possibile soluzione
Elementi di Informatica
54
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 55
Il tipo strutturato record
• Quando si vogliono rappresentare informazioni che sono collezioni di dati diversi,
– ad esempio:
• un libro è una entità composta da un titolo, un autore, un editore, il testo
• Le generalità anagrafiche di una persona: cognome, nome, data di nascita, luogo di nascita, indirizzo attuale
• Il tipo record è usato per rappresentare e gestire queste collezioni di dati,
• Il tipo record permette di raggruppare le diverse informazioni, elementari o strutturate, che caratterizzano la collezione di dati.
Il tipo record
• Il record è un tipo strutturato formato da un
predeterminato numero di variabili detti campi, ciascuno dei quali può essere un tipo semplice o strutturato
• E’ un tipo strutturato costruito con l’operatore prodotto cartesiano
tipo record = cartesiano(a1:T1, a2:T2, …. , an:Tn)
dove a1, …, an sono i nomi dei campi del record
e T1, … , Tn i rispettivi tipi anche diversi tra loro
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 57
Il tipo record
• dichiarazione in LDP di un tipo record:
record <nome record>=
begin
<nome campo1> :<tipo campo1>;
……
<nome campo_n> : <tipo campo_n>;
end;
Elementi di Informatica
58
Il tipo record
Es.
record anagrafico = begin
cognome:string;
nome:string;
data_nascita: record begin
giorno:integer;
mese: integer;
anno:integer;
end;
indirizzo:string;
end;
Per indicare un campo del record si usa la notazione:
<nome record>.<nome campo>
Es. anagrafico.nome
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 59
• In C un record è una struct: una collezione di una o più variabili normalmente di tipo diverso raggruppate sotto lo stesso nome.
• Per dichiarare un record si usa la parola chiave struct struct <nome struttura>
{
<tipo campo> <nome campo1>;
…………
<tipo campo> <nome campo_n>;
}
Il tipo record in C: le strutture (struct)
Esempio di struttura
/* Struttura di elementi logicamente correlati */
struct dipendente { int codice;
char nome[30];
float stipendio;
}
L’identificatore dipendente NON è una variabile:
– dipendente è il nome del tipo record definito (è l’identificatore della nuova struttura)
– il tipo dipendente sarà usato per dichiarare variabili di tipo dipendente
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 61
Dichiarazione di variabili di tipo struct
• E’ simile alla dichiarazione di una qualsiasi altra variabile:
<nome tipo> <nome variabile>;
Es. dichiarazione di una variabile del tipo struct dipendente:
struct dipendente programmatore;
“programmatore” è una variabile del tipo struct dipendente
Ciascuna variabile programmatore è composta dai campi del tipo dipendente
Elementi di Informatica
62
Dichiarazione di variabili di tipo struct
• I campi di una struct possono essere inizializzati:
struct dipendente programmatore = {487,“Marco”,10.000}
Assegna i valori:
487 al campo codice
“Marco” al campo nome 10.000 al campo stipendio
• altro modo per dichiarare (ed inizializzare) una variabile di tipo struct è:
struct dipendente { int codice;
char nome[30];
float stipendio;
} programmatore = {487,“Marco”,10.000};
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 63
Accesso ai campi di variabili di tipo struct
• Per accedere al singolo elemento di una struct bisogna usare il nome della variabile e il nome del campo nella struttura in questo modo ricorrendo alla ‘notazione punto’ (dot notation)
<nome variabile>.<nome campo>
• Esempio:
programmatore.codice = 487;
strcpy(programmatore.nome ,”Marco”);
programmatore.stipendio = 10.000;
#include <stdio.h>
#include <string.h>
void legge(char campo[], int max);
main () {int i;
struct persona {char nome[20];
char cogno[20];
int eta;
};
struct persona mamma, zia;
printf("Nome: "); legge(mamma.nome, 20);
printf("Cognome: "); legge(mamma.cogno, 20);
printf("\nNome: "); legge(zia.nome, 20);
printf("Cognome: "); legge(zia.cogno, 20);
Esempio di programma con variabili di tipo struct
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 65
printf("\n Eta' di mamma %s %s: ", mamma.nome,mamma.cogno);
scanf("%d",&mamma.eta);
printf("\n Eta' di zia: %s %s: ", zia.nome,zia.cogno);
scanf("%d",&zia.eta);
if ((mamma.eta)>(zia.eta))
printf("\n mamma %s %s ha %d anni ed e' PIU' vecchia di zia %s %s di anni %d\n", mamma.nome, mamma.cogno, mamma.eta, zia.nome, zia.cogno, zia.eta);
else
printf("\n mamma %s %s ha %d anni NON PIU' vecchia di zia %s %s di anni %d\n", mamma.nome, mamma.cogno, mamma.eta, zia.nome, zia.cogno, zia.eta);
system("Pause");
}
Elementi di Informatica
66
void legge(char campo[], int max) { int c, i = 0;
while ( (c=getchar())!='\n' && i < max) {campo[i] = c;
i++;
}
campo[i] = '\0';
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 67
Dichiarazione di array di variabili di tipo struct
• Array di record:
struct dipendente { int codice;
char nome[30];
float stipendio;
};
struct dipendente programmatore[20];
... accesso alla posizione i-esima, campo codice ...
programmatore[i].codice=325;
Esempio
Definizione del problema: Scrivere un programma che consente di inserire in un array i dati di una agenda
telefonica, ovvero nome, cognome, e n.ro di telefono di una persona. L’agenda contiene al massimo 200 nomi
Definizione dei dati del problema:
I: nome, cognome, e n.ro di telefono
Pi: il numero degli elementi da inserire non può essere maggiore di 200
U: lo array con l’agenda telefonica salvata
Pu: nessuna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 69
Esempio
Nome variabile Descrizione Tipo Cognome stringa nome stringa telefono stringa
Nome variabile Descrizione Tipo agenda array memorizzante l’agenda record
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
????
Tabella delle variabili di algoritmo
Elementi di Informatica
70
Esempio
Descrizione del metodo di elaborazione:
…. lo studente riporti la descrizione dell’algoritmo da
utilizzare per il programma …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 71
Array di Strutture
#include <stdio.h>
#include <string.h>
void legge(char campo[], int max) // legge una stringa da tastiera { int c, i = 0;
while ( (c=getchar())!='\n' && i < max) {campo[i] = c;
i++;
}
campo[i] = '\0';
}
main ()
{int const card=200;
int i;
struct persona {char nome[20];
char cogno[20];
char tel[15];
};
struct persona pers[card];
Array di Strutture
for (i=0;i<card;i++) //legge i dati dello array pers {printf("Nome: \n");
legge(pers[i].nome, 20);
printf("Cognome: \n");
legge(pers[i].cogno, 20);
printf(" Tel. : \n");
legge(pers[i].tel, 20);
}
for(i=0;i<card;i++) //stampa i dati dello array pers {
printf(" Cognome = %s - ",pers[i].cogno);
printf(" Nome = %s - ", pers[i].nome);
printf(" Tel = %s \n", pers[i].tel);
}
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 73
File sequenziali in C
I file sequenziali in C possono essere sia File di testo che File binari Facciamo riferimento ai File di Testo
Uso della libreria <stdio.h>
Dichiarazione di un File :
FILE *<nome_puntatore_file>;
Es. File *agenda; // dichiara un puntatore a file
Un file prima di poter essere elaborato deve essere ‘aperto’ ed alla fine della elaborazione va ‘chiuso’
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 74
File sequenziali in C - apertura
Apertura file :
< nome_puntatore_file > = fopen (“<nomefile>”, <modo_apertura>)
La ‘apertura’ permette di associare il < nome_puntatore_file > al file fisico
<nomefile> registrato sulla memoria di massa.
Diverse modalità di apertura, quali:
• “w” crea un file per scrivere in esso di valori; se il file già esiste esso sarà riscritto cancellando il contenuto precedente
• “r” apre il file in lettura per leggerne il contenuto
• “a” apre il file per scrivere altri valori accodandoli alla fine dello stesso
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt","w"); //apre il file Nomi.txt in scrittura
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 75
File sequenziali in C - chiusura
Chiusura file:
fclose(< nome_puntatore_file >)
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt","w"); //apre il file Nomi.txt in scrittura ... ... ...
fclose (fileNomi); // chiude il file Nomi.txt
File sequenziali in C - Lettura
Lettura da file:
fscanf(<nome_puntatore_file>, <formato_dati>, &<nomi_variabili>) Assegna a <nomi_variabili> il/i valore/i letti nel file puntato da
<nome_puntatore_file> secondo il <formato_dati>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in scrittura ... ...
fscanf(fileNomi,"%s", &nome); // legge una stringa in Nomi.txt e assgna // il valore letto alla variabile nome ... ...
fclose (fileNomi);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 77
File sequenziali in C - scrittura
Scrittura su file:
fprintf(<nome_puntatore_file>, <formato_dati>, <nomi_variabili>)
Scrive nel file puntato da <nome_puntatore_file> il/i valore/i di
<nomi_variabili> secondo il <formato_dati>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“w"); //apre il file Nomi.txt in scrittura ... ...
fprintf(fileNomi,"%s", &nome); // scrive il valore della stringa della // variabile nome in Nomi.txt ... ...
fclose (fileNomi);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 78
File sequenziali in C
Funzione feof(<nome_puntatore_file>)
permette di verifcare se si è raggiunta la fine del file puntato da
<nome_puntatore_file>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in scrittura ... ...
fscanf(fileNomi,"%s",&nome);
if (!feof(FileNomi)) { ... ...
fscanf(fileNomi,"%s",&nome);
... ...
}
fclose (fileNomi);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 79
File sequenziali in C: un programma di esempio
#include <stdio.h>
#include <string.h>
main () { int conta=0;
char nome[20];
FILE*Fnomi;
char risp='S';
Fnomi=fopen("Nomi.txt","w"); //apertura file Nomi.txt in scrittura if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n");
else
{ while ((risp=='S')||(risp=='s')) {printf("Nome: \n");
scanf("\n%s",&nome);
fprintf(Fnomi,"%s \n",nome); // scrittura sul file conta++;
printf(" Vuoi inserire altre persone? (S/N) ");
scanf("\n%c",&risp);
} }
fclose(Fnomi); //chiusura del file Nomi.txt
printf("\nInseriti %d nomi nel file\n", conta);
system("Pause");
}
File sequenziali in C: un programma di esempio
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 81
#include<stdio.h>
main ( )
{// salva su un file il contenuto di un array di interi e carica in un // nuovo array i valori salvati; calcola sommatoria elementi array FILE*Fmio;
int i, num, riemp=5, tot=0, riemp2;
int vett[]={1,4,7,8,11};
int vett2[15];
int a;
Fmio= fopen("fileint.txt","w"); //apre fileint.txt in scrittura fprintf(Fmio,"%d\n", riemp); //scrive valore di riemp sul primo rigo del file
for (i=0;i<riemp;i++) // scrive i valori di vett sugli altri righi {fprintf(Fmio,"%d\n", vett[i]);
tot=tot+vett[i];} // calcola sommatoria elementi array printf("tot = %d \n", tot);
printf("FINE SALVATAGGIO\n");
fclose(Fmio); //chiude fileint.txt system("Pause“);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 82
... cosa accade in esecuzione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 83
// Legge il contenuto del file e riporta i valori in un array // di interi
printf("INIZIO CARICAMENTO\n");
Fmio= fopen("fileint.txt","r"); //apre fileint.txt in lettura fscanf(Fmio,"%d",&riemp2); // legge un valore dal file e lo
//assegna alla variabile riemp2 if (!feof(Fmio)) // verifica che non si è a fine file {
for (i=0;i<riemp2;i++) // legge gli altri valori dal file {fscanf(Fmio,"%d", &vett2[i]); // carica array vett2 printf("vett2[%d]=%d \n",i,vett2[i]);
}
printf("FINE CARICAMENTO\n");
}
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio); //chiude fileint.txt
Un semplice programma C per scrittura e lettura di un file sequenziale
... cosa accade in esecuzione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 85
// Carica da file un array di interi con ciclo WHILE Fmio= fopen("fileint.txt","r");
printf("\n\n\n Cicla su file con while (!feof)\n");
fscanf(Fmio,"%d",&riemp2);
if (!feof(Fmio)) {i=0;
fscanf(Fmio,"%d", &vett2[i]);
while (!feof(Fmio))
{printf("vett2[%d]=%d \n",i,vett2[i]);
fscanf(Fmio,"%d", &vett2[i]);
i++;
}
printf("FINE CARICAMENTO con while\n");
}
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 86
... cosa accade in esecuzione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 87
// Aggiunge altri valori accodandoli alla fine del file
printf(“INIZIA ACCODAMENTO\n");
Fmio=fopen("fileint.txt","a"); // apre per accodare for (i=0;i<riemp;i++)
fprintf(Fmio,"%d\n", (vett[i]*2)); // aggiunge in coda i // valori di vett // moltiplicati per 2;
printf("FINE ACCODAMENTO\n");
fclose(Fmio);
Un semplice programma C per scrittura e lettura di un file sequenziale
... cosa accade in esecuzione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 89
printf("LEGGE TUTTI I VALORI NEL FILE E LI STAMPA A VIDEO\n");
Fmio=fopen("fileint.txt","r"); //apre fileint.txt in lettura if (!feof(Fmio))
{i=1;
fscanf(Fmio,"%d", &a); //legge e assegna alla variabile a il // primo valire nel file
while (!feof(Fmio) // cicla fino a che non si è a fine file {printf("valore n.ro %d = %d\n",i,a);
fscanf(Fmio,"%d", &a); // legge gli altri valori dal file i++;
} }
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio); //chiude fileint.txt system("Pause");
} // fine programma
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Esempio
Definizione del problema: Scrivere un programma che consente di inserire in un array i dati di una agenda
telefonica, ovvero nome, cognome, e n.ro di telefono di una persona e di salvare poi il contenuto dello array in un file sequenziale di testo. L’agenda contiene al massimo 200 nomi
Definizione dei dati del problema:
I: nome, cognome, e n.ro di telefono
Pi: il numero degli elementi da inserire non può essere maggiore di 200
U: il file di testo con l’agenda telefonica salvata
Pu: nessuna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 91
Esempio
Nome variabile Descrizione Tipo Cognome stringa nome stringa telefono stringa
Nome variabile Descrizione Tipo agenda file di testo memorizzante l’agenda File
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
????
Tabella delle variabili di algoritmo
Esempio
Descrizione del metodo di elaborazione:
…. lo studente riporti la descrizione dell’algoritmo da
utilizzare per il programma …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 93
#include <stdio.h>
#include <string.h>
void legge(char campo[], int max) // legge una stringa // da tastiera
{ int i = 0; char c;
while ( (c=getchar())!='\n' && (i < max)) {campo[i] = c;
i++;
}
campo[i] = '\0';
}
Esempio - il programma C
Elementi di Informatica
main () {
const card=200;
int i, riemp;
struct persona {char nome[20];
char cogno[20];
char tel[15];
};
struct persona pers[card];
FILE*Fmio;
char risp='S';
i=0;