Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Programma Conversioni Rel.:1
Forum - C# / VB.NET - Programma Conversioni Rel.:1

Avatar
Carlo (Member)
Guru


Messaggi: 1311
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:03
Giovedì, 29/03/2018
Non ho controllato le altre unità di misura, ma le temperature non vengono ancora convertite correttamente.

Stimolato dal tuo programma ho scritto queste righe:
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.         ' da celsius a
  4.         Dim Fahrenheit As Double = TextCelsius.Text * 1.8 + 32
  5.         Dim Kelvin As Double = TextCelsius.Text + 273.15
  6.  
  7.         TextKelvin.Text = Math.Round(Kelvin, 3)
  8.         TextFahrenheit.Text = Math.Round(Fahrenheit, 3)
  9.     End Sub
  10.  
  11.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  12.         ' da fahrenheit a
  13.         Dim Celsius As Double = (TextFahrenheit.Text - 32) / 1.8
  14.         Dim Kelvin As Double = (TextFahrenheit.Text - 32) / 1.8 + 273.15
  15.  
  16.         TextKelvin.Text = Math.Round(Kelvin, 3)
  17.         TextCelsius.Text = Math.Round(Celsius, 3)
  18.     End Sub
  19.  
  20.     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  21.         ' da kelvin a
  22.         Dim Celsius As Double = TextKelvin.Text - 273.15
  23.         Dim Fahrenheit As Double = TextKelvin.Text * 1.8 - 459.67
  24.  
  25.         TextFahrenheit.Text = Math.Round(Fahrenheit, 3)
  26.         TextCelsius.Text = Math.Round(Celsius, 3)
  27.     End Sub
  28. End Class



allegate alcune conversioni sbagliate

Se ti interessa nella sezione progetti Mikelius ha aperto:
http://www.pierotofy.it/pages/extras/forum/764/1062989-mig ...
il programma è in C# e Vb .NET, anche le mie righe sono state migliorate dal confronto con Mikelius


Carlo ha allegato un file: errori.png (40693 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 30/03/2018 alle 3:07


in programmazione tutto è permesso
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 13:00
Giovedì, 29/03/2018
Il problema è di fondo.

Alcune conversioni non riesco proprio a farle (Ad esempio Gallone UK->USA)
Altre totalmente sbagliate (Celsius->Celsius!!!)

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1311
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:42
Giovedì, 29/03/2018
Non ho compreso a fondo la filosofia di funzionamento: nelle dichiarazioni delle distanze mi sembra di aver capito che il riferimento è il metro=1, tutti gli altri valori sono dei moltiplicatori che permettono di fare la conversione.
Ma nella temperatura non c'è un riferimento e anzi il valore associato ai celsius è 1,8 che non è un moltiplicatore dei kelvin ma solo dei fahrenheit, infatti nella realtà se si aumenta di un grado celsius, si aumenta di 1,8 gradi fahrenheit, le scale sono diverse e la base di partenza pure.

Ultima modifica effettuata da Carlo il 29/03/2018 alle 17:56


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1311
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 7:05
Venerdì, 30/03/2018
Spero che l'autore del programma non ne avrà a male se ho pasticciato un po' il suo codice.
Per le temperature non ho trovato dei valori universali da caricare in c1 e c2 che soddisfino tutte le combinazioni.
Ho apportato modifiche solo nelle conversioni delle temperature ed evitato che sul secondo combobox si carichi la stessa unità di misura del primo combobox.
Ora le temperature vengono correttamente convertite, per le conversioni delle altre grandezze non ho eseguito alcun controllo, deve essere implementato il rifiuto dell'inserimrnto delle lettere.
Posto il sorgente modificato poiché il progetto allegato non è più in vb .net 2005 come l'originale ma in vb .net 2010.

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.  
  3.     Dim Nome As String = ""
  4.     ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  5.     Dim Lunghezza() As String = {"Lunghezza", "AnnoLuce;9461000000000000", "Pollice;0,025399986", "Centimetro;0,01", "Piede;0,3048", "Metro;1", _
  6.                                  "Yarda;0,9144", "Miglio Terrestre;1609,34", "Kilometro;1000", "Miglio Marino;1852", "Li;500", "Jou;3,03", "Millimetro;0,001"}
  7.     Dim Superficie() As String = {"Superficie", "Acro;4046,86", "Kilometroq;1000000", "Metroq;1", "Ara;100", "Centiara;100", "Polliceq;0,00064516", "Piedeq;0,092903", _
  8.                                   "Centimetroq;0,0001", "Miglio terrestreq;2590000", "Yardaq;0,9999999613"}
  9.     Dim Capacità() As String = {"Capacita", "Gallone Usa;3,78541", "Litro;1", "Gallone Uk;4,54608785742778", "Ettolitro;100", "Pinta USA;0,473176249991928", "Quarto USA;0,946352499983856"}
  10.     Dim Velocità() As String = {"Velocità", "Kilometri / Ora;1", "Metri / Secondo;3,6", "Miglia terrestri / Ora;2,23694", "Nodo;1,9438477170141"}
  11.     Dim Peso() As String = {"Peso", "Oncia;28,3495", "Grammo;1", "Libbra;453,592000004704", "Ettogrammo;100", "Kilogrammo;1000", "Mace;3,77994", "Jin;600", "Tonnellata;1000000", "Quintale;100000"}
  12.     Dim Pressione() As String = {"Pressione", "Atmosfera;1,01325", "Pascal;0,00001", "Bar;0,986923", "Torr;0,001315789117884332", "Libbra x polliceq;0,06804594551879439"}
  13.     Dim Potenza() As String = {"Potenza", "Cavallo Vapore;1", "Watt;0,00135962"}
  14.     Dim Temperatura() As String = {"Temperatura", "Fahrenheit;1,8", "Celsius;-273,15", "Kelvin;273,15"}
  15.     Dim Forza() As String = {"Forza,", "Newton;1", "Kilogrammo forza; 0.1020"}
  16.     Dim MainArr()() As String = {Lunghezza, Superficie, Capacità, Velocità, Peso, Pressione, Potenza, Temperatura, Forza}
  17.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  18.  
  19.         'carico il primo combobox
  20.         For Each a() As String In MainArr
  21.             For k As Byte = 1 To a.Length - 1
  22.                 Dim splt() As String = Split(a(k), ";") ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  23.                 cbx1.Items.Add(splt(0))
  24.             Next
  25.         Next
  26.  
  27.     End Sub
  28.     '******************************************************
  29.     '* Carico il secondo combobox con gli elementi dello  *
  30.     '* stesso tipo di quello scelto con il primo combobox *
  31.     '******************************************************
  32.     Private Sub cbx1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbx1.SelectedIndexChanged
  33.  
  34.         Dim a() As String
  35.  
  36.         cbx2.Text = ""
  37.         cbx2.Items.Clear()
  38.         tbxResult.Text = ""
  39.         Do
  40.             For Each a In MainArr
  41.                 For k As Byte = 1 To a.Length - 1
  42.                     Dim d() As String = Split(a(k), ";") ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  43.                     If d(0) = cbx1.Text Then
  44.                         Nome = a(0)
  45.                         Exit Do
  46.                     End If
  47.                 Next
  48.             Next
  49.         Loop
  50.         Select Case Nome
  51.             Case "Lunghezza"
  52.                 a = Lunghezza
  53.             Case "Superficie"
  54.                 a = Superficie
  55.             Case "Capacità"
  56.                 a = Capacità
  57.             Case "Velocità"
  58.                 a = Velocità
  59.             Case "Peso"
  60.                 a = Peso
  61.             Case "Pressione"
  62.                 a = Pressione
  63.             Case "Potenza"
  64.                 a = Potenza
  65.             Case "Temperatura"
  66.                 a = Temperatura
  67.             Case "Forza"
  68.                 a = Forza
  69.         End Select
  70.         For kkk As Byte = 1 To a.Length - 1
  71.             Dim splt() As String = Split(a(kkk), ";") ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  72.             If cbx1.SelectedItem <> splt(0) Then cbx2.Items.Add(splt(0)) ' Modificato per evitare di inserire se stesso
  73.         Next
  74.  
  75.     End Sub
  76.     Private Sub btnConvert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConvert.Click
  77.  
  78.         If String.IsNullOrEmpty(tbxQty.Text) Then
  79.             tbxQty.Text = "1"
  80.         End If
  81.         DoConvert()
  82.  
  83.     End Sub
  84.     Sub DoConvert()
  85.  
  86.         If Not String.IsNullOrEmpty(cbx1.Text) AndAlso Not String.IsNullOrEmpty(cbx2.Text) Then
  87.             Select Case Nome
  88.                 Case "Lunghezza"
  89.                     ConvertAll(Lunghezza, cbx1, cbx2, tbxResult)
  90.                 Case "Superficie"
  91.                     ConvertAll(Superficie, cbx1, cbx2, tbxResult)
  92.                 Case "Capacità"
  93.                     ConvertAll(Capacità, cbx1, cbx2, tbxResult)
  94.                 Case "Velocità"
  95.                     ConvertAll(Velocità, cbx1, cbx2, tbxResult)
  96.                 Case "Peso"
  97.                     ConvertAll(Peso, cbx1, cbx2, tbxResult)
  98.                 Case "Pressione"
  99.                     ConvertAll(Pressione, cbx1, cbx2, tbxResult)
  100.                 Case "Potenza"
  101.                     ConvertAll(Potenza, cbx1, cbx2, tbxResult)
  102.                 Case "Temperatura"
  103.                     ConvertAll(Temperatura, cbx1, cbx2, tbxResult)
  104.                 Case "Forza"
  105.                     ConvertAll(Forza, cbx1, cbx2, tbxResult)
  106.             End Select
  107.         Else
  108.             MsgBox("SCEGLIERE DUE GRANDEZZE!")
  109.         End If
  110.  
  111.     End Sub
  112.     Sub ConvertAll(ByVal myarr() As String, ByVal cb1 As ComboBox, ByVal cb2 As ComboBox, ByVal rs As TextBox)
  113.  
  114.         Dim c1, c2 As Double
  115.  
  116.         For Each s As String In myarr
  117.             Dim splt() As String = Split(s, ";") ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  118.             If splt(0) = cb1.Text Then
  119.                 c1 = Convert.ToDouble(splt(1))
  120.                 Exit For
  121.             End If
  122.         Next
  123.         For Each s As String In myarr
  124.             Dim splt() As String = Split(s, ";") ' Modificato separatore da "-" a ";" per poter inserire un valore negativo
  125.             If splt(0) = cb2.Text Then
  126.                 c2 = Convert.ToDouble(splt(1))
  127.                 Exit For
  128.             End If
  129.         Next
  130.         If Nome <> "Temperatura" Then
  131.             rs.Text = Convert.ToDouble(tbxQty.Text.Replace(".", ",")) * (c1 / c2) ' Modificato per accettare sia la virgola che il punto decimale
  132.         Else
  133.             Dim app As Double = Convert.ToDouble(tbxQty.Text.Replace(".", ",")) ' Modificato per accettare sia la virgola che il punto decimale
  134.  
  135.             ' aggiunta/modificata routine conversione
  136.             If cbx1.Text = "Kelvin" And app < 0 Then MsgBox("IN QUESTO CASO IL VALORE DI TEMPERATURA KELVIN NON PUO' ESSERE < 0!") : Exit Sub
  137.             If cbx1.Text = "Celsius" And app < -273.15 Then MsgBox("IN QUESTO CASO IL VALORE DI TEMPERATURA CELSIUS NON PUO' ESSERE < -273.15!") : Exit Sub
  138.             If cbx1.Text = "Fahrenheit" And app < -459.67 Then MsgBox("IN QUESTO CASO IL VALORE DI TEMPERATURA FAHRENHEIT NON PUO' ESSERE < -459.67!") : Exit Sub
  139.  
  140.             If cbx1.Text = "Kelvin" And cbx2.Text = "Fahrenheit" Then
  141.                 rs.Text = Math.Round(app * c2 - 459.67, 3)
  142.             ElseIf cbx1.Text = "Celsius" And cbx2.Text = "Fahrenheit" Then
  143.                 rs.Text = Math.Round(app * c2 + 32, 3)
  144.             ElseIf cbx1.Text = "Fahrenheit" And cbx2.Text = "Celsius" Then
  145.                 rs.Text = Math.Round((app - 32) / c1, 3)
  146.             ElseIf cbx1.Text = "Fahrenheit" And cbx2.Text = "Kelvin" Then
  147.                 rs.Text = Math.Round((app - 32) / c1 + c2, 3)
  148.             Else ' Kelvin -> Celsius, Celsius -> Kelvin
  149.                 rs.Text = Math.Round(app + c2, 3)
  150.             End If
  151.         End If
  152.  
  153.     End Sub
  154.     Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
  155.  
  156.         Application.Exit()
  157.  
  158.     End Sub
  159.     Private Sub tbxQty_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tbxQty.TextChanged
  160.  
  161.         tbxResult.Text = ""
  162.  
  163.     End Sub
  164.  
  165.    Private Sub cbx2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbx2.SelectedIndexChanged
  166.  
  167.         tbxResult.Text = ""
  168.  
  169.     End Sub
  170.  
  171. End Class



Carlo ha allegato un file: Conversioni.zip (146548 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 30/03/2018 alle 7:27


in programmazione tutto è permesso
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 10:16
Venerdì, 30/03/2018
Sarebbe Bello se l'autore scrivesse qui, almeno spiegando il suo codice. Magari a noi sfugge qualcosa.
Sopratutto, viste le continue modifiche, non sarebbe meglio aprire un progetto?

Ultima modifica effettuata da Mikelius il 30/03/2018 alle 10:18
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1311
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:43
Venerdì, 30/03/2018
Ne ha pubblicato un altro rev.2, le temperature vengono convertite correttamente (senza arrotondamento), ma non ha inserito il controllo dei valori minimi, 0 per i Kelvin, -273,15 per i Celsius e -459,67 per i Fahrenheit.
Ho provato a convertire i galloni Usa, non funziona.


in programmazione tutto è permesso
PM Quote