도대체 반복문을 배워서 어디다 써 먹을까요?


예를 들어 원의 좌표를 구한다고 생각 해 보겠습니다.



원의 좌표는 중심점이 c 이고 반지름이 r 일때


x = c + r * cosA 

y = c + r * sinA 


입니다.


A 는 각도가 되겠습니다.


그럼, 중심점은 0,0 반지름은 1 인 원의 각도 0도 지점의 좌표는 무엇 일까요?


이해를 돕기 위해 다음 그림을 같이 보지요



이 원이 정확히 중심점은 0,0 반지름은 1 인 원이네요.



각도는 쎄타로 나타 내고 있는데 표시하기 어려운 관계로 A 라고 하겠습니다.


각도가 0도 일때 원위의 점은 어디 일까요?






바로 저 녹색 v가 가리키는 지점 일 겁니다, 좌표로는 반지름이 1 이니까 1,0 이 되겠네요.


정말 그런지 볼까요?



x = 0 + 1 * cos 0 = 1

y = 0 + 1 * sin 0  = 0


sin 0 은 0 이고 cos 0 은 1 이니까 맞네요.


그럼 0도 이외의 각도에서도 그게 정확히 맞아 떨어 질까요?


당연히 맞아 떨어집니다. 


삼각함수가 그럴때 쓰려고 만들어 놓은 거니까요


https://www.youtube.com/watch?v=YEB39NcNQe0


위에 동영상에 자세히 나오니까 한번 확인해 보세요~









아무튼, 그럼 반복문을 이용해서 원의 좌표를 0도만 이 아니고 전체에 대해서 한번에 구해 볼까요?



먼저

for i in range(100) 

이렇게 하겠습니다. 100은 원을 몇등분 할 것인가 가 되겠네요.

100이니까 원을 100등분... 

360 / 100 은 3.6 도니까 3.6 도마다의 원의 좌표를 구하겠습니다.

360 도는 파이로 계산 했을때 얼마 일까요? 

답은 2 파이 입니다.

즉 원을 한바퀴 돈 각도는 2 파이 라는거지요.

그럼 

3.6 도  =  2파이 / 100 

이겠네요.

그럼 0 도는 3.6도 * 0 이겠군요.

3.6도는 3.6 *1 도겠네요

7.2 도는 3.6 * 2....

한번 차례대로 써 보겠습니다.

0 = 3.6 * 0 

3.6 = 3.6 * 1

7.2 = 3.6 * 2

10.8 = 3.6 *3
.
.

.
.
356.4 = 360 * 99

360 = 360 * 100 = 0도!!!


그런데 맨 뒤에 숫자만 모아서 보면

0,1,2,3.....99 

( 360 도는 0도 다시 나온 녀석이니까 생략)

어디서 많이 본겁니다.

N 이 100 일때 0~99 ....

바로 range(100) 이죠.


그렇다면 다음과 같은 식이 의미 하는 것이 무엇인지 알수 있겠네요.

for i in range(100):
<tab>i * 2파이 / 100


위에서 2파이는 360도 이고 2파이 /100 은 3.6도 랬으니까 다시 써 보면 아래와 같지요

for i in range(100):
<tab>i * 3.6도




어디서 많이 본 식이 여기도 등장 하네요. i * 3.6도 라........

바로 위에 쭉 나열 했던 식과 동일 한 식 입니다.

i대신에 0 ,1 ,2 ,3 ,4 를 대입만 하면 식은 같아 지지요.


그리고 0,1,2,3,4.... 이 녀석은 바로 위에 말했다 시피 range(100) 이구요.

그렇다면....

for i in range(100):
<tab>i * 2파이 / 100 

는 0 도 부터 356.4 도 까지의 각도를 3.6도씩 더한 녀석들이 될 겁니다.


한번 직접 확인 해 보겠습니다.
파이썬 에서는 한글로 파이 는 인식을 못하니 파이 대신 np.pi 라는 걸로 대신 합니다.


for i in range(100):
<tab>print i * 2 * np.pi / 100


결과 값을 확인 하셨나요?

 그 결과값이 바로 각도들이 되겠습니다.


그렇다면 

중심점 + 반지름 * cos(위에서 구한 각도들 차례대로 대입) 

이렇게 하면 바로 x 의 좌표들이 나오겠네요.

y = 중심점 + 반지름 * sin(위에서 구한 각도들 차례대로 대입) 

이렇게 y 를 구하면 됩니다.



중심점은 0,0 으로 하기로 했고 반지름은 1 이니 다시 써 보면

x = cos(위에서 구한 각도들)

y = sin(위에서 구한 각도들)


이렇게 되는군요.



그렇다면 이제 마지막으로 할 일은 다음과 같습니다.


1. 각도를 구한다.
2. 각도를 cos,sin 에 대입 해서 x 와 y 의 좌표를 구한다.
3. 그 좌표로 이동한다.
4. 각도를 3.6도 증가 시킨다

1부터 4까지 100번 반복한다


이걸 파이썬 코드로 옮겨 볼까요?
(파이썬 에서는 sin 대신 np.sin , cos 대신 np.cos 을 사용 합니다)
원을 그리는게 보이도록 line(True) 을 꼭 해줘야 합니다.

for i in range(100):
<tab>line(True)
<tab>angle =  i * 2 * np.pi / 100
<tab>x = np.cos(angle)
<tab>y = np.sin(angle)
<tab>moveabs(x,y)



간단하군요~!



중심점과 반지름을 바꿔 가면서 다양하게 그려 보면 좋을것 같습니다.














Posted by 안졸리냐젤리

6. 반복문

2016. 6. 28. 00:08

대망의 반복문 이네요.


무엇인가를 제어 하기 위해서 배워야 할 것은 반복문과 함수만 남았으니까


최종보스 직전의 보스 정도 되겠네요.






반복문은 인간이 수행했을때 오래 걸리는 일을 컴퓨터가 대신 해 주는 것을 말합니다.


설명이 길어봐야 직접 코드 한번 돌려 보는것만 못합니다.


예제의 질문의 답이 무엇인지가 정말 중요하다고 생각 합니다.


예제를 보기에 앞서서 반복문의 형식을 볼 필요는 있는 것 같습니다.



for i in range( N ) :

<tab>내가 짠 프로그램


이것이 반복문의 형태 입니다.


N 이 3 이라면 3회 반복이 되겠지요.


N이 10 이라면 10회 반복이 될겁니다.


이 전에 Range 에서 배운 range 가 보입니다.


print range( 10 ) 을 했을때 나올 결과값이 예측이 되시나요?


최대값은 얼마 일까요? 최소값은 얼마 일까요?


이미 이해 하고 있다고 가정하고.....





예제 1)


for i in range(10):

<tab>print i


위 코드의 출력값을 구하세요





예제2)


for i in range(N):

<tab>move(i,0,0)


i값을 다양한 숫자로 변경하면서 결과 값을 예측 하고 왜 그런 결과가 나왔는지 생각해 보세요.

또 중간 과정을 예측하고 결과값과 비교 해 보세요



예제 2)


for i in range(3):

<tab>move(i,0,0)


이 코드를 실행 했을때 스핀들의 최종 좌표는 얼마 입니까?

또 중간 과정을 예측하고 결과값과 비교 해 보세요



예제 3)


for i in range(3):

<tab>moveabs( 3 - i )



이 코드를 실행 했을때 스핀들의 최종 좌표는 얼마 입니까?

또 중간 과정을 예측하고 결과값과 비교 해 보세요



예제 4)



for i in range(5):

<tab>move(i,0,0)

<tab>move(0,i,0)


이 코드의 최종 좌표는 어디 입니까?

또 중간 과정을 예측하고 결과값과 비교 해 보세요



예제 5)


for i in range(5):

<tab>move(i*2 , 0 , 0)

<tab>move(-i*3 , 0 , 0)


이 코드의 최종 좌표는 어디 입니까?

또 중간 과정을 예측하고 결과값과 비교 해 보세요




















Posted by 안졸리냐젤리

5. Range

2016. 6. 27. 12:46

range명령어는 굉장히 유용하면서 파이썬에서 자주 쓰이는 명령어 입니다.


간단하게 예제로 알아 보겠습니다.


print range(1)


결과 값은 [0] 입니다.


이번엔 print range(2) 를 해 보겠습니다.


결과 값은 [0,1] 입니다.


이번엔 print range(3)을 해 보겠습니다.


 결과 값은 [0,1,2] 입니다.


이번엔 print range(20) 을 해 보겠습니다.


결과 값은 [0,1,2,3...... 18,19] 입니다.




여기까지 해 본 결과로 range(100) 을 유추가 가능하시다면 더이상 배울 건 없습니다.


물론 range 에 몇가지 기능이 더 있긴 하지만 그건 차차....



range( n ) 의 괄호 안에 들어가는  n 과 결과 값인 [0,1,2,3,........... X ] 의


X와의 관계를 알아내는게 중요 합니다.


어떻게 생각하시는지요?


또 한가지 특이한 점은 결과 값이 그냥 0,1,2,3,4, 가 아니라 사각괄호 [  안에 들어 있다는 겁니다.


어디서 많이 본건데....?


바로 이 전 예제인 리스트에서 봤습니다.


리스트를 만들때 


a = [1,2,3,4,5] 이렇게 만들었지요.


즉, 


range 의 결과값은 리스트 라는 것 입니다.


그렇다면 이 range 는 어떤 경우에 활용이 될까요?


바로


연속된 수의 리스트를 한번에 만들어야 할 때 입니다.


예를 들어 1 부터 1000 까지 숫자가 들어 있는 리스트를 만들어야 한다고 생각해 보겠습니다.


a = [1,2,3,4,5,6,7,8..........999,1000]


이걸 직접 다 일일이 치는데 얼마정도의 시간이 걸릴까요?


타자가 빠르신 분들도 최소한 십수분은 걸릴 겁니다.


그러나 range 명령어를 이용해서


a = range(1000) 


이라고 하면 단 한줄에 해결 되는군요!


그리고 또한, 


a[0] = 0


a[1] = 1 



이렇게 a 를 이요한 호출이 가능 해 집니다.


어디에 사용하면 가장 효율적으로 쓸수 있을지 한번 고민 해 볼만 합니다.






예제 1 ) 


range 명령어를 이용하여 0부터 5 까지의 리스트를 만든뒤 a 에 저장하세요


a의 인자( a[0] , a[1] , a[2]....) 들은 총 몇개 입니까?




예제 2) 


제일 큰 숫자가 678 인 리스트를 range 로 만든다면 range ( n ) 에 들어갈 숫자는 얼마 입니까?



예제 3)


다음 명령어를 실행 하고 그 결과값들을 상세히 비교 해 보세요


print range(10)


print range(0,10)


print range(1,10)


print range(2,10,1)


print range(2,10,2)


print range(0,10,2)



예제 4)


예제 3의 결과를 보고 print range(10,0) 이 아무런 결과값이 없는 이유를 유추 하세요


print range(10)


print range(0,10)


print range(10,0)




예제 5)


다음 명령어들을 실행 하고 그 결과 값들을 상세히 비교해 보세요


print range(10,0)


print range(10,0,1)


print range(10,0,-1)


print range(10,2,-1)


print range(10,2,-2)


print range(10,-2,-2)










 












 




Posted by 안졸리냐젤리

파이썬에 자료형은 크게 


정수, 소수(부동소수점 or float) , bool , 문자열, 리스트, 튜플, 딕셔너리... 이 정도가 대표적 입니다.


정수, 소수, bool , 문자열 은 아주 많이 쓰이지만 따로 차후 설명 하기로 하고,


그 외에 알고리즘에 활용되는 가장 중요한 자료형으로는 리스트가 있습니다.



a=1 


위의 문장은 a에 1을 저장 한다는 뜻 입니다.


그렇다면 a에 여러개의 숫자를 한번에 저장 하고 싶다면 어떻게 할까요?


다음과 같습니다.


a = [1,2,3,4,5]


사각 괄호를 이용하여  자료들을 감쌈으로서 이 자료형은 리스트 라는 것을 표시 합니다.


여기서 한번 


print a[0]

print a[1]

print a[2]

print a[3] ....


을 차례대로 입력 해 실행 해 보면 결과 값은


1

2

3

4....


이렇게 나오는 것을 알수 있습니다.


이걸 활용해 CNC 의 스핀들이 이동할 위치를 지정 해 줘 보겠습니다.




x = [1, 4, 6, 4, 6]

y=  [2,-1, 0, 5, 3]




x와 y 에 리스트 형 자료가 저장 되었습니다.



이제 moveabs 를 활용하여 스핀들을 움직여 보겠습니다.



moveabs( x[0] , y[0] ,0)


이렇게 한뒤 실행 하면 스핀들의 좌표는 어떻게 될까요?


위에서 a[0] 이 a의 첫번째 값인 1을 지시 했던 것 처럼


x[0] 은 x의 첫번째 값인 1을, y[0] 은 y의 첫번째 값인 2 를 지시 하게 될 것 입니다.


그걸 고려해 위의 moveabs( x[0] , y[0] ,0 ) 를 다시 써 본다면


moveabs(1,2) 와 같은 뜻이 될 것이고 스핀들의 최종 목적지는 1,2,0 이 될 것 입니다.





moveabs( x[0] , y[0] ,0)

moveabs( x[1] , y[1] ,0)

moveabs( x[2] , y[2] ,0)

moveabs( x[3] , y[3] ,0)

moveabs( x[4] , y[4] ,0)



이건 어떻게 될까요?


스핀들은 차례대로 


1,2,0

3,-1,0,

6,0,0

4,5,0

6,3,0



의 순서로 이동 하게 될 것 입니다.



P.S : 리스트는 반복문과 만났을때 진가를 발휘 합니다.





예제 1)


다음 리스트형 자료를 보고 묻는 것에 해당 하는 값을 찾으세요.



a = [2,2,9,8,7,100,300,4,5,6]


a[0] = ?


a[5] = ?


a[7] = ?



예제 2) 

다음 리스트 자료형을 보고 스핀들의 최종 좌표를 맞춰 보세요.

단, 시작 위치는 0,0,0 으로 간주 합니다.


x = [5,6,7,3,2,5,3,2,2]

y=  [-1,6,3,1,3,2,0]

z = [0,2,4,7,8]


moveabs(x[0] , y[0] , z[0])


move(x[5] , y[4] , z[4])


moveabs( x[8] , y[0] , z[3])


move( z[0] , z[1] , z[2])


mvoeabs(x[2] , y[1] , y[0])






예제3 )


x = [1,2,3,4,5]

y = [10,9,8,7,6]

z= [ ? , ? , ? , ? , ?]



z에 적절한 값을 체워서


1,10,0

2,9,-1

3,8,-2

4,7,-3

5,6,-4


로 이동 하도록 완성하고


moveabs 를 이용해서 실제 동작 하도록 해 보세요




예제 4)


최초 좌표는 0,0,0 입니다.


moveabs 가 아닌 move 를 이용하여 위와 동일한 순서의 좌표로 이동 하도록 


프로그램을 작성 해 보세요.(리스트 활용)

















Posted by 안졸리냐젤리

프로그램을 짜다 보면 현재 짜고 있는 부분이 어떤 동작을 하는지 설명을 남겨 둬야 할 때가 있습니다.


그럴때 파이썬에서는 # 을 이용하여 그 설명을 남깁니다.


이런 기능을 주석 이라고 하는데, 대부분의 언어들에서 // 을 이용하는 것과 다르게


파이썬은 #을 주석으로 인지 합니다.


한줄 안에서 #을 입력하면 그 뒤로는 모두 프로그램을 영향미치지 않는 단순 메모로 인식 합니다.




ex1 ) 


a = 1 #a 에 1을 저장 한다.















Posted by 안졸리냐젤리

BLOG main image
. by 안졸리냐젤리

공지사항

카테고리

전체보기 (13)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :