c00

koeyhoyh·2022년 2월 6일
1

42Seoul

목록 보기
4/11

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);
	}
}
profile
내가 만들어낸 것들로 세계에 많은 가치를 창출해내고 싶어요.

0개의 댓글