Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965

    Algoritmo cornice [ Pascal ]

    Per esercitarmi con il pascal ho scritto un programmino che praticamente disegna una cornice.

    Partendo da sinistra, va a destra, scende, va a destra, sale....
    e ripete questo fino a che viene riempito il quadrato

    Incollo la procedura

    codice:
    PROCEDURE sfondo;
    VAR y,x,a,b,c,d,e,r,h,ic,c1,c2,at:integer;
    BEGIN
         randomize;
         clrscr;
         a:=1;
         b:=60;
         c:=22;
         d:=1;
         e:=1;
         x:=0;
         y:=1;
         h:=0;
         ic:=22;
         textcolor(7);
    WHILE h<>1 DO
    BEGIN
         if a=1 then
         begin
              textcolor(1);
              x:=x+1;
              if x=b then
              begin
                    gotoxy(x,y);
                    write(#219);
                 a:=2;
                 e:=e+1;
              end;
         end;
         if a=2 then
         begin
              textcolor(11);
              y:=y+1;
              if y=c then
              begin
                    gotoxy(x,y);
                    write(#219);
                 a:=3;
                 b:=b-1;
              end;
         end;
         if a=3 then
         begin
              textcolor(1);
              x:=x-1;
              if x=d then
              begin
              if (d*2+2)>ic then
                 h:=1;
                    textcolor(11);
                    gotoxy(x,y);
                    write(#219);
                 a:=4;
                 c:=c-1;
              end;
         end;
         if (a=4) AND (h=0) then
         begin
              textcolor(11);
              y:=y-1;
              if (h<>1) AND (y=e) then
              begin
                    gotoxy(x,y);
                    write(#219);
                 a:=1;
                 d:=d+1;
              end;
         end;
         if h<>1 then
         begin
                    gotoxy(x,y);
                    write(#219);
                    delay(5);
         end;
    END;
    
    END;
    Lo scopo di questa discussione e' quello di capire come fare questo programma in modo diverso (e ancor meglio, migliore).

    Provo a illustrare il funzionamento:
    la variabile "a" indica la direzione della "pittura".
    1 indica che va a destra (ossia incremento di x)
    2 indica che va in giu' (ossia incremento di y)
    3 indica che va a sinistra (ossia decremento di x)
    4 indica che va a destra (ossia decremento di y)


    Moto:
    111111111111111111
    411111111111111122
    4422
    4422
    4422
    443333333333333332
    333333333333333332



    Se non avete capito niente di quanto sopra:
    1- Eseguite il codice (scritto come procedura, da richiamare)
    2- Cercate un modo migliore per farlo

    Mi pare strano che per fare una cosa così apparentemente semplice, ci sia bisogno di così tanti passi, e pure sequenziali.

    Ciao

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Forse questo è più semplice:
    codice:
    Program Cornice;
    Uses Crt;
    
       Procedure disegna(X, Y, W, H: integer);
       Var i, j: Integer;
       Begin
          GotoXY(X, Y);
          For i:=1 To H Do
          Begin
             Write(#219);
             For j:= 1 To W-2 Do
                If ((i = 1) Or (i = H)) Then
                   Write(#219)
                Else
                   Write(' ');
             Write(#219);
             GotoXY(X+i, Y);
          End;
       End;
    
    Begin
       ClrScr;
       disegna(5, 5, 10, 10);
       Repeat Until Keypressed;
    End.
    Funzionamento:
    esegue un ciclo FOR per ciascuna riga e un ciclo FOR per ciascuna colonna.
    Se siamo sulla prima riga oppure sull'ultima riga, il ciclo FOR interno stampa tutti caratteri #219 (deve disegnare la cornice) altrimenti stampa degli spazi (siamo all'interno della cornice).
    Per ogni riga (ciclo FOR guidato dalla variabile i), stampa un carattere all'inizio e uno alla fine del ciclo FOR interno.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Sembra non funzionare
    che dipenda dai valori passati a disegna() ?

    ma mi pare di capire che non mi sono spiegato bene, dovete perdonarmi

    io intendevo fare una cornice che si riempiva, cioe', che passava all'esterno fino a chiudersi

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sì... ho invertito una cosa... ho corretto adesso il codice (purtroppo c'è stato un mancato aggiornamento tra il Turbo Pascal ed il Blocco Note! )

    Errata corrige:
    codice:
    Program Cornice;
    Uses Crt;
    
       Procedure disegna(X, Y, W, H: integer);
       Var i, j: Integer;
       Begin
          GotoXY(X, Y);
          For i:=1 To H Do
          Begin
             Write(#219);
             For j:= 1 To W-2 Do
                If ((i = 1) Or (i = H)) Then
                   Write(#219)
                Else
                   Write(' ');
             Write(#219);
             GotoXY(X, Y+i);
          End;
       End;
    
    Begin
       ClrScr;
       disegna(5, 5, 10, 10);
       Repeat Until Keypressed;
    End.
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    wait a moment

    la cornice va benissimo pero' è un po' diverso cio' che intendevo fare

    prova a eseguire my code per vedere il risultato

    purtroppo non riesco a spiegarmi

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sì, ho capito... vuoi vedere la cornice che si costruisce. Ora provo a pensarci su, ma non penso che esistano algoritmi tanto più efficienti di quello che hai scritto tu... forse si può eliminare qualche variabile...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    l'allegato indica l'immagine del funzionamento
    Immagini allegate Immagini allegate

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Originariamente inviato da LeleFT
    Sì, ho capito... vuoi vedere la cornice che si costruisce. Ora provo a pensarci su, ma non penso che esistano algoritmi tanto più efficienti di quello che hai scritto tu... forse si può eliminare qualche variabile...

    Ciao.
    Ok grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.