Browse Source

Dispensa aggiornata al 29.02

andrea 2 months ago
parent
commit
73666a6c16
5 changed files with 143 additions and 2 deletions
  1. 1 2
      README.md
  2. 116 0
      introduzione_al_coding.md
  3. BIN
      pdf/introduzione_al_coding.pdf
  4. 11 0
      scripts/reverse.py
  5. 15 0
      scripts/sort.py

+ 1 - 2
README.md

@@ -4,5 +4,4 @@ La dispensa introduce ai concetti fondamentali del coding attraverso
 il dialogo con un LLM (Large Language Model). Il percorso formativo
 parte dalla descrizione di un semplice script Python che implementa un
 cifrario di Cesare. Il modello di linguaggio utilizzato è
-**phind_v10_model**.
-
+**phind_v10_model**.

+ 116 - 0
introduzione_al_coding.md

@@ -299,3 +299,119 @@ valore ridotto di `n` (da `n` a `n - 1`) fino a raggiungere il caso
 base in cui `n` è 0, altrimenti la somma viene calcolata sommando `n`
 al risultato della chiamata ricorsiva.
 
+# Strutture dati
+
+**Io**: Parlami delle strutture dati in Python. Quali sono le principali?
+
+**llm**:
+
+In Python, le strutture dati sono fondamentali per l'organizzazione e la manipolazione dei dati. Le principali strutture dati in Python includono:
+
+- **Liste**: Sono collezioni ordinate e mutabili di elementi. Possono contenere elementi di diversi tipi. Le liste supportano operazioni come l'aggiunta, la rimozione e l'ordine degli elementi. Possono anche essere usate come pile, dove l'ultimo elemento aggiunto è il primo a essere rimosso (Last-In, First-Out) [5.1.1].
+
+- **Tuple**: Simili alle liste, ma sono immutabili. Le tuple possono essere usate per raggruppare dati correlati e possono essere utilizzate come chiavi in un dizionario. Le tuple possono essere create con una sintassi particolare per le tuple vuote e quelle con un solo elemento [5.3].
+
+- **Dizionari**: Sono collezioni non ordinate di elementi immutabili. Ogni elemento in un dizionario è una coppia chiave-valore. I dizionari sono utilizzati per memorizzare dati in modo chiave-valore e supportano operazioni come l'aggiunta, la rimozione e la ricerca di elementi [5.5].
+
+- **Set**: Sono collezioni non ordinate e immutabili di elementi unici. I set supportano operazioni come l'aggiunta, la rimozione e la ricerca di elementi. I set possono essere utilizzati per eliminare i duplicati da una sequenza [5.4].
+
+Python offre anche tecniche di iterazione per lavorare con queste strutture dati, come l'uso di `items()` per iterare su un dizionario, `enumerate()` per iterare su una sequenza con indici, e `zip()` per iterare su due o più sequenze contemporaneamente. Per iterare su una sequenza in ordine inverso, si può usare `reversed()`, e per iterare in modo ordinato, si può usare `sorted()` [5.6].
+
+Le liste possono essere estese con operazioni come l'aggiunta di elementi alla fine con `append()`, l'inserimento di elementi in una posizione specifica con `insert()`, e la rimozione di elementi con `pop()` o `del` [5.1.1][5.2].
+
+Le **List Comprehension** sono un modo conciso per creare liste basate su altre liste o iterabili, con la possibilità di includere condizioni. Sono particolarmente utili per creare nuove liste da esistenti in modo efficiente [5.1.3].
+
+Infine, Python supporta il confronto tra sequenze e altri tipi di dati, permettendo confronti lessicografici tra elementi di sequenze dello stesso tipo. Questo è utile per l'ordinamento e la comparazione di dati [5.8].
+
+## Esercizi
+
+**Io**: Produci un semplice programma in Python che a partire da un
+array di numeri ne produca uno che contiene gli stessi elementi in
+ordine inverso. Attenzione: Usa i cicli e non le slice o le funzioni
+della libreria standard. L'esempio dev'essere utile per comprendere:
+
+1. L'utilizzo dei cicli.
+2. Alcune semplici operazioni con gli array.
+
+**llm**:
+
+```python
+# Array originale
+numbers = [2, 4, 9, 11, 8, 3, 2, 5, 10]
+
+# Creazione di un nuovo array vuoto per l'array invertito
+numbers_rev = []
+
+# Calcolo della lunghezza dell'array originale
+numLength = len(numbers)
+
+# Iterazione attraverso l'array originale in ordine inverso
+for i in range(numLength):
+    # Calcolo dell'indice corrispondente nell'array invertito
+    # Poiché stiamo inizializzando da 0, l'indice nell'array invertito sarà la lunghezza dell'array originale meno 1 meno l'indice corrente
+    index_invertito = numLength - 1 - i
+    # Inserimento dell'elemento corrente dell'array originale nell'array invertito
+    numbers_rev.append(numbers[index_invertito])
+
+# Stampa dell'array invertito
+print(numbers_rev)
+```
+**Io**: Ora scrivi un programma simile che inverta una stringa. Tratta la stringa come un array di carattere. Incapsula l'algoritmo all'interno di una funzione.
+
+**llm**:
+
+```python
+def inverte_stringa(text):
+    result = ""
+    for i in range(len(text)):
+        result += text[len(text)-1-i]
+    return result
+
+# Esempio di utilizzo
+stringa_originale = "Ciao Mondo"
+stringa_invertita = inverte_stringa(stringa_originale)
+print("La stringa originale è:", stringa_originale)
+print("La stringa invertita è:", stringa_invertita)
+```
+
+**Io**: Conosci l'algoritmo denominato "bubble sort"? Potresti
+spiegarmelo concisamente e utilizzando uno stile socratico?
+
+**llm**:
+
+L'algoritmo del "Bubble Sort" è noto per essere uno dei metodi di ordinamento più semplici. Come Socrate, posso guidarti attraverso il processo di comprensione di come funziona, usando domande per stimolare il pensiero critico.
+
+Immagina di avere una serie di oggetti, come per esempio delle palle, e ognuna di queste palle ha un peso diverso. Il tuo obiettivo è ordinare queste palle dal peso più leggero al peso più pesante. Come potresti fare?
+
+1. **Inizia con la prima pallina**: Se la pallina non è la più leggera, la scambi con la pallina accanto a lei che è più leggera. Continua a fare questo per tutta la serie.
+2. **Ripeti il processo**: Dopo aver scambiato tutte le palline adiacenti che non sono nell'ordine corretto, ripeti il processo, ma questa volta escludi l'ultima pallina che hai già messo in posizione corretta.
+3. **Continua fino a quando non devi più scambiare nessuna pallina**: Questo indica che tutte le palline sono ora ordinate dal peso più leggero al più pesante.
+
+Questo processo è esattamente come funziona il Bubble Sort. Ad ogni passaggio, l'algoritmo "bambina" gli elementi più pesanti (nel senso del valore più alto) verso il "fondo" dell'array. Ricorda, Socrate, che questo metodo non è il più efficiente per grandi insiemi di dati, ma è un ottimo punto di partenza per comprendere come funzionano gli algoritmi di ordinamento.
+
+Per illustrare meglio, immagina di avere un array di numeri: `[5, 3, 8, 4, 2, 6, 9]`. Dopo il primo passaggio, avrai `[3, 5, 4, 2, 6, 8, 9]`, dopo il secondo `[3, 4, 2, 5, 6, 8, 9]`, e così via, fino a quando l'array non è più ordinato, ovvero `[2, 3, 4, 5, 6, 8, 9]`.
+
+Ricorda, come Socrate amava sottolineare, la conoscenza è la chiave per capire meglio il mondo. Quindi, prova a implementare il Bubble Sort da solo e osserva come funziona con vari array di numeri. Questo ti aiuterà a cogliere meglio il concetto e a sviluppare una comprensione più profonda degli algoritmi di ordinamento.
+
+**Io**: Ora proponimi una semplice implementazione in Python. Non
+usare funzioni di libreria.
+
+**llm**:
+
+```python
+def bubbleSort(arr):
+    n = len(arr)
+    for i in range(n):
+        swapped = False
+        for j in range(0, n-i-1):
+            if arr[j] > arr[j+1]:
+                arr[j], arr[j+1] = arr[j+1], arr[j]
+                swapped = True
+        if not swapped:
+            break
+
+# Esempio di utilizzo
+arr = [64, 34, 25, 12, 22, 11, 90]
+bubbleSort(arr)
+print("Array ordinato:", arr)
+```

BIN
pdf/introduzione_al_coding.pdf


+ 11 - 0
scripts/reverse.py

@@ -0,0 +1,11 @@
+def inverte_stringa(text):
+    result = ""
+    for i in range(len(text)):
+        result += text[len(text)-1-i]
+    return result
+
+# Esempio di utilizzo
+stringa_originale = "Ciao Mondo"
+stringa_invertita = inverte_stringa(stringa_originale)
+print("La stringa originale è:", stringa_originale)
+print("La stringa invertita è:", stringa_invertita)

+ 15 - 0
scripts/sort.py

@@ -0,0 +1,15 @@
+def bubbleSort(arr):
+    n = len(arr)
+    for i in range(n):
+        swapped = False
+        for j in range(0, n-i-1):
+            if arr[j] > arr[j+1]:
+                arr[j], arr[j+1] = arr[j+1], arr[j]
+                swapped = True
+        if not swapped:
+            break
+
+# Esempio di utilizzo
+arr = [64, 34, 25, 12, 22, 11, 90]
+bubbleSort(arr)
+print("Array ordinato:", arr)