Salve Kiara87
sembra che nonostante le difficoltà non demordi, brava questa è la prima dote di un buon programmatore la tenacia o la costanza se preferisci.
Dal mio codice vedo che non sei riuscita ad andare verso i tuoi obiettivi:
1 per ogni estrazione evidenziare le coppie di numeri distanti 30 unità
2 salvare questa elaborazione per usarla altrove....
la tua tenacia mi ha spinto a fornirti il compito risolto.... con tutta una serie di commenti in italiano... ma se vuoi attingere alla vera conoscenza nella programmazione impara un po' di inglese sia perchè le novità le trovi pubblicate in inglese perchè è una lingua universale... sia perchè puoi accedere alle risorse di tutto il mondo della programmazione.
Steve Bplus e _Vince ti hanno dato degli ottimi consigli sotto forma di lezioni che sembrano per principianti, ed in parte lo sono, ma sono sempre valide... sai come quando impari le 4 operazioni alle elementari ma le userai anche quando farai i calcoli di ingegneria o di fisica o di statistica combinatoria (come quella che stai cercando di sviluppare tu qui relativamente al gioco del lotto)
lo stile di programmazione che hai adottato tu con il tuo file Dafinire8.bas è detto spaghetti code perchè l'uso molteplice e continuo del GOTO se fosse evidenziato da un filo che segue il flusso di esecuzione del programma disegnerebbe una matassa di spaghetti ingarbugliati...
può funzionare, ma è molto difficile da correggere e da capire perchè ogni modifica che apporti non sai bene dove e cosa farà. Quindi difficile da costruire in maniera funzionale, difficile da capire quando lo rileggi dopo tempo, difficile da modificare per una espansione o per un adattamento ad un altro compito similare.
Lo stile di programmazione usato dai mitici amici Steve Bplus _Vince e tutti gli altri programmatori di questa community è prevalentemente modulare giacchè Qbasic e QB64 sono linguaggi procedurali o modulari... lo schema che ti ho postato come immagine in questo thread ti indica come progettare un programma per scriverlo in maniera efficiente, rapido, che funzioni, facile da capire, facile da modificare, facile da adattare....
è lo stesso suggerimento di Steve di suddividere l'azione che deve compiere il tuo programma in tante piccole azioni sequenziali e limitare ciascuna di queste in un blocco di codice detto procedura o subroutine o funzione (quando ti da indietro un risultato), e poi se possibile suddividere queste in ulteriori procedure più piccole fino a raggiungere un livello accettabile di semplicità. Fatto questo puoi iniziare a tradurre questo procedimento che si chiama ALGORITMO in CODICE SORGENTE ossia codice che usa parole tipiche di un linguaggio di programmazione e qui tu hai scelto il QB64. Infine con la compilazione il compilatore traduce questo codice ad alto livello in codice binario (una sequenza di 0 e 1 ) che ha significato per la macchina computer e che esegue sempre e solo quello che tu gli hai detto di fare. Mai niente di più. Quindi quando non ottieni il risultato o l'algoritmo è sbagliato o il codice sorgente è sbagliato. In entrambi i casi l' errore è del programmatore. ;-)
e dopo tante chiacchiere ecco il codice sorgente in QB64 del programma cerca coppie di numeri a distanza di 30 unità nella estrazione del lotto leggendo i dati di estrazione da un file di testo in cui ogni riga contiene i dati come una sola cifra. (questa ti sembra una definizione più chiara del programma e di ciò che fa?)
1.
prendi i dati -->
leggi i dati dal file e memorizzali in RAM (mediante variabili)-->
apri il file di dati e leggi i dati e copiali in variabile/variabili dopo aver dichiarato le variabili
2.
analizza i dati estraendo i numeri distanti 30 in ogni estrazione lotto --> la singola sequenza della singola estrazione è formata da 4 cifre iniziali di riga che sono il numero estrazione e da 110 cifre che sono i numeri estratti (ogni numero estratto va da 01 a 90 rappresentati da 2 cifre) le ruote di estrazioni sono 11 e ogni estrazione ha 5 cifre estratte quindi 2*5*11 = 110
Accedendo al file in maniera binaria ossia a basso livello dobbiamo considerare che il segno che di andare a capo corrisponde ad altri 2 carattere CR+LF che corrispondono ai numeri ASCII 13 e 10, quindi accedendo in maniera binaria a basso livello ogni riga termina con questa coppia di numeri ASCII e quindi ogni riga è lunga in modalità testo 4+110 = 114 mentre in modalità binaria 4+110+CR+LF = 116 caratteri
3.
stampa e memorizza i dati estratti --> mostra con colore diverso a video e scrivi su file i dati estratti
ho trovato molto più semplice scrivere tutta la griglia di numeri non analizzati con il colore dei numeri NON distanti 30 e riscrivere poi in secondo tempo i numeri con distanza 30 in altro colore. Mentre la griglia di lettura ossia le ruote e il numero di estrazione hanno un colore diverso per meglio distinguerle. Nella stessa procedura di cerca distanza 30 ho messo la memorizzazione su file degli stessi, mentre il numero estrazione viene segnato nel ciclo (loop) principale.
' Programma lotto di kiara87
' il programma legge i dati (numeri estratti da un file.dat)
' e permette di vedere le estrazioni a video
' i numeri con distanza 30 sono evidenziati con colore rosso
' questi numeri vengono memorizzati e stampati
' Nota 1: sono d'accordo con Bplus e' molto piu'
' rapido lavorare con dati in RAM che con dati su Disco HDD/SSD/USB/CD/DVD
' valori COSTANTI generali Vero e Falso
' le 11 ruote del lotto
CONST Bari
= 1, Cagliari
= 2, Firenze
= 3, Genova
= 4, Milano
= 5 CONST Napoli
= 6, Palermo
= 7, Roma
= 8, Torino
= 9, Venezia
= 10, Nazionale
= 11 CONST Cifra
= 2 ' ogni numero estratto e' una cifra di due caratteri (01-90)
DIM a
AS STRING ' una stringa per leggere i dati dal file
' salta al sottoprogramma LeggiFile delimitato
' dalla Label LeggiFIle e dal RETURN
' verifica che tutto il file sia letto
'FOR b = 1 TO LEN(a) - 116 STEP 116
' PRINT MID$(a, b, 116)
' ' PRINT INSTR(b, a, CHR$(13))
' _DELAY .1
'NEXT b
' il ciclo DO...LOOP UNTIL condizione e' un modo piu' moderno
' rispetto a Etichetta: .... IF condizione GOTO Etichetta
b = 1
z$ = " "
CLS ' questo risolve un glitch di output sullo schermo ' in alternativa alla riga sopra CLS nel sottoblocco
' MostraEstratti va stampata la stringa estratto e
' non il suo valore corrispondente ottenuto con VAL
GOSUB MostraRuote
' scrive il nome delle ruote del lotto ' prende l'input dell'utente
END ' indica la fine logica del programma
'-----------------------AREA sottoprogrammi /SUBroutines
' questa etichetta /label indica il punto di inizio
' del sottoprogramma (SUBroutine) LeggiFile scritto con vecchio stile GOSUB
' che usa una etichetta/label e un RETURN per riprendere da dove si era interotto
' nota1: un metodo ancora piu' antico e' il salto con GOTO
' che richiede una seconda etichetta per ritornare nel MAIN o programma principale
' nota2: un metodo migliore e' SUB nomeroutine....END SUB
' perche' permette la localizzazione delle variabili
LeggiFile:
'se non trova lotto.dat segnala l'errore a video e termina il programma
'<--------------------
' questo metodo e' piu' lento
' apre il file lotto.dat per leggere in maniera sequenziale i dati
'OPEN "lotto.dat" FOR INPUT AS #1
'LINE INPUT #1, a ' riempe la variabile a con una riga intera di valori
'<--------------------
' apre lotto.dat per leggerlo in maniera binaria
a
= SPACE$(LOF(1)) ' riempe la variabile a di spazi fino alla grandezza in byte del file apertoGET #1, , a
' legge con una unica operazione il file e lo pone nella variabiel a CLOSE #1 ' chiude il file appena letto ' indica il termine della SUBroutine LeggiFile
' e RITORNA alla riga di codice successiva al salto GOSUB
'seconda SUBroutine /sottoprogramma
MostraRuote:
PRINT "premi q per terminare, + avanti, - indietro"
' indica il termine della SUBroutine MostraRuote
' e RITORNA alla riga di codice successiva al salto GOSUB
'terzo sottoprogramma o SUBroutine
MostraEstratti:
' le prime 4 cifre sembrano essere in numero della estrazione
y = 13 ' prima posizione per il carattere da stampare
FOR x
= 1 TO 5 STEP 1 ' questo ciclo FOR e' di 5 perche' ogni ruota ha 5 estrazioni A1 = "" ' resetto a1 per il prossimo giro
FOR V
= Bari
TO Nazionale
' per tutte le ruote 'posiziona il cursore
' scrive il numero estratto
PRINT VAL(MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
));
" ";
A1
= A1
+ (MID$(a
, (V
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
))' indica il termine della SUBroutine MostraEstratti
' e RITORNA alla riga di codice successiva al salto GOSUB
Mostra30:
FOR v1
= Bari
TO Venezia
' per tutte le ruote FOR v2
= v1
+ 1 TO Nazionale
IF ABS(VAL(MID$(a
, (v1
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
)) - VAL(MID$(a
, (v2
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
))) = 30 THEN 'posiziona il cursore
' scrive il numero estratto
PRINT VAL(MID$(a
, (v1
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
));
" ";
PRINT #2, (MID$(a
, (v1
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
)) 'posiziona il cursore
' scrive il numero estratto
PRINT VAL(MID$(a
, (v2
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
));
" ";
PRINT #2, MID$(a
, (v2
- 1) * 10 + 5 + ((x
- 1) * 2) + (b
- 1), Cifra
) ' indica il termine della SUBroutine MostraEstratti
' e RITORNA alla riga di codice successiva al salto GOSUB
e questo è lo screenshot
[ You are not allowed to view this attachment ]
osservazioni:
-lavorare in RAM è molto più veloce che lavorare su disco
-accedere al file in maniera binaria ti permette di caricare tutto il file in RAM con una unica istruzione
-con MID$ sapendo la struttura della singola estrazione del lotto |numero di 4 cifre|estrazioni di 110cifre 1ruota5estrazioni2ruota5estrazioni...11ruota5estrazioni|acapo CR+LF| puoi navigare attraverso i dati con sicurezza
-una alternativa validissima è l'uso di un array dinamico
-una altra alternativa validissima è l'uso di una UDT con TYPE---END TYPE con un array dinamico
ad esempio
Buona avventura nel mondo della programmazione e non cadere nella trappola dei principianti che cambiano continuamente linguaggio perchè pensano di poter farme meglio con una altro rispetto a quello che stanno imparando... ;)