Archive for febbraio 2022

Calcolo equazioni di primo grado

Posted on 21 febbraio 2022. Filed under: Senza categoria |

Ho aperto Excel, e su una cella qualunque ho scritto una espressione a caso, né facile, né complessa, una cosa di media difficoltà come questa =65+((59+58*9)-25)+46-45/59 (usando solo numeri interi) e mi ha dato come risultato 666,2373

Mi sono poi chiesto: ma se volessi fare in modo che da un’espressione qualsiasi e dato il risultato, uno di questi numeri diventa X, come faccio a calcolare X?

Mi sono venute in mente due soluzioni: in base alla posizione di X e un ciclo While.

Per la posizione, se X fosse al posto di 65 sarebbe facile, perchè diventa: ((59+58*9)-25)+46-45/59=666,2373-65 e quindi diventa facile calcolare X=65

Se invece la posizione di X fosse più interna o anche esterna ma in una moltiplicazione o divisione, dovremo creare un altro metodo.

Questo metodo, che dovrò studiarlo lo farò in un successivo articolo, vediamo invece qua come utilizzare un ciclo while per ottenere quanto vale X. Facendo finta di conoscere che sono numeri interi faremo un ciclo while partendo da 0 e incrementando X di 1 finchè non avremo corrispondenza del risultato.

Creiamo un nuovo progetto VB.NET (Windows Forms o WPF), creiamo un pulsante e all’interno del codice Click andremo a scrivere il codice.

Come prima cosa faremo mettere in input l’espressione e il risultato.

    Dim Espressione As String = InputBox("Inserire l'espressione")
    Dim Risultato As Double = InputBox("Inserire il risultato dell'espressione")

Useremo poi un ciclo While per incrementare X di 1 a partire da 0 fino a quando espressione sia uguale al risultato e quindi visualizza il valore di X.

C’è però un problema: come posso convertire una espressione di stringa in una espressione matematica?

Ho fatto delle ricerche, ho scaricato dei codici di esempio che ho provato.

Come è giusto che sia, sono lunghi perchè devi fare un parser di ogni carattere e poi scriverti tutte le regole. Mi sono chiesto, allora, se esiste qualche funzione o qualche classe nel .NET Framrwork.

Per nostra fortuna si, perchè esiste all’interno di System.Data una classe chiamata DataTable e ha il metodo Compute che converte una espressione di stringa in espressione matematica.

Public Function Compute(expression As String, filter As String) As Object

Quindi alla fine il nostro codice diventa:

Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
    Dim Espressione As String = InputBox("Inserire l'espressione")
    Dim Risultato As Double = InputBox("Inserire il risultato dell'espressione")
    Dim NumeroDecimali As Integer



    For ty = 1 To Len(Risultato)
        If Mid(Risultato, ty, 1) = "," Then NumeroDecimali = Len(Risultato) - ty
    Next

    '65+((59+58*9)-25)+46-45/59
    '65+((59+58*9)-25)+X-45/59
    'Risultato=666,2373
    'X=46
    Dim RisultatoNuovaEspressione As Double = 0
    Dim X As Integer = -1
    While RisultatoNuovaEspressione <> Risultato
        X = X + 1
        Dim NuovaEspressione = Replace(Espressione, "X", X)
        RisultatoNuovaEspressione = New DataTable().Compute(NuovaEspressione, Nothing)
        RisultatoNuovaEspressione = FormatNumber(RisultatoNuovaEspressione, NumeroDecimali)
    End While
    MessageBox.Show("X = " & X)
End Sub

Abbiamo dovuto anche mettere un calcolo delle cifre decimali, altrimenti il risultato non sarà mai ottenuto per via degli arrotondamenti e ovviamente un replace per sostituire la X con il suo valore.

A questo punto lo lanciamo, inseriamo per esempio l’espressione di cui sopra:

Inseriamo poi il risultato dell’espressione:

Ed ecco quindi il risultato di X:

Questo è ovviamente un punto di partenza, si potrebbe provare a mettere altre X, dare in modo che X sia decimale e così via.

Magari in un prossimo articolo, ci proverò.

Leggi l'articolo intero | Make a Comment ( None so far )

Calcoliamo il Minimo Comune Multiplo

Posted on 14 febbraio 2022. Filed under: Senza categoria |

Dopo aver visto come calcolare il Massimo Comune Denominatore, vediamo ora come fare il calcolo del minimo comune multiplo in VB.NET.

Vediamo prima cosa è il minimo comune multiplo.

Il minimo comune multiplo di due numeri interi a e b, indicato con mcm(a,b), è il più piccolo numero intero positivo multiplo sia di a sia di b. Nel caso particolare in cui uno tra a o b è uguale a zero, allora si definisce mcm(a,b) uguale a zero.

Lo possiamo calcolare dal Massimo Comune Denominatore oppure in altro modo. Vedremo in questo articoli come calcolarlo dal MCD.

Partendo dal MCD la formula è:

Vediamo quindi il codice. Facciamo copia e incolla del codice usato per il calcolo del MCD ma andiamo poi a modificare nell’evento Click del Button1:

    Dim mcm = (a * b) / mcd

    MessageBox.Show("Il mcm è: " & mcm)

Se usiamo 21 come a e 6 come b avremo

In un prossimo articoli vedremo come calcolare il mcm anche tramite altri metodi.

Leggi l'articolo intero | Make a Comment ( None so far )

Algoritmo di Euclide

Posted on 6 febbraio 2022. Filed under: Senza categoria |

Nel corso di informatica che ho ripreso in aula, a Cinisello Balsamo, presso il Circolo Crocetta, dopo due anni di pandemia, fra le prime cose che ho spiegato è che un dispositivo elettronico, qualunque esso sia, risolve un nostro problema, tramite dei parametri dati in input e in base a questi valori esegue il un algoritmo che elabora i dati e ci dà in ouput il risultato.

Un algoritmo può essere di diverso tipo, dal meteo, agli orari dei treni e dei voli, le statistiche della nostra squadra del cuore etc etc, L’algoritmo risolve UN solo problema. Un algoritmo per ogni problema.

In questo articolo vediamo l’algoritmo di Euclide che dati in input due numeri interi qualsiasi, lui ci dia come output il MCD (Massimo Comune Divisore).

È uno degli algoritmi più antichi conosciuti, essendo presente negli Elementi di Euclide intorno al 300 a.C.

Vediamo il suo enumerato.

Dati due numeri a e b, l’algoritmo prevede che si controlli se b è zero. Se lo è, a è il MCD. Se non lo è, si deve dividere a con b e definire r come il resto della divisione (operazione indicata con “a modulo b” più sotto). Se r=0 allora si può affermare che b è il MCD cercato, altrimenti occorre assegnare {\displaystyle a'=b} e b’=r e ripetere nuovamente la divisione.

Vediamo il codice VB.NET per scrivere questo algoritmo.

Nell’interfaccia utente creiamo un pulsante e all’evento clic metteremo la richiesta dei due numeri.

Poi metteremo un controllo che a sia maggiore di 0. Verifichiamo che se b=0 allora il MCD=a

Dim a As Integer

aq:
a = InputBox(“Inserire primo numero: “)
If a <= 0 Then GoTo aq

Dim b As Integer

bq:
b = InputBox(“Inserire secondo numero: “)
If b < 0 Then GoTo bq
If b = 0 Then
MessageBox.Show(“Il MCD è: ” & a)
Exit Sub
End If

A questo punto lanciamo l’algoritmo e visualizziamo a video il risultato:

Dim mcd As Integer = AlgoritmoEuclide(a, b)
MessageBox.Show(“Il MCD è: ” & mcd)

Vediamo ora l’algoritmo:

Private Function AlgoritmoEuclide(ByVal a As Integer, ByVal b As Integer) As Integer
    Dim r As Int16 = a Mod b
    While (r <> 0)
        a = b
        b = r
        r = a Mod b
    End While
    Return b
End Function

Facciamo qualche prova: mettiamo a= 20 e b= 12: otteniamo quanto in figura:

Vediamo come lo otteniamo:

20/12= 1 col resto di 8: 12 diventa il numeratore a e 8 il denominatore b: la divisione fa il resto di 4. Quindi il numeratore a diventa 8 e il denominatore b diventa 4. La divisione 8/4 fa resto zero e quindi il MCD diventa r ed ecco perchè è 4.

In un successivo articolo vedremo anche il calcolo del MCM (Minimo Comune Multiplo)

Sono d’accordo che sono cose che già esistono, ma è anche un modo per ripassare le cose studiate a scuola, ormai tanti decenni fa.

Leggi l'articolo intero | Make a Comment ( None so far )

Calcolo del Dew Point e Heat Index

Posted on 1 febbraio 2022. Filed under: Senza categoria |

In questo articolo vedremo come fare un programmino per il calcolo dell’Heat Index e Dew Point.

Prima di tutto vediamo cosa sono questi due indici.

L’Heat Index, indice di calore è un indicatore della temperatura apparente, ossia il grado di disagio dovuto al mix di temperatura e umidità.

Viene misurata in gradi, potremo definirla come una temperatura percepita, anche se non è corretto, perchè la temperatura percepita cambia da corpo a corpo, dall’età e da altri fattori. Questo è solo un indicatore. La formula per calcolarlo è:

H = T + 0,5555 * (e-10) dove T è la temperatura dell’aria (in °C), ed “e” è la pressione di vapore dell’aria (hPa) osservata, per esempio tramite la misura con uno psicrometro. Poiché quest’ultima grandezza non è facile da reperire, la si può calcolare a partire dall’umidità relativa: e = (6,112*10^(7,5*T/(237,7+T))*UR/100) con T = temperatura dell’aria (°C) e UR = umidità relativa dell’aria (%). H non ha un’unità di misura propria, pertanto si può abitualmente associare alla stessa unità della temperatura (°C) anche se si tratta di un indice e non di una grandezza fisica. 

Il Dew Point, detto in italiano Punto di rugiada, invece,  si intende un particolare stato termodinamico (rappresentato dalla temperatura e dalla pressione) in corrispondenza del quale una miscela bifase multicomponente liquido-vapore diviene satura di vapore. In altre parole, oltre il punto di rugiada (cioè a temperatura maggiore e/o a pressione minore) si ha la presenza solo di vapore, mentre sotto il punto di rugiada (cioè a temperatura minore e/o a pressione maggiore) il sistema è bifase (costituito da un liquido in equilibrio con il suo vapore). 

Essa indica a che temperatura deve essere portata l’aria per far condensare in rugiada il vapore d’acqua in essa presente, senza alcun cambiamento di pressione. Se il punto di rugiada cade sotto 0 °C, esso viene chiamato anche punto di brina.

Qualsiasi eccedenza di vapore acqueo (“sovrasaturazione”) passerà allo stato liquido.

La formula è:

D = (237.3 * B) / (1 - B)
dove B viene calcolato con:
B = (L + (M / N)) / 17.27

L = ln(RH / 100)
M = 17.27 * T
N = 237.3 + T

T indica la temperatura in °C e RH l'umidità in percentuale.

Io ho dovuto fare un programmino, ovviamente in VB.NET, per inserire automaticamente questi dati riga per riga nei dati della mia stazione meteo.

Questo è il codice:
       Dim meteo As New meteoEntities

        Dim idLog As Integer
        Dim linqu = From xxx In meteo.DataLog Where xxx.Ch1_Temp <> "" And xxx.Ch1_Hum <> "" 
        Dim Ch1DewPointOld As String
        Dim Ch1HeatIndexOld As String
        Dim Ch1Temperatura As String
        Dim Ch1Umidita As String
        Dim Ch1DewPointNew As String
        Dim Ch1HeatIndexNew As String

        For Each log In linqu
            idLog = log.idLog
            Ch1DewPointOld = log.Ch1_DewPoint
            Ch1HeatIndexOld = log.Ch1_HeatIndex
            Ch1Temperatura = log.Ch1_Temp
            Ch1Umidita = log.Ch1_Hum

            Ch1DewPointNew = (237.3 * (Math.Log(Ch1Umidita / 100) + ((17.27 * Ch1Temperatura) / (237.3 + Ch1Temperatura)))) / (17.27 - (Math.Log(Ch1Umidita / 100) + ((17.27 * Ch1Temperatura) / (237.3 + Ch1Temperatura))))
            Dim pressione As Double = (6.112 * 10 ^ (7.5 * Ch1Temperatura / (237.7 + Ch1Temperatura)) * Ch1Umidita / 100)
            Ch1HeatIndexNew = Ch1Temperatura + 0.5555 * (pressione - 10)
            Dim rti As New crystalweb_it_meteoEntities
            Dim vol = rti.DataLog.First(Function(c) c.idLog = idLog)
            vol.Ch1_HeatIndex = FormatNumber(Ch1HeatIndexNew, 1)
            vol.Ch1_DewPoint = FormatNumber(Ch1DewPointNew, 1)
            rti.SaveChanges()
        Next
 

Per ora è tutto. Vedremo in successivi articoli, altri calcoli meteorologici,

Leggi l'articolo intero | Make a Comment ( None so far )

Liked it here?
Why not try sites on the blogroll...