연습문제
1. 다음 데이터베이스와 관련된 설명 중, 거리가 먼 것을 모두 고르세요.
① 파일 처리는 데이터의 양이 많을 때, 데이터베이스는 데이터의 양이 적을 때 적합하다.
② DBMS는 데이터베이스를 관리하는 소프트웨어 또는 시스템을 지칭한다.
③ DBMS 제품에는 오라클, SQL Sever, MySQL, Excel, PowerPoint 등이 있다.
④ SQLite는 가벼운 DBMS 중 하나다.
답 : 1, 3
해설 : 1번 파일 처리는 데이터의 양이 적을 때, 데이터베이스는 데이터의 양이 많을 때 적합하다.
3번 Excel, PowerPoint는 DBMS 제품이 아니다.
2. MySQL, SQLite 등이 포함되는 데이터베이스 종류를 하나 고르세요.
① 계층형 DBMS
② 망 DBMS
③ 관계형 DBMS
④ 객체지향형 DBMS
답 : 3
3. 다음 각 항이 설명하는 용어를 쓰세요.
(1) 데이터가 표 형태로 표현된 것을 말한다.
(2) 테이블이 저장되는 저장소를 말한다.
(3) 사용자와 DBMS가 소통하기 위한 언어를 말한다.
(4) 회원테이블의 회원이름 열은 문자 형식, 출생년도는 숫자 형식으로 지정하는 것을 말한다.
답 : (1) 테이블, (2) 데이터베이스, (3) SQL, (4) 데이터 형식
4. 다음은 데이터베이스의 구축 과정입니다. 차례대로 나열하세요.
A. 응용 프로그램에서 활용
B. 데이터 조회
C. 데이터 입력
D. 테이블 생성
E. 데이터베이스 생성
F. DBMS 설치
답 : F - E - D - C - B - A
5. SQLite의 데이터 입력 과정입니다. 차례대로 나열한 것을 고르세요.
A. 테이블 만들기
B. 커서 생성
C. 데이터베이스 연결
D. 데이터베이스 닫기
E. 입력한 데이터 저장
F. 데이터 입력
① CBAFED
② ABCDEF
③ CABEFD
④ CDEFAB
답 : 1
6. 파이썬에서 데이터를 입력하는 코드입니다. 빈칸을 채우세요.
import sqlite3
con = sqlite3.connect("C:/CookPython/naverDB")
cur = [ ① ]
while (True) :
data1 = input("사용자ID ==> ")
if data1 == "" :
break;
data2 = input("사용자이름 ==> ")
data3 = input("이메일 ==> ")
data4 = input("출생연도 ==> ")
sql = "INSERT INTO userTable VALUES('" + data1 + "','" + data2 + "')"
[ ② ]
[ ③ ]
con.close()
답 : ① con.cursor(), ② cur.execute(sql), ③ con.commit()
7. 다음은 데이터를 조회하는 코드의 일부입니다. 빈 칸을 채우세요.
con = sqlite3.connect("naverDB")
cur = [ ① ]
sql = "SELECT * FROM userTable"
[ ② ]
답 : ① con.cursor(), ② cur.fetchone
8. [응용예제 02]는 RAW 파일을 DB에 저장하고 화면에 출력하는 코드입니다. 이에 다음 기능을 추가하세요.
(1) [파일] >> [열기] 메뉴를 추가해서 원하는 RAW 파일을 선택해서 열도록 한다.
(2) [사진효과] 메뉴를 추가하고, 그 하위에 [밝게하기], [어둡게하기], [반전하기] 메뉴를 추가한다.
(3) [밝게하기], [어둡게하기], [반전하기]를 선택하면 데이터베이스의 테이블이 변경된 후에, 데이터베이스의 내용을 메모리로 불러와서 화면을 출력하도록 한다.
힌트 [사진효과]는 UPDATE문을 테이블에 실행해야 한다.
답 :
from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import os.path
import math
import sqlite3
## 함수 선언 부분 ##
def func_open():
global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename
filename = askopenfilename(parent=window, filetypes=(("RAW 파일", "*.raw"), ("모든 파일", "*.*")))
if filename == '': # 대화상자에서 취소를 눌렀으면
return
if canvas != None: # 기존에 열린 적이 있으면 제거
canvas.destroy()
# 파일 --> 메모리
loadImage(filename)
window.geometry(str(XSIZE) + 'x' + str(YSIZE)) # 윈도창 크기
canvas = Canvas(window, height = XSIZE, width = YSIZE)
paper = PhotoImage(width = XSIZE, height = YSIZE)
canvas.create_image((XSIZE / 2, YSIZE / 2), image = paper, state = "normal")
# 메모리 --> 화면
loadImage(filename) # 파일 --> 데이터베이스
loadDatabase() # 데이터베이스 --> 메모리
displayImage(inImage) # 메모리 --> 화면
canvas.pack()
def loadImage(fname) : # raw --> DB
global inImage, XSIZE, YSIZE
con, cur = None, None
row, col, data, sql = 0, 0, 0, ''
con = sqlite3.connect("C:/CookPython/rawDB") # DB가 저장된 폴더까지 지정
cur = con.cursor()
fp = open(fname, 'rb')
for row in range(0, XSIZE) :
for col in range(0, YSIZE) :
data = int(ord(fp.read(1)))
sql = "INSERT INTO rawTable VALUES(" + str(row) + "," + str(col) + "," + str(data) + ")"
cur.execute(sql)
fp.close()
con.commit()
con.close()
def loadDatabase() : # DB --> 메모리
global inImage, XSIZE, YSIZE
con, cur = None, None
row, col, data = 0, 0, 0
record = None # 테이블에서 읽어온 한 행
con = sqlite3.connect("C:/CookPython/rawDB")
cur = con.cursor()
cur.execute("SELECT * FROM rawTable")
# 빈 inImage 생성
for i in range(0, XSIZE) :
tmpList = []
for k in range(0, YSIZE) :
data = 0
tmpList.append(data)
inImage.append(tmpList)
# 테이블 --> inImage
while (True) :
record = cur.fetchone()
if record== None :
break;
row = record[0]; col = record[1]; data = record[2]
inImage[row][col] = data
con.close()
def displayImage(image) :
global XSIZE, YSIZE
rgbString = ""
for i in range(0, XSIZE) :
tmpString = ""
for k in range(0, YSIZE) :
data = image[i][k]
tmpString += "#%02x%02x%02x " % (data, data, data) # x 뒤에 한 칸 공백
rgbString += "{" + tmpString + "} " # } 뒤에 한 칸 공백
paper.put(rgbString)
def func_exit() :
window.quit()
window.destroy()
def brightPhoto() :
global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
value = 0
value = askinteger('밝게', '값 입력', minvalue=1, maxvalue=255)
con = sqlite3.connect("C:/CookPython/rawDB") # DB가 저장된 폴더까지 지정
cur = con.cursor()
sql = "UPDATE rawTable SET data = data +" + str(value)
cur.execute(sql)
sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
cur.execute(sql)
sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
cur.execute(sql)
con.commit()
con.close()
loadDatabase() # 데이터베이스 --> 메모리
displayImage(inImage)
def darkPhoto() :
global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
value = 0
value = askinteger('어둡게', '값 입력', minvalue=1, maxvalue=255)
con = sqlite3.connect("C:/CookPython/rawDB") # DB가 저장된 폴더까지 지정
cur = con.cursor()
sql = "UPDATE rawTable SET data = data -" + str(value)
cur.execute(sql)
sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
cur.execute(sql)
sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
cur.execute(sql)
con.commit()
con.close()
loadDatabase() # 데이터베이스 --> 메모리
displayImage(inImage)
def reversePhoto() :
global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
con = sqlite3.connect("C:/CookPython/rawDB") # DB가 저장된 폴더까지 지정
cur = con.cursor()
sql = "UPDATE rawTable SET data = 255 - data"
cur.execute(sql)
con.commit()
con.close()
loadDatabase() # 데이터베이스 --> 메모리
displayImage(inImage)
## 전역 변수 선언 부분
window, canvas, XSIZE, YSIZE = None, None, 256, 256
inImage = [] # 2차원 리스트 (메모리)
## 메인 코드 부분 ##
if __name__ == "__main__" :
window = Tk()
window.title("연습문제")
canvas = Canvas(window, height = XSIZE, width = YSIZE)
paper = PhotoImage(width = XSIZE, height = YSIZE)
canvas.create_image((XSIZE/2, YSIZE/2), image = paper, state = "normal")
# 테이블 초기화
con = sqlite3.connect("C:/CookPython/rawDB") # 소스코드가 저장된 폴더에 생성됨
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS rawTable")
cur.execute("CREATE TABLE rawTable(row int , col int, data int)") # 행,열,픽셀값
con.commit()
con.close()
# 메뉴 추가
mainMenu = Menu(window)
window.config(menu = mainMenu)
fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label = "파일", menu = fileMenu)
fileMenu.add_command(label = "파일 열기", command = func_open)
fileMenu.add_separator()
fileMenu.add_command(label = "프로그램 종료", command = func_exit)
photoMenu = Menu(mainMenu)
mainMenu.add_cascade(label = "사진효과", menu = photoMenu)
photoMenu.add_command(label = "밝게하기", command = brightPhoto)
photoMenu.add_command(label = "어둡게하기", command = darkPhoto)
photoMenu.add_command(label = "반전 이미지", command = reversePhoto)
filename = 'RAW/tree.raw' # C:/CookPython/RAW/tree.raw
loadImage(filename)
loadDatabase()
displayImage(inImage)
canvas.pack()
window.mainloop()
*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!
'Back-End > Python' 카테고리의 다른 글
변수와 자료형 (0) | 2023.07.19 |
---|---|
파이썬 for Beginner 3판 14장 연습문제 답(더보기 클릭) (0) | 2023.07.13 |
파이썬 for Beginner 3판 12장 연습문제 답(더보기 클릭) (0) | 2023.06.27 |
파이썬 for Beginner 3판 11장 연습문제 답(더보기 클릭) (0) | 2023.06.22 |
파이썬 for Beginner 3판 10장 연습문제 답(더보기 클릭) (0) | 2023.06.14 |