열렬히.뛰기

c11

école 42 > C > c11

  • 함수 포인터와 함수 포인터 배열에 관한 이야기
  • 좋은 구현 문제가 많은 편

ex00

c
void	ft_foreach(int *tab, int length, void (*f)(int))
{
	int	i;

	i = 0;
	while (i < length)
	{
		f(tab[i]);
		i++;
	}
}

ex01

c
#include <stdlib.h>

int	*ft_map(int *tab, int length, int (*f)(int))
{
	int	i;
	int	*newarr;

	i = 0;
	newarr = malloc(length * sizeof(int));
	while (i < length)
	{
		newarr[i] = f(tab[i]);
		i++;
	}
	return (newarr);
}

ex02

c
int	ft_any(char **tab, int (*f)(char *))
{
	while (*tab != '\0')
	{
		if (f(*tab) != 0)
			return (1);
		tab++;
	}
	return (0);
}

ex03

c
int	ft_count_if(char **tab, int length, int (*f)(char *))
{
	int	i;
	int	count;

	i = 0;
	count = 0;
	while (i < length)
	{
		if (f(tab[i]) != 0)
			count++;
		i++;
	}
	return (count);
}

ex04

c
void	judge(int x, int *descend, int *ascend, int *middle)
{
	if (x < 0)
		*descend += 1;
	else if (x > 0)
		*ascend += 1;
	else if (x == 0)
		*middle += 1;
}

int	ft_is_sort(int *tab, int length, int (*f)(int, int))
{
	int	i;
	int	x;
	int	descend;
	int	ascend;
	int	middle;

	i = 0;
	x = 0;
	if (length == 0 || length == 1 || length == 2)
		return (1);
	descend = 0;
	ascend = 0;
	while (i < length - 1)
	{
		x = f(tab[i], tab[i + 1]);
		judge(x, &descend, &ascend, &middle);
		i++;
	}
	if (descend != 0 && ascend != 0)
		return (0);
	else
		return (1);
}

ex05

makefile
NAME = do-op
CFLAGS = -Wall -Wextra -Werror
SRCS = ./srcs/calculate.c ./srcs/calculate2.c ./srcs/calculate3.c
OBJS = $(SRCS:.c=.o)

all : $(NAME)

$(NAME) : $(OBJS)
	cc $(CFLAGS) $(OBJS) -o $(NAME)

clean :
	rm -rf $(OBJS)

fclean : clean
	rm -rf $(NAME)

re : fclean all

.PHONY : all clean fclean re
계산기 구현 1
c
#include <unistd.h>

int		linker(int a, char operator, int b);
void	ft_result(int number);

char	make_op(char *str)
{
	int	length;

	length = 0;
	while (str[length] != '\0')
		length++;
	if (str[0] == '+' || str[0] == '-' || str[0] == '*' \
			|| str[0] == '/' || str[0] == '%')
	{
		if (length == 1)
			return (str[0]);
	}
	return ('n');
}

int	checkminus(char *str)
{
	int	flag;

	flag = 0;
	while (!(*str >= '0' && *str <= '9'))
	{
		if (*str == '-')
			flag++;
		str++;
	}
	if (flag % 2 == 0)
		return (0);
	return (1);
}

int	ft_atoi(char *str)
{
	int	i;
	int	sign;
	int	number;

	i = 0;
	sign = 1;
	number = 0;
	if (checkminus(str))
		sign = -1;
	while ((str[i] >= 9 && str[i] <= 13) || str[i] == 32)
		i++;
	while (str[i] == '-' || str[i] == '+')
		i++;
	if (!(str[i] >= '0' && str[i] <= '9'))
		return (0);
	while (str[i] >= '0' && str[i] <= '9')
	{
		number = (number * 10) + (str[i] - '0');
		i++;
	}
	return (sign * number);
}

int	find_err(char operator, int b)
{
	if (operator == 'n')
	{
		write(1, "0\n", 2);
		return (-1);
	}
	else if (operator == '/' & b == 0)
	{
		write(1, "Stop : division by zero\n", 24);
		return (-1);
	}
	else if (operator == '%' & b == 0)
	{
		write(1, "Stop : modulo by zero\n", 22);
		return (-1);
	}
	return (1);
}

int	main(int ac, char **av)
{
	int		a;
	int		b;
	char	operator;

	if (ac != 4)
		return (0);
	a = ft_atoi(av[1]);
	operator = make_op(av[2]);
	b = ft_atoi(av[3]);
	if (find_err(operator, b) == -1)
		return (0);
	else
	{
		ft_result(linker(a, operator, b));
		write(1, "\n", 1);
	}
}
계산기 구현 2
c
#include <unistd.h>

int	add(int a, int b);
int	minus(int a, int b);
int	product(int a, int b);
int	divide(int a, int b);
int	modular(int a, int b);

int	linker(int a, char operator, int b)
{
	int	(*fp[5])(int, int);

	fp[0] = add;
	fp[1] = minus;
	fp[2] = product;
	fp[3] = divide;
	fp[4] = modular;
	if (operator == '+')
		return (fp[0](a, b));
	else if (operator == '-')
		return (fp[1](a, b));
	else if (operator == '*')
		return (fp[2](a, b));
	else if (operator == '/')
		return (fp[3](a, b));
	else
		return (fp[4](a, b));
}

void	ft_result(int number)
{
	char	c;

	if (number == -2147483648)
	{
		write (1, "-2147483648", 11);
		return ;
	}
	else if (number < 0)
	{
		write(1, "-", 1);
		ft_result(number * (-1));
	}
	else if (number < 10)
	{
		c = '0' + number;
		write(1, &c, 1);
		return ;
	}
	else
	{
		ft_result(number / 10);
		ft_result(number % 10);
	}
}
계산기 구현 3
c
int	add(int a, int b)
{
	return (a + b);
}

int	minus(int a, int b)
{
	return (a - b);
}

int	product(int a, int b)
{
	return (a * b);
}

int	divide(int a, int b)
{
	return (a / b);
}

int	modular(int a, int b)
{
	return (a % b);
}

ex06

c
int	ft_strcmp(char *s1, char *s2)
{
	while (*s1 != '\0' || *s2 != '\0')
	{
		if ((unsigned char) *s1 != (unsigned char) *s2)
			return (*(unsigned char *)s1 - *(unsigned char *)s2);
		s1++;
		s2++;
	}
	return (0);
}

void	change(char **tab, int i, int j)
{
	char	*temp;

	temp = tab[i];
	tab[i] = tab[j];
	tab[j] = temp;
}

void	ft_sort_string_tab(char **tab)
{
	int		i;
	int		j;

	i = 0;
	while (tab[i])
	{
		j = 0;
		while (tab[j])
		{
			if (tab[j + 1] && ft_strcmp(tab[j], tab[j + 1]) > 0)
				change(tab, j, j + 1);
			j++;
		}
		i++;
	}
}

ex07

c
void	change(char **tab, int i, int j)
{
	char	*temp;

	temp = tab[i];
	tab[i] = tab[j];
	tab[j] = temp;
}

void	ft_advanced_sort_string_tab(char **tab, int (*cmp)(char *, char *))
{
	int		i;
	int		j;

	i = 0;
	while (tab[i])
	{
		j = 0;
		while (tab[j])
		{
			if (tab[j + 1] && cmp(tab[j], tab[j + 1]) > 0)
				change(tab, j, j + 1);
			j++;
		}
		i++;
	}