c언어 썸네일형 리스트형 [C언어] printf를 이용해 소수점 이하 자릿수 설정하기 ※ 요약 C언어의 printf를 이용하여 float형이나 double형을 출력할때 소수점 이하 자릿수를 조절해서 출력하는 방법에 대한 글이다. C언어의 printf를 이용하여 자릿수를 정할 때는 보통 printf( "%.2f\n", 3.141592 );와 같이 자릿수를 설정하면 런타임 때 자릿수를 바꿀 수 없지만 이번에 포스팅하는 방법으로는 런타임 때도 자릿수를 바꿀 수 있어 좀 더 유연하게 출력이 가능하다.C++의 cout도 궁금하다면 부동 소수점의 출력 정밀도 설정을 참고하기 바란다. ※ 소스코드 소스코드는 딱히 설명이 필요없을 정도로 간단하다. 필자는 예제를 위해 아래처럼 Print함수를 제작하였고, 필요에 따라 자릿수를 변경하여 출력하도록 하였다. 참고로 인자로 받을때 레퍼런스로 받도록 &를 붙였.. 더보기 [C언어] 두 점 사이의 거리 구하기 ※ 요약 피타고라스의 정리를 이용한 두 점 사이의 거리 구하기다. 아래 그림과 같은 직각 삼각형이 있을때, 세 변의 길이는 a^2+b^2=c^2인 관계가 성립한다는 것이 피타고라스 정리다. 위 같은 공식을 아래 그림에 적용해보자. 먼저 빨간점 p1과 p2가 있고, 각각 가상의 수직선과 수평선을 그었다. 그리고 가상의 노란 빗변을 이어주니 직각 삼각형이 되었다. 이제 a^2+b^2=c^2를 이용하여 두 점 사이의 거리를 구한다는게 느낌이 올 것이다. (좀더 자세히 쓰려다가 그림 그리기도 귀찮고 수식 입력도 안되서 여기까지 작성함) ※ 특징 C언어를 이용해 피타고라스 정리를 구현하여 두 점 사이의 거리를 구한다. C언어 소스는 아래와 같다. 임의의 점 p1(432, 189)과 p2(38, 392)의 거리를 .. 더보기 [C++11] 중복없는 로또 프로그램 ※ 로또 프로그램 요약 C++11 문법을 이용하여 제작한 간단한 로또 프로그램이다. 전에 C언어로 제작한 로또 프로그램을 C++11 문법으로 리팩토링 하였다. 알고리즘 및 큰 흐름은 거의 같고 문법만 C에서 C++11로 바꿨으니 둘을 비교하면서 보면 좋을 것이다. ※ 로또 프로그램 특징 - C++11에 추가된 새로운 random(Mersenne Twister)을 이용하여 속도가 빠르고 품질이 좋다. - 중복 판별을 위한 인덱스를 따로 관리하여 요소 개수가 많더라도 중복 판별에 상수 시간 복잡도를 갖을 수 있어 매우 빠르다. - 표준 문법으로만 작성하여 윈도우, 리눅스 모두 컴파일 가능하다. (단 VS2013(12.0) 이상, gcc 4.8 이상) #include //std::cout #include //.. 더보기 BMP 헤더 정보 BMP 헤더 정보입니다. //비트맵 파일에 대한 정보(파일 헤드)typedef struct tagBITMAPFILEHEADER{ WORD bfType ; //"BM"이라는 값을 저장함 DWORD bfSize ; //바이트 단위로 전체파일 크기 WORD bfReserved1 ; //예약된 변수 WORD bfReserved2 ; //예약된 변수 DWORD bfOffBits ; //영상 데이터 위치까지의 거리} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER , *PBITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //이 구조체의 크기 LONG biWidth; //픽셀 단위로 영상의 폭 LONG biHeight;.. 더보기 [C언어] rand 함수를 이용한 로또 프로그램 ※설명 아래는 C언어로 만든 로또 번호 생성 예제이자 중복 없는 난수 생성 예제다. 본인이 배포하는 로또 프로그램에서 일부 가져와 군더더기를 제거하고 예제에 맞게 수정했다. 중복을 방지하기 위해 생성 여부에 대한 일종의 인덱스를 둬서 따로 검사하지 않아도 중복을 방지할 수 있게 했다. 흔히 사용하는 배열 요소를 처음부터 끝까지 조사 방식은 배열 개수에 따라 속도가 엄청 느려지므로 추천하지 않으며 이렇게 인덱스를 두는 방법은 에라토스테네스의 체를 구할 때도 이용되고 데이터를 캐싱할 때 이미 불러들인 데이터인지 판별할 때도 사용된다. C++로 구현한 로또 프로그램도 있으니 비교해보니 바란다. ※예제#include #include //srand #include //time //#define _MAX 6 con.. 더보기 [C언어] 재귀 함수 - 10진수 -> 2진수 변환 ※요약 재귀함수를 통해 10진수를 2진수로 변환한다. ※특징 10진수 n을 Dec2Binary함수에 넣으면 2진수로 출력해준다. int형으로 값을 받으므로 2,147,483,647의 수까지 변환이 되며, 더 큰 수를 변환하고 싶으면 unsigned int나 unsigned __int64로 하면 된다. unsigned __int64의 경우 18446744073709551615의 수를 2진수로 변환 할 수 있다. ※예제 #include void Dec2Binary( unsigned __int64 nNum ); int main( ) { unsigned __int64 nNum = 0; printf( "-1 입력시 종료 됩니다.\n" ); while( nNum != -1 ) { printf( "숫자를 입력하세요 .. 더보기 [C언어] 소수점 특정 자릿수 반올림하기 - ROUND 함수 ※요약C언어나 C++ 등에서 소수점 특정 자릿수 반올림하는 방법입니다. 매크로 함수와 일반 함수 2가지로 구현되어 있으며, 다른 곳에서 사용할 땐 원하는 함수만 복사해서 쓰면 됩니다. ※예제 #include #include #define ROUNDING(x, dig)( floor((x) * pow(float(10), dig) + 0.5f) / pow(float(10), dig) ) double Rounding( double x, int digit ) { return ( floor( (x) * pow( float(10), digit ) + 0.5f ) / pow( float(10), digit ) ); } int main( ) { printf( "%g\n", ROUNDING( 9.3453456, 3 ) ).. 더보기 [C언어] 어떤 수 x가 2의 n승인지 판별하는 함수 ※요약어떤 수가 있을 때, 이 수가 2의 n승인지 판별하는 방법입니다. ※특징비트 연산을 이용해 속도가 빠름 ※함수 설명2의 3승인 8을 2진수로 표현하면 아래와 같습니다.(편의상 8비트로 표현)0000 1000여기서 1을 빼주면0000 0111이 되고, 0000 1000와 & 연산을 하게 되면 0이 나옵니다. 0000 10000000 0111-------------&연산 (& 연산자는 두 개의 비트가 모두 1일 때 1이 됨, 고로 여기서는 0이 됨)0000 0000 비트 연산 보기 ※예제 #include bool CheckPowerOfTwo( int nNum ); int main( ) { int x = 0; bool bState = false; printf( "-1 입력시 종료 됩니다.\n" ); wh.. 더보기 [C언어] 파일 및 디렉토리 이름 변경 함수 - rename ※요약rename : 파일 및 디렉토리의 이름을 변경한다. ※특징이름 변경 말고도 파일을 이동할 때 사용할 수 있다. ※함수 원형 및 설명 int rename( const char *oldname, const char *newname ); //oldname : 파일 또는 디렉토리의 경로나 이름 //newname : 변경할 파일 또는 디렉토리의 이름 //반환값 : 성공 시 0, 실패 시 errno ( EACCES, ENOENT, EINVAL ) ※예제 #include #include //mkdir, rename int main( ) { char strOldFolder[] = "d:\\TestOldFolder"; char strNewFolder[] = "d:\\TestNewFolder"; //테스트 폴더를 .. 더보기 [C언어] 현재 작업 드라이브 구하는 함수 - _getdrive ※요약 _getdrive : 현재 작업 중인 드라이브를 구한다. ※함수 원형 및 설명 int _getdrive( ); //반환값 : A드라이브=1 ~ Z드라이브=26 일때 현재 드라이브 값 ※예제 설명 아래 예제의 getdrive는 int형을 반환하지만 반환값이 1에서 26으로 정해져 있어 char형 데이터 범위에 들어가므로 char형으로 변환해도 문제가 없다. int형 데이터를 char형으로 명시적 형 변환을 해줘서 각 드라이브명을 출력하게 했다. 96을 더해준건 아스키 코드표를 보면 알 수 있다. ※예제 #include #include //_getdrive int main( ) { int nDrive = 0; nDrive = _getdrive( ); printf( "현재 드라이브는 %c입니다.", c.. 더보기 [C언어] 작업 디렉토리 (폴더) 변경 함수 - chdir ※요약 chdir : 현재 작업 디렉토리를 변경한다. change directory ※함수 원형 및 설명 int chdir( const char *dirname ); //dirname : 변경할 디렉토리의 경로 //반환값 : 정상 일 때 0, 에러 시 -1 ※예제 #include #include //chdirㅐ #ifndef _MAX_PATH #define _MAX_PATH 260 #endif int main( ) { char strBuffer[_MAX_PATH] = { 0, }; char strChangeDir[_MAX_PATH] = { "C:\\Windows" }; int nResult = chdir( strChangeDir ); if( nResult == 0 ) { printf( "이동 성공" );.. 더보기 [C언어] 현재 작업 경로 얻는 함수 - getcwd ※요약 getcwd : 현재 작업 중인 디렉토리의 경로를 얻는다. ※특징 버퍼가 작으면 에러가 발생할 수 있으므로 크게 잡는다. ※함수 원형 및 설명 char *getcwd( char *buffer, int maxlen ); //buffer : 파일의 경로 //maxlen : 파일에 설정할 접근 모드 값 //반환값 : 정상 일 때 0, 에러 시 -1 ※예제 #include #include //getcwd #ifndef _MAX_PATH #define _MAX_PATH 260 #endif int main( ) { char strBuffer[_MAX_PATH] = { 0, }; char *pstrBuffer = NULL; pstrBuffer = getcwd( strBuffer, _MAX_PATH ); ret.. 더보기 [C언어] 파일 및 디렉토리 속성 변경 함수 - chmod ※요약 chmod : 파일이나 디렉토리의 읽기/쓰기 접근 권한을 변경한다. change mode ※특징 pmode 값은 _S_IREAD와 _S_IWRITE 값만 사용한다. ※함수 원형 및 설명 int chmod( const char *filename, int pmode ); //filename : 파일의 경로 //pmode : 파일에 설정할 접근 모드 값 //반환값 : 정상 일 때 0, 에러 시 -1 접근 권한 설 명 비 고 _S_IREAD 읽기 접근 권한 - _S_IWRITE 쓰기 접근 권한 _S_IREAD 속성 해제 ※예제 #include #include //_S_IREAD, _S_IWRITE #include //chmod int main( ) { char strPath[] = { "D:\\Text... 더보기 [C언어] 디렉토리 (폴더) 생성 함수 - mkdir ※요약 mkdir : 디렉토리(폴더)를 생성한다. make directory ※특징 만들려는 폴더가 이미 존재하면 errno는 EEXIST, 폴더가 부정확하면 errno는 ENOENT ※함수 원형 및 설명 int mkdir( const char *dirname ); //dirname : 생성할 디렉토리 경로와 이름 //반환값 : 정상 일 때 0, 에러 시 -1 ※예제 #include #include //mkdir #include //errno int main( ) { char strFolderPath[] = { "D:\\CreateFolder" }; int nResult = mkdir( strFolderPath ); if( nResult == 0 ) { printf( "폴더 생성 성공" ); } else.. 더보기 [C언어] 디렉토리 (폴더) 삭제 함수 - rmdir ※요약 rmdir : 디렉토리(폴더)를 삭제한다. ※특징 디렉토리 내에 파일이 존재하거나 사용중이면 삭제할 수 없다. 삭제 전에 디렉토리의 존재 유무 확인 후 삭제하면 좋다. ※함수 원형 및 설명 int rmdir( const char *dirname ); //dirname : 삭제할 디렉토리 경로 //반환값 : 정상 일 때 0, 에러 시 -1 ※예제 #include #include //rmdir #include //errno int main( ) { char strFolderPath[] = { "D:\\TestFolder2" }; int nResult = rmdir( strFolderPath ); if( nResult == 0 ) { printf( "폴더 삭제 성공" ); } else if( nResu.. 더보기 [C언어] 파일 삭제 함수 - remove ※요약 remove : 지정한 경로의 파일을 삭제한다. ※특징 읽기 전용, 숨김, 시스템 속성 등을 갖는 파일은 삭제할 수 없다. 또 현재 사용 중인 파일도 삭제할 수 없다. ※함수 원형 및 설명 int remove( const char *path ); //path : 파일 경로 //반환값 : 정상 일 때 0, 에러 시 -1 ※예제 #include int main( ) { char strPath[] = { "D:\\Text2.txt" }; int nResult = remove( strPath ); if( nResult == 0 ) { printf( "파일 삭제 성공" ); } else if( nResult == -1 ) { perror( "파일 삭제 실패" ); } return 0; } 더보기 [C언어] 디렉토리 및 파일 존재 유무, 속성 검사 함수 - access ※요약 access : 파일이나 디렉토리(폴더)의 존재 유무, 혹은 파일의 권한 및 속성을 조사할 때 사용한다. ※특징 주로 파일 및 디렉토리가 존재하는 지 조사할때 사용한다. ※함수 원형 및 설명 int access( const char *path, int mode ); //path : 파일이나 폴더의 전체 경로 또는 이름 //mode : 파일이나 폴더의 존재 유무 검사 또는 권한 조사(아래 표 참고) //반환값 : 정상 시 0, 에러 시 -1 ※모드 설명 모 드 설 명 00 파일 및 디렉토리가 존재 하는지 조사 02 쓰기 접근이 허용되는지 조사 04 읽기 접근이 허용되는지 조사 06 읽기 및 쓰기가 허용되는지 조사 ※예제 #include #include //access int main( ) { cha.. 더보기 [C언어] 유니코드로 한글 출력 시 문제 ※요약 유니코드 타입의 한글 문자열을 출력하려고 하면 깨지거나 ??? 등, 제대로 나오지 않는 문제점들이 있다. ※원인 네이버 지식인 참고 ※해결방법 locale.h //헤더를 추가 _wsetlocale( LC_ALL, L"korean" ); //지역화 설정을 전역적으로 적용 wcout.imbue( locale("korean") ); //출력시 부분적 적용 wcin.imbue( locale("korean") ); //입력시 부분적 적용 만일 한 프로그램에 여러 언어를 출력해야 한다면 그때그때 설정을 바꿔준다. ※예제 #include #include int main( ) { _wsetlocale( LC_ALL, L"korean" ); FILE *pFile = NULL; pFile = _wfopen( L"d.. 더보기 [C언어] 파일 에러 및 파일 끝 함수 - ferror, feof ※요약 ferror : 개방된 파일에서 데이터 조작시 에러가 발생되었는지 조사 feof : 개방된 파일에서 파일의 끝을 조사 ※함수 원형 및 설명 int ferror( FILE *stream ); //stream : 개방된 FILE 구조체의 포인터 //반환값 : 에러가 발생했으면 true, 아니면 false int feof( FILE *stream ); //stream : 개방된 FILE 구조체의 포인터 //반환값 : 파일의 끝이면 true, 끝이 아니면 false ※예제 #include #define print(ch) printf( "%x %c\n", ch, ch ) int main( ) { FILE *pFile = NULL; pFile = fopen( "d:\\Text.txt", "r" ); if( .. 더보기 [C언어] 파일 포인터 위치 관련 함수 - fgetpos, fsetpos ※요약fgetpos : 개방된 파일에서 파일 포인터의 위치를 얻는다. fsetpos : 개방된 파일에서 파일 포인터의 위치를 설정한다. ※함수 원형 및 설명 int fgetpos( FILE *stream, fpos_t *pos ); //stream : 개방된 FILE 구조체의 포인터 //pos : 현재 파일 포인터를 읽어올 변수 //반환값 : 성공 시 0, 실패 시 0이 아닌 값 int fsetpos( FILE *stream, const fpos_t *pos ); //stream : 개방된 FILE 구조체의 포인터 //pos : 파일 포인터 위치를 설정할 값 //반환값 : 성공 시 0, 실패 시 0이 아닌 값 ※예제 #include #define print(n) printf( "%lld\n", n ) i.. 더보기 [C언어] 재귀 함수 - 이진 탐색 (Binary Search) ※요약C언어에서 재귀 호출을 이용한 이진 탐색이다. 이진 탐색이란 이름 그대로 탐색할 데이터를 반으로 나눠 나머지 반만 탐색하는 방식을 반복하는 알고리즘이며 빠른 속도로 원하는 값을 찾을 수 있다. 이진 검색, 이분 검색 등으로도 불린다. ※특징 - 각 요소의 값들은 정렬되어 있어야 한다. - 각 요소의 값들은 모두 달라야 한다. ※예제 #include int RecusiveBinSearch( int nArr[], int nBegin, int nEnd, int nTarget ) { int nMid = 0; if( nBegin > nEnd ) { return -1;//탈출 조건 및 탐색 실패 } nMid = (nBegin+nEnd) / 2; if( nArr[nMid] == nTarget ) { return.. 더보기 [C언어] 재귀 함수 - 거듭제곱 (power) ※요약 C언어에서 재귀 호출을 이용한 거듭제곱 구하는 함수다. 어떤 수 a에 대하여 n개 곱한 것을 a^n( an )이라 표시하고 a의 n제곱이라 하며, n을 거듭제곱의 지수라고 한다. a = 3, n = 5일때 3^5 = 243 = 3 * 3 * 3 * 3 * 3 다. ※예제 #include double power( double a, int num ); int main( ) { printf( "%.10lf", power( 3.141592653589793238462643383279, 3 ) ); return 0; } double power( double a, int num ) { if( num == 0 ) return 1; return a * power( a, num-1 ); } ※결과 더보기 [C언어] 재귀 함수 - 팩토리얼 (Factorial) ※요약C언어에서 재귀 호출을 이용한 팩토리얼 구하는 함수이다.정수 n의 팩토리얼은 n! 이라고 표시하며, n! = n * (n-1) * (n-2) * (n-3) * . . * 2 * 1 이며5! 일 경우 5! = 120 = 5 * 4 * 3 * 2 * 1 다. ※예제 #include unsigned __int64 factorial( unsigned __int64 num ); int main( ) { int nNum = 5; printf( "%d! : %I64u", nNum, factorial(nNum) ); return 0; } unsigned __int64 factorial( unsigned __int64 num ) { if( num == 1 ) { return 1; } return num * fact.. 더보기 [C언어] 재귀 함수 - 함수의 재귀적 호출 ※요약재귀 함수란 자기 자신을 호출하는 함수다 일반적인 함수 호출 방법은 다음과 같다. 프로그램 실행 중 함수를 만나면 현재 위치를 저장 후, 호출할 함수의 주소로 점프해 함수 내용을 수행한다. 함수 실행이 끝나면 기억해뒀던 원래 위치로 복귀해 다음 코드를 수행한다. (일반적으로 잦은 함수 호출로 인한 점프의 반복은 속도를 느리게 한다.) 일반 함수나 재귀 함수나 위와 같은 방법으로 함수가 호출이 되는데 재귀 함수의 경우 함수의 실행이 채 끝나기도 전에 자기 자신을 호출한다. 이게 가능한 이유는 호출된 각 함수에 대한 복귀 번지, 인수, 지역 변수 등이 스택 프레임에 저장되기 때문에 기존의 작업 내용들이 서로 방해하지 않고 잘 동작할 수 있는 것이다. ※재귀 함수 특징 - 무한 루프에 빠지지 않기 위해 .. 더보기 [C언어] 파일 포인터 초기화 함수 - rewind ※요약 rewind : 개방된 파일에서 파일 포인터의 위치를 0으로 설정한다. ※함수 원형 및 설명 void rewind( FILE *stream ); //stream : 개방된 FILE 구조체의 포인터 ※예제 #include #define print(n) printf( "%ld\n", n ) int main( ) { FILE *pFile = NULL; pFile = fopen( "d:\\Text.txt", "w+" ); if( pFile == NULL ) { //에러 처리 } else { print( ftell(pFile) );//fopen 후 파일 포인터 위치 확인 fputs( "0123456789", pFile ); print( ftell(pFile) );//fputs 후 파일 포인터 위치 확인 r.. 더보기 [C언어] 파일 포인터 위치 설정 함수 - fseek ※요약 fseek : 개방된 파일에서 파일 포인터의 위치를 설정한다. ※특징 fseek 함수를 이용해 읽어온 파일의 크기를 구할 수도 있다. fseek( stream, 0L, SEEK_END ); int nFileSize = ftell( stream ); ※함수 원형 및 설명 int fseek( FILE *stream, long offset, int origin ); //stream : 개방된 FILE 구조체의 포인터 //offset : origin으로부터의 오프셋, 양수 또는 음수 가능 //origin : SEEK_SET, SEEK_CUR, SEEK_END 중 하나의 값 //SEEK_SET : 파일 시작점(BOF)에서 offset만큼 이동 //SEEK_CUR : 파일 포인터의 현재 위치에서 offset.. 더보기 [C언어] 파일 포인터 위치 구하는 함수 - ftell ※요약ftell : 개방된 파일 스트림의 현재 파일 포인터의 위치를 구한다. ※특징파일 포인터는 데이터를 읽거나 쓸 위치를 가르킨다.파일 포인터는 데이터를 읽거나 쓴 크기 만큼 자동으로 증가하며,위치를 수동으로 지정하려면 fseek함수나 fsetpos함수로 한다. ※함수 원형 및 설명 long ftell( FILE *stream ); //개방된 FILE 구조체의 포인터 //현재 파일 포인터의 위치를 반환 ※예제 #include #define print(n) printf( "%ld\n", n ) int main( ) { FILE *pFile = NULL; pFile = fopen( "d:\\Text.txt", "w" ); if( pFile == NULL ) { //에러 처리 } else { long lp;.. 더보기 [C언어] 바이트 단위 파일 쓰기 - fwrite ※요약fwrite : 개방된 파일에 바이트 단위로 쓴다. ※함수 원형 및 설명 size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); //buffer : 파일에 저장할 데이터 버퍼의 포인터 //size_t : 출력할 항목의 사이즈 //count : 출력할 항목의 개수 //stream : 개방된 FILE 구조체 포인터 //반환값 : 실제로 쓴 데이터 항목의 개수(count), 에러 시 count보다 작은 수 ※예제 #include int main( ) { FILE *pFile = NULL; pFile = fopen( "d:\\Text.txt", "w+t" ); if( pFile == NULL ) { //에러 처리 } els.. 더보기 [C언어] 바이트 단위 파일 읽기 - fread ※요약fread : 개방된 파일에서 바이트 단위로 파일을 읽는다. ※함수 원형 및 설명 size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); //buffer : 파일 데이터를 읽어서 저장할 버퍼의 포인터 //size_t : 항목의 사이즈 //count : 항목의 개수, 읽어올 횟수 //stream : 개방된 FILE 구조체 포인터 //반환값 : 실제로 읽은 데이터 항목의 개수, 에러 시 count보다 작은 수 ※예제이번 예제는 Point Cloud 프로그램에서 사용하는 *.ply파일을 읽는 예제다.파일의 구조는 헤더와 데이터로 나눠져 있으며, 예제에 주석으로 헤더, 데이터 읽는 부분을 표시하였다.파일 헤더의 내용은 포맷과 점의 개수.. 더보기 [C언어] 문자 단위 파일 쓰기 함수 - fputc ※요약 fputc : 개방된 파일에 단일 문자를 쓴다. ※함수 원형 및 설명 int fputc( int c, FILE *stream ); ⁄⁄c : 개방된 파일에 쓸 문자 또는 ASCII 값 ⁄⁄stream : 개방된 FILE 구조체의 포인터 ⁄⁄반환값 : 읽은 문자 값(int), 파일 끝 또는 에러 시 EOF(-1) ※예제 #include #define print(n) printf( "%x %c\n", n, n ) int main( ) { FILE *pFile = NULL; pFile = fopen( "d:\\Text.txt", "w" ); if( pFile == NULL ) { //에러 처리 } else { int nResult = fputc( 'T', pFile ); print( nResult );.. 더보기 이전 1 2 3 다음