본문 바로가기

cs50 기초강의

2. C언어 - 자료형, 형식 지정자, 연산자

● data type

 

C 에서는 string 과 int 외에도 다양한 데이터 타입을 가지고 있다.

 

bool : 참 / 거짓

char : 딱 한개의 문자를 나타냄 ( y, n 등)

string : "  " 안에 들어가는 한개 이상의 문자들, 보통 char 보다 큼.

int : 정수, 일반적으로 특정 크기를 가진다. 정해진 수까지만 셀 수 있다 약 40억 정도

long : int 보다 더 많은 비트를 사용하기에 더 높은 수까지 셀 수 있음.

float : 부동 소수점을 갖는 실수

double : 부동소수점 뒤에 더 많은 숫자를 가질 수 있는 실수

 

● get 함수

 

또한 cs50 library 내의 get 함수들이 제공된다.

get_char

get_string

get_int

get_long

get_float

get_double

 

위 get 함수들은 각 데이터 타입을 입력값으로 받을 수 있는 함수를 의미한다.

이들은 모두 사용자에게 특정 값을 물어보고 그들이 입력한 값을 사용할 수 있도록 해준다. 또한 올바른 값을 입력하도록 강제한다. 올바르지 않은 값을 입력했을 경우에 올바른 값을 입력하도록 강제한다는 의미이다.

 

● 형식 지정자

 

%c  : char

%s  : string

%i  : int

%li  : long

%f  : float,  double

 

각 데이터 타입마다 사용되는 형식 지정자이다.

 

● 기타 연산자 및 주석

 

+  : 더하기

-  : 빼기

*  : 곱하기

/  : 나누기

%  : 나머지 연산자

&&  : 그리고

∥  : 또는

// : 주석

/*  */ : 문단 주석

 

● 정수와 실수를 받아 출력하는 예제

 

get_int 함수를 사용해서 사용자에게 정수를 입력받는 코드를 짜보자.

 

위 코드는 사용자의 나이를 입력받아 age 라는 변수에 저장한 뒤 그 나이를 일수로 변환하여 출력해주는 코드를 나타낸다.

 

int age = get_int("what is your age?\n"); 를 살펴보자.

get_int 함수를 통해 정수 값을 받아온다.

what is your age\n 은 사용자에게 보일 프롬프트로써 \n 덕분에 줄바꿈이 나타난다.

이를 통해 사용자가 값을 입력하면 

그 값은 get_int 함수로 반환되고 할당 연산자 = 를 통해서 age 라는 변수에 저장된다.

그리고 age 변수의 종류는 받는 값이 정수이기 때문에 int 가 되는 구조이다.

 

printf("your ages in day is approximately %i days.\n", age * 365); 를 살펴보자

your ages in day is approximately 를 출력하고

받아올 값이 정수 이기 때문에 형식 지정자인 %i 를 사용해준 것이다.

그리고 , 와 age * 365 를 넣음으로써 형식 지정자에 반환될 값이 되는 변수를 적어주는 것이다.

여기에선 나이를 일수로 변환하기 위해 age 에 365를 곱한 것이다.

 

위 코드를 컴파일 하고 실행하면 잘 작동하는 것을 확인할 수 있다.

 

이를 좀 더 다르게 짠 코드를 살펴보자

 

따로 변수를 설정하지 않고 위와 같은 값이 나오도록 하는 것이다.

 

printf("your ages in day is approximately %i days.\n", get_int("what is your age?\n") * 365);

 

라고 표현하는 것이다.

위 표현은 한 함수의 출력을 다른 함수의 입력으로 넣어서 변수를 굳이 만들지 않은 코드이다.

 

여기서 우리는 선택을 해야한다.

 

둘다 결과도 같고 좋은 코드이긴 하지만, 두번째 코드는 너무 길어서 가독성이 떨어진다.

즉 코드를 짜는 데에 있어 디자인적인 측면에서 1번째 코드가 더 좋은 것이다.

 

물론 사람마다 차이는 있겠지만, 왼쪽에서 오른쪽으로 가는 코드 보다는 위에서 아래로 가는 코드가 일반적으로 더 좋은 코드라고 인식할 수 있다.

 

 

이번에는 get_float 를 사용하여 실수를 입력받는 코드를 짜보자.

float price = get_float("what's the price?\n"); 은

get_float 함수를 이용하여 사용자에게 가격을 물어보고 그 가격을 받는 변수 price를 사용한 것이다. 이때 가격을 int 가 아닌 float 로 지정한 이유는 가격에 소수점이 있을 수 있기 때문이다.

 

printf("total price is %.2f.\n", price * 1.0625); 은

가격에 세율이 6.25% 라고 가정하고 계산한 가격을 의미한다. 이때 형식지정자를 보면 %f 를 사용하고 있다. price 변수가 float 값을 갖기 때문에 %f 를 사용한 것이다. 이처럼 상황에 따라 알맞은 형식 지정자를 사용해 줘야한다. 그리고 자세히 보면 형식지정자에 %.2f 라고 쓰여있는 것을 확인할 수 있다. 이것은 float 가 소수점을 갖을 수 있기 때문에 그 소수점 뒤 자리수를 조절하기 위해 사용한 것이다. 따라서 컴파일한 뒤 실행하고 가격을 100으로 지정했을 때 106.25 처럼 소수점 2자리 까지 나오게 한 것이다.

만약 %f 만 사용했다면 106.250000 이 출력됐을 것이다. 이는 컴퓨터가 특정 수의 비트를 사용해서 숫자를 저장하고 그 비트를 활용하면 이만큼의 숫자를 소수점 뒤에 나타낼 수 있기 때문이다. 이것을 방지하기 위해 %.2f 라고 지정하여 소수점 뒤 숫자를 제어한다.

이것이 printf 의 f 를 의미한다. 뭔가를 화면에 출력할 때 이런식으로 형식화할 수 있는 것이다.

 

 

이번엔 수가 짝수인지 홀수인지 알려주는 프로그램을 만들어보자.

우선 get_int 함수를 통해서 사용자에게 수 하나를 받아 int n 변수에 저장한다.

그리고 이때 수학적인 계산을 활용하여 if 문을 적어야 한다.

짝수와 홀수를 판별하기 위해서 활용할 수 있는 것은 나머지이다. 2로 나눴을 때 나머지가 0이나 1이냐로 나누는 것이다.

따라서 if 문의 조건을 n % 2 == 0 과 n % 2 == 1 로 할 수 있지만 어짜피 정수만을 가지고 진행되기 때문에 n % 2== 1은 else 로 간단히 나눌 수 있다.

 

 

만약에 아래와 같은 코드에서 if 조건문에서 y Y n N 이외의 문자를 입력하면 어떻게 될까?? 

답은 아무일도 일어나지 않는다는 것이다. 조건문에서 조건문의 질문에 대해서 원하는 답을 입력받지 못했을 경우에는 아무런 일도 발생하지 않는다. 사실 문제가 없는 것이다. 즉, 반드시 뭔가를 출력해야만 하는 것은 아니라는 소리이다.

다시 물어보거나 사용자로 하여금 협조할 수 있도록 만들기 위해서는 loop 를 사용하여 조건문에 해당하는 답을 얻을 수 있도록 할 수 있다.

 

※ 명령어 tip

ls : 현재 있는 폴더 안의 파일들을 보여줌

cd : 기본 설정된 디렉토리로 이동

cd 폴더명 : 폴더명으로 이동

pwd : 현재 있는 위치에 대해 알려줌

'cs50 기초강의' 카테고리의 다른 글

3. 배열 - 컴파일링  (0) 2021.06.06
2. C언어 - 사용자 정의 함수, 중첩 루프  (0) 2021.06.06
2. C언어 - 조건문과 루프  (0) 2021.06.04
2. C언어 - 문자열  (0) 2021.06.04
2. C언어 - C기초  (0) 2021.06.04