diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/README.md b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/README.md new file mode 100644 index 000000000..199f9bdd0 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/README.md @@ -0,0 +1,32 @@ +# 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 + +## :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). +* 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). + +## :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. + +* [Esercizio 1](c_sources/esercizio%201/Es_1.c) +* [Esercizio 2](c_sources/esercizio%202/Es_2.c) +* [Esercizio 3](c_sources/esercizio%203/Es_3.c) +* [Esercizio 4](c_sources/esercizio%204) +* [Esercizio 5](c_sources/esercizio%205/Es_5.c) \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 1/Es_1.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 1/Es_1.c new file mode 100644 index 000000000..7e7e92b32 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 1/Es_1.c @@ -0,0 +1,77 @@ +//***********************************************************// +// 5 punti. Cosa stampa il seguente frammento di codice? // +//***********************************************************// + +#include + +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 + */ + + double b = 2.59; + + printf ("%d\n", a); //5 + + while ((++a || a++) ? a-=1 : 0) { + if (!(a-- && --a )) + break; + else + 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 + **/ + + 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 + **/ + printf("a: %d\n", a); //4 + + return 0; +} + +/** + Stampa: + 5 + 3 + 1 + -1 + a: 4 + + --------------------------------------- + + Usati argomenti: + - Logical operator + - Bitwise operator + - Conditional operator + - Compound assignment operator + - Expressions and comma operator + - Precedence and associativity + - Order of evaluation, Short circuit + - Side effects +**/ \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 2/Es_2.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 2/Es_2.c new file mode 100644 index 000000000..6dd18c84f --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 2/Es_2.c @@ -0,0 +1,91 @@ +//**************************************************************************// +// 6 punti. // +// Elencare le conversioni di tipo implicite (... da ... a). // +// Scrivere cosa viene stampato a schermo sapendo che: // +// UCHAR_MAX = 255 , 'a' = 97 // +// // +//**************************************************************************// + +#include + +double fun (float a) { + char b = ('x' * 3) - 'g'; // = 1 + return (a / b); +} + +int main (void) { + unsigned int a = 'g' - 3UL; // = 100 + float b = fun(a) ; // = 100.0 + unsigned char c = -(int) (b+53); // = (UCHAR_MAX + 1) - 153 = 256-153 = 103 + printf("c: %c, %d\n", c, c); // c: g, 103 + return 0; +} + + +/* + linea 7: 'g' convertito da int a unsigned long int + linea 7: il valore dopo l'uguale è convertito da unsigned long int ad unsigned int + linea 8: il parametro "a" di fun() è convertito da unsigned int a float + linea 2: il valore dopo l'uguale è convertito da int a char + linea 3: "b" è convertito da char a float per la divisione + 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 + + 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è: + + ------------------------------------------- + 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); + float b = fun(a) ; // = 100.0 + printf("b: %f\n", b); + printf("b cast int: %d\n", -(int) (b+53)); // = -153 + unsigned char c = -(int) (b+53); // = 256-153 = 103 + printf("c: %c, %d\n", c, c); // = 'g', 103 + return 0; + } + +*/ \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 3/Es_3.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 3/Es_3.c new file mode 100644 index 000000000..2be4a32b6 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 3/Es_3.c @@ -0,0 +1,118 @@ +/* + Data la seguente struct, scrivere la definizione di una funzione di nome ritorna_dispari che prende come parametro una + lista (lista_input) e ritorna un'altra lista (lista_output, creata nella funzione) che contiene, nello stesso ordine della + lista passata, solamente gli elementi in posizione dispari (se presenti). + + Se la lista originale è 5-2-9, la lista ritornata sarà 5-9. + + + typedef struct node Node; + + struct node { + int info; + struct node* pNext; + }; +*/ + +/* + Del seguente codice era richiesta solo la funzione "ritorna_dispari" ma per farne vedere il corretto funzionamento + sono state create delle funzioni aggiuntive. +*/ + +#include +#include + +typedef struct node Node; + +struct node { + int info; + struct node* pNext; +}; + +void print_list(Node* pFirst) { + if(pFirst == NULL) { + printf("Lista vuota!\n"); + } + else { + Node* pScan = pFirst; + do { + printf("Info: %d\n", pScan->info); + pScan = pScan->pNext; + } while(pScan!= NULL); + } + return; +} + + +Node* ritorna_dispari(Node* lista_input) { + + if (lista_input == NULL) { + //Se lista_input è vuota allora non ritorno alcuna lista + return NULL; + } else { + //Se lista_input contiene almeno un elemento allora procedo a creare la lista di elementi dispari + //Ricordiamo che dobbiamo mantenere lo stesso ordine degli elementi di input quindi INSERIMENTO IN CODA! + int counter = 0; + Node* pScan = lista_input; + + Node* lista_output = NULL; //Puntatore al primo elemento della nuova lista + Node* lista_output_pLast = NULL; //Per inserire in coda all'ultimo elemento + + while (pScan != NULL) { + if (counter % 2 == 0) { + Node* pNew = (Node*) malloc(sizeof(Node)); + pNew -> info = pScan -> info; + pNew -> pNext = NULL; + + //Se lista_output non contiene neanche un elemento + if (lista_output == NULL) { + lista_output = pNew; + lista_output_pLast = pNew; + } else { + //Se lista_output contiene almeno un elemento allora lo inseriamo in coda + lista_output_pLast -> pNext = pNew; + lista_output_pLast = pNew; + } + } + + pScan = pScan -> pNext; + counter++; + } + + return lista_output; + } +} + + +int main() { + + Node *pFirst = NULL; + Node *pLast = NULL; + + //Creo una linked list con campi info da 1 a 5 + for (int i = 1; i < 6; i++) { + Node* pNew = (Node*) malloc(sizeof(Node)); + pNew -> info = i; + pNew -> pNext = NULL; + + if (pFirst == NULL) { + pFirst = pNew; + pLast = pNew; + } else { + pLast -> pNext = pNew; + pLast = pNew; + } + } + + //Stampo il contenuto della lista ritornata da "ritorna_dispari" e che contiene solo gli elementi in posizione dispari + print_list(ritorna_dispari(pFirst)); + + /* + Viene stampato: + Info: 1 + Info: 3 + Info: 5 + */ + + return 0; +} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/main.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/main.c new file mode 100644 index 000000000..dfcc4bd8c --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/main.c @@ -0,0 +1,26 @@ +/* + Dire quali compilazioni provocano errore a causa del linker (e perchè): + 1) gcc -o write write.c + 2) gcc -c main.c + 3) gcc -o main main.c + 4) gcc -o execute main.c write.c + + In caso il punto 4) ritorni un errore, descrivere come può essere corretto. Infine, dopo la correzione + eventualmente applicata, elencare tutte le definizioni, dichiarazioni e tipologie di linkage, presenti + in ogni file, per count, i, a, e mywrite. Cosa stampa il programma? +*/ + +/* + Le correzioni sono presenti nel file "write.c" +*/ + +extern void mywrite(int *count); +extern int count; +int i; +int i = 1; + +int main(void) { + do { + mywrite(&count); + } while(count <= 0); +} \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/write.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/write.c new file mode 100644 index 000000000..a0cacc79e --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 4/write.c @@ -0,0 +1,73 @@ +#include + +static int count = -3; + +void mywrite(int *a) { + static int count = 2; + (*a)++; + printf("%d\n", count = count + i); +} + + +/** +1) gcc -o write write.c + Manca definizione main ed i + + Se proviamo a eseguire il comando ci viene restituito il seguente errore: + write.c: In function ‘mywrite’: + write.c:9:40: error: ‘i’ undeclared (first use in this function) + +2) gcc -c main.c + Ok + +3) gcc -o main main.c + Manca definizione mywrite e count + + Se proviamo a eseguire il comando ci viene restituito il seguente errore: + /usr/bin/ld: /tmp/ccxHbPc1.o: warning: relocation against `count' in read-only section `.text' + /usr/bin/ld: /tmp/ccxHbPc1.o: in function `main': + main.c:(.text+0x7): undefined reference to `count' + /usr/bin/ld: main.c:(.text+0xf): undefined reference to `mywrite' + /usr/bin/ld: main.c:(.text+0x15): undefined reference to `count' + /usr/bin/ld: warning: creating DT_TEXTREL in a PIE + collect2: error: ld returned 1 exit status + +4) gcc -o execute main.c write.c + Manca definizione count in main.c perchè count ha linkage interno in write.c quindi non è visibile. + Manca poi la dichiarazione con linkage esterno di i in write.c + + Se proviamo a eseguire il comando ci viene restituito il seguente errore: + write.c: In function ‘mywrite’: + write.c:9:40: error: ‘i’ undeclared (first use in this function) + + +In caso il punto 4) ritorni un errore, descrivere come può essere corretto. + - Il punto 4) può essere corretto cambiando la tipologia del linkage di count (globale) in write.c da interno a esterno. + Si fa eliminando la keyword "static": int count = -3; + + Va inoltre inserita in write.c la dichiarazione di i con linkage esterno: extern int i; + + +Infine, dopo la correzione eventualmente applicata, elencare tutte le definizioni, dichiarazioni e tipologie di linkage, +presenti in ogni file, per count, i, a, e mywrite. + - in main.c: + - mywrite è dichiarata ed ha linkage esterno + - count è dichiarata ed ha linkage esterno + - i a riga 3 è un tentativo di definizione e ha linkage esterno + - i a riga 4 è ora definita e ha linkage esterno + + - in write.c: + - PRIMA DELLA CORREZZIONE: count a riga 3 è definita e ha linkage interno + - DOPO LA CORREZZIONE: count a riga 3 è definita e ha linkage esterno + - i è dichiarata ed ha linkage esterno + - mywrite è definita e ha linkage esterno + - a locale in mywrite è definita e ha no linkage + - count locale in mywrite è definita e ha no linkage + +Cosa stampa il programma output? +3 +4 +5 +6 + +*/ \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 5/Es_5.c b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 5/Es_5.c new file mode 100644 index 000000000..e3e1c1b57 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/c_sources/esercizio 5/Es_5.c @@ -0,0 +1,82 @@ +/** + Cerchiare le affermazioni vere dato: + int a[7]= {21,-21,[3]=INT_MAX, 65537, [6]=511}; + short *ptr = (short*) a; + char *n = (char*) a; + + sapendo che i tre tipi usati occupano 4, 2 e 1 byte e 65536 = 2^16 (valori rappresentati in complemento a due e little endian). + + Rappresentare la zona di memoria in cui è memorizzato l'array. + + A. n+5 >= &ptr[3]; + B. ∗(n+5) > ∗(n+4); + C. &ptr[8] == ptr+9; + D. ((int)(ptr+8)-(int)(&a[2]) < 8); + E. *(ptr+1) == *(a+2) +**/ + +#include +#include + +int main() { + + int a[7] = {21,-21,[3]=INT_MAX, 65537, [6]=511}; + + short *ptr = (short*) a; + char *n = (char*) a; + + printf("n+5 >= &ptr[3] : %d\n\n", n+5 >= &ptr[3]); // FALSO + printf("∗(n+5) > ∗(n+4) : %d\n\n", *(n+5) > *(n+4)); // VERO + printf("&ptr[8] == ptr+9 : %d\n\n", &ptr[8] == ptr+9); // FALSO + printf("((int)(ptr+8)-(int)(&a[2]) < 8 : %d\n\n", ((int)(ptr+8)-(int)(&a[2]) < 8)); // FALSO + printf("*(ptr+1) == *(a+2) : %d\n\n", *(ptr+1) == *(a+2)); // VERO + + return 0; +} + + +/** + +10101000 a[0] +00000000 +00000000 *(ptr+1) +00000000 + +11010111 *(n+4) +11111111 *(n+5) +11111111 &ptr[3] +11111111 + +00000000 *(a+2) e a[2] +00000000 +00000000 +00000000 + +11111111 +11111111 +11111111 +11111110 + +10000000 &ptr[8] o ptr+8 +00000000 +10000000 ptr+9 +00000000 + +00000000 +00000000 +00000000 +00000000 + +11111111 +10000000 +00000000 +00000000 + + +A = FALSO, (n+5) sta in una cella di memoria inferiore a (&ptr[3]) +B = VERO, ∗(n+5) == -1, ∗(n+4) == -21 quindi -1 > -21 +C = FALSO, ricordati che si sta guardando l'indirizzo di memoria e non il loro contenuto +D = FALSO, la differenza in byte tra i due puntatori è 8 +E = VERO, *(ptr+1) == 0, *(a+2) == 0 quindi *(ptr+1) == *(a+2) + +**/ \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/esercizi.tex b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/esercizi.tex new file mode 100644 index 000000000..2f4a512a1 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/esercizi.tex @@ -0,0 +1,185 @@ + +%------------------------- INTESTAZIONE COMPITO ----------------------------------- +\begin{center} + \fbox{\fbox{\parbox{7in}{\centering + Prova scritta Programmazione Procedurale con Lab. - Cerami Cristian}}} +\end{center} + +\vspace{5mm} + +\noindent\makebox[\textwidth]{Nome e Cognome: \rule{8cm}{.1pt} \hspace{1cm} Matricola: \rule{5cm}{.1pt}} + +\begin{questions} + +%------------------------- ESERCIZIO 1 -------------------------------------------- + +\question[5] +Cosa stampa il seguente frammento di codice? + +\begin{minipage}[t]{0.4\linewidth} + \begin{lstlisting}[language=C] + int a = 0123 ^ 0x056; + double b = 2.59; + + printf ("%d\n", a); + + while ((++a || a++) ? a-=1 : 0) { + if (!(a-- && --a )) + break; + else { + printf("%d\n", a); + } + } + + a<=a, a+=b, a++; + printf("a: %d\n", a); + \end{lstlisting} +\end{minipage} +\begin{minipage}[t]{0.6\linewidth} + \makenonemptybox{120pt}{~\\ + 5\\ + 3\\ + 1\\ + -1\\ + a: 4} +\end{minipage} + +%------------------------- FINE ESERCIZIO 1 --------------------------------------- + +%------------------------- ESERCIZIO 2 -------------------------------------------- + +\question[6] +Elencare le conversioni di tipo \underline{implicite} (\emph{... da ... a}). Scrivere cosa viene stampato a schermo sapendo che: \emph{UCHAR\_MAX = 255} , \emph{'a' = 97} . + +\begin{minipage}[t]{0.4\linewidth} + \begin{lstlisting}[language=C] + double fun (float a) { + char b = ('x' * 3) - 'g'; + return (a / b); + } + + int main (void) { + unsigned int a = 'g' - 3UL; + float b = fun(a); + unsigned char c = -(int) (b+53); + printf("c: %c, %d\n", c, c); + return 0; + } + \end{lstlisting} +\end{minipage} +\begin{minipage}[t]{0.6\linewidth} + \makenonemptybox{200pt}{~\\ +linea 7: 'g' convertito da int a unsigned long int\\ +linea 7: il valore dopo l'uguale è convertito da unsigned long int ad unsigned int\\ +linea 8: parametro "a" di fun convertito da unsigned int a float\\ +linea 2: il valore dopo l'uguale è convertito da int a char\\ +linea 3: "b" è convertito da char a float per la divisione\\ +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\\ + +A schermo viene stampato ``c: g, 103'' perchè: \\c = (UCHAR\_MAX + 1) - 153 = 103 = 'g' in ASCII\\ +} +\end{minipage} + +%------------------------- FINE ESERCIZIO 2 --------------------------------------- + +%------------------------- ESERCIZIO 3 -------------------------------------------- + +\question[6] +Data la seguente \emph{struct}, scrivere la definizione di una funzione di nome \emph{ritorna\_dispari} che prende come parametro una lista (\emph{lista\_input}) e ritorna un'altra lista (\emph{lista\_output}, creata nella funzione) che contiene, nello stesso ordine della lista passata, solamente gli elementi in posizione \emph{dispari} (se presenti). Se la lista originale è \textbf{5-2-9}, la lista ritornata sarà \textbf{5-9}. + +\begin{minipage}[t]{0.4\linewidth} + \begin{lstlisting}[language=C] + typedef struct node Node; + + struct node { + int info; + struct node* pNext; + }; + \end{lstlisting} +\end{minipage} +\begin{minipage}[t]{0.6\linewidth} + \makenonemptybox{30pt}{ + \centering + \vspace{0.8em} + Guarda soluzione in fondo al compito + } +\end{minipage} + +%------------------------- FINE ESERCIZIO 3 --------------------------------------- + +\newpage + +%------------------------- INTESTAZIONE COMPITO ----------------------------------- +\begin{center} + \fbox{\fbox{\parbox{7in}{\centering + Prova scritta Programmazione Procedurale con Lab. - Cerami Cristian}}} +\end{center} + +\vspace{5mm} + +\noindent\makebox[\textwidth]{Nome e Cognome: \rule{8cm}{.1pt} \hspace{1cm} Matricola: \rule{5cm}{.1pt}} + + +%------------------------- ESERCIZIO 4 -------------------------------------------- + +\question[7] +Dire quali compilazioni provocano errore a causa del linker (e perchè):\\ +1) gcc -o write write.c\\ +2) gcc -c main.c\\ +3) gcc -o main main.c\\ +4) gcc -o execute main.c write.c\\ +In caso il punto 4) ritorni un errore, descrivere come può essere corretto. Infine, \textbf{dopo la correzione} eventualmente applicata, elencare tutte le definizioni, dichiarazioni e tipologie di linkage, presenti in ogni file, per \emph{count}, \emph{i}, \emph{a}, e \emph{mywrite}. Cosa stampa il programma? + +\begin{minipage}[h]{0.5\linewidth} + \includegraphics[width=9cm, keepaspectratio]{immagini/es_linkage_uniti} + \begin{minipage}[h]{0.95\linewidth} + \makenonemptybox{240pt}{ + ~\\ + Stampa:\\ + 3\\ + 4\\ + 5\\ + 6\\ + } + \end{minipage} +\end{minipage} +\begin{minipage}[h]{0.5\linewidth} + \makenonemptybox{385pt}{ +1) Manca definizione \emph{main} ed \emph{i}\\ +3) Manca definizione \emph{mywrite} e \emph{count}\\ +4) Manca definizione \emph{count} in \emph{main.c} perchè \emph{count} ha linkage interno in \emph{write.c} quindi non è visibile. Manca poi la dichiarazione con linkage esterno di \emph{i} in \emph{write.c}\\ + +Il punto 4) può essere corretto cambiando la tipologia del linkage di \emph{count} (globale) in \emph{write.c} da interno a esterno. Si fa eliminando la keyword ``\emph{static}'': \\\texttt{int count = -3;}\\ +Va inoltre inserita in \emph{write.c} la dichiarazione di \emph{i} con linkage esterno: \texttt{extern int i;} \\ + +In main.c:\\ +- \emph{mywrite} è dichiarata ed ha linkage esterno\\ +- \emph{count} è dichiarata ed ha linkage esterno\\ +- \emph{i} a riga 3 è un tentativo di definizione e ha linkage esterno\\ +- \emph{i} a riga 4 è ora definita e ha linkage esterno\\ + +In write.c:\\ +- DOPO LA CORREZIONE: \emph{count} a riga 3 è definita e ha linkage esterno\\ +- \emph{i} è dichiarata ed ha linkage esterno\\ +- \emph{mywrite} è definita e ha linkage esterno\\ +- \emph{a} locale in mywrite è definita e ha no linkage\\ +- \emph{count} locale in mywrite è definita e ha no linkage\\ +} +\end{minipage} + + +%------------------------- FINE ESERCIZIO 4 --------------------------------------- + +%------------------------- ESERCIZIO 5 -------------------------------------------- + +\question[6] +Cerchiare le affermazioni vere dato:\\ +\underline{\emph{int a[7]= \{21,-21,[3]=INT\_MAX, 65537, [6]=511\}; short *ptr = (short*) a; char *n = (char*) a;}} ~~sapendo che i tre tipi usati occupano 4, 2 e 1 byte e 65536 = $2^{16}$ (valori rappresentati in complemento a due e \emph{little endian}). Rappresentare la zona di memoria in cui è memorizzato l'array.\\~ + +\textbf{A.} n+5 >= \&ptr[3]; \textbf{B.} *(n+5) > *(n+4); \textbf{C.} \&ptr[8] == ptr+9; \textbf{D.} ((int)(ptr+8)-(int)(\&a[2]) < 8);\\ \textbf{E.} *(ptr+1) == *(a+2) + + +\end{questions} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/immagini/es_linkage_uniti.png b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/immagini/es_linkage_uniti.png new file mode 100644 index 000000000..36722b0ed Binary files /dev/null and b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/immagini/es_linkage_uniti.png differ diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/main.tex b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/main.tex new file mode 100644 index 000000000..cad7918c3 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/main.tex @@ -0,0 +1,56 @@ +\documentclass[addpoints,11pt]{exam} +\usepackage[top=0.5in, bottom=0.5in, left=0.5in, right=0.5in]{geometry} +\usepackage[utf8]{inputenc} +\usepackage{listings} +\usepackage{color,graphicx} +\usepackage{multicol} +\usepackage{MnSymbol} + +%Impostazioni box punti - package exam +\boxedpoints +\pointname{~punti} + +%Impostazioni box soluzioni - package exam +\newcommand{\makenonemptybox}[2]{% + \par\nobreak\vspace{\ht\strutbox}\noindent + \fbox{% + \parbox[c][\dimexpr#1-2\fboxsep][t]{\dimexpr\linewidth-2\fboxsep}{ + \hrule width \hsize height 0pt + #2 + }% + }% + \par\vspace{\ht\strutbox} +} + + +%Impostazioni grafiche per visione codice sorgente - linguaggio C +\definecolor{codegray}{rgb}{0,0,0} +\definecolor{backcolour}{rgb}{1,1,1} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + keywordstyle=\color{black}, + numberstyle=\tiny\color{codegray}, + basicstyle=\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + +\pagestyle{empty} + + +%Creazione documento +\begin{document} + \include{esercizi} + \include{soluzioni_esercizi} +\end{document} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/soluzioni_esercizi.tex b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/soluzioni_esercizi.tex new file mode 100644 index 000000000..2fbd88d49 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame con soluzioni/soluzioni_esercizi.tex @@ -0,0 +1,88 @@ +%------------------------- SOLUZIONE ESERCIZIO 3 -------------------------------------------- + +\begin{minipage}[h]{\linewidth} + SOLUZIONE ESERCIZIO 3 + \begin{lstlisting}[language=C] +Node* ritorna_dispari(Node* lista_input) { + + if (lista_input == NULL) { + return NULL; + } else { + int counter = 0; + Node* pScan = lista_input; + + Node* lista_output = NULL; + Node* lista_output_pLast = NULL; + + while (pScan != NULL) { + if (counter % 2 == 0) { + Node* pNew = (Node*) malloc(sizeof(Node)); + pNew -> info = pScan -> info; + pNew -> pNext = NULL; + + if (lista_output == NULL) { + lista_output = pNew; + lista_output_pLast = pNew; + } else { + lista_output_pLast -> pNext = pNew; + lista_output_pLast = pNew; + } + } + + pScan = pScan -> pNext; + counter++; + } + + return lista_output; + } +} + \end{lstlisting} +\end{minipage} + +\begin{minipage}[h]{\linewidth} +SOLUZIONE ESERCIZIO 5\\ + + +10101000\hspace{2em} a[0]\\ +00000000\\ +00000000\hspace{2em} *(ptr+1)\\ +00000000\\ +\\ +11010111\hspace{2em} *(n+4)\\ +11111111\hspace{2em} *(n+5)\\ +11111111\hspace{2em} \&ptr[3]\\ +11111111\\ +\\ +00000000\hspace{2em} *(a+2) e a[2]\\ +00000000\\ +00000000\\ +00000000\\ +\\ +11111111\\ +11111111\\ +11111111\\ +11111110\\ +\\ +10000000\hspace{2em} \&ptr[8] o ptr+8\\ +00000000\\ +10000000\hspace{2em} ptr+9\\ +00000000\\ +\\ +00000000\\ +00000000\\ +00000000\\ +00000000\\ +\\ +11111111\\ +10000000\\ +00000000\\ +00000000\\ +\\ + +A = FALSO, (n+5) sta in una cella di memoria inferiore a (\&ptr[3])\\ +B = VERO, ∗(n+5) == -1, ∗(n+4) == -21 quindi -1 > -21\\ +C = FALSO, ricordati che si sta guardando l'indirizzo di memoria e non il loro contenuto\\ +D = FALSO, la differenza in byte tra i due puntatori è 8\\ +E = VERO, *(ptr+1) == 0, *(a+2) == 0 quindi *(ptr+1) == *(a+2)\\ + +\end{minipage} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/esercizi.tex b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/esercizi.tex new file mode 100644 index 000000000..561470bca --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/esercizi.tex @@ -0,0 +1,133 @@ + +%------------------------- INTESTAZIONE COMPITO ----------------------------------- +\begin{center} + \fbox{\fbox{\parbox{7in}{\centering + Prova scritta Programmazione Procedurale con Lab. - Cerami Cristian}}} +\end{center} + +\vspace{5mm} + +\noindent\makebox[\textwidth]{Nome e Cognome: \rule{8cm}{.1pt} \hspace{1cm} Matricola: \rule{5cm}{.1pt}} + +\begin{questions} + +%------------------------- ESERCIZIO 1 -------------------------------------------- + +\question[5] +Cosa stampa il seguente frammento di codice? + +\begin{minipage}[t]{0.4\linewidth} + \begin{lstlisting}[language=C] + int a = 0123 ^ 0x056; + double b = 2.59; + + printf ("%d\n", a); + + while ((++a || a++) ? a-=1 : 0) { + if (!(a-- && --a )) + break; + else { + printf("%d\n", a); + } + } + + a<=a, a+=b, a++; + printf("a: %d\n", a); + \end{lstlisting} +\end{minipage} +\begin{minipage}[t]{0.6\linewidth} + \makeemptybox{120pt} +\end{minipage} + +%------------------------- FINE ESERCIZIO 1 --------------------------------------- + +%------------------------- ESERCIZIO 2 -------------------------------------------- + +\question[6] +Elencare le conversioni di tipo \underline{implicite} (\emph{... da ... a}). Scrivere cosa viene stampato a schermo sapendo che: \emph{UCHAR\_MAX = 255} , \emph{'a' = 97} . + +\begin{minipage}[t]{0.4\linewidth} + \begin{lstlisting}[language=C] + double fun (float a) { + char b = ('x' * 3) - 'g'; + return (a / b); + } + + int main (void) { + unsigned int a = 'g' - 3UL; + float b = fun(a); + unsigned char c = -(int) (b+53); + printf("c: %c, %d\n", c, c); + return 0; + } + \end{lstlisting} +\end{minipage} +\begin{minipage}[t]{0.6\linewidth} + \makeemptybox{200pt} +\end{minipage} + +%------------------------- FINE ESERCIZIO 2 --------------------------------------- + +%------------------------- ESERCIZIO 3 -------------------------------------------- + +\question[6] +Data la seguente \emph{struct}, scrivere la definizione di una funzione di nome \emph{ritorna\_dispari} che prende come parametro una lista (\emph{lista\_input}) e ritorna un'altra lista (\emph{lista\_output}, creata nella funzione) che contiene, nello stesso ordine della lista passata, solamente gli elementi in posizione \emph{dispari} (se presenti). Se la lista originale è \textbf{5-2-9}, la lista ritornata sarà \textbf{5-9}. + +\begin{minipage}[t]{0.5\linewidth} + \begin{lstlisting}[language=C] + typedef struct node Node; + + struct node { + int info; + struct node* pNext; + }; + \end{lstlisting} +\end{minipage} + +%------------------------- FINE ESERCIZIO 3 --------------------------------------- + +\newpage + +%------------------------- INTESTAZIONE COMPITO ----------------------------------- +\begin{center} + \fbox{\fbox{\parbox{7in}{\centering + Prova scritta Programmazione Procedurale con Lab. - Cerami Cristian}}} +\end{center} + +\vspace{5mm} + +\noindent\makebox[\textwidth]{Nome e Cognome: \rule{8cm}{.1pt} \hspace{1cm} Matricola: \rule{5cm}{.1pt}} + + +%------------------------- ESERCIZIO 4 -------------------------------------------- + +\question[7] +Dire quali compilazioni provocano errore a causa del linker (e perchè):\\ +1) gcc -o write write.c\\ +2) gcc -c main.c\\ +3) gcc -o main main.c\\ +4) gcc -o execute main.c write.c\\ +In caso il punto 4) ritorni un errore, descrivere come può essere corretto. Infine, \textbf{dopo la correzione} eventualmente applicata, elencare tutte le definizioni, dichiarazioni e tipologie di linkage, presenti in ogni file, per \emph{count}, \emph{i}, \emph{a}, e \emph{mywrite}. Cosa stampa il programma? + +\begin{minipage}[h]{0.5\linewidth} + \includegraphics[width=9cm, keepaspectratio]{immagini/es_linkage_uniti} +\end{minipage} +\begin{minipage}[h]{0.5\linewidth} + \makeemptybox{300pt} +\end{minipage} + + +%------------------------- FINE ESERCIZIO 4 --------------------------------------- + +\vspace{3em} + +%------------------------- ESERCIZIO 5 -------------------------------------------- + +\question[6] +Cerchiare le affermazioni vere dato:\\ +\underline{\emph{int a[7]= \{21,-21,[3]=INT\_MAX, 65537, [6]=511\}; short *ptr = (short*) a; char *n = (char*) a;}} ~~sapendo che i tre tipi usati occupano 4, 2 e 1 byte e 65536 = $2^{16}$ (valori rappresentati in complemento a due e \emph{little endian}). Rappresentare la zona di memoria in cui è memorizzato l'array.\\~ + +\textbf{A.} n+5 >= \&ptr[3]; \textbf{B.} *(n+5) > *(n+4); \textbf{C.} \&ptr[8] == ptr+9; \textbf{D.} ((int)(ptr+8)-(int)(\&a[2]) < 8);\\ \textbf{E.} *(ptr+1) == *(a+2) + + +\end{questions} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/immagini/es_linkage_uniti.png b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/immagini/es_linkage_uniti.png new file mode 100644 index 000000000..36722b0ed Binary files /dev/null and b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/immagini/es_linkage_uniti.png differ diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/main.tex b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/main.tex new file mode 100644 index 000000000..6095a61e7 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/latex_sources/Esame/main.tex @@ -0,0 +1,44 @@ +\documentclass[addpoints,11pt]{exam} +\usepackage[top=0.5in, bottom=0.5in, left=0.5in, right=0.5in]{geometry} +\usepackage[utf8]{inputenc} +\usepackage{listings} +\usepackage{color,graphicx} +\usepackage{multicol} +\usepackage{MnSymbol} + +%Impostazioni box punti - package exam +\boxedpoints +\pointname{~punti} + + +%Impostazioni grafiche per visione codice sorgente - linguaggio C +\definecolor{codegray}{rgb}{0,0,0} +\definecolor{backcolour}{rgb}{1,1,1} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + keywordstyle=\color{black}, + numberstyle=\tiny\color{codegray}, + basicstyle=\footnotesize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + +\pagestyle{empty} + + +%Creazione documento +\begin{document} + \include{esercizi} + %\include{soluzioni_esercizi} +\end{document} diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_cerami.pdf b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_cerami.pdf new file mode 100644 index 000000000..dd73fdb49 Binary files /dev/null and b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_cerami.pdf differ diff --git a/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_con_soluzioni_cerami.pdf b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_con_soluzioni_cerami.pdf new file mode 100644 index 000000000..fec8099de Binary files /dev/null and b/magistrale/Anno 1/Didattica/Santini/FaxSimileEsame/pdf/didattica_inf_esame_prog1_con_soluzioni_cerami.pdf differ diff --git a/magistrale/Anno 1/Didattica/Santini/Kahoot/README.md b/magistrale/Anno 1/Didattica/Santini/Kahoot/README.md new file mode 100644 index 000000000..b125634c8 --- /dev/null +++ b/magistrale/Anno 1/Didattica/Santini/Kahoot/README.md @@ -0,0 +1,6 @@ +# Esame Santini + +Per l'esame del prof Santini abbiamo scelto di realizzare un Kahoot di 20 domande relative all'esame di programmazione 1. +Qui è riportata la stampa del kahoot e il link per giocare. + +[Link al kahoot](https://create.kahoot.it/share/esame-didattica-dell-informatica-santini/97529e1c-4657-4c3a-9966-36fc33f7e7d0) \ No newline at end of file diff --git a/magistrale/Anno 1/Didattica/Santini/stampa_kahoot.pdf b/magistrale/Anno 1/Didattica/Santini/Kahoot/stampa_kahoot.pdf similarity index 100% rename from magistrale/Anno 1/Didattica/Santini/stampa_kahoot.pdf rename to magistrale/Anno 1/Didattica/Santini/Kahoot/stampa_kahoot.pdf diff --git a/magistrale/Anno 1/Didattica/Santini/README.md b/magistrale/Anno 1/Didattica/Santini/README.md index b125634c8..5a2403521 100644 --- a/magistrale/Anno 1/Didattica/Santini/README.md +++ b/magistrale/Anno 1/Didattica/Santini/README.md @@ -1,6 +1,17 @@ -# Esame Santini +# Didattica dell'Informatica - Esame Santini -Per l'esame del prof Santini abbiamo scelto di realizzare un Kahoot di 20 domande relative all'esame di programmazione 1. -Qui è riportata la stampa del kahoot e il link per giocare. +## :dart: Obiettivo +Lo scopo di questo esame è la preparazione di una serie di esercizi, per il corso di [Programmazione Procedurale con Laboratorio](https://francescosantini.sites.dmi.unipg.it/progI23.html), da eseguire individualmente. -[Link al kahoot](https://create.kahoot.it/share/esame-didattica-dell-informatica-santini/97529e1c-4657-4c3a-9966-36fc33f7e7d0) \ No newline at end of file +## :pencil: **Modalità d'esame** +L'esame può essere svolto secondo due modalità differenti: + +* Creazione di una prova d'esame in linguaggio C che rispetti le seguenti caratteristiche: + * 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). + * Contiene le soluzioni e i codici sorgente di tutti gli esercizi proposti. + + Un esempio di questa modalità d'esame può essere vista alla [seguente pagina](FaxSimileEsame). + +* Creazione di un Kahoot! con 15 esercizi di cui si dovrà poi condividere il link al quiz per email (francesco.santini@unipg.it) al prof. Dovrà inoltre essere stampato e sottomesso tramite Github, includendo un file con le correzioni degli esercizi. Un esempio di questa modalità d'esame può essere vista alla [seguente pagina](Kahoot). \ No newline at end of file