Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Parabola vb

  1. #1

    Parabola vb

    salve a tutti,

    Premetto che non sono molto esperto di programmazione.
    Dopo aver compilato il file vb, per il disegno di una parabola, lasciando i valori già preimpostati, mi viene segnalato un errore"di routine o argomento non valido" nella parte di codice in cui calcola la raice del delta. Per sicurezza metto tutto il codice, e evidenzio di rosso l'errore.



    Option Explicit
    Dim xMin As Double, xMax As Double
    Dim yMin As Double, ymax As Double
    Dim a As Double, b As Double, c As Double
    Dim delta As Double, x As Double

    Public Function radice(delta As Double) As Double
    radice = Sqr(delta)
    End Function

    Public Sub Intersezione()


    If delta < 0 Then
    interx.Caption = "IMP"
    intery.Caption = "IMP"
    interx2.Caption = "IMP"
    intery2.Caption = "IMP"
    End If
    If delta = 0 Then
    x = -b / (2 * a)
    interx.Caption = x
    intery.Caption = 0
    interx2.Caption = "//"
    intery2.Caption = "//"
    Else
    x = (-b - radice(delta)) / (2 * a)
    interx.Caption = x
    intery.Caption = 0
    x = (-b + radice(delta)) / (2 * a)
    interx2.Caption = x
    intery2.Caption = 0
    End If
    End Sub
    Public Function delt(a As Double, b As Double, c As Double) As Double
    delt = (b ^ 2) - (4 * a * c)
    End Function

    Public Sub ImpostaVariabili()
    If IsNumeric(txtxmin.Text) Then 'se il valore inserito è numerico allora...
    xMin = txtxmin.Text
    Else 'altrimenti...

    MsgBox "Valore non corretto, verrà impostato un valore di default", vbExclamation
    xMin = -10
    txtxmin.Text = xMin
    End If
    If IsNumeric(txtxmax.Text) Then 'se il valore inserito è numerico allora...
    xMax = txtxmax.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbCritical
    xMax = 10
    txtxmax.Text = xMax
    End If
    If IsNumeric(txtymin.Text) Then 'se il valore inserito è numerico allora...
    yMin = txtymin.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbCritical
    yMin = -10
    txtymin.Text = yMin
    End If
    If IsNumeric(txtymax.Text) Then 'se il valore inserito è numerico allora...
    ymax = txtymax.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbExclamation
    ymax = 10
    txtymax.Text = ymax
    End If
    If IsNumeric(Txta.Text) Then 'se il valore inserito è numerico allora...
    a = Txta.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbExclamation
    a = 2
    Txta.Text = a
    End If
    If IsNumeric(Txtb.Text) Then 'se il valore inserito è numerico allora...
    b = Txtb.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbExclamation
    b = 2
    Txtb.Text = b
    End If
    If IsNumeric(Txtc.Text) Then 'se il valore inserito è numerico allora...
    c = Txtc.Text
    Else
    MsgBox "Valore non corretto, verrà impostato un valore di default", vbExclamation
    c = 2
    Txtc.Text = c
    End If
    CmdDati.Enabled = True 'Posizionare in CmdConferma Enabled = False, così fino a quando non si convalidano i valori questo pulsante rimane inattivo
    End Sub


    Private Sub cmdConferma_Click()


    Dim y As Double
    Dim x As Double
    Dim incremento As Double



    picGrafico.Scale (txtxmin.Text, txtymax.Text)-(txtxmax.Text, txtymin.Text)
    picGrafico.Cls
    incremento = (txtxmax.Text - txtxmin.Text) / 1000
    picGrafico.Line (txtxmin.Text, 0)-(txtxmax.Text, 0), vbGreen
    picGrafico.Line (0, txtymin.Text)-(0, txtymax.Text), vbGreen
    picGrafico.Circle (vx(0).Caption, vy(1).Caption), 8 * incremento, &HFF00FF
    picGrafico.Line (txtxmin.Text, Dirett.Caption)-(txtxmax.Text, Dirett.Caption), vbBlue
    picGrafico.Line (asse.Caption, txtymin.Text)-(asse.Caption, txtymax.Text), &H80800
    picGrafico.Circle (interx.Caption, 0), 8 * incremento, &HFF00FF
    picGrafico.Circle (interx2.Caption, 0), 8 * incremento, &HFF00FF
    picGrafico.Circle (fx.Caption, fy.Caption), 8 * incremento, &HFF00FF


    y = (txtxmin.Text * txtxmin.Text) * Txta.Text + txtxmin.Text * Txtb.Text + Txtc.Text

    picGrafico.PSet (txtxmin.Text, y), vbRed

    For x = txtxmin.Text + incremento To txtxmax.Text Step incremento
    y = (x * x) * Txta.Text + x * Txtb.Text + Txtc.Text
    picGrafico.Line -(x, y), vbRed
    Next x
    CmdDati.Enabled = False
    CmdConferma.Enabled = False

    End Sub

    Private Sub CmdDati_Click()
    Dim IntersezioneX As Double

    If a > 0 Then

    conc(1).Caption = "alto"
    Else
    conc(1).Caption = "basso"
    End If

    vx(0).Caption = -b / (2 * a)
    vy(1).Caption = (-b ^ 2 + 4 * a * c) / (4 * a)
    fx.Caption = -b / (2 * a)
    fy.Caption = (1 / (4 * a)) + vy(1).Caption
    asse.Caption = -b / (2 * a)
    Dirett.Caption = (-1 / (4 * a)) + vy(1).Caption
    CmdConferma.Enabled = True
    delta = delt(a, b, c)
    D.Caption = delta

    Intersezione

    End Sub
    Private Sub cmdConvalida_Click()
    ImpostaVariabili

    End Sub



    Private Sub picGrafico_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    txtx = x
    txty = y
    End Sub

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sara' perche' il delta e' negativo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non credo che dipenda dal delta, infatti ho messo che se il delta è <0 nei vari campi venga scritto "IMP", e il programma non dovrebbe entrare nella funzione radice, perchè non l'ho chiamata per delta <0
    ...
    Public Function radice(delta As Double) As Double
    radice = Sqr(delta)
    End Function

    Public Sub Intersezione()

    If delta < 0 Then
    interx.Caption = "IMP"
    intery.Caption = "IMP"
    interx2.Caption = "IMP"
    intery2.Caption = "IMP"
    End If
    ...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Io credo invece che sia proprio come ti ho detto ...

    Primo, perche' quell'errore la funzione radice lo da' solo in quel caso (hai controllato in debug il valore della variabile 'delta' quando c'e' l'errore?)

    Secondo, perche' tu controlli il < solo per scrivere IMP ma non fai nulla per evitare di eseguire il resto del programma. Questo infatti continua e prende la strada dell'else della seconda if causando l'errore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    risolto!! grazie Oregon

    Ormai che ci sono vorrei chiederti un piccola delucidazione... i c++ quando si si scrive "if()...else"
    non esegue l'istruzione in if, se vera, altrimenti va in else?
    mentre come mai in vb va anche dentro l'else??



  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Einstein1!!!
    mentre come mai in vb va anche dentro l'else??
    Non capisco quello che vuoi dire ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Riguardo il problema del delta, del programma che stavo facendo in visual basic:
    avevo scritto
    "
    if delta<0...
    if delta=0 ....
    else..."
    Quando eseguiva il programma, se ad esempio il delta era <0 eseguiva il codice all'interno dell'if delta<0, poi entrava in else ed eseguiva quello che trovava al suo interno (dandomi così errore).

    Mentre in c++ viene eseguito il codice al'interno dell'if,se è falso eseguie quello all'interno dell'else (considerando un programma differente da quello della parabola).

    Può andare?
    :master:

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Forse non hai ben compreso il problema ... se tu scrivessi quel codice in C++ avresti lo stesso risultato ...

    L' Else fa parte del blocco "If delta=0" e non del primo If

    Quindi tu hai

    codice:
    If delta < 0 Then
     ...
    End If
    
    If delta = 0 Then
      ...
    Else
      ...
    End If
    Se il delta e' < 0 allora la prima If viene eseguita e il codice continua con la seconda If
    La seconda If non viene eseguita perche' delta non e' = 0 ma viene giustamente eseguita la Else perche' delta < 0 e' comunque diverso da zero.

    Il codice corretto in VB sarebbe

    codice:
    If delta < 0 Then
      ...
    Else
       If delta = 0 Then
         ...
       Else
         ...
       End If
    End If
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9


    Capito tutto

    grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.