- 함수 포인터와 함수 포인터 배열에 관한 이야기
- 좋은 구현 문제가 많은 편
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++;
}