Sommario del Programma svolto:

  1. Capitolo 1 delle note, svolgete esercizi di conversione tra diverse basi, con diversi formati (complemento a due, in scostamento)  e in virgola mobile. Provate semplici operazioni di somma/sottrazione o moltiplicazione in binario (ad esempio su 4 bit).
  2. Hardware del PC. Architettura di Von Neumann, CPU, RAM. bus. Periferiche. Struttura della CPU, ciclo di caricamento, decodifica, esecuzione (CPU come interprete del codice macchina).

Lezione:

  • Linguaggi Interpretati vs Compilati (script vs programmi binari).
  • Tipi di dato e loro uso nei linguaggi di programmazione: tipi dinamici (Python). Tipi statici (C). Uso dei tipi per effettuare controlli di correttezza semantica sulle operazioni svolte dal programma. Errori sintattici/semantici, semantica statica (C) o dinamica (Python).
  • Programmi svolti. Dato un intero $$n$$, stampare il valore della somma dei primi $$n$$ numeri dispari.

[python]
#prima versione (non corretta)
n = int(input("Inserisci un intero: "))
somma = 0
i = 0
while i < n:
if (i % 2 == 0):
somma = somma + i
i = i + 1
print("La somma dei numeri dispari da 1 a %d e’ %d" % (n,somma))
[/python]
La versione sopra non è corretta perche in realtà non sommiamo i primi $$n$$ numeri dispari, ma sommiamo i numeri dispari fino ad $$n$$, il che è chiaramente diverso.
Invece dobbiamo svolgere la seguente sommatoria \[ \sum_{i=0}^{n-1} (2i+1) \]
Quindi:
[python]
n = int(input("Inserisci un intero: "))
somma = 0
i = 0
while i < n:
somma = somma + (2*i+1)
i = i + 1
print("La somma dei numeri dispari da 1 a %d e’ %d" % (n,somma))
[/python]
A parte osservare che il programma sopra può ridursi ad un semplice print(n**2) perche:
\[ \sum_{i=0}^{n-1} (2i+1) = \sum_{i=1}^{n} (2i-1) = 2\sum_{i=1}^{n} i + \sum_{i=0}^{n-1} 1 = 2\frac{n(n+1)}{2} – n = n^2 \]
Quando diciamo che un linguaggio come Python è ad alto livello, lo facciamo perche ad esempio è possibile scrivere quel programma semplicemente con due righe di codice:
[python]
# leggo l’input
n = int(input("Inserisci un intero"))
# calcolo la somma (advanced feature: list comprehension)
somma = sum( [ 2*i+1 for i in range(0,n)] )
# stampo
print("La somma dei numeri dispari da 1 a %d e’ %d",(n,somma))
[/python]
dove la funzione sum calcola ovviamente la somma di tutti i valori presenti nella lista di interi passata tra parentesi quadre, e l’espressione tra quadre è una “list comprehension” una delle caratteristiche più ad alto livello di Python, perche consente di generare insiemi di valori, esattamente come si fa in matematica, infatti in notazione matematica scriveremo: $$Dispari = \{ 2i+1 \;|\; \;i\; \in \;[0,n)\; \}$$

Linguaggio C

Il primo programma:
[cpp]
#include <stdio.h>
int main(void)
{
printf("Ciao Ragazzi\n");
printf("Saluti dal C\n");
return 0;
}
[/cpp]
Osservazioni: la prima riga contiene una direttiva per il pre-compilatore, che si occupa di ‘includere’ le definizioni delle funzioni di libreria per l’I/O (input/output) tra cui quindi la printf (la scanf, ed altre).
Poi viene definita una funzione ‘main’, con dominio vuoto (void) e codominio un intero (il valore si vede subito è 0, sempre, e segnala il corretto svolgimento del programma, si restituisce un valore diverse se c’è stato un problema).
Le funzioni printf, servono per stampare una stringa formattata. Il codice Python è uno script, viene cioè eseguito tramite un interprete. Il codice C invece non è interpretato, ma va ‘compilato‘. Per compilare basta dare il comando dentro la console:
gcc -o nome sorgente.c
l’ordine del -o non è importante, quindi se il file sopra lo chiamiamo saluti.c, avremo:
gcc -Wall saluti.c -o saluti
vediamo il programma della somma:
[cpp]
#include <stdio.h>
int main(void)
{
// questa riga e’ un commento
int n = 0; // le variabili vanno tipate (int)
int somma = 0; // assegnate sempre un valore ad ogni variabile
int i = 0;
// ciclo while: come Python
// la guardia del ciclo (predicato) va messo tra parentesi
// i blocchi sono definiti tramite parentesi graffe
// ogni istruzione viene terminata dal punto e virgola.
while (i < n) {
somma = somma + (2*i + 1);
i = i + 1;
}
printf("La somma dei primi %d numeri dispari e’ %d\n",n,somma);
return 0;
}
[/cpp]
Osservazione, lo stesso problema in matlab/octave:
[matlab]
n = input("Inserisci un intero:");
i = 0;
somma = 0;
while i < n
somma = somma + (2*i + 1);
i = i + 1;
end
fprintf(‘La somma dei primi %d numeri interi è %d\n’,n,somma);
[/matlab]