Laboratorio Di Programmazione
Laboratorio Di Programmazione
PROGRAMMAZIONE
L'informatica (INFORmazione autoMATICA), nella sua più moderna accezione, è un campo di
studio molto giovane. I primi veri elaboratori programmabili risalgono infatti solo al 1946, e allora
essa non era considerata una disciplina separata dall'elettronica e dalla matematica.
Nel corso degli anni, con l'incremento delle capacità di calcolo (o computazionali) degli elaboratori
(anche detti per tali motivi computer), ci si rese conto che il compito di "programmare" queste
macchine fosse estremamente difficile e richiedeva teorie e pratiche diverse da quelle dei campi
esistenti. L'informatica, ovvero "la scienza della risoluzione dei problemi con l'aiuto degli
elaboratori", divenne quindi una disciplina autonoma.
L'informatica è una disciplina complessa che abbraccia, come detto, campi molto diversi tra loro,
in cui l'elaboratore elettronico è solo lo strumento mediante il quale si possono attuare le tante
applicazioni per esso pensate. Non a caso il termine informatica deriva dalle parole "informazione"
e "automatica" per sottolinearne caratteristiche e finalità: essa si occupa del trattamento
dell'informazione mediante procedure automatizzabili attraverso un elaboratore. Infatti,
l'informatica è soprattutto la scienza della gestione e dell'elaborazione delle informazioni, e ciò,
spiega perché essa è penetrata in tutte le attività umane rappresentando nei paesi più evoluti
l'infrastruttura fondamentale per lo sviluppo culturale ed economico della società.
In tale ottica l'elaboratore assolve il compito di gestire e memorizzare le informazioni o dati,
mentre l'esperto informatico progetta le applicazioni necessarie a organizzare e quindi elaborare
le informazioni sia mediante l'uso di macchine (tra le quali lo stesso elaboratore), sia facendo
ricorso a sole risorse umane, o infine a soluzioni miste in cui macchine e uomini provvedono alla
attuazione dei processi individuati. A dispetto di quanto molto comunemente si ritiene, quella dei
computer non è però classificabile come "intelligenza": l'elaboratore, infatti, non fa altro che
eseguire istruzioni preventivamente "impartitegli" da un essere umano, ma con una velocità di
calcolo "superiore".
Da questa breve introduzione, emergono quelle che sono le principali problematiche legate
all'utilizzo dell'informatica, che tratteremo nel corso del testo:
È possibile rappresentare le informazioni in una forma tale da poter essere comprese e
trattate da un computer?
Come è fatto un computer? È importante conoscerne le componenti fondamentali e
capirne il funzionamento per poterlo utilizzare correttamente?
Come è possibile "programmare" un computer affinché le procedure di trattamento delle
informazioni siano effettivamente automatizzabili?
Oggi, la simulazione con il calcolatore affianca la matematica nel suo ruolo di linguaggio per
interpretare la realtà e come strumento per risolvere i problemi derivanti da essa.
Una volta capito quali e quanti passi da fare, creiamo un software/programma che ci permette di
continuare questo problem solving e di risolvere il problema tramite il calcolatore.
Risoluzione di un problema
1. Formulazione del problema: precisa definizione delle caratteristiche con individuazione dei
dati di input e di output
2. Descrizione mediante un modello matematico: definizione delle equazioni che
rappresentano il problema
3. Approssimazione mediante un metodo numerico: passaggio dall’infinito al finito
(discretizzazione)
4. Sviluppo dell’algoritmo: precisa definizione delle istruzioni e dei dati per la risoluzione del
problema
5. Sviluppo del programma: traduzione
dell’algoritmo in un linguaggio di
programmazione
L’insieme delle metodologie per la risoluzione di problemi scientifici con il calcolatore è noto come
CALCOLO SCIENTIFICO (o Analisi Numerica o Calcolo Numerico). Esso, quindi, si occupa di risolvere
un problema matematico (“scientifico”) con il calcolatore (“calcolo”), ossia di fornire idee di base,
metodologie e strumenti hardware e software per la risoluzione del problema matematico con il
calcolatore. Tutto ciò richiede una interazione stretta tra Matematica e Informatica (computer
science).
Per la risoluzione di un problema è necessario ricercare un algoritmo (come scritto prima, il quarto
passo è quello più importante).
Lo schema mette in luce gli elementi che concorrono alla soluzione dei problemi. Essi sono:
l'ALGORITMO, ossia un testo che prescrive un insieme finito di operazioni o azioni,
eseguendo le quali è possibile risolvere il problema assegnato. Se si indica con istruzione la
prescrizione di una singola operazione, allora l'algoritmo è un insieme di istruzioni da
svolgere secondo un ordine prefissato;
l'ESECUTORE, cioè l'uomo o la macchina in grado di risolvere il problema eseguendo
l'algoritmo. Ma se un algoritmo è un insieme di istruzioni da eseguire secondo un ordine
prefissato, allora l'esecutore non solo deve comprendere le singole istruzioni ma deve
essere anche capace di eseguirle. E può eseguirle una dopo l'altra secondo un ordine
rigidamente sequenziale che impone l'inizio dell'esecuzione di una nuova istruzione solo al
termine di quella precedente; oppure può eseguire più istruzioni contemporaneamente
svolgendole in parallelo;
le INFORMAZIONI DI INGRESSO (anche dette input), ossia le informazioni che devono
essere fornite affinché avvengano le trasformazioni desiderate;
le INFORMAZIONI DI USCITA (anche dette output), ossia i risultati prodotti dall'esecutore
del dato algoritmo.
Uno dei metodi più diffusi in passato per la descrizione degli algoritmi è il FLOW CHART
(diagramma di flusso). Esso utilizza:
figure geometriche per identificare il tipo di istruzione;
archi orientati (frecce) per definire l’ordine delle
istruzioni.
Se una delle condizioni non è sufficientemente specificata è necessario chiedersi come renderla
più chiara, ad esempio ripetendo più volte la stessa istruzione. In questo caso, si utilizza una
STRUTTURA DI ITERAZIONE, che consiste nell’utilizzare una condizione da verificare per ripetere
più volte la stessa istruzione. Quindi, uno degli archi orientati ritorna su istruzioni già eseguite.
Mentre gli antichi romani utilizzavano il SISTEMA ADDITIVO, basato sulla somma di simboli base
che diventavano nuovi numeri), dunque, noi oggi usiamo il SISTEMA POSIZIONALE, per il quale il
valore del numero dipende dalla posizione. Ad esempio, 333 9, ma 333 = 300 + 30 + 3.
Il primo calcolatore programmabile (lo Z1) fu costruito negli anni ’30 del XX secolo dall’ingegnere
tedesco Konrad Zuse (1910-1995).
Lo schema fu messo a punto da John Von Neumann, matematico ungherese del XX secolo
emigrato in America nel 1933. Circa nel 1945, elaborò un modello di come doveva essere un
calcolatore. Ovviamente, la tecnologia è cambiata con il passare del tempo, ma le componenti e le
loro utilità sono rimaste le stesse. Questa
struttura influenza i linguaggi di
programmazione, ossia le istruzioni che
diciamo al calcolatore.
L’unità di controllo prende le istruzioni dalla memoria e le analizza una per volta. Tali istruzioni
prendono a loro volta un certo dato e lo portalo nell’unità logico-aritmetica.
La memoria contiene l’algoritmo che descrive le operazioni da eseguire e i dati su cui l’algoritmo
stesso opera.
I dispositivi di input e output sono le interfacce della CPU nei confronti del mondo esterno.
Rispettivamente sono l’unità che consente l’inserimento di algoritmo e dati in memoria, e quella
che presenta i risultati dell’attività della CPU.
Queste unità fondamentali formano l’hardware del computer, ossia l’insieme di tutti i componenti
elettronici e meccanici che costituiscono un sistema di elaborazione.
Il prototipo proposto da Von Neumann era basato sul concetto di "programma memorizzato": la
macchina immagazzinava nella propria memoria i dati su cui lavorare e le istruzioni per il suo
funzionamento. Una tale flessibilità operativa fece sì che macchine nate allo scopo di alleviare i
problemi di calcolo per tecnici e scienziati potessero essere in seguito impiegate nella risoluzione
di problemi di natura completamente diversa, come problemi di tipo amministrativo, gestionale e
produttivo.
Le caratteristiche che un sistema di tale tipo presenta, e che ne hanno decretato la rapida
diffusione in molti campi applicativi, sono:
Uno schema di funzionamento semplice nelle sue linee generali.
La velocità e affidabilità nella esecuzione degli algoritmi. La velocità di esecuzione si
aggira attualmente sui milioni di istruzioni svolte dalla CPU in un secondo. Dal punto di
vista dell'affidabilità, si può affermare che un computer non commette errori, in quanto è
un esecutore obbediente dell'algoritmo, e gli errori dovuti a guasti o a cattivi
funzionamenti hardware sono subito riscontrabili, alcune volte persino in maniera
automatica.
Una adeguata capacità di memoria. Per memorizzazione delle informazioni si intende il
compito della memoria di conservare informazioni per la CPU. La memorizzazione può
essere temporanea, permanente o definitiva. Con capacità di memoria si fa riferimento al
numero di informazioni che possono essere gestite e si misura in byte. Tale numero varia in
base al tipo di memoria usato, all'architettura della memoria stessa e al tipo di
informazione.
Un costo vantaggioso. Per quanto riguarda il costo dei computer si può sicuramente
considerare basso se paragonato ai tempi di lavoro necessari affinché esseri umani portino
a termine gli stessi compiti. Ed è anche in conseguenza di ciò che i computer vanno sempre
più diffondendosi nei settori produttivi della società.
Per concludere si deve notare che i dispositivi di input e di output interfacciano la CPU con
l'ambiente esterno, provvedendo a tutte le trasformazioni necessarie a rendere comprensibili le
informazioni sia alla CPU che agli utenti esterni del
computer. Essi vengono progettati in modo confacente ai
meccanismi di comunicazione delle informazioni
dell'ambiente in cui il computer è immerso. Nelle
comunicazioni con un utente umano, il tipico dispositivo di
input è la tastiera mentre quello di output è uno speciale
televisore detto monitor o video.
Memoria
Per poter accedere rapidamente ai dati presenti in memoria, le locazioni sono univocamente
individuate da un indirizzo.
Per tale motivo, la locazione è la minima quantità di memoria a cui si può accedere. Quindi, invece
di avere un indirizzo per ogni singolo bit, abbiamo un indirizzo per ogni gruppo di bit (ossia per
ogni locazione). Nell’unità logico-aritmetica avremo la somma di bit, uno appartenente ad un
indirizzo e uno appartenente ad un altro.
Nella prima fase dell’era informatica moderna (anni ’50 del XX secolo), ogni azienda strutturava le
locazioni di memoria con un numero di bit differente dalle altre. La conseguenza furono grandi
problemi di portabilità delle applicazioni da un calcolatore all’altro. Sorse, infatti, l’esigenza di
uniformare la dimensione delle locazioni di memoria. Oggi, la dimensione comune delle locazioni
di memoria di tutti i calcolatori è 8 bit, cioè 1 Byte, che è diventata proprio l’unità di misura della
capacità di memoria.
Con una sola locazione è possibile memorizzare una quantità di informazione molto piccola per le
esigenze concrete. Ad esempio, con 8 bit è possibile memorizzare:
un numero intero (con segno) minore di 128;
una lettera dell’alfabeto o un carattere.
Per tale motivo, le locazioni sono raggruppate in PAROLE o WORD. Tipicamente, oggi i calcolatori
hanno parole di:
32 bit (cioè 4 locazioni)
64 bit (cioè 8 locazioni)
128 bit (cioè 16 locazioni)
Sulle locazioni di memoria non possiamo fare le operazioni aritmetiche, in quanto siamo nella
memoria e non nell’unità logico-aritmetica. Al contrario, è possibile effettuare altri due tipi di
operazioni:
LETTURA. Consiste nel prelevare un dato dalla memoria (ad esempio per utilizzarlo in una
somma). L’operazione è conservativa (il dato rimane nella locazione di memoria, e quando
lo “spostiamo” nell’unità aritmetico-logica, non scompare dalla memoria, ma ne viene fatta
una copia).
SCRITTURA. Consiste nel mettere un dato in una locazione di memoria (ad esempio per
memorizzare un dato di input). L’operazione è distruttiva (un eventuale dato già presente
si perde).
Da un punto di visto logico, qualunque dispositivo capace di memorizzare dati o istruzioni è una
memoria. Dal punto di vista pratico, in un calcolatore esistono diversi tipi di memoria, con
caratteristiche e funzioni diverse. Si è creata, dunque, una gerarchia di memoria.
Con l’avanzare della tecnologia, si sono aggiunti vari tipi di memoria (intesa come dispositivo per
ricordare). Esse non sono alternative tra loro, ma complementari.
Ognuna ha una funzione ben precisa e tutte servono ad immagazzinare e ricordare dati (byte).
In questa gerarchia, i vari tipi di memoria sono ordinati dal più piccolo al più grande e dal più
veloce al più lento.
I registri CPU e la Cache si occupano di portare i dati che sono più spesso richiesti
dall’algoritmo all’interno della memoria, in modo da poter essere riutilizzati il più possibile,
senza doverlo andare a recuperare ogni volta.
La Memoria Centrale (ad esempio
RAM, ossia Random Access Memory) è
veloce, piccola e volatile (cioè si perde
tutto quando si stacca dal calcolatore).
L’Hard Disk (o Disco Fisso, o Memoria
Secondaria) è lenta, grande e
permanente. Tutti i programmi
risiedono sulla memoria secondaria e
quando bisogna eseguire un
particolare programma viene spostato
sulla memoria centrale (più veloce).
N ∙V o equivalentemente N /T
Dove:
• N è la dimensione in byte
• V è la velocità
• T è il tempo di accesso
CPU (Central Processing Unit)
Il processore centrale è composto da tre parti fondamentali: l’Unità di Controllo (UC o CU – Control
Unit), l’Unità Logico-Aritmetica (ALU) e un insieme di registri detti “interni” per distinguerli da
quelli della memoria centrale, che variano da processore a processore in funzione della sua
architettura.
Registri
Sono le locazioni di memoria della Cache.
Colui che formalizzò il concetto di algoritmo e di macchina programmabile (la Macchina di Turing)
nel 1936 fu il matematico inglese Alan Turing (1912-1954), che negli anni ’50 pose le basi
dell’Intelligenza Artificiale.
Ovviamente, possono anche esserci dati più complessi, ma comunque riconducibili a questi
elementari.
Schema riepilogativo:
Il sottoinsieme dei numeri relativi (interi positivi e negativi) che possono essere rappresentati nella
memoria di un calcolatore. In generale, nella rappresentazione posizionale, le cifre di un numero
dono i coefficienti di una combinazione lineare delle potenze della base.
Ad esempio, dato il numero 123 in base b=10, otteniamo che 123=1∙ 102 +2∙ 101 +3+10 0.
Questo tipo di dato ci serve per contare (ad esempio, il numero di elementi in un insieme, oppure
il numero di passi, e così via). Invece, per misurare, ci vorrebbero i numeri decimali.
Nella memoria del calcolatore, poiché le locazioni di memoria sono costituite da bit, i dati di tipo
intero sono rappresentati col sistema posizionale binario (base b=2).
•
4 3 2 1 0
10010=1∙ 2 +0 ∙ 2 +0 ∙2 +1 ∙2 +0 ∙ 2 =16+ 2=18
Essendo in una locazione di memoria, il numero in base 2 deve essere ad 8 cifre (deve, cioè,
occupare 8 posti). Nel caso di 11010 notiamo che ci mancano ancora 3 posti, per cui possiamo
considerarli come 3 zeri prima del numero, i quali, come per la rappresentazione in base 10, non
hanno valore. Ad esempio, 02 = 2, e allo stesso modo 00010010 = 10010.
L’unità di output fa questa conversione automaticamente.
18 / 2 = 9 con resto 0
Prendo il risultato precedente e continuo:
9 / 2 = 4 con resto 1
Itero questo procedimento:
4 / 2 = 2 con resto 0
Infine:
2 / 2 = 1 con resto 0
1 / 2 = 0 con resto 1
Più in generale, dati L bit, abbiamo che: 0 ≤ K ≤ 2 L−1 . Infatti, dato L = 8, 28−1=255.
Quindi, a questo punto, abbiamo solo 7 bit su 8 per la rappresentazione del modulo. Dunque,
l’intero K rappresentabile su 8 bit sarà: −127 ≤ K ≤ 127 .
Più in generale, dati L bit, abbiamo che: −( 2 L−1−1 ) ≤ K ≤2 L−1−1 . Infatti, 27−1=127.
Tale rappresentazione, tuttavia, non permette di effettuare la sottrazione come somma algebrica
tra numeri di segno opposto: X −Y ≠ X+(−Y ).
Inoltre, abbiamo detto che con la rappresentazione segno e modulo, per convenzione, attribuiamo
l’ultimo bit sulla sinistra al segno e i rimanenti alla rappresentazione del modulo. Il problema sorge
quando dobbiamo rappresentare lo 0 (che è sia positivo sia negativo, per definizione):
• Rappresentazione complemento a 2
I numeri positivi sono rappresentati come con la rappresentazione unsigned, utilizzando al più L-1
bit.
I numeri negativi, invece, sono rappresentati in due passi:
si cambiano i bit 0 in 1 e viceversa della rappresentazione del valore assoluto;
si aggiunge 1 al risultato.
CONVERSIONE DA DECIMALE IN BINARIO
numero positivo: rappresentazione unsigned (da base 10 a base 2) di al più L – 1 bit
numero negativo:
1. cambio dei bit 0 con 1 e viceversa (complemento a 1)
2. si aggiunge di 1
Con questa rappresentazione è possibile eseguire la differenza come somma algebrica di numeri di
segno opposto.
0 0 0 0 0 0 0 0
Un numero k, con L=8 bit, è rappresentabile se −128 ≤ K ≤ 127 . Più in generale, dati L bit, abbiamo
che: −2 L−1 ≤ K ≤ 2L−1−1.
Il primo bit di un numero negativo è sempre 0, ma non deve essere visto come segno.
Con questa rappresentazione è possibile eseguire la differenza come somma algebrica di numeri di
segno opposto.
0 0 0 0 0 0 0 0
Un numero k, con L=8 bit, è rappresentabile se −128 ≤ K ≤ 127 . Più in generale, dati L bit, abbiamo
che: −2 L−1 ≤ K ≤ 2L−1−1.
Riepilogo:
= +0
= –0
Poiché nella rappresentazione del tipo intero non è previsto il punto decimale, la divisione tra
numeri interi produce sempre un numero intero per troncamento. Quindi, dichiarando all’inizio
che vogliamo solo il quoziente, ossia che siamo in Z , il resto viene scartato dal risultato.
La situazione per cui il risultato di una operazione tra due numeri rappresentabili non è
rappresentabile è detta OVEWFLOW. Questo, quindi, è il fenomeno che si verifica quando
cerchiamo di rappresentare un numero che va al di fuori dell’intervallo di rappresentabilità.
Il tipo carattere
Schema riepilogativo:
LINGUAGGIO : insieme di regole per stabilire quali parole hanno senso e quali non e per
combinarle in modo corretto.
Tra lettere, cifre e caratteri speciali, i dati alfanumerici sono circa un centinaio e servono circa 7-8
bit per rappresentare ognuno di essi. Per tale motivo, se si ha necessità di memorizzare più
caratteri, si concatenano più locazioni di memoria. American Standard Code for Information Interchange
Confronto
Concatenazione
Esiste una
naturale
corrispondenza
tra i valori vero-
falso con i valori
0-1, attraverso la
quale è possibile
interpretare le
operazioni
aritmetiche tra
numeri binari come operazioni logiche.
e
x=f ∙ b
Dove:
b ∈ N : b>1
e∈Z
1/b ≤|f |<1, cioè la parte intera di f è sempre uguale a zero e la sua prima cifra decimale è
non nulla
Ovviamente, la rappresentabilità di un dato di tipo reale dipende dalla lunghezza della parola, per
cui abbiamo un vincolo sia sul numero di cifre della mantissa, sia su quello dell’esponente.
Invece, abbiamo un range limitato per l’esponente, al di fuori del quale gli esponenti non posso
essere rappresentati esattamente. Chiamiamo b la base e q il numero di cifre a disposizione per le
cifre dell’esponente, allora:
q−1
Emin =−(b −1)=minimo esponente rappresentabile
q−1
Emax =b −1=massimo esponente rappresentabile
In particolare, l’intervallo di
rappresentabilità di un numero reale è:
−5 5
0.100 ∙ 10 ≤ R ≤ 0.999 ∙10
Il primo bit della mantissa è sempre uguale a 1, e per tale motivo si sottintende (guadagnando un
bit di precisione). È il cosiddetto bit implicito.
In questa rappresentazione, inoltre, l’esponente è rappresentato come intero per eccesso 127,
cosa che trasforma l’intervallo [0 ,255 ] nell’intervallo [−127 ,128 ].
OPERAZIONI
Le operazioni possibili sono addizione fl.p., sottrazione fl.p., moltiplicazione fl.p., divisione fl.p.
ERRORI DI ROUND-OFF
Uno dei problemi del calcolo scientifico è valutare l’accuratezza del risultato calcolato da un
algoritmo e la risoluzione di un problema scientifico è soggetta a numerosi tipi di errore.
Errore assoluto
Sia x un numero reale qualunque e x ¿ una sua approssimazione corretta a m cifre decimali. Allora,
¿ −m
E A =¿ x−x ∨¿ 10
Ma non vale il viceversa, in quanto non è detto che se l’errore è minore di 10−m allora ho sempre
m cifre decimali corrette.
Errore relativo
¿
Sia x un numero reale qualunque e x una sua approssimazione corretta a m cifre significative:
E R=| x−x |/¿ x∨¿ 10
¿ −m+1
Quindi, l’errore relativo ci fornisce un modo per tenere conto dell’ordine di grandezza del numero
da approssimare.
Ovviamente, l’approssimazione di x che possiamo usare è anche quella floating point, per cui:
¿
x =fl ( x).
Ci chiediamo, allora, qual è il massimo errore relativo che si commette rappresentando x con fl(x )
? Esso è detto Massima Accuratezza Relativa (è una delle costanti macchina) e si indica/calcola nel
seguente modo:
u=max {|
x−fl(x )
x |}
≤ b1−t /2
fl ( x )−x
Inoltre, posto δ= ⟹ fl ( x )=x (1+δ), con ¿ δ∨≤ u.
x
E R=| z ||
z−fl(z ) ( x Op y )−(x Opfp y)
=
x Op y |≤b 1−t /2=u
Dove:
+¿ fp ¿ è la somma eseguita dal calcolatore (somma floating point)
| |
¿
¿ z−z
fl ( z )=fl ( x + y )= x +¿ fp y=z ⟹ E R= =¿ ¿
z
Op
un’operazione aritmetica
Opfp la sua corrispondente operazione in aritmetica a precisione finita
( x Opfp y ) =(x Op y )(1+δ), con ¿ δ∨≤ u
Epsilon macchina
In un sistema aritmetico floating point esiste un insieme di numeri che fornisce contributo alla
somma con 1.
Dividendo per x, si ottiene: 1+ y / x=fl(1+ y /x )> 1. In questo modo ci si riconduce alla definizione
di epsilon macchina: y / x=ε ⟹ y=ε∨x ∨¿.
1 1−t
A livello pratico, dati i valori di input di b , t , E min , E max , x , calcoliamo ε = b , ricordando che
2
( ) δ
fl ( x+ δ ) > x ⟹ fl 1+ > x ⟹ δ=ε ∙ x .
x
PASCAL-LIKE FORTRAN
(real/integer/character/logical) (real/integer/character/logical)
(+ complex)
Dichiarazione array var |variabile|(N): array of |tipo |tipo di variabile|, dimension
di variabile| (N) :: |variabile|
Assegnazione = =
oppure oppure
repeat do
|istruzione| |istruzione|
until (|condizione|) if (|condizione|) exit ; enddo
oppure oppure
Alcune
denominazioni importanti:
Oltre all’interfaccia grafica (desktop) fornita dalla distribuzione, LINUX possiede un’interfaccia “a
line di comando”, che prende il nome di SHELL (guscio), detto anche terminale.
La shell è la sola interfaccia utilizzabile quando si opera su sistemi remoti, infatti attraverso la shell
l’utente è in grado di agire sui file e le directory, in quanto essa avvisa l’utente che è pronta per
accettare un comando visualizzando una stringa chiamata prompt: >> |comando|.
COMANDI
/ Root directory
. Working directory
(pwd = print working directory) Sono mostrate tutte le directory, dalla root
directory alla working directory, separate da “/
”
(ls = LiSt)
cp |nome file| |nome file / directory| • Crea una copia del file esistente specificato e
lo sovrascrive ad un vecchio file specificato
(cp = CoPy)
• Crea una copia del file esistente specificato
nella directory specificata, utilizzando lo stesso
nome
mv |nome file vecchio| |nome nuovo / • Sposta un file esistente di cui è specificato il
directory| nome nella directory specificata