politecnico di milano esercizi preparazione alla prima prova intermedia

Post on 01-May-2015

216 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PolitecnicoPolitecnicodi Milanodi Milano

EserciziEsercizi

Preparazione alla prima prova intermediaPreparazione alla prima prova intermedia

- - 22 - -

FiltraggioFiltraggio

L’utente inserisce un array di numeri reali non negativi (un numero negativo indica la fine della fase di inserimento)L’elaboratore calcola la seguente formula:

v[i] (v[i-1] + v[i] + v[i+1]) / 3

e visualizza l’array così filtratoQuando i corrisponde ai “bordi” dell’array, assumere che v[i-1] (oppure v[i+1]) valga zero.

- - 33 - -

FiltraggioFiltraggio

#include <stdio.h>void main(){unsigned int tot = 0, i; float n, precedente, successivo, numeri[100]; printf ("Numero non negativo: ");

scanf ("%f", &n);while (n >= 0){

numeri[tot] = n;tot++;

printf ("Numero non negativo: ");scanf ("%f", &n);

} .

- - 44 - -

FiltraggioFiltraggio

for (i = 0; i < tot; i++){

if (i == 0) {

precedente = 0; }

else {

precedente = numeri[i - 1]; }

.

- - 55 - -

FiltraggioFiltraggio

if (i == tot - 1) {

successivo = 0; }

else {

successivo = numeri[i + 1]; }

printf ("%f\n", (precedente + numeri[i] + successivo)/3.0);

} /* fine ciclo for */} .

- - 66 - -

TrasformazioneTrasformazione

L’utente inserisce un array di numeri interi, di lunghezza desiderataChiamando v l’array e indicando con m la posizione dell’ultima cella inserita (l’array sarà quindi composto da m+1 celle), il programma applica il seguente calcolo:

per ogni i: in v[i] ed in v[m-i] si inserisce il valore v[i]+v[m-i]

Esempio:v[0, 3, -7, 5, -2] v[-2, 8, -14, 8, -2]v[5, -7, 3, 2] v[7, -4, -4, 7].

- - 77 - -

#include <stdio.h>void main(){

const unsigned int MAX = 100;unsigned int tot, m, i;int numeri[MAX], temp;

printf ("Quanti numeri: ");scanf ("%u", &tot);/* saranno riempite tot celle, da 0 a tot-1 */for (i = 0; i < tot; i++){

printf ("Numero:");scanf ("%d", &numeri[i]);

}m = tot - 1;

.

TrasformazioneTrasformazione

- - 88 - -

for (i = 0; i <= m / 2; i++){

temp = numeri[i] + numeri[m - i];numeri[i] = temp;numeri[m - i] = temp;

}for (i = 0; i < tot; i++){

printf ("%d\n", numeri[i]);}

} .

TrasformazioneTrasformazione

- - 99 - -

Def. Struttura datiDef. Struttura dati

Si definisca il tipo strutturato Esame che permetta di rappresentare le informazioni riguardanti un esame superato da un certo studente. Esame è composto dai seguenti dati:

codiceCorso: una sequenza di 6 caratteri,votoRiportato: numero intero non negativo, annoAccademico: numero intero non negativo;

Si definisca il tipo strutturato Studente che permetta di rappresentare informazioni riguardanti tutti gli esami superati da un certo studente. Studente è composto dai seguenti dati:

matricola: una sequenza di 6 caratteri;vettEsamiSuperati: un vettore composto da 30 celle di tipo EsamenumeroEsamiSuperati: numero intero non negativo;

- - 1010 - -

Def. Struttura datiDef. Struttura dati

Si definisca inoltre la variabile vettStudenti, che permetta di rappresentare l’insieme degli studenti ad una certa università. L’università in questione potrà gestire un massimo di 1000 studenti.

Supponendo di riferirsi ad una architettura in cui una variabile di tipo char occupi 1 byte e un intero occupi 2 byte, calcolare l’occupazione in memoria della variabile vettStudenti.

- - 1111 - -

typedef struct{

char codiceCorso[6];unsigned int votoRiportato; unsigned int annoAccademico;

} Esame;

typedef struct{

char matricola[6];Esame vettEsamiSuperati[30];unsigned int numeroEsamiSuperati;

} Studente;

Studente vettStudenti[1000];

Def. Struttura datiDef. Struttura dati

- - 1212 - -

Def. Struttura datiDef. Struttura dati

Occupazione di memoria:

Esame: 6 caratteri x 1 byte + 1 intero x 2 byte + 1 intero x 2 byte = 10 byte

Studente: 6 caratteri x 1 + 30 Esame x 10 byte + 1 intero x 2 byte = 308 byte

Quindi, vettStudenti: 1000 Studente x 308 byte = 308000 byte.

- - 1313 - -

Offerte fornitoriOfferte fornitori

Il programma permette di inserire un certo numero di offerte di fornitori:

Codice fornitore (numero naturale)Nome fornitore (stringa)Importo offerta in euro (numero float)

Quando l’utente inserisce 0 come codice fornitore, l’inserimento ha termine.Il programma cerca e visualizza l’offerta migliore (la più economica).

- - 1414 - -

#include <stdio.h>void main(){

const unsigned int MAX_OFFERTE=1000, MAX_CAR=20;

typedef char Stringa[MAX_CAR];typedef struct{

unsigned int codFornitore;Stringa nomeFornitore;float importo;

} Offerta;

Offerta arrayOfferte[MAX_OFFERTE], nuovaOfferta;int numOfferte = 0, j;float offertaMin;unsigned int posizOffertaMin; .

Offerte fornitoriOfferte fornitori

- - 1515 - -

printf ("Codice fornitore: ");scanf ("%u", &nuovaOfferta.codFornitore);printf ("Nome fornitore: ");scanf ("%s", nuovaOfferta.nomeFornitore);printf ("Importo offerta (euro): ");scanf ("%f", &nuovaOfferta.importo);while (nuovaOfferta.codFornitore != 0){

arrayOfferte[numOfferte] = nuovaOfferta;numOfferte++;printf ("Codice fornitore: ");scanf ("%u", &nuovaOfferta.codFornitore);printf ("Nome fornitore: ");scanf ("%s", nuovaOfferta.nomeFornitore);printf ("Importo offerta (euro): ");scanf ("%f", &nuovaOfferta.importo);

} .

Offerte fornitoriOfferte fornitori

- - 1616 - -

offertaMin = arrayOfferte[0].importo;posizOffertaMin = 0;for (j = 1; j < numOfferte; j++){

if (arrayOfferte[j].importo < offertaMin){

offertaMin = arrayOfferte[j].importo;posizOffertaMin = j;

} }printf ("Cod.fornitore:%u,nome:%s,importo:%f\n",

arrayOfferte[posizOffertaMin].codFornitore, arrayOfferte[posizOffertaMin].nomeFornitore,

arrayOfferte[posizOffertaMin].importo);} .

Offerte fornitoriOfferte fornitori

- - 1717 - -

Varie: CVarie: C

Programmazione:Tipi strutturati (lettura, copia, stampa)Array (lettura, copia, stampa)Funzioni (var. locali/globali, regole di visibilità, parametri di ingresso, valore di ritorno, prototipo) Algoritmi “tipici”:

Scambio contenuto di due variabili, multiploArray: max/min, somme elementi, media, ordinamento, ricerca, merge

Definizione di un tipo strutturato complesso:Campi a loro volta strutturatiCampi arrayCalcolo dello spazio allocato in memoria; bit o byte.

- - 1818 - -

Varie: assegnamento con Varie: assegnamento con vettorivettori

Variabili di tipo semplice (int, float, …):

int a = 3, b = 4;a = b;

Variabili array :

char a[10], b[10];a = b;

- - 1919 - -

ilMioRecord2

? ?? ?

? ??

ilMioRecord

?

Varie: assegnamento con Varie: assegnamento con structstruct

Tipi strutturati:

typedef struct{

char campo1;float campo2;int campo3[2];

} Record;

Record ilMioRecord1, ilMioRecord2;

ilMioRecord1.campo1 = 'A';ilMioRecord1.campo2 = 24.56;ilMioRecord1.campo3[0] = 23;ilMioRecord1.campo3[1] = 45;

ilMioRecord2 = ilMioRecord1;

24.56 23A

ilMioRecord1

45

ilMioRecord2

24.56 23A 45

- - 2020 - -

Varie: arrayVarie: array

Copia di un array:char a[10], b[10];unsigned int i, lungh;

…l’array a viene riempito con lungh caratteri…

for (i = 0; i < lungh; i++){

b[i] = a[i];}

Quando usare un’array?Leggo più dati, con il medesimo contenuto informativo, sui quali eseguirò il medesimo algoritmoI dati, per essere elaborati, devono essere tutti presenti (no elaborazione “al volo”); oppure devono essere conservati (es. stampa dopo elaborazione).

- - 2121 - -

Diagramma a blocchi Diagramma a blocchi e traccia di esecuzionee traccia di esecuzione

A) Sia data una sequenza di numeri interi positivi diversi da zero. I valori sono letti in input da tastiera. La fine dell’input è indicata dall’inserimento dello 0. Si calcoli:

Il numero di coppie di numeri consecutivi ugualiIl numero di coppie in cui il secondo numero e’ divisore del primo, ma non ugualeSi visualizzi un messaggio che dica quale tipo di coppie tra i due precedenti è presente in numero maggiore.

Ad esempio, se la sequenza letta in input è 5 5 5 5 5 2 3 12 6 2, allora l’algoritmo calcolerà 4 come n.ro di coppie di interi uguali e 2 come n.ro di coppie in cui il secondo numero è divisore del primo e visualizzerà il messaggio: “La sequenza contiene un numero maggiore di coppie di numeri uguali”.

B) Si costruisca la traccia di esecuzione del programma in corrispondenza della sequenza di ingresso: 4 4 4 2 9

NOTA: non è necessario controllare che i dati di ingresso siano maggiori o uguali a 0

- - 2222 - -

divis = 0; ugua = 0

d1 != 0

d2 != 0

d1 == d2

ugua++

d1 = d2

d1 % d2 == 0

divis++

A

ugua!= 0 ||divis != 0

ugua > divis

A

V

F

F

V

F

V

F

V

V

F

V

F

0

1

2

3

15

184

5

6

8

7 9

10

11

16

14

12

13

18

Leggi d1

“Sequenzanon esiste”

Inizio

Fine

Leggi d2

“Nessunacoppia”

“Più coppiecon divisore”

“Più coppieuguali”Fine

- - 2323 - -

Traccia di esecuzione - 1Traccia di esecuzione - 1

Nº blocco

Prox blocco

test d1 d2 divis ugua

1 2 0 0

2 3 4

3 4 V

4 5 4

5 6 V

6 7 V

7 10 1

10 4 4

4 5 4

- - 2424 - -

Traccia di esecuzione - 2Traccia di esecuzione - 2

Nº blocco

Prox blocco

test d1 d2 divis ugua

5 6 V

6 7 V

7 10 2

10 4 4

4 5 2

5 6 V

6 8 F

8 9 V

9 10 1

- - 2525 - -

Traccia di esecuzione - 3Traccia di esecuzione - 3

Nº blocco

Prox blocco

test d1 d2 divis ugua

10 4 2

4 5 9

5 6 V

6 8 F

8 10 F

10 4 9

4 5 0

5 11 F

11 12 V (1) (2)

- - 2626 - -

Traccia di esecuzione - 4Traccia di esecuzione - 4

Nº blocco

Prox blocco

test d1 d2 divis ugua

12 13 V (1) (2)

13 18

18 -

- - 2727 - -

Varie: diagramma a blocchiVarie: diagramma a blocchi

Diagramma a blocchi:E’ necessario usare i vettori?Numerare i blocchi

Traccia di esecuzione:Non ripetere il valore delle variabili se il contenuto non viene modificato

I valori tra parentesi servono solo per maggiore chiarezza

Usare lo stile visto a lezione per num. blocchi, variabili, test, ecc.

- - 2828 - -

Varie: codifica binariaVarie: codifica binaria

Usare il numero di bit corretto per codifica e calcoliIn CPL2 i numeri non negativi cominciano con uno zero!Formula logica tabella della verità formula logicaNella tabella della verità, ordinare i bit secondo la modalità vista a lezione

top related