cg-Cad

Lisp »Tips 'n Tricks »Lisp & Array »1 »2 »3 »4 »5 »6 »7 »8 »9 »10

LSTAR

;|
   LSTAR.LSP
   Copyright (C) 2005 Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Generatore di matrici bidimensionali

   Inizializza la lista A come un array NRxNC

   Esempio NR=3, NC=4:
         0    1    2    3
     (
   0  ( 1.0  2.0  3.0  4.0)
   1  ( 5.0  6.0  7.0  8.0)
   2  ( 9.0 10.0 11.0 12.0)
     )
|;

(defun lstArray (NR NC / i j L e str) 
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq str (strcat "\n Inserire elemento A[" (itoa i) "],[" (itoa j) "]: ")) 
   (setq e (getreal str))
   (setq L (append L (list e)))
   (setq j (1+ j))
  )
  (setq A (append A (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (princ "\n")
 (setq A A)
)

(defun c:lstar ( / NR NC A
                   str i j e
 )
 ; eco OFF
 (setvar "cmdecho" 0)
 ;|
    input 
    numero righe   = NR
    numero colonne = NC
 |;
 (setq NR (getint "\n Numero righe [3]: "))
 (if (= NR nil)(setq NR 3))
 (setq NC (getint "\n Numero colonne [4]: "))
 (if (= NC nil)(setq NC 4))
 ;|
    inizializza la lista 'array' A
 |;
 (setq A (lstArray NR NC))
 ;|
    legge l'array A
 |;
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq e (nth j (nth i A)))
   (setq str (strcat " A[" (itoa i) "],[" (itoa j) "]=" (rtos e 2 2))) 
   (princ str)
   (setq j (1+ j))
  )
  (princ "\n")
  (setq i (1+ i))
 )
 ; ripristina l'ambiente
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: lstar
Numero righe [3]: Invio
Numero colonne [4]: 3
Inserire elemento A[0],[0]: 1
Inserire elemento A[0],[1]: 2
Inserire elemento A[0],[2]: 3
Inserire elemento A[1],[0]: 4
Inserire elemento A[1],[1]: 5
Inserire elemento A[1],[2]: 6
Inserire elemento A[2],[0]: 7
Inserire elemento A[2],[1]: 8
Inserire elemento A[2],[2]: 9

A[0],[0]=1 A[0],[1]=2 A[0],[2]=3
A[1],[0]=4 A[1],[1]=5 A[1],[2]=6
A[2],[0]=7 A[2],[1]=8 A[2],[2]=9

Analisi del Lisp

(defun lstArray (NR NC / i j L e str) 
 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq str (strcat "\n Inserire elemento A[" (itoa i) "],[" (itoa j) "]: ")) 
   (setq e (getreal str))
   (setq L (append L (list e)))
   (setq j (1+ j))
  )
  (setq A (append A (list L)))
  (setq L nil)
  (setq i (1+ i))
 )
 (princ "\n")
 (setq A A)
)

La funzione (ltsArray numero_righe numero_colonne) genera una lista di n liste di numeri reali, con n uguale alla variabile numero_righe.
La funzione inserisce il valore numerico reale e digitato dall'utente alla richiesta Inserire elemento A[0],[0]: in una lista di appoggio provvisoria L.
La lista provvisoria viene chiusa quando la variabile contatore j è uguale a NC (numero colonne) e il contenuto aggiunto alla lista A, quindi la lista L viene svuotata (setq L nil).
L'ultima istruzione (setq A A) imita il return f(x) del linguaggio C.

L'istruzione (setq A (lstArray NR NC)) salva in A il risultato della funzione (lstArray).

Per leggere il contenuto della 'matrice' uso due cicli while e la funzione (nth).
L'istruzione (setq e (nth j (nth i A))) salva in e l'elemento collocato nella lista-riga i di A alla posizione-colonna j.

 (setq i 0)
 (while (< i NR)
  (setq j 0)
  (while (< j NC)
   (setq e (nth j (nth i A)))
   (setq str (strcat " A[" (itoa i) "],[" (itoa j) "]=" (rtos e 2 2))) 
   (princ str)
   (setq j (1+ j))
  )
  (princ "\n")
  (setq i (1+ i))
 )

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 18 Giugno 2005