Oppure

Loading
17/01/13 17:00
nerd
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 :

program quadrato_a_scomparsa;
uses crt;
const max=100;
var n,x,y,tmpx,tmpy,tmp,i:integer;
    sqr: array [1..max,1..max] of char;


procedure refresh;    //procedura che cancellla lo schermo e riscrive la matrice
begin;
readkey;
clrscr;
for x:=1 to n do
 begin
  writeln;
  for y:=1 to n do
   write(sqr[x,y],' ');
  end;
end;

procedure gensqr; //genera il quadrato di asterischi ma non stampa (vedi refresh)
begin
for x:=1 to n do
 for y:=1 to n do sqr[x,y]:='*';
 refresh;
end;

procedure delhltrg;  //CANCELLA IL TRIANGOLO INFERIORE
var y1:integer;
begin
x:=n;
for y:=n downto 1 do
 begin
  tmp:=n-y;           //LA VARIABILE TMP è LA "CHIAVE DI VOLTA" DEL'ALGORITMO
  y1:=y;
  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
   begin
   y1:=y1+i;
   x:=x-i;
   sqr[x,y1]:=' ';
   y1:=y;
   x:=n;
   refresh;
   end;
  end;
end;

procedure delhhtrg;
var tt,xx:integer;
begin
y:=n;
tt:=n-1;
for x:=tt downto 1 do
 begin
 tmpx:=x;
 tmpy:=y;
 tmp:=tt-x;
 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
  begin
  y:=y+1;
  xx:=x-i;
  sqr[xx,y]:=' ';
  xx:=tmpx;
  y:=tmpy;
  refresh;
  end;
 end;
end;

begin
readln(n);
gensqr;
delhltrg;
delhhtrg;
readkey;
end.      //il programma si compila ma entra in loop alla diagonale 3 del triangolo inferiore     



GRAZIE MILLE IN ANTICIPO!
aaa
17/01/13 18:42
Poggi Marco
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.
aaa
19/01/13 15:49
Dovresti usare un debugger per trovare l' errore
25/01/13 15:44
nerd
alla fine ho risolto..
program quadrato_a_scomparsa;
uses crt;
var l:integer;

procedure generaquadrato (n:integer);
var x,y:integer;
begin
 for x:=1 to n do
 for y:=1 to n do
  begin

gotoxy(x,y);
write('x');


  end;
end;

procedure cancellaquadrato (z:integer);
var xx,yy,aux,tmp,tmpx,tmpy:integer;
begin


 yy:=z;
 for xx:=z downto 1 do
  begin
  tmp:=z-xx;
  for aux:=0 to tmp do
   begin
   tmpx:=xx;
   tmpx:=tmpx+aux;
   tmpy:=yy-aux;
   gotoxy(tmpx,tmpy);
   write(' ');
   delay(100);

   end;
  end;
tmp:=z;
for yy:=z-1 downto 1 do
 begin
 tmp:=tmp-1;
 xx:=1;
 for aux:=0 to tmp do
 begin
 tmpy:=yy;
 tmpy:=tmpy-aux;
 tmpx:=xx+aux;
 gotoxy(tmpx,tmpy);
 write(' ');
 delay(100);
 end;
 end;

 end;


begin
cursoroff;
readln(l);
generaquadrato(l);
readkey;
cancellaquadrato(l);
readkey;
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 25/01/13 15:45
aaa