[C언어] 재귀함수(피보나치수열)는 자신을 return하면 안된다
[C언어] 재귀함수(피보나치수열)는 자신을 return하면 안된다 백준 1003번 문제인 피보나치수열(재귀함수)를 풀면서 자꾸 시간초과가 떴는데, 알고보니 자기 자신을 리턴해서 발생했던 것이었다. 이번시간에는 피보나치수열(재귀함수)에서 자기자신을 리턴해주면 안되는 이유를 포스팅하고자 한다. 1. 피보나치 수열은 무엇인가? 피보나치 수열이란 자기 함수안에서 자기 함수를 재귀적(Recursive)으로 불러들이는 수열을 의미한다. 피보나치 수열의 수학적 정의는 아래와 같다. 이런 피보나치 수열형태를 소스코드화하면 간단하게 아래와 같이 생각할 수 있다. fibonacci(int n){ //주저리 주저리.. return fibonacci(n-1) + fibonacci(n-2) } 즉, 함수안에서 자기 자신을 계속..
[C/C++] float, double은 ==로 비교하면 안되는 이유
[C/C++] float, double은 ==로 비교하면 안되는 이유 말 그대로 부동 소수점, C/C++에서는 float나 double로 불리는 자료형은 == 연산자로 비교해서는 안됩니다. 그 이유를 알아봅시다. 3.14 == 3.14는 거짓이다. 3.14를 비교하는 코드를 보겠습니다. #include int main(void) { double fval = 3.14; printf("%.10lf %.10f \n", fval, (float)fval); return 0; } 같은 값이 나올까요? 아닙니다, 출력해보면 아래와 같이 오차를 포함하여 출력이 될겁니다. 오차 값은 때에 따라 달라질 수 있습니다. float로 형변환한 것이 오차를 발생시키고, 같지 않다는 결과가 리턴된다. 컴퓨터는 소수를 표현하기 위해..
[C/C++] math.h로 정확한 파이값 사용하는 방법
[C/C++] math.h로 정확한 파이값 사용하는 방법 엄밀히 이야기해서 정확한 파이값은 아니고, double 형으로 표현되는 마지막 자리까지의 파이값이다. 그래도 우리가 정의하는 '#define pi 3.141592'와 같은 방식보다는 훨씬 정확하니 필자는 사용을 권장한다. Math.h로 정의되는 상수값의 종류는 아래와 같다. /** The constant \a e.*/ #define M_E2.7182818284590452354 /** The logarithm of the \a e to base 2. */ #define M_LOG2E1.4426950408889634074/* log_2 e */ /** The logarithm of the \a e to base 10. */ #define M_LOG10..
[C/C++] 키보드 매크로 프로그램 만들기
[C/C++] 키보드 매크로 프로그램 만들기 회사에서 각 시험실의 안전 일일체크리스트를 수행하는 업무가 있는데, 좌표가 동일한 값들을 하나하나 찍어서 결재를 올리는 루틴한 업무라서 귀찮아서 C/C++ 언어를 이용하여 매크로를 하나 만들었다. F2키를 눌러서 좌표를 확인할 수 있고, 그 좌표를 x/y,x1/y1,x2/y2,x3/y3 좌표에 넣으면 된다. 직접 코드를 복붙해서 빌드해보면 어떤 원리인지 알 것이다. #include #include #include using namespace std; void home(); int F10_exit(); int main(void) { POINT pt; int x[100], y[100]; //통합개발센터 x,y좌표 int x1[100], y1[100]; //시험실1..
[C/C++] 무조건 강제종료하기
[C/C++] 무조건 강제종료하기 C언어에서의 종료 만약 프로그램 내에서 강제 종료를 해야 할 때는 어떻게 해야 할까요?? 그럴때를 대비해 존재하는 것이 exit() 함수입니다. 함수 원형은 void exit(int status); 로 정상적 종료는 0을 비정상적 종료는 1을 매개변수로 사용합니다. exit(0); 이나 exit(1); 이렇게 사용하는 것이지요. 이 함수를 사용하기 전에 한가지 선언하셔야 해요 바로 이 함수가 들어있는 헤더파일 이지요. #include 이렇게 선언하시면 됩니다. stdlib.h 헤더파일은 stdio.h 다음으로 많이 사용되니까요 알아두셔요^^ 예제 void main(void) { int n; printf("1. 출력 2. 종료 --> 선택 : "); scanf("%d", ..
[C/C++] Break/Return/Continue 차이
●분기문: 프로그램 수행에 있어서 지정된 위치로 이동하는 제어 명령으로 코드 블록 내의 프로그램 실행을 종료하거나 다른 위치로 이동시킬 때 주로 사용되는 문장. break 문: for, while 등의 반복문이나, switch~case 문을 빠져나올 때 사용하는 문장. ●break 문 코드 예제 #include int main() { int cnt = 1, hap = 0; printf("\n ■1부터 50까지 누적합이 1000을 넘으면 종료■\n"); printf("-----------------------------------------------\n"); while (cnt 1000) { break; } else { hap += cnt; cnt++; } } printf("1부터 %d까지의 누적합..%..
[C/C++] #Pragma pack(1) 의미
[C/C++] #Pragma pack(1) 의미 이번 시간에는 C/C++ 메인문 상단에 자주 보이는 #pragma pack(1)에 대해 알아보자. 1. #pragma pack이란? #pragma pack을 부르는 명칭은 Word Alignment이다. 32비트 프로세서 기반에선 데이터 처리를 위해 사용되는 버스가 4바이트이지만, #pragma pack(n)을 사용하면 데이터 처리를 위해 사용되는 버스를 n바이트로 정의하겠다는 뜻이다. 즉, #pragma pack(1)로 선언하면 데이터가 저장되는 주소의 단위가 1byte단위로 끊긴다는 뜻이다. 메모리를 낭비없이 Compact하게 사용하기 위해 사용하는 명령어이다. 다만, 1바이트로 동작하게 되면 그만큼 수행 속도가 느려지는 문제가 있으나, 최근의 컴퓨터들..
[C/C++] struct와 typedef struct 차이
[C/C++] struct와 typedef struct 차이 이번 시간에는 대표적인 구조체 선언 방식인 typedef struct와 struct의 차이에 대해 알아보자. ※ 한줄요약 - struct ① 별명없이 쓰는 구조체 (별명은 지을수 있지만, 기능이 없다) ② 선언시 'struct+구조체이름'을 적어줘야 함 - typedef struct ① 별명을 지을 수 있는 구조체 ② 선언시 '별명'만 적어주면 됨 (+) 구조체 이름과 별명은 같은 명칭으로 쓸 수 없기 때문에 관례상 구조체이름은 _(언더바)를 붙인다. (예시) typedef struct _Person { // 구조체 이름은 _Person char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address..
[vscode] 액션을 선택해 주십시오. 액세스 거부 해결 방법
Visual Studio Code를 사용하다보면 간혹 다음과 같은 오류창이 뜨는 경우가 있다 이게 모냐... 액세스 거부는 역시 폴더 접근 권한 문제다 해결책 VS Code가 설치된 경로에 대한 접근 권한을 바꿔주면 해결된다 탐색기에서 설치 경로 (위 메시지에서는 C:\\Program Files\\Microsoft VS Code)를 우클릭해서 속성창을 연 뒤 '보안' 탭을 연 뒤 사용 권한 '편집' 버튼을 클릭 '그룹 또는 사용자 이름' 리스트에서 Users (로그인아이디\\Users) 선택 후 사용 권한 리스트에서 '모든 권한' 허용 체크박스 클릭 후 적용 오류창에서 재시도 버튼을 클릭 오류창이 다시 뜨지 않는다면 해결된 것이다 혹은, VS Code를 Program Files 내에 설치하지 않는 것도 ..
[C/C++] 자료형의 크기 및 표현 범위
[C/C++] 자료형의 크기 및 표현 범위 구분 자료형 Byte 범위 기본형 void 1 - 문자형 (signed) char - %c 1 -128 ~ 127 unsigned char - %c 1 0 ~ 255 wchar_t - %c 2 0 ~ 65,535 정수형 bool - %d 1 0 ~ 1 (signed) short (int) - %d 2 -32,768 ~ 32,767 unsigned short (int) - %d 2 0 ~ 65,535 (signed) int - %d 4 8 32bit OS : -2^31 ~ 2^31 - 1 64bit OS : -2^63 ~ 2^63 - 1 unsigned int - %d 4 8 32bit OS : 0 ~ 2^32 64bit OS : 0 ~ 2^64 (signed) ..