Estesa la parte sul fortran 95 con qualche sempio di I/O

Leonardo Robol [2009-10-21 18:31]
Estesa la parte sul fortran 95 con qualche sempio di I/O
Filename
AppFortran.tex
CalcoloScientifico.tex
diff --git a/AppFortran.tex b/AppFortran.tex
index b7222ab..d10872b 100644
--- a/AppFortran.tex
+++ b/AppFortran.tex
@@ -70,6 +70,23 @@ Si possono aggiungere delle parole chiave alle dichiarazioni di tipi, più preci
 \begin{itemize}
  \item \lstinline-PARAMETER-: questa indica che la variabile non verrà modificata, è semplicemente
  un parametro per il programma.
+ \item \lstinline-ALLOCATABLE-: Questo parola chiave indica che la memoria per la variabile verrà
+ allocata esplicitamente in un secondo momento, è particolarmente utile con l'altra parola chiave
+ \item \lstinline-DIMENSION-: questa permette di speicificare che la variabile dichiarate è un array
+ e la sua relativa dimensione (Esempio: \lstinline- INTEGER, DIMENSION(5) :: vec-); è possibile specificare
+ \lstinline-:- come dimensione, nel qual caso il compilatore assumerà che la dimensione verrà determinata
+ in un secondo momento. Un caso tipico è la creazione di un vettore la cui dimensione verrà determinata
+ a run-time\footnote{ovvero durante l'esecuzione.}; questo si può realizzare con un codice di questo tipo
+ \begin{lstlisting}[frame=tb]
+  PROGRAM allocatore
+   INTEGER , ALLOCATABLE :: i
+   INTEGER :: size
+   ! Leggo da tastiera la dimensione dell'array e lo alloco
+   READ(*,*) size
+   ALLOCATE(i(size))
+  END PROGRAM
+ \end{lstlisting}
+
 \end{itemize}
 I tipi principali presenti in Fortran sono
 \begin{itemize}
@@ -82,6 +99,61 @@ I tipi principali presenti in Fortran sono
    INTEGER, PARAMETER :: db = KIND(0.D0)
    REAL(dp) :: real_var
   \end{lstlisting}
-
+ che si occuperà di assegnare al tipo \lstinline-REAL- dichiarato la stessa dimensione delle costante di tipo
+ \texttt{double} \lstinline-0.D0-.
+\end{itemize}
+
+\subsection{Input e Output}
+Per iniziare ci basterà conoscere le istruzioni di stampa su schermo e lettura da tastiera, che sono rispettivamente
+\begin{itemize}
+ \item \lstinline-WRITE(*,*) dato_1, dato_2 , ...- che si occuperà di scrivere sullo schermo (identificato dal primo
+ \lstinline-*-) e con una formattazione standard (identificata dal secondo \lstinline-*-) i dati che gli inseriamo dopo;
+ \item \lstinline-READ(*,*) var_1, var_2, ...- che si occuperà di leggere da tastiera (il primo \lstinline-*-) i dati
+ in un formato standard (il secondo \lstinline-*-);
 \end{itemize}
-
\ No newline at end of file
+In realtà queste istruzioni ci permettono di controllare anche formattazioni e sorgenti e destinazioni di Input e Output.
+Per scrivere (o leggere) su un file è prima necessario \textbf{aprirlo}. Per fare questo bisogna eseguire una
+chiamata alla funzione \lstinline-OPEN()-. Questa si occuperà di aprire un file da noi indicata ed assegnarlo ad
+un numero intero, anche quello indicato da noi. Bisogna fare attenzione in quest'ultimo passaggio a ricordare
+che \lstinline-5- e \lstinline-6- sono già riservati alla tastiera ed allo schermo.
+Potremmo poi fare riferimento (sia in lettura che in scrittura)
+a quel determinato file sostituendo quell'intero a \lstinline-*-. Questo codice probabilmente chiarirà meglio la questione.
+\begin{lstlisting}[frame=tb]
+ PROGRAM CopiaIncolla
+  IMPLICIT NONE
+
+  ! Dichiaro delle variabili intere di tipo PARAMETER
+  ! per contenere gli interi con cui poi mi riferiro' ai file.
+  ! Sarebbe infatti complicato dover ricordare tanti numeri
+  ! a memoria e renderebbe il codice meno leggibile
+  INTEGER, PARAMETER :: infile = 11, outfile = 12
+  INTEGER :: j
+  INTEGER :: buf
+
+  ! Cerco di aprire il file in.txt
+  OPEN(FILE='in.txt', UNIT=infile)
+
+  ! E anche il file out.txt
+  OPEN(FILE='out.txt', UNIT=outfile)
+
+  ! Leggo le prime 10 righe da questo file
+  ! e le scrivo su out.txt, raddoppiate (assumendo
+  ! che siano interi)
+  DO j=1,10
+    READ(infile,*)     buf
+    WRITE(outfile,*)   buf * 2
+  END DO
+
+  ! Alla chiusura del programma anche tutti i file vengono chiusi,
+  ! e quindi questo rende le prossime righe superflue. Pero' e' buona
+  ! norma ricordarsi di chiudere i file che si sono aperti, e quindi
+  ! lo facciamo
+  CLOSE(infile)
+  CLOSE(outfile)
+
+ END PROGRAM
+\end{lstlisting}
+Abbiamo qui introdotto anche la chiamata \lstinline-CLOSE()- che serve appunto per
+chiudere un file. \`E normalmente buona norma chiudere tutti i file che si aprono e quindi,
+in programma corposi, conviene sempre scrivere la chiamata ad \lstinline-OPEN()- insieme
+alla chiamata \lstinline-CLOSE()- per evitare di dimenticarla.
\ No newline at end of file
diff --git a/CalcoloScientifico.tex b/CalcoloScientifico.tex
index 28cc913..c929e02 100644
--- a/CalcoloScientifico.tex
+++ b/CalcoloScientifico.tex
@@ -131,7 +131,7 @@
 \lstset{backgroundcolor=\color{listinggray}}
 \lstset{frameround=trbl}
 \lstset{% general command to set parameter(s)
-    basicstyle=\small\ttfamily,          % print whole listing small
+    basicstyle=\footnotesize\ttfamily,          % print whole listing small
     keywordstyle=\color{black}\bfseries\underbar,
                                 % underlined bold black keywords
     identifierstyle=,           % nothing happens
ViewGit