Skip to content

Commit

Permalink
Correzioni typo e tabulazioni
Browse files Browse the repository at this point in the history
  • Loading branch information
Meht-evaS committed Dec 18, 2023
1 parent b865031 commit 3faa2d9
Show file tree
Hide file tree
Showing 9 changed files with 166 additions and 174 deletions.
12 changes: 3 additions & 9 deletions magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,20 @@
# Didattica dell'Informatica
## Esame di Programmazione Procedurale con Laboratorio
Eaborato con gli esercizi, e relative soluzioni, per l'esame di Programmazione Procedurale con Laboratorio.

## :mortar_board: Studente
Cristian Cerami

## :ticket: Matricola
362384
Elaborato con gli esercizi, e relative soluzioni, per l'esame di Programmazione Procedurale con Laboratorio.

## :pencil: Caratteristiche
Il progetto rispetta le seguenti specifiche:

* Composto da 5 esercizi (versione corta) che coprono più argomenti possibili del corso.
* Ispirato agli esami degli anni passati (a.a. 2021 in poi) visibili sulla [pagina del corso](https://francescosantini.sites.dmi.unipg.it/progI23.html) di Programmazione procedurale con Laboratorio.
* Sritto in Latex sfruttando il package [exam](https://ctan.org/pkg/exam?lang=en).
* Scritto in Latex sfruttando il package [exam](https://ctan.org/pkg/exam?lang=en).
* Contiene le soluzioni e i codici sorgente di tutti gli esercizi proposti.

## :page_facing_up: Elaborato PDF
Come anticipato sopra, sono stati creati due documenti PDF:

* [Compito d'esame](pdf/didattica_inf_esame_prog1_cerami.pdf): contiene il compito d'esame vero e proprio da assegnare agli studenti. Va solo cambiata l'intestazione che per ora contiene il mio nome. Per farlo si può modificare il [seguente file LaTeX](latex_sources/Esame/esercizi.tex).
* [Compito d'esame con correzioni](pdf/didattica_inf_esame_prog1_con_soluzioni_cerami.pdf): identico al precedente file ma al suo interno contiene la risposte (correzioni) degli esercizi. Anche qui va cambiata l'intestazione del documento con il [relativo file LaTeX](latex_sources/Esame/esercizi.tex).
* [Compito d'esame con correzioni](pdf/didattica_inf_esame_prog1_con_soluzioni_cerami.pdf): identico al precedente file ma al suo interno contiene le risposte (correzioni) degli esercizi. Anche qui va cambiata l'intestazione del documento con il [relativo file LaTeX](latex_sources/Esame/esercizi.tex).

## :computer: Codice sorgente esercizi
Per ogni esercizio assegnato in questo compito d'esame è stato creato un file contenente il codice sorgente e la relativa spiegazione di risoluzione dell'esercizio.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,63 +1,64 @@
//***********************************************************//
// 5 punti. Cosa stampa il seguente frammento di codice? //
// 5 punti. Cosa stampa il seguente frammento di codice? //
//***********************************************************//

#include <stdio.h>

int main() {

int a = 0123 ^ 0x056 ; //3+2*8+8*8 = 83 , 6+5*16 = 86

/*
83 = 64 + 16 + 2 + 1 = 01010011
86 = 64 + 16 + 4 + 2 = 01010110

01010011 = 83
01010110 = 86
-------- ^ XOR BIT A BIT
00000101 = 1 + 4 = 5
*/
int a = 0123 ^ 0x056 ; //3+2*8+8*8 = 83 , 6+5*16 = 86

double b = 2.59;
/*
83 = 64 + 16 + 2 + 1 = 01010011
86 = 64 + 16 + 4 + 2 = 01010110
01010011 = 83
01010110 = 86
-------- ^ XOR BIT A BIT
00000101 = 1 + 4 = 5
*/

double b = 2.59;

printf ("%d\n", a); //5

while ((++a || a++) ? a-=1 : 0) {
if (!(a-- && --a ))
break;
else
printf("%d\n", a);
printf("%d\n", a);
}

/**
Step dentro ciclo while:
inizio con a==5 -> ++a == 6 -> (a-=1) == 5
if !(5 && 3) -> Falso , a == 3
stampo 3
inizio con a==3 -> ++a == 4 -> (a-=1) == 3
if !(3 && 1) -> Falso , a == 1
stampo 1
inizio con a==1 -> ++a == 2 -> (a-=1) == 1
if !(1 && -1) -> Falso , a == -1
stampo -1
inizio con a==-1 -> ++a == 0 || a++ == valuto 0 e poi incremento a 1 -> 0 || 0 quindi esco dal while con a==1
**/
/*
Step dentro ciclo while:
inizio con a==5 -> ++a == 6 -> (a-=1) == 5
if !(5 && 3) -> Falso , a == 3
stampo 3
inizio con a==3 -> ++a == 4 -> (a-=1) == 3
if !(3 && 1) -> Falso , a == 1
stampo 1
inizio con a==1 -> ++a == 2 -> (a-=1) == 1
if !(1 && -1) -> Falso , a == -1
stampo -1
inizio con a==-1 -> ++a == 0 || a++ == valuto 0 e poi incremento a 1 -> 0 || 0 quindi esco dal while con a==1
*/

a<=a, a+=b, a++;

/**
La prima espressione non ha nessun side effect quindi può essere ignorata in questo caso.
Nella seconda invece si somma ad "a" il float "b" ma, come da regole, si prende solo la parte intera quindi a=1+2 -> a==3
Nella terza si incrementa nuovamente a -> a==4
**/
/*
La prima espressione non ha nessun side effect quindi può essere ignorata in questo caso.
Nella seconda invece si somma ad "a" il float "b" ma, come da regole, si prende solo la parte intera quindi a=1+2 -> a==3
Nella terza si incrementa nuovamente a -> a==4
*/

printf("a: %d\n", a); //4

return 0;
return 0;
}

/**
Stampa:
5
/*
Stampa:
5
3
1
-1
Expand All @@ -74,4 +75,4 @@ int main() {
- Precedence and associativity
- Order of evaluation, Short circuit
- Side effects
**/
*/
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//**************************************************************************//
// 6 punti. //
// Elencare le conversioni di tipo implicite (... da ... a). //
// Scrivere cosa viene stampato a schermo sapendo che: //
// UCHAR_MAX = 255 , 'a' = 97 //
// //
// 6 punti. //
// Elencare le conversioni di tipo implicite (... da ... a) //
// Scrivere cosa viene stampato a schermo sapendo che: //
// UCHAR_MAX = 255 , 'a' = 97 //
// //
//**************************************************************************//

#include <stdio.h>
Expand Down Expand Up @@ -31,52 +31,52 @@ int main (void) {
linea 3: il risultato della divisione è convertito da float a double
linea 8: il valore di ritorno è convertito da double a float
linea 9: 53 è convertito da int a float
linea 9: il valore dopo l'uguale è converito da int (dopo la conversione esplicita) a unsigned char
linea 9: il valore dopo l'uguale è convertito da int (dopo la conversione esplicita) a unsigned char
A schermo viene stampato "c: g, 103" perchè c = (UCHAR_MAX + 1) - 153 = 103 = 'g' in ASCII
*/

/*
Per sapere cosa stampa il seguente programma è bene prima scrivere da una parte tutti i valori int ASCII così da non doverli
calcolare ogni volta (si risparmia molto tempo e si riducono gli errori):
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
a b c d e f g h i j k l m n o p q r s t u v w x y z
printf("%d\n", 'x'); // 'x' = 120
printf("%d\n", 'g'); // 'g' = 103
printf("%d\n", ('x' * 3) - 'g'); // 'x' * 3 - 'g' = 120*3 - 103 = 257
char a = ('x' * 3) - 'g';
printf("%d\n", a); // = 1 perchè:
Per sapere cosa stampa il seguente programma è bene prima scrivere da una parte tutti i valori int ASCII così da non doverli
calcolare ogni volta (si risparmia molto tempo e si riducono gli errori):
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
a b c d e f g h i j k l m n o p q r s t u v w x y z
printf("%d\n", 'x'); // 'x' = 120
printf("%d\n", 'g'); // 'g' = 103
printf("%d\n", ('x' * 3) - 'g'); // 'x' * 3 - 'g' = 120*3 - 103 = 257
char a = ('x' * 3) - 'g';
printf("%d\n", a); // = 1 perchè:
-------------------------------------------
char a = 257, UCHAR_MAX = 255
char a = 257, UCHAR_MAX = 255
Per troncamento si ha (rappresentazione little endian):
INT (4 byte) 10000000 10000000 00000000 00000000 = 257
CHAR (1 byte) 10000000 xxxxxxxx xxxxxxxx xxxxxxxx = 1
==============================================================================
==============================================================================
Quando si arriva qua si ha "b"==100.0
Aggiungendogli 53 si arriva a 153.0 che poi per il cast esplicito e il
segno meno diventa -153 causando un wraparound che può essere così calcolato:
unsigned char c = -(int) (b+53); // -153 -> (UCHAR_MAX + 1) - 153 = (255 + 1) -153 = 103 = 'g' in ASCII
==============================================================================
==============================================================================
Per vedere direttamente a schermo i valori ottenuti a ogni passaggio si può usare il seguente codice:
double fun (float a) {
char b = ('x' * 3) - 'g'; // // 'x' * 3 - 'g' = 120*3 - 103 = 257 = 1
printf("b: %d\n", b);
printf("a/b: %f\n", a/b);
return (a / b);
}
int main (void) {
unsigned int a = 'g' - 3UL; // = 100
printf("a: %u\n", a);
Expand All @@ -88,4 +88,4 @@ int main (void) {
return 0;
}
*/
*/
Loading

0 comments on commit 3faa2d9

Please sign in to comment.