Skip to content
This repository has been archived by the owner on Jun 16, 2023. It is now read-only.

Commit

Permalink
fine lezione 8
Browse files Browse the repository at this point in the history
  • Loading branch information
mc-cat-tty committed Oct 14, 2021
1 parent e9f9e3d commit d26d76c
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 0 deletions.
5 changes: 5 additions & 0 deletions 7_notazione_posizionale.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,8 @@ Vantaggi:
- una sola rappresentazione per lo zero: tutti i bit a 0

Gli interi in C++ sono rappresentati in complemento a 2.

## Testing
Tracing = stampa risultati intermedi

White box e black box.
82 changes: 82 additions & 0 deletions 8_funzioni.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
## Le funzioni

## Istruzioni composte
=> una istruzione composta è racchiusa tra parentesi graffe e viene genericamente chiamata *blocco*.

Istruzione composta = sequenza di istruzioni racchiuse tra parentesi graffe.
```
{
<istruzione>
<istruzione>
...
}
```

Possono essere comprese anche istruzioni di definizione.

## Funzioni
Lo svantaggio di non usare funzioni è
- replicazione del codice: difficile manutenzione e fixing di bug.
- scarsa leggibilità: le funzioni permettono di dare un nome alle istruzioni composte.


## Cast implicito ed esplicito
Cast implicito -> `(int) n` => prendi conf di bit di n e leggila come se fosse un intero.
Cast esplicito -> `static_cast<int>(n)` => converti il numero contenuto in n e convertilo in un intero

## Significato funzioni
L'astrazione delle funzioni è disponibile in tutti i linguaggi ad alto livello. Una funzione è un costrutto che rispecchia l'astrazione matematica di funzione. Può avere molti parametri, ma UN SOLO valore di ritorno.

Permettono di dare un nome significativo ad un blocco di codice e richiamarlo nel programma.

## Elementi chiave
1. chiamata o invocazione della funzione: sospensione del programma corrente ed esecuzione delle istruzioni associate alla funzione. Ogni invocazione di una funzione corrisponde alla valutazoine di una espressione (funzione eseguita e risultato valutato).
2. dichiarazione o definizione

## Anatomia
TODO: inserisci definizione formale di funzione

### Intestazione
`<tipo-risultato> <nome-funzione> <lista-parametri-formali>`


Parametro formale = il valore passato all'invocazione viene inserito all'interno della variabile definita dal parametro formale.
Il valore di ritorno = il risultato della funzione ritorna un valore del tipo dichiarato.

### corpo
Istruzione composta che esegue istruzioni e ritorna un valore.

La parola chiave `return` permette di ritornare un valore.

## void
Le funzioni il cui valore di ritorno è `void` eseguono istruzioni, senza ritornare nulla.
Funzioni di questo tipo non possono essere inserite all'interno di espressioni.

Il `void` può essere usato anche all'interno della lista dei parametri formali: `void stampa_n_volte (void)`; equivale a non inserire niente all'interno delle parentesi.

## Procedure e funzioni
Procedura = funzione che non ritorna niente (funzione void in cpp).

## Parametri
- formali: variabile presente nella dichiarazione della funzione e utilizzabile dalle istruzioni della stessa.
- attuali: parametro che sto attualmente passando alla funzione.

## Esecuzione funzione
1. calcolo parameteri attuali
2. viene definito ogni parametri formale della funzione e inizializzato al valore del parametro formale
3. esecuzione funzione
4. se l'invocazione della funzione fa parte di un'espressione, la sua invocazione viene sostituita con il valore di ritorno della funzione stessa.

Ne deriva che ad ogni parametro formale deve corrispondere un parametro attuale (stesso numero di elementi)

## Funzione main()
Il main è una funzione al pari di tutte le altre. Il calcolatore cerca la funzione main per avviare il nostro programma (entry-point), esegue le istruzioni e recupera il valore di ritorno (intero) che viene chiamato exit-status, valutato dalla bash.

## Scope variabili
I parametri formali sono *oggetti locali* alla funzione (sia variabili che costanti). Allo stesso modo, le variabili/costanti dichiarate all'interno del corpo della funzione sono oggetti locali alla funzione.

Eg: `int ritorna_incremento(const int a) {...}`

I parametri costanti non sono modificabili all'interno del corpo della funzione.

TODO: fai esercitazione 6
Binary file modified esercitazioni/a.out
Binary file not shown.
21 changes: 21 additions & 0 deletions esercitazioni/numero_primo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include <iostream>

using namespace std;

int main() {
int n;
bool primo = true;
cin >> n;
for (int i=2; i<n; i++) { // soluzione inefficiente
if (n%i == 0) {
primo = false;
break;
}
}
cout << n;
if (primo)
cout << " è primo";
else
cout << " non è primo";
cout << endl;
}
37 changes: 37 additions & 0 deletions esercitazioni/numero_primo_ottimizzato.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <iostream>
#include <math>

using namespace std;

// TODO: completa

int main() {
/* struttura dati
n per contenere il numero
max_div per memorizzare il massimo numero per cui tentare la divisione
i indice del ciclo for
*/
int n;
cin >> n;
if (n>=1 && n<=3) {
cout << "primo" << endl;
return 0;
}

if (n%2==0)
return 0;

int max_div = static_cast<int>(n);
for (int i=4; i<n && primo; i+=2) { // soluzione inefficiente
if (n%i == 0) {
primo = false;
break;
}
}
cout << n;
if (primo)
cout << " è primo";
else
cout << " non è primo";
cout << endl;
}

0 comments on commit d26d76c

Please sign in to comment.