Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

answerChecker

ํ•™๊ต ์‹œํ—˜ ์ž๋™ ์ฑ„์  ๋ฐ ์ˆœ์œ„ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๊ฐœ์š”

answerChecker๋Š” ํ•˜์„ฑ๊ณ ๋“ฑํ•™๊ต๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ์‹œํ—˜ ์ž๋™ ์ฑ„์  ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋‹ต์•ˆ๊ณผ ํ•™์ƒ์˜ ๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ฑ„์ ํ•˜๊ณ , ์ „์ฒด ์ˆœ์œ„ ๋ฐ ๋“ฑ๊ธ‰์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ž๋™ ์ฑ„์ : ๋‹ต์•ˆ ์ž…๋ ฅ ์‹œ ์ž๋™์œผ๋กœ ์ ์ˆ˜ ๊ณ„์‚ฐ
  • ๋‹ต์•ˆ ๊ด€๋ฆฌ: ๊ณผ๋ชฉ๋ณ„ ์‹œํ—˜ ๋‹ต์•ˆ ์ €์žฅ
  • ์ˆœ์œ„ ํ™•์ธ: ์‹œํ—˜ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜ ์ˆœ์œ„ ์กฐํšŒ
  • ๋“ฑ๊ธ‰ ๊ณ„์‚ฐ: rating_calculator ๋ชจ๋“ˆ๋กœ ๋“ฑ๊ธ‰ ์‚ฐ์ถœ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ: MySQL์— ์‹œํ—˜ ๊ฒฐ๊ณผ ์˜๊ตฌ ์ €์žฅ

๊ธฐ์ˆ  ์Šคํƒ

  • Python 3.x
  • PyMySQL - MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™
  • MySQL - ๋ฐ์ดํ„ฐ ์ €์žฅ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

answerChecker/
โ”œโ”€โ”€ checker.py              # ๋ฉ”์ธ ์ฑ„์  ํ”„๋กœ๊ทธ๋žจ
โ”œโ”€โ”€ answerinput.py          # ๋‹ต์•ˆ ์ž…๋ ฅ ๋ชจ๋“ˆ
โ”œโ”€โ”€ rating_calculator.py    # ๋“ฑ๊ธ‰ ๊ณ„์‚ฐ ๋ชจ๋“ˆ
โ””โ”€โ”€ .hwp                    # ๋ฌธ์„œ ํŒŒ์ผ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ

SCORE ํ…Œ์ด๋ธ”

์ปฌ๋Ÿผ๋ช… ํƒ€์ž… ์„ค๋ช…
ID INT ํ•™๋ฒˆ
SUBCODE INT ๊ณผ๋ชฉ์ฝ”๋“œ
SCORE INT ์ ์ˆ˜

ans ํ…Œ์ด๋ธ”

์ปฌ๋Ÿผ๋ช… ํƒ€์ž… ์„ค๋ช…
testname VARCHAR ์‹œํ—˜๋ช…
testcode INT ๊ณผ๋ชฉ์ฝ”๋“œ
answer TEXT ๋‹ต์•ˆ

์„ค์น˜ ๋ฐ ์‹คํ–‰

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.x
  • MySQL ์„œ๋ฒ„
  • ํ•˜์„ฑ๊ณ  ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ๊ถŒํ•œ

1. ์˜์กด์„ฑ ์„ค์น˜

pip install pymysql

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •

CREATE DATABASE HASEONG;
USE HASEONG;

CREATE TABLE SCORE (
    ID INT,
    SUBCODE INT,
    SCORE INT,
    PRIMARY KEY (ID, SUBCODE)
);

CREATE TABLE ans (
    testname VARCHAR(100),
    testcode INT,
    answer TEXT,
    PRIMARY KEY (testname, testcode)
);

3. ์‹คํ–‰

python checker.py

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ํ•™๋ฒˆ ์ž…๋ ฅ

๊ฐ€์ฒด์ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค(ํ•˜์„ฑ๊ณ  ์ „์šฉ)
ํ•™๋ฒˆ์„ ์ž…๋ ฅํ•˜์„ธ์š” >>> 12345

2. ๊ธฐ๋Šฅ ์„ ํƒ

์‚ฌ์šฉํ•  ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜์„ธ์š”
1.๊ฐ€์ฒด์  2.์ˆœ์œ„ํ™•์ธ 3.๋๋‚ด๊ธฐ >>> 1

3. ์‹œํ—˜ ์ •๋ณด ์ž…๋ ฅ

์‹œํ—˜์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š” ์˜ˆ์‹œ)2ํ•™๊ธฐ๊ธฐ๋ง๊ณ ์‚ฌ >>> 2ํ•™๊ธฐ์ค‘๊ฐ„๊ณ ์‚ฌ
๊ณผ๋ชฉ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” >>> 3

๊ณผ๋ชฉ ์ฝ”๋“œ:
1 - ๊ตญ์–ด
2 - ์˜์–ด
3 - ์ˆ˜ํ•™
4 - ์‚ฌํšŒ
5 - ๊ณผํ•™
6 - ์˜์–ด
7 - ํ•œ๊ตญ์‚ฌ

4. ๋‹ต์•ˆ ์ž…๋ ฅ

๋ฌธ์ œ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” >>> 20
1๋ฒˆ์จฐ ๋‹ต์„ ์ž…๋ ฅํ•˜์„ธ์š” >>> 1
2๋ฒˆ์จฐ ๋‹ต์„ ์ž…๋ ฅํ•˜์„ธ์š” >>> 2
...
20๋ฒˆ์จฐ ๋‹ต์„ ์ž…๋ ฅํ•˜์„ธ์š” >>> 4

5. ๊ฒฐ๊ณผ ํ™•์ธ

์ž…๋ ฅ ์™„๋ฃŒ
85์ ์ž…๋‹ˆ๋‹ค

6. ์ˆœ์œ„ ํ™•์ธ

์‚ฌ์šฉํ•  ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜์„ธ์š”
1.๊ฐ€์ฒด์  2.์ˆœ์œ„ํ™•์ธ 3.๋๋‚ด๊ธฐ >>> 2

12345๋‹˜์€ 5๋“ฑ ์ž…๋‹ˆ๋‹ค
------๋“ฑ๊ธ‰ํ‘œ------
[๋“ฑ๊ธ‰ ์ •๋ณด ์ถœ๋ ฅ]

ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

def start():
    global conn
    try:
        conn = pymysql.connect(
            user = 'student',
            password = 'haseongh.goe.go.kr',
            host = 'nel.o-r.kr',
            port = 3306,
            charset = 'utf8'
        )
    except pymysql.err.OperationalError as error:
        print(str(error) + '! restarting')
        start()

    global cursor
    cursor = conn.cursor()
    cursor.execute('USE HASEONG')

2. ๋‹ต์•ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

def value():
    testname = str(input('์‹œํ—˜์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š” >>>'))
    testcode = int(input('๊ณผ๋ชฉ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” >>>'))

    # ๋‹ต์•ˆ ์กฐํšŒ
    sql = f"select answer from ans where testname = '{testname}' and testcode = '{testcode}'"
    cursor.execute(sql)

    # ์ ์ˆ˜ ์กฐํšŒ
    sql = f"select answer from ans where testname = '{testname}_ans' and testcode = '{testcode}_ans'"
    cursor.execute(sql)

3. ํ•™์ƒ ๋‹ต ์ž…๋ ฅ

def ansinput():
    i = 1
    global proans
    proans = {}
    try:
        while i < problnum + 1:
            proans[str(i)] = int(input(str(i) + '๋ฒˆ์จฐ ๋‹ต์„ ์ž…๋ ฅํ•˜์„ธ์š” >>>'))
            i = i + 1
    except ValueError:
        print(str(ValueError) + '! please try again')
        ansinput()
    return proans

4. ์ฑ„์ 

def check():
    i = 1
    global proscore
    proscore = 0

    while i < problnum + 1:
        try:
            score = answer[str(proans[str(i)])]
            proscore = proscore + score
        except KeyError:
            print(str(i) + '๋ฒˆ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค')
        i = i + 1

    print(str(proscore) + '์ ์ž…๋‹ˆ๋‹ค')

5. ๊ฒฐ๊ณผ ์ €์žฅ

def save():
    sql = f'''INSERT INTO SCORE
    VALUES ({stunum}, {testcode}, {proscore})'''
    try:
        cursor.execute(sql)
    except MySQLError as sqlerror:
        print(str(sqlerror) + '! please try again')

6. ์ˆœ์œ„ ์กฐํšŒ

def ranking():
    sql = f'''SELECT ID FROM SCORE WHERE SUBCODE = '{testcode}' ORDER BY SCORE DESC'''
    try:
        cursor.execute(sql)
    except MySQLError as error:
        print(str(error) + 'please try again')

    a = 1
    for i in cursor:
        a = a + 1
        if stunum == i:
            print(f'{stunum}๋‹˜์€ {a}๋“ฑ ์ž…๋‹ˆ๋‹ค')
            rating_calculator.calculate(42)  # ๋“ฑ๊ธ‰ ๊ณ„์‚ฐ

์‚ฌ์šฉ ์˜ˆ์‹œ

์‹œ๋‚˜๋ฆฌ์˜ค: ์ˆ˜ํ•™ ์‹œํ—˜ ์ฑ„์ 

1. ํ•™๋ฒˆ ์ž…๋ ฅ: 12345
2. ๊ธฐ๋Šฅ ์„ ํƒ: 1 (๊ฐ€์ฒด์ )
3. ์‹œํ—˜๋ช…: 2ํ•™๊ธฐ์ค‘๊ฐ„๊ณ ์‚ฌ
4. ๊ณผ๋ชฉ์ฝ”๋“œ: 3 (์ˆ˜ํ•™)
5. ๋ฌธ์ œ์ˆ˜: 20
6. ๋‹ต ์ž…๋ ฅ: 1, 2, 3, 4, 1, 2, 3, 4, ... (20๊ฐœ)
7. ๊ฒฐ๊ณผ: 85์ ์ž…๋‹ˆ๋‹ค

๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

โš ๏ธ ์ฃผ์˜: ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

1. SQL Injection ์ทจ์•ฝ์ 

# ์ทจ์•ฝํ•œ ์ฝ”๋“œ
sql = f"select answer from ans where testname = '{testname}'"

# ๊ฐœ์„ ์•ˆ
sql = "select answer from ans where testname = %s"
cursor.execute(sql, (testname,))

2. ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ธ์ฆ ์ •๋ณด

# ๊ฐœ์„ ์•ˆ
import os
from dotenv import load_dotenv

load_dotenv()
conn = pymysql.connect(
    user = os.getenv('DB_USER'),
    password = os.getenv('DB_PASS'),
    host = os.getenv('DB_HOST')
)

์ œํ•œ์‚ฌํ•ญ

  • ํ•™๊ต ์ „์šฉ: ํ•˜์„ฑ๊ณ  ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ๋งŒ ์ž‘๋™
  • ๋‹จ์ผ ์‚ฌ์šฉ์ž: ๋™์‹œ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ๋ฏธ์ง€์›
  • ์ค‘๋ณต ์ฑ„์ : ๊ฐ™์€ ์‹œํ—˜์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฑ„์  ๊ฐ€๋Šฅ
  • ๋‹ต์•ˆ ์ˆ˜์ • ๋ถˆ๊ฐ€: ์ž…๋ ฅ ํ›„ ์ˆ˜์ • ๊ธฐ๋Šฅ ์—†์Œ

๊ฐœ์„  ๋ฐฉํ–ฅ

1. ์›น ์ธํ„ฐํŽ˜์ด์Šค

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/grade', methods=['POST'])
def grade():
    answers = request.form.getlist('answers')
    score = calculate_score(answers)
    return render_template('result.html', score=score)

2. ์ค‘๋ณต ์ฑ„์  ๋ฐฉ์ง€

# ์ด๋ฏธ ์ฑ„์ ํ•œ ๊ฒฝ์šฐ ๊ฒฝ๊ณ 
sql = f"SELECT * FROM SCORE WHERE ID = {stunum} AND SUBCODE = {testcode}"
cursor.execute(sql)
if cursor.fetchone():
    print("์ด๋ฏธ ์ฑ„์ ํ•œ ์‹œํ—˜์ž…๋‹ˆ๋‹ค. ๋ฎ์–ด์“ฐ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (y/n)")

3. ๋‹ต์•ˆ ์ˆ˜์ • ๊ธฐ๋Šฅ

def modify_answer(question_num):
    print(f"ํ˜„์žฌ ๋‹ต: {proans[str(question_num)]}")
    new_answer = int(input("์ƒˆ๋กœ์šด ๋‹ต ์ž…๋ ฅ >>> "))
    proans[str(question_num)] = new_answer

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ

OperationalError: (2003, "Can't connect to MySQL server")

ํ•ด๊ฒฐ: MySQL ์„œ๋ฒ„ ์‹คํ–‰ ํ™•์ธ ๋ฐ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ™•์ธ

์ธ์ฝ”๋”ฉ ์˜ค๋ฅ˜

# UTF-8 ์„ค์ • ์ถ”๊ฐ€
conn = pymysql.connect(
    charset = 'utf8mb4',  # ์ด๋ชจ์ง€ ์ง€์›
    use_unicode = True
)

๋ผ์ด์„ ์Šค

ํ•˜์„ฑ๊ณ ๋“ฑํ•™๊ต ๋‚ด๋ถ€์šฉ์œผ๋กœ ์ œ์ž‘๋œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages