C 기초

  • 오래되고 전통적인 순수 텍스트 기반의 언어
#include <stdio.h>

int main(void)
{
    printf("hello, world");
}
  • int main(void)는 스크래치에서 시작하는 블록과 비슷하다. 모든 코드는 중괄호 안에 들어간다.
  • printf: 형식화(formating) 된 print, 문자는 쌍따옴표로 감싸야함
  • 코드 각줄 마지막에 세미콜론을 붙임
  • #include <stdio.h>: 컴퓨터에게 함수가 어디에 저장되어 있는지 알려주는 말
  • C언어는 코드를 저장할때 .c 확장자를 사용한다.
  • 코드를 컴퓨터가 이해할 수 있도록 0과 1로 번역하는 과정을 수행하는 소프트웨어를 compiler라고 한다.
  • clang: 코드를 컴파일하는 프로그램 이름
  • clang hello.c를 프롬프트에 입력해서 a.out 파일을 만든다.
  • 새로운 줄로 바꾸고 싶다면 \n을 이용한다.

문자열

  • get_string: 문자열 입력을 받아 변수에 저장
  • C는 변수가 저장하는 데이터 종류를 명시해줘야 함.
  • %s: 문자열을 의미하는 형식 지정자
  • 문자열과 get_string 함수를 저장하고 있는 저장하고 있는 라이브러리를 연결하는 명령어가 필요하다.(-l)
  • 코드를 컴파일할 때 make 명령어를 사용하면 자동으로 만들어준다.

조건문과 루프

  • int counter = 0; 으로 변수를 할당한다.
  • counter = counter + 1 로 카운트를 증가시킨다. int를 쓸 필요는 없다.
  • counter += 1;, counter++; 이라고 쓸 수도 있다.

조건

  • if과 else
if (x < y)
{
    printf("x is less than y\n");
}
else
{
    printf("x is not less than y]n");
}
  • else if은?
if (x < y)
{
    printf("x is less than y\n");
}
else if (x > y)
{
    printf("x is greater than y\n");
}
else if (x == y)
{
    print("x is equal to y\n");
}
  • if ... else if ... else 형태로 사용할 수도 있다.

루프

  • while (true) = forever
while (true)
{
    printf("hello, world");
}
  • 50회만 반복
int i = 0;
while (i < 50)
{
    printf('hello, world\n');
    i += 1;
}
  • for 루프
for (int i = 0; i < 50; i++)
{
    printf("hello, world\n");
}

자료형

  • bool: 참/거짓
  • char: 한 개의 문자
  • int: 정수
  • string: 문자열
  • long: int는 40억까지 셀 수 있지만 더 많은 비트를 사용해 큰 숫자를 센다
  • float: 소수
  • double: 소수점뒤에 더 많은 숫자를 가질 수 있음
  • 각 자료형마다 get_ 함수가 있음

형식 지정자

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

예제 1

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

int main(void)
{
    int age = get_int("What's your age?\n");
    int days = age * 365;
    printf("You ar at least %i days old.\n", days)
}

예제 2

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

int main(void)
{
    float price = get_float("What's the price?\n");
    printf("Your total is %.2f\n", price * 1.0625);
}
  • %.2f: 소숫점 2번째 자리까지만 프린트

예제 3

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

int main(void)
{
    int n = get_int("n:");
    if (n % 2 == 0)
    {
        printf("even\n");
    }
    else
    {
        printf("odd\n");
    }
}
  • //로 주석을 작성할 수 있다.
  • ||는 or를, &&는 and를 의미한다.
  • 실제 C언어에서는 <cs50.h>의 get_ 함수가 아니라 scanf()로 입력을 받는다.

사용자 정의 함수

#include <stdio.h>

// 괄호안에 void: 입력을 받지 않음
// 앞쪽의 void: 값을 반환하지 않음

void cough(void);

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        cough();
    }
}

void cough(void)
{
    printf("cough\n");
}
  • main을 위로 올리고 싶으면 코드 윗부분에 void cough(void); 로 선언해준다.
  • 횟수를 입력받아 cough를 실행함
#include <stdio.h>

void cough(int n);

int main(void)
{
    cough(3);
}

void cough(int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("cough\n");
    }
}
  • 양수를 반환하는 함수
#include <stdio.h>
#include <cs50.h>

int get_positive_int(void)
{
    int n;
    do
    {
        n = get_int("positive integer: ");
    }
    while (n < 1);
    return n;
}
  • do - while 문은 한번 코드를 실행하고 조건을 확인하는 while 루프다.
  • 루프는 중첩하여 사용할 수 있다.
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    int n;

    do
    {
        n = get_int("Size :");
    }
    while (n < 1);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j ++)
        {
            printf("#");
        }
        printf("\n");
    }
}

하드웨어의 한계

  • 모든 컴퓨터, 스마트폰 등은 RAM을 사용한다.
  • 컴퓨터가 여러 일들을 한번에 할 때 기억하기 위해 RAM을 사용한다.
  • 이 메모리의 용량은 유한하기 때문에 컴퓨터가 하는 연산은 한계가 있다.
  • 컴퓨터에게 1 / 10을 시켰을 때, 값이 0.1이 나오지 않고 다른 숫자가 나온다. => 메모리에 저장할 수 있는 값이 한계가 있기 때문
  • 정수가 너무 커지면 overflow가 일어나 0이 된다.

출처: 부스트코스 모두의 컴퓨터과학

'CS' 카테고리의 다른 글

[모두의 컴퓨터과학] 메모리  (0) 2021.11.17
[모두의 컴퓨터과학] 알고리즘  (0) 2021.11.15
[모두의 컴퓨터과학] 배열  (0) 2021.11.14
[모두의 컴퓨터과학] 컴퓨팅 사고  (0) 2021.11.14

2진법

  • 컴퓨터 과학 = 문제를 해결하는 과정
  • input -> computer science => output
  • 컴퓨터에게 입력과 출력을 어떻게 표현해야할까? => 2진법

2진법은 어떻게 작동하는가?

  • 사람들은 보통 10개의 손가락으로 10진법을 사용한다.
  • 컴퓨터는 0과 1로 이미지, 영상등을 저장한다.
  • 10진법이 10의 거듭제곱으로 숫자를 표기하듯이 2진법은 2의 거듭제곱을 사용한다.
  • 0과 1을 비트라고 한다.
  • 기계는 전기가 유일한 입력이므로 전기가 흐르는것과 흐르지 않는 것으로 나뉜다. => 비트
  • 8비트는 1바이트
  • 트랜지스터는 컴퓨터 속에 있는 아주 작은 스위치다. 이를 물리적으로 이용해서 정보를 표현한다.

정보의 표현

  • 컴퓨터는 2진법을 이용해서 어떻게 문자나 글자등을 어떻게 표현하는가?

문자

  • 과거에 대문자 A를 65로 표현했다. (1000001)
  • ASCII: 정보교환을 위한 미국 표준 코드, 알파벳과 문장부호를 숫자로 규정한다.
  • ASCII는 미국중심이라 미국영어에 편중되어 있다.
  • 유니코드: ASCII의 상위 집합, 32비트까지 사용한다. 다른 언어와 이모지도 표현 가능하다.

사진, 영상

  • 사진은 작은 점으로 이루어져 있다. 컴퓨터는 각 점들을 RGB를 이용해 표현한다.
  • 영상은 같은 파일에 저장된 여러장의 사진이다.

알고리즘

  • 입력으로부터 출력을 어떻게 얻을 수 있을까? -> 알고리즘을 통해서
  • 문제를 해결하는 단계적인 방법

스마트폰은 알파벳순으로 정렬된 이름에서 어떻게 이름을 검색할까?

  1. 한장씩 페이지를 넘겨가며 이름을 찾는다.(매우느림)
  2. 두장씩 페이지를 넘겨가며 찾는다. (2배 빠르지만 지나칠 수도 있다.)
  3. 적당히 중간을 펴서 이름 순서를 비교하고 반쪽을 버린다.(훨씬 빠름, 분할 정복)

어떤 알고리즘이 더 좋은지는 어떻게 알수 있는가?

  • 문제의 크기, 문제 해결에 걸린시간

의사코드

알고리즘을 코드 형식으로 나타낸 구문

  • 함수: 컴퓨터에게 뭘 할지 알려주는 동사
  • 조건: 여러 선택지중 하나르 ㄹ고르는 것
  • 불리언 표현: 예 or 아니오 질문
  • 루프: 계속 반복하는 순환

출처: 부스트코스 모두의 컴퓨터과학

'CS' 카테고리의 다른 글

[모두의 컴퓨터과학] 메모리  (0) 2021.11.17
[모두의 컴퓨터과학] 알고리즘  (0) 2021.11.15
[모두의 컴퓨터과학] 배열  (0) 2021.11.14
[모두의 컴퓨터과학] C언어 기초  (0) 2021.11.14

+ Recent posts