Username: Password: oppure
.NET World - Somma Algebrica in VB.NET
Forum - .NET World - Somma Algebrica in VB.NET

Avatar
CGiuseppe (Normal User)
Rookie


Messaggi: 54
Iscritto: 29/09/2006

Segnala al moderatore
Postato alle 11:09
Venerdì, 05/09/2008
Premetto che una volta mi è riuscito :d, ma non riesco proprio a creare una Function che mi restituisca la somma algebrica di una stringa tipo "2+5-1+3-2".

Per favore, potreste aiutarmi?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:22
Venerdì, 05/09/2008
Espressioni regolari.

Oppure:

Splitti la stringa su tutti i "+". In questo modo ottieni parti di stringa in cui ci sono solo "-" oppure in cui c'è un solo numero. Quindi splitti ogni parte ed esegui la sottrazione. Poi esegui la somma tra tutti i risultati.

"1+2+5-3-6+2-1"
Diventa:
"1", "2", "5-3-6", "2-1"
I primi due numeri li tieni esattamente così, poi splitti sul "-" le altre stringhe ed esegui l'operazione (che è sempre la stessa.
"5-3-6" > -4
"2-1" > 1
Infine sommi tutti i risultati:
1 + 2 + (-4) + 1 = 0


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
CGiuseppe (Normal User)
Rookie


Messaggi: 54
Iscritto: 29/09/2006

Segnala al moderatore
Postato alle 13:34
Venerdì, 05/09/2008
Testo quotato

Postato originariamente da Il Totem:

Espressioni regolari.

Oppure:

Splitti la stringa su tutti i "+". In questo modo ottieni parti di stringa in cui ci sono solo "-" oppure in cui c'è un solo numero. Quindi splitti ogni parte ed esegui la sottrazione. Poi esegui la somma tra tutti i risultati.

"1+2+5-3-6+2-1"
Diventa:
"1", "2", "5-3-6", "2-1"
I primi due numeri li tieni esattamente così, poi splitti sul "-" le altre stringhe ed esegui l'operazione (che è sempre la stessa.
"5-3-6" > -4
"2-1" > 1
Infine sommi tutti i risultati:
1 + 2 + (-4) + 1 = 0



Ho provato a fare:

Codice sorgente - presumibilmente VB.NET

  1. Function SumNums(ByVal expr As String) As String
  2.         Dim result As String = Nothing
  3.         expr = expr.Replace(" ", "")
  4.  
  5.         Dim lastIndex As Integer = 0
  6.  
  7.         For Each d As String In expr.Split("+")
  8.             For Each f As String In d.Split("-")
  9.                 If f <> "" Then lastIndex -= CInt(f)
  10.             Next
  11.             If Not d.Contains("-") Then
  12.                 If d <> "" Then lastIndex += CInt(d)
  13.             End If
  14.         Next
  15.         result = lastIndex
  16.  
  17.         Return result
  18.     End Function



Ma non funziona, oltre a dare risultati stranti, tipo "2+2" = 0. Non capisco come mai qualche tempo fa mi è riuscito e ora no... 8-| ?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:33
Sabato, 06/09/2008
Testo quotato

Postato originariamente da CGiuseppe:
Ho provato a fare:

Codice sorgente - presumibilmente VB.NET

  1. Function SumNums(ByVal expr As String) As String
  2.         Dim result As String = Nothing
  3.         expr = expr.Replace(" ", "")
  4.  
  5.         Dim lastIndex As Integer = 0
  6.  
  7.         For Each d As String In expr.Split("+")
  8.             For Each f As String In d.Split("-")
  9.                 If f <> "" Then lastIndex -= CInt(f)
  10.             Next
  11.             If Not d.Contains("-") Then
  12.                 If d <> "" Then lastIndex += CInt(d)
  13.             End If
  14.         Next
  15.         result = lastIndex
  16.  
  17.         Return result
  18.     End Function



Ma non funziona, oltre a dare risultati stranti, tipo "2+2" = 0. Non capisco come mai qualche tempo fa mi è riuscito e ora no... 8-| ?


E' un errore concettuale:
Codice sorgente - presumibilmente VB.NET

  1. Function SumNums(ByVal expr As String) As String
  2.         Dim result As String = Nothing
  3.         expr = expr.Replace(" ", "")
  4.  
  5.         Dim Total As Int32 = 0
  6.  
  7.         For Each Plus As String In expr.Split("+")
  8.             Dim Minus() As String = Plus.Split("-")
  9.             'Il primo numero non è da sottrarre!
  10.             'In "5+2-3" hai il più che spezza "5" e "2-3",
  11.             'ma tu sottrai sia "2" che "3", invece devi
  12.             'sommare "2" e sottrarre "3"
  13.             For I As Int16 = 0 To Minus.Length - 1
  14.                 If I = 0 Then
  15.                     Total += CInt(Minus(I))
  16.                 Else
  17.                     Total -= CInt(Minus(I))
  18.                 End If
  19.             Next
  20.             'Ora una volta che hai sommato il
  21.             'primo numero è tutto risolto, poiché
  22.             'la funzione split restituisce la stringa
  23.             'completa senon trova caratteri su
  24.             'cui spezzarla
  25.         Next
  26.         result = Total
  27.  
  28.         Return result
  29.     End Function



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote