Newsgroup: it.comp.lang.visual-basic
Titolo: un commento al primo programma...

Prima e ultima volta che posto una simile banalità... pero' volevo qualche
suggerimento... è il mio primo programma in VB6 (ho sbirciato qualcosa su un
sito... e l'unica cosa non chiara è la necessità di questo "Exit for"... non
ci esce lo stesso tanto?).
Questo il codice:
Option Explicit
Dim Numero As Double
'Verifica di numeri primi
Private Sub Form_Load()
Numero = InputBox("inserisci un numero naturale:")
Label1.Caption = "Il tuo numero è: " & Numero
Dim i As Double
For i = 2 To (Sqr(Numero) + 1)
      If Numero Mod i = 0 Then
       Label2.Caption = Numero & " non è un numero primo!"
     Debug.Print Numero Mod i
        Exit For
   End If
 Next i
'a questo punto la prossima istruzione viene eseguita solo se
'i ha valore superiore a sqr(Numero), il che significa che Numero è primo!
If i > Sqr(Numero) Then
Label3.Caption = Numero & " è un numero primo!"
End If
End Sub

 questo "Exit for"... non ci esce lo stesso tanto?).
Sì... prima o poi :-). Così eviti di dover controllare _tutti_ i numeri;
così, appena ne ha trovato uno qualunque che sia un divisore, esce.
Bye, G.

Ciao Andre... mi permetto di suggerirti anche la mia personalissima
"versione"... da "niubbo" circa il VB ho pensato a qualcosa di semplice e
veloce :-).
Spero ti possa essere d'aiuto.
ciao
Ale
Dim intPrimo As Integer
Dim intCiclo As Integer
Dim blnPrimo As Boolean
Dim intNProva As Integer
intNProva = 1 ' è il numero che intendo verificare
blnPrimo = True
intPrimo = Val(intNProva)
For intCiclo = 2 To (intPrimo - 1)
    If intPrimo Mod intPrimo = 0 Then
        blnPrimo = False
    End If
Next
If blnPrimo = False Then
    MsgBox Str(intPrimo) + " non è un numero primo"
Else
    MsgBox Str(intPrimo) + " è un numero primo"
End If

 End If
Tra l'altro io preferirei un nome più significativo per la variabile:
If blnIsPrime Then
    ...
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 If blnIsPrime Then
IsPrime è ancora meglio :-P
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

mmm avevo letto che è preferibile utilizzare lo standard microsoft... ossia
3 lettere ch eidentificano il tipo... ecc ecc, sbaglio?
Ale
"H.P.L." <u...@vaila.ble> ha scritto nel messaggio
news:slrncjcd...@aidee.softshark.home...


 IsPrime č ancora meglio :-P
Beh, non volevo essere traumatico :)


 ha scritto nel messaggio
news:bfpZc.183477$OR2.8...@news3.tin.it...


 Exit For.
Sinceramente sono d'accordissimo con te... Infatti mai usato un exit for in 
vita mia... Un exit do qualche volta, ma cerco di evitare. Dal punto di 
vista teorico, se il for serve a ripetere un certo numero di istruzioni N 
volte, non ha senso poi farlo smettere ad una determinata condizione... Se 
ce questa necessità si passa dalla struttura for alla struttura while... 
Almeno così si prodigava di dirmi sempre il mio caro vecchio prof di 
programmazione anche se li si parlava di turbo pascal e non di visual basic.
Antonio Mirarchi 

 IsPrime è ancora meglio :-P
la goccia scava la roccia... :)



Se esistono delle istruzioni perchè non usarle? per una idiosincrasia
o perchè qualcuno ha pensato che sono delle cose poco eleganti?.
Si vede che quelli che pensano che il goto è maledetto (o che non
bisogna uscire dai cicli for) non hanno mai visto un programma scritto
in assembly che è la poesia fatta salto.
Tornando al vb invece io quando posso esco sempre prima dal ciclo,
perchè scorrere una stringa for i =1 to len quando hai già raggiunto
l'obiettivo, altre volte invece esco dal for "apposta" esempio:
for i = 1 to 6
  if xxx then exit for
next
if i < 7 then xxx (questa cosa se esegui sempre tutti i cicli te la
scordi)
Dici di usare il do (while)  infatti quando non conosco a priori il
numero di cicli uso sempre quello, usato al posto del "for" invece
diventa scomodo perchè hai bisogno di definire gestire e icrementare
una variabile per ottenere lo stesso risultato del for.
In definitiva se c'è una istruzione in vb "giusta" per i miei scopi io
la uso senza scrupoli di stile o altro.
=======================================================================
Se mi vuoi scrivere togli le maiuscole
Sveltolampo 
cteniza...@hotmail.com
=======================================================================

 Ma non è più semplice e leggibile fare l'inverso?
...
Beh devo dire che questo è uno dei migliori NG che conosco... anche da una
domanda banalissima si riesce a cavare sempre qualcosa di utile...
Adesso ve ne faccio una piu' difficile... ;-)

 la uso senza scrupoli di stile o altro.
Bah... sinceramente trovo poco strutturata una funzione con un exit 
for... Riesco a trovare più senso un un while, a quel punto.
Tutto, ovviamente, IMHO.

 assembly sei "costretto" a fare salti.
Anche io ci programmo e mi trovo perfettamente d'accordo con te... 
L'assembly ti costringe ad usare istruzioni salto anche solo per un if, col 
vb siamo molti "livelli più in alto" quindi abbiamo a disposizione strutture 
decisamente migliori... L'exit for è sicuramente utile, semplicemente ne 
contesto l'eleganza e la leggibilità.
Antonio Mirarchi 

 numero di cicli uso sempre quello
Fare un confronto sulla variabile del ciclo *dopo* il ciclo lo ritengo molto
pericoloso, anche se VB lo lascia fare penso sia una logica errata.
Tant'è che compilatori un po' più seri a partire da Delphi prima di tutto
non ti permettono nemmeno di cambiare il valore di i all'interno del ciclo
(VB sì) e il valore di i dopo il ciclo è "unpredictable" a causa delle
ottimizzazioni del compilatore.
Per quanto riguarda il for anzichè il while ritengo che un for con un exit
for sia più leggibile a livello di logica procedurale, senza considerare che
un for è molto più performante di un while poichè non rivaluta ad ogni giro
il valore di confronto.


ottimizzazioni del compilatore.
Mi trovi concorde sulla pericolosità ma solo su questa, per il resto
che sia una logica errata personalmente penso che sia tutto "nel
manico" (e cioè in noi che scriviamo i programmi) fare in modo che la
logica non sia "errata".
se scrivo ad esempio (
vb.net
):
1) For k as Integer = 0 To 10
   Next 
2)Dim k As Integer
  For k = 0 To 10		
  Next
if (k ...) sulla 1 (è un errore perchè k è stato definito all'interno
di un blocco e si chiede di mostrarne il valore al di della sua area
di visibilità end-of-scope), la compilazione non avviene neanche.
La 2 invece è del tutto diversa
ho tutto il diritto di pretendere (e lo voglio) che k valga 11 quando
esco dal ciclo, se inserisco un break all'interno al compilatore non
gliene può fregare di meno, lui non può sapere per quali scopi io
faccia questa cosa e quindi non mi può controllare (e questo con buona
pace della presunta purezza stilistica del pascal e del suo
impredictable)
Se mi dici poi che è una questione di gusti e che la ricerca della
perfezione nello stile di programmazione va fatta sempre e comunque
scegliendo l'elegante anche dove il funzionale direbbe altrimenti
siamo nella zona analoga a chi guarda ad esempio l'arte contemporanea
(e cioè nel mare magnum delle opinioni tutte altrettanto valide, tutte
altrettanto discutibili).


 esco dal ciclo
Io la vedo così: ogni cosa va usata per il suo scopo.
La variabile del for deve essere vista come l'enumeratore degli elementi da
ciclare (siano essi di una array, stringa o semplicemente valori da passare
ad altre funzioni) e quando esci dal ciclo la variabile cessa il suo scopo.
Il fatto che tu testi *dopo* il ciclo significa che nel ciclo non hai
trovato niente, ma questo già lo avresti dovuto sapere e quindi c'è un
errore di logica.
Riprendendo il tuo esempio:
Dim i As integer
Dim b As boolean
For i = k To n
    if Trovato(i) Then
        b = True
        exit for
    end if
Next
if b then
    FaiQualcosa
End if
questo specie se tra il loop e l'if ci sono di mezzo altre istruzioni
aumenta la leggibilità, la mantenibilità e la logica.
E' anche probabile che il ciclo precedente sia semplificabile così:
Dim i As integer
For i = k To n
    if Trovato(i) Then
        FaiQualcosa
        exit for
    end if
Next
Per questo dico che è sbagliato testare la variabile che non è stata pensata
per lo scopo ne serve allo scopo.


 Saranno punti di vista, ma mi pare molto più strutturato.
Sarà la stanchezza, ma a me pare ci sia qualcosa che non quadra... ;-)


 3 lettere ch eidentificano il tipo... ecc ecc, sbaglio?
Per me sì, ed (ora) anche per la Microsoft ;-)
In effetti io l'ho sempre trovato un modo sbagliato di dare i nome alle
variabili (ed anche la M$ stessa ora con NET ha cambiato idea), ma non
tutti la pensano come me (c'era stato un -lungo?- thread su questo in
passato proprio su questo NG).
Lo trovo sbagliato perché poco comprensibile. Io leggo il tuo codice e
faccio fatica a capire cosa significhi bln, perché non conosco le
convenzioni che tu usi. Ovviamente chiunque usa certe (sue) convenzioni
nella stesura del codice (anche io), ma secondo me queste dovrebbero non
influire sulla comprensione del nome della variabile.
Cerco di spiegarmi meglio. Una delle mie convenzioni è aggiungere un _
alla fine dei membri privati di una classe. Ovviamente chi legge il mio
codice non può saperlo e questo _ finale gli risulterà incomprensibile,
però l'underscore non va comunque ad influire sulla comprensione del nome 
della variable (che deve essere sempre significativo), perché risulta
qualcosa di "estraneo", di "aggiuntivo" al nome, mentre "bln" diventa
parte del nome stesso.
