[CS50] 배열 - 문자열과 배열
TIL
문자열은 배열이다지금까지 문자열을 저장하기 위해 string 자료형을 사용했다. '문자열'은 문자가 '나열되어 있다' 또는 '배열되어 있다'는 의미다. C에서 string은 정확히 어떻게 정의되어 있을까? 문자열(string) 자료형은 사실 문자(char) 자료형의 배열이다. 문자 배열string s = "HI!";와 같이 문자열 s가 정의되어 있다고 가정해보자. s는 문자의 배열이므로 메모리상에 다음과 같이 저장되며, 인덱스로 각 문자에 접근할 수 있다.가장 끝의 \0은 널 종단 문자로, 문자열의 끝을 나타낸다. 모든 비트가 0인 1바이트를 의미한다. 2차원 배열여러 문자열이 동시에 선언된 경우를 살펴보자.string names[4];names[0] = "EMMA";names[1] = "RODRIGO"..
[CS50] 배열
TIL
메모리와 자료형특정 자료형의 변수를 선언하면 메모리상에 특정 크기만큼 자리를 차지한다. 비슷한 종류의 값을 모아서 저장하려면 어떻게 해야 할까? C의 자료형과 각각의 메모리 크기는 다음과 같다.bool: 불리언, 1바이트char: 문자, 1바이트int: 정수, 4바이트float: 실수, 4바이트long: 더 큰 정수, 8바이트double: 더 큰 실수, 8바이트string: 문자열, ?바이트 컴퓨터 안에는 RAM이라는 물리적 칩이 메모리 역할을 한다.각 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트다. 예를 들어 char 타입 변수를 생성하면 한 사각형에 값이 저장된다. 배열배열 선언세 개의 점수를 저장하고 평균을 출력하는 프로그램을 작성해보자.#include #include int main(..
[CS50] 디버깅
TIL
버그와 디버깅코드를 작성하다 보면 의도와 다른 오류나 결과를 맞닥뜨리게 된다. 이를 "버그"라고 하는데, 버그를 효과적으로 찾고 해결하는 방법을 알아보자. 버그(bug)는 코드의 오류로, 프로그램 실행에 실패하거나 원하는 대로 동작하지 않게 만든다. 디버깅(debugging)은 코드의 버그를 식별하고 고치는 과정이다. 프로그래머는 디버거라는 프로그램을 사용하여 디버깅한다. 프로그램은 매우 빠르게 실행되므로, 실행만으로는 오류를 찾기 어렵다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해주며, 이 지점을 중지점(breakpoint)이라고 한다. 프로그램이 멈춘 후 무슨 일이 일어나는지 확인할 수 있다. 또한 디버거는 프로그램을 한 줄씩 실행할 수 있게 해주어 단계별로 동작을 추적할 수 있다. 디버깅 도..
[CS50] 컴파일링
TIL
컴파일링이란C 코드를 실행하려면 컴파일을 해야 한다. 텍스트 형식의 C 코드가 컴퓨터가 해석 가능한 파일로 변환되는 과정을 알아보자.#include int main(void){ printf("hello, world\n");}main 함수는 프로그램의 시작점이고, printf는 출력 함수다. printf를 사용하려면 stdio.h 라이브러리가 필요하다.stdio.h는 C 언어로 작성된 헤더 파일로 printf 함수의 프로토타입을 가지고 있어, clang 컴파일러가 printf가 무엇인지 알 수 있게 한다. $ clang hello.c$ ./a.out컴파일 결과 a.out이라는 실행 파일이 생성된다. 다른 이름으로 컴파일하려면 -o 옵션을 사용한다.$ clang -o hello hello.c CS50 ..
[CS50] 하드웨어의 한계와 오버플로우
TIL
메모리의 한계컴퓨터는 RAM(Random Access Memory)이라는 물리적 저장장치에 프로그램을 저장한다.RAM은 유한한 크기의 비트만 저장할 수 있기 때문에 때때로 부정확한 결과를 낸다. 부동소수점의 부정확성실수 x를 y로 나누는 프로그램을 작성해보자.#include #include int main(void){ float x = get_float("x: "); float y = get_float("y: "); printf("x / y = %.50f\n", x / y);}소수점 50자리까지 출력하도록 하고, x에 1, y에 10을 입력하면 다음과 같은 결과가 나온다.정확한 결과는 0.1이어야 하지만, float에서 저장 가능한 비트 수가 유한하기 때문에 부정확한 결과가 나온다. 정수..
[CS50] C 언어 - 사용자 정의 함수와 중첩루프
TIL
사용자 정의 함수반복적으로 작성하는 코드를 함수로 만들면 코드를 간결하고 이해하기 쉽게 만들 수 있다. "cough"를 세 번 출력하는 프로그램을 작성해보자.#include int main(void){ printf("cough\n"); printf("cough\n"); printf("cough\n");} 반복문을 사용하면 더 간결해진다.#include int main(void){ for (int i = 0; i 이제 함수를 만들어보자.void cough(void)로 함수를 정의한다. main 함수에서 cough()를 호출하면 우리가 정의한 대로 동작한다.#include void cough(void){ printf("cough\n");}int main(void){ for ..
[CS50] C 언어 - 자료형과 연산자
TIL
데이터 타입C에서는 다양한 데이터 타입을 제공한다. 각 타입에 맞는 형식 지정자로 적절히 출력하고, 다양한 연산자로 계산하거나 조건문을 작성할 수 있다.주요 데이터 타입bool: 불리언 (True, False, 1, 0)char: 문자 하나 ('a', 'Z', '?')string: 문자열int: 정수 (약 40억까지)long: 더 큰 정수float: 실수double: 더 큰 실수int는 약 40억까지 셀 수 있어 대부분의 경우 충분하다. 형식 지정자printf함수에서 각 데이터 타입을 출력할 때 사용한다.%c: char%f: float, double%i: int%li: long%s: string 연산자수학 연산자+: 더하기-: 뺴기*: 곱하기/: 나누기%: 나머지 논리 연산자&&: 그리고||: 또는 주석..
[CS50] C 언어 - 조건문과 루프
TIL
변수Scratch에서 블록으로 표현했던 조건문과 루프를 C로 구현해보자. Scratch에서 counter 변수를 생성하고 0을 저장하는 블록은 다음과 같다.int counter = 0;int는 변수가 정수(integer)라는 것을 알려주고, counter는 변수 이름, 0은 초기값이다. 변수를 1씩 증가시키는 방법은 여러 가지다.counter = counter + 1;counter += 1;counter++;세 가지 모두 같은 기능을 수행한다. 조건문if (x if (조건) 괄호 안에 검사할 조건을 넣고, { } 안에 조건이 참일 때 수행할 작업을 넣는다.else를 사용하면 조건이 거짓일 때의 동작을 정의할 수 있다. if (x else if로 조건을 추가할 수 있다.if (x y){ print..
[CS50] C 언어 - 문자열
TIL
변수와 형식 지정자사용자로부터 문자열을 입력받아 출력하는 프로그램을 작성해보자. 사용자의 이름을 저장할 변수를 answer라고 정했다. C는 오래된 언어라 변수가 저장하는 데이터 종류를 정확히 명시해야 한다.string answer = get_string("What's your name?\n");문자열을 저장한다는 것을 알려주기 위해 string이라는 형식 지정자를 사용한다.=는 할당 연산자로, 오른쪽 값을 왼쪽 변수에 저장한다는 의미이다. get_string 함수가 반환한 사용자 이름을 answer변수에 저장하는 것이다. 문자열 출력이제 printf함수로 저장된 이름을 출력해보자. 변수에 들어있는 값을 출력하려면 %를 사용한다. 문자열(string)이므로 s를 붙여 %s로 지정한다.printf("hel..
[CS50] C 기초
TIL
C 언어C는 오래되고 전통적인 텍스트 기반 언어이다.#include int main(void){ printf("hello, world\n");} 여기서 int main(void)는 Scratch의 "초록색 깃발을 클릭했을 때" 블록과 같다. 프로그램의 시작을 의미한다. printf 함수printf("hello, world\n")은 Scratch의 "'hello, world'라고 말하기" 블록과 같다.텍스트는 항상 " "쌍따옴표로 감싸야 하며, 문장 끝에는 세미콜론(;)을 붙인다. 일상에서 마침표(.)를 쓰는 것과 같다. include#include 는 stdio.h 파일을 불러와 printf 함수를 사용할 수 있게 한다. C로 작성한 코드는 파일이름.c 형식으로 저장해야 한다. Word처럼 자동으로..