프로그래밍 언어

    [C++] sort , stable_sort

    sort()함수 #include 헤더 포함 - default 는 오름차순이다. - 정렬 조건을 주고 싶을때 함수를 만들어 함수이름 자리에 넣어주면 된다. (필수 X ) sort(시작주소, 끝주소+1, 함수이름 ) 1) 기본 배열의 sort 배열의 이름은 배열의 시작 주소값이므로 arr과 arr+ (요소의 개수) 를 단순하게 인자값으로 넣어주면 된다. #include #include using namespace std; int main() { int arr[5] = {3,7,1,9,5}; sort(arr, arr + 5); for (int i = 0; i < 5; i++) { cout

    [C] gets 함수는 사용하지 말아야 한다.

    프로그래밍을 하는 고수 프로그래머의 대부분(아니 거의 전부) 는 다들 gets 함수를 사용하지 말라고 조언한다. 그 이유에 대해서 1988년 엄청난 피해를 입혔던 모리스 웜(Morris Worm) 에 대해 언급하고자 한다. 컴퓨터 해킹의 역사에서 엄청나게 굵고 큰 한 획을 그었던 Morris Worm 의 컴퓨터 파괴 원리는 바로 버퍼 오버플로우이다. 요즘의 언어인 JAVA나 Python 같은 언어는 메모리를 자체적으로 관리하기 때문에 버퍼 오버플로우에 대해서는 안전할 수 있겠지만, 프로그래머에게 엄청난 자유를 선사하는 어셈블리어, C, C++ 등은 시스템에 매우 밀접하게 동작하므로 버퍼 오버플로우에 대한 고려를 프로그래머가 직접 해야 한다. Morris Worm은 바로 C 언어의 표준 함수 중 버퍼 오버..

    [C] while 반복문을 종료하는 방법: 센티넬, EOF, 플래그

    카운터 제어 while 반복문 반복 횟수를 알고 있다면 카운터를 사용해 while문을 종료시킬 수 있다. while문을 카운터 조건을 통해 종료하려고 하는데, 카운터를 증가시키거나 감소시키는 코드를 까먹고 적지 않았다면 무한루프가 발생할 우려가 있다. 조건은 구문이 시작될 때 적어야 하는데, 조건을 충족할 수 있게 제어하는 코드는 while문 내부에 있어서 이런 실수가 발생할 확률은 은근히 높다. 따라서 이 경우에는 for문을 사용하는 것이 일반적이다. #include using namespace std; int main() { int counter = 0; while (counter > num; } cou..

    [C++] EOF(End Of File) 처리 방법

    1. scanf()가 입력받은 인자의 갯수를 리턴하는 특성을 활용하는 방법 #include int main() { int a, b; while (scanf("%d%d", &a, &b) == 2) // scanf는 입력받은 갯수를 리턴한다 // 만약에 scanf("%d",&a); 에서 입력이 제대로 들어왔다면 1이 리턴된다. // 그렇기 때문에 a,b를 입력받는 scanf가 2와 같다면이란 말은 입력이 있다면과 같은 말이다 printf("%d\n", a + b); }​ 2. scanf()를 EOF와 직접 비교하는 방법 #include int main(){ int a,b; while(scanf("%d %d",&a,&b) != EOF) // EOF == End Of File // 말그대로 파일의 끝에 도달하면..

    [C] 자료형 - 정수/실수

    자료형이란? 메모리에 데이터가 저장되는 형식이다. 자료형마다 메모리 공간을 다르게 할당되는데, 예를 들어 int의 경우 4byte, char의 경우 1byte 이다. 자료형에는 정수형과 실수형으로 나눠진다. 정수형에는 char, short, int, long 이 존재하고 실수형에는 float, double, long double이 존재한다. 참고 : bit 와 byte 1byte는 8bit를 나타낸다. 종종 컴퓨터보면 32bit, 64bit로 나눠지는것을 본적이 있다. 이는 CPU가 한번에 처리하는 비트의 수로 32bit는 한번에 32개의 bit를 처리하고, 64bit 64개의 비트를 처리한다. 사용 범위 - 정수형 char : 1byte(8bit) : -128 ~ 127 short : 2byte(16b..

    [C] 서식 지정자의 모든것 (서식문자)

    서식 지정자란? printf, scanf, sprintf, fprintf 등의 여러 API 에서 가변인자를 받아서 처리하기 위한 데이터 포맷이다. 가변인자를 처리하는 API 함수 내부에서 어떤 인자를 어떤식으로 처리할지 지정하기 위해서 사용한다. 여러 API 에서 가변인자를 서식 지정자를 통해 처리하는데 printf 와 scanf 만 비교해봐도 서식 지정자로 특정할 수 있는 자료형의 스펙이 조금씩 다르다. printf 는 타입을 전달받아 데이터를 출력하기 때문에 형변환(type casting) 및 형승격(type promotion) 을 통해 크기가 다른 타입에 대해서 유연한 메모리 처리가 가능하지만, scanf 는 포인터를 전달받아 입력받은 데이터를 저장하기 때문에 서식 지정자에 의존하여 메모리 처리를 ..

    [C] 피보나치 수열과 메모이제이션

    피보나치 수열은 수학에서 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. 점화식은 Fn = Fn-1 + Fn-2으로 정리된다. 재귀 함수를 이용한 풀이 #include long long fibo(int n); int main(){ printf("%lld", fibo(10)); return 0; } long long fibo(int n){ if (n < 2) return n; return fibo(n-1) + fibo(n-2); } 당장 fibo(100)만 넣어보면. 프로그램이 계산하다가 뻗어버리는 모습을 볼 수 있다. 불필요한 호출이 일어나서 프로그램이 느려지는건데 간단히 fibo(10) 을 계산하려면 fibo(9), fibo(8) 이 호출되고 fibo(9)가 다시 fib..

    [C++] min max 함수 (algorithm 라이브러리)

    0. std::min & std::max 1. ①비교할 값들이 많거나, ②ArrayㆍVector와 같은 일련의 컨테이너에 저장되어 있다면, 최소값ㆍ최대값을 구하기 위해 min_element 또는 max_element 함수를 사용할 수 있다. (해당 함수에 대해서는 나중에 포스팅 하겠다.) 2. std::min와 std::max는 algorithm 라이브러리에 3가지 형태로 존재한다. 『① Default Constructor 』 『② Custom Constructor 』 『③ Initializer List Constructor 』 가 이에 해당한다. 1. std::min & std::max 『① Default Constructor 』 함수 원형 /* -- Default Constructor -- */ #i..

    [C] min max 매크로함수

    1. The old C macro way 매크로 원형 /* min */ #define min(a, b) (((a) (b)) ? (a) : (b)) 단점 : double-evaluation side effect 발생 /* Input */ #include #define min(a, b) (((a) (b)) ? (a) : (b)) int main(int argc, char * argv[]) { int a = 2, b = 3; printf("%d\n", min(a, b)); printf("a : %d b : %d\n\n", a, b..

    [C] 문자열에서 공백을 제거하는 함수

    문자열 중앙에 있는 공백도 제거하는 함수가 필요해서 만들었다. 아래의 DeleteSpace함수는 인수로 받는 문자열에서 문자열에서 앞, 뒤, 가운데에 있는 모든 공백을 제거해서 제거된 문자열을 반환하는 함수다. 사용법: char *str = DeleteSpace("공백이 있는 문자열"); char str[] = DeleteSpace("공백이 있는 문자열"); #include #include char* DeleteSpace(char s[]) { char* str = (char*)malloc(sizeof(s)); int i, k = 0; for (i = 0; i < strlen(s); i++) if (s[i] != ' ') str[k++] = s[i]; str[k] = '\0'; return str; } i..