of 52 /52
Prof. Andrea Prevete UNINA2 INGEGNERIA MECCANICA/AEROSPAZIALE ELEMENTI DI PROGRAMMAZIONE a.a. 2014/15 FORTRAN Documentazione di riferimento: 1. CHAPMAN S.J. , Fortran 90/95 , McGraw-Hill 2. RAUCCI B., Il Linguaggio Fortran 90/95, web 3. ADAMS J. C., BRAINERD W. S., MARTIN J. T., SMITH B. T., WAGENER J. L., Fortran 90 Handbook, McGraw-Hill (web) 4. WAGENER J. L., Concise Fortran 90/95 Reference, Absoft corporation (web) 5. CHIVERS I. D. and SLEIGHTHOLME J., Introduction to Programming with Fortran, Springer (web) Ambienti di sviluppo: http://force.lepsch.com/p/download.html - Force 2.0.9 plus GNU Fortran (GFortran) - Force 2.0.9 plus G95 Fortran (G95)

UNINA2 INGEGNERIA MECCANICA/AEROSPAZIALE …€¦ ·  · 2017-05-24Prof. Andrea Prevete UNINA2 –INGEGNERIA MECCANICA/AEROSPAZIALE ELEMENTI DI PROGRAMMAZIONE –a.a. 2014/15 FORTRAN

  • Author
    vuminh

  • View
    215

  • Download
    3

Embed Size (px)

Text of UNINA2 INGEGNERIA MECCANICA/AEROSPAZIALE …€¦ ·  · 2017-05-24Prof. Andrea Prevete UNINA2...

  • Prof. Andrea Prevete

    UNINA2 INGEGNERIA MECCANICA/AEROSPAZIALE

    ELEMENTI DI PROGRAMMAZIONE a.a. 2014/15

    FORTRAN

    Documentazione di riferimento:

    1. CHAPMAN S.J. , Fortran 90/95 , McGraw-Hill

    2. RAUCCI B., Il Linguaggio Fortran 90/95, web

    3. ADAMS J. C., BRAINERD W. S., MARTIN J. T., SMITH B. T., WAGENER J. L., Fortran 90 Handbook, McGraw-Hill (web)

    4. WAGENER J. L., Concise Fortran 90/95 Reference, Absoft corporation (web)

    5. CHIVERS I. D. and SLEIGHTHOLME J., Introduction to Programming with Fortran, Springer (web)

    Ambienti di sviluppo:

    http://force.lepsch.com/p/download.html

    - Force 2.0.9 plus GNU Fortran (GFortran)

    - Force 2.0.9 plus G95 Fortran (G95)

  • Prof. Andrea Prevete

    ST

    RU

    TT

    UR

    A D

    EI

    PR

    OG

    RA

    MM

    I

  • Prof. Andrea Prevete

    ST

    RU

    TT

    UR

    A D

    EI

    PR

    OG

    RA

    MM

    I

  • Prof. Andrea Prevete

    STRUTTURA DEI PROGRAMMI

    Un progetto Fortran consiste in generale - di un insieme di unit di programma compilate separatamente. Una delle suddette unit nei progetti pi semplici lunica! deve essere il cosiddetto programma principale, cio una sequenza di istruzioni e linee di commento opzionali aperta e chiusa dalle keyword PROGRAM ed END PROGRAM.

    PROGRAM nome-programma

    IMPLICIT NONE

    [sezione dichiarativa]

    [sezione esecutiva]

    [eventuali sottoprogrammi interni]

    END PROGRAM nome-programma

  • Prof. Andrea Prevete

    COMMENTI

    I commenti, opzionali, sono preceduti dal segno !. Tutto il testo che segue il suddetto segno, fino alla fine della linea, non ha rilevanza ai fini dellesecuzione del programma.

    ! Programma esempio

    !

    PROGRAM Comment

    ..........

    READ(*,*) x ! Leggi il valore di x

    ..........

    x = x + 1 ! incrementa x di ununit

    ..........

    END PROGRAM Comment

  • Prof. Andrea Prevete

    ISTRUZIONI LUNGHE

    Alcune regole di base:

    1) Unistruzione per linea!

    2) Se unistruzione troppo lunga consentito andare daccapo, utilizzando il carattere &.

    PROGRAM &

    Daccapo

    ! PROGRAM Daccapo

    Perimetro = BaseMaggiore + BaseMinore + &

    Lato1 + Lato2

    ! Perimetro = BaseMaggiore + BaseMinore + Lato1 + Lato2

  • Prof. Andrea Prevete

    ALFABETO

    I caratteri riconosciuti da Fortran includono le lettere dellalfabeto, minuscole e maiuscole, le cifre numeriche ed un set di caratteri speciali:

    space

    ' "

    ( ) * + - / : =

    _ ! & $ ; < >

    % ? , .

    ATTENZIONE: Fortran CASE INSENSITIVE, cio non fa differenza fra maiuscole e minuscole in un senso che preciseremo meglio in seguito.

  • Prof. Andrea Prevete

    LITERALS

    Le costanti letterali o manifeste (o

    semplicemente literal) rappresentano valori

    fissi, numerici o alfabetici, utilizzati dal

    progettista nellambito di unistruzione.

    In Fortran possibile rappresentare

    esplicitamente numeri interi, numeri reali,

    numeri complessi, oppure valori logici,

    oppure ancora stringhe di caratteri.

  • Prof. Andrea Prevete

    INTERI

    Nelle istruzioni che seguono a destra del

    simbolo di assegnazione (=) presente un

    literal che rappresenta un intero:

    X=12345

    X=-345

    X=+789

    X=+0

  • Prof. Andrea Prevete

    REALI

    Nelle istruzioni che seguono a destra del simbolo di assegnazione (=) presente un literal che rappresenta un reale:

    X=2.45

    X=.13

    X=13.

    X=-0.12

    X=-.12

  • Prof. Andrea Prevete

    ANCORA REALI

    Un literal per un reale pu essere rappresentato in forma esponenziale utilizzando i caratteri E oppure e, come negli esempi che seguono:

    X=12.E3 !12103

    X=-12.e3 !-12103

    X=3.45E-8 !3.4510-8

    X=-3.45e-8 !-3.4510-8

  • Prof. Andrea Prevete

    ANCORA REALI

    Negli esempi precedenti i simboli e ed E potevano essere sostituiti da d e D, col significato di forzare uninterpretazione in doppia precisione del reale.

    E, infatti, importante ricordare che una costante di tipo REAL viene registrata in memoria in due parti: la mantissa e lesponente.

    Il numero di bit allocati per la mantissa determina la precisione della costante (ossia il numero di cifre significative), mentre il numero di bit allocati per lesponente determina il range della costante (ossia lintervallo dei valori che possono essere rappresentati).

  • Prof. Andrea Prevete

    COMPLESSI

    Un literal per rappresentare un numero

    complesso una coppia di parentesi che

    racchiudono due literal per reali separati

    da una virgola:

    X=(1., 0.) ! 1+0i

    X=(1.5, 2.) !1.5+2i

  • Prof. Andrea Prevete

    STRINGHE

    Una stringa di caratteri una sequenza di caratteri qualsiasi delimitata indifferentemente da singoli o doppi apici:

    X=abc

    X=John Dow

    X=#$%^

    X=()()

    La lunghezza di una stringa corrisponde al numero di caratteri in essa contenuta, compresi gli eventuali caratteri-spazio.

  • Prof. Andrea Prevete

    ANCORA SULLE STRINGHE

    Una stringa di lunghezza 0 una empty string:

    X=

    Se una stringa contiene apici singoli (doppi)

    occorre usare apici doppi (singoli) come

    delimitatori:

    X=Lavevo detto!

    X=Gli dissi: va via!

    Due apici consecutivi sono trattati come uno:

    L hai visto? ! Lhai visto?

  • Prof. Andrea Prevete

    VERO E FALSO

    Due literal speciali,

    .FALSE. e .TRUE.

    Sono utilizzati per rappresentare i valori

    logici VERO e FALSO.

    Attenzione ai punti delimitatori, sono

    richiesti!

  • Prof. Andrea Prevete

    IDENTIFICATORI

    Un IDENTIFICATORE di Fortran 90 non pu avere pi di 31 caratteri

    Il primo carattere deve essere una lettera, seguita da altre lettere, cifre, il simbolo _.

    Come gi detto Fortran 90 case insensitive, quindi Nome, NOME, nome .. sono lo stesso identificatore.

    A differenza di altri linguaggi (C, Java, etc) Fortran 90 non ha parole riservate. Comunque buona consuetudine non utilizzare keyword del linguaggio (PROGRAM, IF, WHILE, etc) come identificatori, anche per non penalizzare la leggibilit del codice.

  • Prof. Andrea Prevete

    DICHIARAZIONI

    Una dichiarazione di Fortran 90 un espressione del tipo:

    specificatore-di tipo :: lista di oggetti

    dove lo specificatore-di tipo una delle seguenti keyword:

    INTEGER, REAL, LOGICAL, COMPLEX and CHARACTER

    mentre la lista di oggetti una sequenza di identificatori (per variabili, parametri, funzioni) - separati da virgole.

    Esempio:

    INTEGER :: x, y, z

    COMPLEX :: w

  • Prof. Andrea Prevete

    DICHIARARE STRINGHE

    Una menzione a parte meritano le dichiarazioni di variabili di tipo carattere.

    CHARACTER :: c

    dichiara una variabile che pu contenere giusto un carattere.

    Se voglio dichiarare variabili di tipo stringa di caratteri devo utilizzare lo specificatore LEN, per esempio:

    CHARACTER(LEN=10) :: s

    dichiara una variabile stringa di lunghezza 10.

  • Prof. Andrea Prevete

    PARAMETER

    Una identificatore con attributo PARAMETER fa

    riferimento ad un valore fisso, definito subito nella

    dichiarazione e non pi modificabile durante il ciclo

    di vita di un programma.

    REAL, PARAMETER :: pigreco = 3.14

    Nellesempio pigreco identifica appunto un

    parametro di tipo intero, fissato gi nella

    dichiarazione al valore 3.14 e non pi modificabile.

  • Prof. Andrea Prevete

    COSTANTI STRINGHE

    Per le stringhe di caratteri luso dellattributo

    PARAMETER spesso combinato con la

    specificazione LEN=* che lascia al compilatore

    contare i caratteri della stringa fissa.

    Esempi:

    CHARACTER(LEN=3), PARAMETER :: x = non

    CHARACTER(LEN=2), PARAMETER :: y = si

    CHARACTER(LEN=*), PARAMETER :: &

    z = cosa vuoi che faccia?

  • Prof. Andrea Prevete

    VARIABILI

    Le variabili sono la classe di dati pi importante di un programma. Hanno un tipo, un nome (identificatore) ed un valore.

    Il valore tipicamente impostato nella fase iniziale di un programma gi come parte della dichiarazione o con unassegnazione esplicita, oppure immesso dallutente a tempo di esecuzione - per esempio da tastiera.

    REAL :: x=1.21

    ! dichiarata la variabile intera x ed inizializzata al ! valore 1.21

    REAL :: x

    .

    x=1.21 ! assegnazione esplicita

  • Prof. Andrea Prevete

    READ

    INTEGER :: i, j

    READ(*,*) i, j

    Le linee di programma sopra riportate dichiarano le variabili intere i e j e, quindi, consentono allutente di inizializzarle dal dispositivo standard dinput, la tastiera.

    Complementare alla precedente listruzione

    WRITE(*,*) i, j

    Il cui effetto sarebbe la riproduzione sul dispositivo standard doutput il monitor dei valori delle variabili i e j.

  • Prof. Andrea Prevete

    READ e WRITE

    Consideriamo il semplicissimo programma:

    PROGRAM esempio

    INTEGER :: i, j, k, l

    READ (*,*) i, j

    READ (*,*) k, l

    WRITE (*,*) i, j, k, l

    END PROGRAM esempio

  • Prof. Andrea Prevete

    READ e WRITE (bis)

    Supponiamo di eseguirlo e di rispondere alla richiesta di input con le linee:

    1

    2, 3, 4

    5, 6, 7, 8

    Avremmo poi il seguente output:

    1 2 5 6

    Perch?

  • Prof. Andrea Prevete

    ASSEGNARE UN VALORELa pi semplice fra le istruzioni esecutive del Fortran listruzione di assegnazione, la cui sintassi la seguente:

    variabile = espressione

    con il significato che il risultato di espressione viene immagazzinato nella locazione di memoria assegnata alla variabile.

    Lesecuzione dellistruzione produce, nellordine:

    il calcolo di espressione, il cui risultato viene valutato secondo le regole proprie del tipo dellespressione;

    la conversione di tipo, quando prevista e se il tipo di espressione non coincide con quello di variabile;

    limmagazzinamento del risultato nella locazione di memoria relativa a variabile .

  • Prof. Andrea Prevete

    ASSEGNAZIONI ED ESPRESSIONI

    Una espressione Fortran una qualunque combinazione di operandi ottenuta tramite operatori e parentesi tonde; lesecuzione delle operazioni indicate dagli operatori d luogo ad un risultato detto valore dell espressione. Si osservi che anche un singolo operando costituisce un espressione.

    Dunque listruzione di assegnazione calcola il valore dellespressione a destra del segno di uguale e assegna tale valore alla variabile specificata a sinistra del segno di uguale. Si noti che il simbolo = non indica uguaglianza secondo il significato comune del termine. Piuttosto unistruzione di assegnazione va interpretata come: registra il valore di espressione nella locazione di memoria di variabile . E solo in tal modo che assumono un senso istruzioni di aggiornamento del tipo seguente:

    INTEGER :: count=0

    count = count+1

  • Prof. Andrea Prevete

    ESPRESSIONI MATEMATICHE

    Tutti i calcoli effettuati da un programma Fortran vengono specificati attraverso istruzioni di assegnazione il cui formato generale il seguente:

    variabile = espressione_matematica

    Lesecuzione di una istruzione di questo tipo avviene calcolando prima il valore di espressione aritmetica e poi memorizzando poi tale valore nella cella identificata dal nome variabile .

    Si noti, tuttavia, che se il tipo dellespressione non coincide con quello della variabile a primo membro, allora il valore dellespressione viene convertito al modo seguente:

    Se il tipo di variabile INTEGER mentre il tipo di espressione REAL allora la parte decimale, incluso il punto, viene rimosso dando luogo ad un risultato intero.

    Se il tipo di variabile REAL mentre il tipo di espressione INTEGER allora al valore (intero) del risultato viene aggiunto il punto decimale dando cos luogo ad un valore reale.

  • Prof. Andrea Prevete

    ESPRESSIONI MATEMATICHE(bis)

    INTEGER :: totale, prezzo, numero

    numero = 5

    prezzo = 100.65

    totale = numero*prezzo

    WRITE(*,*) numero,prezzo,totale

    Le precedenti istruzioni dichiarano, dapprima, tre variabili di tipo INTEGER. Quindi, ha luogo la prima istruzione di assegnazione che salva il valore intero 5 nella variabile numero. La seconda istruzione salva il valore approssimato 100.65 nella variabile prezzo. Tuttavia, dal momento che prezzo una variabile intera, il valore reale 100.65 viene dapprima troncato allintero 100 e poi immagazzinato nella variabile. Infine, la terza assegnazione calcola il valore dellespressione 5*100 e ne salva il risultato (500) nella variabile totale. Pertanto listruzione di scrittura fornir il seguente risultato:

    5 100 500

  • Prof. Andrea Prevete

    ESPRESSIONI MISTE

    Tutte le operazioni aritmetiche viste finora erano applicate ad operandi dello stesso tipo ed il tipo del risultato coincideva con quello degli operandi. E tuttavia possibile utilizzare in una stessa espressione operandi di tipo diverso dando luogo a quelle che vengono dette operazioni miste. Le espressioni che contengono una o pi operazioni miste si chiamano espressioni miste.

    Per quanto concerne il tipo del risultato, vale la regola generale secondo cui se il tipo di due operandi non lo stesso, quello pi debole viene automaticamente modificato in quello pi forte mediante una operazione, detta di conversione, che permette il passaggio da una rappresentazione interna ad unaltra. Questo processo di conversione subordinato alla seguente gerarchia fra i tipi degli operandi:

    COMPLEX pi forte

    REAL #

    INTEGER pi debole

    Unoperazione che coinvolga sia operandi interi che reali un esempio di operazione mista. Quando un compilatore incontra una operazione del genere, converte il valore delloperando intero in valore reale sicch loperazione viene svolta con operandi reali. A titolo di esempio si possono considerare le seguenti espressioni:

    3/2 espressione intera risultato: 1 (intero)

    3./2. espressione reale risultato: 1.5 (reale)

    3./2 espressione mista risultato: 1.5 (reale)

  • Prof. Andrea Prevete

    ESPRESSIONI MISTE

    Tuttavia, la conversione automatica viene effettuata soltanto se loperando intero e quello reale compaiono nella stessa operazione. Di conseguenza, una parte dellespressione potrebbe essere valutata come una espressione intera e una parte come espressione reale. Ad esempio, la seguente espressione:

    1/2 + 1./4.

    fornisce il valore 0.25 (che coincide con il valore del secondo argomento della somma) in quanto la prima operazione, avvenendo fra operandi interi, restituisce un valore intero, nella fattispecie il valore 0. Se, invece, la prima operazione fosse stata di natura mista, come ad esempio:

    1./2 + 1./4.

    avrebbe avuto luogo una conversione automatica tale che il valore (reale) della prima operazione sarebbe stato 0.5 e, dunque, il valore dellintera espressione sarebbe stato 0.75, ben diverso da quello fornito dallespressione precedente.

  • Prof. Andrea Prevete

    PRIORITA OPERATORI

  • Prof. Andrea Prevete

    FUNZIONI INTRINSECHE IMPORTANTI

  • Prof. Andrea Prevete

    FUNZIONI DI CONVERSIONE

  • Prof. Andrea Prevete

    ALTRE FUNZIONI NOTEVOLI

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    ICHAR(C)

    Restituisce la posizione occupata dalla variabile C, di tipo CHARACTER, nel sistema di codifica utilizzato dallelaboratore, associato al parametro di kind dellargomento. Il risultato, che di

    tipo INTEGER, un valore compreso tra 0 ed n-1, essendo n il numero di caratteri del sistema di codifica adottata dal processore.

    CHAR(I[,KIND])

    Restituisce il carattere che occupa la posizione I nella sequenza di collating del processore, associato al parametro di kind KIND opzionalmente specificato. Gli argomenti I e KIND devono entrambi di tipo intero. In particolare il valore di I deve essere compreso tra 0 ed n-1, essendo n il numero di caratteri del sistema di codifica adottato dal processore. La funzione CHAR linversa di ICHAR.

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    IACHAR(C)

    Restituisce la posizione occupata dalla variabile C, di tipo CHARACTER, nel sistema di codifica ASCII. Il risultato, che di tipo INTEGER, un valore compreso tra 0 ed n-1, essendo n il numero di caratteri del sistema di codifica adottata dal processore. Ad esempio, se i una variabile di tipo INTEGER, listruzione:

    i = IACHAR(W) ! restituisce il valore 87.

    ACHAR(I)

    Restituisce il carattere corrispondente alla posizione I nella tabella ASCII. Se I compreso tra 0 e 127, il risultato fornito effettivamente lI_mo carattere della tabella; se, invece, I maggiore di 127, il risultato sar dipendente dal processore.

    Ad esempio, se a una variabile di tipo CHARACTER, listruzione:

    a = ACHAR(87) ! restituisce il valore W.

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    ADJUSTL(STRING)

    Restituisce la stringa STRING giustificata a sinistra. In altre parole rimuove i bianchi di testa e li sposta in coda.

    Esempio:

    CHARACTER(LEN=16) :: str

    str = ADJUSTL( Fortran 90 ) ! restituisce: Fortran 90

    ADJUSTR(STRING)

    Restituisce la stringa STRING giustificata a destra. In altre parole rimuove i bianchi di coda e li sposta in testa.

    Esempio:

    CHARACTER(LEN=16) :: str

    str = ADJUSTR( Fortran 90 ) ! restituisce: Fortran 90

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    INDEX(STRING,SET[,BACK])

    Se la variabile logica BACK assente o vale .FALSE. restituisce la posizione di partenza di SET nella stringa STRING. Se la variabile logica BACK vale .TRUE. allora la funzione restituisce la posizione di partenza dellultima occorrenza. Il valore ritornato zero nel caso in cui SET non sia presente in STRING.

    Esempio:

    INTEGER :: i

    ...

    i = INDEX(particolari,ar,BACK=.TRUE.) ! ris: i = 9

    i = INDEX(particolari,ar) ! ris: i = 2

    i = INDEX(particolari,or) ! ris: i = 0

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    LEN(STRING)

    Restituisce la lunghezza della stringa STRING omprensiva degli eventuali spazi bianchi di coda.

    Esempio:

    CHARACTER(LEN=11) str

    INTEGER :: i

    ...

    i = LEN (str) ! restituisce 11

    i = LEN(Una frase con 6 spazi bianchi ) ! restituisce 30

    LEN_TRIM(STRING)

    Restituisce la lunghezza della stringa STRING depurata degli eventuali spazi bianchi di coda. Se STRING completamente bianca, il valore restituito zero.

    Esempio:

    CHARACTER(LEN=11) str

    INTEGER :: i

    ...

    i = LEN ( ) ! restituisce 0

    i = LEN(Una frase con 6 spazi bianchi ) ! restituisce 24

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    LGE(STRING_A,STRING_B)

    Restituisce il valore .TRUE. se STRING_A >= STRING_B secondo la sequenza di collating ASCII.

    Gli argomenti STRING_A e STRING_B devono essere stringhe di caratteri con kind di default.

    Esempio:

    LOGICAL :: l

    ...

    l = LGE(abc,abd) ! ris: .FALSE.

    l = LGE (ab,aaaaaaab) ! ris: .TRUE.

    LGT(STRING_A,STRING_B)

    Restituisce il valore .TRUE. se STRING_A > STRING_B secondo la sequenza di collating ASCII.

    Gli argomenti STRING_A e STRING_B devono essere stringhe di caratteri con kind di default.

    Esempio:

    LOGICAL :: l

    ...

    l = LGT(abc,abc) ! ris: .FALSE.

    l = LGT(abc,aabc) ! ris: .TRUE.

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    LLE(STRING_A,STRING_B)

    Restituisce il valore .TRUE. se STRING_A

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    REPEAT(STRING,NCOPIES)

    Restituisce una stringa formata concatenando NCOPIES copie di STRING una dietro laltra. Se STRING completamente bianca e NCOPIES vale zero, la stringa restituita avr lunghezza nulla.

    Esempio:

    CHARACTER(LEN=6) :: str

    str = REPEAT(ho,3) ! restituisce la stringa hohoho

    SCAN(STRING,SET[,BACK])

    Restituisce la prima ricorrenza di un carattere di SCAN in STRING operando una scansione da sinistra. Se il parametro opzionale BACK presente e vale .TRUE. la scansione avviene da destra ma il conteggio avviene ancora da sinistra. Se BACK vale .TRUE. la scansione viene effettuata da destra e la funzione restituisce la posizione dellultima ricorrenza di un carattere di SCAN in STRING. Se nessun carattere di SET si trova anche in STRING, oppure se la lunghezza di SET o di STRING nulla, la funzione restituisce il valore zero. Gli argomenti SET e STRING sono stringhe di caratteri mentre largomento opzionale BACK deve essere di tipo LOGICAL.

    Esempio:

    INTEGER :: i

    ...

    i = SCAN (Fortran,tr) ! ris: i = 3

    i = SCAN (Fortran,tr, BACK=.TRUE.) ! ris: i = 5

    i = SCAN (Fortran,for) ! ris: i = 0

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    TRIM(STRING)

    Restituisce la stringa STRING depurata dagli eventuali spazi bianchi di coda. Se STRING completamente bianca, il valore restituito una stringa nulla.

    Esempio:

    ! Questa istruzione stampa il valore 31

    WRITE(*,*) LEN( Stringa con caratteri bianchi )

    ! Questa istruzione stampa il valore 26

    WRITE(*,*) LEN(TRIM( Stringa con caratteri bianchi ))

  • Prof. Andrea Prevete

    FUNZIONI PER IL TIPO CHARACTER

    VERIFY(STRING,SET[,BACK])

    Restituisce la posizione della prima ricorrenza di un carattere di STRING che non presente in SET operando la scansione da sinistra. Se la variabile opzionale BACK presente con valore .TRUE. allora la funzione restituisce la posizione dellultima ricorrenza di un carattere di STRING che non presente in SET. Il risultato della funzione zero se tutti i caratteri di STRING sono presenti in SET.

    Se tutti i caratteri di STRING sono presenti anche in SET oppure se entrambe le stringhe hanno lunghezza nulla, la funzione restituisce il valore zero.

    Esempio:

    INTEGER(4) position

    ...

    position = VERIFY (particolari,prtl) ! ris: position = 2

    position = VERIFY (particolari,prtli, BACK=.TRUE.) ! ris: position = 9

    position = VERIFY (rosso,rso) ! ris: position = 0

  • Prof. Andrea Prevete

    SPECIFICATORI DI RANGE

    Una specifica di sottostringa seleziona una porzione di una variabile di caratteri e tratta questa variabile come se fosse una variabile stringa indipendente. La porzione di stringa selezionata chiamata sottostringa.

    Una sottostringa viene selezionata (estratta) appendendo al nome della variabile stringa uno specificatore di range. Questultimo ha la forma:

    (inizio : fine )

    Ad esempio, data la stringa cos dichiarata:

    CHARACTER(LEN=8) :: stringa="abcdefgh"

    possibili esempi di sottostringa sono:

    stringa(2:4) ! "bcd"

    stringa(3:7) ! "cdefg"

  • Prof. Andrea Prevete

    CONCATENAZIONE DI STRINGHE

    Loperatore di concatenazione di stringhe combina

    due o pi stringhe (o sottostringhe) a formare

    ununica stringa pi grande. Esso rappresentato

    dal simbolo di un doppio slash (//). La forma

    generale di questo operatore la seguente:

    stringa_1 //stringa_2 [// stringa_3 ...]

    in cui, se le stringhe stringa_1 e stringa_2 hanno

    lunghezza n_1 ed n_2 , rispettivamente, la

    lunghezza della stringa finale sar n_1+n_2 .

  • Prof. Andrea Prevete

    CONCATENAZIONE DI STRINGHE

    Loperatore di concatenazione di stringhe combina

    due o pi stringhe (o sottostringhe) a formare

    ununica stringa pi grande. Esso rappresentato

    dal simbolo di un doppio slash (//). La forma

    generale di questo operatore la seguente:

    stringa_1 //stringa_2 [// stringa_3 ...]

    in cui, se le stringhe stringa_1 e stringa_2 hanno

    lunghezza n_1 ed n_2 , rispettivamente, la

    lunghezza della stringa finale sar n_1+n_2 .

  • Prof. Andrea Prevete

    RELAZIONE DORDINE FRA STRINGHE

    Il processo mediante cui due operandi stringa vengono confrontati si articola nei seguenti passi:

    - Se i due operandi non hanno la stessa lunghezza, al pi corto dei due vengono idealmente aggiunti spazi bianchi in modo da rendere le stringhe di uguale lunghezza.

    - I due operandi vengono confrontati carattere per carattere a partire dal primo (ossia da quello pi a sinistra) fino a quando non vengono riscontrati due caratteri differenti oppure fino al raggiungimento della fine delle stringhe.

    - Se vengono trovati due caratteri corrispondenti differenti, allora la relazione tra questi due caratteri che determina la relazione tra i due operandi. In particolare viene considerato minore il carattere che viene prima nella sequenza di collating del processore. Se non viene riscontrata alcuna differenza le due stringhe vengono considerate uguali.

  • Prof. Andrea Prevete

    RELAZIONE DORDINE FRA STRINGHE

    ESEMPI:

    "Adamo" > "Eva falsa in quanto in qualunque sequenza di collating la lettera A precede sempre la E, ossia A minore di E. Allo stesso modo, la relazione:

    "Eva" < "Evaristo vera poich la stringa Eva viene prolungata con cinque caratteri vuoti e la relazione fra le due stringhe si riduce alla relazione:

    " " < "r

    e il carattere nullo precede tutti i caratteri alfanumerici.

    Si noti, tuttavia, che le relazioni:

    "ADAMO" < "Adamo"

    "X4" < "XA"

    "var_1" < "var-1

    non sono definite in Fortran ed il valore di ciascuna di esse dipende dalla particolare sequenza di collating implementata dal processore in uso.

  • Prof. Andrea Prevete

    RELAZIONE DORDINE FRA STRINGHE

    Se, per ragioni di portabilit, fosse richiesta la definizione di un ordine per tutti i caratteri allora necessario fare uso di un altro metodo di confronto. Questo nuovo metodo si basa sullutilizzo di quattro funzioni intrinseche lessicali : LGT, LGE, LLE, LLT, la cui sintassi :

    LGT(STRING_A,STRING_B)

    LGE(STRING_A,STRING_B)

    LLE(STRING_A,STRING_B)

    LLT(STRING_A,STRING_B)

    ed il cui significato , rispettivamente:

    STRING_A > STRING_B

    STRING_A >= STRING_B

    STRING_A

  • Prof. Andrea Prevete

    THE END