TIL 02 :: [CS50] C언어

7804 단어 TILCScs50CS

🎈 해당 글에서는 '스크래치'프로그램을 기준으로 설명합니다!

1) C 기초

C언어

  • int main(void){}
    When (Green flag) clicked는 int main(void){} 와 동일하다.

  • printf("hello world");
    say hello, world의 블록과 동일한 역할을 한다. hello world를 출력해준다.

  • #include <stdio.h>
    stdio.h라는 파일을 찾아 printf 함수에 접근할 수 있도록 도와준다.
    즉, stdio.h라는 파일을 불러온다고(참조) 해석하면 쉽다.
    라이브러리의 역할을 한다.

글자,단어,문장은 "" 안에 넣어준다.
문장의 끝에는 세미콜론(;)을 붙여준다.
printf("hello world\n"); 에서 \n은 줄바꿈(enter)역할을 한다. terminal에서 줄바꿈을 해주어 가독성을 높인다.

컴파일러

상단에 작성한 코드를 '소스코드' 라고 하고 이 코드를 2진수로 변환하면 이를 '머신코드' 라고 말한다.
우리는 '소스코드'를 컴퓨터가 이해할 수 있는 '머신코드'로 변환, 즉 컴파일해야 한다.

터미널창의 $기호 옆에 clang hello.c 라고 입력하면 컴파일이 된다.

clang은 컴파일러로 hello.c 라는 파일의 코드를 컴파일 한다는 의미이다.

그 결과 a.out이라는 머신코드 파일이 생성된다.
./a.out 명령어를 터미널창에 입력하면 실행된다.

컴파일 과정을 자세히 알고싶다면

2) 문자열


여기서 ask는 get_string과 유사하다.
get_string 함수가 사용자의 이름을 반환하면 answer 변수에 저장된다.

string = 단어나 구절, 문장
string을 이용해 데이터의 종류를 명시하고 이를 통해 변수가 지정된다.
이것을 형식 지정자라고 한다.
변수명은 임의로 정해도 괜찮다.

할당 연산자
프로그래밍에서 뜻하는 '='오른쪽에 있는 것을 왼쪽에 지정한다는 뜻
'==' 는 같다라는 표현이다.

출력


printf("hello, %s\n", answer);

변수 answer에 담긴 내용이 출력되어야 하기 때문에 %를 이용하고 string의 s를 붙여 %s를 입력하면 string인 인자를 받는다는 것이다.
""(쌍따옴표) 다음 입력된 answer은 해당 변수를 사용한다는 뜻이다.

  • get_string 함수를 사용하려면
    #include <cs50.h> 라이브러리를 불러와야 사용할 수 있다. (컴파일 가능)

  • 이제 컴파일을 해보려면?
    $ clang -o string string.c -lcs50

    -o string 은 string.c 를 string.out 이라는 머신코드로 저장하도록 한다. 즉 string이라는 이름의 머신코드 파일로 저장하라는 뜻
    -lcs50은 “link”라는 연결을 의미하고 -l 인자에 우리가 추가로 포함한 “cs50” 파일을 합친 것이다. 이를 통해 컴파일시 cs50 파일을 연결하도록 알려줄 수 있다.
    두 코드가 한 프로그램으로 실행될 수 있도록 한다.

더 쉽게, $make string
make를 쓰면 저 긴 문장을 터미널창에 입력하지 않고 make만 이용해서 컴파일 할 수 있다.

3) 조건문과 루프

조건문

  • 스크래치에서 변수 값을 1씩 증가하는 것을 C언어에서는
    counter = counter +1;
    로 표현하는데 이 또한 해석하자면 오른쪽에서 왼쪽이라는 뜻이 적용된다.
    이를 단축하면

    counter += 1; 혹은 counter++;로 표현할 수 있다.

조건같은 것들의 끝에는 세미콜론 붙이지 않음

if문을 통해 조건문을 작성할 수 있는데 if 옆 괄호 안에 연산자를 이용해서 boolean 함수를 도출해내어 조건을 따져 값을 출력한다.

boolean이란 참과 거짓, true or false

처음 if문의 해당 조건이 true라면 작동시키고 그게 아니라면 밑에줄 else 혹은 else if를 읽어 출력한다.

루프

반복문은 while과 for문이 존재한다.


hello, world를 50번 반복하여 출력하고 싶다면 while 조건에 변수 i < 50을 주면 된다.
i가 계속 0이면 계속 무한대로 출력될 것이기에 50번의 조건을 걸어두려면 i=i+1;을 입력해주어야 한다.
i가 0부터 카운팅 되므로 i < 50을 하면 0~49까지 카운팅되어 총 50번 출력된다.


while문보다 더 디자인적으로 효율성 있는 코드를 작성하려면 for문을 작성하는 것이 좋다.

정수값(int)인 변수 i에 0을 담아주고 i가 50보다 작다면 해당 코드를 출력한다.
출력후 다시 i=i+1을 해주고(출력된 값이 true이므로) 다시 i<50;을 비교해주고 printf를 통해 출력해준다.
이 과정이 반복된다. i가 50보다 작을때까지.

4) 자료형, 형식 지정자, 연산자

변수의 데이터 타입

  • 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: 부동소수점을 포함한 더 큰 실수

형식 지정자

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

기타 연산자 및 주석

  • +: 더하기
  • -: 빼기
  • *: 곱하기
  • /: 나누기
  • %: 나머지
  • &&: 그리고
  • ||: 또는
  • //: 주석

정수와 실수를 받아서 출력해보기 中 소수점 표현

printf("Your total is %.2f \n", price*1.0625);
%f에서 f 앞에 원하는 소수점 자리수를 넣으면 된다.
price가 100이라고 한다면 %.2f를 입력하면 106.25가 출력된다.

주석

// 주석입니다.

5) 사용자 정의 함수, 중첩 루프

사용자 정의 함수

  1. 예제
#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");
    }
}

함수 void (int n)은 함수가 입력값을 받아서 int 형식의 n이라는 변수에 저장

  • void cough(int n) 라는 함수를 main(void)보다 상단에 언급하여야 사용이 가능하다.

    컴퓨터는 위에서부터 읽으니까 지정한 함수가 main(void)보다 아래에 있으면 main(void)에서 '야, void cough(int n) 함수 없는데?' 라고 에러가 뜬다

그런데 디자인적으로 효율적으로 코드를 정리하고 작성하기 위해서는 main(void)가 처음 파일을 열었을때 가장 상단에 있어야 가독성이 좋다.
프로젝트 하면서 함수를 많이 작성할텐데 그 모든게 상단에 있으면 (사람이)읽기 힘들다.
그래서 함수는 가장 하단에 두고 대신 main(void)에서 읽을 수 있도록 먼저 상단에 정의해주면 컴퓨터가 읽을 수 있다.


2. 예제
#include <cs50.h>
#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
    {
        n = get_int("Positive Integer: ");
    }
    while (n < 1);
    return n;
}

do{ }while()은 조건과 상관없이 최소한 한 번은 { }안의 내용을 실행할 수 있다.
while(n<1); 이 참일때 다음을 수행하라는 뜻
만약 n이 1보다 작다면 계속해서 질문을 반복
while을 단독으로 사용하면 while의 조건이 참이어야만 수행하지만 do-while은 do에서 무조건 한 번은 먼저 수행하게 해준다.

int get_positive_int(void) ❓

int get_positive_int(void)는 괄호 안에 void로 입력을 받지 않는다.
괄호 안에 아무것도 넣을 필요가 없어서 아무 양의 정수를 받으면 된다.
그러나 cs50라이브러리의 get_string 같은 함수처럼 값을 받아 변수에 저장하여 반환하게 하고싶어 함수 앞에 void대신 int(출력 종류)를 사용한다.

int는 출력의 종류 | (void)는 입력의 종류

참고: get_positive_int라는 함수는 cs50에 없는 함수이다.

중첩 루프

#include <cs50.h>
#include <stdio.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");
    }
}
  • 최종결과
    가로가 n개, 세로가 n개인 “#”이 출력된다.

좋은 웹페이지 즐겨찾기