Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova...

121
1 Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca Dipartimento di Ingegneria Università del Sannio - CdL Ingegneria Energetica Elementi di Informatica Prof. G. A. Di Lucca - Univ. del Sannio 1 Esempio Analisi e Specifica Definizione del problema: Inserire i valori di tutti gli elementi di un array monodimensionale di interi, composto da 50 elementi, visualizzare il contenuto dello array così ottenuto, calcolare la sommatoria degli elementi di indice dispari (l’indice 0 è considerato pari) Definizione dei dati del problema: 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 ‘riempito’ con i valori di tutti gli elementi, la sommatoria degli elementi di indice dispari Pu: lo array non può essere ‘vuoto’ Elementi di Informatica Prof. G. A. Di Lucca - Univ. del Sannio 2 Esempio Nome variabile Descrizione Tipo VET(I) elemento dell’array INT Nome variabile Descrizione Tipo VET array di interi con i valori immessi INT Sommadispari sommatoria elementi indice dispari INT Tabella delle variabili di ingresso Tabella delle variabili di uscita Nome variabile Descrizione Tipo I Indice array INT Tabella delle variabili di algoritmo

Transcript of Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova...

Page 1: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

1

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Analisi e Specifica

Definizione del problema: Inserire i valori di tutti gli elementi di un array

monodimensionale di interi, composto da 50 elementi, visualizzare il

contenuto dello array così ottenuto, calcolare la sommatoria degli elementi

di indice dispari (l’indice 0 è considerato pari)

Definizione dei dati del problema:

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 ‘riempito’ con i valori di tutti gli elementi, la sommatoria

degli elementi di indice dispari

Pu: lo array non può essere ‘vuoto’

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

VET(I) elemento dell’array INT

Nome variabile Descrizione Tipo

VET array di interi con i valori immessi INT

Sommadispari sommatoria elementi indice dispari INT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo

I Indice array INT

Tabella delle variabili di algoritmo

Page 2: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

2

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Progettazione

Descrizione del metodo di elaborazione:

Con un ciclo ripetitivo, si effettua la lettura del valore di ciascun

elemento dell’array.

Si visualizza, sempre usando un ciclo ripetitivo, il contenuto dello

array, stampando ad ogni passo del ciclo il valore di ciascun

elemento dello array

Con un ciclo ripetitivo che parte dalla posizione di indice 1 e con

step di incremento pari a due si calcola la sommatoria dei valori

nelle posizioni di indice dispari. Si stampa il risultato ottenuto.

Elementi di Informatica

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

#include< stdio. h>

main()

{

int Vett[50], i, Sommadispari;

// Legge in input i valori di tutti gli elementi dello array

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

{

printf(“Valore di Vett(%d)\ n", i);

scanf("% d", &Vett[ i]);

}

// Stampa tutti gli elementi dello array

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

printf(“Vett(%d)=% d\ n", i, Vett[ i]);

Esempio - il programma C

Page 3: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

3

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// calcola la sommatoria degli elementi di indice dispari

// un primo modo

Sommadispari=0;

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

{if ((i%2)!=0)

Sommadispari= Sommadispari+Vett[i];

}

printf(“Sommatoria valori elementi in posti di indice dispari=% d\ n",

Sommadispari);

}

Esempio - il programma C

Elementi di Informatica

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

// calcola la sommatoria degli elementi di indice dispari

// un modo più efficiente

Sommadispari=0;

for (i= 1; i< 50; i=i+2)

Sommadispari= Sommadispari+Vett[i];

printf(“Sommatoria valori elementi in posti di indice dispari=% d\ n",

Sommadispari);

}

Esempio - il programma C

Page 4: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

4

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema: Trovare il valore minimo tra gli elementi di un

array di interi, con cardinalità 50, ed indicarne la posizione (se vi sono più

elementi con lo stesso valore minimo va indicata la posizione del primo

elemento ‘minimo’). Lo array può essere ‘riempito’ parzialmente.

Definizione dei dati del problema:

I: il riempimento; il valore di ciascun elemento

Pi: il riempimento non può essere maggiore della cardinalità dell’array

U: il valore minimo nello array; la posizione dell’elemento con valore

minimo

Pu: la posizione del minimo non maggiore del riempimento

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

riemp riempimento INT

VET(I) elemento dell’array INT

Nome variabile Descrizione Tipo

MIN Elemento con il valore del minimo INT

POS Posizione dove è contenuto MIN INT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo

I Indice array INT

Tabella delle variabili di algoritmo

Page 5: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

5

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

è immesso il numero di quanti elementi si vogliono inserire (riempimento):

tale numero deve essere minore della cardinalità dello array.

Usando un ciclo si ‘riempe’ lo array leggendo il valore di ciascun elemento

da immettere.

Si pone il minimo pari al primo elemento dell’array e la sua posizione pari

all’indice zero.

Usando un ciclo, si ‘visita’ lo array verificando se ciascun altro elemento

dell’array è inferiore al minimo fissato, in tal caso si aggiorna il valore del

minimo e della posizione in cui esso si trova nell’array

Alla fine del ciclo si stampa il valore minimo e la posizione in cui esso si

trova

Elementi di Informatica

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

Esempio - il programma C #include<stdio.h>

main()

{ const int cardinalita=50;

int VET[cardinalita], I, riemp,MIN, POS;

do

{ printf (“quanti elementi vuoi inserire?\n”);

scanf (“%d”, &riemp);

}

while ( riemp>cardinalita);

// Legge in input gli elementi del vettore

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

{ printf(" dammi elemento di posto %d\n", I);

scanf("% d", &VET[I]);

}

Page 6: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

6

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Cerca il valore minimo nello array

MIN = VET[0]; POS=0;

for (I=1; I< riemp; I++)

{

if (VET[I]<MIN)

{

MIN=VET[I];

POS=I;

}

}

printf(“il valore minimo = %d si trova nella posizione numero%d\n” ,

MIN, POS);

}

Esempio - il programma C

Elementi di Informatica

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

Esempio

Definizione del problema: Verificare se in un array monodimensionale di

interi, composto da 50 elementi, esiste un determinato valore dato in input. Se

questo valore esiste indicare la posizione del primo elemento che lo contiene, e

terminare la ricerca. Lo array può essere ‘riempito’ parzialmente.

Definizione dei dati :

I: il valore di ciascun elemento; il valore da cercare; (eventuale)

riempimento

Pi: se usato un riempimento questo non può essere maggiore della

cardinalità dello array

U: la posizione del primo elemento dello array con valore uguale a

quello cercato

Pu: la posizione del primo elemento dello array con valore uguale a

quello cercato non maggiore del riempimento

Page 7: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

7

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

riemp riempimento INT

VET(I) elemento dell’array INT

VAL valore da cercare nell’array INT

Nome variabile Descrizione Tipo

TROVATO Indica se esiste un elemento pari a VAL LOGICAL

POS Posizione dove è contenuto VAL 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

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

Esempio

Descrizione del metodo di elaborazione:

è indicato il numero di quanti elementi si vogliono inserire: tale

numero deve essere non maggiore della cardinalità dell’array.

Con un ciclo ripetitivo, si legge il valore di ciascun elemento da

immettere.

Si immette il valore da cercare nell’array.

Con un ciclo iterativo, si verifica se tale valore esiste nell’array:

se esiste viene visualizzata la posizione del primo elemento che

lo contiene;

se non esiste viene visualizzata la scritta ‘il valore indicato non

esiste nello array’.

Page 8: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

8

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

#include<stdio.h>

main()

{ const int cardinalita=50;

int VET[cardinalita], I, riemp,VAL, POS;

int trovato;

do

{ printf (“quanti elementi vuoi inserire?\n”);

scanf (“%d”, & riemp); }

while ( riemp>cardinalita);

// Legge in input gli elementi del vettore

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

{ printf(" dammi elemento di posto %d\n", I);

scanf("% d", &VET[I]);

}

// Immissione valore da cercare

printf (“immetti valore da cercare\n”);

scanf (“%d”, &VAL);

Esempio - il programma C

Elementi di Informatica

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

// Cerca se il valore immesso esiste nello array (ricerca lineare)

trovato=0; POS=0;

I=0;

do

{ if (VET[I] == VAL)

{ trovato = 1;

POS=I;}

I++; }

while ((trovato ! = 1) && ( I < riemp));

if (trovato == 1)

printf (“valore immesso %d in posizione %d\n’, VAL, POS);

else

printf(“il valore indicato %d non esiste nello array\n”, VAL);

}

Page 9: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

9

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Cerca se il valore immesso esiste nello array (ricerca lineare)

trovato=0; POS=0;

I=0;

while ((VET[I] != VAL) && ( I<riemp))

I++;

if (I < riemp)

{ trovato = 1;

POS=I; }

if (trovato == 1)

printf (“valore immesso %d in posizione %d\n”, VAL, POS);

else

printf(“il valore indicato %d non esiste nello array\n”, VAL);

}

… un’altra soluzione …

Elementi di Informatica

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

// Cerca se il valore immesso esiste nello array (ricerca lineare)

trovato=0;

I=0;

while ((trovato==0) && (I<riemp))

{ trovato=(VET[I]==VAL);

I++;

}

if (trovato==1)

printf(‘il valore immesso %d in posizione %d\n”, VAL, (I-1));

else

printf(“il valore indicato %d non esiste nello array\n”, VAL);

}

… ancora un’altra soluzione …

Page 10: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

10

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema: In un array monodimensionale di interi, composto

da 50 elementi e riempito con valori in input da tastiera, contare il numero

delle occorrenze di un determinato valore dato in input. Indicare anche le

posizioni degli elementi dello array uguali al valore cercato. Lo array può

essere ‘riempito’ parzialmente.

Definizione dei dati :

I: il valore di ciascun elemento; il valore da cercare; (eventuale)

riempimento

Pi: se usato un riempimento questo non può essere maggiore della

cardinalità dello array

U: Numero di occorrenze del valore cercato, gli indici degli elementi

dello array con valore uguale a quello cercato

Pu: Numero di occorrenze non negativo, gli indici degli elementi dello

array con valore uguale a quello cercato non maggiori del riempimento

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

riemp riempimento INT

VET(I) elemento dell’array INT

VAL valore da cercare nell’array INT

Nome variabile Descrizione Tipo

NumOccorrenze Numero occorrenze pari a VAL INT

I Indice posizione elemento uguale a VAL INT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo

I indice array INT

Tabella delle variabili di algoritmo

Page 11: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

11

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

è indicato il numero di quanti elementi si vogliono inserire: tale numero

deve essere non maggiore della cardinalità dell’array;

Con un ciclo ripetitivo, si legge il valore di ciascun elemento da immettere;

Si immette il valore di VAL da cercare nell’array;

Si inizializza a zero il valore di NumOccorrenze;

Con un ciclo ripetitivo:

si verifica se ciascun elemento dello array ha il valore uguale a VAL ed

in tal caso si incrementa di 1 il valore di NomOccorrenze e si stampa

l’indice dell’elemento verificante la condizione di uguaglianza;

Alla fine del ciclo si stampa il valore di NumOccorrenze.

Elementi di Informatica

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

#include<stdio.h>

main()

{ const int cardinalita=50;

int VET[cardinalita], I, riemp,VAL, NumOccorrenze = 0;

do

{ printf (“quanti elementi vuoi inserire?\n”);

scanf (“%d”, & riemp); }

while ( riemp>cardinalita);

// Legge in input gli elementi del vettore

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

{ printf(" dammi elemento di posto %d\n", I);

scanf("% d", &VET[I]);

}

// Immissione valore da cercare

printf (“immetti valore da cercare\n”);

scanf (“%d”, &VAL);

Esempio - il programma C

Page 12: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

12

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Conta le occorrenze di VAL (ricerca lineare)

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

{ if (VET[I] == VAL)

{ NumOccorrenze++;

printf(“Valore %d trovato in posizione %d\n”, VAL, I);

}

}

printf (“valore %d trovato %d volte\n”, VAL, NumOccorrenze);

}

Elementi di Informatica

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

// Conta le occorrenze di VAL (ricerca lineare)

int posizione[cardinalita];

…..

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

{ if (VET[I] == VAL)

{posizione[NumOccorrenze]=I;

NumOccorrenze++;

}

}

printf (“valore %d trovato %d volte\n nelle posizioni:\n”, VAL,

NumOccorrenze);

for (I= 0; I< NumOccorrenze; I++)

printf(“posizione = %d\n”, posizione[I]);

}

Page 13: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

13

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Visita totale: vengono analizzati tutti gli elementi

Si usa un ciclo a conteggio

E’ il caso degli esempi della ricerca del minimo e dell’ordinamento

Visita finalizzata: la visita termina quando un elemento dell’array verifica

una certa condizione

Si usa un ciclo iterativo

due condizioni di uscita:

una sull’indice di scansione (visitati tutti gli elementi si esce comunque

dal ciclo) e

l’altra che dipende dal problema specifico ...

… in ogni caso si termina se si sono visitati tutti gli elementi

dell’array senza trovare l’elemento dato

E’ il caso della ricerca di un elemento (termina se l’elemento è stato trovato ...)

Visita degli elementi di un array

Elementi di Informatica

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

Generazione casuale (random) di un numero:

… si usa la funzione rand() della libreria <stdlib.h>

#include <stdio.h>

#include <stdlib.h>

main ()

{int a;

printf ("Generazione random di un numero intero \n");

a = rand() %70; //la funzione rand() genera in modo random un numero

// intero; l’applicazione di %70 fa in modo che il numero

// generato sia modulo 70, ossia compreso tra 0 e 69.

printf ("Numero = %d \n", a);

}

Esempio

Page 14: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

14

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

/* Programma per simulare il risultato del lancio di un dado */

#include <stdio.h>

#include <stdlib.h>

main ()

{ int faccia_dado;

faccia_dado = rand() % 6; //genera un numero casuale fra 0 e 5

faccia_dado++; // per ottenere un valore tra 1 e 6

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

system("Pause");

}

Esempio

Elementi di Informatica

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

… Se eseguiamo il programma più volte si ottiene sempre lo stesso

risultato!!!

… ciò è dovuto al fatto che rand() genera numeri pseudo-casuali, cioè

numeri che "sembrano" casuali …

Affinchè ogni esecuzione del programma generi un diverso valore deve

essere effettuata la ‘randomizzazione’ della funzione, ovvero inizializzare il

generatore di numeri pseudo-casuali usando un valore che viene detto ‘seme’

La randomizzazione può essere fatta usando la funzione srand(), che

richiede un parametro di input di tipo unsigned (intero senza segno), che

funge da seme.

La funzione time() della libreria time.h è solitamente usata, con parametro

NULL (o zero) , per generare il seme; essa fornisce un valore unsigned

calcolato in base all'ora corrente del giorno, espressa in secondi.

Esempio

Page 15: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

15

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Programma per simulare il risultato del lancio di un dado - randomizzato

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

main ()

{ int faccia_dado, i;

srand(time(NULL)); //inizializza il generatore di numeri random

for (i=0;i<5;i++) // lancia il dado 5 volte e ogni volta mostra il risultato

{ faccia_dado= rand() % 6; //genera un numero casuale fra 0 e 5

faccia_dado++; // per ottenere un valore tra 1 e 6

printf(“Faccia dado = %d\n",faccia_dado);

}

system("Pause");

}

Esempio

Elementi di Informatica

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

Esempio

Riempimento di un array con generazione random di numeri :

#include <stdio.h>

#include <stdlib.h>

#include<time.h>

main ()

{ int i, vet[10];

srand(time(NULL));

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

v[i] = rand(); //il valore random generato da rand() è assegnato

// all’elemento i-esimo dello array v

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

printf ("v[%d] = %d \n", i, v[i]);

}

Page 16: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

16

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Ordinamento di array: per selezione

Definizione del problema: Ordinare in senso crescente gli

elementi di un array monodimensionale di interi e visualizzare

l’array risultante.

Definizione dei dati:

I: riempimento; il valore di ciascun elemento dello array

Pi: il numero degli elementi da inserire (riempimento) non

può essere maggiore della cardinalità dell’array

U: l’array monodimensionale con gli elementi ordinati in

senso crescente

Pu: T[i] T[i+1] " i=1..n dove T è lo array da ordinare

Elementi di Informatica

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

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

VET Array da ordinato INT

Tabella delle variabili di uscita

Ordinamento di array: per selezione

Nome variabile Descrizione Tipo

riemp riempimento INT

VET(I) elemento dell’array INT

Nome variabile Descrizione Tipo I indice array INT

???

Tabella delle variabili di algoritmo

Page 17: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

17

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Ordinamento di array: per selezione Descrizione del metodo di elaborazione:

Ordinamento per selezione (detto anche per minimi successivi).

Detto T lo array mono-dimensionale di cardinalità n, per ottenere

l’ordinamento desiderato deve verificarsi che sia

T[i] T[i+1] " i=1..n.

• Si trova, allora, il valore minimo T[p] dell’intero array e si scambia il valore

di T[p] con quello in prima posizione (T[0]);

• poi, si trova il nuovo minimo T[p] tra tutti gli elementi tra la seconda e

l’ultima posizione (T[1] e T[n]) e si scambia il valore di T[p] con quello in

seconda posizione (T[1]);

• ... si ha una parte ordinata e una NON ancora ordinata

• si continua in tal modo con tutti gli altri elementi dell’array nella parte NON

ancora ordinata, scambiando di posto il primo elemento della parte NON

ancora ordinata con il minimo della parte NON ordinata con.

• Alla fine sono visualizzati gli elementi dell’array risultante.

Elementi di Informatica

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

9

5

8

2

4

22

5

8

9

4

222

444

8

9

5

222

444

8

9

5

222

444

555

9

8

222

444

555

9

8

222

444

555

888

999

Ordinamento di array: per selezione

9

5

8

2

4

222

5

8

9

4

In blu parte già ordinata

In rosso minimo parte

NON ancora ordinata

Page 18: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

18

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

VET Array da ordinato INT

Tabella delle variabili di uscita

Ordinamento di array: per selezione

Nome variabile Descrizione Tipo

riemp riempimento INT

VET(I) elemento dell’array INT

Nome variabile Descrizione Tipo I,J indice array INT

temp variabile appoggio per swap INT

POS Posizione minimo INT

MIN Minimo in parte non ordinata dell’array INT

Tabella delle variabili di algoritmo

Elementi di Informatica

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

Il programma in C

Ordinamento di array:

per selezione

#include<stdio.h>

main()

{ const int cardinalita=50;

int VET[cardinalita], I, riemp, J, POS, temp, MIN;

do

{ printf (“quanti elementi vuoi inserire?\n”);

scanf (“%d”, & riemp); }

while ( riemp>cardinalita);

// Legge in input gli elementi del vettore

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

{ printf(" dammi elemento di posto %d\n", I);

scanf("% d", &VET[I]);

}

Page 19: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

19

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// trova minimo parte non ordinata e scambia

for (I=0;I<(riemp-1);I++)

{MIN= VET[I];

POS=I;

for (J=(I+1);J<riemp;J++)

{ if (VET[J]<MIN)

{ MIN=VET[J];

POS=J;

}

}

temp= VET[I];

VET[I]= VET[POS]; // ovvero VET[I]=MIN

VET[POS]=temp;

}

// Stampa array ordinato

for (I= 0; I< riemp; I++) printf("% d\ n", VET[ I]);

}

Il programma in C

Ordinamento di array:

per selezione

Elementi di Informatica

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

... swapping ...

temp= VET[I];

VET[I]= VET[POS];

VET[POS]=temp;

Il programma in C

Ordinamento di array:

per selezione

Lo swapping

9

5

8

2

4

9 temp

2

5

8

9

4

9 temp

2

5

8

9

4

... I=0 ; POS=3; ...

temp= VET[0];

VET[0]= VET[3];

VET[3]=temp;

temp

2

5

8

2

4

9

9

5

8

2

4

Page 20: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

20

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

... swapping ...

ATTENZIONE A NON FARE:

VET[I]= VET[POS];

VET[POS]=VET[I];

E’ ERRATO !!!

Il programma in C

Ordinamento di array:

per selezione

Lo swapping

2

5

8

2

4

... I=0 ; POS=3; ...

VET[0]= VET[3];

VET[3]=VET[0];

9

5

8

2

4

Elementi di Informatica

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

// trova minimo parte non ordinata e scambia

for (I=0; I<(riemp-1); I++)

{ for (J=(I+1); J<riemp; J++)

{ if (VET[J]< VET[I])

{ temp = VET[I];

VET[I] = VET[J];

VET[J] = temp;

}

}

}

// Stampa array ordinato

for (I= 0; I< riemp; I++) printf("% d\ n", VET[ I]);

}

Il programma in C

Ordinamento di array:

per selezione

… un’altra soluzione …

Page 21: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

21

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Ordinamento di array: per selezione

9

5

8

2

4

I = 0

5

9

8

2

4

J = 1

5

9

8

2

4

J = 2

2

9

8

5

4

J = 3

2

9

8

5

4

J = 4 I = 1

2

9

8

5

4

J = 2

2

8

9

5

4

2

5

9

8

4

J = 3

2

4

9

8

5

J = 4

2

4

9

8

5

I=2

2

4

8

9

5

J = 3

2

4

5

9

8

J = 4

2

4

5

9

8

I = 3

2

4

5

8

9

J = 4

2

4

5

8

9

Elementi di Informatica

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

Aggiunta di elementi in un array non ordinato

Card = 12

28 10 3 31 40 33 57 93

Riemp = 8

Si vogliono aggiungere, in coda, i

valori:

Riemp = 9

Card = 12 14 525252

28 10 3 31 40 33 57 93 52

14 52

Definizione del problema: Si vogliono aggiungere uno o più elementi in

un array monodimensionale di interi già parzialmente riempito e

visualizzare lo array risultante.

Page 22: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

22

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Aggiunta di elementi in un array non ordinato

Riemp = 10

Card = 12 141414 525252

28 10 3 31 40 33 57 93 52 14

• prima di effettuare la ‘aggiunta’, controllare che il numero di elementi da

aggiungere non faccia superare la cardinalità

• ovvero si possono aggiungere al più (Card - Riemp) nuovi valori

• il riempimento finale sarà quello iniziale più la quantità di elementi

aggiunti

Elementi di Informatica

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

Aggiunta di elementi in un array non ordinato

Card = 12

28 10 3 31 40 33 57 93

Riemp = 8

Si vogliono aggiungere, in coda, i

valori:

Riemp = 9

Card = 12 14 525252

28 10 3 31 40 33 57 93 52

14 52

Definizione del problema: Si vogliono aggiungere uno o più elementi in

un array monodimensionale di interi già parzialmente riempito e

visualizzare lo array risultante.

Page 23: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

23

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Aggiunta di elementi in un array non ordinato

Definizione dei dati:

I: lo array monodimensionale parzialmente riempito; il

valore degli elementi che si vogliono aggiungere allo

array

Pi: il numero degli elementi da aggiungere non deve

superare la differenza tra la cardinalità ed il riempimento

già esistente

U: lo array monodimensionale con gli elementi aggiunti

Pu: il riempimento finale è non minore di quello iniziale

Elementi di Informatica

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

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo

riemp riempimento INT

.... ..... ...... ..... .....

Nome variabile Descrizione Tipo

Tabella delle variabili di algoritmo

Aggiunta di elementi in un array non ordinato

... LO STUDENTE COMPLETI LE TABELLE ....

Page 24: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

24

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

Allo array, di cardinalità n già parzialmente riempito con

riempimento R , si vogliono aggiungere i valori di K elementi;

si verifica che sia R + K <= n ed in tal caso si aggiungono i K

valori a partire dalla posizione R+1 .

Si visualizza lo array risultante.

Aggiunta di elementi in un array non ordinato

Elementi di Informatica

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

Aggiunta di elementi in un array non ordinato: il programma C

#include<stdio.h>

main()

{ const int cardinalita=50;

int i, J, conta1, riemp;

int VET[cardinalita] ;

// codice C per il riempimento array

.... .... ....

// richiesta di quanti altri valori si vogliono inserire

do

{ printf("Lo array ha cardinalità %d\n”, cardinalita);

printf("Lo array contiene %d elementi \n”, riemp);

printf(“Quanti elementi vuoi aggiungere? (Max %d )\n”, (cardinalita - riemp));

scanf(“%d”, &conta1);

} while (conta1>(cardinalita - riemp));

Page 25: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

25

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

{ printf ("immetti valore da aggiungere \n”);

scanf(“%d”, &VET[i]);

}

riemp=riemp+conta1;

// Stampa array

for (I= 0; I< riemp; I++) printf("% d n", VET[ I]);

}

Aggiunta di elementi in un array non ordinato: il programma C

Elementi di Informatica

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

Definizione del problema: Si vogliono aggiungere uno o più

elementi in un array monodimensionale di interi già parzialmente

riempito mantenendo l’ordinamento esistente (crescente) dello

array (senza doverlo riordinare) e visualizzare lo array risultante.

Aggiunta di elementi in un array ordinato

Definizione dei dati:

I: lo array monodimensionale parzialmente riempito ed

ordinato (crescente); il valore degli elementi che si vogliono

aggiungere allo array

Pi: il numero degli elementi da aggiungere non deve superare

la cardinalità; l’array è ordinato in senso crescente

U: lo array monodimensionale con gli elementi aggiunti

Pu: lo array risultante deve essere ordinato (crescente)

Page 26: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

26

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

14

Riemp = 9 Card = 12

3 10 14 28 31 33 40 57 93

141414 52

3 10 14 28 31 33 40 52 57 93

Riemp = 10 Card = 12 525252

Aggiunta di elementi in un array ordinato

Card = 12

3 10 28 31 33 40 57 93

Riemp = 8

VET

Elementi di Informatica

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

Aggiunta di elementi in un array ordinato

3 10 28 31 33 40 57 93

• bisogna ‘creare lo spazio’ per inserire il nuovo valore …

• Pos, posizione dell’array con il primo elemento con valore maggiore di quello da

aggiungere

• si verifica che la quantità degli elementi da aggiungere non superi la cardinalità

• si trasla (si ‘copia’) l’ultimo elemento nella prima successiva posizione libera ...

14

… si continuano a traslare gli altri elementi fino a

giungere all’elemento in Pos

Card = 12

3 10 28 31 33 40 57 93

Riemp = 8

3 10 28 31 33 40 57 93 93

Riemp = 9

… in C ...

Riemp++;

I=Riemp - 1;

VET[I]=VET[I-1];

Pos

Page 27: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

27

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Aggiunta di elementi in un array ordinato

3 10 28 31 33 40 57 93 93

Riemp = 9

3 10 28 31 33 40 57 57 93

3 10 28 31 31 33 40 57 93

3 10 28 28 31 33 40 57 93

Riemp = 9

…...

Riemp++;

for (I=(Riemp-1);I>Pos;I--) VET[I]=VET[I-1];

Elementi di Informatica

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

Aggiunta di elementi in un array ordinato

3 10 28 28 31 33 40 57 93

Riemp = 9

14

VET[Pos]= el_da_inserire;

3 10 14 28 31 33 40 57 93

Riemp = 9

Page 28: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

28

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Un errore tipico consiste nell’eseguire il ciclo a conteggio scandendo le posizioni in senso

crescente

Il risultato è il ricopiamento a destra dell’elemento che si trova in posizione inferiore:

for (i=pos; i<riemp;i++) vet[i+1]=vet[i]; // ERRORE !!!

Errore tipico

3 10 28 28 33 40 57 93

3 10 28 31 33 40 57 93

pos

3 10 28 28 28 40 57 93

Elementi di Informatica

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

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo

riemp riempimento INT

.... ..... ...... ..... .....

Nome variabile Descrizione Tipo

Tabella delle variabili di algoritmo

Aggiunta di elementi in un array non ordinato

... LO STUDENTE COMPLETI LE TABELLE ....

Page 29: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

29

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

• Allo array T[n], di cardinalità n già ordinatamente riempito con Riemp elementi, si vogliono

aggiungere i valori di K elementi;

• si verifica che sia Riemp + K <= n ; se la condizione è verificata:

• con un ciclo ripetitivo si immettono i nuovi K valori • al fine di mantenere l’ordinamento esistente nello array, i K valori vanno aggiunti

ciascuno nella giusta posizione in modo che sia verificato:

T[I-1] < Valore_da_Inserire < T[I]

• Si legge il nuovo valore da aggiungere

• Per trovare la posizione Pos in cui inserire il nuovo valore si usa un ciclo iterativo in

cui, partendo dalla prima posizione dello array, si verifica se

Valore_da_Inserire > T[I]

e si termina il ciclo quando questa condizione è vera (o quando sono stati esaminati

tutti i Riemp elementi dello array): il valore di I per cui la condizione è vera è la

posizione Pos dove andrà inserito il nuovo valore

• Bisogna traslare di una posizione tutti gli elementi T[J] per J = Riemp .. I usando un

ciclo ripetitivo, dopo aver incrementato di 1 Riemp:

Riemp++; for (I=(Riemp-1);I>Pos;I--) VET[I]=VET[I-1];

• Si visualizza lo array risultante.

Aggiunta di elementi in un array ordinato

Elementi di Informatica

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

Aggiunta di elementi in un array ordinato: il programma C

#include<stdio.h>

main()

{// codice per dichiarazioni variabili

………….

// codice per immissione di riemp elementi nell’array

// codice per ordinare in modo crescente gli elementi nell’array

………

// richiesta di quanti altri valori si vogliono inserire

do

{ printf("Lo array ha cardinalità %d\n”, cardinalita);

printf("Lo array contiene %d elementi \n”, riemp);

printf(“Quanti elementi vuoi aggiungere? (Max %d )\n”, (cardinalita - riemp));

scanf(“%d”, &conta1);

} while (conta1>(cardinalita - riemp));

Page 30: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

30

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

for (i=1; i<=conta1; i++) // immissione nuovi valori

{ printf("immetti un valore da aggiungere \n”);

scanf(“%d”, &el_da_inserire);

// trova posizione dove inserire

k=0;

while ((el_da_inserire>vet[k]) && (k<riemp)) k++;

pos=k;

riemp++;

// sposta elementi di una posizione

if (pos<riemp-1)

for (j=(riemp-1);j>pos;j--)

vet[j]=vet[j-1];

// inserisce il nuovo elemento

VET[pos]= el_da_inserire;

}

for (i= 0; i< riemp; i++) printf("% d\ n", vet[i]); // Stampa array

}

Elementi di Informatica

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

Aggiunta di elementi in un array ordinato

#include<stdio.h>

void leggivet(int Vet1[],int card1, int *riemp1);

void stampavet(int Vet1[ ],int card1);

void ordinavet (int Vet1[], int riemp);

main()

{ const int cardinalita=50;

int i, j, conta1, riemp, k, pos, el_da_inserire , VET[cardinalita] ;

leggivet(Vet, cardinalita, &riemp); stampavet(Vet, riemp);

ordinavet (Vet, riemp); stampavet(Vet, riemp);

// richiesta di quanti altri valori si vogliono inserire

do

{ printf("Lo array ha cardinalità %d\n”, cardinalita);

printf("Lo array contiene %d elementi \n”, riemp);

printf(“Quanti elementi vuoi aggiungere? (Max %d )\n”, (cardinalita - riemp));

scanf(“%d”, &conta1);

} while (conta1>=(cardinalita - riemp));

il programma C con

sottoprogrammi

Page 31: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

31

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

for (i=1; i<=conta1; i++) // immissione nuovi valori

{ printf("immetti un valore da aggiungere \n”);

scanf(“%d”, &el_da_inserire);

// trova posizione dove inserire

k=0;

while ((el_da_inserire>vet[k]) && (k<riemp)) k++;

pos=k;

riemp++;

// sposta elementi di una posizione

if (pos<riemp-1)

for (j=(riemp-1);j>pos;j--) vet[j]=vet[j-1];

VET[pos]= el_da_inserire; // inserisce nuovo elemento

}

stampavet(Vet, riemp);

}

Elementi di Informatica

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

void leggivet(int Vet1[],int card1, int *riemp1)

{ int I;

do

{printf("immetti riemp\n");

scanf("%d",&(*riemp1));

}

while(*riemp1>card1);

for (I=0;(I<*riemp1); I++)

{printf("immetti Vet[ %d ]= \n",I) ;

scanf("%d", &Vet1[I]);

}

}

void stampavet(int Vet1[ ],int card1)

{ int I;

for (I=0;I<card1; I++)

printf("Vet1[ %d ]= %d \n”, I, Vet1[I] );

}

void ordinavet(int Vet1[ ],.............)

LO STUDENTE DEFINISCA IL

SOTTOPROGRAMMA PER ORDINARE

IN MODO CRESCENTE UN ARRAY

MONODIMENSIONALE

Page 32: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

32

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Definizione del problema: Si vuole verificare se in un array

ordinato in senso crescente esiste un elemento con un dato valore

e se esso esiste si vuole conoscere la sua posizione.

Ricerca di un elemento in un array ordinato

Definizione dei dati:

I: lo array monodimensionale ordinato; il valore dell’elemento

che si vuole cercare

Pi: lo array è ordinato in senso crescente

U: la posizione dell’elemento con valore pari a quello cercato se

esso esiste nello array

Pu: il contenuto dello array resta immutato

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

Viene letto il valore da cercare;

viene considerato l’elemento dello array (ordinato in senso crescente) in

posizione centrale (rispetto al riempimento);

se il dato da cercare è ugale a quello centrale la ricerca è terminata

altrimenti:

• se il dato da cercare è minore di quello centrale viene applicato lo stesso

algoritmo alla prima parte dello array, se questa ha almeno un elemento,

altrimenti

• se il dato da cercare è maggiore di quello centrale viene applicato lo

stesso algoritmo alla seconda parte dello array, se questa ha almeno un

elemento

Si continua fin quando un elemento centrale è pari a quello cercato o

nessuna parte contiene più elementi

Ricerca di un elemento in un array ordinato

Page 33: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

33

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

93

Posizione elemento centrale:

P=(Sup+Inf)/2=5

3 10 28 31 33 40 57 93 98

Riemp = 9 Card = 12

Inf = 1 Sup = 9

3 10 28 31 333 10 28 31 333 10 28 31 33 40 57 93 98

Inf = 6 Sup = 9

Posizione elemento centrale:

P=(Sup+Inf)/2=8

93

3 10 28 31 333 10 28 31 333 10 28 31 33 40 5740 5740 57 93 98

Inf = 8 Sup = 9

93

Posizione elemento centrale:

P=(Sup+Inf)/2=7

=?

=?

=?

Deve sempre essere Inf <= Sup

Se Inf >=Sup l’elemento non esiste nello array

Elementi di Informatica

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

#include<stdio.h>

#include <..… /leggivet.h>

#include <….. /stampavet.h>

#include <….. /ordinavet.h>

main ()

{ const card=50;

int Vet[card], I, riemp, elem, trovato, centro, inf, sup;

leggivet(Vet, card, &riemp);

stampavet (Vet, riemp);

ordinavet(Vet, riemp);

// immissione valore da ricercare

printf("immetti valore da cercare \n”);

scanf(“%d”, &elem);

trovato=0;

inf=0; sup=riemp - 1;

Ricerca di un elemento in un array ordinato Il programma C strutturato in sottoprogrammi

Page 34: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

34

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// ricerca binaria

while ((inf <= sup) && (trovato = = 0))

{

centro = (inf + sup) / 2; // posizione centrale

if (Vet[centro] == elem)

trovato = 1; // permette di uscire dal ciclo

else if(Vet[centro] > elem)

sup = centro -1; // la ricerca continua nella prima metà

else inf = centro+1; // la ricerca continua nella seconda metà

}

if(trovato)

printf(“elemento trovato in posizione: %d \n”, centro);

else printf(“elemento non trovato \n”);

}

Elementi di Informatica

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

#include <stdio.h>

void leggivet(int Vet1[],int card1, int *riemp1)

{ int I;

do

{printf("immetti riemp\n");

scanf("%d",&(*riemp1));

}

while(*riemp1>card1);

for (I=0;(I<*riemp1); I++)

{printf("immetti Vet[ %d ]= \n",I) ;

scanf("%d", &Vet1[I]);

}

}

#include <stdio.h>

void stampavet(int Vet1[ ],int card1)

{ int I;

for (I=0;I<card1; I++)

printf("Vet1[ %d ]= %d \n”, I, Vet1[I] );

}

void ordinavet(int Vet1[ ], int riemp1)

{

...............

}

Page 35: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

35

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema:

Scrivere, producendo la necessaria documentazione, un programma in

linguaggio C che dato una stringa di 30 caratteri:

• consente di riempire completamente la stringa con valori che sono le sole

vocali dell’alfabeto (‘a’, ‘e’, ‘i’, ‘o’,’u’);

• conta quante volte ciascuna vocale compare nella stringa e stampa il

risultato.

• cancella tutte le vocali ‘o’ compattando, ad ogni cancellazione, la stringa

(lo array che la contiene) e stampa la stringa risultante.

Elementi di Informatica

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

Esempio

Definizione dei dati del problema:

I: il valore di ciascun carattere dello array.

Pi: elementi dello array devono essere una delle vocali ‘a’, ‘e’, ‘i’,

‘o’,’u’.

U: Numero dei caratteri ‘a’, ‘e’, ‘i’, ‘o’,’u’ presenti nello array; lo

array compattata

Pu: Nello array non ci sono vocali ‘o’.

Page 36: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

36

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome Variabile Descrizione Tipo

VET[i] Elemento Array

monodimensionale

char

Nome Variabile Descrizione Tipo

contaA, contaE,

contaI, contaO,

contaU

Contatori del numero di

occorrenze di ciascuna

vocale ‘a’, ‘e’, ‘i’, ‘o’,’u’

in VET

INT

VET Array compattato dopo la

eliminazione della vocale

‘o’

char

Tabella delle variabili di Ingresso:

Tabella delle variabili di Uscita:

Elementi di Informatica

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

Esempio

Nome Variabile Descrizione Tipo

riemp riempimento dello

array VET

INT

i, j Indice di controllo di

ciclo

INT

Tabella delle variabili di algoritmo:

Page 37: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

37

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

Si riempe lo array VET controllando che si immettano le sole vocali ‘a’, ‘e’,

‘i’, ‘o’,’u’.

Si azzerano i contatori delle occorrenze totali di ciascuna vocale.

Con un ciclo ripetitivo si effettua una visita completa di VET e, usando una

struttura ‘switch’, si contano le occorrenze di ciascuna vocale

incrementando di 1 il corrispondente contatore.

Con un ciclo iterativo di indice i si visita lo array VET: se l’elemento

visitato è pari alla vocale ‘o’, con un ciclo ripetitivo, di indice j iniziante

dalla posizione dove si trova la ‘o’ e terminante al penultimo elemento di

VET, si cancella la ‘o’ e si compatta VET con l’istruzione VET[j]=VET[j+1]

e si decrementa di 1 il suo riempimento; dopo la compattazione si riprende

la visita di VET dalla stessa posizione in cui si è trovata la ‘o’.

Si stampa lo array VET compattato

Elementi di Informatica

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

Esempio #include<stdio.h>

main ( )

{int const card=31;

char VET[card];

int i, j, contaA, contaE, contaI, contaO, contaU, riemp;

// Si inizializzano a 0 i contatori e la variabile i

i=0;

contaA=0;

contaE=0;

contaI=0;

contaO=0;

contaU=0;

/* Si riempie VET verificando che siano immesse le sole vocali ‘a’,

‘e’, ‘i’, ‘o’,’u’ e contano le loro occorrenze */

while (i<card-1)

{ printf(" Immetti una vocale in VET al posto %d\n", i);

scanf("\n%c", &VET[i]);

Page 38: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

38

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

switch (VET[i])

{

case 'a': i++; contaA++; break;

case 'e': i++; contaE++; break;

case 'i': i++; contaI++; break;

case 'o': i++; contaO++; break;

case 'u': i++; contaU++; break;

default: printf("NON Immessa una vocale!\n"); break;

}

}

VET[card-1]=‘\0’;

// si stampano le occorrenze delle vocali in VET

printf("Vocale A presente %d volte in VET \n", contaA);

printf("Vocale E presente %d volte in VET \n", contaE);

printf("Vocale I presente %d volte in VET \n", contaI);

printf("Vocale O presente %d volte in VET \n", contaO);

printf("Vocale U presente %d volte in VET \n", contaU);

Elementi di Informatica

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

Esempio

// Si cercano le ‘o’ in VET, le si cancellano compattando lo array

riemp=card;

i=0;

while (i<riemp-1)

{ if (VET[i]=='o')

{for (j=i; j<riemp-2; j++)

VET[j]=VET[j+1];

riemp--;

}

else i++;

}

for (j=0; j<riemp-1; j++)

printf("VET[%d] = %c \n", j, VET[j]);

}

Page 39: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

39

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 78

Esempio

Nome variabile Descrizione Tipo

MAT array bidimensionale di interi INT

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

Page 40: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

40

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 80

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

}

Page 41: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

41

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 82

Page 42: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

42

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

#include <stdio.h>

main ()

{const cardriga=3, cardcol=4;

int Vett[]={3,6,12,45}; // lo array ha cardinalità 4, pari al numero di valori che lo inizializzano

int MAT[cardriga] [cardcol] ={{1,7, 22, 33}, {2,1, 44, 55}, {66, 77, 88,5}}

int I, J;

// Stampa valori elementi dell’array Vett

for(I=0;I<4;I++) printf(“Vett[%d]=%d \n”, I, Vett[i]);

// Stampa valori elementi dell’array MAT

for (I=0; I<cardriga, I++)

{ for J=0; J<cardcol, J++)

printf(“ %d – “, MAT[i][j]);

printf(“\n”);

}

}

Esempio ... inizializzare un array quando lo si dichiara .....

Elementi di Informatica

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

Esempio

Definizione del problema:

Trovare il valore massimo tra gli elementi di un array bidimensionale, di 5 righe e 7

colonne, ed indicarne la posizione (riga e colonna)

Definizione della specifica del programma:

I: l’array bidimensionale di numeri interi; il valore di ciascun elemento

Pi: nessuna

U: la posizione dell’elemento con valore massimo

Pu: nessuna

Descrizione del metodo di elaborazione:

Si genera in modo random il valore di ciascun elemento della matrice. Si pone il massimo

pari al primo elemento dell’array (elemento posto nella prima riga e prima colonna), si

effettua una visita completa (scandendolo per riga e colonne) della matrice e si verifica se

ciascun altro elemento dell’array è superiore al massimo fissato, in tal caso si aggiorna il

valore del massimo e della posizione in cui esso si trova nell’array

Page 43: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

43

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

MAT array bidimensionale di interi INT

MAT(I,J) elemento dell’array INT

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

MAX Elemento con il valore del massimo INT

RIGA Riga dove è contenuto MAX INT

COL Colonna dove è contenuto MAX INT

Tabella delle variabili di uscita

Elementi di Informatica

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

#include <stdio.h>

#include <stdlib.h>

#include<time.h>

main ()

{ // Max_in_array_bidimensionale;

const cardriga=5, cardcol=7;

int MAT[cardriga] [cardcol], I, J, MAX;

int RIGA, COL;

// Riempimento array in modo random

srand(time(0));

for (I=0; I<cardriga; I++)

for (J=0; J<cardcol; J++)

MAT [I][J]=rand();

//Stampa array

for (I=0; I<cardriga; I++)

for (J=0; J<cardcol; J++)

printf("MAT[%d, %d] = %d \n", I, J, MAT[I][J]);

// Cerca il valore massimo nello array

RIGA=0; COL=0; MAX = MAT[0][0];

for (I=0; I<cardriga; I++)

for (J=0; J<cardcol; J++)

{ if (MAT[I][J]>MAX)

{ MAX=MAT[I][J];

RIGA=I; COL=J;

}

}

printf (“il massimo = %d si trova nella posizione

riga %d e colonna %d \n", MAX, RIGA, COL);

}

Esempio - il programma

Page 44: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

44

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Definizione del problema: Verificare se in un array bidimensionale di

interi, composto da 5 righe e 7 colonne, esiste un determinato valore dato in

input da tastiera. Se questo valore esiste indicare la posizione, riga e

colonna, dell’elemento che lo contiene. L’elaborazione termina appena

l’elemento è trovato.

Definizione dei dati del problema:

I: il valore di ciascun elemento; il valore da cercare

Pi: il numero degli elementi da inserire non può essere maggiore

della cardinalità dell’array

U: la posizione, indici di riga e colonna, dell’elemento con valore

pari a quello cercato

Pu: se il valore è stato trovato gli indici della sua posizione inserire

non possono essere maggiore delle rispettive cardinalità di

riga/colonna

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

MAT array bidimensionale di interi INT

MAT(I,J) elemento dell’array INT

VAL valore da cercare nell’array INT

Tabella delle variabili di ingresso

Nome variabile Descrizione Tipo

TROVATO Indica se esiste un elemento pari a VAL LOGICAL

I, J Posizione dove è contenuto VAL INT

Tabella delle variabili di uscita

Page 45: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

45

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

Con due cicli ripetitivi innestati, si legge, in ordine di riga, il

valore da assegnare a ciascun elemento dello array.

Si immette il valore da cercare nell’array bidimensionale.

Si verifica se tale valore esiste nello array:

se esiste viene visualizzata la posizione dell’elemento che

lo contiene;

se non esiste viene visualizzata la scritta ‘il valore indicato

non esiste nello array’.

Elementi di Informatica

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

#include <stdio.h>

#define col 7

void leggimat(int Mat1[][col],int cardr, int cardc);

void stampamat(int Mat1[][col],int cardr, int cardc);

main ()

{int const cardr=5;

int const cardc=col;

int MAT[cardR] [cardC], i,j, VAL, trovato;

leggimat(Mat,cardr,cardc);

stampamat(Mat,cardr,cardc);

// Immissione valore da cercare

printf(“Immetti il valore da cercare\n”);

scanf("%d", &VAL);

Esempio - il programma C

Page 46: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

46

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma C

// Cerca se il valore immesso esiste nello array (ricerca lineare)

trovato=0; i=0;

while ((trovato==0) && ( i<cardR))

{ j=0;

while ((trovato==0) && ( j<cardC))

{trovato=(MAT[i][j]==VAL);

j++;}

i++;

}

if (trovato != 0)

printf(“valore immesso %d in posizione %d, %d\n”, VAL, i-1, j-1);

else

printf(“il valore indicato %d non esiste nello array\n”, VAL);

}

Elementi di Informatica

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

Esempio - il programma 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++)

for (J=0;J<cardc;J++)

printf("Mat1[%d][%d]= %d \n", I,J, Mat1[I][J]);

}

Page 47: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

47

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema: Calcolare la trasposta di una matrice

quadrata di interi

Definizione dei dati del problema:

I: lo array bidimensionale; il valore di ciascun elemento dello

array

Pi: il numero delle righe deve essere uguale a quello delle

colonne

U: l’array bidimensionale pari al trasposto di quello in ingresso

Pu: nessuna

Descrizione del metodo di elaborazione: Si legge, in ordine di riga,

il valore di ciascun elemento dello array. Si verifica che il numero di

colonne sia uguale al numero di righe. Si calcola il valore di ciascun

elemento della matrice trasposta MATTR(I,J)=MAT(J,I). Stampare la

matrice trasposta risultante.

Elementi di Informatica

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

0

1

2

3

4

0 1 2 3 4

23 47 63 96 8

27 66 23 44 567

...

...

84

... 15

32 ...

... MAT

0

1

2

3

4

0 1 2 3 4

23 27 84 15 32

47 66

23

44

63

... 96

8 567

... MATTR

Page 48: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

48

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

MAT prima matrice di interi INT

MAT(I,J) elemento della prima matrice INT

Nome variabile Descrizione Tipo

MATTR Matricetrasposta di MAT INT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{// Trasposta di una matrice quadrata

const card=5;

int MAT[card] [card], i,j,MATTR [card] [card];

// Legge in input tutti gli elementi della matrice MAT

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

for (j= 0; j< card; j++)

{

printf(" dammi el. (%d , %d) di MAT\n", i,j);

scanf("%d", &MAT[i][j]);

}

// Visualizzazione valori elementi matrice MAT

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

{ printf(“\n”);

for(j=0; j<card; j++)

printf(“MAT(%d, %d) = %d - ”, i,j,MAT[i] [j]);

}

Page 49: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

49

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma

// Calcola matrice trasposta

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

for (j= 0; j< card; j++)

MATTR [i][j]=MAT[j][i];

// Visualizzazione valori elementi matrice trasposta

printf(“\n\n MATRICE TRASPOSTA \n\n”);

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

{ printf(“\n”);

for(j=0; j<card; j++)

printf(“MATTR(%d, %d) = %d - ”, i,j,MATTR[i] [j]);

}

}

Elementi di Informatica

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

Esempio

Definizione del problema: Calcolare la trasposta di una matrice di interi

(anche se non quadrata)

Definizione dei dati del problema:

I: lo array bidimensionale; il valore di ciascun elemento dello array

Pi: nessuna

U: l’array bidimensionale pari al trasposto di quello in ingresso

Pu: Il numero di righe della matrice trasposta è pari al numero di

colonne della matrice in input ed il numero di colonne della matrice

trasposta è pari al numero di righe della matrice in input

Descrizione del metodo di elaborazione: Si legge, in ordine di riga, il

valore di ciascun elemento dello array in input.

Si calcola il valore di ciascun elemento della matrice trasposta

...... LO STUDENTE DEFINISCA L’ALGORITMO ...

Si stampa la matrice trasposta risultante.

Page 50: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

50

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

23 27 44 55 32

66 88 54 23 11

98 78 46 32 66

23 66 98

27 88 78

44 54 46

55 23 32

32 11 66

MAT

MATTR

Esempio

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{// Calcola la trasposta di una matrice

const cardR=4, cardC=3;

int MAT[cardR][cardC], i,j;

int MATTR[cardC][cardR]; // la trasposta ha le cardinalità invertite

// Legge in input tutti gli elementi della matrice

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

}

// Visualizzazione valori elementi matrice MAT

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

{printf("\n");

for(j=0;j<cardC;j++)

printf("MAT(%d, %d) = %d - ", i,j,MAT[i] [j]);

}

Page 51: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

51

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma

// Calcola matrice trasposta

for (i= 0; i< cardC; i++) // gli indici dei due cicli sono ‘invertiti’ rispetto a

for (j= 0; j< cardR; j++) // prima per essere consistenti con le cardinalità

// della trasposta

MATTR [i][j]=MAT[j][i];

// Visualizzazione valori elementi matrice trasposta

printf("\n\n MATRICE TRASPOSTA:\n");

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

{printf("\n");

for(j=0;j<cardR;j++)

printf("MATTR(%d, %d) = %d - ", i,j,MATTR[i][j]);

}

}

Elementi di Informatica

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

Definizione del problema:

Dato un array monodimensionale A di interi, di 40 elementi scrivere,

producendo la necessaria documentazione, un programma che permette di:

• Effettuare il riempimento, tramite input da tastiera, dello intero array

con valori tutti pari;

• Calcolare la media dei valori inseriti nello array e contare il numero

degli elementi con valore non superiore a quello della media calcolata e

quello degli elementi con valore superiore a quello di tale media.

Esercizio

Page 52: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

52

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array A.

Pi: elementi di A devono essere numeri pari.

U:

media dei valori in A;

numero di elementi di A con valore non superiore alla media;

numero di elementi di A con valore superiore alla media;

Pu: numero di elementi di A con valore non superiore alla media maggiore

di zero; somma del numero di elementi di A con valore non superiore alla

media con il numero di elementi di A con valore superiore alla media pari

alla cardinalità dello array

Elementi di Informatica

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

Nome Variabile Descrizione Tipo

A[i] Elemento Array monodimensionale INT

Tabella delle variabili di Ingresso

Nome Variabile Descrizione Tipo

containf numero di elementi di A con valore inferiore o uguale alla

media

INT

contasup numero di elementi di A con valore superiore alla media INT

media media dei valori degli elementi in A FLOAT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

somma sommatoria di elementi di A INT

i Indice di controllo di ciclo INT

Tabella delle variabili di algoritmo:

Page 53: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

53

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

Si azzerano i valori delle variabili somma, containf, contasup.

Si riempie, con un ciclo ‘for’, completamente lo array A verificando che si immettano solo

numeri pari, ripetendo l’immissione, con un ciclo ‘do ... while’, finché non è immesso non è

immesso un valore pari.

Man mano che si immettono i valori validi di A[i] si incrementa il valore di somma del

valore valido immesso.

Alla uscita dal ciclo ‘for’ per il riempimento di A, si calcola la media dei valori immessi

dividendo il valore di somma per la cardinalità di A, facendo la conversione di tipo da

intero a reale.

Con un nuovo ciclo ‘for’ si calcolano i valori di containf, contasup , confrontando

ciascun elemento di A con il valore di media: se A[i] è inferiore o uguale alla media si

incrementa di 1 il valore di containf, altrimenti quello di contasup .

Si stampano i valori di containf e contasup ottenuti.

Elementi di Informatica

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

#include<stdio.h>

main()

{const int card=40;

int i, somma, containf, contasup;

int A[card];

float media;

somma=0; containf=0; contasup=0;

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

{do

{printf(" dammi elemento A[%d] \n", i);

scanf("\n%d", &A[i]);

}

while((A[i]%2!=0));

somma=somma+A[i];

}

Page 54: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

54

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

printf(" A[%d]= %d \n", i, A[i]);

media=(float)somma/(float)card;

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

{ if (A[i]<=media) containf++;

else contasup++;

}

printf ("Media dei valori di A = %f\n", media);

printf ("Numero elementi di A con valore non superiore alla

media = %d\n", containf);

printf ("Numero elementi di A con valore superiore alla

media= %d\n", contasup);

}

Elementi di Informatica

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

Esempio

Definizione del problema:

Data una matrice quadrata MAT di interi di 20 righe e 20 colonne si vuole

determinare se essa è simmetrica (rispetto alla diagonale principale).

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array bidimensionale MAT; il

riempimento di riga dello array, il riempimento di colonna dello array.

Pi: il riempimento di riga e di colonna non può essere maggiore delle

rispettive cardinalità di riga e di colonna. I riempimenti di righe e colonne

devono essere uguali

U: L'indicazione che la matrice MAT è simmetrica o meno.

Pu: nessuna

Page 55: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

55

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo MAT Array bidimensionale INT

riemp Riempimento di riga e di colonna INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo simmetrica Se pari a 1 indica che la MAT INT

è una matrice simmetrica

Elementi di Informatica

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

Esempio

Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

j Indice di controllo di ciclo INT

k Indice di controllo di ciclo INT

Page 56: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

56

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Descrizione del metodo di elaborazione:

E' immesso il riempimento di riga e di colonna dello array MAT, verificando che esso sia

non maggiore della cardinalità di riga e di colonna.

Si legge, tramite due cicli innestati, il valore di ciascun elemento di MAT.

Si pone il valore della variabile simmetrica pari a 'vero' (in C pari ad 1); tramite due

cicli innestati si verifica la simmetria della matrice confrontando gli elementi al di sopra

della diagonale principale con quelli al di sotto di essa in modo che per essi sia verificata la

condizione MAT[i][j]==MAT[j][i] e si aggiorna di conseguenza il valore della

variabile simmetrica, facendo un'operazione di AND logico con il valore che essa

aveva in precedenza.

Alla fine del ciclo si analizza il valore della variabile simmetrica: se esso è pari ad 1, la

matrice MAT è simmetrica altrimenti non lo è.

E’ stampato il risultato.

Elementi di Informatica

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

Esempio

0,0 0,1 0,2 0,3

1,0 1,1 1,2 1,3

2,0 2,1 2,2 2,3

3,0 3,1 3,2 3,3

Page 57: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

57

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{

const card=20;

int MAT[card][card], i,j, k, riemp, simmetrica;

do

{ printf("Quante Righe e Colonne vuoi inserire?\n");

scanf("%d", &riemp);

}

while (riemp>card);

// Legge in input gli elementi della matrice

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

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

{

printf(" dammi el. (%d , %d) di MAT\n", i,j);

scanf("%d", &MAT[i][j]);

}

Elementi di Informatica

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

// Verifica se la Matrice è simmetrica

// esce dal ciclo appena la condizione MAT[i][j]==MAT[j][i] non è verificata

simmetrica=1;

i=0;

while ((simmetrica==1)&&(i<riemp))

{ j=i+1; // esamina solo gli elementi al di sopra della diagonale principale

// e li confronta con quelli al di sotto di essa in posizione simmetrica

while ((simmetrica==1)&&(j<riemp))

{

simmetrica=(simmetrica && (MAT[i][j]==MAT[j][i]));

j++;

}

i++;

}

if (simmetrica==1) printf("La Matrice MAT è simmetrica\n");

else

printf("La Matrice MAT NON è simmetrica\n");

}

Esempio - il programma

Page 58: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

58

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Definizione del problema:

Data una matrice quadrata MAT di interi di 20 righe e 20 colonne si vuole

determinare se in essa esistono elementi il cui valore è pari alla somma dei

fattoriali degli indici di riga e di colonna ed in tal caso indicare quanti sono

tali elementi, la loro posizione ed il loro valore.

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array bidimensionale MAT; il

riempimento di riga dello array, il riempimento di colonna dello array.

Pi: il riempimento di riga e di colonna non può essere maggiore delle

rispettive cardinalità di riga e di colonna.

U: il numero di elementi di MAT il cui valore è pari alla somma dei

fattoriali degli indici di riga e di colonna, il valore di tali elementi, la

posizione di tali elementi.

Pu: nessuna

Elementi di Informatica

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

Esempio Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo MAT Array bidimensionale INT

riemp Riempimento di riga e di colonna INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo contafatt Numero di elementi di MAT il INT

cui valore è pari alla somma dei fattoriali

degli indici di riga e di colonna

MAT(i,j) Elementi di MAT il cui valore è pari INT

alla somma dei fattoriali degli indici

di riga e di colonna

i, j Indici indicanti la posizione degli INT

elementi di MAT il cui valore è pari alla somma

dei fattoriali degli indici di riga e di colonna

Page 59: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

59

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

j Indice di controllo di ciclo INT

k Indice di controllo di ciclo INT

ifatt Fattoriale dell'indice di riga i INT

jfatt Fattoriale dell'indice di colonna j INT

Elementi di Informatica

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

Esempio Descrizione del metodo di elaborazione:

E' immesso il riempimento di riga e di colonna dello array MAT, verificando che esso sia

non maggiore della cardinalità di riga e di colonna.

Si legge, tramite due cicli innestati, il valore di ciascun elemento di MAT.

Si pone pari a zero il valore della variabile contafatt; tramite due cicli innestati si

effettua una visita totale della matrice MAT e per ogni elemento si verifica se è vera la

condizione MAT[i][j]= i! + j!, dove i! e j! sono i valori del fattoriale dell'indice

di riga e di colonna a quel passo del ciclo, ed in tal caso si incrementa di 1 il valore di

contafatt e si stampa il valore di MAT[i][j] verificante la condizione e quelli degli

indici i e j

Alla fine della visita totale di MAT è stampato il valore di contafatt.

Page 60: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

60

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{

const card=20;

int MAT[card][card], i,j, k, riemp, ifatt, jfatt, contafatt;

do

{ printf("Quante Righe e Colonne vuoi inserire?\n");

scanf("% d", &riemp);

}

while (riemp>card);

// Legge in input gli elementi della matrice

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

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

{

printf(" dammi el. (%d , %d) di MAT\n", i,j);

scanf("%d", &MAT[i][j]);

}

Elementi di Informatica

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

// Verifica se MAT(i,j) = i!+j!.

contafatt=0;

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

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

{

// Calcola fattoriale di i

ifatt=1;

for(k=2;k<=i;k++) ifatt=ifatt*k;

// Calcola fattoriale di j

jfatt=1;

for(k=2;k<=j;k++) jfatt=jfatt*k;

if (MAT[i][j] == (ifatt + jfatt))

{ contafatt++;

printf("L'elemento in posizione %d, %d uguale alla somma dei fattoriali

degli indici %d\n", i, j, MAT[i][j]);

}

}

printf("Sono stati trovati %d elementi di MAT con valore pari alla somma dei fattoriali

degli indici\n", contafatt);

}

Esempio - il programma

… una prima versione, poco efficiente …

Page 61: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

61

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Verifica se MAT(i,j) = i!+j!.

contafatt=0;

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

{// Calcola fattoriale di i

ifatt=1;

for(k=2;k<=i;k++) ifatt=ifatt*k;

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

{// Calcola fattoriale di j

jfatt=1;

for(k=2;k<=j;k++) jfatt=jfatt*k;

if (MAT[i][j] == (ifatt + jfatt))

{ contafatt++;

printf("L'elemento in posizione %d, %d uguale alla somma dei fattoriali

degli indici %d\n", i, j, MAT[i][j]);

}

}

}

printf("Sono stati trovati %d elementi di MAT con valore pari alla somma dei fattoriali

degli indici\n", contafatt);

}

Esempio - il programma … una versione più efficiente …

… il fattoriale dell’indice di riga è calcolato

solo ad ogni cambio di riga …

Elementi di Informatica

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

int MAT[card] [card], …., ifat, ….;

longint fatt(int i)

{ int k, ifatt=1;

for(k=2;k<=i;k++) ifatt=ifatt*k;

return ifatt; }

…………..

// Verifica se MAT(i,j) = i!+j!.

contafatt=0;

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

{ ifat=fatt(i);

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

{ if (MAT[i][j] == (ifat + fatt(j)))

{ contafatt++;

printf(“Elemento in posizione %d, %d uguale alla somma dei fattoriali

degli indici %d\n", i, j, MAT[i][j]); }

}

}

printf("Sono stati trovati %d elementi di MAT con valore pari alla somma dei fattoriali

degli indici\n", contafatt);

}

Esempio - il programma … una versione più elegante …

… con i sottoprogrammi …

Page 62: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

62

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema:

Scrivere, producendo la necessaria documentazione, un programma che,

dato un array bidimensionale MAT di caratteri, con 10 righe e 10 colonne:

(1) Consente il riempimento dello array con i soli caratteri ‘*’, ‘+’, ‘-‘;

(2) conta, e stampa, quante volte ciascuno dei suddetti caratteri è

presente in ogni riga dello array, e calcola, e stampa, la percentuale totale

della presenza di ciascun carattere nell’intero array;

(3) Ricopia in un array monodimensionale VET di dimensioni

opportune tutti i caratteri di MAT inserendo prima tutti i caratteri ‘+’, poi

tutti gli ‘*’ e poi tutti i ‘-‘

Elementi di Informatica

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

Esempio

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array MAT.

Pi: elementi di MAT devono essere uno dei caratteri ‘*’, ‘+’, ‘-‘.

U: Numero dei caratteri ‘*’, ‘+’, ‘-‘ in ciascuna riga, percentuale di

presenza dei caratteri ‘*’, ‘+’, ‘-‘ in MAT, lo array VET.

Pu: Nello array VET ci sono prima tutti i caratteri ‘+’, poi gli ‘*’ e poi i ‘-‘.

Page 63: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

63

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome Variabile Descrizione Tipo

MAT[i][j] Elemento Array bidimensionale CHAR

Tabella delle variabili di Ingresso

Nome Variabile Descrizione Tipo

sommaAst, sommaPiu,

sommaMeno

Numero di caratteri ‘*’, ‘+’,

‘-‘ in ciascuna riga di MAT INT

percAst, percPiu,

percMeno

Percentuale di caratteri

‘*’, ‘+’, ‘-‘ in MAT

FLOAT

VET Array con carrteri

ordinati come richiesto

INT

Tabella delle variabili di Uscita

Elementi di Informatica

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

Esempio

Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

totAst, totPiu,

totMeno

Occorrenze totali di

*, +, - in MAT

INT

i, j Indice di controllo di

ciclo

INT

kAst, kPiu, kMeno Indice di posizione INT

Page 64: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

64

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

Si riempie la matrice MAT verificando che si immettano solo i caratteri

richiesti.

Si azzerano i contatori delle occorrenze totali.

Con due cicli for innestati si contano quanti caratteri *,+,- ci sono in ogni

riga, azzerando i contatori ogni qualvolta si cambia riga e stampando il

risultato per ogni riga, ed il numero totale di occorrenze di tali caratteri in

MAT.

Alla fine dell’esecuzione dei due cicli for si calcolano le percentuali di

presenza delle occorrenze.

Infine si riempie lo array VET: con due cicli for si leggono gli elementi di

MAT ed in base al loro valore essi sono inseriti nello array VET,

conoscendo le occorrenze totali di ciascun carattere.

Elementi di Informatica

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

Esempio

#include<stdio.h>

main()

{

const int cardR=10;

const int cardC=10;

int i, j, sommaAst, sommaPiu, sommaMeno, totAst, totPiu, totMeno,

kAst, kPiu, kMeno;

char mat[cardR][cardC], VET[(cardR*cardC)];

float percMeno, percAst, percPiu;

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

for(j=0;j<cardC;j++)

{do

{printf(" dammi elemento mat[%d][ %d] \n", i,j);

scanf("\n%c", &mat[i][j]);

}

while((mat[i][j]!='*') && (mat[i][j]!='+') && (mat[i][j]!='-'));

}

Page 65: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

65

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio totAst=0; totPiu=0; totMeno=0;

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

{sommaAst=0; sommaPiu=0; SommaMeno=0;

for(j=0;j<cardC;j++)

{ switch (mat[i][j])

{case '*': totAst++; sommaAst++; break;

case '+': totPiu++; sommaPiu++; break;

case '-': totMeno++; sommaMeno++; break;

}

}

printf(“riga %d contiene %d *, %d +, e %d -\n", sommaAst,

sommaPiu, sommaMeno);

}

printf("\n \n Mat contiene %d *, %d +, e %d -\n\n", totAst, totPiu,

totMeno);

percAst= ((float)totAst/(float)(cardR*cardC))*100;

percPiu = ((float)totPiu/(float)(cardR*cardC))*100);

percMeno = ((float)totMeno/(float)(cardR*cardC))*100;

printf("Percentuale di * = %f\n", percAst);

printf("Percentuale di + = %f\n", percPiu);

printf("Percentuale di - = %f\n", percMeno);

Elementi di Informatica

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

Esempio kAst=0; kPiu=0; kMeno=0;

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

for(j=0;j<cardC;j++)

{ switch (mat[i][j])

{case '+': VET[kPiu]=mat[i][j];kPiu++; break;

case '*': VET[totPiu+kAst]=mat[i][j];kAst++; break;

case '-': VET[(totPiu+totAst)+kMeno]=mat[i][j];kMeno++; break;

}

}

printf("\n\n");

for(i=0;i<(cardR*cardC);i++)

printf(" VET[%d]= %c \n", i, VET[i]);

}

… … UNA SOLUZIONE PIU’ ‘FURBA’ … … …

kAst=0; kPiu=0; kMeno=0;

for(i=0;i<totPiu;i++) VET[i]='+' ;

for(i=totPiu;i<totAst;i++) VET[i]='*' ;

for(i=totAst;i<card;i++) VET[i]='-' ;

… … …

Page 66: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

66

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 132

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

Page 67: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

67

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 134

#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

Page 68: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

68

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

Elementi di Informatica

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

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

Page 69: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

69

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

Elementi di Informatica

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

Esempio - il programma C

Page 70: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

70

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

…………………

// Carica lo array dell’agenda leggendo dal file

{Fmio=fopen("agenda.txt","r");

if (!feof(Fmio))

{ i=0;

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

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

while (!feof(Fmio))

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

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

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

i++;

fscanf(Fmio,"%20s %20s %15s",&pers2[i].cogno,

&pers2[i].nome, &pers2[i].tel);

}

printf("FINE CARICAMENTO\n");

}

else printf("RAGGIUNTA FINE FILE");

fclose(Fmio);

}

Esempio

140

Definizione del problema: In un file sequenziale in cui è registrata una agenda

telefonica (cognome, nome, n.ro di telefono), si vogliono cercare i dati di una persona in

base al cognome dato in input.

Definizione della specifica del programma:

I: il file di testo registrante l’agenda telefonica, il cognome della persona da

cercare

Pi: nessuna

U: il cognome, il nome ed il numero di telefono della persona trovata

Pu: nessuna

File sequenziale

Page 71: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

71

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

141

Descrizione del metodo di elaborazione:

…. apre in lettura il file …

… legge il cognome da trovare, ….

... Cerca sul file il cognome ...

... Se trova il cognome immesso visualizza cognome nome e n.ro di telefono, altrimenti il

messaggio ‘Cognome non trovato in archivio’.

Chiude il file

Esercizio con File sequenziale

142

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// Cerca un cognome in una agenda telefonica

// registrata in un file sequenziale

main ()

{

struct persona

{ char cogn[20];

char nome[20];

char tel[15];

};

struct persona pers;

char cognome[20];

int nontrovato=1;

FILE*Fmio;

Esercizio con File sequenziale

Page 72: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

72

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

143

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

printf("Inserisci cognome da cercare: \n");

scanf("%s", &cognome);

if (Fmio != NULL)

{fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

if (feof(Fmio))

printf("File Vuoto\n");

else

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

{ if (strcmp(cognome, pers.cogn)==0)

{printf(“TROVATO!!\n Cogn.= %s, Nome=%s, Tel.=%s \n\n", pers.cogn, pers.nome, pers.tel);

nontrovato=0;}

fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

} // fine while

printf("RAGGIUNTA FINE FILE \n");

if (nontrovato==1) printf ("Cognome non trovato in achivio \n");

} // fine else feof(Fmio)

}

else

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

fclose(Fmio); //chiude fileint.txt

}

144

Definizione del problema: Si vogliono memorizzare su un file sequenziale il

cognome, il nome ed il numero di telefono di persone; si vogliono poi visualizzare tutte le

informazioni registrate ed eventualmente aggiungerne altre o ricercare o cancellare un

elemento in base al cognome.

Definizione della specifica del programma:

I: il cognome, il nome ed il numero di telefono delle persone

Pi: nessuna

U: il cognome, il nome ed il numero di telefono di persone registrati sul file

Pu: nessuna

Esercizio con File sequenziale

Page 73: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

73

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

145

Descrizione del metodo di elaborazione:

… visualizzazione di un menù delle possibili operazioni (crea, aggiungi, trova, cancella) …

…. Selezione dell’operazione

…. Crea, apre in scrittura il file …

… aggiungi, … in append …

… legge il cognome da trovare, apre il file in lettura ….

… legge il cognome da cancellare, apre il file in lettura, ne ricopia il contenuto su un altro

di appoggio tranne le informazioni legate al cognome da cancellare … riscrive l’agenda

ricopiando su essa il file di appoggio …

File sequenziale

146

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// gestisce una agenda telefonica con un file

// sequenziale

main ()

{

struct persona

{ char cogn[40];

char nome[40];

char tel[15];

};

struct persona pers;

char risp;

char cognome[40];

int scelta, nontrovato=1;

FILE*Fmio;

FILE*F2;

do

{ do

{

printf("\n\n PROGRAMMA GESTIONE

Agenda \n");

printf("1. Crea agenda \n");

printf("2. Stampa agenda \n");

printf("3. Aggiungi \n");

printf("4. Cerca \n");

printf("5. Cancella \n");

printf("0. FINE\n");

printf("Immetti n.ro operazione \n");

scanf("%d", &scelta);

} while ((scelta<0) || (scelta>5));

Gestione Agenda telefonica con un file sequenziale

Page 74: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

74

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

147

Lo studente continui a sviluppare il programma

148

if (scelta!=0)

switch (scelta)

{ case 1 : // Crea Agenda

{Fmio=fopen("age.txt","w");

if (Fmio == NULL)

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

else

{

do

{printf("Vuoi inserire persone? (S/N)\n");

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

}

while ((risp!='S' && risp!='s') &&

(risp!='N' && risp!='n'));

// legge dati e li scrive nel file

while (risp=='S' || risp=='s')

{ printf("Cognome ");

scanf("%s", &pers.cogn);

printf("Nome ");

scanf("%s", &pers.nome);

printf("Tel. ");

scanf("%s", &pers.tel);

// scrive il record sul file

fprintf(Fmio,"%s %s %s\n",pers.cogn,

pers.nome, pers.tel);

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

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

}

} // fine else

// chiusura del file

fclose(Fmio);

break;

// fine case 1

Gestione Agenda telefonica con un file sequenziale

Page 75: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

75

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

149

case 2 : //Stampa agenda

{Fmio=fopen("age.txt","r"); //apre file in lettura

if (Fmio != NULL)

{ fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

if (feof(Fmio))

printf("File Vuoto\n");

else

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

{ printf("%s, %s, %s \n", pers.cogn, pers.nome, pers.tel);

fscanf(Fmio,"%s %s %s", pers.cogn, pers.nome, &pers.tel);

} // fine while

printf("RAGGIUNTA FINE FILE");

}// fine else

} // fine if

else

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

fclose(Fmio); //chiude fileint.txt

break;

} // fine case 2

Gestione Agenda telefonica con un file sequenziale

150

case 3: //Aggiungi

{

// apertura del file in append

Fmio=fopen("age.txt","a");

if (Fmio == NULL)

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

else

{

do

{printf("Vuoi aggiungere persone? (S/N)\n");

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

}

while ((risp!='S' && risp!='s') && (risp!='N' && risp!='n'));

Gestione Agenda telefonica con un file sequenziale

Page 76: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

76

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

151

// legge dati e li scrive nel file

while (risp=='S' || risp=='s')

{ printf("Cognome ");

scanf("%s", &pers.cogn);

printf("Nome ");

scanf("%s", &pers.nome);

printf("Tel. ");

scanf("%s", &pers.tel);

// scrive il record sul file

fprintf(Fmio,"%s %s %s\n", pers.cogn, pers.nome, pers.tel);

printf("Vuoi aggiungere altre persone? (S/N)\n");

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

} // fine while

} // fine else ’ if (Fmio == NULL)’

// chiusura del file

fclose(Fmio);

break;

}

} // fine case 3

Gestione Agenda telefonica con un file sequenziale

152

case 4 : //Cerca

{Fmio=fopen("age.txt","r"); //apre file in lettura

nontrovato=1;

printf("Inserisci cognome da cercare: \n");

scanf("%s", &cognome);

if (Fmio != NULL)

{fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

if (feof(Fmio))

printf("File Vuoto\n");

else

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

{ if (strcmp(cognome, pers.cogn)==0)

{ printf("%s, %s, %s \n\n", pers.cogn, pers.nome, pers.tel);

nontrovato=0;}

fscanf(Fmio,"%s %s %s", pers.cogn, pers.nome, &pers.tel);

}

printf("RAGGIUNTA FINE FILE \n");

Gestione Agenda telefonica con un file sequenziale

Page 77: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

77

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

153

if (nontrovato==1) printf ("Cognome non trovato in achivio \n");

}// fine else

}

else

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

fclose(Fmio); //chiude fileint.txt

break;

} // fine case 4

Gestione Agenda telefonica con un file sequenziale

154

case 5 : // Cancella

{Fmio=fopen("age.txt","r"); //apre file age.txt in lettura

F2=fopen("appoggio.txt", "w"); // apre file appoggio in scrittura

printf("Inserisci cognome da cancellare: \n");

scanf("%s", &cognome);

nontrovato=1;

if (Fmio != NULL)

{ fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

if (feof(Fmio))

printf("File Vuoto\n");

else

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

{ if (strcmp(cognome, pers.cogn)!=0)

fprintf(F2,"%s %s %d\n", pers.nome, pers.cogn, pers.tel);

else nontrovato=(nontrovato && strcmp(cognome, pers.cogn));

fscanf(Fmio,"%s %s %d", &pers.cogn, &pers.nome, &pers.tel);

}

printf("RAGGIUNTA FINE FILE\n");

if (nontrovato==1) printf("Cognome non presente in Archivio \n");

else printf(“Cognome Cancellato \n”);

}// fine else feof

}

Gestione Agenda telefonica con un file sequenziale

Page 78: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

78

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

155

else

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

fclose(Fmio); //chiude fileint.txt

fclose(F2);

// ricopia appoggio.txt su age.txt

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

F2=fopen("appoggio.txt", "r"); // apre file appoggio in lettura

fscanf(F2,"%s %s %s", pers.cogn, pers.nome, &pers.tel);

while(!feof(F2))

{fprintf(Fmio,"%s %s %s\n", pers.nome, pers.cogn, pers.tel);

fscanf(F2,"%s %s %s", pers.cogn, pers.nome, &pers.tel);

}

fclose(Fmio); fclose(F2);

break;

} // fine case 5

} // fine switch

} while(scelta!=0);

system(“Pause”);

} // fine programma

Gestione Agenda telefonica con un file sequenziale

156

Lo studente ristrutturi il programma con adeguati sottoprogrammi

Page 79: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

79

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Elementi di Informatica

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

Esempio

Definizione del problema:

Scrivere, producendo la necessaria documentazione, un programma in

linguaggio C che dati due array monodimensionali di interi A e B

rispettivamente di cardinalità 15 e 25 consente:

- di riempire completamente i due array con valori compresi tra -10 e +30

(estremi inclusi)

- contare, e stampare, quante volte ciascun elemento di A compare anche in

B;

- verificare se lo array A è interamente contenuto nello array B (cioè se B

contiene tutti gli elementi di A nella stessa sequenza con cui essi

compaiono in A).

Page 80: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

80

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione dei dati del problema:

I: il valore di ciascun elemento degli array A e B.

Pi: il valore di ciascun elemento degli array A e B deve essere

compreso tra -10 e +30 (estremi inclusi).

U: Numero di volte che un elemento di A è presente anche in B;

informazione che indica se l'array A è completamento contenuto

in B.

Pu: nessuna

Elementi di Informatica

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

Esempio

Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo

A Array monodimensionale INT

B Array monodimensionale INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

conta Numero di volte che un

elemento di A è presente

anche in B

INT

contenuto indica se l'array A è

completamento contenuto

in B

LOGICAL

Page 81: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

81

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

j Indice di controllo di ciclo INT

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

Si legge, tramite un ciclo ripetitivo, il valore di ciascun elemento di A in modo da rispettare

la precondizione;

Si legge, tramite un ciclo ripetitivo, il valore di ciascun elemento di B in modo da rispettare

la precondizione;

- Si considera, tramite un ciclo ripetitivo, ciascun elemento di A e utilizzando un altro ciclo

ripetitivo innestato nel primo si confronta ciascun elemento di A con tutti gli elementi di B

e si incrementa di 1 la variabile conta ogni volta che si trova un elemento di B con un

valore uguale all'elemento di A considerato; al termine del ciclo più interno si stampa il

numero di volte che l'elemento di A è contenuto in B;

- Si scandisce B fino all'elemento in posizione pari a cardB-cardA (dove cardB è la

cardinalità di B e cardA è la cardinalità di A); se si verifica che l'elemento considerato

sia uguale al primo elemento di A si continua a verificare se anche gli elementi successivi

di B sono uguali a quelli successivi di A ed in tal caso si pone pari a 1 la variabile

contenuto ; alla fine della scansione se la variabile contenuto è pari ad 1 allora A è

contenuto in B altrimenti non lo è.

Page 82: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

82

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma C #include<stdio.h>

main()

{

const int cardA=15, cardB=25;

int i, j, contenuto, conta;

int A[cardA], B[cardB];

// Legge in input gli elementi del vettore A

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

{do

{printf(" dammi elemento di A di posto %d\n", i);

scanf("% d", &A[i]);}

while ((A[i]<-10)|| (A[i]>30));

}

// Legge in input gli elementi del vettore B

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

{ do

{printf(" dammi elemento di B di posto %d\n", i);

scanf("% d", &B[i]);}

while ((B[i]<-10)|| (B[i]>30));

}

Elementi di Informatica

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

// Conta quante volte un elemento di A è presente in B

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

{

conta=0;

for (j= 0; j< cardB; j++)

if(A[i]== B[j]) conta++;

printf("Elemento A[%d]=%d presente %d volte in B\n",i, A[i],

conta);

}

Esempio - il programma C

Page 83: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

83

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Verifica se A è completamente contenuto in B

conta=0;

contenuto=0;

i=0;

do

{ if (B[i]==A[conta])

{j=i;

do

{conta++;

j++;

}

while ((B[j]==A[conta])&&(conta<cardA));

if (conta==cardA)

contenuto=1;

}

i++;

conta=0;

}

while(i<=(cardB-cardA));

if (contenuto == 1) printf ("Array A completamente contenuto in B\n");

else printf("Array A NON contenuto in B\n");

}

Esempio - il programma C

Elementi di Informatica

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

Page 84: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

84

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 168

Esempio

Nome variabile Descrizione Tipo

Cognome stringa

nome stringa

telefono INT

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

Page 85: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

85

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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 170

#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

Page 86: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

86

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

Elementi di Informatica

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

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

Page 87: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

87

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

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

Elementi di Informatica

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

Esempio - il programma C

Page 88: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

88

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Lo studente scriva un programma (o modifichi il precedente)

che carichi in un array di struct i dati del file agenda.txt

e permetta di effettuare la ricerca per cognome in tale

array.

…………………

// Carica lo array dell’agenda leggendo dal file

{

………………

}

Esempio

Elementi di Informatica

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

…………………

// Carica lo array dell’agenda leggendo dal file

{Fmio=fopen("agenda.txt","r");

if (!feof(Fmio))

{ i=0;

fscanf(Fmio,"%19s %19s %14s", &pers2[i].cogno,pers2[i].nome,

&pers2[i].tel);

while (!feof(Fmio))

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

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

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

i++;

fscanf(Fmio,"%19s %19s %14s",&pers2[i].cogno,

&pers2[i].nome, &pers2[i].tel);

}

printf("FINE CARICAMENTO\n");

}

else printf("RAGGIUNTA FINE FILE");

fclose(Fmio);

}

Esempio

Page 89: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

89

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

177

Definizione del problema: In un file sequenziale in cui è registrata una agenda

telefonica (cognome, nome, n.ro di telefono), si vogliono cercare i dati di una persona in

base al cognome dato in input.

Definizione della specifica del programma:

I: il file di testo registrante l’agenda telefonica, il cognome della persona da

cercare

Pi: nessuna

U: il cognome, il nome ed il numero di telefono della persona trovata

Pu: nessuna

File sequenziale

178

Descrizione del metodo di elaborazione:

…. apre in lettura il file …

… legge il cognome da trovare, ….

... Cerca sul file il cognome ...

... Se trova il cognome immesso visualizza cognome nome e n.ro di telefono, altrimenti il

messaggio ‘Cognome non trovato in archivio’.

Chiude il file

Esercizio con File sequenziale

Page 90: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

90

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

179

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// Cerca un cognome in una agenda telefonica

// registrata in un file sequenziale

main ()

{

struct persona

{ char cogn[20];

char nome[20];

char tel[15];

};

struct persona pers;

char cognome[20];

int nontrovato=1;

FILE*Fmio;

Esercizio con File sequenziale

180

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

nontrovato=1;

printf("Inserisci cognome da cercare: \n");

scanf("%s", &cognome);

if (Fmio != NULL)

{fscanf(Fmio,"%s%s%s\n", &pers.cogn, &pers.nome, &pers.tel);

if (feof(Fmio))

printf("File Vuoto\n");

else

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

{ if (strcmp(cognome, pers.cogn)==0)

{ printf(“Cogn.= %s, Nome=%s, Tel.=%s \n\n", pers.cogn, pers.nome, pers.tel);

nontrovato=0;}

fscanf(Fmio,"%s %s %s", pers.cogn, pers.nome, &pers.tel);

}

printf("RAGGIUNTA FINE FILE \n");

if (nontrovato==1) printf ("Cognome non trovato in achivio \n");

}// fine else

}

else

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

fclose(Fmio); //chiude fileint.txt

}

Page 91: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

91

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Definizione del problema:

Dato un array monodimensionale VET di interi di 20 elementi tutti

diversi da zero, si vuole determinare se in esso esistono elementi con

valori uguali; si vuole indicare quali sono gli indici di posizione degli

elementi uguali e porre pari a zero tutti gli elementi duplicati (lasciando

invariato quello 'origine').

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array; il riempimento dello array.

Pi: il riempimento non può essere maggiore della cardinalità di riga.

Ogni elemento di VET è diverso da zero

U: Gli indici degli elementi duplicati; lo array VET con gli elementi

doppioni contenenti tutti elementi pari a zero.

Pu: nessuna

Elementi di Informatica

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

Esempio

Se lo array ‘riempito’ in input è:

13

21

44

13

47

44

13

22

13

21

44

0

47

0

0

22

Lo array in output sarà:

Page 92: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

92

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo

VET Array monodimensionale INT

Riemp Riempimento di riga INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

VET Array di ingresso con elementi INT

doppioni tutti pari a zero

i Indici delle coppie di righe doppioni INT

Elementi di Informatica

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

Esempio Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

k Indice di controllo di ciclo INT

Page 93: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

93

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Descrizione del metodo di elaborazione:

E’ immesso il riempimento dello array: tale valore deve essere non maggiore della

cardinalità.

Si legge, tramite un ciclo ripetitivo, il valore di ciascun elemento di VET e si verifica

che esso sia diverso da zero, in tal caso il valore dell'elemento deve essere re-immesso.

Si confronta, tramite un ciclo ripetitivo, ciascun elemento, dal primo al penultimo, di

VET con i successivi; se due elementi sono uguali si stampao i valori degli indici degli

elementi uguali e si azzera l’elemento doppione.

Si evita di analizzare le gli elementi eventualmente già azzerati (perché doppioni di

altri) verificando l’elemento considerato sia diverso da zero (la specifica dice che gli

elementi iniziali di VET devono essere tutti diversi da zero).

Infine si stampano i valori dello array VET.

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{const card=20;

int VET[card], i, k, riemp;

// Immissione riempimento

do

{ printf("Quanti elementi vuoi inserire?\n");

scanf("% d", &riemp);

}

while (riemp>card);

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

{ // Legge ciascun elemento e verifica che esso non è pari a zero, richiedendone

// eventualmente il reinserimento

do

{ printf(" dammi el. %d di VET\n", i);

scanf("%d", &VET[i]);

}

while(VET[i]==0);

}

Page 94: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

94

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio //Confronta gli elementi dal primo al penultimo con i successivi

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

{ //Verifica che l’elemento considerato non è già azzerato perché doppione di un altro

if(VET[i]!=0)

{ //Ciclo per considerare gli elementi successivi allo i-esimo

for(k= i+1; k<riemp; k++)

if (VET[i]==VET[k]

{ printf(“elemento in %d ed elemento in %d uguali a %d\n",i,k, VET[i]);

VET[k]=0;

}

}

}

// Stampa array finale

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

printf(“VET[%d]= %d \n", i,VET[i]);

}

Elementi di Informatica

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

Esempio

Definizione del problema:

Dato un array bidimensionale MAT di interi di 20 righe e 15 colonne i cui elementi, letti in

input da tastiera, sono tutti diversi da zero. Si vuole determinare se in esso esistono righe

uguali; si vuole indicare quali sono gli indici di riga delle coppie di righe uguali e porre pari

a zero tutti gli elementi di ciascuna riga duplicata (lasciando invariata la prima riga

'origine'). Strutturare il programma con sottoprogrammi

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array bidimensionale MAT; il riempimento di riga dello

array, il riempimento di colonna dello array.

Pi: il riempimento di riga e di colonna non può essere maggiore delle rispettive cardinalità di

riga e di colonna. Ogni elemento di MAT è diverso da zero

U: Gli indici delle coppie di righe duplicate; lo array MAT con le righe doppioni contenenti

tutti elementi pari a zer.

Pu: nessuna

Page 95: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

95

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

0

1

2

3

4

0 1 2 3 4

23 47 63 96 8

27 66 23 44 567

47

...

23

... 15

32 ...

63 MAT 96 8

0

1

2

3

4

0 1 2 3 4

23 47 63 96 8

27 66

0

0

... 15

32 …

0 MAT

23 44 567

0 0

Elementi di Informatica

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

Esempio Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo

MAT Array bidimensionale INT

riempR Riempimento di riga INT

riempC Riempimento di colonna INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

MAT Array di ingresso con le righe INT

doppioni con elementi tutti pari a zero

i, k Indici delle coppie di righe doppioni INT

Page 96: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

96

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio Tabella delle variabili di algoritmo:

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

j Indice di controllo di ciclo INT

k Indice di controllo di ciclo INT

x Indice di controllo di ciclo INT

trovato Contatore indicante quanti INT

elementi di una riga sono

uguali a quelli di un'altra

Elementi di Informatica

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

Esempio Descrizione del metodo di elaborazione:

Sono immessi i riempimenti di riga e di colonna dello array MAT: tali valori devono

essere non maggiori delle rispettive cardinalità di riga e di colonna.

Si legge, tramite un ciclo ripetitivo, il valore di ciascun elemento di MAT e si verifica

che esso sia diverso da zero, in tal caso il valore dell'elemento deve essere reimmesso.

Si confronta, tramite un ciclo ripetitivo, ciascuna riga, dalla prima alla penultima, di

MAT con le successive; in particolare ciascun elemento di una riga viene confrontato

(tramite un ciclo ripetivo che scandisce le colonne di MAT) con ciascun elemento di una

riga successiva in posizione omologa: se i due elementi sono uguali si incrementa il

contatore trovato. Analizzata tutta una riga, se il valore di trovato è pari a quello

di riempC (riempimento di colonna) allora le due righe sono uguali: si stampano i

valori degli indici dell due righe uguali e, tramite un ciclo ripetitivo si procede

all'azzeramento degli elementi della riga doppione.

Si evita di analizzare le righe eventualmente azzerate (perché doppioni di altre)

verificando che il primo elemento di ciascuna riga sia diverso da zero (la specifica dice

che gli elementi iniziali di MAT devono essere tutti diversi da zero).

Infine si stampano i valori dello array MAT eventualmente modificato

Page 97: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

97

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

… STRUTTURAZIONE IN SOTTOPROGRAMMI …

main

legggiRIEMP stampaMAT leggiMAT

doppioni

Elementi di Informatica

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

Esempio #include<stdio.h

#define COL 15

void legggiRIEMP (int *R, int maxcard)

{do

{ printf("Quanti elementi vuoi inserire?\n");

scanf("%d", &*R);

} while (*R>maxcard);

}

void stampaMAT(int R, int C, int FMAT[][COL])

{ int i, j;

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

{for (j=0;j<C;j++)

printf("%d - ", FMAT[i][j]);

printf("\n");

}

}

Page 98: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

98

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

void leggiMAT( int R, int C, int FMAT[][COL])

{ int i, j;

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

for (j=0; j<C; j++)

{/*Legge ciascun elemento, verifica che non è pari a zero,

richiedendone in tal caso il reinserimento */

do

{ printf(" dammi el. (%d , %d) della Matrice\n", i,j);

scanf("%d", &FMAT[i][j]);

} while(FMAT[i][j]==0);

}

}

Esempio

Elementi di Informatica

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

void doppioni (int R, int C, int FMAT[][COL])

main()

{const cardR=20, cardC=COL;

int MAT[cardR] [cardC], i,j, k, x, riempR, riempC, trovato;

printf("Immissione riempimento di riga\n");

legggiRIEMP (&riempR, cardR);

printf("Immissione riempimento di colonna\n");

legggiRIEMP (&riempC, cardC);

leggiMAT(riempR,riempC, MAT);

stampaMAT(riempR,riempC, MAT);

printf("\n\n");

doppioni (riempR,riempC, MAT);

// Stampa array finale MAT

printf("\n Stampa array con righe doppioni azzerate \n");

stampaMAT(riempR,riempC, MAT);

system("Pause");

}

Esempio

Page 99: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

99

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

void doppioni (int R, int C, int FMAT[][COL])

{int trovato, i, k, j, x;

for (i=0; i<(R-1); i++)

{ if(FMAT[i][0]!=0)

{ for(k=i+1; k<R; k++) // scandisce le righe successive alla i-esima

{trovato=0;

for(j=0; j<C; j++) // verifica se gli elementi nelle due righe i e k sono uguali

if (FMAT[i][j]==FMAT[k][j])

trovato++;

if (trovato==C)

{ printf("la riga %d e la riga %d sono uguali\n\n",i,k);

for (x=0;x<C; x++) FMAT[k][x]=0; //azzera riga doppione

}

}

}

}

}

Esempio

Elementi di Informatica

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

Esempio

senza sottoprogrammi #include<stdio.h>

main()

{

// LO STUDENTE DEFINISCA UN MAIN CHE ATTIVI I VARI

// SOTTOPROGRAMMI PER RISOLVERE IL PROBLEMA

}

Page 100: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

100

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

senza sottoprogrammi #include<stdio.h>

main()

{

const cardR=20, cardC=15;

int MAT[cardR] [cardC], i,j, k, x, riempR, riempC, trovato;

// Immissione riempimento di riga

do

{ printf("Quante Righe vuoi inserire?\n");

scanf("% d", &riempR);

}

while (riempR>cardR);

// Immissione riempimento di colonna

do

{ printf("Quante Colonne vuoi inserire?\n");

scanf("% d", &riempC);

}

while (riempC>cardC);

Elementi di Informatica

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

// Legge in input tutti gli elementi della matrice, tutti diversi da zero

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

for (j=0; j<riempC; j++)

{

// Legge ciascun elemento e verifica che esso non è pari a zero, richiedendone

eventualmente il reinserimento

do

{ printf(" dammi el. (%d , %d) di MAT\n", i,j);

scanf("%d", &MAT[i][j]);

}

while(MAT[i][j]==0);

}

Esempio

senza sottoprogrammi

Page 101: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

101

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

//Confronta le righe dalla prima alla penultima con le successive

for (i=0; i<(riempR-1); i++)

{ //Verifica che quella considerata non è una riga già azzerata perché doppione di

un'altra

if(MAT[i][0]!=0)

{ //Ciclo per considerare le righe successive alla i-esima

for(k= i+1; k<riempR; k++)

{trovato=0;

for(j= 0; j<(riempC); j++) // Ciclo per scandire le colonne

// Se gli elementi in posizioni omologhe nelle due righe sono uguali

incrementa la variabile trovato

if (MAT[i][j]==MAT[k][j]) trovato++;

// Se tutti gli elementi delle due righe sono uguali stampa indici di

righe doppioni ed azzera la riga doppione

if (trovato==riempC)

{ printf("la riga %d e la riga %d sono uguali\n",i,k);

for (x=0;x<(riempC); x++) MAT[k][x]=0;

}

}

}

}

Elementi di Informatica

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

// Stampa array finale MAT

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

for (j=0;j<riempC;j++)

printf("MAT[%d][%d]= %d \n", i,j, MAT[i][j]);

}

Esempio

senza sottoprogrammi

Page 102: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

102

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema: Calcolare il prodotto (riga per colonna) tra due matrici

Definizione dei dati del problema :

I: i due array bidimensionali; il valore di ciascun elemento degli array

Pi: il numero di colonne del primo array deve essere uguale al numero di righe del

secondo

U: l’array bidimensionale risultante dal prodotto dei due in ingresso

Pu: nessuna

Descrizione del metodo di elaborazione: Si legge, in ordine di riga, il valore di

ciascun elemento del primo array. Si legge, in ordine di riga, il valore di ciascun elemento

del secondo array. Si verifica che il numero di colonne del primo array sia uguale al

numero di righe del secondo. Si calcola il valore di ciascun elemento della matrice prodotto

secondo la nota regola:

n

k

jkkiji BAC1

,,, *

Stampare la matrice prodotto risultante C

Elementi di Informatica

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

7 3 1

2 6 4

1 5 2

3 6 4

3 4

2 1

6 5

33 36

42 34

25 19

45 38

(7*4)+(3*1)+(1*5) = 36 (7*3)+(3*2)+(1*6) = 33

(3*3)+(6*2)+(4*6) = 45 (3*4)+(6*1)+(4*5) = 38

A B

C = A * B

n

k

jkkiji BAC1

,,, *

Page 103: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

103

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome variabile Descrizione Tipo

MAT1 prima matrice di interi INT

MAT1(I,J) elemento della prima matrice INT

MAT2 seconda matrice di interi INT

MAT2(I,J) elemento della seconda matrice INT

Nome variabile Descrizione Tipo

MATP Matrice prodotto di MAT1 e MAT2 INT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Elementi di Informatica

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

Esempio - il programma #include<stdio.h>

main()

{ const cardR=5, cardC=7, cardC2=3;

int MAT1[cardR] [cardC], MAT2 [cardC] [cardC2];

int MATP[cardR] [cardC2],k , i,j;

// Legge in input tutti gli elementi della prima matrice

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

for (j= 0; j< cardC; j++)

{ printf(" dammi el. (%d , %d) di MAT1\n", i,j);

scanf("%d", &MAT1[i][j]);

}

// Legge in input tutti gli elementi della seconda matrice

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

for (j= 0; j< cardC2; j++)

{printf(" dammi el. (%d , %d) di MAT2\n", i,j);

scanf("%d", &MAT2[i][j]);

}

Page 104: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

104

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio - il programma // Calcolo prodotto tra MAT1 e MAT2

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

for(j=0;j<cardC2;j++)

{

MATP[i,j]=0;

for (k=0; k<cardC;k++)

MATP[i][j]=MATP[i][j]+MAT1[i][k]*MAT2[k][j];

}

// Visualizzazione valori elementi matrice prodotto

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

for(j=0;j<cardC2;j++)

printf(“MATP(%d, %d) = %d \n”, i,j,MATP[i] [j]);

}

Elementi di Informatica

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

Esempio

Definizione del problema: Scrivere, producendo la necessaria documentazione, un programma che,

dato un array monodimensionale VET di caratteri, con cardinalità pari a 30:

• Consente il riempimento dello array con i soli caratteri corrispondenti alla

dieci cifre decimali (0,1,2,3,4,5,6,7,8,9) ed al carattere '+' e, dopo che è

stato riempito, verifica che in esso non esistano due segni '+' consecutivi

e per ogni volta che ciò accade elimina uno dei due segni consecutivi

compattando lo array;

• Aggiunge, se possibile, automaticamente nella prima posizione dello

array il carattere '=' (segno di uguale) e accoda all'ultimo carattere

presente nello array il carattere ';' (punto e virgola).

Page 105: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

105

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione dei dati del problema: I: il valore di ciascun elemento dello array monodimensionale; il

riempimento dello array.

Pi: il riempimento non può essere maggiore della cardinalità. Il valore di

ciascun elemento dello array deve essere compreso tra i caratteri 0 e 9

(estremi inclusi) o essere il carattere '+';

U: array compattato dopo l'eliminazione degli elementi '+' consecutivi, ed

eventualmente con l'aggiunta dei caratteri '=' e ';' in prima ed ultima

posizione.

Pu: nessuna

Elementi di Informatica

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

Esempio Tabella delle variabili di Ingresso:

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

vett Array monodimensionale CHAR

riemp Riempimento array INT

Nome

Variabile

Descrizione Tipo

vett array compattato dopo l'eliminazione degli elementi '+'

consecutivi, ed eventualmente con l'aggiunta dei caratteri

'=' e ';' in prima ed ultima posizione

CHAR

Nome Variabile Descrizione Tipo

i Indice di controllo di ciclo INT

j Indice di controllo di ciclo INT

Tabella delle variabili di Uscita:

Page 106: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

106

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

E' immesso il riempimento dell'array vett controllando che esso non sia superiore alla cardinalità

dello stesso. Sono immessi i valori dello array vett controllando che ciascuno di essi è un carattere

compreso tra 0 e 9 oppure il caratere '+'. Questa verifica può essere effettuata valutando l'espressione

booleana: (((vett[i]<'0') || (vett[i]>'9')) && (vett[i]!='+')). Se tale espressione è vera, dovrà essere

ripetuta l'immissione del carattere in quanto quello immesso non rispetta la precondizione.

Si stampa lo array così riempito.

Si visita lo array vett e si verifica se l'elemento considerato e quello immediatamente ad esso

successivo sono pari a '+': in tal caso, se l'elemento considerato non è l'ultimo elemento dello array, si

traslano, per eliminare tale elemento e compattare lo array, di una posizione tutti gli elementi di vett

in posizioni successive a quello considerato e si decrementa di 1 il riempimento riemp (se l'elemento

pari a '+' è l'ultimo elemento dello array basta decrementare di 1 riemp).

Si stampa lo array vett compattato.

Si verifica se esistono due posizioni libere nello array per inserire i caratteri '=' e ';' in esso,

rispettivamente in testa ed in coda agli altri elementi già presenti in esso. Per inserire il carattere '=' in

testa agli altri, bisogna prima shiftare di una posizione tutti quelli presenti. Si incrementa di 1 il

riempimento e si inserisce '=' nella prima posizione dello array. Si incrementa di 1 il riempimento e

nella ultima posizione indicata da esso si inserisce il valore ';'.

Esempio

Elementi di Informatica

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

#include<stdio.h>

main()

{ const int card=30;

int i, j, riemp;

char vett[card];

// Immissione riempimento

do

{ printf("Quanti elementi vuoi inserire?\n");

scanf(“%d", &riemp);

}

while (riemp>card);

// Legge in input gli elementi del vettore

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

do

{ printf(" dammi elemento di posto %d\n", i);

scanf("\n%c", &vett[i]);

}

while (((vett[i]<'0') || (vett[i]>'9')) && (vett[i]!='+'));

// verifica valore immesso compreso tra 0 e 9 e uguale a +

// stampa lo array vett riempito

for (i= 0; i< riemp; i++) printf(" VETT[%d]= %c\n", i, vett[i]);

Esempio - il programma C

Page 107: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

107

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

// Si verifica se esistono segni '+' consecutivi

//e li si elimina compattando lo array

i=0;

do

{if ((i!=riemp-1) && (vett[i]=='+') && (vett[i+1]=='+'))

{//se l'uguaglianza non si è verificata per l'elemento nell'ultima

//posizione si compatta lo array spostando gli elementi di 1 posto

// Ciclo per compattare lo array

for (j=i;j<(riemp-1);j++)

vett[j]=vett[j+1];

riemp--; //decrementa riempimento e riprende il ciclo dalla stessa

//posizione nello array (possono esserci elementi uguali

// a '+' in posizioni consecutive dello array)

}

else i++; // se l'elemento considerato è diverso da '+'

// passa alla posizione successiva dello array

}

while (i<riemp-1);

Elementi di Informatica

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

// stampa lo array vett compattato

for (i= 0; i< riemp; i++) printf(" VETT[%d]= %c\n", i, vett[i]);

// Inserisce, eventualmente, i caratteri '=' e ';'

if (riemp<=(card-2))

{

riemp++;

for (j=(riemp-1);j>0;j--) vett[j]=vett[j-1];

vett[0]= '=';

vett[riemp]=';';

riemp++;

}

// stampa lo array vett finale

for (i= 0; i< riemp; i++) printf(" VETT[%d]= %c\n", i, vett[i]);

}

Esempio - il programma C

Page 108: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

108

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Analisi e Specifica

Definizione del problema: Sviluppare un programma per

generare un mazzo di carte ‘francesi’e mescolarlo.

Definizione dei dati del problema:

I: il mazzo di carte (ciascuna carta è identificata dal valore e

dal seme);

Pi: il numero delle carte è 52, con 4 semi e 13 valori per ogni

seme

U: mazzo di carte mescolato

Pu: nessuna

Elementi di Informatica

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

Esempio

Nome Variabile Descrizione Tipo

carta Carta composta da un valore e seme record

mazzocarte[] Array formante il mazzo di carte Array di

carta

Tabella delle variabili di Ingresso

Nome Variabile Descrizione Tipo

mazzocarte[] Array formante il

mazzo di carte

mescolate

Array di carta

Tabella delle variabili di Uscita

Page 109: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

109

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Nome Variabile Descrizione Tipo

valore[] Array dei valori di una carta char

seme[] Array dei semi delle carte char

i, k, j indici int

Tabella delle variabili di algoritmo

Elementi di Informatica

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

Esempio

Descrizione del metodo di elaborazione:

Si dichiara una struttura (struct) per definire la composizione di una carta

formata dai due campi valore e seme; si dichiara un array di tale struttura.

Si dichiarano ed inizializzano due array di semi e valori.

Si inizializza il ‘seme’ della funzione rand().

Si genera un ‘nuovo’ mazzo di carte in cui le carte sono ordinate per valore

e seme.

Si mescola il mazzo di carte ‘swappando’ in modo random le carte in esso

Si stampa il contenuto del mazzo di carte.

Page 110: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

110

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio #include <stdio.h>

#include <stdlib.h>

#include <time.h>

main()

{

struct carta {

char valore;

char seme;

};

struct carta mazzocarte[52], temp;

char valore[] = {'A', '2', '3', '4', '5',

'6', '7', '8', '9', '0',

'J', 'Q', 'K'};

char seme[4] = {'C', 'Q', 'F', 'P'};

int i,k, j;

srand(time(NULL));

Elementi di Informatica

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

Esempio // crea il mazzo di carte

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

{ k=(i%13);

mazzocarte[i].valore = valore[k];

mazzocarte[i].seme = seme[(i / 13)];

}

// mescola il mazzo di carte

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

{ j = rand() % 52;

temp = mazzocarte[i];

mazzocarte[i] = mazzocarte[j];

mazzocarte[j] = temp;

}

//stampa la sequenza delle carte nel mazzo mescolato

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

printf("%5c of %c", mazzocarte[i].valore,

mazzocarte[i].seme);

}

Page 111: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

111

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Definizione del problema: Scrivere, producendo la necessaria documentazione, un programma che,

dato un array bidimensionale MAT di reali, di 15 righe e 15 colonne:

(1)riempie automaticamente lo array in modo che il valore di ciascun

elemento sia pari alla somma tra il triplo del valore dell’indice di riga e la

metà del valore dell’indice di colonna (ad es. per l’elemento MAT[4][7]

dovrà essere MAT[4][7]=(4*3)+(7/2)=15,5 , e stampa lo array così

ottenuto;

(2)Calcola la produttoria degli elementi di MAT con valori dell’indice di

riga pari, e la sommatoria degli elementi con valori dell’indice di colonna

dispari (il valore 0 è considerato pari) e calcola e stampa la media di

questi due valori.

Elementi di Informatica

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

Esempio

Definizione dei dati del problema: I: i valori degli indici di riga e di colonna.

Pi: i valori degli indici di riga e di colonna non devono essere maggiori delle

cardinalità di riga e di colonna rispettivamente

U: Lo array MAT riempito con valori calcolati come specificato

la produttoria degli elementi di MAT con valori dell’indice di riga pari

la sommatoria degli elementi con valori dell’indice di colonna è dispari

la media tra il valore della produttoria e della sommatoria

Pu: i valori degli elementi di MAT e della media sono non negativi

Page 112: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

112

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Esempio

Tabella delle variabili di Ingresso:

Nome Variabile Descrizione Tipo

i, j indici, rispettivamente, di riga e

di colonna dello array MAT

INT

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

mat array bidimensionale MAT riempito con valori calcolati

come specificato

FLOAT

media la media tra il valore della produttoria (degli elementi di

MAT con valori dell’indice di riga pari) e della sommatoria

(degli elementi con valori dell’indice di colonna è dispari)

FLOAT

somma sommatoria degli elementi di MAT con valori dell’indice di

colonna è dispari

FLOAT

prod produttoria degli elementi di MAT con valori dell’indice di

riga pari

FLOAT

Elementi di Informatica

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

Definizione del problema: Si vuole realizzare un programma per giocare a battaglia

navale. Il calcolatore posiziona automaticamente le navi sul campo di battaglia ed il

giocatore le deve colpire tutte. Ad ogni tiro il calcolatore dirà se è stata colpita o meno una

nave. Alla fine sarà indicato quanti tiri sono stati effettuati. Viene visualizzato il campo di

battaglia con gli esiti di ciascun tiro: ‘C’ = nave Colpita – ‘A’ tiro in Acqua.

ESERCIZIO

Definizione della specifica del programma:

I: dimensione del campo di battaglia; numero di navi; coordinate tiro;

Pi: dimensione massima 26 x 26; numero navi massimo il 35 per cento della

dimensione

U: per ciascun tiro indicazione se è stata colpita una nave numero totale di tiri

effettuati per colpire tutte le navi

Pu: tutte le navi sono state colpite

Page 113: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

113

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

….

si inizializza il campo definedone le dimensioni e la percentuale di riempimento di navi….

… il sistema inserisce automaticamete le navi nel campo di battaglia scrivendo una ‘N’

nella posizione occupata da una nave…

… si effettua lo sparo fornendo le coordinate del tiro (riga e colonna)…

… si verifica l’esito del tiro : dovrà essere indicato se è stata colpita o meno una nave

(coordinate di tiro corrispondenti ad una posizione con una ‘N’) e visualizzazione del

messaggio ‘COLPITO’ o ‘ ACQUA’. Se una nave è colpita su deve decrementare il numero

totali delle navi rimaste.

… si continua ad effettuare spari finchè vi sono ancora navi

… colpite tutte le navi, si stampa la matrice con l’esito dei tiri ed il numero dei tiri

effettuati.

ESERCIZIO

Elementi di Informatica

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

ESERCIZIO

main

inizializza riempicampo spara esitotiro stampamat

Page 114: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

114

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MAXPERC 35

#define DIM 26

void inizializza(char batna[][DIM],int DI, int *riem, int MAXPER, int *percent, int *nnavi);

void riempicampo(char Mat1[][DIM],int riemp, int nnavi);

void spara(int *ri, int *col, int riem);

void esitosparo(char batna[][DIM], int rig, int col, char *ris, int *nav);

void stampamat(char Mat1[][DIM], int riemp);

Il programma C

Elementi di Informatica

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

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MAXPERC 35

#define DIM 26

void inizializza(char batna[][DIM],int DI, int *riem, int MAXPER, int *percent, int *nnavi);

void riempicampo(char Mat1[][DIM],int riemp, int nnavi);

void spara(int *ri, int *col, int riem);

void esitosparo(char batna[][DIM], int rig, int col, char *ris, int *nav);

void stampamat(char Mat1[][DIM], int riemp);

Il programma C

Page 115: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

115

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

main ()

{char batnav[DIM][DIM], esitotiro;

int riga, colonna, riemp, percento, navi, tiri=0;

inizializza(batnav, DIM, &riemp, MAXPERC, &percento, &navi);

riempicampo(batnav, riemp, navi);

do

{ spara(&riga, &colonna, riemp);

esitosparo(batnav, riga, colonna, &esitotiro, &navi);

switch (esitotiro)

{ case 'C': printf("**** COLPITA ****\n"); break;

case 'P': printf(" nave GIA COLPITA PRIMA \n"); break;

case 'A': printf(" --- ACQUA ---\n");

}

tiri++;

} while (navi>0) ;

printf(" Colpite tutte le navi con %d tiri\n", tiri);

stampamat(batnav, riemp);

}

Il programma C

Elementi di Informatica

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

void inizializza(char batna[][DIM], int DI, int *riem,int MAXPER, int *percent, int *nnavi)

{

do

{

printf("Immetti dimensione campo battaglia (max %d) \n", DIM);

scanf("%d", &(*riem));

} while ((*riem<=0) || (*riem>DI));

do

{ printf("Immetti densità percentuale bersagli (max %d %) \n", MAXPERC);

scanf("%d", &(*percent));

} while ((*percent<=0) || (*percent>MAXPER);

*nnavi=(((*riem)*(*riem))*(*percent))/100;

printf("Saranno inserite %d navi \n", *nnavi);

}

Il programma C

Page 116: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

116

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

void riempicampo(char Mat1[][DIM], int riemp, int nnavi)

{int I, J, k;

srand(time(NULL)); // inizializza il seed di rand() in modo da generare

// valori diversi ad ogni esecuzione

//Imbianca campo

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

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

Mat1[I][J]=' ';

// riempe campo

for (k=0;k<nnavi;k++)

{do

{ I=rand()%riemp;

J=rand()%riemp; }

while (Mat1[I][J]=='N');

Mat1[I][J]= 'N';

}

}

Il programma C

Elementi di Informatica

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

void spara(int *ri, int *col, int riem)

{

printf("\n immissione coordinate tiro ");

do

{printf("\n - immettere riga: ");

scanf("%d", &(*ri));

}

while((*ri<=0)||(*ri>=riem));

do

{ printf("\n - immettere colonna: ");

scanf("%d", &(*col));

}

while ((*col<=0)||(*col>=riem));

}

Il programma C

Page 117: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

117

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

void esitosparo(char batna[][DIM], int rig, int col, char *ris, int *nav)

{

if (batna[rig][col] == 'N')

{*ris='C';

batna[rig][col] = 'C';

*nav=*nav-1;

}

else

{if (batna[rig][col] == 'C') *ris='P';

else

{ *ris='A';

batna[rig][col] = 'A';

}

}

printf("navi = %d\n", *nav);

}

Il programma C

Elementi di Informatica

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

void stampamat(char Mat1[][DIM], int riemp)

{int a, b;

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

{printf("\n");

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

printf("%c - ", Mat1[a][b]);

}

}

Il programma C

Page 118: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

118

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Definizione del problema:

Dato un array monodimensionale A di di interi, di 40 elementi, scrivere,

producendo la necessaria documentazione, un programma che, dato un

array monodimensionale A di interi, di 40 elementi permette di:

• Effettuare il riempimento, tramite input da tastiera, dello intero array

con valori tutti pari;

• Calcolare la media dei valori inseriti nello array e contare il numero

degli elementi con valore inferiore o pari a quello della media e degli

elementi con valore superiore a quello della media;

• Costruire un nuovo array monodimensionale B, di 40 elementi, in cui

ciascun elemento in posizione ‘i’ ha il valore uguale alla sommatoria

degli elementi di A fino alla posizione ‘i’;

• Salva lo array B in un file sequenziale.

Esercizio

Elementi di Informatica

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

Definizione dei dati del problema:

I: il valore di ciascun elemento dello array A.

Pi: elementi di A devono essere numeri pari.

U: media dei valori in A; numero di elementi di A con valore inferiore o

uguale alla media; numero di elementi di A con valore superiore alla media; array monodimensionale B; il file sequenziale ("fileVET.txt“) in cui

è salvato lo array B.

Pu: il valore dell’elemento di B in posizione ‘i’ ha il valore uguale alla

sommatoria degli elementi di A fino alla posizione ‘i’

Page 119: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

119

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Nome Variabile Descrizione Tipo

A[i] Elemento Array monodimensionale int

Tabella delle variabili di Ingresso

Nome Variabile Descrizione Tipo

containf numero di elementi di A con valore inferiore o uguale alla media INT

contasup numero di elementi di A con valore superiore alla media INT

media media dei valori degli elementi in A FLOAT

B Array il cui elemento in posizione i ha il valore uguale alla

sommatoria degli elementi di A fino alla posizione ‘i’

INT

*FVET Puntatore al file sequenziale "fileVET.txt“ in cui è salvato lo

array B

FILE

Tabella delle variabili di Uscita:

Nome Variabile Descrizione Tipo

somma sommatoria di elementi di A INT

i, j Indice di controllo di ciclo INT

Tabella delle variabili di algoritmo:

Elementi di Informatica

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

Descrizione del metodo di elaborazione:

Si azzerano i valori delle variabili somma, containf, contasup.

Si riempie, con un ciclo ‘for’, completamente lo array A verificando che si immettano

solonumeri pari, l’immissione è ripetuta, con un ciclo ‘do ... while’, finché non è immesso

non è immesso un valore valido.

Man mano che si immettono i valori validi di A[i] si incrementa il valore di somma del

valore valido immesso e si assegna il valore di somma all’elemento B[i].

Alla uscita dal ciclo ‘for’ per il riempimento di A, si calcola la media dei valori immessi

dividendo il valore di somma per la cardinalità di A, facendo la conversione di tipo da intero

a reale.

Con un nuovo ciclo ‘for’ si calcolano i valori di containf, contasup , confrontando ciascun

elemento di A con il valore della media: se A[i] è inferiore o uguale alla media si incrementa

di 1 il valore di containf, altrimenti quello di contasup .

Si stampano i valori di containf e contasup ottenuti e lo array B.

Si salva lo array B sul file sequenziale ‘fileVET.txt’

Page 120: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

120

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

#include<stdio.h>

main()

{const int card=40;

int i, somma, containf, contasup;

int A[card], B[card];

float media;

FILE*FVET;

somma=0; containf=0; contasup=0;

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

{do

{printf(" dammi elemento A[%d] \n", i);

scanf("\n%d", &A[i]);

}

while((A[i]%2!=0));

somma=somma+A[i];

B[i]=somma;

}

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

printf(" B[%d]= %d \n", i, B[i]);

Elementi di Informatica

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

media=(float)somma/(float)card;

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

if (A[i]<=media) containf++;

else contasup++;

printf("Media dei valori di A = %f\n", media);

printf

("Numero elementi con valore inferiore o pari alla media = %d\n", containf);

printf

("Numero elementi con valore superiore alla media = %d\n", contasup);

// Salva B su un file sequenziale

FVET=fopen("fileVET.txt","w"); //apre file VET.txt in scrittura

if (FVET == NULL)

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

else

{ for (i=0;i<card;i++) // scrive i valori di B nel file

fprintf(FVET,"%d\n", B[i]);

}

fclose(FVET);

}

Page 121: Hardware e Software - unisannio.it · 2014-12-28 · minimo e della posizione in cui esso si trova nell’array Alla fine del ciclo si stampa il valore minimo e la posizione in cui

121

Elementi di Informatica a.a. 2014/15 - Prof. G.A. Di Lucca

Dipartimento di Ingegneria – Università del Sannio - CdL Ingegneria Energetica

Elementi di Informatica

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

Definizione del problema:

Scrivere, producendo la necessaria documentazione, un programma che,

dato un array bidimensionale MAT di interi, di 10 righe e 15 colonne:

• Consente il riempimento, tramite input da tastiera, dello array in

modo che i valori siano compresi in (-47 , 52) estremi inclusi;

• Calcoli quanti elementi di MAT sono multipli di 3 , 7 , -11;

• Calcoli quanti sono i valori negativi e quanti i positivi in MAT

• Calcoli la media dei valori multipli di 7;

• Salva lo array MAT in un file sequenziale.

LO STUDENTE SVILUPPI IL PROGRAMMA

Esercizio