왕초보

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 36 [정렬 알고리즘(버블 정렬)]

제 36강) 정렬 알고리즘 - 버블 정렬 오늘은 정렬 알고리즘의 첫 시간으로 "버블 정렬"에 대해서 알아봅니다. 기본적으로 버블 정렬은 배열에서 사용합니다. 버블 정렬이란 (사진 출처: 위키 백과 - 거품 정렬) 버블 정렬은 구현하기가 가장 쉽지만 성능을 기대하기 어려운 정렬입니다. (실질적으로 안쓰는 정렬 중 하나) 버블 정렬은 해당 인덱스와 그 다음 인덱스와의 크기를 비교하여 바꾸는 정렬로 결과적으로 한 사이클이 지날때 마다 가장 큰 인덱스의 값은 맨 뒤로 옮겨집니다. 위의 그림에서 첫 번째 사이클에서 이미 가장 큰 수인 11이 맨 뒤로 옮겨집니다. 그렇기 때문에 두 번째 사이클에서는 11을 제외한 4개의 숫자를 가지고 다시 정렬을 합니다. 그렇기 때문에 버블 정렬의 비교 횟수는 T(n) = n(n ..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 37 [정렬 알고리즘(선택 정렬)]

제 37강) 정렬 알고리즘 - 선택 정렬 오늘은 정렬 알고리즘의 두번째 시간으로 "선택 정렬"에 대해서 알아봅니다. 기본적으로 선택 정렬은 배열에서 사용합니다. 선택 정렬이란 (사진 출처 : 위키백과 - 선택 정렬) 선택 정렬 또한 버블 정렬과 마찬가지로 성능을 기대하기 어려운 정렬 중 하나입니다. 또한 구현하기도 어렵지 않은 정렬입니다. 매 사이클마다 배열에서 가장 큰 수를 찾습니다. 그렇게 찾은 큰 수를 맨 뒤에서 사이클의 반복횟수만큼 뺀 위치의 원소와 자리를 바꿉니다. (그 이유는 첫 사이클을 제외한 사이클에서는 맨 뒤에있는 수는 이미 정렬이 끝난 가장 큰 수이기 때문입니다.) 사실 위의 과정은 상당히 간략화 되었지만 자세히 들여다 보겠습니다. 선택 정렬은 각 사이클마다 위의 과정처럼 최대 수를 찾..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 35 [라이브러리 함수3(날짜 및 시간, time.h)]

제 35강) 라이브러리 함수3 - 날짜 및 시간 오늘은 "강의에서 다루지 않았던"의 다섯번째 시간입니다. 이번 시간에는 라이브러리 함수3인 날짜 및 시간 라이브러리에 대해서 다뤄보려고 합니다. C언어에서 제공하는 "날짜 및 시간" 라이브러리는 time.h를 포함하면 사용이 가능합니다. 자료형 time.h​ 에는 다음과 같이 4개의 자료형을 선언하고 있습니다. 이름 자료형 원형 기능 clock_t Tick 수를 샐 수 있는 시계 전용 자료형(시스템 시간을 잴 때 사용) size_t unsigned int 부호 없는 정수 자료형으로 바이트 단위의 크기를 나타낼 때 사용 time_t 시간을 나타내기 위한 자료형 struct tm 시간을 받아서 저장하는 구조체 여기서struct tm을 좀더 자세히 봅시다. 멤버..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 32 [다루지 않았던2(Call by ~)]

제 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; } 위와 같이 직접 값(주소값이 아닌!!)을 전달하여 호출하는 것..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 31 [다루지 않았던1(포인터를 이용한 함수 통신)]

제 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..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 30 [전역변수와 정적변수(static)]

제 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; } 위의 예제를 한 번 뜯어봅시다. 이..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 29 [소스파일의 분할(헤더파일)]

제 29강) 소스파일의 분할(헤더파일) 오늘은 소스파일을 분할하여 편집하기 편하게, 보기 편하게 만드는 법을 알려드리려합니다. (즉, 헤더파일이라는 것을 알게됩니다.) 헤더파일 소스파일을 분할시키기 전에 헤더파일에 대해서 먼저 알아봅시다. 헤더파일은 특히 C와 C++에서 컴파일러에 의해 다른 소스파일에 자동으로 포함된 소스코드의 파일을 뜻합니다. 즉, 무언가가 선언되어 있는 파일을 뜻하고 이것을 우리가 사용하기 위해 #include를 합니다. 헤더파일에는 주로 형을 알리는 것들이 들어가있습니다. 1. #define 2. enum (다음 강의에서 배웁니다.) 3. struct 선언부 4. class 선언부 (C++에 해당됩니다.) 5. 함수형 이런 것들이 선언되어 있습니다. 소스파일 분할하기 먼저 간단한 ..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 28 [전처리기(include, define, ifdef)]

제 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..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 27 [C언어의 파일 입출력2]

제 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이 아닌 값을 반..

Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 26 [C언어의 파일 입출력1]

제 26강) C언어의 파일 입출력1 오늘은 아마 가장 긴 강좌가 될지도 모르는 "파일 입출력"에 대해서 알아보겠습니다. (입출력 = 입력 + 출력) C언어에서의 파일 입출력은 정말 중요합니다. C++언어에서도 성능 때문에 C언어의 파일 입출력을 종종 사용하지요. 1) 파일과의 통신(FILE) 파일과의 통신을 하기 위해서는 "어떻게 사용할 수 있느냐" 라는 의문을 가져야 합니다. 크게 우리는 2가지 측면에서 접근할 수 있습니다. ① 바이너리(Binary) 적인 접근 ② 텍스트(Text) 적인 접근 바이너리적으로 접근을 하게 되면 우리는 모든 바이트를 가지고 프로그램에서 사용할 수 있습니다. 이것은 어떤 시스템에서든지 동일하게 사용이 가능하죠. 텍스트적으로 접근을 하게 되면 텍스트단위를 가지고 프로그램에서 ..

Eskeptor
'왕초보' 태그의 글 목록