공부 STUDY/CS
CS | 자료구조(1) - malloc 과 포인터 복습, 배열의 크기 조정, 연결 리스트 [도입, 코딩]
아래와 같은 main 함수 코드가 있다. 여기서 문제가 될 만한 지점이 있는데... int main(void) { int *x; int *y; x = malloc(sizeof(int)); *x = 42; *y = 13; } main 함수 안의 첫 두 줄에서는 포인터 x와 y를 선언한다. 그리고 x에는 malloc 함수를 이용해서 int 자료형 크기에 해당하는 메모리를 할당한다. 그 다음에는 x와 y 포인터가 가리키는 지점에 각각 42와 13을 저장한다. 여기서 문제가 될 만한 부분은 *y = 13 이다. y는 포인터로만 선언되었을 뿐이지, 어디를 가리킬지에 대해서는 아직 정의가 되지 않았다. 따라서 초기화 되지 않은 *y는 프로그램 어딘가를 임의로 가리키고 있을 수도 있다. 따라서 그 곳에 13이라는 값..
CS50 | 메모리(2) - 메모리 교환, 스택, 힙, 파일 쓰기/ 읽기
아래와 같은 코드가 있다. 함수 swap은 정수 a와 b를 입력받아 그 값을 바꾸는 일을 수행한다. main 함수에서는 x에 1, y에 2를 입력하고 swap 함수를 통해 그 두 값을 바꾸려고 한다. 과연 내 의도대로 잘 바뀌어 출력이 될까? #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x is %i, y is %i\n", x, y); swap(x, y); printf("x is %i, y is %i\n", x, y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } 위 코드를 컴파일하고 출력해보면 의도와는 다르게 swap 함수를 거친 후에도 x와 ..
CS50 | 메모리 - 매모리 주소, 포인터, 문자열, 문자열 비교, 복사, 할당 그리고 해제
16진수 컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문이다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있다. 16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있다. 10진수를 16진수로 바꾸어보기 JPG 이미지 파일은 항상 255 216 255 로 시작되고 이것은 10진수이다. 하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만을 이해할 수 있기 때문이다. 먼저 255 216 255를 2진수로 나타내보면 위와 같다. 2진수로 모든 데이터를 표현하기에는 너무 길어지므로 16진수로 바꾸어 보면 2^4 은 1..
CS50 | 알고리즘 - 버블 정렬, 선택 정렬, 정렬 알고리즘의 실행 시간
버블 정렬 정렬되지 않은 리스트를 탐색하는 것 보다 정렬한 뒤 탐색하는 것이 더 효율적이다. 정렬 알고리즘 중 하나는 버블 정렬이다. 버블 정렬은 두 개의 인접한 자료 값을 비교하면서 위치를 교환하는 방식으로 정렬하는 방법을 말한다. 버블 정렬은 단 두 개의 요소만 정렬해주는 좁은 범위의 정렬에 집중한다. 이 접근법은 간단하지만 단 하나의 요소를 정렬하기 위해 너무 많이 교환하는 낭비가 발생할 수도 있다. 아래와 같은 8개의 숫자가 임의의 순서로 나열되어 있다. 이 숫자들을 오름차순으로 정렬하기 위해 바로 옆의 있는 숫자들과 비교하는 방법을 사용해 보자. 6 3 8 5 2 7 4 1 먼저 가장 앞의 6과 3을 비교해서 순서를 바꾼다. 교환 전: 6 3 8 5 2 7 4 1 교환 후: 3 6 8 5 2 7..
CS50 | 알고리즘 - 검색 알고리즘, 알고리즘 표기법, 선형 검색
배열은 한 자료형의 여러 값들이 메모리상에 모여 있는 구조이다. 컴퓨터는 이 값들에 접근할 때 배열의 인덱스 하나하나를 접근한다. 만약 어떤 값이 배열 안에 속해 있는지를 찾아 보기 위해서는 배열이 정렬되어 있는지 여부에 따라 아래와 같은 방법을 사용할 수 있다. 1) 선형 검색 배열의 인덱스를 처음부터 끝까지 하나씩 증가시키면서 방문하여 그 값이 속하는지를 검사한다. 아래 의사코드와 같이 나타낼 수 있다. For i from 0 to n–1 If i'th element is 50 Return true Return false 2) 이진 검색 만약 배열이 정렬되어 있다면, 배열 중간 인덱스부터 시작하여 찾고자 하는 값과 비교하며 그보다 작은(작은 값이 저장되어 있는) 인덱스 또는 큰 (큰 값이 저장되어 있..
CS50 | 배열 Array (2) - 배열, 문자열과 배열, 문자열의 활용, 명령행 인자
메모리 C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지한다. bool: 불리언, 1바이트 char: 문자, 1바이트 int: 정수, 4바이트 float: 실수, 4바이트 long: (더 큰) 정수, 8바이트 double: (더 큰) 실수, 8바이트 string: 문자열, ?바이트 컴퓨터 안에는 아래 사진과 같은 RAM 이라고 하는 물리적 칩이 메모리 역할을 한다. 쉽게 생각하면 아래 사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미한다고 볼 수 있다. 예를 들어 char 타입의 변수를 하나 생성하고, 그 값을 입력한다고 하면 위 사진에서 한 사각형 안에 그 변수의 값이 저장되는 것이다. 배열 아래와 같이 세 개의 점수를 저..
CS50 | 배열 Array (1) - 컴파일링, 디버깅, 코드의 디자인
main 이라는 함수는 프로그램의 시작점으로써 실행 버튼을 클릭하는 것과 같다. printf는 출력을 담당하는 함수이다. printf 함수를 사용하기 위해서는 stdio.h 라이브러리가 필요하다. 정확히 말하면 stdio.h는 헤더 파일로 C언어로 작성되어 있으며 파일명이 .h로 끝나는 파일이다. 이 파일에는 printf 함수의 프로토타입이 있어서 Clang 컴파일러가 프로그램을 컴파일할때 printf가 무엇인지 알려주는 역할을 한다. 코드를 clang hello.c로 컴파일하고 ./a.out 명령으로 프로그램을 실행할 때 이 과정은 컴퓨터가 이해하는 0과 1로 가득찬 파일 a.out을 생성하여 실행 가능하게 한다. 만약 a.out과 다른 이름(hello)으로 컴파일을 하고 싶다면 아래와 같이 명령행 인..
CS50 | C 언어 - (2)
사용자 정의 함수 “cough”라고 세 번 말하는 C 프로그램을 작성하고 싶다면 아래처럼 작성하면 된다. #include int main(void) { printf("cough\n"); printf("cough\n"); printf("cough\n"); } printf 를 세 번 반복하면 되지만, 동일한 작업을 반복하는 것이기 때문에 사용자 정의 함수를 이용하면 아래 코드와 같이 더 단순화 할 수 있다. 루프 중에서 For을 사용하여 코드를 다시 짜보면, #include int main(void) { for (int i = 0; i < 3; i++) { printf("cough\n") } } 어렵지 않게 cough을 3번 출력해보았다. #include void cough(void) { printf("co..
CS50 | C 언어 - (1)
1) C언어 C언어에서 int main(void) 는 스크래치의 “초록색 깃발을 클릭했을 때” 블록과 같은 역할을 한다. 즉 '시작한다'의 의미를 가지고 있다고 보면 된다. 앞으로 작성할 코드는 모두 이 int main(void) { }의 중괄호 사이에 작성하게 될 것이다. C에서는 스크래치에서의 say라는 함수는 없고 printf라는 함수가 있다. printf(“hello, world\n”) 은 스크래치의 “‘hello, world’라고 말하기” 블록과 같은 역할을 한다. 글자나 단어, 문장을 적을 때는 언제나 텍스트에 " " 쌍따옴표로 감싸야 한다. 그리고 우리가 일상에서 문장의 끝에 마침표(.)를 붙이는 것 처럼 C에서는 세미콜론(;)을 붙여야 한다. \n은 줄바꿈의 기능을 합니다. 키보드에서 EN..