7월, 2021의 게시물 표시

효율적으로 구글 검색, 구글링 하는 방법

이미지
구글 고급검색 https://www.google.co.kr/advanced_search 아래 나열된 검색어 키워드는 조합하여 사용 가능 합니다. ex) "filetype:xlsx 한승연&카라" 정확히 일치하는 결과 찾기 필수 단어를 "xxx" 처럼 큰따옴표로 묶음. ex) "향수 "000원"", ""오늘 아침에 먹은 샐러드"" 아래 이미지와 같이 큰따옴표 사이에 있는 검색 결과가 정확히 일치하는 결과들이 검색된다. 제외/포함할 단어 지정 -/+를 단어 앞에 넣어주면 됨. ex) "재규어 -동물 -animal", "재규어 +동물", "재규어 +자동차" 재규어로 검색했을 때 동물 반 자동차 반 정도의 이미지 검색 결과가 나온다. 하지만 아래와 같이 "-동물", "-animal"을 붙여 동물과 animal이 포함된 결과를 제외하자 대부분 자동차와 관련된 결과만 남는다. 둘 중 하나만 있는 결과도 검색 검색어1|검색어2 ex) "한승연|exid" 아래와 같이 "한승연" 또는 "exid"가 포함된 페이지가 검색된다. 둘 다 있는 결과만 검색 검색어1&검색어2 ex) "한승연&exid" 아래와 같이 "한승연"과 "exid" 둘 모두가 포함된 페이지들이 검색된다. 특정 사이트 내 검색 site:tistory.com/ "검색할 단어" ex) "site:tistory.com/ 한승연" 아래 이미지와 같이 "tistory.com"이 포함된 사이트 내에 "한승연...

명령 프롬프트 명령어 모음 (Command-line reference A-Z)

https://technet.microsoft.com/en-us/library/bb490890.aspx

[C] 연산자 우선순위 문제

질문 제목 ||연산과 &&연산 질문 요약 #include<stdio.h> int main() { int x,y,z,k; x = 1; y = 2; z = 3; k = ++x || ++y && ++z; printf("%d %d %d %d\n",k,x,y,z); return 0; } // 결과 값 : 1 2 2 3 질문 내용 결과값이 왜 이렇게 나오는 거죠?? 설명좀 부탁드립니다. 설명 연산자 우선순위 문제인데... 일단 C언어의 연산자 우선순위는 다음과 같다. C언어 연산자 우선순위 바로가기!!! 그리고 이 문제를 알기 위해서는 하나를 더 알아야 하는데... 컴파일러마다 다를수도 있지만 Visual Studio에서는 앞 조건만 봐서 무조건 결과가 참이 나오면 뒷 부분은 연산이 되지 않는다... 무슨 얘기인가 하면 x = 1, y = 1, z = 1 이 있다고 하고 if ( ++x || ++y || ++z ) 이렇게 if문이 있으면 맨 앞 ++x를 보면 참이되고 || 연산자에 의해서 뒷 부분에 어떠한 값이 나와도 참이된다 그럼 ++y, ++z는 아예 분석조차 되지 않는다. 따라서 저 if문 다음에 x, y, z를 출력해 보면 x는 1이 증가해서 2가 되어 있지만 y, z는 그대로 1인것을 확인할 수 있다. 위에서 설명한 것을 먼저 파악하고 계속해서 문제를 보면 k = ++x || ++y && ++z; 이 라인에서 ++x 만 증가하고 y와 z는 그대로라고 생각할 수 있다. (k의 값은 연산 결과가 참이기 때문에 1이 들어갈 것이라고 짐작할 수 있다.) 그럼 결과가 1, 2, 2, 3이 맞다. 그러나! 여기서 연산자 우선순위를 다시 한번 확인해보자... 분명히 || 보다 &&가 더 빠르다!!! 그럼 y와 z를 먼저 비교하고 다음으로 x와 비교하게 되기 때문에 당연...

[C] 연산자 우선순위

https://msdn.microsoft.com/ko-kr/library/2bxt6kc4.aspx 동일 순위끼리 봤을 때, 왼쪽에 있는 것이 더 순위가 높다. (expr++가 *보다 우선순위가 높다) int *a; int b = 3; a = &b; *a++;        // *(a++)과 같은 결과다!!!

[C] C언어의 장점

출처 - 한눈에 보이는 C프로그래밍(무작정 따라하기) 1. 어셈블리어나 이전 코드(기계어 코드)와 같이 하드웨어를 프로그래밍 할 수 있는 기능을 갖추고 있으면서도 인간이 이해하기 쉬운 고급 언어에 속한다는 점. 2. 이전의 언어들에 비해 매우 다양해진 연산자들. 물론 C언어 이후부터 등장한 언어들은 C언어를 모델로 하여 C언어만큼 다양한 연산자를 갖추고 있다. 3. 쉽게 응용하여 새로운 기능을 만들어 낼 수 있는 유연성. 물론 지금에 와서는 C언오보다는 C++이나 자바와 같은 객체 지향 프로그래밍 언어들의 가장 큰 장점이 되고 있는 부분이다. 4. 운영체제 프로그래밍. 하드웨어 프로그래밍을 비롯한 거의 모든 프로그램 제작이 가능한 범용성을 갖고 있다. 5. C언어로 작성한 프로그램은 윈도우나 유닉스에서 쉽게 이식하여 사용할 수 있다.

[C] C프로그래밍이 실행되기까지

출처 - 한눈에 보이는 C프로그래밍(무작정 따라하기) 원시 소스 파일을 만든다. 메모장과 같은 텍스트 편집기를 입력한 후 .c라는 확장자로 저장 이 파일은 프로그래머에 의해서 만들어진 원본이라는 점과 실행되지 않는 파일이라는 점에서 원시 파일, 원시 소스라고 부른다. 비주얼 C++에 포함된 자체 텍스트 편집기를 사용해도 됨. 컴파일러를 이용해 이진 코드로 바꾼다. 원시 파일을 컴퓨터가 이해할 수 있도록 C프로그램의 소스 코드를 이진 코드로 바꿔주는 프로그램을 필요로 한다. 이런 프로그램을 컴파일러(번역기)라고 한다. 소스 코드를 작성한 후에 컴파일러를 사용하여 소스 코드를 기계어로 번역한다. 이 과정을 컴파일(compile)이라고 하며, 컴파일되어 번역된 파일을 오브젝트(목적 코드)파일 이라고 한다. 링크 명령을 이용해 실행 파일로 만든다. 두 개 이상의 소스 파일을 사용하여 하나의 실행 파일로 만들거나, 컴파일러에서 기본적으로 제공하는 여러 가지 라이브러리 등을 사용자가 만든 프로그램에 연결해 주는 것을 말한다. 그러므로 링크 과정을 거쳐야 비로소 실행 파일이 생성되고, 그 실행 파일을 실행시키면 출력 결과가 나타나게 되는 것이다.

[C] C언어의 지시어(헤더파일, 전처리, 매크로)

미리 정의된 매크로 https://docs.microsoft.com/ko-kr/cpp/preprocessor/predefined-macros?view=msvc-160 // 미리 정의된 include 폴더에서 파일을 찾는다. #include <파일이름> // 현재의 소스 코드가 저장되어 있는 폴더에서 먼저 찾고, 파일이 없다면 미리 정의된 include 폴더에서 파일을 찾는다. #include "파일이름" // 컴파일러 오류 메시지를 발생. #error // 파일을 추가한다. #import // Else if #elif // Else #else // 식별자가 정의되어 있지 않으면 참. #ifndef // 식별자가 정의되어 있으면 참. #ifdef // #findef나 #ifdef, #else에 대한 전처리기 부분을 종료 #endif // 내부 행 넘버를 변경한다. #line // 식별자를 정의하지 않는다. #undef // 컴퓨터 또는 운영 체제 관련 컴파일러 기능을 지정 // #pragma once 처럼 뒤에 토큰을 붙여서 쓰며 토큰들은 아래 링크 참조 // https://msdn.microsoft.com/ko-kr/library/d9x1s805.aspx #pragma // 식별자 또는 매개 변수화된 식별자와 토큰 문자열을 연계한 매크로를 생성 #define

[C] 서식 변환 문자열

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions?view=msvc-170 https://msdn.microsoft.com/ko-kr/library/56e442dc.aspx https://msdn.microsoft.com/ko-kr/library/hf4y5e3w.aspx 출력 형식 설명 %d 10진수 정수형으로 출력합니다. %o (%#o) 8진수 정수형으로 출력합니다. %x (%#x) 16진수 정수형으로 출력합니다. %X 16진수 정수형 대문자로 출력합니다. %p 16진수 정수형으로 출력, 4byte 모두 출력 값이 입력되지 않은 앞 부분은 0으로 채워짐 %u 부호없는 10진수 정수형으로 출력합니다. %c 한 문자를 출력합니다. %s 문자열을 출력합니다. %f 부동소수점으로 12.345와 같이 출력합니다. %e 부동소수점으로 1.2345E12와 같은 형식으로 출력합니다. %E %e와 같되 대문자로 출력 %g %e나 %f 중에서 출력할 자릿수를 덜 차지하는 형태로 출력합니다. %G %g와 같되 대문자로 출력 %i %d와 같음 %% % 출력

[C] 난수 생성

#include <stdio.h> #include <time.h> srand((unsigned int)time(NULL)); // 이 코드는 함수에 한번만 써주면 됨 num = rand() % 100 ; // 0~99의 난수를 생성 num = rand() % 10; // 0~9의 난수를 생성

[C] 시간 지연

// windows.h 헤더 파일 필요. #include <windows.h> // 시간 단위는 ms. Sleep(1000); // Sleep(1000);은 1초 Sleep(10000); // Sleep(10000);은 10초

[C] __int64

#include <stdio.h> int main(int argc, char *argv[], char **env) { __int64 temp; fputs("숫자를 입력해 주세요 : ", stdout); scanf("%I64d", &a); // %I64d 에서 64 앞에 소문자 l(엘)이 아니라 대문자 I(아이) printf("입력한 숫자는 : \n%I64d\n", temp); return 0; } 약 9220000000000000000 (922경)의 숫자까지 인식

[C] 값 입력할 때마다 메모리 할당

#include <cstdio> #include <cstdlib> #include <malloc.h> int *temp, i = 0; void test(int input); int main() { int input = 0; while(1) { printf("입력하세요 : "); scanf("%d", &input); test(input); } return 0; } void test(int input) { i += 1; temp = (int *)realloc(temp, sizeof(int) * i); temp[i - 1] = input; for(int j = 0; j <= i - 1; j++) { printf("res = %d\n", temp[j]); } // 이렇게 할 경우 배열의 경우 배열의 크기가 나오지만 포인터 변수로 // 동적 할당 했을 경우 포인터 변수의 크기가 나옴. printf("sizeof를 사용한 크기 측정 : %d\n", sizeof(temp)); // 동적 할당된 메모리의 크기를 확인하려면 _msize 함수를 사용해야 함... // _msize 함수를 사용하기 위해선 malloc.h를 include 해야 함 printf("_msize를 사용한 크기 측정 : %d\n\n", _msize(temp)); }

[C] 2차원 배열 동적 할당

#define ROW 3 #define COL 4 char **ptr = NULL; ptr = (char**)malloc(sizeof(char*) * ROW); // 포인터 배열 개수 (행의 개수) *ptr = (char*)malloc(sizeof(char) * (ROW * COL)); // 2차원 배열 총 개수 for(i = 1; i < ROW; i++){ // i=1부터 하면 됩니다. ptr[0]은 *ptr과 같기 때문에 ptr[i] = ptr[i-1] + COL; // 4(COL) 는 열의 개수입니다 } // 해제 free(*ptr); free(ptr);

[C] 소문자는 대문자로 대문자는 소문자로

#include <stdio.h> #include <string.h> #include <ctype.h> int UpperLower(char *temp); int main() { char strtest[10] = {0}; strcpy(strtest, "aBcDeF!@#"); printf("Orinal Str - %s\n\n", strtest); UpperLower(strtest); printf("UpperLower - %s\n\n", strtest);  return 0; } int UpperLower(char *temp) { for( ; *temp != NULL; temp++) { if(isalpha(*temp)) { *temp = *temp ^ 0x20; } } return 0; }

[C] 시간 체크

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> // Sleep 함수를 사용하기 위한 헤더 파일 int main() { clock_t start, finish; double time_check = 0; start = clock(); Sleep(2000); finish = clock(); time_check = (double)(finish - start) / CLOCKS_PER_SEC; printf("%.2lf 초입니다.\n", time_check); return 0; }

[C] 리본 모양 출력 (조건문 하나만 사용)

#include <stdio.h> int main() { int height = 0, width = 0; int head = 0, tail = 0; int i = 0, j = 0; height = 11; // 줄 수 = 5줄, 리본의 크기, 홀수만 입력 width = height; // 칸 수 = 5칸 head = 1; tail = width - 2; for (i = 0; i < height; i++) // 줄 { for (j = 0; j < width; j++) // 칸 { (i != (height / 2) && ((j >= head && j <= tail) || (j >= tail + 2 && j <= head - 2))) ? printf(" ") : printf("*"); } head++; //그 다음 줄부터 적용 tail--; puts(""); } } 리본 모양 출력하기는 쉬우나... 코딩 조건이 조건문을 하나만 사용이여서 처음에 이걸 어떻게 하나 멍좀 때림

[C] _msize, 포인터가 가리키는 메모리의 크기 알아내기

#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { char *test = NULL; test = (char *)malloc(29); printf("size - %d\n", _msize(test)); return 0; } _msize를 사용하기 위해선 #include <malloc.h> 헤더를 추가해줘야 한다. 힙 영역에 할당된 메모리 크기만 구할 수 있다. 스택에 할당된 배열의 시작 주소를 포인터에 초기화 시키고 그 포인터를 _msize의 매개변수로 넘기면 프로그램이 죽는다. ※ sizeof는 스택에 할당된 메모리 크기를, _msize는 힙에 할당된 메모리 크기를 구할 수 있다.

[C] 퀵 정렬(Quick Sort)

#include <stdio.h> #include <stdlib.h> #define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t)) int partition(int list[], int left, int right) { int pivot = 0, temp = 0; int low = 0, high = 0; low = left; high = right + 1; pivot = list[left]; do { do { low++; }while(low <= right && list[low] < pivot); do { high--; }while(high >= left && list[high] > pivot); if(low < high) { SWAP(list[low], list[high], temp); } }while(low < high); SWAP(list[left], list[high], temp); return high; } void quick_sort(int list[], int left, int right) { if(left < right) { int q = partition(list, left, right); quick_sort(list, left, q - 1); quick_sort(list, q + 1, right); } } int main() { FILE * fp = NULL; int cnt = 0; int temp = 0; int * no = NULL; int i = 0; fp = fopen("data.txt", "r"); if(fp == NULL) { printf("파일 개방 실패!!!\n"); return 0; } while(!feof(fp)) { ...

[C] 단일 연결 리스트 (Simple Linked List)

출처 - C로 배우는 알고리즘 (이재규 지음) #include <stdio.h> #include <stdlib.h> typedef struct _node { int key; struct _node *next; }node; void init_list(); // head와 tail 생성 및 초기화 node *insert_after(int key, node *t); // 매개변수로 넘겨준 노드 다음에 새로운 노드 추가 int delete_next(node *t); // 매개변수로 넘겨준 노드 다음 노드 삭제 node *find_node(int k); // 매개변수로 넘겨준 key 값을 가지는 노드를 검색 int delete_node(int k); // 매개변수로 넘겨준 key 값을 가지는 노드를 삭제 node *insert_node(int k, int t); // k를 key값으로 가지는 노드 앞에 t를 key값으로 가지는 노드 추가 node *ordered_insert(int k); // 기존 노드에 오름차순하여 매개변수로 넘겨준 k를 추가 void print_list(node *t); // 매개변수로 넘겨준 노드부터 시작해서 끝까지 출력 node *delete_all(); // 모든 노드를 삭제(head와 tail은 삭제 안함, head->next가 tail을 가르키도록 초기화) node *head, *tail; int main(int argc, char *argv[], char **env) { node *t = NULL; init_list(); // head와 tail 메모리 할당 및 초기화 ordered_insert(10); // 오름차순 정렬로 노드를 하나씩 할당함 ordered_insert(5); ordered_insert(8); ordered_insert(3); ordered_insert(1); ordered_insert(7); ordered_insert(8); //...

[C] 이중 연결 리스트 (Double Linked List)

출처 - C로 배우는 알고리즘 (이재규 지음) #include <stdio.h> #include <stdlib.h> typedef struct _node { int key; struct _node *prev; struct _node *next; }node; void init_dlist(void); // head와 tail 메모리 할당 및 next, prev 초기화 node *insert_node_ptr(int k, node *t); // 매개변수 t노드의 앞에 매개변수 k를 key 값으로 가지는 노드를 추가 int delete_node_ptr(node *p); // 매개변수 p노드를 삭제 node *find_node(int k); // 매개변수 k를 key 값으로 가지는 노드 검색 int delete_node(int k); // 매개변수 k를 key 값으로 가지는 노드를 삭제, 여러개일 경우 맨 앞의 노드만 삭제 node *insert_node(int t, int k); // 매개변수 t를 key 값으로 가지는 노드가 있으면, 해당 노드 앞에 매개변수 k를 key 값으로 가지는 노드 추가 node *ordered_insert(int k); // 오름차순으로 하여 매개변수 k를 key 값으로 가지는 노드 추가 void print_list(node *t); // 매개변수로 넘겨준 노드부터 시작해서 끝까지 출력 node *delete_all(); // 모든 노드를 삭제(head와 tail은 삭제 안함, head->next가 tail을 가르키도록 초기화) node *head, *tail; int main(int argc, char *argv[], char **env) { node *t = NULL; init_dlist(); ordered_insert(10); ordered_insert(5); ordered_insert(8); ordered_insert(3); ordered_insert(1...

[C] 단일 연결 리스트로 구현한 스택

출처 - C로 배우는 알고리즘 (이재규 지음) #include <stdio.h> #include <stdlib.h> typedef struct _node { int key; struct _node *next; }node; void init_stack(); // head와 tail 메모리 할당, head가 가리키는 다음 노드 tail로 초기화, tail이 가리키는 다음 노드 자기자신으로 초기화 int push(int key); // head 다음에 노드 추가, 메모리 부족으로 할당 실패시 -1 리턴 int pop(); // 입력된 값이 아무것도 없을 경우 -1 리턴 void clear_stack(); // 스택의 모든 노드를 메모리 해제 void print_stack(); // 스택의 모든 내용을 출력 node *head, *tail; int main(int argc, char *argv[], char **env) { int i = 0; init_stack(); printf("Push 5, 4, 7, 8, 2, 1\n"); push(5); push(4); push(7); push(8); push(2); push(1); print_stack(); puts(""); printf("pop\n"); i = pop(); print_stack(); printf("popping value is %d\n", i); puts(""); printf("Push 3, 2, 5, 7, 2\n"); push(3); push(2); push(5); push(7); push(2); print_stack(); puts(""); printf("push 3\n"); push(3); print_stack(); puts(""); printf...

[C] 이중 연결 리스트로 구현한 큐

출처 - C로 배우는 알고리즘 (이재규 지음) #include <stdio.h> #include <stdlib.h> typedef struct _node { int key; struct _node *prev; struct _node *next; }node; node *head, *tail; void init_queue(); // head와 tail 메모리 할당 및 head와 tail의 prev, next 초기화 int put(int k); // Queue에 값을 넣음 int get(); // Queue에서 값을 얻어옴 void clear_queue(); // Queue를 모두 비움 void print_queue(); // Queue의 모든 내용 출력 int main(int argc, char *argv[], char **env) { int i = 0; init_queue(); printf("put 5, 4, 7, 8, 2, 1\n"); put(5); put(4); put(7); put(8); put(2); put(1); print_queue(); puts(""); printf("get\n"); i = get(); print_queue(); printf("getting value is %d\n", i); puts(""); printf("put 3, 2, 5, 7\n"); put(3); put(2); put(5); put(7); print_queue(); puts(""); printf("put 3\n"); put(3); print_queue(); puts(""); printf("Initailize Queue\n"); clear_queue(); print_queue(); puts(...

[C] 선택 정렬

출처 - C로 배우는 알고리즘 (이재규 지음) 안정성 - 없음(이름순으로 먼저 정렬하고 점수순으로 다시 정렬 했을 때 이름순으로 정렬한 내용이 흩어짐) 실행시간 - 데이터양이 두배 들어나면 시간은 4배 늘어남, N(데이터 량)의 제곱 #include <stdio.h> void select_sort(char ary[], int aryCnt); int main(int argc, char *argv[], char **env) { char ary[] = "TOLEARNSORTALGORITHM"; printf("Before Ary[%s]\n", ary); select_sort(ary, (sizeof(ary) - 1/* NULL 문자 제외 */) / sizeof(char)); printf("After Ary[%s]\n", ary); return 0; } void select_sort(char ary[], int aryCnt) { char min = 0; int minIndex = 0; int i = 0, j = 0; for(i = 0; i < aryCnt - 1; i++) { minIndex = i; min = ary[minIndex]; for(j = i + 1; j < aryCnt; j++) { if(min > ary[j]) { minIndex = j; min = ary[minIndex]; } } ary[minIndex] = ary[i]; ary[i] = min; } }

[C] 삽입 정렬

출처 - C로 배우는 알고리즘 (이재규 지음) #include <stdio.h> #include <stdlib.h> #include <memory.h> void insert_sort(char a[], int n); int main(int argc, char *argv[], char **env) { char word[] = "TOLEARNSORTALGORITHM"; printf("정렬 전[%s]\n", word); insert_sort(word, (sizeof(word) - 1) / sizeof(char)); printf("정렬 후[%s]\n", word); return 0; } void insert_sort(char a[], int n) { int i = 0, j = 0; char t = 0; for(i = 1; i < n; i++) { t = a[i]; j = i; while(a[j-1] > t && j > 0) // 굳이 t를 선언하지 않고 a[i]를 바로 넣어도 되나 속도에서 차이가 있음 { a[j] = a[j-1]; j--; } a[j] = t; } }

[C] C언어로 객체지향 흉내내기

출처 - 윤성우 열혈 C++ 프로그래밍 #include <stdio.h> typedef struct _Data { int data; void (*ShowData)(const struct _Data *); void (*Add)(struct _Data *, int); }Data; void ShowData(const Data *THIS); void Add(Data *THIS, int num); int main() { Data obj1 = {15, ShowData, Add}; Data obj2 = {7, ShowData, Add}; obj1.Add(&obj1, 17); obj2.Add(&obj2, 9); obj1.ShowData(&obj1); obj2.ShowData(&obj2); return 0; } void ShowData(const Data *THIS) { printf("Data : %d\n", THIS->data); } void Add(Data *THIS, int num) { THIS->data += num; }

[C] 년, 월, 일 입력 받아서 요일 구하는 함수

// 사용 예 // FindDayOfWeek(2012, 6, 24); // return value // 0 : 일요일 // 1 : 월요일 // 2 : 화요일 // 3 : 수요일 // 4 : 목요일 // 5 : 금요일 // 6 : 토요일 // 요일 구하는 공식 (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7 int FindDayOfWeek(int year, int month, int day) { if(month < 3) { year--; month += 12; } return (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7; }

[C] 최대 공약수 구하는 함수 (유클리드 알고리즘)

int get_gcd(int u, int v) { int temp = 0; while(u) { if(u < v) { temp = u; u = v; v = temp; } u = u - v; } return v; } 유클리드 알고리즘 GCD( 280 , 30 ) = GCD( 250 , 30 ) = GCD( 220 , 30 ) = GCD( 190 , 30 ) ... 이런 식으로 큰 수에서 작은수를 계속해서 빼 나간다. = GCD( 40 , 30 ) = GCD( 10 , 30 ) // 이렇게 앞의 수가 뒤의 수보다 작아지면 두 수를 교환 = GCD( 30 , 10 ) ... 다시 반복해서 빼 나간다. = GCD( 20 , 10 ) = GCD( 10 , 10 ) = GCD( 0 , 10 ) // 앞의 수가 뒤의 수보다 작아졌기 때문에 두 수를 교환 = GCD( 10 , 0 ) // 뒤의 수가 0이 되면 앞의 수가 최대 공약수 // 이것이 최대 공약수 구하는 유클리드 알고리즘 원리 여기에서 작아질때 까지 빼는 내용이 반복되므로 이 과정을 % 연산자를 이용해서 한번으로 줄이면 int get_gcd(int u, int v) { int temp = 0; while(v) { temp = u % v; u = v; v = temp; } return u; } 로 더 간단하게 표현할 수 있다.

[Java] 문자열로 된 수식 계산하기

원문 출처 - http://unikys.tistory.com/226 자바 1.6 이상에서는 Javascript 엔진을 이용하여 문자열로 된 수식 계산이 가능하다고 한다. (자바스크립트의 eval 함수와 같은 기능의 함수가 있다.) import javax.scrit.ScriptEngineManager; import javax.script.ScriptEngine; public class Test { public static void main(String[] args) throws Exception { ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String foo = "((3+2)*4) * (2+3)"; System.out.println(engine.eval(foo)); } }

[Java] import와 관련하여 성능상의 차이

출처 - 자바의 정석(남궁 성 지음) 클래스 이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스 이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이다. 실행 시 성능상의 차이는 전혀 없다.

[Java] 변수의 종류

출처 - 자바의 정석 (남궁 성 지음) class Variables { int iv; static int cv; void method() { int lv = 0; } } iv와 cv는 멤버변수(클래스에 소속된 변수)이고, 그 중에 iv는 멤버변수이면서 인스턴스 변수이고, cv는 멤버변수이면서 클래스 변수(static 변수, 공유변수)이다. lv 처럼 Method에 속한 변수는 지역 변수라고 한다.

[Java] JVM의 피연산자 스택의 피연산자 저장 단위

출처 - 자바의 정성 (남궁 성 지음) JVM의 피연산자 스택(operand stack)이 피연산자를 4 byte 단위로 저장하기 때문에 크기가 4 byte보다 작은 자료형(byte, short)의 값을 계산할 때는 4 byte로 변환하여 연산이 수행된다. 그래서 오히려 int를 사용하는 것이 더 효율적이다. 이 말인즉슨 short를 사용하여 2 byte 짜리 변수를 선언한다 하더라도 이 변수가 계산에 씌이는 피연산자가 될 경우 JVM은 short변수를 피연산자 스택에 저장하면서 4 byte 로 저장하기 때문에 메모리 절약을 위해서 short 변수를 선언한거라면 메모리 절약에 전혀 도움이 되지 않는다. 게다가 형변환까지 해야 되므로 오히려 손해이다. C언어도 이렇게 된다고... 어디서 본 것 같은데... 정확히는 모르겠다.

[Java] 이름 없는 패키지

출처 - 자바의 정석(남궁 성 지음) 소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다. 결국 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 샘이 된다.

[Java] 클래스 변수와 인스턴스 변수의 초기화 순서

출처 - 자바의 정석(남궁 성 지음) 클래스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭 인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

[Java] JVM의 메모리구조

출처 - 자바의 정석 (남궁 성 지음) 1. 메서드 영역(method area) 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수(class variable)도 이 영역에 함께 생성된다. 2. 힙(heap) 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수(instance variable)들이 생성되는 공간이다. 3. 호출스택(call stack 또는 execution stack) 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간경로가 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다. 각 메서드를 위한 메모리상의 작업공간은 서로 구별되며, 첫 번째로 호출된 메서드를 위한 작업공간이 호출스택의 맨 밑에 마련되고, 첫 번째 메서드 수행 중에 다른 메서드를 호출하게 되면, 첫 번째 메서드의 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다. 이 때 첫 번째 메서드는 수행을 멈추고, 두 번째 메서드가 수행되기 시작한다. 두 번째로 호출된 메서드가 수행을 마치게 되면, 두 번째 메서드를 위해 제공되었던 호출스택의 메모리 공간이 반환되며, 첫 번째 메서드는 다시 수행을 계속하게 된다. 첫 번째 메서드가 수행을 마치면, 역시 제공되었던 메모리 공간이 호출스택에서 제거되며 호출스택은 완전히 비워지게 된다. 호출스택의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기상태에 있게 된다. 따라서, 호출스택을 조사해 보면 메서드 간의 호출관계와 현재 수행중인 메서드가 어...

[Java] this 참조변수

출처 - 자바의 정석 (남궁 성 지음) class Car{ private String color; private String gearType; private int door; Car(String color, String gearType, int door) { this.color = color; this.gearType = gearType; this.door = door; } } 위의 코드에서처럼 생성자의 매개변수(지역변수)의 변수명과 인스턴스 변수명이 동일하면 this.으로 인스턴스 변수와 매개변수를 구분지어 준다. this.color = color; 대신 color = color;으로 하면 둘 다 매개변수(지역변수)로 간주된다. this는 참조변수로 인스턴스 자신을 가리킨다. 따라서, this를 사용할 수 있는 멤버는 인스턴스 멤버 뿐이다. static 메서드는 인스턴스를 생성하지 않은 상태에서 호출될 수 있기 때문에 호출된 시점에 인스턴스가 존재하지 않을수도 있기 때문에 static 메서드에서는 this를 사용할 수 없다. this 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다. this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

[C] scanf() 함수의 입력 형식 기호

https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/format-specification-fields-scanf-and-wscanf-functions?view=msvc-160 https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/scanf-type-field-characters?view=msvc-160

[C] 제어문자

이름 설명 \a '삑' 하는 경고음을 출력한다. \t 탭 \n 줄바꿈 \0 공백 문자 \b 뒤로 한칸 후진 \r 동일한 줄의 첫 번째 위치로 커서를 이동한다. \f 출력 화면을 한 페이지 넘긴다. \\ '\' 문자를 출력한다. \" 큰따옴표(")를 출력한다. 제어문자는 아니지만 printf() 함수에서 %를 출력하려면 %%라고 해야 출력이 된다.

[C] 변수의 이름을 짓는 규칙 (변수명 규칙)

출처 - 한눈에 보이는 C 프로그래밍 (무작정 따라하기) 1. 영문자, 숫자, 밑줄(_)을 사용할 수 있다. 2. 변수 이름의 첫 글자는 밑줄(_)이나 영문자이어야 한다. 3. 밑줄(_)을 제외한 특수문자는 사용할 수 없다. 4. 미리 정의되어 있는 키워드(혹은 예약어)는 사용할 수 없다. 5. 되도록 헝가리언 표기법 으로 이해하기 쉽게 표현한다. ( 헝가리언 표기법 을 지양하고 다른 표기법을 따르는 경우도 많다. 나 같은 경우는 " Google C++ Style Guide "의 표기법을 따른다. 회사 또는 프로젝트에서 지정한 표기법이 있다면 해당 표기법을 따른다. 표기법이라는 것은 같이 개발하는 사람들끼리 코드 가독성을 위해 사전에 약속하여 사용하는 것으로 어느것이 맞고 틀리고의 개념이 아니다.)

헝가리언 표기법

출처 - 한눈에 보이는 C프로그래밍 (무작정 따라하기) 헝가리언 표기법의 큰 특징 1. 변수의 대,소문자를 구분하여 표현한다. 2. 특별한 접두어를 사용해서 표현한다. ex) int A ge; int G rade O f K orean; char f C hecked; 헝가리언 표기법에서 자주 사용되는 접두어 접두어 설명 사용 예 f 플래그를 정의할 때 주로 사용 됨. char fChecked; c 카운터의 의미를 갖는 변수를 정의할 때 사용 됨. int cPerson; l long형 자료형을 갖는 변수를 정의할 때 사용 됨. long lMaxPerson; p 포인터를 정의할 때 사용 됨. char *pBuf; u unsigned int형을 정의할 때 사용 됨. unsigned int uNumber; w word형 변수를 정의할 때 사용 됨. (단, word형 변수는 unsigned short를 의미) unsigned short wData; dw double word형 변수를 정의할 때 사용 됨. (단, double word형 변수는 unsigned short를 의미) unsigned long dwData; str 문자열 변수를 정의할 때 사용 됨. char *strName

[C] fopen()에 쓰이는 파일 오픈 모드 종류

Mode Access r 텍스트 모드로 읽기. w 텍스트 모드로 쓰기. 파일이 없을 경우 새로 생성. 존재할 시 기존의 내용삭제 후 새로운 내용으로 대체. a 텍스트 모드로 쓰기. 파일이 없을 경우 새로 생성. 존재할 시 파일의 가장 끝부분부터 이어쓰기. rb 바이너리 모드로 읽기. wb 바이너리 모드로 쓰기. 파일이 없을 경우 새로 생성. 존재할 시 기존의 내용 삭제 후 새로운 내용으로 대체. ab 바이너리 모드로 쓰기. 파일이 없을 경우 새로 생성. 존재할 시 파일의 가장 끝부분부터 이어쓰기. r+ 텍스트 모드로 읽기. 쓰기가 가능. w+ 텍스트 모드로 읽기. 쓰기가 가능. 파일이 없을 경우 새로 생성. 존재할 시 기존의 내용 삭제 후 새로운 내용으로 대체. a+ 텍스트 모드로 읽기. 쓰기가 가능. 파일이 없을 경우 새로 생성. 존재할 시 파일의 가장 끝부분부터 이어쓰기. rb+ 바이너리 모드로 읽기. 쓰기가 가능. wb+ 바이너리 모드로 읽기. 쓰기가 가능. 파일이 없을 경우 새로 생성. 존재할 시 기존의 내용 삭제 후 새로운 내용으로 대체. ab+ 바이너리 모드로 읽기. 쓰기가 가능. 파일이 없을 경우 새로 생성. 존재할 시 파일의 가장 끝부분부터 이어쓰기.

[C] Ctrl + Z 입력을 받을 때까지 반복해서 입력 받기

#include <stdio.h> int main() { int no = 0; // 숫자를 입력받을 변수 선언 // 최소 값을 가려내기 위해 인트형 자료형에 입력 받을수 있는 최대값으로 초기화 int check = 2147483647; printf("값을 입력해 주세요 : "); // while문 이 한줄이 중요함 scanf("%d", &no) != EOF 이 명령어가 Ctrl + Z를 입력하면 종료되는 // 명령문 scanf는 반환형으로 int형 값을 반환하는데 Ctrl + Z를 입력 받았을 때 EOF에 해당하는 // 값을 반환하게 되어 while문 조건이 거짓이 되며 종료된다. while(scanf("%d", &no) != EOF) { fflush(stdin); if(no <= check) { check = no; } printf("값을 입력해 주세요 : "); } printf("지금까지 입력 받은 값들중에 최소값은 %d입니다.\n", check); return 0; }

[C] 소수 구하는 프로그램

이미지
아래 코드는 1부터 10만 사이의 소수를 구한다. 복잡한 알고리즘도 아니고 한번 더 생각해서 식만 조금 수정했을 뿐인데 시간 차이가 이렇게 많이 난다. 물론 내가 작성한 코드보다 더 빠른 소수 구하는 코드가 많다. 내가 말하고자 하는건 내가 코딩한 소수 구하는 코드가 빠르고 좋다가 아니라 (아래 코드는 대충 막 짠 코드라 코드도 지저분하고 좋은 알고리즘에 비교하면 정말 느리다.) 한번만 더 생각해서 코딩하면 더 나은 코드를 작성할 수 있으니 평소에 코딩할 때 항상 어떻게 코딩해야 더 좋은 코드가 될지 생각하면서 코딩하는 습관을 가졌으면 좋겠다. 사용자는 0.7초는 기다리지만 14초는 기다리지 않는다. #pragma warning (disable : 4996) #include <stdio.h> #include <Windows.h> #include <time.h> #include <math.h> #define TEMP 100000 void first(); // 단순무식 void second(); // 모든 짝수는 소수가 될수 없으므로 홀수로 증가 void third(); // 소수는 1과 자기 자신으로 나눠지는 수이므로 1 제외하고 2는 짝수만 나뉘므로 2 제외하고 void fourth(); // 검사중 나뉘어 지는 수의 개수가 2개 이상이면 다음 숫자로 패스 void fifth(); // 중간에 나누어 떨어지는 수가 자기 자신이 아니면 다음 숫자로 패스 void sixth(); // 짝수로 나뉘는 값은 짝수이기 때문에 나누는 수를 홀수로 증가 int main(){ double StartTime, EndTime; double time1, time2, time3, time4, time5, time6; StartTime = clock(); first(); EndTime = clock(); time1 = (EndTime - StartTime) / CLOCKS_PER_SEC; pri...

[C] 가변 인자

가변 인자 리스트 억세스 type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); void va_start( va_list arg_ptr ); // unix version void va_start( va_list, prev_param ); // ANSI version parameters type : 돌려받을 인자의 타입 arg_ptr : 인자리스트의 포인터 prev_param : 첫번째 가변인자 바로 전에 넘겨진 인자 (ANSI only) Return Value va_arg는 현재 인자를 리턴한다. va_start와, va_end는 리턴값이 없다. Remarks va_arg, va_end, va_start 매크로는 함수가 가변갯수의 인자를 가질때 함수인자에 접근하는 편리한 방법을 제공한다. 두가지 버젼의 매크로가 사용된다. STDARG.H 에 정의된 매크로는 ANSI C 표준에서 승인되었고, VARARGS.H에서 정의된 매크로는 UNIX 시스템V정의와 호환된다. 매크로는 다음과 같다. va_alist : 호출된 함수로의 매개변수 이름( UNIX only ) va_arg : 현재 인자를 되돌려 받는 매크로 va_dcl : va_alist의 선언( Unix only ) va_end : arg_ptr를 리셋하는 매크로 va_list : STDIO.H에 선언된 인자리스트의 포인터 va_start : 가변인자 리스트의 앞부분을 arg_ptr에 설정하는 매크로( Unix only ) 매크로 버젼 둘다, 함수에서 필수인자의 고정갯수를 받아들이고, 다음으로 가변갯수의 인자를 받는다고 가정한다. 필수인자는 함수에서 일반적인 매개변수로 선언되고, 파라미터의 이름을 통해서 접근될 수 있다. 가변 인자는 STDARG.H 또는 VARARGS.H에 있는 매크로를 통하여 접근가능하다. ...

[C] 가변 인자 예제 코드

#include <cstdio> #include <windows.h> #include <stdarg.h> int add(int count, ...); int main(int argc, char *argv[]) { int add(int, ...); int sum; sum = add(2, 284, 945); printf("%d\n", sum); sum = add(5, 456, 74, 24, 826, 34); printf("%d\n", sum); system("pause"); return 0; } int add(int count, ...) { va_list list; int sum = 0; int i; va_start(list, count); for(i = 0; i < count; i++){ sum += va_arg(list, int); } va_end(list); return sum; }

[C] 10진수를 2진수로 출력하기

출처 - C 언어 무작정 따라하기 (길벗) 비트 연산자를 사용하여 이진수를 출력하는 방법이 일반적이나 위 책에서 특이한 방법으로 이진수를 출력하는 방법이 나와있어 정리해봄. 아래 정의된 구조체처럼 하면 1비트짜리 변수를 선언할 수 있다. 이를 union으로 하여 출력할 변수와 함께 그 변수의 비트만큼의 멤버변수를 가지는 구조체를 정의 값 입력을 union.변수에 하고 union.구조체의 멤버변수를 하나하나 읽어서 출력해준다. 단순히 이진수 출력이라면 비트 연산자를 사용하여 출력하는 방법이 훨씬 간단하겠지만 특정 비트를 조작해야되는 경우라면 아래의 경우가 더 나은 방법이 될 수도 있을것 같음. #include <stdio.h> #include <string.h> #include <stdlib.h> typedef union _byte{ unsigned char byte; struct _bit{ unsigned char b0 : 1; unsigned char b1 : 1; unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; unsigned char b8 : 1; unsigned char b9 : 1; unsigned char b10 : 1; unsigned char b11 : 1; unsigned char b12 : 1; unsigned char b13 : 1; unsigned char b14 : 1; unsigned char b15 : 1; unsigned char b16 : 1; unsigned char b17 : 1; unsigned char b18 : 1; unsigned char b19 : 1; unsigned char b20 : 1;...