cg-Cad

Lisp »Tips 'n Tricks »Uso di IF

If valuta le espressioni in modo condizionale: (if test then a else b).
Se test è vero esegue l'istruzione "a" altrimenti esegue l'istruzione "b". Per valutare due o più istruzioni si utilizza la funzione progn.

(if (= a b)
 (progn
  (princ "\na = b")
  (setq a (+ a 10) b (- b 10))
 )
)

If può contenere al suo interno più istruzioni if. Ecco un esempio, prima in linguaggio Pascal e poi tradotto in Lisp.

a2r.pas

{ a2p.pas by Claudio Piccini
  www.cg-cad.com
  
  Traduce dall'arabo al romano.

  Basato su:
  Program 4.9 - Write a table of power of 2 in
  Arabic numbers and Roman numerals.
  "Manuale del Pascal" - K. Jensen, N.Wirth }


program ArabicToRoman(Output);

var
   Rem,Number: Integer;

Procedure arab2roman(Number:Integer);
begin
   Write(Output, Number, ' ');
   Rem := Number;

   while Rem >= 1000 do
      begin 
         Write(Output, 'M'); 
         Rem := Rem - 1000 
      end;
     
   if Rem >= 900 then
      begin
         Write(Output, 'CM'); 
         Rem := Rem - 900
      end 
   else
      if Rem >= 500 then
         begin
            Write(Output, 'D'); 
            Rem := Rem - 500
         end
      else
         if Rem >= 400 then
            begin
               Write(Output, 'CD'); 
               Rem := Rem - 400
            end;

   while Rem >= 100 do
      begin 
         Write(Output, 'C'); 
         Rem := Rem - 100
      end;
     
   if Rem >= 90 then
      begin
         Write(Output, 'XC'); 
         Rem := Rem - 90
      end 
   else
     if Rem >= 50 then
        begin
           Write(Output, 'L'); 
           Rem := Rem - 50
        end
     else
       if Rem >= 40 then
          begin
             Write(Output, 'XL'); 
             Rem := Rem - 40
          end;

   while Rem >= 10 do
      begin 
         Write(Output, 'X'); 
         Rem := Rem - 10
      end;
     
   if Rem >= 9 then
      begin
         Write(Output, 'IX'); 
         Rem := Rem - 9
      end 
   else
     if Rem >= 5 then
        begin
           Write(Output, 'V'); 
           Rem := Rem - 5
        end
     else
        if Rem >= 4 then
           begin
              Write(Output, 'IV'); 
              Rem := Rem - 4
           end;

   while Rem >= 1 do
      begin
         Write(Output, 'I');
         Rem := Rem - 1;
      end;

   Writeln(Output)
end;

begin (* main *)
  Number := 1;

  Write('Scrivi il numero: ');
  Readln(Number);
  arab2roman(Number)
end.

a2r.lsp

;| a2p.lsp by Claudio Piccini
  www.cg-cad.com
  
  Traduce dall'arabo al romano.

  Basato su:
  Program 4.9 - Write a table of power of 2 in
  Arabic numbers and Roman numerals.
  "Manuale del Pascal" - K. Jensen, N.Wirth |;

(defun arab2roman (Number / Rem)
 (setq Rem Number)
 (princ (itoa Number))
 (princ ": ")
 (while (>= Rem 1000)
  (princ "M") 
  (setq Rem (- Rem 1000))
 )
 (if (>= Rem 900)
  (progn
   (princ "CM") 
   (setq Rem (- Rem 900))
  )
  (progn
   (if (>= Rem 500)
    (progn
     (princ "D") 
     (setq Rem (- Rem 500))
    )
    (progn
     (if (>= Rem 400)
      (progn
       (princ "CD")
       (setq Rem (- Rem 400))
      )
     )
    ) 
   ) 
  )
 ) 
 (while (>= Rem 100)
  (princ "C") 
  (setq Rem (- Rem 100))
 )
 (if (>= Rem 90)
  (progn
   (princ "XC") 
   (setq Rem (- Rem 90))
  )
  (progn
   (if (>= Rem 50)
    (progn
     (princ "L") 
     (setq Rem (- Rem 50))
    )
    (progn
     (if (>= Rem 40)
      (progn
       (princ "XL")
       (setq Rem (- Rem 40))
      )
     )
    ) 
   ) 
  )
 ) 
 (while (>= Rem 10)
  (princ "X") 
  (setq Rem (- Rem 10))
 )
 (if (>= Rem 9)
  (progn
   (princ "IX") 
   (setq Rem (- Rem 9))
  )
  (progn
   (if (>= Rem 5)
    (progn
     (princ "V") 
     (setq Rem (- Rem 5))
    )
    (progn
     (if (>= Rem 4)
      (progn
       (princ "IV")
       (setq Rem (- Rem 4))
      )
     )
    ) 
   ) 
  )
 ) 
 (while (>= Rem 1)
  (princ "I") 
  (setq Rem (- Rem 1))
 )
)

(defun c:a2r ()
 (initget (+ 1 2 4))
 (setq Number (getint "\nScrivi il numero: "))
 (arab2roman Number)
 (princ)
)

Test del lisp

Command: a2r
Scrivi il numero: 6741
6741: MMMMMMDCCXLI

a2r.zip

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 17 Febbraio 2004