• Non ci sono risultati.

Prova scritta per studenti di Ing. Elettronica e Ing. Gestionale immatricolati negli anni accademici 2016-17 e precedenti – DURATA DELLA PROVA: 3 ORE

N/A
N/A
Protected

Academic year: 2021

Condividi "Prova scritta per studenti di Ing. Elettronica e Ing. Gestionale immatricolati negli anni accademici 2016-17 e precedenti – DURATA DELLA PROVA: 3 ORE "

Copied!
1
0
0

Testo completo

(1)

Università degli Studi di Udine

Fondamenti di Programmazione + Architettura dei calcolatori / Fondamenti di Informatica II (prof. Montessoro)

7 febbraio 2019

Prova scritta per studenti di Ing. Elettronica e Ing. Gestionale immatricolati negli anni accademici 2016-17 e precedenti – DURATA DELLA PROVA: 3 ORE

Matricola __________________

Nome _____________________

Cognome __________________

A pena di annullamento immediato della prova:

1) Non è possibile consultare libri o appunti (in qualunque forma) né utilizzare calcolatrici, telefoni cellulari, ecc.

2) Non è consentito comunicare (con qualunque mezzo) 3) Non è consentito uscire dall’aula

Lo studente è tenuto a scrivere, correggere, compilare ed eseguire su computer (a casa o in laboratorio) gli esercizi di programmazione prima della prova orale. Alla prova orale lo studente deve portare una memory pen USB contenente i sorgenti dei programmi corretti e le stampe dei relativi file.

1. (4 punti) Ricevete un messaggio protetto con CRC generato con G(x) = 1010. Il messaggio è 10110101010.

a) È corretto?

b) Quali sono i bit del messaggio corretto?

c) Cosa bisogna fare per correggere il o i bit errati?

(riportare tutti i passaggi effettuati) (svolgere sul retro)

Si consideri la libreria in linguaggio C per manipolare file bitmap vista a lezione, così definita:

typedef unsigned char byte;

typedef unsigned short int word;

typedef unsigned long int dword;

#define BMPFILETYPE 0x4D42 typedef struct tagCOLORTRIPLE {

byte blue;

byte green;

byte red;

} COLORTRIPLE;

typedef struct tagFILEHEADER {

word ImageFileType;

dword FileSize;

word Reserved1;

word Reserved2;

dword ImageDataOffset;

} FILEHEADER;

typedef struct tagBMPHEADER {

dword HeaderSize;

dword ImageWidth;

dword ImageHeight;

word NumberOfImagePlanes;

word BitsPerPixel;

dword CompressionMethod;

dword SizeOfBitmap;

dword HorizonalResolution;

dword VerticalResolution;

dword NumberOfColorsUsed;

dword

NumberOfSignificantColors;

} BMPHEADER;

typedef struct tagBITMAP {

dword width;

dword height;

COLORTRIPLE *pixel;

FILEHEADER fileheader;

BMPHEADER bmpheader;

} BITMAP;

#define PIXEL(image, row, column) \ image.pixel [(row( * image.width +

(column)]

BITMAP ReadBitmap (FILE *fp);

void WriteBitmap (BITMAP bitmap, FILE *fp);

BITMAP CreateEmptyBitmap

(dword height, dword width);

void ReleaseBitmapData (BITMAP *bitmap);

2. (5 punti) La stampa delle fotografie mediante pellicola fotografica faceva uso del “negativo”, dove la luminosità dei punti era invertita rispetto all’immagine che si voleva ottenere.

Si vuole ora simulare l’effetto del negativo in bianco e nero partendo da un’immagine digitale a colori. Per farlo, è necessario convertire ciascun pixel in bianco e nero, come visto a lezione, e poi sostituire i valori dei colori primari con il complemento al massimo valore rappresentabile. Il risultato è quello illustrato nell’esempio a lato.

Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita, e generi nel file di uscita l’immagine negativa come sopra descritto.

(svolgere sul retro)

Un elaboratore (il modello didattico SimCPU visto a lezione) dispone di CPU (a 16 bit) con 16 registri di uso generale (R0, R1, ..., R15) più il Program Counter, l’Instruction Register, lo Stack Pointer e 4 flag Z (zero), N (negative), C (carry) e V (overflow). Si ricorda che il linguaggio assembler di tale elaboratore dispone delle istruzioni riportati nella tabella nella colonna seguente.

3. (4 punti) Si traduca in linguaggio assembly il frammento di codice in linguaggio C a fianco, supponendo che le variabili R0, R1 e R2 siano memorizzate nei registri omonimi.

(svolgere sul retro)

4. (2 punti) Il diagramma a lato deve rappresentare gli stati in cui si può trovare un processo in un sistema multitasking basato su time sharing e le relative transizioni da uno stato all’altro. Lo si completi aggiungendo anche tutti gli archi e le etichette necessarie.

5. (15 punti) Un file contiene l’elenco dei film in cui hanno recitato, in ruoli principali, alcuni attori. Ciascuna riga contiene il nome del film seguito dell’elenco di attori. Il formato del file può essere dedotto dal seguente esempio:

"Avatar": Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang, Michelle Rodriguez.

"Everest": Josh Brolin, Jason Clarke, John Hawkes, Robin Wright, Emily Watson, Keira Knightley.

"Pirati dei Caraibi Ai confini del mondo": Johnny Depp, Orlando Bloom, Keith Richards.

"Una donna in carriera": Sigourney Weaver, Melanie Griffith, Joan Cusack.

Si osservi che: 1. i nomi dei film sono sempre racchiusi tra apici; 2. i nomi degli attori sono sempre scritti su due parole (nome e cognome, esattamente in questo ordine e cisacuno di essi non contiene spazi al proprio interno) e sono separati da virgole; 3. tutti gli elenchi sono terminati da un punto. Non è noto il numero di attori presenti nel file né il numero di film.

Si scriva un programma in linguaggio C, opportunamente organizzato in funzioni, che riceva sulla riga di comando il nome di un file nel formato sopra descritto e il nome e cognome di un attore. Il programma deve stampare l’elenco dei film in cui tale attore compare, in ordine qualunque (e senza doppi apici). Per esempio, nel caso del file riportato in precedenza e

dell’invocazione del programma con la seguente riga di comando,

# stampa_elenco_film database_film.dat Sigourney Weaver

il programma dovrebbe stampare Avatar

Una donna in carriera

assembly inst. name machine code action LDWI d X load word 00010000dddd0000 DATA(16) d <- X LDWA d A load word 00100000dddd0000 ADDR(16) d <- mem[A]

LDWR d a load word 00110000ddddaaaa d <- mem[a]

LDBI d X load byte 00010001dddd0000 DATA(8) d <- X LDBA d A load byte 00100001dddd0000 ADDR(16) d <- mem[A]

LDBR d a load byte 00110001ddddaaaa d <- mem[a]

STWA s A store word 00100010ssss0000 ADDR(16) mem[A] <- s STWR s a store word 00110010ssssaaaa mem[a] <- s STBA s A store byte 00100011ssss0000 ADDR(16) mem[A] <- s STBR s a store byte 00110011ssssaaaa mem[a] <- s MV s d move 00000100ssssdddd d <- s PUSH s push 00001000ssss0000 push (s) POP d pop 00001001dddd0000 d <- pop () SPRD d read SP 00001101ssss0000 d <- SP SPWR s write SP 00001110ssss0000 SP <- s ADD s d add 01000000ssssdddd d <- d + s SUB s d subtract 01000001ssssdddd d <- d - s NOT r bitwise NOT 01000010rrrr0000 r <- ~r AND s d bitwise AND 01000011ssssdddd d <- d & s OR s d bitwise OR 01000100ssssdddd d <- d | s XOR s d bitwise XOR 01000101ssssdddd d <- d ^ s INC r increment 01001000rrrr0000 r <- r + 1 DEC r decrement 01001001rrrr0000 r <- r + 1 LSH r left shift 01001010rrrr0000 r <- r << 1 RSH r right shift 01001011rrrr0000 r <- r >> 1

assembly inst. name machine code action INW d A input word 10000000dddd0000 IN_ADDR(16) d <- read[A]

INB d A input byte 10000001dddd0000 IN_ADDR(16) d <- read[A]

OUTW s A out word 10000010ssss0000 OUT_ADDR(16) out[A] <- s OUTB s A out byte 10000011ssss0000 OUT_ADDR(16) out[A] <- s

TSTI A test input 1000010000000000 IN_ADDR(16) if completed then Z <- 1 else Z <- 0

TSTO A test output 1000010100000000 OUT_ADDR(16) if completed then Z <- 1 else Z <- 0

BR A branch 1100000000000000 ADDR(16) PC <- A JMP F jump 11000001FFFFFFFF PC <- PC + F

JMPZ F jump if zero 11000010FFFFFFFF if (z == 1) PC <- PC + F JMPNZ F jump if not zero 11000011FFFFFFFF if (z == 0) PC <- PC + F JMPN F jump if negative 11000100FFFFFFFF if (N == 1) PC <- PC + F JMPNN F jump if not neg. 11000101FFFFFFFF if (N == 0) PC <- PC + F JMPC F jump if carry 11000110FFFFFFFF if (C == 1) PC <- PC + F JMPV F jump if overflow 11000111FFFFFFFF if (V == 1) PC <- PC + F CALL A subroutine call 1100100000000000 ADDR(16) push (PC); PC <- A RET return from sub. 1100100100000000 PC <- pop() HLT halt 1100111100000000 halt LEGENDA:

- lettere minuscole = registri; lettere maiuscole = dati numerici - ‘r’ = registro letto e modificato

- ‘s’ = registro soltanto letto - ‘d’ = registro modificato

- ‘a’ = registro il cui contenuto è usato come indirizzo - FFFFFFFF = offset (in complemento a 2)

while (R1 > 0) R1 -= 5;

if (R1 == 0) R0 = 0;

else

R0 = 1;

Riferimenti

Documenti correlati

[r]

Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di uscita e crei l’immagine sopra descritta.. (svolgere

(5 punti) Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma

Si scriva un programma in linguaggio C che legga dalla linea di comando la dimensione N, in pixel, di una bitmap quadrata (NxN) e crei un file contenente una circonferenza rossa

 Utilizzare il contenuto del file raggi.txt per inizializzare un vettore cerchi di oggetti Cerchio.  Implementare la funzione membro operator&gt; per confrontare due oggetti

(5 punti) Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file. bitmap

Si scriva una funzione in linguaggio C che riceva come argomento una struttura dati di tipo BITMAP, già allocata e rappresentante un’immagine di 1000 x 1000 pixel, e vi

Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma deve scrivere