2022.02.03 작성중...
C를 시작하며,
반드시 알아야 할 것
alias gcc='gcc -Wall -Wextra -Werror'
alias norminette='norminette -R CheckForbiddenSourceHeader'
이 설정을 해 놓으면, 컴파일 할 때와 검사할 때 편합니다 : >
헤더 설정 방법 : https://kiki-100.tistory.com/107
./zshrc 라는 파일 생성
USER=hyojeong
export USER
MAIL=$USER@student.42seoul.kr
export MAIL
파일 저장 후,
source ./zshrc 로 변경사항 적용
or
터미널에서
MAIL = iyf@student.42seoul.kr 이렇게 자기의 이메일 주소를 넣으세요.
출처: https://codecademy.tistory.com/entry/42SEOUL-헤더문서에-제-메일을-넣고-싶어요 [코딩 하나 둘 하나 둘]
-> header가 바뀌어 있다!!!
00 ft_putchar
매개변수로 전달되는 문자를 표시하는 문자를 작성하세요.
예제에 나와있습니다.
<limit.h>
INT_MAX
INT_MIN
이런 식으로 최대, 최소 값 상수를 편하게 사용할 수 있다.
라 피신에서는 헤더를
01 ft_print_alphabet
알파벳을 a부터 z까지 순서대로 한 줄로 표시하는 함수를 작성합니다.
void ft_print_alphabet(void)
{
char alphabet;
alphabet = 'a';
while (alphabet == 'z'+1)
{
write(1, &alphabet, 1);
alphabet++;
}
}
02 ft_print_reverse_alphabet
1번 문제와 굉장히 비슷합니다!!
똑같은 개념을 사용해서 푸시면 됩니다 : >
03 ft_print_numbers
1번 문제와 굉장히 비슷합니다2!!!
똑같은 개념을 이용해서 푸시면 됩니다.
모든 자릿수를 참고하면 되므로, char digit = '0'
'0' + 10 으로 범위를 주었습니다 : >
04 ft_is_negative
매개변수로 입력된 정수의 기호에 따라 'N' 또는 'P'를 출력하는 함수를 작성하세요.
#include <unistd.h>
void ft_is_negative(int n)
{
if (n >= 0)
{
write(1, &"P", 1);
}
else
{
write(1, &"N", 1);
}
}
틀린 이유 =
05 ft_print_comb
세 개의 서로 다른 숫자를 오름차순의 순서로 여러 가지로 조합한 세 자릿수 숫자를 오름차순으로 표시하는 함수를 작성하세요.
오름차순의 순서로, 조합, 오름차순으로 표시
반복되는 숫자는 표시하지 않는다.
06 ft_print_comb2
int 형으로 받아서,
write를 이용할 때는 ascii code 숫자 이용해 char 형으로 출력!
07 ft_putnbr
재귀 함수를 이용해 풀면, 굉장히 쉽게 풀릴 것 같다.
매 함수를 출력해 줄 때마다, 10씩 계속 나눠서, 나머지를 출력해주는 것이다! -> 재귀함수로, 10씩 줄여서 말이다!!!
그렇게 되면, 처음 자리부터 나중의 자리까지 다 잘 나오게 된다.
-> 아니었다. 첫 번째 자리만 주구장창 출력되게 된다.
첫 번째 자리를 없애려면??
- 처리는 어떻게 할까??...
-> -의 마지막 숫자는, 바꾸면 바로 오버플로우인데...
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_putnbr.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: hyojeong <hyojeong@student.42seoul.kr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/04 08:27:22 by hyojeong #+# #+# */
/* Updated: 2022/02/04 10:02:40 by hyojeong ### ########.fr */
/* */
/* ************************************************************************** */
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
int ft_devide(int n)
{
int count;
int len;
int devide;
len = n;
count = 0;
devide = 1;
while (len >= 10)
{
len = len / 10;
count++;
}
ft_putchar(len + '0');
while (count != 0)
{
devide = devide * 10;
count--;
}
return (n % devide);
}
int judge(int n)
{
int tmp;
tmp = 0;
if (n < 0 && n != -2147483648)
{
ft_putchar('-');
return (-n);
}
if (n == -2147483648)
{
ft_putchar('-');
tmp = ft_devide(-(n + 1));
return (tmp + 1);
}
return (n);
}
void ft_putnbr(int nb)
{
nb = judge(nb);
if (nb >= 10)
{
nb = ft_devide(nb);
ft_putnbr(nb);
}
else
{
ft_putchar(nb + '0');
}
}
해결!!!
-2147483648 일 경우에만 예외 처리를 해서 해결되었다!!
: (
안 해결...
10101024
-> 10101024
1010102 | cnt 1
101010 | cnt 2
10101 | cnt 3
1010 | cnt 4
101 | cnt 5
10 | cnt 6
1 | cnt 7
'1' 만들어줌.
devide = devide * 10; | devide = 10 cnt = 6
devide 100 5
1000 4
10000 3
100000 2
1000000 1
10000000 0
0101024 -> 101024 로 변하는구나.... 아!!
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_putnbr.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: hyojeong <hyojeong@student.42seoul.> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/05 11:16:39 by hyojeong #+# #+# */
/* Updated: 2022/02/06 21:42:20 by hyojeong ### ########.fr */
/* */
/* ************************************************************************** */
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
void ft_putnbr(int nb)
{
if (nb == -2147483648)
{
ft_putchar('-');
ft_putchar('2');
nb = 147483648;
}
if (nb < 0)
{
ft_putchar('-');
nb = -nb;
}
if (nb >= 10)
ft_putnbr(nb / 10);
ft_putchar(nb % 10 + '0');
}
새로 작성한 코드.
똑같이 재귀함수를 이용해서 풀었지만, 전에 작성한 코드와 비교해 예외처리를 확실히 해 주었고, 간결하고 이해하기 쉬워졌다.
08 ft_print_combn
n개의 숫자의 모든 조합을 작은 수부터 오름차순으로 출력하는 함수를 작성하세요.
• n의 범위는 0 < n < 10입니다.
재귀를 이용하라고 한다..
char c[9] 배열을 만든다.
c[8] = '8'부터 넣어준다.
c[7] = '7'
c[6] = '6' ....
c[0] = '0'
n = 9일때, 012345678 부터 시작이기 때문에.
n = 1이면, c[0]만 사용할 것이다.
n = 2이면, c[0], c[1] 을 사용할 것이다.
....
-> n - 1 까지의 배열을 사용할 것이다.
c[n-1] 부터, ++ 해준다.
c[n-1] = '9' + 1 이 된다면,
당연히 c[n-2]의 값을 1 늘려주고, c[n-1]의 값은 c[n-2] + 1 로 지정해준다.
-> 중복되지 않는 조합이 만들어진다.
여기까지는 전의 문제와 같다.
문제는, n에 따라 맞는 값을 출력해주는 것.
n = 1 이라고 가정.
ft_calcall (c, 1) 로 들어간다.
n = 1이라서 바로 나온다.
c[0]++; 되고,
print_all로 출력.
그 다음. 체크에 들어간다.
c[0]이 '0' + 9 보다 크지 않으므로, return 1 (true!)
잘 출력된다.
n = 2 라고 가정.
똑같이, 배열이 만들어지고 함수가 실행된다.
n = 5
1389 -> 1456 이 되어야 하는데. 나는 추가로 해주지 않아서,
0145: 이 되어버린다...
여기서 재귀를 사용해야 하는 건가???
n를 줄이면서 다시 호출을 해줘야 할 것 같은데.
만약에, 089 가 되었다면, 12:가 되어버린다...
특별할 때만, ++를 시켜야 한다.
현재 문제점
01279 - > 01289 -> 01345 이렇게 되어야 하는데
생각 :
9를 감지해서 앞의 숫자에 +1을 해준다면,
즉시 print해주고, + ", "
그리고, 전체를 다시 검사해주는 식으로 하면 어떨까??
혹은 앞의 자리 수가 바뀐다면, 그 뒤의 수들은 모두 앞의 자리 + 1씩
->
1의 자리 검사 089 09:
2의 자리 검사 09: 123 이렇게 말이다.
그렇게 되면, 따로 변경해주지 않아도 될 것 같다...
어떻게 구현하지?
09 c[1] >
c[0]++; 19
value = 1
value <= 1
c[1] = c[0] + 1;
value++
01236 >
cnt= 5
c[4] > '0' +
01279 >
c[4] > '0' + 8 - (5 - 5)
flag = 1
c[3]++; -> 01289
value = 4
4 <= 4
c[4] = c[3] + 1 -> 01289
여기를 출력되게 만들어야 한다.
cnt = 4
c[3] > 8 - (5-4) // 7
cnt[2]++ -> 01389
value = 3
c[3] = c[2] + 1 -> 01349
value ++
c[4] = c[3] + 1 -> 01345
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_print_combn.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: hyojeong <hyojeong@student.42seoul.> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/05 17:30:59 by hyojeong #+# #+# */
/* Updated: 2022/02/06 14:04:46 by hyojeong ### ########.fr */
/* */
/* ************************************************************************** */
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
void ft_printall(char c[], int n)
{
int cnt;
cnt = 0;
while (cnt < n)
ft_putchar(c[cnt++]);
}
void ft_calcall(char c[], int n)
{
int cnt;
int value;
int flag;
flag = 0;
cnt = n;
while (cnt >= 2)
{
if (c[cnt - 1] > '0' + 8 - (n - cnt))
{
flag = 1;
c[cnt - 2]++;
value = cnt - 1;
while (value <= n)
{
c[value] = c[value - 1] + 1;
value++;
}
}
cnt--;
}
if (flag == 0)
c[n - 1]++;
}
void ft_print_combn(int n)
{
char c[10];
int index;
index = 0;
while (index <= 8)
{
c[index] = '0' + index;
index++;
}
while (c[0] <= '0' + 10 - n)
{
ft_printall(c, n);
ft_putchar(',');
ft_putchar(' ');
ft_calcall(c, n);
}
}