Newsgroup: it.comp.lang.visual-basic
Titolo: Cicli con operatori

Ciao a tutti,
è una domanda riguardante l'uso degli operatori And,Or,Not con i cicli.
il codice:
Do
Loop While number <= 0 And text1.text="" dovrebbe dare lo stesso risultato
di:
Do
Loop Until number > 0 And text1.text < > ""
Allora come mai il primo non funziona mentre il secondo si?
Confido nel vostro aiuto

 Allora come mai il primo non funziona mentre il secondo si?
Beh sono due condizioni diverse...
Ciao,
=======================================
Stefano Frosio
stefan...@hotmail.com
http://www.geocities.com/stefanofrosio
=======================================

 Loop While number <= 0 OR text1.text=""

 Allora come mai il primo non funziona mentre il secondo si?
Semplice :)
"se da premesse vere si arriva a un risultato falso il motivo è che le
premesse sono anch'esse false".
In pratica Until funziona esattamente al contrario del While.
es.
do
...
Loop While (condizione)
Corrisponde a
do
...
Loop Until Not (condizione)
Personalmente trovo scomodo l'Until perchè costringe al ragionamento negato
che non è naturale e quindi è di difficile lettura.
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 Personalmente trovo scomodo l'Until perchè costringe al ragionamento
negato
Io uso solo l'until... mi risulta più facile perchè lo leggo do until come
"vai finchè ..."
Tutta una questione di gusti.
Mai usato il while in un programma.
se usi uno non usi l'altro :-)
Alcuni programmatori addirittura preferiscono non usare ne "while" ne
"until", ma semplicemente l' "exit do" con il quale infatti si fà tutto.

 "until", ma semplicemente l' "exit do" con il quale infatti si fà tutto.
Io. Mai usato nè While, nè Until. Sempre If e Exit Do.

 Tutta una questione di gusti.
Vero :)
Il fatto è che io dopo il "vai finchè" non ricordo mai (e se devo ricordare
senza capire non mi va bene) se ci vuole un "i è minore di 10" oppure "i non
è più minore di 10".


 è più minore di 10".
Scusate se insisto:
    a = 1
    Do
        a = a + 1
    Loop While a < 10
Vuol dire
Vai FINTANTO CHE a<10
    a = 1
    Do
        a = a + 1
    Loop Until a > 10
Vuol dire
Vai "A MENO CHE" a>10

 Io. Mai usato nč While, nč Until. Sempre If e Exit Do.
Al corso quando fu il momento di fare i cicli l'ingegnere mi disse
Ci sono vari modi per fare i cicli, ti illustrerň solo quello principale con
il quale si fa tutto, stare qui a parlare degli altri sarebbe una perdita di
tempo, se vuoi puoi darci un'occhiata da solo, ma tanto non ti serviranno a
niente.
E illustrň il Loop >>>> Break
Non illustrň nemmeno i cicli for

 Vai "A MENO CHE" a>10
HAi ragione lupo, io volevo dire la stessa cosa ma mi sono espresso male.
Ciao

 E illustrò il Loop >>>> Break
Non capisco Break, ma capisco il concetto.
Senza saperlo (senza pensarci) applichiamo sempre gli stessi concetti,
giusti o sbagliati che siano.
Il mio concetto fondamentale è "mai usare qualcosa che può essere fatto con
quello che già devi usare".
E' il caso del While/Until, appunto.
Senza aggiungere che per me un If ... Then Exit Do è estremamente più
evidente, quindi leggibile.

 Non capisco Break, ma capisco il concetto.
L'equivalente all' "exit do" in SqlBase :-)

 Non capisco Break, ma capisco il concetto.
L'equivalente all' "exit do" in SqlWindows :-)

 Vai "A MENO CHE" a>10
Sě, sě, il problema č che io nel parlato spesso uso "a meno che" seguito da
"a sia minore di 10" oppure "a non sia minore di 10" con lo stesso
significato a seconda del contesto (probabilmente a causa di una deviazione
mentale :P) quindi usare l'until per me significa sempre azzardare quale sia
il costrutto corretto.
Il while mi risulta piů semplice: la condizione č sempre in forma positiva.
Pensa che in Pascal dove si č costretti a usare l'until perchč non c'č il
while "di sotto" uso Until Not (condizione_per_while).
Mi sembra molto piů lineare, forse č solo questione di formazione mentale.


 evidente, quindi leggibile.
Beh, anche qui i miei gusti sono diversi :)
Perchè scrivere
Do While
    if cond then exit do
    ...
Loop
quando posso scrivere un più conciso (e, secondo me, chiaro)
Do While cond
    ...
Loop


 quando posso scrivere un piů conciso (e, secondo me, chiaro)
...
L'hai detto: E' una questione di gusti.
Se poi qualcuno mi dice che l'una č piů veloce, meno dispendiosa, etc.
dell'altra, proverň a ricordarmi di applicarla...

 applicarla...
Come sempre il miglior riscontro è: provare.
E la prova parla chiaro, non c'è (come d'altra parte era
logico aspettarsi) alcuna differenza ti prestazioni fra le due
"versioni".
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 "versioni".
Ho provato e, al di là dell'effettiva applicabilità nella realtà, le
differenze sono sensibili:
'Creare un form con un Text1 Multiline e incollare quanto segue:
Private Sub Form_Load()
    limite = 10 ^ 7
    Text1 = ""
    tempo = Timer
    a = 0
    Do
        a = a + 1
        If a = limite Then Exit Do
    Loop
    Text1 = Text1 & vbCrLf & "Do-If " & Timer - tempo
    tempo = Timer
    a = 0
    Do While a < limite
        a = a + 1
    Loop
    Text1 = Text1 & vbCrLf & "Do-While " & Timer - tempo
    tempo = Timer
    a = 0
    Do Until a = limite
        a = a + 1
    Loop
    Text1 = Text1 & vbCrLf & "Do-Until " & Timer - tempo
    tempo = Timer
    a = 0
    Do
        a = a + 1
    Loop While a < limite
    Text1 = Text1 & vbCrLf & "Loop-While " & Timer - tempo
    tempo = Timer
    a = 0
    Do
        a = a + 1
    Loop Until a = limite
    Text1 = Text1 & vbCrLf & "Loop-Until " & Timer - tempo
End Sub
'I miei risultati (VB6 SP5, HP Celeron 1.06Mhz, 256 Mb):
'Do-If 3,117188
'Do-While 3,09375
'Do-Until 3,214844
'Loop-While 2,882813
'Loop-Until 2,773438

 'Loop-Until 2,773438
I miei
intel celeron 800  512 mega di ram winxp sp1
Do-If 4,222656
Do-While 4,738281
Do-Until 4,277344
Loop-While 4,066406
Loop-Until 3,902344

 'I miei risultati (VB6 SP5, HP Celeron 1.06Mhz, 256 Mb):
Integro: XP Pro, senza SP

 intel celeron 800  512 mega di ram winxp sp1
[OT] Davide, approfitto (se ne stanno leggendo di cotte e di crude):
Hai avuto problemi dopo l'installazione di SP1?
Io lo dovrei fare per XP Pro, Italiano.
Grazie

 ha scritto nel messaggio
news:Sgkj9.29957$Av4.5...@twister2.libero.it...

L'ho installato ieri, quindi non ho avuto tempo di testarlo a fondo.
L'impressione è buona, mi pare che siano stati risolti alcuni problemi che
avevo rilevato:
Aprendo file dalla rete ogni tanto crashava explorer.
Spesso diventava molto lento a "explorare" i dischi di altri pc in rete...
Spesso si incasinava con le unità di rete, tipo le dava connesse poi quando
ci cliccavi sopra diceva che non avevi i diritti necessari quando inveceli
avevi, riavviando o riconnettendo l'unità a mano il problema spariva.
Mi sembra che tutti questi problemi non ci siano più.
Ho notato che la cartella Documenti è stata rinominata in Documenti-nome
profilo
Ogni tanto aprendo le varie app, a me lo ha fatto con acdsee e windows media
player viene generato l'errore:
"l'applicazione ha causato un'errore, la memoria non poteva essere read
etc.."
Lo fà istantaneamente senza impallare niente e al secondo tenativo poi
funzia tutto.
Prima non lo faceva quasi mai, da dopo il Sp la frequenza è aumentata
notevolmente.
Per il resto boh...
Mi sembra più veloce, soprattutto come dicevo l'explorer
Altre cose ora non mi vengono in mente, secondo me, soprattutto se il tuo pc
è client di una rete a dominio Nt ti conviene farlo.
Ciao

 Integro: XP Pro, senza SP
Pure io integro: Vb6 Sp5, ma mi semrbava scontato
:-)

 'Loop-Until 2,773438
i miei con VB6 nosp, XP 1700+ , 512Mb )
(Progettazione)
Do-If 2,753906
Do-While 2,785156
Do-Until 2,855469
* Loop-While 2,453125
Loop-Until 2,542969
(runtime 1° prova)
Do-If 1,5
Do-While 1,515625
Do-Until 1,851563
Loop-While 1,570313
* Loop-Until 1,453125
2° prova
Do-If 1,523438
Do-While 1,523438
Do-Until 1,761719
Loop-While 1,542969
* Loop-Until 1,519531

 L'ho installato ieri, quindi non ho avuto tempo di testarlo a fondo.
Scusate se ne approfitto anche io :
 ma TROVA non vi ha mai dato problemi o errori ? spiego meglio , se a volte
interrompo e riprendo una ricerca mi genera degli errori strani tipo :
impossibile effettuare la ricerca .. oppure Errore Inaspettato ecc...
: /

 impossibile effettuare la ricerca .. oppure Errore Inaspettato ecc...
Si mi č capitato, raramente ma mi č capitato.
Prima del Sp
Ora ancora no.
Mi sembra che abbiano spostato il cerca Computer che prima se ne stavo buono
buono su Start>Cerca>>>>
Ora non c'č piů!!!!
Sto dando i numeri io?

 'Loop-Until 2,773438
Suppongo che questi dati tu li abbia ottenuti senza dichiarare
le variabili utilizzate (e quindi senza Option Explicit). Ciò
porta prestazioni sicuramente disastrose, ed invalida
notevolmente la prova.
Questi sono i valori ottenuti utilizzando il tuo codice (dual
PIII 1.000 con 1GB di RAM).
Do-If 1,765625
Do-While 1,828125
Do-Until 1,78125
Loop-While 1,734375
Loop-Until 1,78125
Questi dichiarando le variabili:
Do-If 0,031125
Do-While 0,030875
Do-Until 0,030625
Loop-While 0,015375
Loop-Until 0,03075
Questi i risultati (con variabili dichiarate) utilizzando una
mia classe Timer (media su 100 prove):
Do-If 0,043045282950823
Do-While 0,0410380251645412
Do-Until 0,043172253859331
Loop-While 0,0324739723510614
Loop-Until 0,0324573509812368
Come vedi si parla di 1 centesimo di secondo di differenza su
un ciclo di 10 milioni di iterazioni.
Ma il passaggio dall'utilizzo di Variant a tipi corretti ha
portato un incremento di prestazioni di 2 ordini di grandezza.


 un ciclo di 10 milioni di iterazioni.
Aggiungo una cosa. La differenza oltretutto è fra costrutti
non equivalenti, perché il secondo ed il terzo hanno un
comportamento diverso dal quarto e quinto. Il primo invece può
comportarsi indifferentemente in un modo o nell'altro.


 notevolmente la prova.
Il codice, scritto al volo, è esattamente quello che vedi nel post sopra.
I risultati che ho riportato sono stati ottenuti in IDE, in EXE non ho
provato.
Certo, non è assolutamente ottimizzato, mi interessava solo vedere le
differenze (le proporzioni, se vogliamo), non il valore assoluto, fra i
quattro tempi/modalità e mi pare ci siano, per quanto, come detto, un loop
da 10^7 iterazioni (ma anche 10^4) è decisamente poco realistico.

 impossibile effettuare la ricerca .. oppure Errore Inaspettato ecc...
No, però ho l'impressione che il Trova di XP sia finto: a me non trova quasi
niente, a volte nemmeno inserendo in nome del file specifico.


 (ma anche 10^4) è decisamente poco realistico.
Certo, comprendo perfettamente. Solo che considerando le
differenze in percentuale (un aumento di circa il 33%) ci si
rende poco conto di cosa significhino.
Un tempo anche 1.000 volte maggiore su tempi dell'ordine dei
microsecondi è (salvo le solite eccezioni) totalmente
trascurabile. Un aumento di 3-4 volte su tempi dell'ordine dei
secondi è certamente inacettabile.
Per questo è opportuno considerare anche (se non
principalmente) i valori assoluti.


 niente, a volte nemmeno inserendo in nome del file specifico.
Io ho verificato, senza SP1, che non funziona la ricerca del testo contenuto
("Parola o frase all'interno del file).

 Mi sembra molto più lineare, forse è solo questione di formazione mentale.
se ti e' di aiuto posso solo confermarti la tua teoria , anche io,
PascalianoFolle, uso Until Not invece di quell'altra cosa li'
chelamiamentesirifiutadiaccettare ! ^_^;

riassumendo
    if pippo then
        do while
            while
                do
                    until
                        until not
                            for
    next
    end
    end
    end
    end
    end
bello.
ci mancano solo i regali sotto e la cometa sopra.