exam01
Exam01 관련해서 예상 내용을 추려보았습니다. 피씬과정에서 풀고있는 하나의 PDF 즉, cXX은 하나의 주제를 담고 있습니다. 또한, 과거의 기수로부터의 정보로 판단했을 때 Exam01은 처음부터 c07까지의 내용이 들어가는 것으로 예상됩니다.
기본적인 접속과 시험 정답 제출 방법에 대해서는 시험 팁 링크를 참고해주세요.
그렇기 때문에 c00 부터 c07까지의 전체적인 내용을 정리를 하고 어떤 문제가 나올지 개인적인 생각을 포스팅 하고자합니다.
C00
C언어에서 출력하는 방법에 대해서 다룬 챕터입니다.
#include "unistd.h"
write(int fd, char *buf, unsigned int size);
unistd.h 헤더에서 write 함수를 이용하여 문자 혹은 문자열을 찍는 문제들이 주로 나왔으며, 정수형의 숫자를 몫과 나머지 연산과 ascii code 이용하여 문자로 변환하고 이것을 출력하는 경험을 할 수 있는 챕터였습니다.
추가적으로 int형의 범위에 대한 것을 다루는 내용이 있습니다.
C01
C언어에서 값을 할당할 때 함수에 변수의 주소 값을 인자로 넘기고 포인터로 참조하여 값을 변경하는 방식을 배우는 챕터입니다.
기본적인 포인터에 대한 이해를 주제로 하였고 추가적으로 문자열을 다루는 방법에 대해서도 알 수 있는 챕터입니다.
추가적으로 정렬의 개념에 대해서 다루는 내용이 있습니다.
char *pointer
char a[] = "abcd"
// 포인터와 배열은 사실상 같은 내용이다.
// *(pointer + index) : pointer[index]
// 포인터 자체는 주소를 의미하며 배열의 인덱스를 참조한 값의 주소를 의미한다고도 할 수 있다.
// ++pointer : &pointer[1]
C02
아스키 코드값에 어떤 값이 있는 지, 어떤식으로 이용하면 좋을지에 대해서 생각해 볼 수 있는 챕터입니다. 또한 print 할 수 있는 문자와 그렇지 않은 문자에 대해서 생각해 볼 수 있습니다.
void *addr = "abc";
unsigned long long address;
address = (unsigned long long)addr;
ft_putnbr(address);
ft_putnbr_hex(address);
추가적으로 문자열을 복사하는 string.h의 함수를 다뤄 볼 수 있었고 마지막 문제를 통해 포인터(주소)의 값을 직접 보는 방법과 10진수를 16진수로 변환하는 방법을 경험할 수 있습니다.
C03
string.h에 나와있는 유용한 함수들을 직접 구현하여 사용방법을 익힐 수 있는 문제들로 구성되어 있습니다.
/*
strcmp : string compare
strncmp
strstr : string in string
strcat : string concatenate
strncat
strlcat
*/
C04
문자열을 정수형으로 정수형을 문자열로 양방향으로 변환하는 문제에 대해서 경험할 수 있습니다.
(문자열 <-> 정수형)
// "10001"(decimal) <-> 17 (10진수로 표현)
// "bc"(hex) <-> 188 (10진수로 표현)
// "ab0"(customed base 3 : "0ab") <-> 120 (3진수로 표현)
C05
재귀함수와 반복문에 대해서 여러가지 문제를 경험할 수 있습니다. 또한, 반복문을 재귀함수로 재귀함수를 반복문으로 생각할 수 있는 기회의 문제들이 출제됩니다.
마지막 문제로 재귀함수로 생각할 수 있는 MAP을 그려서 DFS를 구성하는 문제를 경험할 수 있습니다.
/*
factorial
pow
fibonacci
sqrt
prime
ten_queens : dfs
*/
C06
메인함수의 인자 입력에 대해서 다루는 내용을 주제로 문제들이 출제됩니다.
int argc
는 인자의 개수 char **argv
는 문자열의 배열로 X 번째 인자의 string을 의미합니다.
추가적으로 argc는 항상 1이상이며 1일 때에는 인자를 입력하지 않았을 때를 의미합니다.
argv[0]
에는 항상 실행파일의 이름이 들어갑니다. 예를 들어 a.out 파일을 실행하였을때 argv[0]을 출력해보면 ./a.out
이 출력됩니다.
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc > 1)
printf("인자가 입력되었습니다");
else
printf("./실행파일명 만이 argv에 들어갑니다");
return (0);
}
C07
전체적인 내용은 문자열을 다루는 내용들의 문제들이 분포되어있습니다.
처음으로 동적할당에 개념에 대해서 다루기 시작합니다.
문자열의 문자열을 특정 character set을 기준으로 합치거나 문자열을 특정 character set을 기준으로 분리하는 내용의 문제가 출제되고 Shell01 마지막 문제에서 obase와 ibase를 이용했던 것 처럼 하나의 진법을 다른 진법으로 바꾸는 방법에 대해서 생각해보는 문제가 출제됩니다.
동적할당은 배열과 달리 개발자가 원하는 양의 메모리를 할당해주는 방식을 얘기합니다. 예를들어 char a[n]
은 선언할 때 char형 변수 n개를 메모리에 연속적으로 할당해주는 것을 얘기합니다. 하지만 동적할당은 개발자가 원하는 시점에서 char형 변수 n개를 메모리에 할당해줄 수 있습니다. 두개의 큰 차이중 하나는 동적할당은 메모리를 점유했다 해제할 수 있다는 것이고 배열은 메모리를 함수 혹은 프로그램이 종료될 때 반환하게 됩니다.
char *p;
char **p_p;
// 변수명 = (캐스팅)malloc(sizeof(변수형) * 개수);
// 문자열의 문자열 생성
p_p = (char **)malloc(sizeof(char *) * n) // char *형을 n개만큼 메모리에 할당
// 문자열 생성
p = (char *)malloc(sizeof(char) * n) // char형을 n개만큼 메모리에 할당
// 문자열의 첫번째 문자열을 할당
*p_p = p;
exam01 예상
c00 ~ c07 까지는 문자열을 다루는 방법이 대다수이다. 또한 c06에서 메인함수를 통한 인자를 받는 방법을 배우기 때문에 인자를 받고 받은 문자열을 원하는 규칙에 맞게 처리하는 문제가 나올것으로 예상된다.
예를 들어 대소문자 변환 또는 짝수번째 문자 출력과 같은 문제가 있을 것이다.
어려운 문제로는 동적할당을 이용하여 문자열을 문자열의 문자열을 분리하는 함수를 이용하는 것이나 문자열의 문자열을 하나의 문자열로 합치는 내용들이 나올 것으로 예상된다.
예를 들어 문자열 두개를 인자로 받고 하나는 구분자로 사용하고 하나는 전체 문자열로 사용하여 구분자 단위로 문자열을 나누어 문자열의 문자열을 반환하는 함수 또는 프로그램을 작성하는 문제를 생각해 볼 수 있다.