Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [VB.NET] Seno e Coseno

  1. #1

    [VB.NET] Seno e Coseno

    Salve a tutti. Ho fatto questo programma in visual basic ma non capisco perchè mi produce un output errato, eppure sono sicuro che dal punto di vista dell'algoritmo sia corretto...

    codice:
    Module Module1
    
        Sub Main()
            Dim teta, alfa, beta, salfa, sbeta, epsilon, smu, cmu, steta, calfa, cbeta, cteta, mu As Double
            Console.WriteLine("Inserisci l'angolo di cui vuoi calcolare seno e coseno")
            teta = Console.ReadLine()
            Console.WriteLine("Inserisci l'errore con cui vuoi fare il calcolo: ")
            epsilon = Console.ReadLine()
            alfa = 0
            salfa = 0
            calfa = 1
            beta = 90
            sbeta = 1
            cbeta = 0
            Do
                mu = (alfa + beta) / 2
                smu = Math.Sqrt((1 - ((calfa * cbeta) + (salfa * sbeta))) / 2)
                cmu = Math.Sqrt((1 + ((calfa * cbeta) - (salfa * sbeta))) / 2)
                If mu < teta Then
                    alfa = mu
                    salfa = smu
                    calfa = cmu
                Else
                    beta = mu
                    sbeta = smu
                    cbeta = cmu
                End If
            Loop Until ((sbeta - salfa) < epsilon) And ((calfa - cbeta) < epsilon)
            steta = (salfa + sbeta) / 2
            cteta = (calfa + cbeta) / 2
            Console.WriteLine("Il seno è: {0}, ed il coseno è: {1}", steta, cteta)
            Console.ReadKey()
        End Sub
    
    End Module

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Guarda che la variabile 'teta' deve essere espressa in radianti non in gradi.
    codice:
    teta = teta * (Math.PI / 180)

  3. #3
    No. Ho fatto questo programma in vb.net per esercitarmi, perchè per me è nuovo, ma ti posso assicurare che l'ho fatto sia in C che in turbo pascal e funziona a dovere. Vorrei solo capire perchè non mi funziona in vb...

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970

    Ma usare le noti funzioni?????
    codice:
    System.Math.Sin
    System.Math.Cos

  5. #5
    Così ad occhio:
    codice:
            Dim teta, alfa, beta, salfa, sbeta, epsilon, smu, cmu, steta, calfa, cbeta, cteta, mu As Double
    In questa maniera dichiarati tutte variabili Object tranne l'ultima Double; devi specificare per ciascuna di esse As Double.
    codice:
            teta = Console.ReadLine()
            epsilon = Console.ReadLine()
    Qui assegni una stringa a teta (che la accetta senza problemi perché è un Object); è ovvio poi che di seguito vengano fuori i risultati più strani. Per effettuare il cast a double usa CDbl().
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6

    Ma usare le noti funzioni?????
    codice:

    System.Math.Sin
    System.Math.Cos
    Che senso avrebbe? Io l'ho fatto per imparare a programmare in vb. Ovvio che in altri contesti si usano quelle funzioni!

  7. #7
    Originariamente inviato da MItaly
    Così ad occhio:
    codice:
            Dim teta, alfa, beta, salfa, sbeta, epsilon, smu, cmu, steta, calfa, cbeta, cteta, mu As Double
    In questa maniera dichiarati tutte variabili Object tranne l'ultima Double; devi specificare per ciascuna di esse As Double.
    codice:
            teta = Console.ReadLine()
            epsilon = Console.ReadLine()
    Qui assegni una stringa a teta (che la accetta senza problemi perché è un Object); è ovvio poi che di seguito vengano fuori i risultati più strani. Per effettuare il cast a double usa CDbl().
    Non c'è un metodo come in C per dichiarare di botta tutte le variabili dello stesso tipo???

    P.S. Ho fatto come dici, ma non va lo stesso e poi come avevo dichiarato io le variabili ho visto con il debugger che le ha prese tutte di tipo double

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da MItaly
    Così ad occhio:
    codice:
            Dim teta, alfa, beta, salfa, sbeta, epsilon, smu, cmu, steta, calfa, cbeta, cteta, mu As Double
    In questa maniera dichiarati tutte variabili Object tranne l'ultima Double; devi specificare per ciascuna di esse As Double.
    Ma che dici? Questa è una dichiarazione multipla di variabili di tipo Double, in questo modo le dichiari proprio tutte Double in un colpo solo, tanto vero che se dopo la dichiarazione scrivi:
    codice:
     teta = "pippo"
    si verifica l'eccezzione 'cast non valido dalla stringa pippo al valore Double'.

    codice:
            teta = Console.ReadLine()
            epsilon = Console.ReadLine()
    Qui assegni una stringa a teta (che la accetta senza problemi perché è un Object); è ovvio poi che di seguito vengano fuori i risultati più strani. Per effettuare il cast a double usa CDbl().
    Qui si puoi avere problemi di convresione tra String e Double infatti se immetti un'angolo di 45,6° la conversione tra string e Double è corretta, ma se metti 45.6° ti converte in 456.0. Nessuna utilità la conversione con Cdbl in questo caso.

  9. #9
    Originariamente inviato da Pirelli72
    Ma che dici? Questa è una dichiarazione multipla di variabili di tipo Double, in questo modo le dichiari proprio tutte Double in un colpo solo, tanto vero che se dopo la dichiarazione scrivi:
    codice:
     teta = "pippo"
    si verifica l'eccezzione 'cast non valido dalla stringa pippo al valore Double'.
    Ops... su questo punto ero rimasto a VB6, che dichiarava tutte le prime variabili come Variant e l'ultima come Double.
    Qui si puoi avere problemi di convresione tra String e Double infatti se immetti un'angolo di 45,6° la conversione tra string e Double è corretta, ma se metti 45.6° ti converte in 456.0. Nessuna utilità la conversione con Cdbl in questo caso.
    In linea generale è comunque bene evitare le conversioni implicite, difatti è buona pratica iniziare ogni file con Option Strict.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    In linea generale è comunque bene evitare le conversioni implicite, difatti è buona pratica iniziare ogni file con Option Strict.
    Quoto pienamente.

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.