기타 강좌

314초는 읽는이의 흥미여부에 따라 차이가 클 수 있다.

;뒤에 글을 적으면 주석이 된다. (실행에 영향을 미치지 않는 글자들 설명적어둘 때 씀)


===다운로드===

http://racket-lang.org/download/

프로그램 다운받고 설치하고 DrRacket실행한다. 

언어설정은 왼쪽아래에 있는 버튼 눌러서 use the language declared in the source누르고 첫줄에 #lang scheme적고 둘째줄부터 코딩 시작한다.

==============


코딩한 후에 F5누르거나 오른쪽 위에 Run누르면 된다. 오른쪽 아래 졸라맨이 달려가면 실행중이고 한없이 달려가면 한없이 실행중 즉 무한루프라고 보면 된다.

그럴때에는 오른쪽 위의 Stop버튼을 눌러서 졸라맨을 쉬게해주자.


자 이제 필요한 상황을 만들어서 어떻하나 물음을 주고 해결책을 제시하겠다.


1부터 10까지 더해보자

간단하다 (+ 1 2 3 4 5 6 7 8 9 10)실행하면 55 나온다. 

힌트>>실행은 F5또는 Run버튼 누르면 된다.


+가 함수다. 1 2 3 4 5 6 7 8 9 10은 함수에 건내주는 데이터다. 이것만 알아도 97%정도는 이해했다고 보면 된다. 

(하지만 아직 313초나 남았으니 더 읽어보자.)

그러니까 함수에 데이터를 넣으면 결과가 나온다.

(* 1 2 3 4) 

힌트>>*는 곱하기라는 뜻이다.

24가 나올테고

(/ 1 2 3)

1/6이 나올거다

넣는 데이터를 이제부터 인자(파라미터)라고 부르겠다

(- 1 2 3 4 5 6 7 8 9)

해보면 알다시피 인자를 많이 넣어줘도 된다.


===주의===

(/ 1 0)

이렇게 0으로 나누진 말자. 

다른 언어에서와 같이 오류난다.

인간세상,수학세상에서도 0으로 나누는건 오류난다

==========


중첩해서

(+ (* 2 2) 2)와 같은 꼴도 해보자

그럼 꼭 괄호치고 함수적고 인자 적어야 되나?

그렇다 함수 실행하고 싶으면 그렇게만 하면 된다. 

간단하지 않은가? 후후..


===그럼 그냥 숫자나 문자열 출력하는건 어떻게 하나?===

그냥 괄호없이 숫자만 넣으면 그값이 나온다(리턴된다)

그러면 글자는?

글자는 그냥 적으면 변수로 취급하므로 " "로 감싸주거나 앞에'를 붙여주자. 

'는 뒤에배울 리스트이고 ""로 감싸는건 문자열 이라는 뜻이다. 

괄호없이 그냥 다음과 같이 쳐보자

'아햏햏 

띄어쓰기가 있으면 안되는걸 깨달았다면 다음과 같이 해보자

"후 후 후..."

""로 묶으면 띄어쓰기 해도된다. 이건 문자열이다.

그럼 숫자는? 그냥 숫자 적으면 된다 -_-;;

3.141592653589793238462643383279502884197169399

적고 f5누르면 그대로 나온다. 나중에 (printf "문장")나 (print "문장")대신에 쓸수 있으니 알아두면 좋다.

=====================================================


자 그럼

(= 1 1) 이건 뭘까?

#t가 나올것이다.

(= 10 (+ 7 3)) 이건 뭘까?

이것도 #t나온다.

(= 1 2) 이거는 #f나온다

#t는 사실이라는 뜻이다. #f는 거짓이라는 뜻이다.

당연한거다..;; 

1하고 1하고 똑같은 숫자니깐, 10하고 7더하기 3하고 같은 숫자니깐, 1하고 2는 다르니깐!;;

숫자 두개가 같은지 비교할때 쓴다.

물론 숫자가 아니라 변수가 와도 된다. 변수는 약 42초뒤에 배우도록 하자.


===여기서 잠깐 그럼 비교연산은 어디에다 쓰나?===

요렇게 쓴다.

(if (= 998001 (* 999 999))  "사실이군" "거짓이군")

물론 그냥 문자열 덜렁 써서 나오게 하고싶지 않다면 다음과 같이 써도 된다.

(if (= 998001 (* 999 999))  (printf "사실이군") (printf "거짓이군"))

if는 만약이라는 뜻으로 구조는 다음과같다.

(if (조건) (사실이면 요 괄호실행) (거짓이면 요 괄호실행))

팁>> 실행이라는 단어보다 사실 평가(evaluate)라고 더 많이 쓴다.

cond라는 조건실행 함수도 있지만 나중에 배우자 

================================================


===그럼 함수이름은 꼭 기호여야 하나?===

아니다 스킴에서 제공하는 또는 자신이 만든 함수 이름이어도 된다.

함수 직접 만드는건 좀 있다 배우도록 하자.

(min 31 22 98 74 33)

min은 가장 작다는 뜻으로 22가 리턴된다.

(max 31 22 98 74 33)

max는 가장 크다는 뜻으로 98이 리턴된다.

좀있다 리스트를 배울텐데 배워두면 유용하다. 우선 이정도만 알아두자

팁>>사실 Lisp은 List Processing의 약자다 Scheme은 Lisp의 사투리격 언어다.(거의 같다.) 

스킴이나 리습이나 둘다 리스트 많이 쓴다.

========================================



변수 대입 

(define 변수이름 변수값)적어주면 된다 예로..

(define pi 3.14)하면 pi에 3.14가 들어간다

(* 2 pi 10) 해보면 pi에 3.14가 들어가서 계산이되서 잘 나온다


===실습해보자!!===

a에 99 b에 33 c에 11 d에 88 e에 123을 대입해서 다 더해보자!

힌트>>대입 다 한후에 계산할때는 (+ a b c d e)라고 하면 된다.

후기>>일일이 대입하느라 힘들었을거다. 더 간단하게 대입하고 그걸로 실행까지 할수있고 함수 안에서도 대입이가능한 let이라는 함수가 있다.

나중에 배우든가 직접 찾아보도록 하자. 참고로 직접 찾을때에는 구글에서 let scheme를 검색하는걸 추천하고 영어좀 읽을수 있어야 할거다 'ㅅ'

===답은 제일 뒤에 적어둘까 말까? ㅋ===



후후.. 그럼 이제 

함수를 직접 만들어보자.

함수 만드는건 엄청 많이 쓸것이므로 자주 보게 될 것이다.

보기좋게 코드를 쓰려면 define하고 첫번째 괄호 닫은뒤에 엔터를 한번 쳐주자. 

긴 코드 적을때에는 훨씬 보기가 편하다.

(define (함수이름 변수) (내용))

변수에는 전달된 데이터가 들어온다

(define (제곱하기 x) (* x x))

제곱하기를 호출하고 x를 건내주면 x에다 x곱해서 리턴된다.

즉 (제곱하기 2) 하면 4가 나오고 (제곱하기 3)하면 9가 나온다

다음과 같이 내용을 적은 괄호가 여러개여도 된다 즉 함수 몸체가 여러개여도 된다!

(define (함수이름 변수) (내용1) (내용2) (내용3) (내용4))


===만약 괄호 한 쌍만 쓰고 싶다면?===

괄호 하나에 내용을 여러개 넣으면 된다. 

(define (함수이름 변수) ((내용1) (내용2) (내용3) (내용4)))

그러나 주의할점이 있다.!! 

괄호 제일앞에 오는건 기본적으로 함수이름으로 인식한다

즉 (내용1)의 리턴값이 a라면 a라는 함수를 실행하려고 하다가 a라는 함수가 없을테니깐 에러를 뱉을것이다.

그럼 그냥 순서대로 실행은 어떻게 하느냐?

(define (함수이름 변수) (begin (내용1) (내용2) (내용3) (내용4))) 요렇게 하면 된다. 그냥 괄호 제일 앞에 begin만 붙였다.

=============================================


===잠깐-_-;;=== 

혹시 함수를 정의만 해놓고 안돌아간다고 끙끙대고 있다면 다음과 같이 함수를 호출해보라.

(함수이름 인자) 

마치 (+ 1 2 3)했던 것처럼..

계속 말하지만 인자 칸에는 함수에 넘겨줄 데이터가 들어간다. 

함수는 그 데이터를 함수 이름 뒤에 적은 변수로 받아서 함수가 계산을 하는것이다.

===============


===연습문제===

아직 282초나 남았으니 연습문제 하나 풀고가자

함수를 만들어 보아라.

함수이름은 곱하고나누고빼고더하기 

(함수이름은 공백이 들어가면 안되니까 정 띄어쓰고 싶으면 -(하이픈)을 쓰자. 곱하고-나누고-빼고-더하기 처럼.)

인자(함수에 넘겨주는 데이터)는 a b c d e 다섯개의 변수에다가 받고

a와 b는 곱하고 그 결과하고 c는 나누고 그결과하고 d는 빼고 그결과하고 e는 더해보자

a b c만 알려주자면 다음과 같이 된다.

(/ (* a b) c)

==============


===또 다른 연습문제를 풀기전에===

여기서 read와 printf 함수를 알려주겠다.

우선 printf..

(printf "출력할 내용") 하면 "출력할 내용"이 출력된다.

그 다음.. (read)..

간단하다. 그냥 사용자에게 입력받아서 그 값을 리턴해준다. 

그 리턴한 값은 변수에 대입하든 함수 인자로 쓰든 알아서 하면 된다.

(define name (read))라고 해보자 name에 사용자가 입력한 값이 들어간다.

(define age (read))도 해보자 age에 사용자가 입력한 값이 들어간다.

그럼 이걸 어디다가 쓰나?

다음과 같이 해보자

(printf "이름을 입력해주세요")

(define name (read))

(printf "나이를 입력해주세요")

(define age (read))

(printf "당신의 나이는 ~a이고 이름은 ~a이군요? 반가워요 ~a님" age name name)이라고 해보자.

첫번째 ~a에 ""뒤에 있는 첫번째 변수가 들어간다. 두번째 ~a에는 두번째 변수가 세번째 ~a는 세번째 변수가 들어간다.

=================================


===자 그럼 재귀호출을 사용해보자. 좀 어려울 수 도있다.===

>>힌트 함수를 정의만 하고 실행을 안하면 소용이 없다. 

실행하려면 (함수이름 인자) 인자가 없다면 (함수이름) 으로 호출해주자.

재귀호출은 a라는 함수가 있으면 a함수안에서 a함수를 부르는 것이다.

그럼 함수가 무한히 반복될 것이다. 

하지만 특정 조건을 걸어서 그조건일때에는 더이상 호출을 하지않으면? 

그 조건일때 함수는 멈추게 된다.

=========================================================



===우선 무한 반복 하는걸 해보자.===

(define (끝이없구만) (끝이없구만))

이걸 실행하면 무한반복된다. 

실행은 (끝이없구만) 으로 한다.

졸라맨이 힘들어 할테니 Stop버튼을 눌러서 멈춰주자.

====================================


===그러면 뭔가 보이는 무한반복을 해보자===

(define (끝이안보여) (printf "끝이안보여n") (끝이안보여))

>>팁 n은 다음줄로 바꾸라는 뜻이다.

그런데 이걸 실행하면 정말 너무 빠르게 출력되어서 졸라맨도 힘들고 컴터도 힘들어 할것이다.

0.5초에 한번씩 실행해보도록 하자

(define (끝이안보여) (begin (printf "끝이안보여n") (sleep 0.5) (끝이안보여)))

printf의 리턴값을 함수이름으로 인식해서 또 실행되니까 begin을 써서 그러지 않도록 했다.

===========================================


===이제 숫자가 1씩 커지면서 그 숫자를 출력하는 함수를 만들어보자.===

(define (1씩증가 x) (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))

물론 실행도 해야겠지 -_-;;

(1씩증가 0) 0부터 1씩 증가한다.

(1씩증가 43) 43부터 1씩 증가한다.

====================================================================


===멈추고 싶을때는 어떻게 하는지 궁금한 사람이 있을꺼다.===

x가 50이 되면 멈추도록 해보자 그냥 재귀호출을 하지 않으면 멈춰진다.

(define (1씩증가 x) (begin (if (= x 50) (printf "끝") (begin (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1))))

if는 괄호 3개를 쓴다. 

첫번째는 조건 두번째는 조건이 참일때 세번째는 조건이 거짓일때. 

그래서 if뒤에 괄호들을 3개로 만드려고 (printf "~a" x) (sleep 0.5) (1씩증가 (+ x 1)) 이 부분을 괄호 두르고 begin을 앞에 적은 것.

저렇게 탈출조건을 걸어줬으면 그냥 한방에 다 출력하고 끝내는것도 좋을것이다. (sleep 0.5)를 제거해보자.

===========================================================


자 이쯤 되면 머릿속에서 응용을 마구마구 하고있는 사람이 있을것이다.

그럼 연습문제 ㄱㄱ~!

구구단함수를 만들어보아라.

다음과 같이 호출하고 결과를 내놓는다.

>>힌트 

1. (printf "~ax~a=~a" x y (* x y))

2. (구구단 x (+ y 1))

3. (begin (??) (??))

4. (if (= y 10) (printf "끝") (??))

(구구단 2 2) 2x2부터 시작 

2x2=4

2x3=6

2x4=8

2x5=10

2x6=12

2x7=14

2x8=16

2x9=18

끝 

(구구단 5 4) 5x4부터 시작

5x4=20

5x5=25

5x6=30

5x7=35

5x8=40

5x9=45

끝 

레벨업을 위한 가이드 

1. 배껴서 실행해봤으면 삭제하고 다시 혼자힘으로 작성해본다.

2. 문제가 생기면 프로그래밍으로 어떻게 풀어야 할지 생각해 본다.

3. 질문하고 찾아본다.(영어로 구글링 하면 아주아주 잘나옴,아니면 네이버카페 lisper그룹에라도 가서 질문 ㄱㄱ)

==========================================================================================================================

이제 리스트를 배워보자

리스트는 괄호앞에 '를 붙이면 된다.

'(1 2 3 4 5 6 7 8 9)이건 리스트다 .

'(+ 1 2 3 4 5 6 7 8 9)이것도 리스트다. 

음.. 뭐 '(뚫훍) 이것도 리스트다.

'이 붙는순간 코드든지 데이터든지 다 리스트 형식의 데이터가 된다.

숫자 1앞에 있는 그 `가 아니라 엔터 왼쪽에 있는 그 '라는걸 주의하자.

(length '(1 2 3 4 5 6 7 8 9))해보자. 9가 나올꺼다. length함수는 리스트의 길이를 출력해준다.

그럼 리스트의 원소를 직접 쓰지 않고 계산해서 나온 값을 넣고 싶을때가 있을거다.

'(1 2 3 (+ 2 2) 5 6 7 8 9) 그러나 이렇게 하면 안된다.

이건 글자그대로 '(1 2 3 (+ 2 2) 5 6 7 8 9)인 리스트가 된다.

그럴때에는 list함수를 쓰자.

(list (1 2 3 (+ 2 2) 5 6 7 8 9) 여기서는 '를 안붙여도 된다.

이렇게 적으면 '(1 2 3 4 5 6 7 8 9)인 리스트와 똑같이 된다 

리스트를 알아두면 엄청나게 많은 일을 할수 있다. 리스트는 나중에 더 알아보도록 하자.



(define (gugu1 x);일일이 노가다 .. 함수 몸체가 여러개임

  (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x))

  (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x))

  (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x))

  (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x))

  (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x))

  (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x))

  (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x))

  (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x)))


(define (gugu2 x);함수 몸체가 하나 그런데 printf리턴값을 rr이라고 치면 저게 끝나고 나서 printf들을 싸고있는 괄호가 (rr rr rr rr rr rr rr rr)이 됨 그래서 가장 처음의 rr을 함수 그 뒤의것들을 데이터로 인식해서 또 rr이라는 함수를 실행하려고 하는데 그냥 순서대로 진행시키는 함수가 바로 begin인것임!

  (begin 

    (printf "~a 곱하기 ~a 는 ~an" x 2 (* 2 x));리턴값을 함수로 인식해서 그 함수값에 뒤의 리턴값들을 합쳐서 또 실행시키려고 하기때문에 오류가 남

    (printf "~a 곱하기 ~a 는 ~an" x 3 (* 3 x));그럴때 begin을 쓰면 됨!

    (printf "~a 곱하기 ~a 는 ~an" x 4 (* 4 x))

    (printf "~a 곱하기 ~a 는 ~an" x 5 (* 5 x))

    (printf "~a 곱하기 ~a 는 ~an" x 6 (* 6 x))

    (printf "~a 곱하기 ~a 는 ~an" x 7 (* 7 x))

    (printf "~a 곱하기 ~a 는 ~an" x 8 (* 8 x))

    (printf "~a 곱하기 ~a 는 ~an" x 9 (* 9 x))

    ))



;이 함수는 재귀호출 함수입니다 저기 if문을 안넣어주면 무한루프 되니까 넣어주세요 

(define (gugu3 x y);재귀호출(자기자신을 부르는 함수)을 통해서 매우 간단해진 함수 그러나 함수 부를때 인자를 두개씩 넣어줘야한다.즉 2단 출력하고프면 (gugu2 2 2)라고해야한다

  (if (= y 10)

      'end

      (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))


(define (gugu4 x [y 2]);y가 전달되지 않으면 2가 자동으로 된다. 즉 2단 출력하고프면 (gugu3 2)라고만 해도 된다 

  (if (= y 10)

      'end

      (begin (printf "~a곱하기 ~a는 ~a" x y (* x y)) (gugu3 x (+ y 1)))))


(gugu1 2)

(gugu2 2)

(gugu3 2 2)

(gugu4 2)


후훗.. 314초가 넘었는가?

프로그래밍은 원래 그런거다

흥미있게 배우면 314초만에 배워야 한다는 생각은 자동으로 없어지게된다.

하지만 흥미가 없으면 314초 도 지루하게 느껴진다.


Who's 정체불명

profile

두팔과 의지가 있는데 무엇을 못 하겠는가!

< http://mpnp.tistory.com >

Comment '9'
  • ?
    오이깎기 2010.10.02 14:14

    이거 알면 뭐에다쓰죠 ??

  • profile
    정체불명 2010.10.02 14:22

    프로그램을 만들수 있지요 ㅇㅅㅇ 

    문제도 풀수 있고

    (예를들어서 3두개 7두개로 24만들어보세요를 프로그래밍해서 풀수도 있구요)

    웹 프로그래밍도 할수 있고 게임도 만들수 있구요 -_-;;

  • ?
    섬워크 2010.10.02 14:27

    알찬 강좌! 전 재밌었어요

  • profile
    정체불명 2010.10.02 14:31

    감사해요 ㅎㅎ 전에 c강좌는 제가 너무 길게쓰고 두서없이 써서 사람들이 어렵다고 햇는데 다행이네요

  • ?
    완폐남™ 2010.10.02 14:37

    좋은데요?

    스킴.. 이라고 하셨던가요?

    C와는 다르게 (+ 1 2 3 4 5 6 7 8 9 10) 이런식으로 가능하다니...

    역시 더욱 편리해진 프로그래밍 언어네요.ㅎㅎ

  • profile
    정체불명 2010.10.02 14:39

    오 완폐남님 안녕하세요 ㅎㅎ c언어 배우는 중이라고하셨었나요?

    문제를 내주시면 스킴으로 한번 풀어볼게요 ㅎㅎ

  • profile
    rlawnsahXP 2010.10.02 14:42

    전 C만 써서..

    확실히 C보단 쉽습니다.

    처음부터 이걸했다면 이해가 쉬웠을텐데말이죠 ㅠㅠ

  • ?
    포인트팡팡 2010.10.02 14:48
    축하합니다. 정체불명님은 10포인트에 당첨되셨습니다
  • profile
    정체불명 2010.10.02 14:48

    보조로 쓰던 메인으로 쓰던 한번 써보셔요

    Lisp배운 사람들은 처음 배우는 언어로 Lisp을 추천하더라구요

    Lisp이나 스킴이나 거의 비슷비슷한건 위에 적어놧으니

    스킴으로 시작하는거도 좋다는 의미죠 ㅇㅅㅇ


List of Articles
분류 제목 글쓴이 날짜 조회 수
Vegas Pro 베가스 강좌 목록 아방스 2017.09.28 187
파이널컷X 파컷 강좌 목록 아방스 2017.06.18 269
기타 해커스쿨 F.T.Z서버에 대해 궁금하신 분들은 글올려주세요... - 하늘 - 2009.08.03 3412
C언어 한글자씩 출력하기 file 정체불명 2012.01.21 3529
플래시 플래시 MX 활용법! 1 은색바람 2011.09.09 2762
어도비 프리미어 프리미어 cc 2014 새로운 기능 - Premiere Pro CC – April 2014 – New Features 아방스 2014.07.07 1318
게임기획 프롤로그의 여러가지 작성 방법 2 아방스 2012.04.17 4064
기타 프로그래밍 스킴 Scheme 4 "3두개 7두개로 24를 만들려면?" 프로그래밍으로 풀기 2 정체불명 2010.10.03 2431
기타 프로그래밍 스킴 Scheme 3 "3두개 7두개로 24를 만들려면?" 프로그래밍으로 풀기 1 정체불명 2010.10.03 2508
기타 프로그래밍 스킴 Scheme 2 프로그래밍한 걸 exe파일 만들어 배포하기! 2 file 정체불명 2010.10.02 3060
기타 프로그래밍 스킴 Scheme 1 다운로드부터 문법 대부분을 314초만에 알려줄게요 9 file 정체불명 2010.10.02 3540
기타 프로그래밍 스킴 7줄로 윈도우창에 그림을 출력하고 움직여보자. file 정체불명 2010.10.04 2428
기타 프로그래밍 scheme 빨간 공을 움직이다가 특정 좌표에 가면 파랗게 만들어 보자. file 정체불명 2010.10.06 2615
C언어 푸쉬푸쉬 func.h파일 file 정체불명 2012.01.25 2824
C언어 푸쉬푸쉬 data structure.h 의 내용 file 정체불명 2012.01.25 2557
기타 폴더 100개 일괄적으로 만들기 정체불명 2014.11.02 580
기타 포토스케이프 - 사진 색감 보정하기 아방스 2010.11.04 2769
기타 포토샵 크기 조절 1 제니스 2008.06.22 3857
기타 포샵 빛나는 공 4 제니스 2008.06.22 3057
에프터 이펙트 펜툴을 이용해서 키프레임 추가,삭제 및 수정방법 아방스 2011.12.08 5103
C언어 파일읽어서 배열에 넣고 다시배열에서 읽어서 화면에 출력 정체불명 2012.01.21 2648
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Next
/ 19