목록c언어 (20)
고딩개발자
우리가 보통 c언어로 코드를 짜면 생성된 정보들은 모두 컴파일 한 후 어떠한 메모리에 들어가서 저장되고 실행을 종료하면 그에관한 정보가 모두 사라진다. 하지만 만일 c언어로 이벤트 등록 캘린더나 단어장을 만든다면 그 정보들(이벤트 날짜와 단어)이 사라지면 안될 것이다. 이런 정보들을 어디에 저장할 수 있을까?바로 메모장에 저장하는 것이다!!! c언어에서는 파일입출력에 관한 기본적인 함수들을 제공한다. 따라서 몇가지 함수들을 이용하여 파일을 열고 그안에 있는 정보들을 읽어오고 정보를 수정하는 것과 같은 작업들을 수행할 수 있다. 그 중에서도 우리는 오늘 메모장에 문자와 문자열을 저장하는 법을 알아보겠다. 먼저 우리가 그냥 메모장에 글씨를 쓰는 상황을 상상해보자. 우리는 글씨를 쓰고싶은 부분에 커서를 옮겨가..
이번에는 동적할당의 개념과 원리에 대해 알아보자!! -동적할당이란 무엇일까?? 보통우리가 코딩할 때 변수를 선언하거나 배열을 생성하면 코드를 컴파일할 때 내가 원했던 만큼의 메모리크기가 바로 할당된다. 할당된 그 메모리는 런타임 중간에 다시 반납할 수도 없고, 원하는 만큼 얻을수도 없다. 하지만 동적할당을 하면 런타임 도중에 원하는 만큼 메모리를 얻고 반납할 수 있다. 주로 c에서 동적할당은 malloc이라는 함수를 통해서 한다. -그렇다면 동적할당이 되는 원리는 무엇일까? 우리가 프로그램을 실행하며 할당받고 사용하는 메모리들을 모두 파편화 되어있다. 이 파편화된 메모리들은 모두 링트드리스트 형식으로 나열되어 있으며 그걸 자유체인이라고 부른다. 그렇다면 동적할당이 되는 과정을 이야기해 보겠다. 1. 먼저..
이번시간에는 binary search와 LIS알고리즘에 대해 배웠다. binary search란 우연히 정렬되어있는 배열이 들어왔을때, 원하는 값을 빨리 찾아주는 알고리즘 이다. binary search는 보통 비교를 가운데 인덱스부터 시작한다. 비교한 인덱스보다 찾는 값이 더 크면 그 인덱스를 기준으로 오른쪽에 있는 배열의 부분을 탐색하고, 작으면 그 인덱스를 기준으로 왼쪽에 있는 배열을 탐색한다. #include int arr[100] = { 0, }; int binary_search(int *arr, int first, int end, int find) { if (end - first mid_val) return binary_search(arr, mid_idx, end, find); else ret..
이번 시간에는 새로 배운 개념은 없었고, 문제풀이를 했다. 푼 문제는 https://www.acmicpc.net/problem/2531 에 있는 회전초밥문제이다. #include #define MAX_DISH 3000001 //접시의 최대값 #define MAX_FISH 3001 //초밥종류 최대값 int dishes[MAX_DISH]; int hash[MAX_FISH]; int head_idx = 0, tail_idx = 0; int safe_increment(const unsigned int index, const unsigned int dish) { //dishes에 필요한 인덱스가 범위를 넘어가지 않도록 한다 return (index + 1) % dish; }//맨 끝에 도달하면 0이 되도록 해놓..
이번시간에는 queue와 heap, fenwick tree에 대해 배웠다. 1) queue는 저번시간에 배운 stack과 달리 먼저 들어온 자료가 먼저 나가는 선입선출의 형식을 사용하는 자료구조이다. #include #define SIZE 100 int queue[SIZE] = { 0, }; int head = 0, tail = 0; int safe(int a) { return (a + 1) % SIZE; }//queue의 범위를 넘어가면 인덱스를 다시 1로 당겨줌 //queue는 원과 비슷한 구조를 하고 있음 void enqueue(int a) { queue[head] = a; head = safe(head); } int dequeue() { int temp = queue[tail]; tail = sa..
이진탐색과 랜덤함수에 대해 배웠다. 1) 이진탐색 정렬된 배열에서 원하는 숫자를 빨리 찾는 함수를 짰다. #include using namespace std; void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void bubble_sort(int *arr, int length) { for (int i = 0; i arr[j + 1]) swap(&arr[j], &arr[j + 1]); } } } //값이 있으면 1, 없으면 0 int binary_search(int value, int *set,..
포인터와 동적 할당에 대해 배웠다. 1) 배열과 포인터 배열의 값을 넘겨주거나 사용할 때, 포인터의 개념으로 생각하기 때문에 배열을 포인터처럼 사용할 수도 있고 포인터를 배열처럼 사용할 수도 있다. 그 성질을 이용해 보았다. #include int main() { int a = 100; int *pa = &a; //pa[1] = *(pa + 1) int arr[] = { 1,2,3,4,5 }; pa = arr; printf("%x\n", pa); printf("%x\n", pa + 1);//int형은 4byte이므로 메모리 값이 4byte가 늘어남 printf("%x\n", arr); printf("%d\n", *(arr + 1));//==arr[1] printf("%d\n", *pa); *(pa + 1..
5차시에는 간단한 stack구현과 KMP알고리즘을 했다. stack이란, 나중에 들어온 값이 먼저 나가는 후입선출의 자료구조이다. 이미 에 구현되어 있는 것을 사용해도 되지만, 간단하게 직접 구현해 보았다. #include #define SIZE 100 int stack[SIZE] = { 0, }; int idx = 0; int push(int a){ if (idx > SIZE-1) { printf("stack이 꽉찼습니다.\n"); return -1; } stack[idx] = a; ++idx; return 0; }//변수 집어넣는 함수 int pop(){ if (idx 0 && text[i] != pattern[j]) j = pi[j - 1]; if (text[i] == pattern[j]){ if ..
3번째 시간에는 구조체와 문자열에 대해 배웠다 1) 문자열을 대문자를 모두 소문자로 바꾸기 #include int strlen(const char* str){ int i = 0; while(str[i])//NULL문자가 나오기 전까지 갯수를 세주는것이다. ++i; return i; } void lowerCase(char *str){ const int num = 'a' - 'A'; int length = strlen(str); for(int i = 0; i = 'A' && str[i] classnumber);//포인터형 구조체에 값을 할당할 때는 옆의 예시처럼 두가지 방법이 있다. students->grade = 2;//변수의 값을 바꾸려 할 때 Error가..
두번째 수업에서는 포인터에 대해 배웠다 1) swap함수 구현하기 보통의 값들은 한 함수에서 선언된 값을 바꿀 수 없다. 그러나 포인터를 사용하면 그 값을 바꿔줄 수 있는데, 그 성질을 이용하여 두개의 변수에 저장되어있는 함수의 값을 서로 바꾸는 함수를 구현하였다. 예외적으로 배열은 포인터처럼 취급되기 때문에 굳이 포인터를 사용하지 않아도 값 변경이 가능하다. #include void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; } int main(){ int a = 10, b = 20; swap(&a, &b); printf("a = %d, b = %d\n", a, b); return 0; } 2) 거품정렬 (bubblesort) #in..