Novità

per i programmatori

genios

Advanced Member >PLATINUM<
Come tradurreste in codice il seguente diagramma a blocchi .In input dobbiamo introdurre due numeri se uno o tutti e due i numeri sono uguali a zero ritornare in input e digitare di nuovo i due numeri .



a=02.jpg
 

i legend

Premium Member
ciao eugenio
io non so leggere i diagrammi
ho scritto il listato,ma per sbaglio l ho cancellato
l ho riscritto in due secondi,quindi controlla se ci sono errori
attenzione alle modifiche dei cicli do , possono mandare i n loop il programma
ecco quanto hai richiesto, è un po piu flessibile se vuoi
Codice:
Option Explicit
' controllare che lo script funzioni correttamente
' modificare lo script potrebbe dare origini a loop infiniti
Sub Main
   If MsgBox("controllare che lo script funzioni correttamente" & vbCrLf & " modificare lo script potrebbe dare origini a loop infiniti" & vbCrLf & "Vuoi continuare?",4 + 64,"Informazioni") = 7 Then Exit Sub
   Dim qValori,I,c,p,s
   qValori = 0
   Do While qValori < 2 Or qValori > 10
      qValori = GetNumValori
   Loop
   p = 1
   s = ""
   For I = 1 To qValori
      c = InserisciValore(I,qValori,s)
      s = s & c & "*"
      p = p*c
   Next
   s = RimuoviLastChr(s,"*")
   Scrivi s & "=" & p
End Sub
Function GetNumValori
   Dim qValori
   On Error Resume Next
   qValori = CInt(InputBox("Inserisci almeno 2 Valori ma non piu di 10 ","Quanti valori vuoi moltiplicare?",2))
   If Err.number = 13 Then
      MsgBox("Errore n. " & CStr(Err.Number) & " " & Err.Description)
      Err.Clear ' Cancella l'errore.
   End If
   GetNumValori = qValori
End Function
Function InserisciValore(a,b,c)
   Dim N1
   On Error Resume Next
   N1 = 0
   Do While N1 = 0
      N1 = CInt(InputBox("Inserisci un numero diverso da zero" & vbCrLf & c,"Valore " & a & " di " & b))
      If Err.number = 13 Then
         MsgBox("Errore n. " & CStr(Err.Number) & " " & Err.Description)
         Err.Clear ' Cancella l'errore.
      End If
   Loop
   Scrivi "Valore " & a & "=" & N1
   InserisciValore = N1
End Function
 

genios

Advanced Member >PLATINUM<
Non pensavo fosse cosi complicato . Te lo formulo in pseudo codice . abbiamo un inputbox digita due numeri a caso Numero A e numero B

se A = 0 torna all' inputbox e digita altri due numeri

se invece A > 0 vai al secondo controllo

se B = 0 torna all' inputbox e digita altri due numeri

se invece B > 0 vai

C = A*B

scrivi C

Ciao Eugenio
 

genios

Advanced Member >PLATINUM<
Si l ho controllato per questo ho scritto mi sembrava più semplice .

Il tuo script discrimina il numero 0 dall' inputbox mentre dal mio diagramma a blocchi lo dovrebbe fare l' istruzione if then else .

ciao Eugenio
 

Giggio

Super Member >PLATINUM<
buonasera io lo farei cosi .. ineffetti il diagramma a blocchi non prevede la rinuncia e quindi nemmeno questo codice

Codice:
Sub Main
  
  a =NumeroCasuale  ( 1 , 90)
  b =NumeroCasuale  ( 1 , 90)
 
  Do
       a  = Int ( InputBox  ( "Primo numero" , ,a ))
       If a >0 Then
          b  = Int ( InputBox  ( "Secondo numero" , , b))
       End If 

  Loop While a <=0 Or b <=0
 
  Scrivi " Primo   numero : "  & a
  Scrivi " Secondo numero : "  & b
 
End Sub
 
Ultima modifica:

i legend

Premium Member
buonasera io lo farei cosi .. ineffetti il diagramma a blocchi non prevede la rinuncia e quindi nemmeno questo codice

Sub Main


Do
a = Int ( InputBox ( "Primo numero" , , NumeroCasuale ( 1 , 90)))
If a >=0 Then
b = Int ( InputBox ( "Secondo numero" , , NumeroCasuale ( 1 , 90)))
End If

Loop While a <=0 Or b <=0

Scrivi " Primo numero : " & a
Scrivi " Secondo numero : " & b

End Sub
ciao Giggio da quello che ho capito , eugenio vuole escludere solo il valore zero non i negativi
e mancherebbe l inputbox da cui prendere i due valori e fare le valutazioni
stavo lavorando ad un altro script ma se ad eugenio va bene la tua soluzione mi fermo.
ciao e complimenti
io non sono un programmatore ma solo uno che si diverte a giocare con linee di codice
 

genios

Advanced Member >PLATINUM<
Giggino mi ha dato un buon input .

Codice:
Sub Main
   Do
      a = Int(InputBox("Primo numero",,a))
      If a > 0 Then
         b = Int(InputBox("Secondo numero",,b))
      End If
   Loop While a <= 0 Or b <= 0
   Scrivi " Primo   numero : " & a
   Scrivi " Secondo numero : " & b
   c = a*b
   Scrivi c
End Sub

Quello che volevo

Ciao Eugenio
 

Giggio

Super Member >PLATINUM<
Lo 0 a ben vedere sembrerebbe voler essere escluso dal diagramma percio non l'ho messo , poi le modifiche per attuare ciò che si vuole non cambiano la logica del codice.
Osservazioni banali.
 

i legend

Premium Member
Lo 0 a ben vedere sembrerebbe voler essere escluso dal diagramma percio non l'ho messo , poi le modifiche per attuare ciò che si vuole non cambiano la logica del codice.
Osservazioni banali.
Mi scuso per le osservazioni banali , pensa che a me sembravano importanti,
La logica degli script è identica infatti.
La differenza sta nella gestione degli errori in input e nella flessibilità se volessi inserire + di 2 elementi .da moltiplicare?
anzi personalmente devo dire che poter fare solo un operazione mi sembra troppo riduttivo.

vi posto un altro piccolo script , ma oggi avendo ricevuto la visita di un familiare , non sono riuscito a testare completamente lo script ,per favore controllate se puo andare.
questo è ancora piu flessibile
c'è solo un inputbox in cui inserire le operazioni che si vogliono ottenere
fa tutto il vbscript in realta.
nell espressione se viene inserito uno zero rilancia l input box
mi scuso se lo stile non è quello di una volta , ma tra la fretta e la mancanza di allenamento sono riuscito a fare solo questo.
come sempre se ci sono degli errori segnalateli vediamo che si puo fare

Ciao :)
IMPORTANTE: NON é UNA CALCOLATRICE ,
NON SI GARANTISCE CHE I CALCOLI SIANO ESATTI

Codice:
Option Explicit
Sub Main
   If MsgBox("controllare che lo script funzioni correttamente" & vbCrLf & " modificare lo script potrebbe dare origini a loop infiniti" & vbCrLf & "Vuoi continuare?",4 + 64,"Informazioni") = 7 Then Exit Sub
   Dim bRet,Ris
   Dim Mex
   Mex = "Inserisci l espressione che vuoi calcolare" & vbCrLf & _
   "Sono ammessi i numeri decimali separati da un punto" & vbCrLf & _
   "si possono calcolare i seguenti operatori:" & vbCrLf & _
   "(+) ; (-) ; (*) ; (/) ; (^)" & vbCrLf & _
   "le parentesi tonde hanno la precedenza nelle operazioni" & vbCrLf & _
   "non si puo inserire il numero zero come da richiesta specifica"
   Dim Tit
   Tit = "Calcolo elementare di almeno 2 elementi"
   Dim Testo: On Error Resume Next
   bRet = False
   Do While bRet = False
      Testo = InputBox(Mex,Tit)
      bRet = ValidoTesto(Testo)
      Ris = eval(Testo)
      If Err > 0 Then err.Clear:bRet = False
   Loop
   '
   Scrivi Testo & "=" & Ris
End Sub
Function ValidoTesto(testo)
   Dim k,n,num,aNum,bRet
   num = ""
   For k = 1 To Len(testo)
      n = Mid(testo,k,1)
      If n <> "," Then
         If n <> "(" And n <> ")" And n <> "+" And n <> "-" And n <> "*" And n <> "/" And n <> "^" Then
            num = num & n
         Else
            num = num & "|"
         End If
      Else
         bRet = False
         Exit Function
      End If
   Next
   aNum = Split("|" & num,"|")
   If UBound(aNum) > 1 Then
      bRet = True
      For k = 1 To UBound(aNum)
         If aNum(k) = "0" Or(Not IsNumeric(aNum(k))And aNum(k) <> "") Then bRet = False
      Next
      ValidoTesto = bRet
   Else
      ValidoTesto = False
   End If
End Function
provadiCalolo.png
credo che funzi ma ripeto controllate
provadiCalolo2.png
questa era l operazione che si vuole ottenere
se si sbaglioano le parentesi lo script si blocca
un attimo di accortezza nel digitare i dati in input
 
Ultima modifica:

salvo50

Advanced Member >PLATINUM PLUS<
Mi scuso per le osservazioni banali , pensa che a me sembravano importanti,
La logica degli script è identica infatti.
La differenza sta nella gestione degli errori in input e nella flessibilità se volessi inserire + di 2 elementi .da moltiplicare?
anzi personalmente devo dire che poter fare solo un operazione mi sembra troppo riduttivo.

vi posto un altro piccolo script , ma oggi avendo ricevuto la visita di un familiare , non sono riuscito a testare completamente lo script ,per favore controllate se puo andare.
questo è ancora piu flessibile
c'è solo un inputbox in cui inserire le operazioni che si vogliono ottenere
fa tutto il vbscript in realta.
nell espressione se viene inserito uno zero rilancia l input box
mi scuso se lo stile non è quello di una volta , ma tra la fretta e la mancanza di allenamento sono riuscito a fare solo questo.
come sempre se ci sono degli errori segnalateli vediamo che si puo fare

Ciao :)
IMPORTANTE: NON é UNA CALCOLATRICE ,
NON SI GARANTISCE CHE I CALCOLI SIANO ESATTI

Codice:
Option Explicit
Sub Main
   If MsgBox("controllare che lo script funzioni correttamente" & vbCrLf & " modificare lo script potrebbe dare origini a loop infiniti" & vbCrLf & "Vuoi continuare?",4 + 64,"Informazioni") = 7 Then Exit Sub
   Dim bRet,Ris
   Dim Mex
   Mex = "Inserisci l espressione che vuoi calcolare" & vbCrLf & _
   "Sono ammessi i numeri decimali separati da un punto" & vbCrLf & _
   "si possono calcolare i seguenti operatori:" & vbCrLf & _
   "(+) ; (-) ; (*) ; (/) ; (^)" & vbCrLf & _
   "le parentesi tonde hanno la precedenza nelle operazioni" & vbCrLf & _
   "non si puo inserire il numero zero come da richiesta specifica"
   Dim Tit
   Tit = "Calcolo elementare di almeno 2 elementi"
   Dim Testo: On Error Resume Next
   bRet = False
   Do While bRet = False
      Testo = InputBox(Mex,Tit)
      bRet = ValidoTesto(Testo)
      Ris = eval(Testo)
      If Err > 0 Then err.Clear:bRet = False
   Loop
   '
   Scrivi Testo & "=" & Ris
End Sub
Function ValidoTesto(testo)
   Dim k,n,num,aNum,bRet
   num = ""
   For k = 1 To Len(testo)
      n = Mid(testo,k,1)
      If n <> "," Then
         If n <> "(" And n <> ")" And n <> "+" And n <> "-" And n <> "*" And n <> "/" And n <> "^" Then
            num = num & n
         Else
            num = num & "|"
         End If
      Else
         bRet = False
         Exit Function
      End If
   Next
   aNum = Split("|" & num,"|")
   If UBound(aNum) > 1 Then
      bRet = True
      For k = 1 To UBound(aNum)
         If aNum(k) = "0" Or(Not IsNumeric(aNum(k))And aNum(k) <> "") Then bRet = False
      Next
      ValidoTesto = bRet
   Else
      ValidoTesto = False
   End If
End Function
Vedi l'allegato 2199133
credo che funzi ma ripeto controllate
Vedi l'allegato 2199135
questa era l operazione che si vuole ottenere
se si sbaglioano le parentesi lo script si blocca
un attimo di accortezza nel digitare i dati in input
Ciao ILegend volevo mettere 2 like, ma non è permesso
 

genios

Advanced Member >PLATINUM<
Come risolvereste nel modo piu semplice possibile non avendo a disposizione le istruzioni GOTO E GOSUB in spazioscript?


Codice:
10 PRINT "QUAL'È IL PRIMO NUMERO?"
30 GOSUB 100
40T=N
50 PRINT "QUAL'È IL SECONDO NUMERO?"
70 GOSUB 100
80 PRINT "LA SOMMA DEI DUE NUMERI È", T + N
90 STOP
100 INPUT N
110 IF N = INT (N) THEN 140
120 PRINT "MI DISPIACE, IL NUMERO DEVE ESSERE UN INTERO.
RIPROVATE"
130 GOTO 100
140 RETURN

ciao eugenio
 

genios

Advanced Member >PLATINUM<
Siccome quando ho iniziato io molti anni fa con il basic le istruzioni goto e gosub erano contemplate ora mi trovo in seria difficolta.Rubino prova a tradurre il programmino sopra con spaziometria .

Il programmino di cui sopra ,: Questo programma chiede due numeri (che devono essere interi) e poi stampa la loro somma. La subroutine in questo programma é costituita dalle righe da 100 a 130. La subroutine chiede un numero e, se non é un intero, ne chiede uno nuovo. Continua a chiederne finché non viene battuto in valore intero. il programma principale stampa "Qual'é il primo numero?", e poi chiama la subroutine per assegnare il valore a N. Quando la subroutine ritorna (alla riga 40) il valore in ingresso viene assegnato anche alla variabile T, in modo che, quando la subroutine viene chiamata una seconda volta non venga perduto il valore del primo numero. Viene poi stampato "Qual'è il secondo numero?", e il secondo valore viene accettato dalla seconda chiamata della subroutine. Quando la subroutine ritorna la seconda volta, viene stampato "La somma dei due numeri è", seguito dalla somma. T contiene il valore del primo numero introdotto e N quello del secondo.

Lo statement successivo nel programma, é uno statement "STOP". Questo arresta l'esecuzione del programma alla riga 90. Se non ci fosse stato nel programma lo statement di "STOP", saremmo "finiti" nella subroutine 100. Ciò é male perché ci verrebbe richiesto di introdurre un nuovo numero. Se lo introducessimo, poi, la subroutine cercherebbe di ritornare; e poiché non era stata chiamata da un "GOSUB" si verifica un errore RG. Ogni "GOSUB" eseguito in un programma deve avere un corrispondente "RETURN" eseguito piu avanti. Naturalmente vale anche l'inverso: un "RETURN" deve essere incontrato solo se fa parte di una subroutine che é stata chiamata da un "GOSUB". Sia "STOP" sia "END" possono venire usati per separare un programma dalle sue subroutines. La differenza è che "STOP" stampa un messaggio che dice a quale linea lo "STOP" è stato incontrato.

ciao eugenio
 
Ultima modifica:

i legend

Premium Member
È lo stesso problema del primo script . Lo risolvi con il ciclo do finché la condizione non è rispettata.
 

Ultima estrazione Lotto

  • Estrazione del lotto
    giovedì 28 marzo 2024
    Bari
    49
    73
    67
    86
    19
    Cagliari
    64
    36
    37
    02
    04
    Firenze
    66
    27
    44
    90
    17
    Genova
    09
    44
    78
    85
    19
    Milano
    70
    14
    47
    38
    27
    Napoli
    80
    29
    28
    45
    39
    Palermo
    54
    59
    78
    47
    62
    Roma
    17
    22
    49
    52
    88
    Torino
    71
    35
    75
    74
    60
    Venezia
    40
    84
    02
    63
    29
    Nazionale
    08
    13
    44
    69
    85
    Estrazione Simbolotto
    Firenze
    06
    35
    16
    18
    05
Alto