# data[].attributes.body
1. 프로그래밍과 파이썬의 정의

프로그램은 미리 작성된것으로 컴퓨터 프로그램은 컴퓨터가 무엇을 해야할지 미리 작성한 진행계획을 뜻한다. 그리고 이진 코드는 0과 1으로 이루어져 컴퓨터가 알아들을 수 있는 언어이고, 소스코드는 인간에게 쉬운 언어를 말한다. 그리고 파이썬은 프로그래밍 언어 중에서도 쉬운 언어에 속한다.

2. 파이썬을 실행할 때는 idle를 이용하는 방법도 있지만 나는 vscode를 이용하여 코드를 작성하고 Windows PowerShell로 실행하는 편으로 하기로 했다.

3. 그리고 파이썬에는 키워드, 식별자, 주석, 연산자, 자료 등이 있고 식별자를 구분할 때 스네이크케이스 혹은 캐멀 케이스 둘로 나뉜다.

4. 출력문인 print문을 맛만 보았다.

# data[].attributes.body
컴퓨터는 이진 숫자(01)로만 명령을 이해할 수 있으나, 사람이 010101로 코딩하기는 너무 어려움.... => 프로그래밍 언어(Programming Language, c와 python 등)를 통해 "코딩"함

이렇게 만든 파일을 소스 코드(SourceCode)라 부름.

왜 Python이어야 하는가??

1. 비전공자가 배우기 쉽다.

문법이 간단하기에 다른 언어들 보다 비교적 습득하기 쉬움

2. 다양한 분야에서 활용할 수 있다.

데스크톱, 애플리케이션, 웹 서버, 해킹 툴, IoT, 인공지능 등 많은 분야에서 이용 가능

3. 대부분의 운영체제에서 동일하게 사용된다.

운영체제가 제한적인 언어도 있는 반면, 파이썬은 대부분의 운영체제에서 동일한 사용 방법으로 이용할 수 있음

다만, c와 같은 언어보다 처리 속도가 느림.(약 10~350배)

고정적인 연산(머신러닝, 딥러닝)-> c언어가 유리!

그래도 일반적인 수준에서는 python이라도 아무런 문제가 없음.

python 설치 및 VS Code(텍스트 에디터)사용법

IDLE, Window PowerShell(코드 실행기)에서 파이썬 파일 실행하는 방법을 배움.

>>> print("Hello Python")
Hello Python

기본 구성요소-> 문장 -> 프로그램

#문장(statement) : 실행할 수 있는 최소 단위

#표현식(expression) : 어떠한 값을 만들어내는 코드(+, -등은 그 자체가 값이 될 수 없어서 표현식은 아님.)

#키워드(keyword) : 파이썬이 예약해놓은 단어들. 미리 정해진 것으로 이름을 정할 때 그들을 사용하면 안됨..

#식별자(identifier) : 이름을 붙일 때 사용하는 단어. 변수 이름, 함수 이름 등이 이에 해당함

**식별자 규칙**

키워드 사용 금지

특수문자는 언더 바(_)만 사용

숫자로 시작 x

공백 포함 x

식별자는 공백을 쓰는 대신 스네이크 케이스와 캐멀 케이스의 방법을 이용

언더 바로 단어와 단어 사이를 이으면 스네이크, 단어의 첫글자를 대문자로 써서 이으면 캐멀. (login_status, RotateAngle)

(파이썬에서는 첫글자가 소문자인 캐멀 케이스를 쓰지 않음. 예) printHello (X) | PrintHello (O) )

캐멀 케이스는 클래스를 지정할 때.

스네이크 케이스는 함수와 변수를 지정할 때.

주석(#): 뒤에 오는 글자는 기능을 수행하지 않음. Just 설명

연산자(Operater): +, -와 같은 연산의 기능을 수행

자료(Literal) : 숫자, 문자 등의 어떤 "값"

메세지를 출력하는 방법 "Print()"

>>> print("Hello Python Programming...!")
Hello Python Programming...!

여러 개 출력하기 <- 쉼표로 연결

>>> print(52, 273, "Hello")
52 273 Hello

줄 바꿈

>>> print()
        #<--안보이지만 공백이 있음. 한 줄을 그냥 빈 줄로 치우고 넘어가는 느낌

# data[].attributes.body
기초적인 프로그래밍과 파일 생성 및 파일에 저장 등을 배웠다 .

# data[].attributes.body
자주 할 수 있는 오류

1. 셸에서 실행했는데 반응이 없는 경우

프로그램 자체에서 오류 메시지를 띄우지 않고 다시 명령 프로토콜이 실행된다면 파일을 저장하지 않은 것이다.

2. python용어가 없다는 오류가 뜨는 경우

명령어를 실행한 폴더가 파이썬 파일이 있는 폴더가 맞는지 확인한다. 맞는데 실행이 안된다면 윈도우를 다시 실행한 후 python명령어를 실행한다. 그럼에도 똑같은 오류가 발생한다면 파이썬을 체크하지 않고 설치한 것이다. 이럴 땐 파이썬을 다시 설치해야 한다.

파이썬 키워드

False, None, True, and, as, assert, async, await, break, class, continue, def 등의 키워드가 존재하는데 이런 키워드를 알고 구분해야하는 이유는 사용자가 이름을 정할 때 키워드를 사용하면 안되기 때문이다.

# data[].attributes.body
학습 범위: 001~063

주요 내용:

• 프로젝트 만들기

• main 함수와 printf 함수

• 제어 문자 출력

• 정수와 실수 출력

아직 C언어에 대해 깊게 학습하지 않아서 별로 아는 것이 없지만 확실히 재미있다.

# data[].attributes.body
오늘 한 짓:

program의 정의를 알아보기,

VScode를 이용하여

python을 사용해보기,

print(), type() 함수를 사용해보기,

주석 달아보기,

"(큰 따옴표)와 '(작은 따옴표)를

사용하여 문자열을 지정해보기

# data[].attributes.body
비쥬얼 스튜디어를 활용해 프로젝트 생성과 소스 파일 작성하는법, 소스코드 작성하기 작성 한 코드의 에러를 디버깅 하고 수정하며 컴파일 한뒤 컴파일러에서 실행한 것과 동일한 창에 띄워 결과확인,출력함수:printf와“ ”를 활용한 문자열,\n인 제어문자를 활용해 정수와 실수의 출력까지 해봄

# data[].attributes.body
python 입문으로 다양한 에디터를 사용하였다.

처음 설치할 때 : 파이썬 인터렉티브 셸

그 이후는 파이썬 IDLE 에디터도 경험을 해봤음(별로 맞진 않음)

그 다음으로 비주얼 스튜디오 코드를 사용해봤음(잘 맞은 것 같음) 이후 수업도 이 에디터를 이용할 것 같다.

# data[].attributes.body
자료형을 알아야 하는 이유??

세포가 모여 사람을 이루듯 프로그램을 제작하려면 작은 자료형부터 차근차근 처리하며 큰 자료형을 만들어 나가야 한다.

자료형 확인하는 방법

type() <-- 파라미터의 자료형을 반환하는 함수

>>> print(type("안녕하세요"))
<class 'str'>

자료형의 종류

1.문자열(String)

"", '' 처럼 따옴표 2개로 묶어서 문자열을 표기함.

2.숫자

2-1. 정수형(Integer)

소수점이 없는 숫자

2-2. 실수형/부동 소수점(Floating point)

52.273 = 0.52273*(10^2)와 같이 소숫점이 둥둥 떠다니며 움직일 수 있다 하여 '부동 소수점' 이라고 함.

3. 부울 또는 불(Boolean)

True, False. 참과 거짓에 대한 정보를 나타내는 자료형

!! 숫자의 관점에서는 0과 0.0 둘다 0이지만, 자료형의 관점에서는 0은 정수형이고 0.0은 실수형이다. !!

<파이썬에서의 지수 표현>

0.52273e2와 같이 갑자기 문자가 나타나는 경우..

==0.52273* 10^2와 마찬가지로 10의 몇 제곱인지를 줄여 나타내는 표현이다.

연산자(Operator)

1. 사칙 연산자(+,-,*,/) : 가감승제. 기본적인 사칙연산에 이용되는 연산자

2. 정수 나누기 연산자(//) : 몫 연산자로 생각하면 편리하다.

>>> print("3 / 2 =", 3 / 2)
3 / 2 = 1.5
>>> print("3 // 2 =", 3 // 2)
3 // 2 = 1

소수점 이하 자리 수를 떼어버리고 정수 부분만 남기는 연산자.

3. 나머지 연산자(%)

A를 B로 나누었을 때의 나머지를 구하는 연산자.

>>> print("5 % 2 =", 5 % 2)
5 % 2 = 1

4. 제곱 연산자(**)

숫자를 제곱시켜주는 연산자

ex) 2의 4제곱 = 2**4

<연산자의 우선순위>

수학에서의 순서와 비슷함.

(덧셈보다 곱셈을 먼저 하는, 괄호를 제일 먼저 계산하는 등)

!! 문자열도 연산 순서는 동일 !!

TypeError

서로 다른 연산자를 연산할 때, TypeError를 반환한다. 디버깅 과정에서 오류를 확인하고 Number, String등의 함수로 타입 변환을 시켜 타입을 맞추어 주고 연산해야 한다.

# data[].attributes.body
input 문을 통해서 드디어 입력문을 할 수 있게 되었고

여러 연산자들을 배우게 되었다.

# data[].attributes.body
C언어 기초 프로그램을 깔고 기초적으로 할 수 있는 것들을 배웠다. 또한 기초적인 언어들을 실행시켜 어떻게 작동되고 보이는 것 까지 배웠다.

# data[].attributes.body
변수 지정 및 사용함

복합연산자는 깜박하고 못찍었음

# data[].attributes.body
학습 범위: 064~091

주요 내용:

지수 표기법

소수점 형태를 지수 형태로 바꾸기

10^-1을 e-1로 나타냄

예) 3.14^10-5를 지수 표기법으로 나타내면 3.14e-4

여러가지 변수

정수형 변수: int

실수형 변수: double

문자형 및 문자열 변수: char

이 외에도 float, long double 등이 있음

정리:

학습하면서 10진수의 숫자를 다른 진수로 나타내는게 재미있었다.

# data[].attributes.body
main 함수를 배웠다. C언어를 시작할 때 필요한 가장 기본적인 명령어이다. 이것으로 모든 C언어를 시작이 가능하다

# data[].attributes.body
혼공C 챕터 2

상수,정수,음수 등의 숫자를 표현하는 방식과

여러 함수 코드들의 활용 이후 10진법 8진법

16진법 이 각각 12 014 0xC와 같이 표현하는

숫자들이라는 것을 알게 되었다

# data[].attributes.body
문자열을 만들 때에는 문장 양 끝에 '또는 "를 붙여야 한다. 문자열을 두개 (예: ""hello"")같은 경우에는 오류가 뜨지만, 세 개를 쓰는 경우는 다르다. 세 개를 쓰면 여러 줄 문자열로, 줄바꿈을 원하는 문장에서 enter키만 누르면 된다. 줄바꿈을 할 수 있는 키는 \n 이라는 이스케이프 문자 이지만, """를 이용하면 \n과 다르게 어떤부분에서 줄바꿈을 해야하는 지 확인 할 필요가 없다. 그다음으로 문자열 연결 연산자를 사용해서 작성하였다. 위 사진에서 밑에 출력된 것이 바로 문자열 연결 연산자를 사용해 만든 코드의 결과이다. 나는 *만 사용하였지만 +,-,/도 사용이 가능하다. 그리고 문자 선택 연산자(인덱싱)을 사용 해 보았다. 대괄호를 쓰는 연산자인데, 첫번째 글자 부터 [0], [1],...로 사용한다. 음수로 사용하면 뒤에서 부터 선택할 수도 있다. 그 다음으로는 문자열의 길이를 구하는 함수를 사용해보았다. len() 을 사용하는데 괄호 안에 긴 글자를 넣어도 그 글자의 수를 잘 알려준다. 마지막으로 한 것은 계산이다. print함수에 계산식을 넣으면 답이 나온다. +,-,*,/,**(제곱)을 사용할 수 있다. 거기에 소수점 버림을 사용할 수 있는 //, 나머지를 알려주는 %가 있고, 혼합식에서 우리가 알고 있는 계산 순서(제곱 - 곱셈,나눗셈 - 덧셈,뺄셈)를 그대로 사용하기 때문에 계산이 수월하게 된다.

# data[].attributes.body
오늘은 문자열에 대해서 공부했다. 프로그래밍 언어에서는 글자들이 나열된 것을 문자열이라고 한다. 따옴표로 감싸 입력한 모든 것을 문자열이라고 생각하면 된다. 문자열은 큰 따옴표로 감쌀 수도 있고 작은따옴표로도 감쌀 수도 있다. 둘의 결과는 같다. print('"안녕하세요"라고 말했습니다')처럼 두 개의 따옴표를 섞을 수고 있다. 반대로 print("'배가 고픕니다'라고 생각했습니다")도 가능하다.문자열에 이스케이프(\)를 써서 나타낼 수도 있다. \"는 큰따옴표, \'는 작은따옴표를 의미한다.

# data[].attributes.headline
Chapter02 -자료형(3.변수와 입력~4.숫자와 문자열의 다양한 기능)

# data[].attributes.subject
Chapter02 -자료형(3.변수와 입력~4.숫자와 문자열의 다양한 기능)

# data[].attributes.body
<변수>

변수 : 값을 저장할 때 사용하는 식별자

상자의 이름과 함께 저장 공간을 생성하고 그 상자에 데이터를 집어넣는다는 아이디어.

>변수 선언 : 변수를 생성

>변수 참조 : 변수에 있는 값을 사용하는 것.

#예제
pi = 3.14159265

*파이썬의 변수는 기본적으로 "타입을 강제하지 않음"

//예시. C언어
int a = 1;
float b = 2.34;
int main() {}

자료형 규정에 있어 유연하지만, 어떤 자료형인지 알 수 없음에 따라 생기는 TypeError유발도 있음.(또 다른 특징= 끝에 세미콜론을 찍지 않음)

##(직접 해보는 손코딩) 원의 둘레와 넓이 구하기##
#변수 선언 및 할당
pi = 3.14159265
r = 10

#변수를 참조.
print("원주율 =", pi)
print("반지름 =", r)
print("원의 둘레 = ", 2 * pi * r) #원 둘레 공식
print("원의 넓이 =", pi * r * r) # 원 넓이 공식

<복합 대입 연산자>

연산 결과를 변수에 대입하는 연산자.

+= -> 숫자를 더하고 대입

-= -> 숫자를 빼고 대입

*= -> 숫자를 곱하고 대입

/= -> 숫자를 나누고 대입

%= -> 숫자의 나머지를 구하고 대입

**= ->숫자 제곱 후 대입

<사용자의 입력 : input()>

input("인사말을 입력하세요>") # <- 사용자로부터 값을 받은 뒤에 반환(return)함.

arg = input("인사말을 입력하세요>") # <- 받은 값을 변수로 저장한다. 변수의 선언만 한 것 같지만 동시에 input()함수의 실행이 일어난 것!

*input()함수로 받은 값들은 자료형 상 string타입(str)으로 저장된다.

<타입 변환 : cast >

input()함수로 받은 값을 대수적으로 연산하고 싶다면??

int(), float()함수를 통해 문자열을 int 자료형으로 변환시킬 수 있음

a = int("23")
b = float("0.45")
c = 4

print(a + c)
print(b + c)
>>> 27
>>> 4.45

<(예외 처리) ValueError 예외>

cast를 통해 자료형을 변환할 때, 변환할 수 없는 것을 변환하려 시도할 때 ValueError가 출력된다.

#문자를 숫자로 바꾸려 할 떄
int("안녕하세요!")
float("Hello World!")
#위 코드를 실행할 경우
#-> ValueError: invalid literal for int() with base 10: "안녕하세요!"

#부동 소수점을 정수로 바꾸려 할 때
int(52.273)
#->52
#?? 교재는 52.273을 문자열 취급해서 int로 cast할 시에 생기는 오류를 다룸. 실제 부동 소수점을 int로 변환하면 정수 부분만 반환함.

<format함수>

숫자를 문자열로 바꾸어 문장에 대입 시키는 함수.

#사용 예제
"{} {}".format(11, 63)
#문자열 뒤에 붙여서 사용, {}괄호 안에 순차적으로 값을 대입. 개수에는 제한 없으나! 괄호 세트랑 값은 짝을 이루어야 함.

#format함수의 다양한 활용

#정수만 출력
print("{:d}".format(52.32))
>>> 52 # d <- decimal, 10진수

#특정 칸에 출력 시키기
print("{:5}".foramt(52))
print"{:10d}".format(52.14))
>>>    52 #5칸 뒤에서 마무리 되도록 출력
>>>         52

#빈칸을 0으로 채우기
print("{:05}".format(52))
print("{:05d}".format(-52.67))
>>> 00052
>>> -0052

#기호 출력하기
print("{:+5d}".format(52))
>>>   +52
print("{: d}".format(52))
>>> 52 # 공백은 + 기호를 숨길 수 있음.
print("{: d}".format(-52))
>>> -52
print("{:=+5d}".format(52))
>>> +  52 #= 기호는 부호가 앞에 붙느냐 뒤에 붙느냐 차이.

#위 모든 과정에서 d를 f(floating point)로 바꾸면 부동 소수점에서도 같은 효과를 낼 수 있음
#소수점 아래 자릿수 지정하기
print("{:15.3f}".format(52.273))
>>>           52.273 #15칸을 총 공간으로 잡고 소숫점 3자리 출력
#소수점 제거
print("{:g}".format(52.0))
>>> 52

<f-문자열>

지금까지 위에 썼던 format함수를 더 간편하게 쓰는 방법.

->문자열 앞에 f를 붙이고 괄호 안에 연산할 식을 작성한다.

f"{3+1}"
>>> 4

<"".strip()함수>

strip : 문자열 양옆의 공백 제거

lstrip : 문자열 왼쪽의 공백 제거 #거의 사용X

rstrip : 문자열 오른쪽의 공백 제거 #거의 사용X

<"".isㅁㅁ() 함수>

is ㅁㅁ? <- 조건에 맞는지 판단하는 함수. bool타입으로 반환

ex) "23".isdecimal() -> true #정수 형태인지 판단하는 함수 isdecimal.

<"".find() 함수>

find : 왼쪽부터 찾아서 처음 등장하는 위치

rfind : 오른쪽부터 찾아서 처음 등장하는 위치

*가장 앞글자를 순서를 0이라고 봄

<in 연산자>

"A" in "B" 해당 문자열이 다른 문자열에 존재하는지 bool타입으로 반환.

<"".split("")>

특정 문자 기준으로 문자열을 잘라서 배열(list)로 반환

# data[].attributes.body
변수는 값을 지정할 때 사용하는 식별자이다. 수학자들이 3.14159265....라는 원주율 값을 '파이'라는 기호로 정의해서 사용하는 것과 비슷하다. 이를 파이썬에서는 pi라는 이름의 저장공간을 만든 후 내부의 값을 넣어놨다가 필요할 때 이를 호출하여 사용한다. 이때 'pi'를 변수라고 하며 숫자뿐만 아니라 모든 자료형을 저장할 수 있다. 변수 참조는 변수 안의 값을 사용하는 것을 의미한다. 여기서 'pi'를 활용할 때 주의할 것이 있다. 'pi'는 숫자형 자료이기 때문에 문자열과 연산하는 것은 오류가 난다.

변수를 활용할 때는 기존의 연산자와 조합해서 사용할 수 있는 연산자가 생기는데 이를 '복합 대입 연산자'라고 한다. ex) a+=10은 a=a+10이라는 것과 같은 결과를 낸다.

숫자의 경우

+=:숫자 덧셈 후 대입

-=:숫자 뺼셈 후 대입

*=:숫자 곱셈 후 대입

/=:숫자 나눗셈 후 대입

문자열의 경우

+=:문자열 연결 후 대입

*=:문자열 반복 후 대입

# data[].attributes.body
학습 범위: 091~107, 단원 05-01( if문 ) 일부

주요 내용:

const, 예약어와 식별자, 데이터 입력(scanf)

책에 있는 예문을 따라하여 관련 개념을 학습하였다. 책에 있는 예문을 따라하고 난 뒤에 코드를 조금 다르게 바꾸어 나만의 코드를 하나 만들었다. 중간에 코드에 있는 오류를 찾는데 시간을 많이 소비하였지만, 좋은 경험이었던 것 같다.

정리:

책에 있는 예문들을 변형하는 것이 재미있었다.

# data[].attributes.body
오늘 한 것 : 변수 설정, 변수 참조, 복합 대입 연산자, input()함수 사용, int()함수, float()함수 사용

변수 설정 방법 : (변수 = 값) 형태로 설정할 수 있다. 변수 참조는 단순히 변수 값을 사용하는 것이다. 위 사진에서 본인은 책 그대로 pi를 3.14159265로 변수를 설정하여 변수참조를 해보았다.

위 사진에서 12열부터는 복합대입 연산자인데, number변수를 100으로 설정하고 복합대입 연산자를 사용하였다. +=는 덧셈후 대입, -=는 뺄셈후 대입... 등으로 전 시간에 했던 모든 연산자를 사용할 수 있다. 16열까지는 숫자를 사용하는 복합대입연산자이고, 그 이후부터는 문자열 복합대입연산자 이다. 문자열에서는 string을 변수로 설정하여 인사를 더 강하게 !를 붙이도록 복합 대입 연산자를 사용하였다.

위 사진에는 없지만, input함수도 사용하였는데, 이 함수는 질문지를 만드는 것과 비슷하다. "인사말을 입력하세요"로 함수를 만들면, 대기열이 뜨는데, 여기서 "안녕하세요"라고 치면 그대로 말해준다. 이것을 활용하여 나는 "나이가 몇살입니까?"로 함수를 만들었고, 자료형함수인 type()함수를 사용하였다.

# data[].attributes.body
챕터 3-1

여러가지 변수 코드를 활용하여 코드를 짜 보았다.(char,short,int,long,) unsigned가 붙은 함수들도 포함하여 문자열을 작성하고 빌드를 확인하여 컴파일까지 하는 작업을 완료하였다

# data[].attributes.body
파이썬은 명령 프롬포트에서 사용자로부터 데이터를 입력받을 때 input()함수를 사용합니다. input함수 괄호 안에 입력한 내용을 프롬포트 문자열이라고 하며, 사용자에게 입력을 요구하는 안내 내용을 의미한다. 프로그램이 실행 도중에 잠시 멈추는 것을 블록이라고 한다. input()한수가 사용자에게 자료 입력을 요구하면서 코드진행을 블록하고 있는 것이다.

자료형을 알아볼 때는 type()함수를 사용한다.

input()함수는 사용자가 무엇을 입력하도 결과는 무조건 문자열 자료형이다. input()함수의 입력 자료형은 항상 문자열이기 때문에 입력받은 문자열을 숫자로 변환해야 숫자연산에 활용할 수 있는데 영어로 캐스트(cast)라고 한다.

int()함수: 문자열을 자료형으로 변환한다. int는 정수형을 의미한다.

float()함수: 문자열을 float자료형으로 변환한다. float는 실수형 또는 부동 소수점을 의미한다.

# data[].attributes.body
저는 알고리즘 중 핵심이 되는 정렬알고리즘을 공부하고 각 정렬 알고리즘마다 원리를 분석하고 이를 파이썬으로 구현할 수 있는 방식에 대해서 생각해보고 구현해는 활동을 하고 이것으로 이진 탐색이라는 매우 효과적인 탐색 알고리즘으로 방대한 숫자 속 원하는 숫자를 선정하는 알고리즘을 만들려고 함

# data[].attributes.body
PyQt(gui module), (+가능하다면 MySQL까지) 이용해서 로그인 창을 만들고, 해킹 시도 방어 기능 구현하기

PyQt로 로그인 창 제작. 데이터베이스와 연결해서 실제 로그인 기능을 구현

비밀번호 5번 이상 틀리면 60초 동안 입력 창 잠금상태로 변경, 2회 실패부터 자동입력 방지 문자 출력.(captcha lib)

https://happylie.tistory.com/191

recaptcha 기능은 pillow lib을 사용. 텍스트를 그림으로 그릴 수 있음.(회전, 크기, 노이즈 등을 더해서 ai가 이해하기 어렵도록 함)

# data[].attributes.body
주원 민준 시원 성준과 같이 c언어를 활용해서 만들 주제를 정하고 임시로 만들어보았다. 주제는 퀴즈를 만들어 점수가 올라가는 방식으로 주제를 정하였고 임시로 만들어본 결과 틀이 대충 잡혔다.

# data[].attributes.body
프로젝트 주제를 c언어를 활용한 주제를 선정하여 그 주제에 맞는 문제를 제시하고 맞춤으로써 점수를 쌓아가는 퀴즈게임을 만들 설계를 하였다. 20

# data[].attributes.headline
3717 전우찬 주제선정

# data[].attributes.subject
3717 전우찬 주제선정

# data[].attributes.body
주제: 생활습관 데이터 분석 웹페이지

사용자가 자신의 수면 시간, 공부 시간, 휴식 시간 등을 입력하면, 해당 데이터를 분석해 그래프와 피드백을 제공하는 웹페이지를 만드려고 함

# data[].attributes.body
주제: 앱 만들기(어떤 앱을 만들지는 아직 정하지 않았음)

# data[].attributes.body
오늘은 파이썬 실행이 제대로 안되서 사실 한 게 없습니다. 안타깝네요.

# data[].attributes.body
버블 정렬과 병합 정렬에 대해서 공부를 한 후 구현을 하려고 했다. 인터넷에 있는 코드들을 보고 베끼는 것은 공부에 의미가 없다고 생각해서 ai가 대화를 하면서 원리가 무엇인지 어떻게 구현할 수 있는지 물어보며 스스로 생각해서 코드를 작성하려고 노력을 했다. 버블 정렬은 생각보다 간단하여서 스스로 생각하기에 굉장히 힘들진 않았는데 병합정렬부터 리스트를 분할 하고 병합하는 과정을 구현을 하는 과정 속에서 어떻게 해야 할지 감이 안와서 굉장히 난감했었다. 그래서 버블 정렬을 완성을 했지만 병합정렬을 다음 날에 완성을 해보려고 한다.

# data[].attributes.body
PyQt5를 통해 로그인 창을 구현하였다.

우리 학교 노트북 userName이 "북고"로 되어있는데, 대개 프로그램에서는 한글 directory를 처리하지 못하는 경우가 많아 기존의 py3.13을 지우고 c드라이브 최상위 폴더에 옮겼다.

ctypes모듈로 c언어 라이브러리에 접근해 윈도우 사용자의 창 크기를 받아온 후 1280 720 해상도의 로그인 창을 모니터 정가운데 출력한다.

import ctypes

def get_screen_resolution():
    user32 = ctypes.windll.user32
    user32.SetProcessDPIAware()
    screen_width = user32.GetSystemMetrics(0)
    screen_height = user32.GetSystemMetrics(1)
    return screen_width, screen_height

width, height = get_screen_resolution()
print(width, height)

pageWidth, pageHeight = 1280, 720

물론 user32로 창 크기 구하는 것과 로그인 창 구현을 위한 기본 틀은 조촐한 코딩 지식을 가진 본인으로서는 밑바닥 부터 만들기는 힘들었기에 사이트에서 찾은 후 일부 떼어왔다.

#QLineEdit() :: label that enter the single line text
    #QLineEdit().setEchoMode(enum) :: 입력값의 출력 상태 설정
    #enum List
    #QLineEdit.Normal = 0 :: 입력된 문자를 표시합니다. (기본값)
    #QLineEdit.NoEcho = 1 :: 문자열을 표시하지 않습니다. 이 설정은 비밀번호의 글자수도 공개하지 않을 때 유용합니다.
    #QLineEdit.Password = 2 :: 입력된 문자 대신 비밀번호 가림용 문자를 표시합니다.
    #QLineEdit.PasswordEchoOnEdit = 3 :: 입력할 때만 문자를 표시하고, 수정 중에는 다른 문자를 표시합니다.
 def initUI(self):

        self.title_label = QLabel("::Compudent::")
        self.title_label.setFixedSize(500, 100)
        self.title_label.setFont(QtGui.QFont("궁서",20))

        #Id input label
        self.id_label = QLabel("Id:")
        self.id_input = QLineEdit()
        self.id_label.setFixedSize(50, 20)
        self.id_input.setFixedSize(300, 50)
.
.
.

아이디 및 비밀번호를 받아서 처리하는 것이 로그인 창의 핵심 기능이므로 관련된 기능을 하는 PyQt method를 주석으로 정리했다.

class LoginPage(QWidget):
.
.
.
class MainPage(QWidget):
.
.
.

실질적인 로그인 창. 즉 입력값을 받는 부분은 LoginPage, 로그인 성공 후 접속되는 본 페이지는 MainPage로 나눴다.

::Task::

1) 로그인 직후 입력 받았던 Id Password데이터를 초기화 하지 않아 로그아웃 후 LoginPage로 돌아갔을 때 데이터가 그대로 남아있음<-을 해결하기 위해 로그인 성공 시 임의로 data =""와 같이 공백으로 덮어씌우게 했는데 방법이 옳지 않아 터미널에 에러가 출력되고 강제종료 된다. 데이터 남는게 편의적이라고 생각은 되나 의도했던 기능은 아니라서 아이디만 남기는 쪽으로 수정할 것이다.

2) 인터렉티브한 창 구현을 위해 유저가 임의로 창 크기를 조절해도 폰트 사이즈와 입력창 크기 등이 변하면서 작아진 크기에 맞춰지도록(본래의 비율을 유지하도록) 만들,,,,,고 싶은데 유저의 창 사이즈 조절 이벤트를 감지할 수 있는 기능이 있는지, 그에 맞추어 실시간으로 위젯 정보를 수정할 수 있는지 더 알아볼 필요가 있다.

# data[].attributes.attachment_link.readable_text
import sys
import ctypes
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox, QApplication
from PyQt5.QtCore import *
from PyQt5 import QtGui


def get_screen_resolution():
    user32 = ctypes.windll.user32
    user32.SetProcessDPIAware()  
    screen_width = user32.GetSystemMetrics(0) 
    screen_height = user32.GetSystemMetrics(1)  
    return screen_width, screen_height

width, height = get_screen_resolution()
print(width, height)

pageWidth, pageHeight = 1280, 720

class LoginPage(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('Compudent Login')
        self.setGeometry(int((width-pageWidth)/2), int((height-pageHeight)/2), pageWidth, pageHeight)
        self.main_window = None  # MainWindow ��������� ��������� ������

        self.initUI()


    #QLineEdit() :: label that enter the single line text
    #QLineEdit().setEchoMode(enum) :: ������������ ������ ������ ������
    #enum List
    #QLineEdit.Normal = 0 :: ��������� ��������� ���������������. (���������)
    #QLineEdit.NoEcho = 1 :: ������������ ������������ ������������. ��� ��������� ��������������� ������������ ������������ ������ ��� ���������������.
    #QLineEdit.Password = 2 :: ��������� ������ ������ ������������ ��������� ��������� ���������������.
    #QLineEdit.PasswordEchoOnEdit = 3 :: ��������� ������ ��������� ������������, ������ ��������� ������ ��������� ���������������.
    def initUI(self):

        self.title_label = QLabel("::Compudent::")
        self.title_label.setFixedSize(500, 100)
        self.title_label.setFont(QtGui.QFont("������",20))

        #Id input label
        self.id_label = QLabel("Id:")
        self.id_input = QLineEdit()
        self.id_label.setFixedSize(50, 20)
        self.id_input.setFixedSize(300, 50)

        #Password input label
        self.pw_label = QLabel("Password:")
        self.pw_input = QLineEdit()
        self.pw_input.setEchoMode(QLineEdit.PasswordEchoOnEdit)
 
        #attempt to login button
        self.login_button = QPushButton("Login")
        self.login_button.clicked.connect(self.login_clicked)
 
        #apper
        layout = QVBoxLayout()
        layout.addWidget(self.title_label)
        layout.addWidget(self.id_label)
        layout.addWidget(self.id_input)
        layout.addWidget(self.pw_label)
        layout.addWidget(self.pw_input)
        layout.addWidget(self.login_button)
        layout.addStretch(1)
 
        self.setLayout(layout)

    #When user clicked the login button
    def login_clicked(self):
        user_id = self.id_input.text()
        password = self.pw_input.text()
 

        if user_id == "test" and password == "password":
            QMessageBox.information(self, "Login Success!", "Successful to login.")
            self.id_input = ""
            self.password_input = ""
            self.open_main_window()
        else:
            QMessageBox.warning(self, "Login Failure.", "Id or Password does not match.")
 
    def open_main_window(self):
        self.main_window = MainPage(self)  # Pass LoginWindow instance to MainWindow
        self.main_window.show()
        self.close()

##MainPage
class MainPage(QWidget):
    def __init__(self, login_window):
        super().__init__()
        self.setWindowTitle("Welcome! Compudent.")
        self.setGeometry(100, 100, 400, 300)
        self.login_window = login_window  # Store the LoginWindow instance
 
        self.initUI()
 
    def initUI(self):
        self.welcome_label = QLabel("We Are Compudent.")
        self.logout_button = QPushButton("Logout")
        self.logout_button.clicked.connect(self.logout_clicked)
 
        layout = QVBoxLayout()
        layout.addWidget(self.welcome_label)
        layout.addWidget(self.logout_button)
        layout.addStretch(1)
 
        self.setLayout(layout)
    
    #QMessageBox :: ��������������� ��������� ��������������� ��������� ��������� ��� ��� ������ ������������ ������
    #QMessageBox(class,title,message,ButtonList,defaultReply)
    #
    def logout_clicked(self):
        reply = QMessageBox.question(self, 'Logout', 'Would you like to log out?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
 
        if reply == QMessageBox.Yes:
            self.login_window.show()  # Show the LoginWindow again
            self.close()
 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    login_window = LoginPage()
    login_window.show()
    sys.exit(app.exec_())

# data[].attributes.body
앱 개발을 위해 Flutter, Android Studio 이용을 결정함

오늘은 개발 환경을 구성함

# data[].attributes.body
퀴즈게임을 만들기 위해 코드 빌드의 여러가지 틀을 ai의 도움을 받아 제작해보았고 아직 미정이지만 비주얼 스튜디오 이외의 엔진을 사용할 가능성도 생각해보았다.

# data[].attributes.body
Grid layout을 통해 라벨과 인풋을 행렬로 정리했다. 비밀번호 입력칸에서 enter를 누르는 것 만으로도 로그인 시도가 가능하며, 오른쪽의 눈 버튼으로 비밀번호 보이기/숨기기가 가능하다.

이전에 문제로 삼았던 로그인 성공시 id pw 데이터 초기화는 setText 메소드를 통해 구현했다. 인터렉티브 시스템도 구현하고 싶었으나 폰트 이외에 모든 요소에 대해 resize할 방법을 찾지 못해서 포기했다.

비밀번호 5회 입력 실패시 경고레벨 1로 상승하고 10초동안 입력잠금이 실행된다. 이후로 틀릴 때마다 경고레벨이 1씩 상승하고(최대4) 경고레벨마다 입력잠금의 지속시간이 달라진다.

# data[].attributes.body
데이터를 출력할 때는 printf 함수를 사용한다는 것을 알게되었고 printf 함수를 사용한 문자열 출력하는 코드 응용도 배웠다. ( 문자열을 출력하는 방법).

# data[].attributes.body
변수에 대해서 알아보았다. 변수에 대한 개념을 알게 되었고( 변수는 데이터를 저장하는 공간. )

변수 선언 방법에 대해 알게 되었다.

# data[].attributes.body
프로그램은 일의 순서를 나열한 것

C언어의장점

1. 시스템 프로그래밍 가능

2. 이식성을 갖춘 프로그램을 만들 수 있다

3. 함수를 사용해 개별 프로그래밍이 가능하다

소스파일을 만들고 그것을 컴파일 해야지 컴퓨터가 이해할 수 있는 기계어로 바뀜

디버깅은 에러 수정

#include <stdlib.h>

#incldue는지정한 파일을 추가하는 지시자

#system(“pause”);

system은 시스템 명령을 수행하는 함수

# data[].attributes.body
상수는 그 값을 바꿀 수 없으며, 10은 정수 상수, 10.0은 실수 상수, 'a'는 문자 상수, "a"는 문자열 상수라는 것을 알게 되었다.

정수 상수의 양수는 4바이트 크기의 2진수로, 음수는 2의 보수로 컴파일 된다

실수는 IEEE 754 표준의 double 형식에 따라 번역되며, 첫 비트는 부호 비트, 이후 11개 비트는 지수부, 나머지 52비트는 소수부를 나타낸다.

궁극적으로 C프로그램의 구조를 살펴볼 수 있었으며 C프로그램에서 값을 표현하는 방법과 결과를 화면에 출력하는 방법을 살펴볼 수 있었다. 그리고 컴퓨터 내부에 값이 저장되는 방식을 알 수 있었다.

# data[].attributes.body
키보드로 데이터를 입력할 때는 scanf 함수를 사용하며 변수 앞에 &를 사용한다.

둘 이상의 데이터를 입력할 때는 (스페이스바), (탭), (엔터)로 각 데이터를 구분한다.

문자열 입력은 char 배열을 이용하며 배열명 앞에 &를 사용하지 않는다.

키보드로 값을 입력 받는 방법을 알 수 있었다. 입력받은 값을 저장할 메모리 공간을 변수 선언으로 확보하는 방법을 배울 수 있었다.

효율적인 데이터 처리를 위해 필요한 다양한 변수의 형태와 특징을 이해할 수 있었다.

# data[].attributes.body
모둠원을 구성하여 팀으로 프로젝트를 진행하기로 하였고, 퀴즈게임을 간단하게 만들어보는 것을 주제로 선정하였고, 이에 대한 배경조사를 하였다.

# data[].attributes.body
c언어에서 상수를 사용해 데이터를 표현하는 방법이 있는데 이것을 오늘 알아보고 표현해보는 것 까지 하였다. 또한 printf 함수를 사용해 실수를 지수형태로 출력하는 것까지 알게 되었다.

이것을 하면서 오류가 많이 발생하였는데, 오류가 어디서 일어나는지 찾아보고 고치는 것 까지 해보았다.

# data[].attributes.body
챗gpt를 사용해 임시 퀴즈를 받아 이것을 고치며 우리만의 퀴즈를 만들기 시작했다. 챗gpt에게 처음 받았을 때는 퀴즈를 한문제 밖에 안풀었는데 3문제가 다 나온다거나, 글씨 정렬이 안되어 있었는데, 이것을 고치고 글씨 정렬도 하였다. 또한 배경 색이 마음에 들지 않아 바꿔보기도 하였다. 글씨 색깔도 바꿔보고, 퀴즈 내용을 바꿔보기도 하는 등 많은 시도를 하였다.

# data[].attributes.body
파이썬으로 웹을 만들때 쓸 좋은 프레임워크로 Flask, Django등이 있었는데 우선 Flask로 먼저 해보고 어렵다 느끼면 Django로 바꾸려고 계획하였다. 그리고 틀을 잡기 위해 큰 폴더 하나를 만들고 그 속에 static, templates, app 폴더를 만들었다.(이때 app폴더는 .py를 붙여 파이썬 폴더로 만듦) 여기서 static폴더에는 내가 만든 웹의 결과들이 나오고, templates폴더에는 웹의 틀(저는 html로 했습니다)2개를 만들었다. index와 result 인데, 각각 입력화면, 결과화면으로 나타낼 것이다.(https://youtu.be/rgI930gqdaY?si=rPJkLr_bOHmC2BOp) 이 영상을 통해 index와 result의 html코드를 만들었고, result부분의 결과를 그래프로 표현하는 이미지를 넣는 작업은 (https://m.blog.naver.com/s199977/223580154619) 위 블로그에서 알아왔다. 이로써 프로젝트 첫날 마무리를 하였다.

# data[].attributes.body
저번 시간에 기본적인 틀을 모두 만들었으니 오늘은 그 속에 넣을 핵심인 파이썬 코드를 작성하였다. 우선 Flask와 연결시키기 위해 책과 자료를 찾아서 코드를 알아냈고, (https://miki3079.tistory.com/104 | 교제에서는 429~) 이를 토대로 내가 하고자하는 프로젝트의 파이썬코드를 작성하였다. 혼공파 교재 121~124쪽을 참고하여 잠, 공부, 휴식에 적은 값을 폼에서 읽어와서 숫자로 바꿔 변수에 저장하는, 즉 정수형으로 변환하는 int()함수를 사용하였다. 그리고 그래프에 표시될 이름들과 값들을 리스트로 짧게 만들어두고 static파일에 저장되는 코드를 적었다. 마무리로 피드백 칸을 만들었는데, 프로젝트의 목적은 프로그램을 만드는 것에 초점을 맞추었기 때문에 간단하게 적어두었다. 그리고 result 페이지로 넘어가도록 마무리 코드를 적어주면서 완성을 하였다. 작업을 하면서 중간중간 claude라는 ai에게 중간점검을 받으면서 부족한 부분을 채우고, 교재을 참고하여 직접 코드를 작성하면서 코딩에 대해 즐거움을 느끼게 되었다.

# data[].attributes.body
C 언어로 콘솔 기반 퀴즈 프로그램을 구현하며 텍스트 색상 변경, 중앙 정렬, 플랫폼별 조건 처리(#ifdef) 등 콘솔 출력 제어 기술을 학습했다. 또한 scanf를 통한 사용자 입력, 함수 분리 구조를 통해 가독성과 재사용성을 높였고, 문제를 순차적으로 출력하여 사용자 경험을 개선하는 방법도 익혔다. 이를 통해 실용적인 C 프로그래밍 기법을 종합적으로 이해할 수 있었다.

# data[].attributes.body
countdown() 함수에서는 플랫폼별로 Sleep()과 sleep()을 구분하여 사용하며, 출력 타이밍을 조절하는 법과 ANSI 색 코드를 활용한 콘솔 메시지 꾸미기를 학습했다. ask_question() 함수에서는 매개변수를 활용한 문제 출력, 사용자 입력 처리(scanf_s), 조건문을 통한 정답 판별 로직 구현 등 함수 설계와 입력-출력 흐름 제어의 기본 원리를 익혔다. 이를 통해 사용자 상호작용 중심의 콘솔 애플리케이션 구조를 효과적으로 구성하는 방법을 배웠다.

# data[].attributes.headline
4차 발표 주제 정하기

# data[].attributes.subject
4차 발표 주제 정하기

# data[].attributes.body
우리 조 ( 시원 주원 민준 성준 ) 는 ai 챗봇을 활용하여 간단한 OX 문제 만들기 .

# data[].attributes.body
우리가 기존에 사용하는 계산기는 사칙연산 외에는 계산이 안되지만 공학용 계산기는 sin, cos, 제곱근, 루트 등을 계산할 수 있는 계산기를 말한다. 공학용 계산기는 일반 계산기 만드는 과정에서 sin, cos 등을 추가로 집어넣어서 만들 수 있다. 공학과를 가면 공학용 계산기를 많이 사용할 것인데 공학용 계산기가 어떻게 만들어 지는지 궁금하여 만들어 보려고 한다.

# data[].attributes.body
기본 틀 : html -> 작년에 잠깐 배웠던 개념을 바탕으로 간단하게 적용시켜 위와 같은 글씨, 입력창 등이 나오도록 함.

# data[].attributes.body
사용한 도구는 Flask와 matplotlib.pyplot을 사용하였습니다. Flask는 웹 페이지를 만드는 도구로, matplotlib은 원형그래프를 그릴 때 사용하였습니다. 6,7,8 문장에서는 위 영상의 첫 화면인 수면,공부, 휴식시간을 적을 때의 코드로, 나의 폴더에 있는 index파일을 꺼내겠다라는 뜻으로 보시면 됩니다. 다음 문단은 결과 페이지에 대한 코드로 이전 페이지에서 적은 값을 폼에서 읽어와서 숫자변수로 저장합니다. 그 밑에 labels와 values는 그래프에 표시될 이름들과 앞서 적은 값들을 리스트로 만들어두고, 19~22문장의 코드에서 순서대로 설명하면 새로운 그림을 만들기 위해 figure명령어를 사용하였습니다. 그리고 원형그래프를 그리기 위해 pie로 원형그래프를 만들어주고, savefig로 static폴더에 (static/piechart.png)라는 이름으로 저장해 둡니다. 마지막 문장은 마무리 표시라고 생각하시면 되겠습니다. 그 아래는 피드백 코드인데, IF절을 사용해서 각각 6시간 미만, 3시간 미만, 6시간 초과일 때 피드백이 쓰여지게 됩니다. 제가 이 프로그램을 만든 목적은 파이썬을 통해 유용하게 쓸 만한 것을 실패하더라도 간단하게 만들어 보려는 것이었습니다. 다행히도 교재, 자료등을 잘 이용해서 잘 작동하는 모습을 보여줬지만, 이 홈페이지가 개인으로만 열리기 때문에 다른사람들의 휴대폰, 노트북 등에서 사용하지 못한다는 단점이 있습니다. 소감으로는 짧지만 혼자서 공부한 파이썬 언어를 통해 내가 하나의 웹프로그램을 만들 수 있어서 좋은 경험이 되었다고 생각하고 앞으로도 여러 언어들을 배우면서 사람들에게 유용한 프로그램을 만들어보고싶다는 생각이 들었습니다.

# data[].attributes.body
오늘 워드 자료가 부실한 거 같아서 보고서를 간단하게 만들어봤습니다. 오늘 급하게 만들어서 내용의 질이 떨어질 수 있습니다.

# data[].attributes.headline
발표 내용 정리 및 소감

# data[].attributes.subject
발표 내용 정리 및 소감

# data[].attributes.body
로그인 시스템을 python gui로 구성해보았다.

(PyQt, Captcha 라이브러리가 사용되었다.)

로그인에 대한 무제한적 시도를 제한하지 않을 경우 해커는 프로그램을 이용하여 수천 수만번의 시도 끝에 계정을 탈취 할 수 있게 된다. 따라서 현존하는 로그인 시스템은 연속 입력 방지 시스템을 가지고 있는데, 그것을 구현해 보았다.

로그인을 5회 이상 실패하면 대기 시간이 생기고, 대기 시간이 끝나고 다시 로그인을 시도할 때는 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart,완전 자동화된 사람과 컴퓨터 판별. wikipedia)를 해결해야 한다. 컴퓨터가 인식하기 힘든 문자 그림을 출력해 자동입력을 방지하는 기능이다.(4자리의 글자를 임의로 생성한 후 그림으로 변환했다.-Captcha.image)

로그인 시스템의 편리를 위해 로그인 버튼 클릭이 아니라 엔터키로 입력 및 비밀번호 가리개 시스템을 추가했다.

결과)

로그인 페이지에서 메인 페이지로 넘어가는 로그인 시스템을 구현했고, 적절한 수준의 자동입력 방지 기능을 구축했다.

소감)

실제 로그인 데이터를 저장하는 SQL 데이터베이스와 Python웹 라이브러리인 Django를 사용하여 더 실제에 가까운 로그인 시스템을 만들고 싶었지만,, 능력과 시간이 부족해서 아쉽고, 다만 동아리 시간 동안 기초를 다지고 아이디어를 구상해서 소중한 프로젝트를 만들어본 경험, 다른 친구들이 열심히 연구해서 만든 프로젝트를 감상하며 자극을 받은 경험은 지금의 나는 물론 미래의 나에게도 큰 영향을 줄 것 같다.

# data[].attributes.attachment_link.title
PyQt5로 구현한 로그인 시스템

# data[].attributes.body
Python 3.13환경에서 개발.

module_captcha는

https://github.com/happylie/python-example-code/blob/main/captcha_sample/ex_captcha_image.py

해당 링크에서 주워옴

# data[].attributes.body
버블 정렬은 오른쪽에 있는 요소와 비교하면서 정렬에 맞게 스왑하는 알고리즘입니다.def bubble 이 버블 정렬 코드입니다. for 문을 사용해서 반복을 할 수 있고 리스트끼리 교환할 수 있는 코드를 짰다.

# data[].attributes.body
병합정렬은 리스트들을 분할한 후 순서대로 병합을 시키면서 정렬하는 알고리즘이다. 재귀적 함수를 사용해서 만들었고, def merge_sort는 분할 하는 함수를 def merge는 병합을 해서 정렬하는 알고리즘을 만들었다.

# data[].attributes.headline
퀴즈게임 만들기 마무리 3304김시원

# data[].attributes.subject
퀴즈게임 만들기 마무리 3304김시원

# data[].attributes.body
퀴즈게임을 만들기 위해 순차적으로 먼저 #include <stdio.h>로 헤더파일을 정하고 메인 함수를 설정 한뒤

Prinf와 문자열을 활동하여 퀴즈의 문제라 뜰 수 있게 printf (“문제”)와 같은 식으로 구성하였고 사용자로부터 입력을 받아 이행하는scanf 함수를 통해 사용자의 입력을 받아 문자를 저장하는 자료형 함수인 char함수로 사용자의 답변과 문제,답변을 저장하여두고 const함수로답이나 질문이 변형되지 않게 고정시켜 최대한 오류가 나지 않고 원활하게 진행되도록 하였고 비주얼적 요소를 위해 define red “\033[31m”과 같이 문자열에 생각을 추가해보기도 하며 퀴즈게임을 만들어 보았다