Diario Programmazione 2015

Questa pagina conterrà il nuovo programma di Programmazione per l'anno in corso.

Software

Mac OS:

Aprite Terminale per utilizzare python. L'interprete python è già disponibile nella versone 2.x. Per installare la 3.x, ipython e altro, usare Homebrew. Come editor si raccomanda Spyder.

Windows 7/8.x:

  • Notepad++      (editor)
  • WinPython       (distribuzione Python, SciPy) seguite le indicazioni sul sito per "registrare" la distribuzione, ed avere i link nel menu start (se siete su windows 8, installate Start Menu 8). Installate la versione 3.x e verificate se usare la versione a 64 o 32 bit, controllando la vostra versione di Windows.
  • Console2  (Terminale)
  • Java Runtime Environment (JRE) e Octave (installer) (Octave è un implementazione opensource del linguaggio Matlab, che userete a Calcolo Numerico).
  • MikTek (Latex)

La variabile PATH della console, può essere cambiata come visto a lavoratorio, tramite il comando:

> set PATH=percorso;%PATH%    dove percorso è il percorso da aggiungere.
Esempio:
> set PATH=C:\Octave\Octave-3.8.2\bin;%PATH%
per verificare se tutto va bene, controllare con il comando:
> path
o provare a lanciare octave (interprete matlab) o il compilatore gcc

Questo deve essere ripetuto ogni volta che si apre una nuova console, in alternativa potete seguire il procedimento indicato qui, per cambiare la variabile globalmente.

Se si vuole usare python e tutti i programmi installati con WinPython le cartelle da aggiungere sono parecchie, conviene eseguire il file c:\WinPython\scripts\env.bat che provvede a settare la variabile PATH correttamente.

Per Android: Usare QPython3


Lezione 3/03:

Da Wiki2 (Wikipedia con un miglior aspetto), i link puntano alle pagine in inglese, molto più curate, e complete, se avete difficoltà, leggete la stessa voce in Italiano, trovate il link alla voce in italiano a sinistra (quando esiste). In grassetto quelli più importanti:

Computational Thinking , Algoritmi, Turing, Von Neumann, Radice Quadrata, Architettura di Von Neumann, Timeline, Memoria, RAM, CPU, ALU, CPU CLock, Gigabyte, Data Size, Byte. Programmi.

Questo documento approfondisce MOLTO l'impatto della gerarchia di memoria sulle performance dei calcolatori (non da studiare, solo per studenti interessati: i.e. mettetelo da parte, prima o poi potrebbe tornare molto utile).


Lezione 5/03:

Rappresentazione PosizionaleRappresentazione Binaria, Complemento a dueLinguaggi, SintassiSematica.

  • Linguaggi ad Alto Livello: Python (Interprete), C (Compilatore). IPython, vs Basso Livello
  • Compilazione vs Interpretazione
  • Esercitazione con Python:
    • valori: interi, float, stringhe.
    • assegnamento, operazioni aritmetiche.
    • input/output,  funzioni: input(), print()
    • controllo del flusso, guardie booleane, if, while
    • risoluzione equazione di secondo grado.

A lezione abbiamo usato ipython tramite terminale e editor esterno (Notepad++), un altro modo di procedere è usare un ambiente integrato dove l'editor e la console dell'interprete girano nella stesso programma, uno molto bello e comodo è Spyder, installato sempre con WinPython. Provatelo. Un altro modo infine è tramite i notebook, in questo modo l'interprete gira per conto suo, e l'interfaccia è fornita dal browser che si connette all'interprete e permette cose come questa (uno degli esempi che fa vedere come tramite librerie aggiuntive Python è comparabile ad ambienti come Matlab o Mathematica):  SymPyNotebook, Matplotlib, etc.

Esercizi:

  1. Scrivere un programma Python che legge da input tre interi (a,b,c) e stampa il valore minimo e massimo.
  2. Scrivere un programma Python che valuta il polinomio:

    in 100 punti distinti e equidistanti presi nell'intervallo
  3. Contare le operazioni di moltiplicazione che vengono eseguite nel programma sopra: considerate anche quelle svolte implicitamente dall'operatore di elevamento a potenza a**b, se usato.
  4. Adesso usando il metodo di Horner, sviluppare il polinomio sopra, come:

    scrivere un programma che svolge la stessa operazione di sopra ma con questa espressione, calcolate il numero complessivo di moltiplicazioni, in questo caso, e confrontate.
  5. Dopo aver scritto un programma per il calcolo del massimo comune divisore, modificatelo, in modo che prenda come input due interi, il numeratore e denominatore di una frazione, e stampi la stessa frazione ridotta ai minimi termini.
  6. Scrivete un programma che svolge la seguente operazione, somma 0.1+0.1+0.1 e stampa "bene" se il risultato è 0.3 altrimenti stampa "molto strano". Cosa accade? Preparatevi ad una sorpresa.
  7. Scrivete un programma che calcola l'espressione per k = 10,20,...1000. Cosa sta succedendo? (provate a sottrarre da quella quantità math.exp(1)). Quale risultato di analisi state sfruttando?

Codice visto a lezione:

import math

a = float(input("Inserisci a: "))
b = float(input("Inserisci b: "))
c = float(input("Inserisci c: "))
print("Equazione",a,"x^2 + ",b,"x + ",c)

delta = b**2-4*a*c
if (delta > 0):
    print("Due Soluzioni distinte:",end=" ")
    x1 = (-b + math.sqrt(delta)) / (2*a)
    x2 = (-b - math.sqrt(delta)) / (2*a)
    print(x1,x2)
elif (delta == 0):
    x1 = (-b + math.sqrt(delta)) / (2*a)
    print("Due soluzioni coincidenti: ",end="")
    print(x1)
else:
    print("Soluzioni Complesse")

print("Finito")

Cicli while

# questo e' un commento
# Iterazione (Ciclo) governato da un contatore.

i = 0
while i < 10:
    print("ciclo %d" % i)
    i = i + 1

Verifica il funzionamento usando i pulsanti sotto:


Lezione 10/03/2015:

  • IEEE 754, conversione da decimale con in notazione floating-point
  • Studiate la soluzione dell'esercizio 1 e 2 del compito qui.
  • Linguaggi Tipati: tipi base in Pyhton, interi, float, stringhe uso di type() e whos
  • Tipi statici/dinamici.
  • Tipo di Dato ,Linguaggi con tipizzazione forte vs debole
  • Dispensa,
  • leggere e confrontare: Python, C (in particolare la sezione sui tipi), Matlab
  • Esercizi:
    1. Scrivere un programma che chiede un intero positivo e stampa "Primo" se è primo, "Composto" se è composto, ed in questo caso stampa un divisore non banale.
    2. Scrivere due programmi, che convertono in binario un numero decimale. Uno genera le cifre con il metodo di divisione dalla meno significativa alla più significativa, l'altro divide per le potenze di due, generandole dalla più significativa alla meno significativa.
    3. Scrivere un programma che parte con x = 1.0,  eps = 1.0, e verifica se x+y != x. In caso positivo esso dimezza eps, e riprova, fermandosi solo se x+eps = x. Stampare il valore finale di eps e di eps*2.
    4. Scrivere un programma che riceve dall'input un intero n, e stampa il valore di n! (il fattoriale di n).
    5. Dato un intero N, stampate tutti i divisori di N.
    6. Considerate l'esercizio (1). Scrivere un doppio ciclo while, in cui dato un intero N, calcolate il numero di primi minori di N.

Lezione 12/03/2015

  • Spyder vs ipython notebook, vs ipython in console
  • Console: eseguire C:\WinPython\scripts\env.bat per aggiungere Python al path.
  • Console: eseguire: set PATH=C:\Octave\Octave-3.8.2\bin;%PATH% per aggiungere octave e gcc. (controllare il vostro numero di versione, 3.8.1 o 3.8.2).
  • Compilazione: gcc -std=c11 -Wall nomefile.c -o nomefile
// Esempio: stampa un elenco di numeri primi e la loro radice

#include <stdio.h>     // input output
#include <math.h>      // matematica
#include <stdbool.h>   // booleani (true,false)

int primo(int p)
{
    for (int a = 2; a < p; a++)      // domanda: se lo cambio con a*a <= p?
        if (p % a == 0) return false;
    return true;
}

#define EPS 1e-9

/* decommentate le printf, per stampare ad ogni invocazione,
 * i dettagli del calcolo.
 */

double radice(double x)
{
//    printf("radice di %f:\n",x);
    int iterazione = 1;
    double y = x;
    while (fabs(y*y - x) >= EPS) {
//        printf("%d - ",iterazione++);
//        printf("y = %.4f, error = %f\n",y,fabs(y*y-x));
        y  = (y + x/y)/2.0;
    }
    return y;
//    printf("---------\n");
}

int main(void)
{
    printf("Calcolo le radici di tutti i primi <= 133\n");
    printf("-----------------------------------------\n");

    for (int i=2; i<133; i++) {
        if (primo(i))
            printf(" %3d\t | %10.6lf\n",i,radice(i));
    }

    printf("--------------\n");
    return 0;
}
# stesso codice in python.
from math import sqrt,fabs

def primo(p):
    max = int(round(sqrt(p)))
    for a in range(2,max):
        if p % a == 0:
           return False
    return True

def radice(x):
   EPS=1e-9
   y = x
   while (fabs(y*y - x) >= EPS):
       y = (y + x/y)/2.0
   return y

print("Elenco di primi < 133, e loro radice quadrata")
print("---------------------------------------------")
for i in range(2,133):
    if (primo(i)):
        print(" %3d\t | %10.6lf" % (i,radice(i)))

Il predicato primo in Matlab (attenzione, essendo un linguaggio...accrocchiato, Matlab non permette di definire più funzioni in un file, come sopra in C, od in Python, ma una sola funzione per ogni file, che deve avere il nome della stessa funzione). Si noti la sintassi dei for, dell'if, etc.

function p = primo(n)
     for a = 2:n-1
         if (mod(n,a) == 0)
             p = false;
             return;
         endif
     endfor
     p = true;
endfunction
    Scrivere quindi la funzione sopra, in un file primo.m, metterlo nella vostra cartella, aprire la console, lanciare octave, e provare ad invocare primo(10), primo(11).
  • Esercizio: Stampare i valori della successione gap per . Cioè, la differenza tra due numeri primi successivi.
  • Vogliamo studiare come varia il valore gap, in particolare quanti primi gemelli (a distanza 2) si trovano per ?
  • Dare un occhiata a Scientific Python.