Author Topic: help my  (Read 35329 times)

0 Members and 1 Guest are viewing this topic.

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: help my
« Reply #75 on: July 09, 2020, 06:15:13 pm »
Sudoku helps train brain to think logically automatically.
  [ You are not allowed to view this attachment ]  

But cool if you can make your own version. Here is my Sudoku Game:
https://qb64.freeforums.net/thread/109/sudoku-app

Yes I studied Towers of Hanoi too!
Code: QB64: [Select]
  1. _TITLE "Towers of Hanoi 1" 'B+ started 2019-02-28
  2. '2019-03-02 I've added mBox since post of original  Towers of Hanoi 1" 'B+ started 2019-02-28
  3. ' I found I needed to fix both mBox and getClick to clear old mb clicks
  4. ' this copy contains the faulty routines getClick and mBox BUT DOES WORK with _DELAY .2 added in here
  5. ' should be fixed in, Towers of Hanoi 1 test with new mBox" 'B+ started 2019-03-02
  6.  
  7. CONST xmax = 800
  8. CONST ymax = 600
  9. CONST eTitle$ = "Towers of Hanoi Error:"
  10. SCREEN _NEWIMAGE(xmax, ymax, 32)
  11. _SCREENMOVE 300, 20
  12. DIM SHARED nDisks AS INTEGER, hDisk AS INTEGER, wMult AS INTEGER
  13. nDisks = 10
  14. hDisk = 520 / nDisks
  15. wMult = 240 / nDisks
  16. DIM SHARED dpal(1 TO nDisks) AS _UNSIGNED LONG
  17. FOR i = 1 TO nDisks
  18.     dpal(i) = _RGB32(RND * 255, RND * 255, RND * 255)
  19. DIM SHARED tower(1 TO 3, 1 TO nDisks) AS INTEGER
  20.  
  21. 'init
  22. FOR i = 1 TO nDisks
  23.     tower(1, i) = nDisks + 1 - i
  24. updateScreen
  25.     'message click or press for fromt
  26.     fromT = 0: toT = 0
  27.     fromT = getTower%
  28.     PRINT "from tower "; fromT
  29.     IF topDiskValue(fromT) THEN
  30.         toT = getTower
  31.         PRINT "to tower "; toT
  32.         IF toT <> fromT THEN
  33.             'PRINT topDiskValue(tot), topDiskValue(fromt)
  34.             IF (topDiskValue(toT) > topDiskValue(fromT)) OR topDiskValue(toT) = 0 THEN
  35.                 tower(toT, topDiskPlace(toT) + 1) = topDiskValue(fromT)
  36.                 'PRINT "topDiskPlace(fromt)"; topDiskPlace(fromt)
  37.                 tower(fromT, topDiskPlace(fromT)) = 0
  38.                 updateScreen
  39.             ELSE
  40.                 mBox "Can't place a larger disk on top a smaller one.", eTitle$
  41.             END IF
  42.         ELSE
  43.             mBox "You attempted to move a disk to the same tower.", eTitle$
  44.         END IF
  45.     ELSE
  46.         IF fromT THEN mBox "There is no disk to move in tower" + STR$(fromT), eTitle$
  47.         _DELAY .2 '<<<<< damn it I should not need this!!!
  48.     END IF
  49.     fromT = 0: toT = 0
  50.     _LIMIT 30
  51. PRINT "Goodbye!"
  52.  
  53.  
  54. SUB getClick (mx, my, q)
  55.     WHILE _MOUSEINPUT: WEND '<<<<<<<<<<  clear previous mouse activity   ITS NOT CLEARING!!!!!!!!!!!!!!
  56.     _KEYCLEAR 'clear previous key presses
  57.     mx = -1: my = -1: q = 0
  58.     DO WHILE mx = -1 AND my = -1
  59.         q = _KEYHIT
  60.         IF q = 27 OR (q > 31 AND q < 126) THEN _KEYCLEAR: EXIT SUB
  61.         i = _MOUSEINPUT: mb = _MOUSEBUTTON(1)
  62.         DO WHILE mb 'wait for release
  63.             q = _KEYHIT
  64.             IF q = 27 OR (q > 31 AND q < 126) THEN EXIT SUB
  65.             i = _MOUSEINPUT: mb = _MOUSEBUTTON(1): mx = _MOUSEX: my = _MOUSEY
  66.             _LIMIT 1000
  67.         LOOP
  68.         _LIMIT 1000
  69.     LOOP
  70.  
  71. SUB updateScreen
  72.     CLS
  73.     LINE (0, 580)-STEP(xmax, 0)
  74.     FOR t = 1 TO 3
  75.         FOR i = 1 TO nDisks
  76.             IF tower(t, i) THEN
  77.                 xhalf = (tower(t, i) * wMult) / 2
  78.                 LINE (t * 250 - xhalf - 125, 580 - hDisk * i)-STEP(2 * xhalf, hDisk), dpal(tower(t, i)), BF
  79.             END IF
  80.         NEXT
  81.     NEXT
  82.     _PRINTSTRING (0, ymax - 18), SPACE$(11) + "Tower #1" + SPACE$(24) + "Tower #2" + SPACE$(23) + "Tower #3"
  83.  
  84. FUNCTION topDiskValue (t)
  85.     FOR i = nDisks TO 1 STEP -1
  86.         IF tower(t, i) THEN topDiskValue = tower(t, i): EXIT FUNCTION
  87.     NEXT
  88.  
  89. FUNCTION topDiskPlace (t)
  90.     FOR i = nDisks TO 1 STEP -1
  91.         IF tower(t, i) THEN topDiskPlace = i: EXIT FUNCTION
  92.     NEXT
  93.  
  94. FUNCTION getTower% ()
  95.     getClick mx, my, q
  96.     IF ABS(150 - mx) < 125 THEN t = 1
  97.     IF ABS(400 - mx) < 125 THEN t = 2
  98.     IF ABS(650 - mx) < 125 THEN t = 3
  99.     IF q THEN
  100.         IF INSTR("123", CHR$(q)) > 0 THEN t = INSTR("123", CHR$(q))
  101.         IF CHR$(q) = "q" OR q = 27 THEN END
  102.     END IF
  103.     getTower% = t
  104.  
  105. 'title$ limit is 55 chars, all lines are 58 chars max
  106. ' Develop from mBox v 2018-10-27 color change, fan fix, cls
  107. SUB mBox (m$, title$)
  108.  
  109.     'first screen dimensions items to restore at exit
  110.     DIM curRow AS INTEGER, curCol AS INTEGER
  111.     DIM curScrn AS LONG, backScrn AS LONG, mbx AS LONG 'some handles
  112.     DIM ti AS INTEGER, limit AS INTEGER 'ti = text index for t$(), limit is number of chars per line
  113.     DIM i AS INTEGER, j AS INTEGER, ff AS _BIT, add AS _BYTE 'index, flag and
  114.     DIM bxH AS INTEGER, bxW AS INTEGER 'first as cells then as pixels
  115.     DIM mb AS INTEGER, mx AS INTEGER, my AS INTEGER, mi AS INTEGER, grabx AS INTEGER, graby AS INTEGER
  116.     DIM tlx AS INTEGER, tly AS INTEGER 'top left corner of message box
  117.     DIM lastx AS INTEGER, lasty AS INTEGER, r AS INTEGER, kh AS LONG
  118.     DIM b$, c$, tail$, d$
  119.     DBLU = &HFF000066
  120.     LBLU = &HFFB0A0FF
  121.     BLK = &HFF000000
  122.     WHT = &HFFFFFFFF
  123.  
  124.     curRow = CSRLIN
  125.     curCol = POS(0)
  126.     sw = _WIDTH
  127.     sh = _HEIGHT
  128.     fg = _DEFAULTCOLOR
  129.     bg = _BACKGROUNDCOLOR
  130.     'screen snapshot
  131.     curScrn = _DEST
  132.     backScrn = _NEWIMAGE(sw, sh, 32)
  133.     _PUTIMAGE , curScrn, backScrn
  134.  
  135.     'setup t$() to store strings with ti as index, linit 58 chars per line max, b$ is for build
  136.     REDIM t$(0): ti = 0: limit = 58: b$ = ""
  137.     FOR i = 1 TO LEN(m$)
  138.         c$ = MID$(m$, i, 1)
  139.         'are there any new line signals, CR, LF or both? take CRLF or LFCR as one break but dbl LF or CR means blank line
  140.         SELECT CASE c$
  141.             CASE CHR$(13) 'load line
  142.                 IF MID$(m$, i + 1, 1) = CHR$(10) THEN i = i + 1
  143.                 t$(ti) = b$: b$ = "": ti = ti + 1: REDIM _PRESERVE t$(ti)
  144.             CASE CHR$(10)
  145.                 IF MID$(m$, i + 1, 1) = CHR$(13) THEN i = i + 1
  146.                 t$(ti) = b$: b$ = "": ti = ti + 1: REDIM _PRESERVE t$(ti)
  147.             CASE ELSE
  148.                 IF c$ = CHR$(9) THEN c$ = SPACE$(4): add = 4 ELSE add = 1
  149.                 IF LEN(b$) + add > limit THEN
  150.                     tail$ = "": ff = 0
  151.                     FOR j = LEN(b$) TO 1 STEP -1 'backup until find a space, save the tail end for next line
  152.                         d$ = MID$(b$, j, 1)
  153.                         IF d$ = " " THEN
  154.                             t$(ti) = MID$(b$, 1, j - 1): b$ = tail$ + c$: ti = ti + 1: REDIM _PRESERVE t$(ti)
  155.                             ff = 1 'found space flag
  156.                             EXIT FOR
  157.                         ELSE
  158.                             tail$ = d$ + tail$ 'the tail grows!
  159.                         END IF
  160.                     NEXT
  161.                     IF ff = 0 THEN 'no break? OK
  162.                         t$(ti) = b$: b$ = c$: ti = ti + 1: REDIM _PRESERVE t$(ti)
  163.                     END IF
  164.                 ELSE
  165.                     b$ = b$ + c$ 'just keep building the line
  166.                 END IF
  167.         END SELECT
  168.     NEXT
  169.     t$(ti) = b$
  170.     bxH = ti + 3: bxW = limit + 2
  171.  
  172.     'draw message box
  173.     mbx = _NEWIMAGE(60 * 8, (bxH + 1) * 16, 32)
  174.     _DEST mbx
  175.     COLOR DBLU, WHT
  176.     LOCATE 1, 1: PRINT LEFT$(SPACE$((bxW - LEN(title$) - 3) / 2) + title$ + SPACE$(bxW), bxW)
  177.     COLOR _RGB32(225, 225, 255), _RGB32(200, 0, 0)
  178.     LOCATE 1, bxW - 2: PRINT " X "
  179.     COLOR DBLU, LBLU
  180.     LOCATE 2, 1: PRINT SPACE$(bxW);
  181.     FOR r = 0 TO ti
  182.         LOCATE 1 + r + 2, 1: PRINT LEFT$(SPACE$((bxW - LEN(t$(r))) / 2) + t$(r) + SPACE$(bxW), bxW);
  183.     NEXT
  184.     LOCATE 1 + bxH, 1: PRINT SPACE$(limit + 2);
  185.  
  186.     'now for the action
  187.     _DEST curScrn
  188.  
  189.     'convert to pixels the top left corner of box at moment
  190.     bxW = bxW * 8: bxH = bxH * 16
  191.     tlx = (sw - bxW) / 2: tly = (sh - bxH) / 2
  192.     lastx = tlx: lasty = tly
  193.     'now allow user to move it around or just read it
  194.     WHILE 1
  195.         CLS
  196.         _PUTIMAGE , backScrn
  197.         _PUTIMAGE (tlx, tly), mbx, curScrn
  198.         _DISPLAY
  199.         WHILE _MOUSEINPUT: WEND
  200.         mx = _MOUSEX: my = _MOUSEY: mb = _MOUSEBUTTON(1)
  201.         IF mb THEN
  202.             IF mx >= tlx AND mx <= tlx + bxW AND my >= tly AND my <= tly + 16 THEN 'mouse down on title bar
  203.                 IF mx >= tlx + bxW - 24 THEN EXIT WHILE
  204.                 grabx = mx - tlx: graby = my - tly
  205.                 DO WHILE mb 'wait for release
  206.                     mi = _MOUSEINPUT: mb = _MOUSEBUTTON(1)
  207.                     mx = _MOUSEX: my = _MOUSEY
  208.                     IF mx - grabx >= 0 AND mx - grabx <= sw - bxW AND my - graby >= 0 AND my - graby <= sh - bxH THEN
  209.                         'attempt to speed up with less updates
  210.                         IF ((lastx - (mx - grabx)) ^ 2 + (lasty - (my - graby)) ^ 2) ^ .5 > 10 THEN
  211.                             tlx = mx - grabx: tly = my - graby
  212.                             CLS
  213.                             _PUTIMAGE , backScrn
  214.                             _PUTIMAGE (tlx, tly), mbx, curScrn
  215.                             lastx = tlx: lasty = tly
  216.                             _DISPLAY
  217.                         END IF
  218.                     END IF
  219.                     _LIMIT 600
  220.                 LOOP
  221.             END IF
  222.         END IF
  223.         kh = _KEYHIT
  224.         SELECT CASE kh
  225.             CASE 27, 13, 32: _DELAY .2: EXIT WHILE
  226.         END SELECT
  227.         _LIMIT 60
  228.     WEND
  229.     'put things back
  230.     COLOR fg, bg: CLS
  231.     _PUTIMAGE , backScrn
  232.     _DISPLAY
  233.     _FREEIMAGE backScrn
  234.     _FREEIMAGE mbx
  235.     _KEYCLEAR
  236.     LOCATE curRow, curCol
  237.  
  238.  

Offline Kiara87

  • Forum Regular
  • Posts: 164
    • View Profile
Re: help my
« Reply #76 on: July 10, 2020, 03:03:27 am »
@bplu a true master in programming
I hope one day I will become as good as you

i am trying to solve the sudoku even though i set it to easy mode
it is still very difficult for me
se avessi solo un'ora per salvare il mondo, passerei 55 minuti per definire bene il problema e 5 a trovare la soluzione

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: help my
« Reply #77 on: July 10, 2020, 03:40:43 am »
If it helps, Kiara, remember this -- All computer programming breaks down to 3 steps:

1) Step by step commands
2) Decision making
3) Repetition

Take any problem facing you, and you can break its solution down to those 3 steps (including life problems).  Let's say I tell you, "Make me a peanut butter sandwich."   How do you accomplish that task?

Get up.
Go in kitchen.
Get a knife.
Get bread.
Get peanut butter.
Open bread, remove a slice.
Put knife in peanut butter.
Remove knife from peanut butter.
Wipe knife on bread.
Put down knife.
Remove slice of bread from pack.
Place bread on bread.

And there's the biggest problem programmers usually face -- we think "fix a sandwich", and we do it.  The computer has to have that instruction broken down step-by-step, to accomplish the same task...  It's not the complexity of the problem that confound us; it's the simplicity of the computer.

Even with the above set of instructions, it's probably not enough for your pet robot to make that sandwich.  "Get up" implies it was down somewhere.  "Go in kitchen" is vague.  From Where?  How many steps?  How many turns around corners, or up and down steps?  Whose kitchen?

The trick is to break your problem down into smaller stages, and then see if there's a set of computer commands to fulfill those needs.  If not, break those needs down smaller, until there are.

For example let's say I tell you to, "Print the contents of a file for me."

Breaking that order down to its components, we have to:

Choose a file.
Open that file.
Load the contents of that file in memory.
Print that file.
Repeat the last two steps until the whole file is printed.
Close the file.

Now, we have a basic step-by-step road map of how our program will look.

INPUT "Give me the name of the file you want to print ", filename$
OPEN filename$ FOR INPUT AS #1
DO
    LINE INPUT #1, text$
    PRINT text$
LOOP UNTIL EOF(1)
CLOSE #1


Take your complex problem and break it down to its step-by-step components.  If you can do that, you can write your own computer programs.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline _vince

  • Seasoned Forum Regular
  • Posts: 422
    • View Profile
Re: help my
« Reply #78 on: July 10, 2020, 07:21:02 am »
Take any problem facing you, and you can break its solution down to those 3 steps (including life problems).  Let's say I tell you, "Make me a peanut butter sandwich."   How do you accomplish that task?

I think Steve's trying to say leave the coding to bplus and make him a sandwich

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: help my
« Reply #79 on: July 10, 2020, 11:31:23 am »
LOL I do like simple things like Peanut Butter and Jelly sandwiches. Gots to have the jelly though!

I guess I like making things simple, certainly things presented simply. But what I really like is thinking of something and seeing it work on the computer screen. That sense of power overcomes all the tedium and frustration that comes from practice with Basic.

I've been working on Sudoku for way over a year, just to check and see if my advanced level puzzles generated from my program are both unique and solvable. I think I have unique but solvable, still uncertain about that one.

Tower of Hanoi is boring after you "get" what it takes to solve the puzzle, it's about 10 or 20 steps repeated over and over in a certain order, so easy for a human to loose track of that order and start going backwards again! 🤦‍♂️


Offline Kiara87

  • Forum Regular
  • Posts: 164
    • View Profile
Re: help my
« Reply #80 on: July 10, 2020, 06:06:18 pm »
If it helps, Kiara, remember this -- All computer programming breaks down to 3 steps:

1) Step by step commands
2) Decision making
3) Repetition

Take any problem facing you, and you can break its solution down to those 3 steps (including life problems).  Let's say I tell you, "Make me a peanut butter sandwich."   How do you accomplish that task?

Get up.
Go in kitchen.
Get a knife.
Get bread.
Get peanut butter.
Open bread, remove a slice.
Put knife in peanut butter.
Remove knife from peanut butter.
Wipe knife on bread.
Put down knife.
Remove slice of bread from pack.
Place bread on bread.

And there's the biggest problem programmers usually face -- we think "fix a sandwich", and we do it.  The computer has to have that instruction broken down step-by-step, to accomplish the same task...  It's not the complexity of the problem that confound us; it's the simplicity of the computer.

Even with the above set of instructions, it's probably not enough for your pet robot to make that sandwich.  "Get up" implies it was down somewhere.  "Go in kitchen" is vague.  From Where?  How many steps?  How many turns around corners, or up and down steps?  Whose kitchen?

The trick is to break your problem down into smaller stages, and then see if there's a set of computer commands to fulfill those needs.  If not, break those needs down smaller, until there are.

For example let's say I tell you to, "Print the contents of a file for me."

Breaking that order down to its components, we have to:

Choose a file.
Open that file.
Load the contents of that file in memory.
Print that file.
Repeat the last two steps until the whole file is printed.
Close the file.

Now, we have a basic step-by-step road map of how our program will look.

INPUT "Give me the name of the file you want to print ", filename$
OPEN filename$ FOR INPUT AS #1
DO
    LINE INPUT #1, text$
    PRINT text$
LOOP UNTIL EOF(1)
CLOSE #1


Take your complex problem and break it down to its step-by-step components.  If you can do that, you can write your own computer programs.

thanks steven for your suggestion



I also see that you are a good programmer

It is always an honor to have advice from you as an expert in programming
se avessi solo un'ora per salvare il mondo, passerei 55 minuti per definire bene il problema e 5 a trovare la soluzione

Offline Kiara87

  • Forum Regular
  • Posts: 164
    • View Profile
Re: help my
« Reply #81 on: July 10, 2020, 06:11:28 pm »
LOL I do like simple things like Peanut Butter and Jelly sandwiches. Gots to have the jelly though!

I guess I like making things simple, certainly things presented simply. But what I really like is thinking of something and seeing it work on the computer screen. That sense of power overcomes all the tedium and frustration that comes from practice with Basic.

I've been working on Sudoku for way over a year, just to check and see if my advanced level puzzles generated from my program are both unique and solvable. I think I have unique but solvable, still uncertain about that one.

Tower of Hanoi is boring after you "get" what it takes to solve the puzzle, it's about 10 or 20 steps repeated over and over in a certain order, so easy for a human to loose track of that order and start going backwards again! 🤦‍♂️

you are really good 
I'm also following your advice by playing with sudoku
this game is fantastic

I really like how you program I want to become as good as you
you can create anything with QB64

you are my master idol
se avessi solo un'ora per salvare il mondo, passerei 55 minuti per definire bene il problema e 5 a trovare la soluzione

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: help my
« Reply #82 on: July 10, 2020, 06:57:37 pm »
Quote
you are my master idol

Kind of embarrassing, kind of like it :)  Steve's OK too!

Here are some fun puzzles from a real master:  http://paulbourke.net/fun/
I just figured out the first one on the easy list.

Here is Terry Richie's QB64 tutorial that TempodiBasic and I can help you with :)
https://www.qb64sourcecode.com

Be sure to bookmark this:
https://www.qb64.org/wiki/Main_Page

Just 10,000 more hours of fun!
« Last Edit: July 10, 2020, 07:01:03 pm by bplus »

Offline TempodiBasic

  • Forum Resident
  • Posts: 1792
    • View Profile
Re: help my
« Reply #83 on: July 10, 2020, 07:45:38 pm »
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.

Code: QB64: [Select]
  1. ' Programma lotto di kiara87
  2. ' il programma legge i dati (numeri estratti da un file.dat)
  3. ' e permette di vedere  le estrazioni a video
  4. ' i numeri con distanza 30 sono evidenziati con colore rosso
  5. ' questi numeri vengono memorizzati e stampati
  6.  
  7. ' Nota 1: sono d'accordo con Bplus e' molto piu'
  8. ' rapido lavorare con dati in RAM che con dati su Disco HDD/SSD/USB/CD/DVD
  9.  
  10. ' valori COSTANTI  generali Vero e Falso
  11. CONST True = -1, False = NOT True
  12. ' le 11 ruote del lotto
  13. CONST Bari = 1, Cagliari = 2, Firenze = 3, Genova = 4, Milano = 5
  14. CONST Napoli = 6, Palermo = 7, Roma = 8, Torino = 9, Venezia = 10, Nazionale = 11
  15. CONST Cifra = 2 ' ogni numero estratto e' una cifra di due caratteri (01-90)
  16.  
  17. DIM a AS STRING ' una stringa per leggere i dati dal file
  18.  
  19. ' salta al sottoprogramma LeggiFile delimitato
  20. ' dalla Label LeggiFIle e dal RETURN
  21. GOSUB LeggiFile
  22.  
  23. ' verifica che tutto il file sia letto
  24. 'FOR b = 1 TO LEN(a) - 116 STEP 116
  25. '    PRINT MID$(a, b, 116)
  26. '    '    PRINT INSTR(b, a, CHR$(13))
  27. '    _DELAY .1
  28. 'NEXT b
  29.  
  30.  
  31.  
  32. ' il ciclo DO...LOOP UNTIL condizione e' un modo piu' moderno
  33. ' rispetto a Etichetta: .... IF condizione GOTO Etichetta
  34. b = 1
  35. z$ = " "
  36. OPEN "distanza30.dat" FOR APPEND AS #2
  37.     IF z$ <> "" THEN
  38.         CLS ' questo risolve un glitch di output sullo schermo
  39.         ' in alternativa alla riga sopra CLS nel sottoblocco
  40.         ' MostraEstratti va stampata la stringa estratto e
  41.         ' non il suo valore corrispondente ottenuto con VAL
  42.         GOSUB MostraRuote ' scrive il nome delle ruote del lotto
  43.         GOSUB MostraEstratti
  44.     END IF
  45.     ' prende l'input dell'utente
  46.     z$ = UCASE$(INKEY$) ' Z$ mantiene il maiuscolo di Inkey$
  47.     IF z$ = "+" AND b < (LEN(a) - 116) THEN b = b + 116
  48.     IF z$ = "-" AND b > 116 THEN b = b - 116
  49. LOOP UNTIL z$ = "Q"
  50.  
  51. END ' indica la fine logica del programma
  52.  
  53.  
  54. '-----------------------AREA sottoprogrammi /SUBroutines
  55.  
  56. ' questa etichetta /label indica il punto di inizio
  57. ' del sottoprogramma (SUBroutine) LeggiFile scritto con vecchio stile GOSUB
  58. ' che usa una etichetta/label e un RETURN per riprendere da dove si era interotto
  59. ' nota1: un metodo ancora piu' antico e' il salto con GOTO
  60. '        che richiede una seconda etichetta per ritornare nel MAIN o programma principale
  61. ' nota2: un metodo migliore e' SUB nomeroutine....END SUB
  62. '        perche' permette la localizzazione delle variabili
  63. LeggiFile:
  64. 'se non trova lotto.dat segnala l'errore a video e termina il programma
  65. IF NOT _FILEEXISTS("lotto.dat") THEN PRINT "File non trovato": END
  66. '<--------------------
  67. ' questo metodo e' piu' lento
  68. ' apre il file lotto.dat per leggere in maniera sequenziale i dati
  69. 'OPEN "lotto.dat" FOR INPUT AS #1
  70. 'LINE INPUT #1, a  ' riempe la variabile a con una riga intera di valori
  71. '<--------------------
  72.  
  73. ' apre lotto.dat per leggerlo in maniera binaria
  74. OPEN "lotto.dat" FOR BINARY AS #1
  75. a = SPACE$(LOF(1)) ' riempe la variabile a di spazi fino alla grandezza in byte del file aperto
  76. GET #1, , a ' legge con una unica operazione il file e lo pone nella variabiel a
  77. CLOSE #1 ' chiude il file appena letto
  78. ' indica il termine della SUBroutine LeggiFile
  79. ' e RITORNA alla riga di codice successiva al salto GOSUB
  80.  
  81. 'seconda SUBroutine /sottoprogramma
  82. MostraRuote:
  83. COLOR 7, 6
  84. LOCATE 1, 1
  85. PRINT "BARI"
  86. LOCATE 3, 1
  87. PRINT "CAGLIARI"
  88. LOCATE 5, 1
  89. PRINT "FIRENZE"
  90. LOCATE 7, 1
  91. PRINT "GENOVA"
  92. LOCATE 9, 1
  93. PRINT "MILANO"
  94. LOCATE 11, 1
  95. PRINT "NAPOLI"
  96. LOCATE 13, 1
  97. PRINT "PALERMO"
  98. LOCATE 15, 1
  99. PRINT "ROMA"
  100. LOCATE 17, 1
  101. PRINT "TORINO"
  102. LOCATE 19, 1
  103. PRINT "VENEZIA"
  104. LOCATE 21, 1
  105. PRINT "NAZIONALE"
  106. LOCATE 23, 1
  107. PRINT "premi q per terminare, + avanti, - indietro"
  108.  
  109. ' indica il termine della SUBroutine MostraRuote
  110. ' e RITORNA alla riga di codice successiva al salto GOSUB
  111.  
  112. 'terzo sottoprogramma o SUBroutine
  113. MostraEstratti:
  114.  
  115. ' le prime 4 cifre sembrano essere in numero della estrazione
  116. LOCATE 1, 40
  117. PRINT "estraz.num "; MID$(a, b, 4)
  118. PRINT #2, "estraz.num "; MID$(a, b, 4)
  119. y = 13 ' prima posizione per il carattere da stampare
  120. FOR x = 1 TO 5 STEP 1 ' questo ciclo   FOR e' di 5 perche' ogni ruota ha 5 estrazioni
  121.     A1 = "" ' resetto a1 per il prossimo giro
  122.     FOR V = Bari TO Nazionale ' per tutte le ruote
  123.         COLOR 15, 0
  124.         'posiziona il cursore
  125.         LOCATE (V * 2) - 1, y
  126.         ' scrive il numero estratto
  127.         PRINT VAL(MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  128.         A1 = A1 + (MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra))
  129.     NEXT V
  130.     GOSUB Mostra30
  131.     y = POS(0)
  132. ' indica il termine della SUBroutine MostraEstratti
  133. ' e RITORNA alla riga di codice successiva al salto GOSUB
  134.  
  135.  
  136. Mostra30:
  137. FOR v1 = Bari TO Venezia ' per tutte le ruote
  138.     FOR v2 = v1 + 1 TO Nazionale
  139.         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
  140.             COLOR 1, 0
  141.             'posiziona                                                                      il cursore
  142.             LOCATE (v1 * 2) - 1, y
  143.             ' scrive il numero estratto
  144.             PRINT VAL(MID$(a, (v1 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  145.             PRINT #2, (MID$(a, (v1 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra))
  146.             'posiziona                                                                      il cursore
  147.             LOCATE (v2 * 2) - 1, y
  148.             ' scrive il numero estratto
  149.             PRINT VAL(MID$(a, (v2 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  150.             PRINT #2, MID$(a, (v2 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)
  151.         END IF
  152.     NEXT v2
  153. NEXT v1
  154. COLOR 15, 0
  155. ' indica il termine della SUBroutine MostraEstratti
  156. ' 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
Code: QB64: [Select]
  1. REDIM Estrazioni (1 to Max) AS STRING
  2.  

-una altra alternativa validissima è l'uso di una UDT con TYPE---END TYPE con un array dinamico
ad esempio
Code: QB64: [Select]
  1. TYPE Estrazione
  2.    Numestrazione AS STRING * 4
  3.    EstrattiBari AS STRING * 10
  4.    EstrattiCagliari AS STRING * 10
  5.    EstrattiFirenze AS STRING * 10
  6.    ...
  7.    EstrattiNazionale AS STRING * 10
  8.  
  9. REDIM Lotto (1 to Max) AS Estrazione
  10.  

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... ;)
Programming isn't difficult, only it's  consuming time and coffee

Offline Kiara87

  • Forum Regular
  • Posts: 164
    • View Profile
Re: help my
« Reply #84 on: July 11, 2020, 06:48:46 am »
grazie @TempodiBasic
anche te sei una macchinetta di programmazione il tuo stile di programmazione e ottimo
solamente che sono io che ancora non riesco a leggere bene il codice essendo ancora alle prime armi
grazie per la tua spiegazione sei molto gentile e grazie per avermi imparato di scrivere il codice in pseudocodice
poi il problema e' quello di convertire in codice sorgente pero' credo che con il tempo imparo anche questo
tutte le tue spiegazioni servono e' cerchero di mettere in atto anche se alcuni punti non riesco a capire anche se sono bene dettagliate
hai ragione il mio primo codice era codice spaghetti inizialmente non sapevo il significato sono andato su internet e ho capito cosa intendi
troppi goto  un codice con troppi nodi che non si riesce a leggere come ho capito anche se esiste istruzione goto meglio evitarla
ho visto codice append che crea un file che poi lo rilegge devo ancora studiare anche questo

la cosa che mi viene molto difficile da capire e' questa parte qui
Code: QB64: [Select]
  1. LOCATE 1, 40
  2. PRINT "estraz.num "; MID$(a, b, 4)
  3. PRINT #2, "estraz.num "; MID$(a, b, 4)
  4. y = 13 ' prima posizione per il carattere da stampare
  5. FOR x = 1 TO 5 STEP 1 ' questo ciclo   FOR e' di 5 perche' ogni ruota ha 5 estrazioni
  6.     A1 = "" ' resetto a1 per il prossimo giro
  7.     FOR V = Bari TO Nazionale ' per tutte le ruote
  8.         COLOR 15, 0
  9.         'posiziona il cursore
  10.         LOCATE (V * 2) - 1, y
  11.         ' scrive il numero estratto
  12.         PRINT VAL(MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  13.         A1 = A1 + (MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra))
  14.     NEXT V
  15.     GOSUB Mostra30
  16.     y = POS(0)
  17.  
come voi programmatori posizionate i numeri con i locate e li distanziate
esempio: mentre io usavo locate 1,10 ecc..
e un altro punto che devo ancora adattarmi  esempio io il file lo leggevo con la variabile a e mid$ ma devo capire la funzione di altri variabili aggiunti -->
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))

credo che per capirle cerchero di modificare i valori

una domanda magari banale per saper programmare ci vuole conoscenza di matematica? oppure la conoscenda di matematica ci vuole per questo tipo di programma?
per conoscenza matematica non intendo quella elementare ma superiore alle scuole basi

ancora grazie e' sei stato moltissimo di aiuto a spiegare la tua esperienza e condividerla qui
ovviamente si deve studiare per imparare
io ricordo che le prime volte domandavo sui forum quanto tempo ci vuole per imparare a programmare
adesso forse la risposta e' dipende quante ore studi al giorno
io non ho tanto tempo magari 1 oppure 2 ore al giorno
magari ci impiego di piu'
ma non mollerò


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.

Code: QB64: [Select]
  1. ' Programma lotto di kiara87
  2. ' il programma legge i dati (numeri estratti da un file.dat)
  3. ' e permette di vedere  le estrazioni a video
  4. ' i numeri con distanza 30 sono evidenziati con colore rosso
  5. ' questi numeri vengono memorizzati e stampati
  6.  
  7. ' Nota 1: sono d'accordo con Bplus e' molto piu'
  8. ' rapido lavorare con dati in RAM che con dati su Disco HDD/SSD/USB/CD/DVD
  9.  
  10. ' valori COSTANTI  generali Vero e Falso
  11. CONST True = -1, False = NOT True
  12. ' le 11 ruote del lotto
  13. CONST Bari = 1, Cagliari = 2, Firenze = 3, Genova = 4, Milano = 5
  14. CONST Napoli = 6, Palermo = 7, Roma = 8, Torino = 9, Venezia = 10, Nazionale = 11
  15. CONST Cifra = 2 ' ogni numero estratto e' una cifra di due caratteri (01-90)
  16.  
  17. DIM a AS STRING ' una stringa per leggere i dati dal file
  18.  
  19. ' salta al sottoprogramma LeggiFile delimitato
  20. ' dalla Label LeggiFIle e dal RETURN
  21. GOSUB LeggiFile
  22.  
  23. ' verifica che tutto il file sia letto
  24. 'FOR b = 1 TO LEN(a) - 116 STEP 116
  25. '    PRINT MID$(a, b, 116)
  26. '    '    PRINT INSTR(b, a, CHR$(13))
  27. '    _DELAY .1
  28. 'NEXT b
  29.  
  30.  
  31.  
  32. ' il ciclo DO...LOOP UNTIL condizione e' un modo piu' moderno
  33. ' rispetto a Etichetta: .... IF condizione GOTO Etichetta
  34. b = 1
  35. z$ = " "
  36. OPEN "distanza30.dat" FOR APPEND AS #2
  37.     IF z$ <> "" THEN
  38.         CLS ' questo risolve un glitch di output sullo schermo
  39.         ' in alternativa alla riga sopra CLS nel sottoblocco
  40.         ' MostraEstratti va stampata la stringa estratto e
  41.         ' non il suo valore corrispondente ottenuto con VAL
  42.         GOSUB MostraRuote ' scrive il nome delle ruote del lotto
  43.         GOSUB MostraEstratti
  44.     END IF
  45.     ' prende l'input dell'utente
  46.     z$ = UCASE$(INKEY$) ' Z$ mantiene il maiuscolo di Inkey$
  47.     IF z$ = "+" AND b < (LEN(a) - 116) THEN b = b + 116
  48.     IF z$ = "-" AND b > 116 THEN b = b - 116
  49. LOOP UNTIL z$ = "Q"
  50.  
  51. END ' indica la fine logica del programma
  52.  
  53.  
  54. '-----------------------AREA sottoprogrammi /SUBroutines
  55.  
  56. ' questa etichetta /label indica il punto di inizio
  57. ' del sottoprogramma (SUBroutine) LeggiFile scritto con vecchio stile GOSUB
  58. ' che usa una etichetta/label e un RETURN per riprendere da dove si era interotto
  59. ' nota1: un metodo ancora piu' antico e' il salto con GOTO
  60. '        che richiede una seconda etichetta per ritornare nel MAIN o programma principale
  61. ' nota2: un metodo migliore e' SUB nomeroutine....END SUB
  62. '        perche' permette la localizzazione delle variabili
  63. LeggiFile:
  64. 'se non trova lotto.dat segnala l'errore a video e termina il programma
  65. IF NOT _FILEEXISTS("lotto.dat") THEN PRINT "File non trovato": END
  66. '<--------------------
  67. ' questo metodo e' piu' lento
  68. ' apre il file lotto.dat per leggere in maniera sequenziale i dati
  69. 'OPEN "lotto.dat" FOR INPUT AS #1
  70. 'LINE INPUT #1, a  ' riempe la variabile a con una riga intera di valori
  71. '<--------------------
  72.  
  73. ' apre lotto.dat per leggerlo in maniera binaria
  74. OPEN "lotto.dat" FOR BINARY AS #1
  75. a = SPACE$(LOF(1)) ' riempe la variabile a di spazi fino alla grandezza in byte del file aperto
  76. GET #1, , a ' legge con una unica operazione il file e lo pone nella variabiel a
  77. CLOSE #1 ' chiude il file appena letto
  78. ' indica il termine della SUBroutine LeggiFile
  79. ' e RITORNA alla riga di codice successiva al salto GOSUB
  80.  
  81. 'seconda SUBroutine /sottoprogramma
  82. MostraRuote:
  83. COLOR 7, 6
  84. LOCATE 1, 1
  85. PRINT "BARI"
  86. LOCATE 3, 1
  87. PRINT "CAGLIARI"
  88. LOCATE 5, 1
  89. PRINT "FIRENZE"
  90. LOCATE 7, 1
  91. PRINT "GENOVA"
  92. LOCATE 9, 1
  93. PRINT "MILANO"
  94. LOCATE 11, 1
  95. PRINT "NAPOLI"
  96. LOCATE 13, 1
  97. PRINT "PALERMO"
  98. LOCATE 15, 1
  99. PRINT "ROMA"
  100. LOCATE 17, 1
  101. PRINT "TORINO"
  102. LOCATE 19, 1
  103. PRINT "VENEZIA"
  104. LOCATE 21, 1
  105. PRINT "NAZIONALE"
  106. LOCATE 23, 1
  107. PRINT "premi q per terminare, + avanti, - indietro"
  108.  
  109. ' indica il termine della SUBroutine MostraRuote
  110. ' e RITORNA alla riga di codice successiva al salto GOSUB
  111.  
  112. 'terzo sottoprogramma o SUBroutine
  113. MostraEstratti:
  114.  
  115. ' le prime 4 cifre sembrano essere in numero della estrazione
  116. LOCATE 1, 40
  117. PRINT "estraz.num "; MID$(a, b, 4)
  118. PRINT #2, "estraz.num "; MID$(a, b, 4)
  119. y = 13 ' prima posizione per il carattere da stampare
  120. FOR x = 1 TO 5 STEP 1 ' questo ciclo   FOR e' di 5 perche' ogni ruota ha 5 estrazioni
  121.     A1 = "" ' resetto a1 per il prossimo giro
  122.     FOR V = Bari TO Nazionale ' per tutte le ruote
  123.         COLOR 15, 0
  124.         'posiziona il cursore
  125.         LOCATE (V * 2) - 1, y
  126.         ' scrive il numero estratto
  127.         PRINT VAL(MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  128.         A1 = A1 + (MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra))
  129.     NEXT V
  130.     GOSUB Mostra30
  131.     y = POS(0)
  132. ' indica il termine della SUBroutine MostraEstratti
  133. ' e RITORNA alla riga di codice successiva al salto GOSUB
  134.  
  135.  
  136. Mostra30:
  137. FOR v1 = Bari TO Venezia ' per tutte le ruote
  138.     FOR v2 = v1 + 1 TO Nazionale
  139.         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
  140.             COLOR 1, 0
  141.             'posiziona                                                                      il cursore
  142.             LOCATE (v1 * 2) - 1, y
  143.             ' scrive il numero estratto
  144.             PRINT VAL(MID$(a, (v1 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  145.             PRINT #2, (MID$(a, (v1 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra))
  146.             'posiziona                                                                      il cursore
  147.             LOCATE (v2 * 2) - 1, y
  148.             ' scrive il numero estratto
  149.             PRINT VAL(MID$(a, (v2 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
  150.             PRINT #2, MID$(a, (v2 - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)
  151.         END IF
  152.     NEXT v2
  153. NEXT v1
  154. COLOR 15, 0
  155. ' indica il termine della SUBroutine MostraEstratti
  156. ' 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
Code: QB64: [Select]
  1. REDIM Estrazioni (1 to Max) AS STRING
  2.  

-una altra alternativa validissima è l'uso di una UDT con TYPE---END TYPE con un array dinamico
ad esempio
Code: QB64: [Select]
  1. TYPE Estrazione
  2.    Numestrazione AS STRING * 4
  3.    EstrattiBari AS STRING * 10
  4.    EstrattiCagliari AS STRING * 10
  5.    EstrattiFirenze AS STRING * 10
  6.    ...
  7.    EstrattiNazionale AS STRING * 10
  8.  
  9. REDIM Lotto (1 to Max) AS Estrazione
  10.  

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... ;)
se avessi solo un'ora per salvare il mondo, passerei 55 minuti per definire bene il problema e 5 a trovare la soluzione

Offline TempodiBasic

  • Forum Resident
  • Posts: 1792
    • View Profile
Re: help my
« Reply #85 on: July 11, 2020, 12:19:49 pm »
@ kiara87
about
Quote
come voi programmatori posizionate i numeri con i locate e li distanziate
esempio: mentre io usavo locate 1,10 ecc..
PRINT si comporta in maniera differente se stampa un numero o una stringa
nell'elaborare l'output grafico della tabella dei numeri estratti mi sono imbattuto in un glitch perchè appunto la scritta a video viene spostata a seconda che si tratti di una cifra o 2 cifre.

Il problema ha 2 possibili soluzioni 1. ripulire lo schermo prima di riscriverlo come ho fatto io mettendo il CLS nel loop principale del programma (nel main) oppure 2 stampare la stringa invece del numero corrispondente (la differenza è che a video tu vedrai 02 al posto di 2)
una terza via 3. è usare l'struzione PRINT USING (come ti ha suggerito Bplus) per formattare l'output a video (questo è analogo al C  Printf(%d,%f...),a,c,...)

il
Code: QB64: [Select]
  1.    FOR V = Bari TO Nazionale ' per tutte le ruote
  2.         COLOR 15, 0
  3.         'posiziona il cursore
  4.         LOCATE (V * 2) - 1, y
usa la variabile del ciclo FOR per tutte le ruote (da Bari a Nazionale) per posizionare la riga (devi ricordare che SCREEN 0, ossia la modalità di video solo testo è di default in QB se non definisci alcuna modalità video, essa è detta anche modalità console e come default ha 80 colonne e 25 righe, cerca nella wiki per maggiori informazioni) mentre y definisce la colonna da cui partire a stampare il testo... la ; permette di non andare a capo dopo la scrittura

about
Quote
e un altro punto che devo ancora adattarmi  esempio io il file lo leggevo con la variabile a e mid$ ma devo capire la funzione di altri variabili aggiunti -->
PRINT VAL(MID$(a, (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1), Cifra)); " ";
qui si dice al PC di stampare a video il valore della parte della stringa a, estratta con MID$ a partire dalla posizione  (V - 1) * 10 + 5 + ((x - 1) * 2) + (b - 1)  e di lunghezza Cifra (ricorda che Cifra è una costante di valore 2 ossia al posto di Cifra tu leggi di lunghezza 2 caratteri)
quindi NON stai leggendo dal file ora ma stai NAVIGANDO il file contenuto interamente nella variabile a di tipo stringa mentre qui è stato letto il file 
Code: QB64: [Select]
  1. ' apre lotto.dat per leggerlo in maniera binaria
  2. OPEN "lotto.dat" FOR BINARY AS #1
  3. a = SPACE$(LOF(1)) ' riempe la variabile a di spazi fino alla grandezza in byte del file aperto
  4. GET #1, , a ' legge con una unica operazione il file e lo pone nella variabile a
  5. CLOSE #1 ' chiude il file appena letto
Come fai a sapere dove sei nella variabile a e cosa stai leggendo?
questa è la bussola
Quote
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
Buon studio e buon lavoro sulla comprensione e memorizzazione della sintassi.
Non preoccuparti se non ricordi bene tutto, la wiki c'è apposta. Ancora oggi mi chiedo spesso se LOCATE vuole riga,colonna o colonna,riga e la wiki risolve spesso! ;)
Programming isn't difficult, only it's  consuming time and coffee

Offline Kiara87

  • Forum Regular
  • Posts: 164
    • View Profile
Re: help my
« Reply #86 on: July 12, 2020, 06:59:59 pm »
@ kiara87

salve TempodiBasic volevo chiederti riguardo sulla funzione goto i programmatori la evitano a  causa del stile spaghetti
quindi evitano anche GOSUB visto che GOSUB è identica come istruzione giusto?
se avessi solo un'ora per salvare il mondo, passerei 55 minuti per definire bene il problema e 5 a trovare la soluzione

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: help my
« Reply #87 on: July 13, 2020, 10:46:36 am »
@Kiara87

Can you count and list the words in this sentence?

Can you write code to count and list the words in any given sentence?

Can you count the words in reply #85 above? Hope you don't get an overflow error ;-))

Can you count the QB64 CODE words in reply #84?

  [ You are not allowed to view this attachment ]  

Hmm... looks like we will have to do something about punctuation ;-))

« Last Edit: July 13, 2020, 11:14:11 am by bplus »

Offline TempodiBasic

  • Forum Resident
  • Posts: 1792
    • View Profile
Re: help my
« Reply #88 on: July 13, 2020, 01:45:17 pm »
@Kiara87
GOTO  e GOSUB sono due bacchette magiche che l'apprendista stregone programmatore deve temere e ammirare. Sono potenti ma senza limiti quindi se non sai quello che stai facendo fai di certo un gran pasticcio, come topolino nell'apprendista stregone https://www.youtube.com/watch?v=U546yRNeNh4

giusto per esercizio e per comprensione  tu poi considerare GOSUB  un GOTO semplificato perchè con RETURN ti permette di ritornare indietro all'istruzione del salto senza usare una ulteriore etichetta
Code: QB64: [Select]
  1. GOTO There
  2. Here:
  3. PRINT "Hi Guys"
  4.  
  5. There:
  6. PRINT "I'm QB64 coder "
  7. GOTO Here
  8.  

is the same that
Code: QB64: [Select]
  1. GOSUB There
  2. PRINT "Hi Guys"
  3.  
  4. There:
  5. PRINT "I'm QB64 coder "
  6.  

ma tu puoi costruire i loop WHILE..WEND, DO WHILE..LOOP, DO UNTIL..LOOP; DO..LOOP UNTIL, DO..LOOP WHILE con i rispettivi EXIT WHILE o EXIT DO usando il GOTO e le etichette, lo stesso per FOR NEXT...
prova come esercizio a creare questi loop con GOTO e li comprenderai meglio.

@bplus
PRINT LEN(88)
:-)
« Last Edit: July 13, 2020, 01:46:26 pm by TempodiBasic »
Programming isn't difficult, only it's  consuming time and coffee

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: help my
« Reply #89 on: July 13, 2020, 06:48:39 pm »
Quote
Can you count the QB64 CODE words in reply #84?