Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - bartok

Pages: [1] 2
1
Programs / Subroutines to draw axes automatically scaled.
« on: October 27, 2021, 08:22:18 am »
As extract from the program that I posted, I post here a sequence of subroutine that I think it can be usefull in order to draw axes.

N1!, N2!: they are examples of maximum values in abscissa and ordinate.
N3!, N4!: example of pair of values to put in the graph.

The program has these features:
- the origin of the axes is 40 pixels in X and Y direction from the lower left corner, these distances are named dx! and dy!.
- the axes are drawn in this way, speaking for example about Y axe: it starts at dy! distance from the loer border, it goes at dy! distance beyond N2! and it is spaced by dy! from the upper border. to do it the process is iterative.

Generally, the subroutine ScalaOrigine is CALLed by DisegnaAssi, but in more rare cases ScalaOrigine may be CALLed alone and
scala~% = 0 AND origine~% = 1.
It may happen when we have to work on images already created and scaled and it is necessary only to restore the origin of the axes.

Code: QB64: [Select]
  1.  
  2. CONST R& = _RGB32(255, 0, 0)
  3. CONST G& = _RGB32(0, 255, 0)
  4. CONST B& = _RGB32(0, 0, 255)
  5. CONST W& = _RGB32(255, 255, 255)
  6. CONST YE& = _RGB32(255, 255, 0)
  7.  
  8. DIM schermo&
  9. DIM N1!, N2!, N3!, N4!
  10.  
  11. schermo& = _NEWIMAGE(800, 600, 32)
  12. SCREEN schermo&
  13.  
  14. N1! = 113.4
  15. N2! = 34.44
  16. N3! = 43
  17. N4! = 22.2
  18.  
  19. CALL DisegnaAssi("X", "Y", N1!, N2!, schermo&, YE&, W&, B&, G&)
  20. CALL DisegnaValore(N1!, N2!, R&, YE&, G&)
  21. CALL DisegnaValore(N3!, N4!, R&, YE&, G&)
  22.  
  23. '--------------------------------------------------------------------------------------------------------------------------------------------------
  24. SUB ScalaOrigine (scala~%, origine~%, X!, Y!, immagine&)
  25.  
  26.     SHARED dx%, dy%
  27.     SHARED dx!, dy!
  28.  
  29.     DIM fattoreX!, fattoreY!
  30.  
  31.     fattoreX! = 1
  32.     fattoreY! = 1
  33.     IF scala~% = 0 AND origine~% = 1 THEN GOSUB origine
  34.     IF scala~% = 1 AND origine~% = 1 THEN
  35.         DO
  36.             GOSUB scala
  37.             GOSUB origine
  38.             IF Y! * fattoreY! >= dy! + Y! + dy! + dy! THEN
  39.                 IF X! * fattoreX! >= dx! + X! + dx! + dx! THEN
  40.                     EXIT DO
  41.                 ELSE
  42.                     fattoreX! = fattoreX! + 0.01
  43.                 END IF
  44.             ELSE
  45.                 fattoreY! = fattoreY! + 0.01
  46.             END IF
  47.         LOOP
  48.     END IF
  49.     EXIT SUB
  50.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  51.     scala:
  52.  
  53.     WINDOW
  54.     WINDOW (0, 0)-(X! * fattoreX!, Y! * fattoreY!)
  55.     RETURN
  56.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  57.     origine:
  58.  
  59.     dx% = 39
  60.     dx! = PMAP(dx%, 2)
  61.     dy% = _HEIGHT(immagine&) - 1 - dx%
  62.     dy! = PMAP(dy%, 3)
  63.     RETURN
  64. '--------------------------------------------------------------------------------------------------------------------------------------------------
  65. '--------------------------------------------------------------------------------------------------------------------------------------------------
  66. SUB DisegnaAssi (X$, Y$, X!, Y!, immagine&, ColoreCartiglio&, ColoreAssi&, ColoreTacca&, ColoreNumeri&)
  67.  
  68.     SHARED dx%, dy%
  69.     SHARED dx!, dy!
  70.  
  71.     DIM x%, y%
  72.     DIM taccaX!, taccaY!
  73.  
  74.     _DEST immagine&: CLS
  75.     SELECT CASE X!
  76.         CASE IS >= 12
  77.             taccaX! = X! \ 6
  78.         CASE IS <= 1
  79.             taccaX! = 0.25
  80.         CASE ELSE
  81.             taccaX! = 0.5
  82.     END SELECT
  83.     SELECT CASE Y!
  84.         CASE IS >= 12
  85.             taccaY! = Y! \ 6
  86.         CASE IS <= 1
  87.             taccaY! = 0.25
  88.         CASE ELSE
  89.             taccaY! = 0.5
  90.     END SELECT
  91.     WINDOW
  92.     LINE (0, 0)-(_WIDTH(immagine&) - 1, _HEIGHT(immagine&) - 1), ColoreCartiglio&, B
  93.     CALL ScalaOrigine(1, 1, X!, Y!, immagine&)
  94.     LINE (dx!, dy! + Y! + dy!)-(dx!, dy!), ColoreAssi&: LINE -(dx! + X! + dx!, dy!), ColoreAssi&
  95.     PSET (dx!, dy! + Y! + dy!), ColoreAssi&: DRAW "F20": PSET (dx!, dy! + Y! + dy!), ColoreAssi&: DRAW "G20"
  96.     PSET (dx! + X! + dx!, dy!), ColoreAssi&: DRAW "G20": PSET (dx! + X! + dx!, dy!), ColoreAssi&: DRAW "H20"
  97.     COLOR ColoreNumeri&
  98.     _PRINTSTRING (PMAP(dx! + X! + dx!, 0), dy%), X$
  99.     _PRINTSTRING (dx%, PMAP(dy! + Y! + dy!, 1) - dx% \ 2), Y$
  100.     _PRINTSTRING (dx% \ 4, dy% - 7), "0"
  101.     i% = 1
  102.     WHILE i% * taccaX! <= X!
  103.         LINE (dx! + i% * taccaX!, PMAP(dy% + 5, 3))-(dx! + i% * taccaX!, PMAP(dy% - 5, 3)), ColoreTacca&
  104.         x% = PMAP(dx! + i% * taccaX!, 0)
  105.         _PRINTSTRING (x% - 3 * LEN(_TRIM$(STR$(i% * taccaX!))), _HEIGHT(immagine&) - 1 - dx% + 5), _TRIM$(STR$(i% * taccaX!))
  106.         i% = i% + 1
  107.     WEND
  108.     i% = 1
  109.     WHILE i% * taccaY! <= Y!
  110.         LINE (PMAP(dx% - 5, 2), dy! + i% * taccaY!)-(PMAP(dx% + 5, 2), dy! + i% * taccaY!), ColoreTacca&
  111.         y% = PMAP(dy! + i% * taccaY!, 1)
  112.         _PRINTSTRING (dx% \ 4, y% - 7), _TRIM$(STR$(i% * taccaY!))
  113.         i% = i% + 1
  114.     WEND
  115. '--------------------------------------------------------------------------------------------------------------------------------------------------
  116. '--------------------------------------------------------------------------------------------------------------------------------------------------
  117. SUB DisegnaValore (X!, Y!, ColoreLinea&, ColorePunto&, ColoreTesto&)
  118.  
  119.     SHARED dx%, dy%
  120.     SHARED dx!, dy!
  121.  
  122.     DIM x%, y%
  123.  
  124.     CIRCLE (dx! + X!, dy! + Y!), PMAP(3, 2), ColorePunto&
  125.     PAINT (dx! + X! + PMAP(0.5, 2), dy! + Y! + PMAP(0.5, 2)), ColorePunto&
  126.     LINE (dx!, dy! + Y!)-(dx! + X!, dy! + Y!), ColoreLinea&, , 65520
  127.     LINE -(dx! + X!, dy!), ColoreLinea&, , 65520
  128.     x% = PMAP(dx! + X!, 0)
  129.     y% = PMAP(dy! + Y!, 1)
  130.     COLOR ColoreTesto&
  131.     _PRINTSTRING (x% + 4, y% - 16), "(" + _TRIM$(STR$(Arrotonda!(X!))) + ";" + _TRIM$(STR$(Arrotonda!(Y!))) + ")"
  132. '--------------------------------------------------------------------------------------------------------------------------------------------------
  133. '--------------------------------------------------------------------------------------------------------------------------------------------------
  134. FUNCTION Arrotonda! (num!)
  135.  
  136.     Arrotonda! = _ROUND(num! * 100) / 100
  137.  

2
I have finally finished my program.
thank you very much for the answers to my questions!

"Unfortunately" the program is in Italian. The inputs are about the data of the precipitation properties of the area, and the phisical characteristics of the drainage basin.

The program, among other things, calculates the maximum water flow for a given return period.

If you press "123" and then ENTER on the first input, it loads an example.

At the end, press [1] to save data.

Tell me for any suggestion please.

Code: QB64: [Select]
  1. '**************************************************************************************************************************************************
  2. '*                                     Calcolo dell'idrogramma di piena di progetto tramite il metodo SCS-CN                                      *
  3. '*                                                             - ing. Carlo BARTOLINI -                                                           *
  4. '**************************************************************************************************************************************************
  5. '*                                                         Inizio sezione principale codice                                                       *
  6. '**************************************************************************************************************************************************
  7.  
  8. _TITLE "Calcolo dell'idrogramma di piena di progetto tramite il metodo SCS-CN - ing. Carlo BARTOLINI"
  9. TempiRitorno:
  10. DATA 0,2,5,10,20,50,100,200,500,1000
  11. DATA 1,0.82,1.24,1.46,1.69,2.04,2.34,2.70,3.22,3.64
  12. CoefficientiIdrogrammaUnitarioMockus:
  13. DATA 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5
  14. DATA 0.03,0.1,0.19,0.31,0.47,0.66,0.82,0.93,0.99,1,0.99,0.93,0.86,0.78,0.68,0.56,0.46,0.39,0.33,0.28,0.244,0.207,0.177,0.147,0.127,0.107,0.092,0.077,0.066,0.055,0.048,0.04,0.035,0.029,0.025,0.021,0.018,0.015,0.013,0.011,0.009,0.008,0.007,0.006,0.006,0.005,0.004,0.003,0.001,0
  15. CoefficientiDiscretizzazioneTemporale:
  16. DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32
  17. DATA 0.1,0.2,0.3,0.2,0.3,0.3,0.3,0.3,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,1,1,1,1,1,1
  18.  
  19. TYPE mockus
  20.     tSUta AS SINGLE
  21.     qSUqp AS SINGLE
  22. TYPE CoefficientiDiscretizzazioneTemporale
  23.     N AS INTEGER
  24.     tSUta AS SINGLE
  25. TYPE TempiRitorno
  26.     T AS INTEGER
  27.     k AS SINGLE
  28. TYPE matrice1
  29.     mdt AS SINGLE
  30.     h1 AS SINGLE
  31.     i1 AS SINGLE
  32.     i2 AS SINGLE
  33.     DH AS SINGLE
  34.     H2 AS SINGLE
  35.     he AS SINGLE
  36.     Dhe AS SINGLE
  37.     tSUta AS SINGLE
  38.     qSUqp AS SINGLE
  39.     tmSUta AS SINGLE
  40.     qmSUqp AS SINGLE
  41.     qm AS SINGLE
  42. TYPE idrogramma
  43.     i AS _BYTE
  44.     ore AS SINGLE
  45.     portata AS SINGLE
  46. TYPE composizione
  47.     grafico AS LONG
  48.     composizione AS LONG
  49.  
  50. CONST R& = _RGB32(255, 0, 0)
  51. CONST G& = _RGB32(0, 255, 0)
  52. CONST B& = _RGB32(0, 0, 255)
  53. CONST bianco& = _RGB32(255, 255, 255)
  54. CONST giallo& = _RGB32(255, 255, 0)
  55. CONST grigio& = _RGB32(127, 127, 127)
  56. CONST azzurro& = _RGB32(0, 255, 255)
  57. CONST pastello& = _RGB32(183, 150, 139)
  58. CONST viola& = _RGB32(255, 0, 255)
  59. CONST trasparente& = _RGB32(0, 0)
  60. CONST LarghezzaColonna%% = 8
  61.  
  62.     DO
  63.         CLEAR
  64.         inizio:
  65.         IF _DIREXISTS(".\RisultatiQB64") THEN
  66.             ON ERROR GOTO cancel1
  67.             KILL (".\RisultatiQB64\*.*")
  68.             ON ERROR GOTO cancel2
  69.             RMDIR (".\RisultatiQB64")
  70.         END IF
  71.         ON ERROR GOTO 0
  72.  
  73.         DIM SHARED DESKTOPWIDTH%, DESKTOPHEIGHT%
  74.         DIM SHARED i%, n%%, z%%, p%%
  75.         DIM SHARED ieto%%
  76.         DIM SHARED VisualizzaIeto%%
  77.         DIM SHARED tipo%%
  78.         DIM SHARED esc~`, riavvio~`, menu~`, TornaAlGrafico~`
  79.         DIM SHARED interrompi~`(2) '
  80.         DIM SHARED inputs$(8)
  81.         DIM SHARED KeyPress$
  82.         DIM SHARED CoefficientiDiscretizzazioneTemporale(24) AS CoefficientiDiscretizzazioneTemporale
  83.         DIM SHARED TempiRitorno(10) AS TempiRitorno
  84.         DIM SHARED idrogrammi1a24(2, 24, 50, 1) AS idrogramma
  85.         DIM SHARED MassimiIdrogrammi1a24(2, 24, 1) AS idrogramma
  86.         DIM SHARED MassimiAssolutiIeto(2) AS idrogramma
  87.         DIM SHARED IdroMaxieto%%(2)
  88.         DIM SHARED FinePioggiaIdrogrammi1a24(2, 24, 1) AS idrogramma
  89.         DIM SHARED FinePioggiaIdrogrammi1e2(2) AS idrogramma
  90.         DIM SHARED PassiFinePioggia1a24%%(24)
  91.         DIM SHARED ore!(3), portata!(3)
  92.  
  93.         REDIM SHARED IdroPixel1(1) AS idrogramma
  94.         REDIM SHARED IdroPixel2(1) AS idrogramma
  95.         REDIM SHARED idrogramma1(1) AS idrogramma
  96.         REDIM SHARED idrogramma2(1) AS idrogramma
  97.  
  98.         DIM L%, H%
  99.         DIM posizione%
  100.         DIM OriginaleGrafico&
  101.         DIM schermo&
  102.         DIM unitari&
  103.         DIM quadro&
  104.         DIM ComplessivoIeto1e2(2) AS composizione
  105.         DIM idrogramma1e2(2) AS composizione
  106.         DIM MatriciIeto1e2(2, 24)
  107.         DIM mockus(50) AS mockus
  108.         DIM matrice1(2, 24, 50, 1) AS matrice1
  109.         DIM matrice2!(2, 24, 50, 50)
  110.         DIM MinimiMatriciQuadrante1(2, 24, 1) AS idrogramma
  111.         DIM MinimiMatriciQuadrante2(2, 24, 1) AS idrogramma
  112.         DIM MassimiQuadrante2(2, 24, 1) AS idrogramma
  113.         DIM k!
  114.         DIM a1!
  115.         DIM n1!
  116.         DIM A2&
  117.         DIM L~%
  118.         DIM s1!
  119.         DIM CNII%%
  120.         DIM CoeffPerditeIniziali!
  121.         DIM CNIII!
  122.         DIM tl!
  123.         DIM S2!
  124.         DIM Ia!
  125.         DIM tc!
  126.         DIM ta!
  127.         DIM qp!
  128.         DIM dt!(24)
  129.  
  130.         RESTORE TempiRitorno
  131.         FOR i% = 1 TO 20
  132.             IF i% <= 10 THEN READ TempiRitorno(i%).T
  133.             IF i% > 10 THEN READ TempiRitorno(i% - 10).k
  134.         NEXT i%
  135.         RESTORE CoefficientiIdrogrammaUnitarioMockus
  136.         FOR i% = 1 TO 100
  137.             IF i% <= 50 THEN READ mockus(i%).tSUta
  138.             IF i% > 50 THEN READ mockus(i% - 50).qSUqp
  139.         NEXT i%
  140.  
  141.         DESKTOPWIDTH% = _DESKTOPWIDTH
  142.         DESKTOPHEIGHT% = _DESKTOPHEIGHT
  143.         'DESKTOPWIDTH% = 1280 'limite inferiore della risoluzione dello schermo in pixel per il funzionamento del programma.
  144.         'DESKTOPHEIGHT% = 720
  145.         'DESKTOPWIDTH% = 1366 'valore intermedio della risoluzione dello schermo in pixel per il funzionamento del programma.
  146.         'DESKTOPHEIGHT% = 768
  147.         'DESKTOPWIDTH% = 1024 'sotto il limite inferiore della risoluzione dello schermo in pixel per il funzionamento del programma.
  148.         'DESKTOPHEIGHT% = 768
  149.         IF DESKTOPWIDTH% < 1280 THEN
  150.             esc~` = 1
  151.             PRINT "Il programma Š incompatibile con schermi larghi meno di 1280 pixel."
  152.             PRINT "Questo schermo Š largo"; DESKTOPWIDTH%; "pixel."
  153.             PRINT "Premere un tanto per uscire."
  154.             BEEP
  155.             SLEEP
  156.         END IF
  157.         L% = DESKTOPWIDTH%: H% = L% \ 1.62
  158.         DO
  159.             IF esc~` = 1 THEN EXIT DO
  160.             _FULLSCREEN
  161.             DO
  162.                 ERASE idrogrammi1a24, MassimiIdrogrammi1a24, FinePioggiaIdrogrammi1a24, MassimiAssolutiIeto, IdroMaxieto%%, FinePioggiaIdrogrammi1e2, PassiFinePioggia1a24%%, CoefficientiDiscretizzazioneTemporale, IdroPixel1,_
  163.                  IdroPixel2, idrogramma1, idrogramma2, dt!, matrice1, matrice2!, MinimiMatriciQuadrante1, MinimiMatriciQuadrante2, MassimiQuadrante2
  164.                 FOR ieto%% = 1 TO 2
  165.                     ComplessivoIeto1e2(ieto%%).grafico = _NEWIMAGE(L% - 48 * 8, H%, 32)
  166.                     ComplessivoIeto1e2(ieto%%).composizione = _NEWIMAGE(L%, H%, 32)
  167.                     idrogramma1e2(ieto%%).grafico = _NEWIMAGE(L% - 59 * 8, H%, 32)
  168.                     idrogramma1e2(ieto%%).composizione = _NEWIMAGE(L%, H%, 32)
  169.                     FOR z%% = 1 TO 24
  170.                         MatriciIeto1e2(ieto%%, z%%) = _NEWIMAGE(L%, H%, 32)
  171.                     NEXT z%%
  172.                 NEXT ieto%%
  173.                 schermo& = _NEWIMAGE(DESKTOPWIDTH%, DESKTOPHEIGHT%, 32)
  174.                 unitari& = _NEWIMAGE(L%, H%, 32)
  175.                 quadro& = _NEWIMAGE(L% - 97 * 8, H% \ 2, 32)
  176.                 SCREEN schermo&
  177.                 CLS
  178.                 menu~` = 0
  179.                 COLOR giallo&: PRINT "        C A L C O L O   D E L L ' I D R O G R A M M A   D I   P I E N A   D I   P R O G E T T O   T R A M I T E   I L   M E T O D O   S C S - C N"
  180.                 COLOR grigio&: PRINT "                                                  -  I N G .   C A R L O   B A R T O L I N I  -"
  181.                 COLOR bianco&
  182.                 PRINT "Questo programma calcola l'idrogramma di piena di progetto (e relativa portata di picco)  per un dato tempo di ritorno  utilizzando l'idrogramma unitario"
  183.                 PRINT "di Mockus, il metodo afflussi-deflussi SCS-CN e ietrogrammi tipo"; CHR$(34); "Chicago"; CHR$(34); " e "; CHR$(34); "costanti"; CHR$(34); "."
  184.                 PRINT "Sar… possibile scegliere se  visualizzare i risultati in base  a l'uno o all'altro  tipo di ietogramma, ma anche  quello non visualizzato, sar…  comunque"
  185.                 PRINT "calcolato e salvato nei risultati."
  186.                 PRINT "Il programma, dopo l'elaborazione, alla sua chiusura (premendo ESC o al suo termine), chieder… se salvare i risultati nella seguente directory:"
  187.                 PRINT
  188.                 PRINT CHR$(34); _CWD$; "\RisultatiQB64"; CHR$(34); "."
  189.                 PRINT
  190.                 PRINT "I file saranno di 3 tipi:"
  191.                 PRINT "- immagini dei grafici, con estensione "; CHR$(34); "BMP"; CHR$(34); ";"
  192.                 PRINT "- tabulati, con estensione "; CHR$(34); "CSV"; CHR$(34); ". Possono essere aperti con  Excel, ma per essere visualizzati correttamente, nelle impostazioni di Windows il separatore"
  193.                 PRINT "  dell'elenco dev'essere la virgola. Le celle dei fogli di lavoro dei file relativi al calcolo di ogni idrogramma contengono le formule,per cui in essi Š"
  194.                 PRINT "  esemplificata la procedura di calcolo del programma stesso;"
  195.                 PRINT "- un file con estensione "; CHR$(34); "TXT"; CHR$(34); " in cui Š riportato il codice del programma commentato, comprese le procedure di calcolo."
  196.                 PRINT "Riavviando  il programma,la directory "; CHR$(34); "RisultatiQB64"; CHR$(34); " sar… cancellata, quindi, se s'intende preservare i risultati, sar… prima necessario o rinominarla o"
  197.                 PRINT "spostarla."
  198.                 PRINT "---------------------------------------------------------------------------------------------------------------------------------------------------------"
  199.                 PRINT "Di seguito,si dovranno inserire i valori della curva di possibilit… climatica "; CHR$(34); "h = Ktúaúd^n"; CHR$(34); ". Se si dispone dei valori del Centro Funzionale, digitare il"
  200.                 PRINT "valore "; CHR$(34); "Kt"; CHR$(34); " relativo al  tempo di ritorno "; CHR$(34); "T"; CHR$(34); " d'interesse, con i relativi valori "; CHR$(34); "a"; CHR$(34); " e "; CHR$(34); "n"; CHR$(34); ". Se invece si ha una propria curva di possibilit… climatica,in"
  201.                 PRINT "corrispondenza di "; CHR$(34); "Kt"; CHR$(34); ", digitare "; CHR$(34); "INVIO"; CHR$(34); ", o "; CHR$(34); "1"; CHR$(34); ".In tal caso "; CHR$(34); "Kt"; CHR$(34); " sar… considerato pari a "; CHR$(34); "1"; CHR$(34); " e "; CHR$(34); "T"; CHR$(34); " come "; CHR$(34); "definito dall'utente"; CHR$(34); "."
  202.                 PRINT
  203.                 PRINT "- Kt [-] (INVIO per 1)                                            = "
  204.                 PRINT "- a [mm/d^n]                                                      = "
  205.                 PRINT "- n [-] (0ö1)                                                     = "
  206.                 PRINT "- Area reale del bacino idrografico [mý] (>=1)                    = "
  207.                 PRINT "- Lunghezza dell'asta principale del bacino idrografico [m] (>=1) = "
  208.                 PRINT "- Pendenza media del bacino idrografico [%] (>=1)                 = "
  209.                 PRINT "- CN(II) [-] (1ö100)                                              = "
  210.                 PRINT "- Coefficiente delle perdite inziali [-] (0ö0.2 - INVIO per 0.1)  = "
  211.                 LOCATE CSRLIN + 2,
  212.                 COLOR giallo&: PRINT "  [ESC]: esci; [TAB]: riavvia.": COLOR bianco&
  213.                 CALL InserimentoDati(k!, a1!, n1, A2&, L~%, s1!, CNII%%, CoeffPerditeIniziali!)
  214.                 IF esc~` = 1 OR riavvio~` = 1 THEN EXIT DO
  215.                 LOCATE PosizioneCursore%% + 9, 1
  216.                 COLOR giallo&
  217.                 PRINT "  [1]: utilizza lo ietogramma Chicago; [2]: utilizza lo ietogramma costante;"
  218.                 PRINT "  [ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali."
  219.                 COLOR bianco&
  220.                 DO
  221.                     _LIMIT 30
  222.                     KeyPress$ = INKEY$
  223.                 LOOP UNTIL KeyPress$ = "1" OR KeyPress$ = "2" OR KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59)
  224.                 SELECT CASE KeyPress$
  225.                     CASE CHR$(27)
  226.                         esc~` = 1
  227.                     CASE CHR$(9)
  228.                         riavvio~` = 1
  229.                     CASE CHR$(0) + CHR$(59)
  230.                         menu~` = 1
  231.                     CASE ELSE
  232.                         VisualizzaIeto%% = VAL(KeyPress$)
  233.                 END SELECT
  234.                 IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 THEN EXIT DO
  235.                 CNIII! = (23 * CNII%%) / (10 + 0.13 * CNII%%) '                                                  ¿
  236.                 tl! = 0.342 * ((L~% / 1000) ^ 0.8 / s1! ^ 0.5) * (1000 / CNIII! - 9) ^ 0.7 '* formula di Mockus. ³ dati immediatamente discendenti dagli input iniziali, che fungono da input interni al programma per le elaborazioni.
  237.                 S2! = 25.4 * (1000 / CNIII! - 10) '*                                                             ³
  238.                 Ia! = CoeffPerditeIniziali! * S2! '* coeff.=0.03-0.2. 'perdite iniziali                          ³ *  La sistemazione dei bacini montani - Vito Ferro - Seconda edizione - cap. 3.4.7. "Il metodo SCS" - pp. 195-205.
  239.                 tc! = tl! / 0.6 '**                                                                              ³
  240.                 ta! = tl! / 0.9 '*                                                                               ³ ** ibid. cap. 3.4.4. "Il tempo di corrivazione di un bacino" - p. 188.
  241.                 qp! = 0.208 * ((A2& / 1000000) / ta!) '*                                                         Ù
  242.                 RESTORE CoefficientiDiscretizzazioneTemporale
  243.                 FOR i% = 1 TO 48
  244.                     IF i% <= 24 THEN READ CoefficientiDiscretizzazioneTemporale(i%).N
  245.                     IF i% > 24 THEN READ CoefficientiDiscretizzazioneTemporale(i% - 24).tSUta
  246.                 NEXT i%
  247.                 FOR ieto%% = 1 TO 2
  248.                     interrompi~`(ieto%%) = 0
  249.                     continua1:
  250.                     IF interrompi~`(1) = 1 THEN IF ieto%% = 1 THEN _CONTINUE
  251.                     continua2:
  252.                     IF interrompi~`(2) = 1 THEN EXIT FOR
  253.                     IF ieto%% = 1 THEN ON ERROR GOTO salta1
  254.                     IF ieto%% = 2 THEN ON ERROR GOTO salta2
  255.                     FOR z%% = 1 TO 24
  256.                         GOSUB CalcolaMatriciIeto1e2
  257.                         GOSUB DisegnaMatriciIeto1e2
  258.                     NEXT z%%
  259.                     IF interrompi~`(ieto%%) = 0 THEN GOSUB DisegnaComplessivoIeto1e2
  260.                 NEXT ieto%%
  261.                 ON ERROR GOTO 0
  262.                 GOSUB TerminaSeErrore
  263.                 IF esc~` = 1 OR riavvio~` = 1 THEN EXIT DO
  264.                 GOSUB DisegnaUnitari
  265.                 _DEST schermo&
  266.                 PRINT "---------------------------------------------------------------------------------------------------------------------------------------------------------"
  267.                 PRINT "Sono stati calcolati 24 idrogrammi di piena con relative portate di picco,per durate della pioggia fino a 32 volte il tempo di corrivazione. Nella pagina"
  268.                 PRINT "successiva, saranno visualizzati insieme alla spezzata (in";: COLOR giallo&: PRINT " giallo";: COLOR bianco&: PRINT ") congiungente le portate di picco dei vari idrogrammi. Per  determinare l'idrogramma di"
  269.                 PRINT "progetto e relativa portata di picco, sar… possibile avvalersi dei suddetti risultati (per esempio tramite Excel), oppure proseguire su questo programma."
  270.                 PRINT
  271.                 SELECT CASE VisualizzaIeto%%
  272.                     CASE IS = 1
  273.                         PRINT "In tal caso, il programma chieder… 2 input:"
  274.                         PRINT "- Una soglia percentuale S, per il calcolo dell'idrogramma di progetto."
  275.                         PRINT "  Per esempio, scrivendo 10%, viene verificato se, sulla spezzata gialla, la portata di picco corrispondente all'ora 1 aumentata del 10%, Š minore  della"
  276.                         PRINT "  portata di picco corrispondente all'ora 2. Se Š minore, l'algoritmo prosegue finch‚ non trova la portata di picco di un'ora "; CHR$(34); "i"; CHR$(34); " che, aumentata del 10%,"
  277.                         PRINT "  risulta maggiore della portata di picco dell'ora "; CHR$(34); "i+1"; CHR$(34); ". Sar… considerato come idrogramma di progetto quello  relativo all'ultima ora la cui  portata di"
  278.                         PRINT "  picco risulta essere superiore alla portata di picco dell'ora precedente aumentata del 10%."
  279.                         PRINT "  Qualora la soglia percentuale  digitata sia troppo bassa per determinare, nel corso  delle iterazioni, un superamento  della  portata di picco dell'ora"
  280.                         PRINT "  successiva, viene computato, come idrogramma di progetto, quello che presenta la massima portata di picco tra i 24 calcolati."
  281.                         PRINT "- Un tempo a scelta, di cui viene calcolata la corrispondente portata di picco e relativo idrogramma."
  282.                     CASE IS = 2
  283.                         PRINT "In tal caso, il programma chieder… 1 input."
  284.                         PRINT "- Un tempo a scelta, di cui viene calcolata la corrispondente portata di picco e relativo idrogramma."
  285.                         PRINT "Come idrogramma di progetto, Š computato quello che presenta la massima portata di picco tra i 24 calcolati."
  286.                 END SELECT
  287.                 PRINT
  288.                 COLOR giallo&: PRINT "  [ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; []: prosegui.": COLOR bianco&
  289.                 LOCATE CSRLIN + 1,
  290.                 DO
  291.                     _LIMIT 30
  292.                     KeyPress$ = INKEY$
  293.                 LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(77)
  294.                 SELECT CASE KeyPress$
  295.                     CASE CHR$(27)
  296.                         esc~` = 1
  297.                         IF VisualizzaIeto%% = 2 THEN
  298.                             CALL CalcolaIdrogramma(MassimiIdrogrammi1a24(VisualizzaIeto%%, 24, 1).ore, idrogrammi1a24(VisualizzaIeto%%, 24, 50, 1).ore, MassimiAssolutiIeto(VisualizzaIeto%%).ore, MassimiAssolutiIeto(VisualizzaIeto%%).portata, ComplessivoIeto1e2(VisualizzaIeto%%).grafico, ComplessivoIeto1e2(VisualizzaIeto%%).composizione)
  299.                             GOSUB DisegnaIdrogramma
  300.                         END IF
  301.                     CASE CHR$(9)
  302.                         riavvio~` = 1
  303.                     CASE CHR$(0) + CHR$(59)
  304.                         menu~` = 1
  305.                 END SELECT
  306.                 IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 THEN EXIT DO
  307.                 CLS
  308.                 VIEW PRINT 1 TO 4
  309.                 DO
  310.                     DO
  311.                         TornaAlGrafico~` = 0
  312.                         ERASE IdroPixel1, IdroPixel2, idrogramma1, idrogramma2
  313.                         FOR ieto%% = 1 TO 2
  314.                             _DEST idrogramma1e2(ieto%%).grafico: CLS
  315.                             _DEST idrogramma1e2(ieto%%).composizione: CLS
  316.                         NEXT ieto%%
  317.                         GOSUB VisualizzaComplessivo
  318.                         CALL CalcolaIdrogramma(MassimiIdrogrammi1a24(VisualizzaIeto%%, 24, 1).ore, idrogrammi1a24(VisualizzaIeto%%, 24, 50, 1).ore, MassimiAssolutiIeto(VisualizzaIeto%%).ore, MassimiAssolutiIeto(VisualizzaIeto%%).portata, ComplessivoIeto1e2(VisualizzaIeto%%).grafico, ComplessivoIeto1e2(VisualizzaIeto%%).composizione)
  319.                         GOSUB DisegnaIdrogramma
  320.                         GOSUB VisualizzaIdrogramma
  321.                         IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN EXIT DO
  322.                         GOSUB VisualizzaUnitari
  323.                         IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN EXIT DO
  324.                         GOSUB VisualizzaMatrici
  325.                         EXIT DO
  326.                     LOOP
  327.                     IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 THEN EXIT DO
  328.                 LOOP
  329.                 IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 THEN EXIT DO
  330.             LOOP
  331.             IF riavvio~` = 1 OR menu~` = 1 THEN GOSUB freeimage
  332.             IF esc~` = 1 OR riavvio~` = 1 THEN EXIT DO
  333.         LOOP
  334.         IF esc~` = 1 OR riavvio~` = 1 THEN EXIT DO
  335.     LOOP
  336.     IF esc~` = 1 THEN EXIT DO
  337. _DEST shermo&
  338. IF VisualizzaIeto%% <> 0 THEN
  339.     IF interrompi~`(1) = 0 OR interrompi~`(2) = 0 THEN
  340.         PRINT
  341.         COLOR giallo&: PRINT "[ESC]: esci; [1]: salva su disco tabulati e immagini (richiede tempo); [2]: salva solo tabulati.": COLOR bianco&
  342.         PRINT
  343.         DO
  344.             _LIMIT 30
  345.             KeyPress$ = INKEY$
  346.         LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = "1" OR KeyPress$ = "2"
  347.         IF KeyPress$ = "1" OR KeyPress$ = "2" THEN
  348.             MKDIR "RisultatiQB64"
  349.             CHDIR ".\RisultatiQB64"
  350.             PRINT "Attendere, salvataggio in corso nella directory:"
  351.             PRINT CHR$(34); _CWD$; CHR$(34); "."
  352.             PRINT "Il programma si chiuder… automaticamente a procedura ultimata."
  353.             PRINT
  354.             PRINT "Si ricorda che:"
  355.             PRINT "- La  directory  sar…  cancellata  in caso di  riavvio  del programma, pertanto se  si  desidera"
  356.             PRINT "  preservare i risultati, essa dovr… essere o rinominata, o spostata."
  357.             PRINT "- Per i file di estensione "; CHR$(34); "CSV"; CHR$(34); ",affinch‚ siano visualizzati correttamente in Excel, ";: COLOR R&: PRINT "Š necessario"
  358.             PRINT "  che nelle impostazioni di Windows il separatore dell'elenco sia la virgola";: COLOR bianco&: PRINT "."
  359.             SLEEP 5
  360.             SHELL _CWD$
  361.             GOSUB Risultati
  362.             CHDIR "..\"
  363.         END IF
  364.     END IF
  365. freeimage:
  366. IF DESKTOPWIDTH% >= 1280 THEN
  367.     FOR ieto%% = 1 TO 2
  368.         _FREEIMAGE ComplessivoIeto1e2(ieto%%).grafico
  369.         _FREEIMAGE ComplessivoIeto1e2(ieto%%).composizione
  370.         _FREEIMAGE idrogramma1e2(ieto%%).grafico
  371.         _FREEIMAGE idrogramma1e2(ieto%%).composizione
  372.         FOR z%% = 1 TO 24
  373.             _FREEIMAGE MatriciIeto1e2(ieto%%, z%%)
  374.         NEXT z%%
  375.     NEXT ieto%%
  376.     _FREEIMAGE unitari&
  377.     _FREEIMAGE quadro&
  378.     IF OriginaleGrafico& AND esc~` = 0 THEN _FREEIMAGE OriginaleGrafico&
  379. IF riavvio~` = 1 OR menu~` = 1 THEN RETURN
  380. '/////////////////////////////////////////////////// T E R M I N E   D E L   P R O G R A M M A ////////////////////////////////////////////////////
  381.  
  382. '**************************************************************************************************************************************************
  383. '*                                                        Inizio sezione gestione errori                                                          *
  384. '**************************************************************************************************************************************************
  385.  
  386. cancel1:
  387. cancel2:
  388. PRINT "Almeno un file interno alla directory"
  389. PRINT CHR$(34); _CWD$; "\RisultatiQB64\"; CHR$(34)
  390. PRINT "Š aperto in un altro programma."
  391. PRINT "Per proseguire chiudere i file e premere un tasto."
  392. RESUME inizio
  393. salta1:
  394. interrompi~`(1) = 1
  395. RESUME continua1
  396. salta2:
  397. interrompi~`(2) = 1
  398. RESUME continua2
  399.  
  400. '**************************************************************************************************************************************************
  401. '*                                          Termine sezione gestione errori e inizio sezione routines                                             *
  402. '**************************************************************************************************************************************************
  403.  
  404. TerminaSeErrore:
  405. 'routine che valuta come agire in caso di errore nell'elaborazione dei dati, se sono stati inseriti input non conformi.
  406.  
  407. IF interrompi~`(1) = 1 THEN
  408.     IF interrompi~`(2) = 1 THEN
  409.         _DEST schermo&
  410.         LOCATE 33,: PRINT STRING$(80, 32)
  411.         PRINT STRING$(80, 32)
  412.         LOCATE 33,: COLOR giallo&: PRINT "  I dati sono incompatibili con risultati attendibili.": COLOR bianco&
  413.         COLOR giallo&: PRINT "  [ESC]: esci; [TAB]: riavvia.": COLOR bianco&
  414.         DO
  415.             _LIMIT 30
  416.             KeyPress$ = INKEY$
  417.         LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9)
  418.         SELECT CASE KeyPress$
  419.             CASE CHR$(27)
  420.                 esc~` = 1
  421.             CASE CHR$(9)
  422.                 riavvio~` = 1
  423.         END SELECT
  424.         RETURN
  425.     END IF
  426. SELECT CASE interrompi~`(VisualizzaIeto%%)
  427.     CASE IS = 0
  428.         EXIT SELECT
  429.     CASE IS = 1
  430.         _DEST schermo&
  431.         LOCATE 33,
  432.         COLOR giallo&
  433.         IF interrompi~`(1) = 0 THEN PRINT "  I dati sono incompatibili con risultati attendibili, ma utilizzando lo ietogramma Chicago sono stati ottenuti risultati. Visualizzarli? [S/(ESC o N)]"
  434.         IF interrompi~`(2) = 0 THEN PRINT "  I dati sono incompatibili con risultati attendibili, ma utilizzando lo ietogramma costante sono stati ottenuti risultati. Visualizzarli? [S/(ESC o N)]"
  435.         PRINT "  [ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali."
  436.         COLOR bianco&
  437.         DO
  438.             _LIMIT 30
  439.             KeyPress$ = LCASE$(INKEY$)
  440.         LOOP UNTIL KeyPress$ = "s" OR KeyPress$ = "n" OR KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59)
  441.         SELECT CASE KeyPress$
  442.             CASE "s"
  443.                 IF interrompi~`(1) = 0 THEN VisualizzaIeto%% = 1
  444.                 IF interrompi~`(2) = 0 THEN VisualizzaIeto%% = 2
  445.             CASE "n", CHR$(27)
  446.                 esc~` = 1
  447.             CASE CHR$(9)
  448.                 riavvio~` = 1
  449.             CASE CHR$(0) + CHR$(59)
  450.                 menu~` = 1
  451.         END SELECT
  452. '--------------------------------------------------------------------------------------------------------------------------------------------------
  453. '--------------------------------------------------------------------------------------------------------------------------------------------------
  454. CalcolaMatriciIeto1e2:
  455. 'routine che esegue tutti i calcoli da cui seguiranno tutte le immagini, grafici e risultati. anticipando quanto detto sotto, verranno calcolati 24 idrogrammi. il programma chiede se salvare i risultati. in caso affermativo, tra
  456. 'i risultati, verranno creati anche dei file in formato CSV relativi a ciasuno di questi 24 idrogrammi. per visualizzare in dettaglio ciò che fa questa routine, è possibile vedere uno dei suddetti file, insieme ai commenti
  457. 'riportati qui sotto.
  458.  
  459. IF ieto%% = 1 THEN
  460.     dt!(z%%) = CoefficientiDiscretizzazioneTemporale(z%%).tSUta * ta! '***
  461.     PassiFinePioggia1a24%%(z%%) = (3 * CoefficientiDiscretizzazioneTemporale(z%%).N) / (2 * CoefficientiDiscretizzazioneTemporale(z%%).tSUta) 'detto M qui sotto.
  462. 'memorizza il passo temporale dt! di ciascuno dei 24+24 idrogrammi. man mano che vengono analizzate piogge di durata maggiore, è necessario aumentare la durata del passo temporale dt! di analisi. infatti l'idrogramma unitario
  463. 'adimensionale di Mockus è costituito da 2 vettori (t/ta e q/qp) di 50 elementi ciascuno, ma se il passo temporale è troppo piccolo, non si arriva a d (fine pioggia) in un massimo di 50 passi. tra l'altro, se dt! è
  464. 'sufficientemente grande da arrivare a d, potrebbe comunque essere ancora troppo piccolo per permettere l'analisi del ramo discendente dell'idrogramma oltre l'ora di fine pioggia, fino ad una portata prossima allo 0. quindi
  465. 'dt! dev'essere sempre tale da garantire il calcolo dell'intero idrogramma senza perdere troppo di precisione e senza essere tuttavia troppo piccolo da tagliarlo.
  466. 'il passo temporale dt! è così definito: dt!=C*ta!, dove C è un valore opportuno di t/ta dell'idrogramma unitario adimensionale di Mockus.
  467. 'per esempio, ponendo dt!=0.2*ta!, si ha:
  468. 't1=1*dt!=1*0.2*ta!->t1/ta!=0.2
  469. 't2=2*dt!=2*0.2*ta!->t2/ta!=0.4
  470. 't3=3*dt!=3*0.2*ta!->t3/ta!=0.6
  471. 't4=4*dt!=4*0.2*ta!->t4/ta!=0.8
  472. 'ponendo dt!=0.3*ta!, si ha:
  473. 't1=1*dt!=1*0.3*ta!->t1/ta!=0.3
  474. 't2=2*dt!=2*0.3*ta!->t2/ta!=0.6
  475. 't3=3*dt!=3*0.3*ta!->t3/ta!=0.9
  476. 't4=4*dt!=4*0.3*ta!->t4/ta!=1.2
  477. 'si vede dunque che in tal modo si discretizza l'idrogramma unitario adimensionale di Mockus ottenendo sempre valori tm/ta! coincidenti con valori di t/ta! dell'idrogramma unitario adimensionale di Mockus e per i quali sono
  478. 'quindi noti i corrispondenti valori q/qp!, evitando la necessità di effettuare interpolazioni.
  479. 'è da rilevare che nei calcoli è stato utilizzato anche il valore C=0.3: dt!=0.3*ta!. in questo caso però si "perde" il picco, in quanto si passa da t3/ta!=0.9 a t4/ta!=1.2, ma q/qp!=1 solo per t/ta!=1.
  480. 'ciò crea potenzialmente grosse discrepanze nei risultati, in quanto gli idrogrammi così calcolati possono presentare portate di picco fortemente sottistimate e palesemente più basse rispetto alle portate di picco di idrogrammi
  481. 'calcolati con parametri C che non "perdono" il picco. questo "inconveniente" tuttavia è trascurabile per durate della pioggia non troppo lunghe, in quanto il passo temporale dt! è sufficientemente piccolo da far "cadere"
  482. 'l'analisi comunque molto vicina al picco. Per contro, utilizzando altri coefficienti in grado di cogliere il picco, come 0.2 o 0.5, si potrebbe avere rispettivamente o un idrogramma visibilmente "tagliato", in quanto il
  483. 'dt! potrebbe essere insufficiente a permettere l'analisi fino al termine della pioggia o fino al quasi esaurimento della portata (come detto prima), oppure un idrogramma inutilmente impreciso, perché per cogliere il picco,
  484. 'si rinuncia alla precisione di analisi. i detti coefficienti sono quindi stati scelti cercando il miglior equilibrio: utilizzando il più possibile coefficienti bassi e sottomultipli di 1 per quelle durate della pioggia che
  485. 'possono essere efficacemente analizzate così. è stato utilizzato il coefficiente 0.3 per le "vie di mezzo" appena descritte. non si sono usati coefficienti come 0.6,0.7,0.8,0.9, in quanto implicano dei dt tali che la "perdita"
  486. 'del picco non sarebbe assolutamente trascurabile. si erano fatte delle prove in tal senso ed erano emerse le evidenti incongruenze nei dati descritte sopra. si sono invece usati i coefficienti 0.5 e 1 per coprire durate della
  487. 'pioggia più lunghe possibile, fino a 32 volte il tempo di corrivazione.
  488. 'i parametri C del valori t/ta! dell'idrogramma unitario adimensionale di Mockus utilizzati sono dunque: 0.1,0.2,0.3,0.5,1. essi, come detto, sono correlati al passo temporale dt! e quindi alla durata della pioggia d, che è
  489. 'espressa come d=N*tc! (cioè come multiplo di tc!). vi è dunque un legame tra i parametri C e il moltiplicatore N di tc!, infatti detto M il numero di passi dt! per arrivare alla durata d della pioggia (che, come detto, non può
  490. 'superare il valore 50), si ha:
  491. 'd=M*dt!=M*C*ta!=M*C*(tl!/0.9) e d=N*tc!=N*(tl!/0.6),
  492. 'da cui si ottiene l'espressione:
  493. 'M=3N/2C
  494. 'da cui, indicando con X la combinazione scelta:
  495. '         C=0.1   C=0.2   C=0.3   C=0.5   C=1
  496. '         ...................................
  497. '              /: numero non intero.
  498. '1)  N=1  M=15(X) M=/     M=5     M=3     M=/
  499. '2)  N=2  M=30    M=15(X) M=10    M=6     M=3    ------------> si è scelto C=0.2 perché con C=0.1 la discretizzazione temporale non permette l'analisi di tutto il ramo discendente dell'idrogramma oltre la durata della pioggia.
  500. '3)  N=3  M=45    M=/     M=15(X) M=9     M=/    ------------> idem.
  501. '4)  N=4          M=30(X) M=20    M=12    M=6
  502. '5)  N=5          M=/     M=25(X) M=15    M=/
  503. '6)  N=6          M=45    M=30(X) M=18    M=9    ------------> idem.
  504. '7)  N=7                  M=35(X) M=21    M=/    ------------> nonostante C=0.3 non colga il picco, la discretizzazione temporale dt! è sufficientemente piccola da non discostarsi molto dal picco.
  505. '8)  N=8                  M=40(X) M=24    M=12   ------------> idem.
  506. '9)  N=9                  M=45    M=27(X) M=/
  507. '10) N=10                 M=50    M=30(X) M=15
  508. '11) N=11                         M=33(X) M=/
  509. '12) N=12                         M=36(X) M=18
  510. '13) N=13                         M=39(X) M=/
  511. '14) N=14                         M=42(X) M=21
  512. '15) N=15                         M=45(X) M=/
  513. '16) N=16                         M=48(X) M=24
  514. '    N=17                                 M=/
  515. '17) N=18                                 M=27(X)
  516. '    N=19                                 M=/
  517. '18) N=20                                 M=30(X)
  518. '    N=21                                 M=/
  519. '19) N=22                                 M=33(X)
  520. '    N=23                                 M=/
  521. '20) N=24                                 M=36(X)
  522. '    N=25                                 M=/
  523. '21) N=26                                 M=39(X)
  524. '    N=27                                 M=/
  525. '22) N=28                                 M=42(X)
  526. '    N=29                                 M=/
  527. '23) N=30                                 M=45(X)
  528. '    N=31                                 M=/
  529. '24) N=32                                 M=48(X)
  530. '................................................
  531. 'vedasi anche i fogli di calcolo Excel con estensione CSV, dei risultati.
  532. FOR i% = 1 TO 50
  533.     matrice1(ieto%%, z%%, i%, 1).tSUta = mockus(i%).tSUta
  534.     matrice1(ieto%%, z%%, i%, 1).qSUqp = mockus(i%).qSUqp
  535.     matrice1(ieto%%, z%%, i%, 1).mdt = i% * dt!(z%%)
  536.     SELECT CASE (_ROUND(10 * (i% * CoefficientiDiscretizzazioneTemporale(z%%).tSUta))) / 10
  537.         CASE IS <= 5
  538.             matrice1(ieto%%, z%%, i%, 1).tmSUta = (_ROUND(10 * (i% * CoefficientiDiscretizzazioneTemporale(z%%).tSUta))) / 10 '=matrice1(i%).m *  matrice1(i%).mdt / ta!
  539.         CASE ELSE
  540.             matrice1(ieto%%, z%%, i%, 1).tmSUta = 0
  541.     END SELECT
  542. NEXT i%
  543. FOR i% = 1 TO 50
  544.     n%% = 1
  545.     DO
  546.         IF matrice1(ieto%%, z%%, i%, 1).tmSUta = matrice1(ieto%%, z%%, n%%, 1).tSUta THEN
  547.             matrice1(ieto%%, z%%, i%, 1).qmSUqp = matrice1(ieto%%, z%%, n%%, 1).qSUqp
  548.             EXIT DO
  549.         ELSE
  550.             n%% = n%% + 1
  551.         END IF
  552.     LOOP UNTIL n%% = 50
  553.     matrice1(ieto%%, z%%, i%, 1).qm = matrice1(ieto%%, z%%, i%, 1).qmSUqp * qp!
  554. NEXT i%
  555. FOR i% = 1 TO PassiFinePioggia1a24%%(z%%)
  556.     matrice1(ieto%%, z%%, i%, 1).h1 = k! * a1! * matrice1(ieto%%, z%%, i%, 1).mdt ^ n1!
  557.     IF i% = 1 THEN
  558.         matrice1(ieto%%, z%%, i%, 1).i1 = matrice1(ieto%%, z%%, i%, 1).h1 / dt!(z%%)
  559.     ELSE
  560.         matrice1(ieto%%, z%%, i%, 1).i1 = (matrice1(ieto%%, z%%, i%, 1).h1 - matrice1(ieto%%, z%%, i% - 1, 1).h1) / dt!(z%%)
  561.     END IF
  562. NEXT i%
  563. SELECT CASE ieto%%
  564.     CASE 1
  565.         GOSUB chicago
  566.     CASE 2
  567.         FOR i% = 1 TO PassiFinePioggia1a24%%(z%%)
  568.             matrice1(ieto%%, z%%, i%, 1).i2 = matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).h1 / matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).mdt
  569.         NEXT i%
  570. FOR i% = 1 TO PassiFinePioggia1a24%%(z%%)
  571.     matrice1(ieto%%, z%%, i%, 1).DH = matrice1(ieto%%, z%%, i%, 1).i2 * dt!(z%%)
  572.     IF i% = 1 THEN
  573.         matrice1(ieto%%, z%%, i%, 1).H2 = matrice1(ieto%%, z%%, i%, 1).DH
  574.     ELSE
  575.         matrice1(ieto%%, z%%, i%, 1).H2 = matrice1(ieto%%, z%%, i%, 1).DH + matrice1(ieto%%, z%%, i% - 1, 1).H2
  576.     END IF
  577.     SELECT CASE matrice1(ieto%%, z%%, i%, 1).H2 - Ia!
  578.         CASE IS < 0
  579.             matrice1(ieto%%, z%%, i%, 1).he = 0
  580.         CASE IS >= 0
  581.             matrice1(ieto%%, z%%, i%, 1).he = (matrice1(ieto%%, z%%, i%, 1).H2 - Ia!) ^ 2 / (matrice1(ieto%%, z%%, i%, 1).H2 - Ia! + S2!)
  582.     END SELECT
  583.     IF i% = 1 THEN
  584.         matrice1(ieto%%, z%%, i%, 1).Dhe = matrice1(ieto%%, z%%, i%, 1).he
  585.     ELSE
  586.         matrice1(ieto%%, z%%, i%, 1).Dhe = matrice1(ieto%%, z%%, i%, 1).he - matrice1(ieto%%, z%%, i% - 1, 1).he
  587.     END IF
  588. NEXT i%
  589. FOR n%% = 1 TO 50
  590.     FOR i% = n%% TO 50
  591.         matrice2!(ieto%%, z%%, i%, n%%) = matrice1(ieto%%, z%%, i% - n%% + 1, 1).Dhe * matrice1(ieto%%, z%%, n%%, 1).qm
  592.     NEXT i%
  593. NEXT n%%
  594. FOR i% = 1 TO 50
  595.     FOR n%% = 1 TO 50
  596.         idrogrammi1a24(ieto%%, z%%, i%, 1).portata = idrogrammi1a24(ieto%%, z%%, i%, 1).portata + matrice2!(ieto%%, z%%, i%, n%%)
  597.     NEXT n%%
  598.     idrogrammi1a24(ieto%%, z%%, i%, 1).ore = matrice1(ieto%%, z%%, i%, 1).mdt
  599. NEXT i%
  600. i% = 1
  601.     IF MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata <= idrogrammi1a24(ieto%%, z%%, i%, 1).portata THEN
  602.         MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata = idrogrammi1a24(ieto%%, z%%, i%, 1).portata
  603.         MassimiIdrogrammi1a24(ieto%%, z%%, 1).ore = idrogrammi1a24(ieto%%, z%%, i%, 1).ore
  604.         MassimiIdrogrammi1a24(ieto%%, z%%, 1).i = i%
  605.     ELSEIF MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata > idrogrammi1a24(ieto%%, z%%, i%, 1).portata THEN EXIT DO
  606.     END IF
  607.     i% = i% + 1
  608. LOOP UNTIL i% = 51
  609. FinePioggiaIdrogrammi1a24(ieto%%, z%%, 1).ore = idrogrammi1a24(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).ore
  610. FinePioggiaIdrogrammi1a24(ieto%%, z%%, 1).portata = idrogrammi1a24(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).portata
  611. i% = 1
  612.     IF MassimiQuadrante2(ieto%%, z%%, 1).portata < matrice1(ieto%%, z%%, i%, 1).qm THEN
  613.         MassimiQuadrante2(ieto%%, z%%, 1).portata = matrice1(ieto%%, z%%, i%, 1).qm
  614.         MassimiQuadrante2(ieto%%, z%%, 1).ore = matrice1(ieto%%, z%%, i%, 1).mdt
  615.     ELSEIF MassimiQuadrante2(ieto%%, z%%, 1).portata > matrice1(ieto%%, z%%, i%, 1).qm THEN EXIT DO
  616.     END IF
  617.     i% = i% + 1
  618. SELECT CASE idrogrammi1a24(ieto%%, z%%, 50, 1).portata
  619.     CASE IS >= MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata * 0.05
  620.         MinimiMatriciQuadrante1(ieto%%, z%%, 1).ore = idrogrammi1a24(ieto%%, z%%, 50, 1).ore
  621.         MinimiMatriciQuadrante1(ieto%%, z%%, 1).i = 50
  622.     CASE IS < MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata * 0.05
  623.         i% = MassimiIdrogrammi1a24(ieto%%, z%%, 1).i
  624.         DO
  625.             IF idrogrammi1a24(ieto%%, z%%, i%, 1).portata < MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata * 0.05 THEN
  626.                 MinimiMatriciQuadrante1(ieto%%, z%%, 1).ore = idrogrammi1a24(ieto%%, z%%, i%, 1).ore
  627.                 MinimiMatriciQuadrante1(ieto%%, z%%, 1).i = i%
  628.                 EXIT DO
  629.             END IF
  630.             i% = i% + 1
  631.         LOOP
  632. i% = 1
  633.     IF matrice1(ieto%%, z%%, i%, 1).qm = 0 THEN
  634.         MinimiMatriciQuadrante2(ieto%%, z%%, 1).ore = matrice1(ieto%%, z%%, i%, 1).mdt
  635.         MinimiMatriciQuadrante2(ieto%%, z%%, 1).i = i%
  636.         EXIT DO
  637.     END IF
  638.     i% = i% + 1
  639. IF MassimiAssolutiIeto(ieto%%).portata < MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata THEN
  640.     MassimiAssolutiIeto(ieto%%).portata = MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata
  641.     MassimiAssolutiIeto(ieto%%).ore = MassimiIdrogrammi1a24(ieto%%, z%%, 1).ore
  642.     IdroMaxieto%%(ieto%%) = z%%
  643. '--------------------------------------------------------------------------------------------------------------------------------------------------
  644. chicago:
  645. 'questa routine dispone l'intensità di pioggia relativa all'idrogramma in corso di calcolo con passo temporale dt! secondo lo ietogramma Chicago, cioè ipotizzando che cominci con una bassa intensità, aumenti fino al picco e
  646. 'e vada poi scemando.
  647. 'per ogni idrogramma calcolato con un nuovo dt! (così come definito in ***) crea un vettore dell'intensità di pioggia secondo lo ietogramma Chicago, partendo dal vettore dell'intensità di pioggia calcolato dalla curva di
  648. 'possibilità climatica, ponendo l'ultimo valore come ultimo, il penultimo come primo, il terzultimo come penultimo, il quartultimo come secondo e così via.
  649. 'il programma determina se l'idrogramma in corso di calcolo presenta uno stesso dt! già usato precedentemente per il calcolo di un altro idrogramma. se lo trova, ne copia i valori dell'intensità di pioggia secondo lo
  650. 'ietogramma Chicago nel vettore dell'intensità di pioggia secondo lo ietogramma Chicago dell'idrogramma in corso di calcolo. i valori rimanenti sono riempiti procedendo come prima, aggiungendoli come code ai valori copiati.
  651. 'questo è necessario perché, a seconda del numero di iterazioni M (durata di pioggia d) e M'(durata di pioggia d') con uno stesso dt!, se si assume per esempio che sia d>d' (quindi M>M'), il vettore dell'intensità di pioggia
  652. 'secondo lo ietogramma Chicago relativo a M non per forza, una volta aggiunte le code, coinciderebbe con quello relativo a M', ma potrebbe risultare invertito, come illustrato nell'esempio che segue.
  653. 'supponiamo di avere 2 durate di pioggia d e d' con d>d', discretizzate con con M e M' passi temporali, con lo stesso dt!.
  654. '                                                                                                                    La routine genera questi A e B
  655. '                                                                                                                  | ------------------------------
  656. 'M'  mm/ora          A      | M   mm/ora          B                            A       B                           | A       B
  657. ' 1  92.975          07.279 |  1  92.975          06.852 -->2° nuovo valore    /       06.852 -->2° nuovo valore   | /       06.852 -->2° nuovo valore
  658. ' 2  34.558          07.610 |  2  34.558          07.128                       07.279  07.128 |                    | 07.279  07.279 |
  659. ' 3  25.898          07.987 |  3  25.898          07.439                       07.610  07.439 |                    | 07.610  07.610 |
  660. ' 4  21.505          08.423 |  4  21.505          07.792                       07.987  07.792 |                    | 07.987  07.987 |
  661. ' 5  18.735          08.934 |  5  18.735          08.197                       08.423  08.197 |                    | 08.423  08.423 |
  662. ' 6  16.788          09.544 |  6  16.788          08.668                       08.934  08.668 |                    | 08.934  08.934 |
  663. ' 7  15.324          10.290 |  7  15.324          09.225                       09.544  09.225 |                    | 09.544  09.544 |
  664. ' 8  14.174          11.229 |  8  14.174          09.897                       10.290  09.897 |                    | 10.290  10.290 |
  665. ' 9  13.239          12.460 |  9  13.239          10.730                       11.229  10.730 |                    | 11.229  11.229 |
  666. '10  12.460          14.174 | 10  12.460          11.799                       12.460  11.799 |                    | 12.460  12.460 |
  667. '11  11.799          16.788 | 11  11.799          13.239                       14.174  13.239 |                    | 14.174  14.174 |
  668. '12  11.229 CHICAGO  21.505 | 12  11.229 CHICAGO  15.324 confrontando A con B  16.788  15.324 |                    | 16.788  16.788 |
  669. '13  10.730 -------> 34.558 | 13  10.730 -------> 18.735 --------------------> 21.505  18.735 |                    | 21.505  21.505 |
  670. '14  10.290          92.975 | 14  10.290          25.898  si nota i valori di  34.558  25.898 |                    | 34.558  34.558 | i valori di B non sono invertiti rispetto ad A.
  671. '15  09.897          25.898 | 15  09.897          92.975  B sono invertiti     92.975  92.975 |                    | 92.975  92.975 |
  672. '16  09.544          18.735 | 16  09.544          34.558  rispetto ad A.       25.898  34.558 |                    | 25.898  25.898 |
  673. '17  09.225          15.324 | 17  09.225          21.505                       18.735  21.505 |                    | 18.735  18.735 |
  674. '18  08.934          13.239 | 18  08.934          16.788                       15.324  16.788 |                    | 15.324  15.324 |
  675. '19  08.668          11.799 | 19  08.668          14.174                       13.239  14.174 |                    | 13.239  13.239 |
  676. '20  08.423          10.730 | 20  08.423          12.460                       11.799  12.460 |                    | 11.799  11.799 |
  677. '21  08.197          09.897 | 21  08.197          11.229                       10.730  11.229 |                    | 10.730  10.730 |
  678. '22  07.987          09.225 | 22  07.987          10.290                       09.897  10.290 |                    | 09.897  09.897 |
  679. '23  07.792          08.668 | 23  07.792          09.544                       09.225  09.544 |                    | 09.225  09.225 |
  680. '24  07.610          08.197 | 24  07.610          08.934                       08.668  08.934 |                    | 08.668  08.668 |
  681. '25  07.439          07.792 | 25  07.439          08.423                       08.197  08.423 |                    | 08.197  08.197 |
  682. '26  07.279          07.439 | 26  07.279          07.987                       07.792  07.987 |                    | 07.792  07.792 |
  683. '27  07.128          07.128 | 27  07.128          07.610                       07.439  07.610 |                    | 07.439  07.439 |
  684. '                             28  06.986          07.279                       07.128  07.279 |                    | 07.128  07.128 |
  685. '                             29  06.852          06.986 -->3° nuovo valore    /       06.986 -->3° nuovo valore   | /       06.986 -->3° nuovo valore
  686. '                             30  06.724          06.724 -->1° nuovo valore    /       06.724 -->1° nuovo valore   | /       06.724 -->1° nuovo valore
  687. 'l'eventuale inversione va evitata, in quanto si creerebbero delle piccole discrepanze che provocano il fatto che alcune portate di picco risultino localmente poco inferiori alla portata di picco dell'iterazione precedente,
  688. 'quando il trend generale è di aumento delle portate di picco all'aumentare della durata della pioggia. quindi per esempio l'iterazione z%%=1 corrisponde a d=1tc! con passo temporale dt'. l'iterazione z%%=2 corrisponde a d=2tc!
  689. 'con passo temporale dt''. l'iterazione z%%=3 corrisponde a d=3tc! con passo temporale dt'''. l'iterazione z%%=4 corrisponde a d=4tc! con passo temporale dt'', che è lo stesso dell'iterazione z%%=2 con d=2tc!. quindi lo ietogramma
  690. 'Chicago per d=4tc! è dato dallo stesso ietogramma che sia ha per d=2tc!, con l'aggiunta, ai suoi estremi, dei nuovi valori. il meccanismo si ripete per z%%=5, che corrisponde a d=5tc! con passo temporale dt''', che è lo stesso
  691. 'dell'iterazione z%%=3 con d=3tc!. in questo modo si fa l'ipotesi che, all'aumentare della durata della pioggia, discretizzata con uno stesso passo temporale dt! usato precedentemente per un'altra pioggia di durata inferiore,
  692. 'lo ietogramma contenga a sua volta il precedente con il medesimo dt!. in tal modo, se si consiera per esempio d=4tc!, si assume che l'altezza di pioggia corrispondente a 4tc!, coincida, per un tempo pari a 2tc!, con lo ietogramma
  693. 'relativo a d=2tc! e che l'altezza di pioggia rimamente sia dovuta ai nuovi valori.
  694. 'cioè determina infine una sorta di scatola cinese, in quanto gli ietogrammi Chicago calcolati "interamente", cioè quelli relativi ad un nuovo dt!, sono solo 5 su 24: quelli corrispondenti alla prima volta che vengono usati
  695. 'i coefficienti C=0.1,0.2,0.3,0.5,1, rispettivamente per durate della pioggia pari a N=1,2,3,9,17 volte tc!.
  696. 'invece, per esempio, per N=16, z%%=16 (numero di idrogramma in corso di calcolo), C=0.5. Ma C=0.5 anche per N=9,10,11,12,13,14,15 e z%%=9,10,11,12,13,14,15. quindi lo ietogramma Chicago relativo all'idrogramma di calcolo z%%=16
  697. 'contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=15, che a sua volta contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=14, che a sua volta contiene i propri nuovi valori aggiunti
  698. 'alle code e quello relativo a z%%=13 che a sua volta contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=12, che a sua volta contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=11, che a
  699. 'sua volta contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=10, che a sua volta contiene i propri nuovi valori aggiunti alle code e quello relativo a z%%=9.
  700. 'vedasi anche i fogli di calcolo Excel con estensione CSV, dei risultati.
  701.  
  702. DIM test~`
  703.  
  704. n%% = 1
  705.     IF z%% = 1 THEN test~` = 0: EXIT DO
  706.     IF dt!(z%%) = dt!(z%% - n%%) THEN test~` = 1: EXIT DO
  707.     IF n%% = z%% - 1 THEN test~` = 0: EXIT DO
  708.     n%% = n%% + 1
  709. p%% = PassiFinePioggia1a24%%(z%%)
  710. i% = 0
  711.     matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%) - i%, 1).i2 = matrice1(ieto%%, z%%, p%%, 1).i1
  712.     p%% = p%% - 1
  713.     IF test~` = 0 THEN IF p%% = 0 THEN EXIT DO
  714.     IF test~` = 1 THEN IF p%% = PassiFinePioggia1a24%%(z%% - n%%) THEN EXIT DO
  715.     matrice1(ieto%%, z%%, i% + 1, 1).i2 = matrice1(ieto%%, z%%, p%%, 1).i1
  716.     p%% = p%% - 1
  717.     i% = i% + 1
  718.     IF test~` = 0 THEN IF p%% = 0 THEN EXIT DO
  719.     IF test~` = 1 THEN IF p%% = PassiFinePioggia1a24%%(z%% - n%%) THEN EXIT DO
  720. IF test~` = 1 THEN
  721.     IF matrice1(ieto%%, z%%, i%, 1).i2 = 0 THEN i% = i% - 1
  722.     p%% = 1
  723.     DO
  724.         i% = i% + 1
  725.         matrice1(ieto%%, z%%, i%, 1).i2 = matrice1(ieto%%, z%% - n%%, p%%, 1).i2
  726.         p%% = p%% + 1
  727.     LOOP UNTIL p%% > PassiFinePioggia1a24%%(z%% - n%%)
  728. '--------------------------------------------------------------------------------------------------------------------------------------------------
  729. '--------------------------------------------------------------------------------------------------------------------------------------------------
  730. DisegnaMatriciIeto1e2:
  731. 'routine che crea, per lo ieto%% in corso di calcolo, le 24 immagini relative a ciascun idrogramma di calcolo.
  732. 'la routine procede nel seguente modo:
  733. '- con detinazione MatriciIeto1e2(ieto%%, z%%), scrive nella metà a destra i dati;
  734. '- con destinazione quadro&, disegna l'idrogramma con relativo ietogramma;
  735. '- incolla con _PUTIMAGE quadro& nel quadrante alto della metà sinistra di MatriciIeto1e2(ieto%%, z%%);
  736. '- con destinazione quadro&, disegna gli idrogrammi unitari del bacino.
  737. '- incolla con _PUTIMAGE quadro& nel quadrante basso della metà sinistra di MatriciIeto1e2(ieto%%, z%%).
  738. 'MatriciIeto1e2(ieto%%, z%%) dunque nella metà a sinistra riporterà l'idrogramma e gli idrogrammi unitari e a destra i dati.
  739.  
  740. DIM istoX!
  741.  
  742. posizione% = _WIDTH(MatriciIeto1e2(1, 1)) \ 8 - 94
  743. _DEST MatriciIeto1e2(ieto%%, z%%)
  744. LINE (0, 0)-(_WIDTH(MatriciIeto1e2(ieto%%, z%%)) - 1, _HEIGHT(MatriciIeto1e2(ieto%%, z%%)) - 1), R&, B
  745. LOCATE 2, posizione%
  746. COLOR bianco&: PRINT "Legenda: ";
  747. COLOR G&: PRINT "[Idrogramma]";
  748. COLOR R&: PRINT "[Pioggia effettiva]";
  749. COLOR B&: PRINT "[Pioggia efficace]"
  750. IF H% \ 16 >= 55 THEN
  751.     i% = 1: n%% = 1
  752.     i% = 2: n%% = 2
  753. LOCATE , posizione%
  754. FOR i% = i% TO 50 STEP n%%
  755.     CALL Tabella(i%, n%%,0, "-", bianco&, "ore", bianco&, "ore:min", G&, "mc/sec", R&, "mm", B&, "mm", bianco&, "mm/ora", 0, "", 2 ^ 4, 1, bianco&, i%, grigio&, matrice1(ieto%%, z%%, i%, 1).mdt,_
  756.     grigio&, matrice1(ieto%%, z%%, i%, 1).mdt,grigio&, idrogrammi1a24(ieto%%, z%%, i%, 1).portata, grigio&, matrice1(ieto%%, z%%, i%, 1).DH, grigio&, matrice1(ieto%%, z%%, i%, 1).Dhe, grigio&, matrice1(ieto%%, z%%, i%, 1).i2)
  757.     LOCATE CSRLIN - 1, FineColonna%(7): PRINT "³"
  758. NEXT i%
  759. LOCATE , posizione%: COLOR bianco&: PRINT "Sommano:";
  760. LOCATE , FineColonna%(4) + 1: COLOR R&: PRINT _TRIM$(STR$(Arrotonda!(matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).H2)));
  761. LOCATE , FineColonna%(5) + 1: COLOR B&: PRINT _TRIM$(STR$(Arrotonda!(matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).he)))
  762. LOCATE , posizione%: COLOR bianco&: PRINT "Media:";
  763. LOCATE , FineColonna%(6) + 1: PRINT _TRIM$(STR$(Arrotonda!(matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).H2 / matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).mdt)))
  764. CALL Dati(2 ^ 3 + 2 ^ 2 + 2 ^ 1 + 2 ^ 0, posizione% + 55)
  765. CALL DisegnaAssi("ore", "mc/s(idrogramma) - mm(ietogramma<--ordinate non in scala)", MinimiMatriciQuadrante1(ieto%%, z%%, 1).ore, MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata, quadro&, R&, bianco&, bianco&, bianco&)
  766. istoX! = matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).mdt / PassiFinePioggia1a24%%(z%%)
  767. SELECT CASE ieto%%
  768.     CASE IS = 1
  769.         CALL ScalaOrigine(1, 1, MinimiMatriciQuadrante1(ieto%%, z%%, 1).ore, matrice1(ieto%%, 1, 1, 1).i1 * dt!(z%%), quadro&)
  770.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).DH), R&, BF
  771.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).DH), bianco&, B
  772.         i% = 2
  773.         DO UNTIL matrice1(ieto%%, z%%, i%, 1).DH = 0
  774.             LINE (dx! + (i% - 1) * istoX!, dy!)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).DH), R&, BF
  775.             LINE (dx! + (i% - 1) * istoX!, dy!)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).DH), bianco&, B
  776.             i% = i% + 1
  777.         LOOP
  778.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).Dhe), B&, BF
  779.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).Dhe), bianco&, B
  780.         i% = 2
  781.         DO
  782.             IF matrice1(ieto%%, z%%, i%, 1).Dhe = 0 THEN
  783.                 IF matrice1(ieto%%, z%%, i% - 1, 1).Dhe > 0 THEN EXIT DO
  784.             END IF
  785.             LINE (dx! + (i% - 1) * istoX!, dy!)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).Dhe), B&, BF
  786.             LINE (dx! + (i% - 1) * istoX!, dy!)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).Dhe), bianco&, B
  787.             i% = i% + 1
  788.         LOOP
  789.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).DH), giallo&
  790.         i% = 2
  791.         DO UNTIL matrice1(ieto%%, z%%, i% + 1, 1).DH = 0
  792.             LINE (dx! + (i% - 1) * istoX!, dy! + matrice1(ieto%%, z%%, i% - 1, 1).DH)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).DH), giallo&
  793.             i% = i% + 1
  794.         LOOP
  795.         LINE -(dx! + i% * istoX!, dy!), giallo&
  796.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).Dhe), giallo&
  797.         i% = 2
  798.         DO UNTIL i% = PassiFinePioggia1a24%%(z%%)
  799.             LINE (dx! + (i% - 1) * istoX!, dy! + matrice1(ieto%%, z%%, i% - 1, 1).Dhe)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).Dhe), giallo&
  800.             i% = i% + 1
  801.         LOOP
  802.         LINE -(dx! + i% * istoX!, dy!), giallo&
  803.         n%% = 0
  804.         DO
  805.             n%% = n%% + 1
  806.             IF matrice1(ieto%%, z%%, 1, 1).i1 * dt!(z%%) = matrice1(ieto%%, z%%, n%%, 1).DH THEN EXIT DO
  807.         LOOP
  808.         CALL DisegnaValore(matrice1(ieto%%, z%%, n%%, 1).mdt, matrice1(ieto%%, z%%, n%%, 1).DH, trasparente&, trasparente, bianco&)
  809.     CASE IS = 2
  810.         LINE (dx!, dy!)-(dx! + istoX! * PassiFinePioggia1a24%%(z%%), dy! + matrice1(ieto%%, z%%, 1, 1).DH), R&, BF
  811.         LINE (dx!, dy!)-(dx! + istoX! * PassiFinePioggia1a24%%(z%%), dy! + matrice1(ieto%%, z%%, 1, 1).DH), bianco&, B
  812.         LINE (dx!, dy!)-(dx! + istoX!, dy! + matrice1(ieto%%, z%%, 1, 1).Dhe), bianco&
  813.         i% = 2
  814.         DO
  815.             LINE (dx! + (i% - 1) * istoX!, dy! + matrice1(ieto%%, z%%, i% - 1, 1).Dhe)-(dx! + i% * istoX!, dy! + matrice1(ieto%%, z%%, i%, 1).Dhe), bianco&
  816.             IF i% = PassiFinePioggia1a24%%(z%%) THEN EXIT DO
  817.             i% = i% + 1
  818.         LOOP
  819.         PAINT (0.7 * dx! + i% * istoX!, 0.7 * dy! + matrice1(ieto%%, z%%, i%, 1).Dhe), B&, bianco&
  820. IF ieto%% = 1 THEN CALL ScalaOrigine(1, 1, MinimiMatriciQuadrante1(ieto%%, z%%, 1).ore, MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata, quadro&)
  821. FOR i% = 1 TO MinimiMatriciQuadrante1(ieto%%, z%%, 1).i
  822.     CIRCLE (dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), PMAP(3, 2), G&
  823.     PAINT (dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore - PMAP(2.5, 2), dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), G&
  824.     IF i% = 1 THEN
  825.         LINE (dx!, dy!)-(dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), G&
  826.     ELSE
  827.         LINE (dx! + idrogrammi1a24(ieto%%, z%%, i% - 1, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i% - 1, 1).portata)-(dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), G&
  828.     END IF
  829. NEXT i%
  830. CALL DisegnaValore(MassimiIdrogrammi1a24(ieto%%, z%%, 1).ore, MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata, G&, G&, bianco&)
  831. CALL DisegnaValore(FinePioggiaIdrogrammi1a24(ieto%%, z%%, 1).ore, FinePioggiaIdrogrammi1a24(ieto%%, z%%, 1).portata, grigio&, grigio&, bianco&)
  832. COLOR bianco: _PRINTSTRING (_WIDTH(quadro&) - 33 * 8, 4), "Legenda:"
  833. COLOR grigio&: _PRINTSTRING (_WIDTH(quadro&) - 24 * 8, 4), "[Termine della pioggia]"
  834. _PUTIMAGE (0, 0)-(_WIDTH(quadro&), _HEIGHT(quadro&)), quadro&, MatriciIeto1e2(ieto%%, z%%)
  835. CALL DisegnaAssi("ore", "mc/(s * mm)", MinimiMatriciQuadrante2(1, 1, 1).ore, MassimiQuadrante2(1, 1, 1).portata, quadro&, R&, bianco&, bianco&, bianco&)
  836. CALL DisegnaValore(MassimiQuadrante2(ieto%%, z%%, 1).ore, MassimiQuadrante2(ieto%%, z%%, 1).portata, azzurro&, G&, bianco&)
  837. FOR i% = 1 TO 50
  838.     CIRCLE (dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), PMAP(3, 2), pastello&
  839.     PAINT (dx! + matrice1(1, 1, i%, 1).mdt - PMAP(2.5, 2), dy! + matrice1(1, 1, i%, 1).qm), pastello&
  840.     IF i% = 1 THEN
  841.         LINE (dx!, dy!)-(dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), pastello&, , 65280
  842.     ELSE
  843.         LINE (dx! + matrice1(1, 1, i% - 1, 1).mdt, dy! + matrice1(1, 1, i% - 1, 1).qm)-(dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), pastello&, , 65280
  844.     END IF
  845. NEXT i%
  846. FOR i% = 1 TO MinimiMatriciQuadrante2(ieto%%, z%%, 1).i
  847.     CIRCLE (dx! + matrice1(ieto%%, z%%, i%, 1).mdt, dy! + matrice1(ieto%%, z%%, i%, 1).qm), PMAP(3, 2), azzurro&
  848.     IF i% = 1 THEN
  849.         LINE (dx!, dy!)-(dx! + matrice1(ieto%%, z%%, i%, 1).mdt, dy! + matrice1(ieto%%, z%%, i%, 1).qm), azzurro&
  850.     ELSE
  851.         LINE (dx! + matrice1(ieto%%, z%%, i% - 1, 1).mdt, dy! + matrice1(ieto%%, z%%, i% - 1, 1).qm)-(dx! + matrice1(ieto%%, z%%, i%, 1).mdt, dy! + matrice1(ieto%%, z%%, i%, 1).qm), azzurro&
  852.     END IF
  853. NEXT i%
  854. LOCATE 2, _WIDTH(quadro&) \ 8 - 35: PRINT "Legenda:"
  855. LOCATE 4, _WIDTH(quadro&) \ 8 - 35: COLOR azzurro&: PRINT "[Idrogramma  unitario  del bacino"
  856. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "con la discretizzazione temporale"
  857. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "dt = "; _TRIM$(STR$(Arrotonda!(dt!(z%%)))); " ore = "; _TRIM$(STR$(INT(dt!(z%%)))); " ore e "; _TRIM$(STR$(CINT(60 * (dt!(z%%) - INT(dt!(z%%)))))); " minuti]"
  858. LOCATE 8, _WIDTH(quadro&) \ 8 - 35: COLOR pastello&: PRINT "[Idrogramma  unitario  del bacino"
  859. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "con la discretizzazione temporale"
  860. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "dt = "; _TRIM$(STR$(Arrotonda!(dt!(1)))); " ore = "; _TRIM$(STR$(INT(dt!(1)))); " ore e "; _TRIM$(STR$(CINT(60 * (dt!(1) - INT(dt!(1)))))); " minuti]"
  861. _PUTIMAGE (0, _HEIGHT(MatriciIeto1e2(ieto%%, z%%)) \ 2)-(_WIDTH(quadro&), _HEIGHT(MatriciIeto1e2(ieto%%, z%%)) - 1), quadro&, MatriciIeto1e2(ieto%%, z%%)
  862. '--------------------------------------------------------------------------------------------------------------------------------------------------
  863. '--------------------------------------------------------------------------------------------------------------------------------------------------
  864. DisegnaComplessivoIeto1e2:
  865. 'routine che, per lo ieto%% in corso di calcolo:
  866. '- con destinazione ComplessivoIeto1e2(ieto%%).composizione, scrive nella metà a destra i dati;
  867. '- con destinazione ComplessivoIeto1e2(ieto%%).grafico, disegna i 24 idrogrammi di calcolo;
  868. '- incolla con _PUTIMAGE ComplessivoIeto1e2(ieto%%).grafico, a sinistra, su ComplessivoIeto1e2(ieto%%).composizione.
  869. 'ComplessivoIeto1e2(ieto%%).composizione dunque riporterà a sinistra il grafico dei 24 idrogrammi e a destra i dati.
  870.  
  871. DIM colore&
  872.  
  873. posizione% = _WIDTH(ComplessivoIeto1e2(1).composizione) \ 8 - 45
  874. _DEST ComplessivoIeto1e2(ieto%%).composizione
  875. LOCATE 2, posizione%: PRINT "T U T T I   G L I   I D R O G R A M M I"
  876. CALL Dati(2 ^ 3, posizione%)
  877. VIEW PRINT _HEIGHT(ComplessivoIeto1e2(ieto%%).composizione) \ 16 - 26 TO _HEIGHT(ComplessivoIeto1e2(ieto%%).composizione) \ 16
  878. LOCATE , posizione%: COLOR bianco&: PRINT "Legenda: ";
  879. COLOR giallo&: PRINT "[Picchi]";
  880. COLOR G&: PRINT "[Durata della pioggia]"
  881. LOCATE , posizione%
  882. FOR z%% = 1 TO 24
  883.         CALL Tabella(z%%,1,0, "-", giallo&, "ore", giallo&, "ore:min", giallo&, "mc/sec", G&, "ore:min", G&, "ore/tc", 0, "", 0, "",2 ^ 4 + 2 ^ 2, 1, bianco&, z%%, giallo&, MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).ore, giallo&,_
  884.         MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).ore, giallo&,MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).portata, grigio&, FinePioggiaIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).ore, grigio&,_
  885.         CoefficientiDiscretizzazioneTemporale(z%%).N, 0, 0)
  886. NEXT z%%
  887. LINE (0, 0)-(_WIDTH(ComplessivoIeto1e2(ieto%%).composizione) - 1, _HEIGHT(ComplessivoIeto1e2(ieto%%).composizione) - 1), R&, B 'disegna il margine rosso.
  888. CALL DisegnaAssi("ore", "mc/s", idrogrammi1a24(ieto%%, 24, 50, 1).ore, MassimiAssolutiIeto(ieto%%).portata, ComplessivoIeto1e2(ieto%%).grafico, R&, bianco&, bianco&, bianco&)
  889. FOR z%% = 1 TO 24
  890.     SELECT CASE z%% MOD 3
  891.         CASE IS = 1
  892.             colore& = R&
  893.         CASE IS = 2
  894.             colore& = G&
  895.         CASE IS = 0
  896.             colore& = B&
  897.     END SELECT
  898.     FOR i% = 1 TO 50
  899.         IF i% = 1 THEN
  900.             LINE (dx!, dy!)-(dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), colore&
  901.         ELSE
  902.             LINE (dx! + idrogrammi1a24(ieto%%, z%%, i% - 1, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i% - 1, 1).portata)-(dx! + idrogrammi1a24(ieto%%, z%%, i%, 1).ore, dy! + idrogrammi1a24(ieto%%, z%%, i%, 1).portata), colore&
  903.         END IF
  904.     NEXT i%
  905. NEXT z%%
  906. CALL DisegnaValore(MassimiAssolutiIeto(ieto%%).ore, MassimiAssolutiIeto(ieto%%).portata, azzurro&, azzurro&, bianco&)
  907. CALL DisegnaLinea(ieto%%, ComplessivoIeto1e2(ieto%%).grafico, giallo&, bianco&)
  908. _PUTIMAGE (0, 0), ComplessivoIeto1e2(ieto%%).grafico, ComplessivoIeto1e2(ieto%%).composizione
  909. OriginaleGrafico& = _COPYIMAGE(ComplessivoIeto1e2(VisualizzaIeto%%).grafico)
  910. '--------------------------------------------------------------------------------------------------------------------------------------------------
  911. '--------------------------------------------------------------------------------------------------------------------------------------------------
  912. DisegnaUnitari:
  913. 'routine che disegna l'idrogramma unitario adimensionale di Mockus e l'idrogramma unitario del bacino idrografico.
  914. 'la routine procede nel seguente modo:
  915. '- con detinazione unitari&, scrive nella metà a destra i dati;
  916. '- con destinazione quadro&, disegna l'idrogramma unitario adimensionale di Mockus;
  917. '- incolla con _PUTIMAGE quadro& nel quadrante alto della metà sinistra di unitari&;
  918. '- con destinazione quadro&, disegna l'idrogramma unitario del bacino idrografico;
  919. '- incolla con _PUTIMAGE quadro& nel quadrante basso della metà sinistra di unitari&.
  920. 'unitari& dunque nella metà a sinistra riporterà gli idrogrammi unitari e a destra i dati.
  921.  
  922. posizione% = _WIDTH(unitari&) \ 8 - 94
  923. _DEST unitari&
  924. LOCATE 2, posizione%
  925. COLOR bianco&: PRINT "Legenda: ";
  926. COLOR giallo&: PRINT "[Idrogramma unitario adimensionale di Mockus]";
  927. COLOR G&: PRINT "[Idrogramma unitario del bacino]";
  928. IF H% \ 16 >= 55 THEN
  929.     i% = 1: n%% = 1
  930.     i% = 2: n%% = 2
  931. LOCATE , posizione%
  932. FOR i% = i% TO 50 STEP n%%
  933.     CALL Tabella(i%, n%%,0, "-", giallo&, "t/ta", giallo&, "q/qp", G&, "ore", G&, "mc/s*mm", 0, "", 0, "", 0, "", 0, 1, bianco&, i%, grigio&, mockus(i%).tSUta, grigio&, mockus(i%).qSUqp, grigio&, matrice1(1, 1, i%, 1).mdt, grigio&,_
  934.     matrice1(1, 1, i%, 1).qm, 0, 0, 0, 0)
  935. NEXT i%
  936. COLOR bianco&: LOCATE 4,
  937. CALL Dati(0, posizione% + 40)
  938. COLOR grigio&
  939. LOCATE 15, posizione% + 40: PRINT "La determinazione dell'idrogramma unitario di"
  940. LOCATE 17, posizione% + 40: PRINT "un bacino  di note  caratteristiche  consiste"
  941. LOCATE 19, posizione% + 40: PRINT "nell'amplificare l'ascissa e l'ordinata dello"
  942. LOCATE 21, posizione% + 40: PRINT "idrogramma unitario  adimensionale di  Mockus"
  943. LOCATE 23, posizione% + 40: PRINT "mediante  i  fattori  ta e  qp, specifici del"
  944. LOCATE 25, posizione% + 40: PRINT "bacino  esaminato. Il calcolo dell'idrogramma"
  945. LOCATE 27, posizione% + 40: PRINT "di piena presuppone poi che gli incrementi di"
  946. LOCATE 29, posizione% + 40: PRINT "deflusso siano utilizzati  per a mplificare i"
  947. LOCATE 31, posizione% + 40: PRINT "valori   dell' idrogramma  unitario  e  siano"
  948. LOCATE 33, posizione% + 40: PRINT "sommati a parit… d'istante."
  949. LINE (0, 0)-(_WIDTH(unitari&) - 1, _HEIGHT(unitari&) - 1), R&, B
  950. CALL DisegnaAssi("t/ta", "q/qp", 5, 1, quadro&, R&, bianco&, bianco&, bianco&)
  951. FOR i% = 1 TO UBOUND(mockus)
  952.     CIRCLE (dx! + mockus(i%).tSUta, dy! + mockus(i%).qSUqp), PMAP(3, 2), giallo&
  953.     PAINT (dx! + mockus(i%).tSUta - PMAP(2.5, 2), dy! + mockus(i%).qSUqp), giallo&
  954.     IF i% = 1 THEN
  955.         LINE (dx!, dy!)-(dx! + mockus(i%).tSUta, dy! + mockus(i%).qSUqp), giallo&
  956.     ELSE
  957.         LINE (dx! + mockus(i% - 1).tSUta, dy! + mockus(i% - 1).qSUqp)-(dx! + mockus(i%).tSUta, dy! + mockus(i%).qSUqp), giallo&
  958.     END IF
  959. NEXT i%
  960. _PUTIMAGE (0, 0)-(_WIDTH(quadro&), _HEIGHT(quadro&)), quadro&, unitari&
  961. CALL DisegnaAssi("ore", "mc/(s * mm)", matrice1(1, 1, 50, 1).mdt, MassimiQuadrante2(1, 1, 1).portata, quadro&, R&, bianco&, bianco&, bianco&)
  962. CALL DisegnaValore(MassimiQuadrante2(1, 1, 1).ore, MassimiQuadrante2(1, 1, 1).portata, azzurro&, azzurro&, bianco&)
  963. FOR i% = 1 TO 50
  964.     CIRCLE (dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), PMAP(3, 2), G&
  965.     PAINT (dx! + matrice1(1, 1, i%, 1).mdt - PMAP(2.5, 2), dy! + matrice1(1, 1, i%, 1).qm), G&
  966.  
  967.     IF i% = 1 THEN
  968.         LINE (dx!, dy!)-(dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), G&
  969.     ELSE
  970.         LINE (dx! + matrice1(1, 1, i% - 1, 1).mdt, dy! + matrice1(1, 1, i% - 1, 1).qm)-(dx! + matrice1(1, 1, i%, 1).mdt, dy! + matrice1(1, 1, i%, 1).qm), G&
  971.     END IF
  972. NEXT i%
  973. LOCATE 2, _WIDTH(quadro&) \ 8 - 35: PRINT "Idrogramma  unitario  del  bacino"
  974. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "con la discretizzazione temporale"; ""
  975. LOCATE , _WIDTH(quadro&) \ 8 - 35: PRINT "dt = "; _TRIM$(STR$(Arrotonda!(dt!(1)))); " ore = "; _TRIM$(STR$(INT(dt!(1)))); " ore e "; _TRIM$(STR$(CINT(60 * (dt!(1) - INT(dt!(1)))))); " minuti."
  976. _PUTIMAGE (0, _HEIGHT(unitari&) \ 2)-(_WIDTH(quadro&), _HEIGHT(unitari&) - 1), quadro&, unitari&
  977. '--------------------------------------------------------------------------------------------------------------------------------------------------
  978. '--------------------------------------------------------------------------------------------------------------------------------------------------
  979. VisualizzaComplessivo:
  980. 'routine che visualizza sullo schermo i 24 idrogrammi di calcolo relativi al tipo di ietogramma scelto e disegnati dalla routine DisegnaComplessivoIeto1e2. dopo questa routine, viene chiamata la subroutine CalcolaIdrogramma.
  981.  
  982. _DEST shermo&
  983. CLS 2
  984. ComplessivoIeto1e2(VisualizzaIeto%%).grafico = _COPYIMAGE(OriginaleGrafico&)
  985. _PUTIMAGE (0, 0), ComplessivoIeto1e2(VisualizzaIeto%%).grafico, ComplessivoIeto1e2(VisualizzaIeto%%).composizione
  986. _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(ComplessivoIeto1e2(VisualizzaIeto%%).composizione)), (DESKTOPHEIGHT% - _HEIGHT(ComplessivoIeto1e2(VisualizzaIeto%%).composizione) - 16)), ComplessivoIeto1e2(VisualizzaIeto%%).composizione, schermo&
  987. '--------------------------------------------------------------------------------------------------------------------------------------------------
  988. '--------------------------------------------------------------------------------------------------------------------------------------------------
  989. DisegnaIdrogramma:
  990. 'routine che viene attivata appena dopo la subroutine CalcolaIdrogramma e che utilizza i risultati da essa generati. in base al tipo di ietogramma scelto, cioè in base a VisualizzaIeto%%, viene disegnato l'idrogramma di progetto
  991. 'e, nel caso l'utente l'abbia voluto, anche l'idrogramma corrispondente all'ora di picco scelta.
  992. '- con destinazione idrogramma1e2(n%%).composizione, scrive nella metà a destra i dati;
  993. '- con destinazione idrogramma1e2(n%%).grafico, disegna l'idrogramma di progetto (o corrispondente all'ora di picco scelta);
  994. '- incolla con _PUTIMAGE idrogramma1e2(n%%).grafico, a sinistra, su idrogramma1e2(n%%).composizione.
  995. 'idrogramma1e2(n%%).composizione dunque riporterà a sinistra il grafico dell'idrogramma di progetto (o corrispondente all'ora di picco scelta) e a destra i dati.
  996.  
  997. FOR n%% = 1 TO 2
  998.     IF n%% = 1 THEN posizione% = _WIDTH(idrogramma1e2(n%%).composizione) \ 8 - 56
  999.     IF n%% = 2 THEN IF ore!(n%%) = 0 THEN EXIT FOR
  1000.     _DEST idrogramma1e2(n%%).composizione
  1001.     CLS
  1002.     IF n%% = 1 THEN
  1003.         LOCATE 2, posizione%: PRINT "I D R O G R A M M A   D I   P R O G E T T O"
  1004.     ELSEIF n%% = 2 THEN
  1005.         LOCATE 2, posizione%: PRINT "IDROGRAMMA CORRISPONDENTE ALL'ORA DI PICCO SCELTA"
  1006.     END IF
  1007.     CALL Dati(2 ^ 3, posizione%)
  1008.     VIEW PRINT _HEIGHT(idrogramma1e2(n%%).composizione) \ 16 - 26 TO _HEIGHT(idrogramma1e2(n%%).composizione) \ 16
  1009.     LOCATE , posizione%
  1010.     SELECT CASE n%%
  1011.         CASE IS = 1
  1012.             FOR i% = 1 TO 25
  1013.                 CALL Tabella(i%, 1,0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 2 ^ 4, 1, bianco%, i%, grigio&, idrogramma1(i%).ore, grigio&,_
  1014.                 idrogramma1(i%).ore, grigio&, idrogramma1(i%).portata, 0, 0, 0, 0, 0, 0)
  1015.                 LOCATE CSRLIN - 1, FineColonna%(4): PRINT "³"
  1016.             NEXT i%
  1017.             LOCATE _HEIGHT(idrogramma1e2(n%%).composizione) \ 16 - 26 + 1,
  1018.             FOR i% = 26 TO UBOUND(idrogramma1)
  1019.                 CALL Tabella(i%, 1,0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 2 ^ 4, 5, bianco%, i%, grigio&, idrogramma1(i%).ore, grigio&,_
  1020.                 idrogramma1(i%).ore, grigio&, idrogramma1(i%).portata, 0, 0, 0, 0, 0, 0)
  1021.             NEXT i%
  1022.         CASE IS = 2
  1023.             FOR i% = 1 TO 25
  1024.                 CALL Tabella(i%, 1,0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 2 ^ 4, 1, bianco%, i%, grigio&, idrogramma2(i%).ore, grigio&,_
  1025.                 idrogramma2(i%).ore, grigio&, idrogramma2(i%).portata, 0, 0, 0, 0, 0, 0)
  1026.                 LOCATE CSRLIN - 1, FineColonna%(4): PRINT "³"
  1027.             NEXT i%
  1028.             LOCATE _HEIGHT(idrogramma1e2(n%%).composizione) \ 16 - 26 + 1,
  1029.             FOR i% = 26 TO UBOUND(idrogramma2)
  1030.                 CALL Tabella(i%, 1,0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 0, "-", bianco&, "ore", bianco&, "ore:min", bianco&, "mc/sec", 2 ^ 4, 5, bianco%, i%, grigio&, idrogramma2(i%).ore, grigio&,_
  1031.                 idrogramma2(i%).ore, grigio&, idrogramma2(i%).portata, 0, 0, 0, 0, 0, 0)
  1032.             NEXT i%
  1033.     END SELECT
  1034.     VIEW PRINT
  1035.     LINE (0, 0)-(_WIDTH(idrogramma1e2(n%%).composizione) - 1, _HEIGHT(idrogramma1e2(n%%).composizione) - 1), R&, B
  1036. NEXT n%%
  1037. CALL DisegnaAssi("ore", "mc/s", IdroPixel1(UBOUND(IdroPixel1)).ore, portata!(1), idrogramma1e2(1).grafico, R&, bianco&, bianco&, bianco&)
  1038. CALL DisegnaValore(ore!(1), portata!(1), azzurro&, azzurro&, bianco&)
  1039. LOCATE 2, _WIDTH(idrogramma1e2(1).grafico) \ 8 - 25: COLOR bianco&: PRINT "Legenda: "
  1040. LOCATE 4, _WIDTH(idrogramma1e2(1).grafico) \ 8 - 25: COLOR B&: PRINT "[Termine della pioggia]"
  1041. n%% = 0
  1042. GOSUB idro1
  1043. _SOURCE idrogramma1e2(1).grafico
  1044. IF FinePioggiaIdrogrammi1e2(1).ore = FinePioggiaIdrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), 1).ore THEN
  1045.     FinePioggiaIdrogrammi1e2(1).portata = FinePioggiaIdrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), 1).portata
  1046.     y% = PMAP(dy!, 1)
  1047.     DO
  1048.         IF POINT(dx! + FinePioggiaIdrogrammi1e2(1).ore, PMAP(y%, 3)) = giallo& THEN EXIT DO
  1049.         y% = y% - 1
  1050.     LOOP
  1051.     FinePioggiaIdrogrammi1e2(1).portata = PMAP(y%, 3) - dy!
  1052. CALL DisegnaValore(FinePioggiaIdrogrammi1e2(1).ore, FinePioggiaIdrogrammi1e2(1).portata, B&, B&, bianco&)
  1053. idro1:
  1054. n%% = n%% + 1
  1055. FOR i% = 1 TO UBOUND(idrogramma1)
  1056.     CIRCLE (dx! + idrogramma1(i%).ore, dy! + idrogramma1(i%).portata), PMAP(3, 2), G&
  1057.     PAINT (dx! + idrogramma1(i%).ore - PMAP(2.5, 2), dy! + idrogramma1(i%).portata), G&
  1058. NEXT i%
  1059. FOR i% = 1 TO UBOUND(IdroPixel1)
  1060.     IF i% = 1 THEN
  1061.         LINE (dx!, dy!)-(dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), giallo&
  1062.     ELSE
  1063.         LINE (dx! + IdroPixel1(i% - 1).ore, dy! + IdroPixel1(i% - 1).portata)-(dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), giallo&
  1064.     END IF
  1065. NEXT i%
  1066. IF n%% = 1 THEN RETURN
  1067. _PUTIMAGE (0, 0), idrogramma1e2(1).grafico, idrogramma1e2(1).composizione
  1068. IF ore!(2) = 0 THEN RETURN
  1069. CALL DisegnaAssi("ore", "mc/s", IdroPixel2(UBOUND(IdroPixel2)).ore, portata!(2), idrogramma1e2(2).grafico, R&, bianco&, bianco&, bianco&)
  1070. CALL DisegnaValore(ore!(2), portata!(2), azzurro&, azzurro&, bianco&)
  1071. LOCATE 2, _WIDTH(idrogramma1e2(1).grafico) \ 8 - 25: COLOR bianco&: PRINT "Legenda: "
  1072. LOCATE 4, _WIDTH(idrogramma1e2(1).grafico) \ 8 - 25: COLOR B&: PRINT "[Termine della pioggia]"
  1073. GOSUB idro2
  1074. _SOURCE idrogramma1e2(2).grafico
  1075. y% = PMAP(dy!, 1)
  1076.     IF POINT(dx! + FinePioggiaIdrogrammi1e2(2).ore, PMAP(y%, 3)) = giallo& THEN EXIT DO
  1077.     y% = y% - 1
  1078. FinePioggiaIdrogrammi1e2(2).portata = PMAP(y%, 3) - dy!
  1079. CALL DisegnaValore(FinePioggiaIdrogrammi1e2(2).ore, FinePioggiaIdrogrammi1e2(2).portata, B&, B&, bianco&)
  1080. idro2:
  1081. FOR i% = 1 TO UBOUND(idrogramma1)
  1082.     CIRCLE (dx! + idrogramma2(i%).ore, dy! + idrogramma2(i%).portata), PMAP(3, 2), G&
  1083.     PAINT (dx! + idrogramma2(i%).ore - PMAP(2.5, 2), dy! + idrogramma2(i%).portata), G&
  1084. NEXT i%
  1085. FOR i% = 1 TO UBOUND(IdroPixel2)
  1086.     IF i% = 1 THEN
  1087.         LINE (dx!, dy!)-(dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), giallo&
  1088.     ELSE
  1089.         LINE (dx! + IdroPixel2(i% - 1).ore, dy! + IdroPixel2(i% - 1).portata)-(dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), giallo&
  1090.     END IF
  1091. NEXT i%
  1092. _PUTIMAGE (0, 0), idrogramma1e2(2).grafico, idrogramma1e2(2).composizione
  1093. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1094. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1095. VisualizzaIdrogramma:
  1096. 'routine che visulizza su schermo gli idrogrammi disegnati dalla routine DisegnaIdrogramma.
  1097. 'viene chiesto inoltre all'utente se vuole trovare, sull'idrogramma, una portata corrispondente ad un'ora a scelta.
  1098.  
  1099. _DEST schermo&: CLS 2
  1100. COLOR giallo&: PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; [F2]: ripristina il grafico; []: visualizza l'idrogramma di progetto.": COLOR bianco&
  1101.     _LIMIT 30
  1102.     KeyPress$ = INKEY$
  1103. LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(60) OR KeyPress$ = CHR$(0) + CHR$(77)
  1104. SELECT CASE KeyPress$
  1105.     CASE CHR$(27)
  1106.         esc~` = 1
  1107.     CASE CHR$(9)
  1108.         riavvio~` = 1
  1109.     CASE CHR$(0) + CHR$(59)
  1110.         menu~` = 1
  1111.     CASE CHR$(0) + CHR$(60)
  1112.         TornaAlGrafico~` = 1
  1113. IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN RETURN
  1114. tipo%% = 3
  1115. _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(idrogramma1e2(1).composizione)), (DESKTOPHEIGHT% - _HEIGHT(idrogramma1e2(1).composizione) - 16)), idrogramma1e2(1).composizione, schermo&
  1116. CALL DisegnaPortata(idrogramma1(UBOUND(idrogramma1)).ore, idrogramma1e2(1).grafico, idrogramma1e2(1).composizione)
  1117. IF portata!(1) = MassimiIdrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), 1).portata THEN
  1118.     IF ore!(1) = MassimiIdrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), 1).ore THEN
  1119.         CLS 2
  1120.         COLOR giallo&
  1121.         PRINT "- Poich‚ l'idrogramma di progetto coincide con uno dei 24 calcolati, Š possibile visualizzarne i dettagli. Visualizzare? [S/N]"
  1122.         PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; [F2]: torna al grafico iniziale."
  1123.         COLOR bianco&
  1124.         DO
  1125.             _LIMIT 30
  1126.             KeyPress$ = LCASE$(INKEY$)
  1127.         LOOP UNTIL KeyPress$ = "s" OR KeyPress$ = "n" OR KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(60)
  1128.         SELECT CASE KeyPress$
  1129.             CASE "s"
  1130.                 _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(MatriciIeto1e2(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%)))), (DESKTOPHEIGHT% - _HEIGHT(MatriciIeto1e2(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%))) - 16)), MatriciIeto1e2(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%)), schermo&
  1131.             CASE CHR$(27)
  1132.                 esc~` = 1
  1133.             CASE CHR$(9)
  1134.                 riavvio~` = 1
  1135.             CASE CHR$(0) + CHR$(59)
  1136.                 menu~` = 1
  1137.             CASE CHR$(0) + CHR$(60)
  1138.                 TornaAlGrafico~` = 1
  1139.         END SELECT
  1140.         IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN RETURN
  1141.     END IF
  1142. IF ore!(2) = 0 THEN RETURN
  1143. _DEST schermo&: CLS 2
  1144. COLOR giallo&: PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; [F2]: torna al grafico iniziale; []: visualizza l'idrogramma corrispondente all'ora scelta.": COLOR bianco&
  1145.     _LIMIT 30
  1146.     KeyPress$ = INKEY$
  1147. LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(60) OR KeyPress$ = CHR$(0) + CHR$(77)
  1148. SELECT CASE KeyPress$
  1149.     CASE CHR$(27)
  1150.         esc~` = 1
  1151.     CASE CHR$(9)
  1152.         riavvio~` = 1
  1153.     CASE CHR$(0) + CHR$(59)
  1154.         menu~` = 1
  1155.     CASE CHR$(0) + CHR$(60)
  1156.         TornaAlGrafico~` = 1
  1157. IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN RETURN
  1158. CLS 2
  1159. _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(idrogramma1e2(2).composizione)), (DESKTOPHEIGHT% - _HEIGHT(idrogramma1e2(2).composizione) - 16)), idrogramma1e2(2).composizione, schermo&
  1160. CALL DisegnaPortata(idrogramma2(UBOUND(idrogramma2)).ore, idrogramma1e2(2).grafico, idrogramma1e2(2).composizione) 'viene chiesto all'utente se desidera trovare, sull'idrogramma, la portata corrispondente ad un'ora a scelta.
  1161. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1162. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1163. VisualizzaUnitari:
  1164. 'routine che visualizza l'idrogramma unitario adimensionale di Mockus e l'idrogramma unitario del bacino idrografico disegnati dalla routine DisegnaUnitari.
  1165.  
  1166. CLS 2
  1167. COLOR giallo&
  1168. PRINT "Visualizza l'idrogramma unitario adimesionale di Mockus e l'idrogramma unitario del bacino? [S/N]"
  1169. PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; [F2]: torna al grafico iniziale."
  1170. COLOR bianco&
  1171.     _LIMIT 30
  1172.     KeyPress$ = LCASE$(INKEY$)
  1173. LOOP UNTIL KeyPress$ = "s" OR KeyPress$ = "n" OR KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(60)
  1174. SELECT CASE KeyPress$
  1175.     CASE CHR$(27)
  1176.         esc~` = 1
  1177.     CASE CHR$(9)
  1178.         riavvio~` = 1
  1179.     CASE CHR$(0) + CHR$(59)
  1180.         menu~` = 1
  1181.     CASE CHR$(0) + CHR$(60)
  1182.         TornaAlGrafico~` = 1
  1183. IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 OR TornaAlGrafico~` = 1 THEN RETURN
  1184. _DEST schermo&: CLS
  1185. _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(unitari&)), (DESKTOPHEIGHT% - _HEIGHT(unitari&) - 16)), unitari&, schermo&
  1186. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1187. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1188. VisualizzaMatrici:
  1189. 'routine che visualizza le immagini generate dalla routine DisegnaMatriciIeto1e2.
  1190.  
  1191. CLS 2
  1192. COLOR giallo&
  1193. PRINT "Visualizza i singoli idrogrammi calcolati? [S/(ESC o N)]"
  1194. PRINT "[ESC/N]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; [F2]: torna al grafico iniziale."
  1195. COLOR bianco&
  1196.     _LIMIT 30
  1197.     KeyPress$ = LCASE$(INKEY$)
  1198. LOOP UNTIL KeyPress$ = "s" OR KeyPress$ = "n" OR KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(60)
  1199. SELECT CASE KeyPress$
  1200.     CASE CHR$(27), "n"
  1201.         esc~` = 1
  1202.     CASE CHR$(9)
  1203.         riavvio~` = 1
  1204.     CASE CHR$(0) + CHR$(59)
  1205.         menu~` = 1
  1206. IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 = 1 THEN RETURN
  1207. z%% = 1
  1208.     CLS 2
  1209.     COLOR giallo&
  1210.     IF z%% <> 24 THEN
  1211.         PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; []: precedente; []: successivo."
  1212.     ELSE
  1213.         PRINT "................................ T E R M I N E   D E L   P R O G R A M M A ............................................"
  1214.         PRINT "[ESC]: esci; [TAB]: riavvia; [F1]: torna agli input iniziali; []: precedente."
  1215.         PRINT "..."
  1216.     END IF
  1217.     _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(MatriciIeto1e2(VisualizzaIeto%%, z%%))), (DESKTOPHEIGHT% - _HEIGHT(MatriciIeto1e2(VisualizzaIeto%%, z%%)) - 16)), MatriciIeto1e2(VisualizzaIeto%%, z%%), schermo&
  1218.     DO
  1219.         _LIMIT 30
  1220.         KeyPress$ = INKEY$
  1221.     LOOP UNTIL KeyPress$ = CHR$(27) OR KeyPress$ = CHR$(9) OR KeyPress$ = CHR$(0) + CHR$(59) OR KeyPress$ = CHR$(0) + CHR$(75) OR KeyPress$ = CHR$(0) + CHR$(77)
  1222.     SELECT CASE KeyPress$
  1223.         CASE CHR$(27)
  1224.             esc~` = 1
  1225.         CASE CHR$(9)
  1226.             riavvio~` = 1
  1227.         CASE CHR$(0) + CHR$(59)
  1228.             menu~` = 1
  1229.         CASE CHR$(0) + CHR$(75)
  1230.             IF z%% = 1 THEN
  1231.                 z%% = z%% - 1
  1232.             ELSE
  1233.                 z%% = z%% - 2
  1234.             END IF
  1235.         CASE CHR$(0) + CHR$(77)
  1236.             IF z%% = 24 THEN z%% = z%% - 1
  1237.     END SELECT
  1238.     IF esc~` = 1 OR riavvio~` = 1 OR menu~` = 1 THEN EXIT DO
  1239.     z%% = z%% + 1
  1240. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1241. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1242. Risultati:
  1243. 'questa routine si attiva quando l'utente decide di uscire e salvare i risultati. essa genera 3 tipi di risultati, ognuno con un diverso tipo di estensione:
  1244. '- un file TXT: contenente questo Codice, in modo che l'utente, se vuole, possa verificare il metodo di calcolo, commentato;
  1245. '- file CSV: in cui sono riportati i tabulati di calcolo e che possono essere aperti con Excel. Affinché siano visualizzabili correttamente, nelle impostazioni di Windows il separatore di elenco dev'essere la virgola;
  1246. '- file BMP: in cui sono riportati i grafici generati dal programma;
  1247. 'i file BMP sono generati solo se espressamente richiesto dall'utente quando esce dal programma, in quanto il loro salvataggio richiede tempo.
  1248. 'durante il salvataggio, il programma, su Windows, apre automaticamente la directory in cui i file vengono salvati.
  1249. 'tutti i file sono generati con nomi che permettono, su Windows, la loro elencazione in sequenza secondo un criterio logico facilmente comprensibile.
  1250. 'i file CSV e BMP, secondo tale criterio logico, compaiono in coppia con identici nomi, in quanto il file BMP è la versione grafica del corrispondente tabulato CSV e viceversa.
  1251.  
  1252. DIM testo$
  1253.  
  1254. testo$ = "Nelle impostazioni di Windows il separatore dell'elenco dev'essere la virgola."
  1255. 'COLOR trasparente&: PRINT WriteCodiceData$("CODICE.bas.txt");: COLOR bianco&
  1256. IF VisualizzaIeto%% = 1 THEN
  1257.     OPEN "A.IdrogrammaProgettoCHICAGO+PortataPiccoProgetto.csv" FOR OUTPUT AS #1
  1258.     OPEN "B.IdrogrammaSceltoCHICAGO+PortataOraPiccoScelta.csv" FOR OUTPUT AS #2
  1259. ELSEIF VisualizzaIeto%% = 2 THEN
  1260.     OPEN "A.IdrogrammaProgettoCOSTANTE+PortataPiccoProgetto.csv" FOR OUTPUT AS #1
  1261.     OPEN "B.IdrogrammaSceltoCOSTANTE+PortataOraPiccoScelta.csv" FOR OUTPUT AS #2
  1262. IF ore!(1) <> 0 THEN
  1263.     WRITE #1, testo$
  1264.     n%% = 1: GOSUB DatiBase
  1265.     WRITE #1,
  1266.     SELECT CASE VisualizzaIeto%%
  1267.         CASE IS = 1
  1268.             IF soglia%% = 0 THEN
  1269.                 WRITE #1, "La soglia percentuale S scelta non permette di individuare all'interno del campo la corrispondente portata di picco. Verrà considerato come idrogramma di progetto quello relativo alla portata di picco massima tra i 24 calcolati."
  1270.             ELSE
  1271.                 PRINT #1, "S="; _TRIM$(STR$(soglia%%)); "%: Soglia percentuale scelta."
  1272.                 PRINT #1, "La soglia percentuale S scelta corrisponde all'ora di picco "; _TRIM$(STR$(ore!(1))); ". Ciò significa che la portata di picco che si avrebbe all'ora "; _TRIM$(STR$(ore!(1) + 1)); " sarebbe minore della portata di picco dell'ora"; ore(1); " aumentata del "; _TRIM$(STR$(soglia%%)); "%."
  1273.             END IF
  1274.         CASE IS = 2
  1275.             WRITE #1, "E' computato come idrogramma di progetto quello relativo alla portata di picco massima tra i 24 calcolati."
  1276.     END SELECT
  1277.     WRITE #1,
  1278.     PRINT #1, "LA PORTATA DI PICCO DI PROGETTO E' "; _TRIM$(STR$(portata!(1))); " MC/S ALL'ORA "; _TRIM$(STR$(ore!(1))); " CON TEMPO DI RITORNO "; UCASE$(T$); " CON DURATA DELLA PIOGGIA PARI A "; _TRIM$(STR$(FinePioggiaIdrogrammi1e2(1).ore)); " ORE."
  1279.     WRITE #1,
  1280.     WRITE #1, "IDROGRAMMA DI PROGETTO:"
  1281.     WRITE #1, "", "ore", "portata [mc/s]"
  1282.     FOR i% = 1 TO UBOUND(idrogramma1)
  1283.         WRITE #1, i%, idrogramma1(i%).ore, idrogramma1(i%).portata
  1284.     NEXT i%
  1285.     PRINT #1, "Non è stato definito dall'utente."
  1286. IF ore!(2) <> 0 THEN
  1287.     WRITE #2, testo$
  1288.     n%% = 2: GOSUB DatiBase
  1289.     WRITE #2,
  1290.     PRINT #2, "L'ORA DI PICCO SCELTA E' "; _TRIM$(STR$(ore!(2))); " A CUI CORRISPONDE LA PORTATA DI PICCO "; _TRIM$(STR$(portata!(2))); " MC/S CON TEMPO DI RITORNO "; UCASE$(T$); " CON DURATA DELLA PIOGGIA PARI A "; _TRIM$(STR$(FinePioggiaIdrogrammi1e2(2).ore)); " ORE."
  1291.     WRITE #2,
  1292.     PRINT #2, "IDROGRAMMA:"
  1293.     WRITE #2, "", "ore", "portata [mc/s]"
  1294.     FOR i% = 1 TO UBOUND(idrogramma2)
  1295.         WRITE #2, i%, idrogramma2(i%).ore, idrogramma2(i%).portata
  1296.     NEXT i%
  1297.     PRINT #2, "Non è stato definito dall'utente."
  1298. OPEN "C.IdrogrammiUnitari.csv" FOR OUTPUT AS #1
  1299. WRITE #1, testo$
  1300. n%% = 1: GOSUB DatiBase
  1301. WRITE #1, "La determinazione dell'idrogramma unitario di un bacino di note caratteristiche consiste nell'amplificare l'ascissa e l'ordinata dell'idrogramma unitario adimensionale di Mockus mediante i fattori ta e qp, specifici del bacino esaminato. Il calcolo dell'idrogramma di piena presuppone poi che gli incrementi di deflusso siano utilizzati per amplificare i valori dell'idrogramma unitario e siano sommati a parit… d'istante."
  1302. WRITE #1, "", "IDROGRAMMA UNITARIO ADIMENSIONALE DI MOCKUS:", "", "IDROGRAMMA UNITARIO DEL BACINO:"
  1303. WRITE #1, "", "t/ta", "q/qp", "ore", "mc/s*mm"
  1304. FOR i% = 1 TO 50
  1305.     WRITE #1, i%, mockus(i%).tSUta, mockus(i%).qSUqp, matrice1(1, 1, i%, 1).mdt, matrice1(1, 1, i%, 1).qm
  1306. NEXT i%
  1307. FOR ieto%% = 1 TO 2
  1308.     IF ieto%% = 1 THEN OPEN "D._1-24,idrogrammiCHICAGO+PortatePicco(da_1_a_32_volte_tc).csv" FOR OUTPUT AS #1
  1309.     IF ieto%% = 2 THEN OPEN "E._1-24,idrogrammiCOSTANTE+PortatePicco(da_1_a_32_volte_tc).csv" FOR OUTPUT AS #1
  1310.     WRITE #1, testo$
  1311.     n%% = 1: GOSUB DatiBase
  1312.     WRITE #1, "Di seguito sono riportate le portate di picco dei 24 idrogrammi calcolati e i relativi idrogrammi."
  1313.     WRITE #1, "Valori espressi in mc/s. Per i dati completi sui singoli idrogrammi, fare riferimento ai rispettivi file."
  1314.     WRITE #1, "PORTATE DI PICCO:"
  1315.     WRITE #1, "", "ora picco", "portata picco", "ora fine pioggia", "ore/tc"
  1316.     FOR z%% = 1 TO 24
  1317.         WRITE #1, z%%, MassimiIdrogrammi1a24(ieto%%, z%%, 1).ore, MassimiIdrogrammi1a24(ieto%%, z%%, 1).portata, FinePioggiaIdrogrammi1a24(ieto%%, z%%, 1).ore, CoefficientiDiscretizzazioneTemporale(z%%).N
  1318.     NEXT z%%
  1319.     WRITE #1, "IDROGRAMMI:"
  1320.     WRITE #1, "",
  1321.     FOR z%% = 1 TO 24
  1322.         WRITE #1, "", _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)) + " volte tc",
  1323.     NEXT z%%
  1324.     WRITE #1,
  1325.     WRITE #1, "",
  1326.     FOR z%% = 1 TO 24
  1327.         WRITE #1, "ore", "idrogramma n." + _TRIM$(STR$(z%%)),
  1328.     NEXT z%%
  1329.     WRITE #1,
  1330.     FOR i% = 1 TO 50
  1331.         WRITE #1, i%,
  1332.         FOR z%% = 1 TO 24
  1333.             WRITE #1, idrogrammi1a24(ieto%%, z%%, i%, 1).ore, idrogrammi1a24(ieto%%, z%%, i%, 1).portata,
  1334.         NEXT z%%
  1335.         WRITE #1,
  1336.     NEXT i%
  1337.     CLOSE #1
  1338.     FOR z%% = 1 TO 24
  1339.         IF ieto%% = 1 THEN OPEN "D." + _TRIM$(STR$(z%%)) + ",idrogrammaCHICAGO(" + _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)) + "_volte_tc).csv" FOR OUTPUT AS #1
  1340.         IF ieto%% = 2 THEN OPEN "E." + _TRIM$(STR$(z%%)) + ",idrogrammaCOSTANTE(" + _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)) + "_volte_tc).csv" FOR OUTPUT AS #1
  1341.         WRITE #1, testo$
  1342.         WRITE #1, "DATI", "", "", "", "", "", "", "", "", "LEGENDA"
  1343.         WRITE #1, "T=", "[anni]", T$, "tempo di ritorno", "", "", "", "", "", "P=", "[-]", "numero dell'iterazione."
  1344.         WRITE #1, "A=", "mq", A2&, "area del bacino idrografico", "", "", "", "", "", "P*dt=", "[ore]", "numero dell'iterazione moltiplicato per il passo temporale."
  1345.         WRITE #1, "K=", "[-]", k!, "parametro del Centro Funzionale", "", "", "", "", "", "h=", "[mm]", "altezza di pioggia secondo la curva di possibilità climatica."
  1346.         WRITE #1, "a=", "[mm/d^n]", a1!, "coefficiente della curva di possibilità climatica.", "", "", "", "", "", "i=", "[mm/ora]", "intensità di piggia della singola iterazione."
  1347.         WRITE #1, "n=", "[-]", n1!, "coefficiente della curva di possibilità climatica.", "", "", "", "", "", "iC=", "[mm/ora]", "intensità di pioggia della singola iterazione secondo lo ietogramma CHICAGO o costante."
  1348.         WRITE #1, "L=", "[m]", L~%, "lunghezza dell'asta principale del bacino idrografico.", "", "", "", "", "", "DH=", "[mm]", "altezza di pioggia della singola iterazione."
  1349.         WRITE #1, "s=", "[%]", s1!, "pendenza media del bacino idrografico.", "", "", "", "", "", "H=", "[mm]", "altezza di pioggia cumulata sino all'iterazione in corso."
  1350.         WRITE #1, "CN(II)=", "[-]", CNII%%, "", "", "", "", "", "", "he=", "[mm]", "pioggia efficace cumulata sino all'iterazione in corso."
  1351.         WRITE #1, "S=", "[mm]", "=25.4*((1000/C13)-10)", "contenuto idrico massimo del terreno.", "", "", "", "", "", "Dhe=", "[mm]", "altezza di pioggia efficace della singola iterazione."
  1352.         WRITE #1, "Ia=", "[mm]", "=0.1*C11", "perdite iniziali.", "", "", "", "", "", "t/ta=", "[-]", "valori in ascissa dell'idrogramma unitario adimensionale di Mockus."
  1353.         WRITE #1, "CN(III)=", "[-]", "=(23*C10)/(10+0.13*C10)", "", "", "", "", "", "", "q/qp=", "[-]", "valori in ordinata dell'idrogramma unitario adimensionale di Mockus."
  1354.         WRITE #1, "tl=", "[ore]", "=0.342*(((C8/1000)^0.8)/(C9^0.5))*(1000/C13-9)^0.7", "formula di Mockus esprimente il tempo di ritardo.", "", "", "", "", "", "tm/ta=", "[-]", "valori in ascissa dell'idrogramma unitario adimensionale di Mockus secondo il passo temporale dt utilizzato."
  1355.         WRITE #1, "tc=", "[ore]", "=C14/0.6", "tempo di corrivazione.", "", "", "", "", "", "qm/qp=", "[-]", "valori in ordinata dell'idrogramma unitario adimensionale di Mockus secondo il passo temporale dt utilizzato."
  1356.         WRITE #1, "N", "[-]", CoefficientiDiscretizzazioneTemporale(z%%).N, "moltiplicatore del tempo di corrivazione.", "", "", "", "", "", "qm=", "[mc/(s*mm)]", "valore dell'idrogramma unitario del bacino corrispondente alla colonna N*dt."
  1357.         WRITE #1, "d=ore/tc=", "[ore]", "=C16*C15", "durata della pioggia.", "", "", "", "", "", "Dhe*qm1-50=", "[mc/s]", "idrogramma relativo alla singole altezze di pioggia Dhe", " amplificata dal rispettivo valore qm."
  1358.         WRITE #1, "dt=", "[ore]", "=C21*C19", "passo temporale.", "", "", "", "", "", "Idrogramma=", "[mc/s]", "idrogramma complessivo, dato dalla somma a parità d'istante dei Dhe*qm1-50."
  1359.         WRITE #1, "ta=", "[ore]", "=C14/0.9", "tempo di picco."
  1360.         WRITE #1, "qp=", "[mc/(s*mm)]", "=0.208*((C4/1000000)/C19)", "portata al colmo dell'idrogramma unitario del bacino idrografico."
  1361.         WRITE #1, "C=", "[-]", CoefficientiDiscretizzazioneTemporale(z%%).tSUta, "coefficiente t/ta di Mockus utilizzato per la discretizzazione temporale."
  1362.         GOSUB DatiColonna
  1363.         WRITE #1, "1", "=A23*$C$18", "=SE(ARROTONDA(B23,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B23^$C$7,0)", "=SE(C23>0,C23/B23,0)", matrice1(ieto%%, z%%, 1, 1).i2, "=E23*$C$18", "=SE(C23>0,F23,0)", "=SE(G23-$C$12>=0,((G23-$C$12)^2)/(G23-$C$12+$C$11),0)", "=SE(C23>0,H23,0)", mockus(1).tSUta, mockus(1).qSUqp, matrice1(ieto%%, z%%, 1, 1).tmSUta, matrice1(ieto%%, z%%, 1, 1).qmSUqp, "=M23*$C$20", "=I23*$N$23", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O23:BL23)"
  1364.         WRITE #1, "2", "=A24*$C$18", "=SE(ARROTONDA(B24,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B24^$C$7,0)", "=SE(C24>0,(C24-C23)/$C$18,0)", matrice1(ieto%%, z%%, 2, 1).i2, "=E24*$C$18", "=SE(C24>0,G23+F24,0)", "=SE(G24-$C$12>=0,((G24-$C$12)^2)/(G24-$C$12+$C$11),0)", "=SE(C24>0,H24-H23,0)", mockus(2).tSUta, mockus(2).qSUqp, matrice1(ieto%%, z%%, 2, 1).tmSUta, matrice1(ieto%%, z%%, 2, 1).qmSUqp, "=M24*$C$20", "=I24*$N$23", "=I23*$N$24", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O24:BL24)"
  1365.         WRITE #1, "3", "=A25*$C$18", "=SE(ARROTONDA(B25,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B25^$C$7,0)", "=SE(C25>0,(C25-C24)/$C$18,0)", matrice1(ieto%%, z%%, 3, 1).i2, "=E25*$C$18", "=SE(C25>0,G24+F25,0)", "=SE(G25-$C$12>=0,((G25-$C$12)^2)/(G25-$C$12+$C$11),0)", "=SE(C25>0,H25-H24,0)", mockus(3).tSUta, mockus(3).qSUqp, matrice1(ieto%%, z%%, 3, 1).tmSUta, matrice1(ieto%%, z%%, 3, 1).qmSUqp, "=M25*$C$20", "=I25*$N$23", "=I24*$N$24", "=$I23*$N$25", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O25:BL25)"
  1366.         WRITE #1, "4", "=A26*$C$18", "=SE(ARROTONDA(B26,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B26^$C$7,0)", "=SE(C26>0,(C26-C25)/$C$18,0)", matrice1(ieto%%, z%%, 4, 1).i2, "=E26*$C$18", "=SE(C26>0,G25+F26,0)", "=SE(G26-$C$12>=0,((G26-$C$12)^2)/(G26-$C$12+$C$11),0)", "=SE(C26>0,H26-H25,0)", mockus(4).tSUta, mockus(4).qSUqp, matrice1(ieto%%, z%%, 4, 1).tmSUta, matrice1(ieto%%, z%%, 4, 1).qmSUqp, "=M26*$C$20", "=I26*$N$23", "=I25*$N$24", "=$I24*$N$25", "=$I23*$N$26", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O26:BL26)"
  1367.         WRITE #1, "5", "=A27*$C$18", "=SE(ARROTONDA(B27,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B27^$C$7,0)", "=SE(C27>0,(C27-C26)/$C$18,0)", matrice1(ieto%%, z%%, 5, 1).i2, "=E27*$C$18", "=SE(C27>0,G26+F27,0)", "=SE(G27-$C$12>=0,((G27-$C$12)^2)/(G27-$C$12+$C$11),0)", "=SE(C27>0,H27-H26,0)", mockus(5).tSUta, mockus(5).qSUqp, matrice1(ieto%%, z%%, 5, 1).tmSUta, matrice1(ieto%%, z%%, 5, 1).qmSUqp, "=M27*$C$20", "=I27*$N$23", "=I26*$N$24", "=$I25*$N$25", "=$I24*$N$26", "=$I23*$N$27", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O27:BL27)"
  1368.         WRITE #1, "6", "=A28*$C$18", "=SE(ARROTONDA(B28,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B28^$C$7,0)", "=SE(C28>0,(C28-C27)/$C$18,0)", matrice1(ieto%%, z%%, 6, 1).i2, "=E28*$C$18", "=SE(C28>0,G27+F28,0)", "=SE(G28-$C$12>=0,((G28-$C$12)^2)/(G28-$C$12+$C$11),0)", "=SE(C28>0,H28-H27,0)", mockus(6).tSUta, mockus(6).qSUqp, matrice1(ieto%%, z%%, 6, 1).tmSUta, matrice1(ieto%%, z%%, 6, 1).qmSUqp, "=M28*$C$20", "=I28*$N$23", "=I27*$N$24", "=$I26*$N$25", "=$I25*$N$26", "=$I24*$N$27", "=$I23*$N$28", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O28:BL28)"
  1369.         WRITE #1, "7", "=A29*$C$18", "=SE(ARROTONDA(B29,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B29^$C$7,0)", "=SE(C29>0,(C29-C28)/$C$18,0)", matrice1(ieto%%, z%%, 7, 1).i2, "=E29*$C$18", "=SE(C29>0,G28+F29,0)", "=SE(G29-$C$12>=0,((G29-$C$12)^2)/(G29-$C$12+$C$11),0)", "=SE(C29>0,H29-H28,0)", mockus(7).tSUta, mockus(7).qSUqp, matrice1(ieto%%, z%%, 7, 1).tmSUta, matrice1(ieto%%, z%%, 7, 1).qmSUqp, "=M29*$C$20", "=I29*$N$23", "=I28*$N$24", "=$I27*$N$25", "=$I26*$N$26", "=$I25*$N$27", "=$I24*$N$28", "=$I23*$N$29", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O29:BL29)"
  1370.         WRITE #1, "8", "=A30*$C$18", "=SE(ARROTONDA(B30,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B30^$C$7,0)", "=SE(C30>0,(C30-C29)/$C$18,0)", matrice1(ieto%%, z%%, 8, 1).i2, "=E30*$C$18", "=SE(C30>0,G29+F30,0)", "=SE(G30-$C$12>=0,((G30-$C$12)^2)/(G30-$C$12+$C$11),0)", "=SE(C30>0,H30-H29,0)", mockus(8).tSUta, mockus(8).qSUqp, matrice1(ieto%%, z%%, 8, 1).tmSUta, matrice1(ieto%%, z%%, 8, 1).qmSUqp, "=M30*$C$20", "=I30*$N$23", "=I29*$N$24", "=$I28*$N$25", "=$I27*$N$26", "=$I26*$N$27", "=$I25*$N$28", "=$I24*$N$29", "=$I23*$N$30", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O30:BL30)"
  1371.         WRITE #1, "9", "=A31*$C$18", "=SE(ARROTONDA(B31,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B31^$C$7,0)", "=SE(C31>0,(C31-C30)/$C$18,0)", matrice1(ieto%%, z%%, 9, 1).i2, "=E31*$C$18", "=SE(C31>0,G30+F31,0)", "=SE(G31-$C$12>=0,((G31-$C$12)^2)/(G31-$C$12+$C$11),0)", "=SE(C31>0,H31-H30,0)", mockus(9).tSUta, mockus(9).qSUqp, matrice1(ieto%%, z%%, 9, 1).tmSUta, matrice1(ieto%%, z%%, 9, 1).qmSUqp, "=M31*$C$20", "=I31*$N$23", "=I30*$N$24", "=$I29*$N$25", "=$I28*$N$26", "=$I27*$N$27", "=$I26*$N$28", "=$I25*$N$29", "=$I24*$N$30", "=$I23*$N$31", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O31:BL31)"
  1372.         WRITE #1, "10", "=A32*$C$18", "=SE(ARROTONDA(B32,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B32^$C$7,0)", "=SE(C32>0,(C32-C31)/$C$18,0)", matrice1(ieto%%, z%%, 10, 1).i2, "=E32*$C$18", "=SE(C32>0,G31+F32,0)", "=SE(G32-$C$12>=0,((G32-$C$12)^2)/(G32-$C$12+$C$11),0)", "=SE(C32>0,H32-H31,0)", mockus(10).tSUta, mockus(10).qSUqp, matrice1(ieto%%, z%%, 10, 1).tmSUta, matrice1(ieto%%, z%%, 10, 1).qmSUqp, "=M32*$C$20", "=I32*$N$23", "=I31*$N$24", "=$I30*$N$25", "=$I29*$N$26", "=$I28*$N$27", "=$I27*$N$28", "=$I26*$N$29", "=$I25*$N$30", "=$I24*$N$31", "=$I23*$N$32", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O32:BL32)"
  1373.         WRITE #1, "11", "=A33*$C$18", "=SE(ARROTONDA(B33,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B33^$C$7,0)", "=SE(C33>0,(C33-C32)/$C$18,0)", matrice1(ieto%%, z%%, 11, 1).i2, "=E33*$C$18", "=SE(C33>0,G32+F33,0)", "=SE(G33-$C$12>=0,((G33-$C$12)^2)/(G33-$C$12+$C$11),0)", "=SE(C33>0,H33-H32,0)", mockus(11).tSUta, mockus(11).qSUqp, matrice1(ieto%%, z%%, 11, 1).tmSUta, matrice1(ieto%%, z%%, 11, 1).qmSUqp, "=M33*$C$20", "=I33*$N$23", "=I32*$N$24", "=$I31*$N$25", "=$I30*$N$26", "=$I29*$N$27", "=$I28*$N$28", "=$I27*$N$29", "=$I26*$N$30", "=$I25*$N$31", "=$I24*$N$32", "=$I23*$N$33", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O33:BL33)"
  1374.         WRITE #1, "12", "=A34*$C$18", "=SE(ARROTONDA(B34,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B34^$C$7,0)", "=SE(C34>0,(C34-C33)/$C$18,0)", matrice1(ieto%%, z%%, 12, 1).i2, "=E34*$C$18", "=SE(C34>0,G33+F34,0)", "=SE(G34-$C$12>=0,((G34-$C$12)^2)/(G34-$C$12+$C$11),0)", "=SE(C34>0,H34-H33,0)", mockus(12).tSUta, mockus(12).qSUqp, matrice1(ieto%%, z%%, 12, 1).tmSUta, matrice1(ieto%%, z%%, 12, 1).qmSUqp, "=M34*$C$20", "=I34*$N$23", "=I33*$N$24", "=$I32*$N$25", "=$I31*$N$26", "=$I30*$N$27", "=$I29*$N$28", "=$I28*$N$29", "=$I27*$N$30", "=$I26*$N$31", "=$I25*$N$32", "=$I24*$N$33", "=$I23*$N$34", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O34:BL34)"
  1375.         WRITE #1, "13", "=A35*$C$18", "=SE(ARROTONDA(B35,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B35^$C$7,0)", "=SE(C35>0,(C35-C34)/$C$18,0)", matrice1(ieto%%, z%%, 13, 1).i2, "=E35*$C$18", "=SE(C35>0,G34+F35,0)", "=SE(G35-$C$12>=0,((G35-$C$12)^2)/(G35-$C$12+$C$11),0)", "=SE(C35>0,H35-H34,0)", mockus(13).tSUta, mockus(13).qSUqp, matrice1(ieto%%, z%%, 13, 1).tmSUta, matrice1(ieto%%, z%%, 13, 1).qmSUqp, "=M35*$C$20", "=I35*$N$23", "=I34*$N$24", "=$I33*$N$25", "=$I32*$N$26", "=$I31*$N$27", "=$I30*$N$28", "=$I29*$N$29", "=$I28*$N$30", "=$I27*$N$31", "=$I26*$N$32", "=$I25*$N$33", "=$I24*$N$34", "=$I23*$N$35", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O35:BL35)"
  1376.         WRITE #1, "14", "=A36*$C$18", "=SE(ARROTONDA(B36,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B36^$C$7,0)", "=SE(C36>0,(C36-C35)/$C$18,0)", matrice1(ieto%%, z%%, 14, 1).i2, "=E36*$C$18", "=SE(C36>0,G35+F36,0)", "=SE(G36-$C$12>=0,((G36-$C$12)^2)/(G36-$C$12+$C$11),0)", "=SE(C36>0,H36-H35,0)", mockus(14).tSUta, mockus(14).qSUqp, matrice1(ieto%%, z%%, 14, 1).tmSUta, matrice1(ieto%%, z%%, 14, 1).qmSUqp, "=M36*$C$20", "=I36*$N$23", "=I35*$N$24", "=$I34*$N$25", "=$I33*$N$26", "=$I32*$N$27", "=$I31*$N$28", "=$I30*$N$29", "=$I29*$N$30", "=$I28*$N$31", "=$I27*$N$32", "=$I26*$N$33", "=$I25*$N$34", "=$I24*$N$35", "=$I23*$N$36", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O36:BL36)"
  1377.         WRITE #1, "15", "=A37*$C$18", "=SE(ARROTONDA(B37,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B37^$C$7,0)", "=SE(C37>0,(C37-C36)/$C$18,0)", matrice1(ieto%%, z%%, 15, 1).i2, "=E37*$C$18", "=SE(C37>0,G36+F37,0)", "=SE(G37-$C$12>=0,((G37-$C$12)^2)/(G37-$C$12+$C$11),0)", "=SE(C37>0,H37-H36,0)", mockus(15).tSUta, mockus(15).qSUqp, matrice1(ieto%%, z%%, 15, 1).tmSUta, matrice1(ieto%%, z%%, 15, 1).qmSUqp, "=M37*$C$20", "=I37*$N$23", "=I36*$N$24", "=$I35*$N$25", "=$I34*$N$26", "=$I33*$N$27", "=$I32*$N$28", "=$I31*$N$29", "=$I30*$N$30", "=$I29*$N$31", "=$I28*$N$32", "=$I27*$N$33", "=$I26*$N$34", "=$I25*$N$35", "=$I24*$N$36", "=$I23*$N$37", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O37:BL37)"
  1378.         WRITE #1, "16", "=A38*$C$18", "=SE(ARROTONDA(B38,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B38^$C$7,0)", "=SE(C38>0,(C38-C37)/$C$18,0)", matrice1(ieto%%, z%%, 16, 1).i2, "=E38*$C$18", "=SE(C38>0,G37+F38,0)", "=SE(G38-$C$12>=0,((G38-$C$12)^2)/(G38-$C$12+$C$11),0)", "=SE(C38>0,H38-H37,0)", mockus(16).tSUta, mockus(16).qSUqp, matrice1(ieto%%, z%%, 16, 1).tmSUta, matrice1(ieto%%, z%%, 16, 1).qmSUqp, "=M38*$C$20", "=I38*$N$23", "=I37*$N$24", "=$I36*$N$25", "=$I35*$N$26", "=$I34*$N$27", "=$I33*$N$28", "=$I32*$N$29", "=$I31*$N$30", "=$I30*$N$31", "=$I29*$N$32", "=$I28*$N$33", "=$I27*$N$34", "=$I26*$N$35", "=$I25*$N$36", "=$I24*$N$37", "=$I23*$N$38", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O38:BL38)"
  1379.         WRITE #1, "17", "=A39*$C$18", "=SE(ARROTONDA(B39,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B39^$C$7,0)", "=SE(C39>0,(C39-C38)/$C$18,0)", matrice1(ieto%%, z%%, 17, 1).i2, "=E39*$C$18", "=SE(C39>0,G38+F39,0)", "=SE(G39-$C$12>=0,((G39-$C$12)^2)/(G39-$C$12+$C$11),0)", "=SE(C39>0,H39-H38,0)", mockus(17).tSUta, mockus(17).qSUqp, matrice1(ieto%%, z%%, 17, 1).tmSUta, matrice1(ieto%%, z%%, 17, 1).qmSUqp, "=M39*$C$20", "=I39*$N$23", "=I38*$N$24", "=$I37*$N$25", "=$I36*$N$26", "=$I35*$N$27", "=$I34*$N$28", "=$I33*$N$29", "=$I32*$N$30", "=$I31*$N$31", "=$I30*$N$32", "=$I29*$N$33", "=$I28*$N$34", "=$I27*$N$35", "=$I26*$N$36", "=$I25*$N$37", "=$I24*$N$38", "=$I23*$N$39", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O39:BL39)"
  1380.         WRITE #1, "18", "=A40*$C$18", "=SE(ARROTONDA(B40,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B40^$C$7,0)", "=SE(C40>0,(C40-C39)/$C$18,0)", matrice1(ieto%%, z%%, 18, 1).i2, "=E40*$C$18", "=SE(C40>0,G39+F40,0)", "=SE(G40-$C$12>=0,((G40-$C$12)^2)/(G40-$C$12+$C$11),0)", "=SE(C40>0,H40-H39,0)", mockus(18).tSUta, mockus(18).qSUqp, matrice1(ieto%%, z%%, 18, 1).tmSUta, matrice1(ieto%%, z%%, 18, 1).qmSUqp, "=M40*$C$20", "=I40*$N$23", "=I39*$N$24", "=$I38*$N$25", "=$I37*$N$26", "=$I36*$N$27", "=$I35*$N$28", "=$I34*$N$29", "=$I33*$N$30", "=$I32*$N$31", "=$I31*$N$32", "=$I30*$N$33", "=$I29*$N$34", "=$I28*$N$35", "=$I27*$N$36", "=$I26*$N$37", "=$I25*$N$38", "=$I24*$N$39", "=$I23*$N$40", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O40:BL40)"
  1381.         WRITE #1, "19", "=A41*$C$18", "=SE(ARROTONDA(B41,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B41^$C$7,0)", "=SE(C41>0,(C41-C40)/$C$18,0)", matrice1(ieto%%, z%%, 19, 1).i2, "=E41*$C$18", "=SE(C41>0,G40+F41,0)", "=SE(G41-$C$12>=0,((G41-$C$12)^2)/(G41-$C$12+$C$11),0)", "=SE(C41>0,H41-H40,0)", mockus(19).tSUta, mockus(19).qSUqp, matrice1(ieto%%, z%%, 19, 1).tmSUta, matrice1(ieto%%, z%%, 19, 1).qmSUqp, "=M41*$C$20", "=I41*$N$23", "=I40*$N$24", "=$I39*$N$25", "=$I38*$N$26", "=$I37*$N$27", "=$I36*$N$28", "=$I35*$N$29", "=$I34*$N$30", "=$I33*$N$31", "=$I32*$N$32", "=$I31*$N$33", "=$I30*$N$34", "=$I29*$N$35", "=$I28*$N$36", "=$I27*$N$37", "=$I26*$N$38", "=$I25*$N$39", "=$I24*$N$40", "=$I23*$N$41", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O41:BL41)"
  1382.         WRITE #1, "20", "=A42*$C$18", "=SE(ARROTONDA(B42,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B42^$C$7,0)", "=SE(C42>0,(C42-C41)/$C$18,0)", matrice1(ieto%%, z%%, 20, 1).i2, "=E42*$C$18", "=SE(C42>0,G41+F42,0)", "=SE(G42-$C$12>=0,((G42-$C$12)^2)/(G42-$C$12+$C$11),0)", "=SE(C42>0,H42-H41,0)", mockus(20).tSUta, mockus(20).qSUqp, matrice1(ieto%%, z%%, 20, 1).tmSUta, matrice1(ieto%%, z%%, 20, 1).qmSUqp, "=M42*$C$20", "=I42*$N$23", "=I41*$N$24", "=$I40*$N$25", "=$I39*$N$26", "=$I38*$N$27", "=$I37*$N$28", "=$I36*$N$29", "=$I35*$N$30", "=$I34*$N$31", "=$I33*$N$32", "=$I32*$N$33", "=$I31*$N$34", "=$I30*$N$35", "=$I29*$N$36", "=$I28*$N$37", "=$I27*$N$38", "=$I26*$N$39", "=$I25*$N$40", "=$I24*$N$41", "=$I23*$N$42", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O42:BL42)"
  1383.         WRITE #1, "21", "=A43*$C$18", "=SE(ARROTONDA(B43,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B43^$C$7,0)", "=SE(C43>0,(C43-C42)/$C$18,0)", matrice1(ieto%%, z%%, 21, 1).i2, "=E43*$C$18", "=SE(C43>0,G42+F43,0)", "=SE(G43-$C$12>=0,((G43-$C$12)^2)/(G43-$C$12+$C$11),0)", "=SE(C43>0,H43-H42,0)", mockus(21).tSUta, mockus(21).qSUqp, matrice1(ieto%%, z%%, 21, 1).tmSUta, matrice1(ieto%%, z%%, 21, 1).qmSUqp, "=M43*$C$20", "=I43*$N$23", "=I42*$N$24", "=$I41*$N$25", "=$I40*$N$26", "=$I39*$N$27", "=$I38*$N$28", "=$I37*$N$29", "=$I36*$N$30", "=$I35*$N$31", "=$I34*$N$32", "=$I33*$N$33", "=$I32*$N$34", "=$I31*$N$35", "=$I30*$N$36", "=$I29*$N$37", "=$I28*$N$38", "=$I27*$N$39", "=$I26*$N$40", "=$I25*$N$41", "=$I24*$N$42", "=$I23*$N$43", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O43:BL43)"
  1384.         WRITE #1, "22", "=A44*$C$18", "=SE(ARROTONDA(B44,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B44^$C$7,0)", "=SE(C44>0,(C44-C43)/$C$18,0)", matrice1(ieto%%, z%%, 22, 1).i2, "=E44*$C$18", "=SE(C44>0,G43+F44,0)", "=SE(G44-$C$12>=0,((G44-$C$12)^2)/(G44-$C$12+$C$11),0)", "=SE(C44>0,H44-H43,0)", mockus(22).tSUta, mockus(22).qSUqp, matrice1(ieto%%, z%%, 22, 1).tmSUta, matrice1(ieto%%, z%%, 22, 1).qmSUqp, "=M44*$C$20", "=I44*$N$23", "=I43*$N$24", "=$I42*$N$25", "=$I41*$N$26", "=$I40*$N$27", "=$I39*$N$28", "=$I38*$N$29", "=$I37*$N$30", "=$I36*$N$31", "=$I35*$N$32", "=$I34*$N$33", "=$I33*$N$34", "=$I32*$N$35", "=$I31*$N$36", "=$I30*$N$37", "=$I29*$N$38", "=$I28*$N$39", "=$I27*$N$40", "=$I26*$N$41", "=$I25*$N$42", "=$I24*$N$43", "=$I23*$N$44", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O44:BL44)"
  1385.         WRITE #1, "23", "=A45*$C$18", "=SE(ARROTONDA(B45,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B45^$C$7,0)", "=SE(C45>0,(C45-C44)/$C$18,0)", matrice1(ieto%%, z%%, 23, 1).i2, "=E45*$C$18", "=SE(C45>0,G44+F45,0)", "=SE(G45-$C$12>=0,((G45-$C$12)^2)/(G45-$C$12+$C$11),0)", "=SE(C45>0,H45-H44,0)", mockus(23).tSUta, mockus(23).qSUqp, matrice1(ieto%%, z%%, 23, 1).tmSUta, matrice1(ieto%%, z%%, 23, 1).qmSUqp, "=M45*$C$20", "=I45*$N$23", "=I44*$N$24", "=$I43*$N$25", "=$I42*$N$26", "=$I41*$N$27", "=$I40*$N$28", "=$I39*$N$29", "=$I38*$N$30", "=$I37*$N$31", "=$I36*$N$32", "=$I35*$N$33", "=$I34*$N$34", "=$I33*$N$35", "=$I32*$N$36", "=$I31*$N$37", "=$I30*$N$38", "=$I29*$N$39", "=$I28*$N$40", "=$I27*$N$41", "=$I26*$N$42", "=$I25*$N$43", "=$I24*$N$44", "=$I23*$N$45", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O45:BL45)"
  1386.         WRITE #1, "24", "=A46*$C$18", "=SE(ARROTONDA(B46,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B46^$C$7,0)", "=SE(C46>0,(C46-C45)/$C$18,0)", matrice1(ieto%%, z%%, 24, 1).i2, "=E46*$C$18", "=SE(C46>0,G45+F46,0)", "=SE(G46-$C$12>=0,((G46-$C$12)^2)/(G46-$C$12+$C$11),0)", "=SE(C46>0,H46-H45,0)", mockus(24).tSUta, mockus(24).qSUqp, matrice1(ieto%%, z%%, 24, 1).tmSUta, matrice1(ieto%%, z%%, 24, 1).qmSUqp, "=M46*$C$20", "=I46*$N$23", "=I45*$N$24", "=$I44*$N$25", "=$I43*$N$26", "=$I42*$N$27", "=$I41*$N$28", "=$I40*$N$29", "=$I39*$N$30", "=$I38*$N$31", "=$I37*$N$32", "=$I36*$N$33", "=$I35*$N$34", "=$I34*$N$35", "=$I33*$N$36", "=$I32*$N$37", "=$I31*$N$38", "=$I30*$N$39", "=$I29*$N$40", "=$I28*$N$41", "=$I27*$N$42", "=$I26*$N$43", "=$I25*$N$44", "=$I24*$N$45", "=$I23*$N$46", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O46:BL46)"
  1387.         WRITE #1, "25", "=A47*$C$18", "=SE(ARROTONDA(B47,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B47^$C$7,0)", "=SE(C47>0,(C47-C46)/$C$18,0)", matrice1(ieto%%, z%%, 25, 1).i2, "=E47*$C$18", "=SE(C47>0,G46+F47,0)", "=SE(G47-$C$12>=0,((G47-$C$12)^2)/(G47-$C$12+$C$11),0)", "=SE(C47>0,H47-H46,0)", mockus(25).tSUta, mockus(25).qSUqp, matrice1(ieto%%, z%%, 25, 1).tmSUta, matrice1(ieto%%, z%%, 25, 1).qmSUqp, "=M47*$C$20", "=I47*$N$23", "=I46*$N$24", "=$I45*$N$25", "=$I44*$N$26", "=$I43*$N$27", "=$I42*$N$28", "=$I41*$N$29", "=$I40*$N$30", "=$I39*$N$31", "=$I38*$N$32", "=$I37*$N$33", "=$I36*$N$34", "=$I35*$N$35", "=$I34*$N$36", "=$I33*$N$37", "=$I32*$N$38", "=$I31*$N$39", "=$I30*$N$40", "=$I29*$N$41", "=$I28*$N$42", "=$I27*$N$43", "=$I26*$N$44", "=$I25*$N$45", "=$I24*$N$46", "=$I23*$N$47", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O47:BL47)"
  1388.         WRITE #1, "26", "=A48*$C$18", "=SE(ARROTONDA(B48,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B48^$C$7,0)", "=SE(C48>0,(C48-C47)/$C$18,0)", matrice1(ieto%%, z%%, 26, 1).i2, "=E48*$C$18", "=SE(C48>0,G47+F48,0)", "=SE(G48-$C$12>=0,((G48-$C$12)^2)/(G48-$C$12+$C$11),0)", "=SE(C48>0,H48-H47,0)", mockus(26).tSUta, mockus(26).qSUqp, matrice1(ieto%%, z%%, 26, 1).tmSUta, matrice1(ieto%%, z%%, 26, 1).qmSUqp, "=M48*$C$20", "=I48*$N$23", "=I47*$N$24", "=$I46*$N$25", "=$I45*$N$26", "=$I44*$N$27", "=$I43*$N$28", "=$I42*$N$29", "=$I41*$N$30", "=$I40*$N$31", "=$I39*$N$32", "=$I38*$N$33", "=$I37*$N$34", "=$I36*$N$35", "=$I35*$N$36", "=$I34*$N$37", "=$I33*$N$38", "=$I32*$N$39", "=$I31*$N$40", "=$I30*$N$41", "=$I29*$N$42", "=$I28*$N$43", "=$I27*$N$44", "=$I26*$N$45", "=$I25*$N$46", "=$I24*$N$47", "=$I23*$N$48", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O48:BL48)"
  1389.         WRITE #1, "27", "=A49*$C$18", "=SE(ARROTONDA(B49,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B49^$C$7,0)", "=SE(C49>0,(C49-C48)/$C$18,0)", matrice1(ieto%%, z%%, 27, 1).i2, "=E49*$C$18", "=SE(C49>0,G48+F49,0)", "=SE(G49-$C$12>=0,((G49-$C$12)^2)/(G49-$C$12+$C$11),0)", "=SE(C49>0,H49-H48,0)", mockus(27).tSUta, mockus(27).qSUqp, matrice1(ieto%%, z%%, 27, 1).tmSUta, matrice1(ieto%%, z%%, 27, 1).qmSUqp, "=M49*$C$20", "=I49*$N$23", "=I48*$N$24", "=$I47*$N$25", "=$I46*$N$26", "=$I45*$N$27", "=$I44*$N$28", "=$I43*$N$29", "=$I42*$N$30", "=$I41*$N$31", "=$I40*$N$32", "=$I39*$N$33", "=$I38*$N$34", "=$I37*$N$35", "=$I36*$N$36", "=$I35*$N$37", "=$I34*$N$38", "=$I33*$N$39", "=$I32*$N$40", "=$I31*$N$41", "=$I30*$N$42", "=$I29*$N$43", "=$I28*$N$44", "=$I27*$N$45", "=$I26*$N$46", "=$I25*$N$47", "=$I24*$N$48", "=$I23*$N$49", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O49:BL49)"
  1390.         WRITE #1, "28", "=A50*$C$18", "=SE(ARROTONDA(B50,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B50^$C$7,0)", "=SE(C50>0,(C50-C49)/$C$18,0)", matrice1(ieto%%, z%%, 28, 1).i2, "=E50*$C$18", "=SE(C50>0,G49+F50,0)", "=SE(G50-$C$12>=0,((G50-$C$12)^2)/(G50-$C$12+$C$11),0)", "=SE(C50>0,H50-H49,0)", mockus(28).tSUta, mockus(28).qSUqp, matrice1(ieto%%, z%%, 28, 1).tmSUta, matrice1(ieto%%, z%%, 28, 1).qmSUqp, "=M50*$C$20", "=I50*$N$23", "=I49*$N$24", "=$I48*$N$25", "=$I47*$N$26", "=$I46*$N$27", "=$I45*$N$28", "=$I44*$N$29", "=$I43*$N$30", "=$I42*$N$31", "=$I41*$N$32", "=$I40*$N$33", "=$I39*$N$34", "=$I38*$N$35", "=$I37*$N$36", "=$I36*$N$37", "=$I35*$N$38", "=$I34*$N$39", "=$I33*$N$40", "=$I32*$N$41", "=$I31*$N$42", "=$I30*$N$43", "=$I29*$N$44", "=$I28*$N$45", "=$I27*$N$46", "=$I26*$N$47", "=$I25*$N$48", "=$I24*$N$49", "=$I23*$N$50", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O50:BL50)"
  1391.         WRITE #1, "29", "=A51*$C$18", "=SE(ARROTONDA(B51,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B51^$C$7,0)", "=SE(C51>0,(C51-C50)/$C$18,0)", matrice1(ieto%%, z%%, 29, 1).i2, "=E51*$C$18", "=SE(C51>0,G50+F51,0)", "=SE(G51-$C$12>=0,((G51-$C$12)^2)/(G51-$C$12+$C$11),0)", "=SE(C51>0,H51-H50,0)", mockus(29).tSUta, mockus(29).qSUqp, matrice1(ieto%%, z%%, 29, 1).tmSUta, matrice1(ieto%%, z%%, 29, 1).qmSUqp, "=M51*$C$20", "=I51*$N$23", "=I50*$N$24", "=$I49*$N$25", "=$I48*$N$26", "=$I47*$N$27", "=$I46*$N$28", "=$I45*$N$29", "=$I44*$N$30", "=$I43*$N$31", "=$I42*$N$32", "=$I41*$N$33", "=$I40*$N$34", "=$I39*$N$35", "=$I38*$N$36", "=$I37*$N$37", "=$I36*$N$38", "=$I35*$N$39", "=$I34*$N$40", "=$I33*$N$41", "=$I32*$N$42", "=$I31*$N$43", "=$I30*$N$44", "=$I29*$N$45", "=$I28*$N$46", "=$I27*$N$47", "=$I26*$N$48", "=$I25*$N$49", "=$I24*$N$50", "=$I23*$N$51", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O51:BL51)"
  1392.         WRITE #1, "30", "=A52*$C$18", "=SE(ARROTONDA(B52,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B52^$C$7,0)", "=SE(C52>0,(C52-C51)/$C$18,0)", matrice1(ieto%%, z%%, 30, 1).i2, "=E52*$C$18", "=SE(C52>0,G51+F52,0)", "=SE(G52-$C$12>=0,((G52-$C$12)^2)/(G52-$C$12+$C$11),0)", "=SE(C52>0,H52-H51,0)", mockus(30).tSUta, mockus(30).qSUqp, matrice1(ieto%%, z%%, 30, 1).tmSUta, matrice1(ieto%%, z%%, 30, 1).qmSUqp, "=M52*$C$20", "=I52*$N$23", "=I51*$N$24", "=$I50*$N$25", "=$I49*$N$26", "=$I48*$N$27", "=$I47*$N$28", "=$I46*$N$29", "=$I45*$N$30", "=$I44*$N$31", "=$I43*$N$32", "=$I42*$N$33", "=$I41*$N$34", "=$I40*$N$35", "=$I39*$N$36", "=$I38*$N$37", "=$I37*$N$38", "=$I36*$N$39", "=$I35*$N$40", "=$I34*$N$41", "=$I33*$N$42", "=$I32*$N$43", "=$I31*$N$44", "=$I30*$N$45", "=$I29*$N$46", "=$I28*$N$47", "=$I27*$N$48", "=$I26*$N$49", "=$I25*$N$50", "=$I24*$N$51", "=$I23*$N$52", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O52:BL52)"
  1393.         WRITE #1, "31", "=A53*$C$18", "=SE(ARROTONDA(B53,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B53^$C$7,0)", "=SE(C53>0,(C53-C52)/$C$18,0)", matrice1(ieto%%, z%%, 31, 1).i2, "=E53*$C$18", "=SE(C53>0,G52+F53,0)", "=SE(G53-$C$12>=0,((G53-$C$12)^2)/(G53-$C$12+$C$11),0)", "=SE(C53>0,H53-H52,0)", mockus(31).tSUta, mockus(31).qSUqp, matrice1(ieto%%, z%%, 31, 1).tmSUta, matrice1(ieto%%, z%%, 31, 1).qmSUqp, "=M53*$C$20", "=I53*$N$23", "=I52*$N$24", "=$I51*$N$25", "=$I50*$N$26", "=$I49*$N$27", "=$I48*$N$28", "=$I47*$N$29", "=$I46*$N$30", "=$I45*$N$31", "=$I44*$N$32", "=$I43*$N$33", "=$I42*$N$34", "=$I41*$N$35", "=$I40*$N$36", "=$I39*$N$37", "=$I38*$N$38", "=$I37*$N$39", "=$I36*$N$40", "=$I35*$N$41", "=$I34*$N$42", "=$I33*$N$43", "=$I32*$N$44", "=$I31*$N$45", "=$I30*$N$46", "=$I29*$N$47", "=$I28*$N$48", "=$I27*$N$49", "=$I26*$N$50", "=$I25*$N$51", "=$I24*$N$52", "=$I23*$N$53", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O53:BL53)"
  1394.         WRITE #1, "32", "=A54*$C$18", "=SE(ARROTONDA(B54,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B54^$C$7,0)", "=SE(C54>0,(C54-C53)/$C$18,0)", matrice1(ieto%%, z%%, 32, 1).i2, "=E54*$C$18", "=SE(C54>0,G53+F54,0)", "=SE(G54-$C$12>=0,((G54-$C$12)^2)/(G54-$C$12+$C$11),0)", "=SE(C54>0,H54-H53,0)", mockus(32).tSUta, mockus(32).qSUqp, matrice1(ieto%%, z%%, 32, 1).tmSUta, matrice1(ieto%%, z%%, 32, 1).qmSUqp, "=M54*$C$20", "=I54*$N$23", "=I53*$N$24", "=$I52*$N$25", "=$I51*$N$26", "=$I50*$N$27", "=$I49*$N$28", "=$I48*$N$29", "=$I47*$N$30", "=$I46*$N$31", "=$I45*$N$32", "=$I44*$N$33", "=$I43*$N$34", "=$I42*$N$35", "=$I41*$N$36", "=$I40*$N$37", "=$I39*$N$38", "=$I38*$N$39", "=$I37*$N$40", "=$I36*$N$41", "=$I35*$N$42", "=$I34*$N$43", "=$I33*$N$44", "=$I32*$N$45", "=$I31*$N$46", "=$I30*$N$47", "=$I29*$N$48", "=$I28*$N$49", "=$I27*$N$50", "=$I26*$N$51", "=$I25*$N$52", "=$I24*$N$53", "=$I23*$N$54", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O54:BL54)"
  1395.         WRITE #1, "33", "=A55*$C$18", "=SE(ARROTONDA(B55,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B55^$C$7,0)", "=SE(C55>0,(C55-C54)/$C$18,0)", matrice1(ieto%%, z%%, 33, 1).i2, "=E55*$C$18", "=SE(C55>0,G54+F55,0)", "=SE(G55-$C$12>=0,((G55-$C$12)^2)/(G55-$C$12+$C$11),0)", "=SE(C55>0,H55-H54,0)", mockus(33).tSUta, mockus(33).qSUqp, matrice1(ieto%%, z%%, 33, 1).tmSUta, matrice1(ieto%%, z%%, 33, 1).qmSUqp, "=M55*$C$20", "=I55*$N$23", "=I54*$N$24", "=$I53*$N$25", "=$I52*$N$26", "=$I51*$N$27", "=$I50*$N$28", "=$I49*$N$29", "=$I48*$N$30", "=$I47*$N$31", "=$I46*$N$32", "=$I45*$N$33", "=$I44*$N$34", "=$I43*$N$35", "=$I42*$N$36", "=$I41*$N$37", "=$I40*$N$38", "=$I39*$N$39", "=$I38*$N$40", "=$I37*$N$41", "=$I36*$N$42", "=$I35*$N$43", "=$I34*$N$44", "=$I33*$N$45", "=$I32*$N$46", "=$I31*$N$47", "=$I30*$N$48", "=$I29*$N$49", "=$I28*$N$50", "=$I27*$N$51", "=$I26*$N$52", "=$I25*$N$53", "=$I24*$N$54", "=$I23*$M$55", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O55:BL55)"
  1396.         WRITE #1, "34", "=A56*$C$18", "=SE(ARROTONDA(B56,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B56^$C$7,0)", "=SE(C56>0,(C56-C55)/$C$18,0)", matrice1(ieto%%, z%%, 34, 1).i2, "=E56*$C$18", "=SE(C56>0,G55+F56,0)", "=SE(G56-$C$12>=0,((G56-$C$12)^2)/(G56-$C$12+$C$11),0)", "=SE(C56>0,H56-H55,0)", mockus(34).tSUta, mockus(34).qSUqp, matrice1(ieto%%, z%%, 34, 1).tmSUta, matrice1(ieto%%, z%%, 34, 1).qmSUqp, "=M56*$C$20", "=I56*$N$23", "=I55*$N$24", "=$I54*$N$25", "=$I53*$N$26", "=$I52*$N$27", "=$I51*$N$28", "=$I50*$N$29", "=$I49*$N$30", "=$I48*$N$31", "=$I47*$N$32", "=$I46*$N$33", "=$I45*$N$34", "=$I44*$N$35", "=$I43*$N$36", "=$I42*$N$37", "=$I41*$N$38", "=$I40*$N$39", "=$I39*$N$40", "=$I38*$N$41", "=$I37*$N$42", "=$I36*$N$43", "=$I35*$N$44", "=$I34*$N$45", "=$I33*$N$46", "=$I32*$N$47", "=$I31*$N$48", "=$I30*$N$49", "=$I29*$N$50", "=$I28*$N$51", "=$I27*$N$52", "=$I26*$N$53", "=$I25*$N$54", "=$I24*$M$55", "=$I23*$M$56", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O56:BL56)"
  1397.         WRITE #1, "35", "=A57*$C$18", "=SE(ARROTONDA(B57,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B57^$C$7,0)", "=SE(C57>0,(C57-C56)/$C$18,0)", matrice1(ieto%%, z%%, 35, 1).i2, "=E57*$C$18", "=SE(C57>0,G56+F57,0)", "=SE(G57-$C$12>=0,((G57-$C$12)^2)/(G57-$C$12+$C$11),0)", "=SE(C57>0,H57-H56,0)", mockus(35).tSUta, mockus(35).qSUqp, matrice1(ieto%%, z%%, 35, 1).tmSUta, matrice1(ieto%%, z%%, 35, 1).qmSUqp, "=M57*$C$20", "=I57*$N$23", "=I56*$N$24", "=$I55*$N$25", "=$I54*$N$26", "=$I53*$N$27", "=$I52*$N$28", "=$I51*$N$29", "=$I50*$N$30", "=$I49*$N$31", "=$I48*$N$32", "=$I47*$N$33", "=$I46*$N$34", "=$I45*$N$35", "=$I44*$N$36", "=$I43*$N$37", "=$I42*$N$38", "=$I41*$N$39", "=$I40*$N$40", "=$I39*$N$41", "=$I38*$N$42", "=$I37*$N$43", "=$I36*$N$44", "=$I35*$N$45", "=$I34*$N$46", "=$I33*$N$47", "=$I32*$N$48", "=$I31*$N$49", "=$I30*$N$50", "=$I29*$N$51", "=$I28*$N$52", "=$I27*$N$53", "=$I26*$N$54", "=$I25*$M$55", "=$I24*$M$56", "=$I23*$M$57", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O57:BL57)"
  1398.         WRITE #1, "36", "=A58*$C$18", "=SE(ARROTONDA(B58,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B58^$C$7,0)", "=SE(C58>0,(C58-C57)/$C$18,0)", matrice1(ieto%%, z%%, 36, 1).i2, "=E58*$C$18", "=SE(C58>0,G57+F58,0)", "=SE(G58-$C$12>=0,((G58-$C$12)^2)/(G58-$C$12+$C$11),0)", "=SE(C58>0,H58-H57,0)", mockus(36).tSUta, mockus(36).qSUqp, matrice1(ieto%%, z%%, 36, 1).tmSUta, matrice1(ieto%%, z%%, 36, 1).qmSUqp, "=M58*$C$20", "=I58*$N$23", "=I57*$N$24", "=$I56*$N$25", "=$I55*$N$26", "=$I54*$N$27", "=$I53*$N$28", "=$I52*$N$29", "=$I51*$N$30", "=$I50*$N$31", "=$I49*$N$32", "=$I48*$N$33", "=$I47*$N$34", "=$I46*$N$35", "=$I45*$N$36", "=$I44*$N$37", "=$I43*$N$38", "=$I42*$N$39", "=$I41*$N$40", "=$I40*$N$41", "=$I39*$N$42", "=$I38*$N$43", "=$I37*$N$44", "=$I36*$N$45", "=$I35*$N$46", "=$I34*$N$47", "=$I33*$N$48", "=$I32*$N$49", "=$I31*$N$50", "=$I30*$N$51", "=$I29*$N$52", "=$I28*$N$53", "=$I27*$N$54", "=$I26*$M$55", "=$I25*$M$56", "=$I24*$M$57", "=$I23*$M$58", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O58:BL58)"
  1399.         WRITE #1, "37", "=A59*$C$18", "=SE(ARROTONDA(B59,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B59^$C$7,0)", "=SE(C59>0,(C59-C58)/$C$18,0)", matrice1(ieto%%, z%%, 37, 1).i2, "=E59*$C$18", "=SE(C59>0,G58+F59,0)", "=SE(G59-$C$12>=0,((G59-$C$12)^2)/(G59-$C$12+$C$11),0)", "=SE(C59>0,H59-H58,0)", mockus(37).tSUta, mockus(37).qSUqp, matrice1(ieto%%, z%%, 37, 1).tmSUta, matrice1(ieto%%, z%%, 37, 1).qmSUqp, "=M59*$C$20", "=I59*$N$23", "=I58*$N$24", "=$I57*$N$25", "=$I56*$N$26", "=$I55*$N$27", "=$I54*$N$28", "=$I53*$N$29", "=$I52*$N$30", "=$I51*$N$31", "=$I50*$N$32", "=$I49*$N$33", "=$I48*$N$34", "=$I47*$N$35", "=$I46*$N$36", "=$I45*$N$37", "=$I44*$N$38", "=$I43*$N$39", "=$I42*$N$40", "=$I41*$N$41", "=$I40*$N$42", "=$I39*$N$43", "=$I38*$N$44", "=$I37*$N$45", "=$I36*$N$46", "=$I35*$N$47", "=$I34*$N$48", "=$I33*$N$49", "=$I32*$N$50", "=$I31*$N$51", "=$I30*$N$52", "=$I29*$N$53", "=$I28*$N$54", "=$I27*$M$55", "=$I26*$M$56", "=$I25*$M$57", "=$I24*$M$58", "=$I23*$M$59", "", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O59:BL59)"
  1400.         WRITE #1, "38", "=A60*$C$18", "=SE(ARROTONDA(B60,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B60^$C$7,0)", "=SE(C60>0,(C60-C59)/$C$18,0)", matrice1(ieto%%, z%%, 38, 1).i2, "=E60*$C$18", "=SE(C60>0,G59+F60,0)", "=SE(G60-$C$12>=0,((G60-$C$12)^2)/(G60-$C$12+$C$11),0)", "=SE(C60>0,H60-H59,0)", mockus(38).tSUta, mockus(38).qSUqp, matrice1(ieto%%, z%%, 38, 1).tmSUta, matrice1(ieto%%, z%%, 38, 1).qmSUqp, "=M60*$C$20", "=I60*$N$23", "=I59*$N$24", "=$I58*$N$25", "=$I57*$N$26", "=$I56*$N$27", "=$I55*$N$28", "=$I54*$N$29", "=$I53*$N$30", "=$I52*$N$31", "=$I51*$N$32", "=$I50*$N$33", "=$I49*$N$34", "=$I48*$N$35", "=$I47*$N$36", "=$I46*$N$37", "=$I45*$N$38", "=$I44*$N$39", "=$I43*$N$40", "=$I42*$N$41", "=$I41*$N$42", "=$I40*$N$43", "=$I39*$N$44", "=$I38*$N$45", "=$I37*$N$46", "=$I36*$N$47", "=$I35*$N$48", "=$I34*$N$49", "=$I33*$N$50", "=$I32*$N$51", "=$I31*$N$52", "=$I30*$N$53", "=$I29*$N$54", "=$I28*$M$55", "=$I27*$M$56", "=$I26*$M$57", "=$I25*$M$58", "=$I24*$M$59", "=$I23*$M$60", "", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O60:BL60)"
  1401.         WRITE #1, "39", "=A61*$C$18", "=SE(ARROTONDA(B61,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B61^$C$7,0)", "=SE(C61>0,(C61-C60)/$C$18,0)", matrice1(ieto%%, z%%, 39, 1).i2, "=E61*$C$18", "=SE(C61>0,G60+F61,0)", "=SE(G61-$C$12>=0,((G61-$C$12)^2)/(G61-$C$12+$C$11),0)", "=SE(C61>0,H61-H60,0)", mockus(39).tSUta, mockus(39).qSUqp, matrice1(ieto%%, z%%, 39, 1).tmSUta, matrice1(ieto%%, z%%, 39, 1).qmSUqp, "=M61*$C$20", "=I61*$N$23", "=I60*$N$24", "=$I59*$N$25", "=$I58*$N$26", "=$I57*$N$27", "=$I56*$N$28", "=$I55*$N$29", "=$I54*$N$30", "=$I53*$N$31", "=$I52*$N$32", "=$I51*$N$33", "=$I50*$N$34", "=$I49*$N$35", "=$I48*$N$36", "=$I47*$N$37", "=$I46*$N$38", "=$I45*$N$39", "=$I44*$N$40", "=$I43*$N$41", "=$I42*$N$42", "=$I41*$N$43", "=$I40*$N$44", "=$I39*$N$45", "=$I38*$N$46", "=$I37*$N$47", "=$I36*$N$48", "=$I35*$N$49", "=$I34*$N$50", "=$I33*$N$51", "=$I32*$N$52", "=$I31*$N$53", "=$I30*$N$54", "=$I29*$M$55", "=$I28*$M$56", "=$I27*$M$57", "=$I26*$M$58", "=$I25*$M$59", "=$I24*$M$60", "=$I23*$M$61", "", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O61:BL61)"
  1402.         WRITE #1, "40", "=A62*$C$18", "=SE(ARROTONDA(B62,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B62^$C$7,0)", "=SE(C62>0,(C62-C61)/$C$18,0)", matrice1(ieto%%, z%%, 40, 1).i2, "=E62*$C$18", "=SE(C62>0,G61+F62,0)", "=SE(G62-$C$12>=0,((G62-$C$12)^2)/(G62-$C$12+$C$11),0)", "=SE(C62>0,H62-H61,0)", mockus(40).tSUta, mockus(40).qSUqp, matrice1(ieto%%, z%%, 40, 1).tmSUta, matrice1(ieto%%, z%%, 40, 1).qmSUqp, "=M62*$C$20", "=I62*$N$23", "=I61*$N$24", "=$I60*$N$25", "=$I59*$N$26", "=$I58*$N$27", "=$I57*$N$28", "=$I56*$N$29", "=$I55*$N$30", "=$I54*$N$31", "=$I53*$N$32", "=$I52*$N$33", "=$I51*$N$34", "=$I50*$N$35", "=$I49*$N$36", "=$I48*$N$37", "=$I47*$N$38", "=$I46*$N$39", "=$I45*$N$40", "=$I44*$N$41", "=$I43*$N$42", "=$I42*$N$43", "=$I41*$N$44", "=$I40*$N$45", "=$I39*$N$46", "=$I38*$N$47", "=$I37*$N$48", "=$I36*$N$49", "=$I35*$N$50", "=$I34*$N$51", "=$I33*$N$52", "=$I32*$N$53", "=$I31*$N$54", "=$I30*$M$55", "=$I29*$M$56", "=$I28*$M$57", "=$I27*$M$58", "=$I26*$M$59", "=$I25*$M$60", "=$I24*$M$61", "=$I23*$M$62", "", "", "", "", "", "", "", "", "", "", "=SOMMA(O62:BL62)"
  1403.         WRITE #1, "41", "=A63*$C$18", "=SE(ARROTONDA(B63,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B63^$C$7,0)", "=SE(C63>0,(C63-C62)/$C$18,0)", matrice1(ieto%%, z%%, 41, 1).i2, "=E63*$C$18", "=SE(C63>0,G62+F63,0)", "=SE(G63-$C$12>=0,((G63-$C$12)^2)/(G63-$C$12+$C$11),0)", "=SE(C63>0,H63-H62,0)", mockus(41).tSUta, mockus(41).qSUqp, matrice1(ieto%%, z%%, 41, 1).tmSUta, matrice1(ieto%%, z%%, 41, 1).qmSUqp, "=M63*$C$20", "=I63*$N$23", "=I62*$N$24", "=$I61*$N$25", "=$I60*$N$26", "=$I59*$N$27", "=$I58*$N$28", "=$I57*$N$29", "=$I56*$N$30", "=$I55*$N$31", "=$I54*$N$32", "=$I53*$N$33", "=$I52*$N$34", "=$I51*$N$35", "=$I50*$N$36", "=$I49*$N$37", "=$I48*$N$38", "=$I47*$N$39", "=$I46*$N$40", "=$I45*$N$41", "=$I44*$N$42", "=$I43*$N$43", "=$I42*$N$44", "=$I41*$N$45", "=$I40*$N$46", "=$I39*$N$47", "=$I38*$N$48", "=$I37*$N$49", "=$I36*$N$50", "=$I35*$N$51", "=$I34*$N$52", "=$I33*$N$53", "=$I32*$N$54", "=$I31*$M$55", "=$I30*$M$56", "=$I29*$M$57", "=$I28*$M$58", "=$I27*$M$59", "=$I26*$M$60", "=$I25*$M$61", "=$I24*$M$62", "=$I23*$M$63", "", "", "", "", "", "", "", "", "", "=SOMMA(O63:BL63)"
  1404.         WRITE #1, "42", "=A64*$C$18", "=SE(ARROTONDA(B64,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B64^$C$7,0)", "=SE(C64>0,(C64-C63)/$C$18,0)", matrice1(ieto%%, z%%, 42, 1).i2, "=E64*$C$18", "=SE(C64>0,G63+F64,0)", "=SE(G64-$C$12>=0,((G64-$C$12)^2)/(G64-$C$12+$C$11),0)", "=SE(C64>0,H64-H63,0)", mockus(42).tSUta, mockus(42).qSUqp, matrice1(ieto%%, z%%, 42, 1).tmSUta, matrice1(ieto%%, z%%, 42, 1).qmSUqp, "=M64*$C$20", "=I64*$N$23", "=I63*$N$24", "=$I62*$N$25", "=$I61*$N$26", "=$I60*$N$27", "=$I59*$N$28", "=$I58*$N$29", "=$I57*$N$30", "=$I56*$N$31", "=$I55*$N$32", "=$I54*$N$33", "=$I53*$N$34", "=$I52*$N$35", "=$I51*$N$36", "=$I50*$N$37", "=$I49*$N$38", "=$I48*$N$39", "=$I47*$N$40", "=$I46*$N$41", "=$I45*$N$42", "=$I44*$N$43", "=$I43*$N$44", "=$I42*$N$45", "=$I41*$N$46", "=$I40*$N$47", "=$I39*$N$48", "=$I38*$N$49", "=$I37*$N$50", "=$I36*$N$51", "=$I35*$N$52", "=$I34*$N$53", "=$I33*$N$54", "=$I32*$M$55", "=$I31*$M$56", "=$I30*$M$57", "=$I29*$M$58", "=$I28*$M$59", "=$I27*$M$60", "=$I26*$M$61", "=$I25*$M$62", "=$I24*$M$63", "=$I23*$M$64", "", "", "", "", "", "", "", "", "=SOMMA(O64:BL64)"
  1405.         WRITE #1, "43", "=A65*$C$18", "=SE(ARROTONDA(B65,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B65^$C$7,0)", "=SE(C65>0,(C65-C64)/$C$18,0)", matrice1(ieto%%, z%%, 43, 1).i2, "=E65*$C$18", "=SE(C65>0,G64+F65,0)", "=SE(G65-$C$12>=0,((G65-$C$12)^2)/(G65-$C$12+$C$11),0)", "=SE(C65>0,H65-H64,0)", mockus(43).tSUta, mockus(43).qSUqp, matrice1(ieto%%, z%%, 43, 1).tmSUta, matrice1(ieto%%, z%%, 43, 1).qmSUqp, "=M65*$C$20", "=I65*$N$23", "=I64*$N$24", "=$I63*$N$25", "=$I62*$N$26", "=$I61*$N$27", "=$I60*$N$28", "=$I59*$N$29", "=$I58*$N$30", "=$I57*$N$31", "=$I56*$N$32", "=$I55*$N$33", "=$I54*$N$34", "=$I53*$N$35", "=$I52*$N$36", "=$I51*$N$37", "=$I50*$N$38", "=$I49*$N$39", "=$I48*$N$40", "=$I47*$N$41", "=$I46*$N$42", "=$I45*$N$43", "=$I44*$N$44", "=$I43*$N$45", "=$I42*$N$46", "=$I41*$N$47", "=$I40*$N$48", "=$I39*$N$49", "=$I38*$N$50", "=$I37*$N$51", "=$I36*$N$52", "=$I35*$N$53", "=$I34*$N$54", "=$I33*$M$55", "=$I32*$M$56", "=$I31*$M$57", "=$I30*$M$58", "=$I29*$M$59", "=$I28*$M$60", "=$I27*$M$61", "=$I26*$M$62", "=$I25*$M$63", "=$I24*$M$64", "=$I23*$M$65", "", "", "", "", "", "", "", "=SOMMA(O65:BL65)"
  1406.         WRITE #1, "44", "=A66*$C$18", "=SE(ARROTONDA(B66,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B66^$C$7,0)", "=SE(C66>0,(C66-C65)/$C$18,0)", matrice1(ieto%%, z%%, 44, 1).i2, "=E66*$C$18", "=SE(C66>0,G65+F66,0)", "=SE(G66-$C$12>=0,((G66-$C$12)^2)/(G66-$C$12+$C$11),0)", "=SE(C66>0,H66-H65,0)", mockus(44).tSUta, mockus(44).qSUqp, matrice1(ieto%%, z%%, 44, 1).tmSUta, matrice1(ieto%%, z%%, 44, 1).qmSUqp, "=M66*$C$20", "=I66*$N$23", "=I65*$N$24", "=$I64*$N$25", "=$I63*$N$26", "=$I62*$N$27", "=$I61*$N$28", "=$I60*$N$29", "=$I59*$N$30", "=$I58*$N$31", "=$I57*$N$32", "=$I56*$N$33", "=$I55*$N$34", "=$I54*$N$35", "=$I53*$N$36", "=$I52*$N$37", "=$I51*$N$38", "=$I50*$N$39", "=$I49*$N$40", "=$I48*$N$41", "=$I47*$N$42", "=$I46*$N$43", "=$I45*$N$44", "=$I44*$N$45", "=$I43*$N$46", "=$I42*$N$47", "=$I41*$N$48", "=$I40*$N$49", "=$I39*$N$50", "=$I38*$N$51", "=$I37*$N$52", "=$I36*$N$53", "=$I35*$N$54", "=$I34*$M$55", "=$I33*$M$56", "=$I32*$M$57", "=$I31*$M$58", "=$I30*$M$59", "=$I29*$M$60", "=$I28*$M$61", "=$I27*$M$62", "=$I26*$M$63", "=$I25*$M$64", "=$I24*$M$65", "=$I23*$M$66", "", "", "", "", "", "", "=SOMMA(O66:BL66)"
  1407.         WRITE #1, "45", "=A67*$C$18", "=SE(ARROTONDA(B67,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B67^$C$7,0)", "=SE(C67>0,(C67-C66)/$C$18,0)", matrice1(ieto%%, z%%, 45, 1).i2, "=E67*$C$18", "=SE(C67>0,G66+F67,0)", "=SE(G67-$C$12>=0,((G67-$C$12)^2)/(G67-$C$12+$C$11),0)", "=SE(C67>0,H67-H66,0)", mockus(45).tSUta, mockus(45).qSUqp, matrice1(ieto%%, z%%, 45, 1).tmSUta, matrice1(ieto%%, z%%, 45, 1).qmSUqp, "=M67*$C$20", "=I67*$N$23", "=I66*$N$24", "=$I65*$N$25", "=$I64*$N$26", "=$I63*$N$27", "=$I62*$N$28", "=$I61*$N$29", "=$I60*$N$30", "=$I59*$N$31", "=$I58*$N$32", "=$I57*$N$33", "=$I56*$N$34", "=$I55*$N$35", "=$I54*$N$36", "=$I53*$N$37", "=$I52*$N$38", "=$I51*$N$39", "=$I50*$N$40", "=$I49*$N$41", "=$I48*$N$42", "=$I47*$N$43", "=$I46*$N$44", "=$I45*$N$45", "=$I44*$N$46", "=$I43*$N$47", "=$I42*$N$48", "=$I41*$N$49", "=$I40*$N$50", "=$I39*$N$51", "=$I38*$N$52", "=$I37*$N$53", "=$I36*$N$54", "=$I35*$M$55", "=$I34*$M$56", "=$I33*$M$57", "=$I32*$M$58", "=$I31*$M$59", "=$I30*$M$60", "=$I29*$M$61", "=$I28*$M$62", "=$I27*$M$63", "=$I26*$M$64", "=$I25*$M$65", "=$I24*$M$66", "=$I23*$M$67", "", "", "", "", "", "=SOMMA(O67:BL67)"
  1408.         WRITE #1, "46", "=A68*$C$18", "=SE(ARROTONDA(B68,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B68^$C$7,0)", "=SE(C68>0,(C68-C67)/$C$18,0)", matrice1(ieto%%, z%%, 46, 1).i2, "=E68*$C$18", "=SE(C68>0,G67+F68,0)", "=SE(G68-$C$12>=0,((G68-$C$12)^2)/(G68-$C$12+$C$11),0)", "=SE(C68>0,H68-H67,0)", mockus(46).tSUta, mockus(46).qSUqp, matrice1(ieto%%, z%%, 46, 1).tmSUta, matrice1(ieto%%, z%%, 46, 1).qmSUqp, "=M68*$C$20", "=I68*$N$23", "=I67*$N$24", "=$I66*$N$25", "=$I65*$N$26", "=$I64*$N$27", "=$I63*$N$28", "=$I62*$N$29", "=$I61*$N$30", "=$I60*$N$31", "=$I59*$N$32", "=$I58*$N$33", "=$I57*$N$34", "=$I56*$N$35", "=$I55*$N$36", "=$I54*$N$37", "=$I53*$N$38", "=$I52*$N$39", "=$I51*$N$40", "=$I50*$N$41", "=$I49*$N$42", "=$I48*$N$43", "=$I47*$N$44", "=$I46*$N$45", "=$I45*$N$46", "=$I44*$N$47", "=$I43*$N$48", "=$I42*$N$49", "=$I41*$N$50", "=$I40*$N$51", "=$I39*$N$52", "=$I38*$N$53", "=$I37*$N$54", "=$I36*$M$55", "=$I35*$M$56", "=$I34*$M$57", "=$I33*$M$58", "=$I32*$M$59", "=$I31*$M$60", "=$I30*$M$61", "=$I29*$M$62", "=$I28*$M$63", "=$I27*$M$64", "=$I26*$M$65", "=$I25*$M$66", "=$I24*$M$67", "=$I23*$M$68", "", "", "", "", "=SOMMA(O68:BL68)"
  1409.         WRITE #1, "47", "=A69*$C$18", "=SE(ARROTONDA(B69,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B69^$C$7,0)", "=SE(C69>0,(C69-C68)/$C$18,0)", matrice1(ieto%%, z%%, 47, 1).i2, "=E69*$C$18", "=SE(C69>0,G68+F69,0)", "=SE(G69-$C$12>=0,((G69-$C$12)^2)/(G69-$C$12+$C$11),0)", "=SE(C69>0,H69-H68,0)", mockus(47).tSUta, mockus(47).qSUqp, matrice1(ieto%%, z%%, 47, 1).tmSUta, matrice1(ieto%%, z%%, 47, 1).qmSUqp, "=M69*$C$20", "=I69*$N$23", "=I68*$N$24", "=$I67*$N$25", "=$I66*$N$26", "=$I65*$N$27", "=$I64*$N$28", "=$I63*$N$29", "=$I62*$N$30", "=$I61*$N$31", "=$I60*$N$32", "=$I59*$N$33", "=$I58*$N$34", "=$I57*$N$35", "=$I56*$N$36", "=$I55*$N$37", "=$I54*$N$38", "=$I53*$N$39", "=$I52*$N$40", "=$I51*$N$41", "=$I50*$N$42", "=$I49*$N$43", "=$I48*$N$44", "=$I47*$N$45", "=$I46*$N$46", "=$I45*$N$47", "=$I44*$N$48", "=$I43*$N$49", "=$I42*$N$50", "=$I41*$N$51", "=$I40*$N$52", "=$I39*$N$53", "=$I38*$N$54", "=$I37*$M$55", "=$I36*$M$56", "=$I35*$M$57", "=$I34*$M$58", "=$I33*$M$59", "=$I32*$M$60", "=$I31*$M$61", "=$I30*$M$62", "=$I29*$M$63", "=$I28*$M$64", "=$I27*$M$65", "=$I26*$M$66", "=$I25*$M$67", "=$I24*$M$68", "=$I23*$M$69", "", "", "", "=SOMMA(O69:BL69)"
  1410.         WRITE #1, "48", "=A70*$C$18", "=SE(ARROTONDA(B70,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B70^$C$7,0)", "=SE(C70>0,(C70-C69)/$C$18,0)", matrice1(ieto%%, z%%, 48, 1).i2, "=E70*$C$18", "=SE(C70>0,G69+F70,0)", "=SE(G70-$C$12>=0,((G70-$C$12)^2)/(G70-$C$12+$C$11),0)", "=SE(C70>0,H70-H69,0)", mockus(48).tSUta, mockus(48).qSUqp, matrice1(ieto%%, z%%, 48, 1).tmSUta, matrice1(ieto%%, z%%, 48, 1).qmSUqp, "=M70*$C$20", "=I70*$N$23", "=I69*$N$24", "=$I68*$N$25", "=$I67*$N$26", "=$I66*$N$27", "=$I65*$N$28", "=$I64*$N$29", "=$I63*$N$30", "=$I62*$N$31", "=$I61*$N$32", "=$I60*$N$33", "=$I59*$N$34", "=$I58*$N$35", "=$I57*$N$36", "=$I56*$N$37", "=$I55*$N$38", "=$I54*$N$39", "=$I53*$N$40", "=$I52*$N$41", "=$I51*$N$42", "=$I50*$N$43", "=$I49*$N$44", "=$I48*$N$45", "=$I47*$N$46", "=$I46*$N$47", "=$I45*$N$48", "=$I44*$N$49", "=$I43*$N$50", "=$I42*$N$51", "=$I41*$N$52", "=$I40*$N$53", "=$I39*$N$54", "=$I38*$M$55", "=$I37*$M$56", "=$I36*$M$57", "=$I35*$M$58", "=$I34*$M$59", "=$I33*$M$60", "=$I32*$M$61", "=$I31*$M$62", "=$I30*$M$63", "=$I29*$M$64", "=$I28*$M$65", "=$I27*$M$66", "=$I26*$M$67", "=$I25*$M$68", "=$I24*$M$69", "=$I23*$M$70", "", "", "=SOMMA(O70:BL70)"
  1411.         WRITE #1, "49", "=A71*$C$18", "=SE(ARROTONDA(B71,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B71^$C$7,0)", "=SE(C71>0,(C71-C70)/$C$18,0)", matrice1(ieto%%, z%%, 49, 1).i2, "=E71*$C$18", "=SE(C71>0,G70+F71,0)", "=SE(G71-$C$12>=0,((G71-$C$12)^2)/(G71-$C$12+$C$11),0)", "=SE(C71>0,H71-H70,0)", mockus(49).tSUta, mockus(49).qSUqp, matrice1(ieto%%, z%%, 49, 1).tmSUta, matrice1(ieto%%, z%%, 49, 1).qmSUqp, "=M71*$C$20", "=I71*$N$23", "=I70*$N$24", "=$I69*$N$25", "=$I68*$N$26", "=$I67*$N$27", "=$I66*$N$28", "=$I65*$N$29", "=$I64*$N$30", "=$I63*$N$31", "=$I62*$N$32", "=$I61*$N$33", "=$I60*$N$34", "=$I59*$N$35", "=$I58*$N$36", "=$I57*$N$37", "=$I56*$N$38", "=$I55*$N$39", "=$I54*$N$40", "=$I53*$N$41", "=$I52*$N$42", "=$I51*$N$43", "=$I50*$N$44", "=$I49*$N$45", "=$I48*$N$46", "=$I47*$N$47", "=$I46*$N$48", "=$I45*$N$49", "=$I44*$N$50", "=$I43*$N$51", "=$I42*$N$52", "=$I41*$N$53", "=$I40*$N$54", "=$I39*$M$55", "=$I38*$M$56", "=$I37*$M$57", "=$I36*$M$58", "=$I35*$M$59", "=$I34*$M$60", "=$I33*$M$61", "=$I32*$M$62", "=$I31*$M$63", "=$I30*$M$64", "=$I29*$M$65", "=$I28*$M$66", "=$I27*$M$67", "=$I26*$M$68", "=$I25*$M$69", "=$I24*$M$70", "=$I23*$M$71", "", "=SOMMA(O71:BL71)"
  1412.         WRITE #1, "50", "=A72*$C$18", "=SE(ARROTONDA(B72,4)<=ARROTONDA($C$17,4),$C$5*$C$6*B72^$C$7,0)", "=SE(C71>0,(C71-C71)/$C$18,0)", matrice1(ieto%%, z%%, 50, 1).i2, "=E72*$C$18", "=SE(C71>0,G71+F72,0)", "=SE(G72-$C$12>=0,((G72-$C$12)^2)/(G72-$C$12+$C$11),0)", "=SE(C72>0,H72-H71,0)", mockus(50).tSUta, mockus(50).qSUqp, matrice1(ieto%%, z%%, 50, 1).tmSUta, matrice1(ieto%%, z%%, 50, 1).qmSUqp, "=M72*$C$20", "=I72*$N$23", "=I71*$N$24", "=$I70*$N$25", "=$I69*$N$26", "=$I68*$N$27", "=$I67*$N$28", "=$I66*$N$29", "=$I65*$N$30", "=$I64*$N$31", "=$I63*$N$32", "=$I62*$N$33", "=$I61*$N$34", "=$I60*$N$35", "=$I59*$N$36", "=$I58*$N$37", "=$I57*$N$38", "=$I56*$N$39", "=$I55*$N$40", "=$I54*$N$41", "=$I53*$N$42", "=$I52*$N$43", "=$I51*$N$44", "=$I50*$N$45", "=$I49*$N$46", "=$I48*$N$47", "=$I47*$N$48", "=$I46*$N$49", "=$I45*$N$50", "=$I44*$N$51", "=$I43*$N$52", "=$I42*$N$53", "=$I41*$N$54", "=$I40*$M$55", "=$I39*$M$56", "=$I38*$M$57", "=$I37*$M$58", "=$I36*$M$59", "=$I35*$M$60", "=$I34*$M$61", "=$I33*$M$62", "=$I32*$M$63", "=$I31*$M$64", "=$I30*$M$65", "=$I29*$M$66", "=$I28*$M$67", "=$I27*$M$68", "=$I26*$M$69", "=$I25*$M$70", "=$I24*$M$71", "", "=SOMMA(O72:BL72)"
  1413.         WRITE #1, "SOMMA", "", "", "", "", "=SOMMA(F23:F72)", "", "", "=SOMMA(I23:I72)"
  1414.         WRITE #1, "MEDIA", "", "", "=SOMMA(D23:D72)/(CONTA.NUMERI(D23:D72)-CONTA.SE(D23:D72,0))", "=SOMMA(E23:E72)/(CONTA.NUMERI(E23:E72)-CONTA.SE(E23:E72,0))"
  1415.         WRITE #1, ""
  1416.         WRITE #1, "Se sopra compare #NOME?, qui di seguito è riportata la stessa matrice, con l'utilizzo dei valori calcolati dal programma, anziché con l'uso delle formule di Excel, in quanto talvolta, a seconda del computer, al posto del valore, compare #NOME?, anche se la formula è corretta: editandola facendo doppio click su di essa e premendo poi INVIO, compare il valore."
  1417.         GOSUB DatiColonna
  1418.         FOR i% = 1 TO 50
  1419.             WRITE #1,_
  1420.              i%,_
  1421.               matrice1(ieto%%, z%%, i%, 1).mdt,_
  1422.               matrice1(ieto%%, z%%, i%, 1).h1,_
  1423.               matrice1(ieto%%, z%%, i%, 1).i1,_
  1424.               matrice1(ieto%%, z%%, i%, 1).i2,_
  1425.               matrice1(ieto%%, z%%, i%, 1).DH,_
  1426.               matrice1(ieto%%, z%%, i%, 1).H2,_
  1427.               matrice1(ieto%%, z%%, i%, 1).he,_
  1428.               matrice1(ieto%%, z%%, i%, 1).Dhe,_
  1429.               matrice1(ieto%%, z%%, i%, 1).tSUta,_
  1430.               matrice1(ieto%%, z%%, i%, 1).qSUqp,_
  1431.               matrice1(ieto%%, z%%, i%, 1).tmSUta,_
  1432.               matrice1(ieto%%, z%%, i%, 1).qmSUqp,_
  1433.               matrice1(ieto%%, z%%, i%, 1).qm,
  1434.             FOR n%% = 1 TO 50
  1435.                 WRITE #1, matrice2!(ieto%%, z%%, i%, n%%),
  1436.             NEXT n%%
  1437.             WRITE #1, idrogrammi1a24(ieto%%, z%%, i%, 1).portata
  1438.         NEXT i%
  1439.         WRITE #1, "SOMMA", "", "", "", "", matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).H2, "", "", matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).he
  1440.         WRITE #1, "MEDIA", "", "", matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).h1 / matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).mdt, matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).H2 / matrice1(ieto%%, z%%, PassiFinePioggia1a24%%(z%%), 1).mdt
  1441.         CLOSE #1
  1442.     NEXT z%%
  1443. NEXT ieto%%
  1444. IF KeyPress$ = "1" THEN
  1445.     IF VisualizzaIeto%% = 1 THEN
  1446.         CALL CreaImmagine(idrogramma1e2(1).composizione, "A.IdrogrammaProgettoCHICAGO+PortataPiccoProgetto")
  1447.         IF ore!(2) <> 0 THEN CALL CreaImmagine(idrogramma1e2(2).composizione, "B.IdrogrammaSceltoCHICAGO+PortataOraPiccoScelta")
  1448.     ELSEIF VisualizzaIeto%% = 2 THEN
  1449.         CALL CreaImmagine(idrogramma1e2(1).composizione, "A.IdrogrammaProgettoCOSTANTE+PortataPiccoProgetto")
  1450.         IF ore!(2) <> 0 THEN CALL CreaImmagine(idrogramma1e2(2).composizione, "B.IdrogrammaSceltoCOSTANTE+PortataOraPiccoScelta")
  1451.     END IF
  1452.     CALL CreaImmagine(unitari&, "C.IdrogrammiUnitari")
  1453.     FOR ieto%% = 1 TO 2
  1454.         IF ieto%% = 1 THEN testo$ = "D._1-24,idrogrammiCHICAGO+PortatePicco(da_1_a_32_volte_tc)"
  1455.         IF ieto%% = 2 THEN testo$ = "E._1-24,idrogrammiCOSTANTE+PortatePicco(da_1_a_32_volte_tc)"
  1456.         CALL CreaImmagine(ComplessivoIeto1e2(ieto%%).composizione, testo$)
  1457.         i% = 0
  1458.         FOR z%% = 1 TO 24
  1459.             i% = i% + 1
  1460.             IF ieto%% = 1 THEN testo$ = "D." + _TRIM$(STR$(z%%)) + ",idrogrammaCHICAGO(" + _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)) + "_volte_tc)"
  1461.             IF ieto%% = 2 THEN testo$ = "E." + _TRIM$(STR$(z%%)) + ",idrogrammaCOSTANTE(" + _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)) + "_volte_tc)"
  1462.             CALL CreaImmagine(MatriciIeto1e2(ieto%%, z%%), testo$)
  1463.         NEXT z%%
  1464.     NEXT ieto%%
  1465. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1466. DatiBase:
  1467. 'routine che riporta i dati che devono  essere sicuramente scritti su ogni file CSV, in quanto contengono i dati principali del bacino idrografico.
  1468.  
  1469. WRITE #n%%, "DATI"
  1470. WRITE #n%%, "T=", "[anni]", T$, "tempo di ritorno"
  1471. WRITE #n%%, "A=", "mq", A2&, "area del bacino idrografico"
  1472. WRITE #n%%, "K=", "[-]", k!, "parametro del Centro Funzionale"
  1473. WRITE #n%%, "a=", "[mm/d^n]", a1!, "coefficiente della curva di possibilità climatica."
  1474. WRITE #n%%, "n=", "[-]", n1!, "coefficiente della curva di possibilità climatica."
  1475. WRITE #n%%, "L=", "[m]", L~%, "lunghezza dell'asta principale del bacino idrografico."
  1476. WRITE #n%%, "s=", "[%]", s1!, "pendenza media del bacino idrografico."
  1477. WRITE #n%%, "CN(II)=", "[-]", CNII%%
  1478. WRITE #n%%, "S=", "[mm]", "=25.4*((1000/C13)-10)", "contenuto idrico massimo del terreno."
  1479. WRITE #n%%, "Ia=", "[mm]", "=0.1*C11", "perdite iniziali."
  1480. WRITE #n%%, "CN(III)=", "[-]", "=(23*C10)/(10+0.13*C10)"
  1481. WRITE #n%%, "tl=", "[ore]", "=0.342*(((C8/1000)^0.8)/(C9^0.5))*(1000/C13-9)^0.7", "formula di Mockus esprimente il tempo di ritardo."
  1482. WRITE #n%%, "tc=", "[ore]", "=C14/0.6", "tempo di corrivazione."
  1483. WRITE #n%%, "ta=", "[ore]", "=C14/0.9", "tempo di picco."
  1484. WRITE #n%%, "qp=", "[mc/(s*mm)]", "=0.208*((C4/1000000)/C16)", "portata al colmo dell'idrogramma unitario del bacino idrografico."
  1485. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1486. DatiColonna:
  1487. 'routine che stampa i titoli delle colonne.
  1488.  
  1489. WRITE #1, "N", "N*dt", "h", "i", "iC", "DH", "H", "he", "Dhe", "t/ta", "q/qp", "tm/ta", "qm/qp", "qm",
  1490. FOR i% = 1 TO 50
  1491.     WRITE #1, "Dhe*qm" + _TRIM$(STR$(i%)),
  1492. NEXT i%
  1493. WRITE #1, "idrogramma"
  1494.  
  1495. '**************************************************************************************************************************************************
  1496. '*                                           Termine sezione routines e inizio sezione subroutines                                                *
  1497. '**************************************************************************************************************************************************
  1498.  
  1499. SUB InserimentoDati (k!, a1!, n1, A2&, L~%, s1!, CNII%%, CoeffPerditeIniziali!)
  1500.     'questa subroutine permette l'inserimento degli input in modo dinamico, cioè non utilizzando il comando INPUT.
  1501.     'INPUT è un comando che non permette l'esecuzione di altre operazioni se non quella dell'inserimento dell'input stesso. ogni altra operazione viene effettuata dopo l'inserimento. per esempio, se vi sono da inserire 10 input, il
  1502.     'comando INPUT non permette di spostarsi con la freccia su o giù tra i vari input e di modificarli, ma andrebbero inseriti uno per volta. se poi uno di questi 10 input fosse sbagliato o da modificare, andrebbe ripetuta l'intera
  1503.     'sequenza di richiesta dei 10 input. questa subroutine, permette dunque di inserire gli input richiesti, come se fosse un unico input massivo, all'interno del quale è possibile modificare ogni input.
  1504.  
  1505.     SHARED PosizioneCursore%%
  1506.  
  1507.     DIM richiesta%%
  1508.     DIM test~`
  1509.     DIM debug~`
  1510.     DIM carattere$
  1511.     DIM punti~`
  1512.     DIM T!
  1513.     DIM cursore~`
  1514.     DIM esci~`
  1515.  
  1516.     COLOR G&
  1517.     PosizioneCursore%% = CSRLIN - 11
  1518.     richiesta%% = 1
  1519.     DO
  1520.         _LIMIT 30
  1521.         KeyPress$ = INKEY$
  1522.         IF TIMER > T! + 0.5 THEN
  1523.             cursore~` = NOT cursore~`
  1524.             T! = TIMER
  1525.         END IF
  1526.         FOR i% = 1 TO 8
  1527.             LOCATE PosizioneCursore%% - 1 + i%, 69: PRINT inputs$(i%) + SPACE$(30)
  1528.         NEXT i%
  1529.         LOCATE PosizioneCursore%% - 1 + richiesta%%, 69 + LEN(inputs$(richiesta%%))
  1530.         IF debug~` = 1 THEN EXIT SUB
  1531.         IF esci~` = 1 THEN EXIT DO
  1532.         IF cursore~` THEN PRINT "_"
  1533.         SELECT CASE KeyPress$
  1534.             CASE CHR$(27)
  1535.                 esc~` = 1
  1536.                 EXIT SUB
  1537.             CASE CHR$(8)
  1538.                 IF LEN(inputs$(richiesta%%)) > 0 THEN inputs$(richiesta%%) = LEFT$(inputs$(richiesta%%), LEN(inputs$(richiesta%%)) - 1)
  1539.             CASE CHR$(9)
  1540.                 riavvio~` = 1
  1541.                 EXIT SUB
  1542.             CASE CHR$(44), CHR$(46)
  1543.                 SELECT CASE richiesta%%
  1544.                     CASE 4, 5, 7
  1545.                         IF KeyPress$ = CHR$(44) OR KeyPress$ = CHR$(46) THEN KeyPress$ = ""
  1546.                     CASE ELSE
  1547.                         punti~` = 0
  1548.                         IF KeyPress$ = CHR$(44) THEN KeyPress$ = CHR$(46)
  1549.                         FOR n%% = 1 TO LEN(inputs$(richiesta%%))
  1550.                             carattere$ = MID$(inputs$(richiesta%%), n%%, 1)
  1551.                             IF carattere$ = CHR$(46) THEN punti~` = 1
  1552.                         NEXT n%%
  1553.                         IF punti~` = 0 THEN inputs$(richiesta%%) = inputs$(richiesta%%) + KeyPress$
  1554.                 END SELECT
  1555.             CASE CHR$(48) TO CHR$(57)
  1556.                 inputs$(richiesta%%) = inputs$(richiesta%%) + KeyPress$
  1557.             CASE CHR$(0) + CHR$(72)
  1558.                 GOSUB ValutaInput
  1559.                 SELECT CASE test~`
  1560.                     CASE IS = 0
  1561.                         inputs$(richiesta%%) = ""
  1562.                     CASE IS = 1
  1563.                         IF richiesta%% = 1 THEN
  1564.                             EXIT SELECT
  1565.                         ELSEIF richiesta <= 10 THEN
  1566.                             richiesta%% = richiesta%% - 1
  1567.                         END IF
  1568.                 END SELECT
  1569.             CASE CHR$(13), CHR$(0) + CHR$(80)
  1570.                 GOSUB ValutaInput
  1571.                 IF richiesta%% <> 8 THEN IF KeyPress$ = CHR$(0) + CHR$(80) THEN KeyPress$ = CHR$(13)
  1572.                 IF richiesta%% <> 8 THEN IF LEN(inputs$(richiesta%%)) = 0 THEN test~` = 0
  1573.                 SELECT CASE test~`
  1574.                     CASE IS = 0
  1575.                         inputs$(richiesta%%) = ""
  1576.                     CASE IS = 1
  1577.                         IF richiesta%% = 8 THEN IF KeyPress$ = CHR$(13) THEN esci~` = 1
  1578.                         IF richiesta%% <> 8 THEN richiesta%% = richiesta%% + 1
  1579.                 END SELECT
  1580.         END SELECT
  1581.     LOOP
  1582.     k! = VAL(inputs$(1)): a1! = VAL(inputs$(2)): n1! = VAL(inputs$(3)): A2& = VAL(inputs$(4)): L~% = VAL(inputs$(5)): s1! = VAL(inputs$(6)): CNII%% = VAL(inputs$(7)): CoeffPerditeIniziali! = VAL(inputs$(8))
  1583.     COLOR bianco&
  1584.     EXIT SUB
  1585.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  1586.     ValutaInput:
  1587.     'routine che si attiva quando l'utente vuol cambiare input, cioè quando preme FRECCIA SU o FRECCIA GIU' o INVIO. essa definisce il valore della variabile test~`, 0 o 1..
  1588.     '- se 0: l'input inserito è non conforme.
  1589.     '- se 1: l'input inserito è conforme.
  1590.     'a seconda del valore della variabile test~`, nella parte principale del codice della subroutine:
  1591.     '- se 0: rifiuta il cambio di input
  1592.     '- se 1: accetta il cambio di input o la validazione degli input che porta all'uscita dalla subroutine.
  1593.  
  1594.     SHARED T$
  1595.  
  1596.     test~` = 0
  1597.     SELECT CASE richiesta%%
  1598.         CASE 1
  1599.             IF inputs$(1) = "123" THEN
  1600.                 debug~` = 1
  1601.                 'Cillian:
  1602.                 k! = 2.34: a1! = 14.6653: n1! = 0.45596: A2& = 2641902: L~% = 3300: s1! = 41.5: CNII%% = 70: CoeffPerditeIniziali! = 0.1
  1603.                 'pialong:
  1604.                 'k! = 2.34: a1! = 17.097811: n1! = 0.497753: A2& = 2509318: L~% = 2919: s1! = 66.3: CNII%% = 66: CoeffPerditeIniziali! = 0.1
  1605.                 'mondange:
  1606.                 'k! = 2.04: a1! = 10.93228: n1! = 0.482321: A2& = 294873: L~% = 840: s1! = 74.7: CNII%% = 77: CoeffPerditeIniziali! = 0.1
  1607.                 inputs$(1) = STR$(k!): inputs$(2) = STR$(a1!): inputs$(3) = STR$(n1!): inputs$(4) = STR$(A2&): inputs$(5) = STR$(L~%): inputs$(6) = STR$(s1!): inputs$(7) = STR$(CNII%%): inputs$(8) = STR$(CoeffPerditeIniziali!)
  1608.                 GOSUB TrovaT
  1609.                 RETURN
  1610.             END IF
  1611.             IF LEN(inputs$(1)) = 0 THEN IF KeyPress$ = CHR$(13) THEN inputs$(1) = "1"
  1612.             GOSUB TrovaT
  1613.             IF KeyPress$ = CHR$(0) + CHR$(80) THEN IF LEN(inputs$(1)) = 0 THEN test~` = 0
  1614.         CASE 2
  1615.             test~` = 1
  1616.         CASE 3
  1617.             IF VAL(inputs$(3)) <= 1 THEN test~` = 1 ELSE test~` = 0
  1618.         CASE 4, 5, 6
  1619.             IF VAL(inputs$(richiesta%%)) >= 1 THEN
  1620.                 test~` = 1
  1621.             ELSEIF inputs$(richiesta%%) = "" THEN
  1622.                 test~` = 1
  1623.             ELSE
  1624.                 test~` = 0
  1625.             END IF
  1626.         CASE 7
  1627.             IF VAL(inputs$(richiesta%%)) >= 1 THEN
  1628.                 IF VAL(inputs$(richiesta%%)) <= 100 THEN test~` = 1
  1629.             ELSEIF inputs$(richiesta%%) = "" THEN test~` = 1
  1630.             ELSE
  1631.                 test~` = 0
  1632.             END IF
  1633.         CASE IS = 8
  1634.             IF LEN(inputs$(8)) = 0 THEN
  1635.                 IF KeyPress$ = CHR$(13) THEN inputs$(8) = "0.1"
  1636.                 test~` = 1
  1637.                 EXIT SELECT
  1638.             END IF
  1639.             IF VAL(inputs$(8)) >= 0 THEN
  1640.                 IF VAL(inputs$(8)) <= 0.2 THEN test~` = 1
  1641.             ELSE
  1642.                 test~` = 0
  1643.             END IF
  1644.     END SELECT
  1645.     RETURN
  1646.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  1647.     TrovaT:
  1648.     'routine che determina il tempo di ritorno corrispondente al valore Kt del centro funzionale, rifiutando i valori non previsti.
  1649.  
  1650.     i% = 1
  1651.     FOR i% = 1 TO 10
  1652.         IF VAL(inputs$(1)) = TempiRitorno(i%).k THEN
  1653.             IF i% = 1 THEN
  1654.                 T$ = "Definito dall'utente"
  1655.                 test~` = 1
  1656.             ELSE
  1657.                 T$ = _TRIM$(STR$(TempiRitorno(i%).T)) + " anni"
  1658.                 test~` = 1
  1659.             END IF
  1660.             EXIT FOR
  1661.         ELSE
  1662.             test~` = 0
  1663.         END IF
  1664.     NEXT i%
  1665.     RETURN
  1666. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1667. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1668. SUB CalcolaIdrogramma (X1!, X2!, X3!, Y!, immagine&, destinazione&)
  1669.     'X1!: ora di picco dell'idrogramma di calcolo n. 24.
  1670.     'X2!: ora corrispondente all'ultimo istante temporale dell'idrogramma di calcolo n. 24.
  1671.     'X3!: ora corrispondente alla portata di picco massima tra le 24 calcolate.
  1672.     'Y!:  portata di picco massima tra le 24 calcolate.
  1673.     'immagine&: immagine in cui viene disegnato il grafico.
  1674.     'destinazione&: immagine in cui viene incollato immagine& e in cui sono riportati i tabulati.
  1675.     'subroutine che chiede all'utente l'inserimento della Soglia (per ietogramma Chicago) per il calcolo dell'idrogramma di progetto e dell'ora di picco scelta. quest'ultimo viene calcolato solo se l'utente specifica un'ora
  1676.     'di picco a scelta, quando richiesto.
  1677.     'l'idrogramma di progetto nel caso di ietogramma costante è sempre determinato e corrisponde a quello con portata di picco massima.
  1678.     'nel caso di ietogramma Chicago corrisponde a quello determinato dalla Soglia o, in caso di Soglia troppo bassa o nel caso non si stabilisca una Soglia, è computato quello corrispondente alla portata di picco massima.
  1679.     'nel caso di ietogramma Chicago, se si esce dal programma prima della richiesta della Soglia, non viene calcolato nessun idrogramma di progetto e, nel corrispondente file CSV, comparirà la scritta: "Non è stato definito
  1680.     'dall'utente."
  1681.     'nel caso dell'idrogramma di progetto, in base all'inserimento della Soglia, viene trovata l'ora e la portata di picco ad essa corrispondente. nel caso dell'idrogramma con portata di picco a scelta, viene calcolata la
  1682.     'corrispondente portata di picco. In entrambi i casi, la subroutine determina il relativo idrogramma per interpolazione tra i 2 adiacenti tra i 24 calcolati, rispetto alla portata di picco individuata. nel caso in cui
  1683.     'l'idrogramma di progetto coincida con uno dei 24 calcolati, non effettua interpolazioni ma considera quello.
  1684.     'il metodo utilizzato per i calcoli è di tipo grafico. essenzialmente, sui grafici, ad ogni pixel corrisponde una coppia di valori (ora,portata). quando per esempio viene chiesta la Soglia, si sta visualizzando il grafico
  1685.     'in cui sono riportati tutti i 24 idrogrammi, i cui punti corrispondenti alle rispettive portate di picco sono uniti da una spezzata gialla disegnata dalla subroutine DisegnaLinea. quando viene inserita una Soglia, la
  1686.     'subroutine esegue queste operazioni:
  1687.     '- prende in ascissa l'ora 1 e analizza la retta X=1, partendo da Y=0, avanzando pixel per pixel: (1,0), (1,1), (1,2), (1,3),...;
  1688.     '- quando trova un pixel giallo, lo interroga sul suo valore di portata.
  1689.     '- passa all'ora 2 e ripete il meccanismo fino a che non trova un pixel giallo e lo interroga sul suo valore di portata;
  1690.     '- confronta la portata di picco dell'ora 1 con quella dell'ora 2;
  1691.     '- se la portata di picco dell'ora 1 aumentata percentualmente della Soglia è maggiore della portata di picco dell'ora 2, si ferma e considera come ora di picco di progetto quella dell'ora 1, se no ripete confrontando
  1692.     '  l'ora 2 con l'ora 3;
  1693.     '- quando si ferma significa che ha trovato l'ora di picco corrispondente all'idrogramma di progetto, con la relativa portata di picco;
  1694.     '- considera i 2 idrogrammi di calcolo, tra i 24 calcolati, adiacenti alla portata di picco individuata e da ciascuno crea un un nuovo idrogramma (non visibile all'utente), con un colore diverso da quelli presenti sul
  1695.     '  grafico visibile (colore1 e colore2), in modo che i rispettivi picchi coincidano con il punto di picco di progetto precedentemente individuato;
  1696.     '- analizza la retta Y=1 procedendo pixel per pixel: (0,1), (1,1), (2,1), (3,1),...;
  1697.     '- quando trova colore1 o colore2, interroga il pixel sul suo valore (ora1, portata) e prosegue, fino a che non trova colore2 o colore1 e interroga il pixel sul suo valore (ore2,portata), pertanto si ha un valore di portata
  1698.     '  a cui sono associate 2 ore;
  1699.     '- calcola la media tra ore1 e ore2, ottenendo così un'unica coppia (ora,portata), che viene memorizzata nel vettore dell'idrogramma in corso di calcolo;
  1700.     '- incrementa in ordinana di un pixel, analizzando la retta Y=2 analogamente a prima e ripete per Y=3,4,... fino a che Y non corrisponde al valore della portata di picco;
  1701.     '- ripete l'algoritmo decrementando Y, fino a che non arriva a Y=0;
  1702.     '- al temine di queste operazioni, vi sono N coppie di valori (ore, portata), che rappresentano l'idrogramma di progetto;
  1703.     '- l'idrogramma è visualizzato sullo schermo;
  1704.     '- l'idrogramma così ottenuto però presenta centinaia di valori, in quanto costruito pixel per pixel e quindi esso viene infine discretizzato, in modo da ottenere 50 coppie di valori, come per i 24 idrogrammi calcolati.
  1705.     'Per il calcolo dell'idrogramma a scelta, viene utilizzato un procedimento analogo.
  1706.  
  1707.     SHARED dx%, dy%
  1708.     SHARED dx!, dy!
  1709.     SHARED soglia%%
  1710.  
  1711.     DIM soglia!
  1712.     DIM test~`
  1713.  
  1714.     REDIM _PRESERVE y%(i%)
  1715.  
  1716.     _DEST schermo&
  1717.     SELECT CASE VisualizzaIeto%%
  1718.         CASE IS = 1
  1719.             INPUT "- Inserire la soglia percentuale S per il calcolo dell'idrogramma di progetto e illustrata nella prima schermata (INVIO o 0 per tralasciare): ", soglia%%
  1720.             soglia! = soglia%% / 100
  1721.             _DEST immagine&
  1722.             _SOURCE immagine&
  1723.             CALL ScalaOrigine(0, 1, 0, 0, immagine&)
  1724.             i% = 0
  1725.             y%(1) = dy%
  1726.             DO
  1727.                 i% = i% + 1
  1728.                 REDIM _PRESERVE y%(i%)
  1729.                 DO
  1730.                     IF POINT(dx! + i%, PMAP(y%(i%), 3)) = giallo& THEN EXIT DO
  1731.                     y%(i%) = y%(i%) - 1
  1732.                 LOOP
  1733.                 IF i% > 1 THEN
  1734.                     IF PMAP(y%(i%), 3) < (1 + soglia!) * PMAP(y%(i% - 1), 3) THEN
  1735.                         test~` = 1
  1736.                         EXIT DO
  1737.                     ELSE
  1738.                         test~` = 0
  1739.                     END IF
  1740.                 END IF
  1741.             LOOP UNTIL i% = INT(X3!)
  1742.             SELECT CASE test~`
  1743.                 CASE IS = 1
  1744.                     ore!(1) = i% - 1
  1745.                     REDIM _PRESERVE y%(1 TO UBOUND(y%) - 1)
  1746.                     portata!(1) = PMAP(y%(UBOUND(y%)), 3) - dy!
  1747.                     CALL DisegnaValore(ore!(1), portata!(1), trasparente&, trasparente&, bianco&)
  1748.                     _DEST schermo&
  1749.                 CASE IS = 0
  1750.                     _DEST schermo&
  1751.                     CLS 2
  1752.                     SELECT CASE soglia%%
  1753.                         CASE IS = 0
  1754.                             PRINT "Verr… considerato come idrogramma di progetto quello relativo alla portata di picco massima."
  1755.                         CASE ELSE
  1756.                             PRINT "La soglia scelta non permette di individuare, all'interno del campo, la corrispondente portata di picco. Verr… considerato come idrogramma di progetto quello relativo alla portata di picco massima."
  1757.                             soglia%% = 0
  1758.                     END SELECT
  1759.                     portata!(1) = Y!
  1760.                     ore!(1) = X3!
  1761.             END SELECT
  1762.         CASE IS = 2
  1763.             test~` = 0
  1764.             portata!(1) = Y!
  1765.             ore!(1) = X3!
  1766.             IF esc~` = 1 THEN
  1767.                 tipo%% = 1
  1768.                 GOSUB interpola
  1769.                 EXIT SUB
  1770.             END IF
  1771.             PRINT "Verr… considerato come idrogramma di progetto quello relativo alla portata di picco massima."
  1772.     END SELECT
  1773.     tipo%% = 1
  1774.     _DEST immagine&
  1775.     LOCATE 2, _WIDTH(immagine&) \ 8 - 27: COLOR bianco&: PRINT "Legenda:"
  1776.     LOCATE 4, _WIDTH(immagine&) \ 8 - 27: COLOR azzurro&: PRINT "[Idrogramma di progetto]": COLOR bianco&
  1777.     GOSUB interpola
  1778.     tipo%% = 2
  1779.     CALL DisegnaPortata(X1!, immagine&, destinazione&)
  1780.     IF ore!(2) <> 0 THEN
  1781.         test~` = 1
  1782.         _DEST immagine&
  1783.         LOCATE 6, _WIDTH(immagine&) \ 8 - 27: COLOR viola&: PRINT "[Idrogramma corrispondente"
  1784.         LOCATE , _WIDTH(immagine&) \ 8 - 27: PRINT "all'ora  di picco  scelta]": COLOR bianco&
  1785.         GOSUB interpola
  1786.     END IF
  1787.     EXIT SUB
  1788.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  1789.     interpola:
  1790.     'routine che crea i 2 idrogrammi di passaggio descritti precedentemente ed effettua l'interpolazione per la determinazione dell'idrogramma di progetto e di quello corrispondente all'ora di picco a scelta.
  1791.  
  1792.     DIM x%(2)
  1793.     DIM y%
  1794.     DIM k(2) AS idrogramma
  1795.     DIM costruisci(50, 2) AS idrogramma
  1796.     DIM max%
  1797.     DIM originale&
  1798.  
  1799.     originale& = _COPYIMAGE(immagine&)
  1800.     _SOURCE immagine&
  1801.     CALL ScalaOrigine(0, 1, 0, 0, immagine&)
  1802.     SELECT CASE test~`
  1803.         CASE IS = 0
  1804.             FOR i% = 1 TO 50
  1805.                 REDIM _PRESERVE idrogramma1(i%) AS idrogramma
  1806.                 REDIM _PRESERVE IdroPixel1(i%) AS idrogramma
  1807.                 idrogramma1(i%).ore = idrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), i%, 1).ore
  1808.                 idrogramma1(i%).portata = idrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), i%, 1).portata
  1809.                 IdroPixel1(i%).ore = idrogramma1(i%).ore
  1810.                 IdroPixel1(i%).portata = idrogramma1(i%).portata
  1811.             NEXT i%
  1812.             FinePioggiaIdrogrammi1e2(tipo%%).ore = FinePioggiaIdrogrammi1a24(VisualizzaIeto%%, IdroMaxieto%%(VisualizzaIeto%%), 1).ore
  1813.         CASE IS = 1
  1814.             z%% = 2
  1815.             DO
  1816.                 IF MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).ore > ore!(tipo%%) THEN
  1817.                     k(1).ore = ore!(tipo%%) / MassimiIdrogrammi1a24(VisualizzaIeto%%, z%% - 1, 1).ore
  1818.                     k(1).portata = portata!(tipo%%) / MassimiIdrogrammi1a24(VisualizzaIeto%%, z%% - 1, 1).portata
  1819.                     k(2).ore = ore!(tipo%%) / MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).ore
  1820.                     k(2).portata = portata!(tipo%%) / MassimiIdrogrammi1a24(VisualizzaIeto%%, z%%, 1).portata
  1821.                     EXIT DO
  1822.                 ELSE
  1823.                     z%% = z%% + 1
  1824.                 END IF
  1825.             LOOP
  1826.             FOR i% = 1 TO 50
  1827.                 costruisci(i%, 1).ore = k(1).ore * idrogrammi1a24(VisualizzaIeto%%, z%% - 1, i%, 1).ore
  1828.                 costruisci(i%, 1).portata = k(1).portata * idrogrammi1a24(VisualizzaIeto%%, z%% - 1, i%, 1).portata
  1829.                 costruisci(i%, 2).ore = k(2).ore * idrogrammi1a24(VisualizzaIeto%%, z%%, i%, 1).ore
  1830.                 costruisci(i%, 2).portata = k(2).portata * idrogrammi1a24(VisualizzaIeto%%, z%%, i%, 1).portata
  1831.             NEXT i%
  1832.             FinePioggiaIdrogrammi1e2(tipo%%).ore = (costruisci(PassiFinePioggia1a24%%(z%% - 1), 1).ore + costruisci(PassiFinePioggia1a24%%(z%%), 2).ore) / 2
  1833.             _DEST immagine&
  1834.             FOR n% = 1 TO 2
  1835.                 IF n% = 1 THEN colore& = pastello&
  1836.                 IF n% = 2 THEN colore& = viola&
  1837.                 FOR i% = 1 TO 50
  1838.                     IF i% = 1 THEN LINE (dx!, dy!)-(dx! + costruisci(i%, n%).ore, dy! + costruisci(i%, n%).portata), colore&
  1839.                     IF i% > 1 THEN LINE (dx! + costruisci(i% - 1, n%).ore, dy! + costruisci(i% - 1, n%).portata)-(dx! + costruisci(i%, n%).ore, dy! + costruisci(i%, n%).portata), colore&
  1840.                 NEXT i%
  1841.             NEXT n%
  1842.             i% = 0
  1843.             y% = PMAP(dy!, 1)
  1844.             DO
  1845.                 i% = i% + 1
  1846.                 SELECT CASE tipo%%
  1847.                     CASE IS = 1
  1848.                         REDIM _PRESERVE IdroPixel1(i%) AS idrogramma
  1849.                     CASE IS = 2
  1850.                         REDIM _PRESERVE IdroPixel2(i%) AS idrogramma
  1851.                 END SELECT
  1852.                 x%(1) = PMAP(dx!, 0)
  1853.                 x%(2) = PMAP(dx!, 0)
  1854.                 DO
  1855.                     IF POINT(PMAP(x%(2), 2), PMAP(y%, 3)) = viola& THEN EXIT DO
  1856.                     x%(2) = x%(2) + 1
  1857.                 LOOP
  1858.                 DO
  1859.                     IF POINT(PMAP(x%(1), 2), PMAP(y%, 3)) = pastello& THEN EXIT DO
  1860.                     x%(1) = x%(1) + 1
  1861.                 LOOP UNTIL PMAP(x%(1), 2) >= dx! + ore!(tipo%%)
  1862.                 IF PMAP(x%(1), 2) >= dx! + ore!(tipo%%) THEN x%(1) = x%(2)
  1863.                 SELECT CASE tipo%%
  1864.                     CASE IS = 1
  1865.                         IdroPixel1(i%).ore = (PMAP(x%(1), 2) + PMAP(x%(2), 2)) / 2 - dx!
  1866.                         IdroPixel1(i%).portata = PMAP(y%, 3) - dy!
  1867.                     CASE IS = 2
  1868.                         IdroPixel2(i%).ore = (PMAP(x%(1), 2) + PMAP(x%(2), 2)) / 2 - dx!
  1869.                         IdroPixel2(i%).portata = PMAP(y%, 3) - dy!
  1870.                 END SELECT
  1871.                 y% = y% - 1
  1872.             LOOP UNTIL y% = PMAP(dy! + portata!(tipo%%), 1)
  1873.             max% = i%
  1874.             i% = i% - 1
  1875.             y% = PMAP(dy! + portata!(tipo%%), 1)
  1876.             DO
  1877.                 i% = i% + 1
  1878.                 SELECT CASE tipo%%
  1879.                     CASE IS = 1
  1880.                         REDIM _PRESERVE IdroPixel1(i%) AS idrogramma
  1881.                     CASE IS = 2
  1882.                         REDIM _PRESERVE IdroPixel2(i%) AS idrogramma
  1883.                 END SELECT
  1884.                 x%(1) = PMAP(dx! + ore!(tipo%%), 0)
  1885.                 x%(2) = PMAP(dx! + ore!(tipo%%), 0)
  1886.                 DO
  1887.                     IF POINT(PMAP(x%(2), 2), PMAP(y%, 3)) = viola& THEN EXIT DO
  1888.                     x%(2) = x%(2) + 1
  1889.                 LOOP
  1890.                 DO
  1891.                     IF POINT(PMAP(x%(1), 2), PMAP(y%, 3)) = pastello& THEN EXIT DO
  1892.                     x%(1) = x%(1) + 1
  1893.                 LOOP UNTIL PMAP(x%(1), 2) >= X2! * 1.15
  1894.                 IF PMAP(x%(1), 2) >= X2! * 1.15 THEN x%(1) = x%(2)
  1895.                 SELECT CASE tipo%%
  1896.                     CASE IS = 1
  1897.                         IdroPixel1(i%).ore = (PMAP(x%(1), 2) + PMAP(x%(2), 2)) / 2 - dx!
  1898.                         IdroPixel1(i%).portata = PMAP(y%, 3) - dy!
  1899.                     CASE IS = 2
  1900.                         IdroPixel2(i%).ore = (PMAP(x%(1), 2) + PMAP(x%(2), 2)) / 2 - dx!
  1901.                         IdroPixel2(i%).portata = PMAP(y%, 3) - dy!
  1902.                 END SELECT
  1903.                 y% = y% + 1
  1904.                 IF costruisci(50, 1).portata > costruisci(50, 2).portata THEN IF PMAP(y%, 3) - dy! < costruisci(50, 1).portata THEN EXIT DO
  1905.                 IF costruisci(50, 1).portata <= costruisci(50, 2).portata THEN IF PMAP(y%, 3) - dy! < costruisci(50, 2).portata THEN EXIT DO
  1906.             LOOP UNTIL y% = PMAP(dy!, 1)
  1907.             SELECT CASE tipo%%
  1908.                 CASE IS = 1
  1909.                     passo% = UBOUND(IdroPixel1) \ 50
  1910.                     i% = 0
  1911.                     DO
  1912.                         i% = i% + 1
  1913.                         REDIM _PRESERVE idrogramma1(i%) AS idrogramma
  1914.                         IF i% * passo% >= max% THEN EXIT DO
  1915.                         idrogramma1(i%).ore = IdroPixel1(i% * passo%).ore
  1916.                         idrogramma1(i%).portata = IdroPixel1(i% * passo%).portata
  1917.                     LOOP
  1918.                     idrogramma1(i%).ore = ore!(1)
  1919.                     idrogramma1(i%).portata = portata!(1)
  1920.                     DO
  1921.                         i% = i% + 1
  1922.                         IF i% * passo% >= UBOUND(IdroPixel1) THEN EXIT DO
  1923.                         REDIM _PRESERVE idrogramma1(i%) AS idrogramma
  1924.                         idrogramma1(i%).ore = IdroPixel1(i% * passo%).ore
  1925.                         idrogramma1(i%).portata = IdroPixel1(i% * passo%).portata
  1926.                     LOOP UNTIL i% = 50
  1927.                 CASE IS = 2
  1928.                     passo% = UBOUND(IdroPixel2) \ 50
  1929.                     IF passo% >= 1 THEN
  1930.                         i% = 0
  1931.                         DO
  1932.                             i% = i% + 1
  1933.                             REDIM _PRESERVE idrogramma2(i%) AS idrogramma
  1934.                             IF i% * passo% >= max% THEN EXIT DO
  1935.                             idrogramma2(i%).ore = IdroPixel2(i% * passo%).ore
  1936.                             idrogramma2(i%).portata = IdroPixel2(i% * passo%).portata
  1937.                         LOOP
  1938.                         idrogramma2(i%).ore = ore!(2)
  1939.                         idrogramma2(i%).portata = portata!(2)
  1940.                         DO
  1941.                             i% = i% + 1
  1942.                             IF i% * passo% >= UBOUND(IdroPixel2) THEN EXIT DO
  1943.                             REDIM _PRESERVE idrogramma2(i%) AS idrogramma
  1944.                             idrogramma2(i%).ore = IdroPixel2(i% * passo%).ore
  1945.                             idrogramma2(i%).portata = IdroPixel2(i% * passo%).portata
  1946.                         LOOP UNTIL i% = 50
  1947.                     ELSE
  1948.                         FOR i% = 1 TO UBOUND(IdroPixel2)
  1949.                             REDIM _PRESERVE idrogramma2(i%) AS idrogramma
  1950.                             idrogramma2(i%).ore = IdroPixel2(i%).ore
  1951.                             idrogramma2(i%).portata = IdroPixel2(i%).portata
  1952.                         NEXT i%
  1953.                     END IF
  1954.             END SELECT
  1955.             immagine& = _COPYIMAGE(originale&)
  1956.     END SELECT
  1957.     _DEST immagine&
  1958.     IF tipo%% = 1 THEN colore& = azzurro&
  1959.     IF tipo%% = 2 THEN colore& = viola&
  1960.     SELECT CASE tipo%%
  1961.         CASE IS = 1
  1962.             FOR i% = 1 TO UBOUND(IdroPixel1)
  1963.                 IF i% = 1 THEN
  1964.                     LINE (dx!, dy!)-(dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), colore&
  1965.                 ELSE
  1966.                     LINE (dx! + IdroPixel1(i% - 1).ore, dy! + IdroPixel1(i% - 1).portata)-(dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), colore&
  1967.                 END IF
  1968.                 CIRCLE (dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), PMAP(1, 2), colore&
  1969.                 PAINT (dx! + IdroPixel1(i%).ore, dy! + IdroPixel1(i%).portata), colore&
  1970.             NEXT i%
  1971.         CASE IS = 2
  1972.             FOR i% = 1 TO UBOUND(IdroPixel2)
  1973.                 IF i% = 1 THEN
  1974.                     LINE (dx!, dy!)-(dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), colore&
  1975.                 ELSE
  1976.                     LINE (dx! + IdroPixel2(i% - 1).ore, dy! + IdroPixel2(i% - 1).portata)-(dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), colore&
  1977.                 END IF
  1978.                 CIRCLE (dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), PMAP(1, 2), colore&
  1979.                 PAINT (dx! + IdroPixel2(i%).ore, dy! + IdroPixel2(i%).portata), colore&
  1980.             NEXT i%
  1981.     END SELECT
  1982.     CALL DisegnaLinea(VisualizzaIeto%%, immagine&, giallo&, bianco&)
  1983.     _PUTIMAGE (0, 0), immagine&, destinazione&
  1984.     _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(destinazione&)), (DESKTOPHEIGHT% - _HEIGHT(destinazione&) - 16)), destinazione&, schermo&
  1985.     ERASE k, costruisci, x%
  1986.     _FREEIMAGE originale&
  1987.     RETURN
  1988. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1989. '--------------------------------------------------------------------------------------------------------------------------------------------------
  1990. SUB ScalaOrigine (scala~%, origine~%, X!, Y!, immagine&)
  1991.     'scala~%: se 1, attiva la routine scala, se 0, non l'attiva.
  1992.     'origine~%:  se 1, attiva la routine origine, se 0, non l'attiva.
  1993.     'X!: valore massimo in ascissa
  1994.     'Y!: valore massimo in ordinata.
  1995.     'immagine&: è l'immagine su cui viene fissata l'origine degli assi dalla routine origine.
  1996.     'subroutine che scala l'immagine tramite WINDOW. generalmente vengono eseguite entrambe le routine, tuttavia in certi casi il programma opera su immagini già scalate, per esempio quando compie operazioni grafiche su immagini
  1997.     'già scalate.
  1998.  
  1999.     SHARED dx%, dy%
  2000.     SHARED dx!, dy!
  2001.  
  2002.     DIM fattoreX!, fattoreY!
  2003.  
  2004.     fattoreX! = 1
  2005.     fattoreY! = 1
  2006.     IF scala~% = 0 AND origine~% = 1 THEN GOSUB origine
  2007.     IF scala~% = 1 AND origine~% = 1 THEN
  2008.         DO
  2009.             GOSUB scala
  2010.             GOSUB origine
  2011.             IF Y! * fattoreY! >= dy! + Y! + dy! + dy! THEN
  2012.                 IF X! * fattoreX! >= dx! + X! + dx! + dx! THEN
  2013.                     EXIT DO
  2014.                 ELSE
  2015.                     fattoreX! = fattoreX! + 0.01
  2016.                 END IF
  2017.             ELSE
  2018.                 fattoreY! = fattoreY! + 0.01
  2019.             END IF
  2020.         LOOP
  2021.     END IF
  2022.     EXIT SUB
  2023.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  2024.     scala:
  2025.  
  2026.     WINDOW
  2027.     WINDOW (0, 0)-(X! * fattoreX!, Y! * fattoreY!)
  2028.     RETURN
  2029.     '--------------------------------------------------------------------------------------------------------------------------------------------------
  2030.     origine:
  2031.  
  2032.     dx% = 39
  2033.     dx! = PMAP(dx%, 2)
  2034.     dy% = _HEIGHT(immagine&) - 1 - dx%
  2035.     dy! = PMAP(dy%, 3)
  2036.     RETURN
  2037. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2038. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2039. SUB DisegnaAssi (X$, Y$, X!, Y!, immagine&, ColoreCartiglio&, ColoreAssi&, ColoreTacca&, ColoreNumeri&)
  2040.     'subroutine che disegna gli assi.
  2041.     'X$: titolo asse X.
  2042.     'Y$: titolo asse Y.
  2043.     'X!: valore massimo in ascissa.
  2044.     'Y!: valore massimo in ordinata.
  2045.  
  2046.     SHARED dx%, dy%
  2047.     SHARED dx!, dy!
  2048.  
  2049.     DIM x%, y%
  2050.     DIM taccaX!, taccaY!
  2051.  
  2052.     _DEST immagine&: CLS
  2053.     SELECT CASE X!
  2054.         CASE IS >= 12
  2055.             taccaX! = X! \ 6
  2056.         CASE IS <= 1
  2057.             taccaX! = 0.25
  2058.         CASE ELSE
  2059.             taccaX! = 0.5
  2060.     END SELECT
  2061.     SELECT CASE Y!
  2062.         CASE IS >= 12
  2063.             taccaY! = Y! \ 6
  2064.         CASE IS <= 1
  2065.             taccaY! = 0.25
  2066.         CASE ELSE
  2067.             taccaY! = 0.5
  2068.     END SELECT
  2069.     WINDOW
  2070.     LINE (0, 0)-(_WIDTH(immagine&) - 1, _HEIGHT(immagine&) - 1), ColoreCartiglio&, B
  2071.     CALL ScalaOrigine(1, 1, X!, Y!, immagine&)
  2072.     LINE (dx!, dy! + Y! + dy!)-(dx!, dy!), ColoreAssi&: LINE -(dx! + X! + dx!, dy!), ColoreAssi&
  2073.     PSET (dx!, dy! + Y! + dy!), ColoreAssi&: DRAW "F20": PSET (dx!, dy! + Y! + dy!), ColoreAssi&: DRAW "G20"
  2074.     PSET (dx! + X! + dx!, dy!), ColoreAssi&: DRAW "G20": PSET (dx! + X! + dx!, dy!), ColoreAssi&: DRAW "H20"
  2075.     COLOR ColoreNumeri&
  2076.     _PRINTSTRING (PMAP(dx! + X! + dx!, 0), dy%), X$
  2077.     _PRINTSTRING (dx%, PMAP(dy! + Y! + dy!, 1) - dx% \ 2), Y$
  2078.     _PRINTSTRING (dx% \ 4, dy% - 7), "0"
  2079.     i% = 1
  2080.     WHILE i% * taccaX! <= X!
  2081.         LINE (dx! + i% * taccaX!, PMAP(dy% + 5, 3))-(dx! + i% * taccaX!, PMAP(dy% - 5, 3)), ColoreTacca&
  2082.         x% = PMAP(dx! + i% * taccaX!, 0)
  2083.         _PRINTSTRING (x% - 3 * LEN(_TRIM$(STR$(i% * taccaX!))), _HEIGHT(immagine&) - 1 - dx% + 5), _TRIM$(STR$(i% * taccaX!))
  2084.         i% = i% + 1
  2085.     WEND
  2086.     i% = 1
  2087.     WHILE i% * taccaY! <= Y!
  2088.         LINE (PMAP(dx% - 5, 2), dy! + i% * taccaY!)-(PMAP(dx% + 5, 2), dy! + i% * taccaY!), ColoreTacca&
  2089.         y% = PMAP(dy! + i% * taccaY!, 1)
  2090.         _PRINTSTRING (dx% \ 4, y% - 7), _TRIM$(STR$(i% * taccaY!))
  2091.         i% = i% + 1
  2092.     WEND
  2093. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2094. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2095. SUB DisegnaValore (X!, Y!, ColoreLinea&, ColorePunto&, ColoreTesto&)
  2096.     'subroutine che disegna e scrive sul grafico il punto con valore (X!,Y!) e disegna 2 linee tratteggiate fino agli assi.
  2097.  
  2098.     SHARED dx%, dy%
  2099.     SHARED dx!, dy!
  2100.  
  2101.     DIM x%, y%
  2102.  
  2103.     CIRCLE (dx! + X!, dy! + Y!), PMAP(3, 2), ColorePunto&
  2104.     PAINT (dx! + X! + PMAP(0.5, 2), dy! + Y! + PMAP(0.5, 2)), ColorePunto&
  2105.     LINE (dx!, dy! + Y!)-(dx! + X!, dy! + Y!), ColoreLinea&, , 65520
  2106.     LINE -(dx! + X!, dy!), ColoreLinea&, , 65520
  2107.     x% = PMAP(dx! + X!, 0)
  2108.     y% = PMAP(dy! + Y!, 1)
  2109.     COLOR ColoreTesto&
  2110.     _PRINTSTRING (x% + 4, y% - 16), "(" + _TRIM$(STR$(Arrotonda!(X!))) + ";" + _TRIM$(STR$(Arrotonda!(Y!))) + ")"
  2111. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2112. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2113. SUB DisegnaPortata (X!, immagine&, destinazione&)
  2114.     'subroutine che utilizza la subroutine DisegnaValore per disegnare e scrivere sul grafico il punto con valore (X!,Y!). le linee tratteggiate, però, sono disegnate in modo animato, anziché visualizzate istantaneamente.
  2115.     'per la determinazione della portata (Y!), chiede come input l'ora (X!) e procede cercando il pixel giallo, similmente a come spiegato per la subroutine CalcolaIdrogramma.
  2116.  
  2117.     SHARED dx%, dy%
  2118.     SHARED dx!, dy!
  2119.  
  2120.     DIM ore%%, minuti%%
  2121.     DIM x%, y%
  2122.  
  2123.     _DEST schermo&
  2124.     SELECT CASE tipo%%
  2125.         CASE IS <> 3
  2126.             DO
  2127.                 DO
  2128.                     DO
  2129.                         VIEW PRINT 2 TO 5
  2130.                         CLS 2
  2131.                         PRINT "- Digitare le ore e i minuti a scelta (>= 20 minuti e <= "; _TRIM$(STR$(INT(X!))); " ore e "; _TRIM$(STR$(INT((X! - INT(X!)) * 60) - 1)); " minuti) di cui viene calcolata la corrispondente portata di picco e relativo idrogramma (INVIO o 0 per tralasciare)."
  2132.                         PRINT "Ore:"
  2133.                         PRINT "Minuti:"
  2134.                         LOCATE 3, 9
  2135.                         INPUT "", ore%%
  2136.                     LOOP WHILE ore%% > INT(X!)
  2137.                     LOCATE , 9
  2138.                     INPUT "", minuti%%
  2139.                     ore!(tipo%%) = Arrotonda!(ore%% + minuti%% / 60)
  2140.                     IF ore!(tipo%%) = 0 THEN EXIT DO
  2141.                 LOOP WHILE ore!(tipo%%) >= Arrotonda!(X!)
  2142.                 VIEW PRINT 1 TO 4
  2143.                 IF ore!(tipo%%) = 0 THEN EXIT SUB
  2144.             LOOP WHILE ore!(tipo%%) < Arrotonda!(20 / 60)
  2145.         CASE IS = 3
  2146.             DO
  2147.                 DO
  2148.                     CLS 2
  2149.                     PRINT "- Digitare le ore e i minuti (<= "; _TRIM$(STR$(INT(X!))); " ore e "; _TRIM$(STR$(INT((X! - INT(X!)) * 60) - 1)); " minuti) di cui si vuole conoscere la portata (INVIO o 0 per tralasciare)."
  2150.                     PRINT "Ore:"
  2151.                     PRINT "Minuti:"
  2152.                     LOCATE 2, 9
  2153.                     INPUT "", ore%%
  2154.                 LOOP WHILE ore%% > INT(X!)
  2155.                 LOCATE , 9
  2156.                 INPUT "", minuti%%
  2157.                 ore!(tipo%%) = Arrotonda!(ore%% + minuti%% / 60)
  2158.                 IF ore!(tipo%%) = 0 THEN EXIT SUB
  2159.             LOOP WHILE ore!(tipo%%) >= Arrotonda(X!)
  2160.     END SELECT
  2161.     _DEST immagine&
  2162.     _SOURCE immagine&
  2163.     CALL ScalaOrigine(0, 1, 0, 0, immagine&)
  2164.     x% = PMAP(dx! + ore!(tipo%%), 0)
  2165.     y% = PMAP(dy!, 1)
  2166.     DO
  2167.         y% = y% - 1
  2168.         IF tipo%% = 3 THEN
  2169.             IF POINT(dx! + ore!(tipo%%), PMAP(y%, 3)) = azzurro& THEN
  2170.                 _DEST schermo&
  2171.                 EXIT SUB
  2172.             END IF
  2173.         END IF
  2174.         IF POINT(dx! + ore!(tipo%%), PMAP(y%, 3)) = giallo& THEN EXIT DO
  2175.         LINE (dx! + ore!(tipo%%), dy!)-(dx! + ore!(tipo%%), PMAP(y%, 3)), grigio&, , 65520
  2176.         _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(destinazione&)), (DESKTOPHEIGHT% - _HEIGHT(destinazione&) - 16)), immagine&, schermo&
  2177.     LOOP
  2178.     portata!(tipo%%) = PMAP(y%, 3) - dy!
  2179.     CALL DisegnaValore(ore!(tipo%%), portata!(tipo%%), trasparente&, trasparente&, bianco&)
  2180.     i% = 2
  2181.     DO
  2182.         x% = x% - 1
  2183.         IF POINT(PMAP(x%, 2), PMAP(y%, 3)) = bianco& THEN EXIT DO
  2184.         LINE (dx! + ore!(tipo%%), PMAP(y%, 3))-(PMAP(x%, 2), PMAP(y%, 3)), grigio&, , 65520
  2185.         _PUTIMAGE ((DESKTOPWIDTH% - _WIDTH(destinazione&)), (DESKTOPHEIGHT% - _HEIGHT(destinazione&) - 16)), immagine&, schermo&
  2186.     LOOP
  2187.     _DEST schermo&
  2188. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2189. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2190. SUB DisegnaLinea (visualizza%%, immagine&, ColoreLinea&, ColorePunto&)
  2191.     'subroutine che disegna una spezzata (gialla) che, partendo dall'origine, congiunge le portate di picco dei 24 idrogrammi di calcolo. tale spezzata gialla è quella che interrompe la ricerca del pixel giallo ad opera delle
  2192.     'subroutine CalcolaIdrogramma e DisegnaPortata.
  2193.     'visualizza%%: può assumere il valore di ieto%% o di VisualizzaIeto%%. quando la subroutine è interna ad un ciclo FOR ieto%%=1 to 2, assume valore ieto%%. quando invece è chiamata per esempio per ritracciare la linea gialla
  2194.     'sul grafico su cui è stato disegnato l'idrogramma di progetto e/o corrispondente all'ora di picco scelta, assume valore VisualizzaIeto%%. Il ritracciamento della linea gialla è operato al termine della routine "interpola"
  2195.     'della subroutine CalcolaIdrogramma, per il motivo ivi illustrato.
  2196.  
  2197.     SHARED dx%, dy%
  2198.     SHARED dx!, dy!
  2199.  
  2200.     CALL ScalaOrigine(0, 1, 0, 0, immagine&)
  2201.     _SOURCE immagine&
  2202.     FOR z%% = 1 TO 24
  2203.         CIRCLE (dx! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).ore, dy! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).portata), PMAP(3, 2), ColorePunto&
  2204.         PAINT (dx! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).ore - PMAP(2.5, 2), dy! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).portata), ColorePunto&
  2205.         IF z%% = 1 THEN
  2206.             LINE (dx!, dy!)-(dx! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).ore, dy! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).portata), ColoreLinea&
  2207.         ELSE
  2208.             LINE (dx! + MassimiIdrogrammi1a24(visualizza%%, z%% - 1, 1).ore, dy! + MassimiIdrogrammi1a24(visualizza%%, z%% - 1, 1).portata)-(dx! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).ore, dy! + MassimiIdrogrammi1a24(visualizza%%, z%%, 1).portata), ColoreLinea&
  2209.         END IF
  2210.     NEXT z%%
  2211. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2212. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2213. SUB Dati (binario%%, colonna%)
  2214.     'subroutine che scrive i dati. le tipologie di dati sono 9:
  2215.     '1) Tempo di ritorno;
  2216.     '2) CN(III);
  2217.     '3) Contenuto idrico massimo del terreno;
  2218.     '4) Perdite iniziali;
  2219.     '5) Tempo di corrivazione;
  2220.     '6) Tipo di ietogrammi di calcolo;
  2221.     '7) Idrogramma di calcolo;
  2222.     '8) Durata della pioggia;
  2223.     '9) Passo temporale.
  2224.     'le prime 5 sono sempre scritte ogni volta che viene richiamata la subroutine. le rimanenti 4 sono scritte a seconda del valore della variabile binario%%.
  2225.     'binario%%: è un numero decimale che può assumere valore massimo 15=1*2^3+1*2^2+1*2^1+1*2^0=8+4+2+1, che corrisponde al numero binario 1111, dove ogni 1 corrisponde a considerare VERA la condizione di visualizzare la
  2226.     'corrispondente tipologia. tale condizione è verificata tramite l'operatore AND.
  2227.     'per esempio, supponendo di voler visualizzare:
  2228.     '- Idrogramma di calcolo;
  2229.     '- Passo temporale.
  2230.     'il numero binario dovrà essere 0101, cioè 0*2^3+1*2^2+0*2^1+1*2^0=4+1=5.
  2231.     'quindi si avrà:
  2232.     '- Tipo di ietogrammi di calcolo:
  2233.     '1000 AND
  2234.     '0101 FALSO
  2235.     '- Idrogramma di calcolo:
  2236.     '0100 AND
  2237.     '0101 VERO
  2238.     '- Durata della pioggia:
  2239.     '0010 AND
  2240.     '0101 FALSO
  2241.     '- Passo temporale:
  2242.     '0001 AND
  2243.     '0101 VERO
  2244.     'colonna%: variabile che permette di posizionare la scrittura dei dati nel punto desiderato.
  2245.  
  2246.     SHARED T$, CNIII!, S2!, Ia!, tc!, dt!()
  2247.  
  2248.     LOCATE , colonna%: PRINT "- Tempo di ritorno:"
  2249.     LOCATE , colonna% + 2: PRINT "T = "; T$; ";"
  2250.     LOCATE , colonna%: PRINT "- CN(III) = "; _TRIM$(STR$(Arrotonda!(CNIII!))); ";"
  2251.     LOCATE , colonna%: PRINT "- Contenuto idrico massimo del terreno:"
  2252.     LOCATE , colonna% + 2: PRINT "S = "; _TRIM$(STR$(Arrotonda!(S2!))); " mm;"
  2253.     LOCATE , colonna%: PRINT "- Perdite iniziali:"
  2254.     LOCATE , colonna% + 2: PRINT "Ia = "; _TRIM$(STR$(Arrotonda!(Ia!))); " mm;"
  2255.     LOCATE , colonna%: PRINT "- Tempo di corrivazione:"
  2256.     LOCATE , colonna% + 2: PRINT "tc = "; _TRIM$(STR$(Arrotonda!(tc!))); " ore = "; _TRIM$(STR$(INT(tc!))); " ore e "; _TRIM$(STR$(CINT(60 * (tc! - INT(tc!))))); " minuti."
  2257.     IF binario%% AND 2 ^ 3 THEN
  2258.         LOCATE , colonna%: PRINT "- Tipo di ietogrammi di calcolo:"
  2259.         LOCATE , colonna% + 2
  2260.         IF ieto%% = 1 THEN PRINT "CHICAGO;"
  2261.         IF ieto%% = 2 THEN PRINT "COSTANTE;"
  2262.         IF ieto%% > 2 THEN
  2263.             IF VisualizzaIeto%% = 1 THEN PRINT "CHICAGO;"
  2264.             IF VisualizzaIeto%% = 2 THEN PRINT "COSTANTE;"
  2265.         END IF
  2266.     END IF
  2267.     IF binario%% AND 2 ^ 2 THEN
  2268.         LOCATE , colonna%: PRINT "- Idrogramma di calcolo:"
  2269.         LOCATE , colonna% + 2: PRINT "n. "; _TRIM$(STR$(z%%)); ";"
  2270.     END IF
  2271.     IF binario%% AND 2 ^ 1 THEN
  2272.         LOCATE , colonna%: PRINT "- Durata della pioggia:"
  2273.         LOCATE , colonna% + 2: PRINT "d = "; _TRIM$(STR$(CoefficientiDiscretizzazioneTemporale(z%%).N)); " volte tc = "; _TRIM$(STR$(Arrotonda!(CoefficientiDiscretizzazioneTemporale(z%%).N * tc!))); " ore = "
  2274.         LOCATE , colonna% + 2: PRINT "= "; _TRIM$(STR$(INT(CoefficientiDiscretizzazioneTemporale(z%%).N * tc!))); " ore e "; _TRIM$(STR$(CINT(60 * (CoefficientiDiscretizzazioneTemporale(z%%).N * tc! - INT(CoefficientiDiscretizzazioneTemporale(z%%).N * tc!))))); " minuti;"
  2275.     END IF
  2276.     IF binario%% AND 2 ^ 0 THEN
  2277.         LOCATE , colonna%: PRINT "- Passo temporale:"
  2278.         LOCATE , colonna% + 2: PRINT "dt = "; _TRIM$(STR$(Arrotonda!(dt!(z%%)))); " ore = "; _TRIM$(STR$(INT(dt!(z%%)))); " ore e "; _TRIM$(STR$(CINT(60 * (dt!(z%%) - INT(dt!(z%%)))))); " minuti."
  2279.     END IF
  2280. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2281. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2282. SUB Tabella (k%%, n%%, ca1&, t1$, ca2&, t2$, ca3&, t3$, ca4&, t4$, ca5&, t5$, ca6&, t6$, ca7&, t7$, ca8&, t8$, binario%%, finecolonna%%, cb1&, v1!, cb2&, v2!, cb3&, v3!, cb4&, v4!, cb5&, v5!, cb6&, v6!, cb7&, v7!)
  2283.     'subroutine che scrive i titoli delle colonne della tabella e i dati della tabella stessa, riga per riga. gli elementi passati nella subroutine sono inseriti dentro i vettori c&(), v!(). i valori di v!() sono inoltre
  2284.     'convertiti in stringhe e caricati dentro il vettore t$().
  2285.     'k%%: la subroutine Tabella è inserita in cicli FOR e scrive una riga per volta. k%% è il contatore del ciclo del codice (che può essere i%, z%%,...) passato nella subroutine.
  2286.     'n%%: è un valore che dipende dallo schermo e rappresenta lo STEP del ciclo FOR. se lo schermo è sufficientemente grande da contenere tutti i valori della tabella (massimo 50) è = 1, se no, è = 2. k%% e n%%, hanno inizialmente
  2287.     'lo stesso valore. cioè, se lo schermo è grande, il ciclo parte dal valore 1, con STEP 1 e arriva per esempio a 50. Se lo schermo non è abbastanza grande, il ciclo parte da 2 con STEP 2 e arriva per esempio a 50.
  2288.     'binario%%: è un numero decimale che può assumere valore massimo 127=1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0=64+32+16+8+4+2+1, che corrisponde al numero binario 1111111. ad ogni cifra corrisponde una colonna e ad ogni 1
  2289.     'corrisponde la colonna in cui l'ora dev'essere nel formato ore:min.
  2290.     'finecolonna%: stabilisce qual è la prima colonna in cui scrivere il primo "¦" della riga. poiché la colonna è larga 8 spazi, di cui l'ultimo è il carattere "¦", il primo "¦" è scritto alla fine della colonna indicata dalla
  2291.     'variabile. sembrerebbe superfluo dover specificare che il primo "¦" della riga sia quello della prima colonna. infatti generalmente è così. ma quando si visualizzano i dati relativi all'idrogramma di progetto o dell'ora di
  2292.     'picco a scelta, le ultime 4 colonne sono il proseguimento delle prime. per cui il programma, compilate le prime 4 colonne, esce dalla subroutine, che viene poi rieseguita. la colonna corretta in cui spostarsi è dunque
  2293.     'definita da questa variabile e sarà 5, non 1.
  2294.  
  2295.     DIM c&(8), t$(8), v!(7)
  2296.  
  2297.     SHARED FineColonna%()
  2298.  
  2299.     c&(1) = ca1&: c&(2) = ca2&: c&(3) = ca3&: c&(4) = ca4&: c&(5) = ca5&: c&(6) = ca6&: c&(7) = ca7&: c&(8) = ca8&: t$(1) = t1$: t$(2) = t2$: t$(3) = t3$: t$(4) = t4$: t$(5) = t5$: t$(6) = t6$: t$(7) = t7$: t$(8) = t8$
  2300.     IF k%% = n%% THEN
  2301.         FOR p%% = 1 TO 8
  2302.             COLOR c&(p%%): PRINT t$(p%%);
  2303.             IF t$(p%%) = "-" THEN FineColonna%(p%%) = POS(0) - 1 + 4
  2304.             IF t$(p%%) <> "-" THEN FineColonna%(p%%) = POS(0) - (LEN(t$(p%%)) + 1) + LarghezzaColonna%%
  2305.             IF p%% <= 7 THEN IF LEN(t$(p%% + 1)) > 0 THEN COLOR grigio&: LOCATE , FineColonna%(p%%): PRINT "³";
  2306.         NEXT p%%
  2307.         PRINT
  2308.     END IF
  2309.     c&(1) = cb1&: c&(2) = cb2&: c&(3) = cb3&: c&(4) = cb4&: c&(5) = cb5&: c&(6) = cb6&: c&(7) = cb7&: c&(8) = 0: v!(1) = v1!: v!(2) = v2!: v!(3) = v3!: v!(4) = v4!: v!(5) = v5!: v!(6) = v6!: v!(7) = v7!
  2310.     t$(1) = _TRIM$(STR$(Arrotonda!(v!(1)))): t$(2) = _TRIM$(STR$(Arrotonda!(v!(2)))): t$(3) = _TRIM$(STR$(Arrotonda!(v!(3)))): t$(4) = _TRIM$(STR$(Arrotonda!(v!(4)))): t$(5) = _TRIM$(STR$(Arrotonda!(v!(5)))):_
  2311.     t$(6) = _TRIM$(STR$(Arrotonda!(v!(6)))): t$(7) = _TRIM$(STR$(Arrotonda!(v!(7)))):t$(8) = ""
  2312.     FOR p%% = UBOUND(v!) - 1 TO 0 STEP -1
  2313.         IF binario%% AND 2 ^ p%% THEN t$(UBOUND(v!) - p%%) = _TRIM$(STR$(INT(v!(UBOUND(v!) - p%%)))) + ":" + _TRIM$(STR$(CINT(60 * (v!(UBOUND(v!) - p%%) - INT(v!(UBOUND(v!) - p%%))))))
  2314.     NEXT p%%
  2315.     LOCATE , FineColonna%(finecolonna%%) - 4
  2316.     FOR p%% = 1 TO 7
  2317.         COLOR c&(p%%): PRINT t$(p%%);
  2318.         IF p%% <= 6 THEN IF c&(p%% + 1) = 0 THEN EXIT FOR
  2319.         COLOR grigio&: LOCATE , FineColonna%(finecolonna%% - 1 + p%%): PRINT "³";
  2320.     NEXT p%%
  2321.     PRINT
  2322. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2323. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2324. SUB CreaImmagine (image&, filename$) 'subroutine presa da "http://www.qb64.org/wiki/SAVEIMAGE"
  2325.     'subroutine che legge le immagini generate dal programma e le trasforma in Bitmap. ha una funzione inversa rispetto a _LOADIMAGE.
  2326.  
  2327.     DIM bytesperpixel%, x&, y&, bb$, bpp&, c&, cv&, lastsource&, padder$, px&, py&, rr$, d$, ext$, f&
  2328.  
  2329.     bytesperpixel% = _PIXELSIZE(image&)
  2330.     IF bytesperpixel% = 0 THEN PRINT "Text modes unsupported!": END
  2331.     IF bytesperpixel% = 1 THEN bpp& = 8 ELSE bpp& = 24
  2332.     x& = _WIDTH(image&)
  2333.     y& = _HEIGHT(image&)
  2334.     bb$ = "BM????QB64????" + MKL$(40) + MKL$(x&) + MKL$(y&) + MKI$(1) + MKI$(bpp&) + MKL$(0) + "????" + STRING$(16, 0)
  2335.     IF bytesperpixel% = 1 THEN
  2336.         FOR c& = 0 TO 255
  2337.             cv& = _PALETTECOLOR(c&, image&)
  2338.             bb$ = bb$ + CHR$(_BLUE32(cv&)) + CHR$(_GREEN32(cv&)) + CHR$(_RED32(cv&)) + CHR$(0)
  2339.         NEXT
  2340.     END IF
  2341.     MID$(bb$, 11, 4) = MKL$(LEN(bb$))
  2342.     lastsource& = _SOURCE
  2343.     _SOURCE image&
  2344.     IF ((x& * 3) MOD 4) THEN padder$ = STRING$(4 - ((x& * 3) MOD 4), 0)
  2345.     FOR py& = y& - 1 TO 0 STEP -1
  2346.         rr$ = ""
  2347.         FOR px& = 0 TO x& - 1
  2348.             c& = POINT(px&, py&)
  2349.             IF bytesperpixel% = 1 THEN rr$ = rr$ + CHR$(c&) ELSE rr$ = rr$ + LEFT$(MKL$(c&), 3)
  2350.         NEXT px&
  2351.         d$ = d$ + rr$ + padder$
  2352.     NEXT py&
  2353.     _SOURCE lastsource&
  2354.     MID$(bb$, 35, 4) = MKL$(LEN(d$))
  2355.     bb$ = bb$ + d$
  2356.     MID$(bb$, 3, 4) = MKL$(LEN(bb$))
  2357.     IF LCASE$(RIGHT$(filename$, 4)) <> ".bmp" THEN ext$ = ".bmp"
  2358.     f& = FREEFILE
  2359.     OPEN filename$ + ext$ FOR OUTPUT AS #f&: CLOSE #f&
  2360.     OPEN filename$ + ext$ FOR BINARY AS #f&
  2361.     PUT #f&, , bb$
  2362.     CLOSE #f&
  2363. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2364. '--------------------------------------------------------------------------------------------------------------------------------------------------
  2365. FUNCTION Arrotonda! (num!)
  2366.     'funzione che arrotonda un numero alla seconda cifra decimale.
  2367.  
  2368.     Arrotonda! = _ROUND(num! * 100) / 100
  2369.  
  2370. '**************************************************************************************************************************************************
  2371. '*                                                          Termine sezione subroutines                                                           *
  2372. '**************************************************************************************************************************************************
  2373.  
  2374. ''$include: 'Codice.bm'
  2375.  

3
QB64 Discussion / A sort of FULLSCREEN
« on: October 12, 2021, 08:48:37 am »
Hi,
in the attached image, the screen has the dimension of _DESKTOPWIDTH and _DESKTOPHEIGHT. But, due to the title bar "Untitled" and Windows's application bar,  the lower part of the image is not visible.
So, I ask if is there is a command in order to run the program with the indicated botton of the window already "pressed". I'm avoiding the use of _FULSCREEN.

4
QB64 Discussion / LOCATE problem
« on: October 09, 2021, 05:42:55 am »
Hi,
I was testing my program in an other PC, with a smaller screen then mine, and I found that it doesn't work.

I was astonisched by that, because I have figured this problem and in order to avoid it, any image descends from _DESKTOPWIDTH and _DESKTOPHEIGHT and it is smaller. so, the images must fit the screen, and I didn't thought to LOCATE.

the image attached is a result of 2 images. the graphic is pasted with _PUTIMAGE over the bigger image, containing data. data are written on the right of the bigger image with locate. but the problem is that if in my screen, LOCATE ,192 put the data as in the picture attached, in smaller screens, LOCATE ,192 is "outside" of the screen.

I ask you if there is a way in order to always have the data written as in the picture, in all the screens.

Thank's you.

5
QB64 Discussion / Characters incongruity
« on: August 12, 2021, 12:38:48 pm »
Hi,
how we can see in the attachments there is a difference between some characters in the IDE and a text editor. The same difference for character like "à, è, é, ù, ò" and so on. For example, if I write "à" in a text editor, in the IDE, I have a different character. If I write "à" in the IDE, I have a dofferent character in the text editor.

Is there a way in order to have the same characters opening the file in the IDE and in a text editor?

6
QB64 Discussion / WRITE # and PRINT #
« on: July 30, 2021, 03:28:03 am »
Hi,
I must create some CSV files, but I have noticed that, if for example, I write:

PRINT #1, "hello1"
WRITE #1, "hello2"

hello2 is written on line 1, over hello1. In order to have on line 1 "hello1" and in line 2 "hello 2", I have to use or only PRINT # or only WRITE #.

Is there a way to combine both, or to use WRITE # in a way where is possible to write characters such "?

7
QB64 Discussion / ON ERROR PUZZLE
« on: July 23, 2021, 08:37:31 am »
Code: QB64: [Select]
  1.     DO
  2.         CLEAR
  3.         start:
  4.         IF _DIREXISTS(".\RisultatiQB64") THEN
  5.             ON ERROR GOTO cancel
  6.             KILL (".\RisultatiQB64\*.*")
  7.             GOTO endd
  8.             cancel:
  9.             IF _FILEEXISTS(".\RisultatiQB64\*.*") THEN
  10.                 PRINT "Close the file open and press a key": SLEEP
  11.                 GOTO start
  12.             ELSE
  13.                 GOTO endd
  14.             END IF
  15.             endd:
  16.             RMDIR (".\RisultatiQB64")
  17.             ON ERROR GOTO 0
  18.         END IF
  19. CODE

Code: QB64: [Select]
  1. This little sequence is intended to do that: if a preview launch of the program has created the directory of the results,
  2. a second launch must delete it.
  3.  
  4. The sequence works like this:
  5. - line 5: the directory exists?
  6.   NO: The program go to CODE IT WORKS
  7.   YES: go to line 6.
  8. - line 7: are there some files in the directory?
  9.           NO: KILL command gives an error if it tries to delete files that don't exists, so the program go to cancel:
  10.               - line 10: are there some files in the directory?
  11.                           NO: go to end, delete the directory and go to CODE. IT WORKS
  12.           YES (and no file is used): no error, so go to line 8:
  13.               - line 8: go to end, delete the directory and go ahead. IT WORKS
  14.           YES (and a file is in use): there is an error, so the program go to cancel:
  15.                 HERE IS MY PROBLEM:
  16.               - line 10: if there are files in the directory and an error is occurred on KILL command, it is because almost a file is open,
  17.                          so the program says to close it and then goes to start: IT DOESN'T WORK: WHY???
  18.                          line 10 doesn't work as I want, and program goes however to line 17 and crashes.

8
QB64 Discussion / How to quote the code?
« on: July 16, 2021, 12:25:02 pm »
One more problem to solve!
When my program will be finished, it will be spreaded as executable (.exe), without .bas file, on computers without QB64 intallated in. But I want that the executable file create also a .txt file in which there is the code. Practically, I want that the .exe file can create a .txt file that is the same as the original .bas file. Is it possible?

9
QB64 Discussion / How to create images?
« on: July 15, 2021, 04:45:57 am »
I think it is a simple issue... but I haven't found nothing.
I don't have to load images into QB64, I have to transform images created with QB64 in images as PNG, BMP, JPG. How to do that?

10
QB64 Discussion / Idea to improve the IDE.
« on: July 14, 2021, 09:41:18 am »
I propose this idea for the next release of QB64: to implement a vertical line in order to outline the cycles. As an example, I attach an image taken by the text compler "SCITE".


11
QB64 Discussion / Problem with CLEAR
« on: June 23, 2021, 07:44:20 am »
PROBLEM WITH CLEAR

The goal is to implement the possibility, at the end of the program, to restart it from the beginning if the user want to do that, without going SYSTEM end run the program one more time.

Below, there is an extract of the program.

At line 1, a DO LOOP cycle starts and it ends at the end of the main code, at line 227. In lines 222 to 225, an other DO LOOP cycle waits a key press from user that has to be "s" or "n" in order exit this DO LOOP cycle. If it is "n", IF command in line 226 EXIT DO started in line 1, and program goes SYSTEM. IF it is "s", the program loops and goes to line 1.

It works.

But, when the program restarts, I have to clear all variables and arrays. Activating CLEAR command in line 2, the program not even starts! Everywhere I put the command CLEAR, no way the program works. In the help, I sawn that CLEAR has some problems with REDIM. But don't have found solution even moving away DATA.

Code: QB64: [Select]
  1.     '    CLEAR
  2.     CLS
  3.     OPTION BASE 1
  4.     _TITLE "Calcolo dell'idrogramma di piena di progetto tramite il metodo SCS-CN"
  5.  
  6.     TempiRitorno:
  7.     DATA "Definito dall'utente",2,5,10,20,50,100,200,500,1000
  8.     DATA 1,0.82,1.24,1.46,1.69,2.04,2.34,2.70,3.22,3.64
  9.     CoefficientiIdrogrammaUnitarioMockus: 'dati dell'idrogramma unitario di Mockus
  10.     DATA 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5: 't/ta
  11.     DATA 0.03,0.1,0.19,0.31,0.47,0.66,0.82,0.93,0.99,1,0.99,0.93,0.86,0.78,0.68,0.56,0.46,0.39,0.33,0.28,0.244,0.207,0.177,0.147,0.127,0.107,0.092,0.077,0.066,0.055,0.048,0.04,0.035,0.029,0.025,0.021,0.018,0.015,0.013,0.011,0.009,0.008,0.007,0.006,0.006,0.005,0.004,0.003,0.001,0: ' t/tp
  12.     CoefficientiDiscretizzazioneTemporale:
  13.     DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32: 'N volte tc!.
  14.     DATA 0.1,0.2,0.3,0.2,0.3,0.3,0.3,0.3,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,1,1,1,1,1,1: 'discretizzazione dei coeff. di Mockus.
  15.  
  16.     TYPE mockus
  17.         tSUta AS SINGLE
  18.         qSUqp AS SINGLE
  19.     END TYPE
  20.     TYPE CoefficientiDiscretizzazioneTemporale
  21.         N AS INTEGER
  22.         d AS SINGLE
  23.         tSUta AS SINGLE
  24.     END TYPE
  25.     TYPE TempiRitorno
  26.         T AS STRING
  27.         k AS SINGLE
  28.     END TYPE
  29.     TYPE matrice1
  30.         mdt AS SINGLE '[ore] conta la progessione delle ore fino al raggiungimento di "d".
  31.         h1 AS SINGLE '[mm] DisegnaValore h della curva di possibilità climatica.
  32.         i1 AS SINGLE '[mm/ora] intensità di pioggia.
  33.         i2 AS SINGLE '[mm/ora] intensità di pioggia secondo lo ietogramma Chicago o costante.
  34.         DH AS SINGLE '[mm] pioggia in ogni istante temporale dt.
  35.         H2 AS SINGLE '[mm] pioggia cumulata ad ogni istante temporale.
  36.         he AS SINGLE '[mm] piggia efficace cumulata ad ogni istante temporale.
  37.         Dhe AS SINGLE '[mm] pioggia efficace ad ogni istante temporale.
  38.         tSUta AS SINGLE
  39.         qSUqp AS SINGLE
  40.         tmSUta AS SINGLE '[-].
  41.         qmSUqp AS SINGLE '[-] il DisegnaValore di qm/qp corrispondente a tm/ta e' = al DisegnaValore di q/qp che corrisponde a t/ta=tm/ta.
  42.         qm AS SINGLE '[mc/s].
  43.     END TYPE
  44.     TYPE idrogramma
  45.         i AS INTEGER
  46.         ore AS SINGLE
  47.         portata AS SINGLE
  48.     END TYPE
  49.     TYPE composizione
  50.         grafico AS LONG
  51.         composizione AS LONG
  52.     END TYPE
  53.  
  54.     CONST R& = _RGB32(255, 0, 0)
  55.     CONST G& = _RGB32(0, 255, 0)
  56.     CONST B& = _RGB32(0, 0, 255)
  57.     CONST bianco& = _RGB32(255, 255, 255)
  58.     CONST giallo& = _RGB32(255, 255, 0)
  59.     CONST grigio& = _RGB32(127, 127, 127)
  60.     CONST azzurro& = _RGB32(0, 255, 255)
  61.     CONST pastello& = _RGB32(183, 150, 139)
  62.     CONST viola& = _RGB32(255, 0, 255)
  63.     CONST trasparente& = _RGB32(0, 0)
  64.     CONST LarghezzaColonna% = 8
  65.  
  66.     DIM SHARED idrogrammi1a24(2, 24, 50, 1) AS idrogramma
  67.     DIM SHARED MassimiIdrogrammi1a24(2, 24, 1) AS idrogramma
  68.     DIM SHARED FinePioggiaIdrogrammi1a24(2, 24, 1) AS idrogramma ' per ogniidrogrammi1a24( trova il momento di Durata della pioggia.
  69.     DIM SHARED i%, n%, z%, ieto%, VisualizzaIeto%
  70.     DIM SHARED ore!(3), portata!(3) 'ore e portate di picco dell'idrogramma di progetto e scelto (entrambi interpolati).
  71.     DIM SHARED tipo% '1:idrogrammi1a24( di progetto. 2: a ascelta. Entrambi interpolati.
  72.     DIM SHARED MassimiAssolutiIeto(2) AS idrogramma
  73.     DIM SHARED IdroMaxIeto%(2) 'memorizza l'idrogramma con la portata di picco massima (che per lo ietogramma chicago è sempre l'ultimo), in modo da definire l'idrogramma di progetto quando la soglia di progetto e' troppo bassa.
  74.     DIM SHARED FinePioggiaIdrogrammi1e2(2) AS idrogramma 'serve a memorizzare l'ora e la portata in cui termina la pioggia.
  75.     DIM SHARED PassiFinePioggia1a24%(2, 24)
  76.     DIM SHARED L%, H%
  77.     DIM SHARED CoefficientiDiscretizzazioneTemporale(24) AS CoefficientiDiscretizzazioneTemporale
  78.     DIM SHARED TempiRitorno(10) AS TempiRitorno
  79.     DIM SHARED T$
  80.     DIM SHARED KeyPress$
  81.  
  82.     REDIM SHARED IdroPixel1(1) AS idrogramma
  83.     REDIM SHARED IdroPixel2(1) AS idrogramma
  84.     REDIM SHARED idrogramma1(1) AS idrogramma 'idrogramma di progetto.
  85.     REDIM SHARED idrogramma2(1) AS idrogramma 'idrogramma a scelta.
  86.  
  87.     DIM FineColonna%(8)
  88.     DIM esci$
  89.     DIM esci%(2)
  90.     DIM schermo&
  91.     DIM ComplessivoIeto1e2(2) AS composizione
  92.     DIM idrogramma1e2(2) AS composizione
  93.     DIM graficoCOPIA&
  94.     DIM quadro&
  95.     DIM unitari&
  96.     DIM MatriciIeto1e2(2, 24)
  97.     DIM mockus(50) AS mockus
  98.     DIM dt!(2, 24)
  99.     DIM matrice1(2, 24, 50, 1) AS matrice1
  100.     DIM matrice2!(2, 24, 50, 50)
  101.     DIM MinimiMatriciQuadrante1(2, 24, 1) AS idrogramma 'riferito all'idrogramma
  102.     DIM MinimiMatriciQuadrante2(2, 24, 1) AS idrogramma 'riferito all'idrogramma unitario
  103.     DIM MassimiQuadrante2(2, 24, 1) AS idrogramma 'riferito all'idrogramma unitario
  104.     DIM test%
  105.     DIM CoeffPerditeIniziali!
  106.     DIM S2! '[mm] contenuto idrico massimodel terreno.
  107.     DIM Ia! '[mm] perdite iniziali.
  108.     DIM tc! '[ore] tempo di corrivazione
  109.     DIM ta! '[ore] tempo di picco.
  110.     DIM qp! '[mc/s] portata al colmo dell'idrogramma unitario.
  111.     DIM k! '[-] coeff. della curva di possibilità climatica tado dal sito della Regione.
  112.     DIM a1! '[mm/d^n] coeff. della curva di possibilità climatica.
  113.     DIM n1! '[-] coeff. della curva di possibilità climatica.
  114.     DIM A2! '[mq] superficie bacino idrografico.
  115.     DIM L! '[m] lunghezza asta principale.
  116.     DIM HmaxL! '[m] punto più alto dell'astra principale.
  117.     DIM HminL! '[m] punto più basso dell'asta principale.
  118.     DIM s1! '[-] pendenza media del bacino non espressa in percentuale ma come 0,x.
  119.     DIM CNII! '[-] Intestazioneto.
  120.     DIM CNIII '[-] discende da CNII.
  121.     DIM tl! '[ore] tempo di ritardo.
  122.  
  123.     RESTORE TempiRitorno
  124.     FOR i% = 1 TO 20
  125.         IF i% <= 10 THEN READ TempiRitorno(i%).T
  126.         IF i% > 10 THEN READ TempiRitorno(i% - 10).k
  127.     NEXT i%
  128.     RESTORE CoefficientiIdrogrammaUnitarioMockus
  129.     FOR i% = 1 TO 100
  130.         IF i% <= 50 THEN READ mockus(i%).tSUta
  131.         IF i% > 50 THEN READ mockus(i% - 50).qSUqp
  132.     NEXT i%
  133.     L% = _DESKTOPWIDTH - 20: H% = L% \ 1.62 'imposta la larghezza dello SCREEN in modo che L%xH% sia un rettangolo aureo.
  134.     FOR ieto% = 1 TO 2
  135.         ComplessivoIeto1e2(ieto%).grafico = _NEWIMAGE(L% - (L% \ 5), H%, 32)
  136.         ComplessivoIeto1e2(ieto%).composizione = _NEWIMAGE(L%, H%, 32)
  137.         idrogramma1e2(ieto%).grafico = _NEWIMAGE(L% - (L% \ 4), H%, 32)
  138.         idrogramma1e2(ieto%).composizione = _NEWIMAGE(L%, H%, 32)
  139.         FOR z% = 1 TO 24
  140.             MatriciIeto1e2(ieto%, z%) = _NEWIMAGE(L%, H%, 32)
  141.         NEXT z%
  142.     NEXT ieto%
  143.     quadro& = _NEWIMAGE(L% \ 2, H% \ 2, 32)
  144.     unitari& = _NEWIMAGE(L%, H%, 32)
  145.     schermo& = _NEWIMAGE(_DESKTOPWIDTH, _DESKTOPHEIGHT, 32)
  146.     esci$ = "I dati forniti non determinano pioggia efficace o questa Š tale da comportare portate trascurabili."
  147.     SCREEN schermo&
  148.     _SCREENMOVE 0, 0
  149.     PRINT "Questo programma serve a calcolare l'idrogramma di progetto (e relativa portata di picco) per"
  150.     PRINT "un  dato  tempo  di  ritorno,  utilizzando  l'idrogramma  unitario  adimensionale di Mockus e"
  151.     PRINT "ietrogrammi tipo "; CHR$(34); "Chicago"; CHR$(34); " o "; CHR$(34); "costanti"; CHR$(34); "."
  152.     PRINT
  153.     PRINT "Di seguito si dovranno inserire i valori della curva di possibilit… climatica "; CHR$(34); "h = Ktúaúd^n"; CHR$(34); "."
  154.     PRINT "Se  si dispone  dei valori  del Centro  Funzionale, digitare il valore "; CHR$(34); "Kt"; CHR$(34); " relativo al tempo"
  155.     PRINT "di ritorno "; CHR$(34); "T"; CHR$(34); " d'interesse, con i relativi valori "; CHR$(34); "a"; CHR$(34); " e "; CHR$(34); "n"; CHR$(34); "."
  156.     PRINT "Se invece si ha una  propria curva di possibilit… climatica, quando verr… chiesto di inserire"
  157.     PRINT CHR$(34); "Kt"; CHR$(34); ", digitare "; CHR$(34); "INVIO"; CHR$(34); ", o "; CHR$(34); "1"; CHR$(34); "."
  158.     PRINT "In tal caso "; CHR$(34); "Kt"; CHR$(34); " sar… considerato pari a "; CHR$(34); "1"; CHR$(34); " e "; CHR$(34); "T"; CHR$(34); " come "; CHR$(34); "definito dall'utente"; CHR$(34); "."
  159.     PRINT
  160.     PRINT "- Kt [-] (INVIO per 1)                                           = "
  161.     PRINT "- a [mm/d^n]                                                     = "
  162.     PRINT "- n [-] (0ö1)                                                    = "
  163.     PRINT "- Area del bacino idrografico [mý]                               = "
  164.     PRINT "- Lunghezza dell'asta principale del bacino idrografico [m]      = "
  165.     PRINT "- Altitudine s.l.m. del punto pi— alto dell'asta principale [m]  = "
  166.     PRINT "- Altitudine s.l.m. del punto pi— basso dell'asta principale [m] = "
  167.     PRINT "- Pendenza media del bacino idrografico [%] (1ö100)              = "
  168.     PRINT "- CN(II) [-] (1ö100)                                             = "
  169.     PRINT "- Coefficiente delle perdite inziali [-] (0ö0.2 - INVIO per 0.1) = "
  170.     CALL InserimentoDati(k!, a1!, n1, A2!, L!, HmaxL!, HminL!, s1!, CNII!, CoeffPerditeIniziali!)
  171.     LOCATE PosizioneCursore% + 10, 1
  172.     PRINT "- Visualizzare i risultati utilizzando lo ietogramma Chicago [1] o costante [2]?"
  173.     PRINT
  174.     DO
  175.         _LIMIT 50
  176.         KeyPress$ = INKEY$
  177.     LOOP UNTIL KeyPress$ = "1" OR KeyPress$ = "2"
  178.     VisualizzaIeto% = VAL(KeyPress$)
  179.     CNIII! = (23 * CNII!) / (10 + 0.13 * CNII!)
  180.     tl! = 0.342 * ((L! / 1000) ^ 0.8 / s1! ^ 0.5) * (1000 / CNIII! - 9) ^ 0.7 'formula di Mockus.
  181.     S2! = 25.4 * (1000 / CNIII! - 10)
  182.     Ia! = CoeffPerditeIniziali! * S2! 'coeff.=0.03-0.2. 'perdite iniziali
  183.     tc! = tl! / 0.6
  184.     ta! = tl! / 0.9
  185.     qp! = 0.208 * ((A2! / 1000000) / ta!)
  186.     RESTORE CoefficientiDiscretizzazioneTemporale
  187.     FOR i% = 1 TO 48
  188.         IF i% <= 24 THEN READ CoefficientiDiscretizzazioneTemporale(i%).N: CoefficientiDiscretizzazioneTemporale(i%).d = CoefficientiDiscretizzazioneTemporale(i%).N * tc!
  189.         IF i% > 24 THEN READ CoefficientiDiscretizzazioneTemporale(i% - 24).tSUta
  190.     NEXT i%
  191.  
  192.     'FOR ieto% = 1 TO 2
  193.     '    FOR z% = 1 TO 24
  194.     '        GOSUB CalcolaMatriciIeto1e2
  195.     '        IF esci%(ieto%) = 0 THEN GOSUB DisegnaMatriciIeto1e2
  196.     '    NEXT z%
  197.     '    IF esci%(ieto%) = 0 THEN GOSUB DisegnaComplessivoIeto1e2
  198.     'NEXT ieto%
  199.     '_DEST schermo&
  200.     'SELECT CASE esci%(VisualizzaIeto%)
  201.     '    CASE IS = 0
  202.     '        CLS
  203.     '        GOSUB DisegnaUnitari
  204.     '        GOSUB VisualizzaComplessivo
  205.     '        SLEEP
  206.     '        CALL CalcolaIdrogramma(MassimiIdrogrammi1a24(VisualizzaIeto%, 24, 1).ore, idrogrammi1a24(VisualizzaIeto%, 24, 50, 1).ore, MassimiAssolutiIeto(VisualizzaIeto%).ore, MassimiAssolutiIeto(VisualizzaIeto%).portata, ComplessivoIeto1e2(VisualizzaIeto%).grafico, ComplessivoIeto1e2(VisualizzaIeto%).composizione, graficoCOPIA&)
  207.     '        SLEEP
  208.     '        GOSUB DisegnaIdrogramma
  209.     '        GOSUB VisualizzaIdrogramma
  210.     '        SLEEP
  211.     '        GOSUB VisualizzaUnitari
  212.     '        GOSUB VisualizzaMatrici
  213.     '    GOSUB Risultati
  214.     '    CASE IS = 1
  215.     '        PRINT esci$
  216.     'END SELECT
  217.     GOSUB freeimage
  218.     PRINT
  219.     PRINT "- Riavviare il programma? [S/N]"
  220.     DO
  221.         _LIMIT 50
  222.         KeyPress$ = LCASE$(INKEY$)
  223.     LOOP UNTIL KeyPress$ = "s" OR KeyPress$ = "n"
  224.     IF KeyPress$ = "n" THEN EXIT DO
  225. '---------------------------------------------------------------------------------------------------------------------------------------------------
  226. freeimage:
  227. FOR ieto% = 1 TO 2
  228.     _FREEIMAGE ComplessivoIeto1e2(ieto%).grafico
  229.     _FREEIMAGE ComplessivoIeto1e2(ieto%).composizione
  230.     _FREEIMAGE idrogramma1e2(ieto%).grafico
  231.     _FREEIMAGE idrogramma1e2(ieto%).composizione
  232.     FOR z% = 1 TO 24
  233.         _FREEIMAGE MatriciIeto1e2(ieto%, z%)
  234.     NEXT z%
  235.     '    IF esci%(ieto%) = 0 THEN _FREEIMAGE graficoCOPIA&
  236. NEXT ieto%
  237. _FREEIMAGE unitari&
  238. _FREEIMAGE quadro&
  239.  
  240.  
  241. '-----------------------------------------------------------------------------------------------------------------------------------------------------------
  242. SUB InserimentoDati (k!, a1!, n1, A2!, L!, HmaxL!, HminL!, s1!, CNII!, CoeffPerditeIniziali!)
  243.  
  244.     SHARED PosizioneCursore%
  245.  
  246.     DIM inputs$(10)
  247.     DIM richiesta%
  248.     DIM test%(10)
  249.     DIM debug%
  250.     DIM carattere$
  251.     DIM punti%
  252.     DIM T!
  253.     DIM cursore%
  254.     DIM esci%
  255.  
  256.     PosizioneCursore% = CSRLIN - 10
  257.     richiesta% = 1
  258.     T! = TIMER
  259.     DO
  260.         _LIMIT 30
  261.         KeyPress$ = INKEY$
  262.         IF TIMER > T! + 0.5 THEN
  263.             cursore% = NOT cursore%
  264.             T! = TIMER
  265.         END IF
  266.         FOR i% = 1 TO 10
  267.             LOCATE PosizioneCursore% - 1 + i%, 68: PRINT inputs$(i%) + SPACE$(30)
  268.         NEXT i%
  269.         LOCATE PosizioneCursore% - 1 + richiesta%, 68 + LEN(inputs$(richiesta%))
  270.         IF debug% = 1 THEN EXIT SUB
  271.         IF esci% = 1 THEN EXIT DO
  272.         IF cursore% THEN PRINT "_"
  273.         SELECT CASE KeyPress$
  274.             CASE CHR$(44), CHR$(46) ',e.
  275.                 punti% = 0
  276.                 IF KeyPress$ = CHR$(44) THEN KeyPress$ = CHR$(46)
  277.                 FOR n% = 1 TO LEN(inputs$(richiesta%))
  278.                     carattere$ = MID$(inputs$(richiesta%), n%, 1)
  279.                     IF carattere$ = CHR$(46) THEN punti% = 1
  280.                 NEXT n%
  281.                 IF punti% = 0 THEN inputs$(richiesta%) = inputs$(richiesta%) + KeyPress$
  282.             CASE CHR$(48) TO CHR$(57) '0-9
  283.                 inputs$(richiesta%) = inputs$(richiesta%) + KeyPress$
  284.             CASE CHR$(8) 'del
  285.                 IF LEN(inputs$(richiesta%)) > 0 THEN inputs$(richiesta%) = LEFT$(inputs$(richiesta%), LEN(inputs$(richiesta%)) - 1)
  286.             CASE CHR$(0) + "H" 'su
  287.                 GOSUB Valutavalore
  288.                 SELECT CASE test%(richiesta%)
  289.                     CASE IS = 0
  290.                         inputs$(richiesta%) = ""
  291.                     CASE IS = 1
  292.                         IF richiesta% = 1 THEN
  293.                             EXIT SELECT
  294.                         ELSEIF richiesta <= 10 THEN
  295.                             richiesta% = richiesta% - 1
  296.                         END IF
  297.                 END SELECT
  298.             CASE CHR$(13), CHR$(0) + "P" 'invio
  299.                 IF debug% = 1 THEN EXIT SELECT
  300.                 GOSUB Valutavalore
  301.                 IF richiesta% <> 10 THEN
  302.                     IF KeyPress$ = CHR$(0) + "P" THEN KeyPress$ = CHR$(13)
  303.                 END IF
  304.                 IF richiesta% <> 1 THEN
  305.                     IF LEN(inputs$(richiesta%)) = 0 THEN test%(richiesta%) = 0
  306.                 END IF
  307.                 SELECT CASE test%(richiesta%)
  308.                     CASE IS = 0
  309.                         inputs$(richiesta%) = ""
  310.                     CASE IS = 1
  311.                         IF richiesta% = 10 THEN
  312.                             IF KeyPress$ = CHR$(0) + "P" THEN
  313.                                 EXIT SELECT
  314.                             ELSE
  315.                                 esci% = 1
  316.                             END IF
  317.                         ELSE
  318.                             richiesta% = richiesta% + 1
  319.                         END IF
  320.                 END SELECT
  321.         END SELECT
  322.     LOOP
  323.     k! = VAL(inputs$(1)): a1! = VAL(inputs$(2)): n1! = VAL(inputs$(3)): A2! = VAL(inputs$(4)): L! = VAL(inputs$(5)): HmaxL! = VAL(inputs$(6)): HminL! = VAL(inputs$(7)): s1! = VAL(inputs$(8)): CNII! = VAL(inputs$(9)): CoeffPerditeIniziali! = VAL(inputs$(10))
  324.     EXIT SUB
  325.     '-----------------------------------------------------------------------------------------------------------------------------------------------------------
  326.     Valutavalore:
  327.     test%(richiesta%) = 0 ' se 0 rimane nella richiesta in corso, se 1, cambia.
  328.  
  329.     SELECT CASE richiesta%
  330.         CASE 1
  331.             IF inputs$(richiesta%) = "123" THEN 'avvia debug
  332.                 debug% = 1
  333.                 'test:
  334.                 'k! = 2.34: a1! = 1: n1! = 0.45596: A2! = 0: L! = 3300: HmaxL! = 1981: HminL! = 1062: s1! = 41.5: CNII! = 70: CoeffPerditeIniziali! = 0.1
  335.                 'Cillian:
  336.                 k! = 2.34: a1! = 14.6653: n1! = 0.45596: A2! = 2641902: L! = 3300: HmaxL! = 1981: HminL! = 1062: s1! = 41.5: CNII! = 70: CoeffPerditeIniziali! = 0.1
  337.                 'pialong:
  338.                 'k! = 2.34:'a1! = 17.097811:'n1! = 0.497753:'A2! = 2509318:'L! = 2919:'HmaxL! = 1654:'HminL! = 388:'s1! = 0.663:'CNII! = 66:CoeffPerditeIniziali!=0.1
  339.                 GOSUB TrovaT
  340.                 RETURN
  341.             END IF
  342.             IF LEN(inputs$(richiesta%)) = 0 THEN
  343.                 IF KeyPress$ = CHR$(13) THEN inputs$(richiesta%) = "1"
  344.             END IF
  345.             GOSUB TrovaT
  346.             IF KeyPress$ = CHR$(0) + "P" THEN
  347.                 IF LEN(inputs$(richiesta%)) = 0 THEN test%(richiesta%) = 0
  348.             END IF
  349.         CASE 2, 4, 5, 6, 7
  350.             test%(richiesta%) = 1
  351.         CASE 3
  352.             IF VAL(inputs$(richiesta%)) <= 1 THEN
  353.                 test%(richiesta%) = 1
  354.             ELSE
  355.                 test%(richiesta%) = 0
  356.             END IF
  357.         CASE 8, 9
  358.             IF VAL(inputs$(richiesta%)) >= 1 THEN
  359.                 IF VAL(inputs$(richiesta%)) <= 100 THEN test%(richiesta%) = 1
  360.             ELSEIF inputs$(richiesta%) = "" THEN test%(richiesta%) = 1
  361.             ELSE
  362.                 test%(richiesta%) = 0
  363.             END IF
  364.         CASE IS = 10
  365.             IF LEN(inputs$(richiesta%)) = 0 THEN
  366.                 IF KeyPress$ = CHR$(13) THEN inputs$(richiesta%) = "0.1"
  367.                 test%(richiesta%) = 1
  368.                 EXIT SELECT
  369.             END IF
  370.             IF VAL(inputs$(richiesta%)) >= 0 THEN
  371.                 IF VAL(inputs$(richiesta%)) <= 0.2 THEN
  372.                     IF KeyPress$ = CHR$(0) + "P" THEN
  373.                         test%(richiesta%) = 1
  374.                     ELSE
  375.                         test%(richiesta%) = 1
  376.                     END IF
  377.                 ELSE
  378.                     test%(richiesta%) = 0
  379.                 END IF
  380.             END IF
  381.     END SELECT
  382.     RETURN
  383.     '-----------------------------------------------------------------------------------------------------------------------------------------------------------
  384.     TrovaT:
  385.     i% = 1
  386.     '    IF debug% <> 1 THEN k! = VAL(inputs$(1))
  387.     FOR i% = 1 TO 10
  388.         IF VAL(inputs$(1)) = TempiRitorno(i%).k THEN
  389.             IF i% = 1 THEN
  390.                 T$ = TempiRitorno(i%).T
  391.                 test%(richiesta%) = 1
  392.             ELSE
  393.                 T$ = TempiRitorno(i%).T + " anni"
  394.                 test%(richiesta%) = 1
  395.             END IF
  396.             EXIT FOR
  397.         ELSE
  398.             test%(richiesta%) = 0
  399.         END IF
  400.     NEXT i%
  401.     RETURN
  402.  

12
QB64 Discussion / How to leave an input line.
« on: June 11, 2021, 02:42:41 am »
I have a problem. My program (I have attached an image as example) is almost finished, but at the moment is a flow. I have to introduce the possibility to navigate through it and then write the results to files.

The problem is this.
The program at the start asks some input:

1) Enter input 1:      B
2) Enter input 2:      B
3) Enter input 3:      C
4) Enter input 4:      _


Suppose that the program is now asking input 4 and that we have just realized that input 1 is wrong, because is not B, but A.

I want to do this: just pressing up arrow (without enter), the program must leaves the input line corresponding to input 4 and go up, to line asking input 3, and so on (possibly preserving input 2 and 3).

13
QB64 Discussion / interrupting program before the end.
« on: June 07, 2021, 07:16:52 am »
I am working on a program that, at the moment, is about 1500 lines of code. As it is quite complicated, in order to test it, I run it very often, but only very very rarely I arrive to the end, because I always brutally close the window when I arrive to the point I am testing. I have done this at least thousands times.

well, yesterday I found my 220 Gb of unit C completely full. Adding the occupated space of the directories in C, the amount should be 54 gb, but the 220 Gb were inexplicably full anyway. Furthermore, Windows 10 was about 24 Gb, that is normal. The problem seemed to be thousands of "system files" in \windows\temp, only visible enabling the visibility of hidden files, that occupied almost entirely C. But it is quite weird that the directory "Windows" seemed to be only 24 Gb.

My code creates 59 images and, at the end, I _FREEMAGE all of them, but, as I said, I always interrupt the program before it arrives to the _FREEMAGE sequence.

So, I ask:
- In general, are there potential physical memory problems interrupting program before the end?
- In particular, are there potential physical memory problems interrupting or ending program without _FREEIMAGE the images created?

I believed that not _FREEIMAG(ing) was only a matter of RAM.

14
QB64 Discussion / Problem to pass variables in a sub
« on: May 15, 2021, 06:14:08 am »
Hi, I don't understand why is not possible something like that:

Code: QB64: [Select]
  1.  
  2. DIM SHARED c&(3), t$(3)
  3.  
  4. bianco& = _RGB32(255, 255, 255)
  5. giallo& = _RGB32(255, 255, 0)
  6. grigio& = _RGB32(127, 127, 127)
  7.  
  8. testo1$ = "a"
  9. testo2$ = "b"
  10. testo3$ = "c"
  11.  
  12. call prova(bianco&,testo1$,giallo&,testo2$,grigio&,testo3$)
  13.  
  14. sub prova(c&(1),t$(1),c&(2),t$(2), c&(3),t$(3))
  15. for i%=1 to 3
  16. color c&(i%)
  17. print t$(i%)
  18. next i%
  19.  

I have to do this instead:
Code: QB64: [Select]
  1.  
  2. bianco& = _RGB32(255, 255, 255)
  3. giallo& = _RGB32(255, 255, 0)
  4. grigio& = _RGB32(127, 127, 127)
  5.  
  6.  
  7. testo1$ = "a"
  8. testo2$ = "b"
  9. testo3$ = "c"
  10.  
  11. CALL prova(bianco&, testo1$, giallo&, testo2$, grigio&, testo3$)
  12.  
  13. SUB prova (c1&, t1$, c2&, t2$, c3&, t3$)
  14.  
  15.     COLOR c1&: PRINT t1$
  16.  
  17.     COLOR c2&: PRINT t2$
  18.  
  19.     COLOR c3&: PRINT t3$
  20.  

but I can't use the FOR loop and, however, colors variables don't pass to the sub...

15
Hi,
I have a problem and I don't find a solution.
Launching the code, press 1 or 2, and then any key at time.
In the ordinate is drawn a notch every X mc/s.

Given this notch, the target is to print the corresponding value on the axis. The problem is just to print it in the right position.
In the code below, we have to see the subroutine "grafici": lines 302 to 385, but the core of the problem is in lines 365 (inside the command WINDOW) and 374 (outside).

I have thought to print the value with che command _PRINTSTRING. At the moment there is no value, but the string "-". _PRINTSTRING, unfortunately, doesn't use the local coordinates of WINDOW (line 333), but always the general coordinates in pixels of the screen in use (line 331). So, in order to use _PRINTSTRING, the idea was to transform (line 365 and 374) the general coordinates of _PRINTSTRING, into the local coordinates of WINDOW by using fx! and fy!: lines 323-328.

But, as we can see launching the code, there is no way in order to have the strings "-" to fit and match the notches, also introducing a parameter k! (line 362) to do so. In any way, the strings "-" are ot of phase with the notches. The solution is not to use double precision variables for the transformation between coordinates.

So how we can print the values on the axis? I never thought that the problem was this!

Code: QB64: [Select]
  1.  
  2. mockus: 'dati dell'idrogramma unitario di Mockus
  3. DATA 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5: 't/ta
  4. DATA 0.030,0.100,0.190,0.310,0.470,0.660,0.820,0.930,0.990,1.000,0.990,0.930,0.860,0.780,0.680,0.560,0.460,0.390,0.330,0.280,0.244,0.207,0.177,0.147,0.127,0.107,0.092,0.077,0.066,0.055,0.048,0.040,0.035,0.029,0.025,0.021,0.018,0.015,0.013,0.011,0.009,0.008,0.007,0.006,0.006,0.005,0.004,0.003,0.001,0.000: ' t/tp
  5.  
  6. coefficienti:
  7. DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32: 'N volte tc!.
  8. DATA 0.1,0.1,0.1,0.2,0.3,0.2,0.3,0.3,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,1,1,1,1,1,1: 'discretizzazione dei coeff. di Mockus.
  9.  
  10. TYPE mockus
  11.     MOCKUStSUta AS SINGLE
  12.     MOCKUSqSUqp AS SINGLE
  13.  
  14. TYPE matrice1
  15.     m AS INTEGER '[numero naturale] conta il numero di interazioni fino al raggiungimento di "d".
  16.     mdt AS SINGLE '[ore] conta la progessione delle ore fino al raggiungimento di "d".
  17.     tminuti AS SINGLE '[minuti] trasforma mdt in minuti.
  18.     h1 AS SINGLE '[mm] valore h della curva di possibilità climatica.
  19.     i1 AS SINGLE '[mm/ora] intensità di pioggia.
  20.     i2 AS SINGLE '[mm/ora] intensità di pioggia secondo lo ietogramma Chicago o costante.
  21.     DH AS SINGLE '[mm] pioggia in ogni istante temporale dt.
  22.     H2 AS SINGLE '[mm] pioggia cumulata ad ogni istante temporale.
  23.     he AS SINGLE '[mm] piggia efficace cumulata ad ogni istante temporale.
  24.     Dhe AS SINGLE '[mm] pioggia efficace ad ogni istante temporale.
  25.     MOCKUStSUta AS SINGLE
  26.     MOCKUSqSUqp AS SINGLE
  27.     tmSUta AS SINGLE '[-].
  28.     qmSUqp AS SINGLE '[-] il valore di qm/qp corrispondente a tm/ta e' = al valore di q/qp che corrisponde a t/ta=tm/ta.
  29.     qm AS SINGLE '[mc/s].
  30.  
  31. TYPE coefficienti
  32.     d AS SINGLE
  33.     tSUta AS SINGLE
  34.  
  35. TYPE idrogramma
  36.     ore AS SINGLE
  37.     minuti AS SINGLE
  38.     portata AS SINGLE
  39.  
  40. CONST limit = 200 '50
  41.  
  42. DIM schermo&
  43.  
  44. DIM SHARED mockus(50) AS mockus
  45. DIM SHARED dt!(2, 24)
  46. DIM SHARED matrice1(2, 24, 50, 1) AS matrice1
  47. DIM SHARED coefficienti(24) AS coefficienti
  48. DIM SHARED matrice2!(2, 24, 50, 50)
  49. DIM SHARED idrogramma(2, 24, 50, 1) AS idrogramma
  50. DIM SHARED massimi1(2, 24, 1) AS idrogramma
  51. DIM SHARED massimi2(2) AS idrogramma
  52. DIM SHARED i%, n%, z%, ieto%
  53. DIM SHARED m%(2, 24)
  54. DIM SHARED S2! '[mm] contenuto idrico massimo del terreno.
  55. DIM SHARED Ia! '[mm] perdite iniziali.
  56. DIM SHARED tc! '[ore] tempo di corrivazione
  57. DIM SHARED ta! '[ore] tempo di picco.
  58. DIM SHARED qp! '[mc/s] portata al colmo dell'idrogramma unitario.
  59. DIM SHARED k! '[-] coeff. della curva di possibilità climatica tado dal sito della Regione.
  60. DIM SHARED a2! '[mm/d^n] coeff. della curva di possibilità climatica.
  61. DIM SHARED n1! '[-] coeff. della curva di possibilità climatica.
  62. DIM SHARED visualizzaieto%
  63. DIM A1! '[mq] superficie bacino idrografico.
  64. DIM L! '[m] lunghezza asta principale.
  65. DIM HmaxL! '[m] punto più alto dell'astra principale.
  66. DIM HminL! '[m] punto più basso dell'asta principale.
  67. DIM s1! '[-] pendenza media del bacino non espressa in percentuale ma come 0,x.
  68. DIM CNII! '[-] tabellato.
  69. DIM CNIII '[-] discende da CNII.
  70. DIM tl! '[ore] tempo di ritardo.
  71. DIM keypress$
  72.  
  73. SCREEN schermo&
  74.  
  75. A1! = 2641902
  76. k! = 2.34
  77. a2! = 14.6653
  78. n1! = 0.45596
  79. L! = 3300
  80. HmaxL! = 1981
  81. HminL! = 1062
  82. s1! = 0.415
  83. CNII! = 70
  84.  
  85. 'INPUT A1!
  86. 'INPUT k!
  87. 'INPUT a2!
  88. 'INPUT n1!
  89. 'INPUT L!
  90. 'INPUT HmaxL!
  91. 'INPUT HminL!
  92. 'INPUT s1!
  93. 'INPUT CNII!
  94. 'INPUT d1!
  95.  
  96. CNIII! = (23 * CNII!) / (10 + 0.13 * CNII!)
  97. tl! = 0.342 * ((L! / 1000) ^ 0.8 / (100 * s1!) ^ 0.5) * (1000 / CNIII! - 9) ^ 0.7 'formula di Mockus.
  98. S2! = 25.4 * (1000 / CNIII! - 10)
  99. Ia! = 0.1 * S2! 'coeff.=0.03-0.2.
  100. tc! = tl! / 0.6
  101. ta! = tl! / 0.9
  102. qp! = 0.208 * ((A1! / 1000000) / ta!)
  103.  
  104. RESTORE mockus
  105. FOR i% = 1 TO 100
  106.     IF i% <= 50 THEN READ mockus(i%).MOCKUStSUta
  107.     IF i% > 50 THEN READ mockus(i% - 50).MOCKUSqSUqp
  108. NEXT i%
  109.  
  110. RESTORE coefficienti
  111. FOR i% = 1 TO 48
  112.     IF i% <= 24 THEN READ coefficienti(i%).d: coefficienti(i%).d = coefficienti(i%).d * tc!
  113.     IF i% > 24 THEN READ coefficienti(i% - 24).tSUta
  114. NEXT i%
  115.  
  116. PRINT "Ietogramma Chicago/costante: 1/2> "
  117.     _LIMIT 60 'limit
  118.     keypress$ = INKEY$
  119. LOOP UNTIL keypress$ = "1" OR keypress$ = "2"
  120. visualizzaieto% = VAL(keypress$)
  121.  
  122. FOR ieto% = 1 TO 2
  123.     CALL creamatrici
  124. NEXT ieto%
  125.  
  126. CALL grafici(massimi1(visualizzaieto%, 24, 1).ore, massimi2(visualizzaieto%).ore, massimi2(visualizzaieto%).portata) 'valori passati per disegnare il grafico.
  127.  
  128. 'CALL risultati
  129.  
  130. '-----------------------------------------matrice1---------------------------------------------------------------------------------------------------------------------------------
  131. SUB creamatrici ()
  132.     z% = 0
  133.     DO
  134.         z% = z% + 1
  135.         dt!(ieto%, z%) = coefficienti(z%).tSUta * ta!
  136.         m%(ieto%, z%) = coefficienti(z%).d / (coefficienti(z%).tSUta * ta!) 'determina il numero di passi temporali necessari ad arrivare allla durata d considerata con il paso temporale dt!.
  137.         FOR i% = 1 TO 50
  138.             matrice1(ieto%, z%, i%, 1).MOCKUStSUta = mockus(i%).MOCKUStSUta
  139.             matrice1(ieto%, z%, i%, 1).MOCKUSqSUqp = mockus(i%).MOCKUSqSUqp
  140.             matrice1(ieto%, z%, i%, 1).m = i%
  141.             matrice1(ieto%, z%, i%, 1).mdt = matrice1(ieto%, z%, i%, 1).m * dt!(ieto%, z%)
  142.             matrice1(ieto%, z%, i%, 1).tminuti = matrice1(ieto%, z%, i%, 1).mdt * 60
  143.             SELECT CASE (_ROUND(10 * (i% * coefficienti(z%).tSUta))) / 10 'crea il vettore dell'idrogramma unitario di Mockus con i multipli del coeff. z% considerato (0.1,0.2,0.3,0.5,1).
  144.                 CASE IS <= 5 'valore massimo di t/ta di Mockus
  145.                     matrice1(ieto%, z%, i%, 1).tmSUta = (_ROUND(10 * (i% * coefficienti(z%).tSUta))) / 10 '=matrice1(i%).m *  matrice1(i%).mdt / ta!
  146.                 CASE ELSE
  147.                     matrice1(ieto%, z%, i%, 1).tmSUta = 0
  148.             END SELECT
  149.         NEXT i%
  150.         FOR i% = 1 TO 50
  151.             n% = 1
  152.             DO 'crea il vettore dell'idrogramma unitario Mockus prendendo i valori corrispondenti di ai coefficienti.
  153.                 IF matrice1(ieto%, z%, i%, 1).tmSUta = matrice1(ieto%, z%, n%, 1).MOCKUStSUta THEN
  154.                     matrice1(ieto%, z%, i%, 1).qmSUqp = matrice1(ieto%, z%, n%, 1).MOCKUSqSUqp
  155.                     EXIT DO
  156.                 ELSE
  157.                     n% = n% + 1
  158.                 END IF
  159.             LOOP UNTIL n% = 50
  160.             matrice1(ieto%, z%, i%, 1).qm = matrice1(ieto%, z%, i%, 1).qmSUqp * qp!
  161.         NEXT i%
  162.         FOR i% = 1 TO m%(ieto%, z%)
  163.             matrice1(ieto%, z%, i%, 1).h1 = k! * a2! * matrice1(ieto%, z%, i%, 1).mdt ^ n1!
  164.             IF i% = 1 THEN
  165.                 matrice1(ieto%, z%, i%, 1).i1 = matrice1(ieto%, z%, i%, 1).h1 / dt!(ieto%, z%)
  166.             ELSE
  167.                 matrice1(ieto%, z%, i%, 1).i1 = (matrice1(ieto%, z%, i%, 1).h1 - matrice1(ieto%, z%, i% - 1, 1).h1) / dt!(ieto%, z%)
  168.             END IF
  169.         NEXT i%
  170.         SELECT CASE ieto%
  171.             CASE 1 'Chicago.
  172.                 CALL chicago
  173.             CASE 2 'costante
  174.                 FOR i% = 1 TO m%(ieto%, z%)
  175.                     matrice1(ieto%, z%, i%, 1).i2 = matrice1(ieto%, z%, m%(ieto%, z%), 1).h1 / matrice1(ieto%, z%, m%(ieto%, z%), 1).mdt
  176.                 NEXT i%
  177.         END SELECT
  178.         FOR i% = 1 TO m%(ieto%, z%)
  179.             matrice1(ieto%, z%, i%, 1).DH = matrice1(ieto%, z%, i%, 1).i2 * dt!(ieto%, z%)
  180.             IF i% = 1 THEN
  181.                 matrice1(ieto%, z%, i%, 1).H2 = matrice1(ieto%, z%, i%, 1).DH
  182.             ELSE
  183.                 matrice1(ieto%, z%, i%, 1).H2 = matrice1(ieto%, z%, i%, 1).DH + matrice1(ieto%, z%, i% - 1, 1).H2
  184.             END IF
  185.             SELECT CASE matrice1(ieto%, z%, i%, 1).H2 - Ia!
  186.                 CASE IS < 0
  187.                     matrice1(ieto%, z%, i%, 1).he = 0
  188.                 CASE IS >= 0
  189.                     matrice1(ieto%, z%, i%, 1).he = (matrice1(ieto%, z%, i%, 1).H2 - Ia!) ^ 2 / (matrice1(ieto%, z%, i%, 1).H2 - Ia! + S2!)
  190.             END SELECT
  191.             IF i% = 1 THEN
  192.                 matrice1(ieto%, z%, i%, 1).Dhe = matrice1(ieto%, z%, i%, 1).he
  193.             ELSE
  194.                 matrice1(ieto%, z%, i%, 1).Dhe = matrice1(ieto%, z%, i%, 1).he - matrice1(ieto%, z%, i% - 1, 1).he
  195.             END IF
  196.         NEXT i%
  197.  
  198.         '-------------------------------matrice2-------------------------------------------------------------------------------------------------------------------------
  199.  
  200.         FOR n% = 1 TO 50 'colonna
  201.             FOR i% = n% TO 50 ' riga
  202.                 matrice2!(ieto%, z%, i%, n%) = matrice1(ieto%, z%, i% - n% + 1, 1).Dhe * matrice1(ieto%, z%, n%, 1).qm
  203.             NEXT i%
  204.         NEXT n%
  205.         '-------------------------------idrogramma------------------------------------------------------------------------------------------------------------------
  206.         FOR i% = 1 TO 50 'riga
  207.             FOR n% = 1 TO 50 'colonna
  208.                 idrogramma(ieto%, z%, i%, 1).portata = idrogramma(ieto%, z%, i%, 1).portata + matrice2!(ieto%, z%, i%, n%)
  209.  
  210.             NEXT n%
  211.             idrogramma(ieto%, z%, i%, 1).ore = matrice1(ieto%, z%, i%, 1).mdt
  212.             idrogramma(ieto%, z%, i%, 1).minuti = matrice1(ieto%, z%, i%, 1).tminuti
  213.         NEXT i%
  214.         '-------------------------------Massimi-----------------------------------------------------
  215.         i% = 1
  216.         'massimi1(ieto%, z%, 1).portata = idrogramma(ieto%, z%, 1, 1).portata
  217.         DO
  218.             IF massimi1(ieto%, z%, 1).portata < idrogramma(ieto%, z%, i%, 1).portata THEN
  219.                 massimi1(ieto%, z%, 1).portata = idrogramma(ieto%, z%, i%, 1).portata
  220.                 massimi1(ieto%, z%, 1).ore = idrogramma(ieto%, z%, i%, 1).ore
  221.                 massimi1(ieto%, z%, 1).minuti = idrogramma(ieto%, z%, i%, 1).minuti
  222.             END IF
  223.             i% = i% + 1
  224.         LOOP UNTIL i% = 50
  225.         ' IF massimi2(ieto%).ore < massimi1(visualizzaieto%, z%, 1).ore THEN massimi2(ieto%).ore = massimi1(visualizzaieto%, z%, 1).ore
  226.         IF massimi2(ieto%).portata < massimi1(visualizzaieto%, z%, 1).portata THEN
  227.             massimi2(ieto%).portata = massimi1(visualizzaieto%, z%, 1).portata
  228.             massimi2(ieto%).ore = massimi1(visualizzaieto%, z%, 1).ore
  229.         END IF
  230.     LOOP UNTIL z% = UBOUND(coefficienti)
  231. '---------------------------------------------------------------------------------------------------------------------------------------------------
  232. 'Questa subroutine crea gli ietogrammi chicago per ogni iterazione z%.
  233. 'Ad ogni nuovo dt! pone l'ultimo valore di pioggia come ultimo, il penultimo come primo, il terzultimo come penultimo, il quartultimo come secondo e così via.
  234. 'Quando vi è un valore di z% che ha un dt! non nuovo, cerca la precedente iterazione z% con lo stesso dt! e copia i suoi valori dello ietogramma chicago in quello dell'iterazione z% in corso. I valori rimanenti sono riempiti
  235. 'procedendo come prima.
  236. 'Quindi per esempio l'iterazione z%=1 corrisponde a d=1tc con passo temporale dt!. L'iterazione z%=2 corrisponde a d=2tc con il medesimo passo temporale. Per cui lo ietogramma chicago per d=2tc e' dato dallo stesso ietogramma
  237. 'chicago che si ha per d=1tc, con l'aggiunta, ai suoi estremi, dei nuovi valori. Il meccanismo si ripete per z%=3, che corrisponde a d=3tc, con il medesimo dt!. Per z%=4, corrispondente a d=4tc, invece, il passo temporale dt!
  238. 'cambia.
  239. 'Quanto detto e' necessario per evitare piccole discrepanze che potrebbero comportare il fatto che alcuni massimi risultino localmente poco piu' bassi del precedente, anche quando il trend generale e' chiaramente di aumento dei
  240. 'massimi all'aumentare della durata della pioggia. In questo modo si fa l'ipotesi che all'aumentare della durata della pioggia, discretizzata con uno stesso passo temporale dt!, ogni ietogramma contenga a sua volta il precedente.
  241. 'In tal modo, se si condiera per esempio d=2tc, si assume che l'altezza di pioggia corrispondente a 1tc, segua lo ietogramma relativo a d=1tc, cosi' che l'altezza di pioggia rimamente sia eclusivamente dovuta ai nuovi valori.
  242. SUB chicago ()
  243.     DIM test%
  244.     DIM k%
  245.     n% = 1
  246.     DO
  247.         IF z% = 1 THEN test% = 0: EXIT DO 'permette il calcolo dello ietogramma chicago della prima iterazione. test%=0
  248.         IF dt!(ieto%, z%) = dt!(ieto%, z% - n%) THEN ' se trova un'iterazione z% precedente con lo stesso dt! di quella in corso, esegue i comandi successivi
  249.             test% = 1
  250.             k% = m%(ieto%, z%)
  251.             i% = 0
  252.             DO 'inserisce i nuovi valori dello ietogramma chicago dell'iterazione z% in corso.
  253.                 matrice1(ieto%, z%, m%(ieto%, z%) - i%, 1).i2 = matrice1(ieto%, z%, k%, 1).i1
  254.                 k% = k% - 1
  255.                 IF k% = m%(ieto%, z% - n%) THEN EXIT DO 'se ha completato l'inserimento dei nuovi valori, passa oltre.
  256.                 matrice1(ieto%, z%, i% + 1, 1).i2 = matrice1(ieto%, z%, k%, 1).i1
  257.                 k% = k% - 1
  258.                 i% = i% + 1
  259.             LOOP UNTIL k% = m%(ieto%, z% - n%)
  260.             IF matrice1(ieto%, z%, i%, 1).i2 = 0 THEN i% = i% - 1
  261.             k% = 1
  262.             DO 'inserisce lo ietogramma chicago dell'iterazione z% precedente con lo stesso dt!, nello ietogramma dell'iterazione z% in corso.
  263.                 i% = i% + 1
  264.                 matrice1(ieto%, z%, i%, 1).i2 = matrice1(ieto%, z% - n%, k%, 1).i2
  265.                 k% = k% + 1
  266.             LOOP UNTIL k% > m%(ieto%, z% - n%)
  267.             EXIT DO 'siccome ha completato lo ietogramma dell'iterazione z% in corso, non serve incrementare n%, quindi passa oltre. test%=1.
  268.         ELSE ' se non trova l'iterazione z% precedente con lo stesso dt! di quella in corso, incrementa n% e ripete la ricerca.
  269.             test% = 0
  270.             n% = n% + 1
  271.         END IF
  272.     LOOP UNTIL n% = z% - 1 'se non ha trovato iterazioni z% precedenti con lo stesso dt!, allora passa oltre e test%=0.
  273.     SELECT CASE test%
  274.         CASE IS = 1 'esce dalla subroutine, in quanto lo ietogramma e' definito.
  275.             EXIT SUB
  276.         CASE IS = 0 'calcola ex-novo lo ietogramma relativo all'iterazione z% in corso in quanto non vi e' un'iterazioni z% precedente con lo stesso dt! dell'iterazione z% in corso.
  277.             k% = m%(ieto%, z%)
  278.             i% = 0
  279.             DO
  280.                 matrice1(ieto%, z%, m%(ieto%, z%) - i%, 1).i2 = matrice1(ieto%, z%, k%, 1).i1
  281.                 k% = k% - 1
  282.                 IF k% = 0 THEN EXIT DO
  283.                 matrice1(ieto%, z%, i% + 1, 1).i2 = matrice1(ieto%, z%, k%, 1).i1
  284.                 k% = k% - 1
  285.                 i% = i% + 1
  286.             LOOP UNTIL k% = 0
  287.     END SELECT
  288. '-----------------------------------------------------------------------------------------------------------------------------------------------------------------
  289. SUB grafici (ore!, oreM!, QM!)
  290.     'ore!: ore massime di analisi.
  291.     'oreM!: ore corrispondenti alla portata massima.
  292.     'QM!: portata massima.
  293.  
  294.     CONST dxy% = 30
  295.     CONST L% = 800
  296.     CONST H% = 600
  297.  
  298.     ' CONST LH! = L% / H% 'costante che, all'interno del comando WINDOW, di portare la scala delle ordinate uguale a quella delle ascisse.
  299.     CONST rosso = _RGB32(255, 0, 0)
  300.     CONST bianco = _RGB32(255, 255, 255)
  301.     CONST giallo = _RGB32(255, 255, 0)
  302.  
  303.     DIM grafico&
  304.     DIM fx! 'all'interno del comando WINDOW e VIEW permette di disegnare in pixel sull'asse x e nelle circonferenze.
  305.     DIM fy! 'all'interno del comando WINDOW e VIEW permette di disegnare in pixel sull'asse y.
  306.     DIM dx!, dy!
  307.     DIM tacca%
  308.     DIM k%
  309.  
  310.     grafico& = _NEWIMAGE(L%, H%, 32)
  311.     fx! = L% / (ore! * 1.1) '=168.3349 'pixel/ora
  312.     fy! = H% / (QM! * 1.1) '=23.3657 'pixel/mc
  313.     dx! = dxy% / fx! '=0.1782162:dx! e' la lunghezza dentro WINDOWS per avere un numero di pixel=dxy%.
  314.     dy! = dxy% / fy! '=1.283933
  315.     tacca% = QM! \ 5
  316.  
  317.     _DEST grafico&
  318.     SCREEN grafico&
  319.     LINE (0, 0)-(L% - 1, H% - 1), rosso, B
  320.     WINDOW (0, 0)-(ore! * 1.1 + dx!, QM! * 1.1 + dy!) 'scala ascisse e ordinate in base alle ore e alla portata, estendendole del 10%.
  321.     LINE (dx!, QM! * 1.1)-(dx!, dy!): LINE -(ore! * 1.1, dy!), bianco
  322.     PSET (dx!, QM! * 1.1!), bianco: DRAW "F20": PSET (dx!, QM! * 1.1), bianco: DRAW "G20" ': LOCATE 7, 65: PRINT "y"
  323.     PSET (ore! * 1.1, dy!), bianco: DRAW "G20": PSET (ore! * 1.1, dy!), bianco: DRAW "H20" ': LOCATE 25, 112: PRINT "x"
  324.     FOR z% = 1 TO 24
  325.         CIRCLE (dx! + massimi1(visualizzaieto%, z%, 1).ore, dy! + massimi1(visualizzaieto%, z%, 1).portata), 3 / fx!, rosso
  326.         PAINT (dx! + massimi1(visualizzaieto%, z%, 1).ore + 0.5 / fx!, dy! + massimi1(visualizzaieto%, z%, 1).portata + 0.5 / fx!), rosso
  327.         IF z% = 1 THEN
  328.             LINE (dx!, dy!)-(dx! + massimi1(visualizzaieto%, z%, 1).ore, dy! + massimi1(visualizzaieto%, z%, 1).portata), rosso
  329.         ELSE
  330.             LINE (dx! + massimi1(visualizzaieto%, z% - 1, 1).ore, dy! + massimi1(visualizzaieto%, z% - 1, 1).portata)-(dx! + massimi1(visualizzaieto%, z%, 1).ore, dy! + massimi1(visualizzaieto%, z%, 1).portata), rosso
  331.         END IF
  332.         IF z% = 24 THEN
  333.             SELECT CASE visualizzaieto%
  334.                 CASE IS = 1
  335.                     LINE -(dx!, dy! + massimi1(visualizzaieto%, z%, 1).portata), bianco, , 61440
  336.                     LINE (dx! + massimi1(visualizzaieto%, z%, 1).ore, dy! + massimi1(visualizzaieto%, z%, 1).portata)-(dx! + massimi1(visualizzaieto%, z%, 1).ore, dy!), bianco, , 61440
  337.                 CASE IS = 2
  338.                     LINE (dx! + massimi1(visualizzaieto%, z%, 1).ore, dy! + massimi1(visualizzaieto%, z%, 1).portata)-(dx! + massimi1(visualizzaieto%, z%, 1).ore, dy!), bianco, , 61440
  339.             END SELECT
  340.         END IF
  341.     NEXT z%
  342.     IF visualizzaieto% = 2 THEN
  343.         LINE (dx!, dy! + QM!)-(dx! + oreM!, dy! + QM!), bianco, , 61440
  344.         LINE -(dx! + oreM!, dy!), bianco, , 61440
  345.     END IF
  346.     ' _PRINTSTRING (L% \ 2, H% \ 2), "O" '_PRINTSTRING non usa le coordinate locali di VIEW, ma sempre quello dello SCREEN in uso. Per tal ragione e' stato necessario creare grafico&.
  347.     SLEEP
  348.     i% = 1
  349.     k! = 0.98
  350.     WHILE i% * tacca% <= QM!
  351.         LINE (dx! - 5 / fx!, dy! + i% * tacca%)-(dx! + 5 / fx!, dy! + i% * tacca%): SLEEP
  352.         _PRINTSTRING (dx! * fx! - 20, H% - 1 - (dy! + i% * tacca%) * fy! * k!), "-": SLEEP
  353.         i% = i% + 1
  354.     WEND
  355.     WINDOW
  356.     i% = 1
  357.     '  k! = 1
  358.     WHILE i% * tacca% <= QM!
  359.         '   LINE (dxy% - 1 - 5, H% - 1 - (dy! + i% * tacca%) * fy! * k!)-(dxy% - 1 + 1000, H% - 1 - (dy! + i% * tacca%) * fy! * k!), giallo: SLEEP
  360.         '   PRINT (dy! + i% * tacca%) * fy!: SLEEP
  361.         _PRINTSTRING (dx! * fx! - 20, H% - 1 - (dy! + i% * tacca%) * fy! * k!), "--": SLEEP
  362.         i% = i% + 1
  363.     WEND
  364.     ' k% = i% * tacca%
  365.     'i% = 1
  366.     'WHILE i% <= ore!
  367.     '    _PRINTSTRING (dxy%, H% - 1 - (dxy% + i% * k%)), "-"
  368.     'i% = i% + 1
  369.     'WEND
  370.     '  _PUTIMAGE ((_DESKTOPWIDTH - L%) \ 2, (_DESKTOPHEIGHT - H%) \ 2), grafico&, schermo&
  371.     '   _FREEIMAGE grafico&
  372. '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  373. SUB risultati ()
  374.     FOR z% = 1 TO 24
  375.         CLS
  376.         PRINT "z%="; z%
  377.         PRINT "dt="; dt!(visualizzaieto%, z%); ";"; dt!(visualizzaieto%, z%) * 60
  378.         PRINT "visualizzaieto%="; visualizzaieto%
  379.         PRINT "m%="; m%(visualizzaieto%, z%)
  380.         PRINT "N="; coefficienti(z%).d / tc!
  381.         PRINT "n="; coefficienti(z%).tSUta
  382.         FOR i% = 1 TO 50
  383.             '  _LIMIT limit
  384.     PRINT _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).m)), _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).mdt)), _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).tminuti)), _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).h1)),_
  385.      _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).i1)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).i2)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).DH)), _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).H2)),_
  386.       _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).he)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).Dhe)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).MOCKUStSUta)),_
  387.        _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).MOCKUSqSUqp)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).tmSUta)), _TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).qmSUqp)),_TRIM$(STR$(matrice1(visualizzaieto%,z%,i%, 1).qm))
  388.         NEXT i%
  389.         SLEEP
  390.         CLS
  391.         FOR n% = 1 TO 50
  392.             '  _LIMIT limit
  393.             LOCATE 1,
  394.             FOR i% = 1 TO 50
  395.                 LOCATE , n% * 4 - 3
  396.                 PRINT matrice2!(visualizzaieto%, z%, i%, n%)
  397.             NEXT i%
  398.         NEXT n%
  399.         SLEEP
  400.     NEXT z%
  401.     CLS
  402.     FOR n% = 1 TO 24
  403.         ' _LIMIT limit
  404.         SELECT CASE n%
  405.             CASE IS <= 16
  406.                 FOR i% = 1 TO 50
  407.                     LOCATE i%, n% * 15 - 14
  408.                     PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).portata))
  409.                     'PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).ore))
  410.                     'PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).minuti))
  411.  
  412.                 NEXT i%
  413.                 IF n% = 16 THEN SLEEP: CLS
  414.             CASE IS > 16
  415.                 FOR i% = 1 TO 50
  416.                     LOCATE i%, (n% - 16) * 15 - 14
  417.                     PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).portata))
  418.                     'PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).ore))
  419.                     'PRINT _TRIM$(STR$(idrogramma(visualizzaieto%, n%, i%, 1).minuti))
  420.                 NEXT i%
  421.         END SELECT
  422.     NEXT n%
  423.     SLEEP
  424.     CLS
  425.     FOR z% = 1 TO 24
  426.         ' _LIMIT limit
  427.         PRINT massimi1(visualizzaieto%, z%, 1).ore, massimi1(visualizzaieto%, z%, 1).minuti, massimi1(visualizzaieto%, z%, 1).portata
  428.     NEXT z%
  429.     SLEEP
  430.     PRINT
  431.     PRINT massimi2(visualizzaieto%).ore; massimi2(visualizzaieto%).portata
  432.  


Pages: [1] 2