연습문제

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()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

+ Recent posts