Upload
duongque
View
221
Download
0
Embed Size (px)
Citation preview
1A.A. 2014/2015Docente: A. Saetti
Elementi di informatica e Programmazione
Elementi di informatica e programmazione – Università di Brescia
Corsi di Laurea di Ing. Informatica, Ing. Elettronica e delle Telecomunicazioni, Ing. dell'Automazione Industriale
Alessandro SaettiMarco Sechi e Alessandro Bugatti
(email: {alessandro.saetti,marco.sechi,alessandro.bugatti}@unibs.it)
Università degli Studi di BresciaA.A. 2014/2015
2A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
FAC SIMILEESAME
3A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
PARTE IFAC SIMILE ESAME
4A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
5A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
55
DOMANDE RISPOSTE CHIUSE
X
6A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
1 bit 0, 12 bit 0, 1, 2, 3 (00, 01, 10, 11)3 bit 0, 1, 2, … 23-1 (000, 001, 010, 011, 100, 101, 110, 111)
…K bit 0 … 2k-1
2 4 8 16 32 64
55
26 6
DOMANDE RISPOSTE CHIUSE
X
7A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Struttura semplificata di una unità centrale di elaborazione e dei suoi collegamenti con le altre unità funzionali
DOMANDE RISPOSTE CHIUSE
X
8A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
La cache è costituita da SRAM (acronimo di Static Random Access Memory). E' un tipo di RAM volatile che non necessita di refresh. La necessità di usare molti componenti per cella le rende però più costose delle DRAM (usate per la ram). Le celle di una SRAM sono costituite sostanzialmente da un particolare circuito
X
9A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
X
V[]
XX=
V[i]=
I=
10A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
X
I
I=I=
F()
Copio il valore
11A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
X
P[1].x=P[1].x=
F()
P[1].x=P[1].x=
12A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
X
13A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE CHIUSE
X
14A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
Quesito 1: Visualizzare i divisori di un intero acquisito da tastiera.
Quesito 2: Visualizzare i primi 1000 numeri con le cifre invertite.
15A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 1 Visualizzare i divisori di un intero acquisito da tastiera.
16A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
1234 10 4
1234 10 3123
Quesito 2: Visualizzare i primi 1000 numeri con le cifre invertite.
10 4
123 10 312 10 4 2
112 10 31 4 2
Per stampare le cifre in modo rovesciato posso seguire questa procedura
10
1 10 0 FINE
17A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
18A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 3: Indicare i bit di segno, mantissa ed esponente della codifica del numero 12.683 in notazione scientifica normalizzata a base 2, definita utilizzando 8 bit per la mantissa, 4 bit per l’esponente e codificando l’esponente in complemento a 2.
12 . 683Codifica di 12 1100 (4 bit) La mantissa è di 8 per cui arrivo alla quarta cifra
1100 . 1010
0.11001010 x 24Mantissa
0Positivo segno
Esponente
0100
19A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 4: Si supponga che la memoria centrale del calcolatore contenga 3 processi P1, P2 e P3; - I tre processi siano inizialmente in stato “pronto” e siano ordinati nel seguente modo nella coda: P1,
P2, P3 ; - Il quanto di tempo della CPU sia di 10 msec;- Il processo P1 esegua una operazione di output che dura 7 msec dopo essere stato in esecuzione per
1msec; - P2 esegua un’operazione di input che dura 20msec dopo 5 msec di esecuzione; - P3 non esegua operazioni di I/O; - il tempo di esecuzione complessivo richiesto da ogni processo sia di 10 msec. Utilizzando un Gantt Chart si indichi per ogni processo quando e quali stati assume prima di terminare.
20A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 5 Si consideri un calcolatore con un banco di 16 registri ad uso generico, parole di memoria di 16 bit ed istruzioni del linguaggio macchina con 4 bit di codice operativo. Scrivere il programma Assembly che incrementa di 1 unità i 30 numeri naturali presenti in un’area contigua della memoria centrale, supponendo che ciascun naturale sia codificato con 2 byte e che il primo byte dell’area di memoria abbia indirizzo uguale a 200. È consentito l’uso delle seguenti istruzioni Assembly.
Possibili formati di codifica delle nostre istruzioni assembler sono:LOADiL RX, VALLOADiH RY, VAL
ADD RX, RY, RZ
LOAD RX, RYSTORE RX, RY
B LABEL
END
Quesito 5
21A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
R3LOAD
STORE
21
21
22 R1
R2
Incremento R3
22
21 22
1
2
3
A
200
260B
4
202
Quesito 5
22A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONELa sequenza dei passaggi che il nostro programma deve svolgere è la seguente:
LOADiL R1 11001000LOADiH R1 00000000
LOADiL R2 00000100LOADiH R2 00000001
Imposto come posizione di partenza 200 (in R1)
Imposto come posizione di arrivo 260 (in R2)
FINE
Non sono giunto in fondo (R1<R2)
NO
SI
Leggo il contenuto indicato in R1e lo sistemo nel registro R3
Incremento il contenuto di R3
Riscrivo il nuovo contenuto di R3nella cella di memoria indicata da R1
Mi sposto al numero successivoincrementando R1 di 2
A
B
1
2
3
4
Quesito 5
23A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTELa memoria centrale non è altro che un insieme di celle accessibili mediante un indirizzo:
Per caricare nel registro R3 il contenuto della cella indicata nel registro R1 (inizialmente contenente l’indirizzo 200) devo eseguire l’istruzione LOAD sotto indicata:
LOAD R3 R1
13
13
OPERAZIONE DI LETTURA IN MEMORIA
Leggo il contenuto indicato in R1e lo sistemo nel registro R3
Quesito 5
24A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
Per incrementare il contenuto di un registro (nel nostro caso R3) possiamo usare la costante 0001
ADD R3 R3 0001
13+…
Si poteva anche inizializzare un registro non ancora usato (esempio R4) con il valore 1 …
Incremento il contenuto di R3
ADD R3 R3 R4
LOADiL R4 00000001LOADiH R4 00000000
… e poi utilizzare l’istruzione ADD a fianco
14 Incremento
1
Quesito 5
25A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
Per scrivere il contenuto del registro R3nella cella indicata nel registro R1 mi basta eseguire la seguente STORE
STORE R1, R3
14
14
OPERAZIONE DI SCRITTURA IN MEMORIA:
Riscrivo il nuovo contenuto di R3nella cella di memoria indicata da R1
Quesito 5
26A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTE
Per spostarsi alla cifra successiva occorre spostarsi di 2 byte (il numero naturale è codificato con 2 byte)
ADD R1, R1, 0010
202
14
Mi sposto al numero successivoincrementando R1 di 2
200
Quesito 5
27A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEAbbiamo tutto quello che ci serve per implementare la soluzione
Imposto come posizione di partenza 200 (in R1)
Imposto come posizione di arrivo 260 (in R2)
FINE
Non sono giunto in fondo (R1<R2)
NO
SI
Leggo il contenuto indicato in R1e lo sistemo nel registro R3
Incremento il contenuto di R3
Riscrivo il nuovo contenuto di R3nella cella di memoria indicata da R1
Mi sposto al numero successivoincrementando R1 di 2
LOADiL R1 11001000LOADiH R1 00000000LOADiL R2 00000100LOADiH R2 00000001
CICLO: LOAD R3 R1ADD R3 R3 0001STORE R1 R3ADD R1 R1 0010BLT R1 R2 CICLO
FINE: END
R1=200 R2=260
R3=
Quesito 5
28A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTESeguendo un procedimento leggermente diverso avremo avuto invece la seguente codifica
LOADiL R1 11001000LOADiH R1 00000000LOADiL R2 00000100LOADiH R2 00000001
INIZIO: BLT R1 R2 CICLOB FINE
CICLO: LOAD R3 R1ADD R3 R3 0001STORE R1 R3ADD R1 R1 0010B INIZIO
FINE: END
R1=
R2=
R3=
Imposto come posizione di partenza 200 (in R1)
Imposto come posizione di arrivo 260 (in R2)
FINE
Se non sono giunto in fondo (R1<R2) NO
SILeggo il contenuto indicato in R1
e lo sistemo nel registro R3
Incremento il contenuto di R3
Riscrivo il nuovo contenuto di R3nella cella di memoria indicata da R1
Mi sposto al numero successivoincrementando R1 di 2
Quesito 5
29A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
PARTE II - PROGRAMMAZIONEFACSIMILE ESERCITAZIONE
30A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Predisporre opportunamente le
sezioni della funzione in modo
adatto alla scrittura su carta
SEZIONE DICHIARAZIONE VARIABILI/ INIZIALIZZAZIONE/INPUT
E' la sezione più corposa predisporre uno spazio sufficientemente ampio
Inserire nella parte più in basso dello spazio a disposizione le eventuali istruzioni di output
SEZIONE CORPO FUNZIONE
SEZIONE OUTPUT / PRESENTAZIONE RISULTATI
Inserire nella parte più in alto dello spazio a disposizione, man mano che servono, le variabili
necessarie al corpo della funzione
SEZIONE DICHIARAZIONE VARIABILI
Inseriamo qui le valorizzazioni iniziali che consentono all’algoritmo implementato nella
funzione di operare correttamente
SEZIONE DICHIARAZIONE VARIABILI
TipoRestituito NomeFunzione(parametri){
return(Valore Restituito);}
INTESTAZIONE DELLA FUNZIONE
VALORI DI RITORNO
31A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Come nei flow chart occorre cercare una
predisposizione spaziale adatta alla presentazione della soluzione su carta.
SEZIONE DICHIARAZIONE VARIABILI/ INIZIALIZZAZIONE/INPUT
E' la sezione più corposa predisporre uno spazio sufficientemente ampio
Inserire nella parte più in basso dello spazio a disposizione le istruzioni di output
SEZIONE ALGORITMO
SEZIONE OUTPUT / PRESENTAZIONE RISULTATI
Inserire nella parte più in alto dello spazio a disposizione, man mano che servono, le variabili
necessarie alla sezione algoritmo
SEZIONE DICHIARAZIONE VARIABILI
Inseriamo qui le valorizzazioni iniziali che consentono all’algoritmo applicato di funzionare
SEZIONE INIZIALIZZAZIONE / INPUT
#include <stdio.h>#include <stdlib.h>
int main(){
system("Pause");return(0);
}
32A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONE
Quesito 1: Visualizzare la quantità di divisori di 10 numeri naturali acquisiti da tastiera. Per svolgere questo compito si definisca ed utilizzi una funzione che produca la quantità di divisori di un dato intero.
33A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
#include <stdio.h>
int divisori(int num){
int i, div = 0;for (i = 1; i <= num; i++)
if (num % i == 0) div = div + 1;return div;
}
int main(void){
int i, x;for (i = 0; i <= 10; i++){
scanf("%d", &x);printf("%d\n", divisori(x));
}return 0;
}
Quesito 1 DOMANDE DI PROGRAMMAZIONE
34A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONEQuesito 2: Acquisire 5 numeri naturali e successivamente per ciascuno di questi numeri visualizzare la x-esima potenza di 2. Per svolgere questo compito si definisca ed utilizzi una funzione che per ciascun intero x in un dato vettore di n variabili intere visualizzi la x-esima potenza di 2. È vietato l’utilizzo delle funzionalità disponibili tramite la libreria math.h.
35A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 2 DOMANDE DI PROGRAMMAZIONE
Pot 120
Pot Pot
Pot=1
21
21Pot=Pot*2
Pot Pot 22
22Pot=Pot*2
1
2
4
Pot Pot 22n-1
2nPot=Pot*2
2n
i
i
i
1
2
n
Calcolo della potenza n‐esima di 2 mediante iterazione
36A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 2 DOMANDE DI PROGRAMMAZIONE
#include <stdio.h>
void potenza(int v[], int n){
int i, j, pot;for (i = 0; i < n; i++){
pot = 1;for (j = 1; j <= v[i]; j++)
pot = pot * 2;printf("%d\n", pot);
}}
int main(void){
int vett[5], i;for (i = 0; i < 5; i++) scanf("%d", &vett[i]);potenza(vett,5);return 0;
}
37A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONEQuesito 3: Acquisire da tastiera 10 date del calendario e successivamente visualizzare il numero di date acquisite che precedono l’ultima data acquisita. Per svolgere questo compito si dichiari una nuova tipologia di dati adatta ai fini dell’esercizio e si definisca ed utilizzi due funzioni C con le seguenti finalità:• Produrre 1 se una data del calendario precede una seconda data del calendario.• Produrre la quantità di date del calendario in un data sequenza di n date del calendario che precedono una data del calendario.
38A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Iniziamo ad analizzare la prima funzione richiesta. Dovrà avere uno schema di questo tipo
ACQUISIRE LA DATA 1 E LA DATA 2
CORPO DELLA FUNZIONE
RESTITUIRE 1 SE DATA1<DATA2 ALTRIMENTI 0
Partendo da questo schema possiamo individuare i parametri essenziali per la nostra funzione . . .
int primaDi(Data d1, Data d2){
// dichiarazione variabili,inizializzazione// CORPO FUNZIONE ...Return (0 oppure 1);
}
1 se la Data1 è precedente alla Data2 altrimenti 0
typedef struct {
int g, m, a;} Data;
. . . e definire la struttura dati necessaria
D1
D2
Quesito 3 DOMANDE DI PROGRAMMAZIONE
39A.A. 2014/2015
CORPO DELLA FUNZIONE
… altrimenti se i mesi nelle due date coincidono …
… altrimenti se gli anni delle due date coincidono …
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Analizziamo ora il corpo della funzione PrimaDi()
Ho considerato tutte le casistiche possibili percui la 1^ data non è precedente alla 2^ data
if (d1.a < d2.a) return 1
Se l’anno della 1^ data è minore dell’anno della 2^ data allora la 1^ data è sicuramente precedente
else if (d1.a == d2.a){
}
… valuto il mese e se quello della 1^ data è inferiorea quello della 2^ data allora la 1^data è
sicuramente precedente
if (d1.m < d2.m) return 1;
… valuto i giorni e se quelli della 1^ datasono inferiori a quelli della 2^ data allora la 1^ data è
sicuramente precedente
else if (d1.m == d2.m){
if (d1.g < d2.g) return 1;
return 0;
Quesito 3 DOMANDE DI PROGRAMMAZIONE
}
40A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Iniziamo ora ad analizzare la seconda funzione richiesta.
ACQUISIRE LA DATA DI RIFERIMENTO,
L’ELENCO DELLE DATE E LA SUA NUMEROSITA’
CORPO DELLA FUNZIONE
RESTITUIRE IL NUMERO DI DATE PRECEDENTI ALLA
DATADI RIFERIMENTO
Partendo da questo schema possiamo individuare i parametri essenziali per la nostra funzione . . .
int numPrecedenze(Data v[], int n, Data ref){
// DICHIARAZIONE VARIABILI// CORPO DELLA FUNZIONEreturn prec;
}
N
Numero di date[] precedenti a una data di riferimento (quindi un int)
Quesito 3 DOMANDE DI PROGRAMMAZIONE
41A.A. 2014/2015
CORPO DELLA FUNZIONE
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Esercizio 6Scrivere la dichiarazione C di un nuovo tipo di struttura dati che aggrega tre variabili intere che rappresentano rispettivamente l'ora, i minuti e i secondi di un determinato orario. Scrivere una funzione C che dati due
orari produce 1 se il primo orario è inferiore al secondo, 0 altrimenti. Scrivere una seconda funzione C che, sfruttando la precedente funzione, restituisca il numero di orari di un dato vettore di n variabili di tipo orario che precedono un orario acquisito da tastiera.
Analizziamo ora il corpo della funzione NumPrecedenze()
for (i=0 ; i < n ; i++){
int i;
Lo scorrimento degli elementi di un elenco richiede l’uso di una variabile contatore
Scorro l’array v[] dal primo all’ultimo elemento
if (primaDi(v[i], ref) == 1) prec = prec + 1
Se la data i‐esima v[i] è precedente alla datadi riferimento incremento la variabile che conteggia il numero di date precedenti
int prec;
int i;int prec=0;
Inserisco le variabili e poi eventualmente le inizializzo
int numPrecedenze(Data v[], int n, Data ref){
}
return prec;}
42A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 2 DOMANDE DI PROGRAMMAZIONE#include <stdio.h>
typedef struct {int g, m, a;
} Data;
int primaDi(Data d1, Data d2){
if (d1.a < d2.a) return 1;
else if (d1.a == d2.a){
if (d1.m < d2.m) return 1;
else if (d1.m == d2.m){
if (d1.g < d2.g) return 1;
}}return 0;
}
43A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 2 DOMANDE DI PROGRAMMAZIONE
int numPrecedenze(Data v[], int n, Data ref){
int i, prec = 0;for (i = 0; i < n; i++)
if (primaDi(v[i], ref) == 1) prec = prec + 1;
return prec;}
int main(void){
Data vett[10];int i;for (i = 0; i < 10; i++)
scanf("%d/%d/%d", &vett[i].g, &vett[i].m, &vett[i].a);printf("%d\n", numPrecedenze(vett, 9, vett[9]));return 0;
}
44A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEULTERIORI ESEMPI FLOW CHART
Quesito 1: Visualizzare in una sequenza di 10 orari quello più vicino a mezzogiorno. L’orario è costituito dalla coppia hh.mm
Quesito 2: Indicare se una matrice NxN di numeri è simmetrica (ovvero se è uguale alla sua trasposta). (2 cicli annidati). Si supponga che l’esecutore sia in grado di interpretare le operazioni riguardanti l’acquisizione di una intera matrice NxN (usare un blocco sottoprogramma).
45A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 1: Visualizzare in una sequenza di 10 orari quello più vicino a mezzogiorno. L’orario è costituito dalla coppia hh.mm
Alcuni passaggi possono essere «formalizzati» immediatamente nel simbolismo visto per i flow chart. Altri invece necessitano di un’ulteriore approfondimento che andremo via via ad analizzare
Inizialmente la parte di inizializzazione sembra superflua. Scrivendo la soluzione su carta conviene comunque lasciare dello spazio per questa sezione
Parte iterata
Leggo per 10 volte degli orari nella forma hh:mm
Lasciamo, visto che si scrive su carta, uno spazio sufficiente a contenere la parte iterata,
46A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Visualizzare in una sequenza di 10 orari quello più vicino a mezzogiorno. L’orario è costituito dalla coppia hh.mm (1 singolo ciclo)Quesito 1
Per valutare l’orario più vicino alle 12.00 devo sapere quale è la differenza minima (diff_minima) riscontrata nei precedenti orari …
HHmin MMmin
HHNMMN
HHN>=12
differenza<diff_minima
SINO
diff_minima=differenzaHHmin=HHN
MMmin=MMN
NO
SI
differenza=(HHN‐12)*60+MMNdifferenza=(12‐HHN)*60‐MMN
Valuto se è il più vicino alle 12:00 fino a quel momentoValuto se è il più vicino alle 12:00 fino a quel momento
DOMANDE RISPOSTE APERTE
47A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Visualizzare in una sequenza di 10 orari quello più vicino a mezzogiorno. L’orario è costituito dalla coppia hh.mm (1 singolo ciclo)Quesito 1
… ma il primo orario letto con quale diff_minima deve essere messo a confronto ?
Parte iterata
All’inizio devo impostare la variabile diff_minima con la massima differenza possibile ovvero 12*60+1. Questo assegnamento va posto nel blocco relativo all’inizializzazione dell’algoritmo.
diff_minima=12*60+1
DOMANDE RISPOSTE APERTE
48A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Per ottimizzare la disposizione dei blocchi su un foglio di carta è consigliabile disporre gli elementi del flow chart seguendo una disposizione spaziale che dia ampio spazio alla «parte iterata» che solitamente risulta essere quella più articolata.
49A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Visualizzare in una sequenza di 10 orari quello più vicino a mezzogiorno. L’orario è costituito dalla coppia hh.mm (1 singolo ciclo)Quesito 1Seguendo la disposizione spaziale consigliata otteniamo la soluzione finale
DOMANDE RISPOSTE APERTE
50A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 2: Indicare se una matrice NxN di numeri è simmetrica (ovvero se è uguale alla sua trasposta). (2 cicli annidati). Si supponga che l’esecutore sia in grado di interpretare le operazioni riguardanti l’acquisizione di una intera matrice NxN (usare un blocco sottoprogramma).
Alcuni passaggi possono essere «formalizzati» immediatamente nel simbolismo visto per i flow chart. Altri invece necessitano di un’ulteriore approfondimento che andremo via via ad analizzare
Inizialmente la parte di inizializzazione sembra superflua. Scrivendo la soluzione su carta conviene comunque lasciare dello spazio per questa sezione
Loop esterno
Scorro per N volte le righe della matrice
Loop interno
Lascio in sospeso l’output del nostro algoritmo
Per ogni r-esima riga scorro per N volte le colonne della matrice
51A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 2 Indicare se una matrice NxN di numeri è simmetrica ovvero è uguale alla sua trasposta. (2 cicli annidati)
… appena un elemento della matrice risulta diverso dal suo corrispondente trasposto la matrice non sarà più simmetrica!
MR,C!= MR,CSI
NOSimmetrica=0
Valuto se l’elemento M[R,C]!=M[C,R] e se si allora la matrice M non è simmetrica
Simmetrica==1 SINO
Enuncio se la matrice è simmetrica oppure no
«E’ simmetrica»
«Non è’ simmetrica»
Simmetrica=1Ipotizzo inizialmente che la mia matrice sia simmetrica
Sostituiamo i blocchetti contenenti la «descrizione informale»
12
1
3
DOMANDE RISPOSTE APERTE
52A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Effettuando le opportune sostituzioni otteniamo la seguente soluzione
Quesito 2 Indicare se una matrice NxN di numeri è simmetrica ovvero è uguale alla sua trasposta. (2 cicli annidati)DOMANDE RISPOSTE APERTE
53A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Per ottimizzare la disposizione dei blocchi su un foglio di carta è consigliabile disporre gli elementi del flow chart seguendo una disposizione spaziale che dia ampio spazio alla «parte iterata» che solitamente risulta essere quella più articolata.
Parte iterata esterna
54A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Seguendo la disposizione spaziale consigliata otteniamo la soluzione finaleQuesito 2 Indicare se una matrice NxN di numeri è simmetrica ovvero è uguale alla sua trasposta. (2 cicli annidati)
DOMANDE RISPOSTE APERTE
55A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 3: Indicare i bit di segno, mantissa ed esponente della codifica del numero -0.3203125 in notazione scientifica normalizzata a base 2, definita utilizzando 8 bit per la mantissa, 4 bit per l’esponente e codificando l’esponente in complemento a 2.
-0 . 3203125
Codifica di 0 0 (1 bit)
La mantissa è di 8 per cui arrivo alla settima cifra
0 . 01010010.10100100 x 2-1
Mantissa
1Negativo segno
Esponente
1111
0001
Complemento i singoli bit
Aggiungo 1
1110
Normalizzo la rappresentazione
56A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 4: Si supponga che la memoria centrale del calcolatore contenga 3 processi P1, P2 e P3; -I 3 processi siano inizialmente in stato “pronto” e siano ordinati nel seguente modo nella coda: P1, P2, P3 ; -Il quanto di tempo della CPU sia di 10 msec;-Il processo P1 esegua una operazione di output che dura 7 msec dopo essere stato in esecuzione per 1msec e questo per 2 volte; -P2 esegua un’operazione di input che dura 17msec dopo 5 msec di esecuzione; -P3 non esegua operazioni di I/O; -il tempo di esecuzione complessivo richiesto da ogni processo è rispettivamente: 4 msec. P1 - 10 msec. P2 e 20 msec. P3Utilizzando un Gantt Chart si indichi per ogni processo quando e quali stati assume prima di terminare.
57A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE RISPOSTE APERTEQuesito 5 Si consideri un calcolatore con un banco di 16 registri ad uso generico, parole di memoria di 16 bit ed istruzioni del linguaggio macchina con 4 bit di codice operativo. Scrivere il programma Assembly che moltiplica due numeri naturali positivi presenti in un’area contigua della memoria centrale a partire dall’indirizzo 200. Supponiamo che ciascun naturale sia codificato con 2 byte e che il risultato venga scritto nell’area di memoria con indirizzo uguale a 300. È consentito l’uso delle seguenti istruzioni Assembly.
58A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
R2
R3
R4
Moltiplico R2 * R3
LOAD
LOAD
STORE
59A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
La sequenza dei passaggi che il nostro programma deve svolgere è la seguente:
LOADiL R1 11001000LOADiH R1 00000000LOAD R2 R1 ; R2 M[R1]
Imposto la posizione del secondo fattore (202 in R1)
FINE
Leggo il contenuto indicato in R1e lo sistemo nel registro R2
Scrivo il nuovo contenuto di R4nella cella di memoria indicata da R1
Imposto la posizione del primo fattore (200 in R1)
Leggo il contenuto indicato in R1e lo sistemo nel registro R3
Calcolo il prodotto tra R3 e R2 e lo riverso in R4
Imposto la posizione in ram del risultato (300 in R1)
LOADiL R1 11001010LOADiH R1 00000000LOAD R3 R1 ; R3 M[R1]
LOADiL R1 00101100LOADiH R1 00000001STORE R1 R4 ; M[R1] R4
Quesito 5 DOMANDE RISPOSTE APERTE
END
60A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
Non avendo a disposizione l’istruzione relativa al prodotto posso sostituirla con una somma multipla. In altre parole per implementare il prodotto M x N …
… sommo M volte il valore N
R2 R3
Rappresenta NRappresenta il prodotto P
R4
R3
1
R2
R5
R4
Rappresenta M
Rappresenta N
Rappresenta M
61A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
Quindi per implementare il prodotto MxN (R2xR3) posso inizializzare un registro (esempio R4) con il valore 0 e successivamente, per M (R2) volte, aggiungere a R4 il valore N (R3). Per conteggiare il numero di somme multiple effettuate avrò bisogno di un ulteriore registro (R5).
0 5
…10
2
01 Ad ogni somma incremento R5
e solo quando diventa uguale a M‐1 (R2) smettoRappresenta il contatore
3Primo fattore M
Secondo fattore N
M-1
R5
R4 R3
R2
4
3
Rappresenta il risultato
Sommo ripetutamente a R4 il contenuto di R3 (N)
62A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
1
Incremento il contatore R5 di 1 (R1)
Sommo il contenuto del registro R3 al contenutodel registro risultato R4
Azzero il registro (R4) che conterrà il risultato
Imposto a 0 il registro contatore R5
LOADiL R4 00000000LOADiH R4 000000002
LOADiL R5 00000000LOADiH R5 00000000
3 CICLO: ADD R4 R4 R3
ADD R5 R5 0001
NO
SINon ho finito ?
(R5<R2)
4
BLT R5 R2 CICLO ;(4)
Parto da 0 poiché l’istruzione di salto è basata sull’operatore di
confronto «minore»
Calcolo il prodotto tra R3 e R2 e lo riverso in R4
63A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
LOADiL R1 11001000 ; indirizzo 1^ fattore MLOADiH R1 00000000LOAD R2 R1 ; R2 M[R1]LOADiL R1 11001010 ; indirizzo 2^ fattore NLOADiH R1 00000000LOAD R3 R1 ; R3 M[R1]LOADiL R4 00000000 ; azzero il risultatoLOADiH R4 00000000LOADiL R5 00000000 ; contatoreLOADiH R5 00000000
CICLO: ADD R4 R4 R3ADD R5 R5 0001 ; incremento contatoreBLT R5 R2 CICLOLOADiL R1 00101100LOADiH R1 00000001STORE R1 R4 ; M[R1] R4END
R1= R2=3 R3=5 R4= R5=contatorerisultato2^ fattoreIndirizzo 1^ fattore
64A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Quesito 5 DOMANDE RISPOSTE APERTE
1
Incremento il contatore R5 di 1 (R1)
FINE
Sommo il contenuto del registro R3 al contenutodel registro risultato R4
Azzero il registro (R4) che conterrà il risultato
Imposto a 0 il registro contatore R5
LOADiL R4 00000000LOADiH R4 00000000
2
LOADiL R5 00000000LOADiH R5 00000000
3 CICLO: ADD R4 R4 R3
ADD R5 R5 0001
NOSI
Non ho finito ?(R5<R2)
4
INIZIO: BLT R5 R2 CICLOB FINE
Calcolo il prodotto tra R3 e R2 e lo riverso in R4 Se N o M possono essere nulli il
programma deve essere modificato in questo modo
B INIZIO
FINE: END
65A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONE
Quesito 1: Visualizzare il numero di una sequenza di 10 numeri naturali che risulti più vicino alla loro media. Per svolgere questo compito si definisca ed utilizzi una funzione che dato un elenco di valori restituisca tale valore .
66A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Il funzione C che dovremo implementare sarà caratterizzata da una struttura di questo tipo:
ACQUISIRE L’ELENCO DI VALORI IN UN VETTORE X[] E
LA SUA DIMENSIONE N
CORPO DELLA FUNZIONE
RESTITUIRE IL VALORE PIU’ VICINO ALLA MEDIA
N
Numero di X[i] più vicino alla media (quindi un double)
Partendo da questo schema possiamo individuare i parametri essenziali per la nostra funzione
double NrPiuVicinoAllaMedia(double X[], int n){
// dichiarazione variabili,inizializzazione// CORPO FUNZIONE ...return piuvicino;
}
Quesito 1 DOMANDE DI PROGRAMMAZIONE
67A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Continuiamo ad analizzare il corpo della nostra funzione
CALCOLO LA MEDIA
NrPiuVicinoAllaMedia(double X[], int n){
// dichiarazione variabili,inizializzazionedouble media, piuvicino, distanzaminima;int i;// CORPO FUNZIONE ...
// Restituzione risultatireturn piuvicino;
}
// B) Calcolo il valore + vicinopiuvicino=X[0];distanzaminima=fabs(X[0]-media);for (i=1 ; i<n ; i++){
if (fabs(X[i]-media)<distanzaminima){
piuvicino=X[i];distanzaminima=fabs(X[i]-media);
}}
// A) Calcolo la mediamedia=0;for (i=0; i<n ; i++)
media=media+X[i];media=media/n;
SCORRO L’ELENCO DEI VALORI, CALCOLO LA
DIFFERENZA E LOCALIZZO
L’ELEMENTO PIU’ VICINO
Quesito 1 DOMANDE DI PROGRAMMAZIONE
68A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Scriviamo quindi il corpo della nostra funzione.
double NrPiuVicinoAllaMedia(double X[], int n){
// Dichiarazione delle variabili /inizializzazionedouble media =0, piuvicino=X[0], distanzaminima;int i;// Corpo della funzione// A) Calcolo la mediafor (i=0; i<n ; i++)
media=media+X[i];media=media/n;printf("La media e': %.2f",media);// B) Calcolo il valore + vicinodistanzaminima=fabs(X[0]-media);for (i=1 ; i<n ; i++){
if (fabs(X[i]-media)<distanzaminima){
piuvicino=X[i];distanzaminima=fabs(X[i]-media);
}}// Restituzione risultatoreturn piuvicino;
}
Quesito 1 DOMANDE DI PROGRAMMAZIONE
69A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Se si volesse poi testare la funzione appena prodotta possiamo inserirla all’interno del seguente programma C.
#include <stdio.h>#include <math.h>#define N 5double NrPiuVicinoAllaMedia(double X[], int n){
// Dichiarazione delle variabili /inizializzazionedouble media =0, piuvicino=X[0], distanzaminima;int i;// Corpo della funzione// A) Calcolo la mediafor (i=0; i<n ; i++)
media=media+X[i];media=media/n;printf("La media e': %.2f",media);// B) Calcolo il valore + vicinodistanzaminima=fabs(X[0]-media);for (i=1 ; i<n ; i++){
if (fabs(X[i]-media)<distanzaminima){
piuvicino=X[i];distanzaminima=fabs(X[i]-media);
}}// Restituzione risultatoreturn piuvicino;
}
int main(){
double X[N]={3, 7.3, 8.23, 3, 23.1};double risultato=NrPiuVicinoAllaMedia(X,N);printf("Il valore + vicino alla media e': %.2f",risultato);
}
Quesito 1 DOMANDE DI PROGRAMMAZIONE
70A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONE
Quesito 2: Acquisire un elenco di 10 numeri naturali e successivamente restituirne la «moda» (il valore più frequente). Per svolgere questo compito si definisca ed utilizzi una funzione che dato vettore di n variabili intere visualizzi l’elemento più frequente
71A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
La funzione C che dovremo implementare sarà caratterizzata da una struttura di questo tipo:
ACQUISIRE IL VETTORE X[] E LA SUA DIMENSIONE N
CORPO DELLA FUNZIONE(DOPPIO CICLO)
MOSTRO IL VALORE PIU’ FREQUENTE (MODA)
N
Partendo da questo schema possiamo individuare i parametri essenziali per la nostra funzione
int EstraiLaModa(int X[], int n){
// dichiarazione variabili,inizializzazione// CORPO FUNZIONE ...Return moda;
}
Quesito 2 DOMANDE DI PROGRAMMAZIONE
Numero di X[i] più frequente (quindi un int)
72A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Il corpo della nostra funzione potrebbe implementare il seguente algoritmo:
Lo scorrimento degli elementi di un elenco richiede l’uso di una variabile contatore
Scorro l’array originale X[] e ricopio i valori, eliminando i duplicati, nell’array Distinto[]
Se è una successiva occorrenza del numero incremento di 1 il conteggio
Mi serve una variabile per il conteggio dei numeri distinti
1
Contemporaneamente per ogni valore distinto Distinti[j] conteggio il numero di occorrenze in Conta[j]
Se X[i] è la prima occorrenza in Distinti[j]Se X[i] è la prima occorrenza in Distinti[j]
VEROFALSO
Quesito 2 DOMANDE DI PROGRAMMAZIONE
73A.A. 2014/2015
// A - Conteggio la frequenza di ogni numerofor (i=0 ; i<n ; i++){
ENuovo=true; // ipotizzo che sia un nuovo valorefor (j=0 ; j<nDistinti ; j++){
if (X[i]==Distinti[j]){
Conta[j]++;ENuovo=false;break;
}}if (ENuovo==true){
Distinti[nDistinti]=X[i];Conta[nDistinti]++;nDistinti++;
}}
bool ENuovo;int i, j;int Conta[N]={0}, maxConta;int Distinti[N]={0};int nDistinti=0;
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Scriviamo il corpo della nostra funzione
SCORRO L’ELENCO DAL PRIMO
ALL’ULTIMO ELEMENTO Xi DEL VETTORE X[] ED ESTRAGGO LE
SINGOLE OCCORRENZE E
CONTEMPORANEAMENE CONTEGGIO LE
ISTANZE. .
Man mano servono dichiaro le singole variabili
Quesito 2 DOMANDE DI PROGRAMMAZIONE
74A.A. 2014/2015
// B - Determinazione del nr + frequentemaxConta=Conta[0];Moda=Distinti[0];for (j=1; j<nDistinti ; j++)
if (maxConta < Conta[j]){
maxConta=Conta[j];Moda=Distinti[j];
}
int Moda;int maxConta;
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Scriviamo il corpo della nostra funzione
… POI SCORRO L’ARRAY DEI
CONTEGGI CONTA[] ALLA RICERCA DEL
VALORE IN DISTINTI[] PIU’ FREQUENTE
Man mano servono aggiungo ulteriori variabili
Quesito 2 DOMANDE DI PROGRAMMAZIONE
75A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Scriviamo quindi il corpo della nostra funzione.int EstraiLaModa(int X[], int n){
// Dichiarazione variabili/inizializzazionebool ENuovo;int Moda,i, j;int Conta[N]={0}, maxConta;int Distinti[N]={0};int nDistinti=0;// Corpo funzione// A - Conteggio la frequenza di ogni numerofor (i=0 ; i<n ; i++){
ENuovo=true; // ipotizzo che sia un nuovo valorefor (j=0 ; j<nDistinti ; j++){
if (X[i]==Distinti[j]){
Conta[j]++;ENuovo=false;break;
}}if (ENuovo==true){
Distinti[nDistinti]=X[i];Conta[nDistinti]++;nDistinti++;
}}// Determinazione del nr + frequentemaxConta=Conta[0];Moda=Distinti[0];for (j=1; j<nDistinti ; j++)
if (maxConta < Conta[j]){
maxConta=Conta[j];Moda=Distinti[j];
}// Restituzione del valorereturn Moda;
}
Quesito 2 DOMANDE DI PROGRAMMAZIONE
76A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
DOMANDE PROGRAMMAZIONEQuesito 3: Acquisire da tastiera 10 orari e successivamente visualizzare il numero di secondi trascorsi tra l’orario minore e quello maggiore. Per svolgere questo compito si dichiari una nuova tipologia di dati adatta ai fini dell’esercizio e si definisca ed utilizzi due funzioni C con le seguenti finalità:• Produrre il numero di secondi trascorsi dall’inizio della giornata dell’orario passato come argomento.• Produrre la durata della fascia temporale in secondi occupata dall’elenco di orari registrati in un determinato vettore di n variabili di tipo orario
77A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
#include <stdio.h>#define N 5typedef struct{
int ora;int minuti;int secondi;
} tOrario;
void StampaOrario(tOrario O){
printf("%2d:%2d:%2d",O.ora,O.minuti,O.secondi);}
// ------------------------------------------------------------int SecondiTrascorsi(tOrario A){
int tSecA;tSecA=A.ora*60*60+A.minuti*60+A.secondi;return tSecA;
}
Quesito 3 DOMANDE DI PROGRAMMAZIONE
78A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
int DurataFasciaOrariaOccupata(tOrario Orari[], int n){
// Devo determinare il minimo e il massimo orariotOrario vMin,vMax;int tSecMax, tSecMin, tSec, i;// InizializzazionetSecMin=SecondiTrascorsi(Orari[0]);tSecMax=SecondiTrascorsi(Orari[0]);vMin=Orari[0];vMax=Orari[0];for (i=1 ; i < n ; i++){
tSec=SecondiTrascorsi(Orari[i]);if (tSec < tSecMin) {
tSecMin=tSec; vMin=Orari[i];
}if (tSec > tSecMax) {
tSecMax=tSec; vMax=Orari[i];
}}printf("Fascia considerata: ");StampaOrario(vMin);printf(" - ");StampaOrario(vMax);printf("\n");// Calcolo la differenza in secondi tra l'orario minimo// e quello massimotSec=SecondiTrascorsi(vMax)-SecondiTrascorsi(vMin);return tSec;
}
Quesito 3 DOMANDE DI PROGRAMMAZIONE
79A.A. 2014/2015Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
int main(){
tOrario Orario;tOrario Orari[N] = {
{21, 56, 18 },{14, 2, 13 },{14, 2, 58 },{21, 46, 58 },{ 9, 14, 59 }
};
printf("La fascia oraria occupata dagli orari dura %d secondi",DurataFasciaOrariaOccupata(Orari,N));
return(0);}
Quesito 3 DOMANDE DI PROGRAMMAZIONE
80A.A. 2014/2015Docente: A. Elementi di Informatica e Programmazione –
81A.A. 2014/2015
D1
R5
82A.A. 2014/2015