본문 바로가기
반응형

개발/C, C++67

단락 평가 Short Circuit C, C++ 전체 링크 논리 연산에서 뒤의 수식과 상관없이 이미 판정 결과가 나온다면, 뒤의 수식은 수행될 필요가 없다. AND 연산 A && B && C 에서 A가 false라면, B와 C는 true/false 여부에 상관없이 false다. OR 연산 A || B || C 에서 A가 true라면, B와 C는 true/false 여부에 상관없이 true다. C/C++에서 short circuit이 작동하는지 확인해보자. 먼저 아래의 코드를 실행해서 printf의 return 값을 알아보자. #include int main(void) { int pf1 = printf("hello\n"); int pf2 = printf("world!!\n"); printf("pf1 : %d, pf2 : %d\n", pf1,.. 2021. 5. 11.
C++ split 함수 구현 C, C++ 전체 링크 아래의 string을 ","로 구분하여 a / b / c / d / ef / ghi / jkl / mn / opqr 이 되도록 해보자. a,b,c,d,ef,ghi,jkl,mn,opqr 즉, str을 ","로 split하여 vector의 결과를 얻어보자. C언어에서 문자열의 끝은 0으로 구분한다. 따라서 split의 종료는 0이 될 때 종료할 수 있다. 그러나 linux로 file 작업을 하다보면 문자열의 끝이 0이 아닌 경우가 종종 있다. 뭔가 작업이 잘 안된다면 char type을 %d로 출력하면 정체를 확인할 수 있다. 여러 상황이 있겠지만, 경험상 ASCII 코드의 10번인 개행문자 '\n'와 13번인 Line Feed가 있다. 이러한 값들이 대부분 실제 vi로 보이지 않고,.. 2021. 5. 8.
typedef 선언 C, C++ 전체 링크 typedef를 이용하면 기존에 존재하는 자료형의 이름을 재정의 할 수 있다. 예를 들어 unsigned long long int type을 선언한다고 가정하자. 그러면 새로운 변수를 쓸 때마다 매번 "unsigned long long int"를 선언해야 한다. 하지만 typedef로 unsigned long long int를 ull로 재정의하면 한결 편해진다. #include typedef unsigned long long int ull; int main(void) { ull a = 1ull 2021. 5. 2.
C++ 포인터와 참조자 (pointer vs reference) C, C++ 전체 링크 포인터와 참조자 모두 call by reference로 함수 내에서 변수의 값을 변경할 수 있다. 포인터는 선언 시에 주소를 할당할 필요가 없고, 나중에 다른 주소를 할당할 수 있지만, 참조자는 반드시 처음에 변수를 할당하고, 나중에 변경할수도 없다. 포인터가 함수로 넘어가면 새로운 포인터에 포인터의 주소를 복사하기 때문에 메모리가 필요하지만, 참조자는 이름만 빌리기 때문에 메모리가 필요없다. 포인터는 변수를 바꾸기 위해 * 연산자를 이용하지만, 참조자는 이름만 바뀌었으므로 그대로 변경하면 된다. 아래의 내용을 실행해서 포인터와 참조자의 차이를 비교해보자. #include void checkPointer(int* ptr) { printf("-------checkPointer----.. 2021. 5. 1.
제곱근 Square root : 바빌로니아 법 (The Babylonian Method) C, C++ 전체 링크 바빌로니아 법은 임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법이다. 이 수열을 계속해서 반복하면 x가 √a가 된다. 먼저 PRECISION_COUNT를 5로 정의하고, 바빌로니아 법을 5번 반복해보자. printf에 .[Number]f로 옵션을 주면 Number의 자릿수만큼 소수점을 출력할 수 있다. #include #define PRECISION_COUNT (5) double sqrt(int num) { double x = num / 2.0; for (int i = 0; i < PRECISION_COUNT; i++) { x = (x + (num / x)) / 2; /* xn+1 = (xn + (num / xn)) / 2 */ } return x; } i.. 2021. 4. 9.
C++ ofstream을 이용한 FILE 출력 C, C++ 전체 링크 C++에서 파일을 출력하는 방법 중 하나는 ofstream이다. ofstream은 fstream header와 namespace std를 선언하면 쓸 수 있다. 먼저 ofstream type 변수를 하나 선언한다. open 메서드를 이용하여 출력할 파일명을 넣는다. 파일명이 없다면 새로 파일을 만들지만, 솔루션 탐색기에는 따로 추가해야한다. 출력할 파일이 정해졌으면 " 2021. 3. 18.
에라토스테네스의 체 - 소수 판단 C, C++ 전체 링크 어떤 수 하나를 소수 판단할 경우는 링크에서 for문을 돌면서 판단할 수 있다. 하지만 매번 숫자를 소수 판단하면 비용이 많이 들기 때문에, memoization 기법으로, 특정 숫자가 소수인지 미리 체크해두면 편하다. 이때, 사용하는 알고리즘이 에라토스테네스의 체 이다. 배열 prime[]은 소수인 경우 0, 소수가 아닌 경우 1로 표시하자. 이제 1 ~ 50의 경우 소수를 판단하는 원리를 알아보자. 먼저, 1은 소수가 아니므로 지운다. prime[1] = 1 이제부터 에라토스테네스의 체가 시작된다. 에라토스테네스의 체에 걸려있지 않다면, 소수다. 현재 2는 에라토스테네스의 체에 걸려있지 않으므로, 소수이다. 그리고 2 부터 2칸씩 모두 소수가 아니므로 지운다. prime[2 *.. 2021. 3. 16.
scanf로 문자열과 공백 받기 C, C++ 전체 링크 아래와 같은 input.txt가 있다고 하자. 문자열은 보통 c에서 scanf로 받지만 공백이 있는 경우는 까다롭다. scanf에 더이상 읽을 파일이 없을 경우 -1(EOF : End of File)을 return하기 때문에 txt의 끝은 알 수 있지만, input은 공백을 기준으로 file 입력을 끊어버린다. #include int main(void) { char input[100]; while(scanf("%s", input) != EOF) { printf("%s\n", input); } return 0; } 공백을 기준으로 input에 read 되는 것을 알 수 있다. 이러한 점을 방지하기 위해, scanf에 " %[^\n\r]" 옵션을 넣어주면, 공백을 무시하고 한 줄을 입.. 2021. 3. 16.
소수 판단 함수 C, C++ 전체 링크 참고 - 에라토스테네스의 체 - 소수 판단 어떤 수가 소수인지 판단하는 방법은 나눠떨어지는 수가 있는지 직접 나눠보면 된다. 예를 들어 13을 소수인지 아닌지 판단해보자. 1로 나누는 것은 의미가 없으므로, 2부터 나눠보자. 13 / 2 는 나눠떨어지지 않는다. 13 / 3 는 나눠떨어지지 않는다. 13 / 4 는 나눠떨어지지 않는다. ... 13 / 12 는 나눠떨어지지 않는다. 따라서 13은 소수이다. 하지만 이 과정을 다 해볼 필요는 없다. 2 부터 12까지가 아니라 √13까지만 나눠보면 된다. 만약 √13보다 작은 수에서 나눠 떨어지는 수가 있다면 √13보다 큰 수에서도 나눠떨어지기 때문이다. c/c++에서 math 함수를 이용하면 루트를 계산할 수 있지만, 라이브러리를 사.. 2021. 3. 14.
반응형