Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Programma quadrato a scomparsa...
Forum - Pascal - Programma quadrato a scomparsa...

Avatar
nerd (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/01/2013

Segnala al moderatore
Postato alle 18:00
Giovedì, 17/01/2013
Salve a tutti. A scuola ho dovuto eseguire un esercizio che chiedeva di disegnare un quadrato di lato 'n' di asterischi e di cancellarlo diagonalmente partendo dall'angolo in basso a destra e via via fino all angolo in alto a sinistra. Il programma che ho scritto mi sembra teoricamente corretto ma non mi funziona: il programma viene compilato ma entra in loop dopo 3 ciclate di for...
ecco il codice :

Codice sorgente - presumibilmente Delphi

  1. program quadrato_a_scomparsa;
  2. uses crt;
  3. const max=100;
  4. var n,x,y,tmpx,tmpy,tmp,i:integer;
  5.     sqr: array [1..max,1..max] of char;
  6.  
  7.  
  8. procedure refresh;    //procedura che cancellla lo schermo e riscrive la matrice
  9. begin;
  10. readkey;
  11. clrscr;
  12. for x:=1 to n do
  13.  begin
  14.   writeln;
  15.   for y:=1 to n do
  16.    write(sqr[x,y],' ');
  17.   end;
  18. end;
  19.  
  20. procedure gensqr; //genera il quadrato di asterischi ma non stampa (vedi refresh)
  21. begin
  22. for x:=1 to n do
  23.  for y:=1 to n do sqr[x,y]:='*';
  24.  refresh;
  25. end;
  26.  
  27. procedure delhltrg;  //CANCELLA IL TRIANGOLO INFERIORE
  28. var y1:integer;
  29. begin
  30. x:=n;
  31. for y:=n downto 1 do
  32.  begin
  33.   tmp:=n-y;           //LA VARIABILE TMP è LA "CHIAVE DI VOLTA" DEL'ALGORITMO
  34.   y1:=y;
  35.   for i:=0 to tmp do  //GRAZIE AL VALORE 0 E ALLA Y CHE DECRESCE POSSO ELIMINARE VIA VIA GLI ASTERISCHI PARTENDO DALL ALTO AL BASSO
  36.    begin
  37.    y1:=y1+i;
  38.    x:=x-i;
  39.    sqr[x,y1]:=' ';
  40.    y1:=y;
  41.    x:=n;
  42.    refresh;
  43.    end;
  44.   end;
  45. end;
  46.  
  47. procedure delhhtrg;
  48. var tt,xx:integer;
  49. begin
  50. y:=n;
  51. tt:=n-1;
  52. for x:=tt downto 1 do
  53.  begin
  54.  tmpx:=x;
  55.  tmpy:=y;
  56.  tmp:=tt-x;
  57.  for i:=0 to tmp do //l'algoritmo è simile a quello del triangolo inferiore tranne che per la x che decresce e la y che cresce progressivamente
  58.   begin
  59.   y:=y+1;
  60.   xx:=x-i;
  61.   sqr[xx,y]:=' ';
  62.   xx:=tmpx;
  63.   y:=tmpy;
  64.   refresh;
  65.   end;
  66.  end;
  67. end;
  68.  
  69. begin
  70. readln(n);
  71. gensqr;
  72. delhltrg;
  73. delhhtrg;
  74. readkey;
  75. end.      //il programma si compila ma entra in loop alla diagonale 3 del triangolo inferiore



GRAZIE MILLE IN ANTICIPO!            

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:42
Giovedì, 17/01/2013
Ciao!
Credo che il programma non funziona, semplicemente perché è troppo complicato - il programma è troppo dipendente dalle variabili globali -.
E' necessario memorizzare i risultati parziali su una matrice ?
Io imposterei il tutto su due funzioni; una che disegna il quadrato, e l' altra che lo cancella.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:49
Sabato, 19/01/2013
Dovresti usare un debugger per trovare l' errore

PM Quote
Avatar
nerd (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/01/2013

Segnala al moderatore
Postato alle 16:44
Venerdì, 25/01/2013
alla fine ho risolto..
Codice sorgente - presumibilmente Delphi

  1. program quadrato_a_scomparsa;
  2. uses crt;
  3. var l:integer;
  4.  
  5. procedure generaquadrato (n:integer);
  6. var x,y:integer;
  7. begin
  8.  for x:=1 to n do
  9.  for y:=1 to n do
  10.   begin
  11.  
  12. gotoxy(x,y);
  13. write('x');
  14.  
  15.  
  16.   end;
  17. end;
  18.  
  19. procedure cancellaquadrato (z:integer);
  20. var xx,yy,aux,tmp,tmpx,tmpy:integer;
  21. begin
  22.  
  23.  
  24.  yy:=z;
  25.  for xx:=z downto 1 do
  26.   begin
  27.   tmp:=z-xx;
  28.   for aux:=0 to tmp do
  29.    begin
  30.    tmpx:=xx;
  31.    tmpx:=tmpx+aux;
  32.    tmpy:=yy-aux;
  33.    gotoxy(tmpx,tmpy);
  34.    write(' ');
  35.    delay(100);
  36.  
  37.    end;
  38.   end;
  39. tmp:=z;
  40. for yy:=z-1 downto 1 do
  41.  begin
  42.  tmp:=tmp-1;
  43.  xx:=1;
  44.  for aux:=0 to tmp do
  45.  begin
  46.  tmpy:=yy;
  47.  tmpy:=tmpy-aux;
  48.  tmpx:=xx+aux;
  49.  gotoxy(tmpx,tmpy);
  50.  write(' ');
  51.  delay(100);
  52.  end;
  53.  end;
  54.  
  55.  end;
  56.  
  57.  
  58. begin
  59. cursoroff;
  60. readln(l);
  61. generaquadrato(l);
  62. readkey;
  63. cancellaquadrato(l);
  64. readkey;
  65. end.



effettivamente era un po' confusionario come codice il primo, ed ho guadagnato una decina abbondante di righe :) grazie mille

Ultima modifica effettuata da nerd il 25/01/2013 alle 16:45
PM Quote