본문 바로가기

Computer Science/따라하며 배우는 C

17-03 ~ 17-04 Linked List 17-03. Linked List Linked List란? Linked list와 array의 차이를 알아보자. 배열은 메모리를 통짜로 받아들이고, linked list는 데이터 아이템의 메모리를 하나하나 받아온다.(malloc 함수를 이용하여 그떄그때 받아온다.) 단점 다음 데이터가 어디에 있는지 찾기 힘들다. 무조건 순차 접근(sequential access) 배열, 연결 리스트의 장단점 배열에서는 element라는 용어를 사용한 기억이 있을 것이다. 배열의 관점에서 '몇 번째 데이터' 등을 의미할 때는 요소를 이용하여 부르고, 데이터 자체를 의미할 때는 Item이라는 용어를 많이 사용한다. linked list를 통해 영화와 평점을 노드 요소로 가지는 자료구조를 완성해보자. #defi.. 더보기
17-01 ~ 17-02 영화 평점관리 연습문제 17-01. 영화 평점관리 연습문제 이번 부록에서는 data structure에 대해서 주로 다룰 것이다. 이 강의 뒷부분을 이해하기 위해서, 해당 문제를 스스로 풀어보기를 강력히 권장한다. 17장은 예제가 길어지므로, (코드를 따라서 치는 것보다) 이번 예제를 직접 작성해보고, 이후 이어지는 내용을 배우고 추후 작성했던 프로그램을 업그레이드 하는 방식으로 구현하면 재밌게 공부할 수 있을 것이다. #include // #include #include #include #include //// 01 #define TSIZE 45 #define LMAX 10 struct movie { /* data */ char title[TSIZE]; float rating; }; void read_file(struct m.. 더보기
16 Preprocessor 16-01. Preprocessor가 해주는 일들 프로그램을 작성할 때, 코드를 가장 먼저 보는 게 전처리기이다. "컴파일러"의 "전에" 처리를 해주기 때문에 전처리기이다. 최근에는 다양한 플랫폼에서 상품화를 하는 경우가 많다. 윈도우, 앱스토어, 리눅스 등에서 돌아가게 해주는 게 필요하다. C, C++ 언어를 사용할 때 전처리기에 어떻게 코드를 컴파일할지 결정할 수 있도록 도와주는(조건적으로 도와주는) 가능을 사용하면 좋을 것이다. 16-02. 전처리를 준비하는 번역 단계(Translation phases) //// 02 int main() { /* Program written in C 1st. Translating : 번역 단계를 먼저 거친다. 2nd. Preprocessing 3rd. Compili.. 더보기
15 Bit 15-01. 비트 단위 논리 연산자(Bitwise Logical Operators) 비트 단위 논리 연산자에 대해 알아보자. 지금까지 사용해온 논리 연산자는 어떤 자료형의 변수나 상수들에 적용되는 논리 연산들이었다. 지금부터 배울 내용은 비트 단위에서 이뤄지는 논리 연산이다. bitwise logical operator가 필요한 이유 왜 이들이 필요한지부터 알아보자. 이전까지 배운대로 하게 되면 다음과 같이 여러 경우를 표현하고 싶을 때 필요한 메모리 낭비가 크다. bitwise logical operator를 사용하면 아래와 같이 효율적으로 표현할 수 있다. bitwise AND를 살펴보자. 여기서 중요한 점은, 이들이 "비트끼리" 연산이 된다는 것이다!! 15-02. 이진수를 십진수로 바꾸기 연습문제.. 더보기
14 구조체 14-01. 구조체가 필요한 이유 구체적인 문법을 공부하기에 앞서서, 구조체가 왜 필요한지 그 이유부터 간단히 살펴보고 시작하자. 우리가 환자의 데이터를 관리하는 업무를 한다고 가정하자. 많은 수의 환자 데이터를 처리하고 싶을 것이다. 이 많은 데이터들을 배열을 통해 처리한다. 배열은 기본적으로 자료형이 같은 데이터 옵젝트들이 나열된 형태이다. 하지만 자료형이 서로 다르지만 함께 사용하면 편리한 데이터 오브젝트들끼리 모아둘 순 없을까? 이때 우리가 사용할 수 있는 문법이 구조체이다. 구조체 내에는 여러 변수들이 구조체의 "멤버"로써 들어가 있다. 이들은 자료형이 다르더라도 묶어서 "하나의 새로운 자료형인 것처럼" 프로그래밍하게 해주는 것이 구조체이다. 14-02. 구조체의 기본적인 사용법 문법적인 측면에.. 더보기
13 File_IO 13-01. 파일 입출력의 작동 원리 텍스트 파일 스트림과 바이너리 파일 스트림의 차이를 살펴보자. 텍스트 파일의 경우 다음과 같이 사람이 읽을 수 있도록 3,4,5,6,7을 저장하게 된다. EOF의 경우 운영체제에 따라 붙을 수도, 붙지 않을 수도 있다. 13-02. 텍스트 파일 입출력 프로그램 예제 //// 13-01 int main(int argc, char* argv[]) { int ch; FILE* fr; //TODO: file pointer to write // 이들은 파일에 대한 포인터라고 생각할 수 있는데, // 엄밀히 말하면 "파일을 처리할 때 필요한 데이터의 묶음"에 대한 "포인터"이다. FILE* fw; /* typedef struct_iobuf { char* _ptr; int _cn.. 더보기
12 Memory 12-01. 메모리 레이아웃 훑어보기 이번 강의에서는 그림을 익히는 정도만 하고, 추후에 하나하나 상세하게 설명할 예정이다. 프로그램이 시작될 때 프로그램 전체에서 계속 사용되는 변수들 어디서나 접근해서 값을 저장하고 가져올 수 있다. 프로그램이 종료될떄까지 메모리에 남아있다. 프로그램의 일부에서 큰 메모리가 필요한 경우 운영체제나 컴파일러는 효율을 매우 중시하도록 만들어졌다. 메모리를 항상 갖고 있는 것은 부담스럽다. 운영체제, 컴파일러 입장에서도 권장하고 싶지 않다. 따라서, 지역적으로 사용될 수 있는 변수를 선언할 수 있고, 이들을 local variable이라고 부른다. 이 지역변수들은 스택이라는 메모리에 저장된다. 이들은 실행이 될때, 블록에 속하는 코드가 실행이 될 때만 메모리에 들어간다. 따.. 더보기
11 String 11-01. 문자열을 정의하는 방법 #define MESSAGE "A symbolic string contant" #define MAXLENGTH 81 int main() { char words[MAXLENGTH] = "A string in an array"; const char* pt1 = "A pointer to a string."; puts("Puts() adds a newline at the end:"); // puts() add \n at the end puts(MESSAGE); puts(words); puts(pt1); words[3] = 'p'; //ok puts(words); //pt1[8] = 'A'; // error // Runtime Error: 읽기 전용.. 더보기