CS50 요약3(C_자료형, 형식지정자, 연산자, 함수, 중첩 루프, 하드웨어의 한계)

Sungmin Kim·2022년 5월 21일
0

CS50

목록 보기
3/3
post-thumbnail

데이터 타입

프로그래밍 언어에서 사용가능한 자료형은 다음과 같습니다.

  • bool: 불리언 표현, (예) True, False, 1, 0, yes, no
  • char: 문자 하나 (예) 'a', 'Z', '?'
  • string: 문자열
  • int: 특정 크기 또는 특정 비트까지의 정수 (예) 5, 28, -3, 0
  • long: 더 큰 크기의 정수
  • float: 부동소수점을 갖는 실수 (예) 3.14, 0.0, -28.56
  • double: 부동소수점을 포함한 더 큰 실수

<Tip!>
int는 약 양(20억), 음(20억) 총 40억을 세는 것이 가능합니다.

형식 지정자

printf 함수에서는 각 데이터 타입을 위한 형식 지정자를 사용할 수 있습니다.
이전 포스팅에서 문자열(string)인 answer 변수의 인자를 %s로 불러 왔습니다.
이처럼 데이터는 이를 표현하는 형식 지정자가 있습니다.

  • %c : char
  • %f : float, double
  • %i : int
  • %li : long
  • %s : string

<Tip2!>
C는 //를 통해서 주석을 달 수 있습니다
주석이란 코드안에 적혀 있지만 컴퓨터가 읽지 않는 부분을 말합니다.

함수

C에서는 특정 기능을 반복해서 사용할 때, 이를 기능화 시켜서 불러오게 하는 기능이 있습니다.

#include <stdio.h>

int get_positive_int(void);

int main(void)
{
    int i = get_positive_int();
    printf("%i\n", i);
}

int get_positive_int(void)
{
    int n;
    do
    {
        scanf("%d", &n);
    }
    while (n < 1);
    return n;
}

다음의 예제에서 get_positive_int를 함수라고 지칭합니다.
각각의 줄을 line by line으로 살펴보겠습니다.

  • int get_positive_int(void); :
    함수가 밑에 있을 것을 알고 미리 선언을 해주는 것입니다.
    만약 이 부분에 선언을 하지 않고 함수를 바로 작성해도 좋습니다.

    특별히 이 함수는 입력 받는 값이 없고, int를 반환할 것임을 알 수 있습니다.

  • int i = get_positive_int(); :
    함수가 기능을 수행하고 return한 양의 정수를 받는 부분입니다.

  • scanf("%d", &n); :
    정수를 입력받는 부분입니다.

  • while (n < 1); :
    do~while구문을 통해서 정수가 되기 전까지 반복 작업을 수행하게 해줍니다.

  • return n;
    함수의 기능을 수행하고 돌려보낼 값을 지정하는 부분입니다.

중첩 루프

만약 함수를 가로와 세로가 있는 이미지를 표현한다고 생각하면 2차원을 순회할 수 있어야 합니다. 하지만 일반적인 for문은 1개 방향으로만 진행이 가능함을 알 수 있습니다.
이럴경우 아래의 예제와 같이 for문을 중첩해서 사용하는 것이 가능합니다.

#include <stdio.h>
  
int main(void)
{
  int n = 3;
  for (int i = 0; i < n; i++)
  {
      for (int j = 0; j < n; j++)
      {
          printf("#");
      }
      printf("\n");
  }
}

다음과 같이 코드를 작성할 경우 3*3의 #이 출력되는 것을 볼 수 있습니다.

지금까지 코드를 사용하는 것에 대해서 살펴보았는데요.

하드웨어의 한계

부동소수점

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // 사용자에게 x 값 받기
    float x = get_float("x: ");

    // 사용자에게 y 값 받기
    float y = get_float("y: ");

    // 나눗셈 후 출력
    printf("x / y = %.50f\n", x / y);
}

다음 코드를 작성했을 때 50번째 소수점까지 출력을 해보면
아래와 같은 결과가 나옵니다.

x: 1
y: 10
x / y = 0.10000000149011611938476562500000000000000000000000

정확한 결과는 0.1이 되어야 하지만, float 에서 저장 가능한 비트 수가 유한하기 때문에 다소 부정확한 결과를 내게 됩니다.

정수 오버플로우

int는 –2,147,483,648 ~ 2,147,483,647까지 표현이 가능합니다.
만약 int n = 2,147,483,648을 넣는다면 이를 저장할 수 없어서 에러가 납니다.
우리는 프로그램을 설계할 때 다음 두개의 경우에 대해 고려를 하고 설계해야 합니다.

profile
Computer Vision Engineer

0개의 댓글