카테고리 없음

조건 함수

Jaybi 2021. 4. 7. 10:54

조건 함수는 관계연산자와 함께 쓰여야만 제 기능을 가질 수 있습니다.

자동화 프로그램을 작성할 때 무엇보다도 중요한 함수라고 할 수 있습니다.

 

1. if

(1) 기능

지정 조건식을 비교하는 기능으로 지정 조건식이 만족하면 조건식-1을 다음 문장을 수행하고,

만족하지 않은 경우에는 조건식-2를 처리하는 함수로서 프로그램 작성시 가장 많이 이용하는 조건함수입니다.

(관계 연산자의 비교 결과가 T이면 expr1을 실행하고, nil이면 expr2를 실행한다.)

만약, 지정한 실행문이 2개 이상이면  "if" 함수는 에러를 발생하며, 2개 이상의 실행문을 지정할 때는

"progn" 함수를 사용해야 합니다.

(2) 사용법

(IF (Test-Expression) Expr1 Expr2)

(3) 예

 

 (if (= 3 2)

     (setq a "YES")

     (setq a "NO")

 )

 

 

 !a  :  "NO"

 

 (if (= "pnp" "PNP")

     (prompt "P.N.P")

     (prompt "Exit")

 )

 

 

 Exitnil

 

 (if (= 3 (/ 9 3))

     (setq inum "=")

     (setq inum "X")

 )

 

 

  !inum  :  "="

 

 (if (< 1 3)

     (setq nu1 100)

     (setq nu2 200)

     (setq nu3 300)

     (setq nu4 400)

 )

 

 

 : 연산 결과에 상관없이 nu3부터는 실행되지 않고 무시됩니다.

 

 (if (= num1 num2)

     (fnum1)

     (fnum2)

 )

 

 

 : 연산 결과가 "T"이면 사용자 정의 함수 "funm1"를 실행하고,

   "nil"이면 "funm2"를 실행한다.

 

 

2. progn

(1) 기능

여러 개의 문장 및 수식을 하나의 문장으로 묶어 처리하는 함수입니다.

주로 "IF" 함수와 함께 씁니다.

(2) 사용법

(PROGN expr1 expr2 ....)

(3) 예제

 

 (setq a 10)

 (setq b 10)

 (if (= a b)

     (progn

          (setq a (+ a 10))

          (setq b (+ b 10))

          (setq c (* a b))

     )

     (progn

          (setq a (+ a 20))

          (setq b (+ b 20))

          (setq c (* a b))

     )

 )

 

 

 실행문의 수가 두 개 이상이지만 "progn"으로 인해 하나의 문장으로

 처리합니다.

 따라서, 다음과 같은 결과가 나옵니다.

 

 !a = 20

 !b = 20

 !c = 400

 

 

3. while

(1) 기능

지정 조건식이 만족되는 동안 Loop내의 문장을 수행하고, 만족치 않을 때에는 Loop를 종료하고 다음 문장을

수행하는 반복 함수

(2) 사용법

(WHILE  (Test-Expression)  expr1  expr2  ....)

(3) 예제

 

 (setq a 0)

 (setq b 0)

 (while (<= a 100)

        (setq a (+ 1 a))

        (setq b (+ a b))

 )

 

 

 While를 사용하는 아주 기본적인 프로그램으로서 1부터 지정한 숫자까지 떠하는 프로그램입니다.

 

 

4. cond(CONDition)

(1) 기능

여러 개의 함수를 인수로 받아들여 각 조건에 맞는 수식을 수행시키는 함수로서 C언어의 case함수와

비슷한 기능을 갖습니다.

(2) 형식

(COND (Test-Expr1)  Expr1  (Test-Expr2)  Expr2  ....)

(3) 예제

 

 

 (cond

     ((<= num 90) (setq hak "A"))

     ((<= num 80) (setq hak "B"))

     ((<= num 70) (setq hak "C"))

     ((<= num 60) (setq hak "D"))

     (t (setq hak "F"))

 )

 

 

 num이 90보다 크면 hak에는 A가 저장되며 아무런 조건을

 만족하지 않으면, 즉 num이 60보다 작으면 hak는 F가 됩니다.

 

  

5. repeat

(1) 기능

repeat는 지정한 횟수만큼 실행 부분을 반복 수행시키는 함수입니다.

반복해야 하는 횟수를 알고 있을 경우는 Repeat를 사용, 알 수 없는 경우는 While를 사용하는 것이 편리합니다.

단, 반복 횟수는 정수만을 사용해야 하며, 변수로도 지정이 가능합니다.

(2) 사용법

(repeat Repeat-Number

(Expression - 1)

(Expression - 2)

(Expression -  N)

)

(3) 예제

 

 (repeat 100

         (setq a (+ a 1))

         (setq b (+ b a))

 )

 

 

 

 

6. foreach

(1) 기능

List의 요소 숫자만큼 반복 실행을 하는 함수입니다.

반복 실행하는 동안 각 요소를 분리하여 지정한 이름에 대입, 뒤의 표현식을 실행합니다.

지정해야 할 반복 횟수를 모르거나, 일정하지 않을 때 사용하면은 매우 편리합니다.

여러 개의 실행문을 지정할 수 있으며, 중간에 출력문이 없으면 최종 결과만을 출력합니다.

최종 결과를 출력할 때는 개행이 되지 않으므로 다음 예제와 같은 결과가 나옵니다.

마지막에 개행이 되지 않으므로 주로 파일처리할 때 사용하면 편리할 것 같습니다.

** Perl의 Foreach와 비슷한 기능을 가지고 있습니다.

** 같은 Interpreter 언어라서 그런지 CGI와 AutoLISP은 비슷한 점이 아주 많습니다.

(2) 사용법

(foreach  Name  List  Expression)

(3) 예제

 

  (setq slist (list 1 2 3 4))

  (foreach sname slist (princ "\n")(princ snmae))

 

 

  1

  2

  3

  44

 

 

 

7. 예제 프로그램

(1) While를 사용해 지정한 수만큼 원을 그리는 프로그램

 

 ; swhile.lsp

 

 (defun c:swhile()

    (prompt " Loaded.....")

    (setq wnum (getint "\n Enter While Number : "))

    (setq point0 (getpoint "\n Enter Center Point : "))

    (setq num 1)

    (while (< num wnum)

           (setq rnum (* num 100))

           (command "circle" point0 rnum)

           (setq num (+ num 1))

    )

    (prompt "\n By PNP")

    (prompt "\n Copyright 2000")

    (princ)

 )

 

 

 Command: (load "c:/swhile")

 C:SWHILE

 Command: swhile

 Loaded.....

 Enter While Number : 10

 Enter Center Point :

 By PNP

 Copyright 2000

 

 

 

(2) While 중간에 빠져나가기

 

 (defun c:swhile()

    (prompt " Loaded..........")

    (setq num 1)

    (setq total 0)

    (while (< num 51)

           (princ "\n ")

           (princ num)

           (princ "th Student,  Enter Score : ")

           (setq score (getint))

           (if (< score 0)(setq num 50))   

           ; num이 뒤에서 증가하므로

           (if (> score 100)(setq num 50))

           ; num은 51이 됨.

           (setq total (+ total score))

           (setq num (+ num 1))

    )

    (setq num (- num 1))

    (setq average (/ total num))

    (princ average)

    (prompt "\n By PNP")

    (princ)

 )

 

 

 이 프로그램은 학생의 점수를 입력받아 평균을

 구하는 프로그램으로 음수를 입력시키거나,

 100 이상의 수를 입력하면 프로그램은 종료됩니다.

 단, 학생 수는 50명으로 제한.

 

 빨간색 부분이 While를 빠져나가게 하는 부분입니다.

 score가 0보다 작거나, 100보다 크면 num을 50으로

 증가시켜 버리므로 다음 루프에서 While의 조건을

 만족하지 않으므로 While를 종료하게 됩니다.

 

 이 프로그램은 While이 강제 종료될 때 입력된

 score와 num까지 더하므로 강제 종료될 때의 잘못

 입력된 score와 num을 제거하는 부분이 필요합니다.

 제거하지 않으면 total을 항상 51로 나누어 버리므로

 average가 다음과 같이 나옵니다.

 

 

 실행 결과

 Command: (load "c:/sw")

 C:SWHILE

 Command: swhile

  Loaded..........

  1th Student,  Enter Score : 100

  2th Student,  Enter Score : 95

  3th Student,  Enter Score : 99

  4th Student,  Enter Score : 109

 8

 By PNP

 

 

 

(3) Repeat를 이용한 1~100까지 합 구하기

 

 ; srep.lsp 

 

 (defun c:srep()

    (prompt " Loaded..")

    (setq num 0)

    (setq no 0)

    (repeat 100

            (setq no (+ no 1))

            (setq num (+ num no))

    )

    (princ "\n1+2+3~99+100=")

    (princ num)

    (prompt "\n By PNP")

    (princ)

 )

 

 

 Command: (load "c:/srep")

 C:SREP

 Command: srep

  Loaded..

  1+2+3~99+100=5050

  By D.M.Z

 

 

 

(4) Cond를 이용한

 

 

(5) Foreach를 이용한 좌표 값 분리하기

 

출처: www.lispcenter.net/Lisp/Lisp_14.htm