• Non ci sono risultati.

Algoritmi di base

N/A
N/A
Protected

Academic year: 2021

Condividi "Algoritmi di base"

Copied!
42
0
0

Testo completo

(1)

Elementi di Informatica

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

Algoritmi di base

{...

MAX=Num; // il primo valore della sequenza è //il ‘primo’ massimo attuale

{ ... // inizia un ciclo per analizzare // gli altri valori nella sequenza

if (Num>MAX) MAX=Num; // aggiorna il massimo attuale // quando trovato un valore // maggiore nella sequenza ....

} // fine ciclo ....

printf (“Massimo = %d”, MAX);

....

}

... Ricerca del valore massimo in una sequenza di valori (ad es. di numeri interi)

Algoritmi di base

{....

MIN=Num; // il primo valore della sequenza è //il ‘primo’ minimo attuale

{... // inizia un ciclo per analizzare // gli altri valori nella sequenza

if (Num<MIN) MIN=Num; // aggiorna il minimoattuale // quando trovato un valore // minore nella sequenza ....

} // fine ciclo ....

printf (“Minimo = %d”, MIN);

...

... Ricerca del valore minimo in una sequenza di valori (ad es. di numeri interi)

(2)

Elementi di Informatica

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

{....

Cerca = ... // Inizializza variabile con valore da cercare // e contare occorrenze nella sequenza

....

Volte=0; // Inizializza contatore occorrenze { ... // inizia un ciclo per analizzare // i valori nella sequenza

if (VAL==Cerca)

Volte=Volte+1; // Incrementa contatore occorrenze // ogni volta che il valore è // trovato nella sequenza ...

} // fine ciclo

printf (“Valore %d presente %d volte \n", Cerca, Volte);

....

}

Algoritmi di base

... Ricerca e conteggio occorernze di un dato valore in una sequenza (ad es. di numeri interi)

Algoritmi di base

{....

scanf (“%d”, &N); //legge estremo superiore sommatoria Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria

Sommatoria = Sommatoria + i;

// Incrementa valore di Sommatoria // con il valore i

printf (“Sommatoria = %d \n", Sommatoria);

}

... Calcolo sommatoria dei numeri interi da 1 a N:

(3)

Elementi di Informatica

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

Algoritmi di base

{....

scanf (“%d”, &N); //legge estremo superiore produttoria produttoria=1; // Inizializza valore della produttoria for (i=2;i<=N;i++) // ciclo for per calcolare la produttoria

produttoria = produttoria * i;

// Incrementa valore di produttoria // con il valore i

printf (“Produttoria= %f \n", produttoria);

}

... Calcolo produttoria dei numeri interi da 1 a N:

Algoritmi di base

{....

scanf (“%d”, &N); //legge cardinalità della serie Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria {...

scanf (“%d”, &numero); //legge un numero della serie Sommatoria = Sommatoria + numero;

// Incrementa valore di Sommatoria // con il valore di numero

...

}

printf (“Sommatoria = %d \n", Sommatoria);

... Calcolo sommatoria di una serie di N numeri interi (immessi da tastiera) ...

(4)

Elementi di Informatica

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

Algoritmi di base

... qualche considerazione/osservazione ...

... serie/sequenze ‘costruite’ usando una sola variabile ...

... se si volessero stampare tutti i valori della serie/sequenza dopo che sono stati tutti immessi ?

... se si volesse fare una nuova elaborazione sulla stessa serie/sequenza ? ... una serie/sequenza è un insieme di più valori,

... uso di una variabile per ciascun valore ... ???

Necessità di strutture dati che consentono di registrare un insieme di valori .

Tipi strutturati

…. l’informazione può essere decomposta in tipi più semplici ...

…. più informazioni aggregate fra loro in base ad una relazione per costituire una informazione più complessa

Es:

data (giorno, mese, anno)

numero complesso (parte reale, coefficiente immaginario) generalità anagrafiche (cognome, nome, data nascita, indirizzo)

Un tipo strutturato è caratterizzato da:

• tipi componenti

• costruttore

• funzione d’accesso agli elementi

(5)

Elementi di Informatica

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

COSTRUTTORI DI TIPO

Prodotto cartesiano

tipo T = cartesiano (t1, t2, .... , tn)

t1, t2, …, tn: tipi componenti, non necessariemente tutti uguali

forma n-ple ordinate di elementi dei tipi t1,t2, …, tn un tipo strutturato si ottiene mettendo insieme i tipi

componenti attraverso appositi operatori due costruttori:

• prodotto cartesiano

• sequenza

COSTRUTTORI DI TIPO Prodotto cartesiano

… due modi per definire il tipo strutturato:

• indicando solo i tipi componenti tipo T = cartesiano (t1, t2, .... , tn)

tipo complesso = cartesiano(reale, reale) tipo data = cartesiano(intero, intero, intero)

• indicando attributi e tipi componenti

tipo T = cartesiano (a1:t1, a2:t2, .... ,an:tn)

tipo complesso: cartesiano(ParteReale:reale, CoeffImm: reale) tipo data: cartesiano(giorno: intero, mese:intero,anno:intero)

(6)

Elementi di Informatica

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

Sequenza

tipo T = sequenza (t1, t2, ..., tn)

dove t1 = t2 = … = tn tipi componenti tutti uguali COSTRUTTORI DI TIPO

Es.;

parola = sequenza (carattere)

numero decimale = sequenza (cifra decimale) capitolo = sequenza (paragrafi)

coda = sequenza (persone)

Variabili di Tipo strutturato

Una variabile (informazione) di tipo strutturato va dichiarata, come qualsiasi altra variabile, indicandone il tipo ed il nome

<nome_tipo_strutturato> <nome_variabile>;

Es.:

tipo complesso = cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;

dichiarazione della variabile di nome Numero di tipo complesso

(7)

Elementi di Informatica

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

Funzione di Accesso

… per potere accedere ad uno degli elementi costituenti la struttura:

• tramite l’indicazione di un attributo:

tipo TS = cartesiano (n1:t1, n2:t2, .... ,nk:tk)

indicando con A una informazione del tipo strutturato TS, TS A;

con

A.nh

si indica l’accesso all’elemento nh (il componente h-esimo) di TS Es.:

tipo complesso = cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;

Numero.ParteReale per accedere alla ParteReale

Funzione di Accesso tramite l’indicazione della posizione:

…. Uso di un’informazione indice ...

… indice: informazione di un tipo ordinato ...

Detta A una variabile del tipo strutturato:

A[indice]

indica la componente che occupa la posizione indicata da indice

Es.:

tipo GraduatoriaConcorso = cartesiano(persona, persona, …, persona)

(8)

Elementi di Informatica

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

Array monodimensionali

Tipo strutturato praticamente presente in tutti i linguaggi come tipo strutturato primitivo

• Costruttore: Cartesiano

• Tipi componenti: tutti dello stesso tipo

• Funzione d’accesso: per posizione

tipo array monodimensionale = cartesiano(T 1,T 2, … ,T n) con T 1 = T 2 =...= T n = T

bisogna:

definire T, il tipo dei componenti

definire la dimensione (o cardinalità) dell’array

Array monodimensionali

… concettualmente ...

• un nome ‘collettivo’ associato ad un insieme ordinato di elementi tutti dello stesso tipo

• ciascun elemento è direttamente accessibile attraverso una informazione (l’indice) che ne individua la

posizione nella struttura Es.:

classifica campionato: array di squadre graduatoria concorso: array di persone

prenotati esame universitario: array di studenti

(9)

Elementi di Informatica

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

Array monodimensionali

… un modello interpretativo ...

A

[1]

[2]

[3]

[4]

[5]

Valori dell’indice [6]

(posizione componente)

Nome array A[3]

Terzo componente

Accesso diretto ai componenti

Array monodimensionali

… un modello interpretativo ...

Valori dell’indice (posizione componente)

A

[1]

[2]

[3]

[4]

[5]

[6]

34 281 87 623 15 839

Valori elementi array

A[1] = 34 A[3] = 87 A[5] = 15

… non confondere il valore di un elemento dello array con

(10)

Elementi di Informatica

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

Array monodimensionali Parametri caratterizzanti un array:

• Strutturali:

• Nome dello array

• Tipo componente

• Cardinalità: numero di elementi costituenti lo array

Array monodimensionali

Parametri caratterizzanti un array:

• di utilizzo:

• Indice: appartenete ad un tipo ordinato, indica la posizione di un elemento nello array.

Può essere espresso tramite:

• una costante (es. A[4], quarto elemento dello array)

• una variabile (es. A[I], i-esimo elemento dello array)

• una espressione (es. A[c+d*e],

(elemento dello array nella posizione corrispondente al valore di c+d*e)

• Riempimento: numero di elementi effettivamente utilizzati N.B. non confondere Riempimento con Cardinalità Deve sempre essere :

Riempimento  Cardinalità

indice  Riempimento  Cardinalità

(11)

Elementi di Informatica

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

Array monodimensionali

La dichiarazione di una variabile di tipo array è fatta specificando:

• tipo componente

• nome dello array (nome della variabile)

• cardinalità dello array (racchiusa tra parentesi quadre)

<tipo> <nome_array> [<cardinalità>]

Es.:

int A[10];

float SpesaSettimanale[7];

Array monodimensionali

ad un elemento di un array è possibile assegnare un valore tramite operazioni di:

• lettura Es.:

read(“%d”, A[3]);

legge il valore da assegnare al terzo elemento dello array A

• calcolo e assegnazione Es.:

A[4] = C;

A[I] = 5;

A[I] = f * 9 + d;

(12)

Elementi di Informatica

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

Array monodimensionali

un elemento di un array può essere utilizzato in operazioni di:

• stampa Es.:

write(“%d”, A[3]);

stampa il valore da contenuto nel terzo elemento dello array A

• calcolo e assegnazione Es.:

C = A[4] ;

B= f *9 + d - A[I] ;

• condizione Es.:

if (A[I] > 7) ……

[1]

[2]

[3]

[4]

[5]

[6]

A

21 18 22 5 8

6

B=A[2] + A[4];

printf(“%d --- %d\n”, A[1], A[5]); 18 --- 21

A[1]= 7; =>

A[4]= 41;

[1]

[2]

[3]

[4]

[5]

[6]

A

21 7 22

5 41

6

=> B=22 + 8=30

Array monodimensionali

……

x = 3;

if (A[x] != 24) printf(“VERO”);

……

VERO Indici

Nome array Valori elementi array

(13)

Elementi di Informatica

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

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

Es.

A=“calcolatore “ B=“elettronico”

C=A//B=“calcolatore elettronico”

Array Bidimensionali

tipo array Bidimensionale= cartesiano(T 1,T 2, … , T n) con T 1 = T 2 =...= T n = T

Tipo T = cartesiano (q1, q2, …, qm) q1=q2= ….. =qm

…. Ovvero un array bidimensionale è un array in cui ciascun elemento è a sua volta un array

… array tutti della stessa dimensione e tipo

(14)

Elementi di Informatica

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

Array Bidimensionali

… un modello interpretativo ...

A

Nome array

1 2 3 4 5 6

1 2 3 4 5 6 7

Valori dell’indice (posizione componente)

Array Bidimensionali

… la posizione di ciascun elemento è individuata da 2 indici …

… il primo indice, indica la riga …

… il secondo indice, indica la colonna ...

1 2 3 4 5 6

1 2 3 4 5

[1,1] [1,2] [1,3] [1,4] [1,5]

[2,1] [2,2] [2,3] [2,4] [2,5]

[6,1] [6,2] [6,3] [6,4] [6,5]

A[4,2]

(15)

Elementi di Informatica

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

Array Bidimensionali

… la posizione di ciascun elemento è individuata da 2 indici …

1 2 3 4 5 6

1 2 3 4 5

23 47 63 96 8

27 66 23 44 567

42 28 34 125 47

A[4,2] = 57

57

A[6,3] = 34

… il primo indice, indica la riga …

… il secondo indice, indica la colonna ...

… ciascuna posizione conterrà un (solo) valore …

Array Bidimensionali

Parametri caratterizzanti un array bidimensionale:

• Strutturali:

• Nome dello array

• Tipo componente

• Cardinalità di riga: numero di righe costituenti lo array

• Cardinalità di colonna: numero di colonne costituenti

lo array

(16)

Elementi di Informatica

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

Parametri caratterizzanti un array bidimensionale:

• di utilizzo:

• Indice di riga: appartenete ad un tipo ordinato

• Indice di colonna: appartenete ad un tipo ordinato

la coppia ordinata [indice di riga, indice di colonna] indica la posizione di un elemento nello array bidimensionale.

Gli indici possono essere espressi tramite:

• una costante (es. A[4,2], elemento in quarta riga e seconda colonna)

• una variabile (es. A[I, J], elemento in riga i-esima e colonna j-esima)

• una espressione (es. A[c+d*e, k],

(elemento dello array nella riga corrispondente al valore di c+d*e, e k-esima colonna)

Array Bidimensionali

Parametri caratterizzanti un array bidimensionale:

• di utilizzo:

• Riempimento: numero di elementi effettivamente utilizzati

• Riempimento di riga

• Riempimento di colonna

N.B. non confondere Riempimento con Cardinalità Deve sempre essere :

indice riga  Cardinalità riga

indice colonna  Cardinalità colonna Riempimento riga  Cardinalità riga

Riempimento colonna  Cardinalità colonna

(17)

Elementi di Informatica

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

Array Bidimensionali

La dichiarazione di una variabile di tipo array bidimensionale è fatta specificando:

• tipo componente

• nome dello array (nome della variabile)

• cardinalità di riga e di colonna dello array (racchiusa tra parentesi quadre)

<tipo> <nome_array_bidim> [<cardinalità_riga] [cardinalità_colonna>]

Es.:

int A[10] [15];

float Mat[7] [22];

Array Multidimensionali

… generalizzando opportunamente ….

… un array di array di array di array …. Quante sono le dimensioni

… tutti array dello stesso tipo …

… per ciascuna dimensione, tutti array con stessa cardinalità …

… posizione individuata mediante tanti indici quanti sono le dimensioni

… un indice per ciascuna dimensione ...

<tipo><nome_array_multidim>[<card_dim1] [card_dim2>] …[card_dimK]

Es.:

int A[10] [15] [20];

float Multi [7] [22] [30] [45];

(18)

Elementi di Informatica

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

Il tipo 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 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

(19)

Elementi di Informatica

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

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;

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

(20)

Elementi di Informatica

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

Dichiarazione di variabili di tipo record

• E’ simile alla 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

Tipo strutturato File

• Tipo strutturato formato da un insieme di elementi tutti dello stesso tipo

• Gli elementi sono registrati su un supporto di memoria di massa

• Individuato da un nome

• Caratterizzato da un metodo di accesso ai suoi elementi (detti genericamente records)

- File ad accesso Sequenziale - File ad accesso Diretto

(21)

Elementi di Informatica

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

Accesso sequenziale

Per accedere all' N-mo record bisogna accedere agli N-1 record precedenti (nastro)

Accesso diretto

Individuazione ed accesso diretti ad un record tramite:

- o il riferimento alla sua posizione - o i valori di uno o piu' campi (chiavi)

FILE SEQUENZIALE

• è una sequenza di oggetti tutti dello stesso tipo T …

• ..ed una ulteriore informazione di tipo T detta buffer che indicheremo con f

• la definizione è completata con le operazioni caratteristiche del tipo file sequenziale

• Operazioni possibili su un file sequenziale:

• Inserimento di un nuovo elemento (WRITEF)

• Lettura degli elementi (READF)

• Riposizionamento all’inizio del file (RESET)

• Riscrittura del file (REWRITE)

• Verifica di fine file (EOF)

(22)

Elementi di Informatica

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

operazione WRITEF(f)

• è una operazione di inserzione che modifica lo stato del file

• inserzione del valore del buffer alla fine di f; il buffer avrà valore indefinito dopo l’operazione

… prima di WRITEF(f) ...

f = f x

… dopo WRITEF (f) ...

f = f ?

a b c d

a b c d x

...una osservazione

• in ogni istante la sequenza di oggetti di un file f può essere vista come concatenazione di altre due sequenze

....una parte sinistra fs ed una parte destra fd ....

f = f

s

/ f

d

(23)

Elementi di Informatica

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

operazione READF(f)

non modifica il contenuto del file f, ma quello del buffer con un valore di f ben definito, inoltre... modifica parte ...sinistra..e destra..

f=

f ?

fs fd

… prima di READF(f)...

… dopo READF(f) ...

f f c

fs fd

Nel buffer sarà presente il primo elemento di fd

a b c d

a b c d

operazione RESET (f)

• posiziona il buffer sul primo elemento del file la parte sinistra risulterà vuota

… prima di RESET (f) ...

… dopo RESET(f) ... f =

fs fd f =

f ?

fs fd

a b c d

a b c d

(24)

Elementi di Informatica

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

f = f ?

… prima di REWRITE ...

… dopo REWRITE(f) ... f = < >

f ? operazione REWRITE (f)

• cancella gli elementi del file svuotandolo

a b c d

il predicato EOF (f)

E’ usato per verificare se si è raggiunta la fine del file EOF = End Of File

• EOF(f)

• TRUE se la parte destra della sequenza è vuota

• FALSE se non lo è

(25)

Elementi di Informatica

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

Alcune regole

Dopo un RESET sono possibili solo operazioni di READF Dopo un REWRITE sono possibili solo operazioni di WRITEF Non è possibile mescolare/alternare operazioni di WRITEF e READF Generazione di un File:

un REWRITE seguito da una o più operazioni di WRITEF Visita (ispezione/lettura) di un FILE:

un RESET seguito da una o più operazioni di READF, fino alla fine del file

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’

(26)

Elementi di Informatica

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

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

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

(27)

Elementi di Informatica

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

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

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

(28)

Elementi di Informatica

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

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

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

(29)

Elementi di Informatica

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

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

} }

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

}

(30)

Elementi di Informatica

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

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

}

(31)

Elementi di Informatica

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

File sequenziali in C:

un programma di esempio

#include <stdio.h>

#include <string.h>

main ()

// Legge nomi da file e li carica in un array { int conta = 0, i;

char nome[20];

struct nomi_str

{char *nome_str[20];};

struct nomi_str arr_nomi[50];

FILE*Fnomi;

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

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

else

{ while (!feof(Fnomi)) //carica in array

{fscanf(Fnomi,"%20s\n", &arr_nomi[conta].nome_str);

conta++;}

}

File sequenziali in C:

un programma di esempio

printf("\n\nARRAY NOMI \n");

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

printf("arr_Nomi[%d]=%s\n",i, arr_nomi[i].nome_str);

fclose(Fnomi);

system("Pause");

}

(32)

Elementi di Informatica

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

Esempio

Definizione del problema: Scrivere un programma che consente di salvare i dati di un array monodimensionale di interi in un file

sequenziale di testo, salvando nel file anche il valore del riempimento quale primo elemento del file. Calcolare la sommatoria degli elementi dello array.

Copiare i dati salvati nel file in un nuovo array monodimensionale di interi.

Definizione dei dati del problema:

I: gli elementi dello array Pi:nessuna

U: il file di testo con i valori dello array ed il riempimento; il nuovo array ‘caricato’ con i valori nel file

Pu: nessuna

#include<stdio.h>

main ( ) {FILE*Fmio;

int i, num, riemp=5, tot=0, riemp2;

int vett[]={1,4,7,8,11};

int vett2[15];

int a;

//apre fileint.txt in scrittura Fmio= fopen("fileint.txt","w");

//scrive valore di riemp sul primo rigo del file fprintf(Fmio,"%d\n", riemp);

Un semplice programma C per scrittura e lettura di un file sequenziale

(33)

Elementi di Informatica

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

// scrive i valori di vett sugli altri righi for (i=0;i<riemp;i++)

{ fprintf(Fmio,"%d\n", vett[i]);

// calcola sommatoria elementi array tot=tot+vett[i];

}

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

... cosa accade in esecuzione ...

(34)

Elementi di Informatica

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

// Legge il contenuto del file e riporta i valori in un // array monodimensionale di interi

printf("INIZIO CARICAMENTO\n");

//apre fileint.txt in lettura Fmio= fopen("fileint.txt","r");

fscanf(Fmio,"%d",&riemp2); // legge il primo valore dal // file e lo assegna alla // variabile riemp2

Un semplice programma C per scrittura e lettura di un file sequenziale

// verifica che non si è a fine file if (!feof(Fmio))

// legge gli altri valori dal file e li copia in vett2 {for (i=0;i<riemp2;i++)

{fscanf(Fmio,"%d", &vett2[i]);

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

(35)

Elementi di Informatica

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

... cosa accade in esecuzione ...

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

Un semplice programma C per scrittura e lettura di un file sequenziale

(36)

Elementi di Informatica

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

// Aggiunge altri valori accodandoli alla fine del file

printf(“INIZIA ACCODAMENTO\n");

Fmio=fopen("fileint.txt","a"); // apre per accodare

// aggiunge in coda al file i valori di vett // moltiplicati per 2;

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

fprintf(Fmio,"%d\n", (vett[i]*2));

printf("FINE ACCODAMENTO\n");

fclose(Fmio);

Un semplice programma C per scrittura e lettura di un file sequenziale

(37)

Elementi di Informatica

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

... cosa accade in esecuzione ...

printf("LEGGE E VISUALIZZA TUTTI I VALORI NEL FILE \n");

//apre fileint.txt in lettura Fmio=fopen("fileint.txt","r");

if (!feof(Fmio)) {

//legge e assegna alla variabile a // il primo valore nel file

fscanf(Fmio,"%d", &a);

Un semplice programma C per scrittura e lettura di un file sequenziale

(38)

Elementi di Informatica

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

// cicla fino a che non si è a fine file

// e legge e visualizza gli altri valori dal file i=1;

while (!feof(Fmio)

{printf("valore n.ro %d = %d\n",i,a);

fscanf(Fmio,"%d", &a);

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

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

(39)

Elementi di Informatica

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

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 …

(40)

Elementi di Informatica

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

#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

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;

Esempio - il programma C

(41)

Elementi di Informatica

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

while (((risp=='S')||(risp=='s'))&&(i<card)) { fflush(stdin);

printf("Nome: \n"); legge(pers[i].nome, 20);

printf("Cognome: \n"); legge(pers[i].cogno, 20);

printf(" Tel. : \n"); legge(pers[i].tel, 20);

i++;

printf(" Vuoi inserire altre persone? (S/N) ");

risp=getchar();

}

riemp=i;

// stampa contenuto array for(i=0;i<riemp;i++) {

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

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

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

}

Esempio - il programma C

printf(" Vuoi salvare i dati su un file? (S/N) ");

scanf("\n%c", &risp);

if ((risp=='S')||(risp=='s')) { Fmio=fopen("agenda.txt","w");

if (Fmio == NULL)

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

else

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

fprintf(Fmio,"%s %s %s\n",pers[i].cogno, pers[i].nome, pers[i].tel);

printf("Agenda Salvata \n");

Fclose(Fmio);

} else

printf("Agenda non Salvata \n");

Esempio - il programma C

(42)

Elementi di Informatica

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

Esempio - il programma C

………

// Carica lo array dell’agenda leggendo dal file {Fmio=fopen("agenda.txt","r");

if (!feof(Fmio)) { i=0;

fscanf(Fmio,"%20s %20s %15s",

&pers[i].cogno,pers[i].nome, &pers[i].tel);

while (!feof(Fmio))

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

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

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

i++;

fscanf(Fmio,"%20s %20s %15s",&pers[i].cogno, &pers[i].nome, &pers[i].tel);

}

printf("FINE CARICAMENTO\n");

}

else printf("RAGGIUNTA FINE FILE");

fclose(Fmio);

}

Esempio

Riferimenti

Documenti correlati

Applicazione dell’uguaglianza di Parceval nel calcolo della somma delle serie.. Trasformata

=⇒ Non serve specificare la dimensione del vettore nel parametro formale ( `e un puntatore al tipo degli elementi del vettore).. Quando passiamo una matrice ad una funzione, per

I I valori elencati nella definizione di un nuovo tipo enumerato, sono identificatori che rappresentano costanti di quel tipo (esattamente come 0, 1, 2, ... sono costanti del tipo

Questo significa che ,scelto in maniera arbitraria un numero positivo ε , deve risultare : x &lt; ε Pertanto, dire che x è una variabile infinitesima significa affermare che essa,

™ è stato scritto da altri programmatori e può essere riusato nel nostro

Una volta che un programma è in forma eseguibile, può essere trasferito dal file in cui risiede (memoria secondaria) in memoria centrale ed essere

per ogni riga identificata si costruisce una sottoespressione prodotto (and) di tutte le lettere che sono prese nella loro forma naturale o complementata seguendo i seguenti

la lunghezza li i delle parole codice associate ai valori dell'alfabeto delle parole codice associate ai valori dell'alfabeto sorgente è costante. sorgente è costante Codifica