Newsgroup: it.comp.lang.visual-basic
Titolo: un metodo poco ortodosso per Pigreco.

Beh... secondo piccolissimo programma per esercitarmi un po': ho provato a
calcolare il numero pigreco costruendo una griglia X,Y di punti del primo
quadrante (ovvero sempre positivi).
Vorrei fare in modo di calcolare l'area sottesa dai punti che distano meno
di R dall'origine, poi la divido per il quadrato del raggio scelto
all'inizio e poi ancora per 4 (dato che questa area č un quarto dell'area
del cerchio di raggio R).
Ovvio che il valore finare di Pigreco dovrebbe essere tanto piu' preciso,
quanto piu' grande č il raggio. In una miglioria successiva di possono
rendere a virgola mobile le variabili e rendere poi infinitesimo lo step...
anche se so che non č il metodo ottimale per questo esercizio.
Ebbene comunque ancora non mi funziona, ma non so perchč... chi lo scopre?
Ecco il codice:
Option Explicit
Private Sub Form_Load()
Dim X, Y, R As Integer
Dim Pigreco As Double
R = InputBox("Inserisci il raggio del cerchio:")
Y = R
X = R
    'parto dalle coordinata (x,y) = (R,R) e mi faccio
    'tutto il quadrante facendo decrescere
    'con step 1 prima x e poi y
For Y = R To 1 Step -1
    For X = R To 1 Step -1
        If Sqr(Y ^ 2 + X ^ 2) < R Then
        Pigreco = Pigreco + Y
        Exit For
        End If
    Next X
Next Y
Debug.Print "pigreco falso = " & Pigreco
Debug.Print "pigreco vero = "; Pigreco / (4 * R ^ 2)
End Sub

' l'errore di fondo è nella formula finale:
' la formula corretta è PI=4*Area spicchio / Area quadrato
' ho commentato le istruzioni che ho modificato.
Dim X As Long
Dim Y As Long
Dim R As Long ' R può crescere oltre l'integer
Dim Pigreco As Double
Dim RQuadro As Long
R = InputBox("Inserisci il raggio del cerchio:")
Y = R
X = R
RQuadro = R * R ' precacolo il quadrato che utilizzo nel ciclo
'parto dalle coordinata (x,y) = (R,R) e mi faccio
'tutto il quadrante facendo decrescere
'con step 1 prima x e poi y
For Y = R To 1 Step -1
    For X = R To 1 Step -1
        'If Sqr(Y ^ 2 + X ^ 2) < R Then
        ' eleva al quadrato a destra e sinistra per ottimizzare
        If Y * Y + X * X < RQuadro Then
            ' sommare X, visto che il ciclo interno è su Y
            Pigreco = Pigreco + X
            Exit For
        End If
    Next X
Next Y
Debug.Print "pigreco falso = " & Pigreco
'Debug.Print "pigreco vero = "; Pigreco / (4 * R ^ 2)
' la formula corretta è PI=4*Area spicchio/ Area quadrato
Debug.Print "pigreco vero = "; (Pigreco * 4) / (R * R)
' termoPilucco
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

termoPilucco ha scritto:
uh.. visto che il loop va da R fino a 1 e non fino a 0, č meglio cambiare
l'istruzione
Pigreco = Pigreco + X
in
Pigreco = Pigreco + X + 1
Il calcolo diventa molto piů accurato.


 ' ho commentato le istruzioni che ho modificato.
Guarda, lo sai che sono davvero un imbecille?
Tanto sforzo per trovare un difficile errore nascosto, e invece era una
stupidata!
Comunque ti ringrazio tantissimo.
Per te sarà una stupidata, ma per me, dato che è il mio secondo programmino,
non lo è affatto.
Comunque l'unica cosa che non ho capito è perchè devo sommare per forza su
X: io posso calcolare l'integrale anche sommando su Y, che centra in quale
ciclo sono?
Grazie.
Solo un favore: qualcuno sa per caso dove è possibile reperire codice
(magari commentato) di programmi di questo tipo o anche un po' piu'
complessi?
Mi sarebbe utile per imparare.
A.

 ciclo sono?
Se sommi su X nel ciclo interno nel momento in cui sfori il raggio devi 
usare X come "altezza" del rettangolo approssimante.
Se sommi su Y nel ciclo interno nel momento in cui sfori il raggio devi 
usare Y come "altezza" del rettangolo approssimante.
Visto che tu sommi su X nel ciclo interno devi usare X.
Diciamo che sarebbe stato più corretto ciclare in X e poi in Y, se volevi
un'analogia con la grafica degli assi cartesiani.
