• Non ci sono risultati.

Array monodimensionali in C

N/A
N/A
Protected

Academic year: 2021

Condividi "Array monodimensionali in C"

Copied!
58
0
0

Testo completo

(1)

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];

(2)

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;

Elementi di Informatica

4

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 completamente, con input da tastiera, un array monodimensionale di interi e stampare poi i valori dei suoi elementi

(3)

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

(4)

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

Elementi di Informatica

8

#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]

(5)

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 –

(6)

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

Elementi di Informatica

12

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 (e deve essere maggiore di zero)

U: l’array ‘riempito’ con i valori degli elementi Pu: nessuna

(7)

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

(8)

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à e magigore di zero // 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

Elementi di Informatica

16

#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

(9)

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 (e deve essere magigore di zero)

U: l’array ‘riempito’ con i valori degli elementi, il riempimento Pu: il riempimento non può essere maggiore della cardinalità

(10)

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

Elementi di Informatica

20

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

(11)

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 >= CARD) printf("\nSuperata la cardinalita': Non possibile inserire ulteriori elementi !!!\n");

if (riemp>0)

{printf("\n Stampa valori elementi nello array:\n");

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, ...

(12)

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

Elementi di Informatica

24

… 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 ...

(13)

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++;

}

}

(14)

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 ...

Elementi di Informatica

28

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

(15)

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

(16)

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[].

Elementi di Informatica

32

/* Calcola la frequenza dei caratteri minuscoli 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]);

}

(17)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 33

Esempio

Un programma per contare quanti caratteri ‘cifra’ sono contenuti in una stringa di 80 caratteri

… strutturando in moduli ...

main

LeggiLinea ContaDigit

Elementi di Informatica

34

Esempio

/* Conta i caratteri numerici in una stringa */

#include <stdio.h>

void LeggiLinea(char ln[], int max);

void ContaDigit(char ln2[], int *times);

main()

{ char linea[81];

int numero;

printf(“Inserisci una linea di testo\n”);

LeggiLinea(linea,81);

ContaDigit(linea, &numero);

printf(“La linea %s contiene %d numerici”, linea, numero);

}

(18)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 35

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';

}

Elementi di Informatica

36

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++;

} }

(19)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 37

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

38

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");

(20)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 39

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

Elementi di Informatica

40

Il valore di B è cambiato

Il valore di C è immutato

Il valore di C è cambiato Il valore di A è immutato

(21)

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];

Dichiara una matrice, di nome Matrice. di numeri reali con10 righe e 15 colonne

Elementi di Informatica

42

Array Bidimensionali in C

Attenzione: gli indici di riga e di colonna iniziano da 0 (zero) int A[5][6]

dichiara una matrice di nome A con 5 righe e 6 colonna Gli indici di riga vanno da 0 a 4, quelli di colonna da 0 a 5

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]

(22)

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 …

Elementi di Informatica

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’

(23)

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.

(24)

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;

// uso di costanti con nome per le cardinalità (numero)di riga e colonna

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]);

}

Elementi di Informatica

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

(25)

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

(26)

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 …

Elementi di Informatica

52

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

(27)

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

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.

(28)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 55

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

56

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;

(29)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 57

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

58

Dichiarazione di variabili di tipo record

• E’ come la dichiarazione di una qualsiasi altra variabile:

<nome tipo> <nome variabile>;

Es. dichiarazione di una variabile del tipo record anagrafico:

record anagrafico persona;

“persona” è una variabile del tipo record anagrafico

Ciascuna variabile persona è composta dai campi del tipo anagrafico Es: persona.cognome

persona.nome

persona.data_nascita.mese persona.indirizzo

(30)

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)

Elementi di Informatica

60

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

(31)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 61

Dichiarazione di variabili di tipo struct in C

• E’ come la dichiarazione di una qualsiasi altra variabile:

struct <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};

(32)

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;

Elementi di Informatica

64

#include <stdio.h>

#include <string.h>

void leggeStringa(char campo[], int max) { int c, i = 0;

while ( (c=getchar())!='\n' && i < max) {campo[i] = c;

i++;

}

campo[i] = '\0';

} main () {int i;

struct persona {char nome[20];

char cogno[20];

int eta;

};

struct persona mamma, zia;

Esempio di programma con variabili di tipo struct

(33)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 65

#include <stdio.h>

#include <string.h>

printf("Nome: "); leggeStringa(mamma.nome, 20);

printf("Cognome: "); leggeStringa (mamma.cogno, 20);

printf("\nNome: "); leggeStringa (zia.nome, 20);

printf("Cognome: "); leggeStringa (zia.cogno, 20);

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);

Esempio di programma con variabili di tipo struct

Elementi di Informatica

66

if ((mamma.eta)>(zia.eta))

printf("\n mamma %s %s ha %d anni ed e' PIU' vecchia di zia %s %s che ha anni %d\n", mamma.nome, mamma.cogno, mamma.eta, zia.nome, zia.cogno, zia.eta);

else

printf("\n mamma %s %s ha %d anni ed è PIU' giovane di zia %s %s che ha anni %d\n", mamma.nome, mamma.cogno, mamma.eta, zia.nome, zia.cogno, zia.eta);

system("Pause");

}

(34)

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;

Elementi di Informatica

68

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

(35)

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 …

(36)

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];

Elementi di Informatica

72

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, 15);

}

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);

}

}

(37)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 73

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. Ordinare l’agenda alfabeticamente rispetto al cognome. Stampare lo array prima e dopo l’ordinamento.

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 ed ordinata rispetto al cognome

Pu: lo array è ordinato alfabeticamente rispetto al cognome

Elementi di Informatica

74

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

(38)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 75

Esempio

Descrizione del metodo di elaborazione:

…. lo studente riporti la descrizione dell’algoritmo da utilizzare per il programma …

Elementi di Informatica

76

#include <stdio.h>

#include <string.h>

struct persona {char nome[20];

char cogno[20];

char tel[15];

};

void stampa_agenda(struct persona person[], int cardagenda) { int i;

for(i=0;i<cardagenda;i++)

{ printf(" Cognome = %s - ",person[i].cogno);

printf(" Nome = %s - ", person[i].nome);

printf(" Tel = %s \n", person[i].tel);

} }

(39)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 77

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 ()

{const card=200;

int i, k;

struct persona pers[card], swap;

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, 15);

}

Elementi di Informatica

78

stampa_agenda(pers, card);

for(i=0;i<card-1;i++) //ordina agenda for(k=i;k<card;k++)

{ if(strcmp(pers[i].cogno,pers[k].cogno)>0) { swap=pers[i];

pers[i]=pers[k];

pers[k]=swap;

} }

printf("\n\n ARRAY ORDINATO PER COGNOME:\n");

stampa_agenda(pers, card);

system("Pause");

}

(40)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 79

Elementi di Informatica

80

(41)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 81

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 82

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 una variabile File : FILE *<nome_puntatore_file>;

Es. File *agenda; // dichiara un puntatore a file di nome agenda

Un file prima di poter essere elaborato deve essere ‘aperto’ ed alla fine della elaborazione va ‘chiuso’

(42)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 83

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 84

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

(43)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 85

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 86

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);

(44)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 87

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 88

File sequenziali in C: un programma di esempio

#include <stdio.h>

#include <string.h>

main ()

// Salva nomi in un file di testo {char nome[20];

int conta=0; //conta quanti nomi sono immessi

FILE *Fnomi;

char risp ='S';

//apertura file Nomi.txt in scrittura Fnomi=fopen("Nomi.txt","w");

(45)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 89

File sequenziali in C: un programma di esempio // verifica che il file esiste

if (Fnomi == NULL)

printf ("Il file non puo' essere aperto \n");

else

{ while ((risp=='S')||(risp=='s')) {printf("Nome: \n");

fflush(stdin);

gets(nome);

// scrive sul file il nome digitato fprintf(Fnomi,"%s \n",nome);

conta++;

printf("Vuoi inserire altri nomi?(S/N)");

scanf(“c",&risp);

} }

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 90

File sequenziali in C: un programma di esempio

//chiusura del file Nomi.txt fclose(Fnomi);

printf("\nInseriti %d nomi nel file\n", conta);

system("Pause");

}

(46)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 91

File sequenziali in C: un programma di esempio

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 92

File sequenziali in C:

un programma di esempio

#include <stdio.h>

#include <string.h>

main () // Legge i nomi dal file e li visualizza { int conta = 0;

char nome[20];

FILE*Fnomi;

Fnomi=fopen("Nomi.txt","r"); //apre file in lettura if (Fnomi == NULL)

printf ("Il file non puo' essere aperto \n");

else { do

{ fscanf(Fnomi,"%20s\n", &nome);

puts(nome);

conta++;}

while (!feof(Fnomi));

}

fclose(Fnomi);

printf("\nLetti %d nomi dal file\n", conta);

system("Pause");

}

Riferimenti

Documenti correlati

– Soluzione: si passa alla funzione un ulteriore parametro di tipo array, che viene “riempito” con il risultato.. E i parametri di

● Se gli estremi degli scaglioni e/o le percentuali cambiano, devo cambiare solo l'array e non il programma che fa la ricerca!.. Algoritmi su

dove numero_elementi deve essere o un valore intero, o un’espressione costante oppure una variabile che sia stata però istanziata prima della definizione dell'array; ad esempio,

I: il valore di ciascun elemento dello array di numeri interi Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array.. U: lo array

I: il valore di ciascun elemento dello array di numeri interi Pi: il numero degli elementi da inserire non può essere maggiore della cardinalità dell’array.. U: lo array

Scrivere un metodo che, dati due array a e b di interi, restituisce true se tutti gli elementi dell’array b compaiono nell’array a nello stesso ordine in cui compaiono in b,

¨  L’espressione a[i] restituisce il valore della variabile con indice i, quindi il tipo di questa espressione è il tipo base dell'array. Accesso agli elementi di

codice strumento prezzo FLT flauto 2500 VLN violino 8000. $inv_art