Sei sulla pagina 1di 5

FONDAMENTI DI INFORMATICA - Prof.

Negri
I appello 12 gennaio 2023
Cognome e nome Codice persona

Quesito 1. 2 3 4 5 Tot
Punti 6 4 5 7 8 30

Tempo massimo a disposizione: 1h 40’


- È vietato consultare libri, appunti e utilizzare calcolatrici, telefoni o qualsiasi altro dispositivo elettronico.
- È possibile utilizzare la matita.
Rispondere solo se immatricolati nell’a.a. 2022/23.

Sapevi già programmare? No, sì in C, C++/C#, sì in altro linguaggio.


(solo per scopi statistici).

Esercizio 1 (inserire soluzioni nel testo delle domande)


1. (1 pt.) Convertire il numero 111 (base 10) nelle seguenti basi

Base 2: 0110 1111 Base 16: 6F

2. (2 pt.) Supponendo di dedicare 8 bit per rappresentare i numeri interi in base 2 in


complemento a 2 (CP2). Convertire i seguenti numeri interi in CP2

+100 0110 0100

-100 1001 1100

3. (3 pt.) Per la seguente coppia di valori A = +127 e B= -128 eseguire le seguenti operazioni:
- convertire A e B in binario in CP2 su 8 bit (se i bit non bastano scrivere “non possibile”)
 A : 0111 1111

 B : 1000 0000

- eseguire la somma algebrica in binario A+B e indicare il valore binario generato dalla somma

A+B 1111 1111

- indicare a quale numero decimale corrisponde alla sequenza di bit presente in Ris:

-1

- indicare il valore dei bit di carry/overflow dopo la somma precedente (0 =NO, 1 SI’)

bit di carry: 0 bit di overflow: 0


Esercizio 2 (inserire soluzioni nel testo delle domande)
1. (2 pt.) Data la seguente variabile float vet[5] (float significa Floating Point 32 bit) sia allocata in
memoria centrale a partire dall’indirizzo esadecimale EEEE.00CE. Calcolare:
a) il numero di byte richiesti dalla variabile vet: in decimale 20 e in esadecimale 14
b) Scrivere l’espressione per calcolare l’indirizzo esadecimale del primo byte che segue quelli
allocati per vet e infine riportare il valore calcolato dell’espressione:

EEEE 00CE +
14 =
EEEE 00E2

pp. 1 /3
2. (2 pt.) Data la definizione float v= - 88 e lo standard IEEE754 FP32:
a) Definire prima il numero nel formato normalizzato intermedio (TRONCARE se necessario la parte
decimale alla seconda cifra decimale): -1.37 * 26

b) Codificare poi il numero normalizzato usando il formato FP32:


S (1 bit di segno): 1
M (23 bit per la mantissa – fermarsi ai primi 5 bit): 01011
E (8 bit per l’esponente): 127+6 10000101

c) Indicare quale sia il valore decimale corrispondente alla codifica binaria generata nella precedente
domanda 5.b). Mostrare sia il valore finale e sia l’espressione per il suo calcolo:
(1+ ¼ +1/16+1/32)*26

Esercizio 3. (Il risultato mostrarlo dopo il testo dell’esercizio)


Eseguire il seguente programma e riportare quanto visualizzato al terminale, rispettando il formato
previsto dalle printf. ATTENZIONE: prima di eseguire il codice assegnare il proprio numero di matricola
contestualmente alla dichiarazione della variabile matr.
#include <stdio.h>
int F2(int a, int y) {
int s=0, i=1; int matr = ;//valore di matricola
while (y>0)
{ s = s + i * (y%a);
y = y / (a*a);
i = i * a;
printf("new s=%d y=%d i=%d\n",s,y,i);
}
printf("%d\n", matr);
return s;
}
int F1 (int d, int x) {return F2(d, x/d) - F2(d,100); }

int main () {printf ("%d\n", F1(5,11000)); }

Stampa
new s=0 y=88 i=5
new s=15 y=2 i=25
new s=90 y=0 i=125
Matricola
new s=0 y=4 i=5
new s=20 y=0 i=25
Matricola
70

Esercizio 4 (soluzione deve essere scritta sul retro della pagina 1)


Data una matrice di interi, un elemento è detto picco se il suo valore è strettamente
maggiore di tutti gli altri 8 vicini; gli elementi che hanno meno di 8 vicini non vanno
considerati. Scrivere un programma C che individua il picco più alto presente nella
matrice e visualizza il valore degli indici x e y del picco. Se esistono più picchi di ugual
massimo valore il programma visualizza gli indici del primo incontrato
Se non esistono picchi il programma visualizza la coppia -1,-1.
Possibile soluzione
#include <stdio.h>
#define N 6
#define M 6

int main() {
int mat[N][M] = {{1,2,3,4,5,6},
{7,8,9,10,11,12},

pp. 2 /3
{13,14,15,16,17,18},
{19,20,21,22,23,24},
{25,26,100,28,29,30},
{31,32,33,34,35,36}};
int peak ;
int peak_i = -1, peak_j = -1;

for (int i = 0; i < N; i++) {


for (int j = 0; j < M; j++) {
if (i > 0 && i < N-1 && j > 0 && j < M-1) {//non consideriamo il bordo matrice

int count = 0; //verifica che coppia <i,j> sia picco con analisi 8 vicini
if(mat[i][j]>mat[i-1][j]) count++;
if(mat[i][j]>mat[i+1][j]) count++;
if(mat[i][j]>mat[i][j-1]) count++;
if(mat[i][j]>mat[i][j+1]) count++;
if(mat[i][j]>mat[i-1][j-1]) count++;
if(mat[i][j]>mat[i-1][j+1]) count++;
if(mat[i][j]>mat[i+1][j-1]) count++;
if(mat[i][j]>mat[i+1][j+1]) count++;
/* altri modi sono: scrivere if con 8 predicati in and, 2 cicli sulla sottomatrice dei
vicini evitando però 1 delle nove possibilità */
if (count == 8) {
// se <i,j> è picco locale, verifico se sia anche picco globale
if (peak_i ==-1){// è il primo picco globale
peak = mat[i][j];
peak_i = i;
peak_j = j;
} else if(mat[i][j] > peak) {
peak = mat[i][j];
peak_i = i;
peak_j = j;
}
}
}
}
}
if (peak_i!= -1) {//esiste picco
printf("Il picco più alto è %d e si trova in posizione (x, y) = (%d, %d)\n",
peak, peak_i, peak_j);
} else {
printf("Non esistono picchi. (-1,-1) \n");
}
return 0;
}
NOTA: per verificare se un picco è il primo globale non fare check sulla variabile peak magari inizializzata a 0. 
I valori del picco sono integer e quindi i picchi potrebbero essere composti solo da valori negativi che quindi invaliderebbero 
l’ipotesi sul controllo. 

Esercizio 5 (soluzione deve essere scritta sul retro di pagina 2 e su questa pagina)
Sia data la seguente lista globale
struct EL {char valore; struct EL *successivo; };
struct EL *lista=NULL;

Scrivere una funzione C di nome InsDel che riceve come parametro il nome di un file
di caratteri da aprire in lettura e un carattere CA dell’alfabeto (maiuscolo o minuscolo).
La funzione riceve anche la lista di cui sopra come parametro. La funzione legge i
caratteri del file uno alla volta e per ogni carattere genera una variabile dinamica nella
quale inserisce nel campo valore il carattere letto. L’elemento creato è inserito nella
lista col seguente criterio: se il valore dell’elemento creato è maggiore del valore del
primo elemento della lista allora l’elemento creato va inserito in coda, altrimenti in testa
alla lista.

pp. 3 /3
Nel caso di lista non contenente nulla l’elemento predisposto prima diventa il primo e
l’unico elemento della lista.
Finito l’inserimento la funzione chiede al terminale un carattere e scandisce la lista alla
ricerca del primo elemento contenente il carattere ricevuto e lo elimina dalla lista.

Un file non contenente nulla non altera lo stato iniziale della lista ricevuta. In caso di
errore oppure se non trova l’elemento cercato la funzione ritorna -1 altrimenti se
l’operazione ha successo la funzione ritorna +1.

Traccia di soluzione
 
#include <stdio.h>
#include <stdlib.h>

struct EL {
char valore;
struct EL *successivo;
};

int InsDel(char *nome_file, char CA, struct EL **lista) {


FILE *fp = fopen(nome_file, "r");
if (fp == NULL) {
return -1;
}

char c;
while ((c = fgetc(fp)) != EOF) {// va bene spezzare clausola del ciclo while
struct EL *nuovo = (struct EL*)malloc(sizeof(struct EL));
nuovo->valore = c;
nuovo->successivo = NULL;

if (*lista == NULL) {//lista vuota


*lista = nuovo;
} else if (c > (*lista)->valore) {
// inserimento in coda
struct EL *current = *lista;
while (current->successivo != NULL) {
current = current->successivo;
}
current->successivo = nuovo;
} else {
// inserimento in testa
nuovo->successivo = *lista;
*lista = nuovo;
}
}

fclose(fp);

printf("Inserire un carattere per la ricerca: ");


char carattere;
scanf("%c", &carattere);

if (*lista == NULL) {//lista vuota – passata vuota e file vuoto


return -1;
}
//var aggiunte
struct el *prec=NULL, *current = *lista; int trovato=0;

while ((current!=NULL)&& (!trovato))


if (current->valore==carattere )trovato=1;
else prec=current; current=current-successivo;

if trovato {

pp. 4 /3
if (prec==null)
{*lista = current->successivo;
free(current);}
else
{prec->successive=current->successive;
free (current);
}
return 1;
}
Return -1;

pp. 5 /3

Potrebbero piacerti anche