제 37강) 정렬 알고리즘 - 선택 정렬 오늘은 정렬 알고리즘의 두번째 시간으로 "선택 정렬"에 대해서 알아봅니다. 기본적으로 선택 정렬은 배열에서 사용합니다. 선택 정렬이란 (사진 출처 : 위키백과 - 선택 정렬) 선택 정렬 또한 버블 정렬과 마찬가지로 성능을 기대하기 어려운 정렬 중 하나입니다. 또한 구현하기도 어렵지 않은 정렬입니다. 매 사이클마다 배열에서 가장 큰 수를 찾습니다. 그렇게 찾은 큰 수를 맨 뒤에서 사이클의 반복횟수만큼 뺀 위치의 원소와 자리를 바꿉니다. (그 이유는 첫 사이클을 제외한 사이클에서는 맨 뒤에있는 수는 이미 정렬이 끝난 가장 큰 수이기 때문입니다.) 사실 위의 과정은 상당히 간략화 되었지만 자세히 들여다 보겠습니다. 선택 정렬은 각 사이클마다 위의 과정처럼 최대 수를 찾..
제 35강) 라이브러리 함수3 - 날짜 및 시간 오늘은 "강의에서 다루지 않았던"의 다섯번째 시간입니다. 이번 시간에는 라이브러리 함수3인 날짜 및 시간 라이브러리에 대해서 다뤄보려고 합니다. C언어에서 제공하는 "날짜 및 시간" 라이브러리는 time.h를 포함하면 사용이 가능합니다. 자료형 time.h 에는 다음과 같이 4개의 자료형을 선언하고 있습니다. 이름 자료형 원형 기능 clock_t Tick 수를 샐 수 있는 시계 전용 자료형(시스템 시간을 잴 때 사용) size_t unsigned int 부호 없는 정수 자료형으로 바이트 단위의 크기를 나타낼 때 사용 time_t 시간을 나타내기 위한 자료형 struct tm 시간을 받아서 저장하는 구조체 여기서struct tm을 좀더 자세히 봅시다. 멤버..
제 34강) 라이브러리 함수2 오늘은 "강의에서 다루지 않았던"의 네번째 시간입니다. 이번 시간에는 라이브러리 함수2에 대해서 다뤄보려고 합니다. 문자 함수(ctype.h) 문자 하나를 다루는 함수입니다. 여기서 정의되는 모든 함수는 참일 경우에는 0이 아닌 int 값을 반환하고, 거짓일 경우에는 0을 반환하는 성질을 가졌습니다. 먼저 isalnum과 isalpha를 보겠습니다. #include // 여기서 설명하는 모든 함수는 ctype.h에 정의되어 있습니다. int isalnum (int c); c가 영문자(대 + 소) 또는 숫자인지 판단 => if (isalnum(65)) // 이때 65는 대문자 A를 나타내기 때문에 참 int isalpha (int c); c가 영문자(대 + 소)인지 판단 =>..
제 32강) Call by ~ 오늘은 "강의에서 다루지 않았던"의 두번째 시간입니다. 이번 시간에는 어떻게 보면 민감(?)하고 잘못된 설명들이 난무(?)하기도 하는 것을 다뤄보려고 합니다. 바로 Call By ~ 에 대해서 알아봅시다. 1) Call by value 값을 직접 호출하는 방식을 "Call by value", 한국어로 "값에 의한 호출"이라고 합니다. /* Call by value */ #include void printNum(int _num) { printf("num: %d\n", _num); } int main(void) { int num = 15; printNum(num); // Call by value return 0; } 위와 같이 직접 값(주소값이 아닌!!)을 전달하여 호출하는 것..
제 31강) 포인터를 이용한 함수 통신 오늘은 "강의에서 다루지 않았던"의 첫번째 시간입니다. 포인터를 이용하여 함수간의 통신을 하는 법에 대해서 알아봅시다. 번지 연산자& 포인터를 이용하여 함수간 통신(Communication)을 하기 위해서는 "번지 연산자"를 사용합니다. 이 통신을 함으로써 다른 함수에서 값을 입력받아올 수 있고 이미 있는 변수의 값을 서로 바꾸어줄 수도 있습니다. 대표적인 포인터를 이용한 함수 통신으로는 스왑(Swap)이 있습니다. #include void swap(int* _num1, int* _num2) { int tmp = *_num1; *_num1 = *_num2; *_num2 = tmp; printf("Swap!!\n"); } int main() { int num1 = 5..
제 30강) 전역변수와 정적변수(static) 오늘은 전역변수와 static변수에 대해 알려드리려합니다. 지역변수 전역변수를 보기 전에 일반적인 변수(지역변수)를 먼저 봅시다. #include void func1(int num1) { int num2 = 2; printf("%d, %d \n", num1, num2); } void func2(int num1) { int num2 = 3; int num3 = 5; printf("%d, %d, %d \n", num1, num2, num3); } int main(void) { int num = 5; func1(num); func2(num); int num2 = 7; printf("%d \n", num2); return 0; } 위의 예제를 한 번 뜯어봅시다. 이..
제 28강) 전처리기(Pre-Processor) 오늘은 전처리기(Pre-Processor)에 관한 것을 배웁니다. 전처리기 전처리기는 컴파일이 시작되기 "전"에 작동되는 것으로, 지시자를 통하여 처리기를 작동시킵니다. (영어로는 PreCompiler, PreProcessor로 불립니다.) 전처리기 명령어(지시자)는 쉽게 육안으로 구분이 가능합니다. #include #define PI 3.141592 #ifdef __SET_ON__ ..... #endif #pragma once 이렇게 어떤 단어의 앞에 "#"이 붙으면 전처리기 명령어(지시자)가 됩니다. #include 아주 많이 써왔던 "#include" 입니다. #include 파일 예) #include #include #include "custom.h..
제 29강) 소스파일의 분할(헤더파일) 오늘은 소스파일을 분할하여 편집하기 편하게, 보기 편하게 만드는 법을 알려드리려합니다. (즉, 헤더파일이라는 것을 알게됩니다.) 헤더파일 소스파일을 분할시키기 전에 헤더파일에 대해서 먼저 알아봅시다. 헤더파일은 특히 C와 C++에서 컴파일러에 의해 다른 소스파일에 자동으로 포함된 소스코드의 파일을 뜻합니다. 즉, 무언가가 선언되어 있는 파일을 뜻하고 이것을 우리가 사용하기 위해 #include를 합니다. 헤더파일에는 주로 형을 알리는 것들이 들어가있습니다. 1. #define 2. enum (다음 강의에서 배웁니다.) 3. struct 선언부 4. class 선언부 (C++에 해당됩니다.) 5. 함수형 이런 것들이 선언되어 있습니다. 소스파일 분할하기 먼저 간단한 ..
제 27강) C언어의 파일 입출력2 파일 입출력의 두번째 시간입니다. 4) 무작위 접근(fseek, ftell) 먼저 fseek 함수부터 살펴보겠습니다. 원형: int fseek ( FILE * stream, long int offset, int origin ); // 스트림, 위치, 위치가 시작되는 fseek 함수는 해당 스트림의 위치 지정자를 지정된 위치로 옮기는 역할을 하는데요. 이 fseek 함수는 3가지의 인수를 필요로 합니다. 무작위로 접근할 스트림(stream)과 해당 스트림의 접근이 시작될 위치(origin), 그리고 그 위치(origin)로 부터 얼마나 떨어져 있는지에 대한 정도(offset)가 들어가게 됩니다. 반환 값은 성공적으로 접근했을 시 0, 그게 아닐 시에는 0이 아닌 값을 반..
제 26강) C언어의 파일 입출력1 오늘은 아마 가장 긴 강좌가 될지도 모르는 "파일 입출력"에 대해서 알아보겠습니다. (입출력 = 입력 + 출력) C언어에서의 파일 입출력은 정말 중요합니다. C++언어에서도 성능 때문에 C언어의 파일 입출력을 종종 사용하지요. 1) 파일과의 통신(FILE) 파일과의 통신을 하기 위해서는 "어떻게 사용할 수 있느냐" 라는 의문을 가져야 합니다. 크게 우리는 2가지 측면에서 접근할 수 있습니다. ① 바이너리(Binary) 적인 접근 ② 텍스트(Text) 적인 접근 바이너리적으로 접근을 하게 되면 우리는 모든 바이트를 가지고 프로그램에서 사용할 수 있습니다. 이것은 어떤 시스템에서든지 동일하게 사용이 가능하죠. 텍스트적으로 접근을 하게 되면 텍스트단위를 가지고 프로그램에서 ..