2019년 6월 11일 화요일

C언어 배우기 (재귀함수)

 오늘의 코드는 이것이다. 바로 재귀함수다. 재귀함수는 한 함수 안에서 그 함수가 호출되는 것이다. 알고리즘 문제를 풀 때는 매우 필요한데 실무에서는 메모리를 너무 잡아 먹어서 잘 쓰이지 않는다고 한다.
 아무튼 이 코드는 아무 수를 입력하면 그 수의 자리수를 다 더해서 출력하는 코드다. 솔직히 이 코드는 내가 생각해낸게 아니고 민준이가 생각해낸 코드다. rec(x % 10)을 통해서 1의 자리수부터 계속 더한다. 그리고 rec(x / 10)으로 자리수를 한자리씩 줄여간다. 그러면 계속해서 자리수가 누적되고 각 자리수들의 합을 구할 수 있다.
 재귀함수가 문제를 푸는 데 도움이 된다는건 알겠지만 처음에 좀 감을 잡기 힘들다. 그렇다고 포기하는 것도 좋은 선택은 아닌 것 같다. 앞으로 재귀함수로 푸는 알고리즘 문제를 많이 연습해서 익숙해질 수 있도록 해야 겠다. 그리고 어렵긴 해도 나름 재미도 있는 것 같다.

2019년 5월 29일 수요일

메모리 구조


 오늘은 메모리 구조에 대해서 배웠다. 메모리 구조는 크게 4개로 나뉘어져 있다고 한다. 그 4개는 코드, 데이터, 힙, 스택이라고 한다. 
코드 영역은 실행할 프로그램의 코드가 저장되는 곳이다. 
다음으로 데이터 영역은 정적 변수와 전역 변수가 있는 곳이다. 이 곳에 들어가는 데이터는 컴파일 과정에서 생긴다고 한다.이 데이터 영역은 BSS랑 Data영역으로 나뉘는데 BSS는 초기화 된 정적, 전역 변수가 들어가고 Data영역에는 초기화되지 않은 정적, 전역 변수가 들어간다.
그 다음에 힙 영역은 동적할당으로 생긴 메모리가 저장된다.
마지막으로 스택 영역은 지역변수와 매개변수가 저장되는 영역이다.
이 메모리 구조를 알 때와 모를 때의 코드가 달라진다고 하는데 아직은 진짜 그런지 모르겠다. 앞으로 메모리 구조도 열심히 해봐야 겠다.

2019년 5월 27일 월요일

C언어 최대 최소 구하기

 이 코드는 오늘 수업시간에 작성한 코드다. 이 코드를 실행하면 저 위에 num이라는 배열에 담긴 숫자들 중에서 최댓값과 최솟값을 구할 수 있다. 그리고 조건 중에 포인터 변수에 배열의 주소를 넣으라는 조건이 있었기 때문에 포인터 변수 p에 배열의 주소를 담았다. 그리고 처음에는 최댓값 최솟값 모두 배열의 첫 번째 요소의 값으로 넣어줬다. 반복문은 i(1)에서 배열 요소의 갯수만큼까지 반복하도록 했다. 만약에 그 배열의 요소가 max보다 크면 max를 그 요소로 바꾸고 min보다 작으면 min을 그 요소로 바꾸는 식으로 했다. 그리고 마지막에 최대, 최솟값을 모두 출력해준다.
 오늘 수업시간에 느낀 게 진짜로 사람마다 생각이 다르고 생각이 다른만큼 코드도 매우 다양하게 나타난다는 것을 느꼈다.

2019년 5월 24일 금요일

C언어 배우기 (2차원 배열)

 오늘 수업시간에 2차원 배열에 대해서 배웠다. 2차원 배열은 Type 변수명[i][j]; 으로 선언한다. 2차원 배열은 1차원 배열과 다르게 평면으로 되어 있다. 하지만 진짜 메모리 상에서 2차원으로 바뀌는 것은 아니다. 그리고 변수명은 1차원 배열과 같이 배열의 시작 주소를 의미한다. 그런데 조금 다른 것은 변수명[2]라고 하면 주소를 나타낸다. 변수명[2]라는 것은 세번째 행의 시작 주소를 뜻한다. 변수명[1]하면 두번재 행의 시작 주소를 뜻한다. 그리고 1차원 배열과 똑같이 변수명[i]는 *(변수명+i)와 같다. 물론 2차원 배열에서는 주소를 의미한다.
 2차원 배열은 1차원 배열과 닮은 점도 많지만 다른 점도 꽤 있다. 1차원 배열과 따로 2차원 배열도 잘 알아두어야 할 것 같다.

2019년 5월 21일 화요일

C언어 배우기 (표준 입출력)

 오늘은 표준 입출력에 대해서 배웠다. 표준 입출력 함수는 scanf, printf같은 내가 평소에 많이 쓰던 것도 있고 putchar, gets, puts처럼 평소에 내가 잘 쓰지 않는 것들도 있다. 그리고 이 표준 입출력 함수도 버퍼를 이용하는 입출력 함수가 있고 버퍼를 이용하지 않는 입출력 함수가 있다. 버퍼를 이용하지 않는 입출력 함수에는 _getch나 _getche같은게 있다.
 이 코드는 버퍼를 이용하는 입출력 함수인 getchar를 이용한 코드다. 이 코드는 EOF를 입력할 때까지 문자열을 입력받고 EOF를 입력하면 while문을 종료해서 입력받은 문자열 중에서 가장 길었던 문자열의 길이를 출력하는 코드다. 먼저 while(1)해서 계속 반복하게 한다. 처음에 getchar로 \n이 입력될 때까지 문자들을 입력받는다. 그리고 이 과정에서 가장 긴 문자열의 길이를 구하기 위해서 i값을 증가시킨다. 만약에 개행이 이루어지면 기존에 가장 긴 문자열의 길이였던 temp와 i를 비교하고 만약에 i가 temp보다 크면 temp = i를 해준다. 그리고 i를 다시 0으로 초기화 해준다. 그리고 i가 또 증가되면 안되기 때문에 continue로 바로 처음부터 다시 반복한다. 그러다가 EOF가 입력되면 break로 while문을 탈출한다. 그리고 temp를 출력한다.

2019년 5월 17일 금요일

C언어 배우기 (수업시간)

 오늘은 포인터 변수에 배열의 주소를 넣어서 포인터 변수를 배열처럼 사용하는 것을 배웠다. 길이가 10인 int형 배열 arr를 선언해서 1~10으로 초기화했다. 그리고 int형 포인터 변수 p를 선언한 다음에 배열 arr의 첫 번째 요소의 주소를 의미하는 배열의 이름인 arr을 포인터 변수 p에 넣어줬다. 문제의 조건이 이 배열의 요소들을 2 더해서 출력하는 것이었기 때문에 for문을 열어서 인덱스 0~9까지 각 요소들을 2로 더해서 출력해주었다.
 포인터 변수 p에 arr의 주소를 넣어서 접근하지 않아도 문제를 풀 수 있지만 이 문제를 통해서 포인터를 통해서 배열에 접근할 수 있다는 것을 알게 되었다.

2019년 5월 14일 화요일

로또

 오늘은 로또했다. 전에도 로또했는데 오늘은 함수로 바꿔서 했다. 먼저 랜덤함수를 이용해서 로또 번호를 받는다. 로또 번호를 받으면 IsFind를 통해서 중복검사를 한다. 중복검사를 하는 방법은 먼저 로또 번호를 받은 배열의 인덱스를 넘겨주고 그 인덱스까지 j가 그 인덱스의 바로 전 인덱스까지 같은지 검사해서 같으면 인덱스의 값을 1빼줘서 그 인덱스의 랜덤값을 다시 받는다. 이걸 하다가 알게 된게 있는데 *i--; 를 하면 i를 참조한 값이 --되는게 아니고 i라는 데이터의 주소값이 --가 되고 참조를 한다는 것을 알게 됐다. 그래서 *i -= 1;로 고쳐서 썼다. 마지막으로 Show를 통해서 배열 data에 있는 수들을 출력한다.