Tag Archives: giuseppe ciaburro

Sottoprogrammi nel Fortran


FORTRANCosì come già accadeva per il fortran 77, anche il nuovo formato fortran 90 ci consente di suddividere un programma principali in una serie di sottoprogrammi. tali sottoprogrammi possono essere di due tipi:

  1. funzioni
  2. subroutine

In entrambi i casi è poi possibile suddividere il sottoprogrammi in ulteriori due forme:

  1. sottoprogramma interno
  2. sottoprogramma esterno.

I sottoprogrammi interni sono quelle procedure che possono comparire nell’ambito del programma principale. mentre i  sottoprogrammi esterni sono quelli che compaiono in una sezione separata di programma dopo l’ istruzione principale END del programma.

Ciò è del tutto simile a quanto già si faceva nel fortran 77 trattandosi pur sempre di programmazione procedurale.  Inoltre, così come in fortran 77, i sottoprogrammi del tipo function, nel fortran 90, hanno un tipo esplicito e sono indirizzati a restituire un valore.

Mentre i sottoprogrammi del tipo subroutine, non hanno tipo esplicito e restituiscono il risultato o nessun valore con una chiamata del parametro CONTAINS(). Poichè porremo l’attenzione sui sottoprogrammi esterni, è essenziale l’utilizzo di una caratteristica del fortran 90 conosciuta come INTERFACE BLOCKS.

Questo blocco è una caratteristica di sicurezza che permette che i programmi principali ed i subprograms esterni si connettano giustamente. Un INTERFACE BLOCKS si accerta che il programma chiamante ed il subprogram abbiano il numero ed il tipo corretti di argomenti.

Ciò aiuta il compilatore a rilevare l’uso errato d’un subprogram . Un INTERFACE BLOCK consiste di:

1. numero di argomenti
2. tipo di ogni argomento
3. che tipo del value(s) ha restituito il subprogram

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Gli array bidimensionali in Fortran


FORTRANUn array bidimensionale, anche detto matrice, è una variabile strutturata tale che i suoi elementi sono tutti dello stesso tipo e il meccanismo di accesso diretto ai suoi elementi consiste di due espressioni intere dette indici.

In Fortran gli array bidimensionali e in generale multidimensionali possono essere dichiarati nel modo seguente:

REAL, DIMENSION(2,3) :: A
REAL, DIMENSION(0:1,0:2) :: B
INTEGER,DIMENSION(10,20,3) :: I

Il limite massimo sul Rank (il numero di dimensioni) d’un array è 7. I valori degli elementi d’un array multidimensionale possono essere assegnati in un modo simile a quello per la varietà unidimensionale.

Ad esempio, i valori 1, 2, 3, 4, 5, 6 possono essere assegnati all’array bidimensionale A nel modo seguente:

A = (/ 1, 2, 3, 4, 5, 6 /)

Ciò assegna i valori dell’array di A nell’ordine della colonna simile alle regole di fortran 77. L’assegnazione dei valori di un array ad un altro array è consentita a condizione che entrambi gli array in questione abbiano la stessa dimensione fisica. Per esempio,

B = A

assegna i valori precedentemente assegnati all’array A all’array B. Così come con gli array unidimensionali, gli operatori e le funzioni applicate normalmente alle espressioni semplici, possono anche essere applicati agli array multidimensionali che hanno lo stesso numero di elementi.

Sono altresì disponibili diverse funzioni intrinseche per elaborare gli array multidimensionali. Quelle più utili sono:

  • MAXVAL(A, D): restituisce un array che contiene i valori massimi lungo la dimensione D(se la D e omessa, restituisce il valore massimo dell’intero array)
  • MAXLOC(A) : restituisce la locazione di memoria del valore max lungo D di A
  • SUM(A, D) : restituisce un array che contiene le somme degli elementi di A lungo la dimensione D (se la D e omessa,restituisce la somma degli elementi dell’ intero array)
  • MATMUL(A, B): restituisce il prodotto di A e della B
  • TRANSPOSE(A): restituisce la trasposta del 2d array A

Un array può essere allocatable ,cioè, può essergli assegnata una locazione di memoria precisa durante l’esecuzione. Vediamo allora come ichiarare un array allocatable reale A,

REAL, DIMENSION(:,:), ALLOCATABLE :: A

Nel momento di esecuzione, i limiti reali per l’array A possono essere determinati dalla istruzione:

ALLOCATE(A(N, N), STAT = AllocateStatus) SE (AllocateStatus/ = 0)
                      ARRESTO ” * * * non abbastanza ***” di memoria

Qui, la N ed AllocateStatus sono variabili numero intero. AllocateStatus prende il valore 0 se la ripartizione riesce o un certo altro valore dipendente della macchina se la  memoria risulta insufficiente.

Un array può essere liberato dalla memoria usando il comando di DEALLOCATE:

DEALLOCATE (A, Stat = DeAllocateStatus)

Di nuovo, DeAllocateStatus rappresenta una variabile  numero intero il cuivalore è 0 se la cancellazione avviene.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Gli array monodimensionali nel Fortran


FORTRANUn array monodimensionale rappresenta una struttura dati complessa, statica e omogenea, usata in molti linguaggi di programmazione derivante dalla nozione matematica di vettore. Più precisamente, l’array è in genere classificato come un costruttore di tipo: in altre parole, esso consente di definire nuovi tipi di dati a partire da tipi preesistenti.

Nel Fortran la dimensione di un array può essere specificata da un’istruzione di specifica del tipo :

REAL, DIMENSION(10) :: A
INTEGER,DIMENSION(0:9):: B

Qui, i due array A, B sono stati quotati con 10 scanalature di memoria. L’ indice dell’array reale A inizia da 1 mentre l’indice per l’array B parte da 0. Il valore dei diversi elementi dell’array A può essere inizializzato a 1, 2, 3…, 10 da uno dei due metodi:

A = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)

o,

A = (/ (I, I = 1, 10) /)

L’assegnazione dei valori di un array ad un altro è permessa a condizione che entrambi gli array in questione abbiano la stessa dimensione fisica. Per esempio:

B = A

assegna i valori precedentemente assegnati all’ array di A all’ array B. Gli operatori e le funzioni applicate normalmente alle espressioni semplici possono anche essere applicati agli array che hanno lo stesso numero di elementi. Per esempio,

A = A + B C = 2*C

assegna all’elemento ith di A il valore della somma degli elementi ith degli array A e B. In modo analogo all’elemento ith dell’array C è assegnato il valore uguale all’elemento ith di A moltiplicato per 2.

Il costrutto WHERE può essere usato per assegnare i valori ai diversi elementi d’un array; vediamo come:

WHERE ( la sequenza di argomento logico)
       ISTRUZIONE di assegnazioni di array !Blocco 1
ELSEWHERE
       ISTRUZIONE di assegnazioni di array !Blocco2
END WHERE

Per esempio, se ad A sono assegnati i valori

A = (/ (I, I = 1.10) /)

allora, possiamo studiare la possibilit`a di assegnare gli elementi del- l’ array B come:

WHERE (A > 5)
       B = 1
ELSEWHERE
       B = 0
END WHERE

Ciò assegna alla B i valori 0, 0, 0, 0, 0, 1, 1, 1, 1, 1. Parecchie funzioni intrinseche sono disponibili per elaborare gli array. Alcuni di queste sono:

  • DOT_PRODUCT(A, B) :restituisce il prodotto scalare di A e della B.
  • MAXVAL(A) :restituisce il valore massimo degli elementi dell’array A
  • MAXLOC(A) :restituisce la locazione di memoria del valore massimo di A
  • PRODUCT(A) :restituisce il prodotto degli elementi di A
  • SUM(A) :restituisce lasomma degli elementi di A

Un array può essere allocatable ,cioè, può essergli assegnato la locazione di memoria durante l’esecuzione. La dichiarazione di un array allocatable reale A,si effetua nel modo seguente:

REAL, DIMENSION(:), ALLOCATABLE :: A

Al tempo di esecuzione, i limiti reali per l’array A possono essere determinati dall’istruzione

ALLOCATE (A(N))

dove la N è una variabile numero intero che precedentemente è stata assegnata. Per accertarsi che abbastanza memoria sia a disposizione per assegnare lo spazio per il vostro array, usare l’opzione STAT del comando di ALLOCATE nel seguente modo:

ALLOCATE (A(N), STAT = AllocateStatus) IF (AllocateStatus /= 0)
                        ARRESTO ” * * * non abbastanza ***” memoria

Qui, AllocateStatus è una variabile del tipo numero intero. AllocateStatus prende il valore 0 se la ripartizione riesce o un certo altro valore dipendente dalla macchina se la memoria è insufficiente. Un array può essere liberato dalla memoria usando il comando DEALLOCATE

DEALLOCATE(A, Stat = DeAllocateStatus)

Di nuovo, DeAllocateStatus è una variabile del tipo numero intero il cui valore è 0 se la cancellazione dell’assegnazione riuscisse.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il ciclo Do implicito nel Fortran


FORTRANIl ciclo DO nel Fortran già visto nella lezione precedente può essere realizzato anche in una forma implicita che permette di esprimere l’operazione in un modo molto più compatto; tale costrutto risulta molto comodo nelle operazioni di ingresso/uscita, vediamo allora un esempio:

WRITE(*,10) ( lista(i), i=1,7 ) 10 FORMAT (1X,’lista=’,10F9.3 )

Questa istruzione permette di visualizzare la lista di argomenti in funzione dell’indice i. Quindi saranno visualizzati gli elementi dell’array lista nel seguente ordine:

lista(1),lista(2),lista(3),lista(4),lista(5),lista(6),lista(7)

Gli argomenti di una lista di output possono essere del tipo: costante, espressione o elemento di un array. Nell’istruzione WRITE ogni argomento della lista viene stampato una volta per ogni iterazione, ne risulta che l’operazione precedente stamperà i 10 elementi del vettore lista sulla stessa riga.

E’ logico che in una operazione del genere gli argomenti possono essere più di uno infatti la forma generale di una istruzione che contiene un ciclo implicito è la seguente:

WRITE (unita,format)(val1,val2,….,i=inizio,fine,step)
READ(unita,format)(val1,val2,….,i=inizio,fine,step)

dove val1,val2,.. rappresentano i diversi argomenti oggetto dell’istruzione.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

I cicli nel Fortran


FORTRANNel linguaggio Fortran 90 un ciclo, che esegue un blocco di istruzioni un numero determinato di volte, èdetto ciclo iterativo. I cicli DO possono avere una delle due forme:

[nome:] DO indice=inizio,fine,incremento
istruzione1
istruzione2
………
istruzionen
END DO nome

oppure:

[nome:] DO indice=inizio,fine
istruzione1
istruzione2
………
istruzionen
END DO nome

Nel secondo caso l’incremento sarà unitario. Anche in questo caso l’etichetta nome è facoltativa. Nelle strutture di programma precedenti la variabile indice è una variabile intera utilizzata come contatore del ciclo iterativo, mentre le quantità intere inizio, fine e incremento sono i parametri del ciclo; hanno il compito di controllare i valori della variabile indice durante l’esecuzione del ciclo. Il parametro incremento è facoltativo; se è omesso, viene impostato a 1.

Le istruzioni comprese fra DO e END DO formano il corpo del ciclo iterativo; vengono eseguite ad ogni ripetizione del ciclo. Il meccanismo di funzionamento di un ciclo iterativo viene spiegato per passi nel prospetto seguente:

1) Ciascuno dei tre parametri inizio, fine e incremento può essere una costante, una variabile o un’espressione. Se si tratta di variabili o espressioni, i loro valori vengono preventivamente calcolati prima dell’inizio del ciclo.

2) All’inizio dell’esecuzione del ciclo DO, il programma assegna il valore inizio alla variabile di controllo indice. Se indice * incremento <= fine * incremento, il programma esegue le istruzioni all’interno del corpo del ciclo.

3) Dopo che le istruzioni del corpo del ciclo sono state eseguite, la variabile di controllo viene aggiornata nel modo seguente:

indice = indice + incremento

Se indice * incremento risulta ancora inferiore a fine * incremento, il programma ripete le istruzioni contenute nel corpo del ciclo.

4) Il passaggio 2 viene ripetuto fino a quando indice * incremento <= fine * incremento. Nel momento in cui questa condizione non risulta più vera, il controllo passa alla prima istruzione che si trova dopo la fine del ciclo (END DO).

L’esempio che segue ci permetterà di comprendere meglio il meccanismo esaminato nei passi precedenti. Allora analizziamo l’esempio seguente:

DO i = 1, 100
istruzione 1
……
……
10
istruzione n
END DO

In questo caso, le istruzioni da 1 a n saranno eseguite 100 volte. L’indice del ciclo avrà il valore 100 durante l’ultimo passaggio del ciclo. Quando il controllo passa all’istruzione DO dopo il centesimo passaggio, l’indice del ciclo assumerà il valore 101. Poichè 101 *1 > 100 *1, il controllo sarà trasferito alla prima istruzione che segue END DO.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Espressioni logiche nel Fortran


FORTRANLe forme simboliche degli operatori relazionali consentite nel Fortran sono le seguenti:

.Lt. < .GT. > .EQ. =
.LE. <= .GE. > = .NE. / =

Il costrutto IF-ELSE può essere chiamato fissando un’etichetta all’inizio del blocco:

nome : IF ( argomento logico )THEN
    istruzione
ELSE IF ( argomento logico ) THEN
   istruzione
END IF nome

Il costrutto CASE può essere usato per eseguire un insieme dei criteri di selezione di multi-alternativa:

nome : SELECT CASE (espressione di CASE)
CASE (selettore 1) nome
istruzione 1
istruzione 2
…….
CASE (selettore 2) nome
istruzione 1
istruzione 2
…….
…..
CASE DEFAULT nome
(selettore 2) nome
istruzione 1
istruzione 2
…….
END SELECT nome

Il selettore può essere un numero intero, un carattere, o un’espressione logica. Così come i blocchi di IF_ELSE, i costrutti CASE possono anche essere etichettati con un nome. L’opzione di DEFAULT in una costruzione CASE può essere omessa, ma è preferibile inserirla per migliorare lo stile del codice.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le dichiarazioni di variabili nel Fortran


FORTRAN

Quando si invoca il comando IMPLICIT NONE, in ambiente FORTRAN, tutte le variabili di programma devono essere specificate esplicitamente. Le istruzione modificate di specifica del tipo possono essere usate per inizializzare le variabili o i parametri, ad esempio analizziamo le seguenti dichiarazioni:

Real :: Di = 0
integer :: Num\_Months = 12
Real,Parameter :: Pi = 3,1415927

La viaribile Di è dichiarata come tipo reale con valori iniziali 0., mentre Num\_Months rappresneta una variabile numero intero con il valore iniziale 12 e pi un parametro reale con il valore 3,1415927.

Il separatore :: (due punti) è richiesto in un’istruzione di specifica del tipo ogni volta che è usato per inizializzare una variabile o per dichiarare un attributo speciale (quale il PARAMETRO). Può essere omesso in altri casi.

Ad esempio, per dichiarare Area_circle come variabile reale, possiamo scrivere:

Area_circle Real

o, equivalentemente

Real :: Area\_circle

La seconda forma è consigliata in quanto presenta uno stile di programmazione uniforme. La precisione di un numero reale, di un numero intero, o complesso, o di una variabile logica può essere specificata usando un parametro del tipo KIND.

Ad esempio, per dichiarare una variabile A come un numero reale con almeno 10 cifre decimali di precisione con una gamma compresa tra -10^34 a 10^34, possiamo scrivere quanto segue:

REAL(KIND = SELECTED\_REAL\_KIND(10,34)) :: A

Se il processore che state usando non può sostenere una variabile con questa specifica di tipo, ne risulterà un errore compile-time. Per dichiarare una variabile reale equivalente a quella in doppia precisione presente nel fortran 77 ,dobbiamo scrivere semplicemente questo:

INTEGER, PARAMETER :: DP = SELECTED\_REAL\_KIND(14)
REAL(KIND = DP) :: A

Ciò dichiara la variabile A come reale e con almeno 14 cifre decimali. Il ;(punto e virgola) è usato come separatore in modo che diverse diverse istruzioni possano essere collocate sulla stessa riga. E’ però opportuno precisare che il posizionamento di più istruzioni su di una singola riga produce un codice poco leggibile, è quindi conveniente utilizzare tale applicazione solo per istruzioni semplici.

Ad esempio tre semplici istruzioni di assegnazione possono essere scritte come:

a=1;b=2;c=3

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Editing da linea di comando in Matlab

MATLAB

Le varie frecce e chiavi di controllo presenti sulla tastiera permettono di richiamare, compilare, e correggere comandi digitati in precedenza in ambiente Matlab. Per esempio, si supponga di digitare per sbaglio la seguente riga:

rho = (1 + sqt(5)) /2

In essa risulta sbagliata l’ortografia della funzione sqrt. MATLAB risponde allora con il seguente codice:

??? Undefined function or method ‘sqt’ for input arguments of type ‘double’.

Allora invece di riscrivere l’intera linea, basterà semplicemente cliccare sul tasto freccia su; in questo modo l’ultimo comando digitato comparirà sul prompt di Matlab e potremo correggerlo prima di mandarlo in esecuzione.

Per l’editing della linea di comando potremo utilizzare le frecce dx e sx per spostare il cursore sulla t ed inserire in questo modo la r mancante . L’uso ripetuto della freccia su richiama le linee digitate in precedenza, digitando un carattere e poi il tasto freccia su si cerca la linea di codice digitata precedente che inizia con quel carattere.

L’elenco dei comandi di linea disponibili è di seguito riportato:

  • freccia su oppure ctrl-p -Richiamano linea precedente
  • freccia giu oppure ctrl-n -Richiamano linea seguente
  • freccia sx oppure ctrl-b -Trasportano indietro di un carattere
  • freccia dx oppure ctrl-f -Trasportano in avanti di un carattere
  • ctrl+freccia dx oppure ctrl-r -Trasportano alla destra della parola
  • ctrl+freccia sx oppure ctrl-l -Trasportano alla sinistra della parola
  • home oppure ctrl-a -Porta all’inizio della linea
  • end oppure ctrl-e -Porta alla fine della linea
  • esc oppure ctrl-u -Ripulisce la linea
  • del oppure ctrl-d -Cancellano il carattere sul cursore
  • backspace oppure ctrl-h -Cancellano carattere dopo il cursore
  • ctrl-k -Cancella fino alla fine della linea.

Se un’espressione risulta essere troppo lunga e non rientra in una sola riga è possibile utilizzare l’operatore tre punti,…, seguito dal tasto  Return o Enter per indicare che l’espressione continua sulla prossima riga.

Ad esempio potremo scrivere:

s = 1 -1/2 + 1/3 -1/4 + 1/5 – 1/6 + 1/7…
– 1/8 + 1/9 – 1/10 + 1/11 – 1/12;

Gli spazi vuoti prima e dopo i seguenti operatori =, +, e – sono opzionali, ma migliorano la leggibilità del codice.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Eliminazione dell’output a video in Matlab

MATLAB

Se si digita semplicemente uno statement e poi si digita RETURN o Enter, MATLAB automaticamente mostre i risultati sullo schermo. Per evitare di mostrare a video ogni calcolo che Matlab effettua è possibile terminare la linea con un punto e virgola, MATLAB in tal caso effettua il calcolo ma non espone alcun output a viseo.

Questa operazione si manifesta particolarmente utile nel caso dell’utilizzo di script che presentano una grossa mole di calcoli; in tal caso la visualizzazione dei calcoli intermedi determinerebbe un inutile rallentam,ento del processore che andrebbe a discapito delle nostre operazioni.

Tale accorgimento risulta particolarmente utile quando si generano matrici di grandi dimensioni. Per esempio se volessimo generare una matrice magica 14×14 scriveremo:

>> A = magic(14)

A =

   177   186   195     1    10    19    28   128   137   146    99   108    68    77
   185   194   154     9    18    27    29   136   145   105   107   116    76    78
   193   153   155    17    26    35    37   144   104   106   115   124    84    86
     5   161   163   172    34    36    45   103   112   114   123   132    85    94
   160   162   171    33    42    44     4   111   113   122   131   140    93    53
   168   170   179    41    43     3    12   119   121   130   139   141    52    61
   169   178   187    49     2    11    20   120   129   138   147   100    60    69
    30    39    48   148   157   166   175    79    88    97    50    59   117   126
    38    47     7   156   165   174   176    87    96    56    58    67   125   127
    46     6     8   164   173   182   184    95    55    57    66    75   133   135
   152    14    16    25   181   183   192    54    63    65    74    83   134   143
    13    15    24   180   189   191   151    62    64    73    82    91   142   102
    21    23    32   188   190   150   159    70    72    81    90    92   101   110
    22    31    40   196   149   158   167    71    80    89    98    51   109   118

invece per non mostrare a video la matrice A basterà aggiungere un putno e virgola  a fine riga:

>> A = magic(14);
>>

in questo caso la matrice è stata generata ma non stampata a video. Si pensi al risparmio di memoria nel caso di una matrice 100×100 o di dimensioni ancora maggiori.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il Comando FORMAT in Matlab

MATLAB

Il comando format, in ambiente Matlab, controlla la configurazione numerica dei valori esposta a video da MATLAB. Il comando regola in via esclusiva la visualizzazione dei numeri, non come MATLAB li calcola o li salva.

Di seguito sono indicati diversi formati, insieme con l’output che ne deriva, prodotto da un vettore x con componenti di dimensioni diverse.

x = [4/3 1.2345e-6]

format short
1.3333 0.0000 1.3333 0.0000

format short e
1.3333e+000 1.2345e-006

format short g
1.3333 1.2345e-006

format long
1.33333333333333 0.00000123450000

format long e
1.333333333333333e+000 1.234500000000000e-006

format long g
1.33333333333333 1.2345e-006

format bank
1.33 0.00

format rat
4/3 1/810045

format hex 3ff5555555555555 3eb4b6231abfd271 .

Se il più grande elemento di una matrice risulta maggiore di 10^3 o più piccolo di 10^-3, MATLAB applica un fattore di scala comune per i format short e long. Inoltre, sopprime molte delle linee bianche che appaiono nell’output. Tutto questo ci consente di vedere più informazioni sullo schermo.

Se si vuole più controllo sull’output, bisogna utilizzare le funzioni sprintf e fprintf. Ad esempio:

fprintf (‘formato’, variabili)

tale comando stampa a video il valore delle variabili indicate, utilizzando il formato defi nito nella stringa ‘formato’ attraverso l’uso di indicatori che riporto di seguito. Tali codici di formati sono abitualmente seguiti da due interi separati da un punto, il primo numero indica quante colonne si desiderano impegnare in uscita ed il secondo il numero di cifre della parte frazionaria. In questo caso dovremo tulizzare i seguenti descrittori:

  • %s formato stringa
  • %d formato decimale
  • %g seleziona il formato per numeri interi, xed point o esponenziali
  • %f formato xed point del numero
  • %e formato esponenziale del numero
  • \n inserisce carattere di ritorno a capo
  • \t inserisce carattere di tabulazione

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come cancellare Righe e Colonne in Matlab

MATLAB

In Matlab per cancellare righe e colonne da una matrice basta utilizzare l’operatore parentesi quadrate vuoto. Per meglio comprendere il concetto vediamo subito un esempio: creiamo dapprima una matrice 4×4 con il comando magic:

>> X=magic(4)

X =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

Per cancellare la seconda colonna di X, utilizziamo il seguente comando:

>> X(:,2) = [ ]

X =

    16     3    13
     5    10     8
     9     6    12
     4    15     1

Come è possibile verificare abbiamo eliminato dalla matrice la seconda colonna. Se si cancella un singolo elemento da una matrice, il risultato non è più una matrice. Così:

>> X(1,2) = [ ]
??? Subscripted assignment dimension mismatch.

produce un errore.

cancellare.matlab

Comunque, un singolo pedice cancella un singolo elemento, o una sequenza di elementi, e sistema gli elementi che rimangono in un vettore riga. Ad esempio:

>> X(2:2:10) = [ ]

X =

    16     9     3     6    13    12     1

Il comando appena visto permette di cancellare gli elementi a partire dal 2° fino ala 10° con passo 2, muovendosi lungo le colonne. Gli elementi che rimangono vengono risistemati in un vettore riga.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO: