%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%      
%  NOME FUNCTION... StampaSettori
%  VERSIONE........ 0.15
%  DATA............ novembre 2016
%
%  INFO
%  Stampa 'outdevice' un array in un formato leggibile
%
%
%
%
%
% voglio stampare i dati sullo schermo divisi in $(num_settori) numero_di_colonne alla volta
% quindi si deve andare a capo e via via stampare tutte le colonne
%
%
%
% Ad esempio se ho un array di 7 elementi e ogni elemento ha 4 parametri
% x,y,z,k cioe un array di 5 righe e 7 colonne:
%
% X1 X2 X3 X4 X5 X6 X7 
% x  x  x  x  x  x  x 
% y  y  y  y  y  y  y 
% z  z  z  z  z  z  z 
% k  k  k  k  k  k  k 
%
% (per esempio Xn sono resistori e x,y,z,k e il valore della tensione
% ai loro capi agli istanti tx, ty, tz, tk)
%
% e voglio stamparlo sullo schermo con 3 settori per riga: 
% imposto num_settori = 3, parametri=4.
% Ottengo: 
%
%         	X1		  X2		  X3
%         PARAM1	PARAM1		PARAM1  
%         PARAM2	PARAM2		PARAM2  
%         PARAM3	PARAM3		PARAM3 
%         PARAM4	PARAM4		PARAM4   
%
%
%           X4		  X5		  X6
%         PARAM1	PARAM1		PARAM1  
%         PARAM2	PARAM2		PARAM2  
%         PARAM3	PARAM3		PARAM3  
%         PARAM4	PARAM4		PARAM4   
%
%
%           X7		
%         PARAM1	
%         PARAM2	
%         PARAM3	
%         PARAM4	 
%
%
%
% le linee (colonne di dati da visualizzare su una riga) 
% vengono calcolate come frazione intera di quelle necessarie
% es 90 colonne e 7 settori 90/7 = 12.85 -> 12 linee
% le rimanenti 90-(12*7)= 6 settori (che infatti non riempiono
% una riga di 7 settori -6 è l' 85% di 7- )
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  USO
%  ---
%  
%
% Richiamare la funzione
% ----------------------
%    StampaSettori (disp_array, par_name, outdevice, num_settori)
%
%
% VARIABILI PASSATE COME PARAMETRO
% --------------------------------
% disp_array  : array contenete in ogni riga i valori dei parametri
%               es a1 a2 a3 a4 a5 <-- valori del parametro a
%               b1 b2 b3 b4 b5 <-- valori del parametro b 
%
% par_name    : array contenete i nomi dei parametri = num righe di disp_array
%               es: min, max
%
% outdevice   : inserire "terminale" per stampare a terminale, "nomefile" per scrivere sul file nomefile
%
% num_settori : numero di settori da tabulare per ogni riga
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



function StampaSettori (disp_array, nameparam, outdevice, num_settori)


% conta le righe dell array  disp_array...
% si deve togliere 1 perchè la prima riga e' il NOME del
% parametro e non un parametro (ad es: max, min, media...)
parametri=rows(disp_array)-1;

righe = rows (disp_array);
colonne = columns (disp_array);






if (nargin != 4)
 
 usage ("stampa_settori (disp_array, nameparam, outdevice, num_settori)");
endif


if (rows (nameparam) != rows (disp_array))

  rows (nameparam)
  rows (disp_array)
  error ("Il numero di elementi di nameparam deve essere uguale al numero di righe di displ_array !");
endif



if  (strcmp (outdevice, "terminale"))
 
     fid=stdout; 
else

    fid = fopen (outdevice, "w");

endif



       fprintf (fid, "\n")
       fprintf (fid, "\n")
       fprintf (fid, "\n")
       fprintf (fid, "   *******************************************************************************")
       fprintf (fid, "\n")


      if  (strcmp (outdevice, "terminale"))
 
          fprintf (fid, "    Stampa a video \n" )  
       else
     
          fprintf (fid, "    File : %s \n", outdevice )
      endif  

       fprintf (fid, "    Data : %s\n", ctime(time))
       fprintf (fid, "    Numero elementi : %g\n", colonne)
       %fprintf (fid, "    Numero campi per ciascun elemento : %g\n", righe)
       fprintf (fid, "    Numero colonne : %g\n", num_settori)

       fprintf (fid, "\n")
       fprintf (fid, "   *******************************************************************************\n")
       fprintf (fid, "\n\n")




linee = floor (colonne / num_settori);

n=0;




%
% stampo a schermo le linee composte da settori 
% completi (uguali al numero di settori voluto)
%
for ind1 = 1:linee  % fisso le linee (numero di righe di elementi)


   for ind2=1:parametri+1  % fisso le righe (1 riga per ogni parametro)


     for ind3=1:num_settori % fisso le colonne (1 colonna per ogni settore)
 
        if  (strcmp (class (disp_array{ind2, (ind3+n)}), "char"))  % se l' elemento da stampare è un testo... es: Time, V(R3:1),etc

               fprintf (fid, "%18s\t",  disp_array{ind2, (ind3+n)} )            
 
        else  % se invece è un numero...  
 
           fprintf (fid, "\t %s %e", nameparam{ind2 ,1}, disp_array{ind2, (ind3+n)} )           


       endif


      endfor


          fprintf (fid, "\n")


  endfor

       fprintf (fid, "\n\n")


      n+=(num_settori);
      



endfor







%
% si stampano ora le linee rimanenti
% (ES: se il file contiene 99 colonne,
% se voglio 5 settori (numero di elementi per riga) devo stampare 99/5=19 linee da 5 elementi ciascuna 
% ma mi rimangono ancora 99 - (19*5) = 4 elementi da stampare...)
%



if   ge(( (colonne) - (linee*num_settori) ) ,0)

NEW_num_settori=( (colonne) - (linee*num_settori) );


   for ind2=1:parametri+1  % fisso le righe (1 riga per ogni parametro)


     for ind3=1:NEW_num_settori % fisso le colonne (1 colonna per ogni settore)
 
        if  (strcmp (class (disp_array{ind2, (ind3+n)}), "char"))  % se l' elemento da stampare è un testo... es: Time, V(R3:1),etc

               fprintf (fid, "%18s\t",  disp_array{ind2, (ind3+n)} )            
 
        else  % se invece è un numero...  
 
           fprintf (fid, "\t %s %e", nameparam{ind2 ,1}, disp_array{ind2, (ind3+n)} )           

       endif


      endfor


          fprintf (fid, "\n")

  endfor



endif










% se outdevice è un file, va chiuso...se è stdout non fare nulla
if  !(strcmp (outdevice, "terminale"))

   fclose (fid);

endif




endfunction



