공학도를 위한 창의적컴퓨팅 - 실습
공학도를 위한 창의적컴퓨팅에서 진행한 Python 실습 내용들
기초
10000초 → 시,분,초
sec = 10000
min = sec/60
min = int(min)
sec = sec - min*60
hour = min/60
hour = int(hour)
min = min - hour*60
print(hour,'시간',min,'분',sec,'초')
피보나치 수열
num = int(input('항의 개수를 입력: '))
print('피보나치 수열: ', end = ' ')
first = 1
second = 1
cal = first + second
print(first, second, cal, end= ' ')
i=0
while(i<num-3):
first = second
second = cal
cal = first + second
print(cal, end = ' ')
i+=1
트리
story = int(input('몇층의 트리를 출력?'))
i=0
while(i<story):
print('-'*(story-(i+1))+'*'*(2*(i+1)-1))
i+=1
리스트
a리스트 요소 값들은 b 리스트 요소들이 c 리스트에 위치되어야 하는 index 값
a = [ 5, 6, 0, 3, 1, 2, 4 ]
b = ['키', '~', '내','든','가','만','쿠']
c = [0,0,0,0,0,0,0]
c[a[0]] = b[0]
c[a[1]] = b[1]
c[a[2]] = b[2]
c[a[3]] = b[3]
c[a[4]] = b[4]
c[a[5]] = b[5]
c[a[6]] = b[6]
c = ''.join(c)
print(c)
str요소변경하기(replace사용불가)
a = input('문자열을 입력하세요:')
b = input('변경할 문자를 입력하세요:')
c = input('무엇으로 변경할 것인지 입력하세요:')
a = a.split(' ')
a[a.index('식사는')] = c
a = ' '.join(a)
print(a)
행렬
행렬의 곱
A =[[4,2,1],[6,7,1],[2,5,6]]
b = [1,4,2]
c = [0,0,0]
c[0] = A[0][0]*b[0] + A[0][1]*b[1] + A[0][2]*b[2]
c[1] = A[1][0]*b[0] + A[1][1]*b[1] + A[1][2]*b[2]
c[2] = A[2][0]*b[0] + A[2][1]*b[1] + A[2][2]*b[2]
print('c리스트는', c)
행렬을 이용한 연립방정식 계산
A1 = [[0,0],[0,0]]
B1 = [0,0]
C1 = [0,0]
A1[0][0] = float(input('a값을 입력하세요'))
A1[0][1] = float(input('b값을 입력하세요'))
A1[1][0] = float(input('c값을 입력하세요'))
A1[1][1] = float(input('d값을 입력하세요'))
C1[0] = float(input('f값을 입력하세요'))
C1[1]= float(input('g값을 입력하세요'))
det = 1/(A1[0][0] * A1[1][1] - A1[0][1]*A1[1][0])
B1[0] = A1[1][1]*C1[0] + (-1)*A1[0][1]*C1[1]
B1[1] = (-1)*A1[1][0]*C1[0] + A1[0][0]*C1[1]
B1[0] = B1[0]*det
B1[1] = B1[1]*det
print('x=%.3f'%(B1[0]))
print('y=%.3f'%(B1[1]))
정방행렬
num = int(input('행렬의 사이즈를 입력하세요:'))
a = []
sum=1
j=0
while(j<num):
a.append([])
i=0
while(i<num):
a[j].append(sum)
sum+=1
i+=1
j+=1
print(a)
행렬 형태로 출력
a = []
for i in range(len(a)):
for j in range(len(a[i])):
print(a[i][j], end= ' ')
print()
적분
a=float(input('a: '))
b=float(input('b: '))
c=float(input('c: '))
start=float(input('어디부터'))
end=float(input('어디까지'))
div=int(input('몇 개로 나눌지'))
d=(end-start)/div
area=0
for i in range(div):
h1=a*((start+(i*d))**2)+b*(start+(i*d))+c
h2=a*((start+((i+1)*d))**2)+b*(start+((i+1)*d))+c
area+=(h1+h2)*d/2
print(area)
node = [[1,4],[8,6],[11,3.1],[14,-6],[20,6],[22,7]]
y=1
area=0
for i in range(1,len(node)):
if((node[i][1]*node[i-1][1])<0): #y좌표가 -인지는 곱해서 확인해야함
y=0
else:
y=1
if(y==1):
d=node[i][0]-node[i-1][0]
h=node[i-1][1]+node[i][1]
area+=d*h/2
else:
a=(node[i][1]-node[i-1][1])/(node[i][0]-node[i-1][0])
b=node[i][1]-(a*node[i][0])
x=-1*b/a
print('x절편',x)
d1=x-node[i-1][0]
d2=node[i][0]-x
h1=abs(node[i-1][1])
h2=abs(node[i][1])
area1=d1*h1/2
area2=d2*h2/2
area+=area1+area2
print(area)
matplot
이차함수 그리기
import matplotlib.pylab as plt
import math
a = 0.01
b = 0.1
c = 0.2
x = range(0,100)
y = []
for i in x:
y.append(a*math.pow(i,2)+b*i+c)
plt.plot(x,y, c='r', label='y='+str(a)+'x^2+'+str(b)+'x+'+str(c))
plt.legend(loc=2)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
정다각형 그리기
import matplotlib.pylab as plt
import math
n = range(4,10,2)
for j in n:
x = []
y = []
r = 1
theta = 360/j*math.pi/180
for i in range(j):
x.append(r * math.cos(theta*i))
y.append(r * math.sin(theta*i))
x.append(r*math.cos(0))
y.append(r*math.sin(0))
plt.plot(x,y, label= str(j) + " sided polygon")
plt.legend(loc=1)
plt.title("Regular polygon")
plt.show()
이상 교수님의 코드가 많으니 주의
최대최소, 약수, 배수, 소수
#1. max, min
a=[4,3,-7.8,9,10,11]
max=a[0]
min=a[0]
for i in range(len(a)):
if (a[i]>max):
max=a[i]
if (a[i]<min):
min=a[i]
print(max)
print(min)
#2. 약수구하기
a=int(input('val: '))
for i in range(1,a+1):
if(a%i==0):
print(i,end=' ')
#3. 약수의 개수
a=int(input('val: '))
b=0
for i in range(1,a+1):
if(a%i==0):
b+=1
print(b)
#4. 최대공약수
a=int(input('val1: '))
b=int(input('val2: '))
c=[]
d=[]
for i in range(1,a+1):
if(a%i==0):
c.append(i)
for i in range(1,a+1):
if(b%i==0):
d.append(i)
for i in range(len(c)):
for j in range(len(d)):
if(c[i]==d[j]):
sh=c[i]
print(sh)
#함수를 사용해서 풀어보자-이거 손필기하면 좋을 듯
def sh1(a,b): #여기서 b에 append하면 c에 append 되는 것
for i in range(a):
if(a%(i+1)==0):
b.append(i+1) #void fn.
a=int(input('val1: '))
b=int(input('val2: '))
c=[] #c에는 주소가 들어있음
sh1(a,c)
d=[]
sh1(b,d)
#return형 함수 이용, 얘가 더 편해서 이렇게 더 많이 씀
def sh2(a): #지역변수는 c,a a는 parameter이기도 함
c=[]
for i in range(a):
if(a%(i+1)==0):
c.append(i+1)
return c #return fn.
a=int(input('val1: '))
b=int(input('val2: '))
c=sh2(a) #함수에서 만든 리스트의 주소가 밖의 c로 오는 것
d=sh2(b)
maxsh=0
for i in range(len(c)):
for j in range(len(d)): #break 없으면 24번 돌았는데 비효율적임
if(c[i]==d[j]):
maxsh=c[i]
break
if(c[i]<d[j]): #이 때는 돌릴 필요 없음
break
print(maxsh)
#5. 최소공배수
def mul(n,max):
N=[]
for i in range(1,int((max/n)+1)):
N.append(n*i)
return N
state=1
a=int(input('val1: '))
b=int(input('val2: '))
max=a*b
A=mul(a,max)
B=mul(b,max)
for i in range(len(A)):
for j in range(len(B)):
if(A[i]==B[j]):
min=A[i]
state=0
break
if(A[i]<B[j]):
break
if(state==0):
break
print(min)
#6. 2,431,161 = 소수1*소수2일 때 소수1, 소수2를 찾아라
def numsh(a): #소수인지 판단 -> 약수 2개인가
b=0
for i in range(1,a+1):
if(a%i==0):
b+=1
if(b==2):
return 1
else:
return 0
num=int(input('val: '))
i=1
while(1):
if(numsh(i)==1):
if(num%i==0):
print(i, end=', ')
print(int(num/i))
break
i+=1
- 소수 찾을 때는 약수가 2개인지로 찾기
- 최소공배수 비교할 때 이미 대소가 판별났을 때 굳이 안 하면 줄일 수 있음
- 정수/정수 → 실수로 나옴
미분
end=4
start=0
slope=(end**2-start**2)/(end-start)
slope_old=0
while(1):
start=(end+start)/2
slope=(end**2-start**2)/(end-start)
if(abs(slope-slope_old)<0.001):
print(start,slope)
break
slope_old=slope #꼭 여기 있어야함
정렬 - p63
def selection_sort(a):
for j in range(len(a)-1):
for i in range(j+1,len(a)):
if(a[j]>a[i]):
a[j],a[i]=a[i],a[j]
def bubble_sort(a):
for j in range(len(a),0,-1):
for i in range(j-1):
if(a[i]>a[i+1]):
a[i],a[i+1]=a[i+1],a[i]
병합 정렬
# 병합정렬 - a,b를 미리 sort한 상태에서 해야함, 하나가 다 되면 나머지 하나의 나머지를 걍 뒤에 붙임
a = [6,8,2,4,13,11]
b = [3,9,21,4,16,1,2]
c=[]
p1=0
p2=0
bubble_sort(a)
bubble_sort(b)
while(1): #break 안쓰고 1대신에 (len(c) < len(a) + len(b)) 넣어도 됨
if(a[p1]>b[p2]):
c.append(b[p2])
if(p2<len(b)-1):
p2+=1
else:
for i in range(p1,len(a)):
c.append(a[i])
break
else:
c.append(a[p1])
if(p1<len(a)-1):
p1+=1
else:
for i in range(p2,len(b)):
c.append(b[i])
break
print(c)
검색 - p68
순차 검색
a=[5,7,15,28,29,31,39,8,2,3]
for i in range(len(a)):
if(a[i]==8):
print('index:',i)
break
이진 검색
a=[5,7,15,28,29,31,39,58,68,70,95]
find=70
start=0
end=len(a)-1
while(1):
pivot=int((start+end)/2)
print(pivot)
if(a[pivot]==find):
print('find', find)
break
elif(a[pivot]>find):
end=pivot
else:
start=pivot
난수, random
start=3
end=10
for i in range(3):
print(int(random.random()*(end-start)+start))
중복 없는 난수
def existence(ran,a):
for i in range(len(a)):
if(a[i]==ran):
return 1
return 0
a=[]
end=5
while(1):
ran=int(random.random()*5)
print('ran:',ran)
print(existence(ran,a))
if(existence(ran,a)):
continue
else:
a.append(ran)
if(len(a)==5):
break
print(a)
넓이, 겉넓이
3차원에서 세 점이 주어졌을 때
def area(a,b,c): # 3차원에서 세 점이 주어졌을 때 넓이
m = (b[1]-a[1])*(c[2]-a[2]) - (b[2]-a[2])*(c[1]-a[1])
n = (b[0]-a[0])*(c[2]-a[2]) - (b[2]-a[2])*(c[0]-a[0])
p = (b[0]-a[0])*(c[1]-a[1]) - (b[1]-a[1])*(c[0]-a[0])
aa = 0.5*(abs((m**2 + n**2 + p**2)**0.5))
return aa
area_sum = 0 # 겉넓이- 구나 삼각형에서 사용
for i in range(len(element)):
a = node[element[i][0]]
b = node[element[i][1]]
c = node[element[i][2]]
area_sum += area(a,b,c)
print(area_sum)
2차원에서 세 점이 주어졌을 때
def area(a,b,c):
aa = 0.5*(abs((a[0]*b[1]+b[0]*c[1]+c[0]*a[1]) - (a[0]*c[1]+c[0]*b[1]+b[0]*a[1])))
return aa
사각형도 삼각형 2개로 나눠서 이걸로 구하면 됨
txt파일 읽어와서 node, element 추가
a = open('input.txt', 'r')
node_num = int(a.readline().split(' ')[1])
dummy = a.readline() # 쓸데없지만 다음거 읽으려고 읽어옴
node = []
for i in range(node_num):
b = a.readline().split(',')
node.append([float(b[1]), float(b[2]), 0])
element_num = int(a.readline().split(' ')[1])
dummy = a.readline()
element = []
for i in range(element_num):
b = a.readline().split(',')
element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함
a.close()
matplot
등가속도운동 물체의 d,v,a
t = range(10) #간격 좁게 할수록 부드럽게 나옴
force = []
for i in t:
force.append(2)
a1 = []
mass1 = 0.5
a2 = []
mass2 = 1.5
for i in t:
a1.append(force[i]/mass1)
a2.append(force[i]/mass2)
plt.plot(t, a1, label='time-accelerate{mass1}', c='b', )
plt.plot(t, a2, label='time-accelerate{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('accelerate(m/sec^2)')
plt.xlim(0,10)
plt.ylim(0,10)
plt.show()
def area_sq(h1, h2, d):
area = (h1+h2)*d/2
return area
def integral(a):
area_sum = 0
s = [0]
for i in range(1, len(t)):
area_sum += area_sq(a[i-1], a[i], t[i]-t[i-1])
s.append(area_sum) #이렇게 단위로 자르고, 누적을 해야 가속도가 일정하지 않을 때도 일반화 가능
return s
v1 = integral(a1)
v2 = integral(a2)
d1 = integral(v1)
d2 = integral(v2)
plt.plot(t, v1, label='time-velocity{mass1}', c='b', )
plt.plot(t, v2, label='time-velocity{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('velocity(m/sec)')
plt.xlim(0,10)
plt.ylim(0,40)
plt.show()
plt.plot(t, d1, label='time-displacement{mass1}', c='b', )
plt.plot(t, d2, label='time-displacement{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('displacement(m)')
plt.xlim(0,10)
plt.ylim(0,160)
plt.show()
print('v1: ', v1)
print('d1: ', d1)
순간적인 힘
t = []
for i in range(1000):
t.append(i/100)
force = []
for i in t:
if(i==0.1):
force.append(10)
else:
force.append(0)
a1 = []
mass1 = 0.5
a2 = []
mass2 = 1.5
for i in range(len(t)):
a1.append(force[i]/mass1)
for i in range(len(t)):
a2.append(force[i]/mass2)
plt.plot(t, a1, label='time-accelerate{mass1}', c='b', )
plt.plot(t, a2, label='time-accelerate{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('accelerate(m/sec^2)')
plt.xlim(0,10)
plt.ylim(0,50)
plt.show()
def area_sq(h1, h2, d):
area = (h1+h2)*d/2
return area
def integral(a):
area_sum = 0
s = [0]
for i in range(1, len(t)):
area_sum += area_sq(a[i-1], a[i], t[i]-t[i-1]) #t의 간격에 따라 적분이 다르게 되는 게 정상
s.append(area_sum)
return s
v1 = integral(a1)
v2 = integral(a2)
d1 = integral(v1)
d2 = integral(v2)
plt.plot(t, v1, label='time-velocity{mass1}', c='b', )
plt.plot(t, v2, label='time-velocity{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('velocity(m/sec)')
plt.xlim(0,10)
plt.ylim(0,5)
plt.show()
plt.plot(t, d1, label='time-displacement{mass1}', c='b', )
plt.plot(t, d2, label='time-displacement{mass2}', c='r', )
plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('displacement(m)')
plt.xlim(0,10)
plt.ylim(0,10)
plt.show()
print('a1: ', a1[1])
print('v1: ', v1[1])
print('d1: ', d1[1])
꼭짓점이 어느 도메인에 있는가 - 전체 코드
# read
rd = open('input.txt', 'r')
node_num = int(rd.readline().split(' ')[1])
dummy = rd.readline() # 쓸데없지만 다음거 읽으려고 읽어옴
node = []
for i in range(node_num):
b = rd.readline().split(' ')
node.append([float(b[1]), float(b[2])])
dummy = rd.readline()
element_num = int(rd.readline().split(' ')[1])
dummy = rd.readline()
element = []
for i in range(element_num):
b = rd.readline().split(' ')
element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1, int(b[4])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함
dummy = rd.readline()
particle_num = int(rd.readline().split(' ')[1])
dummy = rd.readline()
particle = []
for i in range(particle_num):
b = rd.readline().split(' ')
particle.append([float(b[1]), float(b[2])])
rd.close()
# 넓이
def area(a,b,c):
aa = 0.5*(abs((a[0]*b[1]+b[0]*c[1]+c[0]*a[1]) - (a[0]*c[1]+c[0]*b[1]+b[0]*a[1])))
return aa
def where(n):
for j in range(42):
area_sum = 0
for i in range(3):
area_sum += area(node[element[j][i]], node[element[j][i+1]],particle[n])
area_sum += area(node[element[j][0]], node[element[j][3]],particle[n])
if(int(area_sum) == int(area_sq[j])):
domain = j+1
return domain
area_sq = [] # 사각형 2개 넓이
for i in range(len(element)):
area_sq.append(area(node[element[i][0]], node[element[i][1]], node[element[i][2]])
+ area(node[element[i][0]], node[element[i][3]], node[element[i][2]])
)
# 도메인 찾기
domain = []
for i in range(len(element)):
domain.append([])
for n in range(len(particle)):
domain[where(n)-1].append(n+1)
# write
wt = open('output.txt', 'w')
for j in range(len(domain)):
print('domain',j+1)
wt.write('domain'+str(j+1))
wt.write('\n')
for i in range(len(domain[j])):
print(domain[j][i],end=' ')
wt.write(str(domain[j][i])+' ')
print()
wt.write('\n')
wt.close()